ZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKaW5kZXggYmU3OTE1Yy4uYTBlNGJjNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKQEAgLTI4MCw2ICsyODAsMTcgQEAKIEpTQm9vbCBnZXRfbGVuZ3RoKAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5jYwppbmRleCAzODhjMTg2Li5kNzYzYzU1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKQEAgLTM3MSw2ICszNzEsMTcgQEAKIEpTQm9vbCBnZXRfbGVuZ3RoKAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmNjCmluZGV4IDcxYjMxZjIuLjdlMjg4MTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0FyYml0cmFyeUludGVyZmFjZS5jYwpAQCAtMTkxLDYgKzE5MSwxNyBAQAogSlNCb29sIGdldF9hcmJpdHJhcnlQcm9wZXJ0eSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxBcmJpdHJhcnlJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQmFzZUludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNCYXNlSW50ZXJmYWNlLmNjCmluZGV4IGJmNGI1YTMuLmI2ZDdiOGMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNCYXNlSW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNCYXNlSW50ZXJmYWNlLmNjCkBAIC0xOTEsNiArMTkxLDE3IEBACiBKU0Jvb2wgZ2V0X2Jhc2VBdHRyaWJ1dGUoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QmFzZUludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlLmNjCmluZGV4IDE3OTZjNjIuLjBlZjBhMWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZS5jYwpAQCAtMTg5LDYgKzE4OSwxNyBAQAogSlNCb29sIGdldF9ib29sZWFuUHJvcGVydHkoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5jYwppbmRleCAwYjdlOTA3Li4zYTc5NjdlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5jYwpAQCAtMTkzLDYgKzE5MywxNyBAQAogSlNCb29sIGdldF9jYWxsYmFja0F0dHJpYnV0ZSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApAQCAtMjM3LDYgKzI0OCwxNyBAQAogSlNCb29sIGdldF9udWxsYWJsZUNhbGxiYWNrQXR0cmlidXRlKAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UuY2MKaW5kZXggZDQzMjFmZi4uZDQzYjhkMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZS5jYwpAQCAtMTkzLDYgKzE5MywxNyBAQAogSlNCb29sIGdldF9jYWxsYmFja0F0dHJpYnV0ZSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDb25kaXRpb25hbEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDb25kaXRpb25hbEludGVyZmFjZS5jYwppbmRleCBlOGU1YTdkLi4xOWVjMDBjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ29uZGl0aW9uYWxJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlLmNjCkBAIC0xOTIsNiArMTkyLDE3IEBACiBKU0Jvb2wgZ2V0X2VuYWJsZWRBdHRyaWJ1dGUoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC0yMzgsNiArMjQ5LDE3IEBACiBKU0Jvb2wgZ2V0X2Rpc2FibGVkQXR0cmlidXRlKAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UuY2MKaW5kZXggMDljY2YyYS4uZGMwOTAyZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlLmNjCkBAIC0xOTEsNiArMTkxLDE3IEBACiBKU0Jvb2wgZ2V0X2xvbmdBcmcoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApAQCAtMjEzLDYgKzIyNCwxNyBAQAogSlNCb29sIGdldF9ib29sZWFuQXJnKAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKQEAgLTIzNSw2ICsyNTcsMTcgQEAKIEpTQm9vbCBnZXRfc3RyaW5nQXJnKAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2UuY2MKaW5kZXggN2ZiNDEwYi4uODQxZjdhOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2UuY2MKQEAgLTE4OSw2ICsxODksMTcgQEAKIEpTQm9vbCBnZXRfcHJvcGVydHkoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKQEAgLTIzMyw2ICsyNDQsMTcgQEAKIEpTQm9vbCBnZXRfcmVhZE9ubHlQcm9wZXJ0eSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApAQCAtMjU1LDYgKzI3NywxNyBAQAogSlNCb29sIGdldF9yZWFkT25seVRva2VuUHJvcGVydHkoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKQEAgLTI3Nyw2ICszMTAsMTcgQEAKIEpTQm9vbCBnZXRfbnVsbElzRW1wdHlQcm9wZXJ0eSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApAQCAtMzIxLDYgKzM2NSwxNyBAQAogSlNCb29sIGdldF91bmRlZmluZWRJc0VtcHR5UHJvcGVydHkoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKQEAgLTM2NSw2ICs0MjAsMTcgQEAKIEpTQm9vbCBnZXRfbnVsbGFibGVVbmRlZmluZWRJc0VtcHR5UHJvcGVydHkoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuY2MKaW5kZXggOWQ3ZjI4MS4uOTgxNDk0MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuY2MKQEAgLTM3MSw2ICszNzEsMTcgQEAKIEpTQm9vbCBnZXRfbGVuZ3RoKAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC0zOTMsNiArNDA0LDE3IEBACiBKU0Jvb2wgZ2V0X3Byb3BlcnR5T25EZXJpdmVkQ2xhc3MoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNEZXJpdmVkSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRJbnRlcmZhY2UuY2MKaW5kZXggOGQ2NGJlMi4uYmNiOWZkYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRJbnRlcmZhY2UuY2MKQEAgLTE5MSw2ICsxOTEsMTcgQEAKIEpTQm9vbCBnZXRfZGVyaXZlZEF0dHJpYnV0ZSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rpc2FibGVkSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rpc2FibGVkSW50ZXJmYWNlLmNjCmluZGV4IDNmM2Q0YTcuLjI4Y2JkNTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNEaXNhYmxlZEludGVyZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRGlzYWJsZWRJbnRlcmZhY2UuY2MKQEAgLTE5MSw2ICsxOTEsMTcgQEAKIEpTQm9vbCBnZXRfZGlzYWJsZWRQcm9wZXJ0eSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEaXNhYmxlZEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNFbnVtZXJhdGlvbkludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNFbnVtZXJhdGlvbkludGVyZmFjZS5jYwppbmRleCBjNTRiZGUyLi44NzExNTRlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRW51bWVyYXRpb25JbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlLmNjCkBAIC0yMDAsNiArMjAwLDE3IEBACiBKU0Jvb2wgZ2V0X2VudW1Qcm9wZXJ0eSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFbnVtZXJhdGlvbkludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlLmNjCmluZGV4IDY0ZTNjYTYuLjNhOTlmZTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5jYwpAQCAtMTkwLDYgKzE5MCwxNyBAQAogSlNCb29sIGdldF9lcnJvcigKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC0yMTIsNiArMjIzLDE3IEBACiBKU0Jvb2wgZ2V0X21lc3NhZ2UoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXhjZXB0aW9uc0ludGVyZmFjZS5jYwppbmRleCA1ZjFhMzk2Li44ZWIxMzYzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXhjZXB0aW9uc0ludGVyZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXhjZXB0aW9uc0ludGVyZmFjZS5jYwpAQCAtMTkxLDYgKzE5MSwxNyBAQAogSlNCb29sIGdldF9hdHRyaWJ1dGVUaHJvd3NFeGNlcHRpb24oCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RXhjZXB0aW9uc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmNjCmluZGV4IDA3Y2NlZGEuLmM5ODE5M2YgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZS5jYwpAQCAtMjA4LDEwICsyMDgsMTAgQEAKICAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CiAgIEV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZSogaW1wbCA9CiAgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwogCi0gIGltcGwtPkNhbGxXaXRoU2V0dGluZ3MoZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRFbnZpcm9ubWVudFNldHRpbmdzKCkpOworICBpbXBsLT5DYWxsV2l0aFNldHRpbmdzKGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudC0+R2V0RW52aXJvbm1lbnRTZXR0aW5ncygpKTsKICAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwogICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZS5jYwppbmRleCBkMmNmYjQwLi5mZTI3MzQ3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UuY2MKQEAgLTIwMiw2ICsyMDIsMTcgQEAKIEpTQm9vbCBnZXRfcHJldmlvdXMoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApAQCAtMjQ2LDYgKzI1NywxNyBAQAogSlNCb29sIGdldF9uZXh0KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKaW5kZXggNzUyMzM0ZS4uZTYyYTM2MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKQEAgLTI5NSw2ICsyOTUsMTcgQEAKIEpTQm9vbCBnZXRfbGVuZ3RoKAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcy5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzLmNjCmluZGV4IGE1NzhlOWMuLjM2MTJlMWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzLmNjCkBAIC0xODksNiArMTg5LDE3IEBACiBKU0Jvb2wgZ2V0X3N1cHBvcnRlZEF0dHJpYnV0ZSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKaW5kZXggMjk2NWYwZi4uNzJkOTlmYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLmNjCkBAIC0zNzEsNiArMzcxLDE3IEBACiBKU0Jvb2wgZ2V0X2xlbmd0aCgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC0zOTMsNiArNDA0LDE3IEBACiBKU0Jvb2wgZ2V0X3Byb3BlcnR5T25CYXNlQ2xhc3MoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlLmNjCmluZGV4IDY5ZmFiMDQuLmQyODM0NDYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UuY2MKQEAgLTE5Myw2ICsxOTMsMTcgQEAKIEpTQm9vbCBnZXRfbmVzdGVkRm9yd2FyZGluZ0F0dHJpYnV0ZSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZS5jYwppbmRleCBjMDAxMGY0Li4yNTgwZGZjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlLmNjCkBAIC0xOTMsNiArMTkzLDE3IEBACiBKU0Jvb2wgZ2V0X251bGxhYmxlQm9vbGVhblByb3BlcnR5KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApAQCAtMjM3LDYgKzI0OCwxNyBAQAogSlNCb29sIGdldF9udWxsYWJsZU51bWVyaWNQcm9wZXJ0eSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKQEAgLTI4MSw2ICszMDMsMTcgQEAKIEpTQm9vbCBnZXRfbnVsbGFibGVTdHJpbmdQcm9wZXJ0eSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKQEAgLTMyNSw2ICszNTgsMTcgQEAKIEpTQm9vbCBnZXRfbnVsbGFibGVPYmplY3RQcm9wZXJ0eSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UuY2MKaW5kZXggNGJmMWM2ZS4uNzcyMDg1ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UuY2MKQEAgLTE4OSw2ICsxODksMTcgQEAKIEpTQm9vbCBnZXRfYnl0ZVByb3BlcnR5KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC0yMzMsNiArMjQ0LDE3IEBACiBKU0Jvb2wgZ2V0X29jdGV0UHJvcGVydHkoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKQEAgLTI3Nyw2ICsyOTksMTcgQEAKIEpTQm9vbCBnZXRfc2hvcnRQcm9wZXJ0eSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApAQCAtMzIxLDYgKzM1NCwxNyBAQAogSlNCb29sIGdldF91bnNpZ25lZFNob3J0UHJvcGVydHkoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKQEAgLTM2NSw2ICs0MDksMTcgQEAKIEpTQm9vbCBnZXRfbG9uZ1Byb3BlcnR5KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC00MDksNiArNDY0LDE3IEBACiBKU0Jvb2wgZ2V0X3Vuc2lnbmVkTG9uZ1Byb3BlcnR5KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC00NTMsNiArNTE5LDE3IEBACiBKU0Jvb2wgZ2V0X2xvbmdMb25nUHJvcGVydHkoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKQEAgLTQ5Nyw2ICs1NzQsMTcgQEAKIEpTQm9vbCBnZXRfdW5zaWduZWRMb25nTG9uZ1Byb3BlcnR5KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC01NDEsNiArNjI5LDE3IEBACiBKU0Jvb2wgZ2V0X2RvdWJsZVByb3BlcnR5KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC01ODUsNiArNjg0LDE3IEBACiBKU0Jvb2wgZ2V0X3VucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZS5jYwppbmRleCAxYjIwOTk1Li44NGNkMzFkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UuY2MKQEAgLTIwMSw2ICsyMDEsMTcgQEAKIEpTQm9vbCBnZXRfYXJiaXRyYXJ5T2JqZWN0KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKQEAgLTI0NSw2ICsyNTYsMTcgQEAKIEpTQm9vbCBnZXRfYmFzZUludGVyZmFjZSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC0yNjcsNiArMjg5LDE3IEBACiBKU0Jvb2wgZ2V0X2Rlcml2ZWRJbnRlcmZhY2UoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApAQCAtMzExLDYgKzM0NCwxNyBAQAogSlNCb29sIGdldF9vYmplY3RQcm9wZXJ0eSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UuY2MKaW5kZXggYjMwZWVjYi4uYzI2NGQzOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZS5jYwpAQCAtNzM4LDYgKzczOCwxMCBAQAogICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KICAgICAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwogICAgICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgICAgICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgICAgIGlmIChhcmcuaXNPYmplY3QoKSkgeworICAgICAgICBvYmplY3QgPSBKU1ZBTF9UT19PQkpFQ1QoYXJnKTsKKyAgICAgIH0KICAgICAgIGlmIChhcmcuaXNOdW1iZXIoKSkgewogICAgICAgICByZXR1cm4gZmNuX292ZXJsb2FkZWRGdW5jdGlvbjIoCiAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CkBAIC03NTksOCArNzYzLDEyIEBACiAgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQogICAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CiAgICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgICAgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICAgICAgaWYgKGFyZy5pc09iamVjdCgpKSB7CisgICAgICAgIG9iamVjdCA9IEpTVkFMX1RPX09CSkVDVChhcmcpOworICAgICAgfQogICAgICAgaWYgKGFyZy5pc09iamVjdCgpID8gd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICAgICAgICBKU1ZBTF9UT19PQkpFQ1QoYXJnKSwgYmFzZTo6R2V0VHlwZUlkPEFyYml0cmFyeUludGVyZmFjZT4oKSkgOgorICAgICAgICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxBcmJpdHJhcnlJbnRlcmZhY2U+KCkpIDoKICAgICAgICAgICAgICAgZmFsc2UpIHsKICAgICAgICAgcmV0dXJuIGZjbl9vdmVybG9hZGVkRnVuY3Rpb241KAogICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwpAQCAtODgzLDYgKzg5MSwxMCBAQAogICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KICAgICAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwogICAgICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgICAgICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgICAgIGlmIChhcmcuaXNPYmplY3QoKSkgeworICAgICAgICBvYmplY3QgPSBKU1ZBTF9UT19PQkpFQ1QoYXJnKTsKKyAgICAgIH0KICAgICAgIGlmIChhcmcuaXNOdWxsT3JVbmRlZmluZWQoKSkgewogICAgICAgICByZXR1cm4gZmNuX292ZXJsb2FkZWROdWxsYWJsZTIoCiAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2UuY2MKaW5kZXggODcwZTNhMy4uYzU5NDZjMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZS5jYwpAQCAtMTkzLDYgKzE5MywxNyBAQAogSlNCb29sIGdldF9mb3J3YXJkaW5nQXR0cmlidXRlKAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFB1dEZvcndhcmRzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZS5jYwppbmRleCAwMmFkMzU2Li44MmE1ODY4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZS5jYwpAQCAtNDI1LDYgKzQyNSwxMCBAQAogICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KICAgICAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwogICAgICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgICAgICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgICAgIGlmIChhcmcuaXNPYmplY3QoKSkgeworICAgICAgICBvYmplY3QgPSBKU1ZBTF9UT19PQkpFQ1QoYXJnKTsKKyAgICAgIH0KICAgICAgIGlmIChhcmcuaXNOdW1iZXIoKSkgewogICAgICAgICByZXR1cm4gc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uMigKICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKQEAgLTQ0Niw4ICs0NTAsMTIgQEAKICAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKICAgICAgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICAgICAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgICAgICBpZiAoYXJnLmlzT2JqZWN0KCkpIHsKKyAgICAgICAgb2JqZWN0ID0gSlNWQUxfVE9fT0JKRUNUKGFyZyk7CisgICAgICB9CiAgICAgICBpZiAoYXJnLmlzT2JqZWN0KCkgPyB3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgICAgICAgIEpTVkFMX1RPX09CSkVDVChhcmcpLCBiYXNlOjpHZXRUeXBlSWQ8QXJiaXRyYXJ5SW50ZXJmYWNlPigpKSA6CisgICAgICAgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEFyYml0cmFyeUludGVyZmFjZT4oKSkgOgogICAgICAgICAgICAgICBmYWxzZSkgewogICAgICAgICByZXR1cm4gc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uNSgKICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZS5jYwppbmRleCBiMWI4MzQ5Li5lNmE3MGY4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlLmNjCkBAIC0xODksNiArMTg5LDE3IEBACiBKU0Jvb2wgZ2V0X3RoZVN0cmluZ2lmaWVyQXR0cmlidXRlKAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzVW5pb25UeXBlc0ludGVyZmFjZS5jYwppbmRleCA1YzliMzFmLi42OThiZTMxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzVW5pb25UeXBlc0ludGVyZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzVW5pb25UeXBlc0ludGVyZmFjZS5jYwpAQCAtMTk3LDYgKzE5NywxNyBAQAogSlNCb29sIGdldF91bmlvblByb3BlcnR5KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC0yNDEsNiArMjUyLDE3IEBACiBKU0Jvb2wgZ2V0X3VuaW9uV2l0aE51bGxhYmxlTWVtYmVyUHJvcGVydHkoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VW5pb25UeXBlc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CiAKQEAgLTI4NSw2ICszMDcsMTcgQEAKIEpTQm9vbCBnZXRfbnVsbGFibGVVbmlvblByb3BlcnR5KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCkBAIC0zMjksNiArMzYyLDE3IEBACiBKU0Jvb2wgZ2V0X3VuaW9uQmFzZVByb3BlcnR5KAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICB2cC5zZXQoSlM6OlVuZGVmaW5lZFZhbHVlKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwogICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzV2luZG93LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1dpbmRvdy5jYwppbmRleCAwYTVkZGQxLi5mNmQ4YTQ1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzV2luZG93LmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNXaW5kb3cuY2MKQEAgLTM4Miw2ICszODIsMTcgQEAKIEpTQm9vbCBnZXRfd2luZG93UHJvcGVydHkoCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8V2luZG93PigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApAQCAtNDI2LDYgKzQzNywxNyBAQAogSlNCb29sIGdldF93aW5kb3coCiAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8V2luZG93PigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgdnAuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKICAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKIApAQCAtNDY3LDEyICs0ODksMTIgQEAKICAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CiAgIFdpbmRvdyogaW1wbCA9CiAgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxXaW5kb3c+KCkuZ2V0KCk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwogCiAgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewogICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5HZXRTdGFja1RyYWNlKGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0U3RhY2tUcmFjZSgpKSwKKyAgICAgICAgICAgICAgaW1wbC0+R2V0U3RhY2tUcmFjZShjYWxsd2l0aF9nbG9iYWxfZW52aXJvbm1lbnQtPkdldFN0YWNrVHJhY2UoKSksCiAgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwogICB9CiAgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy9jb2RlX2dlbmVyYXRvci5weSBiL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMvY29kZV9nZW5lcmF0b3IucHkKaW5kZXggMTJhYzVmYi4uYzk5YzEwYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy9jb2RlX2dlbmVyYXRvci5weQorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL2NvZGVfZ2VuZXJhdG9yLnB5CkBAIC00Miw4ICs0Miw4IEBACiAgIGRlZiBpbmhlcml0c19pbnRlcmZhY2Uoc2VsZiwgaW50ZXJmYWNlX25hbWUsIGFyZyk6CiAgICAgcmV0dXJuICgnJXMuaXNPYmplY3QoKSA/JwogICAgICAgICAgICAgJyB3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoXG4nCi0gICAgICAgICAgICAnICAgICAgICAgICAgICBKU1ZBTF9UT19PQkpFQ1QoJXMpLCBiYXNlOjpHZXRUeXBlSWQ8JXM+KCkpIDpcbicKLSAgICAgICAgICAgICcgICAgICAgICAgICAgIGZhbHNlJykgJSAoYXJnLCBhcmcsIGludGVyZmFjZV9uYW1lKQorICAgICAgICAgICAgJyAgICAgICAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8JXM+KCkpIDpcbicKKyAgICAgICAgICAgICcgICAgICAgICAgICAgIGZhbHNlJykgJSAoYXJnLCBpbnRlcmZhY2VfbmFtZSkKIAogICBkZWYgaXNfbnVtYmVyKHNlbGYsIGFyZyk6CiAgICAgcmV0dXJuICclcy5pc051bWJlcigpJyAlIGFyZwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCmluZGV4IGViNGU1NTMuLmRjYzNlN2MgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKQEAgLTQ1OCw2ICs0NTgsMTcgQEAKIEpTQm9vbCBnZXRfe3thdHRyaWJ1dGUuaWRsX25hbWV9fSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDx7e2ltcGxfY2xhc3N9fT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHZwLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKIHt7IG5vbnN0YXRpY19mdW5jdGlvbl9wcm9sb2d1ZShpbXBsX2NsYXNzKSB9fQogeyUgZW5kaWYgJX0KIHt7IGNhbGxfY29iYWx0X2Z1bmN0aW9uKGltcGxfY2xhc3MsIGF0dHJpYnV0ZS50eXBlLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvbWFjcm9zLmNjLnRlbXBsYXRlIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvbWFjcm9zLmNjLnRlbXBsYXRlCmluZGV4IGY5MTUzYzcuLjg1MjAyOTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL21hY3Jvcy5jYy50ZW1wbGF0ZQorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9tYWNyb3MuY2MudGVtcGxhdGUKQEAgLTI1NiwxMCArMjU2LDEwIEBACiAgI30KIHslIG1hY3JvIGFkZF9leHRyYV9hcmd1bWVudHMoYXJndW1lbnRzX2xpc3QsIHJhaXNlc19leGNlcHRpb24sIGNhbGxfd2l0aCkgJX0KIHslIGlmIGNhbGxfd2l0aCAlfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBjYWxsd2l0aF9nbG9iYWxfZW52aXJvbm1lbnQgPQogICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLXslIGRvIGFyZ3VtZW50c19saXN0Lmluc2VydCgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWxfZW52aXJvbm1lbnQtPkdldCVzKCknfGZvcm1hdChjYWxsX3dpdGgpKSAlfQoreyUgZG8gYXJndW1lbnRzX2xpc3QuaW5zZXJ0KAorICAgIDAsICdjYWxsd2l0aF9nbG9iYWxfZW52aXJvbm1lbnQtPkdldCVzKCknfGZvcm1hdChjYWxsX3dpdGgpKSAlfQogeyUgZW5kaWYgJX0KIHslIGRvIGFyZ3VtZW50c19saXN0LmFwcGVuZCgnJmV4Y2VwdGlvbl9zdGF0ZScpIGlmIHJhaXNlc19leGNlcHRpb24gJX0KIHslLSBlbmRtYWNybyAlfQpAQCAtMzcyLDYgKzM3MiwxMCBAQAogICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KICAgICAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwogICAgICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgICAgICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgICAgIGlmIChhcmcuaXNPYmplY3QoKSkgeworICAgICAgICBvYmplY3QgPSBKU1ZBTF9UT19PQkpFQ1QoYXJnKTsKKyAgICAgIH0KIHslIGVuZGlmICV9CiB7JSBmb3IgdGVzdCwgb3ZlcmxvYWQgaW4gcmVzb2x1dGlvbl90ZXN0cyAlfQogICAgICAgaWYgKHt7dGVzdCgiYXJnIil9fSkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjCmluZGV4IGJkZTJiOGYuLmZlMjY2OTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MKQEAgLTU1OCwxMCArNTU4LDE0IEBACiAgICAgRExPRyhJTkZPKSA8PCAiR290IHN1c3BlbmQgZXZlbnQuIjsKICAgICBhcHBfc3RhdHVzXyA9IGtTdXNwZW5kZWRBcHBTdGF0dXM7CiAgICAgKythcHBfc3VzcGVuZF9jb3VudF87CisgICAgYnJvd3Nlcl9tb2R1bGVfLT5TdXNwZW5kKCk7CisgICAgRExPRyhJTkZPKSA8PCAiRmluaXNoZWQgc3VzcGVuZGluZy4iOwogICB9IGVsc2UgaWYgKGFwcF9ldmVudC0+dHlwZSgpID09IHN5c3RlbV93aW5kb3c6OkFwcGxpY2F0aW9uRXZlbnQ6OmtSZXN1bWUpIHsKICAgICBETE9HKElORk8pIDw8ICJHb3QgcmVzdW1lIGV2ZW50LiI7CiAgICAgYXBwX3N0YXR1c18gPSBrUGF1c2VkQXBwU3RhdHVzOwogICAgICsrYXBwX3Jlc3VtZV9jb3VudF87CisgICAgYnJvd3Nlcl9tb2R1bGVfLT5SZXN1bWUoKTsKKyAgICBETE9HKElORk8pIDw8ICJGaW5pc2hlZCByZXN1bWluZy4iOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5jYwppbmRleCA2MjFjMTJhLi4xNTMyY2NhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmNjCkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICAgICAgICBvcHRpb25zLm1lZGlhX21vZHVsZV9vcHRpb25zKSksCiAgICAgICBuZXR3b3JrX21vZHVsZV8oJnN0b3JhZ2VfbWFuYWdlcl8sIHN5c3RlbV93aW5kb3ctPmV2ZW50X2Rpc3BhdGNoZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5ldHdvcmtfbW9kdWxlX29wdGlvbnMpLAotICAgICAgcmVuZGVyX3RyZWVfY29tYmluZXJfKHJlbmRlcmVyX21vZHVsZV8ucGlwZWxpbmUoKSwKKyAgICAgIHJlbmRlcl90cmVlX2NvbWJpbmVyXygmcmVuZGVyZXJfbW9kdWxlXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlcl9tb2R1bGVfLnJlbmRlcl90YXJnZXQoKS0+R2V0U2l6ZSgpKSwKICNpZiBkZWZpbmVkKEVOQUJMRV9TQ1JFRU5TSE9UKQogICAgICAgc2NyZWVuX3Nob3Rfd3JpdGVyXyhuZXcgU2NyZWVuU2hvdFdyaXRlcihyZW5kZXJlcl9tb2R1bGVfLnBpcGVsaW5lKCkpKSwKQEAgLTE2OSw3ICsxNjksOCBAQAogICAgICAgICAgIGg1dmNjX3VybF9oYW5kbGVyXyh0aGlzLCBzeXN0ZW1fd2luZG93LCBhY2NvdW50X21hbmFnZXIpKSwKICAgICAgIHdlYl9tb2R1bGVfb3B0aW9uc18ob3B0aW9ucy53ZWJfbW9kdWxlX29wdGlvbnMpLAogICAgICAgaGFzX3Jlc3VtZWRfKHRydWUsIGZhbHNlKSwKLSAgICAgIHdpbGxfcXVpdF8oZmFsc2UpIHsKKyAgICAgIHdpbGxfcXVpdF8oZmFsc2UpLAorICAgICAgc3VzcGVuZGVkXyhmYWxzZSkgewogICAvLyBTZXR1cCBvdXIgbWFpbiB3ZWIgbW9kdWxlIHRvIGhhdmUgdGhlIEg1VkNDIEFQSSBpbmplY3RlZCBpbnRvIGl0LgogICBEQ0hFQ0soIUNvbnRhaW5zS2V5KHdlYl9tb2R1bGVfb3B0aW9uc18uaW5qZWN0ZWRfd2luZG93X2F0dHJpYnV0ZXMsICJoNXZjYyIpKTsKICAgaDV2Y2M6Okg1dmNjOjpTZXR0aW5ncyBoNXZjY19zZXR0aW5nczsKQEAgLTYxOSw2ICs2MjAsNzMgQEAKICAgbmV0d29ya19tb2R1bGVfLlNldFByb3h5KHByb3h5X3J1bGVzKTsKIH0KIAordm9pZCBCcm93c2VyTW9kdWxlOjpTdXNwZW5kKCkgeworICBEQ0hFQ0tfRVEoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgc2VsZl9tZXNzYWdlX2xvb3BfKTsKKyAgRENIRUNLKCFzdXNwZW5kZWRfKTsKKworLy8gRmlyc3Qgc3VzcGVuZCBhbGwgb3VyIHdlYiBtb2R1bGVzIHdoaWNoIGltcGxpZXMgdGhhdCB0aGV5IHdpbGwgcmVsZWFzZSB0aGVpcgorLy8gcmVzb3VyY2UgcHJvdmlkZXIgYW5kIGFsbCByZXNvdXJjZXMgY3JlYXRlZCB0aHJvdWdoIGl0LgorI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTlNPTEUpCisgIGlmIChkZWJ1Z19jb25zb2xlXykgeworICAgIGRlYnVnX2NvbnNvbGVfLT5TdXNwZW5kKCk7CisgIH0KKyNlbmRpZgorICBpZiAoc3BsYXNoX3NjcmVlbl8pIHsKKyAgICBzcGxhc2hfc2NyZWVuXy0+U3VzcGVuZCgpOworICB9CisgIGlmICh3ZWJfbW9kdWxlXykgeworICAgIHdlYl9tb2R1bGVfLT5TdXNwZW5kKCk7CisgIH0KKworICAvLyBGbHVzaCBvdXQgYW55IHN1Ym1pdHRlZCByZW5kZXIgdHJlZXMgcHVzaGVkIHNpbmNlIHdlIHN0YXJ0ZWQgc2h1dHRpbmcgZG93bgorICAvLyB0aGUgd2ViIG1vZHVsZXMgYWJvdmUuCisgIHJlbmRlcl90cmVlX3N1Ym1pc3Npb25fcXVldWVfLlByb2Nlc3NBbGwoKTsKKworI2lmIGRlZmluZWQoRU5BQkxFX1NDUkVFTlNIT1QpCisgIC8vIFRoZSBzY3JlZW5zaG90IHdyaXRlciBtYXkgYmUgaG9sZGluZyBvbiB0byBhIHJlZmVyZW5jZSB0byBhIHJlbmRlciB0cmVlCisgIC8vIHdoaWNoIGNvdWxkIGluIHR1cm4gYmUgcmVmZXJlbmNpbmcgcmVzb3VyY2VzIGxpa2UgaW1hZ2VzLCBzbyBjbGVhciB0aGF0CisgIC8vIG91dC4KKyAgc2NyZWVuX3Nob3Rfd3JpdGVyXy0+Q2xlYXJMYXN0UGlwZWxpbmVTdWJtaXNzaW9uKCk7CisjZW5kaWYKKworICAvLyBDbGVhciBvdXQgdGhlIHJlbmRlciB0cmVlIGNvbWJpbmVyIHNvIHRoYXQgaXQgZG9lc24ndCBob2xkIG9uIHRvIGFueQorICAvLyByZW5kZXIgdHJlZSByZXNvdXJjZXMgZWl0aGVyLgorICByZW5kZXJfdHJlZV9jb21iaW5lcl8uUmVzZXQoKTsKKworICAvLyBQbGFjZSB0aGUgcmVuZGVyZXIgbW9kdWxlIGludG8gYSBzdXNwZW5kZWQgc3RhdGUgd2hlcmUgaXQgcmVsZWFzZXMgYWxsIGl0cworICAvLyBncmFwaGljYWwgcmVzb3VyY2VzLgorICByZW5kZXJlcl9tb2R1bGVfLlN1c3BlbmQoKTsKKworICBzdXNwZW5kZWRfID0gdHJ1ZTsKK30KKwordm9pZCBCcm93c2VyTW9kdWxlOjpSZXN1bWUoKSB7CisgIERDSEVDS19FUShNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBzZWxmX21lc3NhZ2VfbG9vcF8pOworICBEQ0hFQ0soc3VzcGVuZGVkXyk7CisKKyAgcmVuZGVyZXJfbW9kdWxlXy5SZXN1bWUoKTsKKworICAvLyBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCwgaXQgaXMgcHJvYmFibGUgdGhhdCB0aGlzIHJlc291cmNlIHByb3ZpZGVyIGlzCisgIC8vIGRpZmZlcmVudCB0aGFuIHRoZSBvbmUgdGhhdCB3YXMgbWFuYWdlZCBpbiB0aGUgYXNzb2NpYXRlZCBjYWxsIHRvCisgIC8vIFN1c3BlbmQoKS4KKyAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyID0KKyAgICAgIHJlbmRlcmVyX21vZHVsZV8ucGlwZWxpbmUoKS0+R2V0UmVzb3VyY2VQcm92aWRlcigpOworCisjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09OU09MRSkKKyAgaWYgKGRlYnVnX2NvbnNvbGVfKSB7CisgICAgZGVidWdfY29uc29sZV8tPlJlc3VtZShyZXNvdXJjZV9wcm92aWRlcik7CisgIH0KKyNlbmRpZgorICBpZiAoc3BsYXNoX3NjcmVlbl8pIHsKKyAgICBzcGxhc2hfc2NyZWVuXy0+UmVzdW1lKHJlc291cmNlX3Byb3ZpZGVyKTsKKyAgfQorICBpZiAod2ViX21vZHVsZV8pIHsKKyAgICB3ZWJfbW9kdWxlXy0+UmVzdW1lKHJlc291cmNlX3Byb3ZpZGVyKTsKKyAgfQorCisgIHN1c3BlbmRlZF8gPSBmYWxzZTsKK30KKwogI2lmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQogdm9pZCBCcm93c2VyTW9kdWxlOjpPblJlbmRlcmVyU3VibWlzc2lvblJhc3Rlcml6ZWQoKSB7CiAgIGlmICghaXNfcmVuZGVyZWRfKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oCmluZGV4IGQ1ODkwODQuLjgyMzIyYjMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oCkBAIC0xMTMsNiArMTEzLDEzIEBACiAgIC8vIENoYW5nZSB0aGUgbmV0d29yayBwcm94eSBzZXR0aW5ncyB3aGlsZSB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZy4KICAgdm9pZCBTZXRQcm94eShjb25zdCBzdGQ6OnN0cmluZyYgcHJveHlfcnVsZXMpOwogCisgIC8vIFN1c3BlbmRzIHRoZSBicm93c2VyIG1vZHVsZSBmcm9tIGFjdGl2aXR5LCBhbmQgcmVsZWFzZXMgYWxsIGdyYXBoaWNhbAorICAvLyByZXNvdXJjZXMsIHBsYWNpbmcgdGhlIGFwcGxpY2F0aW9uIGludG8gYSBsb3ctbWVtb3J5IHN0YXRlLgorICB2b2lkIFN1c3BlbmQoKTsKKworICAvLyBVbmRvZXMgdGhlIGNhbGwgdG8gU3VzcGVuZCgpLCByZXR1cm5pbmcgdG8gbm9ybWFsIGZ1bmN0aW9uYWxpdHkuCisgIHZvaWQgUmVzdW1lKCk7CisKICBwcml2YXRlOgogICAvLyBSZWNyZWF0ZXMgd2ViIG1vZHVsZSB3aXRoIHRoZSBnaXZlbiBVUkwuCiAgIHZvaWQgTmF2aWdhdGVJbnRlcm5hbChjb25zdCBHVVJMJiB1cmwpOwpAQCAtMzI3LDYgKzMzNCw4IEBACiAgIC8vIHRoaXMgb2JqZWN0KSBhbmQgcmVhZCBmcm9tIGFub3RoZXIuIFRoaXMgbG9jayBpcyB1c2VkIHRvCiAgIC8vIGVuc3VyZSBzeW5jaHJvbm91cyBhY2Nlc3MuCiAgIGJhc2U6OkxvY2sgcXVpdF9sb2NrXzsKKworICBib29sIHN1c3BlbmRlZF87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2RlYnVnX2NvbnNvbGUuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5jYwppbmRleCBiMDI1NTdkLi4zMzJlZWJiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5jYwpAQCAtMjIxLDYgKzIyMSwxMiBAQAogICByZXR1cm4gbW9kZV87CiB9CiAKK3ZvaWQgRGVidWdDb25zb2xlOjpTdXNwZW5kKCkgeyB3ZWJfbW9kdWxlXy0+U3VzcGVuZCgpOyB9CisKK3ZvaWQgRGVidWdDb25zb2xlOjpSZXN1bWUocmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKSB7CisgIHdlYl9tb2R1bGVfLT5SZXN1bWUocmVzb3VyY2VfcHJvdmlkZXIpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5oIGIvc3JjL2NvYmFsdC9icm93c2VyL2RlYnVnX2NvbnNvbGUuaAppbmRleCBmMTVhOGE2Li41MjcyOThkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlLmgKQEAgLTYwLDYgKzYwLDkgQEAKICAgLy8gUmV0dXJucyB0aGUgY3VycmVudGx5IHNldCBkZWJ1ZyBjb25zb2xlIHZpc2liaWxpdHkgbW9kZS4KICAgaW50IEdldE1vZGUoKTsKIAorICB2b2lkIFN1c3BlbmQoKTsKKyAgdm9pZCBSZXN1bWUocmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKTsKKwogIHByaXZhdGU6CiAgIHZvaWQgT25FcnJvcihjb25zdCBHVVJMJiAvKiB1cmwgKi8sIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcikgewogICAgIExPRyhFUlJPUikgPDwgZXJyb3I7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvcmVuZGVyX3RyZWVfY29tYmluZXIuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvcmVuZGVyX3RyZWVfY29tYmluZXIuY2MKaW5kZXggMTViMzVjYi4uMzY0MTU4YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3JlbmRlcl90cmVlX2NvbWJpbmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5jYwpAQCAtMjMsMTQgKzIzLDIwIEBACiBuYW1lc3BhY2UgYnJvd3NlciB7CiAKICNpZiBkZWZpbmVkKEVOQUJMRV9ERUJVR19DT05TT0xFKQotUmVuZGVyVHJlZUNvbWJpbmVyOjpSZW5kZXJUcmVlQ29tYmluZXIocmVuZGVyZXI6OlBpcGVsaW5lKiByZW5kZXJlcl9waXBlbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlNpemUmIHZpZXdwb3J0X3NpemUpCitSZW5kZXJUcmVlQ29tYmluZXI6OlJlbmRlclRyZWVDb21iaW5lcigKKyAgICByZW5kZXJlcjo6UmVuZGVyZXJNb2R1bGUqIHJlbmRlcmVyX21vZHVsZSwgY29uc3QgbWF0aDo6U2l6ZSYgdmlld3BvcnRfc2l6ZSkKICAgICA6IHJlbmRlcl9kZWJ1Z19jb25zb2xlXyh0cnVlKSwKLSAgICAgIHJlbmRlcmVyX3BpcGVsaW5lXyhyZW5kZXJlcl9waXBlbGluZSksCisgICAgICByZW5kZXJlcl9tb2R1bGVfKHJlbmRlcmVyX21vZHVsZSksCiAgICAgICB2aWV3cG9ydF9zaXplXyh2aWV3cG9ydF9zaXplKSB7fQogCiBSZW5kZXJUcmVlQ29tYmluZXI6On5SZW5kZXJUcmVlQ29tYmluZXIoKSB7fQogCit2b2lkIFJlbmRlclRyZWVDb21iaW5lcjo6UmVzZXQoKSB7CisgIG1haW5fcmVuZGVyX3RyZWVfID0gYmFzZTo6bnVsbG9wdDsKKyAgZGVidWdfY29uc29sZV9yZW5kZXJfdHJlZV8gPSBiYXNlOjpudWxsb3B0OworICBtYWluX3JlbmRlcl90cmVlX3JlY2VpcHRfdGltZV8gPSBiYXNlOjpudWxsb3B0OworfQorCiB2b2lkIFJlbmRlclRyZWVDb21iaW5lcjo6VXBkYXRlTWFpblJlbmRlclRyZWUoCiAgICAgY29uc3QgcmVuZGVyZXI6OlN1Ym1pc3Npb24mIHJlbmRlcl90cmVlX3N1Ym1pc3Npb24pIHsKICAgbWFpbl9yZW5kZXJfdHJlZV8gPSByZW5kZXJfdHJlZV9zdWJtaXNzaW9uOwpAQCAtNjIsNyArNjgsNyBAQAogICAgICAgICAgIG1haW5fcmVuZGVyX3RyZWVfLT50aW1lX29mZnNldCArCiAgICAgICAgICAgKGJhc2U6OlRpbWVUaWNrczo6SGlnaFJlc05vdygpIC0gKm1haW5fcmVuZGVyX3RyZWVfcmVjZWlwdF90aW1lXyk7CiAKLSAgICAgIHJlbmRlcmVyX3BpcGVsaW5lXy0+U3VibWl0KGNvbWJpbmVkX3N1Ym1pc3Npb24pOworICAgICAgcmVuZGVyZXJfbW9kdWxlXy0+cGlwZWxpbmUoKS0+U3VibWl0KGNvbWJpbmVkX3N1Ym1pc3Npb24pOwogICAgIH0gZWxzZSB7CiAgICAgICAvLyBJZiB3ZSBhcmUgcmVuZGVyaW5nIHRoZSBkZWJ1ZyBjb25zb2xlIGJ5IGl0c2VsZiwgZ2l2ZSBpdCBhIHNvbGlkIGJsYWNrCiAgICAgICAvLyBiYWNrZ3JvdW5kIHRvIGl0LgpAQCAtNzYsMjQgKzgyLDI2IEBACiAgICAgICByZW5kZXJlcjo6U3VibWlzc2lvbiBjb21iaW5lZF9zdWJtaXNzaW9uKCpkZWJ1Z19jb25zb2xlX3JlbmRlcl90cmVlXyk7CiAgICAgICBjb21iaW5lZF9zdWJtaXNzaW9uLnJlbmRlcl90cmVlID0KICAgICAgICAgICBuZXcgcmVuZGVyX3RyZWU6OkNvbXBvc2l0aW9uTm9kZShidWlsZGVyKTsKLSAgICAgIHJlbmRlcmVyX3BpcGVsaW5lXy0+U3VibWl0KGNvbWJpbmVkX3N1Ym1pc3Npb24pOworICAgICAgcmVuZGVyZXJfbW9kdWxlXy0+cGlwZWxpbmUoKS0+U3VibWl0KGNvbWJpbmVkX3N1Ym1pc3Npb24pOwogICAgIH0KICAgfSBlbHNlIGlmIChtYWluX3JlbmRlcl90cmVlXykgewotICAgIHJlbmRlcmVyX3BpcGVsaW5lXy0+U3VibWl0KCptYWluX3JlbmRlcl90cmVlXyk7CisgICAgcmVuZGVyZXJfbW9kdWxlXy0+cGlwZWxpbmUoKS0+U3VibWl0KCptYWluX3JlbmRlcl90cmVlXyk7CiAgIH0KIH0KICNlbHNlICAgLy8gRU5BQkxFX0RFQlVHX0NPTlNPTEUKLVJlbmRlclRyZWVDb21iaW5lcjo6UmVuZGVyVHJlZUNvbWJpbmVyKHJlbmRlcmVyOjpQaXBlbGluZSogcmVuZGVyZXJfcGlwZWxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRoOjpTaXplJiB2aWV3cG9ydF9zaXplKQotICAgIDogcmVuZGVyZXJfcGlwZWxpbmVfKHJlbmRlcmVyX3BpcGVsaW5lKSB7CitSZW5kZXJUcmVlQ29tYmluZXI6OlJlbmRlclRyZWVDb21iaW5lcigKKyAgICByZW5kZXJlcjo6UmVuZGVyZXJNb2R1bGUqIHJlbmRlcmVyX21vZHVsZSwgY29uc3QgbWF0aDo6U2l6ZSYgdmlld3BvcnRfc2l6ZSkKKyAgICA6IHJlbmRlcmVyX21vZHVsZV8ocmVuZGVyZXJfbW9kdWxlKSB7CiAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIodmlld3BvcnRfc2l6ZSk7CiB9CiAKIFJlbmRlclRyZWVDb21iaW5lcjo6flJlbmRlclRyZWVDb21iaW5lcigpIHt9CiAKK3ZvaWQgUmVuZGVyVHJlZUNvbWJpbmVyOjpSZXNldCgpIHt9CisKIHZvaWQgUmVuZGVyVHJlZUNvbWJpbmVyOjpVcGRhdGVNYWluUmVuZGVyVHJlZSgKICAgICBjb25zdCByZW5kZXJlcjo6U3VibWlzc2lvbiYgcmVuZGVyX3RyZWVfc3VibWlzc2lvbikgewotICByZW5kZXJlcl9waXBlbGluZV8tPlN1Ym1pdChyZW5kZXJfdHJlZV9zdWJtaXNzaW9uKTsKKyAgcmVuZGVyZXJfbW9kdWxlXy0+cGlwZWxpbmUoKS0+U3VibWl0KHJlbmRlcl90cmVlX3N1Ym1pc3Npb24pOwogfQogCiB2b2lkIFJlbmRlclRyZWVDb21iaW5lcjo6VXBkYXRlRGVidWdDb25zb2xlUmVuZGVyVHJlZSgKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5oIGIvc3JjL2NvYmFsdC9icm93c2VyL3JlbmRlcl90cmVlX2NvbWJpbmVyLmgKaW5kZXggOWYzNDU2YS4uNDRmMzhkNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3JlbmRlcl90cmVlX2NvbWJpbmVyLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3JlbmRlcl90cmVlX2NvbWJpbmVyLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQ09CQUxUX0JST1dTRVJfUkVOREVSX1RSRUVfQ09NQklORVJfSF8KICNkZWZpbmUgQ09CQUxUX0JST1dTRVJfUkVOREVSX1RSRUVfQ09NQklORVJfSF8KIAotI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9waXBlbGluZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvc3VibWlzc2lvbi5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTI5LDEwICsyOSwxMiBAQAogLy8gb3RoZXJ3aXNlIChlLmcuIGluIHJlbGVhc2UgYnVpbGRzKSBhIHN0dWIgaW1wbGVtZW50YXRpb24gaXMgdXNlZC4KIGNsYXNzIFJlbmRlclRyZWVDb21iaW5lciB7CiAgcHVibGljOgotICBleHBsaWNpdCBSZW5kZXJUcmVlQ29tYmluZXIocmVuZGVyZXI6OlBpcGVsaW5lKiByZW5kZXJlcl9waXBlbGluZSwKKyAgZXhwbGljaXQgUmVuZGVyVHJlZUNvbWJpbmVyKHJlbmRlcmVyOjpSZW5kZXJlck1vZHVsZSogcmVuZGVyZXJfbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgdmlld3BvcnRfc2l6ZSk7CiAgIH5SZW5kZXJUcmVlQ29tYmluZXIoKTsKIAorICB2b2lkIFJlc2V0KCk7CisKICAgLy8gVXBkYXRlIHRoZSBtYWluIHdlYiBtb2R1bGUgcmVuZGVyIHRyZWUuCiAgIHZvaWQgVXBkYXRlTWFpblJlbmRlclRyZWUoY29uc3QgcmVuZGVyZXI6OlN1Ym1pc3Npb24mIHJlbmRlcl90cmVlX3N1Ym1pc3Npb24pOwogCkBAIC02MSw3ICs2Myw3IEBACiAKICAgLy8gTG9jYWwgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXIgcGlwZWxpbmUsIHNvIHdlIGNhbiBzdWJtaXQgdGhlIGNvbWJpbmVkIHRyZWUuCiAgIC8vIFJlZmVyZW5jZSBjb3VudGVkIHBvaW50ZXIgbm90IG5lY2Vzc2FyeSBoZXJlLgotICByZW5kZXJlcjo6UGlwZWxpbmUqIHJlbmRlcmVyX3BpcGVsaW5lXzsKKyAgcmVuZGVyZXI6OlJlbmRlcmVyTW9kdWxlKiByZW5kZXJlcl9tb2R1bGVfOwogCiAgIC8vIFRoZSBzaXplIG9mIHRoZSBvdXRwdXQgdmlld3BvcnQuCiAgIG1hdGg6OlNpemUgdmlld3BvcnRfc2l6ZV87CkBAIC03OSw3ICs4MSw3IEBACiAgIGJhc2U6Om9wdGlvbmFsPHJlbmRlcmVyOjpTdWJtaXNzaW9uPiBkZWJ1Z19jb25zb2xlX3JlbmRlcl90cmVlXzsKICNlbHNlICAgLy8gRU5BQkxFX0RFQlVHX0NPTlNPTEUKICAgLy8gVXNlIHRoaXMgbG9jYWwgcmVmZXJlbmNlIGV2ZW4gaW4gcmVsZWFzZSBidWlsZHMgdG8gc3VibWl0IHRoZSBtYWluIHRyZWUuCi0gIHJlbmRlcmVyOjpQaXBlbGluZSogcmVuZGVyZXJfcGlwZWxpbmVfOworICByZW5kZXJlcjo6UmVuZGVyZXJNb2R1bGUqIHJlbmRlcmVyX21vZHVsZV87CiAjZW5kaWYgIC8vIEVOQUJMRV9ERUJVR19DT05TT0xFCiB9OwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvc2NyZWVuX3Nob3Rfd3JpdGVyLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3NjcmVlbl9zaG90X3dyaXRlci5jYwppbmRleCA1MDAzNTU4Li45ZGFjMWE0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvc2NyZWVuX3Nob3Rfd3JpdGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zY3JlZW5fc2hvdF93cml0ZXIuY2MKQEAgLTgyLDYgKzgyLDEwIEBACiAgIGxhc3Rfc3VibWlzc2lvbl90aW1lXyA9IGJhc2U6OlRpbWVUaWNrczo6SGlnaFJlc05vdygpOwogfQogCit2b2lkIFNjcmVlblNob3RXcml0ZXI6OkNsZWFyTGFzdFBpcGVsaW5lU3VibWlzc2lvbigpIHsKKyAgbGFzdF9zdWJtaXNzaW9uXyA9IGJhc2U6Om51bGxvcHQ7Cit9CisKIHZvaWQgU2NyZWVuU2hvdFdyaXRlcjo6UmFzdGVyaXphdGlvbkNvbXBsZXRlKAogICAgIGNvbnN0IFBOR0VuY29kZUNvbXBsZXRlQ2FsbGJhY2smIGVuY29kZV9jb21wbGV0ZV9jYWxsYmFjaywKICAgICBzY29wZWRfYXJyYXk8dWludDg+IHBpeGVsX2RhdGEsIGNvbnN0IG1hdGg6OlNpemUmIGRpbWVuc2lvbnMpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zY3JlZW5fc2hvdF93cml0ZXIuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zY3JlZW5fc2hvdF93cml0ZXIuaAppbmRleCA4ZTRkZTVkLi5lYjI0MTE1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvc2NyZWVuX3Nob3Rfd3JpdGVyLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3NjcmVlbl9zaG90X3dyaXRlci5oCkBAIC01Nyw2ICs1NywxMSBAQAogICAvLyBzY3JlZW5zaG90IGlzIHJlcXVlc3RlZC4KICAgdm9pZCBTZXRMYXN0UGlwZWxpbmVTdWJtaXNzaW9uKGNvbnN0IHJlbmRlcmVyOjpTdWJtaXNzaW9uJiBzdWJtaXNzaW9uKTsKIAorICAvLyBDbGVhcnMgdGhlIGxhc3Qgc3VibWlzc2lvbiBmcm9tIHRoZSBwaXBlbGluZSwgcHV0dGluZyB0aGUgU2NyZWVuU2hvdFdyaXRlcgorICAvLyBpbnRvIGEgc3RhdGUgc2ltaWxhciB0byB3aGVuIGl0IHdhcyBmaXJzdCBjcmVhdGVkLCB3aGVyZSB0aGVyZSB3YXMgbm8KKyAgLy8gImxhc3QgcGlwZWxpbmUgc3VibWlzc2lvbiIuCisgIHZvaWQgQ2xlYXJMYXN0UGlwZWxpbmVTdWJtaXNzaW9uKCk7CisKICBwcml2YXRlOgogICAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZmlyZWQgZnJvbSB0aGUgcmFzdGVyaXplciB0aHJlYWQgd2hlbgogICAvLyByYXN0ZXJpemF0aW9uIG9mIHxsYXN0X3N1Ym1pc3Npb25ffCBpcyBjb21wbGV0ZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4uY2MKaW5kZXggODA0YjkyZC4uYTJhM2Q5NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4uY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4uY2MKQEAgLTQyLDUgKzQyLDEwIEBACiAgICAgICBsYXlvdXRfcmVmcmVzaF9yYXRlLCB3ZWJfbW9kdWxlX29wdGlvbnMpKTsKIH0KIAordm9pZCBTcGxhc2hTY3JlZW46OlN1c3BlbmQoKSB7IHdlYl9tb2R1bGVfLT5TdXNwZW5kKCk7IH0KK3ZvaWQgU3BsYXNoU2NyZWVuOjpSZXN1bWUocmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKSB7CisgIHdlYl9tb2R1bGVfLT5SZXN1bWUocmVzb3VyY2VfcHJvdmlkZXIpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4uaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuLmgKaW5kZXggMjRhMThmOS4uYTEwNWZlNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4uaAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3BsYXNoX3NjcmVlbi5oCkBAIC00NSw2ICs0NSw5IEBACiAgICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsCiAgICAgICAgICAgICAgICBmbG9hdCBsYXlvdXRfcmVmcmVzaF9yYXRlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zID0gT3B0aW9ucygpKTsKIAorICB2b2lkIFN1c3BlbmQoKTsKKyAgdm9pZCBSZXN1bWUocmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKTsKKwogIHByaXZhdGU6CiAgIHZvaWQgT25FcnJvcihjb25zdCBHVVJMJiAvKiB1cmwgKi8sIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcikgewogICAgIExPRyhFUlJPUikgPDwgZXJyb3I7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvbXRtLWRlbW8vUkVBRE1FLnR4dCBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9tdG0tZGVtby9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjgzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvbXRtLWRlbW8vUkVBRE1FLnR4dApAQCAtMCwwICsxLDM3IEBACitUaGVzZSB0ZXN0IHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIHRoZSBDU1MgTVRNIGZpbHRlciBhZmZlY3QgdGhlIHBhdGggdGFrZW4gaW4KK3JlbmRlcmluZyB0aGUgdmlkZW8gcmVwbGFjZWQgYm94LiA8bm9ybWFsLmh0bWw+IGhhcyBhIHZpZGVvIHRhZyB3aXRob3V0IHRoZQorZmlsdGVyLCB3aGlsZSA8bXRtLmh0bWw+IGhhcyBhIHZpZGVvIHdpdGggdGhlIGZpbHRlciBhcHBsaWVkIHRvIGl0LgorCitUbyB0ZXN0IGxvY2FsbHksIGFsbCAzIG9mIG10bS5odG1sLCBub3JtYWwuaHRtbCBhbmQgcHJvZ3Jlc3NpdmUubXA0IGhhdmUgdG8gYmUKK2hvc3RlZCBvbiBhIHNlcnZlciB0aGF0IHN1cHBvcnRzIEhUVFAgUkFOR0UgaGVhZGVyLCB3aGljaCBpcyBuZWVkZWQgZm9yIHZpZGVvIHRvCitiZSBsb2FkZWQgY29ycmVjdGx5LiBPbmUgc3VjaCBzZXJ2ZXIgaXMgdGhlIGV4dGVuc2lvbiB0byB0aGUgUHl0aG9uCitTaW1wbGVIVFRQU2VydmVyIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9kYW52ay9SYW5nZUhUVFBTZXJ2ZXIgKHJ1biBmcm9tIHRoaXMKK2RpcmVjdG9yeSwgImNvYmFsdC9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvbXRtLWRlbW8vIik6CisKKyAgJCBzdWRvIGFwdC1nZXQgaW5zdGFsbCBweXRob24tcGlwCisgICQgcGlwIGluc3RhbGwgLS11c2VyIHJhbmdlaHR0cHNlcnZlcgorICAkIHB5dGhvbiAtbSBSYW5nZUhUVFBTZXJ2ZXIKKworVGVzdCB2aWRlbyB3aXRob3V0IHRoZSBNVE0gZmlsdGVyIChzaG91bGQgcmVuZGVyIG5vcm1hbGx5LCBydW4gZnJvbSBjb2JhbHQvc3JjCitkaXJlY3RvcnkpOgorCisgICQgb3V0L2xpbnV4LXg2NHgxMV9kZWJ1Zy9jb2JhbHQgLS1jc3BfbW9kZT1kaXNhYmxlIC0tYWxsb3dfaHR0cCAtLXVybD1odHRwOi8vbG9jYWxob3N0OjgwMDAvbm9ybWFsLmh0bWwKKworVGVzdCB0aGUgdmlkZW8gd2l0aCB0aGUgTVRNIGZpbHRlciAoc2hvdWxkIE5PVCByZW5kZXIgaW4gaXRzIGJvdW5kaW5nIGJveCBpbiB0aGUKK2RvY3VtZW50LCBhbmQgaW4gdGhlIHByZXNlbmNlIG9mIHRoZSBjb3JyZWN0IHJhc3Rlcml6ZXIsIHNob3VsZCBiZSByZW5kZXJlZCBvbnRvCitpdHMgb3duIHRleHR1cmUgb2ZmIHRoZSBtYWluIFVJIGxheW91dCk6CisKKyAgJCBvdXQvbGludXgteDY0eDExX2RlYnVnL2NvYmFsdCAtLWNzcF9tb2RlPWRpc2FibGUgLS1hbGxvd19odHRwIC0tdXJsPWh0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9tdG0uaHRtbAorCitUaGVyZSBpcyBhbHNvIHRoZSBvcHRpb24gb2YgdXNpbmcgdGhlIGdvb2dsZSBjbG91ZCB1dGlscyBhbmQgdGhlIGNsb3VkIHN0b3JhZ2UKK3RvIHB1Ymxpc2ggdGhlc2UgZmlsZXMsIGFzIGlzIGRvbmUgd2l0aCB0aGUgb3RoZXIgZGVtb3MuIENhcmUgc2hvdWxkIGJlIHRha2VuCit0aGF0IG5vdGhpbmcgY29uZmlkZW50aWFsIGdldHMgdXBsb2FkZWQgd2l0aCB0aGVzZSBmaWxlcy4gInB1YmxpYy1yZWFkIiBpcworbmVlZGVkIGluIHRoZSBBQ0wgYmVjYXVzZSBsaW5raW5nIGFuZCB2aWRlbyBzcmNpbmcgZG9lcyBub3Qgd29yayB3aXRob3V0IGl0LgorCitBIGJ1Y2tldCBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgZGVtbyBhbHJlYWR5IGV4aXN0cyBhdCAiZ3M6Ly95dC1jb2JhbHQtbXRtLXRlc3QiLAorYnV0IHVwbG9hZGluZyB0byBpdCBvZnRlbiBtaWdodCBiZSBwcm9ibGVtYXRpYyBzaW5jZSBidWNrZXRzIGFyZSBub3QgdmVyaXNvbi0KK2NvbnRyb2xsZWQ6CisKKyAgJCBnc3V0aWwgY3AgLWEgcHVibGljLXJlYWQgY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvbXRtLWRlbW8vbm9ybWFsLmh0bWwgY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvbXRtLWRlbW8vbXRtLmh0bWwgY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvbXRtLWRlbW8vcHJvZ3Jlc3NpdmUubXA0IGdzOi8veXQtY29iYWx0LW10bS10ZXN0LworICAkIG91dC9saW51eC14NjR4MTFfZGVidWcvY29iYWx0IC0tY3NwX21vZGU9ZGlzYWJsZSAtLXVybD1odHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20veXQtY29iYWx0LW10bS10ZXN0L210bS5odG1sCisgICQgb3V0L2xpbnV4LXg2NHgxMV9kZWJ1Zy9jb2JhbHQgLS1jc3BfbW9kZT1kaXNhYmxlIC0tdXJsPWh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS95dC1jb2JhbHQtbXRtLXRlc3Qvbm9ybWFsLmh0bWwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9tdG0tZGVtby9tdG0uaHRtbCBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9tdG0tZGVtby9tdG0uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODc3Njc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL210bS1kZW1vL210bS5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKyAgPHRpdGxlPm10bSBEZW1vPC90aXRsZT4KKyAgPHN0eWxlPgorICAgIGJvZHkgeworICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOworICAgICAgY29sb3I6ICMwMDQ3YWI7CisgICAgICBmb250LXNpemU6IDEwMHB4OworICAgIH0KKyAgICAudmlkIHsKKyAgICAgIG1hcmdpbjogMTAwcHg7CisgICAgICBib3JkZXI6IDEwcHggc29saWQgYmx1ZTsKKyAgICAgIHdpZHRoOiA5NjBweDsKKyAgICAgIGhlaWdodDogNTQwcHg7CisgICAgICBmaWx0ZXI6IC1jb2JhbHQtbXRtKHVybChwcm9qZWN0aW9uLm1zaCksIDEwMGRlZyA2MGRlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeDNkKDEsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDEpKTsKKyAgICB9CisgIDwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKyAgPGRpdj5NdG0gRGVtbyEhITwvZGl2PgorICA8dmlkZW8gYXV0b3BsYXkgbG9vcCBpZD0idiIgY2xhc3M9InZpZCIgc3JjPSJwcm9ncmVzc2l2ZS5tcDQiPjwvdmlkZW8+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvbXRtLWRlbW8vbm9ybWFsLmh0bWwgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvbXRtLWRlbW8vbm9ybWFsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1MTZmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9tdG0tZGVtby9ub3JtYWwuaHRtbApAQCAtMCwwICsxLDIzIEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgIDx0aXRsZT5Ob3JtYWwgRGVtbzwvdGl0bGU+CisgIDxzdHlsZT4KKyAgICBib2R5IHsKKyAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsKKyAgICAgIGNvbG9yOiAjMDA0N2FiOworICAgICAgZm9udC1zaXplOiAxMDBweDsKKyAgICB9CisgICAgLnZpZCB7CisgICAgICBtYXJnaW46IDEwMHB4OworICAgICAgYm9yZGVyOiAxMHB4IHNvbGlkIGJsdWU7CisgICAgICB3aWR0aDogOTYwcHg7CisgICAgICBoZWlnaHQ6IDU0MHB4OworICAgIH0KKyAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorICA8ZGl2Pk5vcm1hbCBEZW1vPC9kaXY+CisgIDx2aWRlbyBhdXRvcGxheSBsb29wIGlkPSJ2IiBjbGFzcz0idmlkIiBzcmM9InByb2dyZXNzaXZlLm1wNCI+PC92aWRlbz4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9tdG0tZGVtby9wcm9ncmVzc2l2ZS5tcDQgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvbXRtLWRlbW8vcHJvZ3Jlc3NpdmUubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODZhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvbXRtLWRlbW8vcHJvZ3Jlc3NpdmUubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MKaW5kZXggNzkzMjE5Ni4uNzc1ZjdlNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MKQEAgLTEwOCw2ICsxMDgsOSBAQAogICB2b2lkIENyZWF0ZURlYnVnU2VydmVySWZOdWxsKCk7CiAjZW5kaWYgIC8vIEVOQUJMRV9ERUJVR19DT05TT0xFCiAKKyAgdm9pZCBTdXNwZW5kKCk7CisgIHZvaWQgUmVzdW1lKHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcik7CisKICBwcml2YXRlOgogICBjbGFzcyBEb2N1bWVudExvYWRlZE9ic2VydmVyOwogCkBAIC0xNDEsNiArMTQ0LDkgQEAKICAgLy8gU2ltcGxlIGZsYWcgdXNlZCBmb3IgYmFzaWMgZXJyb3IgY2hlY2tpbmcuCiAgIGJvb2wgaXNfcnVubmluZ187CiAKKyAgLy8gT2JqZWN0IHRoYXQgcHJvdmlkZXMgcmVuZGVyZXIgcmVzb3VyY2VzIGxpa2UgaW1hZ2VzIGFuZCBmb250cy4KKyAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyXzsKKwogICAvLyBDU1MgcGFyc2VyLgogICBzY29wZWRfcHRyPGNzc19wYXJzZXI6OlBhcnNlcj4gY3NzX3BhcnNlcl87CiAKQEAgLTE1MCw2ICsxNTYsMTAgQEAKICAgLy8gRmV0Y2hlckZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGZldGNoZXIgYWNjb3JkaW5nIHRvIFVSTC4KICAgc2NvcGVkX3B0cjxsb2FkZXI6OkZldGNoZXJGYWN0b3J5PiBmZXRjaGVyX2ZhY3RvcnlfOwogCisgIC8vIExvYWRlckZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIGFjcXVpcmUgcmVmZXJlbmNlcyB0byByZXNvdXJjZXMgZnJvbSBhCisgIC8vIFVSTC4KKyAgc2NvcGVkX3B0cjxsb2FkZXI6OkxvYWRlckZhY3Rvcnk+IGxvYWRlcl9mYWN0b3J5XzsKKwogICAvLyBJbWFnZUNhY2hlIHRoYXQgaXMgdXNlZCB0byBtYW5hZ2UgaW1hZ2UgY2FjaGUgbG9naWMuCiAgIHNjb3BlZF9wdHI8bG9hZGVyOjppbWFnZTo6SW1hZ2VDYWNoZT4gaW1hZ2VfY2FjaGVfOwogCkBAIC0yMTEsNyArMjIxLDYgQEAKICAgLy8gQWxsb3dzIHRoZSBkZWJ1Z2dlciB0byBhZGQgcmVuZGVyIGNvbXBvbmVudHMgdG8gdGhlIHdlYiBtb2R1bGUuCiAgIC8vIFVzZWQgZm9yIERPTSBub2RlIGhpZ2hsaWdodGluZyBhbmQgb3ZlcmxheSBtZXNzYWdlcy4KICAgc2NvcGVkX3B0cjxkZWJ1Zzo6UmVuZGVyT3ZlcmxheT4gZGVidWdfb3ZlcmxheV87Ci0gIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcl87CiAKICAgLy8gVGhlIGNvcmUgb2YgdGhlIGRlYnVnZ2luZyBzeXN0ZW0sIGRlc2NyaWJlZCBoZXJlOgogICAvLyBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFsWmhyQlR1c1FaSnNhY3B0MjFKM2tQZ25rajdweVFPYmhGcVlrdHZtNDBZCkBAIC0yNDksNiArMjU4LDggQEAKIAogV2ViTW9kdWxlOjpJbXBsOjpJbXBsKGNvbnN0IENvbnN0cnVjdGlvbkRhdGEmIGRhdGEpCiAgICAgOiBuYW1lXyhkYXRhLm9wdGlvbnMubmFtZSksIGlzX3J1bm5pbmdfKGZhbHNlKSB7CisgIHJlc291cmNlX3Byb3ZpZGVyXyA9IGRhdGEucmVzb3VyY2VfcHJvdmlkZXI7CisKICAgY3NzX3BhcnNlcl8gPSBjc3NfcGFyc2VyOjpQYXJzZXI6OkNyZWF0ZSgpOwogICBEQ0hFQ0soY3NzX3BhcnNlcl8pOwogCkBAIC0yNjEsMTEgKzI3MiwxNCBAQAogICAgICAgZGF0YS5uZXR3b3JrX21vZHVsZSwgZGF0YS5vcHRpb25zLmV4dHJhX3dlYl9maWxlX2RpcikpOwogICBEQ0hFQ0soZmV0Y2hlcl9mYWN0b3J5Xyk7CiAKKyAgbG9hZGVyX2ZhY3RvcnlfLnJlc2V0KAorICAgICAgbmV3IGxvYWRlcjo6TG9hZGVyRmFjdG9yeShmZXRjaGVyX2ZhY3RvcnlfLmdldCgpLCByZXNvdXJjZV9wcm92aWRlcl8pKTsKKwogICBEQ0hFQ0tfTEUoMCwgZGF0YS5vcHRpb25zLmltYWdlX2NhY2hlX2NhcGFjaXR5KTsKICAgaW1hZ2VfY2FjaGVfID0gbG9hZGVyOjppbWFnZTo6Q3JlYXRlSW1hZ2VDYWNoZSgKICAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigiTWVtb3J5LiVzLkltYWdlQ2FjaGUiLCBuYW1lXy5jX3N0cigpKSwKICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMj4oZGF0YS5vcHRpb25zLmltYWdlX2NhY2hlX2NhcGFjaXR5KSwKLSAgICAgIGRhdGEucmVzb3VyY2VfcHJvdmlkZXIsIGZldGNoZXJfZmFjdG9yeV8uZ2V0KCkpOworICAgICAgbG9hZGVyX2ZhY3RvcnlfLmdldCgpKTsKICAgRENIRUNLKGltYWdlX2NhY2hlXyk7CiAKICAgcmVkdWNlZF9pbWFnZV9jYWNoZV9jYXBhY2l0eV9tYW5hZ2VyXy5yZXNldCgKQEAgLTI3Nyw3ICsyOTEsNyBAQAogICByZW1vdGVfdHlwZWZhY2VfY2FjaGVfID0gbG9hZGVyOjpmb250OjpDcmVhdGVSZW1vdGVUeXBlZmFjZUNhY2hlKAogICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCJNZW1vcnkuJXMuUmVtb3RlVHlwZWZhY2VDYWNoZSIsIG5hbWVfLmNfc3RyKCkpLAogICAgICAgc3RhdGljX2Nhc3Q8dWludDMyPihkYXRhLm9wdGlvbnMucmVtb3RlX3R5cGVmYWNlX2NhY2hlX2NhcGFjaXR5KSwKLSAgICAgIGRhdGEucmVzb3VyY2VfcHJvdmlkZXIsIGZldGNoZXJfZmFjdG9yeV8uZ2V0KCkpOworICAgICAgbG9hZGVyX2ZhY3RvcnlfLmdldCgpKTsKICAgRENIRUNLKHJlbW90ZV90eXBlZmFjZV9jYWNoZV8pOwogCiAgIGxvY2FsX3N0b3JhZ2VfZGF0YWJhc2VfLnJlc2V0KApAQCAtMzA3LDcgKzMyMSw3IEBACiAgIHdpbmRvd18gPSBuZXcgZG9tOjpXaW5kb3coCiAgICAgICBkYXRhLndpbmRvd19kaW1lbnNpb25zLndpZHRoKCksIGRhdGEud2luZG93X2RpbWVuc2lvbnMuaGVpZ2h0KCksCiAgICAgICBjc3NfcGFyc2VyXy5nZXQoKSwgZG9tX3BhcnNlcl8uZ2V0KCksIGZldGNoZXJfZmFjdG9yeV8uZ2V0KCksCi0gICAgICBkYXRhLnJlc291cmNlX3Byb3ZpZGVyLCBpbWFnZV9jYWNoZV8uZ2V0KCksCisgICAgICAmcmVzb3VyY2VfcHJvdmlkZXJfLCBpbWFnZV9jYWNoZV8uZ2V0KCksCiAgICAgICByZWR1Y2VkX2ltYWdlX2NhY2hlX2NhcGFjaXR5X21hbmFnZXJfLmdldCgpLCByZW1vdGVfdHlwZWZhY2VfY2FjaGVfLmdldCgpLAogICAgICAgbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV8uZ2V0KCksIGRhdGEubWVkaWFfbW9kdWxlLCBkYXRhLm1lZGlhX21vZHVsZSwKICAgICAgIGV4ZWN1dGlvbl9zdGF0ZV8uZ2V0KCksIHNjcmlwdF9ydW5uZXJfLmdldCgpLApAQCAtMzQ4LDEwICszNjIsMTEgQEAKICAgICAgIHdlYl9tb2R1bGVfc3RhdF90cmFja2VyXy0+bGF5b3V0X3N0YXRfdHJhY2tlcigpKSk7CiAgIERDSEVDSyhsYXlvdXRfbWFuYWdlcl8pOwogCisgIHJlc291cmNlX3Byb3ZpZGVyXyA9IGRhdGEucmVzb3VyY2VfcHJvdmlkZXI7CisKICNpZiBkZWZpbmVkKEVOQUJMRV9ERUJVR19DT05TT0xFKQogICBkZWJ1Z19vdmVybGF5Xy5yZXNldCgKICAgICAgIG5ldyBkZWJ1Zzo6UmVuZGVyT3ZlcmxheShkYXRhLnJlbmRlcl90cmVlX3Byb2R1Y2VkX2NhbGxiYWNrKSk7Ci0gIHJlc291cmNlX3Byb3ZpZGVyXyA9IGRhdGEucmVzb3VyY2VfcHJvdmlkZXI7CiAjZW5kaWYgIC8vIEVOQUJMRV9ERUJVR19DT05TT0xFCiAKICNpZiAhZGVmaW5lZChDT0JBTFRfRk9SQ0VfQ1NQKQpAQCAtNTM0LDYgKzU0OSw0NCBAQAogICB9CiB9CiAKK3ZvaWQgV2ViTW9kdWxlOjpJbXBsOjpTdXNwZW5kKCkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6YnJvd3NlciIsICJXZWJNb2R1bGU6OkltcGw6OlN1c3BlbmQoKSIpOworICBEQ0hFQ0socmVzb3VyY2VfcHJvdmlkZXJfKTsKKworICAvLyBTdG9wIHRoZSBnZW5lcmF0aW9uIG9mIHJlbmRlciB0cmVlcy4KKyAgbGF5b3V0X21hbmFnZXJfLT5TdXNwZW5kKCk7CisKKyAgLy8gQ2xlYXIgb3V0IGFsbCBpbWFnZSByZXNvdXJjZXMgZnJvbSB0aGUgaW1hZ2UgY2FjaGUuCisgIGltYWdlX2NhY2hlXy0+UHVyZ2UoKTsKKworI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTlNPTEUpCisgIC8vIFRoZSBkZWJ1ZyBvdmVybGF5IG1heSBiZSBob2xkaW5nIG9udG8gYSByZW5kZXIgdHJlZSwgY2xlYXIgdGhhdCBvdXQuCisgIGRlYnVnX292ZXJsYXlfLT5DbGVhcklucHV0KCk7CisjZW5kaWYKKworICAvLyBDbGVhciBvdXQgdGhlIGxvYWRlciBmYWN0b3J5J3MgcmVzb3VyY2UgcHJvdmlkZXIsIHBvc3NpYmx5IGFib3J0aW5nIGFueQorICAvLyBpbi1wcm9ncmVzcyBsb2Fkcy4KKyAgbG9hZGVyX2ZhY3RvcnlfLT5TdXNwZW5kKCk7CisKKyAgLy8gRmluYWxseSBtYXJrIHRoYXQgd2UgaGF2ZSBubyByZXNvdXJjZSBwcm92aWRlci4KKyAgcmVzb3VyY2VfcHJvdmlkZXJfID0gTlVMTDsKK30KKwordm9pZCBXZWJNb2R1bGU6OkltcGw6OlJlc3VtZShyZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmJyb3dzZXIiLCAiV2ViTW9kdWxlOjpJbXBsOjpSZXN1bWUoKSIpOworICBEQ0hFQ0socmVzb3VyY2VfcHJvdmlkZXIpOworICBEQ0hFQ0soIXJlc291cmNlX3Byb3ZpZGVyXyk7CisKKyAgcmVzb3VyY2VfcHJvdmlkZXJfID0gcmVzb3VyY2VfcHJvdmlkZXI7CisKKyAgbG9hZGVyX2ZhY3RvcnlfLT5SZXN1bWUocmVzb3VyY2VfcHJvdmlkZXJfKTsKKworICAvLyBQZXJtaXQgcmVuZGVyIHRyZWVzIHRvIGJlIGdlbmVyYXRlZCBhZ2Fpbi4gIExheW91dCB3aWxsIGhhdmUgYmVlbgorICAvLyBpbnZhbGlkYXRlZCB3aXRoIHRoZSBjYWxsIHRvIFN1c3BlbmQoKSwgc28gdGhlIGxheW91dCBtYW5hZ2VyJ3MgZmlyc3QgdGFzaworICAvLyB3aWxsIGJlIHRvIHBlcmZvcm0gYSBmdWxsIHJlLWxheW91dC4KKyAgbGF5b3V0X21hbmFnZXJfLT5SZXN1bWUoKTsKK30KKwogV2ViTW9kdWxlOjpEZXN0cnVjdGlvbk9ic2VydmVyOjpEZXN0cnVjdGlvbk9ic2VydmVyKFdlYk1vZHVsZSogd2ViX21vZHVsZSkKICAgICA6IHdlYl9tb2R1bGVfKHdlYl9tb2R1bGUpIHt9CiAKQEAgLTczNiw1ICs3ODksMjQgQEAKIH0KICNlbmRpZiAgLy8gZGVmaW5lZChFTkFCTEVfREVCVUdfQ09OU09MRSkKIAordm9pZCBXZWJNb2R1bGU6OlN1c3BlbmQoKSB7CisgIG1lc3NhZ2VfbG9vcCgpLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmQoJldlYk1vZHVsZTo6SW1wbDo6U3VzcGVuZCwgYmFzZTo6VW5yZXRhaW5lZChpbXBsXy5nZXQoKSkpKTsKKworICBiYXNlOjpXYWl0YWJsZUV2ZW50IHJlc291cmNlX3Byb3ZpZGVyX3JlbGVhc2VkKHRydWUsIGZhbHNlKTsKKyAgbWVzc2FnZV9sb29wKCktPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZiYXNlOjpXYWl0YWJsZUV2ZW50OjpTaWduYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmcmVzb3VyY2VfcHJvdmlkZXJfcmVsZWFzZWQpKSk7CisKKyAgcmVzb3VyY2VfcHJvdmlkZXJfcmVsZWFzZWQuV2FpdCgpOworfQorCit2b2lkIFdlYk1vZHVsZTo6UmVzdW1lKHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcikgeworICBtZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soCisgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJldlYk1vZHVsZTo6SW1wbDo6UmVzdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoaW1wbF8uZ2V0KCkpLCByZXNvdXJjZV9wcm92aWRlcikpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYnJvd3NlcgogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmgKaW5kZXggNTU3MDZlNy4uNDk4N2ViZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuaAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5oCkBAIC0xODIsNiArMTgyLDE0IEBACiAgIGRlYnVnOjpEZWJ1Z1NlcnZlciogR2V0RGVidWdTZXJ2ZXIoKTsKICNlbmRpZiAgLy8gRU5BQkxFX0RFQlVHX0NPTlNPTEUKIAorICAvLyBTdXNwZW5kcyB0aGUgV2ViTW9kdWxlIGZyb20gY3JlYXRpbmcgbmV3IHJlbmRlciB0cmVlcywgYW5kIHJlbGVhc2VzIHRoaXMKKyAgLy8gd2ViIG1vZHVsZSdzIHJlZmVyZW5jZSB0byB0aGUgcmVzb3VyY2UgcHJvdmlkZXIsIGNsZWFyaW5nIGl0IG91dCBhbmQKKyAgLy8gcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIGFueSByZXNvdXJjZXMgY3JlYXRlZCBmcm9tIGl0LgorICB2b2lkIFN1c3BlbmQoKTsKKyAgLy8gUmVzdW1lcyB0aGUgV2ViTW9kdWxlLCBwb3NzaWJseSB3aXRoIGEgbmV3IHJlc291cmNlIHByb3ZpZGVyLiAgVGhpcyBtZXRob2QKKyAgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIGlmIHdlIGhhdmUgcHJldmlvdXNseSBzdXNwZW5kZWQgdGhlIFdlYk1vZHVsZS4KKyAgdm9pZCBSZXN1bWUocmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKTsKKwogI2lmIGRlZmluZWQoQ09CQUxUX0JVSUxEX1RZUEVfREVCVUcpCiAgIC8vIE5vbi1vcHRpbWl6ZWQgYnVpbGRzIHJlcXVpcmUgYSBiaWdnZXIgc3RhY2sgc2l6ZS4KICAgc3RhdGljIGNvbnN0IHNpemVfdCBrQmFzZVN0YWNrU2l6ZSA9IDIgKiAxMDI0ICogMTAyNDsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnVpbGQvYnVpbGQuaWQgYi9zcmMvY29iYWx0L2J1aWxkL2J1aWxkLmlkCmluZGV4IGUzZjI4YzcuLjY2OTc0YjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnVpbGQvYnVpbGQuaWQKKysrIGIvc3JjL2NvYmFsdC9idWlsZC9idWlsZC5pZApAQCAtMSArMSBAQAotMTIwOTYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisxMjM0NwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9ncmFtbWFyLmggYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvZ3JhbW1hci5oCmluZGV4IDcxNjhjYjEuLjY4NDIxMDUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9ncmFtbWFyLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2dyYW1tYXIuaApAQCAtNTUsNiArNTUsOCBAQAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfZGVjbGFyYXRpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3NoZWV0LmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9maWx0ZXJfZnVuY3Rpb25fbGlzdF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9pbnRlZ2VyX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbGVuZ3RoX3ZhbHVlLmgiCkBAIC02NCw2ICs2Niw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfa2V5d29yZF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tZWRpYV9saXN0LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX3F1ZXJ5LmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL210bV9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9udW1iZXJfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vcGVyY2VudGFnZV92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wcm9wZXJ0eV9rZXlfbGlzdF92YWx1ZS5oIgpAQCAtNzgsNiArODEsOCBAQAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS90cmFuc2Zvcm1fZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdHJhbnNmb3JtX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdXJsX3NyY192YWx1ZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2dsbS9nbG0vZ3RjL3R5cGVfcHRyLmhwcCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nbG0vZ2xtL21hdDR4NC5ocHAiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGNzc19wYXJzZXIgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2dyYW1tYXIueSBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9ncmFtbWFyLnkKaW5kZXggMzRhNzE0My4uYTFiNjJmNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2dyYW1tYXIueQorKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvZ3JhbW1hci55CkBAIC0xMTQsNiArMTE0LDcgQEAKICV0b2tlbiBrQ29sb3JUb2tlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvcgogJXRva2VuIGtDb250ZW50VG9rZW4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQKICV0b2tlbiBrRGlzcGxheVRva2VuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5CisldG9rZW4ga0ZpbHRlclRva2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyCiAldG9rZW4ga0ZvbnRUb2tlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9udAogJXRva2VuIGtGb250RmFtaWx5VG9rZW4gICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbnQtZmFtaWx5CiAldG9rZW4ga0ZvbnRTaXplVG9rZW4gICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9udC1zaXplCkBAIC0zNTMsNiArMzU0LDcgQEAKICV0b2tlbiBrTGluZWFyR3JhZGllbnRGdW5jdGlvblRva2VuICAgICAvLyBsaW5lYXItZ3JhZGllbnQoCiAldG9rZW4ga0xvY2FsRnVuY3Rpb25Ub2tlbiAgICAgICAgICAgICAgLy8gbG9jYWwoCiAldG9rZW4ga01hdHJpeEZ1bmN0aW9uVG9rZW4gICAgICAgICAgICAgLy8gbWF0cml4KAorJXRva2VuIGtNYXRyaXgzZEZ1bmN0aW9uVG9rZW4gICAgICAgICAgIC8vIG1hdHJpeDNkKAogJXRva2VuIGtOb3RGdW5jdGlvblRva2VuICAgICAgICAgICAgICAgIC8vIG5vdCgKICV0b2tlbiBrTnRoQ2hpbGRGdW5jdGlvblRva2VuICAgICAgICAgICAvLyBudGgtY2hpbGQoCiAldG9rZW4ga050aExhc3RDaGlsZEZ1bmN0aW9uVG9rZW4gICAgICAgLy8gbnRoLWxhc3QtY2hpbGQoCkBAIC0zNzAsNiArMzcyLDcgQEAKICV0b2tlbiBrUmFkaWFsR3JhZGllbnRGdW5jdGlvblRva2VuICAgICAvLyByYWRpYWwtZ3JhZGllbnQoCiAldG9rZW4ga1JHQkZ1bmN0aW9uVG9rZW4gICAgICAgICAgICAgICAgLy8gcmdiKAogJXRva2VuIGtSR0JBRnVuY3Rpb25Ub2tlbiAgICAgICAgICAgICAgIC8vIHJnYmEoCisldG9rZW4ga0NvYmFsdE10bUZ1bmN0aW9uVG9rZW4gICAgICAgICAgLy8gLWNvYmFsdC1tdG0oCiAKIC8vIFRva2VucyB3aXRoIGEgc3RyaW5nIHZhbHVlLgogJXRva2VuIDxzdHJpbmc+IGtTdHJpbmdUb2tlbiAgICAgICAgICAgIC8vICIuLi4iLCAnLi4uJwpAQCAtNTgyLDggKzU4NSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZV9zcGFjZV9wcm9wZXJ0eV92YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aF9wcm9wZXJ0eV92YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICB6X2luZGV4X3Byb3BlcnR5X3ZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9wcm9wZXJ0eV92YWx1ZQogJWRlc3RydWN0b3IgeyBTYWZlUmVsZWFzZSgkJCk7IH0gPHByb3BlcnR5X3ZhbHVlPgogCisldW5pb24geyBzdGQ6OnZlY3RvcjxmbG9hdD4qIG51bWJlcl9tYXRyaXg7IH0KKyV0eXBlIDxudW1iZXJfbWF0cml4PiBudW1iZXJfbWF0cml4CislZGVzdHJ1Y3RvciB7IGRlbGV0ZSAkJDsgfSA8bnVtYmVyX21hdHJpeD4KKworJXVuaW9uIHsgZ2xtOjptYXQ0KiBtYXRyaXg0eDQ7IH0KKyV0eXBlIDxtYXRyaXg0eDQ+IGNvYmFsdF9tdG1fdHJhbnNmb3JtX2Z1bmN0aW9uCislZGVzdHJ1Y3RvciB7IGRlbGV0ZSAkJDsgfSA8bWF0cml4NHg0PgorCiAldW5pb24geyBNYXJnaW5PclBhZGRpbmdTaG9ydGhhbmQqIG1hcmdpbl9vcl9wYWRkaW5nX3Nob3J0aGFuZDsgfQogJXR5cGUgPG1hcmdpbl9vcl9wYWRkaW5nX3Nob3J0aGFuZD4gbWFyZ2luX3Byb3BlcnR5X3ZhbHVlIHBhZGRpbmdfcHJvcGVydHlfdmFsdWUKICVkZXN0cnVjdG9yIHsgZGVsZXRlICQkOyB9IDxtYXJnaW5fb3JfcGFkZGluZ19zaG9ydGhhbmQ+CkBAIC03NjMsNiArNzc1LDI0IEBACiAldHlwZSA8dHJhbnNmb3JtX2Z1bmN0aW9ucz4gdHJhbnNmb3JtX2xpc3QKICVkZXN0cnVjdG9yIHsgZGVsZXRlICQkOyB9IDx0cmFuc2Zvcm1fZnVuY3Rpb25zPgogCisldW5pb24geyBjc3NvbTo6RmlsdGVyRnVuY3Rpb24qIGZpbHRlcl9mdW5jdGlvbjsgfQorJXR5cGUgPGZpbHRlcl9mdW5jdGlvbj4gY29iYWx0X210bV9maWx0ZXJfZnVuY3Rpb24KKyV0eXBlIDxmaWx0ZXJfZnVuY3Rpb24+IGZpbHRlcl9mdW5jdGlvbgorJWRlc3RydWN0b3IgeyBkZWxldGUgJCQ7IH0gPGZpbHRlcl9mdW5jdGlvbj4KKworJXVuaW9uIHsgY3Nzb206OkZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlOjpCdWlsZGVyKiBjb2JhbHRfbXRtX2ZpbHRlcl9mdW5jdGlvbnM7IH0KKyV0eXBlIDxjb2JhbHRfbXRtX2ZpbHRlcl9mdW5jdGlvbnM+IGZpbHRlcl9mdW5jdGlvbl9saXN0CislZGVzdHJ1Y3RvciB7IGRlbGV0ZSAkJDsgfSA8Y29iYWx0X210bV9maWx0ZXJfZnVuY3Rpb25zPgorCisldW5pb24geworICBjc3NvbTo6TVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyKiBjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXM7IH0KKyV0eXBlIDxjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXM+IGNvYmFsdF9tdG1fcmVzb2x1dGlvbl9tYXRjaGVkX21lc2hfbGlzdAorJWRlc3RydWN0b3IgeyBkZWxldGUgJCQ7IH0gPGNvYmFsdF9tdG1fcmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlcz4KKworJXVuaW9uIHsgY3Nzb206Ok1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2gqIGNvYmFsdF9tdG1fcmVzb2x1dGlvbl9tYXRjaGVkX21lc2g7IH0KKyV0eXBlIDxjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoPiBjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoCislZGVzdHJ1Y3RvciB7IGRlbGV0ZSAkJDsgfSA8Y29iYWx0X210bV9yZXNvbHV0aW9uX21hdGNoZWRfbWVzaD4KKwogJXVuaW9uIHsgY3Nzb206OlRpbWVMaXN0VmFsdWU6OkJ1aWxkZXIqIHRpbWVfbGlzdDsgfQogJXR5cGUgPHRpbWVfbGlzdD4gY29tbWFfc2VwYXJhdGVkX3RpbWVfbGlzdAogJWRlc3RydWN0b3IgeyBkZWxldGUgJCQ7IH0gPHRpbWVfbGlzdD4KQEAgLTEzNzEsNiArMTQwMSwxMCBAQAogICAgICQkID0gVHJpdmlhbFN0cmluZ1BpZWNlOjpGcm9tQ1N0cmluZygKICAgICAgICAgICAgIGNzc29tOjpHZXRQcm9wZXJ0eU5hbWUoY3Nzb206OmtEaXNwbGF5UHJvcGVydHkpKTsKICAgfQorICB8IGtGaWx0ZXJUb2tlbiB7CisgICAgJCQgPSBUcml2aWFsU3RyaW5nUGllY2U6OkZyb21DU3RyaW5nKAorICAgICAgICAgICAgY3Nzb206OkdldFByb3BlcnR5TmFtZShjc3NvbTo6a0ZpbHRlclByb3BlcnR5KSk7CisgIH0KICAgfCBrRm9udFRva2VuIHsKICAgICAkJCA9IFRyaXZpYWxTdHJpbmdQaWVjZTo6RnJvbUNTdHJpbmcoCiAgICAgICAgICAgICBjc3NvbTo6R2V0UHJvcGVydHlOYW1lKGNzc29tOjprRm9udFByb3BlcnR5KSk7CkBAIC01NzYxLDYgKzU3OTUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZVNjb3BlZFJlZlB0ckFuZFJlbGVhc2UoJDQpLCAkNSkKICAgICAgICAgICAgIDogTlVMTDsKICAgfQorICB8IGtGaWx0ZXJUb2tlbiBtYXliZV93aGl0ZXNwYWNlIGNvbG9uIGZpbHRlcl9wcm9wZXJ0eV92YWx1ZQorICAgICAgbWF5YmVfaW1wb3J0YW50IHsKKyAgICAkJCA9ICQ0ID8gbmV3IFByb3BlcnR5RGVjbGFyYXRpb24oY3Nzb206OmtGaWx0ZXJQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZVNjb3BlZFJlZlB0ckFuZFJlbGVhc2UoJDQpLCAkNSkKKyAgICAgICAgICAgIDogTlVMTDsKKyAgfQogICB8IGtGb250VG9rZW4gbWF5YmVfd2hpdGVzcGFjZSBjb2xvbiBmb250X3Byb3BlcnR5X3ZhbHVlIG1heWJlX2ltcG9ydGFudCB7CiAgICAgc2NvcGVkX3B0cjxGb250U2hvcnRoYW5kPiBmb250KCQ0KTsKICAgICBEQ0hFQ0soZm9udCk7CkBAIC02NDA2LDMgKzY0NDYsOTkgQEAKICAgICB9CiAgIH0KICAgOworCisvLyBGaWx0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIG9iamVjdCdzIHJlbmRlcmluZy4KKy8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2ZpbHRlci1lZmZlY3RzLTEvI0ZpbHRlclByb3BlcnR5CitmaWx0ZXJfcHJvcGVydHlfdmFsdWU6CisgICAga05vbmVUb2tlbiBtYXliZV93aGl0ZXNwYWNlIHsKKyAgICAkJCA9IEFkZFJlZihjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXROb25lKCkuZ2V0KCkpOworICB9CisgIHwgZmlsdGVyX2Z1bmN0aW9uX2xpc3QgeworICAgIHNjb3BlZF9wdHI8Y3Nzb206OkZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlOjpCdWlsZGVyPiBwcm9wZXJ0eV92YWx1ZSgkMSk7CisgICAgJCQgPSBBZGRSZWYobmV3IGNzc29tOjpGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZShwcm9wZXJ0eV92YWx1ZS0+UGFzcygpKSk7CisgIH0KKyAgfCBjb21tb25fdmFsdWVzCisgIDsKKworZmlsdGVyX2Z1bmN0aW9uX2xpc3Q6CisgIC8vIFRPRE86IFBhcnNlIGxpc3Qgb2YgZmlsdGVyX2Z1bmN0aW9uJ3MuIFRoaXMgb25seSBwYXJzZXMgb25lLWVsZW1lbnQgbGlzdHMuCisgICAgZmlsdGVyX2Z1bmN0aW9uIHsKKyAgICAkJCA9IG5ldyBjc3NvbTo6RmlsdGVyRnVuY3Rpb25MaXN0VmFsdWU6OkJ1aWxkZXIoKTsKKyAgICAkJC0+cHVzaF9iYWNrKCQxKTsKKyAgfQorICA7CisKKy8vIFRoZSBzZXQgb2YgYWxsb3dlZCBmaWx0ZXIgZnVuY3Rpb25zLgorLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvZmlsdGVyLWVmZmVjdHMtMS8KK2ZpbHRlcl9mdW5jdGlvbjoKKyAgICBjb2JhbHRfbXRtX2ZpbHRlcl9mdW5jdGlvbiB7CisgICAgJCQgPSAkMTsKKyAgfQorICA7CisKK2NvYmFsdF9tdG1fZmlsdGVyX2Z1bmN0aW9uOgorICAvLyBFbmNvZGVzIGFuIG10bSBmaWx0ZXIuIEN1cnJlbnRseSB0aGUgb25seSB0eXBlIG9mIGZpbHRlciBmdW5jdGlvbiBzdXBwb3J0ZWQuCisgICAga0NvYmFsdE10bUZ1bmN0aW9uVG9rZW4gbWF5YmVfd2hpdGVzcGFjZSB1cmwKKyAgICAgICAgY29iYWx0X210bV9yZXNvbHV0aW9uX21hdGNoZWRfbWVzaF9saXN0IGNvbW1hIGFuZ2xlIGFuZ2xlIGNvbW1hCisgICAgICAgIGNvYmFsdF9tdG1fdHJhbnNmb3JtX2Z1bmN0aW9uICcpJyBtYXliZV93aGl0ZXNwYWNlIHsKKyAgICBzY29wZWRfcHRyPGNzc29tOjpNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXI+CisgICAgICAgIHJlc29sdXRpb25fbWF0Y2hlZF9tZXNoX3VybHMoJDQpOworICAgIHNjb3BlZF9wdHI8Z2xtOjptYXQ0PiB0cmFuc2Zvcm0oJDkpOworCisgICAgJCQgPSBuZXcgY3Nzb206Ok1UTUZ1bmN0aW9uKAorICAgICAgICBNYWtlU2NvcGVkUmVmUHRyQW5kUmVsZWFzZSgkMyksCisgICAgICAgIHJlc29sdXRpb25fbWF0Y2hlZF9tZXNoX3VybHMtPlBhc3MoKSwKKyAgICAgICAgJDYsCisgICAgICAgICQ3LAorICAgICAgICAqdHJhbnNmb3JtKTsKKyAgfQorICA7CisKK2NvYmFsdF9tdG1fcmVzb2x1dGlvbl9tYXRjaGVkX21lc2hfbGlzdDoKKyAgICAvKiBlbXB0eSAqLyB7CisgICAgJCQgPSBuZXcgY3Nzb206Ok1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpOworICB9CisgIC8vIFNwZWNpZmllcyBhIGRpZmZlcmVudCBtZXNoIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UgcmVzb2x1dGlvbi4KKyAgfCBjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoX2xpc3QgY29iYWx0X210bV9yZXNvbHV0aW9uX21hdGNoZWRfbWVzaCB7CisgICAgJCQgPSAkMTsKKyAgICAkJC0+cHVzaF9iYWNrKCQyKTsKKyAgfQorICA7CisKK2NvYmFsdF9tdG1fcmVzb2x1dGlvbl9tYXRjaGVkX21lc2g6CisgICAgbm9uX25lZ2F0aXZlX2ludGVnZXIgbm9uX25lZ2F0aXZlX2ludGVnZXIgdXJsIHsKKyAgICAkJCA9IG5ldyBjc3NvbTo6TVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaCgkMSwgJDIsCisgICAgICBNYWtlU2NvcGVkUmVmUHRyQW5kUmVsZWFzZSgkMykpOworICB9CisgIDsKKworLy8gVGhlIHNldCBvZiB0cmFuc2Zvcm0gZnVuY3Rpb25zIGFsbG93ZWQgaW4gTVRNIGZpbHRlcnMsIGN1cnJlbnRseSBhIHNlcGFyYXRlCisvLyBwcm9kdWN0aW9uIGhpZXJhcmNoeSBmcm9tIHRoZSBtYWluIDx0cmFuc2Zvcm1fZnVuY3Rpb24+IGFuZCByZXByZXNlbnRlZCBhcyBhCisvLyBnbG06Om1hdDQuCisvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdHJhbnNmb3Jtcy0xLyN0aHJlZS1kLXRyYW5zZm9ybS1mdW5jdGlvbnMKK2NvYmFsdF9tdG1fdHJhbnNmb3JtX2Z1bmN0aW9uOgorICAvLyBTcGVjaWZpZXMgYW4gYXJiaXRyYXJ5IGFmZmluZSAzRCB0cmFuc2Zvcm1hdGlvbiwgY3VycmVudGx5IHRoZSBvbmx5CisgIC8vIHN1cHBvcnRlZCB0cmFuc2Zvcm0gaW4gTVRNLgorICAgIGtNYXRyaXgzZEZ1bmN0aW9uVG9rZW4gbWF5YmVfd2hpdGVzcGFjZSBudW1iZXJfbWF0cml4ICcpJyBtYXliZV93aGl0ZXNwYWNlIHsKKyAgICBzY29wZWRfcHRyPHN0ZDo6dmVjdG9yPGZsb2F0PiA+IG1hdHJpeCgkMyk7CisgICAgaWYgKG1hdHJpeCA9PSBOVUxMIHx8IG1hdHJpeC0+c2l6ZSgpICE9ICAxNikgeworICAgICAgcGFyc2VyX2ltcGwtPkxvZ0Vycm9yKAorICAgICAgICAgIEAzLAorICAgICAgICAgICJtYXRyaXgzZCBmdW5jdGlvbiBleHBlY3RzIDE2IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXMgYXJndW1lbnRzIik7CisgICAgICBZWUVSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAvLyBHTE0gYW5kIHRoZSBXMyBzcGVjIGJvdGggdXNlIGNvbHVtbi1tYWpvciBvcmRlci4KKyAgICAgICQkID0gbmV3IGdsbTo6bWF0NChnbG06Om1ha2VfbWF0NCgmKCptYXRyaXgpWzBdKSk7CisgICAgfQorICB9CisgIDsKKworbnVtYmVyX21hdHJpeDoKKyAgICBudW1iZXIgeworICAgICQkID0gbmV3IHN0ZDo6dmVjdG9yPGZsb2F0PigxLCAkMSk7CisgIH0KKyAgfCBudW1iZXJfbWF0cml4IGNvbW1hIG51bWJlciB7CisgICAgJCQgPSAkMTsKKyAgICAkJC0+cHVzaF9iYWNrKCQzKTsKKyAgfQorICA7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcGFyc2VyLmNjIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3BhcnNlci5jYwppbmRleCBkMjg5ZTNjLi5jM2ZmODFhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcGFyc2VyLmNjCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9wYXJzZXIuY2MKQEAgLTY2LDYgKzY2LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWF0cml4X2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX2xpc3QuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWVkaWFfcXVlcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbXRtX2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL25leHRfc2libGluZ19jb21iaW5hdG9yLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL25vdF9wc2V1ZG9fY2xhc3MuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbnVtYmVyX3ZhbHVlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcGFyc2VyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcGFyc2VyX3Rlc3QuY2MKaW5kZXggMGFhZjQyMS4uODVmZTdjNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3BhcnNlcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9wYXJzZXJfdGVzdC5jYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfc2hlZXQuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZGVzY2VuZGFudF9jb21iaW5hdG9yLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2VtcHR5X3BzZXVkb19jbGFzcy5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9maWx0ZXJfZnVuY3Rpb25fbGlzdF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9mb2N1c19wc2V1ZG9fY2xhc3MuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZm9sbG93aW5nX3NpYmxpbmdfY29tYmluYXRvci5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9mb250X3N0eWxlX3ZhbHVlLmgiCkBAIC01Miw2ICs1Myw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21hdHJpeF9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tZWRpYV9saXN0LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX3F1ZXJ5LmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL210bV9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9uZXh0X3NpYmxpbmdfY29tYmluYXRvci5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9ub3RfcHNldWRvX2NsYXNzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL251bWJlcl92YWx1ZS5oIgpAQCAtODI2Miw1ICs4MjY0LDExOCBAQAogICBFWFBFQ1RfVFJVRShtZWRpYV9saXN0LT5FdmFsdWF0ZUNvbmRpdGlvblZhbHVlKHNpemUpKTsKIH0KIAorVEVTVF9GKFBhcnNlclRlc3QsIFBhcnNlc05vbmVGaWx0ZXIpIHsKKyAgc2NvcGVkX3JlZnB0cjxjc3NvbTo6Q1NTRGVjbGFyZWRTdHlsZURhdGE+IHN0eWxlID0KKyAgICAgIHBhcnNlcl8uUGFyc2VTdHlsZURlY2xhcmF0aW9uTGlzdCgiZmlsdGVyOiBub25lOyIsIHNvdXJjZV9sb2NhdGlvbl8pOworCisgIEVYUEVDVF9FUShjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXROb25lKCksCisgICAgICAgICAgICBzdHlsZS0+R2V0UHJvcGVydHlWYWx1ZShjc3NvbTo6a0ZpbHRlclByb3BlcnR5KSk7Cit9CisKK1RFU1RfRihQYXJzZXJUZXN0LCBQYXJzZXNGaWx0ZXJXaXRoS2V5d29yZEluaXRpYWwpIHsKKyAgc2NvcGVkX3JlZnB0cjxjc3NvbTo6Q1NTRGVjbGFyZWRTdHlsZURhdGE+IHN0eWxlID0KKyAgICAgIHBhcnNlcl8uUGFyc2VTdHlsZURlY2xhcmF0aW9uTGlzdCgiZmlsdGVyOiBpbml0aWFsOyIsIHNvdXJjZV9sb2NhdGlvbl8pOworCisgIEVYUEVDVF9FUShjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXRJbml0aWFsKCksCisgICAgICAgICAgICBzdHlsZS0+R2V0UHJvcGVydHlWYWx1ZShjc3NvbTo6a0ZpbHRlclByb3BlcnR5KSk7Cit9CisKK1RFU1RfRihQYXJzZXJUZXN0LCBQYXJzZXNGaWx0ZXJXaXRoS2V5d29yZEluaGVyaXQpIHsKKyAgc2NvcGVkX3JlZnB0cjxjc3NvbTo6Q1NTRGVjbGFyZWRTdHlsZURhdGE+IHN0eWxlID0KKyAgICAgIHBhcnNlcl8uUGFyc2VTdHlsZURlY2xhcmF0aW9uTGlzdCgiZmlsdGVyOiBpbmhlcml0OyIsIHNvdXJjZV9sb2NhdGlvbl8pOworCisgIEVYUEVDVF9FUShjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXRJbmhlcml0KCksCisgICAgICAgICAgICBzdHlsZS0+R2V0UHJvcGVydHlWYWx1ZShjc3NvbTo6a0ZpbHRlclByb3BlcnR5KSk7Cit9CisKK1RFU1RfRihQYXJzZXJUZXN0LCBQYXJzZXNNdG1TaW5nbGVVcmxGaWx0ZXIpIHsKKyAgc2NvcGVkX3JlZnB0cjxjc3NvbTo6Q1NTRGVjbGFyZWRTdHlsZURhdGE+IHN0eWxlID0KKyAgICAgIHBhcnNlcl8uUGFyc2VTdHlsZURlY2xhcmF0aW9uTGlzdCgKKyAgICAgICAgICAiZmlsdGVyOiAtY29iYWx0LW10bSh1cmwocHJvamVjdGlvbi5tc2gpLCIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgMTgwZGVnIDEuNXJhZCwiCisgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeDNkKDEsIDAsIDAsIDAsIgorICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAwLCAwLCIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSwgMCwiCisgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDEpKTsiLAorICAgICAgICAgIHNvdXJjZV9sb2NhdGlvbl8pOworICBzY29wZWRfcmVmcHRyPGNzc29tOjpGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZT4gZmlsdGVyX2xpc3QgPQorICAgICAgZHluYW1pY19jYXN0PGNzc29tOjpGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZSo+KAorICAgICAgICAgIHN0eWxlLT5HZXRQcm9wZXJ0eVZhbHVlKGNzc29tOjprRmlsdGVyUHJvcGVydHkpLmdldCgpKTsKKworICBBU1NFUlRfVFJVRShmaWx0ZXJfbGlzdCk7CisgIEFTU0VSVF9FUSgxLCBmaWx0ZXJfbGlzdC0+dmFsdWUoKS5zaXplKCkpOworCisgIGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbiogbXRtX2Z1bmN0aW9uID0KKyAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCBjc3NvbTo6TVRNRnVuY3Rpb24qPihmaWx0ZXJfbGlzdC0+dmFsdWUoKVswXSk7CisgIEFTU0VSVF9UUlVFKG10bV9mdW5jdGlvbik7CisKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGZsb2F0PihNX1BJKSwgbXRtX2Z1bmN0aW9uLT5ob3Jpem9udGFsX2ZvdigpKTsKKyAgRVhQRUNUX0VRKDEuNWYsIG10bV9mdW5jdGlvbi0+dmVydGljYWxfZm92KCkpOworfQorCitURVNUX0YoUGFyc2VyVGVzdCwgUGFyc2VzTXRtUmVzb2x1dGlvbk1hdGNoZWRVcmxzRmlsdGVyKSB7CisgIHNjb3BlZF9yZWZwdHI8Y3Nzb206OkNTU0RlY2xhcmVkU3R5bGVEYXRhPiBzdHlsZSA9CisgICAgICBwYXJzZXJfLlBhcnNlU3R5bGVEZWNsYXJhdGlvbkxpc3QoCisgICAgICAgICAgImZpbHRlcjogLWNvYmFsdC1tdG0odXJsKHByb2plY3Rpb24ubXNoKSIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgNjQwIDQ4MCB1cmwocDIubXNoKSIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgMTkyMCAxMDgwIHVybCh5ZWVoYXcubXNoKSIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgMzMgMjIgdXJsKHlvZGEubXNoKSwiCisgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgMTAwZGVnIDYwZGVnLCIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICBtYXRyaXgzZCgxLCAwLCAwLCA1LCIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCAwLCAwLCIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAwLCAzLCAwLCIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA3LCAwLCA0KSk7IiwKKyAgICAgICAgICBzb3VyY2VfbG9jYXRpb25fKTsKKworICBzY29wZWRfcmVmcHRyPGNzc29tOjpGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZT4gZmlsdGVyX2xpc3QgPQorICAgICAgZHluYW1pY19jYXN0PGNzc29tOjpGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZSo+KAorICAgICAgICAgIHN0eWxlLT5HZXRQcm9wZXJ0eVZhbHVlKGNzc29tOjprRmlsdGVyUHJvcGVydHkpLmdldCgpKTsKKworICBBU1NFUlRfVFJVRShmaWx0ZXJfbGlzdCk7CisgIGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbiogbXRtX2Z1bmN0aW9uID0KKyAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCBjc3NvbTo6TVRNRnVuY3Rpb24qPihmaWx0ZXJfbGlzdC0+dmFsdWUoKVswXSk7CisKKyAgY29uc3QgY3Nzb206Ok1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciYgbWVzaGVzID0KKyAgICAgIG10bV9mdW5jdGlvbi0+cmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlcygpOworCisgIEFTU0VSVF9FUSgzLCBtZXNoZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDY0MCwgbWVzaGVzWzBdLT53aWR0aF9tYXRjaCgpKTsKKyAgRVhQRUNUX0VRKDIyLCBtZXNoZXNbMl0tPmhlaWdodF9tYXRjaCgpKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAieWVlaGF3Lm1zaCIsCisgICAgICBkeW5hbWljX2Nhc3Q8Y3Nzb206OlVSTFZhbHVlKj4obWVzaGVzWzFdLT5tZXNoX3VybCgpLmdldCgpKS0+dmFsdWUoKSk7Cit9CisKK1RFU1RfRihQYXJzZXJUZXN0LCBQYXJzZXNNdG1UcmFuc2Zvcm1NYXRyaXhGaWx0ZXIpIHsKKyAgc2NvcGVkX3JlZnB0cjxjc3NvbTo6Q1NTRGVjbGFyZWRTdHlsZURhdGE+IHN0eWxlID0KKyAgICAgIHBhcnNlcl8uUGFyc2VTdHlsZURlY2xhcmF0aW9uTGlzdCgKKyAgICAgICAgICAiZmlsdGVyOiAtY29iYWx0LW10bSh1cmwocC5tc2gpLCIKKyAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAxMDBkZWcgNjBkZWcsIgorICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIG1hdHJpeDNkKDEsIDAsIDAsIDUsIgorICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIDAsIDAsIgorICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDAsIDMsIDAsIgorICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDcsIDAsIDQpKTsiLAorICAgICAgICAgIHNvdXJjZV9sb2NhdGlvbl8pOworCisgIHNjb3BlZF9yZWZwdHI8Y3Nzb206OkZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlPiBmaWx0ZXJfbGlzdCA9CisgICAgICBkeW5hbWljX2Nhc3Q8Y3Nzb206OkZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlKj4oCisgICAgICAgICAgc3R5bGUtPkdldFByb3BlcnR5VmFsdWUoY3Nzb206OmtGaWx0ZXJQcm9wZXJ0eSkuZ2V0KCkpOworCisgIEFTU0VSVF9UUlVFKGZpbHRlcl9saXN0KTsKKyAgY29uc3QgY3Nzb206Ok1UTUZ1bmN0aW9uKiBtdG1fZnVuY3Rpb24gPQorICAgICAgZHluYW1pY19jYXN0PGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbio+KGZpbHRlcl9saXN0LT52YWx1ZSgpWzBdKTsKKworICBjb25zdCBnbG06Om1hdDQmIGFjdHVhbCA9IG10bV9mdW5jdGlvbi0+dHJhbnNmb3JtKCk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgZ2xtOjphbGwoZ2xtOjplcXVhbChnbG06OnZlYzQoMS4wZiwgMC4wZiwgMC4wZiwgNS4wZiksIGFjdHVhbFswXSkpKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBnbG06OmFsbChnbG06OmVxdWFsKGdsbTo6dmVjNCg2LjBmLCAwLjBmLCAzLjBmLCAwLjBmKSwgYWN0dWFsWzJdKSkpOworICBFWFBFQ1RfRVEoNy4wZiwgYWN0dWFsWzNdWzFdKTsKKyAgRVhQRUNUX0VRKDIuMGYsIGFjdHVhbFsxXVsxXSk7CisgIEVYUEVDVF9FUSgwLjBmLCBhY3R1YWxbMl1bM10pOworICBFWFBFQ1RfRVEoNC4wZiwgYWN0dWFsWzNdWzNdKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGNzc19wYXJzZXIKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zY2FubmVyLmNjIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXIuY2MKaW5kZXggZmFkZmViYi4uYjI5NTM0NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXIuY2MKQEAgLTMxMiw3ICszMTIsOCBAQAogICAgIC8vIFRoZSBpbnB1dCBtdXN0IGJlIHBhcnQgb2YgYW4gaWRlbnRpZmllciBpZiAiYWN0dWFsIiBvciAiZXhwZWN0ZWQiCiAgICAgLy8gY29udGFpbnMgJy0nLiBPdGhlcndpc2UgVG9Bc2NpaUxvd2VyVW5jaGVja2VkKCdccicpIHdvdWxkIGJlIGVxdWFsCiAgICAgLy8gdG8gJy0nLgotICAgIERDSEVDSygoKmV4cGVjdGVkID49ICdhJyAmJiAqZXhwZWN0ZWQgPD0gJ3onKSB8fCAqZXhwZWN0ZWQgPT0gJy0nKTsKKyAgICBEQ0hFQ0soKCpleHBlY3RlZCA+PSAnYScgJiYgKmV4cGVjdGVkIDw9ICd6JykgfHwKKyAgICAgICAgICAgKCpleHBlY3RlZCA+PSAnMCcgJiYgKmV4cGVjdGVkIDw9ICc5JykgfHwgKmV4cGVjdGVkID09ICctJyk7CiAgICAgRENIRUNLKCpleHBlY3RlZCAhPSAnLScgfHwgSXNDc3NMZXR0ZXIoKmFjdHVhbCkpOwogICAgIGlmIChUb0FzY2lpTG93ZXJVbmNoZWNrZWQoKmFjdHVhbCsrKSAhPSAoKmV4cGVjdGVkKyspKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CkBAIC03NzIsNiArNzczLDE1IEBACiAgICAgICAvLyBDYWNoZSB0aGUgb3BlbiBicmFjZS4KICAgICAgIG9wZW5fYnJhY2VzXy5wdXNoKCcoJyk7CiAKKyAgICAgIGlmICghaGFzX2VzY2FwZSkgeworICAgICAgICBUb2tlbiBmdW5jdGlvbl90b2tlbjsKKyAgICAgICAgaWYgKERldGVjdEtub3duRnVuY3Rpb25Ub2tlbkFuZE1heWJlQ2hhbmdlUGFyc2luZ01vZGUoCisgICAgICAgICAgICAgICAgbmFtZSwgJmZ1bmN0aW9uX3Rva2VuKSkgeworICAgICAgICAgICsraW5wdXRfaXRlcmF0b3JfOworICAgICAgICAgIHJldHVybiBmdW5jdGlvbl90b2tlbjsKKyAgICAgICAgfQorICAgICAgfQorCiAgICAgICArK2lucHV0X2l0ZXJhdG9yXzsKICAgICAgIHRva2VuX3ZhbHVlLT5zdHJpbmcgPSBuYW1lOwogICAgICAgcmV0dXJuIGtJbnZhbGlkRnVuY3Rpb25Ub2tlbjsKQEAgLTEzMjYsNiArMTMzNiwxMSBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KICAgICAgIGlmIChJc0VxdWFsVG9Dc3NJZGVudGlmaWVyKAorICAgICAgICAgICAgICBuYW1lLmJlZ2luLCBjc3NvbTo6R2V0UHJvcGVydHlOYW1lKGNzc29tOjprRmlsdGVyUHJvcGVydHkpKSkgeworICAgICAgICAqcHJvcGVydHlfbmFtZV90b2tlbiA9IGtGaWx0ZXJUb2tlbjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpZiAoSXNFcXVhbFRvQ3NzSWRlbnRpZmllcigKICAgICAgICAgICAgICAgbmFtZS5iZWdpbiwgY3Nzb206OkdldFByb3BlcnR5TmFtZShjc3NvbTo6a0hlaWdodFByb3BlcnR5KSkpIHsKICAgICAgICAgKnByb3BlcnR5X25hbWVfdG9rZW4gPSBrSGVpZ2h0VG9rZW47CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMjQxNyw2ICsyNDMyLDEzIEBACiAgICAgICB9CiAgICAgICByZXR1cm4gZmFsc2U7CiAKKyAgICBjYXNlIDg6CisgICAgICBpZiAoSXNFcXVhbFRvQ3NzSWRlbnRpZmllcihuYW1lLmJlZ2luLCAibWF0cml4M2QiKSkgeworICAgICAgICAqa25vd25fZnVuY3Rpb25fdG9rZW4gPSBrTWF0cml4M2RGdW5jdGlvblRva2VuOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKwogICAgIGNhc2UgOToKICAgICAgIGlmIChJc0VxdWFsVG9Dc3NJZGVudGlmaWVyKG5hbWUuYmVnaW4sICJ0cmFuc2xhdGUiKSkgewogICAgICAgICAqa25vd25fZnVuY3Rpb25fdG9rZW4gPSBrVHJhbnNsYXRlRnVuY3Rpb25Ub2tlbjsKQEAgLTI0NTAsNiArMjQ3MiwxMCBAQAogICAgICAgICAqa25vd25fZnVuY3Rpb25fdG9rZW4gPSBrTnRoT2ZUeXBlRnVuY3Rpb25Ub2tlbjsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CisgICAgICBpZiAoSXNFcXVhbFRvQ3NzSWRlbnRpZmllcihuYW1lLmJlZ2luLCAiLWNvYmFsdC1tdG0iKSkgeworICAgICAgICAqa25vd25fZnVuY3Rpb25fdG9rZW4gPSBrQ29iYWx0TXRtRnVuY3Rpb25Ub2tlbjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBjYXNlIDEyOgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zY2FubmVyX3Rlc3QuY2MKaW5kZXggYzFhZmFiZi4uMTZiMjRmNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXJfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvc2Nhbm5lcl90ZXN0LmNjCkBAIC0xNzIsNiArMTcyLDE3IEBACiAgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7CiB9CiAKK1RFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNJbnZhbGlkRnVuY3Rpb25XaXRoTnVtYmVyKSB7CisgIFNjYW5uZXIgc2Nhbm5lcigic2FtcGxlLW1hdHJpeDRkKCkiLCAmc3RyaW5nX3Bvb2xfKTsKKworICBBU1NFUlRfRVEoa0ludmFsaWRGdW5jdGlvblRva2VuLAorICAgICAgICAgICAgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKKyAgQVNTRVJUX0VRKCJzYW1wbGUtbWF0cml4NGQiLCB0b2tlbl92YWx1ZV8uc3RyaW5nKTsKKworICBBU1NFUlRfRVEoJyknLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOworICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOworfQorCiBURVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zRnVuY3Rpb25MaWtlTWVkaWFBbmQpIHsKICAgU2Nhbm5lciBzY2FubmVyKCJAbWVkaWEgdHYgYW5kKG1vbm9jaHJvbWUpIiwgJnN0cmluZ19wb29sXyk7CiAKQEAgLTI2OSw2ICsyODAsMTUgQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAorVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc0lkZW50aWZpZXJXaXRoTnVtYmVyKSB7CisgIFNjYW5uZXIgc2Nhbm5lcigibWF0cml4M2Q1czd3c3MtNDciLCAmc3RyaW5nX3Bvb2xfKTsKKworICBBU1NFUlRfRVEoa0lkZW50aWZpZXJUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKKyAgQVNTRVJUX0VRKCJtYXRyaXgzZDVzN3dzcy00NyIsIHRva2VuX3ZhbHVlXy5zdHJpbmcpOworCisgIEFTU0VSVF9FUShrRW5kT2ZGaWxlVG9rZW4sIHl5bGV4KCZ0b2tlbl92YWx1ZV8sICZ0b2tlbl9sb2NhdGlvbl8sICZzY2FubmVyKSk7Cit9CisKIFRFU1RfRihTY2FubmVyVGVzdCwgU2NhbnNEb3QpIHsKICAgU2Nhbm5lciBzY2FubmVyKCIuIiwgJnN0cmluZ19wb29sXyk7CiAKQEAgLTQxNCw2ICs0MzQsMTcgQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAorVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc1Vua25vd25EYXNoRnVuY3Rpb25XaXRoTnVtYmVyKSB7CisgIFNjYW5uZXIgc2Nhbm5lcigiLWNvYmFsdC1tYTU1NTVnaWMoKSIsICZzdHJpbmdfcG9vbF8pOworCisgIEFTU0VSVF9FUShrSW52YWxpZEZ1bmN0aW9uVG9rZW4sCisgICAgICAgICAgICB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOworICBBU1NFUlRfRVEoIi1jb2JhbHQtbWE1NTU1Z2ljIiwgdG9rZW5fdmFsdWVfLnN0cmluZyk7CisKKyAgQVNTRVJUX0VRKCcpJywgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKKyAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKK30KKwogVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc1Vua25vd25EYXNoRnVuY3Rpb25XaXRob3V0Q2xvc2luZ0F0RW5kKSB7CiAgIFNjYW5uZXIgc2Nhbm5lcigiLWNvYmFsdC1tYWdpYygiLCAmc3RyaW5nX3Bvb2xfKTsKIApAQCAtNDI1LDYgKzQ1NiwyNiBAQAogICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOwogfQogCitURVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zS25vd25EYXNoRnVuY3Rpb24pIHsKKyAgU2Nhbm5lciBzY2FubmVyKCItY29iYWx0LW10bSgpIiwgJnN0cmluZ19wb29sXyk7CisKKyAgQVNTRVJUX0VRKGtDb2JhbHRNdG1GdW5jdGlvblRva2VuLAorICAgICAgICAgICAgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKKworICBBU1NFUlRfRVEoJyknLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOworICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOworfQorCitURVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zS25vd25EYXNoRnVuY3Rpb25XaXRob3V0Q2xvc2luZ0F0RW5kKSB7CisgIFNjYW5uZXIgc2Nhbm5lcigiLWNvYmFsdC1tdG0oIiwgJnN0cmluZ19wb29sXyk7CisKKyAgQVNTRVJUX0VRKGtDb2JhbHRNdG1GdW5jdGlvblRva2VuLAorICAgICAgICAgICAgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKKworICBBU1NFUlRfRVEoJyknLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOworICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOworfQorCiBURVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zTWludXNOUGx1c0NvbnN0YW50KSB7CiAgIFNjYW5uZXIgc2Nhbm5lcigibnRoLWNoaWxkKC1uKzIpIiwgJnN0cmluZ19wb29sXyk7CiAKQEAgLTk0Myw2ICs5OTQsMTUgQEAKICAgQVNTRVJUX0VRKGtFbmRPZkZpbGVUb2tlbiwgeXlsZXgoJnRva2VuX3ZhbHVlXywgJnRva2VuX2xvY2F0aW9uXywgJnNjYW5uZXIpKTsKIH0KIAorVEVTVF9GKFNjYW5uZXJUZXN0LCBTY2Fuc01hdHJpeDNkRnVuY3Rpb24pIHsKKyAgU2Nhbm5lciBzY2FubmVyKCJtYXRyaXgzZCgpIiwgJnN0cmluZ19wb29sXyk7CisKKyAgQVNTRVJUX0VRKGtNYXRyaXgzZEZ1bmN0aW9uVG9rZW4sCisgICAgICAgICAgICB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOworICBBU1NFUlRfRVEoJyknLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOworICBBU1NFUlRfRVEoa0VuZE9mRmlsZVRva2VuLCB5eWxleCgmdG9rZW5fdmFsdWVfLCAmdG9rZW5fbG9jYXRpb25fLCAmc2Nhbm5lcikpOworfQorCiBURVNUX0YoU2Nhbm5lclRlc3QsIFNjYW5zTnRoT2ZUeXBlRnVuY3Rpb24pIHsKICAgU2Nhbm5lciBzY2FubmVyKCJudGgtb2YtdHlwZSgpIiwgJnN0cmluZ19wb29sXyk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY29tcHV0ZWRfc3R5bGUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2NvbXB1dGVkX3N0eWxlLmNjCmluZGV4IGMyYzFhNmUuLjc1NjgxOWYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY29tcHV0ZWRfc3R5bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21wdXRlZF9zdHlsZS5jYwpAQCAtMjkxOSw2ICsyOTE5LDcgQEAKICAgICBjYXNlIGtCb3JkZXJUb3BTdHlsZVByb3BlcnR5OgogICAgIGNhc2Uga0NvbG9yUHJvcGVydHk6CiAgICAgY2FzZSBrQ29udGVudFByb3BlcnR5OgorICAgIGNhc2Uga0ZpbHRlclByb3BlcnR5OgogICAgIGNhc2Uga0ZvbnRGYW1pbHlQcm9wZXJ0eToKICAgICBjYXNlIGtGb250U3R5bGVQcm9wZXJ0eToKICAgICBjYXNlIGtPcGFjaXR5UHJvcGVydHk6CkBAIC0zMDI2LDYgKzMwMjcsNyBAQAogICAgIGNhc2Uga0JveFNoYWRvd1Byb3BlcnR5OgogICAgIGNhc2Uga0NvbnRlbnRQcm9wZXJ0eToKICAgICBjYXNlIGtEaXNwbGF5UHJvcGVydHk6CisgICAgY2FzZSBrRmlsdGVyUHJvcGVydHk6CiAgICAgY2FzZSBrRm9udEZhbWlseVByb3BlcnR5OgogICAgIGNhc2Uga0ZvbnRQcm9wZXJ0eToKICAgICBjYXNlIGtGb250U3R5bGVQcm9wZXJ0eToKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhLmNjCmluZGV4IGE1ZTJmY2QuLjM4NjZkZWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YS5jYwpAQCAtMTk1LDYgKzE5NSw3IEBACiAgICAgY2FzZSBrQ29sb3JQcm9wZXJ0eToKICAgICBjYXNlIGtDb250ZW50UHJvcGVydHk6CiAgICAgY2FzZSBrRm9udEZhbWlseVByb3BlcnR5OgorICAgIGNhc2Uga0ZpbHRlclByb3BlcnR5OgogICAgIGNhc2Uga0ZvbnRQcm9wZXJ0eToKICAgICBjYXNlIGtGb250U3R5bGVQcm9wZXJ0eToKICAgICBjYXNlIGtGb250V2VpZ2h0UHJvcGVydHk6CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhLmggYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhLmgKaW5kZXggZTMwMzg2OC4uYzJjODJjMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuaApAQCAtMzI5LDYgKzMyOSwxMyBAQAogICAgIFNldFByb3BlcnR5VmFsdWUoa0Rpc3BsYXlQcm9wZXJ0eSwgZGlzcGxheSk7CiAgIH0KIAorICBjb25zdCBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+JiBmaWx0ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFByb3BlcnR5VmFsdWVSZWZlcmVuY2Uoa0ZpbHRlclByb3BlcnR5KTsKKyAgfQorICB2b2lkIHNldF9maWx0ZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxQcm9wZXJ0eVZhbHVlPiYgZmlsdGVyKSB7CisgICAgU2V0UHJvcGVydHlWYWx1ZShrRmlsdGVyUHJvcGVydHksIGZpbHRlcik7CisgIH0KKwogICBjb25zdCBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+JiBmb250X2ZhbWlseSgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0UHJvcGVydHlWYWx1ZVJlZmVyZW5jZShrRm9udEZhbWlseVByb3BlcnR5KTsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YV90ZXN0LmNjCmluZGV4IDJmY2IxZWEuLjRhZWRlMGMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGFfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhX3Rlc3QuY2MKQEAgLTExOTEsNSArMTE5MSwyMiBAQAogICBBU1NFUlRfVFJVRShzdHlsZTItPkRvRGVjbGFyZWRQcm9wZXJ0aWVzTWF0Y2goc3R5bGUxKSk7CiB9CiAKK1RFU1QoQ1NTQ29tcHV0ZWRTdHlsZURhdGFUZXN0LCBGaWx0ZXJTZXR0ZXJzQW5kR2V0dGVyc0FyZUNvbnNpc3RlbnQpIHsKKyAgc2NvcGVkX3JlZnB0cjxDU1NDb21wdXRlZFN0eWxlRGF0YT4gc3R5bGUgPSBuZXcgQ1NTQ29tcHV0ZWRTdHlsZURhdGEoKTsKKworICBFWFBFQ1RfRVEoR2V0UHJvcGVydHlJbml0aWFsVmFsdWUoa0ZpbHRlclByb3BlcnR5KSwgc3R5bGUtPmZpbHRlcigpKTsKKyAgRVhQRUNUX0VRKHN0eWxlLT5maWx0ZXIoKSwgc3R5bGUtPkdldFByb3BlcnR5VmFsdWUoa0ZpbHRlclByb3BlcnR5KSk7CisKKyAgc3R5bGUtPnNldF9maWx0ZXIoS2V5d29yZFZhbHVlOjpHZXRJbml0aWFsKCkpOworICBFWFBFQ1RfRVEoS2V5d29yZFZhbHVlOjpHZXRJbml0aWFsKCksIHN0eWxlLT5maWx0ZXIoKSk7CisgIEVYUEVDVF9FUShLZXl3b3JkVmFsdWU6OkdldEluaXRpYWwoKSwKKyAgICAgICAgICAgIHN0eWxlLT5HZXRQcm9wZXJ0eVZhbHVlKGtGaWx0ZXJQcm9wZXJ0eSkpOworCisgIHN0eWxlLT5TZXRQcm9wZXJ0eVZhbHVlKGtGaWx0ZXJQcm9wZXJ0eSwgS2V5d29yZFZhbHVlOjpHZXRJbmhlcml0KCkpOworICBFWFBFQ1RfRVEoS2V5d29yZFZhbHVlOjpHZXRJbmhlcml0KCksIHN0eWxlLT5maWx0ZXIoKSk7CisgIEVYUEVDVF9FUShLZXl3b3JkVmFsdWU6OkdldEluaGVyaXQoKSwKKyAgICAgICAgICAgIHN0eWxlLT5HZXRQcm9wZXJ0eVZhbHVlKGtGaWx0ZXJQcm9wZXJ0eSkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgY3Nzb20KIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmVkX3N0eWxlX2RhdGEuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJlZF9zdHlsZV9kYXRhLmNjCmluZGV4IDY3NjhlNTAuLjgwYTA1ZGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmVkX3N0eWxlX2RhdGEuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGF0YS5jYwpAQCAtNjUsNyArNjUsMTQgQEAKICAgICAgICAgRXhwYW5kU2hvcnRoYW5kUHJvcGVydHkoa2V5KTsKICAgICBmb3IgKExvbmdoYW5kUHJvcGVydHlTZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBsb25naGFuZF9wcm9wZXJ0aWVzLmJlZ2luKCk7CiAgICAgICAgICBpdGVyICE9IGxvbmdoYW5kX3Byb3BlcnRpZXMuZW5kKCk7ICsraXRlcikgewotICAgICAgQ2xlYXJQcm9wZXJ0eVZhbHVlQW5kSW1wb3J0YW5jZUZvckxvbmdoYW5kUHJvcGVydHkoKml0ZXIpOworICAgICAgUHJvcGVydHlLZXkgbG9uZ2hhbmRfa2V5ID0gKml0ZXI7CisgICAgICBpZiAoSXNTaG9ydGhhbmRQcm9wZXJ0eShsb25naGFuZF9rZXkpKSB7CisgICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBhbm90aGVyIHNob3J0aGFuZCBwcm9wZXJ0eSwgdGhlbiByZWN1cnNlIHRvIGNsZWFyCisgICAgICAgIC8vIGl0J3MgcmVnaXN0ZXJlZCBsb25naGFuZCBwcm9wZXJ0aWVzLgorICAgICAgICBDbGVhclByb3BlcnR5VmFsdWVBbmRJbXBvcnRhbmNlKGxvbmdoYW5kX2tleSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDbGVhclByb3BlcnR5VmFsdWVBbmRJbXBvcnRhbmNlRm9yTG9uZ2hhbmRQcm9wZXJ0eShsb25naGFuZF9rZXkpOworICAgICAgfQogICAgIH0KICAgfSBlbHNlIHsKICAgICBDbGVhclByb3BlcnR5VmFsdWVBbmRJbXBvcnRhbmNlRm9yTG9uZ2hhbmRQcm9wZXJ0eShrZXkpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGF0YV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGF0YV90ZXN0LmNjCmluZGV4IDMxMzg4YTguLjA3NjFjOGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmVkX3N0eWxlX2RhdGFfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJlZF9zdHlsZV9kYXRhX3Rlc3QuY2MKQEAgLTY5Niw1ICs2OTYsMzYgQEAKICAgRVhQRUNUX0VRKCpzdHlsZTEgPT0gKnN0eWxlMiwgZmFsc2UpOwogfQogCitURVNUKENTU0RlY2xhcmVkU3R5bGVEYXRhVGVzdCwgQ2FuQ2xlYXJMb25nSGFuZFByb3BlcnR5VmFsdWVBbmRJbXBvcnRhbmNlKSB7CisgIHNjb3BlZF9yZWZwdHI8Q1NTRGVjbGFyZWRTdHlsZURhdGE+IHN0eWxlID0gbmV3IENTU0RlY2xhcmVkU3R5bGVEYXRhKCk7CisgIHN0eWxlLT5TZXRQcm9wZXJ0eVZhbHVlQW5kSW1wb3J0YW5jZShrQm9yZGVyTGVmdFdpZHRoUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXl3b3JkVmFsdWU6OkdldEluaGVyaXQoKSwgdHJ1ZSk7CisgIHN0eWxlLT5DbGVhclByb3BlcnR5VmFsdWVBbmRJbXBvcnRhbmNlKGtCb3JkZXJMZWZ0V2lkdGhQcm9wZXJ0eSk7CisKKyAgc2NvcGVkX3JlZnB0cjxDU1NEZWNsYXJlZFN0eWxlRGF0YT4gZW1wdHlfc3R5bGUgPSBuZXcgQ1NTRGVjbGFyZWRTdHlsZURhdGEoKTsKKyAgRVhQRUNUX0VRKCpzdHlsZSwgKmVtcHR5X3N0eWxlKTsKK30KKworVEVTVChDU1NEZWNsYXJlZFN0eWxlRGF0YVRlc3QsIENhbkNsZWFyUHJvcGVydHlWYWx1ZUFuZEltcG9ydGFuY2UpIHsKKyAgc2NvcGVkX3JlZnB0cjxDU1NEZWNsYXJlZFN0eWxlRGF0YT4gc3R5bGUgPSBuZXcgQ1NTRGVjbGFyZWRTdHlsZURhdGEoKTsKKyAgc3R5bGUtPlNldFByb3BlcnR5VmFsdWVBbmRJbXBvcnRhbmNlKGtCb3JkZXJMZWZ0V2lkdGhQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXdvcmRWYWx1ZTo6R2V0SW5oZXJpdCgpLCB0cnVlKTsKKyAgc3R5bGUtPkNsZWFyUHJvcGVydHlWYWx1ZUFuZEltcG9ydGFuY2Uoa0JvcmRlcldpZHRoUHJvcGVydHkpOworCisgIHNjb3BlZF9yZWZwdHI8Q1NTRGVjbGFyZWRTdHlsZURhdGE+IGVtcHR5X3N0eWxlID0gbmV3IENTU0RlY2xhcmVkU3R5bGVEYXRhKCk7CisgIEVYUEVDVF9FUSgqc3R5bGUsICplbXB0eV9zdHlsZSk7Cit9CisKK1RFU1QoQ1NTRGVjbGFyZWRTdHlsZURhdGFUZXN0LAorICAgICBDYW5DbGVhclByb3BlcnR5VmFsdWVBbmRJbXBvcnRhbmNlV2l0aFJlY3Vyc2lvbikgeworICBzY29wZWRfcmVmcHRyPENTU0RlY2xhcmVkU3R5bGVEYXRhPiBzdHlsZSA9IG5ldyBDU1NEZWNsYXJlZFN0eWxlRGF0YSgpOworICBzdHlsZS0+U2V0UHJvcGVydHlWYWx1ZUFuZEltcG9ydGFuY2Uoa0JvcmRlckxlZnRXaWR0aFByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5d29yZFZhbHVlOjpHZXRJbmhlcml0KCksIHRydWUpOworICBzdHlsZS0+Q2xlYXJQcm9wZXJ0eVZhbHVlQW5kSW1wb3J0YW5jZShrQm9yZGVyUHJvcGVydHkpOworCisgIHNjb3BlZF9yZWZwdHI8Q1NTRGVjbGFyZWRTdHlsZURhdGE+IGVtcHR5X3N0eWxlID0gbmV3IENTU0RlY2xhcmVkU3R5bGVEYXRhKCk7CisgIEVYUEVDVF9FUSgqc3R5bGUsICplbXB0eV9zdHlsZSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBjc3NvbQogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NvbS5neXAgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc29tLmd5cAppbmRleCA2M2JlOWVhLi5hM2FmNmM0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc29tLmd5cAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc29tLmd5cApAQCAtMTAwLDYgKzEwMCw5IEBACiAgICAgICAgICdkZXNjZW5kYW50X2NvbWJpbmF0b3IuaCcsCiAgICAgICAgICdlbXB0eV9wc2V1ZG9fY2xhc3MuY2MnLAogICAgICAgICAnZW1wdHlfcHNldWRvX2NsYXNzLmgnLAorICAgICAgICAnZmlsdGVyX2Z1bmN0aW9uLmgnLAorICAgICAgICAnZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuY2MnLAorICAgICAgICAnZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaCcsCiAgICAgICAgICdmb2N1c19wc2V1ZG9fY2xhc3MuY2MnLAogICAgICAgICAnZm9jdXNfcHNldWRvX2NsYXNzLmgnLAogICAgICAgICAnZm9sbG93aW5nX3NpYmxpbmdfY29tYmluYXRvci5jYycsCkBAIC0xNDMsNiArMTQ2LDggQEAKICAgICAgICAgJ21lZGlhX3F1ZXJ5LmgnLAogICAgICAgICAnbWVkaWFfdHlwZV9uYW1lcy5jYycsCiAgICAgICAgICdtZWRpYV90eXBlX25hbWVzLmgnLAorICAgICAgICAnbXRtX2Z1bmN0aW9uLmNjJywKKyAgICAgICAgJ210bV9mdW5jdGlvbi5oJywKICAgICAgICAgJ211dGF0aW9uX29ic2VydmVyLmgnLAogICAgICAgICAnbmV4dF9zaWJsaW5nX2NvbWJpbmF0b3IuY2MnLAogICAgICAgICAnbmV4dF9zaWJsaW5nX2NvbWJpbmF0b3IuaCcsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbi5oIGIvc3JjL2NvYmFsdC9jc3NvbS9maWx0ZXJfZnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzA1M2MwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9maWx0ZXJfZnVuY3Rpb24uaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPQkFMVF9DU1NPTV9GSUxURVJfRlVOQ1RJT05fSF8KKyNkZWZpbmUgQ09CQUxUX0NTU09NX0ZJTFRFUl9GVU5DVElPTl9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZXF1YXRhYmxlLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGNzc29tIHsKKworLy8gQSBiYXNlIGNsYXNzIGZvciBmaWx0ZXIgZnVuY3Rpb25zLiBGaWx0ZXJzIG1hbmlwdWxhdGUgYW4gZWxlbWVudCdzIHJlbmRlcmluZy4KKy8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2ZpbHRlci1lZmZlY3RzLTEvCitjbGFzcyBGaWx0ZXJGdW5jdGlvbiA6IHB1YmxpYyBiYXNlOjpQb2x5bW9ycGhpY0VxdWF0YWJsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgfkZpbHRlckZ1bmN0aW9uKCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZSBjc3NvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9DU1NPTV9GSUxURVJfRlVOQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzgzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlLmNjCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgY3Nzb20geworCitzdGQ6OnN0cmluZyBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZTo6VG9TdHJpbmcoKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZSgpLnNpemUoKTsgKytpKSB7CisgICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgcmVzdWx0LmFwcGVuZCgiICIpOworICAgIHJlc3VsdC5hcHBlbmQodmFsdWUoKVtpXS0+VG9TdHJpbmcoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNzc29tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlLmggYi9zcmMvY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmMTM3YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPQkFMVF9DU1NPTV9GSUxURVJfRlVOQ1RJT05fTElTVF9WQUxVRV9IXworI2RlZmluZSBDT0JBTFRfQ1NTT01fRklMVEVSX0ZVTkNUSU9OX0xJU1RfVkFMVUVfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19lcXVhdGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vc2NvcGVkX2xpc3RfdmFsdWUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgY3Nzb20geworCisvLyBBIGxpc3Qgb2YgY29tcG9zZWQgZmlsdGVyIGZ1bmN0aW9ucy4KK2NsYXNzIEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlIDogcHVibGljIFNjb3BlZExpc3RWYWx1ZTxGaWx0ZXJGdW5jdGlvbj4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWUoCisgICAgICBTY29wZWRMaXN0VmFsdWU8RmlsdGVyRnVuY3Rpb24+OjpCdWlsZGVyIHZhbHVlKQorICAgICAgOiBTY29wZWRMaXN0VmFsdWUodmFsdWUuUGFzcygpKSB7fQorCisgIHZvaWQgQWNjZXB0KFByb3BlcnR5VmFsdWVWaXNpdG9yKiB2aXNpdG9yKSBPVkVSUklERSB7CisgICAgdmlzaXRvci0+VmlzaXRGaWx0ZXJGdW5jdGlvbkxpc3QodGhpcyk7CisgIH0KKworICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IE9WRVJSSURFOworCisgIERFRklORV9QT0xZTU9SUEhJQ19FUVVBVEFCTEVfVFlQRShGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZSk7CisKKyBwcml2YXRlOgorICB2aXJ0dWFsIH5GaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZSgpIE9WRVJSSURFIHt9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3Nzb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfQ1NTT01fRklMVEVSX0ZVTkNUSU9OX0xJU1RfVkFMVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vaW50ZXJwb2xhdGVfcHJvcGVydHlfdmFsdWUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2ludGVycG9sYXRlX3Byb3BlcnR5X3ZhbHVlLmNjCmluZGV4IDA2MTMzMmQuLmQ5YmVhOGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vaW50ZXJwb2xhdGVfcHJvcGVydHlfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9pbnRlcnBvbGF0ZV9wcm9wZXJ0eV92YWx1ZS5jYwpAQCAtNzAsNiArNzAsOCBAQAogCiAgIHZvaWQgVmlzaXRBYnNvbHV0ZVVSTChBYnNvbHV0ZVVSTFZhbHVlKiBzdGFydF9hYnNvbHV0ZV91cmxfdmFsdWUpIE9WRVJSSURFOwogICB2b2lkIFZpc2l0Q2FsYyhDYWxjVmFsdWUqIHN0YXJ0X2NhbGNfdmFsdWUpIE9WRVJSSURFOworICB2b2lkIFZpc2l0RmlsdGVyRnVuY3Rpb25MaXN0KAorICAgICAgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWUqIHN0YXJ0X2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlKSBPVkVSUklERTsKICAgdm9pZCBWaXNpdEZvbnRTdHlsZShGb250U3R5bGVWYWx1ZSogc3RhcnRfZm9udF9zdHlsZV92YWx1ZSkgT1ZFUlJJREU7CiAgIHZvaWQgVmlzaXRGb250V2VpZ2h0KEZvbnRXZWlnaHRWYWx1ZSogc3RhcnRfZm9udF93ZWlnaHRfdmFsdWUpIE9WRVJSSURFOwogICB2b2lkIFZpc2l0SW50ZWdlcihJbnRlZ2VyVmFsdWUqIGludGVnZXJfdmFsdWUpIE9WRVJSSURFOwpAQCAtMzU2LDYgKzM1OCwxMiBAQAogICBpbnRlcnBvbGF0ZWRfdmFsdWVfID0gZW5kX3ZhbHVlXzsKIH0KIAordm9pZCBJbnRlcnBvbGF0ZVZpc2l0b3I6OlZpc2l0RmlsdGVyRnVuY3Rpb25MaXN0KAorICAgIEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlKiAvKnN0YXJ0X2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlKi8pIHsKKyAgTk9USU1QTEVNRU5URUQoKTsKKyAgaW50ZXJwb2xhdGVkX3ZhbHVlXyA9IGVuZF92YWx1ZV87Cit9CisKIHZvaWQgSW50ZXJwb2xhdGVWaXNpdG9yOjpWaXNpdEZvbnRTdHlsZSgKICAgICBGb250U3R5bGVWYWx1ZSogLypzdGFydF9mb250X3N0eWxlX3ZhbHVlKi8pIHsKICAgTk9USU1QTEVNRU5URUQoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbXRtX2Z1bmN0aW9uLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9tdG1fZnVuY3Rpb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1MTkzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vbXRtX2Z1bmN0aW9uLmNjCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL210bV9mdW5jdGlvbi5oIgorCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdwcmludGYuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGNzc29tIHsKKworTVRNRnVuY3Rpb246Ok1UTUZ1bmN0aW9uKAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8UHJvcGVydHlWYWx1ZT4mIG1lc2hfdXJsLAorICAgIFJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyIHJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMsCisgICAgZmxvYXQgaG9yaXpvbnRhbF9mb3YsIGZsb2F0IHZlcnRpY2FsX2ZvdiwgY29uc3QgZ2xtOjptYXQ0JiB0cmFuc2Zvcm0pCisgICAgOiBtZXNoX3VybF8obWVzaF91cmwpLAorICAgICAgcmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlc18ocmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlcy5QYXNzKCkpLAorICAgICAgaG9yaXpvbnRhbF9mb3ZfKGhvcml6b250YWxfZm92KSwKKyAgICAgIHZlcnRpY2FsX2Zvdl8odmVydGljYWxfZm92KSwKKyAgICAgIHRyYW5zZm9ybV8odHJhbnNmb3JtKSB7CisgIERDSEVDSyhtZXNoX3VybF8pOworfQorCitzdGQ6OnN0cmluZyBNVE1GdW5jdGlvbjo6VG9TdHJpbmcoKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICItY29iYWx0LW10bSgiOworCisgIHJlc3VsdC5hcHBlbmQobWVzaF91cmwoKS0+VG9TdHJpbmcoKSk7CisKKyAgY29uc3QgUmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXImIG1lc2hlcyA9IHJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMoKTsKKyAgZm9yIChzaXplX3QgbWVzaF9pbmRleCA9IDA7IG1lc2hfaW5kZXggPCBtZXNoZXMuc2l6ZSgpOyArK21lc2hfaW5kZXgpIHsKKyAgICByZXN1bHQucHVzaF9iYWNrKCcgJyk7CisgICAgcmVzdWx0LmFwcGVuZChiYXNlOjpJbnRUb1N0cmluZyhtZXNoZXNbbWVzaF9pbmRleF0tPndpZHRoX21hdGNoKCkpKTsKKyAgICByZXN1bHQucHVzaF9iYWNrKCcgJyk7CisgICAgcmVzdWx0LmFwcGVuZChiYXNlOjpJbnRUb1N0cmluZyhtZXNoZXNbbWVzaF9pbmRleF0tPmhlaWdodF9tYXRjaCgpKSk7CisgICAgcmVzdWx0LnB1c2hfYmFjaygnICcpOworICAgIHJlc3VsdC5hcHBlbmQobWVzaGVzW21lc2hfaW5kZXhdLT5tZXNoX3VybCgpLT5Ub1N0cmluZygpKTsKKyAgfQorCisgIHJlc3VsdC5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIsICUuN2dyYWQiLCBob3Jpem9udGFsX2ZvdigpKSk7CisgIHJlc3VsdC5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIgJS43Z3JhZCwgIiwgdmVydGljYWxfZm92KCkpKTsKKworICByZXN1bHQuYXBwZW5kKCJtYXRyaXgzZCgiKTsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDw9IDM7ICsrY29sKSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDw9IDM7ICsrcm93KSB7CisgICAgICBpZiAoY29sID4gMCB8fCByb3cgPiAwKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgIik7CisgICAgICB9CisgICAgICByZXN1bHQuYXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJS43ZyIsIHRyYW5zZm9ybSgpW2NvbF1bcm93XSkpOworICAgIH0KKyAgfQorICByZXN1bHQuYXBwZW5kKCIpKSIpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK01UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2g6OlJlc29sdXRpb25NYXRjaGVkTWVzaCgKKyAgICBpbnQgd2lkdGhfbWF0Y2gsIGludCBoZWlnaHRfbWF0Y2gsCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxQcm9wZXJ0eVZhbHVlPiYgbWVzaF91cmwpCisgICAgOiB3aWR0aF9tYXRjaF8od2lkdGhfbWF0Y2gpLAorICAgICAgaGVpZ2h0X21hdGNoXyhoZWlnaHRfbWF0Y2gpLAorICAgICAgbWVzaF91cmxfKG1lc2hfdXJsKSB7CisgIERDSEVDSyhtZXNoX3VybF8pOworfQorCitib29sIE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2g6Om9wZXJhdG9yPT0oCisgICAgY29uc3QgTVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaCYgcmhzKSBjb25zdCB7CisgIHJldHVybiBtZXNoX3VybCgpLT5FcXVhbHMoKnJocy5tZXNoX3VybCgpKSAmJgorICAgICAgICAgd2lkdGhfbWF0Y2goKSA9PSByaHMud2lkdGhfbWF0Y2goKSAmJgorICAgICAgICAgaGVpZ2h0X21hdGNoKCkgPT0gcmhzLmhlaWdodF9tYXRjaCgpOworfQorCitib29sIE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2g6Om9wZXJhdG9yIT0oCisgICAgY29uc3QgTVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaCYgcmhzKSBjb25zdCB7CisgIHJldHVybiAhKCp0aGlzID09IHJocyk7Cit9CisKK2NvbnN0IE1UTUZ1bmN0aW9uKiBNVE1GdW5jdGlvbjo6RXh0cmFjdEZyb21GaWx0ZXJMaXN0KAorICAgIFByb3BlcnR5VmFsdWUqIGZpbHRlcl92YWx1ZSkgeworICBpZiAoZmlsdGVyX3ZhbHVlICYmIGZpbHRlcl92YWx1ZSAhPSBjc3NvbTo6S2V5d29yZFZhbHVlOjpHZXROb25lKCkpIHsKKyAgICBjb25zdCBjc3NvbTo6RmlsdGVyRnVuY3Rpb25MaXN0VmFsdWU6OkJ1aWxkZXImIGZpbHRlcl9saXN0ID0KKyAgICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8Y3Nzb206OkZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlKj4oCisgICAgICAgICAgICBmaWx0ZXJfdmFsdWUpCisgICAgICAgICAgICAtPnZhbHVlKCk7CisKKyAgICBmb3IgKHNpemVfdCBsaXN0X2luZGV4ID0gMDsgbGlzdF9pbmRleCA8IGZpbHRlcl9saXN0LnNpemUoKTsgKytsaXN0X2luZGV4KSB7CisgICAgICBpZiAoZmlsdGVyX2xpc3RbbGlzdF9pbmRleF0tPkdldFR5cGVJZCgpID09CisgICAgICAgICAgYmFzZTo6R2V0VHlwZUlkPGNzc29tOjpNVE1GdW5jdGlvbj4oKSkgeworICAgICAgICByZXR1cm4gYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8Y29uc3QgY3Nzb206Ok1UTUZ1bmN0aW9uKj4oCisgICAgICAgICAgICBmaWx0ZXJfbGlzdFtsaXN0X2luZGV4XSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgTVRNRnVuY3Rpb246Om9wZXJhdG9yPT0oY29uc3QgTVRNRnVuY3Rpb24mIHJocykgY29uc3QgeworICBpZiAoIW1lc2hfdXJsKCktPkVxdWFscygqcmhzLm1lc2hfdXJsKCkpIHx8CisgICAgICBob3Jpem9udGFsX2ZvdigpICE9IHJocy5ob3Jpem9udGFsX2ZvdigpIHx8CisgICAgICBob3Jpem9udGFsX2ZvdigpICE9IHJocy5ob3Jpem9udGFsX2ZvdigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IFJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyJiBsaHNfbWVzaGVzID0KKyAgICAgIHJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMoKTsKKyAgY29uc3QgUmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXImIHJoc19tZXNoZXMgPQorICAgICAgcmhzLnJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMoKTsKKworICBpZiAobGhzX21lc2hlcy5zaXplKCkgIT0gcmhzX21lc2hlcy5zaXplKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxoc19tZXNoZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoKmxoc19tZXNoZXNbaV0gIT0gKnJoc19tZXNoZXNbaV0pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPD0gMzsgKytjb2wpIHsKKyAgICBpZiAoIWdsbTo6YWxsKGdsbTo6ZXF1YWwodHJhbnNmb3JtKClbY29sXSwgcmhzLnRyYW5zZm9ybSgpW2NvbF0pKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3Nzb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbXRtX2Z1bmN0aW9uLmggYi9zcmMvY29iYWx0L2Nzc29tL210bV9mdW5jdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDk4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL210bV9mdW5jdGlvbi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09CQUxUX0NTU09NX01UTV9GVU5DVElPTl9IXworI2RlZmluZSBDT0JBTFRfQ1NTT01fTVRNX0ZVTkNUSU9OX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKKyNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfdmVjdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZXF1YXRhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS91cmxfdmFsdWUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nbG0vZ2xtL21hdDR4NC5ocHAiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGNzc29tIHsKKworLy8gUmVwcmVzZW50IGFuIE1UTSBmaWx0ZXIuCitjbGFzcyBNVE1GdW5jdGlvbiA6IHB1YmxpYyBGaWx0ZXJGdW5jdGlvbiB7CisgcHVibGljOgorICAvLyBBIHJlc29sdXRpb24tbWF0Y2hlZCBtZXNoIHNwZWNpZmllci4KKyAgY2xhc3MgUmVzb2x1dGlvbk1hdGNoZWRNZXNoIHsKKyAgIHB1YmxpYzoKKyAgICBSZXNvbHV0aW9uTWF0Y2hlZE1lc2goaW50IHdpZHRoX21hdGNoLCBpbnQgaGVpZ2h0X21hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+JiBtZXNoX3VybCk7CisgICAgaW50IHdpZHRoX21hdGNoKCkgY29uc3QgeyByZXR1cm4gd2lkdGhfbWF0Y2hfOyB9CisgICAgaW50IGhlaWdodF9tYXRjaCgpIGNvbnN0IHsgcmV0dXJuIGhlaWdodF9tYXRjaF87IH0KKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+JiBtZXNoX3VybCgpIGNvbnN0IHsgcmV0dXJuIG1lc2hfdXJsXzsgfQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoJiByaHMpIGNvbnN0OworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoJiByaHMpIGNvbnN0OworCisgICBwcml2YXRlOgorICAgIGNvbnN0IGludCB3aWR0aF9tYXRjaF87CisgICAgY29uc3QgaW50IGhlaWdodF9tYXRjaF87CisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxQcm9wZXJ0eVZhbHVlPiBtZXNoX3VybF87CisgIH07CisgIHR5cGVkZWYgU2NvcGVkVmVjdG9yPFJlc29sdXRpb25NYXRjaGVkTWVzaD4gUmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXI7CisKKyAgTVRNRnVuY3Rpb24oY29uc3Qgc2NvcGVkX3JlZnB0cjxQcm9wZXJ0eVZhbHVlPiYgbWVzaF91cmwsCisgICAgICAgICAgICAgIFJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyIHJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMsCisgICAgICAgICAgICAgIGZsb2F0IGhvcml6b250YWxfZm92LCBmbG9hdCB2ZXJ0aWNhbF9mb3YsCisgICAgICAgICAgICAgIGNvbnN0IGdsbTo6bWF0NCYgdHJhbnNmb3JtKTsKKworICB+TVRNRnVuY3Rpb24oKSBPVkVSUklERSB7fQorCisgIGNvbnN0IHNjb3BlZF9yZWZwdHI8UHJvcGVydHlWYWx1ZT4mIG1lc2hfdXJsKCkgY29uc3QgeyByZXR1cm4gbWVzaF91cmxfOyB9CisgIGNvbnN0IFJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyJiByZXNvbHV0aW9uX21hdGNoZWRfbWVzaGVzKCkgY29uc3QgeworICAgIHJldHVybiByZXNvbHV0aW9uX21hdGNoZWRfbWVzaGVzXzsKKyAgfQorCisgIGZsb2F0IGhvcml6b250YWxfZm92KCkgY29uc3QgeyByZXR1cm4gaG9yaXpvbnRhbF9mb3ZfOyB9CisgIGZsb2F0IHZlcnRpY2FsX2ZvdigpIGNvbnN0IHsgcmV0dXJuIHZlcnRpY2FsX2Zvdl87IH0KKyAgY29uc3QgZ2xtOjptYXQ0JiB0cmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiB0cmFuc2Zvcm1fOyB9CisKKyAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBPVkVSUklERTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTVRNRnVuY3Rpb24mIHJocykgY29uc3Q7CisKKyAgc3RhdGljIGNvbnN0IE1UTUZ1bmN0aW9uKiBFeHRyYWN0RnJvbUZpbHRlckxpc3QoUHJvcGVydHlWYWx1ZSogZmlsdGVyX2xpc3QpOworCisgIERFRklORV9QT0xZTU9SUEhJQ19FUVVBVEFCTEVfVFlQRShNVE1GdW5jdGlvbik7CisKKyBwcml2YXRlOgorICBjb25zdCBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+IG1lc2hfdXJsXzsKKyAgY29uc3QgUmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIgcmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlc187CisgIGNvbnN0IGZsb2F0IGhvcml6b250YWxfZm92XzsKKyAgY29uc3QgZmxvYXQgdmVydGljYWxfZm92XzsKKyAgY29uc3QgZ2xtOjptYXQ0IHRyYW5zZm9ybV87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1UTUZ1bmN0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjc3NvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9DU1NPTV9NVE1fRlVOQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfZGVmaW5pdGlvbnMuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X2RlZmluaXRpb25zLmNjCmluZGV4IDgxMzM5OTIuLjFiY2RiMmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfZGVmaW5pdGlvbnMuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV9kZWZpbml0aW9ucy5jYwpAQCAtMzg2LDYgKzM4NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAga0ltcGFjdHNCb3hDcm9zc1JlZmVyZW5jZXNObywKICAgICAgICAgICAgICAgICAgICAgICAgIEtleXdvcmRWYWx1ZTo6R2V0SW5saW5lKCkpOwogCisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9maWx0ZXItZWZmZWN0cy0xLyNGaWx0ZXJQcm9wZXJ0eQorICBTZXRQcm9wZXJ0eURlZmluaXRpb24oa0ZpbHRlclByb3BlcnR5LCAiZmlsdGVyIiwga0luaGVyaXRlZE5vLCBrQW5pbWF0YWJsZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAga0ltcGFjdHNDaGlsZERlY2xhcmVkU3R5bGVObywga0ltcGFjdHNCb3hHZW5lcmF0aW9uTm8sCisgICAgICAgICAgICAgICAgICAgICAgICBrSW1wYWN0c0JveFNpemVzTm8sIGtJbXBhY3RzQm94Q3Jvc3NSZWZlcmVuY2VzTm8sCisgICAgICAgICAgICAgICAgICAgICAgICBLZXl3b3JkVmFsdWU6OkdldE5vbmUoKSk7CisKICAgLy8gVmFyaWVzIGJ5IHBsYXRmb3JtIGluIENocm9taXVtLCBSb2JvdG8gaW4gQ29iYWx0LgogICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MzLWZvbnRzLyNmb250LWZhbWlseS1wcm9wCiAgIFNldFByb3BlcnR5RGVmaW5pdGlvbigKQEAgLTEwMDMsNiArMTAwOSwxMCBAQAogICAgICAgICByZXR1cm4ga0JvdHRvbVByb3BlcnR5OwogICAgICAgfQogICAgICAgaWYgKExvd2VyQ2FzZUVxdWFsc0FTQ0lJKHByb3BlcnR5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UHJvcGVydHlOYW1lKGtGaWx0ZXJQcm9wZXJ0eSkpKSB7CisgICAgICAgIHJldHVybiBrRmlsdGVyUHJvcGVydHk7CisgICAgICB9CisgICAgICBpZiAoTG93ZXJDYXNlRXF1YWxzQVNDSUkocHJvcGVydHlfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQcm9wZXJ0eU5hbWUoa0hlaWdodFByb3BlcnR5KSkpIHsKICAgICAgICAgcmV0dXJuIGtIZWlnaHRQcm9wZXJ0eTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfZGVmaW5pdGlvbnMuaCBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfZGVmaW5pdGlvbnMuaAppbmRleCAxNGExYzM5Li5mNGM5MzMzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X2RlZmluaXRpb25zLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV9kZWZpbml0aW9ucy5oCkBAIC03Miw2ICs3Miw3IEBACiAgIGtDb2xvclByb3BlcnR5LAogICBrQ29udGVudFByb3BlcnR5LAogICBrRGlzcGxheVByb3BlcnR5LAorICBrRmlsdGVyUHJvcGVydHksCiAgIGtGb250RmFtaWx5UHJvcGVydHksCiAgIGtGb250U2l6ZVByb3BlcnR5LAogICBrRm9udFN0eWxlUHJvcGVydHksCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX2lzX2VxdWFsX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX2lzX2VxdWFsX3Rlc3QuY2MKaW5kZXggYjJmNGY4OC4uMGI2NDdkMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV9pc19lcXVhbF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfaXNfZXF1YWxfdGVzdC5jYwpAQCAtMTUsNiArMTUsNyBAQAogICovCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vYWJzb2x1dGVfdXJsX3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZvbnRfc3R5bGVfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZm9udF93ZWlnaHRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vaW50ZWdlcl92YWx1ZS5oIgpAQCAtMjMsNiArMjQsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9saW5lYXJfZ3JhZGllbnRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWF0cml4X2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfa2V5d29yZF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tdG1fZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbnVtYmVyX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3BlcmNlbnRhZ2VfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vcHJvcGVydHlfZGVmaW5pdGlvbnMuaCIKQEAgLTU5Niw1ICs1OTgsNTkgQEAKICAgRVhQRUNUX0ZBTFNFKHZhbHVlX2EtPkVxdWFscygqdmFsdWVfYikpOwogfQogCitURVNUKFByb3BlcnR5VmFsdWVJc0VxdWFsVGVzdCwgRmlsdGVyTGlzdHNBcmVFcXVhbCkgeworICBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZTo6QnVpbGRlciBmaWx0ZXJfbGlzdF9hOworICBmaWx0ZXJfbGlzdF9hLnB1c2hfYmFjayhuZXcgTVRNRnVuY3Rpb24oCisgICAgICBuZXcgVVJMVmFsdWUoInNvbWVtZXNoLm1zaCIpLAorICAgICAgTVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyKCkuUGFzcygpLCAwLjcwNzA3ZiwgNi4yOGYsCisgICAgICBnbG06Om1hdDQoMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgOS4wZiwgMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAxLjBmLCAwLjA3ODc4ZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZikpKTsKKyAgZmlsdGVyX2xpc3RfYS5wdXNoX2JhY2sobmV3IE1UTUZ1bmN0aW9uKAorICAgICAgbmV3IFVSTFZhbHVlKCJzcGhlcmUubXNoIiksCisgICAgICBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDAuNjc2ZiwgNi4yOGYsCisgICAgICBnbG06Om1hdDQoMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSkpOworICBzY29wZWRfcmVmcHRyPEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlPiB2YWx1ZV9hKAorICAgICAgbmV3IEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlKGZpbHRlcl9saXN0X2EuUGFzcygpKSk7CisKKyAgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWU6OkJ1aWxkZXIgZmlsdGVyX2xpc3RfYjsKKyAgZmlsdGVyX2xpc3RfYi5wdXNoX2JhY2sobmV3IE1UTUZ1bmN0aW9uKAorICAgICAgbmV3IFVSTFZhbHVlKCJzb21lbWVzaC5tc2giKSwKKyAgICAgIE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpLlBhc3MoKSwgMC43MDcwN2YsIDYuMjhmLAorICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDkuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgMS4wZiwgMC4wNzg3OGYsIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpKSk7CisgIGZpbHRlcl9saXN0X2IucHVzaF9iYWNrKG5ldyBNVE1GdW5jdGlvbigKKyAgICAgIG5ldyBVUkxWYWx1ZSgic3BoZXJlLm1zaCIpLAorICAgICAgTVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyKCkuUGFzcygpLCAwLjY3NmYsIDYuMjhmLAorICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZikpKTsKKyAgc2NvcGVkX3JlZnB0cjxGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZT4gdmFsdWVfYigKKyAgICAgIG5ldyBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZShmaWx0ZXJfbGlzdF9iLlBhc3MoKSkpOworCisgIEVYUEVDVF9UUlVFKHZhbHVlX2EtPkVxdWFscygqdmFsdWVfYikpOworfQorCitURVNUKFByb3BlcnR5VmFsdWVJc0VxdWFsVGVzdCwgRmlsdGVyTGlzdHNBcmVOb3RFcXVhbCkgeworICBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZTo6QnVpbGRlciBmaWx0ZXJfbGlzdF9hOworICBmaWx0ZXJfbGlzdF9hLnB1c2hfYmFjayhuZXcgTVRNRnVuY3Rpb24oCisgICAgICBuZXcgVVJMVmFsdWUoImZvcm1hdC5tc2giKSwKKyAgICAgIE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpLlBhc3MoKSwgOC41ZiwgMy4xNGYsCisgICAgICBnbG06Om1hdDQoMS4wZiwgMC4wZiwgMC4wZiwgMi4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSkpOworICBzY29wZWRfcmVmcHRyPEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlPiB2YWx1ZV9hKAorICAgICAgbmV3IEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlKGZpbHRlcl9saXN0X2EuUGFzcygpKSk7CisKKyAgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWU6OkJ1aWxkZXIgZmlsdGVyX2xpc3RfYjsKKyAgZmlsdGVyX2xpc3RfYi5wdXNoX2JhY2sobmV3IE1UTUZ1bmN0aW9uKAorICAgICAgbmV3IFVSTFZhbHVlKCJmb3JtYXQubXNoIiksCisgICAgICBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDguNWYsIDMuMTRmLAorICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZikpKTsKKyAgc2NvcGVkX3JlZnB0cjxGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZT4gdmFsdWVfYigKKyAgICAgIG5ldyBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZShmaWx0ZXJfbGlzdF9iLlBhc3MoKSkpOworCisgIEVYUEVDVF9GQUxTRSh2YWx1ZV9hLT5FcXVhbHMoKnZhbHVlX2IpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGNzc29tCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX3RvX3N0cmluZ190ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV90b19zdHJpbmdfdGVzdC5jYwppbmRleCA2YzkwZWM2Li5mZDUxZmU5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX3RvX3N0cmluZ190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfdG9fc3RyaW5nX3Rlc3QuY2MKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgImJhc2UvdGltZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9hYnNvbHV0ZV91cmxfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZm9udF9zdHlsZV92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9mb250X3dlaWdodF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9pbnRlZ2VyX3ZhbHVlLmgiCkBAIC0yNiw2ICsyNyw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2xpbmVhcl9ncmFkaWVudF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tYXRyaXhfZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZV9rZXl3b3JkX3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL210bV9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9udW1iZXJfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vcGVyY2VudGFnZV92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wcm9wZXJ0eV9kZWZpbml0aW9ucy5oIgpAQCAtMzQ2LDUgKzM0OCw2MSBAQAogICBFWFBFQ1RfRVEocHJvcGVydHktPlRvU3RyaW5nKCksICJ1cmwoZm9vLnBuZykiKTsKIH0KIAorVEVTVChQcm9wZXJ0eVZhbHVlVG9TdHJpbmdUZXN0LCBNVE1GdW5jdGlvblNpbmdsZU1lc2gpIHsKKyAgc2NvcGVkX3B0cjxNVE1GdW5jdGlvbj4gZnVuY3Rpb24obmV3IE1UTUZ1bmN0aW9uKAorICAgICAgbmV3IFVSTFZhbHVlKCItLm1zaCIpLAorICAgICAgTVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyKCkuUGFzcygpLCAyLjVmLCAzLjE0ZiwKKyAgICAgIGdsbTo6bWF0NCgxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICItY29iYWx0LW10bSh1cmwoLS5tc2gpLCAiCisgICAgICAiMi41cmFkIDMuMTRyYWQsICIKKyAgICAgICJtYXRyaXgzZCgxLCAwLCAwLCAxLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxKSkiLAorICAgICAgZnVuY3Rpb24tPlRvU3RyaW5nKCkpOworfQorCitURVNUKFByb3BlcnR5VmFsdWVUb1N0cmluZ1Rlc3QsIE1UTUZ1bmN0aW9uV2l0aFJlc29sdXRpb25NYXRjaGVkTWVzaGVzKSB7CisgIE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciBtZXNoZXM7CisgIG1lc2hlcy5wdXNoX2JhY2sobmV3IE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2goCisgICAgICAxOTIwLCAyMDAwMDAwLCBuZXcgVVJMVmFsdWUoImEubXNoIikpKTsKKyAgbWVzaGVzLnB1c2hfYmFjaygKKyAgICAgIG5ldyBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoKDY0MCwgNSwgbmV3IFVSTFZhbHVlKCJiLm1zaCIpKSk7CisgIHNjb3BlZF9wdHI8TVRNRnVuY3Rpb24+IGZ1bmN0aW9uKG5ldyBNVE1GdW5jdGlvbigKKyAgICAgIG5ldyBVUkxWYWx1ZSgiLS5tc2giKSwgbWVzaGVzLlBhc3MoKSwgMjguNWYsIDMuMTRmLAorICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZikpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgIi1jb2JhbHQtbXRtKHVybCgtLm1zaCkgMTkyMCAyMDAwMDAwIHVybChhLm1zaCkgNjQwIDUgdXJsKGIubXNoKSwgIgorICAgICAgIjI4LjVyYWQgMy4xNHJhZCwgIgorICAgICAgIm1hdHJpeDNkKDEsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEpKSIsCisgICAgICBmdW5jdGlvbi0+VG9TdHJpbmcoKSk7Cit9CisKK1RFU1QoUHJvcGVydHlWYWx1ZVRvU3RyaW5nVGVzdCwgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWUpIHsKKyAgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWU6OkJ1aWxkZXIgZmlsdGVyX2xpc3Q7CisgIGZpbHRlcl9saXN0LnB1c2hfYmFjayhuZXcgTVRNRnVuY3Rpb24oCisgICAgICBuZXcgVVJMVmFsdWUoIi0ubXNoIiksCisgICAgICBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDguNWYsIDMuMTRmLAorICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZikpKTsKKyAgZmlsdGVyX2xpc3QucHVzaF9iYWNrKG5ldyBNVE1GdW5jdGlvbigKKyAgICAgIG5ldyBVUkxWYWx1ZSgid29ybGQubXNoIiksCisgICAgICBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDguNWYsIDM5LjBmLAorICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZikpKTsKKworICBzY29wZWRfcmVmcHRyPEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlPiBwcm9wZXJ0eSgKKyAgICAgIG5ldyBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZShmaWx0ZXJfbGlzdC5QYXNzKCkpKTsKKworICBFWFBFQ1RfRVEoCisgICAgICAiLWNvYmFsdC1tdG0odXJsKC0ubXNoKSwgIgorICAgICAgIjguNXJhZCAzLjE0cmFkLCAiCisgICAgICAibWF0cml4M2QoMSwgMCwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSkpICIKKyAgICAgICItY29iYWx0LW10bSh1cmwod29ybGQubXNoKSwgIgorICAgICAgIjguNXJhZCAzOXJhZCwgIgorICAgICAgIm1hdHJpeDNkKDEsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEpKSIsCisgICAgICBwcm9wZXJ0eS0+VG9TdHJpbmcoKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBjc3NvbQogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmNjCmluZGV4IGNiYTY3Y2IuLjEyZDIzNGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfdmlzaXRvci5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX3Zpc2l0b3IuY2MKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vYWJzb2x1dGVfdXJsX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2NhbGNfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZm9udF9zdHlsZV92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9mb250X3dlaWdodF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9pbnRlZ2VyX3ZhbHVlLmgiCkBAIC01Nyw2ICs1OCwxMSBAQAogICBWaXNpdERlZmF1bHQoY2FsY192YWx1ZSk7CiB9CiAKK3ZvaWQgRGVmYXVsdGluZ1Byb3BlcnR5VmFsdWVWaXNpdG9yOjpWaXNpdEZpbHRlckZ1bmN0aW9uTGlzdCgKKyAgICBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZSogZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUpIHsKKyAgVmlzaXREZWZhdWx0KGZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlKTsKK30KKwogdm9pZCBEZWZhdWx0aW5nUHJvcGVydHlWYWx1ZVZpc2l0b3I6OlZpc2l0Rm9udFN0eWxlKAogICAgIEZvbnRTdHlsZVZhbHVlKiBmb250X3N0eWxlX3ZhbHVlKSB7CiAgIFZpc2l0RGVmYXVsdChmb250X3N0eWxlX3ZhbHVlKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfdmlzaXRvci5oIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmgKaW5kZXggZDM2MzYzMC4uMzQ1N2E5ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmgKQEAgLTI0LDYgKzI0LDcgQEAKIAogY2xhc3MgQWJzb2x1dGVVUkxWYWx1ZTsKIGNsYXNzIENhbGNWYWx1ZTsKK2NsYXNzIEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlOwogY2xhc3MgRm9udFN0eWxlVmFsdWU7CiBjbGFzcyBGb250V2VpZ2h0VmFsdWU7CiBjbGFzcyBJbnRlZ2VyVmFsdWU7CkBAIC01OCw2ICs1OSw3IEBACiAgcHVibGljOgogICB2aXJ0dWFsIHZvaWQgVmlzaXRBYnNvbHV0ZVVSTChBYnNvbHV0ZVVSTFZhbHVlKiB1cmxfdmFsdWUpID0gMDsKICAgdmlydHVhbCB2b2lkIFZpc2l0Q2FsYyhDYWxjVmFsdWUqIGNhbGNfdmFsdWUpID0gMDsKKyAgdmlydHVhbCB2b2lkIFZpc2l0RmlsdGVyRnVuY3Rpb25MaXN0KEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlKikgPSAwOwogICB2aXJ0dWFsIHZvaWQgVmlzaXRGb250U3R5bGUoRm9udFN0eWxlVmFsdWUqIGZvbnRfc3R5bGVfdmFsdWUpID0gMDsKICAgdmlydHVhbCB2b2lkIFZpc2l0Rm9udFdlaWdodChGb250V2VpZ2h0VmFsdWUqIGZvbnRfd2VpZ2h0X3ZhbHVlKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBWaXNpdEludGVnZXIoSW50ZWdlclZhbHVlKiBpbnRlZ2VyX3ZhbHVlKSA9IDA7CkBAIC0xMDIsNiArMTA0LDggQEAKICBwdWJsaWM6CiAgIHZvaWQgVmlzaXRBYnNvbHV0ZVVSTChBYnNvbHV0ZVVSTFZhbHVlKiB1cmxfdmFsdWUpIE9WRVJSSURFOwogICB2b2lkIFZpc2l0Q2FsYyhDYWxjVmFsdWUqIGNhbGNfdmFsdWUpIE9WRVJSSURFOworICB2b2lkIFZpc2l0RmlsdGVyRnVuY3Rpb25MaXN0KAorICAgICAgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWUqIGZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlKSBPVkVSUklERTsKICAgdm9pZCBWaXNpdEZvbnRTdHlsZShGb250U3R5bGVWYWx1ZSogZm9udF9zdHlsZV92YWx1ZSkgT1ZFUlJJREU7CiAgIHZvaWQgVmlzaXRGb250V2VpZ2h0KEZvbnRXZWlnaHRWYWx1ZSogZm9udF93ZWlnaHRfdmFsdWUpIE9WRVJSSURFOwogICB2b2lkIFZpc2l0S2V5d29yZChLZXl3b3JkVmFsdWUqIGtleXdvcmRfdmFsdWUpIE9WRVJSSURFOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX3Zpc2l0b3JfdGVzdC5jYwppbmRleCA5NTNkZDEyLi41NTBjOGI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX3Zpc2l0b3JfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX3Zpc2l0b3JfdGVzdC5jYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Fic29sdXRlX3VybF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jYWxjX3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZvbnRfc3R5bGVfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZm9udF93ZWlnaHRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vaW50ZWdlcl92YWx1ZS5oIgpAQCAtMjgsNiArMjksNyBAQAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9saW5lYXJfZ3JhZGllbnRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbG9jYWxfc3JjX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfa2V5d29yZF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tdG1fZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbnVtYmVyX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3BlcmNlbnRhZ2VfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vcHJvcGVydHlfa2V5X2xpc3RfdmFsdWUuaCIKQEAgLTU5LDYgKzYxLDggQEAKICAgTU9DS19NRVRIT0QxKFZpc2l0QWJzb2x1dGVVUkwsIHZvaWQoQWJzb2x1dGVVUkxWYWx1ZSogYWJzb2x1dGVfdXJsX3ZhbHVlKSk7CiAgIE1PQ0tfTUVUSE9EMShWaXNpdENhbGMsIHZvaWQoQ2FsY1ZhbHVlKiBjYWxjX3ZhbHVlKSk7CiAgIE1PQ0tfTUVUSE9EMShWaXNpdEZvbnRTdHlsZSwgdm9pZChGb250U3R5bGVWYWx1ZSogZm9udF9zdHlsZV92YWx1ZSkpOworICBNT0NLX01FVEhPRDEoVmlzaXRGaWx0ZXJGdW5jdGlvbkxpc3QsCisgICAgICAgICAgICAgICB2b2lkKEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlKiBmaWx0ZXJfbGlzdF92YWx1ZSkpOwogICBNT0NLX01FVEhPRDEoVmlzaXRGb250V2VpZ2h0LCB2b2lkKEZvbnRXZWlnaHRWYWx1ZSogZm9udF93ZWlnaHRfdmFsdWUpKTsKICAgTU9DS19NRVRIT0QxKFZpc2l0SW50ZWdlciwgdm9pZChJbnRlZ2VyVmFsdWUqIGludGVnZXJfdmFsdWUpKTsKICAgTU9DS19NRVRIT0QxKFZpc2l0S2V5d29yZCwgdm9pZChLZXl3b3JkVmFsdWUqIGtleXdvcmRfdmFsdWUpKTsKQEAgLTExMCw2ICsxMTQsMjMgQEAKICAgY2FsY192YWx1ZS0+QWNjZXB0KCZtb2NrX3Zpc2l0b3IpOwogfQogCitURVNUKFByb3BlcnR5VmFsdWVWaXNpdG9yVGVzdCwgVmlzaXRzRmlsdGVyTGlzdFZhbHVlKSB7CisgIE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciByZXNNczsKKyAgcmVzTXMucHVzaF9iYWNrKAorICAgICAgbmV3IE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2goMjIsIDIyLCBuZXcgVVJMVmFsdWUoImEubXNoIikpKTsKKworICBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZTo6QnVpbGRlciBidWlsZGVyOworICBidWlsZGVyLnB1c2hfYmFjayhuZXcgTVRNRnVuY3Rpb24obmV3IFVSTFZhbHVlKCJwLm1zaCIpLCByZXNNcy5QYXNzKCksIDEyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwLCBnbG06Om1hdDQoMS4wZikpKTsKKworICBzY29wZWRfcmVmcHRyPEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlPiBmaWx0ZXJfbGlzdF92YWx1ZSA9CisgICAgICBuZXcgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWUoYnVpbGRlci5QYXNzKCkpOworCisgIE1vY2tQcm9wZXJ0eVZhbHVlVmlzaXRvciBtb2NrX3Zpc2l0b3I7CisgIEVYUEVDVF9DQUxMKG1vY2tfdmlzaXRvciwgVmlzaXRGaWx0ZXJGdW5jdGlvbkxpc3QoZmlsdGVyX2xpc3RfdmFsdWUuZ2V0KCkpKTsKKyAgZmlsdGVyX2xpc3RfdmFsdWUtPkFjY2VwdCgmbW9ja192aXNpdG9yKTsKK30KKwogVEVTVChQcm9wZXJ0eVZhbHVlVmlzaXRvclRlc3QsIFZpc2l0c0ZvbnRTdHlsZVZhbHVlKSB7CiAgIHNjb3BlZF9yZWZwdHI8Rm9udFN0eWxlVmFsdWU+IGZvbnRfc3R5bGVfdmFsdWUgPSBGb250U3R5bGVWYWx1ZTo6R2V0Tm9ybWFsKCk7CiAgIE1vY2tQcm9wZXJ0eVZhbHVlVmlzaXRvciBtb2NrX3Zpc2l0b3I7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL3JlbmRlcl9vdmVybGF5LmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9yZW5kZXJfb3ZlcmxheS5jYwppbmRleCA1YTYwMDQzLi4wYjFmNWE2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL3JlbmRlcl9vdmVybGF5LmNjCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvcmVuZGVyX292ZXJsYXkuY2MKQEAgLTM5LDYgKzM5LDExIEBACiAgIFByb2Nlc3MoKTsKIH0KIAordm9pZCBSZW5kZXJPdmVybGF5OjpDbGVhcklucHV0KCkgeworICBpbnB1dF9sYXlvdXRfID0gTGF5b3V0UmVzdWx0cyhOVUxMLCBiYXNlOjpUaW1lRGVsdGEoKSk7CisgIGlucHV0X3JlY2VpcHRfdGltZV8gPSBiYXNlOjpudWxsb3B0OworfQorCiB2b2lkIFJlbmRlck92ZXJsYXk6OlByb2Nlc3MoKSB7CiAgIGlmIChpbnB1dF9sYXlvdXRfLnJlbmRlcl90cmVlKSB7CiAgICAgLy8gQ2FsY3VsYXRlIGEgbW9kaWZpZWQgbGF5b3V0IHRpbWUgYWNjb3VudGluZyBmb3IgdGhlIG9mZnNldCBiZXR3ZWVuIG5vdwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9yZW5kZXJfb3ZlcmxheS5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9yZW5kZXJfb3ZlcmxheS5oCmluZGV4IGJhYzA3YTkuLjY2NThkNTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvcmVuZGVyX292ZXJsYXkuaAorKysgYi9zcmMvY29iYWx0L2RlYnVnL3JlbmRlcl9vdmVybGF5LmgKQEAgLTQ1LDYgKzQ1LDggQEAKICAgLy8gVXBkYXRlcyB0aGUgb3ZlcmxheSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGlucHV0IGxheW91dC4KICAgdm9pZCBTZXRPdmVybGF5KGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiBvdmVybGF5KTsKIAorICB2b2lkIENsZWFySW5wdXQoKTsKKwogIHByaXZhdGU6CiAgIC8vIEFkZHMgdGhlIG92ZXJsYXkgKGlmIGFueSkgdG8gdGhlIGlucHV0IGxheW91dCBhbmQgcGFzc2VzIG9uIHRvIHRoZQogICAvLyBjYWxsYmFjayBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5jYwppbmRleCA5MjhiYTFmLi4yMzM2ODJiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5jYwpAQCAtNjQwLDYgKzY0MCwyMiBAQAogICB9CiB9CiAKK3ZvaWQgRG9jdW1lbnQ6OkludmFsaWRhdGVMYXlvdXQoKSB7CisgIC8vIFNldCBhbGwgaW52YWxpZGF0aW9uIGZsYWdzIGFuZCByZWN1cnNpdmVseSBpbnZhbGlkYXRlIHRoZSBjb21wdXRlZCBzdHlsZS4KKyAgaXNfc2VsZWN0b3JfdHJlZV9kaXJ0eV8gPSB0cnVlOworICBpc19jb21wdXRlZF9zdHlsZV9kaXJ0eV8gPSB0cnVlOworICBhcmVfZm9udF9mYWNlc19kaXJ0eV8gPSB0cnVlOworICBhcmVfa2V5ZnJhbWVzX2RpcnR5XyA9IHRydWU7CisKKyAgc2NvcGVkX3JlZnB0cjxIVE1MSHRtbEVsZW1lbnQ+IGN1cnJlbnRfaHRtbCA9IGh0bWwoKTsKKyAgaWYgKGN1cnJlbnRfaHRtbCkgeworICAgIGN1cnJlbnRfaHRtbC0+SW52YWxpZGF0ZUNvbXB1dGVkU3R5bGVzUmVjdXJzaXZlbHkoKTsKKyAgfQorCisgIC8vIEZpbmFsbHksIGFsc28gZGVzdHJveSBhbGwgY2FjaGVkIGxheW91dCBib3hlcy4KKyAgSW52YWxpZGF0ZUxheW91dEJveGVzRnJvbU5vZGVBbmREZXNjZW5kYW50cygpOworfQorCiB2b2lkIERvY3VtZW50OjpEaXNwYXRjaE9uTG9hZEV2ZW50KCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwgIkRvY3VtZW50OjpEaXNwYXRjaE9uTG9hZEV2ZW50KCkiKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50LmgKaW5kZXggYWVlODg3Zi4uNWZjYTQ0MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5oCkBAIC0zMjAsNiArMzIwLDkgQEAKICAgLy8gRXhwb3NlZCBmb3IgdGVzdCBwdXJwb3Nlcy4KICAgdm9pZCBVcGRhdGVTZWxlY3RvclRyZWUoKTsKIAorICAvLyBJbnZhbGlkYXRlcyB0aGUgZG9jdW1lbnQncyBjYWNoZWQgbGF5b3V0IHRyZWUgYW5kIGFzc29jaWF0ZWQgZGF0YS4KKyAgdm9pZCBJbnZhbGlkYXRlTGF5b3V0KCk7CisKICAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKERvY3VtZW50KTsKIAogIHByb3RlY3RlZDoKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2ZvbnRfY2FjaGUuY2MgYi9zcmMvY29iYWx0L2RvbS9mb250X2NhY2hlLmNjCmluZGV4IGU3ZjBmMGYuLjBlZTA0NWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2ZvbnRfY2FjaGUuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZm9udF9jYWNoZS5jYwpAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWZhY2VfbG9hZF9ldmVudF9jYWxsYmFjayk7CiB9CiAKLUZvbnRDYWNoZTo6Rm9udENhY2hlKHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlciwKK0ZvbnRDYWNoZTo6Rm9udENhY2hlKHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiogcmVzb3VyY2VfcHJvdmlkZXIsCiAgICAgICAgICAgICAgICAgICAgICBsb2FkZXI6OmZvbnQ6OlJlbW90ZVR5cGVmYWNlQ2FjaGUqIHJlbW90ZV90eXBlZmFjZV9jYWNoZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGV4dGVybmFsX3R5cGVmYWNlX2xvYWRfZXZlbnRfY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UpCkBAIC0xODAsMjMgKzE4MCwyNiBAQAogRm9udENhY2hlOjpHZXRDaGFyYWN0ZXJGYWxsYmFja1R5cGVmYWNlKGludDMyIHV0ZjMyX2NoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJfdHJlZTo6Rm9udFN0eWxlJiBzdHlsZSkgewogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgIERDSEVDSyhyZXNvdXJjZV9wcm92aWRlcigpKTsKICAgcmV0dXJuIEdldENhY2hlZExvY2FsVHlwZWZhY2UoCi0gICAgICByZXNvdXJjZV9wcm92aWRlcl8tPkdldENoYXJhY3RlckZhbGxiYWNrVHlwZWZhY2UodXRmMzJfY2hhcmFjdGVyLCBzdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZV8pKTsKKyAgICAgIHJlc291cmNlX3Byb3ZpZGVyKCktPkdldENoYXJhY3RlckZhbGxiYWNrVHlwZWZhY2UodXRmMzJfY2hhcmFjdGVyLCBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VfKSk7CiB9CiAKIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkdseXBoQnVmZmVyPiBGb250Q2FjaGU6OkNyZWF0ZUdseXBoQnVmZmVyKAogICAgIGNvbnN0IGNoYXIxNiogdGV4dF9idWZmZXIsIGludDMyIHRleHRfbGVuZ3RoLCBib29sIGlzX3J0bCwKICAgICBGb250TGlzdCogZm9udF9saXN0KSB7Ci0gIHJldHVybiByZXNvdXJjZV9wcm92aWRlcl8tPkNyZWF0ZUdseXBoQnVmZmVyKHRleHRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHRleHRfbGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VfLCBpc19ydGwsIGZvbnRfbGlzdCk7CisgIERDSEVDSyhyZXNvdXJjZV9wcm92aWRlcigpKTsKKyAgcmV0dXJuIHJlc291cmNlX3Byb3ZpZGVyKCktPkNyZWF0ZUdseXBoQnVmZmVyKAorICAgICAgdGV4dF9idWZmZXIsIHN0YXRpY19jYXN0PHNpemVfdD4odGV4dF9sZW5ndGgpLCBsYW5ndWFnZV8sIGlzX3J0bCwKKyAgICAgIGZvbnRfbGlzdCk7CiB9CiAKIGZsb2F0IEZvbnRDYWNoZTo6R2V0VGV4dFdpZHRoKGNvbnN0IGNoYXIxNiogdGV4dF9idWZmZXIsIGludDMyIHRleHRfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19ydGwsIEZvbnRMaXN0KiBmb250X2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6Rm9udFZlY3RvciogbWF5YmVfdXNlZF9mb250cykgewotICByZXR1cm4gcmVzb3VyY2VfcHJvdmlkZXJfLT5HZXRUZXh0V2lkdGgoCisgIERDSEVDSyhyZXNvdXJjZV9wcm92aWRlcigpKTsKKyAgcmV0dXJuIHJlc291cmNlX3Byb3ZpZGVyKCktPkdldFRleHRXaWR0aCgKICAgICAgIHRleHRfYnVmZmVyLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRleHRfbGVuZ3RoKSwgbGFuZ3VhZ2VfLCBpc19ydGwsCiAgICAgICBmb250X2xpc3QsIG1heWJlX3VzZWRfZm9udHMpOwogfQpAQCAtMzQyLDYgKzM0NSw3IEBACiBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpGb250PiBGb250Q2FjaGU6OlRyeUdldExvY2FsRm9udCgKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmFtaWx5LCByZW5kZXJfdHJlZTo6Rm9udFN0eWxlIHN0eWxlLCBmbG9hdCBzaXplLAogICAgIEZvbnRMaXN0Rm9udDo6U3RhdGUqIHN0YXRlKSB7CisgIERDSEVDSyhyZXNvdXJjZV9wcm92aWRlcigpKTsKICAgLy8gT25seSByZXF1ZXN0IHRoZSBsb2NhbCBmb250IGZyb20gdGhlIHJlc291cmNlIHByb3ZpZGVyIGlmIHRoZSBmYW1pbHkgaXMKICAgLy8gZW1wdHkgb3IgdGhlIHJlc291cmNlIHByb3ZpZGVyIGFjdHVhbGx5IGhhcyB0aGUgZmFtaWx5LiBUaGUgcmVhc29uIGZvciB0aGlzCiAgIC8vIGlzIHRoYXQgdGhlIHJlc291cmNlIHByb3ZpZGVyJ3MgfEdldExvY2FsVHlwZWZhY2UoKXwgaXMgZ3VhcmFudGVlZCB0bwpAQCAtMzQ5LDE0ICszNTMsMTQgQEAKICAgLy8gdGhlIHN1YnNlcXVlbnQgZm9udHMgaW4gdGhlIGZvbnQgbGlzdCBuZWVkIHRvIGJlIGF0dGVtcHRlZC4gQW4gZW1wdHkgZmFtaWx5CiAgIC8vIHNpZ25pZmllcyB1c2luZyB0aGUgZGVmYXVsdCBmb250LgogICBpZiAoIWZhbWlseS5lbXB0eSgpICYmCi0gICAgICAhcmVzb3VyY2VfcHJvdmlkZXJfLT5IYXNMb2NhbEZvbnRGYW1pbHkoZmFtaWx5LmNfc3RyKCkpKSB7CisgICAgICAhcmVzb3VyY2VfcHJvdmlkZXIoKS0+SGFzTG9jYWxGb250RmFtaWx5KGZhbWlseS5jX3N0cigpKSkgewogICAgICpzdGF0ZSA9IEZvbnRMaXN0Rm9udDo6a1VuYXZhaWxhYmxlU3RhdGU7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0gZWxzZSB7CiAgICAgKnN0YXRlID0gRm9udExpc3RGb250OjprTG9hZGVkU3RhdGU7CiAgICAgcmV0dXJuIEdldEZvbnRGcm9tVHlwZWZhY2VBbmRTaXplKAogICAgICAgICBHZXRDYWNoZWRMb2NhbFR5cGVmYWNlKAotICAgICAgICAgICAgcmVzb3VyY2VfcHJvdmlkZXJfLT5HZXRMb2NhbFR5cGVmYWNlKGZhbWlseS5jX3N0cigpLCBzdHlsZSkpLAorICAgICAgICAgICAgcmVzb3VyY2VfcHJvdmlkZXIoKS0+R2V0TG9jYWxUeXBlZmFjZShmYW1pbHkuY19zdHIoKSwgc3R5bGUpKSwKICAgICAgICAgc2l6ZSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2ZvbnRfY2FjaGUuaCBiL3NyYy9jb2JhbHQvZG9tL2ZvbnRfY2FjaGUuaAppbmRleCBkZDc0YzRlLi5lM2E1NzRhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9mb250X2NhY2hlLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZm9udF9jYWNoZS5oCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgdHlwZWRlZiBzdGQ6Om1hcDxDaGFyYWN0ZXJGYWxsYmFja0tleSwgQ2hhcmFjdGVyRmFsbGJhY2tUeXBlZmFjZU1hcD4KICAgICAgIENoYXJhY3RlckZhbGxiYWNrVHlwZWZhY2VNYXBzOwogCi0gIEZvbnRDYWNoZShyZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsCisgIEZvbnRDYWNoZShyZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlcioqIHJlc291cmNlX3Byb3ZpZGVyLAogICAgICAgICAgICAgbG9hZGVyOjpmb250OjpSZW1vdGVUeXBlZmFjZUNhY2hlKiByZW1vdGVfdHlwZWZhY2VfY2FjaGUsCiAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBleHRlcm5hbF90eXBlZmFjZV9sb2FkX2V2ZW50X2NhbGxiYWNrLAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlKTsKQEAgLTIzNCw2ICsyMzQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl90cmVlOjpGb250VmVjdG9yKiBtYXliZV91c2VkX2ZvbnRzKTsKIAogIHByaXZhdGU6CisgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gKnJlc291cmNlX3Byb3ZpZGVyXzsKKyAgfQorCiAgIHZvaWQgUHJvY2Vzc0luYWN0aXZlRm9udExpc3RzKGNvbnN0IGJhc2U6OlRpbWVUaWNrcyYgY3VycmVudF90aW1lKTsKICAgdm9pZCBQcm9jZXNzSW5hY3RpdmVGb250cyhjb25zdCBiYXNlOjpUaW1lVGlja3MmIGN1cnJlbnRfdGltZSk7CiAKQEAgLTI2OSw3ICsyNzMsNyBAQAogICAvLyBzbyB0aGF0IHRoZXknbGwgYmUgcmUtcmVxdWVzdGVkIGZyb20gdGhlIGNhY2hlLgogICB2b2lkIE9uUmVtb3RlVHlwZWZhY2VMb2FkRXZlbnQoY29uc3QgR1VSTCYgdXJsKTsKIAotICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogY29uc3QgcmVzb3VyY2VfcHJvdmlkZXJfOworICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlcioqIHJlc291cmNlX3Byb3ZpZGVyXzsKIAogICAvLyBUT0RPOiBFeHBsb3JlIGVsaW1pbmF0aW5nIHRoZSByZW1vdGUgdHlwZWZhY2UgY2FjaGUgYW5kIG1vdmluZyBpdHMKICAgLy8gbG9naWMgaW50byB0aGUgZm9udCBjYWNoZSB3aGVuIHRoZSBsb2FkZXIgaW50ZXJmYWNlIGltcHJvdmVzLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmNjCmluZGV4IDJlZDc0ZmQuLjA2ZTE2YzAyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmNjCkBAIC02NjQsMTEgKzY2NCwxMyBAQAogCiB2b2lkIEhUTUxFbGVtZW50OjpJbnZhbGlkYXRlTGF5b3V0Qm94ZXNGcm9tTm9kZUFuZEFuY2VzdG9ycygpIHsKICAgbGF5b3V0X2JveGVzXy5yZXNldCgpOworICBjYWNoZWRfYmFja2dyb3VuZF9pbWFnZXNfLmNsZWFyKCk7CiAgIE5vZGU6OkludmFsaWRhdGVMYXlvdXRCb3hlc0Zyb21Ob2RlQW5kQW5jZXN0b3JzKCk7CiB9CiAKIHZvaWQgSFRNTEVsZW1lbnQ6OkludmFsaWRhdGVMYXlvdXRCb3hlc0Zyb21Ob2RlQW5kRGVzY2VuZGFudHMoKSB7CiAgIGxheW91dF9ib3hlc18ucmVzZXQoKTsKKyAgY2FjaGVkX2JhY2tncm91bmRfaW1hZ2VzXy5jbGVhcigpOwogICBOb2RlOjpJbnZhbGlkYXRlTGF5b3V0Qm94ZXNGcm9tTm9kZUFuZERlc2NlbmRhbnRzKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9jb250ZXh0LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuY2MKaW5kZXggZWVlMzBlYi4uYzdhOTk3NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuY2MKQEAgLTI3LDcgKzI3LDcgQEAKICAgICBtZWRpYTo6V2ViTWVkaWFQbGF5ZXJGYWN0b3J5KiB3ZWJfbWVkaWFfcGxheWVyX2ZhY3RvcnksCiAgICAgc2NyaXB0OjpTY3JpcHRSdW5uZXIqIHNjcmlwdF9ydW5uZXIsCiAgICAgTWVkaWFTb3VyY2U6OlJlZ2lzdHJ5KiBtZWRpYV9zb3VyY2VfcmVnaXN0cnksCi0gICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyLAorICAgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiogcmVzb3VyY2VfcHJvdmlkZXIsCiAgICAgbG9hZGVyOjppbWFnZTo6SW1hZ2VDYWNoZSogaW1hZ2VfY2FjaGUsCiAgICAgbG9hZGVyOjppbWFnZTo6UmVkdWNlZENhY2hlQ2FwYWNpdHlNYW5hZ2VyKgogICAgICAgICByZWR1Y2VkX2ltYWdlX2NhY2hlX2NhcGFjaXR5X21hbmFnZXIsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuaAppbmRleCA4Y2RjODZiLi5hNzUxYjAzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9jb250ZXh0LmgKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpXZWJNZWRpYVBsYXllckZhY3RvcnkqIHdlYl9tZWRpYV9wbGF5ZXJfZmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6U2NyaXB0UnVubmVyKiBzY3JpcHRfcnVubmVyLAogICAgICAgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlZ2lzdHJ5KiBtZWRpYV9zb3VyY2VfcmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlcioqIHJlc291cmNlX3Byb3ZpZGVyLAogICAgICAgICAgICAgICAgICAgICAgbG9hZGVyOjppbWFnZTo6SW1hZ2VDYWNoZSogaW1hZ2VfY2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICBsb2FkZXI6OmltYWdlOjpSZWR1Y2VkQ2FjaGVDYXBhY2l0eU1hbmFnZXIqCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlZF9pbWFnZV9jYWNoZV9jYXBhY2l0eV9tYW5hZ2VyLApAQCAtNzUsNyArNzUsNyBAQAogICAgIHJldHVybiBtZWRpYV9zb3VyY2VfcmVnaXN0cnlfOwogICB9CiAKLSAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKCkgY29uc3QgeworICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlcioqIHJlc291cmNlX3Byb3ZpZGVyKCkgY29uc3QgewogICAgIHJldHVybiByZXNvdXJjZV9wcm92aWRlcl87CiAgIH0KIApAQCAtMTA4LDcgKzEwOCw3IEBACiAgIG1lZGlhOjpXZWJNZWRpYVBsYXllckZhY3RvcnkqIGNvbnN0IHdlYl9tZWRpYV9wbGF5ZXJfZmFjdG9yeV87CiAgIHNjcmlwdDo6U2NyaXB0UnVubmVyKiBjb25zdCBzY3JpcHRfcnVubmVyXzsKICAgTWVkaWFTb3VyY2U6OlJlZ2lzdHJ5KiBjb25zdCBtZWRpYV9zb3VyY2VfcmVnaXN0cnlfOwotICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXJfOworICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlcioqIHJlc291cmNlX3Byb3ZpZGVyXzsKICAgbG9hZGVyOjppbWFnZTo6SW1hZ2VDYWNoZSogY29uc3QgaW1hZ2VfY2FjaGVfOwogICBsb2FkZXI6OmltYWdlOjpSZWR1Y2VkQ2FjaGVDYXBhY2l0eU1hbmFnZXIqIGNvbnN0CiAgICAgICByZWR1Y2VkX2ltYWdlX2NhY2hlX2NhcGFjaXR5X21hbmFnZXJfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmNjCmluZGV4IDU1ZDEyOTUuLmUwZjYzMmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuY2MKQEAgLTUwOSw3ICs1MDksOSBAQAogICAgIGh0bWxfZWxlbWVudF9jb250ZXh0KCktPmltYWdlX2NhY2hlKCktPlB1cmdlKCk7CiAgICAgLy8gRW5zdXJlIHRoYXQgYWxsIHJlc291cmNlIGRlc3RydWN0aW9ucyBhcmUgZmx1c2hlZCBhbmQgdGhlIG1lbW9yeSBpcwogICAgIC8vIHJlY2xhaW1lZC4KLSAgICBodG1sX2VsZW1lbnRfY29udGV4dCgpLT5yZXNvdXJjZV9wcm92aWRlcigpLT5GaW5pc2goKTsKKyAgICBpZiAoKmh0bWxfZWxlbWVudF9jb250ZXh0KCktPnJlc291cmNlX3Byb3ZpZGVyKCkpIHsKKyAgICAgICgqaHRtbF9lbGVtZW50X2NvbnRleHQoKS0+cmVzb3VyY2VfcHJvdmlkZXIoKSktPkZpbmlzaCgpOworICAgIH0KICAgfQogCiAgIHBsYXllcl8ucmVzZXQoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL25vZGUuY2MgYi9zcmMvY29iYWx0L2RvbS9ub2RlLmNjCmluZGV4IDU5YWVkMzQuLjZjZTI5NTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL25vZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbm9kZS5jYwpAQCAtMzcsNiArMzcsMTMgQEAKICNpbmNsdWRlICJjb2JhbHQvZG9tL25vZGVfbGlzdF9saXZlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS90ZXh0LmgiCisjaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKKyNpZiBTQl9IQVMoQ09SRV9EVU1QX0hBTkRMRVJfU1VQUE9SVCkKKyNkZWZpbmUgSEFORExFX0NPUkVfRFVNUAorI2luY2x1ZGUgInN0YXJib2FyZC9wczQvY29yZV9kdW1wX2hhbmRsZXIuaCIKKyNlbmRpZiAgLy8gU0JfSEFTKENPUkVfRFVNUF9IQU5ETEVSX1NVUFBPUlQpCisjZW5kaWYgIC8vIGRlZmluZWQoT1NfU1RBUkJPQVJEKQogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBkb20gewpAQCAtNDksOCArNTYsMjUgQEAKICAgTm9kZUNvdW50TG9nKCkgOiBjb3VudCgwKSB7CiAgICAgYmFzZTo6VXNlckxvZzo6UmVnaXN0ZXIoYmFzZTo6VXNlckxvZzo6a05vZGVDb3VudEluZGV4LCAiTm9kZUNudCIsICZjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY291bnQpKTsKKyNpZiBkZWZpbmVkKEhBTkRMRV9DT1JFX0RVTVApCisgICAgU2JDb3JlRHVtcFJlZ2lzdGVySGFuZGxlcihDb3JlRHVtcEhhbmRsZXIsIHRoaXMpOworI2VuZGlmCiAgIH0KLSAgfk5vZGVDb3VudExvZygpIHsgYmFzZTo6VXNlckxvZzo6RGVyZWdpc3RlcihiYXNlOjpVc2VyTG9nOjprTm9kZUNvdW50SW5kZXgpOyB9CisKKyAgfk5vZGVDb3VudExvZygpIHsKKyNpZiBkZWZpbmVkKEhBTkRMRV9DT1JFX0RVTVApCisgICAgU2JDb3JlRHVtcFVucmVnaXN0ZXJIYW5kbGVyKENvcmVEdW1wSGFuZGxlciwgdGhpcyk7CisjZW5kaWYKKyAgICBiYXNlOjpVc2VyTG9nOjpEZXJlZ2lzdGVyKGJhc2U6OlVzZXJMb2c6OmtOb2RlQ291bnRJbmRleCk7CisgIH0KKworI2lmIGRlZmluZWQoSEFORExFX0NPUkVfRFVNUCkKKyAgc3RhdGljIHZvaWQgQ29yZUR1bXBIYW5kbGVyKHZvaWQqIGNvbnRleHQpIHsKKyAgICBTYkNvcmVEdW1wTG9nSW50ZWdlcigKKyAgICAgICAgIlRvdGFsIG51bWJlciBvZiBub2RlcyIsCisgICAgICAgIHN0YXRpY19jYXN0PE5vZGVDb3VudExvZyo+KGNvbnRleHQpLT5jb3VudCk7CisgIH0KKyNlbmRpZgogCiAgIGludCBjb3VudDsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93LmNjIGIvc3JjL2NvYmFsdC9kb20vd2luZG93LmNjCmluZGV4IDA1NGY5OTUuLmZjM2Q4ODEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5jYworKysgYi9zcmMvY29iYWx0L2RvbS93aW5kb3cuY2MKQEAgLTYyLDcgKzYyLDcgQEAKIAogV2luZG93OjpXaW5kb3coaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjc3NvbTo6Q1NTUGFyc2VyKiBjc3NfcGFyc2VyLAogICAgICAgICAgICAgICAgUGFyc2VyKiBkb21fcGFyc2VyLCBsb2FkZXI6OkZldGNoZXJGYWN0b3J5KiBmZXRjaGVyX2ZhY3RvcnksCi0gICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsCisgICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlcioqIHJlc291cmNlX3Byb3ZpZGVyLAogICAgICAgICAgICAgICAgbG9hZGVyOjppbWFnZTo6SW1hZ2VDYWNoZSogaW1hZ2VfY2FjaGUsCiAgICAgICAgICAgICAgICBsb2FkZXI6OmltYWdlOjpSZWR1Y2VkQ2FjaGVDYXBhY2l0eU1hbmFnZXIqCiAgICAgICAgICAgICAgICAgICAgcmVkdWNlZF9pbWFnZV9jYWNoZV9jYXBhY2l0eV9tYW5hZ2VyLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93LmggYi9zcmMvY29iYWx0L2RvbS93aW5kb3cuaAppbmRleCA3ODUzYWRhLi4zYTEwMDk1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS93aW5kb3cuaAorKysgYi9zcmMvY29iYWx0L2RvbS93aW5kb3cuaApAQCAtODcsNyArODcsNyBAQAogCiAgIFdpbmRvdyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNzc29tOjpDU1NQYXJzZXIqIGNzc19wYXJzZXIsCiAgICAgICAgICBQYXJzZXIqIGRvbV9wYXJzZXIsIGxvYWRlcjo6RmV0Y2hlckZhY3RvcnkqIGZldGNoZXJfZmFjdG9yeSwKLSAgICAgICAgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlciwKKyAgICAgICAgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiogcmVzb3VyY2VfcHJvdmlkZXIsCiAgICAgICAgICBsb2FkZXI6OmltYWdlOjpJbWFnZUNhY2hlKiBpbWFnZV9jYWNoZSwKICAgICAgICAgIGxvYWRlcjo6aW1hZ2U6OlJlZHVjZWRDYWNoZUNhcGFjaXR5TWFuYWdlcioKICAgICAgICAgICAgICByZWR1Y2VkX2ltYWdlX2NhY2hlX2NhcGFjaXR5X21hbmFnZXIsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX3BhcnNlcl93cmFwcGVyLmNjIGIvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2xpYnhtbF9wYXJzZXJfd3JhcHBlci5jYwppbmRleCA1ZTMzMWY3Li5lZjE5Yzc2MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2xpYnhtbF9wYXJzZXJfd3JhcHBlci5jYworKysgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX3BhcnNlcl93cmFwcGVyLmNjCkBAIC0yNCwxMSArMjQsODEgQEAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2NvbW1lbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2VsZW1lbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL3RleHQuaCIKKyNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgorI2lmIFNCX0hBUyhDT1JFX0RVTVBfSEFORExFUl9TVVBQT1JUKQorI2RlZmluZSBIQU5ETEVfQ09SRV9EVU1QCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3BzNC9jb3JlX2R1bXBfaGFuZGxlci5oIgorI2VuZGlmICAvLyBTQl9IQVMoQ09SRV9EVU1QX0hBTkRMRVJfU1VQUE9SVCkKKyNlbmRpZiAgLy8gZGVmaW5lZChPU19TVEFSQk9BUkQpCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGRvbV9wYXJzZXIgewogbmFtZXNwYWNlIHsKIAorI2lmIGRlZmluZWQoSEFORExFX0NPUkVfRFVNUCkKKworY2xhc3MgTGlieG1sUGFyc2VyV3JhcHBlckxvZyB7CisgcHVibGljOgorICBMaWJ4bWxQYXJzZXJXcmFwcGVyTG9nKCkKKyAgICAgIDogdG90YWxfcGFyc2VkX2J5dGVzXygwKSwKKyAgICAgICAgdG90YWxfd2FybmluZ19jb3VudF8oMCksCisgICAgICAgIHRvdGFsX2Vycm9yX2NvdW50XygwKSwKKyAgICAgICAgdG90YWxfZmF0YWxfY291bnRfKDApIHsKKyAgICBTYkNvcmVEdW1wUmVnaXN0ZXJIYW5kbGVyKENvcmVEdW1wSGFuZGxlciwgdGhpcyk7CisgIH0KKyAgfkxpYnhtbFBhcnNlcldyYXBwZXJMb2coKSB7CisgICAgU2JDb3JlRHVtcFVucmVnaXN0ZXJIYW5kbGVyKENvcmVEdW1wSGFuZGxlciwgdGhpcyk7CisgIH0KKworICBzdGF0aWMgdm9pZCBDb3JlRHVtcEhhbmRsZXIodm9pZCogY29udGV4dCkgeworICAgIFNiQ29yZUR1bXBMb2dJbnRlZ2VyKAorICAgICAgICAiTGlieG1sUGFyc2VyV3JhcHBlciB0b3RhbCBwYXJzZWQgYnl0ZXMiLAorICAgICAgICBzdGF0aWNfY2FzdDxMaWJ4bWxQYXJzZXJXcmFwcGVyTG9nKj4oY29udGV4dCktPnRvdGFsX3BhcnNlZF9ieXRlc18pOworICAgIFNiQ29yZUR1bXBMb2dJbnRlZ2VyKAorICAgICAgICAiTGlieG1sUGFyc2VyV3JhcHBlciB0b3RhbCB3YXJuaW5nIGNvdW50IiwKKyAgICAgICAgc3RhdGljX2Nhc3Q8TGlieG1sUGFyc2VyV3JhcHBlckxvZyo+KGNvbnRleHQpLT50b3RhbF93YXJuaW5nX2NvdW50Xyk7CisgICAgU2JDb3JlRHVtcExvZ0ludGVnZXIoCisgICAgICAgICJMaWJ4bWxQYXJzZXJXcmFwcGVyIHRvdGFsIGVycm9yIGNvdW50IiwKKyAgICAgICAgc3RhdGljX2Nhc3Q8TGlieG1sUGFyc2VyV3JhcHBlckxvZyo+KGNvbnRleHQpLT50b3RhbF9lcnJvcl9jb3VudF8pOworICAgIFNiQ29yZUR1bXBMb2dJbnRlZ2VyKAorICAgICAgICAiTGlieG1sUGFyc2VyV3JhcHBlciB0b3RhbCBmYXRhbCBlcnJvciBjb3VudCIsCisgICAgICAgIHN0YXRpY19jYXN0PExpYnhtbFBhcnNlcldyYXBwZXJMb2cqPihjb250ZXh0KS0+dG90YWxfZmF0YWxfY291bnRfKTsKKyAgICBTYkNvcmVEdW1wTG9nU3RyaW5nKCJMaWJ4bWxQYXJzZXJXcmFwcGVyIGxhc3QgZmF0YWwgZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TGlieG1sUGFyc2VyV3JhcHBlckxvZyo+KGNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5sYXN0X2ZhdGFsX21lc3NhZ2VfLmNfc3RyKCkpOworICB9CisKKyAgdm9pZCBJbmNyZW1lbnRQYXJzZWRCeXRlcyhpbnQgbGVuZ3RoKSB7IHRvdGFsX3BhcnNlZF9ieXRlc18gKz0gbGVuZ3RoOyB9CisgIHZvaWQgTG9nUGFyc2luZ0lzc3VlKExpYnhtbFBhcnNlcldyYXBwZXI6Oklzc3VlU2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgICAgaWYgKHNldmVyaXR5ID09IExpYnhtbFBhcnNlcldyYXBwZXI6OmtXYXJuaW5nKSB7CisgICAgICB0b3RhbF93YXJuaW5nX2NvdW50XysrOworICAgIH0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gTGlieG1sUGFyc2VyV3JhcHBlcjo6a0Vycm9yKSB7CisgICAgICB0b3RhbF9lcnJvcl9jb3VudF8rKzsKKyAgICB9IGVsc2UgaWYgKHNldmVyaXR5ID09IExpYnhtbFBhcnNlcldyYXBwZXI6OmtGYXRhbCkgeworICAgICAgdG90YWxfZmF0YWxfY291bnRfKys7CisgICAgICBsYXN0X2ZhdGFsX21lc3NhZ2VfID0gbWVzc2FnZTsKKyAgICB9IGVsc2UgeworICAgICAgTk9UUkVBQ0hFRCgpOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgaW50IHRvdGFsX3BhcnNlZF9ieXRlc187CisgIGludCB0b3RhbF93YXJuaW5nX2NvdW50XzsKKyAgaW50IHRvdGFsX2Vycm9yX2NvdW50XzsKKyAgaW50IHRvdGFsX2ZhdGFsX2NvdW50XzsKKyAgc3RkOjpzdHJpbmcgbGFzdF9mYXRhbF9tZXNzYWdlXzsKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExpYnhtbFBhcnNlcldyYXBwZXJMb2cpOworfTsKKworYmFzZTo6TGF6eUluc3RhbmNlPExpYnhtbFBhcnNlcldyYXBwZXJMb2c+IGxpYnhtbF9wYXJzZXJfd3JhcHBlcl9sb2cgPQorICAgIExBWllfSU5TVEFOQ0VfSU5JVElBTElaRVI7CisKKyNlbmRpZiAgLy8gZGVmaW5lZChIQU5ETEVfQ09SRV9EVU1QKQorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gSGVscGVycwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTIyNiwxMiArMjk2LDE4IEBACiAgIGlmIChzZXZlcml0eSA8IExpYnhtbFBhcnNlcldyYXBwZXI6OmtGYXRhbCkgewogICAgIExPRyhXQVJOSU5HKSA8PCAiTGlieG1sICIKICAgICAgICAgICAgICAgICAgPDwgKHNldmVyaXR5ID09IGtXYXJuaW5nID8gIldhcm5pbmc6ICIgOiAiRXJyb3I6ICIpIDw8IG1lc3NhZ2U7Ci0gIH0gZWxzZSB7CisgIH0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gTGlieG1sUGFyc2VyV3JhcHBlcjo6a0ZhdGFsKSB7CiAgICAgTE9HKEVSUk9SKSA8PCAiTGlieG1sIEZhdGFsIEVycm9yOiAiIDw8IG1lc3NhZ2U7CiAgICAgaWYgKCFlcnJvcl9jYWxsYmFja18uaXNfbnVsbCgpKSB7CiAgICAgICBlcnJvcl9jYWxsYmFja18uUnVuKG1lc3NhZ2UpOwogICAgIH0KKyAgfSBlbHNlIHsKKyAgICBOT1RSRUFDSEVEKCk7CiAgIH0KKworI2lmIGRlZmluZWQoSEFORExFX0NPUkVfRFVNUCkKKyAgbGlieG1sX3BhcnNlcl93cmFwcGVyX2xvZy5HZXQoKS5Mb2dQYXJzaW5nSXNzdWUoc2V2ZXJpdHksIG1lc3NhZ2UpOworI2VuZGlmCiB9CiAKIHZvaWQgTGlieG1sUGFyc2VyV3JhcHBlcjo6T25DREFUQUJsb2NrKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewpAQCAtMjYxLDYgKzMzNywxMCBAQAogICAgIHJldHVybiBtYXhfc2V2ZXJpdHlfOwogICB9CiAKKyNpZiBkZWZpbmVkKEhBTkRMRV9DT1JFX0RVTVApCisgIGxpYnhtbF9wYXJzZXJfd3JhcHBlcl9sb2cuR2V0KCkuSW5jcmVtZW50UGFyc2VkQnl0ZXMoc3RhdGljX2Nhc3Q8aW50PihzaXplKSk7CisjZW5kaWYKKwogICByZXR1cm4gbWF4X3NldmVyaXR5XzsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X21hbmFnZXIuY2MgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfbWFuYWdlci5jYwppbmRleCBkYTE2NWY5Li5hZGNhNTg1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfbWFuYWdlci5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfbWFuYWdlci5jYwpAQCAtNTEsNiArNTEsOSBAQAogICAvLyBDYWxsZWQgdG8gcGVyZm9ybSBhIHN5bmNocm9ub3VzIGxheW91dC4KICAgdm9pZCBEb1N5bmNocm9ub3VzTGF5b3V0KCk7CiAKKyAgdm9pZCBTdXNwZW5kKCk7CisgIHZvaWQgUmVzdW1lKCk7CisKICBwcml2YXRlOgogICB2b2lkIFN0YXJ0TGF5b3V0VGltZXIoKTsKICAgdm9pZCBEb0xheW91dEFuZFByb2R1Y2VSZW5kZXJUcmVlKCk7CkBAIC04OCw2ICs5MSw4IEBACiAgIC8vIHRoZSBib3ggdHJlZSByZW1haW5zIHZhbGlkLgogICBzY29wZWRfcmVmcHRyPEJsb2NrTGV2ZWxCbG9ja0NvbnRhaW5lckJveD4gaW5pdGlhbF9jb250YWluaW5nX2Jsb2NrXzsKIAorICBib29sIHN1c3BlbmRlZF87CisKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEltcGwpOwogfTsKIApAQCAtMTA4LDcgKzExMyw4IEBACiAgICAgICBsYXlvdXRfdGltZXJfKHRydWUsIHRydWUsIHRydWUpLAogICAgICAgZG9tX21heF9lbGVtZW50X2RlcHRoXyhkb21fbWF4X2VsZW1lbnRfZGVwdGgpLAogICAgICAgbGF5b3V0X3JlZnJlc2hfcmF0ZV8obGF5b3V0X3JlZnJlc2hfcmF0ZSksCi0gICAgICBsYXlvdXRfc3RhdF90cmFja2VyXyhsYXlvdXRfc3RhdF90cmFja2VyKSB7CisgICAgICBsYXlvdXRfc3RhdF90cmFja2VyXyhsYXlvdXRfc3RhdF90cmFja2VyKSwKKyAgICAgIHN1c3BlbmRlZF8oZmFsc2UpIHsKICAgd2luZG93Xy0+ZG9jdW1lbnQoKS0+QWRkT2JzZXJ2ZXIodGhpcyk7CiAgIHdpbmRvd18tPlNldFN5bmNocm9ub3VzTGF5b3V0Q2FsbGJhY2soCiAgICAgICBiYXNlOjpCaW5kKCZJbXBsOjpEb1N5bmNocm9ub3VzTGF5b3V0LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7CkBAIC0xNjYsNiArMTcyLDEwIEBACiAKIHZvaWQgTGF5b3V0TWFuYWdlcjo6SW1wbDo6RG9TeW5jaHJvbm91c0xheW91dCgpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmxheW91dCIsICJMYXlvdXRNYW5hZ2VyOjpJbXBsOjpEb1N5bmNocm9ub3VzTGF5b3V0KCkiKTsKKyAgaWYgKHN1c3BlbmRlZF8pIHsKKyAgICByZXR1cm47CisgIH0KKwogICBsYXlvdXQ6OlVwZGF0ZUNvbXB1dGVkU3R5bGVzQW5kTGF5b3V0Qm94VHJlZSgKICAgICAgIGxvY2FsZV8sIHdpbmRvd18tPmRvY3VtZW50KCksIGRvbV9tYXhfZWxlbWVudF9kZXB0aF8sCiAgICAgICB1c2VkX3N0eWxlX3Byb3ZpZGVyXy5nZXQoKSwgbGF5b3V0X3N0YXRfdHJhY2tlcl8sCkBAIC0xNzMsNiArMTgzLDI2IEBACiAgICAgICAmaW5pdGlhbF9jb250YWluaW5nX2Jsb2NrXyk7CiB9CiAKK3ZvaWQgTGF5b3V0TWFuYWdlcjo6SW1wbDo6U3VzcGVuZCgpIHsKKyAgLy8gTWFyayB0aGF0IHdlIGFyZSBzdXNwZW5kZWQgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8gcGVyZm9ybSBhbnkgbGF5b3V0cy4KKyAgc3VzcGVuZGVkXyA9IHRydWU7CisKKyAgLy8gQ2xlYXIgb3VyIHJlZmVyZW5jZSB0byB0aGUgaW5pdGlhbCBjb250YWluaW5nIGJsb2NrIHRvIGFsbG93IGFueSByZXNvdXJjZXMKKyAgLy8gbGlrZSBpbWFnZXMgdGhhdCB3ZXJlIHJlZmVyZW5jZWQgYnkgaXQgdG8gYmUgcmVsZWFzZWQuCisgIGluaXRpYWxfY29udGFpbmluZ19ibG9ja18gPSBOVUxMOworCisgIC8vIEludmFsaWRhdGUgdGhlIGRvY3VtZW50J3MgbGF5b3V0IHNvIHRoYXQgYWxsIHJlZmVyZW5jZXMgdG8gYW55IHJlc291cmNlcworICAvLyBzdWNoIGFzIGltYWdlcyB3aWxsIGJlIHJlbGVhc2VkLgorICB3aW5kb3dfLT5kb2N1bWVudCgpLT5JbnZhbGlkYXRlTGF5b3V0KCk7Cit9CisKK3ZvaWQgTGF5b3V0TWFuYWdlcjo6SW1wbDo6UmVzdW1lKCkgeworICAvLyBNYXJrIHRoYXQgd2UgYXJlIG5vIGxvbmdlciBzdXNwZW5kZWQgYW5kIGluZGljYXRlIHRoYXQgdGhlIGxheW91dCBpcworICAvLyBkaXJ0eSBzaW5jZSB3aGVuIFN1c3BlbmQoKSB3YXMgY2FsbGVkIHdlIGludmFsaWRhdGVkIG91ciBwcmV2aW91cyBsYXlvdXQuCisgIGxheW91dF9kaXJ0eV8gPSB0cnVlOworICBzdXNwZW5kZWRfID0gZmFsc2U7Cit9CisKICNpZiBkZWZpbmVkKEVOQUJMRV9URVNUX1JVTk5FUikKIHZvaWQgTGF5b3V0TWFuYWdlcjo6SW1wbDo6RG9UZXN0UnVubmVyTGF5b3V0Q2FsbGJhY2soKSB7CiAgIERDSEVDS19FUShrVGVzdFJ1bm5lck1vZGUsIGxheW91dF90cmlnZ2VyXyk7CkBAIC0yMTEsNiArMjQxLDggQEAKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmxheW91dCIsCiAgICAgICAgICAgICAgICAiTGF5b3V0TWFuYWdlcjo6SW1wbDo6RG9MYXlvdXRBbmRQcm9kdWNlUmVuZGVyVHJlZSgpIik7CiAKKyAgaWYgKHN1c3BlbmRlZF8pIHJldHVybjsKKwogICBjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6RG9jdW1lbnQ+JiBkb2N1bWVudCA9IHdpbmRvd18tPmRvY3VtZW50KCk7CiAKICAgaWYgKCFkb2N1bWVudC0+aHRtbCgpKSB7CkBAIC0yODAsNSArMzEyLDggQEAKIAogTGF5b3V0TWFuYWdlcjo6fkxheW91dE1hbmFnZXIoKSB7fQogCit2b2lkIExheW91dE1hbmFnZXI6OlN1c3BlbmQoKSB7IGltcGxfLT5TdXNwZW5kKCk7IH0KK3ZvaWQgTGF5b3V0TWFuYWdlcjo6UmVzdW1lKCkgeyBpbXBsXy0+UmVzdW1lKCk7IH0KKwogfSAgLy8gbmFtZXNwYWNlIGxheW91dAogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X21hbmFnZXIuaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF9tYW5hZ2VyLmgKaW5kZXggM2M2MDIwNi4uNWQyZTE4OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X21hbmFnZXIuaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfbWFuYWdlci5oCkBAIC02OCw2ICs2OCw5IEBACiAgICAgICAgICAgICAgICAgTGF5b3V0U3RhdFRyYWNrZXIqIGxheW91dF9zdGF0X3RyYWNrZXIpOwogICB+TGF5b3V0TWFuYWdlcigpOwogCisgIHZvaWQgU3VzcGVuZCgpOworICB2b2lkIFJlc3VtZSgpOworCiAgcHJpdmF0ZToKICAgY2xhc3MgSW1wbDsKICAgY29uc3Qgc2NvcGVkX3B0cjxJbXBsPiBpbXBsXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L3JlcGxhY2VkX2JveC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L3JlcGxhY2VkX2JveC5jYwppbmRleCAxYjFjODY1Li4xYmU5ZTFhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9yZXBsYWNlZF9ib3guY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvcmVwbGFjZWRfYm94LmNjCkBAIC0yMCw3ICsyMCw5IEBACiAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tdG1fZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2NvbnRhaW5lcl9ib3guaCIKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2xldHRlcmJveGVkX2ltYWdlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC91c2VkX3N0eWxlLmgiCkBAIC00MiwxMCArNDQsMTEgQEAKIHVzaW5nIHJlbmRlcl90cmVlOjpDb21wb3NpdGlvbk5vZGU7CiB1c2luZyByZW5kZXJfdHJlZTo6RmlsdGVyTm9kZTsKIHVzaW5nIHJlbmRlcl90cmVlOjpJbWFnZU5vZGU7Cit1c2luZyByZW5kZXJfdHJlZTo6TWFwVG9NZXNoRmlsdGVyOwordXNpbmcgcmVuZGVyX3RyZWU6Ok5vZGU7CiB1c2luZyByZW5kZXJfdHJlZTo6UHVuY2hUaHJvdWdoVmlkZW9Ob2RlOwogdXNpbmcgcmVuZGVyX3RyZWU6OlJlY3ROb2RlOwogdXNpbmcgcmVuZGVyX3RyZWU6OlNvbGlkQ29sb3JCcnVzaDsKLXVzaW5nIHJlbmRlcl90cmVlOjpNYXBUb01lc2hGaWx0ZXI7CiAKIG5hbWVzcGFjZSB7CiAKQEAgLTI1OSw5ICsyNjIsMTQgQEAKICAgICAgIGNvbXBvc2l0aW9uX25vZGUsIGJhc2U6OkJpbmQoQW5pbWF0ZUNCLCByZXBsYWNlX2ltYWdlX2NiXywgc2V0X2JvdW5kc19jYl8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfYm94X3NpemUoKSkpOwogCi0gIC8vIFRPRE86IEFwcGx5IG1hcCB0byBtZXNoIGZpbHRlciBpZiBwcmVzZW50LgorICBOb2RlKiBhbmltYXRlX25vZGUgPSBuZXcgQW5pbWF0ZU5vZGUoYW5pbWF0ZV9ub2RlX2J1aWxkZXIsIGNvbXBvc2l0aW9uX25vZGUpOworCisgIGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbiogbXRtX2ZpbHRlcl9mdW5jdGlvbiA9CisgICAgICBjc3NvbTo6TVRNRnVuY3Rpb246OkV4dHJhY3RGcm9tRmlsdGVyTGlzdChjb21wdXRlZF9zdHlsZSgpLT5maWx0ZXIoKSk7CisKICAgYm9yZGVyX25vZGVfYnVpbGRlci0+QWRkQ2hpbGQoCi0gICAgICBuZXcgQW5pbWF0ZU5vZGUoYW5pbWF0ZV9ub2RlX2J1aWxkZXIsIGNvbXBvc2l0aW9uX25vZGUpKTsKKyAgICAgIG10bV9maWx0ZXJfZnVuY3Rpb24gPyBuZXcgRmlsdGVyTm9kZShNYXBUb01lc2hGaWx0ZXIoKSwgYW5pbWF0ZV9ub2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFuaW1hdGVfbm9kZSk7CiB9CiAKIHZvaWQgUmVwbGFjZWRCb3g6OlVwZGF0ZUNvbnRlbnRTaXplQW5kTWFyZ2lucygKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2RlY29kZXIuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL2RlY29kZXIuaAppbmRleCAzMWVkZTIwLi5mMzA3MDk3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9kZWNvZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZGVjb2Rlci5oCkBAIC00NCw2ICs0NCw4IEBACiAKICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBhbGwgZGF0YSBhcmUgc2VudCBpbiBhbmQgZGVjb2Rpbmcgc2hvdWxkIGJlIGZpbmFsaXplZC4KICAgdmlydHVhbCB2b2lkIEZpbmlzaCgpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgQWJvcnQoKSB7IE5PVFJFQUNIRUQoKSA8PCAiQWJvcnQgbm90IHN1cHBvcnRlZC4iOyB9CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgbG9hZGVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9mb250L3JlbW90ZV90eXBlZmFjZV9jYWNoZS5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvZm9udC9yZW1vdGVfdHlwZWZhY2VfY2FjaGUuaAppbmRleCA2OTJlNGUzLi43YTY5NGM4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9mb250L3JlbW90ZV90eXBlZmFjZV9jYWNoZS5oCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZvbnQvcmVtb3RlX3R5cGVmYWNlX2NhY2hlLmgKQEAgLTE5LDggKzE5LDkgQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZm9udC90eXBlZmFjZV9kZWNvZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvcmVzb3VyY2VfY2FjaGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvdHlwZWZhY2UuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiAKQEAgLTMzLDMzICszNCwxMCBAQAogbmFtZXNwYWNlIGxvYWRlciB7CiBuYW1lc3BhY2UgZm9udCB7CiAKLS8vIHxSZW1vdGVUeXBlZmFjZURlY29kZXJQcm92aWRlcnwgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHxSZXNvdXJjZUNhY2hlfCB0bwotLy8gY3JlYXRlIHR5cGVmYWNlIGRlY29kZXJzLCB3aXRob3V0IHJlcXVpcmluZyBpdCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZQotLy8gcmVuZGVyX3RyZWUuCi1zdHJ1Y3QgUmVtb3RlVHlwZWZhY2VEZWNvZGVyUHJvdmlkZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUmVtb3RlVHlwZWZhY2VEZWNvZGVyUHJvdmlkZXIoCi0gICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIpCi0gICAgICA6IHJlc291cmNlX3Byb3ZpZGVyXyhyZXNvdXJjZV9wcm92aWRlcikge30KLQotICBzY29wZWRfcHRyPERlY29kZXI+IENyZWF0ZURlY29kZXIoCi0gICAgICBjb25zdCBUeXBlZmFjZURlY29kZXI6OlN1Y2Nlc3NDYWxsYmFjayYgc3VjY2Vzc19jYWxsYmFjaywKLSAgICAgIGNvbnN0IFR5cGVmYWNlRGVjb2Rlcjo6RmFpbHVyZUNhbGxiYWNrJiBmYWlsdXJlX2NhbGxiYWNrLAotICAgICAgY29uc3QgVHlwZWZhY2VEZWNvZGVyOjpFcnJvckNhbGxiYWNrJiBlcnJvcl9jYWxsYmFjaykgY29uc3QgewotICAgIHJldHVybiBtYWtlX3Njb3BlZF9wdHI8RGVjb2Rlcj4oCi0gICAgICAgIG5ldyBUeXBlZmFjZURlY29kZXIocmVzb3VyY2VfcHJvdmlkZXJfLCBzdWNjZXNzX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVfY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcl87Ci19OwotCiAvLyB8UmVtb3RlVHlwZWZhY2VSZXNvdXJjZUNhY2hlVHlwZXwgcHJvdmlkZXMgdGhlIHR5cGVzIGFuZCBpbXBsZW1lbnRzIHRoZQogLy8gZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IHxSZXNvdXJjZUNhY2hlPENhY2hlVHlwZT58CiBzdHJ1Y3QgUmVtb3RlVHlwZWZhY2VSZXNvdXJjZUNhY2hlVHlwZSB7CiAgIHR5cGVkZWYgcmVuZGVyX3RyZWU6OlR5cGVmYWNlIFJlc291cmNlVHlwZTsKLSAgdHlwZWRlZiBSZW1vdGVUeXBlZmFjZURlY29kZXJQcm92aWRlciBEZWNvZGVyUHJvdmlkZXJUeXBlOwogCiAgIHN0YXRpYyB1aW50MzIgR2V0RXN0aW1hdGVkU2l6ZUluQnl0ZXMoCiAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFJlc291cmNlVHlwZT4mIHJlc291cmNlKSB7CkBAIC03NiwxNyArNTQsMTQgQEAKIHR5cGVkZWYgUmVzb3VyY2VDYWNoZTxSZW1vdGVUeXBlZmFjZVJlc291cmNlQ2FjaGVUeXBlPiBSZW1vdGVUeXBlZmFjZUNhY2hlOwogCiAvLyBDcmVhdGVUeXBlZmFjZUNhY2hlKCkgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGNyZWF0aW5nIGEgcmVtb3RlIHR5cGVmYWNlCi0vLyBjYWNoZSwgd2l0aG91dCByZXF1aXJpbmcgdGhlIGNhbGxlciB0byBkZWFsIHdpdGggdGhlIHR5cGVmYWNlIGRlY29kZXIKLS8vIHByb3ZpZGVyCisvLyBjYWNoZS4KIGlubGluZSBzdGF0aWMgc2NvcGVkX3B0cjxSZW1vdGVUeXBlZmFjZUNhY2hlPiBDcmVhdGVSZW1vdGVUeXBlZmFjZUNhY2hlKAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB1aW50MzIgY2FjaGVfY2FwYWNpdHksCi0gICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyLAotICAgIGxvYWRlcjo6RmV0Y2hlckZhY3RvcnkqIGZldGNoZXJfZmFjdG9yeSkgeworICAgIGxvYWRlcjo6TG9hZGVyRmFjdG9yeSogbG9hZGVyX2ZhY3RvcnkpIHsKICAgcmV0dXJuIG1ha2Vfc2NvcGVkX3B0cjxSZW1vdGVUeXBlZmFjZUNhY2hlPihuZXcgUmVtb3RlVHlwZWZhY2VDYWNoZSgKICAgICAgIG5hbWUsIGNhY2hlX2NhcGFjaXR5LAotICAgICAgbWFrZV9zY29wZWRfcHRyPFJlbW90ZVR5cGVmYWNlRGVjb2RlclByb3ZpZGVyPigKLSAgICAgICAgICBuZXcgUmVtb3RlVHlwZWZhY2VEZWNvZGVyUHJvdmlkZXIocmVzb3VyY2VfcHJvdmlkZXIpKSwKLSAgICAgIGZldGNoZXJfZmFjdG9yeSkpOworICAgICAgYmFzZTo6QmluZCgmbG9hZGVyOjpMb2FkZXJGYWN0b3J5OjpDcmVhdGVUeXBlZmFjZUxvYWRlciwKKyAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChsb2FkZXJfZmFjdG9yeSkpKSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBmb250CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9mb250L3R5cGVmYWNlX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9mb250L3R5cGVmYWNlX2RlY29kZXIuY2MKaW5kZXggYTBhNTdmNC4uMmY3NTU2ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvZm9udC90eXBlZmFjZV9kZWNvZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZvbnQvdHlwZWZhY2VfZGVjb2Rlci5jYwpAQCAtMjgsNyArMjgsOCBAQAogICAgIDogcmVzb3VyY2VfcHJvdmlkZXJfKHJlc291cmNlX3Byb3ZpZGVyKSwKICAgICAgIHN1Y2Nlc3NfY2FsbGJhY2tfKHN1Y2Nlc3NfY2FsbGJhY2spLAogICAgICAgZXJyb3JfY2FsbGJhY2tfKGVycm9yX2NhbGxiYWNrKSwKLSAgICAgIGlzX3Jhd19kYXRhX3Rvb19sYXJnZV8oZmFsc2UpIHsKKyAgICAgIGlzX3Jhd19kYXRhX3Rvb19sYXJnZV8oZmFsc2UpLAorICAgICAgYWJvcnRlZF8oZmFsc2UpIHsKICAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihmYWlsdXJlX2NhbGxiYWNrKTsKIAogICBEQ0hFQ0socmVzb3VyY2VfcHJvdmlkZXJfKTsKQEAgLTY5LDYgKzcwLDE3IEBACiAgICAgcmV0dXJuOwogICB9CiAKKyAgaWYgKGFib3J0ZWRfKSB7CisgICAgZXJyb3JfY2FsbGJhY2tfLlJ1bigKKyAgICAgICAgIlR5cGVmYWNlRGVjb2RlcidzIFJlc291cmNlUHJvdmlkZXIgaGFzIGJlZW4gZXh0ZXJuYWxseSBhYm9ydGVkLiIpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXJlc291cmNlX3Byb3ZpZGVyXykgeworICAgIGVycm9yX2NhbGxiYWNrXy5SdW4oCisgICAgICAgICJObyByZXNvdXJjZSBwcm92aWRlciB3YXMgcGFzc2VkIHRvIHRoZSBUeXBlZmFjZURlY29kZXIuIik7CisgICAgcmV0dXJuOworICB9CisKICAgc3RkOjpzdHJpbmcgZXJyb3Jfc3RyaW5nOwogICBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpUeXBlZmFjZT4gZGVjb2RlZF90eXBlZmFjZSA9CiAgICAgICByZXNvdXJjZV9wcm92aWRlcl8tPkNyZWF0ZVR5cGVmYWNlRnJvbVJhd0RhdGEocmF3X2RhdGFfLlBhc3MoKSwKQEAgLTgzLDYgKzk1LDggQEAKIAogdm9pZCBUeXBlZmFjZURlY29kZXI6OlJlbGVhc2VSYXdEYXRhKCkgeyByYXdfZGF0YV8ucmVzZXQoKTsgfQogCit2b2lkIFR5cGVmYWNlRGVjb2Rlcjo6QWJvcnQoKSB7IGFib3J0ZWRfID0gdHJ1ZTsgfQorCiB9ICAvLyBuYW1lc3BhY2UgZm9udAogfSAgLy8gbmFtZXNwYWNlIGxvYWRlcgogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvZm9udC90eXBlZmFjZV9kZWNvZGVyLmggYi9zcmMvY29iYWx0L2xvYWRlci9mb250L3R5cGVmYWNlX2RlY29kZXIuaAppbmRleCA5MGY1YjFiLi40YWY4OTY1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9mb250L3R5cGVmYWNlX2RlY29kZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9mb250L3R5cGVmYWNlX2RlY29kZXIuaApAQCAtNDgsNiArNDgsOCBAQAogICB2b2lkIERlY29kZUNodW5rKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSBPVkVSUklERTsKICAgdm9pZCBGaW5pc2goKSBPVkVSUklERTsKIAorICB2b2lkIEFib3J0KCkgT1ZFUlJJREU7CisKICBwcml2YXRlOgogICB2b2lkIFJlbGVhc2VSYXdEYXRhKCk7CiAKQEAgLTU3LDYgKzU5LDggQEAKIAogICBzY29wZWRfcHRyPHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyOjpSYXdUeXBlZmFjZURhdGFWZWN0b3I+IHJhd19kYXRhXzsKICAgYm9vbCBpc19yYXdfZGF0YV90b29fbGFyZ2VfOworCisgIGJvb2wgYWJvcnRlZF87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgZm9udApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfY2FjaGUuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2NhY2hlLmgKaW5kZXggNzhhNjRhMS4uYjk5Njc3YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfY2FjaGUuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9jYWNoZS5oCkBAIC0xOSwzOSArMTksMTggQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oIgorI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvbG9hZGVyX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL3Jlc291cmNlX2NhY2hlLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2ltYWdlLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGxvYWRlciB7CiBuYW1lc3BhY2UgaW1hZ2UgewogCi0vLyB8SW1hZ2VEZWNvZGVyUHJvdmlkZXJ8IHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciB8UmVzb3VyY2VDYWNoZXwgdG8gY3JlYXRlCi0vLyBkZWNvZGVycywgd2l0aG91dCByZXF1aXJpbmcgaXQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgcmVuZGVyX3RyZWUuCi1zdHJ1Y3QgSW1hZ2VEZWNvZGVyUHJvdmlkZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgSW1hZ2VEZWNvZGVyUHJvdmlkZXIoCi0gICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIpCi0gICAgICA6IHJlc291cmNlX3Byb3ZpZGVyXyhyZXNvdXJjZV9wcm92aWRlcikge30KLQotICBzY29wZWRfcHRyPERlY29kZXI+IENyZWF0ZURlY29kZXIoCi0gICAgICBjb25zdCBJbWFnZURlY29kZXI6OlN1Y2Nlc3NDYWxsYmFjayYgc3VjY2Vzc19jYWxsYmFjaywKLSAgICAgIGNvbnN0IEltYWdlRGVjb2Rlcjo6RmFpbHVyZUNhbGxiYWNrJiBmYWlsdXJlX2NhbGxiYWNrLAotICAgICAgY29uc3QgSW1hZ2VEZWNvZGVyOjpFcnJvckNhbGxiYWNrJiBlcnJvcl9jYWxsYmFjaykgY29uc3QgewotICAgIHJldHVybiBtYWtlX3Njb3BlZF9wdHI8RGVjb2Rlcj4oCi0gICAgICAgIG5ldyBJbWFnZURlY29kZXIocmVzb3VyY2VfcHJvdmlkZXJfLCBzdWNjZXNzX2NhbGxiYWNrLCBmYWlsdXJlX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NhbGxiYWNrKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcl87Ci19OwotCiAvLyB8SW1hZ2VSZXNvdXJjZUNhY2hlVHlwZXwgcHJvdmlkZXMgdGhlIHR5cGVzIGFuZCBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbnMKIC8vIHJlcXVpcmVkIGJ5IHxSZXNvdXJjZUNhY2hlPEltYWdlUmVzb3VyY2VDYWNoZVR5cGU+fAogc3RydWN0IEltYWdlUmVzb3VyY2VDYWNoZVR5cGUgewogICB0eXBlZGVmIHJlbmRlcl90cmVlOjpJbWFnZSBSZXNvdXJjZVR5cGU7Ci0gIHR5cGVkZWYgSW1hZ2VEZWNvZGVyUHJvdmlkZXIgRGVjb2RlclByb3ZpZGVyVHlwZTsKIAogICBzdGF0aWMgdWludDMyIEdldEVzdGltYXRlZFNpemVJbkJ5dGVzKAogICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxSZXNvdXJjZVR5cGU+JiByZXNvdXJjZSkgewpAQCAtNjcsMTYgKzQ2LDE0IEBACiAKIHR5cGVkZWYgUmVzb3VyY2VDYWNoZTxJbWFnZVJlc291cmNlQ2FjaGVUeXBlPiBJbWFnZUNhY2hlOwogCi0vLyBDcmVhdGVJbWFnZUNhY2hlKCkgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGNyZWF0aW5nIGFuIHxJbWFnZUNhY2hlfCwgd2l0aG91dAotLy8gcmVxdWlyaW5nIHRoZSBjYWxsZXIgdG8gZGVhbCB3aXRoIHRoZSB8SW1hZ2VEZWNvZGVyUHJvdmlkZXJ8CisvLyBDcmVhdGVJbWFnZUNhY2hlKCkgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGNyZWF0aW5nIGFuIHxJbWFnZUNhY2hlfC4KIGlubGluZSBzdGF0aWMgc2NvcGVkX3B0cjxJbWFnZUNhY2hlPiBDcmVhdGVJbWFnZUNhY2hlKAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB1aW50MzIgY2FjaGVfY2FwYWNpdHksCi0gICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyLAotICAgIGxvYWRlcjo6RmV0Y2hlckZhY3RvcnkqIGZldGNoZXJfZmFjdG9yeSkgewotICByZXR1cm4gbWFrZV9zY29wZWRfcHRyPEltYWdlQ2FjaGU+KG5ldyBJbWFnZUNhY2hlKAotICAgICAgbmFtZSwgY2FjaGVfY2FwYWNpdHksIG1ha2Vfc2NvcGVkX3B0cjxJbWFnZURlY29kZXJQcm92aWRlcj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZURlY29kZXJQcm92aWRlcihyZXNvdXJjZV9wcm92aWRlcikpLAotICAgICAgZmV0Y2hlcl9mYWN0b3J5KSk7CisgICAgbG9hZGVyOjpMb2FkZXJGYWN0b3J5KiBsb2FkZXJfZmFjdG9yeSkgeworICByZXR1cm4gbWFrZV9zY29wZWRfcHRyPEltYWdlQ2FjaGU+KAorICAgICAgbmV3IEltYWdlQ2FjaGUobmFtZSwgY2FjaGVfY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZsb2FkZXI6OkxvYWRlckZhY3Rvcnk6OkNyZWF0ZUltYWdlTG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGxvYWRlcl9mYWN0b3J5KSkpKTsKIH0KIAogLy8gVGhlIFJlZHVjZWRDYWNoZUNhcGFjaXR5TWFuYWdlciBpcyBhIGhlbHBlciBjbGFzcyB0aGF0IG1hbmFnZXMgc3RhdGUgd2hpY2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmNjCmluZGV4IGY5ZjNlZTkuLjI0YThmOWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5jYwpAQCAtNjIsNyArNjIsOSBAQAogICAgICAgc3RhdGVfKGtXYWl0aW5nRm9ySGVhZGVyKSB7CiAgIHNpZ25hdHVyZV9jYWNoZV8ucG9zaXRpb24gPSAwOwogCi0gIERDSEVDSyhyZXNvdXJjZV9wcm92aWRlcl8pOworICBpZiAoIXJlc291cmNlX3Byb3ZpZGVyXykgeworICAgIHN0YXRlXyA9IGtOb1Jlc291cmNlUHJvdmlkZXI7CisgIH0KIH0KIAogTG9hZFJlc3BvbnNlVHlwZSBJbWFnZURlY29kZXI6Ok9uUmVzcG9uc2VTdGFydGVkKApAQCAtMTMyLDYgKzEzNCwxMiBAQAogICAgIGNhc2Uga1Vuc3VwcG9ydGVkSW1hZ2VGb3JtYXQ6CiAgICAgICBlcnJvcl9jYWxsYmFja18uUnVuKCJVbnN1cHBvcnRlZCBpbWFnZSBmb3JtYXQuIik7CiAgICAgICBicmVhazsKKyAgICBjYXNlIGtOb1Jlc291cmNlUHJvdmlkZXI6CisgICAgICBmYWlsdXJlX2NhbGxiYWNrXy5SdW4oIk5vIHJlc291cmNlIHByb3ZpZGVyIHdhcyBwYXNzZWQgdG8gdGhlIGRlY29kZXIuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtBYm9ydGVkOgorICAgICAgZXJyb3JfY2FsbGJhY2tfLlJ1bigiSW1hZ2VEZWNvZGVyIHJlY2VpdmVkIGFuIGV4dGVybmFsIHNpZ25hbCB0byBhYm9ydC4iKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2Uga05vdEFwcGxpY2FibGU6CiAgICAgICAvLyBubyBpbWFnZSBpcyBhdmFpbGFibGUuCiAgICAgICBmYWlsdXJlX2NhbGxiYWNrXy5SdW4oZmFpbHVyZV9tZXNzYWdlXyk7CkBAIC0xMzksNiArMTQ3LDE2IEBACiAgIH0KIH0KIAordm9pZCBJbWFnZURlY29kZXI6OkFib3J0KCkgeworICBpZiAoc3RhdGVfID09IGtEZWNvZGluZykgeworICAgIERDSEVDSyhkZWNvZGVyXyk7CisgICAgZGVjb2Rlcl8ucmVzZXQoKTsKKyAgICBzdGF0ZV8gPSBrQWJvcnRlZDsKKyAgfSBlbHNlIGlmIChzdGF0ZV8gPT0ga1dhaXRpbmdGb3JIZWFkZXIpIHsKKyAgICBzdGF0ZV8gPSBrQWJvcnRlZDsKKyAgfQorfQorCiB2b2lkIEltYWdlRGVjb2Rlcjo6RGVjb2RlQ2h1bmtJbnRlcm5hbChjb25zdCB1aW50OCogaW5wdXRfYnl0ZXMsIHNpemVfdCBzaXplKSB7CiAgIHN3aXRjaCAoc3RhdGVfKSB7CiAgICAgY2FzZSBrV2FpdGluZ0ZvckhlYWRlcjogewpAQCAtMTY0LDYgKzE4Miw4IEBACiAgICAgfSBicmVhazsKICAgICBjYXNlIGtOb3RBcHBsaWNhYmxlOgogICAgIGNhc2Uga1Vuc3VwcG9ydGVkSW1hZ2VGb3JtYXQ6CisgICAgY2FzZSBrQWJvcnRlZDoKKyAgICBjYXNlIGtOb1Jlc291cmNlUHJvdmlkZXI6CiAgICAgZGVmYXVsdDogewogICAgICAgLy8gRG8gbm90IGF0dGVtcHQgdG8gY29udGludWUgcHJvY2Vzc2luZyBkYXRhLgogICAgICAgRENIRUNLKCFkZWNvZGVyXyk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmggYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmgKaW5kZXggZmVhNDNkNC4uYmU2ZTA1NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuaApAQCAtNTMsNiArNTMsOCBAQAogICB2b2lkIERlY29kZUNodW5rKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSBPVkVSUklERTsKICAgdm9pZCBGaW5pc2goKSBPVkVSUklERTsKIAorICB2b2lkIEFib3J0KCkgT1ZFUlJJREU7CisKICAgLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHVzZSB0aGUgU3R1YkltYWdlRGVjb2RlciB3aGljaCBwcm9kdWNlcyBhIHNtYWxsIGltYWdlCiAgIC8vIHdpdGhvdXQgZGVjb2RpbmcuCiAgIHN0YXRpYyB2b2lkIFVzZVN0dWJJbWFnZURlY29kZXIoKTsKQEAgLTYzLDYgKzY1LDggQEAKICAgICBrRGVjb2RpbmcsCiAgICAga05vdEFwcGxpY2FibGUsCiAgICAga1Vuc3VwcG9ydGVkSW1hZ2VGb3JtYXQsCisgICAga05vUmVzb3VyY2VQcm92aWRlciwKKyAgICBrQWJvcnRlZCwKICAgfTsKIAogICAvLyBUaGUgY3VycmVudCBsb25nZXN0IHNpZ25hdHVyZSBpcyBXRUJQIHNpZ25hdHVyZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlci5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlci5jYwppbmRleCAwZGJhOTI0Li45MGU2YmZlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmNjCkBAIC02OSwxNCArNjksMTUgQEAKIC8vIExvYWRlcgogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLUxvYWRlcjo6TG9hZGVyKAotICAgIGJhc2U6OkNhbGxiYWNrPHNjb3BlZF9wdHI8RmV0Y2hlcj4oRmV0Y2hlcjo6SGFuZGxlciopPiBmZXRjaGVyX2NyZWF0b3IsCi0gICAgc2NvcGVkX3B0cjxEZWNvZGVyPiBkZWNvZGVyLAotICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmKT4gZXJyb3JfY2FsbGJhY2spCitMb2FkZXI6OkxvYWRlcihjb25zdCBGZXRjaGVyQ3JlYXRvciYgZmV0Y2hlcl9jcmVhdG9yLAorICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxEZWNvZGVyPiBkZWNvZGVyLAorICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBzdGQ6OnN0cmluZyYpPiYgZXJyb3JfY2FsbGJhY2ssCisgICAgICAgICAgICAgICBjb25zdCBPbkRlc3RydWN0aW9uRnVuY3Rpb24mIG9uX2Rlc3RydWN0aW9uKQogICAgIDogZGVjb2Rlcl8oZGVjb2Rlci5QYXNzKCkpLAogICAgICAgZmV0Y2hlcl90b19kZWNvZGVyX2FkYXB0b3JfKAogICAgICAgICAgIG5ldyBGZXRjaGVyVG9EZWNvZGVyQWRhcHRlcihkZWNvZGVyXy5nZXQoKSwgZXJyb3JfY2FsbGJhY2spKSwKLSAgICAgIGZldGNoZXJfKGZldGNoZXJfY3JlYXRvci5SdW4oZmV0Y2hlcl90b19kZWNvZGVyX2FkYXB0b3JfLmdldCgpKSkgeworICAgICAgZmV0Y2hlcl8oZmV0Y2hlcl9jcmVhdG9yLlJ1bihmZXRjaGVyX3RvX2RlY29kZXJfYWRhcHRvcl8uZ2V0KCkpKSwKKyAgICAgIG9uX2Rlc3RydWN0aW9uXyhvbl9kZXN0cnVjdGlvbikgewogICBEQ0hFQ0soZGVjb2Rlcl8pOwogICBEQ0hFQ0soIWVycm9yX2NhbGxiYWNrLmlzX251bGwoKSk7CiAgIERDSEVDSyghZmV0Y2hlcl9jcmVhdG9yLmlzX251bGwoKSk7CkBAIC05Miw5ICs5MywxNSBAQAogfQogCiBMb2FkZXI6On5Mb2FkZXIoKSB7CisgIGlmICghb25fZGVzdHJ1Y3Rpb25fLmlzX251bGwoKSkgeworICAgIG9uX2Rlc3RydWN0aW9uXy5SdW4odGhpcyk7CisgIH0KKwogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAgIGZldGNoZXJfY3JlYXRvcl9lcnJvcl9jbG9zdXJlXy5DYW5jZWwoKTsKIH0KIAordm9pZCBMb2FkZXI6OkFib3J0KCkgeyBkZWNvZGVyXy0+QWJvcnQoKTsgfQorCiB9ICAvLyBuYW1lc3BhY2UgbG9hZGVyCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuZ3lwIGIvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmd5cAppbmRleCAwYjY2OThmLi5jMGE3Zjc5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuZ3lwCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlci5neXAKQEAgLTQ5LDYgKzQ5LDggQEAKICAgICAgICAgJ2ltYWdlL3dlYnBfaW1hZ2VfZGVjb2Rlci5oJywKICAgICAgICAgJ2xvYWRlci5jYycsCiAgICAgICAgICdsb2FkZXIuaCcsCisgICAgICAgICdsb2FkZXJfZmFjdG9yeS5jYycsCisgICAgICAgICdsb2FkZXJfZmFjdG9yeS5oJywKICAgICAgICAgJ2xvYWRlcl90eXBlcy5oJywKICAgICAgICAgJ25ldF9mZXRjaGVyLmNjJywKICAgICAgICAgJ25ldF9mZXRjaGVyLmgnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmggYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuaAppbmRleCAzMTMyMTBkLi40M2RhNDI1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuaApAQCAtMzYsMTcgKzM2LDIyIEBACiAvLyBUT0RPOiBNaWdyYXRlIExvYWRlciBkZXNpZ24gZG9jIHRvIG1hcmtkb3duIGluIHRoaXMgZGlyZWN0b3J5LgogY2xhc3MgTG9hZGVyIHsKICBwdWJsaWM6CisgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8c2NvcGVkX3B0cjxGZXRjaGVyPihGZXRjaGVyOjpIYW5kbGVyKik+IEZldGNoZXJDcmVhdG9yOworICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoTG9hZGVyKik+IE9uRGVzdHJ1Y3Rpb25GdW5jdGlvbjsKKwogICAvLyBUaGUgY29uc3RydWN0aW9uIG9mIExvYWRlciBpbml0aWF0ZXMgdGhlIGxvYWRpbmcuIEl0IHRha2VzIHRoZSBvd25lcnNoaXAKICAgLy8gb2YgYSBEZWNvZGVyIGFuZCBjcmVhdGVzIGFuZCBtYW5hZ2VzIGEgRmV0Y2hlciB1c2luZyB0aGUgZ2l2ZW4gY3JlYXRpb24KICAgLy8gbWV0aG9kLgogICAvLyBUaGUgZmV0Y2hlciBjcmVhdG9yLCBkZWNvZGVyIGFuZCBlcnJvciBjYWxsYmFjayBzaG91bGRuJ3QgYmUgTlVMTC4KICAgLy8gSXQgaXMgYWxsb3dlZCB0byBkZXN0cm95IHRoZSBsb2FkZXIgaW4gdGhlIGVycm9yIGNhbGxiYWNrLgotICBMb2FkZXIoYmFzZTo6Q2FsbGJhY2s8c2NvcGVkX3B0cjxGZXRjaGVyPihGZXRjaGVyOjpIYW5kbGVyKik+IGZldGNoZXJfY3JlYXRvciwKLSAgICAgICAgIHNjb3BlZF9wdHI8RGVjb2Rlcj4gZGVjb2RlciwKLSAgICAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmKT4gZXJyb3JfY2FsbGJhY2spOworICBMb2FkZXIoY29uc3QgRmV0Y2hlckNyZWF0b3ImIGZldGNoZXJfY3JlYXRvciwgc2NvcGVkX3B0cjxEZWNvZGVyPiBkZWNvZGVyLAorICAgICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBzdGQ6OnN0cmluZyYpPiYgZXJyb3JfY2FsbGJhY2ssCisgICAgICAgICBjb25zdCBPbkRlc3RydWN0aW9uRnVuY3Rpb24mIG9uX2Rlc3RydWN0aW9uID0gT25EZXN0cnVjdGlvbkZ1bmN0aW9uKCkpOwogCiAgIH5Mb2FkZXIoKTsKIAorICB2b2lkIEFib3J0KCk7CisKICBwcml2YXRlOgogICBjbGFzcyBGZXRjaGVyVG9EZWNvZGVyQWRhcHRlcjsKIApAQCAtNTcsNiArNjIsOCBAQAogICBiYXNlOjpDYW5jZWxhYmxlQ2xvc3VyZSBmZXRjaGVyX2NyZWF0b3JfZXJyb3JfY2xvc3VyZV87CiAgIGJhc2U6OlRocmVhZENoZWNrZXIgdGhyZWFkX2NoZWNrZXJfOwogCisgIE9uRGVzdHJ1Y3Rpb25GdW5jdGlvbiBvbl9kZXN0cnVjdGlvbl87CisKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKExvYWRlcik7CiB9OwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlcl9mYWN0b3J5LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNTZjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5jYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvbG9hZGVyX2ZhY3RvcnkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgbG9hZGVyIHsKKworTG9hZGVyRmFjdG9yeTo6TG9hZGVyRmFjdG9yeShGZXRjaGVyRmFjdG9yeSogZmV0Y2hlcl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIpCisgICAgOiBmZXRjaGVyX2ZhY3RvcnlfKGZldGNoZXJfZmFjdG9yeSksCisgICAgICByZXNvdXJjZV9wcm92aWRlcl8ocmVzb3VyY2VfcHJvdmlkZXIpIHt9CisKK3Njb3BlZF9wdHI8TG9hZGVyPiBMb2FkZXJGYWN0b3J5OjpDcmVhdGVJbWFnZUxvYWRlcigKKyAgICBjb25zdCBHVVJMJiB1cmwsIGNvbnN0IGNzcDo6U2VjdXJpdHlDYWxsYmFjayYgdXJsX3NlY3VyaXR5X2NhbGxiYWNrLAorICAgIGNvbnN0IGltYWdlOjpJbWFnZURlY29kZXI6OlN1Y2Nlc3NDYWxsYmFjayYgc3VjY2Vzc19jYWxsYmFjaywKKyAgICBjb25zdCBpbWFnZTo6SW1hZ2VEZWNvZGVyOjpGYWlsdXJlQ2FsbGJhY2smIGZhaWx1cmVfY2FsbGJhY2ssCisgICAgY29uc3QgaW1hZ2U6OkltYWdlRGVjb2Rlcjo6RXJyb3JDYWxsYmFjayYgZXJyb3JfY2FsbGJhY2spIHsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworCisgIHNjb3BlZF9wdHI8TG9hZGVyPiBsb2FkZXIobmV3IExvYWRlcigKKyAgICAgIE1ha2VGZXRjaGVyQ3JlYXRvcih1cmwsIHVybF9zZWN1cml0eV9jYWxsYmFjayksCisgICAgICBzY29wZWRfcHRyPERlY29kZXI+KAorICAgICAgICAgIG5ldyBpbWFnZTo6SW1hZ2VEZWNvZGVyKHJlc291cmNlX3Byb3ZpZGVyXywgc3VjY2Vzc19jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlX2NhbGxiYWNrLCBlcnJvcl9jYWxsYmFjaykpLAorICAgICAgZXJyb3JfY2FsbGJhY2ssCisgICAgICBiYXNlOjpCaW5kKCZMb2FkZXJGYWN0b3J5OjpPbkxvYWRlckRlc3Ryb3llZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKKyAgT25Mb2FkZXJDcmVhdGVkKGxvYWRlci5nZXQoKSk7CisgIHJldHVybiBsb2FkZXIuUGFzcygpOworfQorCitzY29wZWRfcHRyPExvYWRlcj4gTG9hZGVyRmFjdG9yeTo6Q3JlYXRlVHlwZWZhY2VMb2FkZXIoCisgICAgY29uc3QgR1VSTCYgdXJsLCBjb25zdCBjc3A6OlNlY3VyaXR5Q2FsbGJhY2smIHVybF9zZWN1cml0eV9jYWxsYmFjaywKKyAgICBjb25zdCBmb250OjpUeXBlZmFjZURlY29kZXI6OlN1Y2Nlc3NDYWxsYmFjayYgc3VjY2Vzc19jYWxsYmFjaywKKyAgICBjb25zdCBmb250OjpUeXBlZmFjZURlY29kZXI6OkZhaWx1cmVDYWxsYmFjayYgZmFpbHVyZV9jYWxsYmFjaywKKyAgICBjb25zdCBmb250OjpUeXBlZmFjZURlY29kZXI6OkVycm9yQ2FsbGJhY2smIGVycm9yX2NhbGxiYWNrKSB7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKworICBzY29wZWRfcHRyPExvYWRlcj4gbG9hZGVyKG5ldyBMb2FkZXIoCisgICAgICBNYWtlRmV0Y2hlckNyZWF0b3IodXJsLCB1cmxfc2VjdXJpdHlfY2FsbGJhY2spLAorICAgICAgc2NvcGVkX3B0cjxEZWNvZGVyPigKKyAgICAgICAgICBuZXcgZm9udDo6VHlwZWZhY2VEZWNvZGVyKHJlc291cmNlX3Byb3ZpZGVyXywgc3VjY2Vzc19jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVfY2FsbGJhY2ssIGVycm9yX2NhbGxiYWNrKSksCisgICAgICBlcnJvcl9jYWxsYmFjaywKKyAgICAgIGJhc2U6OkJpbmQoJkxvYWRlckZhY3Rvcnk6Ok9uTG9hZGVyRGVzdHJveWVkLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSkpOworICBPbkxvYWRlckNyZWF0ZWQobG9hZGVyLmdldCgpKTsKKyAgcmV0dXJuIGxvYWRlci5QYXNzKCk7Cit9CisKK0xvYWRlcjo6RmV0Y2hlckNyZWF0b3IgTG9hZGVyRmFjdG9yeTo6TWFrZUZldGNoZXJDcmVhdG9yKAorICAgIGNvbnN0IEdVUkwmIHVybCwgY29uc3QgY3NwOjpTZWN1cml0eUNhbGxiYWNrJiB1cmxfc2VjdXJpdHlfY2FsbGJhY2spIHsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworCisgIHJldHVybiBiYXNlOjpCaW5kKCZGZXRjaGVyRmFjdG9yeTo6Q3JlYXRlU2VjdXJlRmV0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChmZXRjaGVyX2ZhY3RvcnlfKSwgdXJsLAorICAgICAgICAgICAgICAgICAgICB1cmxfc2VjdXJpdHlfY2FsbGJhY2spOworfQorCit2b2lkIExvYWRlckZhY3Rvcnk6OlN1c3BlbmQoKSB7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgRENIRUNLKHJlc291cmNlX3Byb3ZpZGVyXyk7CisKKyAgcmVzb3VyY2VfcHJvdmlkZXJfID0gTlVMTDsKKyAgZm9yIChMb2FkZXJTZXQ6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBhY3RpdmVfbG9hZGVyc18uYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IGFjdGl2ZV9sb2FkZXJzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgKCppdGVyKS0+QWJvcnQoKTsKKyAgfQorfQorCit2b2lkIExvYWRlckZhY3Rvcnk6OlJlc3VtZShyZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIpIHsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICBEQ0hFQ0socmVzb3VyY2VfcHJvdmlkZXIpOworICBEQ0hFQ0soIXJlc291cmNlX3Byb3ZpZGVyXyk7CisKKyAgcmVzb3VyY2VfcHJvdmlkZXJfID0gcmVzb3VyY2VfcHJvdmlkZXI7Cit9CisKK3ZvaWQgTG9hZGVyRmFjdG9yeTo6T25Mb2FkZXJDcmVhdGVkKExvYWRlciogbG9hZGVyKSB7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgRENIRUNLKGFjdGl2ZV9sb2FkZXJzXy5maW5kKGxvYWRlcikgPT0gYWN0aXZlX2xvYWRlcnNfLmVuZCgpKTsKKyAgYWN0aXZlX2xvYWRlcnNfLmluc2VydChsb2FkZXIpOworfQorCit2b2lkIExvYWRlckZhY3Rvcnk6Ok9uTG9hZGVyRGVzdHJveWVkKExvYWRlciogbG9hZGVyKSB7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgRENIRUNLKGFjdGl2ZV9sb2FkZXJzXy5maW5kKGxvYWRlcikgIT0gYWN0aXZlX2xvYWRlcnNfLmVuZCgpKTsKKyAgYWN0aXZlX2xvYWRlcnNfLmVyYXNlKGxvYWRlcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBsb2FkZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlcl9mYWN0b3J5LmggYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMGU3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09CQUxUX0xPQURFUl9MT0FERVJfRkFDVE9SWV9IXworI2RlZmluZSBDT0JBTFRfTE9BREVSX0xPQURFUl9GQUNUT1JZX0hfCisKKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlICJjb2JhbHQvY3NwL2NvbnRlbnRfc2VjdXJpdHlfcG9saWN5LmgiCisjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9mZXRjaGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ZvbnQvdHlwZWZhY2VfZGVjb2Rlci5oIgorI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oIgorI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvbG9hZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyLmgiCisjaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy9ndXJsLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGxvYWRlciB7CisKKy8vIFRoZSBMb2FkZXJGYWN0b3J5IHByb3ZpZGVzIGEgY2VudHJhbCBsb2FkZXIgY3JlYXRvciBvYmplY3QgZnJvbSB3aGljaCBjbGllbnRzCisvLyBjYW4gcmVxdWVzdCB0aGUgY3JlYXRpb24gb2YgbG9hZGVycyBvZiB2YXJpb3VzIHR5cGVzLiAgVGhlIExvYWRlckZhY3RvcnkKKy8vIG1haW50YWlucyBhbGwgY29udGV4dCBuZWNlc3NhcnkgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHJlc291cmNlIHR5cGVzLgorY2xhc3MgTG9hZGVyRmFjdG9yeSB7CisgcHVibGljOgorICBMb2FkZXJGYWN0b3J5KEZldGNoZXJGYWN0b3J5KiBmZXRjaGVyX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKTsKKworICAvLyBDcmVhdGVzIGEgbG9hZGVyIHRoYXQgZmV0Y2hlcyBhbmQgZGVjb2RlcyBhIHJlbmRlcl90cmVlOjpJbWFnZS4KKyAgc2NvcGVkX3B0cjxMb2FkZXI+IENyZWF0ZUltYWdlTG9hZGVyKAorICAgICAgY29uc3QgR1VSTCYgdXJsLCBjb25zdCBjc3A6OlNlY3VyaXR5Q2FsbGJhY2smIHVybF9zZWN1cml0eV9jYWxsYmFjaywKKyAgICAgIGNvbnN0IGltYWdlOjpJbWFnZURlY29kZXI6OlN1Y2Nlc3NDYWxsYmFjayYgc3VjY2Vzc19jYWxsYmFjaywKKyAgICAgIGNvbnN0IGltYWdlOjpJbWFnZURlY29kZXI6OkZhaWx1cmVDYWxsYmFjayYgZmFpbHVyZV9jYWxsYmFjaywKKyAgICAgIGNvbnN0IGltYWdlOjpJbWFnZURlY29kZXI6OkVycm9yQ2FsbGJhY2smIGVycm9yX2NhbGxiYWNrKTsKKworICAvLyBDcmVhdGVzIGEgbG9hZGVyIHRoYXQgZmV0Y2hlcyBhbmQgZGVjb2RlcyBhIHJlbmRlcl90cmVlOjpUeXBlZmFjZS4KKyAgc2NvcGVkX3B0cjxMb2FkZXI+IENyZWF0ZVR5cGVmYWNlTG9hZGVyKAorICAgICAgY29uc3QgR1VSTCYgdXJsLCBjb25zdCBjc3A6OlNlY3VyaXR5Q2FsbGJhY2smIHVybF9zZWN1cml0eV9jYWxsYmFjaywKKyAgICAgIGNvbnN0IGZvbnQ6OlR5cGVmYWNlRGVjb2Rlcjo6U3VjY2Vzc0NhbGxiYWNrJiBzdWNjZXNzX2NhbGxiYWNrLAorICAgICAgY29uc3QgZm9udDo6VHlwZWZhY2VEZWNvZGVyOjpGYWlsdXJlQ2FsbGJhY2smIGZhaWx1cmVfY2FsbGJhY2ssCisgICAgICBjb25zdCBmb250OjpUeXBlZmFjZURlY29kZXI6OkVycm9yQ2FsbGJhY2smIGVycm9yX2NhbGxiYWNrKTsKKworICAvLyBDbGVhcnMgb3V0IHRoZSBsb2FkZXIgZmFjdG9yeSdzIHJlc291cmNlIHByb3ZpZGVyLCBhYm9ydGluZyBhbnkgaW4tcHJvZ3Jlc3MKKyAgLy8gbG9hZHMuCisgIHZvaWQgU3VzcGVuZCgpOworICAvLyBSZXNldHMgYSBuZXcgcmVzb3VyY2UgcHJvdmlkZXIgZm9yIHRoaXMgbG9hZGVyIGZhY3RvcnkgdG8gdXNlLiAgVGhlCisgIC8vIHByZXZpb3VzIHJlc291cmNlIHByb3ZpZGVyIG11c3QgaGF2ZSBiZWVuIGNsZWFyZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzCisgIC8vIGNhbGxlZC4KKyAgdm9pZCBSZXN1bWUocmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKTsKKworIHByaXZhdGU6CisgIHZvaWQgT25Mb2FkZXJDcmVhdGVkKExvYWRlciogbG9hZGVyKTsKKyAgdm9pZCBPbkxvYWRlckRlc3Ryb3llZChMb2FkZXIqIGxvYWRlcik7CisKKyAgTG9hZGVyOjpGZXRjaGVyQ3JlYXRvciBNYWtlRmV0Y2hlckNyZWF0b3IoCisgICAgICBjb25zdCBHVVJMJiB1cmwsIGNvbnN0IGNzcDo6U2VjdXJpdHlDYWxsYmFjayYgdXJsX3NlY3VyaXR5X2NhbGxiYWNrKTsKKworICAvLyBFbnN1cmVzIHRoYXQgdGhlIExvYWRlckZhY3RvcnkgbWV0aG9kcyBhcmUgb25seSBjYWxsZWQgZnJvbSB0aGUgc2FtZQorICAvLyB0aHJlYWQuCisgIGJhc2U6OlRocmVhZENoZWNrZXIgdGhyZWFkX2NoZWNrZXJfOworCisgIC8vIFVzZWQgdG8gY3JlYXRlIHRoZSBGZXRjaGVyIGNvbXBvbmVudCBvZiB0aGUgbG9hZGVycy4KKyAgRmV0Y2hlckZhY3RvcnkqIGZldGNoZXJfZmFjdG9yeV87CisKKyAgLy8gVXNlZCB0byBjcmVhdGUgcmVuZGVyX3RyZWUgcmVzb3VyY2VzLgorICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXJfOworCisgIC8vIEtlZXBzIHRyYWNrIG9mIGFsbCBhY3RpdmUgbG9hZGVycyBzbyB0aGF0IGlmIGEgc3VzcGVuZCBldmVudCBvY2N1cnMgdGhleQorICAvLyBjYW4gYmUgYWJvcnRlZC4KKyAgdHlwZWRlZiBzdGQ6OnNldDxMb2FkZXIqPiBMb2FkZXJTZXQ7CisgIExvYWRlclNldCBhY3RpdmVfbG9hZGVyc187Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbG9hZGVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0xPQURFUl9MT0FERVJfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvbmV0X2ZldGNoZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9uZXRfZmV0Y2hlci5jYwppbmRleCA0YmE5ZDE3Li4wZjYwZTcyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9uZXRfZmV0Y2hlci5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9uZXRfZmV0Y2hlci5jYwpAQCAtMjEsMTIgKzIxLDQ2IEBACiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdwcmludGYuaCIKICNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5oIgogI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfZmV0Y2hlci5oIgorI2lmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCisjaWYgU0JfSEFTKENPUkVfRFVNUF9IQU5ETEVSX1NVUFBPUlQpCisjZGVmaW5lIEhBTkRMRV9DT1JFX0RVTVAKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvcHM0L2NvcmVfZHVtcF9oYW5kbGVyLmgiCisjZW5kaWYgIC8vIFNCX0hBUyhDT1JFX0RVTVBfSEFORExFUl9TVVBQT1JUKQorI2VuZGlmICAvLyBPU19TVEFSQk9BUkQKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgbG9hZGVyIHsKIAogbmFtZXNwYWNlIHsKIAorI2lmIGRlZmluZWQoSEFORExFX0NPUkVfRFVNUCkKKworY2xhc3MgTmV0RmV0Y2hlckxvZyB7CisgcHVibGljOgorICBOZXRGZXRjaGVyTG9nKCkgOiB0b3RhbF9mZXRjaGVkX2J5dGVzXygwKSB7CisgICAgU2JDb3JlRHVtcFJlZ2lzdGVySGFuZGxlcihDb3JlRHVtcEhhbmRsZXIsIHRoaXMpOworICB9CisgIH5OZXRGZXRjaGVyTG9nKCkgeyBTYkNvcmVEdW1wVW5yZWdpc3RlckhhbmRsZXIoQ29yZUR1bXBIYW5kbGVyLCB0aGlzKTsgfQorCisgIHN0YXRpYyB2b2lkIENvcmVEdW1wSGFuZGxlcih2b2lkKiBjb250ZXh0KSB7CisgICAgU2JDb3JlRHVtcExvZ0ludGVnZXIoCisgICAgICAgICJOZXRGZXRjaGVyIHRvdGFsIGZldGNoZWQgYnl0ZXMiLAorICAgICAgICBzdGF0aWNfY2FzdDxOZXRGZXRjaGVyTG9nKj4oY29udGV4dCktPnRvdGFsX2ZldGNoZWRfYnl0ZXNfKTsKKyAgfQorCisgIHZvaWQgSW5jcmVtZW50RmV0Y2hlZEJ5dGVzKGludCBsZW5ndGgpIHsgdG90YWxfZmV0Y2hlZF9ieXRlc18gKz0gbGVuZ3RoOyB9CisKKyBwcml2YXRlOgorICBpbnQgdG90YWxfZmV0Y2hlZF9ieXRlc187CisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihOZXRGZXRjaGVyTG9nKTsKK307CisKK2Jhc2U6OkxhenlJbnN0YW5jZTxOZXRGZXRjaGVyTG9nPiBuZXRfZmV0Y2hlcl9sb2cgPSBMQVpZX0lOU1RBTkNFX0lOSVRJQUxJWkVSOworCisjZW5kaWYgIC8vIGRlZmluZWQoSEFORExFX0NPUkVfRFVNUCkKKwogYm9vbCBJc1Jlc3BvbnNlQ29kZVN1Y2Nlc3MoaW50IHJlc3BvbnNlX2NvZGUpIHsKICAgLy8gTmV0RmV0Y2hlciBvbmx5IGNvbnNpZGVycyBzdWNjZXNzIHRvIGJlIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3QKICAgLy8gd2FzIHN1Y2Nlc3NmdWwgKmFuZCogd2UgZ2V0IGEgMnh4IHJlc3BvbnNlIGJhY2suCkBAIC0xMTgsNiArMTUyLDEwIEBACiB2b2lkIE5ldEZldGNoZXI6Ok9uVVJMRmV0Y2hEb3dubG9hZERhdGEoY29uc3QgbmV0OjpVUkxGZXRjaGVyKiBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxzdGQ6OnN0cmluZz4gZG93bmxvYWRfZGF0YSkgewogICBpZiAoSXNSZXNwb25zZUNvZGVTdWNjZXNzKHNvdXJjZS0+R2V0UmVzcG9uc2VDb2RlKCkpKSB7CisjaWYgZGVmaW5lZChIQU5ETEVfQ09SRV9EVU1QKQorICAgIG5ldF9mZXRjaGVyX2xvZy5HZXQoKS5JbmNyZW1lbnRGZXRjaGVkQnl0ZXMoCisgICAgICAgIHN0YXRpY19jYXN0PGludD4oZG93bmxvYWRfZGF0YS0+bGVuZ3RoKCkpKTsKKyNlbmRpZgogICAgIGhhbmRsZXIoKS0+T25SZWNlaXZlZCh0aGlzLCBkb3dubG9hZF9kYXRhLT5kYXRhKCksIGRvd25sb2FkX2RhdGEtPmxlbmd0aCgpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvcmVzb3VyY2VfY2FjaGUuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL3Jlc291cmNlX2NhY2hlLmgKaW5kZXggZjUyMmY1Yi4uMmY0Y2UyMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvcmVzb3VyY2VfY2FjaGUuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9yZXNvdXJjZV9jYWNoZS5oCkBAIC00MSw3ICs0MSw2IEBACiAKIC8vIENhY2hlVHlwZSBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZzoKIC8vICAgdHlwZWRlZiBTcGVjaWZpY1Jlc291cmNlVHlwZSBSZXNvdXJjZVR5cGU7Ci0vLyAgIHR5cGVkZWYgU3BlY2lmaWNEZWNvZGVyUHJvdmlkZXJUeXBlIERlY29kZXJQcm92aWRlclR5cGU7CiAvLyAgIHN0YXRpYyB1aW50MzIgR2V0RXN0aW1hdGVkU2l6ZUluQnl0ZXMoCiAvLyAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFJlc291cmNlVHlwZT4mIHJlc291cmNlKTsKIApAQCAtNjEsNyArNjAsMTIgQEAKICBwdWJsaWM6CiAgIHR5cGVkZWYgUmVzb3VyY2VDYWNoZTxDYWNoZVR5cGU+IFJlc291cmNlQ2FjaGVUeXBlOwogICB0eXBlZGVmIHR5cGVuYW1lIENhY2hlVHlwZTo6UmVzb3VyY2VUeXBlIFJlc291cmNlVHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBDYWNoZVR5cGU6OkRlY29kZXJQcm92aWRlclR5cGUgRGVjb2RlclByb3ZpZGVyVHlwZTsKKworICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHNjb3BlZF9wdHI8TG9hZGVyPigKKyAgICAgIGNvbnN0IEdVUkwmLCBjb25zdCBjc3A6OlNlY3VyaXR5Q2FsbGJhY2smLAorICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBzY29wZWRfcmVmcHRyPFJlc291cmNlVHlwZT4mKT4mLAorICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBzdGQ6OnN0cmluZyYpPiYsCisgICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJik+Jik+IENyZWF0ZUxvYWRlckZ1bmN0aW9uOwogCiAgIC8vIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIHN1Y2Nlc3MsIGZhaWx1cmUsIG9yIGVycm9yIGNhbGxiYWNrcyB0bwogICAvLyBDYWNoZWRSZXNvdXJjZSBvYmplY3RzIHRoYXQgYXJlIGV4ZWN1dGVkIHdoZW4gdGhlIHJlc291cmNlIGZpbmlzaGVzCkBAIC05NSw4ICs5OSw3IEBACiAgIC8vIFJlcXVlc3QgZmV0Y2hpbmcgYW5kIGRlY29kaW5nIGEgc2luZ2xlIHJlc291cmNlIGJhc2VkIG9uIHRoZSB1cmwuCiAgIENhY2hlZFJlc291cmNlKGNvbnN0IEdVUkwmIHVybCwKICAgICAgICAgICAgICAgICAgY29uc3QgY3NwOjpTZWN1cml0eUNhbGxiYWNrJiBzZWN1cml0eV9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlclByb3ZpZGVyVHlwZSogZGVjb2Rlcl9wcm92aWRlciwKLSAgICAgICAgICAgICAgICAgbG9hZGVyOjpGZXRjaGVyRmFjdG9yeSogZmV0Y2hlcl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICBjb25zdCBDcmVhdGVMb2FkZXJGdW5jdGlvbiYgY3JlYXRlX2xvYWRlcl9mdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgUmVzb3VyY2VDYWNoZVR5cGUqIHJlc291cmNlX2NhY2hlKTsKIAogICAvLyBSZXNvdXJjZSBpcyBhdmFpbGFibGUuIENhY2hlZFJlc291cmNlIGlzIGEgd3JhcHBlciBvZiB0aGUgcmVzb3VyY2UKQEAgLTE0OCw2ICsxNTEsNyBAQAogICB2b2lkIFJ1bkNhbGxiYWNrcyhDYWxsYmFja1R5cGUgdHlwZSk7CiAKICAgY29uc3QgR1VSTCB1cmxfOworCiAgIHNjb3BlZF9yZWZwdHI8UmVzb3VyY2VUeXBlPiByZXNvdXJjZV87CiAgIFJlc291cmNlQ2FjaGVUeXBlKiBjb25zdCByZXNvdXJjZV9jYWNoZV87CiAgIHNjb3BlZF9wdHI8TG9hZGVyPiBsb2FkZXJfOwpAQCAtMjE4LDIwICsyMjIsMTYgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWNoZVR5cGU+CiBDYWNoZWRSZXNvdXJjZTxDYWNoZVR5cGU+OjpDYWNoZWRSZXNvdXJjZSgKICAgICBjb25zdCBHVVJMJiB1cmwsIGNvbnN0IGNzcDo6U2VjdXJpdHlDYWxsYmFjayYgc2VjdXJpdHlfY2FsbGJhY2ssCi0gICAgY29uc3QgRGVjb2RlclByb3ZpZGVyVHlwZSogZGVjb2Rlcl9wcm92aWRlciwKLSAgICBsb2FkZXI6OkZldGNoZXJGYWN0b3J5KiBmZXRjaGVyX2ZhY3RvcnksIFJlc291cmNlQ2FjaGVUeXBlKiByZXNvdXJjZV9jYWNoZSkKKyAgICBjb25zdCBDcmVhdGVMb2FkZXJGdW5jdGlvbiYgY3JlYXRlX2xvYWRlcl9mdW5jdGlvbiwKKyAgICBSZXNvdXJjZUNhY2hlVHlwZSogcmVzb3VyY2VfY2FjaGUpCiAgICAgOiB1cmxfKHVybCksIHJlc291cmNlX2NhY2hlXyhyZXNvdXJjZV9jYWNoZSkgewogICBEQ0hFQ0soY2FjaGVkX3Jlc291cmNlX3RocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwogCi0gIHNjb3BlZF9wdHI8RGVjb2Rlcj4gZGVjb2RlciA9IGRlY29kZXJfcHJvdmlkZXItPkNyZWF0ZURlY29kZXIoCisgIGxvYWRlcl8gPSBjcmVhdGVfbG9hZGVyX2Z1bmN0aW9uLlJ1bigKKyAgICAgIHVybCwgc2VjdXJpdHlfY2FsbGJhY2ssCiAgICAgICBiYXNlOjpCaW5kKCZDYWNoZWRSZXNvdXJjZTo6T25Mb2FkaW5nU3VjY2VzcywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCiAgICAgICBiYXNlOjpCaW5kKCZDYWNoZWRSZXNvdXJjZTo6T25Mb2FkaW5nRmFpbHVyZSwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCiAgICAgICBiYXNlOjpCaW5kKCZDYWNoZWRSZXNvdXJjZTo6T25Mb2FkaW5nRXJyb3IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKLSAgbG9hZGVyXyA9IG1ha2Vfc2NvcGVkX3B0cihuZXcgTG9hZGVyKAotICAgICAgYmFzZTo6QmluZCgmRmV0Y2hlckZhY3Rvcnk6OkNyZWF0ZVNlY3VyZUZldGNoZXIsCi0gICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoZmV0Y2hlcl9mYWN0b3J5KSwgdXJsLCBzZWN1cml0eV9jYWxsYmFjayksCi0gICAgICBkZWNvZGVyLlBhc3MoKSwKLSAgICAgIGJhc2U6OkJpbmQoJkNhY2hlZFJlc291cmNlOjpPbkxvYWRpbmdFcnJvciwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIENhY2hlVHlwZT4KQEAgLTM4NywxMSArMzg3LDEyIEBACiAgcHVibGljOgogICB0eXBlZGVmIENhY2hlZFJlc291cmNlPENhY2hlVHlwZT4gQ2FjaGVkUmVzb3VyY2VUeXBlOwogICB0eXBlZGVmIHR5cGVuYW1lIENhY2hlVHlwZTo6UmVzb3VyY2VUeXBlIFJlc291cmNlVHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBDYWNoZVR5cGU6OkRlY29kZXJQcm92aWRlclR5cGUgRGVjb2RlclByb3ZpZGVyVHlwZTsKKworICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBDYWNoZWRSZXNvdXJjZVR5cGU6OkNyZWF0ZUxvYWRlckZ1bmN0aW9uIENyZWF0ZUxvYWRlckZ1bmN0aW9uOwogCiAgIFJlc291cmNlQ2FjaGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHVpbnQzMiBjYWNoZV9jYXBhY2l0eSwKLSAgICAgICAgICAgICAgICBzY29wZWRfcHRyPERlY29kZXJQcm92aWRlclR5cGU+IGRlY29kZXJfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgbG9hZGVyOjpGZXRjaGVyRmFjdG9yeSogZmV0Y2hlcl9mYWN0b3J5KTsKKyAgICAgICAgICAgICAgICBjb25zdCBDcmVhdGVMb2FkZXJGdW5jdGlvbiYgY3JlYXRlX2xvYWRlcl9mdW5jdGlvbik7CiAKICAgLy8gfENyZWF0ZUNhY2hlZFJlc291cmNlfCByZXR1cm5zIENhY2hlZFJlc291cmNlLiBJZiB0aGUgQ2FjaGVkUmVzb3VyY2UgaXMgbm90CiAgIC8vIGluIHxjYWNoZWRfcmVzb3VyY2VfbWFwX3wgb3IgaXRzIHJlc291cmNlIGlzIG5vdCBpbgpAQCAtNDQzLDggKzQ0NCw4IEBACiAKICAgdWludDMyIGNhY2hlX2NhcGFjaXR5XzsKIAotICBzY29wZWRfcHRyPERlY29kZXJQcm92aWRlclR5cGU+IGRlY29kZXJfcHJvdmlkZXJfOwotICBsb2FkZXI6OkZldGNoZXJGYWN0b3J5KiBjb25zdCBmZXRjaGVyX2ZhY3RvcnlfOworICBDcmVhdGVMb2FkZXJGdW5jdGlvbiBjcmVhdGVfbG9hZGVyX2Z1bmN0aW9uXzsKKwogICBjc3A6OlNlY3VyaXR5Q2FsbGJhY2sgc2VjdXJpdHlfY2FsbGJhY2tfOwogCiAgIC8vIHxjYWNoZWRfcmVzb3VyY2VfbWFwX3wgc3RvcmVzIHRoZSBjYWNoZWQgcmVzb3VyY2VzIHRoYXQgYXJlIGN1cnJlbnRseQpAQCAtNDcxLDEyICs0NzIsMTAgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWNoZVR5cGU+CiBSZXNvdXJjZUNhY2hlPENhY2hlVHlwZT46OlJlc291cmNlQ2FjaGUoCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHVpbnQzMiBjYWNoZV9jYXBhY2l0eSwKLSAgICBzY29wZWRfcHRyPERlY29kZXJQcm92aWRlclR5cGU+IGRlY29kZXJfcHJvdmlkZXIsCi0gICAgbG9hZGVyOjpGZXRjaGVyRmFjdG9yeSogZmV0Y2hlcl9mYWN0b3J5KQorICAgIGNvbnN0IENyZWF0ZUxvYWRlckZ1bmN0aW9uJiBjcmVhdGVfbG9hZGVyX2Z1bmN0aW9uKQogICAgIDogbmFtZV8obmFtZSksCiAgICAgICBjYWNoZV9jYXBhY2l0eV8oY2FjaGVfY2FwYWNpdHkpLAotICAgICAgZGVjb2Rlcl9wcm92aWRlcl8oZGVjb2Rlcl9wcm92aWRlci5yZWxlYXNlKCkpLAotICAgICAgZmV0Y2hlcl9mYWN0b3J5XyhmZXRjaGVyX2ZhY3RvcnkpLAorICAgICAgY3JlYXRlX2xvYWRlcl9mdW5jdGlvbl8oY3JlYXRlX2xvYWRlcl9mdW5jdGlvbiksCiAgICAgICBzaXplX2luX2J5dGVzXyhiYXNlOjpTdHJpbmdQcmludGYoIiVzLlNpemUiLCBuYW1lXy5jX3N0cigpKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICJUb3RhbCBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IHVzZWQgYnkgdGhlIGNhY2hlLiIpLAogICAgICAgY2FwYWNpdHlfaW5fYnl0ZXNfKGJhc2U6OlN0cmluZ1ByaW50ZigiJXMuQ2FwYWNpdHkiLCBuYW1lXy5jX3N0cigpKSwKQEAgLTQ4NSw4ICs0ODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlZWRpbmcgdGhpcyByZXN1bHRzIGluICp1bnVzZWQqIHJlc291cmNlcyBiZWluZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgInB1cmdlZC4iKSB7CiAgIERDSEVDSyhyZXNvdXJjZV9jYWNoZV90aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgRENIRUNLKGRlY29kZXJfcHJvdmlkZXJfLmdldCgpKTsKLSAgRENIRUNLKGZldGNoZXJfZmFjdG9yeV8pOworICBEQ0hFQ0soIWNyZWF0ZV9sb2FkZXJfZnVuY3Rpb25fLmlzX251bGwoKSk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWNoZVR5cGU+CkBAIC01MTYsOSArNTE0LDggQEAKIAogICAvLyBJZiB0aGUgcmVzb3VyY2UgZG9lc24ndCBleGlzdCwgY3JlYXRlIGEgY2FjaGVkIHJlc291cmNlIGFuZCBmZXRjaCB0aGUKICAgLy8gcmVzb3VyY2UgYmFzZWQgb24gdGhlIHVybC4KLSAgc2NvcGVkX3JlZnB0cjxDYWNoZWRSZXNvdXJjZVR5cGU+IGNhY2hlZF9yZXNvdXJjZSgKLSAgICAgIG5ldyBDYWNoZWRSZXNvdXJjZVR5cGUodXJsLCBzZWN1cml0eV9jYWxsYmFja18sIGRlY29kZXJfcHJvdmlkZXJfLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaGVyX2ZhY3RvcnlfLCB0aGlzKSk7CisgIHNjb3BlZF9yZWZwdHI8Q2FjaGVkUmVzb3VyY2VUeXBlPiBjYWNoZWRfcmVzb3VyY2UobmV3IENhY2hlZFJlc291cmNlVHlwZSgKKyAgICAgIHVybCwgc2VjdXJpdHlfY2FsbGJhY2tfLCBjcmVhdGVfbG9hZGVyX2Z1bmN0aW9uXywgdGhpcykpOwogICBjYWNoZWRfcmVzb3VyY2VfbWFwXy5pbnNlcnQoCiAgICAgICBzdGQ6Om1ha2VfcGFpcih1cmwuc3BlYygpLCBjYWNoZWRfcmVzb3VyY2UuZ2V0KCkpKTsKICAgcmV0dXJuIGNhY2hlZF9yZXNvdXJjZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2ltYWdlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaW1hZ2UuY2MKaW5kZXggM2U4ZWNlNS4uNTkzMmRkZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaW1hZ2UuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaW1hZ2UuY2MKQEAgLTY1LDcgKzY1LDcgQEAKICAgQ0hFQ0soU2JCbGl0dGVySXNTdXJmYWNlVmFsaWQoc3VyZmFjZV8pKTsKIH0KIAotdm9pZCBTaW5nbGVQbGFuZUltYWdlOjpFbnN1cmVJbml0aWFsaXplZCgpIHt9Citib29sIFNpbmdsZVBsYW5lSW1hZ2U6OkVuc3VyZUluaXRpYWxpemVkKCkgeyByZXR1cm4gZmFsc2U7IH0KIAogY29uc3QgU2tCaXRtYXAmIFNpbmdsZVBsYW5lSW1hZ2U6OkdldEJpdG1hcCgpIGNvbnN0IHsKICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgZXZlciBnZXQgY2FsbGVkIGlmIHRoZSBTa2lhIHNvZnR3YXJlIHJlbmRlcmVyIG5lZWRzCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9pbWFnZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaW1hZ2UuaAppbmRleCA3Mjc1MjI1Li42MDVjYWJlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9pbWFnZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2ltYWdlLmgKQEAgLTc3LDcgKzc3LDcgQEAKICAgU2JCbGl0dGVyU3VyZmFjZSBzdXJmYWNlKCkgY29uc3QgeyByZXR1cm4gc3VyZmFjZV87IH0KIAogICAvLyBPdmVycmlkZXMgZnJvbSBza2lhOjpTaW5nbGVQbGFuZUltYWdlLgotICB2b2lkIEVuc3VyZUluaXRpYWxpemVkKCkgT1ZFUlJJREU7CisgIGJvb2wgRW5zdXJlSW5pdGlhbGl6ZWQoKSBPVkVSUklERTsKIAogICAvLyBXaGVuIEdldEJpdG1hcCgpIGlzIGNhbGxlZCBvbiBhIGJsaXR0ZXI6OlNpbmdsZVBsYW5lSW1hZ2UgZm9yIHRoZSBmaXJzdAogICAvLyB0aW1lLCB3ZSBkbyBhIG9uZS10aW1lIGRvd25sb2FkIG9mIHRoZSBwaXhlbCBkYXRhIGZyb20gdGhlIEJsaXR0ZXIgQVBJCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9pbWFnZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX2ltYWdlLmNjCmluZGV4IGY4MDk2YjAuLjAzMDBkZDYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX2ltYWdlLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX2ltYWdlLmNjCkBAIC0yMTAsMTIgKzIxMCwxNCBAQAogICByZXR1cm4gYmFja2VuZF9pbWFnZV8tPkdldEJpdG1hcCgpOwogfQogCi12b2lkIEhhcmR3YXJlRnJvbnRlbmRJbWFnZTo6RW5zdXJlSW5pdGlhbGl6ZWQoKSB7Citib29sIEhhcmR3YXJlRnJvbnRlbmRJbWFnZTo6RW5zdXJlSW5pdGlhbGl6ZWQoKSB7CiAgIERDSEVDS19FUShyYXN0ZXJpemVyX21lc3NhZ2VfbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwogICBpZiAoIWluaXRpYWxpemVfYmFja2VuZF9pbWFnZV8uaXNfbnVsbCgpKSB7CiAgICAgaW5pdGlhbGl6ZV9iYWNrZW5kX2ltYWdlXy5SdW4oKTsKICAgICBpbml0aWFsaXplX2JhY2tlbmRfaW1hZ2VfLlJlc2V0KCk7CisgICAgcmV0dXJuIHRydWU7CiAgIH0KKyAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIEhhcmR3YXJlRnJvbnRlbmRJbWFnZTo6SW5pdGlhbGl6ZUJhY2tlbmRJbWFnZUZyb21JbWFnZURhdGEoCkBAIC0yNTcsMTYgKzI1OSwxOCBAQAogCiBIYXJkd2FyZU11bHRpUGxhbmVJbWFnZTo6fkhhcmR3YXJlTXVsdGlQbGFuZUltYWdlKCkge30KIAotdm9pZCBIYXJkd2FyZU11bHRpUGxhbmVJbWFnZTo6RW5zdXJlSW5pdGlhbGl6ZWQoKSB7Citib29sIEhhcmR3YXJlTXVsdGlQbGFuZUltYWdlOjpFbnN1cmVJbml0aWFsaXplZCgpIHsKICAgLy8gQSBtdWx0aS1wbGFuZSBpbWFnZSBpcyBub3QgY29uc2lkZXJlZCBiYWNrZW5kLWluaXRpYWxpemVkIHVudGlsIGFsbCBpdHMKICAgLy8gc2luZ2xlLXBsYW5lIGltYWdlcyBhcmUgYmFja2VuZC1pbml0aWFsaXplZCwgdGh1cyB3ZSBlbnN1cmUgdGhhdCBhbGwKICAgLy8gdGhlIGNvbXBvbmVudCBpbWFnZXMgYXJlIGJhY2tlbmQtaW5pdGlhbGl6ZWQuCisgIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZW5kZXJfdHJlZTo6TXVsdGlQbGFuZUltYWdlRGF0YURlc2NyaXB0b3I6OmtNYXhQbGFuZXM7CiAgICAgICAgKytpKSB7CiAgICAgaWYgKHBsYW5lc19baV0pIHsKLSAgICAgIHBsYW5lc19baV0tPkVuc3VyZUluaXRpYWxpemVkKCk7CisgICAgICBpbml0aWFsaXplZCB8PSBwbGFuZXNfW2ldLT5FbnN1cmVJbml0aWFsaXplZCgpOwogICAgIH0KICAgfQorICByZXR1cm4gaW5pdGlhbGl6ZWQ7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBza2lhCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9pbWFnZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfaW1hZ2UuaAppbmRleCAxNWMzMThlLi4xNTkwNTY3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9pbWFnZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX2ltYWdlLmgKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAvLyByZXN0cmFpbnQgc2hvdWxkIGFsd2F5cyBiZSBzYXRpc2ZpZWQgbmF0dXJhbGx5LgogICBjb25zdCBTa0JpdG1hcCYgR2V0Qml0bWFwKCkgY29uc3QgT1ZFUlJJREU7CiAKLSAgdm9pZCBFbnN1cmVJbml0aWFsaXplZCgpIE9WRVJSSURFOworICBib29sIEVuc3VyZUluaXRpYWxpemVkKCkgT1ZFUlJJREU7CiAKICBwcml2YXRlOgogICB+SGFyZHdhcmVGcm9udGVuZEltYWdlKCkgT1ZFUlJJREU7CkBAIC0xNjQsNyArMTY0LDcgQEAKICAgICByZXR1cm4gcGxhbmVzX1twbGFuZV9pbmRleF0tPkdldEJpdG1hcCgpOwogICB9CiAKLSAgdm9pZCBFbnN1cmVJbml0aWFsaXplZCgpIE9WRVJSSURFOworICBib29sIEVuc3VyZUluaXRpYWxpemVkKCkgT1ZFUlJJREU7CiAKICBwcml2YXRlOgogICB+SGFyZHdhcmVNdWx0aVBsYW5lSW1hZ2UoKSBPVkVSUklERTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yYXN0ZXJpemVyLmNjCmluZGV4IDIwZGRmZDUuLjFjNTVkYzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5jYwpAQCAtNzAsNiArNzAsOCBAQAogICBzY29wZWRfcHRyPFJlbmRlclRyZWVOb2RlVmlzaXRvcjo6U2NyYXRjaFN1cmZhY2U+IENyZWF0ZVNjcmF0Y2hTdXJmYWNlKAogICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgc2l6ZSk7CiAKKyAgdm9pZCBSZXNldFNraWFTdGF0ZSgpOworCiAgIGJhc2U6OlRocmVhZENoZWNrZXIgdGhyZWFkX2NoZWNrZXJfOwogCiAgIGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dEVHTCogZ3JhcGhpY3NfY29udGV4dF87CkBAIC0yMzgsNiArMjQwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSk7CiAgICAgUmVuZGVyVHJlZU5vZGVWaXNpdG9yIHZpc2l0b3IoCiAgICAgICAgIGNhbnZhcywgJmNyZWF0ZV9zY3JhdGNoX3N1cmZhY2VfZnVuY3Rpb24sCisgICAgICAgIGJhc2U6OkJpbmQoJkhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6UmVzZXRTa2lhU3RhdGUsCisgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCiAgICAgICAgIHN1cmZhY2VfY2FjaGVfZGVsZWdhdGVfID8gJnN1cmZhY2VfY2FjaGVfZGVsZWdhdGVfLnZhbHVlKCkgOiBOVUxMLAogICAgICAgICBzdXJmYWNlX2NhY2hlXyA/ICZzdXJmYWNlX2NhY2hlXy52YWx1ZSgpIDogTlVMTCk7CiAgICAgcmVuZGVyX3RyZWUtPkFjY2VwdCgmdmlzaXRvcik7CkBAIC0zMDQsNiArMzA4LDggQEAKICAgfQogfQogCit2b2lkIEhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6UmVzZXRTa2lhU3RhdGUoKSB7IGdyX2NvbnRleHRfLT5yZXNldENvbnRleHQoKTsgfQorCiBIYXJkd2FyZVJhc3Rlcml6ZXI6OkhhcmR3YXJlUmFzdGVyaXplcigKICAgICBiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzX2NvbnRleHQsIGludCBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCiAgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLCBpbnQgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaW1hZ2UuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2ltYWdlLmgKaW5kZXggY2QyZTkwNy4uYmI2OTZhYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaW1hZ2UuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9pbWFnZS5oCkBAIC00MSw3ICs0MSw4IEBACiAgIC8vIHRvIGJlIHJlZmVyZW5jZWQgaW4gYSByZW5kZXIgdHJlZSBiZWZvcmUgdGhlbiwgYW5kIHRodXMgdGhpcyBmdW5jdGlvbiB3aWxsCiAgIC8vIGZhc3QtdHJhY2sgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBiYWNrZW5kIG9iamVjdCBpZiBpdCBoYXMgbm90IHlldAogICAvLyBleGVjdXRlZC4KLSAgdmlydHVhbCB2b2lkIEVuc3VyZUluaXRpYWxpemVkKCkgPSAwOworICAvLyBSZXR1cm5zIHRydWUgaWYgYW4gaW5pdGlhbGl6YXRpb24gYWN0dWFsbHkgdG9vayBwbGFjZS4KKyAgdmlydHVhbCBib29sIEVuc3VyZUluaXRpYWxpemVkKCkgPSAwOwogCiAgIC8vIE1lY2hhbmlzbSB0byBhbGxvdyBkeW5hbWljIHR5cGUgY2hlY2tpbmcgb24gSW1hZ2Ugb2JqZWN0cy4KICAgdmlydHVhbCBiYXNlOjpUeXBlSWQgR2V0VHlwZUlkKCkgY29uc3QgPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmNjCmluZGV4IGFiOWZjN2QuLjc0OGFlZmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuY2MKQEAgLTcyLDEzICs3MiwxNSBAQAogUmVuZGVyVHJlZU5vZGVWaXNpdG9yOjpSZW5kZXJUcmVlTm9kZVZpc2l0b3IoCiAgICAgU2tDYW52YXMqIHJlbmRlcl90YXJnZXQsCiAgICAgY29uc3QgQ3JlYXRlU2NyYXRjaFN1cmZhY2VGdW5jdGlvbiogY3JlYXRlX3NjcmF0Y2hfc3VyZmFjZV9mdW5jdGlvbiwKKyAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiByZXNldF9za2lhX2NvbnRleHRfZnVuY3Rpb24sCiAgICAgU3VyZmFjZUNhY2hlRGVsZWdhdGUqIHN1cmZhY2VfY2FjaGVfZGVsZWdhdGUsCiAgICAgY29tbW9uOjpTdXJmYWNlQ2FjaGUqIHN1cmZhY2VfY2FjaGUsIFR5cGUgdmlzaXRvcl90eXBlKQogICAgIDogZHJhd19zdGF0ZV8ocmVuZGVyX3RhcmdldCksCiAgICAgICBjcmVhdGVfc2NyYXRjaF9zdXJmYWNlX2Z1bmN0aW9uXyhjcmVhdGVfc2NyYXRjaF9zdXJmYWNlX2Z1bmN0aW9uKSwKICAgICAgIHN1cmZhY2VfY2FjaGVfZGVsZWdhdGVfKHN1cmZhY2VfY2FjaGVfZGVsZWdhdGUpLAogICAgICAgc3VyZmFjZV9jYWNoZV8oc3VyZmFjZV9jYWNoZSksCi0gICAgICB2aXNpdG9yX3R5cGVfKHZpc2l0b3JfdHlwZSkgeworICAgICAgdmlzaXRvcl90eXBlXyh2aXNpdG9yX3R5cGUpLAorICAgICAgcmVzZXRfc2tpYV9jb250ZXh0X2Z1bmN0aW9uXyhyZXNldF9za2lhX2NvbnRleHRfZnVuY3Rpb24pIHsKICAgRENIRUNLX0VRKHN1cmZhY2VfY2FjaGVfZGVsZWdhdGVfID09IE5VTEwsIHN1cmZhY2VfY2FjaGVfID09IE5VTEwpOwogICBpZiAoc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZV8pIHsKICAgICAvLyBVcGRhdGUgb3VyIHN1cmZhY2UgY2FjaGUgZGVsZWdhdGUgdG8gcG9pbnQgdG8gdGhpcyByZW5kZXIgdHJlZSBub2RlCkBAIC0yNjQsOSArMjY2LDkgQEAKIAogICAvLyBSZW5kZXIgb3VyIHNvdXJjZSBzdWItdHJlZSBpbnRvIHRoZSBvZmZzY3JlZW4gc3VyZmFjZS4KICAgewotICAgIFJlbmRlclRyZWVOb2RlVmlzaXRvciBzdWJfdmlzaXRvcihjYW52YXMsIGNyZWF0ZV9zY3JhdGNoX3N1cmZhY2VfZnVuY3Rpb25fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlX2NhY2hlX2RlbGVnYXRlXywgc3VyZmFjZV9jYWNoZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUeXBlX1N1YlZpc2l0b3IpOworICAgIFJlbmRlclRyZWVOb2RlVmlzaXRvciBzdWJfdmlzaXRvcigKKyAgICAgICAgY2FudmFzLCBjcmVhdGVfc2NyYXRjaF9zdXJmYWNlX2Z1bmN0aW9uXywgcmVzZXRfc2tpYV9jb250ZXh0X2Z1bmN0aW9uXywKKyAgICAgICAgc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZV8sIHN1cmZhY2VfY2FjaGVfLCBrVHlwZV9TdWJWaXNpdG9yKTsKICAgICBmaWx0ZXJfbm9kZS5zb3VyY2UtPkFjY2VwdCgmc3ViX3Zpc2l0b3IpOwogICB9CiAKQEAgLTYyMiw3ICs2MjQsMTQgQEAKICAgLy8gVGhpcyBzaG91bGQgYmUgYSBxdWljayBvcGVyYXRpb24sIGFuZCBpdCBuZWVkcyB0byBoYXBwZW4gZXZlbnR1YWxseSwgc28KICAgLy8gaWYgaXQgaXMgbm90IGRvbmUgbm93LCBpdCB3aWxsIGJlIGRvbmUgaW4gdGhlIG5leHQgZnJhbWUsIG9yIHRoZSBvbmUgYWZ0ZXIKICAgLy8gdGhhdC4KLSAgaW1hZ2UtPkVuc3VyZUluaXRpYWxpemVkKCk7CisgIGlmIChpbWFnZS0+RW5zdXJlSW5pdGlhbGl6ZWQoKSkgeworICAgIC8vIEVuc3VyZUluaXRpYWxpemVkKCkgbWF5IG1ha2UgYSBudW1iZXIgb2YgR0wgY2FsbHMgdGhhdCByZXN1bHRzIGluIEdMCisgICAgLy8gc3RhdGUgYmVpbmcgbW9kaWZpZWQgYmVoaW5kIFNraWEncyBiYWNrLCB0aGVyZWZvcmUgd2UgaGF2ZSBTa2lhIHJlc2V0IGl0cworICAgIC8vIHN0YXRlIGluIHRoaXMgY2FzZS4KKyAgICBpZiAoIXJlc2V0X3NraWFfY29udGV4dF9mdW5jdGlvbl8uaXNfbnVsbCgpKSB7CisgICAgICByZXNldF9za2lhX2NvbnRleHRfZnVuY3Rpb25fLlJ1bigpOworICAgIH0KKyAgfQogCiAgIC8vIFdlIGlzc3VlIGRpZmZlcmVudCBza2lhIHJhc3Rlcml6YXRpb24gY29tbWFuZHMgdG8gcmVuZGVyIHRoZSBpbWFnZQogICAvLyBkZXBlbmRpbmcgb24gd2hldGhlciBpdCdzIHNpbmdsZSBvciBtdWx0aSBwbGFuZWQuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvci5oCmluZGV4IDNlZmEzYzYuLjY1ZGFjMGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvci5oCkBAIC03Myw2ICs3Myw3IEBACiAgIFJlbmRlclRyZWVOb2RlVmlzaXRvcigKICAgICAgIFNrQ2FudmFzKiByZW5kZXJfdGFyZ2V0LAogICAgICAgY29uc3QgQ3JlYXRlU2NyYXRjaFN1cmZhY2VGdW5jdGlvbiogY3JlYXRlX3NjcmF0Y2hfc3VyZmFjZV9mdW5jdGlvbiwKKyAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIHJlc2V0X3NraWFfY29udGV4dF9mdW5jdGlvbiwKICAgICAgIFN1cmZhY2VDYWNoZURlbGVnYXRlKiBzdXJmYWNlX2NhY2hlX2RlbGVnYXRlLAogICAgICAgY29tbW9uOjpTdXJmYWNlQ2FjaGUqIHN1cmZhY2VfY2FjaGUsIFR5cGUgdmlzaXRvcl90eXBlID0ga1R5cGVfTm9ybWFsKTsKIApAQCAtMTA0LDYgKzEwNSw4IEBACiAgIGJhc2U6Om9wdGlvbmFsPFN1cmZhY2VDYWNoZURlbGVnYXRlOjpTY29wZWRDb250ZXh0PgogICAgICAgc3VyZmFjZV9jYWNoZV9zY29wZWRfY29udGV4dF87CiAKKyAgYmFzZTo6Q2xvc3VyZSByZXNldF9za2lhX2NvbnRleHRfZnVuY3Rpb25fOworCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihSZW5kZXJUcmVlTm9kZVZpc2l0b3IpOwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfaW1hZ2UuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX2ltYWdlLmgKaW5kZXggMzdiZDFhZC4uNjNhZmU2YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfaW1hZ2UuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9pbWFnZS5oCkBAIC01NSw3ICs1NSw3IEBACiAKICAgY29uc3QgU2tCaXRtYXAmIEdldEJpdG1hcCgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGJpdG1hcF87IH0KIAotICB2b2lkIEVuc3VyZUluaXRpYWxpemVkKCkgT1ZFUlJJREUge30KKyAgYm9vbCBFbnN1cmVJbml0aWFsaXplZCgpIE9WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9CiAKICBwcml2YXRlOgogICB2b2lkIEluaXRpYWxpemUodWludDhfdCogc291cmNlX2RhdGEsCkBAIC05NSw3ICs5NSw3IEBACiAgICAgcmV0dXJuIHBsYW5lc19bcGxhbmVfaW5kZXhdLT5HZXRCaXRtYXAoKTsKICAgfQogCi0gIHZvaWQgRW5zdXJlSW5pdGlhbGl6ZWQoKSBPVkVSUklERSB7fQorICBib29sIEVuc3VyZUluaXRpYWxpemVkKCkgT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KIAogIHByaXZhdGU6CiAgIG1hdGg6OlNpemUgc2l6ZV87CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9yYXN0ZXJpemVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmFzdGVyaXplci5jYwppbmRleCBkMWNhZmM2Li44ODRkYjllIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9yYXN0ZXJpemVyLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MKQEAgLTEyMCw3ICsxMjAsNyBAQAogICAgIFJlbmRlclRyZWVOb2RlVmlzaXRvcjo6Q3JlYXRlU2NyYXRjaFN1cmZhY2VGdW5jdGlvbgogICAgICAgICBjcmVhdGVfc2NyYXRjaF9zdXJmYWNlX2Z1bmN0aW9uID0gYmFzZTo6QmluZCgmQ3JlYXRlU2NyYXRjaFN1cmZhY2UpOwogICAgIFJlbmRlclRyZWVOb2RlVmlzaXRvciB2aXNpdG9yKAotICAgICAgICByZW5kZXJfdGFyZ2V0LCAmY3JlYXRlX3NjcmF0Y2hfc3VyZmFjZV9mdW5jdGlvbiwKKyAgICAgICAgcmVuZGVyX3RhcmdldCwgJmNyZWF0ZV9zY3JhdGNoX3N1cmZhY2VfZnVuY3Rpb24sIGJhc2U6OkNsb3N1cmUoKSwKICAgICAgICAgc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZV8gPyAmc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZV8udmFsdWUoKSA6IE5VTEwsCiAgICAgICAgIHN1cmZhY2VfY2FjaGVfID8gJnN1cmZhY2VfY2FjaGVfLnZhbHVlKCkgOiBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5jYwppbmRleCBlYmU4NTMxLi4yM2VlNzBlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5jYwpAQCAtMzAsOSArMzAsMjYgQEAKIH0KIAogUmVuZGVyZXJNb2R1bGU6OlJlbmRlcmVyTW9kdWxlKHN5c3RlbV93aW5kb3c6OlN5c3RlbVdpbmRvdyogc3lzdGVtX3dpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKKyAgICA6IHN5c3RlbV93aW5kb3dfKHN5c3RlbV93aW5kb3cpLCBvcHRpb25zXyhvcHRpb25zKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpyZW5kZXJlciIsICJSZW5kZXJlck1vZHVsZTo6UmVuZGVyZXJNb2R1bGUoKSIpOwogCisgIFJlc3VtZSgpOworfQorCitSZW5kZXJlck1vZHVsZTo6flJlbmRlcmVyTW9kdWxlKCkge30KKwordm9pZCBSZW5kZXJlck1vZHVsZTo6U3VzcGVuZCgpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwgIlJlbmRlcmVyTW9kdWxlOjpTdXNwZW5kKCkiKTsKKyAgcGlwZWxpbmVfLnJlc2V0KCk7CisgIGdyYXBoaWNzX2NvbnRleHRfLnJlc2V0KCk7CisgIGRpc3BsYXlfLnJlc2V0KCk7CisgIGdyYXBoaWNzX3N5c3RlbV8ucmVzZXQoKTsKK30KKwordm9pZCBSZW5kZXJlck1vZHVsZTo6UmVzdW1lKCkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6cmVuZGVyZXIiLCAiUmVuZGVyZXJNb2R1bGU6OlJlc3VtZSgpIik7CisKICAgLy8gTG9hZCB1cCB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGdyYXBoaWNzIHN5c3RlbS4KICAgewogICAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpyZW5kZXJlciIsICJiYWNrZW5kOjpDcmVhdGVEZWZhdWx0R3JhcGhpY3NTeXN0ZW0oKSIpOwpAQCAtNDMsOCArNjAsOCBAQAogICAvLyBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGFyZ3MgdG8gZ2V0IHRoZSByZW5kZXIgdGFyZ2V0LgogICB7CiAgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwgIkdyYXBoaWNzU3lzdGVtOjpDcmVhdGVEaXNwbGF5KCkiKTsKLSAgICBEQ0hFQ0soc3lzdGVtX3dpbmRvdyk7Ci0gICAgZGlzcGxheV8gPSBncmFwaGljc19zeXN0ZW1fLT5DcmVhdGVEaXNwbGF5KHN5c3RlbV93aW5kb3cpOworICAgIERDSEVDSyhzeXN0ZW1fd2luZG93Xyk7CisgICAgZGlzcGxheV8gPSBncmFwaGljc19zeXN0ZW1fLT5DcmVhdGVEaXNwbGF5KHN5c3RlbV93aW5kb3dfKTsKICAgfQogCiAgIC8vIENyZWF0ZSBhIGdyYXBoaWNzIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZhdWx0IGRpc3BsYXkncyByZW5kZXIKQEAgLTYwLDE1ICs3NywxMiBAQAogICB7CiAgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwgIm5ldyByZW5kZXJlcjo6UGlwZWxpbmUoKSIpOwogICAgIHBpcGVsaW5lXyA9IG1ha2Vfc2NvcGVkX3B0cihuZXcgcmVuZGVyZXI6OlBpcGVsaW5lKAotICAgICAgICBiYXNlOjpCaW5kKG9wdGlvbnMuY3JlYXRlX3Jhc3Rlcml6ZXJfZnVuY3Rpb24sIGdyYXBoaWNzX2NvbnRleHRfLmdldCgpLAotICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpLAorICAgICAgICBiYXNlOjpCaW5kKG9wdGlvbnNfLmNyZWF0ZV9yYXN0ZXJpemVyX2Z1bmN0aW9uLCBncmFwaGljc19jb250ZXh0Xy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICBvcHRpb25zXyksCiAgICAgICAgIGRpc3BsYXlfLT5HZXRSZW5kZXJUYXJnZXQoKSwgZ3JhcGhpY3NfY29udGV4dF8uZ2V0KCksCi0gICAgICAgIG9wdGlvbnMuc3VibWl0X2V2ZW5faWZfcmVuZGVyX3RyZWVfaXNfdW5jaGFuZ2VkKSk7CisgICAgICAgIG9wdGlvbnNfLnN1Ym1pdF9ldmVuX2lmX3JlbmRlcl90cmVlX2lzX3VuY2hhbmdlZCkpOwogICB9CiB9CiAKLVJlbmRlcmVyTW9kdWxlOjp+UmVuZGVyZXJNb2R1bGUoKSB7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlLmgKaW5kZXggZmFiNGI2My4uNDQwOTlkNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5oCkBAIC03NiwxMiArNzYsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CiAgIH5SZW5kZXJlck1vZHVsZSgpOwogCisgIHZvaWQgU3VzcGVuZCgpOworICB2b2lkIFJlc3VtZSgpOworCiAgIHJlbmRlcmVyOjpQaXBlbGluZSogcGlwZWxpbmUoKSB7IHJldHVybiBwaXBlbGluZV8uZ2V0KCk7IH0KICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxyZW5kZXJlcjo6YmFja2VuZDo6UmVuZGVyVGFyZ2V0PiByZW5kZXJfdGFyZ2V0KCkgewogICAgIHJldHVybiBkaXNwbGF5Xy0+R2V0UmVuZGVyVGFyZ2V0KCk7CiAgIH0KIAogIHByaXZhdGU6CisgIHN5c3RlbV93aW5kb3c6OlN5c3RlbVdpbmRvdyogc3lzdGVtX3dpbmRvd187CisgIE9wdGlvbnMgb3B0aW9uc187CisKICAgc2NvcGVkX3B0cjxyZW5kZXJlcjo6YmFja2VuZDo6R3JhcGhpY3NTeXN0ZW0+IGdyYXBoaWNzX3N5c3RlbV87CiAgIHNjb3BlZF9wdHI8cmVuZGVyZXI6OmJhY2tlbmQ6OkRpc3BsYXk+IGRpc3BsYXlfOwogICBzY29wZWRfcHRyPHJlbmRlcmVyOjpiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQ+IGdyYXBoaWNzX2NvbnRleHRfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmNjCmluZGV4IDcyYjJlZGIuLmQ1MzM0NTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuY2MKQEAgLTc5LDggKzc5LDE0IEBACiAgICAgICBuZXcgTW96anNXcmFwcGVySGFuZGxlKHdyYXBwZXJfcHJpdmF0ZSkpOwogfQogCi1ib29sIFdyYXBwZXJGYWN0b3J5OjpEb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKEpTT2JqZWN0KiBvYmplY3QsCitib29sIFdyYXBwZXJGYWN0b3J5OjpEb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUeXBlSWQgdHlwZV9pZCkgY29uc3QgeworICAvLyBJZiB0aGUgb2JqZWN0IGRvZXNuJ3QgaGF2ZSBhIHdyYXBwZXIgcHJpdmF0ZSB3aGljaCBtZWFucyBpdCBpcyBub3QgYQorICAvLyBwbGF0Zm9ybSBvYmplY3QsIHNvIHRoZSBvYmplY3QgZG9lc24ndCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZS4KKyAgaWYgKCFXcmFwcGVyUHJpdmF0ZTo6SGFzV3JhcHBlclByaXZhdGUoY29udGV4dF8sIG9iamVjdCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBXcmFwcGFibGVUeXBlRnVuY3Rpb25zSGFzaE1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPQogICAgICAgd3JhcHBhYmxlX3R5cGVfZnVuY3Rpb25zXy5maW5kKHR5cGVfaWQpOwogICBpZiAoaXQgPT0gd3JhcHBhYmxlX3R5cGVfZnVuY3Rpb25zXy5lbmQoKSkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaAppbmRleCA4MjhiZGFjLi43OWJlMWI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaApAQCAtNTEsNyArNTEsOCBAQAogICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBKU09iamVjdCBpcyBhIFdyYXBwZXIgb2JqZWN0LgogICBib29sIElzV3JhcHBlcihKUzo6SGFuZGxlT2JqZWN0IHdyYXBwZXIpIGNvbnN0OwogCi0gIGJvb2wgRG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZShKU09iamVjdCosIGJhc2U6OlR5cGVJZCkgY29uc3Q7CisgIGJvb2wgRG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZShKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlR5cGVJZCBpZCkgY29uc3Q7CiAKICBwcml2YXRlOgogICBzdHJ1Y3QgV3JhcHBhYmxlVHlwZUZ1bmN0aW9ucyB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuY2MKaW5kZXggN2RjMTQxMC4uMWJmMTVjYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmNjCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5jYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcmVmZXJlbmNlZF9vYmplY3RfbWFwLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzb2JqLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzcHJveHkuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC02NSw2ICs2NiwxNyBAQAogfQogCiAvLyBzdGF0aWMKK2Jvb2wgV3JhcHBlclByaXZhdGU6Okhhc1dyYXBwZXJQcml2YXRlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0KSB7CisgIGlmIChqczo6SXNQcm94eShvYmplY3QpKSB7CisgICAgSlM6OlJvb3RlZE9iamVjdCB0YXJnZXRfb2JqZWN0KGNvbnRleHQsIGpzOjpHZXRQcm94eVRhcmdldE9iamVjdChvYmplY3QpKTsKKyAgICByZXR1cm4gV3JhcHBlclByaXZhdGU6Okhhc1dyYXBwZXJQcml2YXRlKGNvbnRleHQsIHRhcmdldF9vYmplY3QpOworICB9CisKKyAgcmV0dXJuIG9iamVjdC0+aGFzUHJpdmF0ZSgpOworfQorCisvLyBzdGF0aWMKIFdyYXBwZXJQcml2YXRlKiBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbVdyYXBwYWJsZSgKICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSwgSlNDb250ZXh0KiBjb250ZXh0LAogICAgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgKaW5kZXggZDdlYmZiMS4uYWUwMjg2ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgKQEAgLTY5LDYgKzY5LDkgQEAKICAgICAgICAgICAgICAgICAgICBHZXRSZWFjaGFibGVXcmFwcGFibGVzRnVuY3Rpb24oKSk7CiAgIH0KIAorICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyB3cmFwcGVyIHByaXZhdGUuCisgIHN0YXRpYyBib29sIEhhc1dyYXBwZXJQcml2YXRlKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QpOworCiAgIC8vIEdldCB0aGUgV3JhcHBlclByaXZhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBXcmFwcGFibGUuIEEgbmV3IEpTT2JqZWN0CiAgIC8vIGFuZCBXcmFwcGVyUHJpdmF0ZSBvYmplY3QgbWF5IGJlIGNyZWF0ZWQuCiAgIHN0YXRpYyBXcmFwcGVyUHJpdmF0ZSogR2V0RnJvbVdyYXBwYWJsZSgKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF9ydW5uZXIuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfcnVubmVyLmNjCmluZGV4IGQ2ODA5NjYuLjM5MDA4ODUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF9ydW5uZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvc2NyaXB0X3J1bm5lci5jYwpAQCAtMTksMTIgKzE5LDUxIEBACiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NvdXJjZV9jb2RlLmgiCisjaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKKyNpZiBTQl9IQVMoQ09SRV9EVU1QX0hBTkRMRVJfU1VQUE9SVCkKKyNkZWZpbmUgSEFORExFX0NPUkVfRFVNUAorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9wczQvY29yZV9kdW1wX2hhbmRsZXIuaCIKKyNlbmRpZiAgLy8gU0JfSEFTKENPUkVfRFVNUF9IQU5ETEVSX1NVUFBPUlQpCisjZW5kaWYgIC8vIGRlZmluZWQoT1NfU1RBUkJPQVJEKQogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBzY3JpcHQgewogCiBuYW1lc3BhY2UgewogCisjaWYgZGVmaW5lZChIQU5ETEVfQ09SRV9EVU1QKQorCitjbGFzcyBTY3JpcHRSdW5uZXJMb2cgeworIHB1YmxpYzoKKyAgU2NyaXB0UnVubmVyTG9nKCkgOiBzdWNjZXNzX2NvdW50XygwKSwgZmFpbF9jb3VudF8oMCkgeworICAgIFNiQ29yZUR1bXBSZWdpc3RlckhhbmRsZXIoQ29yZUR1bXBIYW5kbGVyLCB0aGlzKTsKKyAgfQorICB+U2NyaXB0UnVubmVyTG9nKCkgeyBTYkNvcmVEdW1wVW5yZWdpc3RlckhhbmRsZXIoQ29yZUR1bXBIYW5kbGVyLCB0aGlzKTsgfQorCisgIHN0YXRpYyB2b2lkIENvcmVEdW1wSGFuZGxlcih2b2lkKiBjb250ZXh0KSB7CisgICAgU2JDb3JlRHVtcExvZ0ludGVnZXIoCisgICAgICAgICJTY3JpcHRSdW5uZXIgc3VjY2Vzc2Z1bCBleGVjdXRpb25zIiwKKyAgICAgICAgc3RhdGljX2Nhc3Q8U2NyaXB0UnVubmVyTG9nKj4oY29udGV4dCktPnN1Y2Nlc3NfY291bnRfKTsKKyAgICBTYkNvcmVEdW1wTG9nSW50ZWdlcigiU2NyaXB0UnVubmVyIGZhaWxlZCBleGVjdXRpb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTY3JpcHRSdW5uZXJMb2cqPihjb250ZXh0KS0+ZmFpbF9jb3VudF8pOworICB9CisKKyAgdm9pZCBJbmNyZW1lbnRTdWNjZXNzQ291bnQoKSB7IHN1Y2Nlc3NfY291bnRfKys7IH0KKyAgdm9pZCBJbmNyZW1lbnRGYWlsQ291bnQoKSB7IGZhaWxfY291bnRfKys7IH0KKworIHByaXZhdGU6CisgIGludCBzdWNjZXNzX2NvdW50XzsKKyAgaW50IGZhaWxfY291bnRfOworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2NyaXB0UnVubmVyTG9nKTsKK307CisKK2Jhc2U6OkxhenlJbnN0YW5jZTxTY3JpcHRSdW5uZXJMb2c+IHNjcmlwdF9ydW5uZXJfbG9nID0KKyAgICBMQVpZX0lOU1RBTkNFX0lOSVRJQUxJWkVSOworCisjZW5kaWYgIC8vIGRlZmluZWQoSEFORExFX0NPUkVfRFVNUCkKKwogY2xhc3MgU2NyaXB0UnVubmVySW1wbCA6IHB1YmxpYyBTY3JpcHRSdW5uZXIgewogIHB1YmxpYzoKICAgZXhwbGljaXQgU2NyaXB0UnVubmVySW1wbCgKQEAgLTUzLDggKzkyLDE0IEBACiAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKICAgaWYgKCFnbG9iYWxfZW52aXJvbm1lbnRfLT5FdmFsdWF0ZVNjcmlwdChzb3VyY2VfY29kZSwgJnJlc3VsdCkpIHsKICAgICBETE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gZXhlY3V0ZSBKYXZhU2NyaXB0OiAiIDw8IHJlc3VsdDsKKyNpZiBkZWZpbmVkKEhBTkRMRV9DT1JFX0RVTVApCisgICAgc2NyaXB0X3J1bm5lcl9sb2cuR2V0KCkuSW5jcmVtZW50RmFpbENvdW50KCk7CisjZW5kaWYKICAgICByZXR1cm4gIiI7CiAgIH0KKyNpZiBkZWZpbmVkKEhBTkRMRV9DT1JFX0RVTVApCisgIHNjcmlwdF9ydW5uZXJfbG9nLkdldCgpLkluY3JlbWVudFN1Y2Nlc3NDb3VudCgpOworI2VuZGlmCiAgIHJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL2NodW5rZWRfYnl0ZV9idWZmZXIuY2MgYi9zcmMvY29iYWx0L3NwZWVjaC9jaHVua2VkX2J5dGVfYnVmZmVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzcyZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3NwZWVjaC9jaHVua2VkX2J5dGVfYnVmZmVyLmNjCkBAIC0wLDAgKzEsMTM2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9jaHVua2VkX2J5dGVfYnVmZmVyLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgorI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtIZWFkZXJMZW5ndGggPSBzaXplb2YodWludDMyX3QpOworCitDT01QSUxFX0FTU0VSVChzaXplb2Yoc2l6ZV90KSA+PSBrSGVhZGVyTGVuZ3RoLAorICAgICAgICAgICAgICAgY2h1bmtlZF9ieXRlX2J1ZmZlcl9ub3Rfc3VwcG9ydGVkX29uX3RoaXNfYXJjaGl0ZWN0dXJlKTsKKwordWludDMyX3QgUmVhZEJpZ0VuZGlhbjMyKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlcikgeworICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXJbM10pKSB8CisgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlclsyXSkgPDwgOCkgfAorICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXJbMV0pIDw8IDE2KSB8CisgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlclswXSkgPDwgMjQpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2Ugc3BlZWNoIHsKKworQ2h1bmtlZEJ5dGVCdWZmZXI6OkNodW5rZWRCeXRlQnVmZmVyKCkKKyAgICA6IHBhcnRpYWxfY2h1bmtfKG5ldyBDaHVuaygpKSwKKyAgICAgIHRvdGFsX2J5dGVzX3N0b3JlZF8oMCkgeworfQorCitDaHVua2VkQnl0ZUJ1ZmZlcjo6fkNodW5rZWRCeXRlQnVmZmVyKCkgeworICBDbGVhcigpOworfQorCit2b2lkIENodW5rZWRCeXRlQnVmZmVyOjpBcHBlbmQoY29uc3QgdWludDhfdCogc3RhcnQsIHNpemVfdCBsZW5ndGgpIHsKKyAgc2l6ZV90IHJlbWFpbmluZ19ieXRlcyA9IGxlbmd0aDsKKyAgY29uc3QgdWludDhfdCogbmV4dF9kYXRhID0gc3RhcnQ7CisKKyAgd2hpbGUgKHJlbWFpbmluZ19ieXRlcyA+IDApIHsKKyAgICBEQ0hFQ0socGFydGlhbF9jaHVua18gIT0gTlVMTCk7CisgICAgc2l6ZV90IGluc2VydF9sZW5ndGggPSAwOworICAgIGJvb2wgaGVhZGVyX2NvbXBsZXRlZCA9IGZhbHNlOworICAgIGJvb2wgY29udGVudF9jb21wbGV0ZWQgPSBmYWxzZTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogaW5zZXJ0X3RhcmdldDsKKworICAgIGlmIChwYXJ0aWFsX2NodW5rXy0+aGVhZGVyLnNpemUoKSA8IGtIZWFkZXJMZW5ndGgpIHsKKyAgICAgIGNvbnN0IHNpemVfdCBieXRlc190b19jb21wbGV0ZV9oZWFkZXIgPQorICAgICAgICAgIGtIZWFkZXJMZW5ndGggLSBwYXJ0aWFsX2NodW5rXy0+aGVhZGVyLnNpemUoKTsKKyAgICAgIGluc2VydF9sZW5ndGggPSBzdGQ6Om1pbihieXRlc190b19jb21wbGV0ZV9oZWFkZXIsIHJlbWFpbmluZ19ieXRlcyk7CisgICAgICBpbnNlcnRfdGFyZ2V0ID0gJnBhcnRpYWxfY2h1bmtfLT5oZWFkZXI7CisgICAgICBoZWFkZXJfY29tcGxldGVkID0gKHJlbWFpbmluZ19ieXRlcyA+PSBieXRlc190b19jb21wbGV0ZV9oZWFkZXIpOworICAgIH0gZWxzZSB7CisgICAgICBEQ0hFQ0tfTFQocGFydGlhbF9jaHVua18tPmNvbnRlbnQtPnNpemUoKSwKKyAgICAgICAgICAgICAgICBwYXJ0aWFsX2NodW5rXy0+RXhwZWN0ZWRDb250ZW50TGVuZ3RoKCkpOworICAgICAgY29uc3Qgc2l6ZV90IGJ5dGVzX3RvX2NvbXBsZXRlX2NodW5rID0KKyAgICAgICAgICBwYXJ0aWFsX2NodW5rXy0+RXhwZWN0ZWRDb250ZW50TGVuZ3RoKCkgLQorICAgICAgICAgIHBhcnRpYWxfY2h1bmtfLT5jb250ZW50LT5zaXplKCk7CisgICAgICBpbnNlcnRfbGVuZ3RoID0gc3RkOjptaW4oYnl0ZXNfdG9fY29tcGxldGVfY2h1bmssIHJlbWFpbmluZ19ieXRlcyk7CisgICAgICBpbnNlcnRfdGFyZ2V0ID0gcGFydGlhbF9jaHVua18tPmNvbnRlbnQuZ2V0KCk7CisgICAgICBjb250ZW50X2NvbXBsZXRlZCA9IChyZW1haW5pbmdfYnl0ZXMgPj0gYnl0ZXNfdG9fY29tcGxldGVfY2h1bmspOworICAgIH0KKworICAgIERDSEVDS19HVChpbnNlcnRfbGVuZ3RoLCAwVSk7CisgICAgRENIRUNLX0xFKGluc2VydF9sZW5ndGgsIHJlbWFpbmluZ19ieXRlcyk7CisgICAgRENIRUNLX0xFKG5leHRfZGF0YSArIGluc2VydF9sZW5ndGgsIHN0YXJ0ICsgbGVuZ3RoKTsKKyAgICBpbnNlcnRfdGFyZ2V0LT5pbnNlcnQoaW5zZXJ0X3RhcmdldC0+ZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9kYXRhICsgaW5zZXJ0X2xlbmd0aCk7CisgICAgbmV4dF9kYXRhICs9IGluc2VydF9sZW5ndGg7CisgICAgcmVtYWluaW5nX2J5dGVzIC09IGluc2VydF9sZW5ndGg7CisKKyAgICBpZiAoaGVhZGVyX2NvbXBsZXRlZCkgeworICAgICAgRENIRUNLX0VRKHBhcnRpYWxfY2h1bmtfLT5oZWFkZXIuc2l6ZSgpLCBrSGVhZGVyTGVuZ3RoKTsKKyAgICAgIGlmIChwYXJ0aWFsX2NodW5rXy0+RXhwZWN0ZWRDb250ZW50TGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAvLyBIYW5kbGUgemVyby1ieXRlIGNodW5rcy4KKyAgICAgICAgY2h1bmtzXy5wdXNoX2JhY2socGFydGlhbF9jaHVua18ucmVsZWFzZSgpKTsKKyAgICAgICAgcGFydGlhbF9jaHVua18ucmVzZXQobmV3IENodW5rKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFydGlhbF9jaHVua18tPmNvbnRlbnQtPnJlc2VydmUoCisgICAgICAgICAgICBwYXJ0aWFsX2NodW5rXy0+RXhwZWN0ZWRDb250ZW50TGVuZ3RoKCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29udGVudF9jb21wbGV0ZWQpIHsKKyAgICAgIERDSEVDS19FUShwYXJ0aWFsX2NodW5rXy0+Y29udGVudC0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIHBhcnRpYWxfY2h1bmtfLT5FeHBlY3RlZENvbnRlbnRMZW5ndGgoKSk7CisgICAgICBjaHVua3NfLnB1c2hfYmFjayhwYXJ0aWFsX2NodW5rXy5yZWxlYXNlKCkpOworICAgICAgcGFydGlhbF9jaHVua18ucmVzZXQobmV3IENodW5rKCkpOworICAgIH0KKyAgfQorICBEQ0hFQ0tfRVEobmV4dF9kYXRhLCBzdGFydCArIGxlbmd0aCk7CisgIHRvdGFsX2J5dGVzX3N0b3JlZF8gKz0gbGVuZ3RoOworfQorCit2b2lkIENodW5rZWRCeXRlQnVmZmVyOjpBcHBlbmQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZykgeworICBBcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc3RyaW5nLmRhdGEoKSksIHN0cmluZy5zaXplKCkpOworfQorCitib29sIENodW5rZWRCeXRlQnVmZmVyOjpIYXNDaHVua3MoKSBjb25zdCB7CisgIHJldHVybiAhY2h1bmtzXy5lbXB0eSgpOworfQorCitzY29wZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gQ2h1bmtlZEJ5dGVCdWZmZXI6OlBvcENodW5rKCkgeworICBpZiAoY2h1bmtzXy5lbXB0eSgpKQorICAgIHJldHVybiBzY29wZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4oKS5QYXNzKCk7CisgIHNjb3BlZF9wdHI8Q2h1bms+IGNodW5rKCpjaHVua3NfLmJlZ2luKCkpOworICBjaHVua3NfLndlYWtfZXJhc2UoY2h1bmtzXy5iZWdpbigpKTsKKyAgRENIRUNLX0VRKGNodW5rLT5oZWFkZXIuc2l6ZSgpLCBrSGVhZGVyTGVuZ3RoKTsKKyAgRENIRUNLX0VRKGNodW5rLT5jb250ZW50LT5zaXplKCksIGNodW5rLT5FeHBlY3RlZENvbnRlbnRMZW5ndGgoKSk7CisgIHRvdGFsX2J5dGVzX3N0b3JlZF8gLT0gY2h1bmstPmNvbnRlbnQtPnNpemUoKTsKKyAgdG90YWxfYnl0ZXNfc3RvcmVkXyAtPSBrSGVhZGVyTGVuZ3RoOworICByZXR1cm4gY2h1bmstPmNvbnRlbnQuUGFzcygpOworfQorCit2b2lkIENodW5rZWRCeXRlQnVmZmVyOjpDbGVhcigpIHsKKyAgY2h1bmtzXy5jbGVhcigpOworICBwYXJ0aWFsX2NodW5rXy5yZXNldChuZXcgQ2h1bmsoKSk7CisgIHRvdGFsX2J5dGVzX3N0b3JlZF8gPSAwOworfQorCitDaHVua2VkQnl0ZUJ1ZmZlcjo6Q2h1bms6OkNodW5rKCkgOiBjb250ZW50KG5ldyBzdGQ6OnZlY3Rvcjx1aW50OF90PigpKSB7fQorCitDaHVua2VkQnl0ZUJ1ZmZlcjo6Q2h1bms6On5DaHVuaygpIHsKK30KKworc2l6ZV90IENodW5rZWRCeXRlQnVmZmVyOjpDaHVuazo6RXhwZWN0ZWRDb250ZW50TGVuZ3RoKCkgY29uc3QgeworICBEQ0hFQ0tfRVEoaGVhZGVyLnNpemUoKSwga0hlYWRlckxlbmd0aCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KFJlYWRCaWdFbmRpYW4zMigmaGVhZGVyWzBdKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzcGVlY2gKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL2NodW5rZWRfYnl0ZV9idWZmZXIuaCBiL3NyYy9jb2JhbHQvc3BlZWNoL2NodW5rZWRfYnl0ZV9idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjlkZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvY2h1bmtlZF9ieXRlX2J1ZmZlci5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgQ09CQUxUX1NQRUVDSF9DSFVOS0VEX0JZVEVfQlVGRkVSX0hfCisjZGVmaW5lIENPQkFMVF9TUEVFQ0hfQ0hVTktFRF9CWVRFX0JVRkZFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3ZlY3Rvci5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzcGVlY2ggeworCisvLyBNb2RlbHMgYSBjaHVuay1vcmllbnRlZCBieXRlIGJ1ZmZlci4gVGhlIHRlcm0gY2h1bmsgaXMgaGVyZWluIGRlZmluZWQgYXMgYW4KKy8vIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0IGlzIHByZWNlZWRlZCBieSBOIGhlYWRlciBieXRlcywgaW5kaWNhdGluZworLy8gaXRzIHNpemUuIERhdGEgbWF5IGJlIGFwcGVuZGVkIHRvIHRoZSBidWZmZXIgd2l0aCBubyBwYXJ0aWN1bGFyIHJlc3BlY3Qgb2YKKy8vIGNodW5rcyBib3VuZGFyaWVzLiBIb3dldmVyLCBjaHVua3MgY2FuIGJlIGV4dHJhY3RlZCAoRklGTykgb25seSB3aGVuIHRoZWlyCisvLyBjb250ZW50IChhY2NvcmRpbmcgdG8gdGhlaXIgaGVhZGVyKSBpcyBmdWxseSBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlci4KKy8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHN1cHBvcnQgb25seSA0IGJ5dGUgQmlnIEVuZGlhbiBoZWFkZXJzLgorLy8gRW1wdHkgY2h1bmtzIChpLmUuIHRoZSBzZXF1ZW5jZSAwMCAwMCAwMCAwMCkgYXJlIE5PVCBhbGxvd2VkLgorLy8KKy8vIEUuZy4gMDAgMDAgMDAgMDQgeHggeHggeHggeHggMDAgMDAgMDAgMDIgeXkgeXkgMDAgMDAgMDAgMDQgenogenogenogenoKKy8vICAgICAgWy0tLS0tIENIVU5LIDEgLS0tLS0tLV0gWy0tLSBDSFVOSyAyIC0tLV0gWy0tLS0tLSBDSFVOSyAzIC0tLS0tLV0KK2NsYXNzIENodW5rZWRCeXRlQnVmZmVyIHsKKyBwdWJsaWM6CisgIENodW5rZWRCeXRlQnVmZmVyKCk7CisgIH5DaHVua2VkQnl0ZUJ1ZmZlcigpOworCisgIC8vIEFwcGVuZHMgfGxlbmd0aHwgYnl0ZXMgc3RhcnRpbmcgZnJvbSB8c3RhcnR8IHRvIHRoZSBidWZmZXIuCisgIHZvaWQgQXBwZW5kKGNvbnN0IHVpbnQ4X3QqIHN0YXJ0LCBzaXplX3QgbGVuZ3RoKTsKKworICAvLyBBcHBlbmRzIGJ5dGVzIGNvbnRhaW5lZCBpbiB0aGUgfHN0cmluZ3wgdG8gdGhlIGJ1ZmZlci4KKyAgdm9pZCBBcHBlbmQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZyk7CisKKyAgLy8gQ2hlY2tzIHdoZXRoZXIgb25lIG9yIG1vcmUgY29tcGxldGUgY2h1bmtzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlci4KKyAgYm9vbCBIYXNDaHVua3MoKSBjb25zdDsKKworICAvLyBJZiBlbm91Z2ggZGF0YSBpcyBhdmFpbGFibGUsIHJlYWRzIGFuZCByZW1vdmVzIHRoZSBmaXJzdCBjb21wbGV0ZSBjaHVuaworICAvLyBmcm9tIHRoZSBidWZmZXIuIFJldHVybnMgYSBOVUxMIHBvaW50ZXIgaWYgbm8gY29tcGxldGUgY2h1bmsgaXMgYXZhaWxhYmxlLgorICBzY29wZWRfcHRyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gUG9wQ2h1bmsoKTsKKworICAvLyBDbGVhcnMgYWxsIHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIuCisgIHZvaWQgQ2xlYXIoKTsKKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmF3IGJ5dGVzIChpbmNsdWRpbmcgaGVhZGVycykgcHJlc2VudC4KKyAgc2l6ZV90IEdldFRvdGFsTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gdG90YWxfYnl0ZXNfc3RvcmVkXzsgfQorCisgcHJpdmF0ZToKKyAgc3RydWN0IENodW5rIHsKKyAgICBDaHVuaygpOworICAgIH5DaHVuaygpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaGVhZGVyOworICAgIHNjb3BlZF9wdHI8c3RkOjp2ZWN0b3I8dWludDhfdD4gPiBjb250ZW50OworICAgIHNpemVfdCBFeHBlY3RlZENvbnRlbnRMZW5ndGgoKSBjb25zdDsKKworICAgcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ2h1bmspOworICB9OworCisgIFNjb3BlZFZlY3RvcjxDaHVuaz4gY2h1bmtzXzsKKyAgc2NvcGVkX3B0cjxDaHVuaz4gcGFydGlhbF9jaHVua187CisgIHNpemVfdCB0b3RhbF9ieXRlc19zdG9yZWRfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDaHVua2VkQnl0ZUJ1ZmZlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc3BlZWNoCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1NQRUVDSF9DSFVOS0VEX0JZVEVfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9jaHVua2VkX2J5dGVfYnVmZmVyX3VuaXR0ZXN0LmNjIGIvc3JjL2NvYmFsdC9zcGVlY2gvY2h1bmtlZF9ieXRlX2J1ZmZlcl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGIwYWNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvY2h1bmtlZF9ieXRlX2J1ZmZlcl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDc2IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvYmFsdC9zcGVlY2gvY2h1bmtlZF9ieXRlX2J1ZmZlci5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzcGVlY2ggeworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEJ5dGVWZWN0b3I7CisKK1RFU1QoQ2h1bmtlZEJ5dGVCdWZmZXJUZXN0LCBCYXNpY1Rlc3QpIHsKKyAgQ2h1bmtlZEJ5dGVCdWZmZXIgYnVmZmVyOworCisgIGNvbnN0IHVpbnQ4X3Qga0NodW5rc1tdID0geworICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgIC8vIENodW5rIDE6IDQgYnl0ZXMKKyAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDUsIDB4MDYsICAgICAgICAgICAgICAvLyBDaHVuayAyOiAyIGJ5dGVzCisgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDA3ICAgICAgICAgICAgICAgICAgICAgLy8gQ2h1bmsgMzogMSBieXRlcworICB9OworCisgIEVYUEVDVF9FUSgwVSwgYnVmZmVyLkdldFRvdGFsTGVuZ3RoKCkpOworICBFWFBFQ1RfRkFMU0UoYnVmZmVyLkhhc0NodW5rcygpKTsKKworICAvLyBBcHBlbmQgcGFydGlhbGx5IGNodW5rIDEuCisgIGJ1ZmZlci5BcHBlbmQoa0NodW5rcywgMik7CisgIEVYUEVDVF9FUSgyVSwgYnVmZmVyLkdldFRvdGFsTGVuZ3RoKCkpOworICBFWFBFQ1RfRkFMU0UoYnVmZmVyLkhhc0NodW5rcygpKTsKKworICAvLyBDb21wbGV0ZSBjaHVuayAxLgorICBidWZmZXIuQXBwZW5kKGtDaHVua3MgKyAyLCA2KTsKKyAgRVhQRUNUX0VRKDhVLCBidWZmZXIuR2V0VG90YWxMZW5ndGgoKSk7CisgIEVYUEVDVF9UUlVFKGJ1ZmZlci5IYXNDaHVua3MoKSk7CisKKyAgLy8gQXBwZW5kIGZ1bGx5IGNodW5rIDIuCisgIGJ1ZmZlci5BcHBlbmQoa0NodW5rcyArIDgsIDYpOworICBFWFBFQ1RfRVEoMTRVLCBidWZmZXIuR2V0VG90YWxMZW5ndGgoKSk7CisgIEVYUEVDVF9UUlVFKGJ1ZmZlci5IYXNDaHVua3MoKSk7CisKKyAgLy8gUmVtb3ZlIGFuZCBjaGVjayBjaHVuayAxLgorICBzY29wZWRfcHRyPEJ5dGVWZWN0b3I+IGNodW5rOworICBjaHVuayA9IGJ1ZmZlci5Qb3BDaHVuaygpLlBhc3MoKTsKKyAgRVhQRUNUX1RSVUUoY2h1bmsgIT0gTlVMTCk7CisgIEVYUEVDVF9FUSg0VSwgY2h1bmstPnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBzdGQ6OmNoYXJfdHJhaXRzPHVpbnQ4X3Q+Ojpjb21wYXJlKGtDaHVua3MgKyA0LCAmKCpjaHVuaylbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLT5zaXplKCkpKTsKKyAgRVhQRUNUX0VRKDZVLCBidWZmZXIuR2V0VG90YWxMZW5ndGgoKSk7CisgIEVYUEVDVF9UUlVFKGJ1ZmZlci5IYXNDaHVua3MoKSk7CisKKyAgLy8gUmVhZCBhbmQgY2hlY2sgY2h1bmsgMi4KKyAgY2h1bmsgPSBidWZmZXIuUG9wQ2h1bmsoKS5QYXNzKCk7CisgIEVYUEVDVF9UUlVFKGNodW5rICE9IE5VTEwpOworICBFWFBFQ1RfRVEoMlUsIGNodW5rLT5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgc3RkOjpjaGFyX3RyYWl0czx1aW50OF90Pjo6Y29tcGFyZShrQ2h1bmtzICsgMTIsICYoKmNodW5rKVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmstPnNpemUoKSkpOworICBFWFBFQ1RfRVEoMFUsIGJ1ZmZlci5HZXRUb3RhbExlbmd0aCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci5IYXNDaHVua3MoKSk7CisKKyAgLy8gQXBwZW5kIGZ1bGx5IGNodW5rIDMuCisgIGJ1ZmZlci5BcHBlbmQoa0NodW5rcyArIDE0LCA1KTsKKyAgRVhQRUNUX0VRKDVVLCBidWZmZXIuR2V0VG90YWxMZW5ndGgoKSk7CisKKyAgLy8gUmVtb3ZlIGFuZCBjaGVjayBjaHVuayAzLgorICBjaHVuayA9IGJ1ZmZlci5Qb3BDaHVuaygpLlBhc3MoKTsKKyAgRVhQRUNUX1RSVUUoY2h1bmsgIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgxVSwgY2h1bmstPnNpemUoKSk7CisgIEVYUEVDVF9FUSgoKmNodW5rKVswXSwga0NodW5rc1sxOF0pOworICBFWFBFQ1RfRVEoMFUsIGJ1ZmZlci5HZXRUb3RhbExlbmd0aCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci5IYXNDaHVua3MoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzcGVlY2gKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmNjIGIvc3JjL2NvYmFsdC9zcGVlY2gvZ29vZ2xlX3N0cmVhbWluZ19hcGkucGIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzM2Q4MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmNjCkBAIC0wLDAgKzEsNzU3IEBACisvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorCisjZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJnb29nbGVfc3RyZWFtaW5nX2FwaS5wYi5oIgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHNwZWVjaCB7CituYW1lc3BhY2UgcHJvdG8geworCit2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpIHsKKyAgZGVsZXRlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6ZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK3ZvaWQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpIHsKKyAgc3RhdGljIGJvb2wgYWxyZWFkeV9oZXJlID0gZmFsc2U7CisgIGlmIChhbHJlYWR5X2hlcmUpIHJldHVybjsKKyAgYWxyZWFkeV9oZXJlID0gdHJ1ZTsKKyAgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OOworCisgIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFNwZWVjaFJlY29nbml0aW9uRXZlbnQoKTsKKyAgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0KCk7CisgIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUoKTsKKyAgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok9uU2h1dGRvd24oJnByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90byk7Cit9CisKKy8vIEZvcmNlIEFkZERlc2NyaXB0b3JzKCkgdG8gYmUgY2FsbGVkIGF0IHN0YXRpYyBpbml0aWFsaXphdGlvbiB0aW1lLgorc3RydWN0IFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl9nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90byB7CisgIFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl9nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpIHsKKyAgICBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7CisgIH0KK30gc3RhdGljX2Rlc2NyaXB0b3JfaW5pdGlhbGl6ZXJfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG9fOworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYm9vbCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgc3dpdGNoKHZhbHVlKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICBjYXNlIDU6CisgICAgY2FzZSA2OgorICAgIGNhc2UgNzoKKyAgICBjYXNlIDg6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTVEFUVVNfU1VDQ0VTUzsKK2NvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTVEFUVVNfTk9fU1BFRUNIOworY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OlNUQVRVU19BQk9SVEVEOworY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OlNUQVRVU19BVURJT19DQVBUVVJFOworY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OlNUQVRVU19ORVRXT1JLOworY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OlNUQVRVU19OT1RfQUxMT1dFRDsKK2NvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTVEFUVVNfU0VSVklDRV9OT1RfQUxMT1dFRDsKK2NvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTVEFUVVNfQkFEX0dSQU1NQVI7Citjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGUgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6U1RBVFVTX0xBTkdVQUdFX05PVF9TVVBQT1JURUQ7Citjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGUgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6U3RhdHVzQ29kZV9NSU47Citjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGUgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6U3RhdHVzQ29kZV9NQVg7Citjb25zdCBpbnQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6U3RhdHVzQ29kZV9BUlJBWVNJWkU7CisjZW5kaWYgIC8vIF9NU0NfVkVSCitib29sIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2godmFsdWUpIHsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTVEFSVF9PRl9TUEVFQ0g7Citjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6RU5EX09GX1NQRUVDSDsKK2NvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpFTkRfT0ZfQVVESU87Citjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6RU5EX09GX1VUVEVSQU5DRTsKK2NvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpFbmRwb2ludGVyRXZlbnRUeXBlX01JTjsKK2NvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpFbmRwb2ludGVyRXZlbnRUeXBlX01BWDsKK2NvbnN0IGludCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpFbmRwb2ludGVyRXZlbnRUeXBlX0FSUkFZU0laRTsKKyNlbmRpZiAgLy8gX01TQ19WRVIKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjprU3RhdHVzRmllbGROdW1iZXI7Citjb25zdCBpbnQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6a1Jlc3VsdEZpZWxkTnVtYmVyOworY29uc3QgaW50IFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmtFbmRwb2ludEZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworU3BlZWNoUmVjb2duaXRpb25FdmVudDo6U3BlZWNoUmVjb2duaXRpb25FdmVudCgpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworU3BlZWNoUmVjb2duaXRpb25FdmVudDo6U3BlZWNoUmVjb2duaXRpb25FdmVudChjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50JiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBzdGF0dXNfID0gMDsKKyAgZW5kcG9pbnRfID0gMDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworU3BlZWNoUmVjb2duaXRpb25FdmVudDo6flNwZWVjaFJlY29nbml0aW9uRXZlbnQoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTaGFyZWREdG9yKCkgeworICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICB9Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50JiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworU3BlZWNoUmVjb2duaXRpb25FdmVudCogU3BlZWNoUmVjb2duaXRpb25FdmVudDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitTcGVlY2hSZWNvZ25pdGlvbkV2ZW50KiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgU3BlZWNoUmVjb2duaXRpb25FdmVudDsKK30KKwordm9pZCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpDbGVhcigpIHsKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBzdGF0dXNfID0gMDsKKyAgICBlbmRwb2ludF8gPSAwOworICB9CisgIHJlc3VsdF8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworYm9vbCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LlN0YXR1c0NvZGUgc3RhdHVzID0gMSBbZGVmYXVsdCA9IFNUQVRVU19TVUNDRVNTXTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOworICAgICAgICAgIGlmICg6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX0lzVmFsaWQodmFsdWUpKSB7CisgICAgICAgICAgICBzZXRfc3RhdHVzKHN0YXRpY19jYXN0PCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlID4odmFsdWUpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfcmVzdWx0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQgcmVzdWx0ID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9yZXN1bHQ6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3Jlc3VsdCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfcmVzdWx0OworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzMikpIGdvdG8gcGFyc2VfZW5kcG9pbnQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LkVuZHBvaW50ZXJFdmVudFR5cGUgZW5kcG9pbnQgPSA0OworICAgICAgY2FzZSA0OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfZW5kcG9pbnQ6CisgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKKyAgICAgICAgICBpZiAoOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZV9Jc1ZhbGlkKHZhbHVlKSkgeworICAgICAgICAgICAgc2V0X2VuZHBvaW50KHN0YXRpY19jYXN0PCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlID4odmFsdWUpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuU3RhdHVzQ29kZSBzdGF0dXMgPSAxIFtkZWZhdWx0ID0gU1RBVFVTX1NVQ0NFU1NdOworICBpZiAoaGFzX3N0YXR1cygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKKyAgICAgIDEsIHRoaXMtPnN0YXR1cygpLCBvdXRwdXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdCByZXN1bHQgPSAyOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnJlc3VsdF9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2UoCisgICAgICAyLCB0aGlzLT5yZXN1bHQoaSksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuRW5kcG9pbnRlckV2ZW50VHlwZSBlbmRwb2ludCA9IDQ7CisgIGlmIChoYXNfZW5kcG9pbnQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oCisgICAgICA0LCB0aGlzLT5lbmRwb2ludCgpLCBvdXRwdXQpOworICB9CisgIAorfQorCitpbnQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKyAgCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5TdGF0dXNDb2RlIHN0YXR1cyA9IDEgW2RlZmF1bHQgPSBTVEFUVVNfU1VDQ0VTU107CisgICAgaWYgKGhhc19zdGF0dXMoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPnN0YXR1cygpKTsKKyAgICB9CisgICAgCisgICAgLy8gb3B0aW9uYWwgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5FbmRwb2ludGVyRXZlbnRUeXBlIGVuZHBvaW50ID0gNDsKKyAgICBpZiAoaGFzX2VuZHBvaW50KCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5lbmRwb2ludCgpKTsKKyAgICB9CisgICAgCisgIH0KKyAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQgcmVzdWx0ID0gMjsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+cmVzdWx0X3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5yZXN1bHRfc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPnJlc3VsdChpKSk7CisgIH0KKyAgCisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKAorICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIGZyb20pIHsKKyAgTWVyZ2VGcm9tKCo6Omdvb2dsZTo6cHJvdG9idWY6OmRvd25fY2FzdDxjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50Kj4oJmZyb20pKTsKK30KKwordm9pZCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpNZXJnZUZyb20oY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudCYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICByZXN1bHRfLk1lcmdlRnJvbShmcm9tLnJlc3VsdF8pOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX3N0YXR1cygpKSB7CisgICAgICBzZXRfc3RhdHVzKGZyb20uc3RhdHVzKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfZW5kcG9pbnQoKSkgeworICAgICAgc2V0X2VuZHBvaW50KGZyb20uZW5kcG9pbnQoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6Q29weUZyb20oY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudCYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OlN3YXAoU3BlZWNoUmVjb2duaXRpb25FdmVudCogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAoc3RhdHVzXywgb3RoZXItPnN0YXR1c18pOworICAgIHJlc3VsdF8uU3dhcCgmb3RoZXItPnJlc3VsdF8pOworICAgIHN0ZDo6c3dhcChlbmRwb2ludF8sIG90aGVyLT5lbmRwb2ludF8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6OnN0ZDo6c3RyaW5nIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OkdldFR5cGVOYW1lKCkgY29uc3QgeworICByZXR1cm4gImNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudCI7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmtBbHRlcm5hdGl2ZUZpZWxkTnVtYmVyOworY29uc3QgaW50IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjprRmluYWxGaWVsZE51bWJlcjsKK2NvbnN0IGludCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6a1N0YWJpbGl0eUZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KGNvbnN0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0JiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgZmluYWxfID0gZmFsc2U7CisgIHN0YWJpbGl0eV8gPSAwOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6flNwZWVjaFJlY29nbml0aW9uUmVzdWx0KCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OlNoYXJlZER0b3IoKSB7CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCYgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCogU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworU3BlZWNoUmVjb2duaXRpb25SZXN1bHQqIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ7Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OkNsZWFyKCkgeworICBpZiAoX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgeworICAgIGZpbmFsXyA9IGZhbHNlOworICAgIHN0YWJpbGl0eV8gPSAwOworICB9CisgIGFsdGVybmF0aXZlXy5DbGVhcigpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitib29sIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyByZXBlYXRlZCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlIGFsdGVybmF0aXZlID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9hbHRlcm5hdGl2ZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfYWx0ZXJuYXRpdmUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTApKSBnb3RvIHBhcnNlX2FsdGVybmF0aXZlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2VfZmluYWw7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBib29sIGZpbmFsID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgIHBhcnNlX2ZpbmFsOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmZmluYWxfKSkpOworICAgICAgICAgIHNldF9oYXNfZmluYWwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI5KSkgZ290byBwYXJzZV9zdGFiaWxpdHk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBmbG9hdCBzdGFiaWxpdHkgPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzIpIHsKKyAgICAgICAgIHBhcnNlX3N0YWJpbGl0eToKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGZsb2F0LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GTE9BVD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmc3RhYmlsaXR5XykpKTsKKyAgICAgICAgICBzZXRfaGFzX3N0YWJpbGl0eSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSBhbHRlcm5hdGl2ZSA9IDE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+YWx0ZXJuYXRpdmVfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlKAorICAgICAgMSwgdGhpcy0+YWx0ZXJuYXRpdmUoaSksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIGJvb2wgZmluYWwgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2ZpbmFsKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDIsIHRoaXMtPmZpbmFsKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIGZsb2F0IHN0YWJpbGl0eSA9IDM7CisgIGlmIChoYXNfc3RhYmlsaXR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdCgzLCB0aGlzLT5zdGFiaWxpdHkoKSwgb3V0cHV0KTsKKyAgfQorICAKK30KKworaW50IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworICAKKyAgaWYgKF9oYXNfYml0c19bMSAvIDMyXSAmICgweGZmdSA8PCAoMSAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBib29sIGZpbmFsID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoaGFzX2ZpbmFsKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgICAgfQorICAgIAorICAgIC8vIG9wdGlvbmFsIGZsb2F0IHN0YWJpbGl0eSA9IDM7CisgICAgaWYgKGhhc19zdGFiaWxpdHkoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgNDsKKyAgICB9CisgICAgCisgIH0KKyAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSBhbHRlcm5hdGl2ZSA9IDE7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmFsdGVybmF0aXZlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5hbHRlcm5hdGl2ZV9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+YWx0ZXJuYXRpdmUoaSkpOworICB9CisgIAorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpDaGVja1R5cGVBbmRNZXJnZUZyb20oCisgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSkgeworICBNZXJnZUZyb20oKjo6Z29vZ2xlOjpwcm90b2J1Zjo6ZG93bl9jYXN0PGNvbnN0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0Kj4oJmZyb20pKTsKK30KKwordm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6TWVyZ2VGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0JiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGFsdGVybmF0aXZlXy5NZXJnZUZyb20oZnJvbS5hbHRlcm5hdGl2ZV8pOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzEgLyAzMl0gJiAoMHhmZnUgPDwgKDEgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX2ZpbmFsKCkpIHsKKyAgICAgIHNldF9maW5hbChmcm9tLmZpbmFsKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfc3RhYmlsaXR5KCkpIHsKKyAgICAgIHNldF9zdGFiaWxpdHkoZnJvbS5zdGFiaWxpdHkoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OkNvcHlGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0JiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpTd2FwKFNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIGFsdGVybmF0aXZlXy5Td2FwKCZvdGhlci0+YWx0ZXJuYXRpdmVfKTsKKyAgICBzdGQ6OnN3YXAoZmluYWxfLCBvdGhlci0+ZmluYWxfKTsKKyAgICBzdGQ6OnN3YXAoc3RhYmlsaXR5Xywgb3RoZXItPnN0YWJpbGl0eV8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6OnN0ZDo6c3RyaW5nIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpHZXRUeXBlTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0IjsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjprVHJhbnNjcmlwdEZpZWxkTnVtYmVyOworY29uc3QgaW50IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OmtDb25maWRlbmNlRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIHRyYW5zY3JpcHRfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBjb25maWRlbmNlXyA9IDA7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK1NwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6On5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKHRyYW5zY3JpcHRfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgdHJhbnNjcmlwdF87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSYgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK1NwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUqIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSogU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU7Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc190cmFuc2NyaXB0KCkpIHsKKyAgICAgIGlmICh0cmFuc2NyaXB0XyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIHRyYW5zY3JpcHRfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBjb25maWRlbmNlXyA9IDA7CisgIH0KKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworYm9vbCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhbnNjcmlwdCA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV90cmFuc2NyaXB0KCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDIxKSkgZ290byBwYXJzZV9jb25maWRlbmNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gb3B0aW9uYWwgZmxvYXQgY29uZmlkZW5jZSA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMikgeworICAgICAgICAgcGFyc2VfY29uZmlkZW5jZToKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGZsb2F0LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GTE9BVD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmY29uZmlkZW5jZV8pKSk7CisgICAgICAgICAgc2V0X2hhc19jb25maWRlbmNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyB0cmFuc2NyaXB0ID0gMTsKKyAgaWYgKGhhc190cmFuc2NyaXB0KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAxLCB0aGlzLT50cmFuc2NyaXB0KCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIGZsb2F0IGNvbmZpZGVuY2UgPSAyOworICBpZiAoaGFzX2NvbmZpZGVuY2UoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUZsb2F0KDIsIHRoaXMtPmNvbmZpZGVuY2UoKSwgb3V0cHV0KTsKKyAgfQorICAKK30KKworaW50IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgIAorICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIC8vIG9wdGlvbmFsIHN0cmluZyB0cmFuc2NyaXB0ID0gMTsKKyAgICBpZiAoaGFzX3RyYW5zY3JpcHQoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+dHJhbnNjcmlwdCgpKTsKKyAgICB9CisgICAgCisgICAgLy8gb3B0aW9uYWwgZmxvYXQgY29uZmlkZW5jZSA9IDI7CisgICAgaWYgKGhhc19jb25maWRlbmNlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDQ7CisgICAgfQorICAgIAorICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKAorICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIGZyb20pIHsKKyAgTWVyZ2VGcm9tKCo6Omdvb2dsZTo6cHJvdG9idWY6OmRvd25fY2FzdDxjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKj4oJmZyb20pKTsKK30KKwordm9pZCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpNZXJnZUZyb20oY29uc3QgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX3RyYW5zY3JpcHQoKSkgeworICAgICAgc2V0X3RyYW5zY3JpcHQoZnJvbS50cmFuc2NyaXB0KCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfY29uZmlkZW5jZSgpKSB7CisgICAgICBzZXRfY29uZmlkZW5jZShmcm9tLmNvbmZpZGVuY2UoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6Q29weUZyb20oY29uc3QgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OlN3YXAoU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAodHJhbnNjcmlwdF8sIG90aGVyLT50cmFuc2NyaXB0Xyk7CisgICAgc3RkOjpzd2FwKGNvbmZpZGVuY2VfLCBvdGhlci0+Y29uZmlkZW5jZV8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6OnN0ZDo6c3RyaW5nIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OkdldFR5cGVOYW1lKCkgY29uc3QgeworICByZXR1cm4gImNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSI7Cit9CisKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvCit9ICAvLyBuYW1lc3BhY2Ugc3BlZWNoCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9nb29nbGVfc3RyZWFtaW5nX2FwaS5wYi5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvZ29vZ2xlX3N0cmVhbWluZ19hcGkucGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY2NDIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvZ29vZ2xlX3N0cmVhbWluZ19hcGkucGIuaApAQCAtMCwwICsxLDYxMyBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlX3N0cmVhbWluZ19hcGkucHJvdG8KKworI2lmbmRlZiBQUk9UT0JVRl9nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90b19fSU5DTFVERUQKKyNkZWZpbmUgUFJPVE9CVUZfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG9fX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKyNpZiBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiA8IDIwMDQwMDAKKyNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZSB1cGRhdGUKKyNlcnJvciB5b3VyIGhlYWRlcnMuCisjZW5kaWYKKyNpZiAyMDA0MDAyIDwgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCisjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZQorI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzcGVlY2ggeworbmFtZXNwYWNlIHByb3RvIHsKKworLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCBjYWxsIHRoZXNlLgordm9pZCAgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOwordm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7Cit2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOworCitjbGFzcyBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OworY2xhc3MgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ7CitjbGFzcyBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOworCitlbnVtIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSB7CisgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfU1VDQ0VTUyA9IDAsCisgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfTk9fU1BFRUNIID0gMSwKKyAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19BQk9SVEVEID0gMiwKKyAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19BVURJT19DQVBUVVJFID0gMywKKyAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19ORVRXT1JLID0gNCwKKyAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19OT1RfQUxMT1dFRCA9IDUsCisgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfU0VSVklDRV9OT1RfQUxMT1dFRCA9IDYsCisgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfQkFEX0dSQU1NQVIgPSA3LAorICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX0xBTkdVQUdFX05PVF9TVVBQT1JURUQgPSA4Cit9OworYm9vbCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfSXNWYWxpZChpbnQgdmFsdWUpOworY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TdGF0dXNDb2RlX01JTiA9IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfU1VDQ0VTUzsKK2NvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU3RhdHVzQ29kZV9NQVggPSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX0xBTkdVQUdFX05PVF9TVVBQT1JURUQ7Citjb25zdCBpbnQgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1N0YXR1c0NvZGVfQVJSQVlTSVpFID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1N0YXR1c0NvZGVfTUFYICsgMTsKKworZW51bSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgeworICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGVfU1RBUlRfT0ZfU1BFRUNIID0gMCwKKyAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VORF9PRl9TUEVFQ0ggPSAxLAorICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGVfRU5EX09GX0FVRElPID0gMiwKKyAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VORF9PRl9VVFRFUkFOQ0UgPSAzCit9OworYm9vbCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGVfSXNWYWxpZChpbnQgdmFsdWUpOworY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZV9FbmRwb2ludGVyRXZlbnRUeXBlX01JTiA9IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZV9TVEFSVF9PRl9TUEVFQ0g7Citjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VuZHBvaW50ZXJFdmVudFR5cGVfTUFYID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VORF9PRl9VVFRFUkFOQ0U7Citjb25zdCBpbnQgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VuZHBvaW50ZXJFdmVudFR5cGVfQVJSQVlTSVpFID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VuZHBvaW50ZXJFdmVudFR5cGVfTUFYICsgMTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50IDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUgeworIHB1YmxpYzoKKyAgU3BlZWNoUmVjb2duaXRpb25FdmVudCgpOworICB2aXJ0dWFsIH5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50KCk7CisgIAorICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50KGNvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnQmIGZyb20pOworICAKKyAgaW5saW5lIFNwZWVjaFJlY29nbml0aW9uRXZlbnQmIG9wZXJhdG9yPShjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50JiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBzdGF0aWMgY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudCYgZGVmYXVsdF9pbnN0YW5jZSgpOworICAKKyAgdm9pZCBTd2FwKFNwZWVjaFJlY29nbml0aW9uRXZlbnQqIG90aGVyKTsKKyAgCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50KiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudCYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnQmIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisgIAorICA6OnN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgY29uc3Q7CisgIAorICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgdHlwZWRlZiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGUgU3RhdHVzQ29kZTsKKyAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX1NVQ0NFU1MgPSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX1NVQ0NFU1M7CisgIHN0YXRpYyBjb25zdCBTdGF0dXNDb2RlIFNUQVRVU19OT19TUEVFQ0ggPSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX05PX1NQRUVDSDsKKyAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX0FCT1JURUQgPSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX0FCT1JURUQ7CisgIHN0YXRpYyBjb25zdCBTdGF0dXNDb2RlIFNUQVRVU19BVURJT19DQVBUVVJFID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19BVURJT19DQVBUVVJFOworICBzdGF0aWMgY29uc3QgU3RhdHVzQ29kZSBTVEFUVVNfTkVUV09SSyA9IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfTkVUV09SSzsKKyAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX05PVF9BTExPV0VEID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19OT1RfQUxMT1dFRDsKKyAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX1NFUlZJQ0VfTk9UX0FMTE9XRUQgPSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX1NFUlZJQ0VfTk9UX0FMTE9XRUQ7CisgIHN0YXRpYyBjb25zdCBTdGF0dXNDb2RlIFNUQVRVU19CQURfR1JBTU1BUiA9IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfQkFEX0dSQU1NQVI7CisgIHN0YXRpYyBjb25zdCBTdGF0dXNDb2RlIFNUQVRVU19MQU5HVUFHRV9OT1RfU1VQUE9SVEVEID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19MQU5HVUFHRV9OT1RfU1VQUE9SVEVEOworICBzdGF0aWMgaW5saW5lIGJvb2wgU3RhdHVzQ29kZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICAgIHJldHVybiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfSXNWYWxpZCh2YWx1ZSk7CisgIH0KKyAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU3RhdHVzQ29kZV9NSU4gPQorICAgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TdGF0dXNDb2RlX01JTjsKKyAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU3RhdHVzQ29kZV9NQVggPQorICAgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TdGF0dXNDb2RlX01BWDsKKyAgc3RhdGljIGNvbnN0IGludCBTdGF0dXNDb2RlX0FSUkFZU0laRSA9CisgICAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1N0YXR1c0NvZGVfQVJSQVlTSVpFOworICAKKyAgdHlwZWRlZiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgRW5kcG9pbnRlckV2ZW50VHlwZTsKKyAgc3RhdGljIGNvbnN0IEVuZHBvaW50ZXJFdmVudFR5cGUgU1RBUlRfT0ZfU1BFRUNIID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX1NUQVJUX09GX1NQRUVDSDsKKyAgc3RhdGljIGNvbnN0IEVuZHBvaW50ZXJFdmVudFR5cGUgRU5EX09GX1NQRUVDSCA9IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZV9FTkRfT0ZfU1BFRUNIOworICBzdGF0aWMgY29uc3QgRW5kcG9pbnRlckV2ZW50VHlwZSBFTkRfT0ZfQVVESU8gPSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGVfRU5EX09GX0FVRElPOworICBzdGF0aWMgY29uc3QgRW5kcG9pbnRlckV2ZW50VHlwZSBFTkRfT0ZfVVRURVJBTkNFID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VORF9PRl9VVFRFUkFOQ0U7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBFbmRwb2ludGVyRXZlbnRUeXBlX0lzVmFsaWQoaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZV9Jc1ZhbGlkKHZhbHVlKTsKKyAgfQorICBzdGF0aWMgY29uc3QgRW5kcG9pbnRlckV2ZW50VHlwZSBFbmRwb2ludGVyRXZlbnRUeXBlX01JTiA9CisgICAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VuZHBvaW50ZXJFdmVudFR5cGVfTUlOOworICBzdGF0aWMgY29uc3QgRW5kcG9pbnRlckV2ZW50VHlwZSBFbmRwb2ludGVyRXZlbnRUeXBlX01BWCA9CisgICAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VuZHBvaW50ZXJFdmVudFR5cGVfTUFYOworICBzdGF0aWMgY29uc3QgaW50IEVuZHBvaW50ZXJFdmVudFR5cGVfQVJSQVlTSVpFID0KKyAgICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGVfRW5kcG9pbnRlckV2ZW50VHlwZV9BUlJBWVNJWkU7CisgIAorICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gb3B0aW9uYWwgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5TdGF0dXNDb2RlIHN0YXR1cyA9IDEgW2RlZmF1bHQgPSBTVEFUVVNfU1VDQ0VTU107CisgIGlubGluZSBib29sIGhhc19zdGF0dXMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfc3RhdHVzKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1N0YXR1c0ZpZWxkTnVtYmVyID0gMTsKKyAgaW5saW5lIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGUgc3RhdHVzKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9zdGF0dXMoOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSB2YWx1ZSk7CisgIAorICAvLyByZXBlYXRlZCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdCByZXN1bHQgPSAyOworICBpbmxpbmUgaW50IHJlc3VsdF9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3Jlc3VsdCgpOworICBzdGF0aWMgY29uc3QgaW50IGtSZXN1bHRGaWVsZE51bWJlciA9IDI7CisgIGlubGluZSBjb25zdCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQmIHJlc3VsdChpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBtdXRhYmxlX3Jlc3VsdChpbnQgaW5kZXgpOworICBpbmxpbmUgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBhZGRfcmVzdWx0KCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCA+JgorICAgICAgcmVzdWx0KCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCA+KgorICAgICAgbXV0YWJsZV9yZXN1bHQoKTsKKyAgCisgIC8vIG9wdGlvbmFsIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuRW5kcG9pbnRlckV2ZW50VHlwZSBlbmRwb2ludCA9IDQ7CisgIGlubGluZSBib29sIGhhc19lbmRwb2ludCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9lbmRwb2ludCgpOworICBzdGF0aWMgY29uc3QgaW50IGtFbmRwb2ludEZpZWxkTnVtYmVyID0gNDsKKyAgaW5saW5lIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgZW5kcG9pbnQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2VuZHBvaW50KDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgdmFsdWUpOworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudCkKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX3N0YXR1cygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfc3RhdHVzKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfZW5kcG9pbnQoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2VuZHBvaW50KCk7CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCA+IHJlc3VsdF87CisgIGludCBzdGF0dXNfOworICBpbnQgZW5kcG9pbnRfOworICAKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMyArIDMxKSAvIDMyXTsKKyAgCisgIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7CisgIAorICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgU3BlZWNoUmVjb2duaXRpb25FdmVudCogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlIHsKKyBwdWJsaWM6CisgIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0KCk7CisgIHZpcnR1YWwgflNwZWVjaFJlY29nbml0aW9uUmVzdWx0KCk7CisgIAorICBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdChjb25zdCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCYgZnJvbSk7CisgIAorICBpbmxpbmUgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQmIG9wZXJhdG9yPShjb25zdCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAKKyAgc3RhdGljIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0JiBkZWZhdWx0X2luc3RhbmNlKCk7CisgIAorICB2b2lkIFN3YXAoU3BlZWNoUmVjb2duaXRpb25SZXN1bHQqIG90aGVyKTsKKyAgCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0JiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQmIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisgIAorICA6OnN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgY29uc3Q7CisgIAorICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIHJlcGVhdGVkIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUgYWx0ZXJuYXRpdmUgPSAxOworICBpbmxpbmUgaW50IGFsdGVybmF0aXZlX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfYWx0ZXJuYXRpdmUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrQWx0ZXJuYXRpdmVGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSYgYWx0ZXJuYXRpdmUoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBtdXRhYmxlX2FsdGVybmF0aXZlKGludCBpbmRleCk7CisgIGlubGluZSA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSogYWRkX2FsdGVybmF0aXZlKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlID4mCisgICAgICBhbHRlcm5hdGl2ZSgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSA+KgorICAgICAgbXV0YWJsZV9hbHRlcm5hdGl2ZSgpOworICAKKyAgLy8gb3B0aW9uYWwgYm9vbCBmaW5hbCA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlubGluZSBib29sIGhhc19maW5hbCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9maW5hbCgpOworICBzdGF0aWMgY29uc3QgaW50IGtGaW5hbEZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGJvb2wgZmluYWwoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2ZpbmFsKGJvb2wgdmFsdWUpOworICAKKyAgLy8gb3B0aW9uYWwgZmxvYXQgc3RhYmlsaXR5ID0gMzsKKyAgaW5saW5lIGJvb2wgaGFzX3N0YWJpbGl0eSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9zdGFiaWxpdHkoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrU3RhYmlsaXR5RmllbGROdW1iZXIgPSAzOworICBpbmxpbmUgZmxvYXQgc3RhYmlsaXR5KCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9zdGFiaWxpdHkoZmxvYXQgdmFsdWUpOworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQpCisgcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19maW5hbCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZmluYWwoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19zdGFiaWxpdHkoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3N0YWJpbGl0eSgpOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSA+IGFsdGVybmF0aXZlXzsKKyAgYm9vbCBmaW5hbF87CisgIGZsb2F0IHN0YWJpbGl0eV87CisgIAorICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOworICAKKyAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsKKyAgCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUgeworIHB1YmxpYzoKKyAgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSgpOworICB2aXJ0dWFsIH5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKCk7CisgIAorICBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIGZyb20pOworICAKKyAgaW5saW5lIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIG9wZXJhdG9yPShjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBzdGF0aWMgY29uc3QgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSYgZGVmYXVsdF9pbnN0YW5jZSgpOworICAKKyAgdm9pZCBTd2FwKFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUqIG90aGVyKTsKKyAgCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisgIAorICA6OnN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgY29uc3Q7CisgIAorICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyB0cmFuc2NyaXB0ID0gMTsKKyAgaW5saW5lIGJvb2wgaGFzX3RyYW5zY3JpcHQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfdHJhbnNjcmlwdCgpOworICBzdGF0aWMgY29uc3QgaW50IGtUcmFuc2NyaXB0RmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgdHJhbnNjcmlwdCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfdHJhbnNjcmlwdChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF90cmFuc2NyaXB0KGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X3RyYW5zY3JpcHQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfdHJhbnNjcmlwdCgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV90cmFuc2NyaXB0KCk7CisgIAorICAvLyBvcHRpb25hbCBmbG9hdCBjb25maWRlbmNlID0gMjsKKyAgaW5saW5lIGJvb2wgaGFzX2NvbmZpZGVuY2UoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfY29uZmlkZW5jZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtDb25maWRlbmNlRmllbGROdW1iZXIgPSAyOworICBpbmxpbmUgZmxvYXQgY29uZmlkZW5jZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfY29uZmlkZW5jZShmbG9hdCB2YWx1ZSk7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfdHJhbnNjcmlwdCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfdHJhbnNjcmlwdCgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2NvbmZpZGVuY2UoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2NvbmZpZGVuY2UoKTsKKyAgCisgIDo6c3RkOjpzdHJpbmcqIHRyYW5zY3JpcHRfOworICBmbG9hdCBjb25maWRlbmNlXzsKKyAgCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDIgKyAzMSkgLyAzMl07CisgIAorICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOworICAKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUqIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFNwZWVjaFJlY29nbml0aW9uRXZlbnQKKworLy8gb3B0aW9uYWwgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5TdGF0dXNDb2RlIHN0YXR1cyA9IDEgW2RlZmF1bHQgPSBTVEFUVVNfU1VDQ0VTU107CitpbmxpbmUgYm9vbCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpoYXNfc3RhdHVzKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnNldF9oYXNfc3RhdHVzKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6Y2xlYXJfaGFzX3N0YXR1cygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpjbGVhcl9zdGF0dXMoKSB7CisgIHN0YXR1c18gPSAwOworICBjbGVhcl9oYXNfc3RhdHVzKCk7Cit9CitpbmxpbmUgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpzdGF0dXMoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSA+KHN0YXR1c18pOworfQoraW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6c2V0X3N0YXR1cyg6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0soOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9Jc1ZhbGlkKHZhbHVlKSk7CisgIHNldF9oYXNfc3RhdHVzKCk7CisgIHN0YXR1c18gPSB2YWx1ZTsKK30KKworLy8gcmVwZWF0ZWQgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQgcmVzdWx0ID0gMjsKK2lubGluZSBpbnQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6cmVzdWx0X3NpemUoKSBjb25zdCB7CisgIHJldHVybiByZXN1bHRfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmNsZWFyX3Jlc3VsdCgpIHsKKyAgcmVzdWx0Xy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCYgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6cmVzdWx0KGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gcmVzdWx0Xy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCogU3BlZWNoUmVjb2duaXRpb25FdmVudDo6bXV0YWJsZV9yZXN1bHQoaW50IGluZGV4KSB7CisgIHJldHVybiByZXN1bHRfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCogU3BlZWNoUmVjb2duaXRpb25FdmVudDo6YWRkX3Jlc3VsdCgpIHsKKyAgcmV0dXJuIHJlc3VsdF8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQgPiYKK1NwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnJlc3VsdCgpIGNvbnN0IHsKKyAgcmV0dXJuIHJlc3VsdF87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQgPioKK1NwZWVjaFJlY29nbml0aW9uRXZlbnQ6Om11dGFibGVfcmVzdWx0KCkgeworICByZXR1cm4gJnJlc3VsdF87Cit9CisKKy8vIG9wdGlvbmFsIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuRW5kcG9pbnRlckV2ZW50VHlwZSBlbmRwb2ludCA9IDQ7CitpbmxpbmUgYm9vbCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpoYXNfZW5kcG9pbnQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworfQoraW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6c2V0X2hhc19lbmRwb2ludCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmNsZWFyX2hhc19lbmRwb2ludCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpjbGVhcl9lbmRwb2ludCgpIHsKKyAgZW5kcG9pbnRfID0gMDsKKyAgY2xlYXJfaGFzX2VuZHBvaW50KCk7Cit9CitpbmxpbmUgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjplbmRwb2ludCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlID4oZW5kcG9pbnRfKTsKK30KK2lubGluZSB2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnNldF9lbmRwb2ludCg6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0soOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZV9Jc1ZhbGlkKHZhbHVlKSk7CisgIHNldF9oYXNfZW5kcG9pbnQoKTsKKyAgZW5kcG9pbnRfID0gdmFsdWU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU3BlZWNoUmVjb2duaXRpb25SZXN1bHQKKworLy8gcmVwZWF0ZWQgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSBhbHRlcm5hdGl2ZSA9IDE7CitpbmxpbmUgaW50IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjphbHRlcm5hdGl2ZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gYWx0ZXJuYXRpdmVfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpjbGVhcl9hbHRlcm5hdGl2ZSgpIHsKKyAgYWx0ZXJuYXRpdmVfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjphbHRlcm5hdGl2ZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGFsdGVybmF0aXZlXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6bXV0YWJsZV9hbHRlcm5hdGl2ZShpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGFsdGVybmF0aXZlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSogU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmFkZF9hbHRlcm5hdGl2ZSgpIHsKKyAgcmV0dXJuIGFsdGVybmF0aXZlXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlID4mCitTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6YWx0ZXJuYXRpdmUoKSBjb25zdCB7CisgIHJldHVybiBhbHRlcm5hdGl2ZV87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSA+KgorU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6Om11dGFibGVfYWx0ZXJuYXRpdmUoKSB7CisgIHJldHVybiAmYWx0ZXJuYXRpdmVfOworfQorCisvLyBvcHRpb25hbCBib29sIGZpbmFsID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpoYXNfZmluYWwoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OnNldF9oYXNfZmluYWwoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6Y2xlYXJfaGFzX2ZpbmFsKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpjbGVhcl9maW5hbCgpIHsKKyAgZmluYWxfID0gZmFsc2U7CisgIGNsZWFyX2hhc19maW5hbCgpOworfQoraW5saW5lIGJvb2wgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmZpbmFsKCkgY29uc3QgeworICByZXR1cm4gZmluYWxfOworfQoraW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OnNldF9maW5hbChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfZmluYWwoKTsKKyAgZmluYWxfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIGZsb2F0IHN0YWJpbGl0eSA9IDM7CitpbmxpbmUgYm9vbCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6aGFzX3N0YWJpbGl0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6c2V0X2hhc19zdGFiaWxpdHkoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6Y2xlYXJfaGFzX3N0YWJpbGl0eSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6Y2xlYXJfc3RhYmlsaXR5KCkgeworICBzdGFiaWxpdHlfID0gMDsKKyAgY2xlYXJfaGFzX3N0YWJpbGl0eSgpOworfQoraW5saW5lIGZsb2F0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpzdGFiaWxpdHkoKSBjb25zdCB7CisgIHJldHVybiBzdGFiaWxpdHlfOworfQoraW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OnNldF9zdGFiaWxpdHkoZmxvYXQgdmFsdWUpIHsKKyAgc2V0X2hhc19zdGFiaWxpdHkoKTsKKyAgc3RhYmlsaXR5XyA9IHZhbHVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUKKworLy8gb3B0aW9uYWwgc3RyaW5nIHRyYW5zY3JpcHQgPSAxOworaW5saW5lIGJvb2wgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6aGFzX3RyYW5zY3JpcHQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQoraW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6c2V0X2hhc190cmFuc2NyaXB0KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6Y2xlYXJfaGFzX3RyYW5zY3JpcHQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6Y2xlYXJfdHJhbnNjcmlwdCgpIHsKKyAgaWYgKHRyYW5zY3JpcHRfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICB0cmFuc2NyaXB0Xy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfdHJhbnNjcmlwdCgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OnRyYW5zY3JpcHQoKSBjb25zdCB7CisgIHJldHVybiAqdHJhbnNjcmlwdF87Cit9CitpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpzZXRfdHJhbnNjcmlwdChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX3RyYW5zY3JpcHQoKTsKKyAgaWYgKHRyYW5zY3JpcHRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICB0cmFuc2NyaXB0XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHRyYW5zY3JpcHRfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6c2V0X3RyYW5zY3JpcHQoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc190cmFuc2NyaXB0KCk7CisgIGlmICh0cmFuc2NyaXB0XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgdHJhbnNjcmlwdF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICB0cmFuc2NyaXB0Xy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OnNldF90cmFuc2NyaXB0KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX3RyYW5zY3JpcHQoKTsKKyAgaWYgKHRyYW5zY3JpcHRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICB0cmFuc2NyaXB0XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHRyYW5zY3JpcHRfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjptdXRhYmxlX3RyYW5zY3JpcHQoKSB7CisgIHNldF9oYXNfdHJhbnNjcmlwdCgpOworICBpZiAodHJhbnNjcmlwdF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHRyYW5zY3JpcHRfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIHRyYW5zY3JpcHRfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OnJlbGVhc2VfdHJhbnNjcmlwdCgpIHsKKyAgY2xlYXJfaGFzX3RyYW5zY3JpcHQoKTsKKyAgaWYgKHRyYW5zY3JpcHRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gdHJhbnNjcmlwdF87CisgICAgdHJhbnNjcmlwdF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gb3B0aW9uYWwgZmxvYXQgY29uZmlkZW5jZSA9IDI7CitpbmxpbmUgYm9vbCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpoYXNfY29uZmlkZW5jZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpzZXRfaGFzX2NvbmZpZGVuY2UoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpjbGVhcl9oYXNfY29uZmlkZW5jZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpjbGVhcl9jb25maWRlbmNlKCkgeworICBjb25maWRlbmNlXyA9IDA7CisgIGNsZWFyX2hhc19jb25maWRlbmNlKCk7Cit9CitpbmxpbmUgZmxvYXQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6Y29uZmlkZW5jZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbmZpZGVuY2VfOworfQoraW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6c2V0X2NvbmZpZGVuY2UoZmxvYXQgdmFsdWUpIHsKKyAgc2V0X2hhc19jb25maWRlbmNlKCk7CisgIGNvbmZpZGVuY2VfID0gdmFsdWU7Cit9CisKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvCit9ICAvLyBuYW1lc3BhY2Ugc3BlZWNoCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG9fX0lOQ0xVREVECmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9nb29nbGVfc3RyZWFtaW5nX2FwaS5wcm90byBiL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zdHJlYW1pbmdfYXBpLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjVkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3NwZWVjaC9nb29nbGVfc3RyZWFtaW5nX2FwaS5wcm90bwpAQCAtMCwwICsxLDc5IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBDb21tYW5kIHRvIGdlbmVyYXRlIGdvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmggYW5kIGdvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmNjCisvLyBwcm90b2MgLS1wcm90b19wYXRoPS4gLS1jcHBfb3V0PS4gZ29vZ2xlX3N0cmVhbWluZ19hcGkucHJvdG8KKworc3ludGF4ID0gInByb3RvMiI7CitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworCisvLyBUT0RPKGhhbnMpOiBDb21tZW50ZWQgb3V0IGR1ZSB0byBjb21waWxhdGlvbiBlcnJvcnMuCisvLyBvcHRpb24gY2NfYXBpX3ZlcnNpb24gPSAyOworCitwYWNrYWdlIGNvYmFsdC5zcGVlY2gucHJvdG87CisKKy8vIFNwZWVjaFJlY29nbml0aW9uRXZlbnQgaXMgdGhlIG9ubHkgbWVzc2FnZSB0eXBlIHNlbnQgdG8gY2xpZW50LgorLy8KKy8vIFRoZSBmaXJzdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50IGlzIGFuIGVtcHR5IChkZWZhdWx0KSBtZXNzYWdlIHRvIGluZGljYXRlCisvLyBhcyBlYXJseSBhcyBwb3NzaWJsZSB0aGF0IHRoZSBzdHJlYW0gY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC4KK21lc3NhZ2UgU3BlZWNoUmVjb2duaXRpb25FdmVudCB7CisgIGVudW0gU3RhdHVzQ29kZSB7CisgICAgLy8gTm90ZTogaW4gSmF2YVNjcmlwdCBBUEkgU3BlZWNoUmVjb2duaXRpb25FcnJvciAwIGlzICJPVEhFUiIgZXJyb3IuCisgICAgU1RBVFVTX1NVQ0NFU1MgPSAwOworICAgIFNUQVRVU19OT19TUEVFQ0ggPSAxOworICAgIFNUQVRVU19BQk9SVEVEID0gMjsKKyAgICBTVEFUVVNfQVVESU9fQ0FQVFVSRSA9IDM7CisgICAgU1RBVFVTX05FVFdPUksgPSA0OworICAgIFNUQVRVU19OT1RfQUxMT1dFRCA9IDU7CisgICAgU1RBVFVTX1NFUlZJQ0VfTk9UX0FMTE9XRUQgPSA2OworICAgIFNUQVRVU19CQURfR1JBTU1BUiA9IDc7CisgICAgU1RBVFVTX0xBTkdVQUdFX05PVF9TVVBQT1JURUQgPSA4OworICB9CisgIG9wdGlvbmFsIFN0YXR1c0NvZGUgc3RhdHVzID0gMSBbZGVmYXVsdCA9IFNUQVRVU19TVUNDRVNTXTsKKworICAvLyBNYXkgY29udGFpbiB6ZXJvIG9yIG9uZSBmaW5hbD10cnVlIHJlc3VsdCAodGhlIG5ld2x5IHNldHRsZWQgcG9ydGlvbikuCisgIC8vIE1heSBhbHNvIGNvbnRhaW4gemVybyBvciBtb3JlIGZpbmFsPWZhbHNlIHJlc3VsdHMuCisgIC8vIChOb3RlIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gSmF2YVNjcmlwdCBBUEkgcmVzdWx0SGlzdG9yeSBpbiB0aGF0IG5vIG1vcmUKKyAgLy8gdGhhbiBvbmUgZmluYWw9dHJ1ZSByZXN1bHQgaXMgcmV0dXJuZWQsIHNvIGNsaWVudCBtdXN0IGFjY3VtdWxhdGUKKyAgLy8gcmVzdWx0SGlzdG9yeSBieSBjb25jYXRlbmF0aW5nIHRoZSBmaW5hbD10cnVlIHJlc3VsdHMuKQorICByZXBlYXRlZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCByZXN1bHQgPSAyOworCisgIGVudW0gRW5kcG9pbnRlckV2ZW50VHlwZSB7CisgICAgU1RBUlRfT0ZfU1BFRUNIID0gMDsKKyAgICBFTkRfT0ZfU1BFRUNIID0gMTsKKyAgICBFTkRfT0ZfQVVESU8gPSAyOyAgLy8gRW5kIG9mIGF1ZGlvIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgorICAgIC8vIEVuZCBvZiB1dHRlcmFuY2UgaW5kaWNhdGVzIHRoYXQgbm8gbW9yZSBzcGVlY2ggc2VnbWVudHMgYXJlIGV4cGVjdGVkLgorICAgIEVORF9PRl9VVFRFUkFOQ0UgPSAzOworICB9CisKKyAgb3B0aW9uYWwgRW5kcG9pbnRlckV2ZW50VHlwZSBlbmRwb2ludCA9IDQ7Cit9OworCittZXNzYWdlIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0IHsKKyAgcmVwZWF0ZWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSBhbHRlcm5hdGl2ZSA9IDE7CisKKyAgLy8gVHJ1ZSBpZiB0aGlzIGlzIHRoZSBmaW5hbCB0aW1lIHRoZSBzcGVlY2ggc2VydmljZSB3aWxsIHJldHVybiB0aGlzCisgIC8vIHBhcnRpY3VsYXIgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQuIElmIGZhbHNlLCB0aGVuIHRoaXMgcmVwcmVzZW50cyBhbgorICAvLyBpbnRlcmltIHJlc3VsdCB0aGF0IGNvdWxkIHN0aWxsIGJlIGNoYW5nZWQuCisgIG9wdGlvbmFsIGJvb2wgZmluYWwgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOworCisgIC8vIEFuIGVzdGltYXRlIG9mIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSByZWNvZ25pemVyIHdpbGwgbm90IGNoYW5nZSBpdHMKKyAgLy8gZ3Vlc3MgYWJvdXQgdGhpcyBpbnRlcmltIHJlc3VsdC4gIFZhbHVlcyByYW5nZSBmcm9tIDAuMCAoY29tcGxldGVseQorICAvLyB1bnN0YWJsZSkgdG8gMS4wIChjb21wbGV0ZWx5IHN0YWJsZSkuICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMKKyAgLy8gImNvbmZpZGVuY2UiLCB3aGljaCBlc3RpbWF0ZSB0aGUgcHJvYmFiaWxpdHkgdGhhdCBhIHJlY29nbml0aW9uIHJlc3VsdAorICAvLyBpcyBjb3JyZWN0LiBUaGlzIGZpZWxkIGlzIG9ubHkgcHJvdmlkZWQgZm9yIGludGVyaW0gKGZpbmFsPWZhbHNlKSByZXN1bHRzLgorICBvcHRpb25hbCBmbG9hdCBzdGFiaWxpdHkgPSAzOworfTsKKworLy8gSXRlbSBpbiBOLWJlc3QgbGlzdC4KK21lc3NhZ2UgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSB7CisgIC8vIFNwb2tlbiB0ZXh0LgorICBvcHRpb25hbCBzdHJpbmcgdHJhbnNjcmlwdCA9IDE7CisKKyAgLy8gVGhlIGNvbmZpZGVuY2UgZXN0aW1hdGUgYmV0d2VlbiAwLjAgYW5kIDEuMC4gIEEgaGlnaGVyIG51bWJlciBtZWFucyB0aGUKKyAgLy8gc3lzdGVtIGlzIG1vcmUgY29uZmlkZW50IHRoYXQgdGhlIHJlY29nbml0aW9uIGlzIGNvcnJlY3QuCisgIC8vIFRoaXMgZmllbGQgaXMgdHlwaWNhbGx5IHByb3ZpZGVkIG9ubHkgZm9yIHRoZSB0b3AgaHlwb3RoZXNpcyBhbmQgb25seSBmb3IKKyAgLy8gZmluYWwgcmVzdWx0cy4KKyAgb3B0aW9uYWwgZmxvYXQgY29uZmlkZW5jZSA9IDI7Cit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2guZ3lwIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoLmd5cAppbmRleCA1YTQzNjY5Li4yNjRhN2UyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2guZ3lwCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaC5neXAKQEAgLTIwLDkgKzIwLDE5IEBACiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ3NwZWVjaCcsCiAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnbXN2c19kaXNhYmxlZF93YXJuaW5ncyc6IFsKKyAgICAgICAgIyBEZXJlZmVyZW5jaW5nIE5VTEwgcG9pbnRlciBpbiBnZW5lcmF0ZWQgZmlsZQorICAgICAgICAjIGdvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmNjLgorICAgICAgICA2MDExLAorICAgICAgXSwKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnYXVkaW9fZW5jb2Rlcl9mbGFjLmNjJywKICAgICAgICAgJ2F1ZGlvX2VuY29kZXJfZmxhYy5oJywKKyAgICAgICAgJ2NodW5rZWRfYnl0ZV9idWZmZXIuY2MnLAorICAgICAgICAnY2h1bmtlZF9ieXRlX2J1ZmZlci5oJywKKyAgICAgICAgJ2dvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmNjJywKKyAgICAgICAgJ2dvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmgnLAorICAgICAgICAnZ29vZ2xlX3N0cmVhbWluZ19hcGkucGIucHJvdG8nLAogICAgICAgICAnbWljLmgnLAogICAgICAgICAnc3BlZWNoX3JlY29nbml0aW9uLmNjJywKICAgICAgICAgJ3NwZWVjaF9yZWNvZ25pdGlvbi5oJywKQEAgLTQ3LDYgKzU3LDEwIEBACiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tL2RvbS5neXA6ZG9tJywKICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L2ZsYWMvZmxhYy5neXA6bGliZmxhYycsCiAgICAgICBdLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgIyBHZXQgcHJvdG9idWYgaGVhZGVycyBmcm9tIHRoZSBjaHJvbWl1bSB0cmVlLgorICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjJywKKyAgICAgIF0sCiAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgWydPUz09InN0YXJib2FyZCInLCB7CiAgICAgICAgICAgJ3NvdXJjZXMnOiBbCkBAIC02MCw1ICs3NCwyOSBAQAogICAgICAgICB9XSwKICAgICAgIF0sCiAgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc3BlZWNoX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnPChndGVzdF90YXJnZXRfdHlwZSknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdjaHVua2VkX2J5dGVfYnVmZmVyX3VuaXR0ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc3BlZWNoL3NwZWVjaC5neXA6c3BlZWNoJywKKyAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKKyAgICAgIF0sCisgICAgfSwKKworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdzcGVlY2hfdGVzdF9kZXBsb3knLAorICAgICAgJ3R5cGUnOiAnbm9uZScsCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnc3BlZWNoX3Rlc3QnLAorICAgICAgXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdleGVjdXRhYmxlX25hbWUnOiAnc3BlZWNoX3Rlc3QnLAorICAgICAgfSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJy4uLy4uL3N0YXJib2FyZC9idWlsZC9kZXBsb3kuZ3lwaScgXSwKKyAgICB9LAogICBdLAogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvaXNfZGlzcGxheWVkX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9pc19kaXNwbGF5ZWRfdGVzdC5jYwppbmRleCAzN2QzNjZhLi45YTk5YWJlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9pc19kaXNwbGF5ZWRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9pc19kaXNwbGF5ZWRfdGVzdC5jYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9jb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb21fcGFyc2VyL3BhcnNlci5oIgorI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9jYWNoZS5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvbG9hZGVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyX3N0dWIuaCIKQEAgLTUyLDE1ICs1MywxOCBAQAogICAgICAgICBjc3NfcGFyc2VyXyhjc3NfcGFyc2VyOjpQYXJzZXI6OkNyZWF0ZSgpKSwKICAgICAgICAgZG9tX3BhcnNlcl8obmV3IGRvbV9wYXJzZXI6OlBhcnNlcigpKSwKICAgICAgICAgcmVzb3VyY2VfcHJvdmlkZXJfc3R1Yl8obmV3IHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyU3R1YigpKSwKLSAgICAgICAgaW1hZ2VfY2FjaGVfKGxvYWRlcjo6aW1hZ2U6OkNyZWF0ZUltYWdlQ2FjaGUoCi0gICAgICAgICAgICAiV2ViZHJpdmVyVGVzdC5JbWFnZUNhY2hlIiwga0ltYWdlQ2FjaGVDYXBhY2l0eSwKLSAgICAgICAgICAgIHJlc291cmNlX3Byb3ZpZGVyX3N0dWJfLmdldCgpLCAmZmV0Y2hlcl9mYWN0b3J5XykpLAorICAgICAgICBsb2FkZXJfZmFjdG9yeV8obmV3IGxvYWRlcjo6TG9hZGVyRmFjdG9yeSgKKyAgICAgICAgICAgICZmZXRjaGVyX2ZhY3RvcnlfLCByZXNvdXJjZV9wcm92aWRlcl9zdHViXy5nZXQoKSkpLAorICAgICAgICBpbWFnZV9jYWNoZV8obG9hZGVyOjppbWFnZTo6Q3JlYXRlSW1hZ2VDYWNoZSgiV2ViZHJpdmVyVGVzdC5JbWFnZUNhY2hlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ltYWdlQ2FjaGVDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2ZhY3RvcnlfLmdldCgpKSksCiAgICAgICAgIGRvbV9zdGF0X3RyYWNrZXJfKG5ldyBkb206OkRvbVN0YXRUcmFja2VyKCJJc0Rpc3BsYXllZFRlc3QiKSksCisgICAgICAgIHJlc291cmNlX3Byb3ZpZGVyXyhyZXNvdXJjZV9wcm92aWRlcl9zdHViXy5nZXQoKSksCiAgICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0XygKICAgICAgICAgICAgICZmZXRjaGVyX2ZhY3RvcnlfLCBjc3NfcGFyc2VyXy5nZXQoKSwgZG9tX3BhcnNlcl8uZ2V0KCksCiAgICAgICAgICAgICBOVUxMIC8qIGNhbl9wbGF5X3R5cGVfaGFuZGxlciAgKi8sCiAgICAgICAgICAgICBOVUxMIC8qIHdlYl9tZWRpYV9wbGF5ZXJfZmFjdG9yeSAqLywgJnNjcmlwdF9ydW5uZXJfLAotICAgICAgICAgICAgTlVMTCAvKiBtZWRpYV9zb3VyY2VfcmVnaXN0cnkgKi8sIHJlc291cmNlX3Byb3ZpZGVyX3N0dWJfLmdldCgpLAorICAgICAgICAgICAgTlVMTCAvKiBtZWRpYV9zb3VyY2VfcmVnaXN0cnkgKi8sICZyZXNvdXJjZV9wcm92aWRlcl8sCiAgICAgICAgICAgICBpbWFnZV9jYWNoZV8uZ2V0KCksIE5VTEwgLyogcmVkdWNlZF9pbWFnZV9jYWNoZV9jYXBhY2l0eV9tYW5hZ2VyICovLAogICAgICAgICAgICAgTlVMTCAvKiByZW1vdGVfZm9udF9jYWNoZSAqLywgZG9tX3N0YXRfdHJhY2tlcl8uZ2V0KCksCiAgICAgICAgICAgICAiIiAvKiBsYW5ndWFnZSAqLykge30KQEAgLTkzLDggKzk3LDEwIEBACiAgIHNjb3BlZF9wdHI8Y3NzX3BhcnNlcjo6UGFyc2VyPiBjc3NfcGFyc2VyXzsKICAgc2NvcGVkX3B0cjxkb21fcGFyc2VyOjpQYXJzZXI+IGRvbV9wYXJzZXJfOwogICBzY29wZWRfcHRyPHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyU3R1Yj4gcmVzb3VyY2VfcHJvdmlkZXJfc3R1Yl87CisgIHNjb3BlZF9wdHI8bG9hZGVyOjpMb2FkZXJGYWN0b3J5PiBsb2FkZXJfZmFjdG9yeV87CiAgIHNjb3BlZF9wdHI8bG9hZGVyOjppbWFnZTo6SW1hZ2VDYWNoZT4gaW1hZ2VfY2FjaGVfOwogICBzY29wZWRfcHRyPGRvbTo6RG9tU3RhdFRyYWNrZXI+IGRvbV9zdGF0X3RyYWNrZXJfOworICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXJfOwogICBkb206OkhUTUxFbGVtZW50Q29udGV4dCBodG1sX2VsZW1lbnRfY29udGV4dF87CiAgIHNjb3BlZF9yZWZwdHI8ZG9tOjpEb2N1bWVudD4gZG9jdW1lbnRfOwogICBzY29wZWRfcHRyPGxvYWRlcjo6TG9hZGVyPiBkb2N1bWVudF9sb2FkZXJfOwpkaWZmIC0tZ2l0IGEvc3JjL2dsaW1wL2dsZXMvYnVmZmVyLmNjIGIvc3JjL2dsaW1wL2dsZXMvYnVmZmVyLmNjCmluZGV4IGMwOTc1Y2QuLjVlMDNjMDYgMTAwNjQ0Ci0tLSBhL3NyYy9nbGltcC9nbGVzL2J1ZmZlci5jYworKysgYi9zcmMvZ2xpbXAvZ2xlcy9idWZmZXIuY2MKQEAgLTM4LDEyICszOCw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogQnVmZmVyOjpCdWZmZXIobmI6OnNjb3BlZF9wdHI8QnVmZmVySW1wbD4gaW1wbCkKLSAgICA6IGltcGxfKGltcGwuUGFzcygpKSwgdGFyZ2V0X3ZhbGlkXyhmYWxzZSksIHNpemVfaW5fYnl0ZXNfKDApIHt9Ci0KLXZvaWQgQnVmZmVyOjpTZXRUYXJnZXQoR0xlbnVtIHRhcmdldCkgewotICB0YXJnZXRfID0gdGFyZ2V0OwotICB0YXJnZXRfdmFsaWRfID0gdHJ1ZTsKLX0KKyAgICA6IGltcGxfKGltcGwuUGFzcygpKSwgc2l6ZV9pbl9ieXRlc18oMCkge30KIAogdm9pZCBCdWZmZXI6OkFsbG9jYXRlKEdMZW51bSB1c2FnZSwgc2l6ZV90IHNpemUpIHsKICAgc2l6ZV9pbl9ieXRlc18gPSBzaXplOwpAQCAtNTEsNyArNDYsNiBAQAogfQogCiB2b2lkIEJ1ZmZlcjo6U2V0RGF0YShHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7Ci0gIFNCX0RDSEVDSyh0YXJnZXRfdmFsaWQoKSk7CiAgIFNCX0RDSEVDSyhzaXplX2luX2J5dGVzXyA+PSBvZmZzZXQgKyBzaXplKTsKICAgU0JfRENIRUNLKG9mZnNldCA+PSAwKTsKICAgU0JfRENIRUNLKHNpemUgPj0gMCk7CmRpZmYgLS1naXQgYS9zcmMvZ2xpbXAvZ2xlcy9idWZmZXIuaCBiL3NyYy9nbGltcC9nbGVzL2J1ZmZlci5oCmluZGV4IDcxYjE4Y2UuLjg1Y2I0NjIgMTAwNjQ0Ci0tLSBhL3NyYy9nbGltcC9nbGVzL2J1ZmZlci5oCisrKyBiL3NyYy9nbGltcC9nbGVzL2J1ZmZlci5oCkBAIC0zMCw5ICszMCw2IEBACiAgcHVibGljOgogICBleHBsaWNpdCBCdWZmZXIobmI6OnNjb3BlZF9wdHI8QnVmZmVySW1wbD4gaW1wbCk7CiAKLSAgLy8gQ2FsbGVkIHdoZW4gZ2xCaW5kQnVmZmVyKCkgaXMgY2FsbGVkLgotICB2b2lkIFNldFRhcmdldChHTGVudW0gdGFyZ2V0KTsKLQogICAvLyBBbGxvY2F0ZXMgbWVtb3J5IHdpdGhpbiB0aGlzIEJ1ZmZlciBvYmplY3QuCiAgIHZvaWQgQWxsb2NhdGUoR0xlbnVtIHVzYWdlLCBzaXplX3Qgc2l6ZSk7CiAKQEAgLTQ3LDE2ICs0NCw2IEBACiAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVyIGlzIGN1cnJlbnRseSBtYXBwZWQgdG8gdGhlIENQVSBhZGRyZXNzIHNwYWNlLgogICBib29sIGlzX21hcHBlZCgpIGNvbnN0IHsgcmV0dXJuIGlzX21hcHBlZF87IH0KIAotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBoYXMgYmVlbiBzZXQgKGUuZy4gdmlhIGdsQmluZEJ1ZmZlcigpKS4KLSAgYm9vbCB0YXJnZXRfdmFsaWQoKSBjb25zdCB7IHJldHVybiB0YXJnZXRfdmFsaWRfOyB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGFyZ2V0IChzZXQgdmlhIGdsQmluZEJ1ZmZlcigpKS4gIE11c3QgYmUgY2FsbGVkIG9ubHkgaWYKLSAgLy8gdGFyZ2V0X3ZhbGlkKCkgaXMgdHJ1ZS4KLSAgR0xlbnVtIHRhcmdldCgpIGNvbnN0IHsKLSAgICBTQl9EQ0hFQ0sodGFyZ2V0X3ZhbGlkXyk7Ci0gICAgcmV0dXJuIHRhcmdldF87Ci0gIH0KLQogICBHTHNpemVpcHRyIHNpemVfaW5fYnl0ZXMoKSBjb25zdCB7IHJldHVybiBzaXplX2luX2J5dGVzXzsgfQogCiAgIEJ1ZmZlckltcGwqIGltcGwoKSBjb25zdCB7IHJldHVybiBpbXBsXy5nZXQoKTsgfQpAQCAtNjcsMTMgKzU0LDYgQEAKIAogICBuYjo6c2NvcGVkX3B0cjxCdWZmZXJJbXBsPiBpbXBsXzsKIAotICAvLyBUaGUgdGFyZ2V0IHR5cGUgdGhpcyBidWZmZXIgd2FzIGxhc3QgYm91bmQgYXMsIHNldCB0aHJvdWdoIGEgY2FsbCB0bwotICAvLyBnbEJpbmRCdWZmZXIoKS4KLSAgR0xlbnVtIHRhcmdldF87Ci0KLSAgLy8gUmVwcmVzZW50cyB3aGV0aGVyIG9yIG5vdCB0YXJnZXRfIGFzIGJlZW4gaW5pdGlhbGl6ZWQgeWV0LgotICBib29sIHRhcmdldF92YWxpZF87Ci0KICAgLy8gVGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgdXNlZCBieSB0aGlzIGJ1ZmZlci4KICAgR0xzaXplaXB0ciBzaXplX2luX2J5dGVzXzsKIApkaWZmIC0tZ2l0IGEvc3JjL2dsaW1wL2dsZXMvY29udGV4dC5jYyBiL3NyYy9nbGltcC9nbGVzL2NvbnRleHQuY2MKaW5kZXggNjA4MzQ0Zi4uNjViN2Y0NyAxMDA2NDQKLS0tIGEvc3JjL2dsaW1wL2dsZXMvY29udGV4dC5jYworKysgYi9zcmMvZ2xpbXAvZ2xlcy9jb250ZXh0LmNjCkBAIC02OTQsMTAgKzY5NCwxOCBAQAogICAgICAgYnVmZmVyX29iamVjdC0+VW5tYXAoKTsKICAgICB9CiAKLSAgICAvLyBJZiBhIGJvdW5kIGJ1ZmZlciBpcyBkZWxldGVkLCBzZXQgdGhlIGJvdW5kIGJ1ZmZlciB0byBOVUxMLgotICAgIGlmIChidWZmZXJfb2JqZWN0LT50YXJnZXRfdmFsaWQoKSkgewotICAgICAgKkdldEJvdW5kQnVmZmVyRm9yVGFyZ2V0KGJ1ZmZlcl9vYmplY3QtPnRhcmdldCgpKSA9Ci0gICAgICAgICAgbmI6OnNjb3BlZF9yZWZwdHI8QnVmZmVyPigpOworICAgIC8vIElmIGEgYm91bmQgYnVmZmVyIGlzIGRlbGV0ZWQsIHNldCB0aGUgYm91bmQgYnVmZmVyIHRvIE5VTEwuIFRoZSBidWZmZXIKKyAgICAvLyBtYXkgYmUgYm91bmQgdG8gYW55IHRhcmdldCwgdGhlcmVmb3JlIHdlIG11c3Qgc2NhbiB0aGVtIGFsbC4KKyAgICBjb25zdCBHTGVudW0gYnVmZmVyX3RhcmdldHNbM10gPSB7R0xfQVJSQVlfQlVGRkVSLCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfUElYRUxfVU5QQUNLX0JVRkZFUn07CisgICAgZm9yIChpbnQgdGFyZ2V0X2luZGV4ID0gMDsgdGFyZ2V0X2luZGV4IDwgU0JfQVJSQVlfU0laRShidWZmZXJfdGFyZ2V0cyk7CisgICAgICAgICArK3RhcmdldF9pbmRleCkgeworICAgICAgR0xlbnVtIHRhcmdldCA9IGJ1ZmZlcl90YXJnZXRzW3RhcmdldF9pbmRleF07CisgICAgICBuYjo6c2NvcGVkX3JlZnB0cjxCdWZmZXI+KiBib3VuZF9idWZmZXIgPSBHZXRCb3VuZEJ1ZmZlckZvclRhcmdldCh0YXJnZXQpOworICAgICAgU0JfRENIRUNLKGJvdW5kX2J1ZmZlcik7CisgICAgICBpZiAoKCpib3VuZF9idWZmZXIpLmdldCgpID09IGJ1ZmZlcl9vYmplY3QuZ2V0KCkpIHsKKyAgICAgICAgKmJvdW5kX2J1ZmZlciA9IE5VTEw7CisgICAgICB9CiAgICAgfQogICB9CiB9CkBAIC03MzAsMjUgKzczOCwyMCBAQAogICAgIHJldHVybjsKICAgfQogCi0gIGlmIChidWZmZXIgPT0gMCkgewotICAgIC8vIFVuYmluZCB0aGUgY3VycmVudCBidWZmZXIgaWYgMCBpcyBwYXNzZWQgaW4gZm9yIGJ1ZmZlci4KLSAgICAqR2V0Qm91bmRCdWZmZXJGb3JUYXJnZXQodGFyZ2V0KSA9IE5VTEw7Ci0gICAgcmV0dXJuOworICBuYjo6c2NvcGVkX3JlZnB0cjxCdWZmZXI+KiBib3VuZF9idWZmZXIgPSBHZXRCb3VuZEJ1ZmZlckZvclRhcmdldCh0YXJnZXQpOworICBTQl9EQ0hFQ0soYm91bmRfYnVmZmVyKTsKKyAgbmI6OnNjb3BlZF9yZWZwdHI8QnVmZmVyPiBidWZmZXJfb2JqZWN0OworICBpZiAoYnVmZmVyICE9IDApIHsKKyAgICBidWZmZXJfb2JqZWN0ID0gcmVzb3VyY2VfbWFuYWdlcl8tPkdldEJ1ZmZlcihidWZmZXIpOworICAgIGlmICghYnVmZmVyX29iamVjdCkgeworICAgICAgLy8gVGhlIGJ1ZmZlciB0byBiZSBib3VuZCBpcyBpbnZhbGlkLgorICAgICAgU0JfTk9USU1QTEVNRU5URUQoKQorICAgICAgICAgIDw8ICJDcmVhdGluZyBidWZmZXJzIHdpdGggZ2xCaW5kQnVmZmVyICgpIG5vdCBzdXBwb3J0ZWQiOworICAgICAgcmV0dXJuOworICAgIH0KICAgfQogCi0gIG5iOjpzY29wZWRfcmVmcHRyPEJ1ZmZlcj4gYnVmZmVyX29iamVjdCA9Ci0gICAgICByZXNvdXJjZV9tYW5hZ2VyXy0+R2V0QnVmZmVyKGJ1ZmZlcik7Ci0KLSAgaWYgKCFidWZmZXJfb2JqZWN0KSB7Ci0gICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLCBubyBlcnJvciBpcyBnZW5lcmF0ZWQgaWYgdGhlIGJ1ZmZlciBpcwotICAgIC8vIGludmFsaWQuCi0gICAgLy8gICBodHRwczovL3d3dy5raHJvbm9zLm9yZy9vcGVuZ2xlcy9zZGsvZG9jcy9tYW4veGh0bWwvZ2xCaW5kQnVmZmVyLnhtbAotICAgIFNCX0RMT0coV0FSTklORykgPDwgIkNvdWxkIG5vdCBnbEJpbmRCdWZmZXIoKSB0byBpbnZhbGlkIGJ1ZmZlci4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJ1ZmZlcl9vYmplY3QtPlNldFRhcmdldCh0YXJnZXQpOwotICAqR2V0Qm91bmRCdWZmZXJGb3JUYXJnZXQodGFyZ2V0KSA9IGJ1ZmZlcl9vYmplY3Q7CisgICpib3VuZF9idWZmZXIgPSBidWZmZXJfb2JqZWN0OwogfQogCiB2b2lkIENvbnRleHQ6OkJ1ZmZlckRhdGEoR0xlbnVtIHRhcmdldCwKQEAgLTk5NCwxMSArOTk3LDEyIEBACiAgIHJldHVybiBOVUxMOwogfQogCi1uYjo6c2NvcGVkX3JlZnB0cjxUZXh0dXJlPiogQ29udGV4dDo6R2V0Qm91bmRUZXh0dXJlRm9yVGFyZ2V0KEdMZW51bSB0YXJnZXQpIHsKK25iOjpzY29wZWRfcmVmcHRyPFRleHR1cmU+KiBDb250ZXh0OjpHZXRCb3VuZFRleHR1cmVGb3JUYXJnZXQoR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRleHR1cmUpIHsKICAgR0xJTVBfVFJBQ0VfRVZFTlQwKF9fRlVOQ1RJT05fXyk7CiAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICAgY2FzZSBHTF9URVhUVVJFXzJEOgotICAgICAgcmV0dXJuICYodGV4dHVyZV91bml0c19bYWN0aXZlX3RleHR1cmVfIC0gR0xfVEVYVFVSRTBdKTsKKyAgICAgIHJldHVybiAmKHRleHR1cmVfdW5pdHNfW3RleHR1cmUgLSBHTF9URVhUVVJFMF0pOwogICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUDoKICAgICAgIFNCX05PVFJFQUNIRUQoKSA8PCAiQ3VycmVudGx5IHVuaW1wbGVtZW50ZWQgaW4gZ2xpbXAuIjsKICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTA1OCw3ICsxMDYyLDYgQEAKICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSAwIHRleHR1cmVzLgogICAgICAgY29udGludWU7CiAgICAgfQotCiAgICAgbmI6OnNjb3BlZF9yZWZwdHI8VGV4dHVyZT4gdGV4dHVyZV9vYmplY3QgPQogICAgICAgICByZXNvdXJjZV9tYW5hZ2VyXy0+RGVyZWdpc3RlclRleHR1cmUodGV4dHVyZXNbaV0pOwogCkBAIC0xMDY5LDEwICsxMDcyLDE4IEBACiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gSWYgYSBib3VuZCB0ZXh0dXJlIGlzIGRlbGV0ZWQsIHNldCB0aGUgYm91bmQgdGV4dHVyZSB0byBOVUxMLgotICAgIGlmICh0ZXh0dXJlX29iamVjdC0+dGFyZ2V0X3ZhbGlkKCkpIHsKLSAgICAgICpHZXRCb3VuZFRleHR1cmVGb3JUYXJnZXQodGV4dHVyZV9vYmplY3QtPnRhcmdldCgpKSA9IE5VTEw7Ci0gICAgICBlbmFibGVkX3RleHR1cmVzX2RpcnR5XyA9IHRydWU7CisgICAgLy8gSWYgYSBib3VuZCB0ZXh0dXJlIGlzIGRlbGV0ZWQsIHNldCB0aGUgYm91bmQgdGV4dHVyZSB0byBOVUxMLiBUaGUgdGV4dHVyZQorICAgIC8vIG1heSBiZSBib3VuZCB0byBtdWx0aXBsZSB0ZXh0dXJlIHVuaXRzLCBpbmNsdWRpbmcgdGV4dHVyZSB1bml0cyB0aGF0IGFyZQorICAgIC8vIG5vdCBhY3RpdmUsIHRoZXJlZm9yZSB3ZSBtdXN0IHNjYW4gdGhlbSBhbGwuCisgICAgZm9yIChpbnQgdGV4dHVyZV9pbmRleCA9IDA7CisgICAgICAgICB0ZXh0dXJlX2luZGV4IDwgaW1wbF8tPkdldE1heEZyYWdtZW50VGV4dHVyZVVuaXRzKCk7ICsrdGV4dHVyZV9pbmRleCkgeworICAgICAgR0xlbnVtIHRleHR1cmVfdW5pdCA9IHRleHR1cmVfaW5kZXggKyBHTF9URVhUVVJFMDsKKyAgICAgIG5iOjpzY29wZWRfcmVmcHRyPFRleHR1cmU+KiBib3VuZF90ZXh0dXJlID0KKyAgICAgICAgICBHZXRCb3VuZFRleHR1cmVGb3JUYXJnZXQoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZV91bml0KTsKKyAgICAgIGlmICgoKmJvdW5kX3RleHR1cmUpLmdldCgpID09IHRleHR1cmVfb2JqZWN0LmdldCgpKSB7CisgICAgICAgIGVuYWJsZWRfdGV4dHVyZXNfZGlydHlfID0gdHJ1ZTsKKyAgICAgICAgKmJvdW5kX3RleHR1cmUgPSBOVUxMOworICAgICAgfQogICAgIH0KICAgfQogfQpAQCAtMTA5NSwyNSArMTEwNiwyNiBAQAogICAgIHJldHVybjsKICAgfQogCi0gIGlmICh0ZXh0dXJlID09IDApIHsKLSAgICAvLyBVbmJpbmQgdGhlIGN1cnJlbnQgdGV4dHVyZSBpZiAwIGlzIHBhc3NlZCBpbiBmb3IgdGV4dHVyZS4KLSAgICAqR2V0Qm91bmRUZXh0dXJlRm9yVGFyZ2V0KHRhcmdldCkgPSBOVUxMOwotICAgIGVuYWJsZWRfdGV4dHVyZXNfZGlydHlfID0gdHJ1ZTsKLSAgICByZXR1cm47CisgIG5iOjpzY29wZWRfcmVmcHRyPFRleHR1cmU+KiBib3VuZF90ZXh0dXJlID0KKyAgICAgIEdldEJvdW5kVGV4dHVyZUZvclRhcmdldCh0YXJnZXQsIGFjdGl2ZV90ZXh0dXJlXyk7CisgIFNCX0RDSEVDSyhib3VuZF90ZXh0dXJlKTsKKyAgbmI6OnNjb3BlZF9yZWZwdHI8VGV4dHVyZT4gdGV4dHVyZV9vYmplY3Q7CisgIGlmICh0ZXh0dXJlICE9IDApIHsKKyAgICB0ZXh0dXJlX29iamVjdCA9IHJlc291cmNlX21hbmFnZXJfLT5HZXRUZXh0dXJlKHRleHR1cmUpOworICAgIGlmICghdGV4dHVyZV9vYmplY3QpIHsKKyAgICAgIC8vIFRoZSB0ZXh0dXJlIHRvIGJlIGJvdW5kIGlzIGludmFsaWQuCisgICAgICBTQl9OT1RJTVBMRU1FTlRFRCgpCisgICAgICAgICAgPDwgIkNyZWF0aW5nIHRleHR1cmVzIHdpdGggZ2xCaW5kVGV4dHVyZSgpIG5vdCBzdXBwb3J0ZWQiOworICAgICAgcmV0dXJuOworICAgIH0KICAgfQogCi0gIG5iOjpzY29wZWRfcmVmcHRyPFRleHR1cmU+IHRleHR1cmVfb2JqZWN0ID0KLSAgICAgIHJlc291cmNlX21hbmFnZXJfLT5HZXRUZXh0dXJlKHRleHR1cmUpOwotCi0gIGlmICghdGV4dHVyZV9vYmplY3QpIHsKLSAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24sIG5vIGVycm9yIGlzIGdlbmVyYXRlZCBpZiB0aGUgdGV4dHVyZSBpcwotICAgIC8vIGludmFsaWQuCi0gICAgLy8gICBodHRwczovL3d3dy5raHJvbm9zLm9yZy9vcGVuZ2xlcy9zZGsvZG9jcy9tYW4veGh0bWwvZ2xCaW5kVGV4dHVyZS54bWwKKyAgaWYgKCgqYm91bmRfdGV4dHVyZSkuZ2V0KCkgPT0gdGV4dHVyZV9vYmplY3QuZ2V0KCkpIHsKKyAgICAvLyBUaGUgbmV3IHRleHR1cmUgYmVpbmcgYm91bmQgaXMgdGhlIHNhbWUgYXMgdGhlIGFscmVhZHkgdGhlIGJvdW5kCisgICAgLy8gdGV4dHVyZS4KICAgICByZXR1cm47CiAgIH0KLQotICB0ZXh0dXJlX29iamVjdC0+U2V0VGFyZ2V0KHRhcmdldCk7Ci0gICpHZXRCb3VuZFRleHR1cmVGb3JUYXJnZXQodGFyZ2V0KSA9IHRleHR1cmVfb2JqZWN0OworICAqYm91bmRfdGV4dHVyZSA9IHRleHR1cmVfb2JqZWN0OwogICBlbmFibGVkX3RleHR1cmVzX2RpcnR5XyA9IHRydWU7CiB9CiAKQEAgLTExNjQsOCArMTE3Niw4IEBACiAKIHZvaWQgQ29udGV4dDo6VGV4UGFyYW1ldGVyaShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7CiAgIEdMSU1QX1RSQUNFX0VWRU5UMChfX0ZVTkNUSU9OX18pOwotICBTYW1wbGVyKiBhY3RpdmVfc2FtcGxlciA9Ci0gICAgICAoKkdldEJvdW5kVGV4dHVyZUZvclRhcmdldCh0YXJnZXQpKS0+c2FtcGxlcl9wYXJhbWV0ZXJzKCk7CisgIFNhbXBsZXIqIGFjdGl2ZV9zYW1wbGVyID0gKCpHZXRCb3VuZFRleHR1cmVGb3JUYXJnZXQodGFyZ2V0LCBhY3RpdmVfdGV4dHVyZV8pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNhbXBsZXJfcGFyYW1ldGVycygpOwogCiAgIHN3aXRjaCAocG5hbWUpIHsKICAgICBjYXNlIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUjogewpAQCAtMTI5Nyw3ICsxMzA5LDggQEAKICAgU0JfRENIRUNLKHBpeGVsX2Zvcm1hdCAhPSBrUGl4ZWxGb3JtYXRJbnZhbGlkKQogICAgICAgPDwgIlBpeGVsIGZvcm1hdCBub3Qgc3VwcG9ydGVkIGJ5IGdsaW1wLiI7CiAKLSAgbmI6OnNjb3BlZF9yZWZwdHI8VGV4dHVyZT4gdGV4dHVyZV9vYmplY3QgPSAqR2V0Qm91bmRUZXh0dXJlRm9yVGFyZ2V0KHRhcmdldCk7CisgIG5iOjpzY29wZWRfcmVmcHRyPFRleHR1cmU+IHRleHR1cmVfb2JqZWN0ID0KKyAgICAgICpHZXRCb3VuZFRleHR1cmVGb3JUYXJnZXQodGFyZ2V0LCBhY3RpdmVfdGV4dHVyZV8pOwogICBpZiAoIXRleHR1cmVfb2JqZWN0KSB7CiAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLCBubyBlcnJvciBpcyBnZW5lcmF0ZWQgaWYgbm8gdGV4dHVyZQogICAgIC8vIGlzIGJvdW5kLgpAQCAtMTM2NSw3ICsxMzc4LDggQEAKICAgU0JfRENIRUNLKHBpeGVsX2Zvcm1hdCAhPSBrUGl4ZWxGb3JtYXRJbnZhbGlkKQogICAgICAgPDwgIlBpeGVsIGZvcm1hdCBub3Qgc3VwcG9ydGVkIGJ5IGdsaW1wLiI7CiAKLSAgbmI6OnNjb3BlZF9yZWZwdHI8VGV4dHVyZT4gdGV4dHVyZV9vYmplY3QgPSAqR2V0Qm91bmRUZXh0dXJlRm9yVGFyZ2V0KHRhcmdldCk7CisgIG5iOjpzY29wZWRfcmVmcHRyPFRleHR1cmU+IHRleHR1cmVfb2JqZWN0ID0KKyAgICAgICpHZXRCb3VuZFRleHR1cmVGb3JUYXJnZXQodGFyZ2V0LCBhY3RpdmVfdGV4dHVyZV8pOwogICBpZiAoIXRleHR1cmVfb2JqZWN0KSB7CiAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLCBubyBlcnJvciBpcyBnZW5lcmF0ZWQgaWYgbm8gdGV4dHVyZQogICAgIC8vIGlzIGJvdW5kLgpAQCAtMjEzMSw3ICsyMTQ1LDcgQEAKICAgU0JfRENIRUNLKHN1cmZhY2UtPkdldFRleHR1cmVUYXJnZXQoKSA9PSBFR0xfVEVYVFVSRV8yRCk7CiAKICAgY29uc3QgbmI6OnNjb3BlZF9yZWZwdHI8VGV4dHVyZT4mIGN1cnJlbnRfdGV4dHVyZSA9Ci0gICAgICAqR2V0Qm91bmRUZXh0dXJlRm9yVGFyZ2V0KEdMX1RFWFRVUkVfMkQpOworICAgICAgKkdldEJvdW5kVGV4dHVyZUZvclRhcmdldChHTF9URVhUVVJFXzJELCBhY3RpdmVfdGV4dHVyZV8pOwogCiAgIGlmICghY3VycmVudF90ZXh0dXJlKSB7CiAgICAgU0JfRExPRyhXQVJOSU5HKSA8PCAiTm8gdGV4dHVyZSBpcyBjdXJyZW50bHkgYm91bmQgZHVyaW5nIGNhbGwgdG8gIgpkaWZmIC0tZ2l0IGEvc3JjL2dsaW1wL2dsZXMvY29udGV4dC5oIGIvc3JjL2dsaW1wL2dsZXMvY29udGV4dC5oCmluZGV4IDdkMmQ5MTkuLjAxOGEyZjIgMTAwNjQ0Ci0tLSBhL3NyYy9nbGltcC9nbGVzL2NvbnRleHQuaAorKysgYi9zcmMvZ2xpbXAvZ2xlcy9jb250ZXh0LmgKQEAgLTIzNCwxNSArMjM0LDE2IEBACiAgIHZvaWQgUmVsZWFzZUNvbnRleHQoKTsKICAgdm9pZCBTZXRFcnJvcihHTGVudW0gZXJyb3IpIHsgZXJyb3JfID0gZXJyb3I7IH0KIAotICAvLyBSZXR1cm5zIHRoZSBib3VuZCBidWZmZXIgc2xvdCBmb3IgdGhlIHNwZWNpZmljIHNwZWNpZmllZCB0YXJnZXQuCisgIC8vIFJldHVybnMgdGhlIGJvdW5kIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmljIHNwZWNpZmllZCB0YXJnZXQuCiAgIC8vIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IGdsQmluZEJ1ZmZlcigpIHdoaWNoIG1vZGlmaWVzCiAgIC8vIHdoYXQgdGhlIHJldHVybmVkIHNjb3BlZF9yZWZwdHIgcG9pbnRzIHRvLgogICBuYjo6c2NvcGVkX3JlZnB0cjxCdWZmZXI+KiBHZXRCb3VuZEJ1ZmZlckZvclRhcmdldChHTGVudW0gdGFyZ2V0KTsKIAotICAvLyBSZXR1cm5zIHRoZSBib3VuZCB0ZXh0dXJlIHNsb3QgZm9yIHRoZSBzcGVjaWZpYyBzcGVjaWZpZWQgdGFyZ2V0LgorICAvLyBSZXR1cm5zIHRoZSBib3VuZCB0ZXh0dXJlIGZvciB0aGUgc3BlY2lmaWMgc3BlY2lmaWVkIHRhcmdldCBhbmQgc2xvdC4KICAgLy8gVGhpcyByZXR1cm5zIGEgcG9pbnRlciBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgZ2xCaW5kVGV4dHVyZSgpIHdoaWNoIG1vZGlmaWVzCiAgIC8vIHdoYXQgdGhlIHJldHVybmVkIHNjb3BlZF9yZWZwdHIgcG9pbnRzIHRvLgotICBuYjo6c2NvcGVkX3JlZnB0cjxUZXh0dXJlPiogR2V0Qm91bmRUZXh0dXJlRm9yVGFyZ2V0KEdMZW51bSB0YXJnZXQpOworICBuYjo6c2NvcGVkX3JlZnB0cjxUZXh0dXJlPiogR2V0Qm91bmRUZXh0dXJlRm9yVGFyZ2V0KEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRleHR1cmUpOwogCiAgIHZvaWQgU2V0dXBFeHRlbnNpb25zU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9nbGltcC9nbGVzL3RleHR1cmUuY2MgYi9zcmMvZ2xpbXAvZ2xlcy90ZXh0dXJlLmNjCmluZGV4IGEwNTdmNzQuLjBlMWVhOGMgMTAwNjQ0Ci0tLSBhL3NyYy9nbGltcC9nbGVzL3RleHR1cmUuY2MKKysrIGIvc3JjL2dsaW1wL2dsZXMvdGV4dHVyZS5jYwpAQCAtMjQsMTUgKzI0LDkgQEAKIAogVGV4dHVyZTo6VGV4dHVyZShuYjo6c2NvcGVkX3B0cjxUZXh0dXJlSW1wbD4gaW1wbCkKICAgICA6IGltcGxfKGltcGwuUGFzcygpKSwKLSAgICAgIHRhcmdldF92YWxpZF8oZmFsc2UpLAogICAgICAgdGV4dHVyZV9hbGxvY2F0ZWRfKGZhbHNlKSwKICAgICAgIGJvdW5kX3RvX3N1cmZhY2VfKE5VTEwpIHt9CiAKLXZvaWQgVGV4dHVyZTo6U2V0VGFyZ2V0KEdMZW51bSB0YXJnZXQpIHsKLSAgdGFyZ2V0XyA9IHRhcmdldDsKLSAgdGFyZ2V0X3ZhbGlkXyA9IHRydWU7Ci19Ci0KIHZvaWQgVGV4dHVyZTo6SW5pdGlhbGl6ZShHTGludCBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdCBwaXhlbF9mb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwKZGlmZiAtLWdpdCBhL3NyYy9nbGltcC9nbGVzL3RleHR1cmUuaCBiL3NyYy9nbGltcC9nbGVzL3RleHR1cmUuaAppbmRleCAxZDRiY2M1Li45YzUzMGI0IDEwMDY0NAotLS0gYS9zcmMvZ2xpbXAvZ2xlcy90ZXh0dXJlLmgKKysrIGIvc3JjL2dsaW1wL2dsZXMvdGV4dHVyZS5oCkBAIC0zNCw5ICszNCw2IEBACiAgcHVibGljOgogICBleHBsaWNpdCBUZXh0dXJlKG5iOjpzY29wZWRfcHRyPFRleHR1cmVJbXBsPiBpbXBsKTsKIAotICAvLyBDYWxsZWQgd2hlbiBnbEJpbmRUZXh0dXJlKCkgaXMgY2FsbGVkLgotICB2b2lkIFNldFRhcmdldChHTGVudW0gdGFyZ2V0KTsKLQogICB2b2lkIEluaXRpYWxpemUoR0xpbnQgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdCBwaXhlbF9mb3JtYXQsCiAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLApAQCAtODIsMTYgKzc5LDYgQEAKICAgLy8gb3Igbm90LgogICBib29sIENhbkJlQXR0YWNoZWRUb0ZyYW1lYnVmZmVyKCkgY29uc3Q7CiAKLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgaGFzIGJlZW4gc2V0IChlLmcuIHZpYSBnbEJpbmRUZXh0dXJlKCkpLgotICBib29sIHRhcmdldF92YWxpZCgpIGNvbnN0IHsgcmV0dXJuIHRhcmdldF92YWxpZF87IH0KLQotICAvLyBSZXR1cm5zIHRoZSB0YXJnZXQgKHNldCB2aWEgZ2xCaW5kVGV4dHVyZSgpKS4gIE11c3QgYmUgY2FsbGVkIG9ubHkgaWYKLSAgLy8gdGFyZ2V0X3ZhbGlkKCkgaXMgdHJ1ZS4KLSAgR0xlbnVtIHRhcmdldCgpIGNvbnN0IHsKLSAgICBTQl9EQ0hFQ0sodGFyZ2V0X3ZhbGlkXyk7Ci0gICAgcmV0dXJuIHRhcmdldF87Ci0gIH0KLQogICBUZXh0dXJlSW1wbCogaW1wbCgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLmdldCgpOyB9CiAKICAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBkYXRhIGhhcyBiZWVuIHNldCB5ZXQgb3Igbm90LgpAQCAtMTIxLDEzICsxMDgsNiBAQAogCiAgIG5iOjpzY29wZWRfcHRyPFRleHR1cmVJbXBsPiBpbXBsXzsKIAotICAvLyBUaGUgdGFyZ2V0IHR5cGUgdGhpcyB0ZXh0dXJlIHdhcyBsYXN0IGJvdW5kIGFzLCBzZXQgdGhyb3VnaCBhIGNhbGwgdG8KLSAgLy8gZ2xCaW5kVGV4dHVyZSgpLgotICBHTGVudW0gdGFyZ2V0XzsKLQotICAvLyBSZXByZXNlbnRzIHdoZXRoZXIgb3Igbm90IHRhcmdldF8gYXMgYmVlbiBpbml0aWFsaXplZCB5ZXQuCi0gIGJvb2wgdGFyZ2V0X3ZhbGlkXzsKLQogICAvLyBUcnVlIGlmIHVuZGVybHlpbmcgdGV4dHVyZSBkYXRhIGhhcyBiZWVuIGFsbG9jYXRlZCB5ZXQgb3Igbm90IChlLmcuCiAgIC8vIHdpbGwgYmUgdHJ1ZSBhZnRlciBnbFRleEltYWdlMkQoKSBpcyBjYWxsZWQuKQogICBib29sIHRleHR1cmVfYWxsb2NhdGVkXzsKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NicGxheWVyX3BpcGVsaW5lLmNjIGIvc3JjL21lZGlhL2Jhc2Uvc2JwbGF5ZXJfcGlwZWxpbmUuY2MKaW5kZXggOWMwOTkyNy4uN2MwZjA2NyAxMDA2NDQKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2JwbGF5ZXJfcGlwZWxpbmUuY2MKKysrIGIvc3JjL21lZGlhL2Jhc2Uvc2JwbGF5ZXJfcGlwZWxpbmUuY2MKQEAgLTQ4LDYgKzQ4LDM2IEBACiAKIG5hbWVzcGFjZSB7CiAKK1NiTWVkaWFBdWRpb0NvZGVjIFNiTWVkaWFBdWRpb0NvZGVjRnJvbU1lZGlhQXVkaW9Db2RlYyhBdWRpb0NvZGVjIGNvZGVjKSB7CisgIGlmIChjb2RlYyA9PSBrQ29kZWNBQUMpIHsKKyAgICByZXR1cm4ga1NiTWVkaWFBdWRpb0NvZGVjQWFjOworICB9IGVsc2UgaWYgKGNvZGVjID09IGtDb2RlY1ZvcmJpcykgeworICAgIHJldHVybiBrU2JNZWRpYUF1ZGlvQ29kZWNWb3JiaXM7CisgIH0gZWxzZSBpZiAoY29kZWMgPT0ga0NvZGVjT3B1cykgeworICAgIHJldHVybiBrU2JNZWRpYUF1ZGlvQ29kZWNPcHVzOworICB9CisgIERMT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCBhdWRpbyBjb2RlYyAiIDw8IGNvZGVjOworICByZXR1cm4ga1NiTWVkaWFBdWRpb0NvZGVjTm9uZTsKK30KKworU2JNZWRpYVZpZGVvQ29kZWMgU2JNZWRpYVZpZGVvQ29kZWNGcm9tTWVkaWFWaWRlb0NvZGVjKFZpZGVvQ29kZWMgY29kZWMpIHsKKyAgaWYgKGNvZGVjID09IGtDb2RlY0gyNjQpIHsKKyAgICByZXR1cm4ga1NiTWVkaWFWaWRlb0NvZGVjSDI2NDsKKyAgfSBlbHNlIGlmIChjb2RlYyA9PSBrQ29kZWNWQzEpIHsKKyAgICByZXR1cm4ga1NiTWVkaWFWaWRlb0NvZGVjVmMxOworICB9IGVsc2UgaWYgKGNvZGVjID09IGtDb2RlY01QRUcyKSB7CisgICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY01wZWcyOworICB9IGVsc2UgaWYgKGNvZGVjID09IGtDb2RlY1RoZW9yYSkgeworICAgIHJldHVybiBrU2JNZWRpYVZpZGVvQ29kZWNUaGVvcmE7CisgIH0gZWxzZSBpZiAoY29kZWMgPT0ga0NvZGVjVlA4KSB7CisgICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY1ZwODsKKyAgfSBlbHNlIGlmIChjb2RlYyA9PSBrQ29kZWNWUDkpIHsKKyAgICByZXR1cm4ga1NiTWVkaWFWaWRlb0NvZGVjVnA5OworICB9CisgIERMT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCB2aWRlbyBjb2RlYyAiIDw8IGNvZGVjOworICByZXR1cm4ga1NiTWVkaWFWaWRlb0NvZGVjTm9uZTsKK30KKwogVGltZURlbHRhIFNiTWVkaWFUaW1lVG9UaW1lRGVsdGEoU2JNZWRpYVRpbWUgdGltZXN0YW1wKSB7CiAgIHJldHVybiBUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHModGltZXN0YW1wICogVGltZTo6a01pY3Jvc2Vjb25kc1BlclNlY29uZCAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiTWVkaWFUaW1lU2Vjb25kKTsKQEAgLTY4LDcgKzk4LDExIEBACiB9CiAKIHZvaWQgRmlsbERybVNhbXBsZUluZm8oY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICBTYkRybVNhbXBsZUluZm8qIGRybV9pbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU2FtcGxlSW5mbyogZHJtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3ViU2FtcGxlTWFwcGluZyogc3Vic2FtcGxlX21hcHBpbmcpIHsKKyAgRENIRUNLKGRybV9pbmZvKTsKKyAgRENIRUNLKHN1YnNhbXBsZV9tYXBwaW5nKTsKKwogICBjb25zdCBEZWNyeXB0Q29uZmlnKiBjb25maWcgPSBidWZmZXItPkdldERlY3J5cHRDb25maWcoKTsKICAgaWYgKCFjb25maWcgfHwgY29uZmlnLT5pdigpLmVtcHR5KCkgfHwgY29uZmlnLT5rZXlfaWQoKS5lbXB0eSgpKSB7CiAgICAgZHJtX2luZm8tPmluaXRpYWxpemF0aW9uX3ZlY3Rvcl9zaXplID0gMDsKQEAgLTEwNCwxMCArMTM4LDkgQEAKICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTYkRybVN1YlNhbXBsZU1hcHBpbmcqPigKICAgICAgICAgICAgICZjb25maWctPnN1YnNhbXBsZXMoKVswXSk7CiAgIH0gZWxzZSB7Ci0gICAgLy8gVE9ETzogQWNjb3JkaW5nIHRvIHRoZSBTYkRybSBpbnRlcmZhY2Ugd2UgaGF2ZSB0byBwcm92aWRlIGEgc3Vic2FtcGxlCi0gICAgLy8gICAgICAgd2l0aCBleGFjdGx5IG9uZSBlbGVtZW50IGNvdmVyaW5nIHRoZSB3aG9sZSBzYW1wbGUuICBUaGlzIG5lZWRzCi0gICAgLy8gICAgICAgZXh0cmEgbWVtb3J5IG1hbmFnZW1lbnQuCi0gICAgZHJtX2luZm8tPnN1YnNhbXBsZV9tYXBwaW5nID0gTlVMTDsKKyAgICBkcm1faW5mby0+c3Vic2FtcGxlX21hcHBpbmcgPSBzdWJzYW1wbGVfbWFwcGluZzsKKyAgICBzdWJzYW1wbGVfbWFwcGluZy0+Y2xlYXJfYnl0ZV9jb3VudCA9IDA7CisgICAgc3Vic2FtcGxlX21hcHBpbmctPmVuY3J5cHRlZF9ieXRlX2NvdW50ID0gYnVmZmVyLT5HZXREYXRhU2l6ZSgpOwogICB9CiB9CiAKQEAgLTYzMywxNyArNjY2LDM2IEBACiAgIGF1ZGlvX2hlYWRlci5iaXRzX3Blcl9zYW1wbGUgPSBhdWRpb19jb25maWcuYml0c19wZXJfY2hhbm5lbCgpOwogICBhdWRpb19oZWFkZXIuYXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUgPSAwOwogCisgIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgdmlkZW9fY29uZmlnID0KKyAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pLT52aWRlb19kZWNvZGVyX2NvbmZpZygpOworCisgIFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjID0KKyAgICAgIFNiTWVkaWFBdWRpb0NvZGVjRnJvbU1lZGlhQXVkaW9Db2RlYyhhdWRpb19jb25maWcuY29kZWMoKSk7CisgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjID0KKyAgICAgIFNiTWVkaWFWaWRlb0NvZGVjRnJvbU1lZGlhVmlkZW9Db2RlYyh2aWRlb19jb25maWcuY29kZWMoKSk7CisKICAgewogICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7Ci0gICAgcGxheWVyXyA9IFNiUGxheWVyQ3JlYXRlKHdpbmRvd18sIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYk1lZGlhQXVkaW9Db2RlY0FhYywgU0JfUExBWUVSX05PX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1fc3lzdGVtLCAmYXVkaW9faGVhZGVyLCBEZWFsbG9jYXRlU2FtcGxlQ0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTdGF0dXNDQiwgUGxheWVyU3RhdHVzQ0IsIHRoaXMpOworICAgIHBsYXllcl8gPQorICAgICAgICBTYlBsYXllckNyZWF0ZSh3aW5kb3dfLCB2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsIFNCX1BMQVlFUl9OT19EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgZHJtX3N5c3RlbSwgJmF1ZGlvX2hlYWRlciwgRGVhbGxvY2F0ZVNhbXBsZUNCLAorICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3RhdHVzQ0IsIFBsYXllclN0YXR1c0NCLCB0aGlzKTsKICAgICBTZXRQbGF5YmFja1JhdGVUYXNrKHBsYXliYWNrX3JhdGVfKTsKICAgICBTZXRWb2x1bWVUYXNrKHZvbHVtZV8pOwogICB9CiAKLSAgc2V0X2JvdW5kc19jYWxsZXJfLT5TZXRQbGF5ZXIocGxheWVyXyk7CisgIGlmIChTYlBsYXllcklzVmFsaWQocGxheWVyXykpIHsKKyAgICBzZXRfYm91bmRzX2NhbGxlcl8tPlNldFBsYXllcihwbGF5ZXJfKTsKKyAgICByZXR1cm47CisgIH0KKworICBQaXBlbGluZVN0YXR1c0NCIHNlZWtfY2I7CisgIHsKKyAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICAgIERDSEVDSyghc2Vla19jYl8uaXNfbnVsbCgpKTsKKyAgICBzZWVrX2NiID0gYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnNlZWtfY2JfKTsKKyAgfQorICBzZWVrX2NiLlJ1bihERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQpOwogfQogCiB2b2lkIFNiUGxheWVyUGlwZWxpbmU6OlNldERlY3J5cHRvcihEZWNyeXB0b3IqIGRlY3J5cHRvcikgewpAQCAtNjc1LDggKzcyNyw2IEBACiAKICAgICBidWZmZXJpbmdfc3RhdGVfY2JfLlJ1bihrSGF2ZU1ldGFkYXRhKTsKIAotICAgIE5PVElNUExFTUVOVEVEKCkgPDwgIkR5bmFtaWNhbGx5IGRldGVybWluYXRlIGNvZGVjcyI7Ci0KICAgICBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGF1ZGlvX2NvbmZpZyA9CiAgICAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pLT5hdWRpb19kZWNvZGVyX2NvbmZpZygpOwogICAgIGJvb2wgaXNfZW5jcnlwdGVkID0gYXVkaW9fY29uZmlnLmlzX2VuY3J5cHRlZCgpOwpAQCAtNzgwLDkgKzgzMCwxMCBAQAogCiAgIGJvb2wgaXNfZW5jcnlwdGVkID0gSXNFbmNyeXB0ZWQoc3RyZWFtKTsKICAgU2JEcm1TYW1wbGVJbmZvIGRybV9pbmZvOworICBTYkRybVN1YlNhbXBsZU1hcHBpbmcgc3Vic2FtcGxlX21hcHBpbmc7CiAKICAgaWYgKGlzX2VuY3J5cHRlZCAmJiAhYnVmZmVyLT5Jc0VuZE9mU3RyZWFtKCkpIHsKLSAgICBGaWxsRHJtU2FtcGxlSW5mbyhidWZmZXIsICZkcm1faW5mbyk7CisgICAgRmlsbERybVNhbXBsZUluZm8oYnVmZmVyLCAmZHJtX2luZm8sICZzdWJzYW1wbGVfbWFwcGluZyk7CiAgIH0KIAogICBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpBVURJTykgewpAQCAtODQyLDYgKzg5Myw3IEBACiAgICAgY2FzZSBrU2JQbGF5ZXJEZWNvZGVyU3RhdGVOZWVkc0RhdGE6CiAgICAgICBicmVhazsKICAgICBjYXNlIGtTYlBsYXllckRlY29kZXJTdGF0ZUJ1ZmZlckZ1bGw6CisgICAgICBETE9HKFdBUk5JTkcpIDw8ICJrU2JQbGF5ZXJEZWNvZGVyU3RhdGVCdWZmZXJGdWxsIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIjsKICAgICAgIHJldHVybjsKICAgICBjYXNlIGtTYlBsYXllckRlY29kZXJTdGF0ZURlc3Ryb3llZDoKICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3NyYy9uZXQvc29ja2V0L3RjcF9jbGllbnRfc29ja2V0X3N0YXJib2FyZC5jYyBiL3NyYy9uZXQvc29ja2V0L3RjcF9jbGllbnRfc29ja2V0X3N0YXJib2FyZC5jYwppbmRleCAwYTkxNWE1Li40OGQ3NmI1IDEwMDY0NAotLS0gYS9zcmMvbmV0L3NvY2tldC90Y3BfY2xpZW50X3NvY2tldF9zdGFyYm9hcmQuY2MKKysrIGIvc3JjL25ldC9zb2NrZXQvdGNwX2NsaWVudF9zb2NrZXRfc3RhcmJvYXJkLmNjCkBAIC00OCw4ICs0OCwxMCBAQAogICBTYlNvY2tldFNldFRjcE5vRGVsYXkoc29ja2V0LCB0cnVlKTsKICAgU2JTb2NrZXRTZXRUY3BLZWVwQWxpdmUoc29ja2V0LCB0cnVlLCBrVENQS2VlcEFsaXZlRHVyYXRpb24pOwogICBTYlNvY2tldFNldFRjcFdpbmRvd1NjYWxpbmcoc29ja2V0LCB0cnVlKTsKLSAgU2JTb2NrZXRTZXRSZWNlaXZlQnVmZmVyU2l6ZShzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENQQ2xpZW50U29ja2V0U3RhcmJvYXJkOjprUmVjZWl2ZUJ1ZmZlclNpemUpOworICBpZiAoVENQQ2xpZW50U29ja2V0U3RhcmJvYXJkOjprUmVjZWl2ZUJ1ZmZlclNpemUgIT0gMCkgeworICAgIFNiU29ja2V0U2V0UmVjZWl2ZUJ1ZmZlclNpemUoc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENQQ2xpZW50U29ja2V0U3RhcmJvYXJkOjprUmVjZWl2ZUJ1ZmZlclNpemUpOworICB9CiAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbW1vbi9jb21tb24uZ3lwIGIvc3JjL3N0YXJib2FyZC9jb21tb24vY29tbW9uLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGJjNWRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9jb21tb24vY29tbW9uLmd5cApAQCAtMCwwICsxLDMwIEBACisjIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhlICJjb21tb24iIHRhcmdldCBjb250YWlucyBmYWNpbGl0aWVzIHByb3ZpZGVkIGJ5IFN0YXJib2FyZCB0aGF0IGFyZSBjb21tb24KKyMgdG8gYWxsIHBsYXRmb3Jtcy4KKworeworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnY29tbW9uJywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdtb3ZlLmgnLAorICAgICAgICAncmVzZXRfYW5kX3JldHVybi5oJywKKyAgICAgICAgJ3Njb3BlZF9wdHIuaCcsCisgICAgICBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbW1vbi9tb3ZlLmggYi9zcmMvc3RhcmJvYXJkL2NvbW1vbi9tb3ZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjZDhlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvY29tbW9uL21vdmUuaApAQCAtMCwwICsxLDIwOSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBTVEFSQk9BUkRfQ09NTU9OX01PVkVfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX0NPTU1PTl9NT1ZFX0hfCisKKy8vIE1hY3JvIHdpdGggdGhlIGJvaWxlcnBsYXRlIHRoYXQgbWFrZXMgYSB0eXBlIG1vdmUtb25seSBpbiBDKyswMy4KKy8vCisvLyBVU0FHRQorLy8KKy8vIFRoaXMgbWFjcm8gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBESVNBTExPV19DT1BZX0FORF9BU1NJR04gdG8gY3JlYXRlCisvLyBhICJtb3ZlLW9ubHkiIHR5cGUuICBVbmxpa2UgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOLCB0aGlzIG1hY3JvIHNob3VsZCBiZQorLy8gdGhlIGZpcnN0IGxpbmUgaW4gYSBjbGFzcyBkZWNsYXJhdGlvbi4KKy8vCisvLyBBIGNsYXNzIHVzaW5nIHRoaXMgbWFjcm8gbXVzdCBjYWxsIC5QYXNzKCkgKG9yIHNvbWVob3cgYmUgYW4gci12YWx1ZSBhbHJlYWR5KQorLy8gYmVmb3JlIGl0IGNhbiBiZToKKy8vCisvLyAgICogUGFzc2VkIGFzIGEgZnVuY3Rpb24gYXJndW1lbnQKKy8vICAgKiBVc2VkIGFzIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudAorLy8gICAqIFJldHVybmVkIGZyb20gYSBmdW5jdGlvbgorLy8KKy8vIEVhY2ggY2xhc3Mgd2lsbCBzdGlsbCBuZWVkIHRvIGRlZmluZSB0aGVpciBvd24gIm1vdmUgY29uc3RydWN0b3IiIGFuZCAibW92ZQorLy8gb3BlcmF0b3I9IiB0byBtYWtlIHRoaXMgdXNlZnVsLiAgSGVyZSdzIGFuIGV4YW1wbGUgb2YgdGhlIG1hY3JvLCB0aGUgbW92ZQorLy8gY29uc3RydWN0b3IsIGFuZCB0aGUgbW92ZSBvcGVyYXRvcj0gZnJvbSB0aGUgc2NvcGVkX3B0ciBjbGFzczoKKy8vCisvLyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisvLyAgY2xhc3Mgc2NvcGVkX3B0ciB7CisvLyAgICAgTU9WRV9PTkxZX1RZUEVfRk9SX0NQUF8wMyhzY29wZWRfcHRyLCBSVmFsdWUpCisvLyAgIHB1YmxpYzoKKy8vICAgIHNjb3BlZF9wdHIoUlZhbHVlJiBvdGhlcikgOiBwdHJfKG90aGVyLnJlbGVhc2UoKSkgeyB9CisvLyAgICBzY29wZWRfcHRyJiBvcGVyYXRvcj0oUlZhbHVlJiBvdGhlcikgeworLy8gICAgICBzd2FwKG90aGVyKTsKKy8vICAgICAgcmV0dXJuICp0aGlzOworLy8gICAgfQorLy8gIH07CisvLworLy8gTm90ZSB0aGF0IHRoZSBjb25zdHJ1Y3RvciBtdXN0IE5PVCBiZSBtYXJrZWQgZXhwbGljaXQuCisvLworLy8gRm9yIGNvbnNpc3RlbmN5LCB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byB0aGUgbWFjcm8gc2hvdWxkIGFsd2F5cyBiZSBSVmFsdWUKKy8vIHVubGVzcyB5b3UgaGF2ZSBhIHN0cm9uZyByZWFzb24gdG8gZG8gb3RoZXJ3aXNlLiAgSXQgaXMgb25seSBleHBvc2VkIGFzIGEKKy8vIG1hY3JvIHBhcmFtZXRlciBzbyB0aGF0IHRoZSBtb3ZlIGNvbnN0cnVjdG9yIGFuZCBtb3ZlIG9wZXJhdG9yPSBkb24ndCBsb29rCisvLyBsaWtlIHRoZXkncmUgdXNpbmcgYSBwaGFudG9tIHR5cGUuCisvLworLy8KKy8vIEhPVyBUSElTIFdPUktTCisvLworLy8gRm9yIGEgdGhvcm91Z2ggZXhwbGFuYXRpb24gb2YgdGhpcyB0ZWNobmlxdWUsIHNlZToKKy8vCisvLyAgIGh0dHA6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvTW9yZV9DJTJCJTJCX0lkaW9tcy9Nb3ZlX0NvbnN0cnVjdG9yCisvLworLy8gVGhlIHN1bW1hcnkgaXMgdGhhdCB3ZSB0YWtlIGFkdmFudGFnZSBvZiAyIHByb3BlcnRpZXM6CisvLworLy8gICAxKSBub24tY29uc3QgcmVmZXJlbmNlcyB3aWxsIG5vdCBiaW5kIHRvIHItdmFsdWVzLgorLy8gICAyKSBDKysgY2FuIGFwcGx5IG9uZSB1c2VyLWRlZmluZWQgY29udmVyc2lvbiB3aGVuIGluaXRpYWxpemluZyBhCisvLyAgICAgIHZhcmlhYmxlLgorLy8KKy8vIFRoZSBmaXJzdCBsZXRzIHVzIGRpc2FibGUgdGhlIGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IKKy8vIGJ5IGRlY2xhcmluZyBwcml2YXRlIHZlcnNpb24gb2YgdGhlbSB3aXRoIGEgbm9uLWNvbnN0IHJlZmVyZW5jZSBwYXJhbWV0ZXIuCisvLworLy8gRm9yIGwtdmFsdWVzLCBkaXJlY3QgaW5pdGlhbGl6YXRpb24gc3RpbGwgZmFpbHMgbGlrZSBpbgorLy8gRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOIGJlY2F1c2UgdGhlIGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQKKy8vIG9wZXJhdG9ycyBhcmUgcHJpdmF0ZS4KKy8vCisvLyBGb3Igci12YWx1ZXMsIHRoZSBzaXR1YXRpb24gaXMgZGlmZmVyZW50LiBUaGUgY29weSBjb25zdHJ1Y3RvciBhbmQKKy8vIGFzc2lnbm1lbnQgb3BlcmF0b3IgYXJlIG5vdCB2aWFibGUgZHVlIHRvICgxKSwgc28gd2UgYXJlIHRyeWluZyB0byBjYWxsCisvLyBhIG5vbi1leGlzdGVudCBjb25zdHJ1Y3RvciBhbmQgbm9uLWV4aXN0aW5nIG9wZXJhdG9yPSByYXRoZXIgdGhhbiBhIHByaXZhdGUKKy8vIG9uZS4gIFNpbmNlIHdlIGhhdmUgbm90IGNvbW1pdHRlZCBhbiBlcnJvciBxdWl0ZSB5ZXQsIHdlIGNhbiBwcm92aWRlIGFuCisvLyBhbHRlcm5hdGUgY29udmVyc2lvbiBzZXF1ZW5jZSBhbmQgYSBjb25zdHJ1Y3Rvci4gIFdlIGFkZAorLy8KKy8vICAgKiBhIHByaXZhdGUgc3RydWN0IG5hbWVkICJSVmFsdWUiCisvLyAgICogYSB1c2VyLWRlZmluZWQgY29udmVyc2lvbiAib3BlcmF0b3IgUlZhbHVlKCkiCisvLyAgICogYSAibW92ZSBjb25zdHJ1Y3RvciIgYW5kICJtb3ZlIG9wZXJhdG9yPSIgdGhhdCB0YWtlIHRoZSBSVmFsdWUmIGFzCisvLyAgICAgdGhlaXIgc29sZSBwYXJhbWV0ZXIuCisvLworLy8gT25seSByLXZhbHVlcyB3aWxsIHRyaWdnZXIgdGhpcyBzZXF1ZW5jZSBhbmQgZXhlY3V0ZSBvdXIgIm1vdmUgY29uc3RydWN0b3IiCisvLyBvciAibW92ZSBvcGVyYXRvcj0uIiAgTC12YWx1ZXMgd2lsbCBtYXRjaCB0aGUgcHJpdmF0ZSBjb3B5IGNvbnN0cnVjdG9yIGFuZAorLy8gb3BlcmF0b3I9IGZpcnN0IGdpdmluZyBhICJwcml2YXRlIGluIHRoaXMgY29udGV4dCIgZXJyb3IuICBUaGlzIGNvbWJpbmF0aW9uCisvLyBnaXZlcyB1cyBhIG1vdmUtb25seSB0eXBlLgorLy8KKy8vIEZvciBzaWduYWxpbmcgYSBkZXN0cnVjdGl2ZSB0cmFuc2ZlciBvZiBkYXRhIGZyb20gYW4gbC12YWx1ZSwgd2UgcHJvdmlkZSBhCisvLyBtZXRob2QgbmFtZWQgUGFzcygpIHdoaWNoIGNyZWF0ZXMgYW4gci12YWx1ZSBmb3IgdGhlIGN1cnJlbnQgaW5zdGFuY2UKKy8vIHRyaWdnZXJpbmcgdGhlIG1vdmUgY29uc3RydWN0b3Igb3IgbW92ZSBvcGVyYXRvcj0uCisvLworLy8gT3RoZXIgd2F5cyB0byBnZXQgci12YWx1ZXMgaXMgdG8gdXNlIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBsaWtlIGEKKy8vIGZ1bmN0aW9uIGNhbGwuCisvLworLy8gSGVyZSdzIGFuIGV4YW1wbGUgd2l0aCBjb21tZW50cyBleHBsYWluaW5nIHdoYXQgZ2V0cyB0cmlnZ2VyZWQgd2hlcmU6CisvLworLy8gICAgY2xhc3MgRm9vIHsKKy8vICAgICAgTU9WRV9PTkxZX1RZUEVfRk9SX0NQUF8wMyhGb28sIFJWYWx1ZSk7CisvLworLy8gICAgIHB1YmxpYzoKKy8vICAgICAgIC4uLiBBUEkgLi4uCisvLyAgICAgICBGb28oUlZhbHVlIG90aGVyKTsgICAgICAgICAgIC8vIE1vdmUgY29uc3RydWN0b3IuCisvLyAgICAgICBGb28mIG9wZXJhdG9yPShSVmFsdWUgcmhzKTsgIC8vIE1vdmUgb3BlcmF0b3I9CisvLyAgICB9OworLy8KKy8vICAgIEZvbyBNYWtlRm9vKCk7ICAvLyBGdW5jdGlvbiB0aGF0IHJldHVybnMgYSBGb28uCisvLworLy8gICAgRm9vIGY7CisvLyAgICBGb28gZl9jb3B5KGYpOyAgLy8gRVJST1I6IEZvbyhGb28mKSBpcyBwcml2YXRlIGluIHRoaXMgY29udGV4dC4KKy8vICAgIEZvbyBmX2Fzc2lnbjsKKy8vICAgIGZfYXNzaWduID0gZjsgICAvLyBFUlJPUjogb3BlcmF0b3I9KEZvbyYpIGlzIHByaXZhdGUgaW4gdGhpcyBjb250ZXh0LgorLy8KKy8vCisvLyAgICBGb28gZihNYWtlRm9vKCkpOyAgICAgIC8vIFItdmFsdWUgc28gYWx0ZXJuYXRlIGNvbnZlcnNpb24gZXhlY3V0ZWQuCisvLyAgICBGb28gZl9jb3B5KGYuUGFzcygpKTsgIC8vIFItdmFsdWUgc28gYWx0ZXJuYXRlIGNvbnZlcnNpb24gZXhlY3V0ZWQuCisvLyAgICBmID0gZl9jb3B5LlBhc3MoKTsgICAgIC8vIFItdmFsdWUgc28gYWx0ZXJuYXRlIGNvbnZlcnNpb24gZXhlY3V0ZWQuCisvLworLy8KKy8vIElNUExFTUVOVEFUSU9OIFNVQlRMRVRJRVMgV0lUSCBSVmFsdWUKKy8vCisvLyBUaGUgUlZhbHVlIHN0cnVjdCBpcyBqdXN0IGEgY29udGFpbmVyIGZvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgb3JpZ2luYWwKKy8vIG9iamVjdC4gSXQgc2hvdWxkIG9ubHkgZXZlciBiZSBjcmVhdGVkIGFzIGEgdGVtcG9yYXJ5LCBhbmQgbm8gZXh0ZXJuYWwKKy8vIGNsYXNzIHNob3VsZCBldmVyIGRlY2xhcmUgaXQgb3IgdXNlIGl0IGluIGEgcGFyYW1ldGVyLgorLy8KKy8vIEl0IGlzIHRlbXB0aW5nIHRvIHdhbnQgdG8gdXNlIHRoZSBSVmFsdWUgdHlwZSBpbiBmdW5jdGlvbiBwYXJhbWV0ZXJzLCBidXQKKy8vIGV4Y2x1ZGluZyB0aGUgbGltaXRlZCB1c2FnZSBoZXJlIGZvciB0aGUgbW92ZSBjb25zdHJ1Y3RvciBhbmQgbW92ZQorLy8gb3BlcmF0b3I9LCBkb2luZyBzbyB3b3VsZCBtZWFuIHRoYXQgdGhlIGZ1bmN0aW9uIGNvdWxkIHRha2UgYm90aCByLXZhbHVlcworLy8gYW5kIGwtdmFsdWVzIGVxdWlhbGx5IHdoaWNoIGlzIHVuZXhwZWN0ZWQuICBTZWUgQ09NUEFSRUQgVG8gQm9vc3QuTW92ZSBmb3IKKy8vIG1vcmUgZGV0YWlscy4KKy8vCisvLyBBbiBhbHRlcm5hdGUsIGFuZCBpbmNvcnJlY3QsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSVmFsdWUgY2xhc3MgdXNlZCBieQorLy8gQm9vc3QuTW92ZSBtYWtlcyBSVmFsdWUgYSBmaWVsZGxlc3MgY2hpbGQgb2YgdGhlIG1vdmUtb25seSB0eXBlLiBSVmFsdWUmCisvLyBpcyB0aGVuIHVzZWQgaW4gcGxhY2Ugb2YgUlZhbHVlIGluIHRoZSB2YXJpb3VzIG9wZXJhdG9ycy4gIFRoZSBSVmFsdWUmIGlzCisvLyAiY3JlYXRlZCIgYnkgZG9pbmcgKnJlaW50ZXJwcmV0X2Nhc3Q8UlZhbHVlKj4odGhpcykuICBUaGlzIGhhcyB0aGUgYXBwZWFsCisvLyBvZiBuZXZlciBjcmVhdGluZyBhIHRlbXByb2FyeSBSVmFsdWUgc3RydWN0IGV2ZW4gd2l0aCBvcHRpbWl6YXRpb25zCisvLyBkaXNhYmxlZC4gIEFsc28sIGJ5IHZpcnR1ZSBvZiBpbmhlcml0YW5jZSB5b3UgY2FuIHRyZWF0IHRoZSBSVmFsdWUKKy8vIHJlZmVyZW5jZSBhcyBpZiBpdCB3ZXJlIHRoZSBtb3ZlLW9ubHkgdHlwZSBpdHNlbGYuICBVbmZvcnR1YW50ZWx5LAorLy8gdXNpbmcgdGhlIHJlc3VsdCBvZiB0aGlzIHJlaW50ZXJwcmV0X2Nhc3Q8PiBpcyBhY3R1YWxseSB1bmRlZmluZWQgYmVoYXZpb3IKKy8vIGR1ZSB0byBDKys5OCA1LjIuMTAuNy4gSW4gY2VydGFpbiBjb21waWxlcnMgKGVnLiwgTmFDbCkgdGhlIG9wdGltaXplcgorLy8gd2lsbCBnZW5lcmF0ZSBub24td29ya2luZyBjb2RlLgorLy8KKy8vIEluIG9wdGltaXplZCBidWlsZHMsIGJvdGggaW1wbGVtZW50YXRpb25zIGdlbmVyYXRlIHRoZSBzYW1lIGFzc2VtYmx5IHNvIHdlCisvLyBjaG9vc2UgdGhlIG9uZSB0aGF0IGFkaGVyZXMgdG8gdGhlIHN0YW5kYXJkLgorLy8KKy8vCisvLyBDT01QQVJFRCBUTyBDKysxMQorLy8KKy8vIEluIEMrKzExLCB5b3Ugd291bGQgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSB1c2luZyBhbiByLXZhbHVlIHJlZmVyZW5jZQorLy8gYW5kIG91ciAuUGFzcygpIG1ldGhvZCB3b3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgY2FsbCB0byBzdGQ6Om1vdmUoKS4KKy8vCisvLyBUaGlzIGVtdWxhdGlvbiBhbHNvIGhhcyBhIGRlZmljaWVuY3kgd2hlcmUgaXQgdXNlcyB1cCB0aGUgc2luZ2xlCisvLyB1c2VyLWRlZmluZWQgY29udmVyc2lvbiBhbGxvd2VkIGJ5IEMrKyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uICBUaGlzIGNhbgorLy8gY2F1c2UgcHJvYmxlbXMgaW4gc29tZSBBUEkgZWRnZSBjYXNlcy4gIEZvciBpbnN0YW5jZSwgaW4gc2NvcGVkX3B0ciwgaXQgaXMKKy8vIGltcG9zc2libGUgdG8gbWFrZSBhbiBmdW5jdGlvbiAidm9pZCBGb28oc2NvcGVkX3B0cjxQYXJlbnQ+IHApIiBhY2NlcHQgYQorLy8gdmFsdWUgb2YgdHlwZSBzY29wZWRfcHRyPENoaWxkPiBldmVuIGlmIHlvdSBhZGQgYSBjb25zdHJ1Y3RvciB0bworLy8gc2NvcGVkX3B0cjw+IHRoYXQgd291bGQgbWFrZSBpdCBsb29rIGxpa2UgaXQgc2hvdWxkIHdvcmsuICBDKysxMSBkb2VzIG5vdAorLy8gaGF2ZSB0aGlzIGRlZmljaWVuY3kuCisvLworLy8KKy8vIENPTVBBUkVEIFRPIEJvb3N0Lk1vdmUKKy8vCisvLyBPdXIgaW1wbGVtZW50YXRpb24gc2ltaWxhciB0byBCb29zdC5Nb3ZlLCBidXQgd2Uga2VlcCB0aGUgUlZhbHVlIHN0cnVjdAorLy8gcHJpdmF0ZSB0byB0aGUgbW92ZS1vbmx5IHR5cGUsIGFuZCB3ZSBkb24ndCB1c2UgdGhlIHJlaW50ZXJwcmV0X2Nhc3Q8PiBoYWNrLgorLy8KKy8vIEluIEJvb3N0Lk1vdmUsIFJWYWx1ZSBpcyB0aGUgYm9vc3Q6OnJ2PD4gdGVtcGxhdGUuICBUaGlzIHR5cGUgY2FuIGJlIHVzZWQKKy8vIHdoZW4gd3JpdGluZyBBUElzIGxpa2U6CisvLworLy8gICB2b2lkIE15RnVuYyhib29zdDo6cnY8Rm9vPiYgZikKKy8vCisvLyB0aGF0IGNhbiB0YWtlIGFkdmFudGFnZSBvZiBydjw+IHRvIGF2b2lkIGV4dHJhIGNvcGllcyBvZiBhIHR5cGUuICBIb3dldmVyIHlvdQorLy8gd291bGQgc3RpbGwgYmUgYWJsZSB0byBjYWxsIHRoaXMgdmVyc2lvbiBvZiBNeUZ1bmMgd2l0aCBhbiBsLXZhbHVlOgorLy8KKy8vICAgRm9vIGY7CisvLyAgIE15RnVuYyhmKTsgIC8vIFVoIG9oLCB3ZSBwcm9iYWJseSBqdXN0IGRlc3Ryb3llZCB8Znwgdy9vIGNhbGxpbmcgUGFzcygpLgorLy8KKy8vIHVubGVzcyBzb21lb25lIGlzIHZlcnkgY2FyZWZ1bCB0byBhbHNvIGRlY2xhcmUgYSBwYXJhbGxlbCBvdmVycmlkZSBsaWtlOgorLy8KKy8vICAgdm9pZCBNeUZ1bmMoY29uc3QgRm9vJiBmKQorLy8KKy8vIHRoYXQgd291bGQgY2F0Y2ggdGhlIGwtdmFsdWVzIGZpcnN0LiAgVGhpcyB3YXMgZGVjbGFyZWQgdW5zYWZlIGluIEMrKzExIGFuZAorLy8gYSBDKysxMSBjb21waWxlciB3aWxsIGV4cGxpY2l0bHkgZmFpbCBNeUZ1bmMoZikuICBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW5ub3QKKy8vIGVuc3VyZSB0aGlzIGluIEMrKzAzLgorLy8KKy8vIFNpbmNlIHdlIGhhdmUgbm8gbmVlZCBmb3Igd3JpdGluZyBzdWNoIEFQSXMgeWV0LCBvdXIgaW1wbGVtZW50YXRpb24ga2VlcHMKKy8vIFJWYWx1ZSBwcml2YXRlIGFuZCB1c2VzIGEgLlBhc3MoKSBtZXRob2QgdG8gZG8gdGhlIGNvbnZlcnNpb24gaW5zdGVhZCBvZgorLy8gdHJ5aW5nIHRvIHdyaXRlIGEgdmVyc2lvbiBvZiAic3RkOjptb3ZlKCkuIiBXcml0aW5nIGFuIEFQSSBsaWtlIHN0ZDo6bW92ZSgpCisvLyB3b3VsZCByZXF1aXJlIHRoZSBSVmFsdWUgc3RydWN0cyB0byBiZSBwdWJsaWMuCisvLworLy8KKy8vIENBVkVBVFMKKy8vCisvLyBJZiB5b3UgaW5jbHVkZSBhIG1vdmUtb25seSB0eXBlIGFzIGEgZmllbGQgaW5zaWRlIGEgY2xhc3MgdGhhdCBkb2VzIG5vdAorLy8gZXhwbGljaXRseSBkZWNsYXJlIGEgY29weSBjb25zdHJ1Y3RvciwgdGhlIGNvbnRhaW5pbmcgY2xhc3MncyBpbXBsaWNpdAorLy8gY29weSBjb25zdHJ1Y3RvciB3aWxsIGNoYW5nZSBmcm9tIENvbnRhaW5pbmcoY29uc3QgQ29udGFpbmluZyYpIHRvCisvLyBDb250YWluaW5nKENvbnRhaW5pbmcmKS4gIFRoaXMgY2FuIGNhdXNlIHNvbWUgdW5leHBlY3RlZCBlcnJvcnMuCisvLworLy8gICBodHRwOi8vbGx2bS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MjgKKy8vCisvLyBUaGUgd29ya2Fyb3VuZCBpcyB0byBleHBsaWNpdGx5IGRlY2xhcmUgeW91ciBjb3B5IGNvbnN0cnVjdG9yLgorLy8KKyNkZWZpbmUgTU9WRV9PTkxZX1RZUEVfRk9SX0NQUF8wMyh0eXBlLCBydmFsdWVfdHlwZSkgICBcCisgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgcnZhbHVlX3R5cGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydmFsdWVfdHlwZSh0eXBlKiBvYmplY3QpIDogb2JqZWN0KG9iamVjdCkge30gICAgICBcCisgICAgdHlwZSogb2JqZWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZSh0eXBlJik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgb3BlcmF0b3I9KHR5cGUmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG9wZXJhdG9yIHJ2YWx1ZV90eXBlKCkgeyByZXR1cm4gcnZhbHVlX3R5cGUodGhpcyk7IH0gXAorICB0eXBlIFBhc3MoKSB7IHJldHVybiB0eXBlKHJ2YWx1ZV90eXBlKHRoaXMpKTsgfSAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgcHJpdmF0ZToKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfQ09NTU9OX01PVkVfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY29tbW9uL3Jlc2V0X2FuZF9yZXR1cm4uaCBiL3NyYy9zdGFyYm9hcmQvY29tbW9uL3Jlc2V0X2FuZF9yZXR1cm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODgxZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9jb21tb24vcmVzZXRfYW5kX3JldHVybi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgU1RBUkJPQVJEX0NPTU1PTl9SRVNFVF9BTkRfUkVUVVJOX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9DT01NT05fUkVTRVRfQU5EX1JFVFVSTl9IXworCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBjb21tb24geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgUmVzZXRBbmRSZXR1cm4oVCogdCkgeworICBUIHJlc3VsdCgqdCk7CisgICp0ID0gVCgpOworICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgY29tbW9uCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCisKKyNlbmRpZiAgLy8gU1RBUkJPQVJEX0NPTU1PTl9SRVNFVF9BTkRfUkVUVVJOX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmggYi9zcmMvc3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2MjI2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaApAQCAtMCwwICsxLDQ5MSBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gU2NvcGVycyBoZWxwIHlvdSBtYW5hZ2Ugb3duZXJzaGlwIG9mIGEgcG9pbnRlciwgaGVscGluZyB5b3UgZWFzaWx5IG1hbmFnZSB0aGUKKy8vIGEgcG9pbnRlciB3aXRoaW4gYSBzY29wZSwgYW5kIGF1dG9tYXRpY2FsbHkgZGVzdHJveWluZyB0aGUgcG9pbnRlciBhdCB0aGUKKy8vIGVuZCBvZiBhIHNjb3BlLiAgVGhlcmUgYXJlIHR3byBtYWluIGNsYXNzZXMgeW91IHdpbGwgdXNlLCB3aGljaCBjb3JyZXNwb25kCisvLyB0byB0aGUgb3BlcmF0b3JzIG5ldy9kZWxldGUgYW5kIG5ld1tdL2RlbGV0ZVtdLgorLy8KKy8vIEV4YW1wbGUgdXNhZ2UgKHNjb3BlZF9wdHIpOgorLy8gICB7CisvLyAgICAgc2NvcGVkX3B0cjxGb28+IGZvbyhuZXcgRm9vKCJ3ZWUiKSk7CisvLyAgIH0gIC8vIGZvbyBnb2VzIG91dCBvZiBzY29wZSwgcmVsZWFzaW5nIHRoZSBwb2ludGVyIHdpdGggaXQuCisvLworLy8gICB7CisvLyAgICAgc2NvcGVkX3B0cjxGb28+IGZvbzsgICAgICAgICAgLy8gTm8gcG9pbnRlciBtYW5hZ2VkLgorLy8gICAgIGZvby5yZXNldChuZXcgRm9vKCJ3ZWUiKSk7ICAgIC8vIE5vdyBhIHBvaW50ZXIgaXMgbWFuYWdlZC4KKy8vICAgICBmb28ucmVzZXQobmV3IEZvbygid2VlMiIpKTsgICAvLyBGb28oIndlZSIpIHdhcyBkZXN0cm95ZWQuCisvLyAgICAgZm9vLnJlc2V0KG5ldyBGb28oIndlZTMiKSk7ICAgLy8gRm9vKCJ3ZWUyIikgd2FzIGRlc3Ryb3llZC4KKy8vICAgICBmb28tPk1ldGhvZCgpOyAgICAgICAgICAgICAgICAvLyBGb286Ok1ldGhvZCgpIGNhbGxlZC4KKy8vICAgICBmb28uZ2V0KCktPk1ldGhvZCgpOyAgICAgICAgICAvLyBGb286Ok1ldGhvZCgpIGNhbGxlZC4KKy8vICAgICBTb21lRnVuYyhmb28ucmVsZWFzZSgpKTsgICAgICAvLyBTb21lRnVuYyB0YWtlcyBvd25lcnNoaXAsIGZvbyBubyBsb25nZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYW5hZ2VzIGEgcG9pbnRlci4KKy8vICAgICBmb28ucmVzZXQobmV3IEZvbygid2VlNCIpKTsgICAvLyBmb28gbWFuYWdlcyBhIHBvaW50ZXIgYWdhaW4uCisvLyAgICAgZm9vLnJlc2V0KCk7ICAgICAgICAgICAgICAgICAgLy8gRm9vKCJ3ZWU0IikgZGVzdHJveWVkLCBmb28gbm8gbG9uZ2VyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFuYWdlcyBhIHBvaW50ZXIuCisvLyAgIH0gIC8vIGZvbyB3YXNuJ3QgbWFuYWdpbmcgYSBwb2ludGVyLCBzbyBub3RoaW5nIHdhcyBkZXN0cm95ZWQuCisvLworLy8gRXhhbXBsZSB1c2FnZSAoc2NvcGVkX2FycmF5KToKKy8vICAgeworLy8gICAgIHNjb3BlZF9hcnJheTxGb28+IGZvbyhuZXcgRm9vWzEwMF0pOworLy8gICAgIGZvby5nZXQoKS0+TWV0aG9kKCk7ICAvLyBGb286Ok1ldGhvZCBvbiB0aGUgMHRoIGVsZW1lbnQuCisvLyAgICAgZm9vWzEwXS5NZXRob2QoKTsgICAgIC8vIEZvbzo6TWV0aG9kIG9uIHRoZSAxMHRoIGVsZW1lbnQuCisvLyAgIH0KKy8vCisvLyBUaGVzZSBzY29wZXJzIGFsc28gaW1wbGVtZW50IHBhcnQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgQysrMTEgdW5pcXVlX3B0cgorLy8gaW4gdGhhdCB0aGV5IGFyZSAibW92YWJsZSBidXQgbm90IGNvcHlhYmxlLiIgIFlvdSBjYW4gdXNlIHRoZSBzY29wZXJzIGluCisvLyB0aGUgcGFyYW1ldGVyIGFuZCByZXR1cm4gdHlwZXMgb2YgZnVuY3Rpb25zIHRvIHNpZ25pZnkgb3duZXJzaGlwIHRyYW5zZmVyCisvLyBpbiB0byBhbmQgb3V0IG9mIGEgZnVuY3Rpb24uICBXaGVuIGNhbGxpbmcgYSBmdW5jdGlvbiB0aGF0IGhhcyBhIHNjb3BlcgorLy8gYXMgdGhlIGFyZ3VtZW50IHR5cGUsIGl0IG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiBhbiBhbmFsb2dvdXMKKy8vIHNjb3BlcidzIFBhc3MoKSBmdW5jdGlvbiBvciBhbm90aGVyIGZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIGEgdGVtcG9yYXJ5OworLy8gcGFzc2luZyBieSBjb3B5IHdpbGwgTk9UIHdvcmsuICBIZXJlIGlzIGFuIGV4YW1wbGUgdXNpbmcgc2NvcGVkX3B0cjoKKy8vCisvLyAgIHZvaWQgVGFrZXNPd25lcnNoaXAoc2NvcGVkX3B0cjxGb28+IGFyZykgeworLy8gICAgIC8vIERvIHNvbWV0aGluZyB3aXRoIGFyZworLy8gICB9CisvLyAgIHNjb3BlZF9wdHI8Rm9vPiBDcmVhdGVGb28oKSB7CisvLyAgICAgLy8gTm8gbmVlZCBmb3IgY2FsbGluZyBQYXNzKCkgYmVjYXVzZSB3ZSBhcmUgY29uc3RydWN0aW5nIGEgdGVtcG9yYXJ5CisvLyAgICAgLy8gZm9yIHRoZSByZXR1cm4gdmFsdWUuCisvLyAgICAgcmV0dXJuIHNjb3BlZF9wdHI8Rm9vPihuZXcgRm9vKCJuZXciKSk7CisvLyAgIH0KKy8vICAgc2NvcGVkX3B0cjxGb28+IFBhc3NUaHJ1KHNjb3BlZF9wdHI8Rm9vPiBhcmcpIHsKKy8vICAgICByZXR1cm4gYXJnLlBhc3MoKTsKKy8vICAgfQorLy8KKy8vICAgeworLy8gICAgIHNjb3BlZF9wdHI8Rm9vPiBwdHIobmV3IEZvbygieWF5IikpOyAgLy8gcHRyIG1hbmFnZXMgRm9vKCJ5YXkiKS4KKy8vICAgICBUYWtlc093bmVyc2hpcChwdHIuUGFzcygpKTsgICAgICAgICAgIC8vIHB0ciBubyBsb25nZXIgb3ducyBGb28oInlheSIpLgorLy8gICAgIHNjb3BlZF9wdHI8Rm9vPiBwdHIyID0gQ3JlYXRlRm9vKCk7ICAgLy8gcHRyMiBvd25zIHRoZSByZXR1cm4gRm9vLgorLy8gICAgIHNjb3BlZF9wdHI8Rm9vPiBwdHIzID0gICAgICAgICAgICAgICAgLy8gcHRyMyBub3cgb3ducyB3aGF0IHdhcyBpbiBwdHIyLgorLy8gICAgICAgICBQYXNzVGhydShwdHIyLlBhc3MoKSk7ICAgICAgICAgICAgLy8gcHRyMiBpcyBjb3JyZXNwb25kaW5nbHkgTlVMTC4KKy8vICAgfQorLy8KKy8vIE5vdGljZSB0aGF0IGlmIHlvdSBkbyBub3QgY2FsbCBQYXNzKCkgd2hlbiByZXR1cm5pbmcgZnJvbSBQYXNzVGhydSgpLCBvcgorLy8gd2hlbiBpbnZva2luZyBUYWtlc093bmVyc2hpcCgpLCB0aGUgY29kZSB3aWxsIG5vdCBjb21waWxlIGJlY2F1c2Ugc2NvcGVycworLy8gYXJlIG5vdCBjb3B5YWJsZTsgdGhleSBvbmx5IGltcGxlbWVudCBtb3ZlIHNlbWFudGljcyB3aGljaCByZXF1aXJlIGNhbGxpbmcKKy8vIHRoZSBQYXNzKCkgZnVuY3Rpb24gdG8gc2lnbmlmeSBhIGRlc3RydWN0aXZlIHRyYW5zZmVyIG9mIHN0YXRlLiBDcmVhdGVGb28oKQorLy8gaXMgZGlmZmVyZW50IHRob3VnaCBiZWNhdXNlIHdlIGFyZSBjb25zdHJ1Y3RpbmcgYSB0ZW1wb3Jhcnkgb24gdGhlIHJldHVybgorLy8gbGluZSBhbmQgdGh1cyBjYW4gYXZvaWQgbmVlZGluZyB0byBjYWxsIFBhc3MoKS4KKy8vCisvLyBQYXNzKCkgcHJvcGVybHkgaGFuZGxlcyB1cGNhc3QgaW4gYXNzaWdubWVudCwgaS5lLiB5b3UgY2FuIGFzc2lnbgorLy8gc2NvcGVkX3B0cjxDaGlsZD4gdG8gc2NvcGVkX3B0cjxQYXJlbnQ+OgorLy8KKy8vICAgc2NvcGVkX3B0cjxGb28+IGZvbyhuZXcgRm9vKCkpOworLy8gICBzY29wZWRfcHRyPEZvb1BhcmVudD4gcGFyZW50ID0gZm9vLlBhc3MoKTsKKy8vCisvLyBQYXNzQXM8PigpIHNob3VsZCBiZSB1c2VkIHRvIHVwY2FzdCByZXR1cm4gdmFsdWUgaW4gcmV0dXJuIHN0YXRlbWVudDoKKy8vCisvLyAgIHNjb3BlZF9wdHI8Rm9vPiBDcmVhdGVGb28oKSB7CisvLyAgICAgc2NvcGVkX3B0cjxGb29DaGlsZD4gcmVzdWx0KG5ldyBGb29DaGlsZCgpKTsKKy8vICAgICByZXR1cm4gcmVzdWx0LlBhc3NBczxGb28+KCk7CisvLyAgIH0KKy8vCisvLyBOb3RlIHRoYXQgUGFzc0FzPD4oKSBpcyBpbXBsZW1lbnRlZCBvbmx5IGZvciBzY29wZWRfcHRyLCBidXQgbm90IGZvcgorLy8gc2NvcGVkX2FycmF5LiBUaGlzIGlzIGJlY2F1c2UgY2FzdGluZyBhcnJheSBwb2ludGVycyBtYXkgbm90IGJlIHNhZmUuCisKKyNpZm5kZWYgU1RBUkJPQVJEX0NPTU1PTl9TQ09QRURfUFRSX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9DT01NT05fU0NPUEVEX1BUUl9IXworCisvLyBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRlc2lnbmVkIHRvIG1hdGNoIHRoZSBhbnRpY2lwYXRlZCBmdXR1cmUgVFIyCisvLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2NvcGVkX3B0ciBjbGFzcywgYW5kIGl0cyBjbG9zZWx5LXJlbGF0ZWQgYnJldGhyZW4sCisvLyBzY29wZWRfYXJyYXksIHNjb3BlZF9wdHJfbWFsbG9jLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vbW92ZS5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKKworLy8gQSBzY29wZWRfcHRyPFQ+IGlzIGxpa2UgYSBUKiwgZXhjZXB0IHRoYXQgdGhlIGRlc3RydWN0b3Igb2Ygc2NvcGVkX3B0cjxUPgorLy8gYXV0b21hdGljYWxseSBkZWxldGVzIHRoZSBwb2ludGVyIGl0IGhvbGRzIChpZiBhbnkpLgorLy8gVGhhdCBpcywgc2NvcGVkX3B0cjxUPiBvd25zIHRoZSBUIG9iamVjdCB0aGF0IGl0IHBvaW50cyB0by4KKy8vIExpa2UgYSBUKiwgYSBzY29wZWRfcHRyPFQ+IG1heSBob2xkIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIFQgb2JqZWN0LgorLy8gQWxzbyBsaWtlIFQqLCBzY29wZWRfcHRyPFQ+IGlzIHRocmVhZC1jb21wYXRpYmxlLCBhbmQgb25jZSB5b3UKKy8vIGRlcmVmZXJlbmNlIGl0LCB5b3UgZ2V0IHRoZSB0aHJlYWQgc2FmZXR5IGd1YXJhbnRlZXMgb2YgVC4KKy8vCisvLyBUaGUgc2l6ZSBvZiBhIHNjb3BlZF9wdHIgaXMgc21hbGw6CisvLyBzaXplb2Yoc2NvcGVkX3B0cjxDPikgPT0gc2l6ZW9mKEMqKQordGVtcGxhdGUgPGNsYXNzIEM+CitjbGFzcyBzY29wZWRfcHRyIHsKKyAgTU9WRV9PTkxZX1RZUEVfRk9SX0NQUF8wMyhzY29wZWRfcHRyLCBSVmFsdWUpCisKKyBwdWJsaWM6CisgIC8vIFRoZSBlbGVtZW50IHR5cGUKKyAgdHlwZWRlZiBDIGVsZW1lbnRfdHlwZTsKKworICAvLyBDb25zdHJ1Y3Rvci4gIERlZmF1bHRzIHRvIGluaXRpYWxpemluZyB3aXRoIE5VTEwuCisgIC8vIFRoZXJlIGlzIG5vIHdheSB0byBjcmVhdGUgYW4gdW5pbml0aWFsaXplZCBzY29wZWRfcHRyLgorICAvLyBUaGUgaW5wdXQgcGFyYW1ldGVyIG11c3QgYmUgYWxsb2NhdGVkIHdpdGggbmV3LgorICBleHBsaWNpdCBzY29wZWRfcHRyKEMqIHAgPSBOVUxMKSA6IHB0cl8ocCkge30KKworLy8gVGhlIEdIUyBjb21waWxlciBhbHdheXMgY2hvb3NlcyB0aGlzIGNvcHkgY29uc3RydWN0b3Igb3ZlciB0aGUgbmV4dCBvbmUsCisvLyBzbyBkaXNhYmxlIHRoaXMgdG8gcHJvbW90ZSB0aGUgbW9yZSBpbXBvcnRhbnQgYW5kIGZyZXF1ZW50bHkgdXNlZCBjb25zdHIuCisjaWYgIWRlZmluZWQoQ09NUElMRVJfR0hTKQorICAvLyBDb25zdHJ1Y3Rvci4gIEFsbG93cyBjb25zdHJ1Y3Rpb24gZnJvbSBhIHNjb3BlZF9wdHIgcnZhbHVlIGZvciBhCisgIC8vIGNvbnZlcnRpYmxlIHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzY29wZWRfcHRyKHNjb3BlZF9wdHI8VT4gb3RoZXIpCisgICAgICA6IHB0cl8ob3RoZXIucmVsZWFzZSgpKSB7fQorI2VuZGlmCisKKyAgLy8gQ29uc3RydWN0b3IuICBNb3ZlIGNvbnN0cnVjdG9yIGZvciBDKyswMyBtb3ZlIGVtdWxhdGlvbiBvZiB0aGlzIHR5cGUuCisgIHNjb3BlZF9wdHIoUlZhbHVlIHJ2YWx1ZSkgOiBwdHJfKHJ2YWx1ZS5vYmplY3QtPnJlbGVhc2UoKSkge30KKworICAvLyBEZXN0cnVjdG9yLiAgSWYgdGhlcmUgaXMgYSBDIG9iamVjdCwgZGVsZXRlIGl0LgorICAvLyBXZSBkb24ndCBuZWVkIHRvIHRlc3QgcHRyXyA9PSBOVUxMIGJlY2F1c2UgQysrIGRvZXMgdGhhdCBmb3IgdXMuCisgIH5zY29wZWRfcHRyKCkgeworICAgIGVudW0geyB0eXBlX211c3RfYmVfY29tcGxldGUgPSBzaXplb2YoQykgfTsKKyAgICBkZWxldGUgcHRyXzsKKyAgfQorCisgIC8vIG9wZXJhdG9yPS4gIEFsbG93cyBhc3NpZ25tZW50IGZyb20gYSBzY29wZWRfcHRyIHJ2YWx1ZSBmb3IgYSBjb252ZXJ0aWJsZQorICAvLyB0eXBlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc2NvcGVkX3B0ciYgb3BlcmF0b3I9KHNjb3BlZF9wdHI8VT4gcmhzKSB7CisgICAgcmVzZXQocmhzLnJlbGVhc2UoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gb3BlcmF0b3I9LiAgTW92ZSBvcGVyYXRvcj0gZm9yIEMrKzAzIG1vdmUgZW11bGF0aW9uIG9mIHRoaXMgdHlwZS4KKyAgc2NvcGVkX3B0ciYgb3BlcmF0b3I9KFJWYWx1ZSByaHMpIHsKKyAgICBzd2FwKCpyaHMtPm9iamVjdCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gUmVzZXQuICBEZWxldGVzIHRoZSBjdXJyZW50IG93bmVkIG9iamVjdCwgaWYgYW55LgorICAvLyBUaGVuIHRha2VzIG93bmVyc2hpcCBvZiBhIG5ldyBvYmplY3QsIGlmIGdpdmVuLgorICAvLyB0aGlzLT5yZXNldCh0aGlzLT5nZXQoKSkgd29ya3MuCisgIHZvaWQgcmVzZXQoQyogcCA9IE5VTEwpIHsKKyAgICBpZiAocCAhPSBwdHJfKSB7CisgICAgICBlbnVtIHsgdHlwZV9tdXN0X2JlX2NvbXBsZXRlID0gc2l6ZW9mKEMpIH07CisgICAgICBkZWxldGUgcHRyXzsKKyAgICAgIHB0cl8gPSBwOworICAgIH0KKyAgfQorCisgIC8vIEFjY2Vzc29ycyB0byBnZXQgdGhlIG93bmVkIG9iamVjdC4KKyAgLy8gb3BlcmF0b3IqIGFuZCBvcGVyYXRvci0+IHdpbGwgU0JfRENIRUNLKCkgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBvYmplY3QuCisgIEMmIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBTQl9EQ0hFQ0socHRyXyAhPSBOVUxMKTsKKyAgICByZXR1cm4gKnB0cl87CisgIH0KKyAgQyogb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICBTQl9EQ0hFQ0socHRyXyAhPSBOVUxMKTsKKyAgICByZXR1cm4gcHRyXzsKKyAgfQorICBDKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisKKyAgLy8gQWxsb3cgc2NvcGVkX3B0cjxDPiB0byBiZSB1c2VkIGluIGJvb2xlYW4gZXhwcmVzc2lvbnMsIGJ1dCBub3QKKyAgLy8gaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBhIHJlYWwgYm9vbCAod2hpY2ggaXMgZGFuZ2Vyb3VzKS4KKyAgdHlwZWRlZiBDKiBzY29wZWRfcHRyOjoqVGVzdGFibGU7CisgIG9wZXJhdG9yIFRlc3RhYmxlKCkgY29uc3QgeyByZXR1cm4gcHRyXyA/ICZzY29wZWRfcHRyOjpwdHJfIDogTlVMTDsgfQorCisgIC8vIENvbXBhcmlzb24gb3BlcmF0b3JzLgorICAvLyBUaGVzZSByZXR1cm4gd2hldGhlciB0d28gc2NvcGVkX3B0ciByZWZlciB0byB0aGUgc2FtZSBvYmplY3QsIG5vdCBqdXN0IHRvCisgIC8vIHR3byBkaWZmZXJlbnQgYnV0IGVxdWFsIG9iamVjdHMuCisgIGJvb2wgb3BlcmF0b3I9PShDKiBwKSBjb25zdCB7IHJldHVybiBwdHJfID09IHA7IH0KKyAgYm9vbCBvcGVyYXRvciE9KEMqIHApIGNvbnN0IHsgcmV0dXJuIHB0cl8gIT0gcDsgfQorCisgIC8vIFN3YXAgdHdvIHNjb3BlZCBwb2ludGVycy4KKyAgdm9pZCBzd2FwKHNjb3BlZF9wdHImIHAyKSB7CisgICAgQyogdG1wID0gcHRyXzsKKyAgICBwdHJfID0gcDIucHRyXzsKKyAgICBwMi5wdHJfID0gdG1wOworICB9CisKKyAgLy8gUmVsZWFzZSBhIHBvaW50ZXIuCisgIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGN1cnJlbnQgcG9pbnRlciBoZWxkIGJ5IHRoaXMgb2JqZWN0LgorICAvLyBJZiB0aGlzIG9iamVjdCBob2xkcyBhIE5VTEwgcG9pbnRlciwgdGhlIHJldHVybiB2YWx1ZSBpcyBOVUxMLgorICAvLyBBZnRlciB0aGlzIG9wZXJhdGlvbiwgdGhpcyBvYmplY3Qgd2lsbCBob2xkIGEgTlVMTCBwb2ludGVyLAorICAvLyBhbmQgd2lsbCBub3Qgb3duIHRoZSBvYmplY3QgYW55IG1vcmUuCisgIEMqIHJlbGVhc2UoKSB7CisgICAgQyogcmV0VmFsID0gcHRyXzsKKyAgICBwdHJfID0gTlVMTDsKKyAgICByZXR1cm4gcmV0VmFsOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhc3NBc1R5cGU+CisgIHNjb3BlZF9wdHI8UGFzc0FzVHlwZT4gUGFzc0FzKCkgeworICAgIHJldHVybiBzY29wZWRfcHRyPFBhc3NBc1R5cGU+KHJlbGVhc2UoKSk7CisgIH0KKworIHByaXZhdGU6CisgIEMqIHB0cl87CisKKyAgLy8gRm9yYmlkIGNvbXBhcmlzb24gb2Ygc2NvcGVkX3B0ciB0eXBlcy4gIElmIEMyICE9IEMsIGl0IHRvdGFsbHkgZG9lc24ndAorICAvLyBtYWtlIHNlbnNlLCBhbmQgaWYgQzIgPT0gQywgaXQgc3RpbGwgZG9lc24ndCBtYWtlIHNlbnNlIGJlY2F1c2UgeW91IHNob3VsZAorICAvLyBuZXZlciBoYXZlIHRoZSBzYW1lIG9iamVjdCBvd25lZCBieSB0d28gZGlmZmVyZW50IHNjb3BlZF9wdHJzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgQzI+CisgIGJvb2wgb3BlcmF0b3I9PShzY29wZWRfcHRyPEMyPiBjb25zdCYgcDIpIGNvbnN0OworICB0ZW1wbGF0ZSA8Y2xhc3MgQzI+CisgIGJvb2wgb3BlcmF0b3IhPShzY29wZWRfcHRyPEMyPiBjb25zdCYgcDIpIGNvbnN0OworfTsKKworLy8gRnJlZSBmdW5jdGlvbnMKK3RlbXBsYXRlIDxjbGFzcyBDPgordm9pZCBzd2FwKHNjb3BlZF9wdHI8Qz4mIHAxLCBzY29wZWRfcHRyPEM+JiBwMikgeworICBwMS5zd2FwKHAyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEM+Citib29sIG9wZXJhdG9yPT0oQyogcDEsIGNvbnN0IHNjb3BlZF9wdHI8Qz4mIHAyKSB7CisgIHJldHVybiBwMSA9PSBwMi5nZXQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEM+Citib29sIG9wZXJhdG9yIT0oQyogcDEsIGNvbnN0IHNjb3BlZF9wdHI8Qz4mIHAyKSB7CisgIHJldHVybiBwMSAhPSBwMi5nZXQoKTsKK30KKworLy8gc2NvcGVkX2FycmF5PEM+IGlzIGxpa2Ugc2NvcGVkX3B0cjxDPiwgZXhjZXB0IHRoYXQgdGhlIGNhbGxlciBtdXN0IGFsbG9jYXRlCisvLyB3aXRoIG5ldyBbXSBhbmQgdGhlIGRlc3RydWN0b3IgZGVsZXRlcyBvYmplY3RzIHdpdGggZGVsZXRlIFtdLgorLy8KKy8vIEFzIHdpdGggc2NvcGVkX3B0cjxDPiwgYSBzY29wZWRfYXJyYXk8Qz4gZWl0aGVyIHBvaW50cyB0byBhbiBvYmplY3QKKy8vIG9yIGlzIE5VTEwuICBBIHNjb3BlZF9hcnJheTxDPiBvd25zIHRoZSBvYmplY3QgdGhhdCBpdCBwb2ludHMgdG8uCisvLyBzY29wZWRfYXJyYXk8VD4gaXMgdGhyZWFkLWNvbXBhdGlibGUsIGFuZCBvbmNlIHlvdSBpbmRleCBpbnRvIGl0LAorLy8gdGhlIHJldHVybmVkIG9iamVjdHMgaGF2ZSBvbmx5IHRoZSB0aHJlYWQgc2FmZXR5IGd1YXJhbnRlZXMgb2YgVC4KKy8vCisvLyBTaXplOiBzaXplb2Yoc2NvcGVkX2FycmF5PEM+KSA9PSBzaXplb2YoQyopCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK2NsYXNzIHNjb3BlZF9hcnJheSB7CisgIE1PVkVfT05MWV9UWVBFX0ZPUl9DUFBfMDMoc2NvcGVkX2FycmF5LCBSVmFsdWUpCisKKyBwdWJsaWM6CisgIC8vIFRoZSBlbGVtZW50IHR5cGUKKyAgdHlwZWRlZiBDIGVsZW1lbnRfdHlwZTsKKworICAvLyBDb25zdHJ1Y3Rvci4gIERlZmF1bHRzIHRvIGluaXRpYWxpemluZyB3aXRoIE5VTEwuCisgIC8vIFRoZXJlIGlzIG5vIHdheSB0byBjcmVhdGUgYW4gdW5pbml0aWFsaXplZCBzY29wZWRfYXJyYXkuCisgIC8vIFRoZSBpbnB1dCBwYXJhbWV0ZXIgbXVzdCBiZSBhbGxvY2F0ZWQgd2l0aCBuZXcgW10uCisgIGV4cGxpY2l0IHNjb3BlZF9hcnJheShDKiBwID0gTlVMTCkgOiBhcnJheV8ocCkge30KKworICAvLyBDb25zdHJ1Y3Rvci4gIE1vdmUgY29uc3RydWN0b3IgZm9yIEMrKzAzIG1vdmUgZW11bGF0aW9uIG9mIHRoaXMgdHlwZS4KKyAgc2NvcGVkX2FycmF5KFJWYWx1ZSBydmFsdWUpIDogYXJyYXlfKHJ2YWx1ZS5vYmplY3QtPnJlbGVhc2UoKSkge30KKworICAvLyBEZXN0cnVjdG9yLiAgSWYgdGhlcmUgaXMgYSBDIG9iamVjdCwgZGVsZXRlIGl0LgorICAvLyBXZSBkb24ndCBuZWVkIHRvIHRlc3QgcHRyXyA9PSBOVUxMIGJlY2F1c2UgQysrIGRvZXMgdGhhdCBmb3IgdXMuCisgIH5zY29wZWRfYXJyYXkoKSB7CisgICAgZW51bSB7IHR5cGVfbXVzdF9iZV9jb21wbGV0ZSA9IHNpemVvZihDKSB9OworICAgIGRlbGV0ZVtdIGFycmF5XzsKKyAgfQorCisgIC8vIG9wZXJhdG9yPS4gIE1vdmUgb3BlcmF0b3I9IGZvciBDKyswMyBtb3ZlIGVtdWxhdGlvbiBvZiB0aGlzIHR5cGUuCisgIHNjb3BlZF9hcnJheSYgb3BlcmF0b3I9KFJWYWx1ZSByaHMpIHsKKyAgICBzd2FwKCpyaHMub2JqZWN0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBSZXNldC4gIERlbGV0ZXMgdGhlIGN1cnJlbnQgb3duZWQgb2JqZWN0LCBpZiBhbnkuCisgIC8vIFRoZW4gdGFrZXMgb3duZXJzaGlwIG9mIGEgbmV3IG9iamVjdCwgaWYgZ2l2ZW4uCisgIC8vIHRoaXMtPnJlc2V0KHRoaXMtPmdldCgpKSB3b3Jrcy4KKyAgdm9pZCByZXNldChDKiBwID0gTlVMTCkgeworICAgIGlmIChwICE9IGFycmF5XykgeworICAgICAgZW51bSB7IHR5cGVfbXVzdF9iZV9jb21wbGV0ZSA9IHNpemVvZihDKSB9OworICAgICAgZGVsZXRlW10gYXJyYXlfOworICAgICAgYXJyYXlfID0gcDsKKyAgICB9CisgIH0KKworICAvLyBHZXQgb25lIGVsZW1lbnQgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LgorICAvLyBXaWxsIFNCX0RDSEVDSygpIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgb2JqZWN0LCBvciBpbmRleCBpIGlzIG5lZ2F0aXZlLgorICBDJiBvcGVyYXRvcltdKHB0cmRpZmZfdCBpKSBjb25zdCB7CisgICAgU0JfRENIRUNLKGkgPj0gMCk7CisgICAgU0JfRENIRUNLKGFycmF5XyAhPSBOVUxMKTsKKyAgICByZXR1cm4gYXJyYXlfW2ldOworICB9CisKKyAgLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgemVyb3RoIGVsZW1lbnQgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LgorICAvLyBJZiB0aGVyZSBpcyBubyBjdXJyZW50IG9iamVjdCwgcmV0dXJuIE5VTEwuCisgIEMqIGdldCgpIGNvbnN0IHsgcmV0dXJuIGFycmF5XzsgfQorCisgIC8vIEFsbG93IHNjb3BlZF9hcnJheTxDPiB0byBiZSB1c2VkIGluIGJvb2xlYW4gZXhwcmVzc2lvbnMsIGJ1dCBub3QKKyAgLy8gaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBhIHJlYWwgYm9vbCAod2hpY2ggaXMgZGFuZ2Vyb3VzKS4KKyAgdHlwZWRlZiBDKiBzY29wZWRfYXJyYXk6OipUZXN0YWJsZTsKKyAgb3BlcmF0b3IgVGVzdGFibGUoKSBjb25zdCB7IHJldHVybiBhcnJheV8gPyAmc2NvcGVkX2FycmF5OjphcnJheV8gOiBOVUxMOyB9CisKKyAgLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMuCisgIC8vIFRoZXNlIHJldHVybiB3aGV0aGVyIHR3byBzY29wZWRfYXJyYXkgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0LCBub3QganVzdCB0bworICAvLyB0d28gZGlmZmVyZW50IGJ1dCBlcXVhbCBvYmplY3RzLgorICBib29sIG9wZXJhdG9yPT0oQyogcCkgY29uc3QgeyByZXR1cm4gYXJyYXlfID09IHA7IH0KKyAgYm9vbCBvcGVyYXRvciE9KEMqIHApIGNvbnN0IHsgcmV0dXJuIGFycmF5XyAhPSBwOyB9CisKKyAgLy8gU3dhcCB0d28gc2NvcGVkIGFycmF5cy4KKyAgdm9pZCBzd2FwKHNjb3BlZF9hcnJheSYgcDIpIHsKKyAgICBDKiB0bXAgPSBhcnJheV87CisgICAgYXJyYXlfID0gcDIuYXJyYXlfOworICAgIHAyLmFycmF5XyA9IHRtcDsKKyAgfQorCisgIC8vIFJlbGVhc2UgYW4gYXJyYXkuCisgIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGN1cnJlbnQgcG9pbnRlciBoZWxkIGJ5IHRoaXMgb2JqZWN0LgorICAvLyBJZiB0aGlzIG9iamVjdCBob2xkcyBhIE5VTEwgcG9pbnRlciwgdGhlIHJldHVybiB2YWx1ZSBpcyBOVUxMLgorICAvLyBBZnRlciB0aGlzIG9wZXJhdGlvbiwgdGhpcyBvYmplY3Qgd2lsbCBob2xkIGEgTlVMTCBwb2ludGVyLAorICAvLyBhbmQgd2lsbCBub3Qgb3duIHRoZSBvYmplY3QgYW55IG1vcmUuCisgIEMqIHJlbGVhc2UoKSB7CisgICAgQyogcmV0VmFsID0gYXJyYXlfOworICAgIGFycmF5XyA9IE5VTEw7CisgICAgcmV0dXJuIHJldFZhbDsKKyAgfQorCisgcHJpdmF0ZToKKyAgQyogYXJyYXlfOworCisgIC8vIEZvcmJpZCBjb21wYXJpc29uIG9mIGRpZmZlcmVudCBzY29wZWRfYXJyYXkgdHlwZXMuCisgIHRlbXBsYXRlIDxjbGFzcyBDMj4KKyAgYm9vbCBvcGVyYXRvcj09KHNjb3BlZF9hcnJheTxDMj4gY29uc3QmIHAyKSBjb25zdDsKKyAgdGVtcGxhdGUgPGNsYXNzIEMyPgorICBib29sIG9wZXJhdG9yIT0oc2NvcGVkX2FycmF5PEMyPiBjb25zdCYgcDIpIGNvbnN0OworfTsKKworLy8gRnJlZSBmdW5jdGlvbnMKK3RlbXBsYXRlIDxjbGFzcyBDPgordm9pZCBzd2FwKHNjb3BlZF9hcnJheTxDPiYgcDEsIHNjb3BlZF9hcnJheTxDPiYgcDIpIHsKKyAgcDEuc3dhcChwMik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDPgorYm9vbCBvcGVyYXRvcj09KEMqIHAxLCBjb25zdCBzY29wZWRfYXJyYXk8Qz4mIHAyKSB7CisgIHJldHVybiBwMSA9PSBwMi5nZXQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEM+Citib29sIG9wZXJhdG9yIT0oQyogcDEsIGNvbnN0IHNjb3BlZF9hcnJheTxDPiYgcDIpIHsKKyAgcmV0dXJuIHAxICE9IHAyLmdldCgpOworfQorCisvLyBUaGlzIGNsYXNzIHdyYXBzIHRoZSBjIGxpYnJhcnkgZnVuY3Rpb24gZnJlZSgpIGluIGEgY2xhc3MgdGhhdCBjYW4gYmUKKy8vIHBhc3NlZCBhcyBhIHRlbXBsYXRlIGFyZ3VtZW50IHRvIHNjb3BlZF9wdHJfbWFsbG9jIGJlbG93LgorY2xhc3MgU2NvcGVkUHRyTWFsbG9jRnJlZSB7CisgcHVibGljOgorICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKHZvaWQqIHgpIGNvbnN0IHsgU2JNZW1vcnlGcmVlKHgpOyB9Cit9OworCisvLyBzY29wZWRfcHRyX21hbGxvYzw+IGlzIHNpbWlsYXIgdG8gc2NvcGVkX3B0cjw+LCBidXQgaXQgYWNjZXB0cyBhCisvLyBzZWNvbmQgdGVtcGxhdGUgYXJndW1lbnQsIHRoZSBmdW5jdG9yIHVzZWQgdG8gZnJlZSB0aGUgb2JqZWN0LgorCit0ZW1wbGF0ZSA8Y2xhc3MgQywgY2xhc3MgRnJlZVByb2MgPSBTY29wZWRQdHJNYWxsb2NGcmVlPgorY2xhc3Mgc2NvcGVkX3B0cl9tYWxsb2MgeworICBNT1ZFX09OTFlfVFlQRV9GT1JfQ1BQXzAzKHNjb3BlZF9wdHJfbWFsbG9jLCBSVmFsdWUpCisKKyBwdWJsaWM6CisgIC8vIFRoZSBlbGVtZW50IHR5cGUKKyAgdHlwZWRlZiBDIGVsZW1lbnRfdHlwZTsKKworICAvLyBDb25zdHJ1Y3Rvci4gIERlZmF1bHRzIHRvIGluaXRpYWxpemluZyB3aXRoIE5VTEwuCisgIC8vIFRoZXJlIGlzIG5vIHdheSB0byBjcmVhdGUgYW4gdW5pbml0aWFsaXplZCBzY29wZWRfcHRyLgorICAvLyBUaGUgaW5wdXQgcGFyYW1ldGVyIG11c3QgYmUgYWxsb2NhdGVkIHdpdGggYW4gYWxsb2NhdG9yIHRoYXQgbWF0Y2hlcyB0aGUKKyAgLy8gRnJlZSBmdW5jdG9yLiAgRm9yIHRoZSBkZWZhdWx0IEZyZWUgZnVuY3RvciwgdGhpcyBpcyBtYWxsb2MsIGNhbGxvYywgb3IKKyAgLy8gcmVhbGxvYy4KKyAgZXhwbGljaXQgc2NvcGVkX3B0cl9tYWxsb2MoQyogcCA9IE5VTEwpIDogcHRyXyhwKSB7fQorCisgIC8vIENvbnN0cnVjdG9yLiAgTW92ZSBjb25zdHJ1Y3RvciBmb3IgQysrMDMgbW92ZSBlbXVsYXRpb24gb2YgdGhpcyB0eXBlLgorICBzY29wZWRfcHRyX21hbGxvYyhSVmFsdWUgcnZhbHVlKSA6IHB0cl8ocnZhbHVlLm9iamVjdC0+cmVsZWFzZSgpKSB7fQorCisgIC8vIERlc3RydWN0b3IuICBJZiB0aGVyZSBpcyBhIEMgb2JqZWN0LCBjYWxsIHRoZSBGcmVlIGZ1bmN0b3IuCisgIH5zY29wZWRfcHRyX21hbGxvYygpIHsgcmVzZXQoKTsgfQorCisgIC8vIG9wZXJhdG9yPS4gIE1vdmUgb3BlcmF0b3I9IGZvciBDKyswMyBtb3ZlIGVtdWxhdGlvbiBvZiB0aGlzIHR5cGUuCisgIHNjb3BlZF9wdHJfbWFsbG9jJiBvcGVyYXRvcj0oUlZhbHVlIHJocykgeworICAgIHN3YXAoKnJocy5vYmplY3QpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFJlc2V0LiAgQ2FsbHMgdGhlIEZyZWUgZnVuY3RvciBvbiB0aGUgY3VycmVudCBvd25lZCBvYmplY3QsIGlmIGFueS4KKyAgLy8gVGhlbiB0YWtlcyBvd25lcnNoaXAgb2YgYSBuZXcgb2JqZWN0LCBpZiBnaXZlbi4KKyAgLy8gdGhpcy0+cmVzZXQodGhpcy0+Z2V0KCkpIHdvcmtzLgorICB2b2lkIHJlc2V0KEMqIHAgPSBOVUxMKSB7CisgICAgaWYgKHB0cl8gIT0gcCkgeworICAgICAgRnJlZVByb2MgZnJlZV9wcm9jOworICAgICAgZnJlZV9wcm9jKHB0cl8pOworICAgICAgcHRyXyA9IHA7CisgICAgfQorICB9CisKKyAgLy8gR2V0IHRoZSBjdXJyZW50IG9iamVjdC4KKyAgLy8gb3BlcmF0b3IqIGFuZCBvcGVyYXRvci0+IHdpbGwgY2F1c2UgYW4gU0JfRENIRUNLKCkgZmFpbHVyZSBpZiB0aGVyZSBpcworICAvLyBubyBjdXJyZW50IG9iamVjdC4KKyAgQyYgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIFNCX0RDSEVDSyhwdHJfICE9IE5VTEwpOworICAgIHJldHVybiAqcHRyXzsKKyAgfQorCisgIEMqIG9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgU0JfRENIRUNLKHB0cl8gIT0gTlVMTCk7CisgICAgcmV0dXJuIHB0cl87CisgIH0KKworICBDKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisKKyAgLy8gQWxsb3cgc2NvcGVkX3B0cl9tYWxsb2M8Qz4gdG8gYmUgdXNlZCBpbiBib29sZWFuIGV4cHJlc3Npb25zLCBidXQgbm90CisgIC8vIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gYSByZWFsIGJvb2wgKHdoaWNoIGlzIGRhbmdlcm91cykuCisgIHR5cGVkZWYgQyogc2NvcGVkX3B0cl9tYWxsb2M6OipUZXN0YWJsZTsKKyAgb3BlcmF0b3IgVGVzdGFibGUoKSBjb25zdCB7IHJldHVybiBwdHJfID8gJnNjb3BlZF9wdHJfbWFsbG9jOjpwdHJfIDogTlVMTDsgfQorCisgIC8vIENvbXBhcmlzb24gb3BlcmF0b3JzLgorICAvLyBUaGVzZSByZXR1cm4gd2hldGhlciBhIHNjb3BlZF9wdHJfbWFsbG9jIGFuZCBhIHBsYWluIHBvaW50ZXIgcmVmZXIKKyAgLy8gdG8gdGhlIHNhbWUgb2JqZWN0LCBub3QganVzdCB0byB0d28gZGlmZmVyZW50IGJ1dCBlcXVhbCBvYmplY3RzLgorICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBib29zdC1kZXJpdmVkIGltcGxlbWVudGF0aW9uLCB0aGVzZQorICAvLyB0YWtlIG5vbi1jb25zdCBhcmd1bWVudHMuCisgIGJvb2wgb3BlcmF0b3I9PShDKiBwKSBjb25zdCB7IHJldHVybiBwdHJfID09IHA7IH0KKworICBib29sIG9wZXJhdG9yIT0oQyogcCkgY29uc3QgeyByZXR1cm4gcHRyXyAhPSBwOyB9CisKKyAgLy8gU3dhcCB0d28gc2NvcGVkIHBvaW50ZXJzLgorICB2b2lkIHN3YXAoc2NvcGVkX3B0cl9tYWxsb2MmIGIpIHsKKyAgICBDKiB0bXAgPSBiLnB0cl87CisgICAgYi5wdHJfID0gcHRyXzsKKyAgICBwdHJfID0gdG1wOworICB9CisKKyAgLy8gUmVsZWFzZSBhIHBvaW50ZXIuCisgIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGN1cnJlbnQgcG9pbnRlciBoZWxkIGJ5IHRoaXMgb2JqZWN0LgorICAvLyBJZiB0aGlzIG9iamVjdCBob2xkcyBhIE5VTEwgcG9pbnRlciwgdGhlIHJldHVybiB2YWx1ZSBpcyBOVUxMLgorICAvLyBBZnRlciB0aGlzIG9wZXJhdGlvbiwgdGhpcyBvYmplY3Qgd2lsbCBob2xkIGEgTlVMTCBwb2ludGVyLAorICAvLyBhbmQgd2lsbCBub3Qgb3duIHRoZSBvYmplY3QgYW55IG1vcmUuCisgIEMqIHJlbGVhc2UoKSB7CisgICAgQyogdG1wID0gcHRyXzsKKyAgICBwdHJfID0gTlVMTDsKKyAgICByZXR1cm4gdG1wOworICB9CisKKyBwcml2YXRlOgorICBDKiBwdHJfOworCisgIC8vIG5vIHJlYXNvbiB0byB1c2UgdGhlc2U6IGVhY2ggc2NvcGVkX3B0cl9tYWxsb2Mgc2hvdWxkIGhhdmUgaXRzIG93biBvYmplY3QKKyAgdGVtcGxhdGUgPGNsYXNzIEMyLCBjbGFzcyBHUD4KKyAgYm9vbCBvcGVyYXRvcj09KHNjb3BlZF9wdHJfbWFsbG9jPEMyLCBHUD4gY29uc3QmIHApIGNvbnN0OworICB0ZW1wbGF0ZSA8Y2xhc3MgQzIsIGNsYXNzIEdQPgorICBib29sIG9wZXJhdG9yIT0oc2NvcGVkX3B0cl9tYWxsb2M8QzIsIEdQPiBjb25zdCYgcCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQywgY2xhc3MgRlA+CitpbmxpbmUgdm9pZCBzd2FwKHNjb3BlZF9wdHJfbWFsbG9jPEMsIEZQPiYgYSwgc2NvcGVkX3B0cl9tYWxsb2M8QywgRlA+JiBiKSB7CisgIGEuc3dhcChiKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIEZQPgoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShDKiBwLCBjb25zdCBzY29wZWRfcHRyX21hbGxvYzxDLCBGUD4mIGIpIHsKKyAgcmV0dXJuIHAgPT0gYi5nZXQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIEZQPgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShDKiBwLCBjb25zdCBzY29wZWRfcHRyX21hbGxvYzxDLCBGUD4mIGIpIHsKKyAgcmV0dXJuIHAgIT0gYi5nZXQoKTsKK30KKworLy8gQSBmdW5jdGlvbiB0byBjb252ZXJ0IFQqIGludG8gc2NvcGVkX3B0cjxUPgorLy8gRG9pbmcgZS5nLiBtYWtlX3Njb3BlZF9wdHIobmV3IEZvb0JhckJhejx0eXBlPihhcmcpKSBpcyBhIHNob3J0ZXIgbm90YXRpb24KKy8vIGZvciBzY29wZWRfcHRyPEZvb0JhckJhejx0eXBlPiA+KG5ldyBGb29CYXJCYXo8dHlwZT4oYXJnKSkKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc2NvcGVkX3B0cjxUPiBtYWtlX3Njb3BlZF9wdHIoVCogcHRyKSB7CisgIHJldHVybiBzY29wZWRfcHRyPFQ+KHB0cik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfQ09NTU9OX1NDT1BFRF9QVFJfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDdkODQ4OTAuLjIwNjQzZTYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtMzU1LDggKzM1NSwxOSBAQAogCiAvLyAtLS0gVHVuZWFibGUgUGFyYW1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gU3BlY2lmaWVzIHRoZSBuZXR3b3JrIHJlY2VpdmUgYnVmZmVyIHNpemUuCi0jZGVmaW5lIFNCX05FVFdPUktfUkVDRUlWRV9CVUZGRVJfU0laRSAoMTYgKiAxMDI0KQorLy8gU3BlY2lmaWVzIHRoZSBuZXR3b3JrIHJlY2VpdmUgYnVmZmVyIHNpemUgaW4gYnl0ZXMsIHNldCB2aWEKKy8vIFNiU29ja2V0U2V0UmVjZWl2ZUJ1ZmZlclNpemUoKS4KKy8vCisvLyBTZXR0aW5nIHRoaXMgdG8gMCBpbmRpY2F0ZXMgdGhhdCBTYlNvY2tldFNldFJlY2VpdmVCdWZmZXJTaXplKCkgc2hvdWxkCisvLyBub3QgYmUgY2FsbGVkLiBVc2UgdGhpcyBmb3IgT1NzIChzdWNoIGFzIExpbnV4KSB3aGVyZSByZWNlaXZlIGJ1ZmZlcgorLy8gYXV0by10dW5pbmcgaXMgYmV0dGVyLgorLy8KKy8vIE9uIHNvbWUgcGxhdGZvcm1zLCB0aGlzIG1heSBhZmZlY3QgbWF4IFRDUCB3aW5kb3cgc2l6ZSB3aGljaCBtYXkKKy8vIGRyYW1hdGljYWxseSBhZmZlY3QgdGhyb3VnaHB1dCBpbiB0aGUgcHJlc2VuY2Ugb2YgbGF0ZW5jeS4KKy8vCisvLyBJZiB5b3VyIHBsYXRmb3JtIGRvZXMgbm90IGhhdmUgYSBnb29kIFRDUCBhdXRvLXR1bmluZyBtZWNoYW5pc20sCisvLyBhIHNldHRpbmcgb2YgKDEyOCAqIDEwMjQpIGhlcmUgaXMgcmVjb21tZW5kZWQuCisjZGVmaW5lIFNCX05FVFdPUktfUkVDRUlWRV9CVUZGRVJfU0laRSAoMCkKIAogLy8gLS0tIFVzZXIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAppbmRleCAzMzFmZDZjLi5mODlhZTg1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCkBAIC0yNjgsOSArMjY4LDE0IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9taW1lX3BhcnNlci5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9taW1lX3BhcnNlci5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL25ldy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmgnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19kZWNvZGVyX2ludGVybmFsLmgnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvaW5wdXRfYnVmZmVyX2ludGVybmFsLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9jcmVhdGUuY2MnLApAQCAtMjg2LDExICsyOTEsOCBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuaCcsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dyaXRlX2VuZF9vZl9zdHJlYW0uY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93cml0ZV9zYW1wbGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaCcsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZnJhbWVfaW50ZXJuYWwuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2ZyYW1lX2ludGVybmFsLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3F1ZXVlX2FwcGxpY2F0aW9uLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N0cmluZ19jb25jYXQuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3RyaW5nX2NvbmNhdF93aWRlLmNjJywKQEAgLTMyMiw2ICszMjQsNyBAQAogICAgICAgICAnU1RBUkJPQVJEX0lNUExFTUVOVEFUSU9OJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2NvbW1vbi9jb21tb24uZ3lwOmNvbW1vbicsCiAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9kbG1hbGxvYy9kbG1hbGxvYy5neXA6ZGxtYWxsb2MnLAogICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvbGliZXZlbnQvbGliZXZlbnQuZ3lwOmxpYmV2ZW50JywKICAgICAgICAgJ3N0YXJib2FyZF9iYXNlX3N5bWJvbGl6ZScsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAppbmRleCA3NjFhNTVkLi42ZjllM2Y4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKQEAgLTIyOSw5ICsyMjksMTQgQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21pbWVfcGFyc2VyLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21pbWVfcGFyc2VyLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV3LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9hdWRpb19kZWNvZGVyX2ludGVybmFsLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuaCcsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvaW5wdXRfYnVmZmVyX2ludGVybmFsLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9pbnB1dF9idWZmZXJfaW50ZXJuYWwuaCcsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2NyZWF0ZS5jYycsCkBAIC0yNDcsMTEgKzI1Miw4IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd3JpdGVfZW5kX29mX3N0cmVhbS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dyaXRlX3NhbXBsZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19mcmFtZV9pbnRlcm5hbC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZnJhbWVfaW50ZXJuYWwuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcXVldWVfYXBwbGljYXRpb24uY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3RyaW5nX2NvbmNhdC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zdHJpbmdfY29uY2F0X3dpZGUuY2MnLApAQCAtMjg2LDYgKzI4OCw3IEBACiAgICAgICAgICdTVEFSQk9BUkRfSU1QTEVNRU5UQVRJT04nLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvY29tbW9uL2NvbW1vbi5neXA6Y29tbW9uJywKICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L2RsbWFsbG9jL2RsbWFsbG9jLmd5cDpkbG1hbGxvYycsCiAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9saWJldmVudC9saWJldmVudC5neXA6bGliZXZlbnQnLAogICAgICAgICAnc3RhcmJvYXJkX2Jhc2Vfc3ltYm9saXplJywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcGxheWVyLmggYi9zcmMvc3RhcmJvYXJkL3BsYXllci5oCmluZGV4IDIzNmYzZjYuLjMzM2M5ZGQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcGxheWVyLmgKKysrIGIvc3JjL3N0YXJib2FyZC9wbGF5ZXIuaApAQCAtMzUsMTMgKzM1LDEyIEBACiAKIC8vIEFuIGluZGljYXRvciBvZiB3aGV0aGVyIHRoZSBkZWNvZGVyIGNhbiBhY2NlcHQgbW9yZSBzYW1wbGVzLgogdHlwZWRlZiBlbnVtIFNiUGxheWVyRGVjb2RlclN0YXRlIHsKLSAgLy8gVGhlIGRlY29kZXIgaXMgcmVhZHkgZm9yIGFuZCBlYWdlciB0byByZWNlaXZlIG1vcmUgc2FtcGxlcy4gIE5vdGUgdGhhdAotICAvLyBvbmNlIHRoZSBkZWNvZGVyIG5vdGlmaWVzIHRoZSB1c2VyIHdpdGgga1NiUGxheWVyRGVjb2RlclN0YXRlTmVlZHNEYXRhLAotICAvLyBpdCBjYW5ub3QgZW50ZXIga1NiUGxheWVyRGVjb2RlclN0YXRlQnVmZmVyRnVsbCBiZWZvcmUgU2JQbGF5ZXJXcml0ZVNhbXBsZQotICAvLyBvciBTYlBsYXllcldyaXRlRW5kT2ZTdHJlYW0gaXMgY2FsbGVkLgorICAvLyBUaGUgZGVjb2RlciBpcyBhc2tpbmcgZm9yIG9uZSBtb3JlIHNhbXBsZS4KICAga1NiUGxheWVyRGVjb2RlclN0YXRlTmVlZHNEYXRhLAogCiAgIC8vIFRoZSBkZWNvZGVyIGlzIG5vdCByZWFkeSBmb3IgYW55IG1vcmUgc2FtcGxlcywgc28gZG8gbm90IHNlbmQgdGhlbS4KKyAgLy8gTm90ZSB0aGF0IHRoaXMgZW51bSB2YWx1ZSBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB0aGUgU2JQbGF5ZXIKKyAgLy8gaW1wbGVtZW50YXRpb24gc2hvdWxkIG5vIGxvbmdlciB1c2UgdGhpcyB2YWx1ZS4KICAga1NiUGxheWVyRGVjb2RlclN0YXRlQnVmZmVyRnVsbCwKIAogICAvLyBUaGUgcGxheWVyIGhhcyBiZWVuIGRlc3Ryb3llZCwgYW5kIHdpbGwgc2VuZCBubyBtb3JlIGNhbGxiYWNrcy4KQEAgLTYxLDcgKzYwLDggQEAKICAga1NiUGxheWVyU3RhdGVQcmVyb2xsaW5nLAogCiAgIC8vIFRoZSBwbGF5ZXIgaXMgcHJlc2VudGluZyBtZWRpYSwgYW5kIGl0IGlzIGVpdGhlciBhY3RpdmVseSBwbGF5aW5nIGluCi0gIC8vIHJlYWwtdGltZSwgb3IgaXQgaXMgcGF1c2VkLgorICAvLyByZWFsLXRpbWUsIG9yIGl0IGlzIHBhdXNlZC4gIE5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHVzZSB0aGlzCisgIC8vIHN0YXRlIHRvIHNpZ25hbCB0aGF0IHRoZSBwcmVyb2xsIGhhcyBiZWVuIGZpbmlzaGVkLgogICBrU2JQbGF5ZXJTdGF0ZVByZXNlbnRpbmcsCiAKICAgLy8gVGhlIHBsYXllciBpcyBwcmVzZW50aW5nIG1lZGlhLCBidXQgaXQgaXMgcGF1c2VkIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KQEAgLTEyNCw3ICsxMjQsMTEgQEAKIC8vIHRoaXMgY2FsbGJhY2sgd2FzIGRpc3BhdGNoZWQuIFRoaXMgaXMgdG8gZGlzdGluZ3Vpc2ggc3RhdHVzIGNhbGxiYWNrcyBmb3IKIC8vIGludGVycnVwdGluZyBzZWVrcy4gVGhlc2UgY2FsbGJhY2tzIHdpbGwgaGFwcGVuIG9uIGEgZGlmZmVyZW50IHRocmVhZCB0aGFuCiAvLyB0aGUgY2FsbGluZyB0aHJlYWQsIGFuZCBpdCBpcyBub3QgdmFsaWQgdG8gY2FsbCBTYlBsYXllciBmdW5jdGlvbnMgZnJvbQotLy8gd2l0aGluIHRoaXMgY2FsbGJhY2suCisvLyB3aXRoaW4gdGhpcyBjYWxsYmFjay4gQWZ0ZXIgYW4gdXBkYXRlIHdpdGgga1NiUGxheWVyRGVjb2RlclN0YXRlTmVlZHNEYXRhLAorLy8gdGhlIHVzZXIgb2YgdGhlIHBsYXllciB3aWxsIG1ha2UgYXQgbW9zdCBvbmUgY2FsbCB0byBTYlBsYXllcldyaXRlU2FtcGxlKCkgb3IKKy8vIFNiUGxheWVyV3JpdGVFbmRPZlN0cmVhbSgpLiBUaGUgcGxheWVyIGltcGxlbWVudGF0aW9uIHNob3VsZCB1cGRhdGUgdGhlCisvLyBkZWNvZGVyIHN0YXR1cyBhZ2FpbiBhZnRlciBzdWNoIGNhbGwgdG8gbm90aWZ5IGl0cyB1c2VyIHRvIGNvbnRpbnVlIHdyaXRpbmcKKy8vIG1vcmUgZnJhbWVzLgogdHlwZWRlZiB2b2lkICgqU2JQbGF5ZXJEZWNvZGVyU3RhdHVzRnVuYykoU2JQbGF5ZXIgcGxheWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFUeXBlIHR5cGUsCkBAIC0yMDcsOCArMjExLDggQEAKIC8vIHxjb250ZXh0fCB3aWxsIGJlIHBhc3NlZCBiYWNrIGludG8gYWxsIGNhbGxiYWNrcywgYW5kIGlzIGdlbmVyYWxseSB1c2VkIHRvCiAvLyBwb2ludCBhdCBhIGNsYXNzIG9yIHN0cnVjdCB0aGF0IGNvbnRhaW5zIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGxheWVyLgogLy8KLS8vIFRoZSBhc3NvY2lhdGVkIGRlY29kZXIgb2YgdGhlIHJldHVybmVkIHBsYXllciBzaG91bGQgYmUgYXNzdW1lZCB0byBiZSBpbgotLy8ga1NiUGxheWVyRGVjb2RlclN0YXRlQnVmZmVyRnVsbCB1bnRpbCBTYlBsYXllclNlZWsoKSBoYXMgYmVlbiBjYWxsZWQgb24gaXQuCisvLyBUaGUgYXNzb2NpYXRlZCBkZWNvZGVyIG9mIHRoZSByZXR1cm5lZCBwbGF5ZXIgc2hvdWxkIGJlIGFzc3VtZWQgdG8gYmUgbm90IGluCisvLyBrU2JQbGF5ZXJEZWNvZGVyU3RhdGVOZWVkc0RhdGEgdW50aWwgU2JQbGF5ZXJTZWVrKCkgaGFzIGJlZW4gY2FsbGVkIG9uIGl0LgogLy8KIC8vIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHRocmVhZCB0aGF0IGNhbGxzIFNiUGxheWVyQ3JlYXRlIGlzIHRoZSBzYW1lIHRocmVhZAogLy8gdGhhdCBjYWxscyB0aGUgb3RoZXIgU2JQbGF5ZXIgZnVuY3Rpb25zIGZvciB0aGF0IHBsYXllciwgb3IgdGhhdCB0aGVyZSBpcyBhCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpLzEvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvMS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCmluZGV4IDZkOGMyNTcuLmI4NjZlZTcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvMS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvMS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCkBAIC0yMzYsOSArMjM2LDE0IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9taW1lX3BhcnNlci5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9taW1lX3BhcnNlci5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL25ldy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmgnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19kZWNvZGVyX2ludGVybmFsLmgnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvaW5wdXRfYnVmZmVyX2ludGVybmFsLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9jcmVhdGUuY2MnLApAQCAtMjU0LDExICsyNTksOCBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuaCcsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dyaXRlX2VuZF9vZl9zdHJlYW0uY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93cml0ZV9zYW1wbGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaCcsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZnJhbWVfaW50ZXJuYWwuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2ZyYW1lX2ludGVybmFsLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3F1ZXVlX2FwcGxpY2F0aW9uLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N0cmluZ19jb25jYXQuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3RyaW5nX2NvbmNhdF93aWRlLmNjJywKQEAgLTI4Nyw2ICsyODksNyBAQAogICAgICAgICAnU1RBUkJPQVJEX0lNUExFTUVOVEFUSU9OJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2NvbW1vbi9jb21tb24uZ3lwOmNvbW1vbicsCiAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9kbG1hbGxvYy9kbG1hbGxvYy5neXA6ZGxtYWxsb2MnLAogICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvbGliZXZlbnQvbGliZXZlbnQuZ3lwOmxpYmV2ZW50JywKICAgICAgICAgJ3N0YXJib2FyZF9iYXNlX3N5bWJvbGl6ZScsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCA5NDJmZWVmLi4xNWMxOGNhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTM1Miw4ICszNTIsMTkgQEAKIAogLy8gLS0tIFR1bmVhYmxlIFBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIFNwZWNpZmllcyB0aGUgbmV0d29yayByZWNlaXZlIGJ1ZmZlciBzaXplLgotI2RlZmluZSBTQl9ORVRXT1JLX1JFQ0VJVkVfQlVGRkVSX1NJWkUgKDE2ICogMTAyNCkKKy8vIFNwZWNpZmllcyB0aGUgbmV0d29yayByZWNlaXZlIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBzZXQgdmlhCisvLyBTYlNvY2tldFNldFJlY2VpdmVCdWZmZXJTaXplKCkuCisvLworLy8gU2V0dGluZyB0aGlzIHRvIDAgaW5kaWNhdGVzIHRoYXQgU2JTb2NrZXRTZXRSZWNlaXZlQnVmZmVyU2l6ZSgpIHNob3VsZAorLy8gbm90IGJlIGNhbGxlZC4gVXNlIHRoaXMgZm9yIE9TcyAoc3VjaCBhcyBMaW51eCkgd2hlcmUgcmVjZWl2ZSBidWZmZXIKKy8vIGF1dG8tdHVuaW5nIGlzIGJldHRlci4KKy8vCisvLyBPbiBzb21lIHBsYXRmb3JtcywgdGhpcyBtYXkgYWZmZWN0IG1heCBUQ1Agd2luZG93IHNpemUgd2hpY2ggbWF5CisvLyBkcmFtYXRpY2FsbHkgYWZmZWN0IHRocm91Z2hwdXQgaW4gdGhlIHByZXNlbmNlIG9mIGxhdGVuY3kuCisvLworLy8gSWYgeW91ciBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIGEgZ29vZCBUQ1AgYXV0by10dW5pbmcgbWVjaGFuaXNtLAorLy8gYSBzZXR0aW5nIG9mICgxMjggKiAxMDI0KSBoZXJlIGlzIHJlY29tbWVuZGVkLgorI2RlZmluZSBTQl9ORVRXT1JLX1JFQ0VJVkVfQlVGRkVSX1NJWkUgKDApCiAKIC8vIC0tLSBVc2VyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX2F1ZGlvX2RlY29kZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX2F1ZGlvX2RlY29kZXIuY2MKaW5kZXggMDBlOThlNi4uNjE4YjllMyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ19hdWRpb19kZWNvZGVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfYXVkaW9fZGVjb2Rlci5jYwpAQCAtMTkwLDYgKzE5MCw3IEBACiAKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIHBsYXllciB7CituYW1lc3BhY2UgZmlsdGVyIHsKIAogLy8gc3RhdGljCiBBdWRpb0RlY29kZXIqIEF1ZGlvRGVjb2Rlcjo6Q3JlYXRlKFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLApAQCAtMjAzLDYgKzIwNCw3IEBACiAgIHJldHVybiBOVUxMOwogfQogCit9ICAvLyBuYW1lc3BhY2UgZmlsdGVyCiB9ICAvLyBuYW1lc3BhY2UgcGxheWVyCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfYXVkaW9fZGVjb2Rlci5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ19hdWRpb19kZWNvZGVyLmgKaW5kZXggZWFjNjVhMi4uM2VkYTQ0NyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ19hdWRpb19kZWNvZGVyLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ19hdWRpb19kZWNvZGVyLmgKQEAgLTIwLDEzICsyMCwxMyBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ19jb21tb24uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBzaGFyZWQgewogbmFtZXNwYWNlIGZmbXBlZyB7CiAKLWNsYXNzIEF1ZGlvRGVjb2RlciA6IHB1YmxpYyBzdGFyYm9hcmQ6OnBsYXllcjo6QXVkaW9EZWNvZGVyIHsKK2NsYXNzIEF1ZGlvRGVjb2RlciA6IHB1YmxpYyBzdGFyYm9hcmQ6OnBsYXllcjo6ZmlsdGVyOjpBdWRpb0RlY29kZXIgewogIHB1YmxpYzoKICAgdHlwZWRlZiBzdGFyYm9hcmQ6OnBsYXllcjo6SW5wdXRCdWZmZXIgSW5wdXRCdWZmZXI7CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5jYwppbmRleCBlYWZmZjRjLi5kNjBmNDgwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX3ZpZGVvX2RlY29kZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ192aWRlb19kZWNvZGVyLmNjCkBAIC0yOTIsNiArMjkyLDcgQEAKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2UgcGxheWVyIHsKK25hbWVzcGFjZSBmaWx0ZXIgewogCiAvLyBzdGF0aWMKIFZpZGVvRGVjb2RlciogVmlkZW9EZWNvZGVyOjpDcmVhdGUoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMpIHsKQEAgLTMwMyw2ICszMDQsNyBAQAogICByZXR1cm4gTlVMTDsKIH0KIAorfSAgLy8gbmFtZXNwYWNlIGZpbHRlcgogfSAgLy8gbmFtZXNwYWNlIHBsYXllcgogfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX3ZpZGVvX2RlY29kZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5oCmluZGV4IDZiY2Q2ZDMuLjhjNWU5OWEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5oCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL3F1ZXVlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX2NvbW1vbi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvaW50ZXJuYWxfb25seS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9pbnB1dF9idWZmZXJfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19mcmFtZV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKIApAQCAtMjksNyArMjksNyBAQAogbmFtZXNwYWNlIHNoYXJlZCB7CiBuYW1lc3BhY2UgZmZtcGVnIHsKIAotY2xhc3MgVmlkZW9EZWNvZGVyIDogcHVibGljIHN0YXJib2FyZDo6cGxheWVyOjpWaWRlb0RlY29kZXIgeworY2xhc3MgVmlkZW9EZWNvZGVyIDogcHVibGljIHN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OlZpZGVvRGVjb2RlciB7CiAgcHVibGljOgogICB0eXBlZGVmIHN0YXJib2FyZDo6cGxheWVyOjpJbnB1dEJ1ZmZlciBJbnB1dEJ1ZmZlcjsKICAgdHlwZWRlZiBzdGFyYm9hcmQ6OnBsYXllcjo6VmlkZW9GcmFtZSBWaWRlb0ZyYW1lOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc2lnbmFsL2NyYXNoX3NpZ25hbHMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zaWduYWwvY3Jhc2hfc2lnbmFscy5jYwppbmRleCBhM2U5YjJlLi4wZDc0MDExIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zaWduYWwvY3Jhc2hfc2lnbmFscy5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zaWduYWwvY3Jhc2hfc2lnbmFscy5jYwpAQCAtMjgsMjEgKzI4LDI1IEBACiBuYW1lc3BhY2UgewogCiBjb25zdCBpbnQga0NyYXNoU2lnbmFsc1RvVHJhcFtdID0gewotICAgIFNJR0FCUlQsIFNJR0ZQRSwgU0lHSUxMLCBTSUdTRUdWLAorICAgIFNJR0FCUlQsIFNJR0JVUywgU0lHRlBFLCBTSUdJTEwsIFNJR1NFR1YsIFNJR1NZUywKIH07CiAKIGNvbnN0IGludCBrU3RvcFNpZ25hbHNUb1RyYXBbXSA9IHsKLSAgICBTSUdURVJNLCBTSUdJTlQsCisgICAgU0lHVEVSTSwgU0lHSU5ULCBTSUdIVVAsCiB9OwogCi12b2lkIER1bXBTdGFja1NpZ25hbFNhZmUoaW50IHNpZ25hbF9pZCkgewotICBMb2dTaWduYWxDYXVnaHQoc2lnbmFsX2lkKTsKLSAgU2JMb2dSYXdEdW1wU3RhY2soMSk7Ci0KK3ZvaWQgQ3Jhc2goaW50IHNpZ25hbF9pZCkgeworICBEdW1wU3RhY2tTaWduYWxTYWZlKHNpZ25hbF9pZCk7CiAgIFVuaW5zdGFsbENyYXNoU2lnbmFsSGFuZGxlcnMoKTsKICAgU2JTeXN0ZW1CcmVha0ludG9EZWJ1Z2dlcigpOwogfQogCit2b2lkIFF1aXQoaW50IHNpZ25hbF9pZCkgeworICBEdW1wU3RhY2tTaWduYWxTYWZlKHNpZ25hbF9pZCk7CisgIDo6c2lnbmFsKFNJR1FVSVQsIFNJR19ERkwpOworICA6OnJhaXNlKFNJR1FVSVQpOworfQorCiB2b2lkIFN0b3AoaW50IHNpZ25hbF9pZCkgewogICBMb2dTaWduYWxDYXVnaHQoc2lnbmFsX2lkKTsKICAgU2JTeXN0ZW1SZXF1ZXN0U3RvcCgwKTsKQEAgLTUyLDExICs1NiwxMiBAQAogCiB2b2lkIEluc3RhbGxDcmFzaFNpZ25hbEhhbmRsZXJzKCkgewogICBmb3IgKGludCBpID0gMDsgaSA8IFNCX0FSUkFZX1NJWkVfSU5UKGtDcmFzaFNpZ25hbHNUb1RyYXApOyArK2kpIHsKLSAgICA6OnNpZ25hbChrQ3Jhc2hTaWduYWxzVG9UcmFwW2ldLCAmRHVtcFN0YWNrU2lnbmFsU2FmZSk7CisgICAgOjpzaWduYWwoa0NyYXNoU2lnbmFsc1RvVHJhcFtpXSwgJkNyYXNoKTsKICAgfQogICBmb3IgKGludCBpID0gMDsgaSA8IFNCX0FSUkFZX1NJWkVfSU5UKGtTdG9wU2lnbmFsc1RvVHJhcCk7ICsraSkgewogICAgIDo6c2lnbmFsKGtTdG9wU2lnbmFsc1RvVHJhcFtpXSwgJlN0b3ApOwogICB9CisgIDo6c2lnbmFsKFNJR1FVSVQsICZRdWl0KTsKIH0KIAogdm9pZCBVbmluc3RhbGxDcmFzaFNpZ25hbEhhbmRsZXJzKCkgewpAQCAtNjYsNiArNzEsNyBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IFNCX0FSUkFZX1NJWkVfSU5UKGtTdG9wU2lnbmFsc1RvVHJhcCk7ICsraSkgewogICAgIDo6c2lnbmFsKGtTdG9wU2lnbmFsc1RvVHJhcFtpXSwgU0lHX0RGTCk7CiAgIH0KKyAgOjpzaWduYWwoU0lHUVVJVCwgU0lHX0RGTCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBzaWduYWwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3NpZ25hbC9jcmFzaF9zaWduYWxzX3NpZ2FjdGlvbi5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3NpZ25hbC9jcmFzaF9zaWduYWxzX3NpZ2FjdGlvbi5jYwppbmRleCA0YmY1YjU5Li41MjczYWIxIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zaWduYWwvY3Jhc2hfc2lnbmFsc19zaWdhY3Rpb24uY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc2lnbmFsL2NyYXNoX3NpZ25hbHNfc2lnYWN0aW9uLmNjCkBAIC0yOCwxMSArMjgsMTEgQEAKIG5hbWVzcGFjZSB7CiAKIGNvbnN0IGludCBrQ3Jhc2hTaWduYWxzVG9UcmFwW10gPSB7Ci0gICAgU0lHQUJSVCwgU0lHRlBFLCBTSUdJTEwsIFNJR1NFR1YsCisgICAgU0lHQUJSVCwgU0lHQlVTLCBTSUdGUEUsIFNJR0lMTCwgU0lHU0VHViwgU0lHU1lTLAogfTsKIAogY29uc3QgaW50IGtTdG9wU2lnbmFsc1RvVHJhcFtdID0gewotICAgIFNJR1RFUk0sIFNJR0lOVCwKKyAgICBTSUdURVJNLCBTSUdJTlQsIFNJR0hVUCwKIH07CiAKIHZvaWQgU2V0U2lnbmFsSGFuZGxlcihpbnQgc2lnbmFsX2lkLCBTaWduYWxIYW5kbGVyRnVuY3Rpb24gaGFuZGxlcikgewpAQCAtNDUsMTUgKzQ1LDE4IEBACiAgIDo6c2lnYWN0aW9uKHNpZ25hbF9pZCwgJmFjdGlvbiwgTlVMTCk7CiB9CiAKLXZvaWQgRHVtcFN0YWNrU2lnbmFsU2FmZShpbnQgc2lnbmFsX2lkKSB7Ci0gIExvZ1NpZ25hbENhdWdodChzaWduYWxfaWQpOwotICBTYkxvZ0ZsdXNoKCk7Ci0gIFNiTG9nUmF3RHVtcFN0YWNrKDEpOwotCit2b2lkIENyYXNoKGludCBzaWduYWxfaWQpIHsKKyAgRHVtcFN0YWNrU2lnbmFsU2FmZShzaWduYWxfaWQpOwogICBVbmluc3RhbGxDcmFzaFNpZ25hbEhhbmRsZXJzKCk7CiAgIFNiU3lzdGVtQnJlYWtJbnRvRGVidWdnZXIoKTsKIH0KIAordm9pZCBRdWl0KGludCBzaWduYWxfaWQpIHsKKyAgRHVtcFN0YWNrU2lnbmFsU2FmZShzaWduYWxfaWQpOworICBTZXRTaWduYWxIYW5kbGVyKFNJR1FVSVQsIFNJR19ERkwpOworICA6OnJhaXNlKFNJR1FVSVQpOworfQorCiB2b2lkIFN0b3AoaW50IHNpZ25hbF9pZCkgewogICBMb2dTaWduYWxDYXVnaHQoc2lnbmFsX2lkKTsKICAgU2JTeXN0ZW1SZXF1ZXN0U3RvcCgwKTsKQEAgLTYzLDExICs2NiwxMiBAQAogCiB2b2lkIEluc3RhbGxDcmFzaFNpZ25hbEhhbmRsZXJzKCkgewogICBmb3IgKGludCBpID0gMDsgaSA8IFNCX0FSUkFZX1NJWkVfSU5UKGtDcmFzaFNpZ25hbHNUb1RyYXApOyArK2kpIHsKLSAgICBTZXRTaWduYWxIYW5kbGVyKGtDcmFzaFNpZ25hbHNUb1RyYXBbaV0sICZEdW1wU3RhY2tTaWduYWxTYWZlKTsKKyAgICBTZXRTaWduYWxIYW5kbGVyKGtDcmFzaFNpZ25hbHNUb1RyYXBbaV0sICZDcmFzaCk7CiAgIH0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTQl9BUlJBWV9TSVpFX0lOVChrU3RvcFNpZ25hbHNUb1RyYXApOyArK2kpIHsKICAgICBTZXRTaWduYWxIYW5kbGVyKGtTdG9wU2lnbmFsc1RvVHJhcFtpXSwgJlN0b3ApOwogICB9CisgIFNldFNpZ25hbEhhbmRsZXIoU0lHUVVJVCwgJlF1aXQpOwogfQogCiB2b2lkIFVuaW5zdGFsbENyYXNoU2lnbmFsSGFuZGxlcnMoKSB7CkBAIC03Nyw2ICs4MSw3IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0JfQVJSQVlfU0laRV9JTlQoa1N0b3BTaWduYWxzVG9UcmFwKTsgKytpKSB7CiAgICAgU2V0U2lnbmFsSGFuZGxlcihrU3RvcFNpZ25hbHNUb1RyYXBbaV0sIFNJR19ERkwpOwogICB9CisgIFNldFNpZ25hbEhhbmRsZXIoU0lHUVVJVCwgU0lHX0RGTCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBzaWduYWwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3NpZ25hbC9zaWduYWxfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3NpZ25hbC9zaWduYWxfaW50ZXJuYWwuaAppbmRleCBmNTExYWIwLi4wZDJlYzU0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zaWduYWwvc2lnbmFsX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc2lnbmFsL3NpZ25hbF9pbnRlcm5hbC5oCkBAIC0yOCwyMiArMjgsMzIgQEAKICAgc3dpdGNoIChzaWduYWxfaWQpIHsKICAgICBjYXNlIFNJR0FCUlQ6CiAgICAgICByZXR1cm4gIlNJR0FCUlQiOworICAgIGNhc2UgU0lHQlVTOgorICAgICAgcmV0dXJuICJTSUdCVVMiOwogICAgIGNhc2UgU0lHQ09OVDoKICAgICAgIHJldHVybiAiU0lHQ09OVCI7CiAgICAgY2FzZSBTSUdGUEU6CiAgICAgICByZXR1cm4gIlNJR0ZQRSI7CisgICAgY2FzZSBTSUdIVVA6CisgICAgICByZXR1cm4gIlNJR0hVUCI7CiAgICAgY2FzZSBTSUdJTEw6CiAgICAgICByZXR1cm4gIlNJR0lMTCI7CiAgICAgY2FzZSBTSUdJTlQ6CiAgICAgICByZXR1cm4gIlNJR0lOVCI7CisgICAgY2FzZSBTSUdQSVBFOgorICAgICAgcmV0dXJuICJTSUdQSVBFIjsKKyAgICBjYXNlIFNJR1FVSVQ6CisgICAgICByZXR1cm4gIlNJR1FVSVQiOwogICAgIGNhc2UgU0lHU0VHVjoKICAgICAgIHJldHVybiAiU0lHU0VHViI7CisgICAgY2FzZSBTSUdTWVM6CisgICAgICByZXR1cm4gIlNJR1NZUyI7CiAgICAgY2FzZSBTSUdUU1RQOgogICAgICAgcmV0dXJuICJTSUdUU1RQIjsKICAgICBjYXNlIFNJR1RFUk06CiAgICAgICByZXR1cm4gIlNJR1RFUk0iOwogICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIlVOS05PV04gU0lHTkFMIjsKKyAgICAgIHJldHVybiAiVU5LTk9XTiI7CiAgIH0KIH0KIApAQCAtNTMsNiArNjMsMTIgQEAKICAgU2JMb2dGbHVzaCgpOwogfQogCitpbmxpbmUgdm9pZCBEdW1wU3RhY2tTaWduYWxTYWZlKGludCBzaWduYWxfaWQpIHsKKyAgTG9nU2lnbmFsQ2F1Z2h0KHNpZ25hbF9pZCk7CisgIFNiTG9nUmF3RHVtcFN0YWNrKDIpOworICBTYkxvZ0ZsdXNoKCk7Cit9CisKIHR5cGVkZWYgdm9pZCAoKlNpZ25hbEhhbmRsZXJGdW5jdGlvbikoaW50KTsKIAogfSAgLy8gbmFtZXNwYWNlIHNpZ25hbApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc2lnbmFsL3N1c3BlbmRfc2lnbmFscy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3NpZ25hbC9zdXNwZW5kX3NpZ25hbHMuY2MKaW5kZXggYTNjYmVlYS4uNmJiNDJkOCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc2lnbmFsL3N1c3BlbmRfc2lnbmFscy5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zaWduYWwvc3VzcGVuZF9zaWduYWxzLmNjCkBAIC02MywxNyArNjMsMjcgQEAKICAgc3RhcmJvYXJkOjpBcHBsaWNhdGlvbjo6R2V0KCktPlVucGF1c2UoTlVMTCwgTlVMTCk7CiB9CiAKK3ZvaWQgSWdub3JlKGludCBzaWduYWxfaWQpIHsKKyAgTG9nU2lnbmFsQ2F1Z2h0KHNpZ25hbF9pZCk7CisgIFNiTG9nUmF3RHVtcFN0YWNrKDEpOworICBTYkxvZ0ZsdXNoKCk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiB2b2lkIEluc3RhbGxTdXNwZW5kU2lnbmFsSGFuZGxlcnMoKSB7CiAgIFNldFNpZ25hbEhhbmRsZXIoU0lHVFNUUCwgJlN1c3BlbmQpOwogICBVbmJsb2NrU2lnbmFsKFNJR1RTVFApOwogICBTZXRTaWduYWxIYW5kbGVyKFNJR0NPTlQsICZSZXN1bWUpOworCisgIC8vIFdlIG1pZ2h0IHJlY2VpdmUgU0lHUElQRSBhZnRlciByZXN1bWluZy4gV2Ugc2hvdWxkIG5vdCB0ZXJtaW5hdGUuCisgIFNldFNpZ25hbEhhbmRsZXIoU0lHUElQRSwgJklnbm9yZSk7CiB9CiAKIHZvaWQgVW5pbnN0YWxsU3VzcGVuZFNpZ25hbEhhbmRsZXJzKCkgewogICBTZXRTaWduYWxIYW5kbGVyKFNJR0NPTlQsIFNJR19ERkwpOwogICBTZXRTaWduYWxIYW5kbGVyKFNJR1RTVFAsIFNJR19ERkwpOworICBTZXRTaWduYWxIYW5kbGVyKFNJR1BJUEUsIFNJR19ERkwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2Ugc2lnbmFsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaApzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBzcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaApyZW5hbWUgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oCmluZGV4IDAwMGEyMmMuLmI4YmRhZmUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaApAQCAtMTIsOCArMTIsOCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0FVRElPX0RFQ09ERVJfSU5URVJOQUxfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0FVRElPX0RFQ09ERVJfSU5URVJOQUxfSF8KKyNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0ZJTFRFUl9BVURJT19ERUNPREVSX0lOVEVSTkFMX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9GSUxURVJfQVVESU9fREVDT0RFUl9JTlRFUk5BTF9IXwogCiAjaW5jbHVkZSA8dmVjdG9yPgogCkBAIC0yNSw2ICsyNSw3IEBACiBuYW1lc3BhY2Ugc2hhcmVkIHsKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIHBsYXllciB7CituYW1lc3BhY2UgZmlsdGVyIHsKIAogLy8gVGhpcyBjbGFzcyBkZWNvZGVzIGVuY29kZWQgYXVkaW8gc3RyZWFtIGludG8gcGxheWFibGUgYXVkaW8gZGF0YS4KIGNsYXNzIEF1ZGlvRGVjb2RlciB7CkBAIC01Myw5ICs1NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIpOwogfTsKIAorfSAgLy8gbmFtZXNwYWNlIGZpbHRlcgogfSAgLy8gbmFtZXNwYWNlIHBsYXllcgogfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAogfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAogfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAogCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9BVURJT19ERUNPREVSX0lOVEVSTkFMX0hfCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9GSUxURVJfQVVESU9fREVDT0RFUl9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmNjCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKcmVuYW1lIHRvIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmNjCmluZGV4IGM3NjFjMDkuLjNhNTM1MzMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKQEAgLTEyLDcgKzEyLDcgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCkBAIC0yMiw2ICsyMiw3IEBACiBuYW1lc3BhY2Ugc2hhcmVkIHsKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIHBsYXllciB7CituYW1lc3BhY2UgZmlsdGVyIHsKIAogbmFtZXNwYWNlIHsKIC8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBkZWNvZGVyLgpAQCAtMjksNyArMzAsNyBAQAogY29uc3QgaW50IGtNYXhGcmFtZXNQZXJBY2Nlc3NVbml0ID0gMTAyNCAqIDI7CiB9ICAvLyBuYW1lc3BhY2UKIAotQXVkaW9SZW5kZXJlcjo6QXVkaW9SZW5kZXJlcihBdWRpb0RlY29kZXIqIGRlY29kZXIsCitBdWRpb1JlbmRlcmVyOjpBdWRpb1JlbmRlcmVyKHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyPiBkZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXImIGF1ZGlvX2hlYWRlcikKICAgICA6IGNoYW5uZWxzXyhhdWRpb19oZWFkZXIubnVtYmVyX29mX2NoYW5uZWxzKSwKICAgICAgIHBhdXNlZF8odHJ1ZSksCkBAIC00MCw3ICs0MSw3IEBACiAgICAgICBvZmZzZXRfaW5fZnJhbWVzXygwKSwKICAgICAgIGZyYW1lc19jb25zdW1lZF8oMCksCiAgICAgICBlbmRfb2Zfc3RyZWFtX3JlYWNoZWRfKGZhbHNlKSwKLSAgICAgIGRlY29kZXJfKGRlY29kZXIpLAorICAgICAgZGVjb2Rlcl8oZGVjb2Rlci5QYXNzKCkpLAogICAgICAgYXVkaW9fc2lua18oa1NiQXVkaW9TaW5rSW52YWxpZCkgewogICBTQl9EQ0hFQ0soZGVjb2Rlcl8gIT0gTlVMTCk7CiAgIGZyYW1lX2J1ZmZlcnNfWzBdID0gJmZyYW1lX2J1ZmZlcl9bMF07CkBAIC01MCw3ICs1MSw2IEBACiAgIGlmIChhdWRpb19zaW5rXyAhPSBrU2JBdWRpb1NpbmtJbnZhbGlkKSB7CiAgICAgU2JBdWRpb1NpbmtEZXN0cm95KGF1ZGlvX3NpbmtfKTsKICAgfQotICBkZWxldGUgZGVjb2Rlcl87CiB9CiAKIHZvaWQgQXVkaW9SZW5kZXJlcjo6V3JpdGVTYW1wbGUoY29uc3QgSW5wdXRCdWZmZXImIGlucHV0X2J1ZmZlcikgewpAQCAtMjQwLDYgKzI0MCw3IEBACiAgIGZyYW1lc19pbl9idWZmZXJfICs9IGZyYW1lc190b19hcHBlbmQ7CiB9CiAKK30gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKIH0gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIH0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmgKc2ltaWxhcml0eSBpbmRleCA4NCUKcmVuYW1lIGZyb20gc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oCnJlbmFtZSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oCmluZGV4IGNiYzY4YzguLmM4NWYxZmUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oCkBAIC0xMiwyNyArMTIsMzAgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9BVURJT19SRU5ERVJFUl9JTlRFUk5BTF9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfQVVESU9fUkVOREVSRVJfSU5URVJOQUxfSF8KKyNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0ZJTFRFUl9BVURJT19SRU5ERVJFUl9JTlRFUk5BTF9IXworI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfRklMVEVSX0FVRElPX1JFTkRFUkVSX0lOVEVSTkFMX0hfCiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJzdGFyYm9hcmQvYXVkaW9fc2luay5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbWVkaWEuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9pbnB1dF9idWZmZXJfaW50ZXJuYWwuaCIKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2Ugc2hhcmVkIHsKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIHBsYXllciB7CituYW1lc3BhY2UgZmlsdGVyIHsKIAogY2xhc3MgQXVkaW9SZW5kZXJlciB7CiAgcHVibGljOgotICBBdWRpb1JlbmRlcmVyKEF1ZGlvRGVjb2RlciogZGVjb2RlciwgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIpOworICBBdWRpb1JlbmRlcmVyKHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyPiBkZWNvZGVyLAorICAgICAgICAgICAgICAgIGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW9faGVhZGVyKTsKICAgfkF1ZGlvUmVuZGVyZXIoKTsKIAogICBib29sIGlzX3ZhbGlkKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQpAQCAtOTAsMTMgKzkzLDE0IEBACiAgIGludCBmcmFtZXNfY29uc3VtZWRfOwogICBib29sIGVuZF9vZl9zdHJlYW1fcmVhY2hlZF87CiAKLSAgQXVkaW9EZWNvZGVyKiBkZWNvZGVyXzsKKyAgc2NvcGVkX3B0cjxBdWRpb0RlY29kZXI+IGRlY29kZXJfOwogICBTYkF1ZGlvU2luayBhdWRpb19zaW5rXzsKIH07CiAKK30gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKIH0gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIH0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIAotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfQVVESU9fUkVOREVSRVJfSU5URVJOQUxfSF8KKyNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0ZJTFRFUl9BVURJT19SRU5ERVJFUl9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0NzdjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuY2MKQEAgLTAsMCArMSwyNDIgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaCIKKworI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2RybS9kcm1fc3lzdGVtX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19kZWNvZGVyX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19kZWNvZGVyX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19mcmFtZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIHNoYXJlZCB7CituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBwbGF5ZXIgeworbmFtZXNwYWNlIGZpbHRlciB7CisKK0ZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6RmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyKAorICAgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjLAorICAgIFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLAorICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCisgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIpCisgICAgOiBwbGF5ZXJfd29ya2VyXyhOVUxMKSwKKyAgICAgIHBsYXllcl8oa1NiUGxheWVySW52YWxpZCksCisgICAgICB1cGRhdGVfbWVkaWFfdGltZV9jYl8oTlVMTCksCisgICAgICBnZXRfcGxheWVyX3N0YXRlX2NiXyhOVUxMKSwKKyAgICAgIHVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2JfKE5VTEwpLAorICAgICAgdmlkZW9fY29kZWNfKHZpZGVvX2NvZGVjKSwKKyAgICAgIGF1ZGlvX2NvZGVjXyhhdWRpb19jb2RlYyksCisgICAgICBkcm1fc3lzdGVtXyhkcm1fc3lzdGVtKSwKKyAgICAgIGF1ZGlvX2hlYWRlcl8oYXVkaW9faGVhZGVyKSwKKyAgICAgIHBhdXNlZF8oZmFsc2UpIHt9CisKK3ZvaWQgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpTZXR1cCgKKyAgICBQbGF5ZXJXb3JrZXIqIHBsYXllcl93b3JrZXIsCisgICAgU2JQbGF5ZXIgcGxheWVyLAorICAgIFVwZGF0ZU1lZGlhVGltZUNCIHVwZGF0ZV9tZWRpYV90aW1lX2NiLAorICAgIEdldFBsYXllclN0YXRlQ0IgZ2V0X3BsYXllcl9zdGF0ZV9jYiwKKyAgICBVcGRhdGVQbGF5ZXJTdGF0ZUNCIHVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2IpIHsKKyAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZS4KKyAgU0JfRENIRUNLKHBsYXllcl93b3JrZXJfID09IE5VTEwpOworCisgIC8vIEFsbCBwYXJhbWV0ZXJzIGhhcyB0byBiZSB2YWxpZC4KKyAgU0JfRENIRUNLKHBsYXllcl93b3JrZXIpOworICBTQl9EQ0hFQ0soU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpOworICBTQl9EQ0hFQ0sodXBkYXRlX21lZGlhX3RpbWVfY2IpOworICBTQl9EQ0hFQ0soZ2V0X3BsYXllcl9zdGF0ZV9jYik7CisgIFNCX0RDSEVDSyh1cGRhdGVfcGxheWVyX3N0YXRlX2NiKTsKKworICBwbGF5ZXJfd29ya2VyXyA9IHBsYXllcl93b3JrZXI7CisgIHBsYXllcl8gPSBwbGF5ZXI7CisgIHVwZGF0ZV9tZWRpYV90aW1lX2NiXyA9IHVwZGF0ZV9tZWRpYV90aW1lX2NiOworICBnZXRfcGxheWVyX3N0YXRlX2NiXyA9IGdldF9wbGF5ZXJfc3RhdGVfY2I7CisgIHVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2JfID0gdXBkYXRlX3BsYXllcl9zdGF0ZV9jYjsKK30KKworYm9vbCBGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6OlByb2Nlc3NJbml0RXZlbnQoKSB7CisgIHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyPiBhdWRpb19kZWNvZGVyKAorICAgICAgQXVkaW9EZWNvZGVyOjpDcmVhdGUoYXVkaW9fY29kZWNfLCBhdWRpb19oZWFkZXJfKSk7CisgIHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyPiB2aWRlb19kZWNvZGVyKFZpZGVvRGVjb2Rlcjo6Q3JlYXRlKHZpZGVvX2NvZGVjXykpOworCisgIGlmICghYXVkaW9fZGVjb2RlciB8fCAhdmlkZW9fZGVjb2RlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGF1ZGlvX3JlbmRlcmVyXy5yZXNldChuZXcgQXVkaW9SZW5kZXJlcihhdWRpb19kZWNvZGVyLlBhc3MoKSwgYXVkaW9faGVhZGVyXykpOworICB2aWRlb19yZW5kZXJlcl8ucmVzZXQobmV3IFZpZGVvUmVuZGVyZXIodmlkZW9fZGVjb2Rlci5QYXNzKCkpKTsKKyAgaWYgKGF1ZGlvX3JlbmRlcmVyXy0+aXNfdmFsaWQoKSAmJiB2aWRlb19yZW5kZXJlcl8tPmlzX3ZhbGlkKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGF1ZGlvX3JlbmRlcmVyXy5yZXNldChOVUxMKTsKKyAgdmlkZW9fcmVuZGVyZXJfLnJlc2V0KE5VTEwpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpQcm9jZXNzU2Vla0V2ZW50KAorICAgIGNvbnN0IFNlZWtFdmVudERhdGEmIGRhdGEpIHsKKyAgU2JNZWRpYVRpbWUgc2Vla190b19wdHMgPSBkYXRhLnNlZWtfdG9fcHRzOworICBpZiAoc2Vla190b19wdHMgPCAwKSB7CisgICAgU0JfRExPRyhFUlJPUikgPDwgIlRyeSB0byBzZWVrIHRvIG5lZ2F0aXZlIHRpbWVzdGFtcCAiIDw8IHNlZWtfdG9fcHRzOworICAgIHNlZWtfdG9fcHRzID0gMDsKKyAgfQorCisgIGF1ZGlvX3JlbmRlcmVyXy0+UGF1c2UoKTsKKyAgYXVkaW9fcmVuZGVyZXJfLT5TZWVrKHNlZWtfdG9fcHRzKTsKKyAgdmlkZW9fcmVuZGVyZXJfLT5TZWVrKHNlZWtfdG9fcHRzKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpQcm9jZXNzV3JpdGVTYW1wbGVFdmVudCgKKyAgICBjb25zdCBXcml0ZVNhbXBsZUV2ZW50RGF0YSYgZGF0YSwKKyAgICBib29sKiB3cml0dGVuKSB7CisgIFNCX0RDSEVDSyh3cml0dGVuICE9IE5VTEwpOworCisgICp3cml0dGVuID0gdHJ1ZTsKKworICBpZiAoZGF0YS5zYW1wbGVfdHlwZSA9PSBrU2JNZWRpYVR5cGVBdWRpbykgeworICAgIGlmIChhdWRpb19yZW5kZXJlcl8tPklzRW5kT2ZTdHJlYW1Xcml0dGVuKCkpIHsKKyAgICAgIFNCX0xPRyhXQVJOSU5HKSA8PCAiVHJ5IHRvIHdyaXRlIGF1ZGlvIHNhbXBsZSBhZnRlciBFT1MgaXMgcmVhY2hlZCI7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghYXVkaW9fcmVuZGVyZXJfLT5DYW5BY2NlcHRNb3JlRGF0YSgpKSB7CisgICAgICAgICp3cml0dGVuID0gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBpZiAoZGF0YS5pbnB1dF9idWZmZXItPmRybV9pbmZvKCkpIHsKKyAgICAgICAgaWYgKCFTYkRybVN5c3RlbUlzVmFsaWQoZHJtX3N5c3RlbV8pKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChkcm1fc3lzdGVtXy0+RGVjcnlwdChkYXRhLmlucHV0X2J1ZmZlcikgPT0KKyAgICAgICAgICAgIFNiRHJtU3lzdGVtUHJpdmF0ZTo6a1JldHJ5KSB7CisgICAgICAgICAgKndyaXR0ZW4gPSBmYWxzZTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYXVkaW9fcmVuZGVyZXJfLT5Xcml0ZVNhbXBsZSgqZGF0YS5pbnB1dF9idWZmZXIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBTQl9EQ0hFQ0soZGF0YS5zYW1wbGVfdHlwZSA9PSBrU2JNZWRpYVR5cGVWaWRlbyk7CisgICAgaWYgKHZpZGVvX3JlbmRlcmVyXy0+SXNFbmRPZlN0cmVhbVdyaXR0ZW4oKSkgeworICAgICAgU0JfTE9HKFdBUk5JTkcpIDw8ICJUcnkgdG8gd3JpdGUgdmlkZW8gc2FtcGxlIGFmdGVyIEVPUyBpcyByZWFjaGVkIjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCF2aWRlb19yZW5kZXJlcl8tPkNhbkFjY2VwdE1vcmVEYXRhKCkpIHsKKyAgICAgICAgKndyaXR0ZW4gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpZiAoZGF0YS5pbnB1dF9idWZmZXItPmRybV9pbmZvKCkpIHsKKyAgICAgICAgaWYgKCFTYkRybVN5c3RlbUlzVmFsaWQoZHJtX3N5c3RlbV8pKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChkcm1fc3lzdGVtXy0+RGVjcnlwdChkYXRhLmlucHV0X2J1ZmZlcikgPT0KKyAgICAgICAgICAgIFNiRHJtU3lzdGVtUHJpdmF0ZTo6a1JldHJ5KSB7CisgICAgICAgICAgKndyaXR0ZW4gPSBmYWxzZTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdmlkZW9fcmVuZGVyZXJfLT5Xcml0ZVNhbXBsZSgqZGF0YS5pbnB1dF9idWZmZXIpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6UHJvY2Vzc1dyaXRlRW5kT2ZTdHJlYW1FdmVudCgKKyAgICBjb25zdCBXcml0ZUVuZE9mU3RyZWFtRXZlbnREYXRhJiBkYXRhKSB7CisgIGlmIChkYXRhLnN0cmVhbV90eXBlID09IGtTYk1lZGlhVHlwZUF1ZGlvKSB7CisgICAgaWYgKGF1ZGlvX3JlbmRlcmVyXy0+SXNFbmRPZlN0cmVhbVdyaXR0ZW4oKSkgeworICAgICAgU0JfTE9HKFdBUk5JTkcpIDw8ICJUcnkgdG8gd3JpdGUgYXVkaW8gRU9TIGFmdGVyIEVPUyBpcyBlbnF1ZXVlZCI7CisgICAgfSBlbHNlIHsKKyAgICAgIFNCX0xPRyhJTkZPKSA8PCAiQXVkaW8gRU9TIGVucXVldWVkIjsKKyAgICAgIGF1ZGlvX3JlbmRlcmVyXy0+V3JpdGVFbmRPZlN0cmVhbSgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAodmlkZW9fcmVuZGVyZXJfLT5Jc0VuZE9mU3RyZWFtV3JpdHRlbigpKSB7CisgICAgICBTQl9MT0coV0FSTklORykgPDwgIlRyeSB0byB3cml0ZSB2aWRlbyBFT1MgYWZ0ZXIgRU9TIGlzIGVucXVldWVkIjsKKyAgICB9IGVsc2UgeworICAgICAgU0JfTE9HKElORk8pIDw8ICJWaWRlbyBFT1MgZW5xdWV1ZWQiOworICAgICAgdmlkZW9fcmVuZGVyZXJfLT5Xcml0ZUVuZE9mU3RyZWFtKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpQcm9jZXNzU2V0UGF1c2VFdmVudCgKKyAgICBjb25zdCBTZXRQYXVzZUV2ZW50RGF0YSYgZGF0YSkgeworICBwYXVzZWRfID0gZGF0YS5wYXVzZTsKKworICBpZiAoZGF0YS5wYXVzZSkgeworICAgIGF1ZGlvX3JlbmRlcmVyXy0+UGF1c2UoKTsKKyAgICBTQl9ETE9HKElORk8pIDw8ICJQbGF5YmFjayBwYXVzZWQuIjsKKyAgfSBlbHNlIHsKKyAgICBhdWRpb19yZW5kZXJlcl8tPlBsYXkoKTsKKyAgICBTQl9ETE9HKElORk8pIDw8ICJQbGF5YmFjayBzdGFydGVkLiI7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6OlByb2Nlc3NVcGRhdGVFdmVudCgKKyAgICBjb25zdCBTZXRCb3VuZHNFdmVudERhdGEmIGRhdGEpIHsKKyAgaWYgKCgqcGxheWVyX3dvcmtlcl8uKmdldF9wbGF5ZXJfc3RhdGVfY2JfKSgpID09IGtTYlBsYXllclN0YXRlUHJlcm9sbGluZykgeworICAgIGlmICghYXVkaW9fcmVuZGVyZXJfLT5Jc1NlZWtpbmdJblByb2dyZXNzKCkgJiYKKyAgICAgICAgIXZpZGVvX3JlbmRlcmVyXy0+SXNTZWVraW5nSW5Qcm9ncmVzcygpKSB7CisgICAgICAoKnBsYXllcl93b3JrZXJfLip1cGRhdGVfcGxheWVyX3N0YXRlX2NiXykoa1NiUGxheWVyU3RhdGVQcmVzZW50aW5nKTsKKyAgICAgIGlmICghcGF1c2VkXykgeworICAgICAgICBhdWRpb19yZW5kZXJlcl8tPlBsYXkoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoKCpwbGF5ZXJfd29ya2VyXy4qZ2V0X3BsYXllcl9zdGF0ZV9jYl8pKCkgPT0ga1NiUGxheWVyU3RhdGVQcmVzZW50aW5nKSB7CisgICAgaWYgKGF1ZGlvX3JlbmRlcmVyXy0+SXNFbmRPZlN0cmVhbVBsYXllZCgpICYmCisgICAgICAgIHZpZGVvX3JlbmRlcmVyXy0+SXNFbmRPZlN0cmVhbVBsYXllZCgpKSB7CisgICAgICAoKnBsYXllcl93b3JrZXJfLip1cGRhdGVfcGxheWVyX3N0YXRlX2NiXykoa1NiUGxheWVyU3RhdGVFbmRPZlN0cmVhbSk7CisgICAgfQorCisgICAgY29uc3QgVmlkZW9GcmFtZSYgZnJhbWUgPQorICAgICAgICB2aWRlb19yZW5kZXJlcl8tPkdldEN1cnJlbnRGcmFtZShhdWRpb19yZW5kZXJlcl8tPkdldEN1cnJlbnRUaW1lKCkpOworCisjaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorICAgIHNoYXJlZDo6c3RhcmJvYXJkOjpBcHBsaWNhdGlvbjo6R2V0KCktPkhhbmRsZUZyYW1lKAorICAgICAgICBwbGF5ZXJfLCBmcmFtZSwgZGF0YS54LCBkYXRhLnksIGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0KTsKKyNlbmRpZiAgLy8gU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorCisgICAgKCpwbGF5ZXJfd29ya2VyXy4qdXBkYXRlX21lZGlhX3RpbWVfY2JfKShhdWRpb19yZW5kZXJlcl8tPkdldEN1cnJlbnRUaW1lKCkpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpQcm9jZXNzU3RvcEV2ZW50KCkgeworICBhdWRpb19yZW5kZXJlcl8ucmVzZXQoKTsKKyAgdmlkZW9fcmVuZGVyZXJfLnJlc2V0KCk7CisKKyNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisgIC8vIENsZWFyIHRoZSB2aWRlbyBmcmFtZSBhcyB3ZSB0ZXJtaW5hdGUuCisgIHNoYXJlZDo6c3RhcmJvYXJkOjpBcHBsaWNhdGlvbjo6R2V0KCktPkhhbmRsZUZyYW1lKHBsYXllcl8sIFZpZGVvRnJhbWUoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCk7CisjZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKK30KKworfSAgLy8gbmFtZXNwYWNlIGZpbHRlcgorfSAgLy8gbmFtZXNwYWNlIHBsYXllcgorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTAzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmgKQEAgLTAsMCArMSw4MCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfRklMVEVSX0ZJTFRFUl9CQVNFRF9QTEFZRVJfV09SS0VSX0hBTkRMRVJfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0ZJTFRFUl9GSUxURVJfQkFTRURfUExBWUVSX1dPUktFUl9IQU5ETEVSX0hfCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9wbGF5ZXIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9pbnB1dF9idWZmZXJfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oIgorI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIHNoYXJlZCB7CituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBwbGF5ZXIgeworbmFtZXNwYWNlIGZpbHRlciB7CisKK2NsYXNzIEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlciA6IHB1YmxpYyBQbGF5ZXJXb3JrZXI6OkhhbmRsZXIgeworIHB1YmxpYzoKKyAgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyKFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIpOworCisgcHJpdmF0ZToKKyAgdm9pZCBTZXR1cChQbGF5ZXJXb3JrZXIqIHBsYXllcl93b3JrZXIsCisgICAgICAgICAgICAgU2JQbGF5ZXIgcGxheWVyLAorICAgICAgICAgICAgIFVwZGF0ZU1lZGlhVGltZUNCIHVwZGF0ZV9tZWRpYV90aW1lX2NiLAorICAgICAgICAgICAgIEdldFBsYXllclN0YXRlQ0IgZ2V0X3BsYXllcl9zdGF0ZV9jYiwKKyAgICAgICAgICAgICBVcGRhdGVQbGF5ZXJTdGF0ZUNCIHVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2IpIFNCX09WRVJSSURFOworICBib29sIFByb2Nlc3NJbml0RXZlbnQoKSBTQl9PVkVSUklERTsKKyAgYm9vbCBQcm9jZXNzU2Vla0V2ZW50KGNvbnN0IFNlZWtFdmVudERhdGEmIGRhdGEpIFNCX09WRVJSSURFOworICBib29sIFByb2Nlc3NXcml0ZVNhbXBsZUV2ZW50KGNvbnN0IFdyaXRlU2FtcGxlRXZlbnREYXRhJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHdyaXR0ZW4pIFNCX09WRVJSSURFOworICBib29sIFByb2Nlc3NXcml0ZUVuZE9mU3RyZWFtRXZlbnQoY29uc3QgV3JpdGVFbmRPZlN0cmVhbUV2ZW50RGF0YSYgZGF0YSkKKyAgICAgIFNCX09WRVJSSURFOworICBib29sIFByb2Nlc3NTZXRQYXVzZUV2ZW50KGNvbnN0IFNldFBhdXNlRXZlbnREYXRhJiBkYXRhKSBTQl9PVkVSUklERTsKKyAgYm9vbCBQcm9jZXNzVXBkYXRlRXZlbnQoY29uc3QgU2V0Qm91bmRzRXZlbnREYXRhJiBkYXRhKSBTQl9PVkVSUklERTsKKyAgdm9pZCBQcm9jZXNzU3RvcEV2ZW50KCkgU0JfT1ZFUlJJREU7CisKKyAgUGxheWVyV29ya2VyKiBwbGF5ZXJfd29ya2VyXzsKKyAgU2JQbGF5ZXIgcGxheWVyXzsKKyAgVXBkYXRlTWVkaWFUaW1lQ0IgdXBkYXRlX21lZGlhX3RpbWVfY2JfOworICBHZXRQbGF5ZXJTdGF0ZUNCIGdldF9wbGF5ZXJfc3RhdGVfY2JfOworICBVcGRhdGVQbGF5ZXJTdGF0ZUNCIHVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2JfOworCisgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjXzsKKyAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWNfOworICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtXzsKKyAgU2JNZWRpYUF1ZGlvSGVhZGVyIGF1ZGlvX2hlYWRlcl87CisKKyAgc2NvcGVkX3B0cjxBdWRpb1JlbmRlcmVyPiBhdWRpb19yZW5kZXJlcl87CisgIHNjb3BlZF9wdHI8VmlkZW9SZW5kZXJlcj4gdmlkZW9fcmVuZGVyZXJfOworCisgIGJvb2wgcGF1c2VkXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKK30gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKK30gIC8vIG5hbWVzcGFjZSBzaGFyZWQKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfRklMVEVSX0ZJTFRFUl9CQVNFRF9QTEFZRVJfV09SS0VSX0hBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oCnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oCnJlbmFtZSB0byBzcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19kZWNvZGVyX2ludGVybmFsLmgKaW5kZXggNDQ0ZjA0OS4uZmQzMmM5ZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kZWNvZGVyX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oCkBAIC0xMiw4ICsxMiw4IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfVklERU9fREVDT0RFUl9JTlRFUk5BTF9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfVklERU9fREVDT0RFUl9JTlRFUk5BTF9IXworI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfRklMVEVSX1ZJREVPX0RFQ09ERVJfSU5URVJOQUxfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0ZJTFRFUl9WSURFT19ERUNPREVSX0lOVEVSTkFMX0hfCiAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvaW5wdXRfYnVmZmVyX2ludGVybmFsLmgiCkBAIC0yMyw2ICsyMyw3IEBACiBuYW1lc3BhY2Ugc2hhcmVkIHsKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIHBsYXllciB7CituYW1lc3BhY2UgZmlsdGVyIHsKIAogLy8gVGhpcyBjbGFzcyBkZWNvZGVzIGVuY29kZWQgdmlkZW8gc3RyZWFtIGludG8gdmlkZW8gZnJhbWVzLgogY2xhc3MgVmlkZW9EZWNvZGVyIHsKQEAgLTY0LDkgKzY1LDEwIEBACiAgIHN0YXRpYyBWaWRlb0RlY29kZXIqIENyZWF0ZShTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYyk7CiB9OwogCit9ICAvLyBuYW1lc3BhY2UgZmlsdGVyCiB9ICAvLyBuYW1lc3BhY2UgcGxheWVyCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCiB9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCiAKLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX1ZJREVPX0RFQ09ERVJfSU5URVJOQUxfSF8KKyNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0ZJTFRFUl9WSURFT19ERUNPREVSX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5jYwpyZW5hbWUgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKaW5kZXggZDNmYWE5Zi4uMzg5OGFmNSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5jYwpAQCAtMTIsNyArMTIsNyBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKQEAgLTIwLDIxICsyMCwxOCBAQAogbmFtZXNwYWNlIHNoYXJlZCB7CiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBwbGF5ZXIgeworbmFtZXNwYWNlIGZpbHRlciB7CiAKLVZpZGVvUmVuZGVyZXI6OlZpZGVvUmVuZGVyZXIoVmlkZW9EZWNvZGVyKiBkZWNvZGVyKQorVmlkZW9SZW5kZXJlcjo6VmlkZW9SZW5kZXJlcihzY29wZWRfcHRyPFZpZGVvRGVjb2Rlcj4gZGVjb2RlcikKICAgICA6IHNlZWtpbmdfKGZhbHNlKSwKICAgICAgIHNlZWtpbmdfdG9fcHRzXygwKSwKICAgICAgIGVuZF9vZl9zdHJlYW1fd3JpdHRlbl8oZmFsc2UpLAogICAgICAgbmVlZF9tb3JlX2lucHV0Xyh0cnVlKSwKLSAgICAgIGRlY29kZXJfKGRlY29kZXIpIHsKKyAgICAgIGRlY29kZXJfKGRlY29kZXIuUGFzcygpKSB7CiAgIFNCX0RDSEVDSyhkZWNvZGVyXyAhPSBOVUxMKTsKICAgZGVjb2Rlcl8tPlNldEhvc3QodGhpcyk7CiB9CiAKLVZpZGVvUmVuZGVyZXI6On5WaWRlb1JlbmRlcmVyKCkgewotICBkZWxldGUgZGVjb2Rlcl87Ci19Ci0KIHZvaWQgVmlkZW9SZW5kZXJlcjo6V3JpdGVTYW1wbGUoY29uc3QgSW5wdXRCdWZmZXImIGlucHV0X2J1ZmZlcikgewogICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKIApAQCAtMTMyLDYgKzEyOSw3IEBACiAgIG5lZWRfbW9yZV9pbnB1dF8gPSAoc3RhdHVzID09IFZpZGVvRGVjb2Rlcjo6a05lZWRNb3JlSW5wdXQpOwogfQogCit9ICAvLyBuYW1lc3BhY2UgZmlsdGVyCiB9ICAvLyBuYW1lc3BhY2UgcGxheWVyCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCiB9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5oCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIHNyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuaApyZW5hbWUgdG8gc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuaAppbmRleCAwY2Y4MTVhLi40M2Y4OTliIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuaApAQCAtMTIsMjggKzEyLDI5IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfVklERU9fUkVOREVSRVJfSU5URVJOQUxfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX1ZJREVPX1JFTkRFUkVSX0lOVEVSTkFMX0hfCisjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9GSUxURVJfVklERU9fUkVOREVSRVJfSU5URVJOQUxfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0ZJTFRFUl9WSURFT19SRU5ERVJFUl9JTlRFUk5BTF9IXwogCiAjaW5jbHVkZSA8bGlzdD4KIAorI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbWVkaWEuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvaW5wdXRfYnVmZmVyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZnJhbWVfaW50ZXJuYWwuaCIKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2Ugc2hhcmVkIHsKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIHBsYXllciB7CituYW1lc3BhY2UgZmlsdGVyIHsKIAogY2xhc3MgVmlkZW9SZW5kZXJlciA6IHByaXZhdGUgVmlkZW9EZWNvZGVyOjpIb3N0IHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IFZpZGVvUmVuZGVyZXIoVmlkZW9EZWNvZGVyKiBkZWNvZGVyKTsKLSAgflZpZGVvUmVuZGVyZXIoKTsKKyAgZXhwbGljaXQgVmlkZW9SZW5kZXJlcihzY29wZWRfcHRyPFZpZGVvRGVjb2Rlcj4gZGVjb2Rlcik7CiAKICAgYm9vbCBpc192YWxpZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KIApAQCAtODAsMTIgKzgxLDEzIEBACiAgIGJvb2wgZW5kX29mX3N0cmVhbV93cml0dGVuXzsKICAgYm9vbCBuZWVkX21vcmVfaW5wdXRfOwogCi0gIFZpZGVvRGVjb2RlciogZGVjb2Rlcl87CisgIHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyPiBkZWNvZGVyXzsKIH07CiAKK30gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKIH0gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIH0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIAotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfVklERU9fUkVOREVSRVJfSU5URVJOQUxfSF8KKyNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0ZJTFRFUl9WSURFT19SRU5ERVJFUl9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfY3JlYXRlLmNjCmluZGV4IDg0ODljY2UuLjU1ODFjYTggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2NyZWF0ZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9jcmVhdGUuY2MKQEAgLTE0LDggKzE0LDE1IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvcGxheWVyLmgiCiAKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuaCIKKwordXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OgorICAgIEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjsKK3VzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6UGxheWVyV29ya2VyOwogCiBTYlBsYXllciBTYlBsYXllckNyZWF0ZShTYldpbmRvdyB3aW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKQEAgLTI3LDYgKzM0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyRGVjb2RlclN0YXR1c0Z1bmMgZGVjb2Rlcl9zdGF0dXNfZnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyU3RhdHVzRnVuYyBwbGF5ZXJfc3RhdHVzX2Z1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0KSB7CisgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIod2luZG93KTsKKwogICBpZiAoYXVkaW9fY29kZWMgIT0ga1NiTWVkaWFBdWRpb0NvZGVjQWFjKSB7CiAgICAgU0JfTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgYXVkaW8gY29kZWMgIiA8PCBhdWRpb19jb2RlYzsKICAgICByZXR1cm4ga1NiUGxheWVySW52YWxpZDsKQEAgLTQyLDcgKzUxLDEwIEBACiAgICAgcmV0dXJuIGtTYlBsYXllckludmFsaWQ7CiAgIH0KIAotICByZXR1cm4gbmV3IFNiUGxheWVyUHJpdmF0ZSh3aW5kb3csIHZpZGVvX2NvZGVjLCBhdWRpb19jb2RlYywgZHVyYXRpb25fcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1fc3lzdGVtLCBhdWRpb19oZWFkZXIsIHNhbXBsZV9kZWFsbG9jYXRlX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfc3RhdHVzX2Z1bmMsIHBsYXllcl9zdGF0dXNfZnVuYywgY29udGV4dCk7CisgIHN0YXJib2FyZDo6c2NvcGVkX3B0cjxQbGF5ZXJXb3JrZXI6OkhhbmRsZXI+IGhhbmRsZXIoCisgICAgICBuZXcgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyKHZpZGVvX2NvZGVjLCBhdWRpb19jb2RlYywgZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmF1ZGlvX2hlYWRlcikpOworICByZXR1cm4gbmV3IFNiUGxheWVyUHJpdmF0ZShkdXJhdGlvbl9wdHMsIHNhbXBsZV9kZWFsbG9jYXRlX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfc3RhdHVzX2Z1bmMsIHBsYXllcl9zdGF0dXNfZnVuYywgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5QYXNzKCkpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5jYwppbmRleCAwNDQzYjJmLi5iYzlkNzRkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5jYwpAQCAtMTcsMTAgKzE3LDExIEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgogCiB1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OklucHV0QnVmZmVyOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpQbGF5ZXJXb3JrZXI7CiAKIG5hbWVzcGFjZSB7CiAKK2NvbnN0IFNiVGltZSBrVXBkYXRlSW50ZXJ2YWwgPSA1ICoga1NiVGltZU1pbGxpc2Vjb25kOworCiBTYk1lZGlhVGltZSBHZXRNZWRpYVRpbWUoU2JNZWRpYVRpbWUgbWVkaWFfcHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNiVGltZU1vbm90b25pYyBtZWRpYV9wdHNfdXBkYXRlX3RpbWUpIHsKICAgU2JUaW1lTW9ub3RvbmljIGVsYXBzZWQgPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKSAtIG1lZGlhX3B0c191cGRhdGVfdGltZTsKQEAgLTMwLDE2ICszMSwxMiBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFNiUGxheWVyUHJpdmF0ZTo6U2JQbGF5ZXJQcml2YXRlKAotICAgIFNiV2luZG93IHdpbmRvdywKLSAgICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKLSAgICBTYk1lZGlhQXVkaW9Db2RlYyBhdWRpb19jb2RlYywKICAgICBTYk1lZGlhVGltZSBkdXJhdGlvbl9wdHMsCi0gICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKLSAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXIqIGF1ZGlvX2hlYWRlciwKICAgICBTYlBsYXllckRlYWxsb2NhdGVTYW1wbGVGdW5jIHNhbXBsZV9kZWFsbG9jYXRlX2Z1bmMsCiAgICAgU2JQbGF5ZXJEZWNvZGVyU3RhdHVzRnVuYyBkZWNvZGVyX3N0YXR1c19mdW5jLAogICAgIFNiUGxheWVyU3RhdHVzRnVuYyBwbGF5ZXJfc3RhdHVzX2Z1bmMsCi0gICAgdm9pZCogY29udGV4dCkKKyAgICB2b2lkKiBjb250ZXh0LAorICAgIHN0YXJib2FyZDo6c2NvcGVkX3B0cjxQbGF5ZXJXb3JrZXI6OkhhbmRsZXI+IHBsYXllcl93b3JrZXJfaGFuZGxlcikKICAgICA6IHNhbXBsZV9kZWFsbG9jYXRlX2Z1bmNfKHNhbXBsZV9kZWFsbG9jYXRlX2Z1bmMpLAogICAgICAgY29udGV4dF8oY29udGV4dCksCiAgICAgICB0aWNrZXRfKFNCX1BMQVlFUl9JTklUSUFMX1RJQ0tFVCksCkBAIC01MSwxNiArNDgsMTMgQEAKICAgICAgIGlzX3BhdXNlZF8odHJ1ZSksCiAgICAgICB2b2x1bWVfKDEuMCksCiAgICAgICB0b3RhbF92aWRlb19mcmFtZXNfKDApLAotICAgICAgd29ya2VyXyh0aGlzLAotICAgICAgICAgICAgICB3aW5kb3csCi0gICAgICAgICAgICAgIHZpZGVvX2NvZGVjLAotICAgICAgICAgICAgICBhdWRpb19jb2RlYywKLSAgICAgICAgICAgICAgZHJtX3N5c3RlbSwKLSAgICAgICAgICAgICAgKmF1ZGlvX2hlYWRlciwKLSAgICAgICAgICAgICAgZGVjb2Rlcl9zdGF0dXNfZnVuYywKLSAgICAgICAgICAgICAgcGxheWVyX3N0YXR1c19mdW5jLAotICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICBjb250ZXh0KSB7fQorICAgICAgd29ya2VyXyhuZXcgUGxheWVyV29ya2VyKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyX3dvcmtlcl9oYW5kbGVyLlBhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX3N0YXR1c19mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcl9zdGF0dXNfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtVcGRhdGVJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSkge30KIAogdm9pZCBTYlBsYXllclByaXZhdGU6OlNlZWsoU2JNZWRpYVRpbWUgc2Vla190b19wdHMsIGludCB0aWNrZXQpIHsKICAgewpAQCAtNzIsNyArNjYsNyBAQAogICB9CiAKICAgUGxheWVyV29ya2VyOjpTZWVrRXZlbnREYXRhIGRhdGEgPSB7c2Vla190b19wdHMsIHRpY2tldH07Ci0gIHdvcmtlcl8uRW5xdWV1ZUV2ZW50KGRhdGEpOworICB3b3JrZXJfLT5FbnF1ZXVlRXZlbnQoZGF0YSk7CiB9CiAKIHZvaWQgU2JQbGF5ZXJQcml2YXRlOjpXcml0ZVNhbXBsZSgKQEAgLTg5LDE4ICs4MywxOCBAQAogICAgICAgc2FtcGxlX2RlYWxsb2NhdGVfZnVuY18sIHRoaXMsIGNvbnRleHRfLCBzYW1wbGVfYnVmZmVyLAogICAgICAgc2FtcGxlX2J1ZmZlcl9zaXplLCBzYW1wbGVfcHRzLCB2aWRlb19zYW1wbGVfaW5mbywgc2FtcGxlX2RybV9pbmZvKTsKICAgUGxheWVyV29ya2VyOjpXcml0ZVNhbXBsZUV2ZW50RGF0YSBkYXRhID0ge3NhbXBsZV90eXBlLCBpbnB1dF9idWZmZXJ9OwotICB3b3JrZXJfLkVucXVldWVFdmVudChkYXRhKTsKKyAgd29ya2VyXy0+RW5xdWV1ZUV2ZW50KGRhdGEpOwogfQogCiB2b2lkIFNiUGxheWVyUHJpdmF0ZTo6V3JpdGVFbmRPZlN0cmVhbShTYk1lZGlhVHlwZSBzdHJlYW1fdHlwZSkgewogICBQbGF5ZXJXb3JrZXI6OldyaXRlRW5kT2ZTdHJlYW1FdmVudERhdGEgZGF0YSA9IHtzdHJlYW1fdHlwZX07Ci0gIHdvcmtlcl8uRW5xdWV1ZUV2ZW50KGRhdGEpOworICB3b3JrZXJfLT5FbnF1ZXVlRXZlbnQoZGF0YSk7CiB9CiAKICNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiB2b2lkIFNiUGxheWVyUHJpdmF0ZTo6U2V0Qm91bmRzKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgIFBsYXllcldvcmtlcjo6U2V0Qm91bmRzRXZlbnREYXRhIGRhdGEgPSB7eCwgeSwgd2lkdGgsIGhlaWdodH07Ci0gIHdvcmtlcl8uRW5xdWV1ZUV2ZW50KGRhdGEpOworICB3b3JrZXJfLT5FbnF1ZXVlRXZlbnQoZGF0YSk7CiAgIC8vIFRPRE86IFdhaXQgdW50aWwgYSBmcmFtZSBpcyByZW5kZXJlZCB3aXRoIHRoZSB1cGRhdGVkIGJvdW5kcy4KIH0KICNlbmRpZgpAQCAtMTI3LDcgKzEyMSw3IEBACiAKIHZvaWQgU2JQbGF5ZXJQcml2YXRlOjpTZXRQYXVzZShib29sIHBhdXNlKSB7CiAgIFBsYXllcldvcmtlcjo6U2V0UGF1c2VFdmVudERhdGEgZGF0YSA9IHtwYXVzZX07Ci0gIHdvcmtlcl8uRW5xdWV1ZUV2ZW50KGRhdGEpOworICB3b3JrZXJfLT5FbnF1ZXVlRXZlbnQoZGF0YSk7CiB9CiAKIHZvaWQgU2JQbGF5ZXJQcml2YXRlOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgKaW5kZXggN2VjYzI5OS4uNGE4YTkxNyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oCkBAIC0xNSw2ICsxNSw3IEBACiAjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9QTEFZRVJfSU5URVJOQUxfSF8KICNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX1BMQVlFUl9JTlRFUk5BTF9IXwogCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvaW50ZXJuYWxfb25seS5oIgpAQCAtMjIsMjAgKzIzLDE4IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvd2luZG93LmgiCiAKLS8vIFRPRE86IEltcGxlbWVudCBEUk0gc3VwcG9ydAogc3RydWN0IFNiUGxheWVyUHJpdmF0ZQogICAgIDogc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpQbGF5ZXJXb3JrZXI6Okhvc3QgewogIHB1YmxpYzoKLSAgU2JQbGF5ZXJQcml2YXRlKFNiV2luZG93IHdpbmRvdywKLSAgICAgICAgICAgICAgICAgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjLAotICAgICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCi0gICAgICAgICAgICAgICAgICBTYk1lZGlhVGltZSBkdXJhdGlvbl9wdHMsCi0gICAgICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAotICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyKiBhdWRpb19oZWFkZXIsCi0gICAgICAgICAgICAgICAgICBTYlBsYXllckRlYWxsb2NhdGVTYW1wbGVGdW5jIHNhbXBsZV9kZWFsbG9jYXRlX2Z1bmMsCi0gICAgICAgICAgICAgICAgICBTYlBsYXllckRlY29kZXJTdGF0dXNGdW5jIGRlY29kZXJfc3RhdHVzX2Z1bmMsCi0gICAgICAgICAgICAgICAgICBTYlBsYXllclN0YXR1c0Z1bmMgcGxheWVyX3N0YXR1c19mdW5jLAotICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCk7CisgIHR5cGVkZWYgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpQbGF5ZXJXb3JrZXIgUGxheWVyV29ya2VyOworCisgIFNiUGxheWVyUHJpdmF0ZSgKKyAgICAgIFNiTWVkaWFUaW1lIGR1cmF0aW9uX3B0cywKKyAgICAgIFNiUGxheWVyRGVhbGxvY2F0ZVNhbXBsZUZ1bmMgc2FtcGxlX2RlYWxsb2NhdGVfZnVuYywKKyAgICAgIFNiUGxheWVyRGVjb2RlclN0YXR1c0Z1bmMgZGVjb2Rlcl9zdGF0dXNfZnVuYywKKyAgICAgIFNiUGxheWVyU3RhdHVzRnVuYyBwbGF5ZXJfc3RhdHVzX2Z1bmMsCisgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgc3RhcmJvYXJkOjpzY29wZWRfcHRyPFBsYXllcldvcmtlcjo6SGFuZGxlcj4gcGxheWVyX3dvcmtlcl9oYW5kbGVyKTsKIAogICB2b2lkIFNlZWsoU2JNZWRpYVRpbWUgc2Vla190b19wdHMsIGludCB0aWNrZXQpOwogICB2b2lkIFdyaXRlU2FtcGxlKFNiTWVkaWFUeXBlIHNhbXBsZV90eXBlLApAQCAtNzEsNyArNzAsNyBAQAogICBkb3VibGUgdm9sdW1lXzsKICAgaW50IHRvdGFsX3ZpZGVvX2ZyYW1lc187CiAKLSAgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpQbGF5ZXJXb3JrZXIgd29ya2VyXzsKKyAgc3RhcmJvYXJkOjpzY29wZWRfcHRyPFBsYXllcldvcmtlcj4gd29ya2VyXzsKIH07CiAKICNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX1BMQVlFUl9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmNjCmluZGV4IGRkYjQyNWYuLjUxYzg2OWQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuY2MKQEAgLTE0LDE1ICsxNCw4IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oIgogCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9yZXNldF9hbmRfcmV0dXJuLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV9zeXN0ZW1faW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9pbnB1dF9idWZmZXJfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19mcmFtZV9pbnRlcm5hbC5oIgogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBzaGFyZWQgewpAQCAtMzAsMzQgKzIzLDM0IEBACiBuYW1lc3BhY2UgcGxheWVyIHsKIAogUGxheWVyV29ya2VyOjpQbGF5ZXJXb3JrZXIoSG9zdCogaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiV2luZG93IHdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPEhhbmRsZXI+IGhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlBsYXllckRlY29kZXJTdGF0dXNGdW5jIGRlY29kZXJfc3RhdHVzX2Z1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlBsYXllclN0YXR1c0Z1bmMgcGxheWVyX3N0YXR1c19mdW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXIgcGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JUaW1lIHVwZGF0ZV9pbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQpCi0gICAgOiBob3N0Xyhob3N0KSwKLSAgICAgIHdpbmRvd18od2luZG93KSwKLSAgICAgIHZpZGVvX2NvZGVjXyh2aWRlb19jb2RlYyksCi0gICAgICBhdWRpb19jb2RlY18oYXVkaW9fY29kZWMpLAotICAgICAgZHJtX3N5c3RlbV8oZHJtX3N5c3RlbSksCi0gICAgICBhdWRpb19oZWFkZXJfKGF1ZGlvX2hlYWRlciksCisgICAgOiB0aHJlYWRfKGtTYlRocmVhZEludmFsaWQpLAorICAgICAgaG9zdF8oaG9zdCksCisgICAgICBoYW5kbGVyXyhoYW5kbGVyLlBhc3MoKSksCiAgICAgICBkZWNvZGVyX3N0YXR1c19mdW5jXyhkZWNvZGVyX3N0YXR1c19mdW5jKSwKICAgICAgIHBsYXllcl9zdGF0dXNfZnVuY18ocGxheWVyX3N0YXR1c19mdW5jKSwKICAgICAgIHBsYXllcl8ocGxheWVyKSwKICAgICAgIGNvbnRleHRfKGNvbnRleHQpLAotICAgICAgYXVkaW9fcmVuZGVyZXJfKE5VTEwpLAotICAgICAgdmlkZW9fcmVuZGVyZXJfKE5VTEwpLAotICAgICAgYXVkaW9fZGVjb2Rlcl9zdGF0ZV8oa1NiUGxheWVyRGVjb2RlclN0YXRlQnVmZmVyRnVsbCksCi0gICAgICB2aWRlb19kZWNvZGVyX3N0YXRlXyhrU2JQbGF5ZXJEZWNvZGVyU3RhdGVCdWZmZXJGdWxsKSwKICAgICAgIHRpY2tldF8oU0JfUExBWUVSX0lOSVRJQUxfVElDS0VUKSwKLSAgICAgIHBhdXNlZF8odHJ1ZSksCi0gICAgICBwbGF5ZXJfc3RhdGVfKGtTYlBsYXllclN0YXRlSW5pdGlhbGl6ZWQpIHsKLSAgU0JfRENIRUNLKGhvc3QgIT0gTlVMTCk7CisgICAgICBwbGF5ZXJfc3RhdGVfKGtTYlBsYXllclN0YXRlSW5pdGlhbGl6ZWQpLAorICAgICAgdXBkYXRlX2ludGVydmFsXyh1cGRhdGVfaW50ZXJ2YWwpIHsKKyAgU0JfRENIRUNLKGhvc3RfICE9IE5VTEwpOworICBTQl9EQ0hFQ0soaGFuZGxlcl8gIT0gTlVMTCk7CisgIFNCX0RDSEVDSyh1cGRhdGVfaW50ZXJ2YWxfID4gMCk7CiAKKyAgaGFuZGxlcl8tPlNldHVwKHRoaXMsIHBsYXllcl8sICZQbGF5ZXJXb3JrZXI6OlVwZGF0ZU1lZGlhVGltZSwKKyAgICAgICAgICAgICAgICAgICZQbGF5ZXJXb3JrZXI6OnBsYXllcl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICZQbGF5ZXJXb3JrZXI6OlVwZGF0ZVBsYXllclN0YXRlKTsKKworICBwZW5kaW5nX2F1ZGlvX3NhbXBsZV8uaW5wdXRfYnVmZmVyID0gTlVMTDsKKyAgcGVuZGluZ192aWRlb19zYW1wbGVfLmlucHV0X2J1ZmZlciA9IE5VTEw7CisKKyAgU0JfRENIRUNLKCFTYlRocmVhZElzVmFsaWQodGhyZWFkXykpOwogICB0aHJlYWRfID0KICAgICAgIFNiVGhyZWFkQ3JlYXRlKDAsIGtTYlRocmVhZFByaW9yaXR5SGlnaCwga1NiVGhyZWFkTm9BZmZpbml0eSwgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICJwbGF5ZXJfd29ya2VyIiwgJlBsYXllcldvcmtlcjo6VGhyZWFkRW50cnlQb2ludCwgdGhpcyk7CkBAIC02OSw5ICs2Miw0MSBAQAogUGxheWVyV29ya2VyOjp+UGxheWVyV29ya2VyKCkgewogICBxdWV1ZV8uUHV0KG5ldyBFdmVudChFdmVudDo6a1N0b3ApKTsKICAgU2JUaHJlYWRKb2luKHRocmVhZF8sIE5VTEwpOworICB0aHJlYWRfID0ga1NiVGhyZWFkSW52YWxpZDsKKwogICAvLyBOb3cgdGhlIHdob2xlIHBpcGVsaW5lIGhhcyBiZWVuIHRvcm4gZG93biBhbmQgbm8gY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuCiAgIC8vIFRoZSBjYWxsZXIgY2FuIGVuc3VyZSB0aGF0IHVwb24gdGhlIHJldHVybiBvZiBTYlBsYXllckRlc3Ryb3koKSBhbGwgc2lkZQogICAvLyBlZmZlY3RzIGFyZSBnb25lLgorCisgIC8vIFRoZXJlIGNhbiBiZSBldmVudHMgaW5zaWRlIHRoZSBxdWV1ZSB0aGF0IGlzIG5vdCBwcm9jZXNzZWQuICBDbGVhbiB0aGVtIHVwLgorICB3aGlsZSAoRXZlbnQqIGV2ZW50ID0gcXVldWVfLkdldFRpbWVkKDApKSB7CisgICAgaWYgKGV2ZW50LT50eXBlID09IEV2ZW50OjprV3JpdGVTYW1wbGUpIHsKKyAgICAgIGRlbGV0ZSBldmVudC0+ZGF0YS53cml0ZV9zYW1wbGUuaW5wdXRfYnVmZmVyOworICAgIH0KKyAgICBkZWxldGUgZXZlbnQ7CisgIH0KKworICBpZiAocGVuZGluZ19hdWRpb19zYW1wbGVfLmlucHV0X2J1ZmZlciAhPSBOVUxMKSB7CisgICAgZGVsZXRlIHBlbmRpbmdfYXVkaW9fc2FtcGxlXy5pbnB1dF9idWZmZXI7CisgIH0KKworICBpZiAocGVuZGluZ192aWRlb19zYW1wbGVfLmlucHV0X2J1ZmZlciAhPSBOVUxMKSB7CisgICAgZGVsZXRlIHBlbmRpbmdfdmlkZW9fc2FtcGxlXy5pbnB1dF9idWZmZXI7CisgIH0KK30KKwordm9pZCBQbGF5ZXJXb3JrZXI6OlVwZGF0ZU1lZGlhVGltZShTYk1lZGlhVGltZSB0aW1lKSB7CisgIGhvc3RfLT5VcGRhdGVNZWRpYVRpbWUodGltZSwgdGlja2V0Xyk7Cit9CisKK3ZvaWQgUGxheWVyV29ya2VyOjpVcGRhdGVQbGF5ZXJTdGF0ZShTYlBsYXllclN0YXRlIHBsYXllcl9zdGF0ZSkgeworICBwbGF5ZXJfc3RhdGVfID0gcGxheWVyX3N0YXRlOworCisgIGlmICghcGxheWVyX3N0YXR1c19mdW5jXykgeworICAgIHJldHVybjsKKyAgfQorCisgIHBsYXllcl9zdGF0dXNfZnVuY18ocGxheWVyXywgY29udGV4dF8sIHBsYXllcl9zdGF0ZV8sIHRpY2tldF8pOwogfQogCiAvLyBzdGF0aWMKQEAgLTg2LDQxICsxMTEsMzUgQEAKICAgU0JfRENIRUNLKGV2ZW50ICE9IE5VTEwpOwogICBTQl9EQ0hFQ0soZXZlbnQtPnR5cGUgPT0gRXZlbnQ6OmtJbml0KTsKICAgZGVsZXRlIGV2ZW50OwotICBib29sIHJ1bm5pbmcgPSBQcm9jZXNzSW5pdEV2ZW50KCk7CisgIGJvb2wgcnVubmluZyA9IERvSW5pdCgpOwogCiAgIFNldEJvdW5kc0V2ZW50RGF0YSBib3VuZHMgPSB7MCwgMCwgMCwgMH07CiAKICAgd2hpbGUgKHJ1bm5pbmcpIHsKLSAgICBFdmVudCogZXZlbnQgPSBxdWV1ZV8uR2V0VGltZWQoa1VwZGF0ZUludGVydmFsKTsKKyAgICBFdmVudCogZXZlbnQgPSBxdWV1ZV8uR2V0VGltZWQodXBkYXRlX2ludGVydmFsXyk7CiAgICAgaWYgKGV2ZW50ID09IE5VTEwpIHsKLSAgICAgIHJ1bm5pbmcgJj0gUHJvY2Vzc1VwZGF0ZUV2ZW50KGJvdW5kcyk7CisgICAgICBydW5uaW5nICY9IERvVXBkYXRlKGJvdW5kcyk7CiAgICAgICBjb250aW51ZTsKICAgICB9CiAKICAgICBTQl9EQ0hFQ0soZXZlbnQtPnR5cGUgIT0gRXZlbnQ6OmtJbml0KTsKIAogICAgIGlmIChldmVudC0+dHlwZSA9PSBFdmVudDo6a1NlZWspIHsKLSAgICAgIHJ1bm5pbmcgJj0gUHJvY2Vzc1NlZWtFdmVudChldmVudC0+ZGF0YS5zZWVrKTsKKyAgICAgIHJ1bm5pbmcgJj0gRG9TZWVrKGV2ZW50LT5kYXRhLnNlZWspOwogICAgIH0gZWxzZSBpZiAoZXZlbnQtPnR5cGUgPT0gRXZlbnQ6OmtXcml0ZVNhbXBsZSkgewotICAgICAgYm9vbCByZXRyeTsKLSAgICAgIHJ1bm5pbmcgJj0gUHJvY2Vzc1dyaXRlU2FtcGxlRXZlbnQoZXZlbnQtPmRhdGEud3JpdGVfc2FtcGxlLCAmcmV0cnkpOwotICAgICAgaWYgKHJldHJ5ICYmIHJ1bm5pbmcpIHsKLSAgICAgICAgRW5xdWV1ZUV2ZW50KGV2ZW50LT5kYXRhLndyaXRlX3NhbXBsZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkZWxldGUgZXZlbnQtPmRhdGEud3JpdGVfc2FtcGxlLmlucHV0X2J1ZmZlcjsKLSAgICAgIH0KKyAgICAgIHJ1bm5pbmcgJj0gRG9Xcml0ZVNhbXBsZShldmVudC0+ZGF0YS53cml0ZV9zYW1wbGUpOwogICAgIH0gZWxzZSBpZiAoZXZlbnQtPnR5cGUgPT0gRXZlbnQ6OmtXcml0ZUVuZE9mU3RyZWFtKSB7Ci0gICAgICBydW5uaW5nICY9IFByb2Nlc3NXcml0ZUVuZE9mU3RyZWFtRXZlbnQoZXZlbnQtPmRhdGEud3JpdGVfZW5kX29mX3N0cmVhbSk7CisgICAgICBydW5uaW5nICY9IERvV3JpdGVFbmRPZlN0cmVhbShldmVudC0+ZGF0YS53cml0ZV9lbmRfb2Zfc3RyZWFtKTsKICAgICB9IGVsc2UgaWYgKGV2ZW50LT50eXBlID09IEV2ZW50OjprU2V0UGF1c2UpIHsKLSAgICAgIHJ1bm5pbmcgJj0gUHJvY2Vzc1NldFBhdXNlRXZlbnQoZXZlbnQtPmRhdGEuc2V0X3BhdXNlKTsKKyAgICAgIHJ1bm5pbmcgJj0gaGFuZGxlcl8tPlByb2Nlc3NTZXRQYXVzZUV2ZW50KGV2ZW50LT5kYXRhLnNldF9wYXVzZSk7CiAgICAgfSBlbHNlIGlmIChldmVudC0+dHlwZSA9PSBFdmVudDo6a1NldEJvdW5kcykgewogICAgICAgaWYgKFNiTWVtb3J5Q29tcGFyZSgmYm91bmRzLCAmZXZlbnQtPmRhdGEuc2V0X2JvdW5kcywgc2l6ZW9mKGJvdW5kcykpICE9CiAgICAgICAgICAgMCkgewogICAgICAgICBib3VuZHMgPSBldmVudC0+ZGF0YS5zZXRfYm91bmRzOwotICAgICAgICBQcm9jZXNzVXBkYXRlRXZlbnQoYm91bmRzKTsKKyAgICAgICAgcnVubmluZyAmPSBEb1VwZGF0ZShib3VuZHMpOwogICAgICAgfQogICAgIH0gZWxzZSBpZiAoZXZlbnQtPnR5cGUgPT0gRXZlbnQ6OmtTdG9wKSB7Ci0gICAgICBQcm9jZXNzU3RvcEV2ZW50KCk7CisgICAgICBEb1N0b3AoKTsKICAgICAgIHJ1bm5pbmcgPSBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJldmVudCB0eXBlICIgPDwgZXZlbnQtPnR5cGU7CkBAIC0xMjksMzQgKzE0OCwxNyBAQAogICB9CiB9CiAKLWJvb2wgUGxheWVyV29ya2VyOjpQcm9jZXNzSW5pdEV2ZW50KCkgewotICBBdWRpb0RlY29kZXIqIGF1ZGlvX2RlY29kZXIgPQotICAgICAgQXVkaW9EZWNvZGVyOjpDcmVhdGUoYXVkaW9fY29kZWNfLCBhdWRpb19oZWFkZXJfKTsKLSAgVmlkZW9EZWNvZGVyKiB2aWRlb19kZWNvZGVyID0gVmlkZW9EZWNvZGVyOjpDcmVhdGUodmlkZW9fY29kZWNfKTsKLQotICBpZiAoIWF1ZGlvX2RlY29kZXIgfHwgIXZpZGVvX2RlY29kZXIpIHsKLSAgICBkZWxldGUgYXVkaW9fZGVjb2RlcjsKLSAgICBkZWxldGUgdmlkZW9fZGVjb2RlcjsKLSAgICBVcGRhdGVQbGF5ZXJTdGF0ZShrU2JQbGF5ZXJTdGF0ZUVycm9yKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBhdWRpb19yZW5kZXJlcl8gPSBuZXcgQXVkaW9SZW5kZXJlcihhdWRpb19kZWNvZGVyLCBhdWRpb19oZWFkZXJfKTsKLSAgdmlkZW9fcmVuZGVyZXJfID0gbmV3IFZpZGVvUmVuZGVyZXIodmlkZW9fZGVjb2Rlcik7Ci0gIGlmIChhdWRpb19yZW5kZXJlcl8tPmlzX3ZhbGlkKCkgJiYgdmlkZW9fcmVuZGVyZXJfLT5pc192YWxpZCgpKSB7Citib29sIFBsYXllcldvcmtlcjo6RG9Jbml0KCkgeworICBpZiAoaGFuZGxlcl8tPlByb2Nlc3NJbml0RXZlbnQoKSkgewogICAgIFVwZGF0ZVBsYXllclN0YXRlKGtTYlBsYXllclN0YXRlSW5pdGlhbGl6ZWQpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgZGVsZXRlIGF1ZGlvX3JlbmRlcmVyXzsKLSAgYXVkaW9fcmVuZGVyZXJfID0gTlVMTDsKLSAgZGVsZXRlIHZpZGVvX3JlbmRlcmVyXzsKLSAgdmlkZW9fcmVuZGVyZXJfID0gTlVMTDsKICAgVXBkYXRlUGxheWVyU3RhdGUoa1NiUGxheWVyU3RhdGVFcnJvcik7CiAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBQbGF5ZXJXb3JrZXI6OlByb2Nlc3NTZWVrRXZlbnQoY29uc3QgU2Vla0V2ZW50RGF0YSYgZGF0YSkgeworYm9vbCBQbGF5ZXJXb3JrZXI6OkRvU2Vlayhjb25zdCBTZWVrRXZlbnREYXRhJiBkYXRhKSB7CiAgIFNCX0RDSEVDSyhwbGF5ZXJfc3RhdGVfICE9IGtTYlBsYXllclN0YXRlRGVzdHJveWVkKTsKICAgU0JfRENIRUNLKHBsYXllcl9zdGF0ZV8gIT0ga1NiUGxheWVyU3RhdGVFcnJvcik7CiAgIFNCX0RDSEVDSyh0aWNrZXRfICE9IGRhdGEudGlja2V0KTsKQEAgLTE2NCwxMDYgKzE2Niw2NiBAQAogICBTQl9ETE9HKElORk8pIDw8ICJUcnkgdG8gc2VlayB0byB0aW1lc3RhbXAgIgogICAgICAgICAgICAgICAgIDw8IGRhdGEuc2Vla190b19wdHMgLyBrU2JNZWRpYVRpbWVTZWNvbmQ7CiAKLSAgU2JNZWRpYVRpbWUgc2Vla190b19wdHMgPSBkYXRhLnNlZWtfdG9fcHRzOwotICBpZiAoc2Vla190b19wdHMgPCAwKSB7Ci0gICAgU0JfRExPRyhFUlJPUikgPDwgIlRyeSB0byBzZWVrIHRvIG5lZ2F0aXZlIHRpbWVzdGFtcCAiIDw8IHNlZWtfdG9fcHRzOwotICAgIHNlZWtfdG9fcHRzID0gMDsKKyAgaWYgKHBlbmRpbmdfYXVkaW9fc2FtcGxlXy5pbnB1dF9idWZmZXIgIT0gTlVMTCkgeworICAgIGRlbGV0ZSBwZW5kaW5nX2F1ZGlvX3NhbXBsZV8uaW5wdXRfYnVmZmVyOworICAgIHBlbmRpbmdfYXVkaW9fc2FtcGxlXy5pbnB1dF9idWZmZXIgPSBOVUxMOworICB9CisgIGlmIChwZW5kaW5nX3ZpZGVvX3NhbXBsZV8uaW5wdXRfYnVmZmVyICE9IE5VTEwpIHsKKyAgICBkZWxldGUgcGVuZGluZ192aWRlb19zYW1wbGVfLmlucHV0X2J1ZmZlcjsKKyAgICBwZW5kaW5nX3ZpZGVvX3NhbXBsZV8uaW5wdXRfYnVmZmVyID0gTlVMTDsKICAgfQogCi0gIGF1ZGlvX3JlbmRlcmVyXy0+UGF1c2UoKTsKLSAgYXVkaW9fZGVjb2Rlcl9zdGF0ZV8gPSBrU2JQbGF5ZXJEZWNvZGVyU3RhdGVOZWVkc0RhdGE7Ci0gIHZpZGVvX2RlY29kZXJfc3RhdGVfID0ga1NiUGxheWVyRGVjb2RlclN0YXRlTmVlZHNEYXRhOwotICBhdWRpb19yZW5kZXJlcl8tPlNlZWsoc2Vla190b19wdHMpOwotICB2aWRlb19yZW5kZXJlcl8tPlNlZWsoc2Vla190b19wdHMpOworICBpZiAoIWhhbmRsZXJfLT5Qcm9jZXNzU2Vla0V2ZW50KGRhdGEpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CiAKICAgdGlja2V0XyA9IGRhdGEudGlja2V0OwogCiAgIFVwZGF0ZVBsYXllclN0YXRlKGtTYlBsYXllclN0YXRlUHJlcm9sbGluZyk7Ci0gIFVwZGF0ZURlY29kZXJTdGF0ZShrU2JNZWRpYVR5cGVBdWRpbyk7Ci0gIFVwZGF0ZURlY29kZXJTdGF0ZShrU2JNZWRpYVR5cGVWaWRlbyk7CisgIFVwZGF0ZURlY29kZXJTdGF0ZShrU2JNZWRpYVR5cGVBdWRpbywga1NiUGxheWVyRGVjb2RlclN0YXRlTmVlZHNEYXRhKTsKKyAgVXBkYXRlRGVjb2RlclN0YXRlKGtTYk1lZGlhVHlwZVZpZGVvLCBrU2JQbGF5ZXJEZWNvZGVyU3RhdGVOZWVkc0RhdGEpOworCiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFBsYXllcldvcmtlcjo6UHJvY2Vzc1dyaXRlU2FtcGxlRXZlbnQoY29uc3QgV3JpdGVTYW1wbGVFdmVudERhdGEmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmV0cnkpIHsKLSAgU0JfRENIRUNLKHJldHJ5ICE9IE5VTEwpOworYm9vbCBQbGF5ZXJXb3JrZXI6OkRvV3JpdGVTYW1wbGUoY29uc3QgV3JpdGVTYW1wbGVFdmVudERhdGEmIGRhdGEpIHsKICAgU0JfRENIRUNLKHBsYXllcl9zdGF0ZV8gIT0ga1NiUGxheWVyU3RhdGVEZXN0cm95ZWQpOwogICBTQl9EQ0hFQ0socGxheWVyX3N0YXRlXyAhPSBrU2JQbGF5ZXJTdGF0ZUVycm9yKTsKIAotICAqcmV0cnkgPSBmYWxzZTsKLQogICBpZiAocGxheWVyX3N0YXRlXyA9PSBrU2JQbGF5ZXJTdGF0ZUluaXRpYWxpemVkIHx8CiAgICAgICBwbGF5ZXJfc3RhdGVfID09IGtTYlBsYXllclN0YXRlRW5kT2ZTdHJlYW0gfHwKICAgICAgIHBsYXllcl9zdGF0ZV8gPT0ga1NiUGxheWVyU3RhdGVFcnJvcikgewogICAgIFNCX0xPRyhFUlJPUikgPDwgIlRyeSB0byB3cml0ZSBzYW1wbGUgd2hlbiB8cGxheWVyX3N0YXRlX3wgaXMgIgogICAgICAgICAgICAgICAgICAgPDwgcGxheWVyX3N0YXRlXzsKKyAgICBkZWxldGUgZGF0YS5pbnB1dF9idWZmZXI7CiAgICAgLy8gUmV0dXJuIHRydWUgc28gdGhlIHBpcGVsaW5lIHdpbGwgY29udGludWUgcnVubmluZyB3aXRoIHRoZSBwYXJ0aWN1bGFyCiAgICAgLy8gY2FsbCBpZ25vcmVkLgogICAgIHJldHVybiB0cnVlOwogICB9CiAKICAgaWYgKGRhdGEuc2FtcGxlX3R5cGUgPT0ga1NiTWVkaWFUeXBlQXVkaW8pIHsKLSAgICBpZiAoYXVkaW9fcmVuZGVyZXJfLT5Jc0VuZE9mU3RyZWFtV3JpdHRlbigpKSB7Ci0gICAgICBTQl9MT0coV0FSTklORykgPDwgIlRyeSB0byB3cml0ZSBhdWRpbyBzYW1wbGUgYWZ0ZXIgRU9TIGlzIHJlYWNoZWQiOworICAgIFNCX0RDSEVDSyhwZW5kaW5nX2F1ZGlvX3NhbXBsZV8uaW5wdXRfYnVmZmVyID09IE5VTEwpOworICB9IGVsc2UgeworICAgIFNCX0RDSEVDSyhwZW5kaW5nX3ZpZGVvX3NhbXBsZV8uaW5wdXRfYnVmZmVyID09IE5VTEwpOworICB9CisgIGJvb2wgd3JpdHRlbjsKKyAgYm9vbCByZXN1bHQgPSBoYW5kbGVyXy0+UHJvY2Vzc1dyaXRlU2FtcGxlRXZlbnQoZGF0YSwgJndyaXR0ZW4pOworICBpZiAoIXdyaXR0ZW4gJiYgcmVzdWx0KSB7CisgICAgaWYgKGRhdGEuc2FtcGxlX3R5cGUgPT0ga1NiTWVkaWFUeXBlQXVkaW8pIHsKKyAgICAgIHBlbmRpbmdfYXVkaW9fc2FtcGxlXyA9IGRhdGE7CiAgICAgfSBlbHNlIHsKLSAgICAgIFNCX0RDSEVDSyhhdWRpb19yZW5kZXJlcl8tPkNhbkFjY2VwdE1vcmVEYXRhKCkpOwotCi0gICAgICBpZiAoZGF0YS5pbnB1dF9idWZmZXItPmRybV9pbmZvKCkpIHsKLSAgICAgICAgaWYgKCFTYkRybVN5c3RlbUlzVmFsaWQoZHJtX3N5c3RlbV8pKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkcm1fc3lzdGVtXy0+RGVjcnlwdChkYXRhLmlucHV0X2J1ZmZlcikgPT0KLSAgICAgICAgICAgIFNiRHJtU3lzdGVtUHJpdmF0ZTo6a1JldHJ5KSB7Ci0gICAgICAgICAgKnJldHJ5ID0gdHJ1ZTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYXVkaW9fcmVuZGVyZXJfLT5Xcml0ZVNhbXBsZSgqZGF0YS5pbnB1dF9idWZmZXIpOwotICAgICAgaWYgKGF1ZGlvX3JlbmRlcmVyXy0+Q2FuQWNjZXB0TW9yZURhdGEoKSkgewotICAgICAgICBhdWRpb19kZWNvZGVyX3N0YXRlXyA9IGtTYlBsYXllckRlY29kZXJTdGF0ZU5lZWRzRGF0YTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGF1ZGlvX2RlY29kZXJfc3RhdGVfID0ga1NiUGxheWVyRGVjb2RlclN0YXRlQnVmZmVyRnVsbDsKLSAgICAgIH0KLSAgICAgIFVwZGF0ZURlY29kZXJTdGF0ZShrU2JNZWRpYVR5cGVBdWRpbyk7CisgICAgICBwZW5kaW5nX3ZpZGVvX3NhbXBsZV8gPSBkYXRhOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBTQl9EQ0hFQ0soZGF0YS5zYW1wbGVfdHlwZSA9PSBrU2JNZWRpYVR5cGVWaWRlbyk7Ci0gICAgaWYgKHZpZGVvX3JlbmRlcmVyXy0+SXNFbmRPZlN0cmVhbVdyaXR0ZW4oKSkgewotICAgICAgU0JfTE9HKFdBUk5JTkcpIDw8ICJUcnkgdG8gd3JpdGUgdmlkZW8gc2FtcGxlIGFmdGVyIEVPUyBpcyByZWFjaGVkIjsKLSAgICB9IGVsc2UgewotICAgICAgU0JfRENIRUNLKHZpZGVvX3JlbmRlcmVyXy0+Q2FuQWNjZXB0TW9yZURhdGEoKSk7Ci0gICAgICBpZiAoZGF0YS5pbnB1dF9idWZmZXItPmRybV9pbmZvKCkpIHsKLSAgICAgICAgaWYgKCFTYkRybVN5c3RlbUlzVmFsaWQoZHJtX3N5c3RlbV8pKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkcm1fc3lzdGVtXy0+RGVjcnlwdChkYXRhLmlucHV0X2J1ZmZlcikgPT0KLSAgICAgICAgICAgIFNiRHJtU3lzdGVtUHJpdmF0ZTo6a1JldHJ5KSB7Ci0gICAgICAgICAgKnJldHJ5ID0gdHJ1ZTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdmlkZW9fcmVuZGVyZXJfLT5Xcml0ZVNhbXBsZSgqZGF0YS5pbnB1dF9idWZmZXIpOwotICAgICAgaWYgKHZpZGVvX3JlbmRlcmVyXy0+Q2FuQWNjZXB0TW9yZURhdGEoKSkgewotICAgICAgICB2aWRlb19kZWNvZGVyX3N0YXRlXyA9IGtTYlBsYXllckRlY29kZXJTdGF0ZU5lZWRzRGF0YTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZpZGVvX2RlY29kZXJfc3RhdGVfID0ga1NiUGxheWVyRGVjb2RlclN0YXRlQnVmZmVyRnVsbDsKLSAgICAgIH0KLSAgICAgIFVwZGF0ZURlY29kZXJTdGF0ZShrU2JNZWRpYVR5cGVWaWRlbyk7CisgICAgZGVsZXRlIGRhdGEuaW5wdXRfYnVmZmVyOworICAgIGlmIChyZXN1bHQpIHsKKyAgICAgIFVwZGF0ZURlY29kZXJTdGF0ZShkYXRhLnNhbXBsZV90eXBlLCBrU2JQbGF5ZXJEZWNvZGVyU3RhdGVOZWVkc0RhdGEpOwogICAgIH0KICAgfQotCi0gIGlmIChwbGF5ZXJfc3RhdGVfID09IGtTYlBsYXllclN0YXRlUHJlcm9sbGluZykgewotICAgIGlmICghYXVkaW9fcmVuZGVyZXJfLT5Jc1NlZWtpbmdJblByb2dyZXNzKCkgJiYKLSAgICAgICAgIXZpZGVvX3JlbmRlcmVyXy0+SXNTZWVraW5nSW5Qcm9ncmVzcygpKSB7Ci0gICAgICBVcGRhdGVQbGF5ZXJTdGF0ZShrU2JQbGF5ZXJTdGF0ZVByZXNlbnRpbmcpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOworICByZXR1cm4gcmVzdWx0OwogfQogCi1ib29sIFBsYXllcldvcmtlcjo6UHJvY2Vzc1dyaXRlRW5kT2ZTdHJlYW1FdmVudCgKLSAgICBjb25zdCBXcml0ZUVuZE9mU3RyZWFtRXZlbnREYXRhJiBkYXRhKSB7Citib29sIFBsYXllcldvcmtlcjo6RG9Xcml0ZUVuZE9mU3RyZWFtKGNvbnN0IFdyaXRlRW5kT2ZTdHJlYW1FdmVudERhdGEmIGRhdGEpIHsKICAgU0JfRENIRUNLKHBsYXllcl9zdGF0ZV8gIT0ga1NiUGxheWVyU3RhdGVEZXN0cm95ZWQpOwogCiAgIGlmIChwbGF5ZXJfc3RhdGVfID09IGtTYlBsYXllclN0YXRlSW5pdGlhbGl6ZWQgfHwKQEAgLTI3NywxMjQgKzIzOSw0NyBAQAogICB9CiAKICAgaWYgKGRhdGEuc3RyZWFtX3R5cGUgPT0ga1NiTWVkaWFUeXBlQXVkaW8pIHsKLSAgICBpZiAoYXVkaW9fcmVuZGVyZXJfLT5Jc0VuZE9mU3RyZWFtV3JpdHRlbigpKSB7Ci0gICAgICBTQl9MT0coV0FSTklORykgPDwgIlRyeSB0byB3cml0ZSBhdWRpbyBFT1MgYWZ0ZXIgRU9TIGlzIGVucXVldWVkIjsKLSAgICB9IGVsc2UgewotICAgICAgU0JfTE9HKElORk8pIDw8ICJBdWRpbyBFT1MgZW5xdWV1ZWQiOwotICAgICAgYXVkaW9fcmVuZGVyZXJfLT5Xcml0ZUVuZE9mU3RyZWFtKCk7Ci0gICAgfQotICAgIGF1ZGlvX2RlY29kZXJfc3RhdGVfID0ga1NiUGxheWVyRGVjb2RlclN0YXRlQnVmZmVyRnVsbDsKLSAgICBVcGRhdGVEZWNvZGVyU3RhdGUoa1NiTWVkaWFUeXBlQXVkaW8pOworICAgIFNCX0RDSEVDSyhwZW5kaW5nX2F1ZGlvX3NhbXBsZV8uaW5wdXRfYnVmZmVyID09IE5VTEwpOwogICB9IGVsc2UgewotICAgIGlmICh2aWRlb19yZW5kZXJlcl8tPklzRW5kT2ZTdHJlYW1Xcml0dGVuKCkpIHsKLSAgICAgIFNCX0xPRyhXQVJOSU5HKSA8PCAiVHJ5IHRvIHdyaXRlIHZpZGVvIEVPUyBhZnRlciBFT1MgaXMgZW5xdWV1ZWQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBTQl9MT0coSU5GTykgPDwgIlZpZGVvIEVPUyBlbnF1ZXVlZCI7Ci0gICAgICB2aWRlb19yZW5kZXJlcl8tPldyaXRlRW5kT2ZTdHJlYW0oKTsKLSAgICB9Ci0gICAgdmlkZW9fZGVjb2Rlcl9zdGF0ZV8gPSBrU2JQbGF5ZXJEZWNvZGVyU3RhdGVCdWZmZXJGdWxsOwotICAgIFVwZGF0ZURlY29kZXJTdGF0ZShrU2JNZWRpYVR5cGVWaWRlbyk7CisgICAgU0JfRENIRUNLKHBlbmRpbmdfdmlkZW9fc2FtcGxlXy5pbnB1dF9idWZmZXIgPT0gTlVMTCk7CiAgIH0KIAotICBpZiAocGxheWVyX3N0YXRlXyA9PSBrU2JQbGF5ZXJTdGF0ZVByZXJvbGxpbmcpIHsKLSAgICBpZiAoIWF1ZGlvX3JlbmRlcmVyXy0+SXNTZWVraW5nSW5Qcm9ncmVzcygpICYmCi0gICAgICAgICF2aWRlb19yZW5kZXJlcl8tPklzU2Vla2luZ0luUHJvZ3Jlc3MoKSkgewotICAgICAgVXBkYXRlUGxheWVyU3RhdGUoa1NiUGxheWVyU3RhdGVQcmVzZW50aW5nKTsKLSAgICB9Ci0gIH0KLQotICBpZiAocGxheWVyX3N0YXRlXyA9PSBrU2JQbGF5ZXJTdGF0ZVByZXNlbnRpbmcpIHsKLSAgICBpZiAoYXVkaW9fcmVuZGVyZXJfLT5Jc0VuZE9mU3RyZWFtUGxheWVkKCkgJiYKLSAgICAgICAgdmlkZW9fcmVuZGVyZXJfLT5Jc0VuZE9mU3RyZWFtUGxheWVkKCkpIHsKLSAgICAgIFVwZGF0ZVBsYXllclN0YXRlKGtTYlBsYXllclN0YXRlRW5kT2ZTdHJlYW0pOwotICAgIH0KKyAgaWYgKCFoYW5kbGVyXy0+UHJvY2Vzc1dyaXRlRW5kT2ZTdHJlYW1FdmVudChkYXRhKSkgeworICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFBsYXllcldvcmtlcjo6UHJvY2Vzc1NldFBhdXNlRXZlbnQoY29uc3QgU2V0UGF1c2VFdmVudERhdGEmIGRhdGEpIHsKLSAgLy8gVE9ETzogQ2hlY2sgdmFsaWQKLSAgcGF1c2VkXyA9IGRhdGEucGF1c2U7Ci0gIGlmIChkYXRhLnBhdXNlKSB7Ci0gICAgYXVkaW9fcmVuZGVyZXJfLT5QYXVzZSgpOwotICAgIFNCX0RMT0coSU5GTykgPDwgIlBsYXliYWNrIHBhdXNlZC4iOwotICB9IGVsc2UgewotICAgIGF1ZGlvX3JlbmRlcmVyXy0+UGxheSgpOwotICAgIFNCX0RMT0coSU5GTykgPDwgIlBsYXliYWNrIHN0YXJ0ZWQuIjsKK2Jvb2wgUGxheWVyV29ya2VyOjpEb1VwZGF0ZShjb25zdCBTZXRCb3VuZHNFdmVudERhdGEmIGRhdGEpIHsKKyAgaWYgKHBlbmRpbmdfYXVkaW9fc2FtcGxlXy5pbnB1dF9idWZmZXIgIT0gTlVMTCkgeworICAgIGlmICghRG9Xcml0ZVNhbXBsZShjb21tb246OlJlc2V0QW5kUmV0dXJuKCZwZW5kaW5nX2F1ZGlvX3NhbXBsZV8pKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgfQotCi0gIHJldHVybiB0cnVlOworICBpZiAocGVuZGluZ192aWRlb19zYW1wbGVfLmlucHV0X2J1ZmZlciAhPSBOVUxMKSB7CisgICAgaWYgKCFEb1dyaXRlU2FtcGxlKGNvbW1vbjo6UmVzZXRBbmRSZXR1cm4oJnBlbmRpbmdfdmlkZW9fc2FtcGxlXykpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiBoYW5kbGVyXy0+UHJvY2Vzc1VwZGF0ZUV2ZW50KGRhdGEpOwogfQogCi1ib29sIFBsYXllcldvcmtlcjo6UHJvY2Vzc1VwZGF0ZUV2ZW50KGNvbnN0IFNldEJvdW5kc0V2ZW50RGF0YSYgYm91bmRzKSB7Ci0gIFNCX0RDSEVDSyhwbGF5ZXJfc3RhdGVfICE9IGtTYlBsYXllclN0YXRlRGVzdHJveWVkKTsKK3ZvaWQgUGxheWVyV29ya2VyOjpEb1N0b3AoKSB7CisgIGhhbmRsZXJfLT5Qcm9jZXNzU3RvcEV2ZW50KCk7CiAKLSAgaWYgKHBsYXllcl9zdGF0ZV8gPT0ga1NiUGxheWVyU3RhdGVQcmVyb2xsaW5nIHx8Ci0gICAgICBwbGF5ZXJfc3RhdGVfID09IGtTYlBsYXllclN0YXRlUHJlc2VudGluZykgewotICAgIGlmIChhdWRpb19yZW5kZXJlcl8tPklzRW5kT2ZTdHJlYW1QbGF5ZWQoKSAmJgotICAgICAgICB2aWRlb19yZW5kZXJlcl8tPklzRW5kT2ZTdHJlYW1QbGF5ZWQoKSkgewotICAgICAgVXBkYXRlUGxheWVyU3RhdGUoa1NiUGxheWVyU3RhdGVFbmRPZlN0cmVhbSk7Ci0gICAgfQotCi0gICAgY29uc3QgVmlkZW9GcmFtZSYgZnJhbWUgPQotICAgICAgICB2aWRlb19yZW5kZXJlcl8tPkdldEN1cnJlbnRGcmFtZShhdWRpb19yZW5kZXJlcl8tPkdldEN1cnJlbnRUaW1lKCkpOwotI2lmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKLSAgICBzaGFyZWQ6OnN0YXJib2FyZDo6QXBwbGljYXRpb246OkdldCgpLT5IYW5kbGVGcmFtZSgKLSAgICAgICAgcGxheWVyXywgZnJhbWUsIGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLSNlbmRpZiAgLy8gU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQotCi0gICAgaWYgKGF1ZGlvX2RlY29kZXJfc3RhdGVfID09IGtTYlBsYXllckRlY29kZXJTdGF0ZUJ1ZmZlckZ1bGwgJiYKLSAgICAgICAgYXVkaW9fcmVuZGVyZXJfLT5DYW5BY2NlcHRNb3JlRGF0YSgpKSB7Ci0gICAgICBhdWRpb19kZWNvZGVyX3N0YXRlXyA9IGtTYlBsYXllckRlY29kZXJTdGF0ZU5lZWRzRGF0YTsKLSAgICAgIFVwZGF0ZURlY29kZXJTdGF0ZShrU2JNZWRpYVR5cGVBdWRpbyk7Ci0gICAgfQotICAgIGlmICh2aWRlb19kZWNvZGVyX3N0YXRlXyA9PSBrU2JQbGF5ZXJEZWNvZGVyU3RhdGVCdWZmZXJGdWxsICYmCi0gICAgICAgIHZpZGVvX3JlbmRlcmVyXy0+Q2FuQWNjZXB0TW9yZURhdGEoKSkgewotICAgICAgdmlkZW9fZGVjb2Rlcl9zdGF0ZV8gPSBrU2JQbGF5ZXJEZWNvZGVyU3RhdGVOZWVkc0RhdGE7Ci0gICAgICBVcGRhdGVEZWNvZGVyU3RhdGUoa1NiTWVkaWFUeXBlVmlkZW8pOwotICAgIH0KLQotICAgIGhvc3RfLT5VcGRhdGVNZWRpYVRpbWUoYXVkaW9fcmVuZGVyZXJfLT5HZXRDdXJyZW50VGltZSgpLCB0aWNrZXRfKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFBsYXllcldvcmtlcjo6UHJvY2Vzc1N0b3BFdmVudCgpIHsKLSAgZGVsZXRlIGF1ZGlvX3JlbmRlcmVyXzsKLSAgYXVkaW9fcmVuZGVyZXJfID0gTlVMTDsKLSAgZGVsZXRlIHZpZGVvX3JlbmRlcmVyXzsKLSAgdmlkZW9fcmVuZGVyZXJfID0gTlVMTDsKLSNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCi0gIC8vIENsZWFyIHRoZSB2aWRlbyBmcmFtZSBhcyB3ZSB0ZXJtaW5hdGUuCi0gIHNoYXJlZDo6c3RhcmJvYXJkOjpBcHBsaWNhdGlvbjo6R2V0KCktPkhhbmRsZUZyYW1lKHBsYXllcl8sIFZpZGVvRnJhbWUoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCk7Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKICAgVXBkYXRlUGxheWVyU3RhdGUoa1NiUGxheWVyU3RhdGVEZXN0cm95ZWQpOwogfQogCi12b2lkIFBsYXllcldvcmtlcjo6VXBkYXRlRGVjb2RlclN0YXRlKFNiTWVkaWFUeXBlIHR5cGUpIHsKK3ZvaWQgUGxheWVyV29ya2VyOjpVcGRhdGVEZWNvZGVyU3RhdGUoU2JNZWRpYVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJEZWNvZGVyU3RhdGUgc3RhdGUpIHsKKyAgU0JfRENIRUNLKHR5cGUgPT0ga1NiTWVkaWFUeXBlQXVkaW8gfHwgdHlwZSA9PSBrU2JNZWRpYVR5cGVWaWRlbyk7CisKICAgaWYgKCFkZWNvZGVyX3N0YXR1c19mdW5jXykgewogICAgIHJldHVybjsKICAgfQotICBTQl9EQ0hFQ0sodHlwZSA9PSBrU2JNZWRpYVR5cGVBdWRpbyB8fCB0eXBlID09IGtTYk1lZGlhVHlwZVZpZGVvKTsKLSAgZGVjb2Rlcl9zdGF0dXNfZnVuY18oCi0gICAgICBwbGF5ZXJfLCBjb250ZXh0XywgdHlwZSwKLSAgICAgIHR5cGUgPT0ga1NiTWVkaWFUeXBlQXVkaW8gPyBhdWRpb19kZWNvZGVyX3N0YXRlXyA6IHZpZGVvX2RlY29kZXJfc3RhdGVfLAotICAgICAgdGlja2V0Xyk7Ci19CiAKLXZvaWQgUGxheWVyV29ya2VyOjpVcGRhdGVQbGF5ZXJTdGF0ZShTYlBsYXllclN0YXRlIHBsYXllcl9zdGF0ZSkgewotICBpZiAoIXBsYXllcl9zdGF0dXNfZnVuY18pIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwbGF5ZXJfc3RhdGVfID0gcGxheWVyX3N0YXRlOwotICBpZiAocGxheWVyX3N0YXRlID09IGtTYlBsYXllclN0YXRlUHJlc2VudGluZyAmJiAhcGF1c2VkXykgewotICAgIGF1ZGlvX3JlbmRlcmVyXy0+UGxheSgpOwotICB9Ci0gIHBsYXllcl9zdGF0dXNfZnVuY18ocGxheWVyXywgY29udGV4dF8sIHBsYXllcl9zdGF0ZV8sIHRpY2tldF8pOworICBkZWNvZGVyX3N0YXR1c19mdW5jXyhwbGF5ZXJfLCBjb250ZXh0XywgdHlwZSwgc3RhdGUsIHRpY2tldF8pOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgcGxheWVyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oCmluZGV4IDg0MzgwNmYuLmQ4YmJiNzAgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oCkBAIC0xNSwxMyArMTUsMTMgQEAKICNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX1BMQVlFUl9XT1JLRVJfSF8KICNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX1BMQVlFUl9XT1JLRVJfSF8KIAorI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbWVkaWEuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvcGxheWVyLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3F1ZXVlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKQEAgLTMxLDYgKzMxLDEyIEBACiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBwbGF5ZXIgewogCisvLyBUaGlzIGNsYXNzIGNyZWF0ZXMgYSB0aHJlYWQgdGhhdCBleGVjdXRlcyBldmVudHMgcG9zdGVkIHRvIGFuIGludGVybmFsbHkKKy8vIGNyZWF0ZWQgcXVldWUuIFRoaXMgZ3VhcmFudGVlcyB0aGF0IGFsbCBzdWNoIGV2ZW50cyBhcmUgcHJvY2Vzc2VkIG9uIHRoZSBzYW1lCisvLyB0aHJlYWQuCisvLworLy8gVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgdGhlIGJhc2UgY2xhc3MgZm9yIHBsYXRmb3JtIHNwZWNpZmljIFBsYXllcldvcmtlcnMgc28KKy8vIHRoZXkgbmVlZG4ndCBtYWludGFpbiB0aGUgdGhyZWFkIGFuZCBxdWV1ZSBpbnRlcm5hbGx5LgogY2xhc3MgUGxheWVyV29ya2VyIHsKICBwdWJsaWM6CiAgIGNsYXNzIEhvc3QgewpAQCAtNzgsNiArODQsOSBAQAogICAgICAga1N0b3AsCiAgICAgfTsKIAorICAgIC8vIFRPRE86IE5vIGxvbmdlciB1c2UgYSB1bmlvbiBzbyBpbmRpdmlkdWFsIG1lbWJlcnMgY2FuIGhhdmUgbm9uIHRyaXZpYWwKKyAgICAvLyBjdG9yIGFuZCBXcml0ZVNhbXBsZUV2ZW50RGF0YTo6aW5wdXRfYnVmZmVyIG5vIGxvbmdlciBoYXMgdG8gYmUgYQorICAgIC8vIHBvaW50ZXIuCiAgICAgdW5pb24gRGF0YSB7CiAgICAgICBTZWVrRXZlbnREYXRhIHNlZWs7CiAgICAgICBXcml0ZVNhbXBsZUV2ZW50RGF0YSB3cml0ZV9zYW1wbGU7CkBAIC0xMTYsNjMgKzEyNSw5MCBAQAogICAgIERhdGEgZGF0YTsKICAgfTsKIAotICBzdGF0aWMgY29uc3QgU2JUaW1lIGtVcGRhdGVJbnRlcnZhbCA9IDUgKiBrU2JUaW1lTWlsbGlzZWNvbmQ7CisgIGNsYXNzIEhhbmRsZXIgeworICAgcHVibGljOgorICAgIHR5cGVkZWYgdm9pZCAoUGxheWVyV29ya2VyOjoqVXBkYXRlTWVkaWFUaW1lQ0IpKFNiTWVkaWFUaW1lIG1lZGlhX3RpbWUpOworICAgIHR5cGVkZWYgU2JQbGF5ZXJTdGF0ZSAoUGxheWVyV29ya2VyOjoqR2V0UGxheWVyU3RhdGVDQikoKSBjb25zdDsKKyAgICB0eXBlZGVmIHZvaWQgKFBsYXllcldvcmtlcjo6KlVwZGF0ZVBsYXllclN0YXRlQ0IpKAorICAgICAgICBTYlBsYXllclN0YXRlIHBsYXllcl9zdGF0ZSk7CisKKyAgICB0eXBlZGVmIFBsYXllcldvcmtlcjo6U2Vla0V2ZW50RGF0YSBTZWVrRXZlbnREYXRhOworICAgIHR5cGVkZWYgUGxheWVyV29ya2VyOjpXcml0ZVNhbXBsZUV2ZW50RGF0YSBXcml0ZVNhbXBsZUV2ZW50RGF0YTsKKyAgICB0eXBlZGVmIFBsYXllcldvcmtlcjo6V3JpdGVFbmRPZlN0cmVhbUV2ZW50RGF0YSBXcml0ZUVuZE9mU3RyZWFtRXZlbnREYXRhOworICAgIHR5cGVkZWYgUGxheWVyV29ya2VyOjpTZXRQYXVzZUV2ZW50RGF0YSBTZXRQYXVzZUV2ZW50RGF0YTsKKyAgICB0eXBlZGVmIFBsYXllcldvcmtlcjo6U2V0Qm91bmRzRXZlbnREYXRhIFNldEJvdW5kc0V2ZW50RGF0YTsKKworICAgIHZpcnR1YWwgfkhhbmRsZXIoKSB7fQorCisgICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbmNlIGluc2lkZSBQbGF5ZXJXb3JrZXIncyBjdG9yIHRvIHNldHVwIHRoZQorICAgIC8vIGNhbGxiYWNrcyByZXF1aXJlZCBieSB0aGUgSGFuZGxlci4KKyAgICB2aXJ0dWFsIHZvaWQgU2V0dXAoUGxheWVyV29ya2VyKiBwbGF5ZXJfd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICBTYlBsYXllciBwbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZU1lZGlhVGltZUNCIHVwZGF0ZV9tZWRpYV90aW1lX2NiLAorICAgICAgICAgICAgICAgICAgICAgICBHZXRQbGF5ZXJTdGF0ZUNCIGdldF9wbGF5ZXJfc3RhdGVfY2IsCisgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVBsYXllclN0YXRlQ0IgdXBkYXRlX3BsYXllcl9zdGF0ZV9jYikgPSAwOworCisgICAgLy8gQWxsIHRoZSBQcm9jZXNzKiBmdW5jdGlvbnMgcmV0dXJuIGZhbHNlIHRvIHNpZ25hbCBhIGZhdGFsIGVycm9yLiAgVGhlCisgICAgLy8gZXZlbnQgcHJvY2Vzc2luZyBsb29wIGluIFBsYXllcldvcmtlciB3aWxsIHRlcm1pbWF0ZSBpbiB0aGlzIGNhc2UuCisgICAgdmlydHVhbCBib29sIFByb2Nlc3NJbml0RXZlbnQoKSA9IDA7CisgICAgdmlydHVhbCBib29sIFByb2Nlc3NTZWVrRXZlbnQoY29uc3QgU2Vla0V2ZW50RGF0YSYgZGF0YSkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBQcm9jZXNzV3JpdGVTYW1wbGVFdmVudChjb25zdCBXcml0ZVNhbXBsZUV2ZW50RGF0YSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd3JpdHRlbikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBQcm9jZXNzV3JpdGVFbmRPZlN0cmVhbUV2ZW50KAorICAgICAgICBjb25zdCBXcml0ZUVuZE9mU3RyZWFtRXZlbnREYXRhJiBkYXRhKSA9IDA7CisgICAgdmlydHVhbCBib29sIFByb2Nlc3NTZXRQYXVzZUV2ZW50KGNvbnN0IFNldFBhdXNlRXZlbnREYXRhJiBkYXRhKSA9IDA7CisgICAgdmlydHVhbCBib29sIFByb2Nlc3NVcGRhdGVFdmVudChjb25zdCBTZXRCb3VuZHNFdmVudERhdGEmIGRhdGEpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgUHJvY2Vzc1N0b3BFdmVudCgpID0gMDsKKyAgfTsKIAogICBQbGF5ZXJXb3JrZXIoSG9zdCogaG9zdCwKLSAgICAgICAgICAgICAgIFNiV2luZG93IHdpbmRvdywKLSAgICAgICAgICAgICAgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjLAotICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCi0gICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAotICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIsCisgICAgICAgICAgICAgICBzY29wZWRfcHRyPEhhbmRsZXI+IGhhbmRsZXIsCiAgICAgICAgICAgICAgICBTYlBsYXllckRlY29kZXJTdGF0dXNGdW5jIGRlY29kZXJfc3RhdHVzX2Z1bmMsCiAgICAgICAgICAgICAgICBTYlBsYXllclN0YXR1c0Z1bmMgcGxheWVyX3N0YXR1c19mdW5jLAogICAgICAgICAgICAgICAgU2JQbGF5ZXIgcGxheWVyLAorICAgICAgICAgICAgICAgU2JUaW1lIHVwZGF0ZV9pbnRlcnZhbCwKICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQpOwotICB+UGxheWVyV29ya2VyKCk7CisgIHZpcnR1YWwgflBsYXllcldvcmtlcigpOwogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBFdmVudERhdGE+CiAgIHZvaWQgRW5xdWV1ZUV2ZW50KGNvbnN0IEV2ZW50RGF0YSYgZXZlbnRfZGF0YSkgeworICAgIFNCX0RDSEVDSyhTYlRocmVhZElzVmFsaWQodGhyZWFkXykpOwogICAgIHF1ZXVlXy5QdXQobmV3IEV2ZW50KGV2ZW50X2RhdGEpKTsKICAgfQogCiAgcHJpdmF0ZToKKyAgdm9pZCBVcGRhdGVNZWRpYVRpbWUoU2JNZWRpYVRpbWUgdGltZSk7CisKKyAgU2JQbGF5ZXJTdGF0ZSBwbGF5ZXJfc3RhdGUoKSBjb25zdCB7IHJldHVybiBwbGF5ZXJfc3RhdGVfOyB9CisgIHZvaWQgVXBkYXRlUGxheWVyU3RhdGUoU2JQbGF5ZXJTdGF0ZSBwbGF5ZXJfc3RhdGUpOworCiAgIHN0YXRpYyB2b2lkKiBUaHJlYWRFbnRyeVBvaW50KHZvaWQqIGNvbnRleHQpOwogICB2b2lkIFJ1bkxvb3AoKTsKKyAgYm9vbCBEb0luaXQoKTsKKyAgYm9vbCBEb1NlZWsoY29uc3QgU2Vla0V2ZW50RGF0YSYgZGF0YSk7CisgIGJvb2wgRG9Xcml0ZVNhbXBsZShjb25zdCBXcml0ZVNhbXBsZUV2ZW50RGF0YSYgZGF0YSk7CisgIGJvb2wgRG9Xcml0ZUVuZE9mU3RyZWFtKGNvbnN0IFdyaXRlRW5kT2ZTdHJlYW1FdmVudERhdGEmIGRhdGEpOworICBib29sIERvVXBkYXRlKGNvbnN0IFNldEJvdW5kc0V2ZW50RGF0YSYgZGF0YSk7CisgIHZvaWQgRG9TdG9wKCk7CiAKLSAgYm9vbCBQcm9jZXNzSW5pdEV2ZW50KCk7Ci0gIGJvb2wgUHJvY2Vzc1NlZWtFdmVudChjb25zdCBTZWVrRXZlbnREYXRhJiBkYXRhKTsKLSAgYm9vbCBQcm9jZXNzV3JpdGVTYW1wbGVFdmVudChjb25zdCBXcml0ZVNhbXBsZUV2ZW50RGF0YSYgZGF0YSwgYm9vbCogcmV0cnkpOwotICBib29sIFByb2Nlc3NXcml0ZUVuZE9mU3RyZWFtRXZlbnQoY29uc3QgV3JpdGVFbmRPZlN0cmVhbUV2ZW50RGF0YSYgZGF0YSk7Ci0gIGJvb2wgUHJvY2Vzc1NldFBhdXNlRXZlbnQoY29uc3QgU2V0UGF1c2VFdmVudERhdGEmIGRhdGEpOwotICBib29sIFByb2Nlc3NVcGRhdGVFdmVudChjb25zdCBTZXRCb3VuZHNFdmVudERhdGEmIGJvdW5kcyk7Ci0gIHZvaWQgUHJvY2Vzc1N0b3BFdmVudCgpOwotCi0gIHZvaWQgVXBkYXRlRGVjb2RlclN0YXRlKFNiTWVkaWFUeXBlIHR5cGUpOwotICB2b2lkIFVwZGF0ZVBsYXllclN0YXRlKFNiUGxheWVyU3RhdGUgcGxheWVyX3N0YXRlKTsKKyAgdm9pZCBVcGRhdGVEZWNvZGVyU3RhdGUoU2JNZWRpYVR5cGUgdHlwZSwgU2JQbGF5ZXJEZWNvZGVyU3RhdGUgc3RhdGUpOwogCiAgIFNiVGhyZWFkIHRocmVhZF87CiAgIFF1ZXVlPEV2ZW50Kj4gcXVldWVfOwogCiAgIEhvc3QqIGhvc3RfOworICBzY29wZWRfcHRyPEhhbmRsZXI+IGhhbmRsZXJfOwogCi0gIFNiV2luZG93IHdpbmRvd187Ci0gIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjXzsKLSAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWNfOwotICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtXzsKLSAgU2JNZWRpYUF1ZGlvSGVhZGVyIGF1ZGlvX2hlYWRlcl87CiAgIFNiUGxheWVyRGVjb2RlclN0YXR1c0Z1bmMgZGVjb2Rlcl9zdGF0dXNfZnVuY187CiAgIFNiUGxheWVyU3RhdHVzRnVuYyBwbGF5ZXJfc3RhdHVzX2Z1bmNfOwogICBTYlBsYXllciBwbGF5ZXJfOwogICB2b2lkKiBjb250ZXh0XzsKLQotICBBdWRpb1JlbmRlcmVyKiBhdWRpb19yZW5kZXJlcl87Ci0gIFZpZGVvUmVuZGVyZXIqIHZpZGVvX3JlbmRlcmVyXzsKLSAgU2JQbGF5ZXJEZWNvZGVyU3RhdGUgYXVkaW9fZGVjb2Rlcl9zdGF0ZV87Ci0gIFNiUGxheWVyRGVjb2RlclN0YXRlIHZpZGVvX2RlY29kZXJfc3RhdGVfOwotCi0gIGJvb2wgcGF1c2VkXzsKICAgaW50IHRpY2tldF87CisKICAgU2JQbGF5ZXJTdGF0ZSBwbGF5ZXJfc3RhdGVfOworICBjb25zdCBTYlRpbWUgdXBkYXRlX2ludGVydmFsXzsKKyAgV3JpdGVTYW1wbGVFdmVudERhdGEgcGVuZGluZ19hdWRpb19zYW1wbGVfOworICBXcml0ZVNhbXBsZUV2ZW50RGF0YSBwZW5kaW5nX3ZpZGVvX3NhbXBsZV87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgcGxheWVyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZC5neXAgYi9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZC5neXAKaW5kZXggMDg2ZWU0YS4uYTc2NDY3YSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zdGFyYm9hcmQuZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvc3RhcmJvYXJkLmd5cApAQCAtNTgsNiArNTgsOSBAQAogICAgICAgICAndXNlci5oJywKICAgICAgICAgJ3dpbmRvdy5oJywKICAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnY29tbW9uL2NvbW1vbi5neXA6Y29tbW9uJywKKyAgICAgIF0sCiAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgWydzdGFyYm9hcmRfcGF0aCA9PSAiIicsIHsKICAgICAgICAgICAjIFRPRE86IE1ha2Ugc3RhcmJvYXJkX3BhdGggcmVxdWlyZWQuIFRoaXMgbGVnYWN5IGNvbmRpdGlvbiBpcyBvbmx5CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3N0dWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDlhOGM2NGYuLjk5YjY0ZGYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC00MjAsOCArNDIwLDE5IEBACiAKIC8vIC0tLSBUdW5lYWJsZSBQYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBTcGVjaWZpZXMgdGhlIG5ldHdvcmsgcmVjZWl2ZSBidWZmZXIgc2l6ZS4KLSNkZWZpbmUgU0JfTkVUV09SS19SRUNFSVZFX0JVRkZFUl9TSVpFICgxNiAqIDEwMjQpCisvLyBTcGVjaWZpZXMgdGhlIG5ldHdvcmsgcmVjZWl2ZSBidWZmZXIgc2l6ZSBpbiBieXRlcywgc2V0IHZpYQorLy8gU2JTb2NrZXRTZXRSZWNlaXZlQnVmZmVyU2l6ZSgpLgorLy8KKy8vIFNldHRpbmcgdGhpcyB0byAwIGluZGljYXRlcyB0aGF0IFNiU29ja2V0U2V0UmVjZWl2ZUJ1ZmZlclNpemUoKSBzaG91bGQKKy8vIG5vdCBiZSBjYWxsZWQuIFVzZSB0aGlzIGZvciBPU3MgKHN1Y2ggYXMgTGludXgpIHdoZXJlIHJlY2VpdmUgYnVmZmVyCisvLyBhdXRvLXR1bmluZyBpcyBiZXR0ZXIuCisvLworLy8gT24gc29tZSBwbGF0Zm9ybXMsIHRoaXMgbWF5IGFmZmVjdCBtYXggVENQIHdpbmRvdyBzaXplIHdoaWNoIG1heQorLy8gZHJhbWF0aWNhbGx5IGFmZmVjdCB0aHJvdWdocHV0IGluIHRoZSBwcmVzZW5jZSBvZiBsYXRlbmN5LgorLy8KKy8vIElmIHlvdXIgcGxhdGZvcm0gZG9lcyBub3QgaGF2ZSBhIGdvb2QgVENQIGF1dG8tdHVuaW5nIG1lY2hhbmlzbSwKKy8vIGEgc2V0dGluZyBvZiAoMTI4ICogMTAyNCkgaGVyZSBpcyByZWNvbW1lbmRlZC4KKyNkZWZpbmUgU0JfTkVUV09SS19SRUNFSVZFX0JVRkZFUl9TSVpFICgwKQogCiAvLyAtLS0gVXNlciBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dsbS9nbG0vZGV0YWlsL19mZWF0dXJlcy5ocHAgYi9zcmMvdGhpcmRfcGFydHkvZ2xtL2dsbS9kZXRhaWwvX2ZlYXR1cmVzLmhwcAppbmRleCA5N2RkNjMzLi5iMTcwMWU1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvZ2xtL2dsbS9kZXRhaWwvX2ZlYXR1cmVzLmhwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ2xtL2dsbS9kZXRhaWwvX2ZlYXR1cmVzLmhwcApAQCAtMjU2LDE0MyArMjU2LDE0MyBAQAogIwllbmRpZgogCiAjZWxpZihHTE1fQ09NUElMRVIgJiBHTE1fQ09NUElMRVJfQ0xBTkcpCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X2V4Y2VwdGlvbnMpKQorIwlpZihHTE1fSEFTX0ZFQVRVUkUoY3h4X2V4Y2VwdGlvbnMpKQogIwkJZGVmaW5lIEdMTV9DWFg5OF9FWENFUFRJT05TCiAjCWVuZGlmCiAKLSMJaWYoX19oYXNfZmVhdHVyZShjeHhfcnR0aSkpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfcnR0aSkpCiAjCQlkZWZpbmUgR0xNX0NYWDk4X1JUVEkKICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF9hY2Nlc3NfY29udHJvbF9zZmluYWUpKQorIwlpZihHTE1fSEFTX0ZFQVRVUkUoY3h4X2FjY2Vzc19jb250cm9sX3NmaW5hZSkpCiAjCQlkZWZpbmUgR0xNX0NYWDExX0FDQ0VTU19DT05UUk9MX1NGSU5BRQogIwllbmRpZgogCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X2FsaWFzX3RlbXBsYXRlcykpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfYWxpYXNfdGVtcGxhdGVzKSkKICMJCWRlZmluZSBHTE1fQ1hYMTFfQUxJQVNfVEVNUExBVEUKICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF9hbGlnbmFzKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF9hbGlnbmFzKSkKICMJCWRlZmluZSBHTE1fQ1hYMTFfQUxJR05BUwogIwllbmRpZgogCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X2F0dHJpYnV0ZXMpKQorIwlpZihHTE1fSEFTX0ZFQVRVUkUoY3h4X2F0dHJpYnV0ZXMpKQogIwkJZGVmaW5lIEdMTV9DWFgxMV9BVFRSSUJVVEVTCiAjCWVuZGlmCiAKLSMJaWYoX19oYXNfZmVhdHVyZShjeHhfY29uc3RleHByKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF9jb25zdGV4cHIpKQogIwkJZGVmaW5lIEdMTV9DWFgxMV9DT05TVEVYUFIKICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF9kZWNsdHlwZSkpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfZGVjbHR5cGUpKQogIwkJZGVmaW5lIEdMTV9DWFgxMV9ERUNMVFlQRQogIwllbmRpZgogCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X2RlZmF1bHRfZnVuY3Rpb25fdGVtcGxhdGVfYXJncykpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfZGVmYXVsdF9mdW5jdGlvbl90ZW1wbGF0ZV9hcmdzKSkKICMJCWRlZmluZSBHTE1fQ1hYMTFfREVGQVVMVF9GVU5DVElPTl9URU1QTEFURV9BUkdTCiAjCWVuZGlmCiAKLSMJaWYoX19oYXNfZmVhdHVyZShjeHhfZGVmYXVsdGVkX2Z1bmN0aW9ucykpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfZGVmYXVsdGVkX2Z1bmN0aW9ucykpCiAjCQlkZWZpbmUgR0xNX0NYWDExX0RFRkFVTFRFRF9GVU5DVElPTlMKICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF9kZWxlZ2F0aW5nX2NvbnN0cnVjdG9ycykpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfZGVsZWdhdGluZ19jb25zdHJ1Y3RvcnMpKQogIwkJZGVmaW5lIEdMTV9DWFgxMV9ERUxFR0FUSU5HX0NPTlNUUlVDVE9SUwogIwllbmRpZgogCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X2RlbGV0ZWRfZnVuY3Rpb25zKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF9kZWxldGVkX2Z1bmN0aW9ucykpCiAjCQlkZWZpbmUgR0xNX0NYWDExX0RFTEVURURfRlVOQ1RJT05TCiAjCWVuZGlmCiAKLSMJaWYoX19oYXNfZmVhdHVyZShjeHhfZXhwbGljaXRfY29udmVyc2lvbnMpKQorIwlpZihHTE1fSEFTX0ZFQVRVUkUoY3h4X2V4cGxpY2l0X2NvbnZlcnNpb25zKSkKICMJCWRlZmluZSBHTE1fQ1hYMTFfRVhQTElDSVRfQ09OVkVSU0lPTlMKICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF9nZW5lcmFsaXplZF9pbml0aWFsaXplcnMpKQorIwlpZihHTE1fSEFTX0ZFQVRVUkUoY3h4X2dlbmVyYWxpemVkX2luaXRpYWxpemVycykpCiAjCQlkZWZpbmUgR0xNX0NYWDExX0dFTkVSQUxJWkVEX0lOSVRJQUxJWkVSUwogIwllbmRpZgogCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X2ltcGxpY2l0X21vdmVzKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF9pbXBsaWNpdF9tb3ZlcykpCiAjCQlkZWZpbmUgR0xNX0NYWDExX0lNUExJQ0lUX01PVkVTCiAjCWVuZGlmCiAKLSMJaWYoX19oYXNfZmVhdHVyZShjeHhfaW5oZXJpdGluZ19jb25zdHJ1Y3RvcnMpKQorIwlpZihHTE1fSEFTX0ZFQVRVUkUoY3h4X2luaGVyaXRpbmdfY29uc3RydWN0b3JzKSkKICMJCWRlZmluZSBHTE1fQ1hYMTFfSU5IRVJJVElOR19DT05TVFJVQ1RPUlMKICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF9pbmxpbmVfbmFtZXNwYWNlcykpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfaW5saW5lX25hbWVzcGFjZXMpKQogIwkJZGVmaW5lIEdMTV9DWFgxMV9JTkxJTkVfTkFNRVNQQUNFUwogIwllbmRpZgogCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X2xhbWJkYXMpKQorIwlpZihHTE1fSEFTX0ZFQVRVUkUoY3h4X2xhbWJkYXMpKQogIwkJZGVmaW5lIEdMTV9DWFgxMV9MQU1CREFTCiAjCWVuZGlmCiAKLSMJaWYoX19oYXNfZmVhdHVyZShjeHhfbG9jYWxfdHlwZV90ZW1wbGF0ZV9hcmdzKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF9sb2NhbF90eXBlX3RlbXBsYXRlX2FyZ3MpKQogIwkJZGVmaW5lIEdMTV9DWFgxMV9MT0NBTF9UWVBFX1RFTVBMQVRFX0FSR1MKICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF9ub2V4Y2VwdCkpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfbm9leGNlcHQpKQogIwkJZGVmaW5lIEdMTV9DWFgxMV9OT0VYQ0VQVAogIwllbmRpZgogCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X25vbnN0YXRpY19tZW1iZXJfaW5pdCkpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfbm9uc3RhdGljX21lbWJlcl9pbml0KSkKICMJCWRlZmluZSBHTE1fQ1hYMTFfTk9OU1RBVElDX01FTUJFUl9JTklUCiAjCWVuZGlmCiAKLSMJaWYoX19oYXNfZmVhdHVyZShjeHhfbnVsbHB0cikpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfbnVsbHB0cikpCiAjCQlkZWZpbmUgR0xNX0NYWDExX05VTExQVFIKICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF9vdmVycmlkZV9jb250cm9sKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF9vdmVycmlkZV9jb250cm9sKSkKICMJCWRlZmluZSBHTE1fQ1hYMTFfT1ZFUlJJREVfQ09OVFJPTAogIwllbmRpZgogCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X3JlZmVyZW5jZV9xdWFsaWZpZWRfZnVuY3Rpb25zKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF9yZWZlcmVuY2VfcXVhbGlmaWVkX2Z1bmN0aW9ucykpCiAjCQlkZWZpbmUgR0xNX0NYWDExX1JFRkVSRU5DRV9RVUFMSUZJRURfRlVOQ1RJT05TCiAjCWVuZGlmCiAKLSMJaWYoX19oYXNfZmVhdHVyZShjeHhfcmFuZ2VfZm9yKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF9yYW5nZV9mb3IpKQogIwkJZGVmaW5lIEdMTV9DWFgxMV9SQU5HRV9GT1IKICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF9yYXdfc3RyaW5nX2xpdGVyYWxzKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF9yYXdfc3RyaW5nX2xpdGVyYWxzKSkKICMJCWRlZmluZSBHTE1fQ1hYMTFfUkFXX1NUUklOR19MSVRFUkFMUwogIwllbmRpZgogCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X3J2YWx1ZV9yZWZlcmVuY2VzKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF9ydmFsdWVfcmVmZXJlbmNlcykpCiAjCQlkZWZpbmUgR0xNX0NYWDExX1JWQUxVRV9SRUZFUkVOQ0VTCiAjCWVuZGlmCiAKLSMJaWYoX19oYXNfZmVhdHVyZShjeHhfc3RhdGljX2Fzc2VydCkpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfc3RhdGljX2Fzc2VydCkpCiAjCQlkZWZpbmUgR0xNX0NYWDExX1NUQVRJQ19BU1NFUlQKICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF9hdXRvX3R5cGUpKQorIwlpZihHTE1fSEFTX0ZFQVRVUkUoY3h4X2F1dG9fdHlwZSkpCiAjCQlkZWZpbmUgR0xNX0NYWDExX0FVVE9fVFlQRQogIwllbmRpZgogCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X3N0cm9uZ19lbnVtcykpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfc3Ryb25nX2VudW1zKSkKICMJCWRlZmluZSBHTE1fQ1hYMTFfU1RST05HX0VOVU1TCiAjCWVuZGlmCiAKLSMJaWYoX19oYXNfZmVhdHVyZShjeHhfdHJhaWxpbmdfcmV0dXJuKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF90cmFpbGluZ19yZXR1cm4pKQogIwkJZGVmaW5lIEdMTV9DWFgxMV9UUkFJTElOR19SRVRVUk4KICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF91bmljb2RlX2xpdGVyYWxzKSkKKyMJaWYoR0xNX0hBU19GRUFUVVJFKGN4eF91bmljb2RlX2xpdGVyYWxzKSkKICMJCWRlZmluZSBHTE1fQ1hYMTFfVU5JQ09ERV9MSVRFUkFMUwogIwllbmRpZgogCi0jCWlmKF9faGFzX2ZlYXR1cmUoY3h4X3VucmVzdHJpY3RlZF91bmlvbnMpKQorIwlpZihHTE1fSEFTX0ZFQVRVUkUoY3h4X3VucmVzdHJpY3RlZF91bmlvbnMpKQogIwkJZGVmaW5lIEdMTV9DWFgxMV9VTlJFU1RSSUNURURfVU5JT05TCiAjCWVuZGlmCiAKLSMJaWYoX19oYXNfZmVhdHVyZShjeHhfdXNlcl9saXRlcmFscykpCisjCWlmKEdMTV9IQVNfRkVBVFVSRShjeHhfdXNlcl9saXRlcmFscykpCiAjCQlkZWZpbmUgR0xNX0NYWDExX1VTRVJfTElURVJBTFMKICMJZW5kaWYKIAotIwlpZihfX2hhc19mZWF0dXJlKGN4eF92YXJpYWRpY190ZW1wbGF0ZXMpKQorIwlpZihHTE1fSEFTX0ZFQVRVUkUoY3h4X3ZhcmlhZGljX3RlbXBsYXRlcykpCiAjCQlkZWZpbmUgR0xNX0NYWDExX1ZBUklBRElDX1RFTVBMQVRFUwogIwllbmRpZgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ2xtL2dsbS9kZXRhaWwvc2V0dXAuaHBwIGIvc3JjL3RoaXJkX3BhcnR5L2dsbS9nbG0vZGV0YWlsL3NldHVwLmhwcAppbmRleCA1MWM3YzFhLi4wZDUyNGIyIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvZ2xtL2dsbS9kZXRhaWwvc2V0dXAuaHBwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nbG0vZ2xtL2RldGFpbC9zZXR1cC5ocHAKQEAgLTc0OCw4ICs3NDgsMTAgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBjb3VudG9mCiAKLSNpZm5kZWYgX19oYXNfZmVhdHVyZQotIwlkZWZpbmUgX19oYXNfZmVhdHVyZSh4KSAwIC8vIENvbXBhdGliaWxpdHkgd2l0aCBub24tY2xhbmcgY29tcGlsZXJzLgorI2lmZGVmIF9faGFzX2ZlYXR1cmUKKyMJZGVmaW5lIEdMTV9IQVNfRkVBVFVSRSBfX2hhc19mZWF0dXJlCisjZWxzZQorIwlkZWZpbmUgR0xNX0hBU19GRUFUVVJFKHgpIDAgLy8gQ29tcGF0aWJpbGl0eSB3aXRoIG5vbi1jbGFuZyBjb21waWxlcnMuCiAjZW5kaWYKIAogI2lmIEdMTV9IQVNfQ09OU1RFWFBSX1BBUlRJQUwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nbG0vZ2xtL2RldGFpbC90eXBlX3ZlYzEuaHBwIGIvc3JjL3RoaXJkX3BhcnR5L2dsbS9nbG0vZGV0YWlsL3R5cGVfdmVjMS5ocHAKaW5kZXggZGQ2NzNhNy4uZWNjY2Q4MSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2dsbS9nbG0vZGV0YWlsL3R5cGVfdmVjMS5ocHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dsbS9nbG0vZGV0YWlsL3R5cGVfdmVjMS5ocHAKQEAgLTM3LDYgKzM3LDEwIEBACiAjCQkJCXByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZ251LWFub255bW91cy1zdHJ1Y3QiCiAjCQkJCXByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbmVzdGVkLWFub24tdHlwZXMiCiAjCQkJZW5kaWYKKyMJCQlpZiBHTE1fQ09NUElMRVIgJiBHTE1fQ09NUElMRVJfVkMKKyMJCQkJcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMJCQkJcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQyMDEpCisjCQkJZW5kaWYKIAkJCiAJCQl1bmlvbgogCQkJewpAQCAtNTcsNiArNjEsOSBAQAogIwkJCQllbmRpZi8vR0xNX1NXSVpaTEUqLwogCQkJfTsKIAkJCisjCQkJaWYgR0xNX0NPTVBJTEVSICYgR0xNX0NPTVBJTEVSX1ZDCisjCQkJCXByYWdtYSB3YXJuaW5nKHBvcCkKKyMJCQllbmRpZgogIwkJCWlmIEdMTV9DT01QSUxFUiAmIEdMTV9DT01QSUxFUl9DTEFORwogIwkJCQlwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKICMJCQllbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dsbS9nbG0vZGV0YWlsL3R5cGVfdmVjMi5ocHAgYi9zcmMvdGhpcmRfcGFydHkvZ2xtL2dsbS9kZXRhaWwvdHlwZV92ZWMyLmhwcAppbmRleCA5YTllZjQyLi42MTkwODYxIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvZ2xtL2dsbS9kZXRhaWwvdHlwZV92ZWMyLmhwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ2xtL2dsbS9kZXRhaWwvdHlwZV92ZWMyLmhwcApAQCAtMzYsNiArMzYsMTAgQEAKICMJCQkJcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdnbnUtYW5vbnltb3VzLXN0cnVjdCIKICMJCQkJcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVduZXN0ZWQtYW5vbi10eXBlcyIKICMJCQllbmRpZgorIwkJCWlmIEdMTV9DT01QSUxFUiAmIEdMTV9DT01QSUxFUl9WQworIwkJCQlwcmFnbWEgd2FybmluZyhwdXNoKQorIwkJCQlwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDIwMSkKKyMJCQllbmRpZgogCQkKIAkJCXVuaW9uCiAJCQl7CkBAIC01Nyw2ICs2MSw5IEBACiAKIAkJCX07CiAJCQorIwkJCWlmIEdMTV9DT01QSUxFUiAmIEdMTV9DT01QSUxFUl9WQworIwkJCQlwcmFnbWEgd2FybmluZyhwb3ApCisjCQkJZW5kaWYKICMJCQlpZiBHTE1fQ09NUElMRVIgJiBHTE1fQ09NUElMRVJfQ0xBTkcKICMJCQkJcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCiAjCQkJZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9nbG0vZ2xtL2RldGFpbC90eXBlX3ZlYzMuaHBwIGIvc3JjL3RoaXJkX3BhcnR5L2dsbS9nbG0vZGV0YWlsL3R5cGVfdmVjMy5ocHAKaW5kZXggZWJkMTM1ZC4uZDA1MjE5NiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2dsbS9nbG0vZGV0YWlsL3R5cGVfdmVjMy5ocHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2dsbS9nbG0vZGV0YWlsL3R5cGVfdmVjMy5ocHAKQEAgLTM2LDYgKzM2LDEwIEBACiAjCQkJCXByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZ251LWFub255bW91cy1zdHJ1Y3QiCiAjCQkJCXByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbmVzdGVkLWFub24tdHlwZXMiCiAjCQkJZW5kaWYKKyMJCQlpZiBHTE1fQ09NUElMRVIgJiBHTE1fQ09NUElMRVJfVkMKKyMJCQkJcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMJCQkJcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQyMDEpCisjCQkJZW5kaWYKIAogCQkJdW5pb24KIAkJCXsKQEAgLTU2LDYgKzYwLDkgQEAKICMJCQkJZW5kaWYvL0dMTV9TV0laWkxFCiAJCQl9OwogCQkKKyMJCQlpZiBHTE1fQ09NUElMRVIgJiBHTE1fQ09NUElMRVJfVkMKKyMJCQkJcHJhZ21hIHdhcm5pbmcocG9wKQorIwkJCWVuZGlmCiAjCQkJaWYgR0xNX0NPTVBJTEVSICYgR0xNX0NPTVBJTEVSX0NMQU5HCiAjCQkJCXByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAogIwkJCWVuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvZ2xtL2dsbS9kZXRhaWwvdHlwZV92ZWM0LmhwcCBiL3NyYy90aGlyZF9wYXJ0eS9nbG0vZ2xtL2RldGFpbC90eXBlX3ZlYzQuaHBwCmluZGV4IDVhMDNjZDQuLmE5MjM4NTMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9nbG0vZ2xtL2RldGFpbC90eXBlX3ZlYzQuaHBwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9nbG0vZ2xtL2RldGFpbC90eXBlX3ZlYzQuaHBwCkBAIC0zNiw2ICszNiwxMCBAQAogIwkJCQlwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2dudS1hbm9ueW1vdXMtc3RydWN0IgogIwkJCQlwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV25lc3RlZC1hbm9uLXR5cGVzIgogIwkJCWVuZGlmCisjCQkJaWYgR0xNX0NPTVBJTEVSICYgR0xNX0NPTVBJTEVSX1ZDCisjCQkJCXByYWdtYSB3YXJuaW5nKHB1c2gpCisjCQkJCXByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MjAxKQorIwkJCWVuZGlmCiAJCQogCQkJdW5pb24KIAkJCXsKQEAgLTU4LDYgKzYyLDkgQEAKICMJCQkJZW5kaWYvL0dMTV9TV0laWkxFCiAJCQl9OwogCisjCQkJaWYgR0xNX0NPTVBJTEVSICYgR0xNX0NPTVBJTEVSX1ZDCisjCQkJCXByYWdtYSB3YXJuaW5nKHBvcCkKKyMJCQllbmRpZgogIwkJCWlmIEdMTV9DT01QSUxFUiAmIEdMTV9DT01QSUxFUl9DTEFORwogIwkJCQlwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKICMJCQllbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2dsbS9nbG0vZ3RjL3F1YXRlcm5pb24uaHBwIGIvc3JjL3RoaXJkX3BhcnR5L2dsbS9nbG0vZ3RjL3F1YXRlcm5pb24uaHBwCmluZGV4IDcyZDA2MDMuLjNmNThkMTQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9nbG0vZ2xtL2d0Yy9xdWF0ZXJuaW9uLmhwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvZ2xtL2dsbS9ndGMvcXVhdGVybmlvbi5ocHAKQEAgLTUwLDYgKzUwLDEwIEBACiAjCQkJCXByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZ251LWFub255bW91cy1zdHJ1Y3QiCiAjCQkJCXByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbmVzdGVkLWFub24tdHlwZXMiCiAjCQkJZW5kaWYKKyMJCQlpZiBHTE1fQ09NUElMRVIgJiBHTE1fQ09NUElMRVJfVkMKKyMJCQkJcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMJCQkJcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQyMDEpCisjCQkJZW5kaWYKIAkJCiAJCQl1bmlvbgogCQkJewpAQCAtNTcsNiArNjEsOSBAQAogCQkJCXR5cGVuYW1lIGRldGFpbDo6c3RvcmFnZTxULCBzaXplb2YoVCkgKiA0LCBkZXRhaWw6OmlzX2FsaWduZWQ8UD46OnZhbHVlPjo6dHlwZSBkYXRhOwogCQkJfTsKIAkJCisjCQkJaWYgR0xNX0NPTVBJTEVSICYgR0xNX0NPTVBJTEVSX1ZDCisjCQkJCXByYWdtYSB3YXJuaW5nKHBvcCkKKyMJCQllbmRpZgogIwkJCWlmIEdMTV9DT01QSUxFUiAmIEdMTV9DT01QSUxFUl9DTEFORwogIwkJCQlwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKICMJCQllbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L21vempzL2pzL3NyYy9tZW1vcnlfYWxsb2NhdG9yX3JlcG9ydGVyLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvbWVtb3J5X2FsbG9jYXRvcl9yZXBvcnRlci5jcHAKaW5kZXggOTNkNDJkZi4uOWI4NzliYiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L21vempzL2pzL3NyYy9tZW1vcnlfYWxsb2NhdG9yX3JlcG9ydGVyLmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvbW96anMvanMvc3JjL21lbW9yeV9hbGxvY2F0b3JfcmVwb3J0ZXIuY3BwCkBAIC0yNSw3ICsyNSw3IEBACiAgIHNfaW5zdGFuY2UgPSBuZXcgTWVtb3J5QWxsb2NhdG9yUmVwb3J0ZXIoKTsKIH0KIAotdm9pZCogT2Zmc2V0UG9pbnRlcih2b2lkKiBiYXNlLCBzc2l6ZV90IG9mZnNldCkgewordm9pZCogT2Zmc2V0UG9pbnRlcih2b2lkKiBiYXNlLCBpbnQ2NF90IG9mZnNldCkgewogICB1aW50cHRyX3QgYmFzZV9hc19pbnQgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oYmFzZSk7CiAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihiYXNlX2FzX2ludCArIG9mZnNldCk7CiB9CkBAIC0zOCwxNyArMzgsMTcgQEAKIAogICAvLyBUaGUgbWV0YWRhdGEgbGl2ZXMganVzdCBpbiBmcm9udCBvZiB0aGUgZGF0YS4KICAgdm9pZCogbWV0YV9hZGRyID0KLSAgICAgIE9mZnNldFBvaW50ZXIocHRyLCAtc3RhdGljX2Nhc3Q8c3NpemVfdD4oc2l6ZW9mKEFsbG9jYXRpb25NZXRhZGF0YSkpKTsKKyAgICAgIE9mZnNldFBvaW50ZXIocHRyLCAtc3RhdGljX2Nhc3Q8aW50NjRfdD4oc2l6ZW9mKEFsbG9jYXRpb25NZXRhZGF0YSkpKTsKICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QWxsb2NhdGlvbk1ldGFkYXRhKj4obWV0YV9hZGRyKTsKIH0KIAogdm9pZCogQWxsb2NhdGlvbk1ldGFkYXRhOjpHZXRVc2VyQWRkcmVzc0Zyb21CYXNlQWRkcmVzcyh2b2lkKiBiYXNlX3B0cikgewogICB2b2lkKiBhZGp1c3RlZF9iYXNlID0KLSAgICAgIE9mZnNldFBvaW50ZXIoYmFzZV9wdHIsIHN0YXRpY19jYXN0PHNzaXplX3Q+KHNpemVvZihBbGxvY2F0aW9uTWV0YWRhdGEpKSk7CisgICAgICBPZmZzZXRQb2ludGVyKGJhc2VfcHRyLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihzaXplb2YoQWxsb2NhdGlvbk1ldGFkYXRhKSkpOwogICByZXR1cm4gYWRqdXN0ZWRfYmFzZTsKIH0KIAotdm9pZCBBbGxvY2F0aW9uTWV0YWRhdGE6OlNldFNpemVUb0Jhc2VBZGRyZXNzKHZvaWQqIGJhc2VfcHRyLCBzaXplX3Qgc2l6ZSkgewordm9pZCBBbGxvY2F0aW9uTWV0YWRhdGE6OlNldFNpemVUb0Jhc2VBZGRyZXNzKHZvaWQqIGJhc2VfcHRyLCBpbnQ2NF90IHNpemUpIHsKICAgaWYgKGJhc2VfcHRyKSB7CiAgICAgQWxsb2NhdGlvbk1ldGFkYXRhKiBtZXRhZGF0YSA9CiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QWxsb2NhdGlvbk1ldGFkYXRhKj4oYmFzZV9wdHIpOwpAQCAtNTYsMjIgKzU2LDIyIEBACiAgIH0KIH0KIAotdm9pZCBNZW1vcnlBbGxvY2F0b3JSZXBvcnRlcjo6VXBkYXRlQWxsb2NhdGVkQnl0ZXMoc3NpemVfdCBieXRlcykgewordm9pZCBNZW1vcnlBbGxvY2F0b3JSZXBvcnRlcjo6VXBkYXRlQWxsb2NhdGVkQnl0ZXMoaW50NjRfdCBieXRlcykgewogICBzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayhtdXRleF8pOwogICBjdXJyZW50X2J5dGVzX2FsbG9jYXRlZF8gKz0gYnl0ZXM7CiB9CiAKLXNzaXplX3QgTWVtb3J5QWxsb2NhdG9yUmVwb3J0ZXI6OkdldEN1cnJlbnRCeXRlc0FsbG9jYXRlZCgpIHsKK2ludDY0X3QgTWVtb3J5QWxsb2NhdG9yUmVwb3J0ZXI6OkdldEN1cnJlbnRCeXRlc0FsbG9jYXRlZCgpIHsKICAgc3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKICAgcmV0dXJuIGN1cnJlbnRfYnl0ZXNfYWxsb2NhdGVkXzsKIH0KIAotdm9pZCBNZW1vcnlBbGxvY2F0b3JSZXBvcnRlcjo6VXBkYXRlTWFwcGVkQnl0ZXMoc3NpemVfdCBieXRlcykgewordm9pZCBNZW1vcnlBbGxvY2F0b3JSZXBvcnRlcjo6VXBkYXRlTWFwcGVkQnl0ZXMoaW50NjRfdCBieXRlcykgewogICBzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayhtdXRleF8pOwogICBjdXJyZW50X2J5dGVzX21hcHBlZF8gKz0gYnl0ZXM7CiB9CiAKLXNzaXplX3QgTWVtb3J5QWxsb2NhdG9yUmVwb3J0ZXI6OkdldEN1cnJlbnRCeXRlc01hcHBlZCgpIHsKK2ludDY0X3QgTWVtb3J5QWxsb2NhdG9yUmVwb3J0ZXI6OkdldEN1cnJlbnRCeXRlc01hcHBlZCgpIHsKICAgc3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKICAgcmV0dXJuIGN1cnJlbnRfYnl0ZXNfbWFwcGVkXzsKIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvbWVtb3J5X2FsbG9jYXRvcl9yZXBvcnRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L21vempzL2pzL3NyYy9tZW1vcnlfYWxsb2NhdG9yX3JlcG9ydGVyLmgKaW5kZXggZTBkNjc5Zi4uODIyMjdlMyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L21vempzL2pzL3NyYy9tZW1vcnlfYWxsb2NhdG9yX3JlcG9ydGVyLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L21vempzL2pzL3NyYy9tZW1vcnlfYWxsb2NhdG9yX3JlcG9ydGVyLmgKQEAgLTE1LDI4ICsxNSwyNyBAQAogI2lmbmRlZiBNZW1vcnlBbGxvY2F0b3JSZXBvcnRlcl9oCiAjZGVmaW5lIE1lbW9yeUFsbG9jYXRvclJlcG9ydGVyX2gKIAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCiAjaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCiAKIGNsYXNzIEFsbG9jYXRpb25NZXRhZGF0YSB7CiAgcHVibGljOgogICBzdGF0aWMgQWxsb2NhdGlvbk1ldGFkYXRhKiBHZXRNZXRhZGF0YUZyb21Vc2VyQWRkcmVzcyh2b2lkKiBwdHIpOwogICBzdGF0aWMgdm9pZCogR2V0VXNlckFkZHJlc3NGcm9tQmFzZUFkZHJlc3Modm9pZCogYmFzZV9wdHIpOwotICBzdGF0aWMgc2l6ZV90IEdldFJlc2VydmF0aW9uQnl0ZXMoc2l6ZV90IGJ5dGVzX3JlcXVlc3RlZCkgeworICBzdGF0aWMgaW50NjRfdCBHZXRSZXNlcnZhdGlvbkJ5dGVzKGludDY0X3QgYnl0ZXNfcmVxdWVzdGVkKSB7CiAgICAgcmV0dXJuIHNpemVvZihBbGxvY2F0aW9uTWV0YWRhdGEpICsgYnl0ZXNfcmVxdWVzdGVkOwogICB9Ci0gIHN0YXRpYyBzaXplX3QgR2V0U2l6ZU9mQWxsb2NhdGlvbkZyb21NZXRhZGF0YShBbGxvY2F0aW9uTWV0YWRhdGEqIG1ldGFkYXRhKSB7CisgIHN0YXRpYyBpbnQ2NF90IEdldFNpemVPZkFsbG9jYXRpb25Gcm9tTWV0YWRhdGEoQWxsb2NhdGlvbk1ldGFkYXRhKiBtZXRhZGF0YSkgewogICAgIHJldHVybiBtZXRhZGF0YSA/IG1ldGFkYXRhLT5zaXplX3JlcXVlc3RlZCgpIDogMDsKICAgfQotICBzdGF0aWMgdm9pZCBTZXRTaXplVG9CYXNlQWRkcmVzcyh2b2lkKiBiYXNlX3B0ciwgc2l6ZV90IHNpemUpOworICBzdGF0aWMgdm9pZCBTZXRTaXplVG9CYXNlQWRkcmVzcyh2b2lkKiBiYXNlX3B0ciwgaW50NjRfdCBzaXplKTsKIAotICBzaXplX3Qgc2l6ZV9yZXF1ZXN0ZWQoKSB7IHJldHVybiBzaXplX3JlcXVlc3RlZF87IH0KLSAgdm9pZCBzZXRfc2l6ZV9yZXF1ZXN0ZWQoc2l6ZV90IHNpemUpIHsgc2l6ZV9yZXF1ZXN0ZWRfID0gc2l6ZTsgfQorICBpbnQ2NF90IHNpemVfcmVxdWVzdGVkKCkgeyByZXR1cm4gc2l6ZV9yZXF1ZXN0ZWRfOyB9CisgIHZvaWQgc2V0X3NpemVfcmVxdWVzdGVkKGludDY0X3Qgc2l6ZSkgeyBzaXplX3JlcXVlc3RlZF8gPSBzaXplOyB9CiAKICBwcml2YXRlOgogICAvLyBCeXRlcyByZXF1ZXN0ZWQgYnkgdGhlIHVuZGVybHlpbmcgYWxsb2NhdG9yLgotICBzaXplX3Qgc2l6ZV9yZXF1ZXN0ZWRfOworICBpbnQ2NF90IHNpemVfcmVxdWVzdGVkXzsKIH07CiAKIC8vIFJlcG9ydGVyIHRoYXQgaXMgdXNlZCB0byByZXBvcnQgbWVtb3J5IGFsbG9jYXRpb24uCkBAIC00NywxNiArNDYsMTYgQEAKICAgTWVtb3J5QWxsb2NhdG9yUmVwb3J0ZXIoKQogICAgICAgOiBjdXJyZW50X2J5dGVzX2FsbG9jYXRlZF8oMCksIGN1cnJlbnRfYnl0ZXNfbWFwcGVkXygwKSB7fQogCi0gIHZvaWQgVXBkYXRlQWxsb2NhdGVkQnl0ZXMoc3NpemVfdCBieXRlcyk7Ci0gIHNzaXplX3QgR2V0Q3VycmVudEJ5dGVzQWxsb2NhdGVkKCk7CisgIHZvaWQgVXBkYXRlQWxsb2NhdGVkQnl0ZXMoaW50NjRfdCBieXRlcyk7CisgIGludDY0X3QgR2V0Q3VycmVudEJ5dGVzQWxsb2NhdGVkKCk7CiAKLSAgdm9pZCBVcGRhdGVNYXBwZWRCeXRlcyhzc2l6ZV90IGJ5dGVzKTsKLSAgc3NpemVfdCBHZXRDdXJyZW50Qnl0ZXNNYXBwZWQoKTsKKyAgdm9pZCBVcGRhdGVNYXBwZWRCeXRlcyhpbnQ2NF90IGJ5dGVzKTsKKyAgaW50NjRfdCBHZXRDdXJyZW50Qnl0ZXNNYXBwZWQoKTsKIAogIHByaXZhdGU6CiAgIHN0YXJib2FyZDo6TXV0ZXggbXV0ZXhfOwotICBzc2l6ZV90IGN1cnJlbnRfYnl0ZXNfYWxsb2NhdGVkXzsKLSAgc3NpemVfdCBjdXJyZW50X2J5dGVzX21hcHBlZF87CisgIGludDY0X3QgY3VycmVudF9ieXRlc19hbGxvY2F0ZWRfOworICBpbnQ2NF90IGN1cnJlbnRfYnl0ZXNfbWFwcGVkXzsKIH07CiAKICNlbmRpZiAvKiBNZW1vcnlBbGxvY2F0b3JSZXBvcnRlcl9oICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbW96anMvanMvc3JjL3ZtL1RocmVhZFBvb2wuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L21vempzL2pzL3NyYy92bS9UaHJlYWRQb29sLmNwcAppbmRleCBhZjg4YmJjLi43MGU3NGZhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbW96anMvanMvc3JjL3ZtL1RocmVhZFBvb2wuY3BwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvdm0vVGhyZWFkUG9vbC5jcHAKQEAgLTEyMyw4ICsxMjMsMjEgQEAKICAgICAvLyB2YXJpYWJsZSBhbmQgZ2l2ZSBhIDEwayBidWZmZXIuICBJcyB0aGVyZSBhIGJldHRlciB3YXk/CiAgICAgLy8gKE5vdGU6IDJrIHByb3ZlZCB0byBiZSBmaW5lIG9uIE1hYywgYnV0IHRvbyBsaXR0bGUgb24gTGludXgpCiAgICAgdWludHB0cl90IHN0YWNrTGltaXRPZmZzZXQgPSBXT1JLRVJfVEhSRUFEX1NUQUNLX1NJWkUgLSAxMCoxMDI0OworCisgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHJlc3VsdHMgaW4gYW4gaW50ZXJuYWwgY29tcGlsZXIgZXJyb3Igd2hlbiBjb21waWxpbmcKKyAgICAvLyB3aXRoIEdDQyA0LjkuMiBmb3IgdGhlIE1JUFMgYXJjaGl0ZWN0dXJlIHdpdGggb3B0aW1pemF0aW9ucyBlbmFibGVkLgorICAgIC8vIEEgdm9sYXRpbGUgcXVhbGlmaWVyIGlzIGFkZGVkIGFzIGEgd29ya2Fyb3VuZCwgYXMgaXQgZGlzYWJsZXMgdGhvc2UKKyAgICAvLyBvcHRpbWl6YXRpb25zLgorI2lmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gOSAmJiBfX0dOVUNfUEFUQ0hMRVZFTF9fID09IDIgJiYgXAorICAgIGRlZmluZWQoX01JUFNfQVJDSCkgJiYgX19taXBzMTYgPT0gMQorICAgIHZvbGF0aWxlIHVpbnRwdHJfdCBzdGFja0xpbWl0Vm9sYXRpbGUgPQorICAgICAgICAoKCh1aW50cHRyX3QpJnN0YWNrTGltaXRPZmZzZXQpICsKKyAgICAgICAgICBzdGFja0xpbWl0T2Zmc2V0ICogSlNfU1RBQ0tfR1JPV1RIX0RJUkVDVElPTik7CisgICAgdWludHB0cl90IHN0YWNrTGltaXQgPSBzdGFja0xpbWl0Vm9sYXRpbGU7CisjZWxzZSAgLy8gR0NDIDQuOS4yLCBtaXBzLCBtaXBzMTYKICAgICB1aW50cHRyX3Qgc3RhY2tMaW1pdCA9ICgoKHVpbnRwdHJfdCkmc3RhY2tMaW1pdE9mZnNldCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja0xpbWl0T2Zmc2V0ICogSlNfU1RBQ0tfR1JPV1RIX0RJUkVDVElPTik7CisjZW5kaWYgIC8vIEdDQyA0LjkuMiwgbWlwcywgbWlwczE2CiAKICAgICBBdXRvTG9ja01vbml0b3IgbG9jaygqdGhpcyk7CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9DSEFOR0VTLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9DSEFOR0VTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzdmODY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0NIQU5HRVMudHh0CkBAIC0wLDAgKzEsNDcwIEBACisyMDExLTA1LTAxIHZlcnNpb24gMi40LjE6CisKKyAgQysrCisgICogRml4ZWQgdGhlIGZyZW5kc2hpcCBwcm9ibGVtIGZvciBvbGQgY29tcGlsZXJzIHRvIG1ha2UgdGhlIGxpYnJhcnkgbm93IGdjYyAzCisgICAgY29tcGF0aWJsZSBhZ2Fpbi4KKyAgKiBGaXhlZCB2Y3Byb2plY3RzL2V4dHJhY3RfaW5jbHVkZXMuYmF0IHRvIGV4dHJhY3QgY29tcGlsZXIvcGx1Z2luLmguCisKKyAgSmF2YQorICAqIFJlbW92ZWQgdXNhZ2VzIG9mIEpESyAxLjYgb25seSBmZWF0dXJlcyB0byBtYWtlIHRoZSBsaWJyYXJ5IG5vdyBKREsgMS41CisgICAgY29tcGF0aWJsZSBhZ2Fpbi4KKyAgKiBGaXhlZCBhIGJ1ZyBhYm91dCBuZWdhdGl2ZSBlbnVtIHZhbHVlcy4KKyAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIG5vdyBkZWZpbmVkIGluIGdlbmVyYXRlZCBtZXNzYWdlcyBmb3IgamF2YSBzZXJpYWxpemluZy4KKyAgKiBGaXhlZCBwcm90b2MgdG8gdXNlIGphdmEubGFuZy5PYmplY3QsIHdoaWNoIG1ha2VzICJPYmplY3QiIG5vdyBhIHZhbGlkCisgICAgbWVzc2FnZSBuYW1lIGFnYWluLgorCisgIFB5dGhvbgorICAqIEV4cGVyaW1lbnRhbCBDKysgaW1wbGVtZW50YXRpb24gbm93IHJlcXVpcmVzIEMrKyBwcm90b2J1ZiBsaWJyYXJ5IGluc3RhbGxlZC4KKyAgICBTZWUgdGhlIFJFQURNRS50eHQgaW4gdGhlIHB5dGhvbiBkaXJlY3RvcnkgZm9yIGRldGFpbHMuCisKKzIwMTEtMDItMDIgdmVyc2lvbiAyLjQuMDoKKworICBHZW5lcmFsCisgICogVGhlIFJQQyAoY2N8amF2YXxweSlfZ2VuZXJpY19zZXJ2aWNlcyBkZWZhdWx0IHZhbHVlIGlzIG5vdyBmYWxzZSBpbnN0ZWFkIG9mCisgICAgdHJ1ZS4KKyAgKiBDdXN0b20gb3B0aW9ucyBjYW4gaGF2ZSBhZ2dyZWdhdGUgdHlwZXMuIEZvciBleGFtcGxlLAorICAgICAgbWVzc2FnZSBNeU9wdGlvbiB7CisgICAgICAgIG9wdGlvbmFsIHN0cmluZyBjb21tZW50ID0gMTsKKyAgICAgICAgb3B0aW9uYWwgc3RyaW5nIGF1dGhvciA9IDI7CisgICAgICB9CisgICAgICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyB7CisgICAgICAgIG9wdGlvbmFsIE15T3B0aW9uIG15b3B0aW9uID0gMTIzNDU7CisgICAgICB9CisgICAgVGhpcyBvcHRpb24gY2FuIG5vdyBiZSBzZXQgYXMgZm9sbG93czoKKyAgICAgIG1lc3NhZ2UgU29tZVR5cGUgeworICAgICAgICBvcHRpb25hbCBpbnQzMiBmaWVsZCA9IDEgWyhteW9wdGlvbikgPSB7IGNvbW1lbnQ6J3gnIGF1dGhvcjoneScgfV07CisgICAgICB9CisKKyAgQysrCisgICogVmFyaW91cyBzcGVlZCBhbmQgY29kZSBzaXplIG9wdGltaXphdGlvbnMuCisgICogQWRkZWQgYSByZWxlYXNlX2ZvbygpIG1ldGhvZCBvbiBzdHJpbmcgYW5kIG1lc3NhZ2UgZmllbGRzLgorICAqIEZpeGVkIGd6aXBfb3V0cHV0X3N0cmVhbSBzdWItc3RyZWFtIGhhbmRsaW5nLgorCisgIEphdmEKKyAgKiBCdWlsZGVycyBub3cgbWFpbnRhaW4gc3ViLWJ1aWxkZXJzIGZvciBzdWItbWVzc2FnZXMuIFVzZSBnZXRGb29CdWlsZGVyKCkgdG8KKyAgICBnZXQgdGhlIGJ1aWxkZXIgZm9yIHRoZSBzdWItbWVzc2FnZSAiZm9vIi4gVGhpcyBhbGxvd3MgeW91IHRvIHJlcGVhdGVkbHkKKyAgICBtb2RpZnkgZGVlcGx5LW5lc3RlZCBzdWItbWVzc2FnZXMgd2l0aG91dCByZWJ1aWxkaW5nIHRoZW0uCisgICogQnVpbGRlci5idWlsZCgpIG5vIGxvbmdlciBpbnZhbGlkYXRlcyB0aGUgQnVpbGRlciBmb3IgZ2VuZXJhdGVkIG1lc3NhZ2VzCisgICAgKFlvdSBtYXkgY29udGludWUgdG8gbW9kaWZ5IGl0IGFuZCB0aGVuIGJ1aWxkIGFub3RoZXIgbWVzc2FnZSkuCisgICogQ29kZSBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBlZmZpY2llbnQgZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkKKyAgICBpbXBsZW1lbnRhdGlvbnMgaWYgbmV3IG9wdGlvbiBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCBpcyBlbmFibGVkLgorICAgIChPdGhlcndpc2UsIHJlZmxlY3Rpb24tYmFzZWQgaW1wbGVtZW50YXRpb25zIGFyZSB1c2VkLikKKyAgKiBHZW5lcmF0ZWQgbWVzc2FnZXMgbm93IGltcGxlbWVudCBTZXJpYWxpemFibGUuCisgICogRmllbGRzIHdpdGggW2RlcHJlY2F0ZWQ9dHJ1ZV0gd2lsbCBiZSBtYXJrZWQgd2l0aCBARGVwcmVjYXRlZCBpbiBKYXZhLgorICAqIEFkZGVkIGxhenkgY29udmVyc2lvbiBvZiBVVEYtOCBlbmNvZGVkIHN0cmluZ3MgdG8gU3RyaW5nIG9iamVjdHMgdG8gaW1wcm92ZQorICAgIHBlcmZvcm1hbmNlLgorICAqIFZhcmlvdXMgb3B0aW1pemF0aW9ucy4KKyAgKiBFbnVtIHZhbHVlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgaW5zdGVhZCBvZiBjYWxsaW5nIGdldE51bWJlcigpIG9uIHRoZQorICAgIGVudW0gbWVtYmVyLgorICAqIEZvciBlYWNoIGVudW0gdmFsdWUsIGFuIGludGVnZXIgY29uc3RhbnQgaXMgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0aGUgc3VmZml4CisgICAgX1ZBTFVFLgorCisgIFB5dGhvbgorICAqIEFkZGVkIGFuIGV4cGVyaW1lbnRhbCAgQysrIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24gbWVzc2FnZXMgdmlhIGEgUHl0aG9uCisgICAgZXh0ZW5zaW9uLiBJbXBsZW1lbnRhdGlvbiB0eXBlIGlzIGNvbnRyb2xsZWQgYnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICBQUk9UT0NPTF9CVUZGRVJTX1BZVEhPTl9JTVBMRU1FTlRBVElPTiAodmFsaWQgdmFsdWVzOiAiY3BwIiBhbmQgInB5dGhvbiIpCisgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgY3VycmVudGx5ICJweXRob24iIGJ1dCB3aWxsIGJlIGNoYW5nZWQgdG8gImNwcCIgaW4KKyAgICBmdXR1cmUgcmVsZWFzZS4KKyAgKiBJbXByb3ZlZCBwZXJmb3JtYW5jZSBvbiBtZXNzYWdlIGluc3RhbnRpYXRpb24gc2lnbmlmaWNhbnRseS4KKyAgICBNb3N0IG9mIHRoZSB3b3JrIG9uIG1lc3NhZ2UgaW5zdGFudGlhdGlvbiBpcyBkb25lIGp1c3Qgb25jZSBwZXIgbWVzc2FnZQorICAgIGNsYXNzLCBpbnN0ZWFkIG9mIG9uY2UgcGVyIG1lc3NhZ2UgaW5zdGFuY2UuCisgICogSW1wcm92ZWQgcGVyZm9ybWFuY2Ugb24gdGV4dCBtZXNzYWdlIHBhcnNpbmcuCisgICogQWxsb3cgYWRkKCkgdG8gZm9yd2FyZCBrZXl3b3JkIGFyZ3VtZW50cyB0byB0aGUgY29uY3JldGUgY2xhc3MuCisgICAgICBFLmcuIGluc3RlYWQgb2YKKyAgICAgICAgaXRlbSA9IHJlcGVhdGVkX2ZpZWxkLmFkZCgpCisgICAgICAgIGl0ZW0uZm9vID0gYmFyCisgICAgICAgIGl0ZW0uYmF6ID0gcXV1eAorICAgICAgWW91IGNhbiBkbzoKKyAgICAgICAgcmVwZWF0ZWRfZmllbGQuYWRkKGZvbz1iYXIsIGJhej1xdXV4KQorICAqIEFkZGVkIGEgc29ydCgpIGludGVyZmFjZSB0byB0aGUgQmFzZUNvbnRhaW5lci4KKyAgKiBBZGRlZCBhbiBleHRlbmQoKSBtZXRob2QgdG8gcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4KKyAgKiBBZGRlZCBVVEY4IGRlYnVnIHN0cmluZyBzdXBwb3J0LgorCisyMDEwLTAxLTA4IHZlcnNpb24gMi4zLjA6CisKKyAgR2VuZXJhbAorICAqIFBhcnNlcnMgZm9yIHJlcGVhdGVkIG51bWVyaWMgZmllbGRzIG5vdyBhbHdheXMgYWNjZXB0IGJvdGggcGFja2VkIGFuZAorICAgIHVucGFja2VkIGlucHV0LiAgVGhlIFtwYWNrZWQ9dHJ1ZV0gb3B0aW9uIG9ubHkgYWZmZWN0cyBzZXJpYWxpemVycy4KKyAgICBUaGVyZWZvcmUsIGl0IGlzIHBvc3NpYmxlIHRvIHN3aXRjaCBhIGZpZWxkIHRvIHBhY2tlZCBmb3JtYXQgd2l0aG91dAorICAgIGJyZWFraW5nIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IC0tIGFzIGxvbmcgYXMgYWxsIHBhcnRpZXMgYXJlIHVzaW5nCisgICAgcHJvdG9idWYgMi4zLjAgb3IgYWJvdmUsIGF0IGxlYXN0LgorICAqIFRoZSBnZW5lcmljIFJQQyBzZXJ2aWNlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBDKyssIEphdmEsIGFuZCBQeXRob24KKyAgICBnZW5lcmF0b3JzIGNhbiBiZSBkaXNhYmxlZCB2aWEgZmlsZSBvcHRpb25zOgorICAgICAgb3B0aW9uIGNjX2dlbmVyaWNfc2VydmljZXMgPSBmYWxzZTsKKyAgICAgIG9wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSBmYWxzZTsKKyAgICAgIG9wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gZmFsc2U7CisgICAgVGhpcyBhbGxvd3MgcGx1Z2lucyB0byBnZW5lcmF0ZSBhbHRlcm5hdGl2ZSBjb2RlLCBwb3NzaWJseSBzcGVjaWZpYyB0byBzb21lCisgICAgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uCisKKyAgcHJvdG9jCisgICogTm93IHN1cHBvcnRzIGEgcGx1Z2luIHN5c3RlbSBmb3IgY29kZSBnZW5lcmF0b3JzLiAgUGx1Z2lucyBjYW4gZ2VuZXJhdGUKKyAgICBjb2RlIGZvciBuZXcgbGFuZ3VhZ2VzIG9yIGluamVjdCBhZGRpdGlvbmFsIGNvZGUgaW50byB0aGUgb3V0cHV0IG9mIG90aGVyCisgICAgY29kZSBnZW5lcmF0b3JzLiAgUGx1Z2lucyBhcmUganVzdCBiaW5hcmllcyB3aGljaCBhY2NlcHQgYSBwcm90b2NvbCBidWZmZXIKKyAgICBvbiBzdGRpbiBhbmQgd3JpdGUgYSBwcm90b2NvbCBidWZmZXIgdG8gc3Rkb3V0LCBzbyB0aGV5IG1heSBiZSB3cml0dGVuIGluCisgICAgYW55IGxhbmd1YWdlLiAgU2VlIHNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvLgorICAgICoqV0FSTklORyoqOiAgUGx1Z2lucyBhcmUgZXhwZXJpbWVudGFsLiAgVGhlIGludGVyZmFjZSBtYXkgY2hhbmdlIGluIGEKKyAgICBmdXR1cmUgdmVyc2lvbi4KKyAgKiBJZiB0aGUgb3V0cHV0IGxvY2F0aW9uIGVuZHMgaW4gLnppcCBvciAuamFyLCBwcm90b2Mgd2lsbCB3cml0ZSBpdHMgb3V0cHV0CisgICAgdG8gYSB6aXAvamFyIGFyY2hpdmUgaW5zdGVhZCBvZiBhIGRpcmVjdG9yeS4gIEZvciBleGFtcGxlOgorICAgICAgcHJvdG9jIC0tamF2YV9vdXQ9bXlwcm90b19zcmNzLmphciAtLXB5dGhvbl9vdXQ9bXlwcm90by56aXAgbXlwcm90by5wcm90bworICAgIEN1cnJlbnRseSB0aGUgYXJjaGl2ZSBjb250ZW50cyBhcmUgbm90IGNvbXByZXNzZWQsIHRob3VnaCB0aGlzIGNvdWxkIGNoYW5nZQorICAgIGluIHRoZSBmdXR1cmUuCisgICogaW5mLCAtaW5mLCBhbmQgbmFuIGNhbiBub3cgYmUgdXNlZCBhcyBkZWZhdWx0IHZhbHVlcyBmb3IgZmxvYXQgYW5kIGRvdWJsZQorICAgIGZpZWxkcy4KKworICBDKysKKyAgKiBWYXJpb3VzIHNwZWVkIGFuZCBjb2RlIHNpemUgb3B0aW1pemF0aW9ucy4KKyAgKiBEeW5hbWljTWVzc2FnZUZhY3RvcnkgaXMgbm93IGZ1bGx5IHRocmVhZC1zYWZlLgorICAqIE1lc3NhZ2U6OlV0ZjhEZWJ1Z1N0cmluZygpIG1ldGhvZCBpcyBsaWtlIERlYnVnU3RyaW5nKCkgYnV0IGF2b2lkcyBlc2NhcGluZworICAgIFVURi04IGJ5dGVzLgorICAqIENvbXBpbGVkLWluIG1lc3NhZ2UgdHlwZXMgY2FuIG5vdyBjb250YWluIGR5bmFtaWMgZXh0ZW5zaW9ucywgdGhyb3VnaCB1c2UKKyAgICBvZiBDb2RlZElucHV0U3RyZWFtOjpTZXRFeHRlbnNpb25SZWdpc3RyeSgpLgorICAqIE5vdyBjb21waWxlcyBzaGFyZWQgbGlicmFyaWVzIChETExzKSBieSBkZWZhdWx0IG9uIEN5Z3dpbiBhbmQgTWluR1csIHRvCisgICAgbWF0Y2ggb3RoZXIgcGxhdGZvcm1zLiAgVXNlIC0tZGlzYWJsZS1zaGFyZWQgdG8gYXZvaWQgdGhpcy4KKworICBKYXZhCisgICogcGFyc2VEZWxpbWl0ZWRGcm9tKCkgYW5kIG1lcmdlRGVsaW1pdGVkRnJvbSgpIG5vdyBkZXRlY3QgRU9GIGFuZCByZXR1cm4KKyAgICBmYWxzZS9udWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICAqIEZpeGVkIHNvbWUgaW5pdGlhbGl6YXRpb24gb3JkZXJpbmcgYnVncy4KKyAgKiBGaXhlcyBmb3IgT3BlbkpESyA3LgorCisgIFB5dGhvbgorICAqIDEwLTI1IHRpbWVzIGZhc3RlciB0aGFuIDIuMi4wLCBzdGlsbCBwdXJlLVB5dGhvbi4KKyAgKiBDYWxsaW5nIGEgbXV0YXRpbmcgbWV0aG9kIG9uIGEgc3ViLW1lc3NhZ2UgYWx3YXlzIGluc3RhbnRpYXRlcyB0aGUgbWVzc2FnZQorICAgIGluIGl0cyBwYXJlbnQgZXZlbiBpZiB0aGUgbXV0YXRpbmcgbWV0aG9kIGRvZXNuJ3QgYWN0dWFsbHkgbXV0YXRlIGFueXRoaW5nCisgICAgKGUuZy4gcGFyc2luZyBmcm9tIGFuIGVtcHR5IHN0cmluZykuCisgICogRXhwYW5kZWQgZGVzY3JpcHRvcnMgYSBiaXQuCisKKzIwMDktMDgtMTEgdmVyc2lvbiAyLjIuMDoKKworICBDKysKKyAgKiBMaXRlIG1vZGU6ICBUaGUgIm9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSIgb3B0aW9uIGNhdXNlcyB0aGUgY29tcGlsZXIKKyAgICB0byBnZW5lcmF0ZSBjb2RlIHdoaWNoIG9ubHkgZGVwZW5kcyBsaWJwcm90b2J1Zi1saXRlLCB3aGljaCBpcyBtdWNoIHNtYWxsZXIKKyAgICB0aGFuIGxpYnByb3RvYnVmIGJ1dCBsYWNrcyBkZXNjcmlwdG9ycywgcmVmbGVjdGlvbiwgYW5kIHNvbWUgb3RoZXIgZmVhdHVyZXMuCisgICogRml4ZWQgYnVnIHdoZXJlIE1lc3NhZ2UuU3dhcChNZXNzYWdlKSB3YXMgb25seSBpbXBsZW1lbnRlZCBmb3IKKyAgICBvcHRpbWl6ZV9mb3Jfc3BlZWQuICBTd2FwIG5vdyBwcm9wZXJseSBpbXBsZW1lbnRlZCBpbiBib3RoIG1vZGVzCisgICAgKElzc3VlIDkxKS4KKyAgKiBBZGRlZCBSZW1vdmVMYXN0IGFuZCBTd2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpIHRvIFJlZmxlY3Rpb24KKyAgICBpbnRlcmZhY2UgZm9yIHJlcGVhdGVkIGVsZW1lbnRzLgorICAqIEFkZGVkIFN3YXAoTWVzc2FnZSkgdG8gUmVmbGVjdGlvbiBpbnRlcmZhY2UuCisgICogRmxvYXRpbmctcG9pbnQgbGl0ZXJhbHMgaW4gZ2VuZXJhdGVkIGNvZGUgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUKKyAgICBzaW5nbGUtcHJlY2lzaW9uIG5vdyBleHBsaWNpdGx5IGhhdmUgJ2YnIHN1ZmZpeCB0byBhdm9pZCBwZWRhbnRpYyB3YXJuaW5ncworICAgIHByb2R1Y2VkIGJ5IHNvbWUgY29tcGlsZXJzLgorICAqIFRoZSBbZGVwcmVjYXRlZD10cnVlXSBvcHRpb24gbm93IGNhdXNlcyB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHRvIGdlbmVyYXRlCisgICAgYSBHQ0Mtc3R5bGUgZGVwcmVjYXRpb24gYW5ub3RhdGlvbiAobm8tb3Agb24gb3RoZXIgY29tcGlsZXJzKS4KKyAgKiBnb29nbGU6OnByb3RvYnVmOjpHZXRFbnVtRGVzY3JpcHRvcjxTb21lR2VuZXJhdGVkRW51bVR5cGU+KCkgcmV0dXJucyB0aGUKKyAgICBFbnVtRGVzY3JpcHRvciBmb3IgdGhhdCB0eXBlIC0tIHVzZWZ1bCBmb3IgdGVtcGxhdGVzIHdoaWNoIGNhbm5vdCBjYWxsCisgICAgU29tZUdlbmVyYXRlZEVudW1UeXBlX2Rlc2NyaXB0b3IoKS4KKyAgKiBWYXJpb3VzIG9wdGltaXphdGlvbnMgYW5kIG9ic2N1cmUgYnVnIGZpeGVzLgorCisgIEphdmEKKyAgKiBMaXRlIG1vZGU6ICBUaGUgIm9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSIgb3B0aW9uIGNhdXNlcyB0aGUgY29tcGlsZXIKKyAgICB0byBnZW5lcmF0ZSBjb2RlIHdoaWNoIG9ubHkgZGVwZW5kcyBsaWJwcm90b2J1Zi1saXRlLCB3aGljaCBpcyBtdWNoIHNtYWxsZXIKKyAgICB0aGFuIGxpYnByb3RvYnVmIGJ1dCBsYWNrcyBkZXNjcmlwdG9ycywgcmVmbGVjdGlvbiwgYW5kIHNvbWUgb3RoZXIgZmVhdHVyZXMuCisgICogTG90cyBvZiBzdHlsZSBjbGVhbnVwcy4KKworICBQeXRob24KKyAgKiBGaXhlZCBlbmRpYW5uZXNzIGJ1ZyB3aXRoIGZsb2F0cyBhbmQgZG91Ymxlcy4KKyAgKiBUZXh0IGZvcm1hdCBwYXJzaW5nIHN1cHBvcnQuCisgICogRml4IGJ1ZyB3aXRoIHBhcnNpbmcgcGFja2VkIHJlcGVhdGVkIGZpZWxkcyBpbiBlbWJlZGRlZCBtZXNzYWdlcy4KKyAgKiBBYmlsaXR5IHRvIGluaXRpYWxpemUgZmllbGRzIGJ5IHBhc3Npbmcga2V5d29yZCBhcmdzIHRvIGNvbnN0cnVjdG9yLgorICAqIFN1cHBvcnQgaXRlcmF0b3JzIGluIGV4dGVuZCBhbmQgX19zZXRzbGljZV9fIGZvciBjb250YWluZXJzLgorCisyMDA5LTA1LTEzIHZlcnNpb24gMi4xLjA6CisKKyAgR2VuZXJhbAorICAqIFJlcGVhdGVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZXMgKHR5cGVzIG90aGVyIHRoYXQgc3RyaW5nLCBncm91cCwgYW5kCisgICAgbmVzdGVkIG1lc3NhZ2VzKSBtYXkgbm93IHVzZSB0aGUgb3B0aW9uIFtwYWNrZWQgPSB0cnVlXSB0byBnZXQgYSBtb3JlCisgICAgZWZmaWNpZW50IGVuY29kaW5nLiAgSW4gdGhlIG5ldyBlbmNvZGluZywgdGhlIGVudGlyZSBsaXN0IGlzIHdyaXR0ZW4KKyAgICBhcyBhIHNpbmdsZSBieXRlIGJsb2IgdXNpbmcgdGhlICJsZW5ndGgtZGVsaW1pdGVkIiB3aXJlIHR5cGUuICBXaXRoaW4KKyAgICB0aGlzIGJsb2IsIHRoZSBpbmRpdmlkdWFsIHZhbHVlcyBhcmUgZW5jb2RlZCB0aGUgc2FtZSB3YXkgdGhleSB3b3VsZAorICAgIGJlIG5vcm1hbGx5IGV4Y2VwdCB3aXRob3V0IGEgdGFnIGJlZm9yZSBlYWNoIHZhbHVlICh0aHVzLCB0aGV5IGFyZQorICAgIHRpZ2h0bHkgInBhY2tlZCIpLgorICAqIEZvciBlYWNoIGZpZWxkLCB0aGUgZ2VuZXJhdGVkIGNvZGUgY29udGFpbnMgYW4gaW50ZWdlciBjb25zdGFudCBhc3NpZ25lZAorICAgIHRvIHRoZSBmaWVsZCBudW1iZXIuICBGb3IgZXhhbXBsZSwgdGhlIC5wcm90byBmaWxlOgorICAgICAgbWVzc2FnZSBGb28geyBvcHRpb25hbCBpbnQgYmFyX2JheiA9IDEyMzsgfQorICAgIHdvdWxkIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzLCBhbGwgd2l0aCB0aGUgaW50ZWdlciB2YWx1ZSAxMjM6CisgICAgICBDKys6ICAgICBGb286OmtCYXJCYXpGaWVsZE51bWJlcgorICAgICAgSmF2YTogICAgRm9vLkJBUl9CQVpfRklFTERfTlVNQkVSCisgICAgICBQeXRob246ICBGb28uQkFSX0JBWl9GSUVMRF9OVU1CRVIKKyAgICBDb25zdGFudHMgYXJlIGFsc28gZ2VuZXJhdGVkIGZvciBleHRlbnNpb25zLCB3aXRoIHRoZSBzYW1lIG5hbWluZyBzY2hlbWUuCisgICAgVGhlc2UgY29uc3RhbnRzIG1heSBiZSB1c2VkIGFzIHN3aXRjaCBjYXNlcy4KKyAgKiBVcGRhdGVkIGJ1bmRsZWQgR29vZ2xlIFRlc3QgdG8gdmVyc2lvbiAxLjMuMC4gIEdvb2dsZSBUZXN0IGlzIG5vdyBidW5kbGVkCisgICAgaW4gaXRzIHZlcmJhdGltIGZvcm0gYXMgYSBuZXN0ZWQgYXV0b2NvbmYgcGFja2FnZSwgc28geW91IGNhbiBkcm9wIGluIGFueQorICAgIG90aGVyIHZlcnNpb24gb2YgR29vZ2xlIFRlc3QgaWYgbmVlZGVkLgorICAqIG9wdGltaXplX2ZvciA9IFNQRUVEIGlzIG5vdyB0aGUgZGVmYXVsdCwgYnkgcG9wdWxhciBkZW1hbmQuICBVc2UKKyAgICBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkUgaWYgY29kZSBzaXplIGlzIG1vcmUgaW1wb3J0YW50IGluIHlvdXIgYXBwLgorICAqIEl0IGlzIG5vdyBhbiBlcnJvciB0byBkZWZpbmUgYSBkZWZhdWx0IHZhbHVlIGZvciBhIHJlcGVhdGVkIGZpZWxkLgorICAgIFByZXZpb3VzbHksIHRoaXMgd2FzIHNpbGVudGx5IGlnbm9yZWQgKGl0IGhhZCBubyBlZmZlY3Qgb24gdGhlIGdlbmVyYXRlZAorICAgIGNvZGUpLgorICAqIEZpZWxkcyBjYW4gbm93IGJlIG1hcmtlZCBkZXByZWNhdGVkIGxpa2U6CisgICAgICBvcHRpb25hbCBpbnQzMiBmb28gPSAxIFtkZXByZWNhdGVkID0gdHJ1ZV07CisgICAgQ3VycmVudGx5IHRoaXMgZG9lcyBub3QgaGF2ZSBhbnkgYWN0dWFsIGVmZmVjdCwgYnV0IGluIHRoZSBmdXR1cmUgdGhlIGNvZGUKKyAgICBnZW5lcmF0b3JzIG1heSBnZW5lcmF0ZSBkZXByZWNhdGlvbiBhbm5vdGF0aW9ucyBpbiBlYWNoIGxhbmd1YWdlLgorICAqIENyb3NzLWNvbXBpbGluZyBzaG91bGQgbm93IGJlIHBvc3NpYmxlIHVzaW5nIHRoZSAtLXdpdGgtcHJvdG9jIG9wdGlvbiB0bworICAgIGNvbmZpZ3VyZS4gIFNlZSBSRUFETUUudHh0IGZvciBtb3JlIGluZm8uCisKKyAgcHJvdG9jCisgICogLS1lcnJvcl9mb3JtYXQ9bXN2cyBvcHRpb24gY2F1c2VzIGVycm9ycyB0byBiZSBwcmludGVkIGluIFZpc3VhbCBTdHVkaW8KKyAgICBmb3JtYXQsIHdoaWNoIHNob3VsZCBhbGxvdyB0aGVtIHRvIGJlIGNsaWNrZWQgb24gaW4gdGhlIGJ1aWxkIGxvZyB0byBnbworICAgIGRpcmVjdGx5IHRvIHRoZSBlcnJvciBsb2NhdGlvbi4KKyAgKiBUaGUgdHlwZSBuYW1lIHJlc29sdmVyIHdpbGwgbm8gbG9uZ2VyIHJlc29sdmUgdHlwZSBuYW1lcyB0byBmaWVsZHMuICBGb3IKKyAgICBleGFtcGxlLCB0aGlzIG5vdyB3b3JrczoKKyAgICAgIG1lc3NhZ2UgRm9vIHt9CisgICAgICBtZXNzYWdlIEJhciB7CisgICAgICAgIG9wdGlvbmFsIGludDMyIEZvbyA9IDE7CisgICAgICAgIG9wdGlvbmFsIEZvbyBiYXogPSAyOworICAgICAgfQorICAgIFByZXZpb3VzbHksIHRoZSB0eXBlIG9mICJiYXoiIHdvdWxkIHJlc29sdmUgdG8gIkJhci5Gb28iLCBhbmQgeW91J2QgZ2V0CisgICAgYW4gZXJyb3IgYmVjYXVzZSBCYXIuRm9vIGlzIGEgZmllbGQsIG5vdCBhIHR5cGUuICBOb3cgdGhlIHR5cGUgb2YgImJheiIKKyAgICByZXNvbHZlcyB0byB0aGUgbWVzc2FnZSB0eXBlIEZvby4gIFRoaXMgY2hhbmdlIGlzIHVubGlrZWx5IHRvIG1ha2UgYQorICAgIGRpZmZlcmVuY2UgdG8gYW55b25lIHdobyBmb2xsb3dzIHRoZSBQcm90b2NvbCBCdWZmZXJzIHN0eWxlIGd1aWRlLgorCisgIEMrKworICAqIFNldmVyYWwgb3B0aW1pemF0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bzoKKyAgICAtIFNlcmlhbGl6YXRpb24sIGVzcGVjaWFsbHkgdG8gZmxhdCBhcnJheXMsIGlzIDEwJS01MCUgZmFzdGVyLCBwb3NzaWJseQorICAgICAgbW9yZSBmb3Igc21hbGwgb2JqZWN0cy4KKyAgICAtIFNldmVyYWwgZGVzY3JpcHRvciBvcGVyYXRpb25zIHdoaWNoIHByZXZpb3VzbHkgcmVxdWlyZWQgbG9ja2luZyBubyBsb25nZXIKKyAgICAgIGRvLgorICAgIC0gRGVzY3JpcHRvcnMgYXJlIG5vdyBjb25zdHJ1Y3RlZCBsYXppbHkgb24gZmlyc3QgdXNlLCByYXRoZXIgdGhhbiBhdAorICAgICAgcHJvY2VzcyBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZCBzYXZlIG1lbW9yeSBpbiBwcm9ncmFtcyB3aGljaCBkbyBub3QKKyAgICAgIHVzZSBkZXNjcmlwdG9ycyBvciByZWZsZWN0aW9uLgorICAgIC0gVW5rbm93bkZpZWxkU2V0IGNvbXBsZXRlbHkgcmVkZXNpZ25lZCB0byBiZSBtb3JlIGVmZmljaWVudCAoZXNwZWNpYWxseSBpbgorICAgICAgdGVybXMgb2YgbWVtb3J5IHVzYWdlKS4KKyAgICAtIFZhcmlvdXMgb3B0aW1pemF0aW9ucyB0byByZWR1Y2UgY29kZSBzaXplICh0aG91Z2ggdGhlIHNlcmlhbGl6YXRpb24gc3BlZWQKKyAgICAgIG9wdGltaXphdGlvbnMgaW5jcmVhc2VkIGNvZGUgc2l6ZSkuCisgICogTWVzc2FnZSBpbnRlcmZhY2UgaGFzIG1ldGhvZCBQYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oKSB3aGljaCBwYXJzZXMKKyAgICBhIGxpbWl0ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gaW5wdXQgc3RyZWFtIHJhdGhlciB0aGFuIHBhcnNpbmcgdW50aWwKKyAgICBFT0YuCisgICogR3ppcElucHV0U3RyZWFtIGFuZCBHemlwT3V0cHV0U3RyZWFtIHN1cHBvcnQgcmVhZGluZy93cml0aW5nIGd6aXAtIG9yCisgICAgemxpYi1jb21wcmVzc2VkIHN0cmVhbXMgaWYgemxpYiBpcyBhdmFpbGFibGUuCisgICAgKGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oKQorICAqIERlc2NyaXB0b3JQb29sOjpGaW5kQWxsRXh0ZW5zaW9ucygpIGFuZCBjb3JyZXNwb25kaW5nCisgICAgRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kQWxsRXh0ZW5zaW9ucygpIGNhbiBiZSB1c2VkIHRvIGVudW1lcmF0ZSBhbGwKKyAgICBleHRlbnNpb25zIG9mIGEgZ2l2ZW4gdHlwZS4KKyAgKiBGb3IgZWFjaCBlbnVtIHR5cGUgRm9vLCBwcm90b2Mgd2lsbCBnZW5lcmF0ZSBmdW5jdGlvbnM6CisgICAgICBjb25zdCBzdHJpbmcmIEZvb19OYW1lKEZvbyB2YWx1ZSk7CisgICAgICBib29sIEZvb19QYXJzZShjb25zdCBzdHJpbmcmIG5hbWUsIEZvbyogcmVzdWx0KTsKKyAgICBUaGUgZm9ybWVyIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudW0gY29uc3RhbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KKyAgICB2YWx1ZSB3aGlsZSB0aGUgbGF0dGVyIGZpbmRzIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGEgbmFtZS4KKyAgKiBSZXBlYXRlZEZpZWxkIGFuZCBSZXBlYXRlZFB0ckZpZWxkIG5vdyBoYXZlIGJhY2staW5zZXJ0aW9uIGl0ZXJhdG9ycy4KKyAgKiBTdHJpbmcgZmllbGRzIG5vdyBoYXZlIHNldHRlcnMgdGhhdCB0YWtlIGEgY2hhciogYW5kIGEgc2l6ZSwgaW4gYWRkaXRpb24KKyAgICB0byB0aGUgZXhpc3Rpbmcgb25lcyB0aGF0IHRvb2sgY2hhciogb3IgY29uc3Qgc3RyaW5nJi4KKyAgKiBEZXNjcmlwdG9yUG9vbDo6QWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgbWF5IGJlIHVzZWQgdG8gdGVsbAorICAgIERlc2NyaXB0b3JQb29sIHRvIGNyZWF0ZSBwbGFjZWhvbGRlciBkZXNjcmlwdG9ycyBmb3IgdW5rbm93biBlbnRpdGllcworICAgIHJlZmVyZW5jZWQgaW4gYSBGaWxlRGVzY3JpcHRvclByb3RvLiAgVGhpcyBjYW4gYWxsb3cgeW91IHRvIHBhcnNlIGEgLnByb3RvCisgICAgZmlsZSB3aXRob3V0IGhhdmluZyBhY2Nlc3MgdG8gb3RoZXIgLnByb3RvIGZpbGVzIHRoYXQgaXQgaW1wb3J0cywgZm9yCisgICAgZXhhbXBsZS4KKyAgKiBVcGRhdGVkIGd0ZXN0IHRvIGxhdGVzdCB2ZXJzaW9uLiAgVGhlIGd0ZXN0IHBhY2thZ2UgaXMgbm93IGluY2x1ZGVkIGFzIGEKKyAgICBuZXN0ZWQgYXV0b2NvbmYgcGFja2FnZSwgc28gaXQgc2hvdWxkIGJlIGFibGUgdG8gZHJvcCBuZXcgdmVyc2lvbnMgaW50byB0aGUKKyAgICAiZ3Rlc3QiIHN1YmRpcmVjdG9yeSB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKworICBKYXZhCisgICogRml4ZWQgYnVnIHdoZXJlIE1lc3NhZ2UubWVyZ2VGcm9tKE1lc3NhZ2UpIGZhaWxlZCB0byBtZXJnZSBleHRlbnNpb25zLgorICAqIE1lc3NhZ2UgaW50ZXJmYWNlIGhhcyBuZXcgbWV0aG9kIHRvQnVpbGRlcigpIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8KKyAgICBuZXdCdWlsZGVyRm9yVHlwZSgpLm1lcmdlRnJvbSh0aGlzKS4KKyAgKiBBbGwgZW51bXMgbm93IGltcGxlbWVudCB0aGUgUHJvdG9jb2xNZXNzYWdlRW51bSBpbnRlcmZhY2UuCisgICogU2V0dGluZyBhIGZpZWxkIHRvIG51bGwgbm93IHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4KKyAgKiBGaXhlZCB0ZW5kZW5jeSBmb3IgVGV4dEZvcm1hdCdzIHBhcnNpbmcgdG8gb3ZlcmZsb3cgdGhlIHN0YWNrIHdoZW4KKyAgICBwYXJzaW5nIGxhcmdlIHN0cmluZyB2YWx1ZXMuICBUaGUgdW5kZXJseWluZyBwcm9ibGVtIGlzIHdpdGggSmF2YSdzCisgICAgcmVnZXggaW1wbGVtZW50YXRpb24gKHdoaWNoIHVuZm9ydHVuYXRlbHkgdXNlcyByZWN1cnNpdmUgYmFja3RyYWNraW5nCisgICAgcmF0aGVyIHRoYW4gYnVpbGRpbmcgYW4gTkZBKS4gIFdvcmtlZCBhcm91bmQgYnkgbWFraW5nIHVzZSBvZiBwb3NzZXNpdmUKKyAgICBxdWFudGlmaWVycy4KKyAgKiBHZW5lcmF0ZWQgc2VydmljZSBjbGFzc2VzIG5vdyBhbHNvIGdlbmVyYXRlIHB1cmUgaW50ZXJmYWNlcy4gIEZvciBhIHNlcnZpY2UKKyAgICBGb28sIEZvby5JbnRlcmZhY2UgaXMgYSBwdXJlIGludGVyZmFjZSBjb250YWluaW5nIGFsbCBvZiB0aGUgc2VydmljZSdzCisgICAgZGVmaW5lZCBtZXRob2RzLiAgRm9vLm5ld1JlZmxlY3RpdmVTZXJ2aWNlKCkgY2FuIGJlIGNhbGxlZCB0byB3cmFwIGFuCisgICAgaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgaW4gYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGdlbmVyaWMKKyAgICBScGNTZXJ2aWNlIGludGVyZmFjZSwgd2hpY2ggcHJvdmlkZXMgcmVmbGVjdGlvbiBzdXBwb3J0IHRoYXQgaXMgdXN1YWxseQorICAgIG5lZWRlZCBieSBSUEMgc2VydmVyIGltcGxlbWVudGF0aW9ucy4KKyAgKiBSUEMgaW50ZXJmYWNlcyBub3cgc3VwcG9ydCBibG9ja2luZyBvcGVyYXRpb24gaW4gYWRkaXRpb24gdG8gbm9uLWJsb2NraW5nLgorICAgIFRoZSBwcm90b2NvbCBjb21waWxlciBnZW5lcmF0ZXMgc2VwYXJhdGUgYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBzdHVicworICAgIHdoaWNoIG9wZXJhdGUgYWdhaW5zdCBzZXBhcmF0ZSBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIFJQQyBpbnRlcmZhY2VzLgorICAgIFJQQyBpbXBsZW1lbnRhdGlvbnMgd2lsbCBoYXZlIHRvIGltcGxlbWVudCB0aGUgbmV3IGludGVyZmFjZXMgaW4gb3JkZXIgdG8KKyAgICBzdXBwb3J0IGJsb2NraW5nIG1vZGUuCisgICogTmV3IEkvTyBtZXRob2RzIHBhcnNlRGVsaW1pdGVkRnJvbSgpLCBtZXJnZURlbGltaXRlZEZyb20oKSwgYW5kCisgICAgd3JpdGVEZWxpbWl0ZWRUbygpIHJlYWQgYW5kIHdyaXRlICJkZWxlbWl0ZWQiIG1lc3NhZ2VzIGZyb20vdG8gYSBzdHJlYW0sCisgICAgbWVhbmluZyB0aGF0IHRoZSBtZXNzYWdlIHNpemUgcHJlY2VkZXMgdGhlIGRhdGEuICBUaGlzIHdheSwgeW91IGNhbiB3cml0ZQorICAgIG11bHRpcGxlIG1lc3NhZ2VzIHRvIGEgc3RyZWFtIHdpdGhvdXQgaGF2aW5nIHRvIHdvcnJ5IGFib3V0IGRlbGltaXRpbmcKKyAgICB0aGVtIHlvdXJzZWxmLgorICAqIFRocm93IGEgbW9yZSBkZXNjcmlwdGl2ZSBleGNlcHRpb24gd2hlbiBidWlsZCgpIGlzIGRvdWJsZS1jYWxsZWQuCisgICogQWRkIGEgbWV0aG9kIHRvIHF1ZXJ5IHdoZXRoZXIgQ29kZWRJbnB1dFN0cmVhbSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dAorICAgIHN0cmVhbS4KKyAgKiBBZGQgYSBtZXRob2QgdG8gcmVzZXQgYSBDb2RlZElucHV0U3RyZWFtJ3Mgc2l6ZSBjb3VudGVyOyB1c2VmdWwgd2hlbgorICAgIHJlYWRpbmcgbWFueSBtZXNzYWdlcyB3aXRoIHRoZSBzYW1lIHN0cmVhbS4KKyAgKiBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKSBub3cgYWNjb3VudCBmb3IgdW5rbm93biBmaWVsZHMuCisKKyAgUHl0aG9uCisgICogQWRkZWQgc2xpY2luZyBzdXBwb3J0IGZvciByZXBlYXRlZCBzY2FsYXIgZmllbGRzLiBBZGRlZCBzbGljZSByZXRyaWV2YWwgYW5kCisgICAgcmVtb3ZhbCBvZiByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzLgorICAqIFVwZGF0ZWQgUlBDIGludGVyZmFjZXMgdG8gYWxsb3cgZm9yIGJsb2NraW5nIG9wZXJhdGlvbi4gIEEgY2xpZW50IG1heQorICAgIG5vdyBwYXNzIE5vbmUgZm9yIGEgY2FsbGJhY2sgd2hlbiBtYWtpbmcgYW4gUlBDLCBpbiB3aGljaCBjYXNlIHRoZQorICAgIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWQsIGFuZCB0aGUgcmVzcG9uc2UKKyAgICBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZCBkaXJlY3RseSB0byB0aGUgY2FsbGVyLiAgVGhpcyBpbnRlcmZhY2UgY2hhbmdlCisgICAgY2Fubm90IGJlIHVzZWQgaW4gcHJhY3RpY2UgdW50aWwgUlBDIGltcGxlbWVudGF0aW9ucyBhcmUgdXBkYXRlZCB0bworICAgIGltcGxlbWVudCBpdC4KKyAgKiBDaGFuZ2VzIHRvIGlucHV0X3N0cmVhbS5weSBzaG91bGQgbWFrZSBwcm90b2J1ZiBjb21wYXRpYmxlIHdpdGggYXBwZW5naW5lLgorCisyMDA4LTExLTI1IHZlcnNpb24gMi4wLjM6CisKKyAgcHJvdG9jCisgICogRW51bSB2YWx1ZXMgbWF5IG5vdyBoYXZlIGN1c3RvbSBvcHRpb25zLCB1c2luZyBzeW50YXggc2ltaWxhciB0byBmaWVsZAorICAgIG9wdGlvbnMuCisgICogRml4ZWQgYnVnIHdoZXJlIC5wcm90byBmaWxlcyB3aGljaCB1c2UgY3VzdG9tIG9wdGlvbnMgYnV0IGRvbid0IGFjdHVhbGx5CisgICAgZGVmaW5lIHRoZW0gKGkuZS4gdGhleSBpbXBvcnQgYW5vdGhlciAucHJvdG8gZmlsZSBkZWZpbmluZyB0aGUgb3B0aW9ucykKKyAgICBoYWQgdG8gZXhwbGljaXRseSBpbXBvcnQgZGVzY3JpcHRvci5wcm90by4KKyAgKiBBZGphY2VudCBzdHJpbmcgbGl0ZXJhbHMgaW4gLnByb3RvIGZpbGVzIHdpbGwgbm93IGJlIGNvbmNhdGVuYXRlZCwgbGlrZSBpbgorICAgIEMuCisgICogSWYgYW4gaW5wdXQgZmlsZSBpcyBhIFdpbmRvd3MgYWJzb2x1dGUgcGF0aCAoZS5nLiAiQzpcZm9vXGJhci5wcm90byIpIGFuZAorICAgIHRoZSBpbXBvcnQgcGF0aCBvbmx5IGNvbnRhaW5zICIuIiAob3IgY29udGFpbnMgIi4iIGJ1dCBkb2VzIG5vdCBjb250YWluCisgICAgdGhlIGZpbGUpLCBwcm90b2MgaW5jb3JyZWN0bHkgdGhvdWdodCB0aGF0IHRoZSBmaWxlIHdhcyB1bmRlciAiLiIsIGJlY2F1c2UKKyAgICBpdCB0aG91Z2h0IHRoYXQgdGhlIHBhdGggd2FzIHJlbGF0aXZlIChzaW5jZSBpdCBkaWRuJ3Qgc3RhcnQgd2l0aCBhIHNsYXNoKS4KKyAgICBUaGlzIGhhcyBiZWVuIGZpeGVkLgorCisgIEMrKworICAqIEdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMgbm93IGhhdmUgYSBTd2FwKCkgbWV0aG9kIHdoaWNoIGVmZmljaWVudGx5IHN3YXBzCisgICAgdGhlIGNvbnRlbnRzIG9mIHR3byBvYmplY3RzLgorICAqIEFsbCBtZXNzYWdlIGNsYXNzZXMgbm93IGhhdmUgYSBTcGFjZVVzZWQoKSBtZXRob2Qgd2hpY2ggcmV0dXJucyBhbiBlc3RpbWF0ZQorICAgIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgYWxsb2NhdGVkIG1lbW9yeSBjdXJyZW50bHkgb3duZWQgYnkgdGhlIG9iamVjdC4KKyAgICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiB5b3UgYXJlIHJldXNpbmcgYSBzaW5nbGUgbWVzc2FnZSBvYmplY3QKKyAgICB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGJ1dCB3YW50IHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGJsb2F0IHVwIHRvbyBsYXJnZS4KKyAgKiBOZXcgbWV0aG9kIE1lc3NhZ2U6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZQorICAgIHNlcmlhbGl6ZWQgZGF0YS4gIE1heSBiZSBtb3JlIGNvbnZlbmllbnQgdGhhbiBjYWxsaW5nCisgICAgU2VyaWFsaXplVG9TdHJpbmcoc3RyaW5nKikuCisgICogSW4gZGVidWcgbW9kZSwgbG9nIGVycm9yIG1lc3NhZ2VzIHdoZW4gc3RyaW5nLXR5cGUgZmllbGRzIGFyZSBmb3VuZCB0bworICAgIGNvbnRhaW4gYnl0ZXMgdGhhdCBhcmUgbm90IHZhbGlkIFVURi04LgorICAqIEZpeGVkIGJ1ZyB3aGVyZSBhIG1lc3NhZ2Ugd2l0aCBtdWx0aXBsZSBleHRlbnNpb24gcmFuZ2VzIGNvdWxkbid0IHBhcnNlCisgICAgZXh0ZW5zaW9ucy4KKyAgKiBGaXhlZCBidWcgd2hlcmUgTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2UmKSBkaWRuJ3QgZG8gYW55dGhpbmcgaWYgaW52b2tlZCBvbgorICAgIGEgbWVzc2FnZSB0aGF0IGNvbnRhaW5lZCBubyBmaWVsZHMgKGJ1dCBwb3NzaWJseSBjb250YWluZWQgZXh0ZW5zaW9ucykuCisgICogRml4ZWQgU2hvcnREZWJ1Z1N0cmluZygpIHRvIG5vdCBiZSBPKG5eMikuICBEdXJyLgorICAqIEZpeGVkIGNyYXNoIGluIFRleHRGb3JtYXQgcGFyc2luZyBpZiB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGlucHV0IGNhdXNlZCBhCisgICAgdG9rZW5pemF0aW9uIGVycm9yLgorICAqIEZpeGVkIG9ic2N1cmUgYnVncyBpbiB6ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MuCisgICogQWRkZWQgc3VwcG9ydCBmb3IgSFAgQysrIG9uIFRydTY0LgorICAqIE9ubHkgYnVpbGQgdGVzdHMgb24gIm1ha2UgY2hlY2siLCBub3QgIm1ha2UiLgorICAqIEZpeGVkIGFsaWdubWVudCBpc3N1ZSB0aGF0IGNhdXNlZCBjcmFzaGVzIHdoZW4gdXNpbmcgRHluYW1pY01lc3NhZ2Ugb24KKyAgICA2NC1iaXQgU3BhcmMgbWFjaGluZXMuCisgICogU2ltcGxpZnkgdGVtcGxhdGUgdXNhZ2UgdG8gd29yayB3aXRoIE1TVkMgMjAwMy4KKyAgKiBXb3JrIGFyb3VuZCBHQ0MgNC4zLnggeDg2XzY0IGNvbXBpbGVyIGJ1ZyB0aGF0IGNhdXNlZCBjcmFzaGVzIG9uIHN0YXJ0dXAuCisgICAgKFRoaXMgYWZmZWN0ZWQgRmVkb3JhIDkgaW4gcGFydGljdWxhci4pCisgICogTm93IHdvcmtzIG9uICJTb2xhcmlzIDEwIHVzaW5nIHJlY2VudCBTdW4gU3R1ZGlvIi4KKworICBKYXZhCisgICogTmV3IG92ZXJsb2FkIG9mIG1lcmdlRnJvbSgpIHdoaWNoIHBhcnNlcyBhIHNsaWNlIG9mIGEgYnl0ZSBhcnJheSBpbnN0ZWFkCisgICAgb2YgdGhlIHdob2xlIHRoaW5nLgorICAqIE5ldyBtZXRob2QgQnl0ZVN0cmluZy5hc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpIGRvZXMgd2hhdCBpdCBzb3VuZHMgbGlrZS4KKyAgKiBJbXByb3ZlZCBwZXJmb3JtYW5jZSBvZiBpc0luaXRpYWxpemVkKCkgd2hlbiBvcHRpbWl6aW5nIGZvciBjb2RlIHNpemUuCisKKyAgUHl0aG9uCisgICogQ29ycmVjdGVkIExpc3RGaWVsZHMoKSBzaWduYXR1cmUgaW4gTWVzc2FnZSBiYXNlIGNsYXNzIHRvIG1hdGNoIHdoYXQKKyAgICBzdWJjbGFzc2VzIGFjdHVhbGx5IGltcGxlbWVudC4KKyAgKiBTb21lIG1pbm9yIHJlZmFjdG9yaW5nLgorICAqIERvbid0IHBhc3Mgc2VsZiBhcyBmaXJzdCBhcmd1bWVudCB0byBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIChubyBsb25nZXIKKyAgICBhbGxvd2VkIGluIFB5dGhvbiAyLjYpLgorCisyMDA4LTA5LTI5IHZlcnNpb24gMi4wLjI6CisKKyAgR2VuZXJhbAorICAqIExpY2Vuc2UgY2hhbmdlZCBmcm9tIEFwYWNoZSAyLjAgdG8gTmV3IEJTRC4KKyAgKiBJdCBpcyBub3cgcG9zc2libGUgdG8gZGVmaW5lIGN1c3RvbSAib3B0aW9ucyIsIHdoaWNoIGFyZSBiYXNpY2FsbHkKKyAgICBhbm5vdGF0aW9ucyB3aGljaCBtYXkgYmUgcGxhY2VkIG9uIGRlZmluaXRpb25zIGluIGEgLnByb3RvIGZpbGUuCisgICAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBkZWZpbmUgYSBmaWVsZCBvcHRpb24gY2FsbGVkICJmb28iIGxpa2Ugc286CisgICAgICBpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIgorICAgICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgeworICAgICAgICBvcHRpb25hbCBzdHJpbmcgZm9vID0gMTIzNDU7CisgICAgICB9CisgICAgVGhlbiB5b3UgYW5ub3RhdGUgYSBmaWVsZCB1c2luZyB0aGUgImZvbyIgb3B0aW9uOgorICAgICAgbWVzc2FnZSBNeU1lc3NhZ2UgeworICAgICAgICBvcHRpb25hbCBpbnQzMiBzb21lX2ZpZWxkID0gMSBbKGZvbykgPSAiYmFyIl0KKyAgICAgIH0KKyAgICBUaGUgdmFsdWUgb2YgdGhpcyBvcHRpb24gaXMgdGhlbiB2aXNpYmxlIHZpYSB0aGUgbWVzc2FnZSdzCisgICAgRGVzY3JpcHRvcjoKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgICBNeU1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJzb21lX2ZpZWxkIik7CisgICAgICBhc3NlcnQoZmllbGQtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24oZm9vKSA9PSAiYmFyIik7CisgICAgVGhpcyBmZWF0dXJlIGhhcyBiZWVuIGltcGxlbWVudGVkIGFuZCB0ZXN0ZWQgaW4gQysrIGFuZCBKYXZhLgorICAgIE90aGVyIGxhbmd1YWdlcyBtYXkgb3IgbWF5IG5vdCBuZWVkIHRvIGRvIGV4dHJhIHdvcmsgdG8gc3VwcG9ydAorICAgIGN1c3RvbSBvcHRpb25zLCBkZXBlbmRpbmcgb24gaG93IHRoZXkgY29uc3RydWN0IGRlc2NyaXB0b3JzLgorCisgIEMrKworICAqIEZpeGVkIHNvbWUgR0NDIHdhcm5pbmdzIHRoYXQgb25seSBvY2N1ciB3aGVuIHVzaW5nIC1wZWRhbnRpYy4KKyAgKiBJbXByb3ZlZCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gY29kZSwgbWFraW5nIG9yZGVyaW5nIG1vcmUKKyAgICBwcmVkaWN0YWJsZSBhbW9uZyBvdGhlciB0aGluZ3MuCisgICogVGV4dEZvcm1hdCB3aWxsIG5vIGxvbmdlciBhY2NlcHQgbWVzc2FnZXMgd2hpY2ggY29udGFpbiBtdWx0aXBsZQorICAgIGluc3RhbmNlcyBvZiBhIHNpbmd1bGFyIGZpZWxkLiAgUHJldmlvdXNseSwgdGhlIGxhdHRlciBpbnN0YW5jZQorICAgIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZm9ybWVyLgorICAqIE5vdyB3b3JrcyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBoYXNoX21hcC4KKworICBKYXZhCisgICogUHJpbnQgQE92ZXJyaWRlIGFubm90YXRpb24gaW4gZ2VuZXJhdGVkIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuCisKKyAgUHl0aG9uCisgICogU3RyaW5ncyBub3cgdXNlIHRoZSAidW5pY29kZSIgdHlwZSByYXRoZXIgdGhhbiB0aGUgInN0ciIgdHlwZS4KKyAgICBTdHJpbmcgZmllbGRzIG1heSBzdGlsbCBiZSBhc3NpZ25lZCBBU0NJSSAic3RyIiB2YWx1ZXM7IHRoZXkgd2lsbAorICAgIGF1dG9tYXRpY2FsbHkgYmUgY29udmVydGVkLgorICAqIEFkZGluZyBhIHByb3BlcnR5IHRvIGFuIG9iamVjdCByZXByZXNlbnRpbmcgYSByZXBlYXRlZCBmaWVsZCBub3cKKyAgICByYWlzZXMgYW4gZXhjZXB0aW9uLiAgRm9yIGV4YW1wbGU6CisgICAgICAjIE5vIGxvbmdlciB3b3JrcyAoYW5kIG5ldmVyIHNob3VsZCBoYXZlKS4KKyAgICAgIG1lc3NhZ2Uuc29tZV9yZXBlYXRlZF9maWVsZC5mb28gPSAxCisKKyAgV2luZG93cworICAqIFdlIG5vdyBidWlsZCBzdGF0aWMgbGlicmFyaWVzIHJhdGhlciB0aGFuIERMTHMgYnkgZGVmYXVsdCBvbiBNU1ZDLgorICAgIFNlZSB2c3Byb2plY3RzL3JlYWRtZS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKzIwMDgtMDgtMTUgdmVyc2lvbiAyLjAuMToKKworICBwcm90b2MKKyAgKiBOZXcgZmxhZ3MgLS1lbmNvZGUgYW5kIC0tZGVjb2RlIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYmV0d2VlbiBwcm90b2J1ZiB0ZXh0CisgICAgZm9ybWF0IGFuZCBiaW5hcnkgZm9ybWF0IGZyb20gdGhlIGNvbW1hbmQtbGluZS4KKyAgKiBOZXcgZmxhZyAtLWRlc2NyaXB0b3Jfc2V0X291dCBjYW4gYmUgdXNlZCB0byB3cml0ZSBGaWxlRGVzY3JpcHRvclByb3RvcyBmb3IKKyAgICBhbGwgcGFyc2VkIGZpbGVzIGRpcmVjdGx5IGludG8gYSBzaW5nbGUgb3V0cHV0IGZpbGUuICBUaGlzIGlzIHBhcnRpY3VsYXJseQorICAgIHVzZWZ1bCBpZiB5b3Ugd2lzaCB0byBwYXJzZSAucHJvdG8gZmlsZXMgZnJvbSBwcm9ncmFtcyB3cml0dGVuIGluIGxhbmd1YWdlcworICAgIG90aGVyIHRoYW4gQysrOiBqdXN0IHJ1biBwcm90b2MgYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3MgYW5kIGhhdmUgaXQgb3V0cHV0CisgICAgYSBGaWxlRGVzY3JpcHRvckxpc3QsIHRoZW4gcGFyc2UgdGhhdCBuYXRpdmVseS4KKyAgKiBJbXByb3ZlZCBlcnJvciBtZXNzYWdlIHdoZW4gYW4gZW51bSB2YWx1ZSdzIG5hbWUgY29uZmxpY3RzIHdpdGggYW5vdGhlcgorICAgIHN5bWJvbCBkZWZpbmVkIGluIHRoZSBlbnVtIHR5cGUncyBzY29wZSwgZS5nLiBpZiB0d28gZW51bSB0eXBlcyBkZWNsYXJlZAorICAgIGluIHRoZSBzYW1lIHNjb3BlIGhhdmUgdmFsdWVzIHdpdGggdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgZGlzYWxsb3dlZCBmb3IKKyAgICBjb21wYXRpYmlsaXR5IHdpdGggQysrLCBidXQgdGhpcyB3YXNuJ3QgY2xlYXIgZnJvbSB0aGUgZXJyb3IuCisgICogRml4ZWQgYWJzb2x1dGUgb3V0cHV0IHBhdGhzIG9uIFdpbmRvd3MuCisgICogQWxsb3cgdHJhaWxpbmcgc2xhc2hlcyBpbiAtLXByb3RvX3BhdGggbWFwcGluZ3MuCisKKyAgQysrCisgICogUmVmbGVjdGlvbiBvYmplY3RzIGFyZSBub3cgcGVyLWNsYXNzIHJhdGhlciB0aGFuIHBlci1pbnN0YW5jZS4gIFRvIG1ha2UgdGhpcworICAgIHBvc3NpYmxlLCB0aGUgUmVmbGVjdGlvbiBpbnRlcmZhY2UgaGFkIHRvIGJlIGNoYW5nZWQgc3VjaCB0aGF0IGFsbCBtZXRob2RzCisgICAgdGFrZSB0aGUgTWVzc2FnZSBpbnN0YW5jZSBhcyBhIHBhcmFtZXRlci4gIFRoaXMgY2hhbmdlIGltcHJvdmVzIHBlcmZvcm1hbmNlCisgICAgc2lnbmlmaWNhbnRseSBpbiBtZW1vcnktYmFuZHdpZHRoLWxpbWl0ZWQgdXNlIGNhc2VzLCBzaW5jZSBpdCBtYWtlcyB0aGUKKyAgICBtZXNzYWdlIG9iamVjdHMgc21hbGxlci4gIE5vdGUgdGhhdCBzb3VyY2UtaW5jb21wYXRpYmxlIGludGVyZmFjZSBjaGFuZ2VzCisgICAgbGlrZSB0aGlzIHdpbGwgbm90IGJlIG1hZGUgYWdhaW4gYWZ0ZXIgdGhlIGxpYnJhcnkgbGVhdmVzIGJldGEuCisgICogSGV1cmlzdGljYWxseSBkZXRlY3Qgc3ViLW1lc3NhZ2VzIHdoZW4gcHJpbnRpbmcgdW5rbm93biBmaWVsZHMuCisgICogRml4IHN0YXRpYyBpbml0aWFsaXphdGlvbiBvcmRlcmluZyBidWcgdGhhdCBjYXVzZWQgY3Jhc2hlcyBhdCBzdGFydHVwIHdoZW4KKyAgICBjb21waWxpbmcgb24gTWFjIHdpdGggc3RhdGljIGxpbmtpbmcuCisgICogRml4ZWQgVG9rZW5pemVyVGVzdCB3aGVuIGNvbXBpbGluZyB3aXRoIC1ETkRFQlVHIG9uIExpbnV4LgorICAqIEZpeGVkIGluY29ycmVjdCBkZWZpbml0aW9uIG9mIGtpbnQzMm1pbi4KKyAgKiBGaXggYnl0ZXMgdHlwZSBzZXR0ZXIgdG8gd29yayB3aXRoIGJ5dGUgc2VxdWVuY2VzIHdpdGggZW1iZWRkZWQgTlVMTHMuCisgICogT3RoZXIgaXJyZWxldmFudCB0d2Vha3MuCisKKyAgSmF2YQorICAqIEZpeGVkIFVua25vd25GaWVsZFNldCdzIHBhcnNpbmcgb2YgdmFyaW50cyBsYXJnZXIgdGhhbiAzMiBiaXRzLgorICAqIEZpeGVkIFRleHRGb3JtYXQncyBwYXJzaW5nIG9mICJpbmYiIGFuZCAibmFuIi4KKyAgKiBGaXhlZCBUZXh0Rm9ybWF0J3MgcGFyc2luZyBvZiBjb21tZW50cy4KKyAgKiBBZGRlZCBpbmZvIHRvIEphdmEgUE9NIHRoYXQgd2lsbCBiZSByZXF1aXJlZCB3aGVuIHdlIHVwbG9hZCB0aGUKKyAgICBwYWNrYWdlIHRvIGEgTWF2ZW4gcmVwby4KKworICBQeXRob24KKyAgKiBNZXJnZUZyb20obWVzc2FnZSkgYW5kIENvcHlGcm9tKG1lc3NhZ2UpIGFyZSBub3cgaW1wbGVtZW50ZWQuCisgICogU2VyaWFsaXplVG9TdHJpbmcoKSByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQKKyAgICBmaWVsZHMuCisgICogQ29kZSBvcmdhbml6YXRpb24gaW1wcm92ZW1lbnRzLgorICAqIEZpeGVkIGRvYyBjb21tZW50cyBmb3IgUnBjQ29udHJvbGxlciBhbmQgUnBjQ2hhbm5lbCwgd2hpY2ggaGFkIHNvbWVob3cgYmVlbgorICAgIHN3YXBwZWQuCisgICogRml4ZWQgdGV4dF9mb3JtYXRfdGVzdCBvbiBXaW5kb3dzIHdoZXJlIGZsb2F0aW5nLXBvaW50IGV4cG9uZW50cyBzb21ldGltZXMKKyAgICBjb250YWluIGV4dHJhIHplcm9zLgorICAqIEZpeCBQeXRob24gc2VydmljZSBDYWxsTWV0aG9kKCkgaW1wbGVtZW50YXRpb24uCisKKyAgT3RoZXIKKyAgKiBJbXByb3ZlZCByZWFkbWVzLgorICAqIFZJTSBzeW50YXggaGlnaGxpZ2h0aW5nIGltcHJvdmVtZW50cy4KKworMjAwOC0wNy0wNyB2ZXJzaW9uIDIuMC4wOgorCisgICogRmlyc3QgcHVibGljIHJlbGVhc2UuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvQ09OVFJJQlVUT1JTLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9DT05UUklCVVRPUlMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMWFjODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvQ09OVFJJQlVUT1JTLnR4dApAQCAtMCwwICsxLDg4IEBACitUaGlzIGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIHBlb3BsZSB3aG8gaGF2ZSBtYWRlIGxhcmdlIGNvbnRyaWJ1dGlvbnMKK3RvIHRoZSBwdWJsaWMgdmVyc2lvbiBvZiBQcm90b2NvbCBCdWZmZXJzLgorCitPcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb246CisgIFNhbmpheSBHaGVtYXdhdCA8c2FuamF5QGdvb2dsZS5jb20+CisgIEplZmYgRGVhbiA8amVmZkBnb29nbGUuY29tPgorICBEYW5pZWwgRHVsaXR6IDxkYW5pZWxAZ29vZ2xlLmNvbT4KKyAgQ3JhaWcgU2lsdmVyc3RlaW4KKyAgUGF1bCBIYWFociA8aGFhaHJAZ29vZ2xlLmNvbT4KKyAgQ29yZXkgQW5kZXJzb24gPGNvcmluQGdvb2dsZS5jb20+CisgIChhbmQgbWFueSBvdGhlcnMpCisKK1Byb3RvMiBDKysgYW5kIEphdmEgcHJpbWFyeSBhdXRob3I6CisgIEtlbnRvbiBWYXJkYSA8a2VudG9uQGdvb2dsZS5jb20+CisKK1Byb3RvMiBQeXRob24gcHJpbWFyeSBhdXRob3JzOgorICBXaWxsIFJvYmluc29uIDxyb2JpbnNvbkBnb29nbGUuY29tPgorICBQZXRhciBQZXRyb3YgPHBldGFyQGdvb2dsZS5jb20+CisKK0xhcmdlIGNvZGUgY29udHJpYnV0aW9uczoKKyAgSmFzb24gSHN1ZWggPGphc29uaEBnb29nbGUuY29tPgorICBKb3NlcGggU2Nob3JyIDxqc2Nob3JyQGdvb2dsZS5jb20+CisgIFdlbmJvIFpodSA8d2VuYm96QGdvb2dsZS5jb20+CisKK0xhcmdlIHF1YW50aXR5IG9mIGNvZGUgcmV2aWV3czoKKyAgU2NvdHQgQnJ1Y2UgPHNicnVjZUBnb29nbGUuY29tPgorICBGcmFuayBZZWxsaW4KKyAgTmVhbCBOb3J3aXR6IDxubm9yd2l0ekBnb29nbGUuY29tPgorICBKZWZmcmV5IFlhc3NraW4gPGp5YXNza2luQGdvb2dsZS5jb20+CisgIEFtYnJvc2UgRmVpbnN0ZWluIDxhbWJyb3NlQGdvb2dsZS5jb20+CisKK0RvY3VtZW50YXRpb246CisgIExpc2EgQ2FyZXkgPGxjYXJleUBnb29nbGUuY29tPgorCitNYXZlbiBwYWNrYWdpbmc6CisgIEdyZWdvcnkgS2ljayA8Z2FrQGdvb2dsZS5jb20+CisKK1BhdGNoIGNvbnRyaWJ1dG9yczoKKyAgS2V2aW4gS28gPGtldmluLnMua29AZ21haWwuY29tPgorICAgICogU21hbGwgcGF0Y2ggdG8gaGFuZGxlIHRyYWlsaW5nIHNsYXNoZXMgaW4gLS1wcm90b19wYXRoIGZsYWcuCisgIEpvaGFuIEV1cGhyb3NpbmUgPHByb3BweUBhbWluY2hlLmNvbT4KKyAgICAqIFNtYWxsIHBhdGNoIHRvIGZpeCBQeXRob24gQ2FsbE1ldGhvZCgpLgorICBVbHJpY2ggS3VuaXR6IDxrdW5lQGRlaW5lLXRhbGVyLmRlPgorICAgICogU21hbGwgb3B0aW1pemF0aW9ucyB0byBQeXRob24gc2VyaWFsaXphdGlvbi4KKyAgTGVhbmRybyBMdWNhcmVsbGEgPGxsdWNheEBnbWFpbC5jb20+CisgICAgKiBWSSBzeW50YXggaGlnaGxpZ2h0aW5nIHR3ZWFrcy4KKyAgICAqIEZpeCBjb21waWxlciB0byBub3QgbWFrZSBvdXRwdXQgZXhlY3V0YWJsZS4KKyAgRGlsaXAgSm9zZXBoIDxkaWxpcC5hbnRvbnkuam9zZXBoQGdtYWlsLmNvbT4KKyAgICAqIEhldXJpc3RpYyBkZXRlY3Rpb24gb2Ygc3ViLW1lc3NhZ2VzIHdoZW4gcHJpbnRpbmcgdW5rbm93biBmaWVsZHMgaW4KKyAgICAgIHRleHQgZm9ybWF0LgorICBCcmlhbiBBdGtpbnNvbiA8bmFpcmI3NzRAZ21haWwuY29tPgorICAgICogQWRkZWQgQE92ZXJyaWRlIGFubm90YXRpb24gdG8gZ2VuZXJhdGVkIEphdmEgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4KKyAgVmluY2VudCBDaG9pbmnocmUgPENob2luaWVyZS5WaW5jZW50QGh5ZHJvLnFjLmNhPgorICAgICogVHJ1NjQgc3VwcG9ydC4KKyAgTW9udHkgVGF5bG9yIDxtb250eS50YXlsb3JAZ21haWwuY29tPgorICAgICogU29sYXJpcyAxMCArIFN1biBTdHVkaW8gZml4ZXMuCisgIEFsZWsgU3Rvcm0gPGFsZWsuc3Rvcm1AZ21haWwuY29tPgorICAgICogU2xpY2luZyBzdXBwb3J0IGZvciByZXBlYXRlZCBzY2FsYXIgZmllbGRzIGZvciB0aGUgUHl0aG9uIEFQSS4KKyAgT2xlZyBTbW9sc2t5IDxvbGVnLnNtb2xza3lAZ21haWwuY29tPgorICAgICogTVMgVmlzdWFsIFN0dWRpbyBlcnJvciBmb3JtYXQgb3B0aW9uLgorICAgICogRGV0ZWN0IHVub3JkZXJlZF9tYXAgaW4gc3RsX2hhc2gubTQuCisgIEJyaWFuIE9sc29uIDxicmlhbm9sc29uQGdvb2dsZS5jb20+CisgICAgKiBnemlwL3psaWIgSS9PIHN1cHBvcnQuCisgIE1pY2hhZWwgUG9vbGUgPG1kcG9vbGVAdHJvaWx1cy5vcmc+CisgICAgKiBGaXhlZCB3YXJuaW5ncyBhYm91dCBnZW5lcmF0ZWQgY29uc3RydWN0b3JzIG5vdCBleHBsaWNpdGx5IGluaXRpYWxpemluZworICAgICAgYWxsIGZpZWxkcyAob25seSBwcmVzZW50IHdpdGggY2VydGFpbiBjb21waWxlciBzZXR0aW5ncykuCisgICAgKiBBZGRlZCBnZW5lcmF0aW9uIG9mIGZpZWxkIG51bWJlciBjb25zdGFudHMuCisgIFdpbmsgU2F2aWxsZSA8d2lua0Bnb29nbGUuY29tPgorICAgICogRml4ZWQgaW5pdGlhbGl6YXRpb24gb3JkZXJpbmcgcHJvYmxlbSBpbiBsb2dnaW5nIGNvZGUuCisgIFdpbGwgUGllcmNlIDx3aWxscEBudWNsZWkuY29tPgorICAgICogU21hbGwgcGF0Y2ggaW1wcm92aW5nIHBlcmZvcm1hbmNlIG9mIGluIFB5dGhvbiBzZXJpYWxpemF0aW9uLgorICBBbGV4YW5kcmUgVmFzc2Fsb3R0aSA8YWxleGFuZHJlQHBlYWRyb3AuY29tPgorICAgICogRW1hY3MgbW9kZSBmb3IgUHJvdG9jb2wgQnVmZmVycyAoZWRpdG9ycy9wcm90b2J1Zi1tb2RlLmVsKS4KKyAgU2NvdHQgU3RhZmZvcmQgPHNjb3R0LnN0YWZmb3JkQGdtYWlsLmNvbT4KKyAgICAqIEFkZGVkIFN3YXAoKSwgU3dhcEVsZW1lbnRzKCksIGFuZCBSZW1vdmVMYXN0KCkgdG8gUmVmbGVjdGlvbiBpbnRlcmZhY2UuCisgIEFsZXhhbmRlciBNZWxuaWtvdiA8YWxtQHNpYm1haWwucnU+CisgICAgKiBIUFVYIHN1cHBvcnQuCisgIE9saXZlciBKb3dldHQgPG9saXZlci5qb3dldHRAZ21haWwuY29tPgorICAgICogRGV0ZWN0IHdoZXRoZXIgemxpYiBpcyBuZXcgZW5vdWdoIGluIGNvbmZpZ3VyZSBzY3JpcHQuCisgICAgKiBGaXhlcyBmb3IgU29sYXJpcyAxMCAzMi82NC1iaXQgY29uZnVzaW9uLgorICBFdmFuIEpvbmVzIDxldmFuakBtaXQuZWR1PgorICAgICogT3B0aW1pemUgSmF2YSBzZXJpYWxpemF0aW9uIGNvZGUgd2hlbiB3cml0aW5nIGEgc21hbGwgbWVzc2FnZSB0byBhIHN0cmVhbS4KKyAgICAqIE9wdGltaXplIEphdmEgc2VyaWFsaXphdGlvbiBvZiBzdHJpbmdzIHNvIHRoYXQgVVRGLTggZW5jb2RpbmcgaGFwcGVucyBvbmx5CisgICAgICBvbmNlIHBlciBzdHJpbmcgcGVyIHNlcmlhbGl6YXRpb24gY2FsbC4KKyAgICAqIENsZWFuIHVwIHNvbWUgSmF2YSB3YXJuaW5ncy4KKyAgICAqIEZpeCBidWcgd2l0aCBwZXJtYW5lbnQgY2FsbGJhY2tzIHRoYXQgZGVsZXRlIHRoZW1zZWx2ZXMgd2hlbiBydW4uCisgIE1pY2hhZWwgS3VjaGFyc2tpIDxtLmt1Y2hhcnNraUBnbWFpbC5jb20+CisgICAgKiBBZGRlZCBDb2RlZElucHV0U3RyZWFtLmdldFRvdGFsQnl0ZXNSZWFkKCkuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvQ09QWUlORy50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvQ09QWUlORy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1ZGI1NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9DT1BZSU5HLnR4dApAQCAtMCwwICsxLDMzIEBACitDb3B5cmlnaHQgMjAwOCwgR29vZ2xlIEluYy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgoraW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KK3RoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCitPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK0NvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b2NvbCBCdWZmZXIgY29tcGlsZXIgaXMgb3duZWQgYnkgdGhlIG93bmVyCitvZiB0aGUgaW5wdXQgZmlsZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBpdC4gIFRoaXMgY29kZSBpcyBub3QKK3N0YW5kYWxvbmUgYW5kIHJlcXVpcmVzIGEgc3VwcG9ydCBsaWJyYXJ5IHRvIGJlIGxpbmtlZCB3aXRoIGl0LiAgVGhpcworc3VwcG9ydCBsaWJyYXJ5IGlzIGl0c2VsZiBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBsaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0lOU1RBTEwudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0lOU1RBTEwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlM2IwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvSU5TVEFMTC50eHQKQEAgLTAsMCArMSwyMzcgQEAKK1RoaXMgZmlsZSBjb250YWlucyBkZXRhaWxlZCBidXQgZ2VuZXJpYyBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBhbmQKK2luc3RhbGxpbmcgdGhlIEMrKyBwYXJ0IG9mIHRoaXMgcHJvamVjdC4gIEZvciBzaG9ydGVyIGluc3RydWN0aW9ucywKK2FzIHdlbGwgYXMgaW5zdHJ1Y3Rpb25zIGZvciBjb21waWxpbmcgYW5kIGluc3RhbGxpbmcgdGhlIEphdmEgb3IKK1B5dGhvbiBwYXJ0cywgc2VlIFJFQURNRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBmcmVlIGRvY3VtZW50YXRpb247IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKK3VubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworCitCYXNpYyBJbnN0YWxsYXRpb24KKz09PT09PT09PT09PT09PT09PQorCisgICBUaGVzZSBhcmUgZ2VuZXJpYyBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgorCisgICBUaGUgYGNvbmZpZ3VyZScgc2hlbGwgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGNvcnJlY3QgdmFsdWVzIGZvcgordmFyaW91cyBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4gIEl0IHVzZXMKK3Rob3NlIHZhbHVlcyB0byBjcmVhdGUgYSBgTWFrZWZpbGUnIGluIGVhY2ggZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLgorSXQgbWF5IGFsc28gY3JlYXRlIG9uZSBvciBtb3JlIGAuaCcgZmlsZXMgY29udGFpbmluZyBzeXN0ZW0tZGVwZW5kZW50CitkZWZpbml0aW9ucy4gIEZpbmFsbHksIGl0IGNyZWF0ZXMgYSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdGF0dXMnIHRoYXQKK3lvdSBjYW4gcnVuIGluIHRoZSBmdXR1cmUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYW5kIGEKK2ZpbGUgYGNvbmZpZy5sb2cnIGNvbnRhaW5pbmcgY29tcGlsZXIgb3V0cHV0ICh1c2VmdWwgbWFpbmx5IGZvcgorZGVidWdnaW5nIGBjb25maWd1cmUnKS4KKworICAgSXQgY2FuIGFsc28gdXNlIGFuIG9wdGlvbmFsIGZpbGUgKHR5cGljYWxseSBjYWxsZWQgYGNvbmZpZy5jYWNoZScKK2FuZCBlbmFibGVkIHdpdGggYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnIG9yIHNpbXBseSBgLUMnKSB0aGF0IHNhdmVzCit0aGUgcmVzdWx0cyBvZiBpdHMgdGVzdHMgdG8gc3BlZWQgdXAgcmVjb25maWd1cmluZy4gIChDYWNoaW5nIGlzCitkaXNhYmxlZCBieSBkZWZhdWx0IHRvIHByZXZlbnQgcHJvYmxlbXMgd2l0aCBhY2NpZGVudGFsIHVzZSBvZiBzdGFsZQorY2FjaGUgZmlsZXMuKQorCisgICBJZiB5b3UgbmVlZCB0byBkbyB1bnVzdWFsIHRoaW5ncyB0byBjb21waWxlIHRoZSBwYWNrYWdlLCBwbGVhc2UgdHJ5Cit0byBmaWd1cmUgb3V0IGhvdyBgY29uZmlndXJlJyBjb3VsZCBjaGVjayB3aGV0aGVyIHRvIGRvIHRoZW0sIGFuZCBtYWlsCitkaWZmcyBvciBpbnN0cnVjdGlvbnMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlIGBSRUFETUUnIHNvIHRoZXkgY2FuCitiZSBjb25zaWRlcmVkIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgY2FjaGUsIGFuZCBhdAorc29tZSBwb2ludCBgY29uZmlnLmNhY2hlJyBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdQorbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorCisgICBUaGUgZmlsZSBgY29uZmlndXJlLmFjJyAob3IgYGNvbmZpZ3VyZS5pbicpIGlzIHVzZWQgdG8gY3JlYXRlCitgY29uZmlndXJlJyBieSBhIHByb2dyYW0gY2FsbGVkIGBhdXRvY29uZicuICBZb3Ugb25seSBuZWVkCitgY29uZmlndXJlLmFjJyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgaXQgb3IgcmVnZW5lcmF0ZSBgY29uZmlndXJlJyB1c2luZworYSBuZXdlciB2ZXJzaW9uIG9mIGBhdXRvY29uZicuCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gY29tcGlsZSB0aGlzIHBhY2thZ2UgaXM6CisKKyAgMS4gYGNkJyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBhbmQgdHlwZQorICAgICBgLi9jb25maWd1cmUnIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSBmb3IgeW91ciBzeXN0ZW0uICBJZiB5b3UncmUKKyAgICAgdXNpbmcgYGNzaCcgb24gYW4gb2xkIHZlcnNpb24gb2YgU3lzdGVtIFYsIHlvdSBtaWdodCBuZWVkIHRvIHR5cGUKKyAgICAgYHNoIC4vY29uZmlndXJlJyBpbnN0ZWFkIHRvIHByZXZlbnQgYGNzaCcgZnJvbSB0cnlpbmcgdG8gZXhlY3V0ZQorICAgICBgY29uZmlndXJlJyBpdHNlbGYuCisKKyAgICAgUnVubmluZyBgY29uZmlndXJlJyB0YWtlcyBhd2hpbGUuICBXaGlsZSBydW5uaW5nLCBpdCBwcmludHMgc29tZQorICAgICBtZXNzYWdlcyB0ZWxsaW5nIHdoaWNoIGZlYXR1cmVzIGl0IGlzIGNoZWNraW5nIGZvci4KKworICAyLiBUeXBlIGBtYWtlJyB0byBjb21waWxlIHRoZSBwYWNrYWdlLgorCisgIDMuIE9wdGlvbmFsbHksIHR5cGUgYG1ha2UgY2hlY2snIHRvIHJ1biBhbnkgc2VsZi10ZXN0cyB0aGF0IGNvbWUgd2l0aAorICAgICB0aGUgcGFja2FnZS4KKworICA0LiBUeXBlIGBtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBhbnkgZGF0YSBmaWxlcyBhbmQKKyAgICAgZG9jdW1lbnRhdGlvbi4KKworICA1LiBZb3UgY2FuIHJlbW92ZSB0aGUgcHJvZ3JhbSBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20gdGhlCisgICAgIHNvdXJjZSBjb2RlIGRpcmVjdG9yeSBieSB0eXBpbmcgYG1ha2UgY2xlYW4nLiAgVG8gYWxzbyByZW1vdmUgdGhlCisgICAgIGZpbGVzIHRoYXQgYGNvbmZpZ3VyZScgY3JlYXRlZCAoc28geW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvcgorICAgICBhIGRpZmZlcmVudCBraW5kIG9mIGNvbXB1dGVyKSwgdHlwZSBgbWFrZSBkaXN0Y2xlYW4nLiAgVGhlcmUgaXMKKyAgICAgYWxzbyBhIGBtYWtlIG1haW50YWluZXItY2xlYW4nIHRhcmdldCwgYnV0IHRoYXQgaXMgaW50ZW5kZWQgbWFpbmx5CisgICAgIGZvciB0aGUgcGFja2FnZSdzIGRldmVsb3BlcnMuICBJZiB5b3UgdXNlIGl0LCB5b3UgbWF5IGhhdmUgdG8gZ2V0CisgICAgIGFsbCBzb3J0cyBvZiBvdGhlciBwcm9ncmFtcyBpbiBvcmRlciB0byByZWdlbmVyYXRlIGZpbGVzIHRoYXQgY2FtZQorICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKK0NvbXBpbGVycyBhbmQgT3B0aW9ucworPT09PT09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgc3lzdGVtcyByZXF1aXJlIHVudXN1YWwgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24gb3IgbGlua2luZyB0aGF0Cit0aGUgYGNvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGtub3cgYWJvdXQuICBSdW4gYC4vY29uZmlndXJlIC0taGVscCcKK2ZvciBkZXRhaWxzIG9uIHNvbWUgb2YgdGhlIHBlcnRpbmVudCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKyAgIFlvdSBjYW4gZ2l2ZSBgY29uZmlndXJlJyBpbml0aWFsIHZhbHVlcyBmb3IgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCitieSBzZXR0aW5nIHZhcmlhYmxlcyBpbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluIHRoZSBlbnZpcm9ubWVudC4gIEhlcmUKK2lzIGFuIGV4YW1wbGU6CisKKyAgICAgLi9jb25maWd1cmUgQ0M9Yzg5IENGTEFHUz0tTzIgTElCUz0tbHBvc2l4CisKKyAgICpOb3RlIERlZmluaW5nIFZhcmlhYmxlczo6LCBmb3IgbW9yZSBkZXRhaWxzLgorCitDb21waWxpbmcgRm9yIE11bHRpcGxlIEFyY2hpdGVjdHVyZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBZb3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG1vcmUgdGhhbiBvbmUga2luZCBvZiBjb21wdXRlciBhdCB0aGUKK3NhbWUgdGltZSwgYnkgcGxhY2luZyB0aGUgb2JqZWN0IGZpbGVzIGZvciBlYWNoIGFyY2hpdGVjdHVyZSBpbiB0aGVpcgorb3duIGRpcmVjdG9yeS4gIFRvIGRvIHRoaXMsIHlvdSBtdXN0IHVzZSBhIHZlcnNpb24gb2YgYG1ha2UnIHRoYXQKK3N1cHBvcnRzIHRoZSBgVlBBVEgnIHZhcmlhYmxlLCBzdWNoIGFzIEdOVSBgbWFrZScuICBgY2QnIHRvIHRoZQorZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzIHRvIGdvIGFuZCBydW4KK3RoZSBgY29uZmlndXJlJyBzY3JpcHQuICBgY29uZmlndXJlJyBhdXRvbWF0aWNhbGx5IGNoZWNrcyBmb3IgdGhlCitzb3VyY2UgY29kZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgYGNvbmZpZ3VyZScgaXMgaW4gYW5kIGluIGAuLicuCisKKyAgIElmIHlvdSBoYXZlIHRvIHVzZSBhIGBtYWtlJyB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGBWUEFUSCcKK3ZhcmlhYmxlLCB5b3UgaGF2ZSB0byBjb21waWxlIHRoZSBwYWNrYWdlIGZvciBvbmUgYXJjaGl0ZWN0dXJlIGF0IGEKK3RpbWUgaW4gdGhlIHNvdXJjZSBjb2RlIGRpcmVjdG9yeS4gIEFmdGVyIHlvdSBoYXZlIGluc3RhbGxlZCB0aGUKK3BhY2thZ2UgZm9yIG9uZSBhcmNoaXRlY3R1cmUsIHVzZSBgbWFrZSBkaXN0Y2xlYW4nIGJlZm9yZSByZWNvbmZpZ3VyaW5nCitmb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUuCisKK0luc3RhbGxhdGlvbiBOYW1lcworPT09PT09PT09PT09PT09PT09CisKKyAgIEJ5IGRlZmF1bHQsIGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCB0aGUgcGFja2FnZSdzIGZpbGVzIGluCitgL3Vzci9sb2NhbC9iaW4nLCBgL3Vzci9sb2NhbC9tYW4nLCBldGMuICBZb3UgY2FuIHNwZWNpZnkgYW4KK2luc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBgL3Vzci9sb2NhbCcgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQorb3B0aW9uIGAtLXByZWZpeD1QQVRIJy4KKworICAgWW91IGNhbiBzcGVjaWZ5IHNlcGFyYXRlIGluc3RhbGxhdGlvbiBwcmVmaXhlcyBmb3IKK2FyY2hpdGVjdHVyZS1zcGVjaWZpYyBmaWxlcyBhbmQgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzLiAgSWYgeW91CitnaXZlIGBjb25maWd1cmUnIHRoZSBvcHRpb24gYC0tZXhlYy1wcmVmaXg9UEFUSCcsIHRoZSBwYWNrYWdlIHdpbGwgdXNlCitQQVRIIGFzIHRoZSBwcmVmaXggZm9yIGluc3RhbGxpbmcgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcy4KK0RvY3VtZW50YXRpb24gYW5kIG90aGVyIGRhdGEgZmlsZXMgd2lsbCBzdGlsbCB1c2UgdGhlIHJlZ3VsYXIgcHJlZml4LgorCisgICBJbiBhZGRpdGlvbiwgaWYgeW91IHVzZSBhbiB1bnVzdWFsIGRpcmVjdG9yeSBsYXlvdXQgeW91IGNhbiBnaXZlCitvcHRpb25zIGxpa2UgYC0tYmluZGlyPVBBVEgnIHRvIHNwZWNpZnkgZGlmZmVyZW50IHZhbHVlcyBmb3IgcGFydGljdWxhcgora2luZHMgb2YgZmlsZXMuICBSdW4gYGNvbmZpZ3VyZSAtLWhlbHAnIGZvciBhIGxpc3Qgb2YgdGhlIGRpcmVjdG9yaWVzCit5b3UgY2FuIHNldCBhbmQgd2hhdCBraW5kcyBvZiBmaWxlcyBnbyBpbiB0aGVtLgorCisgICBJZiB0aGUgcGFja2FnZSBzdXBwb3J0cyBpdCwgeW91IGNhbiBjYXVzZSBwcm9ncmFtcyB0byBiZSBpbnN0YWxsZWQKK3dpdGggYW4gZXh0cmEgcHJlZml4IG9yIHN1ZmZpeCBvbiB0aGVpciBuYW1lcyBieSBnaXZpbmcgYGNvbmZpZ3VyZScgdGhlCitvcHRpb24gYC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYJyBvciBgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVgnLgorCitPcHRpb25hbCBGZWF0dXJlcworPT09PT09PT09PT09PT09PT0KKworICAgU29tZSBwYWNrYWdlcyBwYXkgYXR0ZW50aW9uIHRvIGAtLWVuYWJsZS1GRUFUVVJFJyBvcHRpb25zIHRvCitgY29uZmlndXJlJywgd2hlcmUgRkVBVFVSRSBpbmRpY2F0ZXMgYW4gb3B0aW9uYWwgcGFydCBvZiB0aGUgcGFja2FnZS4KK1RoZXkgbWF5IGFsc28gcGF5IGF0dGVudGlvbiB0byBgLS13aXRoLVBBQ0tBR0UnIG9wdGlvbnMsIHdoZXJlIFBBQ0tBR0UKK2lzIHNvbWV0aGluZyBsaWtlIGBnbnUtYXMnIG9yIGB4JyAoZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0pLiAgVGhlCitgUkVBRE1FJyBzaG91bGQgbWVudGlvbiBhbnkgYC0tZW5hYmxlLScgYW5kIGAtLXdpdGgtJyBvcHRpb25zIHRoYXQgdGhlCitwYWNrYWdlIHJlY29nbml6ZXMuCisKKyAgIEZvciBwYWNrYWdlcyB0aGF0IHVzZSB0aGUgWCBXaW5kb3cgU3lzdGVtLCBgY29uZmlndXJlJyBjYW4gdXN1YWxseQorZmluZCB0aGUgWCBpbmNsdWRlIGFuZCBsaWJyYXJ5IGZpbGVzIGF1dG9tYXRpY2FsbHksIGJ1dCBpZiBpdCBkb2Vzbid0LAoreW91IGNhbiB1c2UgdGhlIGBjb25maWd1cmUnIG9wdGlvbnMgYC0teC1pbmNsdWRlcz1ESVInIGFuZAorYC0teC1saWJyYXJpZXM9RElSJyB0byBzcGVjaWZ5IHRoZWlyIGxvY2F0aW9ucy4KKworU3BlY2lmeWluZyB0aGUgU3lzdGVtIFR5cGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFRoZXJlIG1heSBiZSBzb21lIGZlYXR1cmVzIGBjb25maWd1cmUnIGNhbm5vdCBmaWd1cmUgb3V0CithdXRvbWF0aWNhbGx5LCBidXQgbmVlZHMgdG8gZGV0ZXJtaW5lIGJ5IHRoZSB0eXBlIG9mIG1hY2hpbmUgdGhlIHBhY2thZ2UKK3dpbGwgcnVuIG9uLiAgVXN1YWxseSwgYXNzdW1pbmcgdGhlIHBhY2thZ2UgaXMgYnVpbHQgdG8gYmUgcnVuIG9uIHRoZQorX3NhbWVfIGFyY2hpdGVjdHVyZXMsIGBjb25maWd1cmUnIGNhbiBmaWd1cmUgdGhhdCBvdXQsIGJ1dCBpZiBpdCBwcmludHMKK2EgbWVzc2FnZSBzYXlpbmcgaXQgY2Fubm90IGd1ZXNzIHRoZSBtYWNoaW5lIHR5cGUsIGdpdmUgaXQgdGhlCitgLS1idWlsZD1UWVBFJyBvcHRpb24uICBUWVBFIGNhbiBlaXRoZXIgYmUgYSBzaG9ydCBuYW1lIGZvciB0aGUgc3lzdGVtCit0eXBlLCBzdWNoIGFzIGBzdW40Jywgb3IgYSBjYW5vbmljYWwgbmFtZSB3aGljaCBoYXMgdGhlIGZvcm06CisKKyAgICAgQ1BVLUNPTVBBTlktU1lTVEVNCisKK3doZXJlIFNZU1RFTSBjYW4gaGF2ZSBvbmUgb2YgdGhlc2UgZm9ybXM6CisKKyAgICAgT1MgS0VSTkVMLU9TCisKKyAgIFNlZSB0aGUgZmlsZSBgY29uZmlnLnN1YicgZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgZWFjaCBmaWVsZC4gIElmCitgY29uZmlnLnN1YicgaXNuJ3QgaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCB0aGVuIHRoaXMgcGFja2FnZSBkb2Vzbid0CituZWVkIHRvIGtub3cgdGhlIG1hY2hpbmUgdHlwZS4KKworICAgSWYgeW91IGFyZSBfYnVpbGRpbmdfIGNvbXBpbGVyIHRvb2xzIGZvciBjcm9zcy1jb21waWxpbmcsIHlvdSBzaG91bGQKK3VzZSB0aGUgYC0tdGFyZ2V0PVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2Ygc3lzdGVtIHRoZXkgd2lsbAorcHJvZHVjZSBjb2RlIGZvci4KKworICAgSWYgeW91IHdhbnQgdG8gX3VzZV8gYSBjcm9zcyBjb21waWxlciwgdGhhdCBnZW5lcmF0ZXMgY29kZSBmb3IgYQorcGxhdGZvcm0gZGlmZmVyZW50IGZyb20gdGhlIGJ1aWxkIHBsYXRmb3JtLCB5b3Ugc2hvdWxkIHNwZWNpZnkgdGhlCisiaG9zdCIgcGxhdGZvcm0gKGkuZS4sIHRoYXQgb24gd2hpY2ggdGhlIGdlbmVyYXRlZCBwcm9ncmFtcyB3aWxsCitldmVudHVhbGx5IGJlIHJ1bikgd2l0aCBgLS1ob3N0PVRZUEUnLgorCitTaGFyaW5nIERlZmF1bHRzCis9PT09PT09PT09PT09PT09CisKKyAgIElmIHlvdSB3YW50IHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgYGNvbmZpZ3VyZScgc2NyaXB0cyB0byBzaGFyZSwKK3lvdSBjYW4gY3JlYXRlIGEgc2l0ZSBzaGVsbCBzY3JpcHQgY2FsbGVkIGBjb25maWcuc2l0ZScgdGhhdCBnaXZlcworZGVmYXVsdCB2YWx1ZXMgZm9yIHZhcmlhYmxlcyBsaWtlIGBDQycsIGBjYWNoZV9maWxlJywgYW5kIGBwcmVmaXgnLgorYGNvbmZpZ3VyZScgbG9va3MgZm9yIGBQUkVGSVgvc2hhcmUvY29uZmlnLnNpdGUnIGlmIGl0IGV4aXN0cywgdGhlbgorYFBSRUZJWC9ldGMvY29uZmlnLnNpdGUnIGlmIGl0IGV4aXN0cy4gIE9yLCB5b3UgY2FuIHNldCB0aGUKK2BDT05GSUdfU0lURScgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzaXRlIHNjcmlwdC4KK0Egd2FybmluZzogbm90IGFsbCBgY29uZmlndXJlJyBzY3JpcHRzIGxvb2sgZm9yIGEgc2l0ZSBzY3JpcHQuCisKK0RlZmluaW5nIFZhcmlhYmxlcworPT09PT09PT09PT09PT09PT09CisKKyAgIFZhcmlhYmxlcyBub3QgZGVmaW5lZCBpbiBhIHNpdGUgc2hlbGwgc2NyaXB0IGNhbiBiZSBzZXQgaW4gdGhlCitlbnZpcm9ubWVudCBwYXNzZWQgdG8gYGNvbmZpZ3VyZScuICBIb3dldmVyLCBzb21lIHBhY2thZ2VzIG1heSBydW4KK2NvbmZpZ3VyZSBhZ2FpbiBkdXJpbmcgdGhlIGJ1aWxkLCBhbmQgdGhlIGN1c3RvbWl6ZWQgdmFsdWVzIG9mIHRoZXNlCit2YXJpYWJsZXMgbWF5IGJlIGxvc3QuICBJbiBvcmRlciB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHlvdSBzaG91bGQgc2V0Cit0aGVtIGluIHRoZSBgY29uZmlndXJlJyBjb21tYW5kIGxpbmUsIHVzaW5nIGBWQVI9dmFsdWUnLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgLi9jb25maWd1cmUgQ0M9L3Vzci9sb2NhbDIvYmluL2djYworCit3aWxsIGNhdXNlIHRoZSBzcGVjaWZpZWQgZ2NjIHRvIGJlIHVzZWQgYXMgdGhlIEMgY29tcGlsZXIgKHVubGVzcyBpdCBpcworb3ZlcnJpZGRlbiBpbiB0aGUgc2l0ZSBzaGVsbCBzY3JpcHQpLgorCitgY29uZmlndXJlJyBJbnZvY2F0aW9uCis9PT09PT09PT09PT09PT09PT09PT09CisKKyAgIGBjb25maWd1cmUnIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIGNvbnRyb2wgaG93IGl0CitvcGVyYXRlcy4KKworYC0taGVscCcKK2AtaCcKKyAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KKworYC0tdmVyc2lvbicKK2AtVicKKyAgICAgUHJpbnQgdGhlIHZlcnNpb24gb2YgQXV0b2NvbmYgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYGNvbmZpZ3VyZScKKyAgICAgc2NyaXB0LCBhbmQgZXhpdC4KKworYC0tY2FjaGUtZmlsZT1GSUxFJworICAgICBFbmFibGUgdGhlIGNhY2hlOiB1c2UgYW5kIHNhdmUgdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3RzIGluIEZJTEUsCisgICAgIHRyYWRpdGlvbmFsbHkgYGNvbmZpZy5jYWNoZScuICBGSUxFIGRlZmF1bHRzIHRvIGAvZGV2L251bGwnIHRvCisgICAgIGRpc2FibGUgY2FjaGluZy4KKworYC0tY29uZmlnLWNhY2hlJworYC1DJworICAgICBBbGlhcyBmb3IgYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnLgorCitgLS1xdWlldCcKK2AtLXNpbGVudCcKK2AtcScKKyAgICAgRG8gbm90IHByaW50IG1lc3NhZ2VzIHNheWluZyB3aGljaCBjaGVja3MgYXJlIGJlaW5nIG1hZGUuICBUbworICAgICBzdXBwcmVzcyBhbGwgbm9ybWFsIG91dHB1dCwgcmVkaXJlY3QgaXQgdG8gYC9kZXYvbnVsbCcgKGFueSBlcnJvcgorICAgICBtZXNzYWdlcyB3aWxsIHN0aWxsIGJlIHNob3duKS4KKworYC0tc3JjZGlyPURJUicKKyAgICAgTG9vayBmb3IgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBpbiBkaXJlY3RvcnkgRElSLiAgVXN1YWxseQorICAgICBgY29uZmlndXJlJyBjYW4gZGV0ZXJtaW5lIHRoYXQgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkuCisKK2Bjb25maWd1cmUnIGFsc28gYWNjZXB0cyBzb21lIG90aGVyLCBub3Qgd2lkZWx5IHVzZWZ1bCwgb3B0aW9ucy4gIFJ1bgorYGNvbmZpZ3VyZSAtLWhlbHAnIGZvciBtb3JlIGRldGFpbHMuCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9SRUFETUUuY2hyb21pdW0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvUkVBRE1FLmNocm9taXVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NzI0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvUkVBRE1FLmNocm9taXVtCkBAIC0wLDAgKzEsMzYgQEAKK05hbWU6IFByb3RvY29sIEJ1ZmZlcnMKK1Nob3J0IE5hbWU6IHByb3RvYnVmCitVUkw6IGh0dHA6Ly9wcm90b2J1Zi5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsKK0xpY2Vuc2U6IEJTRAorTGljZW5zZSBGaWxlOiBDT1BZSU5HLnR4dAorVmVyc2lvbjogdW5rbm93bgorUmV2aXNpb246IHI0MjMKK1NlY3VyaXR5IENyaXRpY2FsOiB5ZXMKKworTG9jYWwgZmlsZXMgKG5vdCB0YWtlbiBmcm9tIHVwc3RyZWFtKToKK1JFQURNRS5jaHJvbWl1bQorY29uZmlnLmgKK2Rlc2NyaXB0b3IyX3BiLnB5Citwcm90b2J1Zl9saXRlX2phdmFfZGVzY3JpcHRvcl9wcm90by5weQorcHJvdG9idWZfbGl0ZV9qYXZhX3BhcnNlX3BvbS5weQorCitBIHByb3RvYnVmLmd5cCBmaWxlIGhhcyBiZWVuIGFkZGVkIGZvciBidWlsZGluZyB3aXRoIENocm9taXVtLgorCitUaGlzIGNvZGUgaGFzIGJlZW4gcGF0Y2hlZCB0byBzdXBwb3J0IHVua25vd24gZmllbGQgcmV0ZW50aW9uIGluIHByb3RvYnVmLWxpdGUuCitTZWUgcjYyMzMxIGZvciB0aGUgcGF0Y2guCisKK1RoaXMgY29kZSBoYXMgYmVlbiBwYXRjaGVkIHRvIGVuc3VyZSB0aGF0IGZpbGVzIGluIHRoZSB0YXJnZXQgcHJvdG9idWZfbGl0ZQorZG8gbm90IGluY2x1ZGUgaGVhZGVycyBmcm9tIHByb3RvYnVmX2Z1bGwuIFNlZSByMTczMjI4IGZvciB0aGUgcGF0Y2guCisKK1JldmlzaW9ucyByNDI3IGFuZCByNDMwIHdlcmUgY2hlcnJ5LXBpY2tlZCBmcm9tIHVwc3RyZWFtLgorCitDaGVycnktcGljayBwYXRjaCBmcm9tIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi9pc3N1ZXMvZGV0YWlsP2lkPTQyNS4KKworTm90ZXMgYWJvdXQgSmF2YToKK1dlIGhhdmUgbm90IGZvcmtlZCB0aGUgSmF2YSB2ZXJzaW9uIG9mIHByb3RvYnVmLWxpdGUsIHNvIHRoZSBKYXZhIHZlcnNpb24gZG9lcworbm90IHN1cHBvcnQgdW5rbm93biBmaWVsZCByZXRlbnRpb24uCisKK1RoZSBsaXN0IG9mIEphdmEgZmlsZXMgaW5jbHVkZWQgaW4gdGhlIGxpdGUgcHJvZmlsZSBmb3IgSmF2YSBpcyBwYXJzZWQgZnJvbSB0aGUKK21hdmVuIGphdmEvcG9tLnhtbCBieSB0aGUgc2NyaXB0IHByb3RvYnVmX2xpdGVfamF2YV9wYXJzZV9wb20ucHkuIFNlZQorJ2phdmFjX2luY2x1ZGVzJyB2YXJpYWJsZSBpbiBwcm90b2J1Zl9saXRlX2phdmFsaWIgR1lQIHRhcmdldC4KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL1JFQURNRS50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGY2NjA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL1JFQURNRS50eHQKQEAgLTAsMCArMSwxNTIgQEAKK1Byb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KK2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9wcm90b2NvbGJ1ZmZlcnMvCisKK0MrKyBJbnN0YWxsYXRpb24gLSBVbml4Cis9PT09PT09PT09PT09PT09PT09PT09PQorCitUbyBidWlsZCBhbmQgaW5zdGFsbCB0aGUgQysrIFByb3RvY29sIEJ1ZmZlciBydW50aW1lIGFuZCB0aGUgUHJvdG9jb2wKK0J1ZmZlciBjb21waWxlciAocHJvdG9jKSBleGVjdXRlIHRoZSBmb2xsb3dpbmc6CisKKyAgJCAuL2NvbmZpZ3VyZQorICAkIG1ha2UKKyAgJCBtYWtlIGNoZWNrCisgICQgbWFrZSBpbnN0YWxsCisKK0lmICJtYWtlIGNoZWNrIiBmYWlscywgeW91IGNhbiBzdGlsbCBpbnN0YWxsLCBidXQgaXQgaXMgbGlrZWx5IHRoYXQKK3NvbWUgZmVhdHVyZXMgb2YgdGhpcyBsaWJyYXJ5IHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IG9uIHlvdXIgc3lzdGVtLgorUHJvY2VlZCBhdCB5b3VyIG93biByaXNrLgorCisibWFrZSBpbnN0YWxsIiBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4KKworRm9yIGFkdmFuY2VkIHVzYWdlIGluZm9ybWF0aW9uIG9uIGNvbmZpZ3VyZSBhbmQgbWFrZSwgc2VlIElOU1RBTEwudHh0LgorCisqKiBIaW50IG9uIGluc3RhbGwgbG9jYXRpb24gKioKKworICBCeSBkZWZhdWx0LCB0aGUgcGFja2FnZSB3aWxsIGJlIGluc3RhbGxlZCB0byAvdXNyL2xvY2FsLiAgSG93ZXZlciwKKyAgb24gbWFueSBwbGF0Zm9ybXMsIC91c3IvbG9jYWwvbGliIGlzIG5vdCBwYXJ0IG9mIExEX0xJQlJBUllfUEFUSC4KKyAgWW91IGNhbiBhZGQgaXQsIGJ1dCBpdCBtYXkgYmUgZWFzaWVyIHRvIGp1c3QgaW5zdGFsbCB0byAvdXNyCisgIGluc3RlYWQuICBUbyBkbyB0aGlzLCBpbnZva2UgY29uZmlndXJlIGFzIGZvbGxvd3M6CisKKyAgICAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCisKKyAgSWYgeW91IGFscmVhZHkgYnVpbHQgdGhlIHBhY2thZ2Ugd2l0aCBhIGRpZmZlcmVudCBwcmVmaXgsIG1ha2Ugc3VyZQorICB0byBydW4gIm1ha2UgY2xlYW4iIGJlZm9yZSBidWlsZGluZyBhZ2Fpbi4KKworKiogQ29tcGlsaW5nIGRlcGVuZGVudCBwYWNrYWdlcyAqKgorCisgIFRvIGNvbXBpbGUgYSBwYWNrYWdlIHRoYXQgdXNlcyBQcm90b2NvbCBCdWZmZXJzLCB5b3UgbmVlZCB0byBwYXNzCisgIHZhcmlvdXMgZmxhZ3MgdG8geW91ciBjb21waWxlciBhbmQgbGlua2VyLiAgQXMgb2YgdmVyc2lvbiAyLjIuMCwKKyAgUHJvdG9jb2wgQnVmZmVycyBpbnRlZ3JhdGVzIHdpdGggcGtnLWNvbmZpZyB0byBtYW5hZ2UgdGhpcy4gIElmIHlvdQorICBoYXZlIHBrZy1jb25maWcgaW5zdGFsbGVkLCB0aGVuIHlvdSBjYW4gaW52b2tlIGl0IHRvIGdldCBhIGxpc3Qgb2YKKyAgZmxhZ3MgbGlrZSBzbzoKKworICAgIHBrZy1jb25maWcgLS1jZmxhZ3MgcHJvdG9idWYgICAgICAgICAjIHByaW50IGNvbXBpbGVyIGZsYWdzCisgICAgcGtnLWNvbmZpZyAtLWxpYnMgcHJvdG9idWYgICAgICAgICAgICMgcHJpbnQgbGlua2VyIGZsYWdzCisgICAgcGtnLWNvbmZpZyAtLWNmbGFncyAtLWxpYnMgcHJvdG9idWYgICMgcHJpbnQgYm90aAorCisgIEZvciBleGFtcGxlOgorCisgICAgYysrIG15X3Byb2dyYW0uY2MgbXlfcHJvdG8ucGIuY2MgYHBrZy1jb25maWcgLS1jZmxhZ3MgLS1saWJzIHByb3RvYnVmYAorCisgIE5vdGUgdGhhdCBwYWNrYWdlcyB3cml0dGVuIHByaW9yIHRvIHRoZSAyLjIuMCByZWxlYXNlIG9mIFByb3RvY29sCisgIEJ1ZmZlcnMgbWF5IG5vdCB5ZXQgaW50ZWdyYXRlIHdpdGggcGtnLWNvbmZpZyB0byBnZXQgZmxhZ3MsIGFuZCBtYXkKKyAgbm90IHBhc3MgdGhlIGNvcnJlY3Qgc2V0IG9mIGZsYWdzIHRvIGNvcnJlY3RseSBsaW5rIGFnYWluc3QKKyAgbGlicHJvdG9idWYuICBJZiB0aGUgcGFja2FnZSBpbiBxdWVzdGlvbiB1c2VzIGF1dG9jb25mLCB5b3UgY2FuCisgIG9mdGVuIGZpeCB0aGUgcHJvYmxlbSBieSBpbnZva2luZyBpdHMgY29uZmlndXJlIHNjcmlwdCBsaWtlOgorCisgICAgY29uZmlndXJlIENYWEZMQUdTPSIkKHBrZy1jb25maWcgLS1jZmxhZ3MgcHJvdG9idWYpIiBcCisgICAgICAgICAgICAgIExJQlM9IiQocGtnLWNvbmZpZyAtLWxpYnMgcHJvdG9idWYpIgorCisgIFRoaXMgd2lsbCBmb3JjZSBpdCB0byB1c2UgdGhlIGNvcnJlY3QgZmxhZ3MuCisKKyAgSWYgeW91IGFyZSB3cml0aW5nIGFuIGF1dG9jb25mLWJhc2VkIHBhY2thZ2UgdGhhdCB1c2VzIFByb3RvY29sCisgIEJ1ZmZlcnMsIHlvdSBzaG91bGQgcHJvYmFibHkgdXNlIHRoZSBQS0dfQ0hFQ0tfTU9EVUxFUyBtYWNybyBpbiB5b3VyCisgIGNvbmZpZ3VyZSBzY3JpcHQgbGlrZToKKworICAgIFBLR19DSEVDS19NT0RVTEVTKFtwcm90b2J1Zl0sIFtwcm90b2J1Zl0pCisKKyAgU2VlIHRoZSBwa2ctY29uZmlnIG1hbiBwYWdlIGZvciBtb3JlIGluZm8uCisKKyAgSWYgeW91IG9ubHkgd2FudCBwcm90b2J1Zi1saXRlLCBzdWJzdGl0dXRlICJwcm90b2J1Zi1saXRlIiBpbiBwbGFjZQorICBvZiAicHJvdG9idWYiIGluIHRoZXNlIGV4YW1wbGVzLgorCisqKiBOb3RlIGZvciBjcm9zcy1jb21waWxpbmcgKioKKworICBUaGUgbWFrZWZpbGVzIG5vcm1hbGx5IGludm9rZSB0aGUgcHJvdG9jIGV4ZWN1dGFibGUgdGhhdCB0aGV5IGp1c3QKKyAgYnVpbHQgaW4gb3JkZXIgdG8gYnVpbGQgdGVzdHMuICBXaGVuIGNyb3NzLWNvbXBpbGluZywgdGhlIHByb3RvYworICBleGVjdXRhYmxlIG1heSBub3QgYmUgZXhlY3V0YWJsZSBvbiB0aGUgaG9zdCBtYWNoaW5lLiAgSW4gdGhpcyBjYXNlLAorICB5b3UgbXVzdCBidWlsZCBhIGNvcHkgb2YgcHJvdG9jIGZvciB0aGUgaG9zdCBtYWNoaW5lIGZpcnN0LCB0aGVuIHVzZQorICB0aGUgLS13aXRoLXByb3RvYyBvcHRpb24gdG8gdGVsbCBjb25maWd1cmUgdG8gdXNlIGl0IGluc3RlYWQuICBGb3IKKyAgZXhhbXBsZToKKworICAgIC4vY29uZmlndXJlIC0td2l0aC1wcm90b2M9cHJvdG9jCisKKyAgVGhpcyB3aWxsIHVzZSB0aGUgaW5zdGFsbGVkIHByb3RvYyAoZm91bmQgaW4geW91ciAkUEFUSCkgaW5zdGVhZCBvZgorICB0cnlpbmcgdG8gZXhlY3V0ZSB0aGUgb25lIGJ1aWx0IGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4gIFlvdSBjYW4KKyAgYWxzbyB1c2UgYW4gZXhlY3V0YWJsZSB0aGF0IGhhc24ndCBiZWVuIGluc3RhbGxlZC4gIEZvciBleGFtcGxlLCBpZgorICB5b3UgYnVpbHQgdGhlIHByb3RvYnVmIHBhY2thZ2UgZm9yIHlvdXIgaG9zdCBtYWNoaW5lIGluIC4uL2hvc3QsCisgIHlvdSBtaWdodCBkbzoKKworICAgIC4vY29uZmlndXJlIC0td2l0aC1wcm90b2M9Li4vaG9zdC9zcmMvcHJvdG9jCisKKyAgRWl0aGVyIHdheSwgeW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIHByb3RvYyBleGVjdXRhYmxlIHlvdSB1c2UKKyAgaGFzIHRoZSBzYW1lIHZlcnNpb24gYXMgdGhlIHByb3RvYnVmIHNvdXJjZSBjb2RlIHlvdSBhcmUgdHJ5aW5nIHRvCisgIHVzZSBpdCB3aXRoLgorCisqKiBOb3RlIGZvciBTb2xhcmlzIHVzZXJzICoqCisKKyAgU29sYXJpcyAxMCB4ODYgaGFzIGEgYnVnIHRoYXQgd2lsbCBtYWtlIGxpbmtpbmcgZmFpbCwgY29tcGxhaW5pbmcKKyAgYWJvdXQgbGlic3RkYysrLmxhIGJlaW5nIGludmFsaWQuICBXZSBoYXZlIGluY2x1ZGVkIGEgd29yay1hcm91bmQKKyAgaW4gdGhpcyBwYWNrYWdlLiAgVG8gdXNlIHRoZSB3b3JrLWFyb3VuZCwgcnVuIGNvbmZpZ3VyZSBhcyBmb2xsb3dzOgorCisgICAgLi9jb25maWd1cmUgTERGTEFHUz0tTCRQV0Qvc3JjL3NvbGFyaXMKKworICBTZWUgc3JjL3NvbGFyaXMvbGlic3RkYysrLmxhIGZvciBtb3JlIGluZm8gb24gdGhpcyBidWcuCisKKyoqIE5vdGUgZm9yIEhQIEMrKyBUcnU2NCB1c2VycyAqKgorCisgIFRvIGNvbXBpbGUgaW52b2tlIGNvbmZpZ3VyZSBhcyBmb2xsb3dzOgorCisgICAgLi9jb25maWd1cmUgQ1hYRkxBR1M9Ii1PIC1zdGQgYW5zaSAtaWVlZSAtRF9fVVNFX1NURF9JT1NUUkVBTSIKKworICBBbHNvLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBnbWFrZSBpbnN0ZWFkIG9mIG1ha2UuCisKK0MrKyBJbnN0YWxsYXRpb24gLSBXaW5kb3dzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJZiB5b3UgYXJlIHVzaW5nIE1pY29zb2Z0IFZpc3VhbCBDKyssIHNlZSB2c3Byb2plY3RzL3JlYWRtZS50eHQuCisKK0lmIHlvdSBhcmUgdXNpbmcgQ3lnd2luIG9yIE1pbkdXLCBmb2xsb3cgdGhlIFVuaXggaW5zdGFsbGF0aW9uCitpbnN0cnVjdGlvbnMsIGFib3ZlLgorCitCaW5hcnkgQ29tcGF0aWJpbGl0eSBXYXJuaW5nCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0R1ZSB0byB0aGUgbmF0dXJlIG9mIEMrKywgaXQgaXMgdW5saWtlbHkgdGhhdCBhbnkgdHdvIHZlcnNpb25zIG9mIHRoZQorUHJvdG9jb2wgQnVmZmVycyBDKysgcnVudGltZSBsaWJyYXJpZXMgd2lsbCBoYXZlIGNvbXBhdGlibGUgQUJJcy4KK1RoYXQgaXMsIGlmIHlvdSBsaW5rZWQgYW4gZXhlY3V0YWJsZSBhZ2FpbnN0IGFuIG9sZGVyIHZlcnNpb24gb2YKK2xpYnByb3RvYnVmLCBpdCBpcyB1bmxpa2VseSB0byB3b3JrIHdpdGggYSBuZXdlciB2ZXJzaW9uIHdpdGhvdXQKK3JlLWNvbXBpbGluZy4gIFRoaXMgcHJvYmxlbSwgd2hlbiBpdCBvY2N1cnMsIHdpbGwgbm9ybWFsbHkgYmUgZGV0ZWN0ZWQKK2ltbWVkaWF0ZWx5IG9uIHN0YXJ0dXAgb2YgeW91ciBhcHAuICBTdGlsbCwgeW91IG1heSB3YW50IHRvIGNvbnNpZGVyCit1c2luZyBzdGF0aWMgbGlua2FnZS4gIFlvdSBjYW4gY29uZmlndXJlIHRoaXMgcGFja2FnZSB0byBpbnN0YWxsCitzdGF0aWMgbGlicmFyaWVzIG9ubHkgdXNpbmc6CisKKyAgLi9jb25maWd1cmUgLS1kaXNhYmxlLXNoYXJlZAorCitKYXZhIGFuZCBQeXRob24gSW5zdGFsbGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBKYXZhIGFuZCBQeXRob24gcnVudGltZSBsaWJyYXJpZXMgZm9yIFByb3RvY29sIEJ1ZmZlcnMgYXJlIGxvY2F0ZWQKK2luIHRoZSBqYXZhIGFuZCBweXRob24gZGlyZWN0b3JpZXMuICBTZWUgdGhlIFJFQURNRSBmaWxlIGluIGVhY2gKK2RpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29tcGlsZSBhbmQgaW5zdGFsbCB0aGVtLgorTm90ZSB0aGF0IGJvdGggb2YgdGhlbSByZXF1aXJlIHlvdSB0byBmaXJzdCBpbnN0YWxsIHRoZSBQcm90b2NvbAorQnVmZmVyIGNvbXBpbGVyIChwcm90b2MpLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBDKysgcGFja2FnZS4KKworVXNhZ2UKKz09PT09CisKK1RoZSBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIGZvciBQcm90b2NvbCBCdWZmZXJzIGlzIGF2YWlsYWJsZSB2aWEgdGhlCit3ZWIgYXQ6CisKKyAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL3Byb3RvY29sYnVmZmVycy8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9fX2luaXRfXy5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMzk1OTdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMiBAQAorCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25maWcuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzlhOTViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZpZy5oCkBAIC0wLDAgKzEsMTYxIEBACisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogdGhlIG5hbWUgb2YgPGhhc2hfc2V0PiAqLworI2RlZmluZSBIQVNIX01BUF9DTEFTUyBoYXNoX21hcAorCisvKiB0aGUgbG9jYXRpb24gb2YgPGhhc2hfbWFwPiAqLworI2lmIGRlZmluZWQoVVNFX1NUTFBPUlQpCisjZGVmaW5lIEhBU0hfTUFQX0ggPGhhc2hfbWFwPgorI2Vsc2UKKyNkZWZpbmUgSEFTSF9NQVBfSCA8ZXh0L2hhc2hfbWFwPgorI2VuZGlmCisKKy8qIHRoZSBuYW1lc3BhY2Ugb2YgaGFzaF9tYXAvaGFzaF9zZXQgKi8KKyNpZiBkZWZpbmVkKFVTRV9TVExQT1JUKQorI2RlZmluZSBIQVNIX05BTUVTUEFDRSBzdGQKKyNlbHNlCisjZGVmaW5lIEhBU0hfTkFNRVNQQUNFIF9fZ251X2N4eAorI2VuZGlmCisKKy8qIHRoZSBuYW1lIG9mIDxoYXNoX3NldD4gKi8KKyNkZWZpbmUgSEFTSF9TRVRfQ0xBU1MgaGFzaF9zZXQKKworLyogdGhlIGxvY2F0aW9uIG9mIDxoYXNoX3NldD4gKi8KKyNpZiBkZWZpbmVkKFVTRV9TVExQT1JUKQorI2RlZmluZSBIQVNIX1NFVF9IIDxoYXNoX3NldD4KKyNlbHNlCisjZGVmaW5lIEhBU0hfU0VUX0ggPGV4dC9oYXNoX3NldD4KKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0RMRkNOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZ0cnVuY2F0ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRlRSVU5DQVRFIDEKKworLyogZGVmaW5lIGlmIHRoZSBjb21waWxlciBoYXMgaGFzaF9tYXAgKi8KKyNkZWZpbmUgSEFWRV9IQVNIX01BUCAxCisKKy8qIGRlZmluZSBpZiB0aGUgY29tcGlsZXIgaGFzIGhhc2hfc2V0ICovCisjZGVmaW5lIEhBVkVfSEFTSF9TRVQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9MSU1JVFNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1zZXQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX01FTVNFVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWtkaXInIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX01LRElSIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIFBPU0lYIHRocmVhZHMgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMuICovCisjZGVmaW5lIEhBVkVfUFRIUkVBRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNocicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSQ0hSIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJlcnJvcicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSRVJST1IgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSVE9MIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIEVuYWJsZSBjbGFzc2VzIHVzaW5nIHpsaWIgY29tcHJlc3Npb24uICovCisjZGVmaW5lIEhBVkVfWkxJQiAxCisKKyNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCisjdW5kZWYgSEFWRV9IQVNIX01BUAorI3VuZGVmIEhBVkVfSEFTSF9TRVQKKyNlbmRpZgorCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyNkZWZpbmUgUEFDS0FHRSAicHJvdG9idWYiCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAicHJvdG9idWZAZ29vZ2xlZ3JvdXBzLmNvbSIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX05BTUUgIlByb3RvY29sIEJ1ZmZlcnMiCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIlByb3RvY29sIEJ1ZmZlcnMgMi4zLjAiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJwcm90b2J1ZiIKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIyLjMuMCIKKworLyogRGVmaW5lIHRvIG5lY2Vzc2FyeSBzeW1ib2wgaWYgdGhpcyBjb25zdGFudCB1c2VzIGEgbm9uLXN0YW5kYXJkIG5hbWUgb24KKyAgIHlvdXIgc3lzdGVtLiAqLworLyogI3VuZGVmIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjZGVmaW5lIFZFUlNJT04gIjIuMy4wIgorCisvKiBEZWZpbmUgdG8gMSBpZiBvbiBBSVggMy4KKyAgIFN5c3RlbSBoZWFkZXJzIHNvbWV0aW1lcyBkZWZpbmUgdGhpcy4KKyAgIFdlIGp1c3Qgd2FudCB0byBhdm9pZCBhIHJlZGVmaW5pdGlvbiBlcnJvciBtZXNzYWdlLiAgKi8KKyNpZm5kZWYgX0FMTF9TT1VSQ0UKKy8qICMgdW5kZWYgX0FMTF9TT1VSQ0UgKi8KKyNlbmRpZgorCisvKiBFbmFibGUgR05VIGV4dGVuc2lvbnMgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlbS4gICovCisjaWZuZGVmIF9HTlVfU09VUkNFCisjIGRlZmluZSBfR05VX1NPVVJDRSAxCisjZW5kaWYKKworLyogRGVmaW5lIHRvIDEgaWYgb24gTUlOSVguICovCisvKiAjdW5kZWYgX01JTklYICovCisKKy8qIERlZmluZSB0byAyIGlmIHRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSBQT1NJWC4xIGZlYXR1cmVzIGV4Y2VwdCB3aXRoCisgICB0aGlzIGRlZmluZWQuICovCisvKiAjdW5kZWYgX1BPU0lYXzFfU09VUkNFICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBgc3RhdCcgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAqLworLyogI3VuZGVmIF9QT1NJWF9TT1VSQ0UgKi8KKworLyogRW5hYmxlIGV4dGVuc2lvbnMgb24gU29sYXJpcy4gICovCisjaWZuZGVmIF9fRVhURU5TSU9OU19fCisjIGRlZmluZSBfX0VYVEVOU0lPTlNfXyAxCisjZW5kaWYKKyNpZm5kZWYgX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTCisjIGRlZmluZSBfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgMQorI2VuZGlmCisjaWZuZGVmIF9UQU5ERU1fU09VUkNFCisjIGRlZmluZSBfVEFOREVNX1NPVVJDRSAxCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9kZXNjcmlwdG9yX3BiMi5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9kZXNjcmlwdG9yX3BiMi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYmFjZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2Rlc2NyaXB0b3JfcGIyLnB5CkBAIC0wLDAgKzEsMTE3MiBAQAorIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCByZWZsZWN0aW9uCisjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQorCisKK0RFU0NSSVBUT1IgPSBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAorICBuYW1lPSdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bycsCisgIHBhY2thZ2U9J2dvb2dsZS5wcm90b2J1ZicsCisgIHNlcmlhbGl6ZWRfcGI9J1xuIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXHgxMlx4MGZnb29nbGUucHJvdG9idWZcIkdcblx4MTFceDQ2aWxlRGVzY3JpcHRvclNldFx4MTJceDMyXG5ceDA0XHg2NmlsZVx4MThceDAxIFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvXCJceGRjXHgwMlxuXHgxM1x4NDZpbGVEZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4MGZcblx4MDdwYWNrYWdlXHgxOFx4MDIgXHgwMShcdFx4MTJceDEyXG5cbmRlcGVuZGVuY3lceDE4XHgwMyBceDAzKFx0XHgxMlx4MzZcblx4MGNtZXNzYWdlX3R5cGVceDE4XHgwNCBceDAzKFx4MGJceDMyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvXHgxMlx4Mzdcblx0ZW51bV90eXBlXHgxOFx4MDUgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9ceDEyXHgzOFxuXHgwN3NlcnZpY2VceDE4XHgwNiBceDAzKFx4MGJceDMyXCcuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9ceDEyXHgzOFxuXHRleHRlbnNpb25ceDE4XHgwNyBceDAzKFx4MGJceDMyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9ceDEyLVxuXHgwN29wdGlvbnNceDE4XHgwOCBceDAxKFx4MGJceDMyXHgxYy5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIlx4YTlceDAzXG5ceDBmXHg0NFx4NjVzY3JpcHRvclByb3RvXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFx4MTJceDM0XG5ceDA1XHg2NmllbGRceDE4XHgwMiBceDAzKFx4MGJceDMyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9ceDEyXHgzOFxuXHRleHRlbnNpb25ceDE4XHgwNiBceDAzKFx4MGJceDMyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9ceDEyXHgzNVxuXHgwYm5lc3RlZF90eXBlXHgxOFx4MDMgXHgwMyhceDBiXHgzMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1x4MTJceDM3XG5cdGVudW1fdHlwZVx4MThceDA0IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvXHgxMkhcblx4MGZceDY1eHRlbnNpb25fcmFuZ2VceDE4XHgwNSBceDAzKFx4MGJceDMyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlXHgxMlx4MzBcblx4MDdvcHRpb25zXHgxOFx4MDcgXHgwMShceDBiXHgzMlx4MWYuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zXHgxYSxcblx4MGVceDQ1eHRlbnNpb25SYW5nZVx4MTJcclxuXHgwNXN0YXJ0XHgxOFx4MDEgXHgwMShceDA1XHgxMlx4MGJcblx4MDNceDY1bmRceDE4XHgwMiBceDAxKFx4MDVcIlx4OTRceDA1XG5ceDE0XHg0NmllbGREZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4MGVcblx4MDZudW1iZXJceDE4XHgwMyBceDAxKFx4MDVceDEyOlxuXHgwNWxhYmVsXHgxOFx4MDQgXHgwMShceDBlXHgzMisuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsXHgxMlx4Mzhcblx4MDR0eXBlXHgxOFx4MDUgXHgwMShceDBlXHgzMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVceDEyXHgxMVxuXHR0eXBlX25hbWVceDE4XHgwNiBceDAxKFx0XHgxMlx4MTBcblx4MDhceDY1eHRlbmRlZVx4MThceDAyIFx4MDEoXHRceDEyXHgxNVxuXHJkZWZhdWx0X3ZhbHVlXHgxOFx4MDcgXHgwMShcdFx4MTIuXG5ceDA3b3B0aW9uc1x4MThceDA4IFx4MDEoXHgwYlx4MzJceDFkLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnNcIlx4YjZceDAyXG5ceDA0VHlwZVx4MTJceDBmXG5ceDBiVFlQRV9ET1VCTEVceDEwXHgwMVx4MTJceDBlXG5cblRZUEVfRkxPQVRceDEwXHgwMlx4MTJceDBlXG5cblRZUEVfSU5UNjRceDEwXHgwM1x4MTJceDBmXG5ceDBiVFlQRV9VSU5UNjRceDEwXHgwNFx4MTJceDBlXG5cblRZUEVfSU5UMzJceDEwXHgwNVx4MTJceDEwXG5ceDBjVFlQRV9GSVhFRDY0XHgxMFx4MDZceDEyXHgxMFxuXHgwY1RZUEVfRklYRUQzMlx4MTBceDA3XHgxMlxyXG5cdFRZUEVfQk9PTFx4MTBceDA4XHgxMlx4MGZcblx4MGJUWVBFX1NUUklOR1x4MTBcdFx4MTJceDBlXG5cblRZUEVfR1JPVVBceDEwXG5ceDEyXHgxMFxuXHgwY1RZUEVfTUVTU0FHRVx4MTBceDBiXHgxMlx4MGVcblxuVFlQRV9CWVRFU1x4MTBceDBjXHgxMlx4MGZcblx4MGJUWVBFX1VJTlQzMlx4MTBcclx4MTJcclxuXHRUWVBFX0VOVU1ceDEwXHgwZVx4MTJceDExXG5cclRZUEVfU0ZJWEVEMzJceDEwXHgwZlx4MTJceDExXG5cclRZUEVfU0ZJWEVENjRceDEwXHgxMFx4MTJceDBmXG5ceDBiVFlQRV9TSU5UMzJceDEwXHgxMVx4MTJceDBmXG5ceDBiVFlQRV9TSU5UNjRceDEwXHgxMlwiQ1xuXHgwNUxhYmVsXHgxMlx4MTJcblx4MGVMQUJFTF9PUFRJT05BTFx4MTBceDAxXHgxMlx4MTJcblx4MGVMQUJFTF9SRVFVSVJFRFx4MTBceDAyXHgxMlx4MTJcblx4MGVMQUJFTF9SRVBFQVRFRFx4MTBceDAzXCJceDhjXHgwMVxuXHgxM1x4NDVudW1EZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4Mzhcblx4MDV2YWx1ZVx4MThceDAyIFx4MDMoXHgwYlx4MzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9ceDEyLVxuXHgwN29wdGlvbnNceDE4XHgwMyBceDAxKFx4MGJceDMyXHgxYy5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNcImxcblx4MThceDQ1bnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4MGVcblx4MDZudW1iZXJceDE4XHgwMiBceDAxKFx4MDVceDEyXHgzMlxuXHgwN29wdGlvbnNceDE4XHgwMyBceDAxKFx4MGJceDMyIS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9uc1wiXHg5MFx4MDFcblx4MTZTZXJ2aWNlRGVzY3JpcHRvclByb3RvXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFx4MTJceDM2XG5ceDA2bWV0aG9kXHgxOFx4MDIgXHgwMyhceDBiXHgzMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1x4MTJceDMwXG5ceDA3b3B0aW9uc1x4MThceDAzIFx4MDEoXHgwYlx4MzJceDFmLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9uc1wiXHg3ZlxuXHgxNU1ldGhvZERlc2NyaXB0b3JQcm90b1x4MTJceDBjXG5ceDA0bmFtZVx4MThceDAxIFx4MDEoXHRceDEyXHgxMlxuXG5pbnB1dF90eXBlXHgxOFx4MDIgXHgwMShcdFx4MTJceDEzXG5ceDBib3V0cHV0X3R5cGVceDE4XHgwMyBceDAxKFx0XHgxMi9cblx4MDdvcHRpb25zXHgxOFx4MDQgXHgwMShceDBiXHgzMlx4MWUuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNcIlx4YTRceDAzXG5ceDBiXHg0NmlsZU9wdGlvbnNceDEyXHgxNFxuXHgwY2phdmFfcGFja2FnZVx4MThceDAxIFx4MDEoXHRceDEyXHgxY1xuXHgxNGphdmFfb3V0ZXJfY2xhc3NuYW1lXHgxOFx4MDggXHgwMShcdFx4MTJcIlxuXHgxM2phdmFfbXVsdGlwbGVfZmlsZXNceDE4XG4gXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJceDQ2XG5ceDBjb3B0aW1pemVfZm9yXHgxOFx0IFx4MDEoXHgwZVx4MzIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6XHgwNVNQRUVEXHgxMiFcblx4MTNceDYzXHg2M19nZW5lcmljX3NlcnZpY2VzXHgxOFx4MTAgXHgwMShceDA4Olx4MDR0cnVlXHgxMiNcblx4MTVqYXZhX2dlbmVyaWNfc2VydmljZXNceDE4XHgxMSBceDAxKFx4MDg6XHgwNHRydWVceDEyIVxuXHgxM3B5X2dlbmVyaWNfc2VydmljZXNceDE4XHgxMiBceDAxKFx4MDg6XHgwNHRydWVceDEyXHg0M1xuXHgxNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXHgxOFx4ZTdceDA3IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uXCI6XG5ceDBjT3B0aW1pemVNb2RlXHgxMlx0XG5ceDA1U1BFRURceDEwXHgwMVx4MTJcclxuXHRDT0RFX1NJWkVceDEwXHgwMlx4MTJceDEwXG5ceDBjTElURV9SVU5USU1FXHgxMFx4MDMqXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJcIlx4YjhceDAxXG5ceDBlTWVzc2FnZU9wdGlvbnNceDEyJlxuXHgxN21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XHgxOFx4MDEgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTIuXG5ceDFmbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvclx4MThceDAyIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXHg0M1xuXHgxNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXHgxOFx4ZTdceDA3IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKlx0XHgwOFx4ZThceDA3XHgxMFx4ODBceDgwXHg4MFx4ODBceDAyXCJceDk0XHgwMlxuXHgwY1x4NDZpZWxkT3B0aW9uc1x4MTI6XG5ceDA1XHg2M3R5cGVceDE4XHgwMSBceDAxKFx4MGVceDMyIy5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlOlx4MDZTVFJJTkdceDEyXHgwZVxuXHgwNnBhY2tlZFx4MThceDAyIFx4MDEoXHgwOFx4MTJceDE5XG5cbmRlcHJlY2F0ZWRceDE4XHgwMyBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlx4MWNcblx4MTRceDY1eHBlcmltZW50YWxfbWFwX2tleVx4MThcdCBceDAxKFx0XHgxMlx4NDNcblx4MTR1bmludGVycHJldGVkX29wdGlvblx4MThceGU3XHgwNyBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblwiL1xuXHgwNVx4NDNUeXBlXHgxMlxuXG5ceDA2U1RSSU5HXHgxMFx4MDBceDEyXHgwOFxuXHgwNFx4NDNPUkRceDEwXHgwMVx4MTJceDEwXG5ceDBjU1RSSU5HX1BJRUNFXHgxMFx4MDIqXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJcIl1cblx4MGJceDQ1bnVtT3B0aW9uc1x4MTJceDQzXG5ceDE0dW5pbnRlcnByZXRlZF9vcHRpb25ceDE4XHhlN1x4MDcgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJcImJcblx4MTBceDQ1bnVtVmFsdWVPcHRpb25zXHgxMlx4NDNcblx4MTR1bmludGVycHJldGVkX29wdGlvblx4MThceGU3XHgwNyBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFx4MDhceGU4XHgwN1x4MTBceDgwXHg4MFx4ODBceDgwXHgwMlwiYFxuXHgwZVNlcnZpY2VPcHRpb25zXHgxMlx4NDNcblx4MTR1bmludGVycHJldGVkX29wdGlvblx4MThceGU3XHgwNyBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFx4MDhceGU4XHgwN1x4MTBceDgwXHg4MFx4ODBceDgwXHgwMlwiX1xuXHJNZXRob2RPcHRpb25zXHgxMlx4NDNcblx4MTR1bmludGVycHJldGVkX29wdGlvblx4MThceGU3XHgwNyBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFx4MDhceGU4XHgwN1x4MTBceDgwXHg4MFx4ODBceDgwXHgwMlwiXHg4NVx4MDJcblx4MTNVbmludGVycHJldGVkT3B0aW9uXHgxMjtcblx4MDRuYW1lXHgxOFx4MDIgXHgwMyhceDBiXHgzMi0uZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnRceDEyXHgxOFxuXHgxMGlkZW50aWZpZXJfdmFsdWVceDE4XHgwMyBceDAxKFx0XHgxMlx4MWFcblx4MTJwb3NpdGl2ZV9pbnRfdmFsdWVceDE4XHgwNCBceDAxKFx4MDRceDEyXHgxYVxuXHgxMm5lZ2F0aXZlX2ludF92YWx1ZVx4MThceDA1IFx4MDEoXHgwM1x4MTJceDE0XG5ceDBjXHg2NG91YmxlX3ZhbHVlXHgxOFx4MDYgXHgwMShceDAxXHgxMlx4MTRcblx4MGNzdHJpbmdfdmFsdWVceDE4XHgwNyBceDAxKFx4MGNceDFhXHgzM1xuXHgwOE5hbWVQYXJ0XHgxMlx4MTFcblx0bmFtZV9wYXJ0XHgxOFx4MDEgXHgwMihcdFx4MTJceDE0XG5ceDBjaXNfZXh0ZW5zaW9uXHgxOFx4MDIgXHgwMihceDA4XHg0Milcblx4MTNceDYzb20uZ29vZ2xlLnByb3RvYnVmQlx4MTBceDQ0XHg2NXNjcmlwdG9yUHJvdG9zSFx4MDEnKQorCisKKworX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEUgPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAorICBuYW1lPSdUeXBlJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZScsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgdmFsdWVzPVsKKyAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0RPVUJMRScsIGluZGV4PTAsIG51bWJlcj0xLAorICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0ZMT0FUJywgaW5kZXg9MSwgbnVtYmVyPTIsCisgICAgICBvcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfSU5UNjQnLCBpbmRleD0yLCBudW1iZXI9MywKKyAgICAgIG9wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSksCisgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9VSU5UNjQnLCBpbmRleD0zLCBudW1iZXI9NCwKKyAgICAgIG9wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSksCisgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9JTlQzMicsIGluZGV4PTQsIG51bWJlcj01LAorICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0ZJWEVENjQnLCBpbmRleD01LCBudW1iZXI9NiwKKyAgICAgIG9wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSksCisgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9GSVhFRDMyJywgaW5kZXg9NiwgbnVtYmVyPTcsCisgICAgICBvcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfQk9PTCcsIGluZGV4PTcsIG51bWJlcj04LAorICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX1NUUklORycsIGluZGV4PTgsIG51bWJlcj05LAorICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0dST1VQJywgaW5kZXg9OSwgbnVtYmVyPTEwLAorICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX01FU1NBR0UnLCBpbmRleD0xMCwgbnVtYmVyPTExLAorICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0JZVEVTJywgaW5kZXg9MTEsIG51bWJlcj0xMiwKKyAgICAgIG9wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSksCisgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9VSU5UMzInLCBpbmRleD0xMiwgbnVtYmVyPTEzLAorICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX0VOVU0nLCBpbmRleD0xMywgbnVtYmVyPTE0LAorICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICBuYW1lPSdUWVBFX1NGSVhFRDMyJywgaW5kZXg9MTQsIG51bWJlcj0xNSwKKyAgICAgIG9wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSksCisgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9TRklYRUQ2NCcsIGluZGV4PTE1LCBudW1iZXI9MTYsCisgICAgICBvcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J1RZUEVfU0lOVDMyJywgaW5kZXg9MTYsIG51bWJlcj0xNywKKyAgICAgIG9wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSksCisgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nVFlQRV9TSU5UNjQnLCBpbmRleD0xNywgbnVtYmVyPTE4LAorICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lKSwKKyAgXSwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIG9wdGlvbnM9Tm9uZSwKKyAgc2VyaWFsaXplZF9zdGFydD0xMTg3LAorICBzZXJpYWxpemVkX2VuZD0xNDk3LAorKQorCitfRklFTERERVNDUklQVE9SUFJPVE9fTEFCRUwgPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAorICBuYW1lPSdMYWJlbCcsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICB2YWx1ZXM9WworICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J0xBQkVMX09QVElPTkFMJywgaW5kZXg9MCwgbnVtYmVyPTEsCisgICAgICBvcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J0xBQkVMX1JFUVVJUkVEJywgaW5kZXg9MSwgbnVtYmVyPTIsCisgICAgICBvcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J0xBQkVMX1JFUEVBVEVEJywgaW5kZXg9MiwgbnVtYmVyPTMsCisgICAgICBvcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUpLAorICBdLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgb3B0aW9ucz1Ob25lLAorICBzZXJpYWxpemVkX3N0YXJ0PTE0OTksCisgIHNlcmlhbGl6ZWRfZW5kPTE1NjYsCispCisKK19GSUxFT1BUSU9OU19PUFRJTUlaRU1PREUgPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAorICBuYW1lPSdPcHRpbWl6ZU1vZGUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIHZhbHVlcz1bCisgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nU1BFRUQnLCBpbmRleD0wLCBudW1iZXI9MSwKKyAgICAgIG9wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSksCisgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nQ09ERV9TSVpFJywgaW5kZXg9MSwgbnVtYmVyPTIsCisgICAgICBvcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J0xJVEVfUlVOVElNRScsIGluZGV4PTIsIG51bWJlcj0zLAorICAgICAgb3B0aW9ucz1Ob25lLAorICAgICAgdHlwZT1Ob25lKSwKKyAgXSwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIG9wdGlvbnM9Tm9uZSwKKyAgc2VyaWFsaXplZF9zdGFydD0yNDQ5LAorICBzZXJpYWxpemVkX2VuZD0yNTA3LAorKQorCitfRklFTERPUFRJT05TX0NUWVBFID0gZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcigKKyAgbmFtZT0nQ1R5cGUnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIHZhbHVlcz1bCisgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nU1RSSU5HJywgaW5kZXg9MCwgbnVtYmVyPTAsCisgICAgICBvcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J0NPUkQnLCBpbmRleD0xLCBudW1iZXI9MSwKKyAgICAgIG9wdGlvbnM9Tm9uZSwKKyAgICAgIHR5cGU9Tm9uZSksCisgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgICAgbmFtZT0nU1RSSU5HX1BJRUNFJywgaW5kZXg9MiwgbnVtYmVyPTIsCisgICAgICBvcHRpb25zPU5vbmUsCisgICAgICB0eXBlPU5vbmUpLAorICBdLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgb3B0aW9ucz1Ob25lLAorICBzZXJpYWxpemVkX3N0YXJ0PTI5MjYsCisgIHNlcmlhbGl6ZWRfZW5kPTI5NzMsCispCisKKworX0ZJTEVERVNDUklQVE9SU0VUID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdGaWxlRGVzY3JpcHRvclNldCcsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0JywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgZmllbGRzPVsKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2ZpbGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBzZXJpYWxpemVkX3N0YXJ0PTUzLAorICBzZXJpYWxpemVkX2VuZD0xMjQsCispCisKKworX0ZJTEVERVNDUklQVE9SUFJPVE8gPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0ZpbGVEZXNjcmlwdG9yUHJvdG8nLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgZmllbGRzPVsKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncGFja2FnZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZScsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdkZXBlbmRlbmN5JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5JywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J21lc3NhZ2VfdHlwZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlJywgaW5kZXg9MywKKyAgICAgIG51bWJlcj00LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZW51bV90eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUnLCBpbmRleD00LAorICAgICAgbnVtYmVyPTUsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdzZXJ2aWNlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zZXJ2aWNlJywgaW5kZXg9NSwKKyAgICAgIG51bWJlcj02LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZXh0ZW5zaW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24nLCBpbmRleD02LAorICAgICAgbnVtYmVyPTcsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5vcHRpb25zJywgaW5kZXg9NywKKyAgICAgIG51bWJlcj04LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBvcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTI3LAorICBzZXJpYWxpemVkX2VuZD00NzUsCispCisKKworX0RFU0NSSVBUT1JQUk9UT19FWFRFTlNJT05SQU5HRSA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nRXh0ZW5zaW9uUmFuZ2UnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBmaWVsZHM9WworICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nc3RhcnQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2Uuc3RhcnQnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdlbmQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UuZW5kJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBzZXJpYWxpemVkX3N0YXJ0PTg1OSwKKyAgc2VyaWFsaXplZF9lbmQ9OTAzLAorKQorCitfREVTQ1JJUFRPUlBST1RPID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdEZXNjcmlwdG9yUHJvdG8nLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8nLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBmaWVsZHM9WworICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2ZpZWxkJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZXh0ZW5zaW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbicsIGluZGV4PTIsCisgICAgICBudW1iZXI9NiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25lc3RlZF90eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5lc3RlZF90eXBlJywgaW5kZXg9MywKKyAgICAgIG51bWJlcj0zLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZW51bV90eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZScsIGluZGV4PTQsCisgICAgICBudW1iZXI9NCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2V4dGVuc2lvbl9yYW5nZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb25fcmFuZ2UnLCBpbmRleD01LAorICAgICAgbnVtYmVyPTUsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9wdGlvbnMnLCBpbmRleD02LAorICAgICAgbnVtYmVyPTcsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bX0RFU0NSSVBUT1JQUk9UT19FWFRFTlNJT05SQU5HRSwgXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIG9wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgc2VyaWFsaXplZF9zdGFydD00NzgsCisgIHNlcmlhbGl6ZWRfZW5kPTkwMywKKykKKworCitfRklFTERERVNDUklQVE9SUFJPVE8gPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0ZpZWxkRGVzY3JpcHRvclByb3RvJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8nLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBmaWVsZHM9WworICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbnVtYmVyJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubnVtYmVyJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbGFiZWwnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5sYWJlbCcsIGluZGV4PTIsCisgICAgICBudW1iZXI9NCwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTEsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd0eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZScsIGluZGV4PTMsCisgICAgICBudW1iZXI9NSwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTEsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd0eXBlX25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUnLCBpbmRleD00LAorICAgICAgbnVtYmVyPTYsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nZXh0ZW5kZWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZScsIGluZGV4PTUsCisgICAgICBudW1iZXI9MiwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdkZWZhdWx0X3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZScsIGluZGV4PTYsCisgICAgICBudW1iZXI9NywgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub3B0aW9ucycsIGluZGV4PTcsCisgICAgICBudW1iZXI9OCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgICBfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRSwKKyAgICBfRklFTERERVNDUklQVE9SUFJPVE9fTEFCRUwsCisgIF0sCisgIG9wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgc2VyaWFsaXplZF9zdGFydD05MDYsCisgIHNlcmlhbGl6ZWRfZW5kPTE1NjYsCispCisKKworX0VOVU1ERVNDUklQVE9SUFJPVE8gPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J0VudW1EZXNjcmlwdG9yUHJvdG8nLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgZmllbGRzPVsKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nb3B0aW9ucycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucycsIGluZGV4PTIsCisgICAgICBudW1iZXI9MywgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBzZXJpYWxpemVkX3N0YXJ0PTE1NjksCisgIHNlcmlhbGl6ZWRfZW5kPTE3MDksCispCisKKworX0VOVU1WQUxVRURFU0NSSVBUT1JQUk9UTyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgZmllbGRzPVsKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdudW1iZXInLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubnVtYmVyJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nb3B0aW9ucycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5vcHRpb25zJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBvcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MTcxMSwKKyAgc2VyaWFsaXplZF9lbmQ9MTgxOSwKKykKKworCitfU0VSVklDRURFU0NSSVBUT1JQUk9UTyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nU2VydmljZURlc2NyaXB0b3JQcm90bycsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8nLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBmaWVsZHM9WworICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtZXRob2QnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCcsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMnLCBpbmRleD0yLAorICAgICAgbnVtYmVyPTMsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgXSwKKyAgZXh0ZW5zaW9ucz1bCisgIF0sCisgIG5lc3RlZF90eXBlcz1bXSwKKyAgZW51bV90eXBlcz1bCisgIF0sCisgIG9wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKKyAgc2VyaWFsaXplZF9zdGFydD0xODIyLAorICBzZXJpYWxpemVkX2VuZD0xOTY2LAorKQorCisKK19NRVRIT0RERVNDUklQVE9SUFJPVE8gPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01ldGhvZERlc2NyaXB0b3JQcm90bycsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bycsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGZpZWxkcz1bCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSduYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0naW5wdXRfdHlwZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J291dHB1dF90eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3B0aW9ucycsIGluZGV4PTMsCisgICAgICBudW1iZXI9NCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBzZXJpYWxpemVkX3N0YXJ0PTE5NjgsCisgIHNlcmlhbGl6ZWRfZW5kPTIwOTUsCispCisKKworX0ZJTEVPUFRJT05TID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdGaWxlT3B0aW9ucycsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgZmllbGRzPVsKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2phdmFfcGFja2FnZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZScsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdqYXZhX291dGVyX2NsYXNzbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj04LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2phdmFfbXVsdGlwbGVfZmlsZXMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX211bHRpcGxlX2ZpbGVzJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj0xMCwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J29wdGltaXplX2ZvcicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9wdGltaXplX2ZvcicsIGluZGV4PTMsCisgICAgICBudW1iZXI9OSwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9MSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2NjX2dlbmVyaWNfc2VydmljZXMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jY19nZW5lcmljX3NlcnZpY2VzJywgaW5kZXg9NCwKKyAgICAgIG51bWJlcj0xNiwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1UcnVlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0namF2YV9nZW5lcmljX3NlcnZpY2VzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9nZW5lcmljX3NlcnZpY2VzJywgaW5kZXg9NSwKKyAgICAgIG51bWJlcj0xNywgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1UcnVlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ncHlfZ2VuZXJpY19zZXJ2aWNlcycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnB5X2dlbmVyaWNfc2VydmljZXMnLCBpbmRleD02LAorICAgICAgbnVtYmVyPTE4LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPVRydWUsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9NywKKyAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICAgIF9GSUxFT1BUSU9OU19PUFRJTUlaRU1PREUsCisgIF0sCisgIG9wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1UcnVlLAorICBleHRlbnNpb25fcmFuZ2VzPVsoMTAwMCwgNTM2ODcwOTEyKSwgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0yMDk4LAorICBzZXJpYWxpemVkX2VuZD0yNTE4LAorKQorCisKK19NRVNTQUdFT1BUSU9OUyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nTWVzc2FnZU9wdGlvbnMnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucycsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGZpZWxkcz1bCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0JywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj0xLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3InLCBpbmRleD0xLAorICAgICAgbnVtYmVyPTIsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBvcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9VHJ1ZSwKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bKDEwMDAsIDUzNjg3MDkxMiksIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MjUyMSwKKyAgc2VyaWFsaXplZF9lbmQ9MjcwNSwKKykKKworCitfRklFTERPUFRJT05TID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAorICBuYW1lPSdGaWVsZE9wdGlvbnMnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBmaWVsZHM9WworICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nY3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuY3R5cGUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTEsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdwYWNrZWQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMucGFja2VkJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0yLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2RlcHJlY2F0ZWQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuZGVwcmVjYXRlZCcsIGluZGV4PTIsCisgICAgICBudW1iZXI9MywgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J2V4cGVyaW1lbnRhbF9tYXBfa2V5JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmV4cGVyaW1lbnRhbF9tYXBfa2V5JywgaW5kZXg9MywKKyAgICAgIG51bWJlcj05LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3VuaW50ZXJwcmV0ZWRfb3B0aW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9NCwKKyAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICAgIF9GSUVMRE9QVElPTlNfQ1RZUEUsCisgIF0sCisgIG9wdGlvbnM9Tm9uZSwKKyAgaXNfZXh0ZW5kYWJsZT1UcnVlLAorICBleHRlbnNpb25fcmFuZ2VzPVsoMTAwMCwgNTM2ODcwOTEyKSwgXSwKKyAgc2VyaWFsaXplZF9zdGFydD0yNzA4LAorICBzZXJpYWxpemVkX2VuZD0yOTg0LAorKQorCisKK19FTlVNT1BUSU9OUyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nRW51bU9wdGlvbnMnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucycsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGZpZWxkcz1bCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBvcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9VHJ1ZSwKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bKDEwMDAsIDUzNjg3MDkxMiksIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9Mjk4NiwKKyAgc2VyaWFsaXplZF9lbmQ9MzA3OSwKKykKKworCitfRU5VTVZBTFVFT1BUSU9OUyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKKyAgbmFtZT0nRW51bVZhbHVlT3B0aW9ucycsCisgIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBmaWVsZHM9WworICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndW5pbnRlcnByZXRlZF9vcHRpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9MCwKKyAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBvcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9VHJ1ZSwKKyAgZXh0ZW5zaW9uX3Jhbmdlcz1bKDEwMDAsIDUzNjg3MDkxMiksIF0sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MzA4MSwKKyAgc2VyaWFsaXplZF9lbmQ9MzE3OSwKKykKKworCitfU0VSVklDRU9QVElPTlMgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1NlcnZpY2VPcHRpb25zJywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMnLAorICBmaWxlbmFtZT1Ob25lLAorICBmaWxlPURFU0NSSVBUT1IsCisgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICBmaWVsZHM9WworICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0ndW5pbnRlcnByZXRlZF9vcHRpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbicsIGluZGV4PTAsCisgICAgICBudW1iZXI9OTk5LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPVRydWUsCisgIGV4dGVuc2lvbl9yYW5nZXM9WygxMDAwLCA1MzY4NzA5MTIpLCBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTMxODEsCisgIHNlcmlhbGl6ZWRfZW5kPTMyNzcsCispCisKKworX01FVEhPRE9QVElPTlMgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J01ldGhvZE9wdGlvbnMnLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgZmllbGRzPVsKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3VuaW50ZXJwcmV0ZWRfb3B0aW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbicsIGluZGV4PTAsCisgICAgICBudW1iZXI9OTk5LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICBdLAorICBleHRlbnNpb25zPVsKKyAgXSwKKyAgbmVzdGVkX3R5cGVzPVtdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPVRydWUsCisgIGV4dGVuc2lvbl9yYW5nZXM9WygxMDAwLCA1MzY4NzA5MTIpLCBdLAorICBzZXJpYWxpemVkX3N0YXJ0PTMyNzksCisgIHNlcmlhbGl6ZWRfZW5kPTMzNzQsCispCisKKworX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlQgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J05hbWVQYXJ0JywKKyAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCcsCisgIGZpbGVuYW1lPU5vbmUsCisgIGZpbGU9REVTQ1JJUFRPUiwKKyAgY29udGFpbmluZ190eXBlPU5vbmUsCisgIGZpZWxkcz1bCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSduYW1lX3BhcnQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCcsIGluZGV4PTAsCisgICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0yLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdpc19leHRlbnNpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0LmlzX2V4dGVuc2lvbicsIGluZGV4PTEsCisgICAgICBudW1iZXI9MiwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0yLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W10sCisgIGVudW1fdHlwZXM9WworICBdLAorICBvcHRpb25zPU5vbmUsCisgIGlzX2V4dGVuZGFibGU9RmFsc2UsCisgIGV4dGVuc2lvbl9yYW5nZXM9W10sCisgIHNlcmlhbGl6ZWRfc3RhcnQ9MzU4NywKKyAgc2VyaWFsaXplZF9lbmQ9MzYzOCwKKykKKworX1VOSU5URVJQUkVURURPUFRJT04gPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgIG5hbWU9J1VuaW50ZXJwcmV0ZWRPcHRpb24nLAorICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uJywKKyAgZmlsZW5hbWU9Tm9uZSwKKyAgZmlsZT1ERVNDUklQVE9SLAorICBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgZmllbGRzPVsKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5hbWUnLCBpbmRleD0wLAorICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdpZGVudGlmaWVyX3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlJywgaW5kZXg9MSwKKyAgICAgIG51bWJlcj0zLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3Bvc2l0aXZlX2ludF92YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ucG9zaXRpdmVfaW50X3ZhbHVlJywgaW5kZXg9MiwKKyAgICAgIG51bWJlcj00LCB0eXBlPTQsIGNwcF90eXBlPTQsIGxhYmVsPTEsCisgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAorICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKKyAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCisgICAgICBvcHRpb25zPU5vbmUpLAorICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgbmFtZT0nbmVnYXRpdmVfaW50X3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uZWdhdGl2ZV9pbnRfdmFsdWUnLCBpbmRleD0zLAorICAgICAgbnVtYmVyPTUsIHR5cGU9MywgY3BwX3R5cGU9MiwgbGFiZWw9MSwKKyAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCisgICAgICBuYW1lPSdkb3VibGVfdmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmRvdWJsZV92YWx1ZScsIGluZGV4PTQsCisgICAgICBudW1iZXI9NiwgdHlwZT0xLCBjcHBfdHlwZT01LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCisgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAorICAgICAgb3B0aW9ucz1Ob25lKSwKKyAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKKyAgICAgIG5hbWU9J3N0cmluZ192YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlJywgaW5kZXg9NSwKKyAgICAgIG51bWJlcj03LCB0eXBlPTEyLCBjcHBfdHlwZT05LCBsYWJlbD0xLAorICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9IiIsCisgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgIG9wdGlvbnM9Tm9uZSksCisgIF0sCisgIGV4dGVuc2lvbnM9WworICBdLAorICBuZXN0ZWRfdHlwZXM9W19VTklOVEVSUFJFVEVET1BUSU9OX05BTUVQQVJULCBdLAorICBlbnVtX3R5cGVzPVsKKyAgXSwKKyAgb3B0aW9ucz1Ob25lLAorICBpc19leHRlbmRhYmxlPUZhbHNlLAorICBleHRlbnNpb25fcmFuZ2VzPVtdLAorICBzZXJpYWxpemVkX3N0YXJ0PTMzNzcsCisgIHNlcmlhbGl6ZWRfZW5kPTM2MzgsCispCisKKworX0ZJTEVERVNDUklQVE9SU0VULmZpZWxkc19ieV9uYW1lWydmaWxlJ10ubWVzc2FnZV90eXBlID0gX0ZJTEVERVNDUklQVE9SUFJPVE8KK19GSUxFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydtZXNzYWdlX3R5cGUnXS5tZXNzYWdlX3R5cGUgPSBfREVTQ1JJUFRPUlBST1RPCitfRklMRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnZW51bV90eXBlJ10ubWVzc2FnZV90eXBlID0gX0VOVU1ERVNDUklQVE9SUFJPVE8KK19GSUxFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydzZXJ2aWNlJ10ubWVzc2FnZV90eXBlID0gX1NFUlZJQ0VERVNDUklQVE9SUFJPVE8KK19GSUxFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydleHRlbnNpb24nXS5tZXNzYWdlX3R5cGUgPSBfRklFTERERVNDUklQVE9SUFJPVE8KK19GSUxFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX0ZJTEVPUFRJT05TCitfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFLmNvbnRhaW5pbmdfdHlwZSA9IF9ERVNDUklQVE9SUFJPVE87CitfREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydmaWVsZCddLm1lc3NhZ2VfdHlwZSA9IF9GSUVMRERFU0NSSVBUT1JQUk9UTworX0RFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnZXh0ZW5zaW9uJ10ubWVzc2FnZV90eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPCitfREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWyduZXN0ZWRfdHlwZSddLm1lc3NhZ2VfdHlwZSA9IF9ERVNDUklQVE9SUFJPVE8KK19ERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ2VudW1fdHlwZSddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNREVTQ1JJUFRPUlBST1RPCitfREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydleHRlbnNpb25fcmFuZ2UnXS5tZXNzYWdlX3R5cGUgPSBfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFCitfREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX01FU1NBR0VPUFRJT05TCitfRklFTERERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ2xhYmVsJ10uZW51bV90eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPX0xBQkVMCitfRklFTERERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ3R5cGUnXS5lbnVtX3R5cGUgPSBfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRQorX0ZJRUxEREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX0ZJRUxET1BUSU9OUworX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEUuY29udGFpbmluZ190eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPOworX0ZJRUxEREVTQ1JJUFRPUlBST1RPX0xBQkVMLmNvbnRhaW5pbmdfdHlwZSA9IF9GSUVMRERFU0NSSVBUT1JQUk9UTzsKK19FTlVNREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNVkFMVUVERVNDUklQVE9SUFJPVE8KK19FTlVNREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX0VOVU1PUFRJT05TCitfRU5VTVZBTFVFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX0VOVU1WQUxVRU9QVElPTlMKK19TRVJWSUNFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydtZXRob2QnXS5tZXNzYWdlX3R5cGUgPSBfTUVUSE9EREVTQ1JJUFRPUlBST1RPCitfU0VSVklDRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9TRVJWSUNFT1BUSU9OUworX01FVEhPRERFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9NRVRIT0RPUFRJT05TCitfRklMRU9QVElPTlMuZmllbGRzX2J5X25hbWVbJ29wdGltaXplX2ZvciddLmVudW1fdHlwZSA9IF9GSUxFT1BUSU9OU19PUFRJTUlaRU1PREUKK19GSUxFT1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgorX0ZJTEVPUFRJT05TX09QVElNSVpFTU9ERS5jb250YWluaW5nX3R5cGUgPSBfRklMRU9QVElPTlM7CitfTUVTU0FHRU9QVElPTlMuZmllbGRzX2J5X25hbWVbJ3VuaW50ZXJwcmV0ZWRfb3B0aW9uJ10ubWVzc2FnZV90eXBlID0gX1VOSU5URVJQUkVURURPUFRJT04KK19GSUVMRE9QVElPTlMuZmllbGRzX2J5X25hbWVbJ2N0eXBlJ10uZW51bV90eXBlID0gX0ZJRUxET1BUSU9OU19DVFlQRQorX0ZJRUxET1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgorX0ZJRUxET1BUSU9OU19DVFlQRS5jb250YWluaW5nX3R5cGUgPSBfRklFTERPUFRJT05TOworX0VOVU1PUFRJT05TLmZpZWxkc19ieV9uYW1lWyd1bmludGVycHJldGVkX29wdGlvbiddLm1lc3NhZ2VfdHlwZSA9IF9VTklOVEVSUFJFVEVET1BUSU9OCitfRU5VTVZBTFVFT1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgorX1NFUlZJQ0VPUFRJT05TLmZpZWxkc19ieV9uYW1lWyd1bmludGVycHJldGVkX29wdGlvbiddLm1lc3NhZ2VfdHlwZSA9IF9VTklOVEVSUFJFVEVET1BUSU9OCitfTUVUSE9ET1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgorX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlQuY29udGFpbmluZ190eXBlID0gX1VOSU5URVJQUkVURURPUFRJT047CitfVU5JTlRFUlBSRVRFRE9QVElPTi5maWVsZHNfYnlfbmFtZVsnbmFtZSddLm1lc3NhZ2VfdHlwZSA9IF9VTklOVEVSUFJFVEVET1BUSU9OX05BTUVQQVJUCisKK2NsYXNzIEZpbGVEZXNjcmlwdG9yU2V0KG1lc3NhZ2UuTWVzc2FnZSk6CisgIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKKyAgREVTQ1JJUFRPUiA9IF9GSUxFREVTQ1JJUFRPUlNFVAorICAKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQorCitjbGFzcyBGaWxlRGVzY3JpcHRvclByb3RvKG1lc3NhZ2UuTWVzc2FnZSk6CisgIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKKyAgREVTQ1JJUFRPUiA9IF9GSUxFREVTQ1JJUFRPUlBST1RPCisgIAorICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKKworY2xhc3MgRGVzY3JpcHRvclByb3RvKG1lc3NhZ2UuTWVzc2FnZSk6CisgIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKKyAgCisgIGNsYXNzIEV4dGVuc2lvblJhbmdlKG1lc3NhZ2UuTWVzc2FnZSk6CisgICAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQorICAgIERFU0NSSVBUT1IgPSBfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFCisgICAgCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKKyAgREVTQ1JJUFRPUiA9IF9ERVNDUklQVE9SUFJPVE8KKyAgCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCisKK2NsYXNzIEZpZWxkRGVzY3JpcHRvclByb3RvKG1lc3NhZ2UuTWVzc2FnZSk6CisgIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKKyAgREVTQ1JJUFRPUiA9IF9GSUVMRERFU0NSSVBUT1JQUk9UTworICAKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQorCitjbGFzcyBFbnVtRGVzY3JpcHRvclByb3RvKG1lc3NhZ2UuTWVzc2FnZSk6CisgIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKKyAgREVTQ1JJUFRPUiA9IF9FTlVNREVTQ1JJUFRPUlBST1RPCisgIAorICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKKworY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKG1lc3NhZ2UuTWVzc2FnZSk6CisgIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKKyAgREVTQ1JJUFRPUiA9IF9FTlVNVkFMVUVERVNDUklQVE9SUFJPVE8KKyAgCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCisKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8obWVzc2FnZS5NZXNzYWdlKToKKyAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQorICBERVNDUklQVE9SID0gX1NFUlZJQ0VERVNDUklQVE9SUFJPVE8KKyAgCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQorCitjbGFzcyBNZXRob2REZXNjcmlwdG9yUHJvdG8obWVzc2FnZS5NZXNzYWdlKToKKyAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQorICBERVNDUklQVE9SID0gX01FVEhPRERFU0NSSVBUT1JQUk9UTworICAKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKKworY2xhc3MgRmlsZU9wdGlvbnMobWVzc2FnZS5NZXNzYWdlKToKKyAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQorICBERVNDUklQVE9SID0gX0ZJTEVPUFRJT05TCisgIAorICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCisKK2NsYXNzIE1lc3NhZ2VPcHRpb25zKG1lc3NhZ2UuTWVzc2FnZSk6CisgIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKKyAgREVTQ1JJUFRPUiA9IF9NRVNTQUdFT1BUSU9OUworICAKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQorCitjbGFzcyBGaWVsZE9wdGlvbnMobWVzc2FnZS5NZXNzYWdlKToKKyAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQorICBERVNDUklQVE9SID0gX0ZJRUxET1BUSU9OUworICAKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKKworY2xhc3MgRW51bU9wdGlvbnMobWVzc2FnZS5NZXNzYWdlKToKKyAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQorICBERVNDUklQVE9SID0gX0VOVU1PUFRJT05TCisgIAorICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCisKK2NsYXNzIEVudW1WYWx1ZU9wdGlvbnMobWVzc2FnZS5NZXNzYWdlKToKKyAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQorICBERVNDUklQVE9SID0gX0VOVU1WQUxVRU9QVElPTlMKKyAgCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQorCitjbGFzcyBTZXJ2aWNlT3B0aW9ucyhtZXNzYWdlLk1lc3NhZ2UpOgorICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCisgIERFU0NSSVBUT1IgPSBfU0VSVklDRU9QVElPTlMKKyAgCisgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKKworY2xhc3MgTWV0aG9kT3B0aW9ucyhtZXNzYWdlLk1lc3NhZ2UpOgorICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCisgIERFU0NSSVBUT1IgPSBfTUVUSE9ET1BUSU9OUworICAKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCisKK2NsYXNzIFVuaW50ZXJwcmV0ZWRPcHRpb24obWVzc2FnZS5NZXNzYWdlKToKKyAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQorICAKKyAgY2xhc3MgTmFtZVBhcnQobWVzc2FnZS5NZXNzYWdlKToKKyAgICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCisgICAgREVTQ1JJUFRPUiA9IF9VTklOVEVSUFJFVEVET1BUSU9OX05BTUVQQVJUCisgICAgCisgICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCisgIERFU0NSSVBUT1IgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgorICAKKyAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCisKKyMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1vZHVsZV9zY29wZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL1JFQURNRS50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDA2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9SRUFETUUudHh0CkBAIC0wLDAgKzEsOTYgQEAKK1Byb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIEphdmEgUHJvdG9jb2wgQnVmZmVycyBydW50aW1lIGxpYnJhcnkuCisKK0luc3RhbGxhdGlvbiAtIFdpdGggTWF2ZW4KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIFByb3RvY29sIEJ1ZmZlcnMgYnVpbGQgaXMgbWFuYWdlZCB1c2luZyBNYXZlbi4gIElmIHlvdSB3b3VsZAorcmF0aGVyIGJ1aWxkIHdpdGhvdXQgTWF2ZW4sIHNlZSBiZWxvdy4KKworMSkgSW5zdGFsbCBBcGFjaGUgTWF2ZW4gaWYgeW91IGRvbid0IGhhdmUgaXQ6CisKKyAgICAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvCisKKzIpIEJ1aWxkIHRoZSBDKysgY29kZSwgb3Igb2J0YWluIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBwcm90b2MuICBJZgorICAgeW91IGluc3RhbGwgYSBiaW5hcnkgZGlzdHJpYnV0aW9uLCBtYWtlIHN1cmUgdGhhdCBpdCBpcyB0aGUgc2FtZQorICAgdmVyc2lvbiBhcyB0aGlzIHBhY2thZ2UuICBJZiBpbiBkb3VidCwgcnVuOgorCisgICAgICQgcHJvdG9jIC0tdmVyc2lvbgorCisgICBZb3Ugd2lsbCBuZWVkIHRvIHBsYWNlIHRoZSBwcm90b2MgZXhlY3V0YWJsZSBpbiAuLi9zcmMuICAoSWYgeW91CisgICBidWlsdCBpdCB5b3Vyc2VsZiwgaXQgc2hvdWxkIGFscmVhZHkgYmUgdGhlcmUuKQorCiszKSBSdW4gdGhlIHRlc3RzOgorCisgICAgICQgbXZuIHRlc3QKKworICAgSWYgc29tZSB0ZXN0cyBmYWlsLCB0aGlzIGxpYnJhcnkgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSBvbiB5b3VyCisgICBzeXN0ZW0uICBDb250aW51ZSBhdCB5b3VyIG93biByaXNrLgorCis0KSBJbnN0YWxsIHRoZSBsaWJyYXJ5IGludG8geW91ciBNYXZlbiByZXBvc2l0b3J5OgorCisgICAgICQgbXZuIGluc3RhbGwKKworNSkgSWYgeW91IGRvIG5vdCB1c2UgTWF2ZW4gdG8gbWFuYWdlIHlvdXIgb3duIGJ1aWxkLCB5b3UgY2FuIGJ1aWxkIGEKKyAgIC5qYXIgZmlsZSB0byB1c2U6CisKKyAgICAgJCBtdm4gcGFja2FnZQorCisgICBUaGUgLmphciB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgInRhcmdldCIgZGlyZWN0b3J5LgorCitJbnN0YWxsYXRpb24gLSAnTGl0ZScgVmVyc2lvbiAtIFdpdGggTWF2ZW4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCdWlsZGluZyB0aGUgJ2xpdGUnIHZlcnNpb24gb2YgdGhlIEphdmEgUHJvdG9jb2wgQnVmZmVycyBsaWJyYXJ5IGlzCit0aGUgc2FtZSBhcyBidWlsZGluZyB0aGUgZnVsbCB2ZXJzaW9uLCBleGNlcHQgdGhhdCBhbGwgY29tbWFuZHMgYXJlCitydW4gdXNpbmcgdGhlICdsaXRlJyBwcm9maWxlLiAgKHNlZQoraHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZ3VpZGVzL2ludHJvZHVjdGlvbi9pbnRyb2R1Y3Rpb24tdG8tcHJvZmlsZXMuaHRtbCkKKworRS5nLiB0byBpbnN0YWxsIHRoZSBsaXRlIHZlcnNpb24gb2YgdGhlIGphciwgeW91IHdvdWxkIHJ1bjoKKworICAkIG12biBpbnN0YWxsIC1QIGxpdGUKKworVGhlIHJlc3VsdGluZyBhcnRpZmFjdCBoYXMgdGhlICdsaXRlJyBjbGFzc2lmaWVyLiAgVG8gcmVmZXJlbmNlIGl0Citmb3IgZGVwZW5kZW5jeSByZXNvbHV0aW9uLCB5b3Ugd291bGQgc3BlY2lmeSBpdCBhczoKKworICA8ZGVwZW5kZW5jeT4KKyAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLnByb3RvYnVmPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb3RvYnVmLWphdmE8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8Y2xhc3NpZmllcj5saXRlPC9jbGFzc2lmaWVyPgorICA8L2RlcGVuZGVuY3k+CisKK0luc3RhbGxhdGlvbiAtIFdpdGhvdXQgTWF2ZW4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSWYgeW91IHdvdWxkIHJhdGhlciBub3QgaW5zdGFsbCBNYXZlbiB0byBidWlsZCB0aGUgbGlicmFyeSwgeW91IG1heQorZm9sbG93IHRoZXNlIGluc3RydWN0aW9ucyBpbnN0ZWFkLiAgTm90ZSB0aGF0IHRoZXNlIGluc3RydWN0aW9ucyBza2lwCitydW5uaW5nIHVuaXQgdGVzdHMuCisKKzEpIEJ1aWxkIHRoZSBDKysgY29kZSwgb3Igb2J0YWluIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBwcm90b2MuICBJZgorICAgeW91IGluc3RhbGwgYSBiaW5hcnkgZGlzdHJpYnV0aW9uLCBtYWtlIHN1cmUgdGhhdCBpdCBpcyB0aGUgc2FtZQorICAgdmVyc2lvbiBhcyB0aGlzIHBhY2thZ2UuICBJZiBpbiBkb3VidCwgcnVuOgorCisgICAgICQgcHJvdG9jIC0tdmVyc2lvbgorCisgICBJZiB5b3UgYnVpbHQgdGhlIEMrKyBjb2RlIHdpdGhvdXQgaW5zdGFsbGluZywgdGhlIGNvbXBpbGVyIGJpbmFyeQorICAgc2hvdWxkIGJlIGxvY2F0ZWQgaW4gLi4vc3JjLgorCisyKSBJbnZva2UgcHJvdG9jIHRvIGJ1aWxkIERlc2NyaXB0b3JQcm90b3MuamF2YToKKworICAgICAkIHByb3RvYyAtLWphdmFfb3V0PXNyYy9tYWluL2phdmEgLUkuLi9zcmMgXAorICAgICAgICAgLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCisKKzMpIENvbXBpbGUgdGhlIGNvZGUgaW4gc3JjL21haW4vamF2YSB1c2luZyB3aGF0ZXZlciBtZWFucyB5b3UgcHJlZmVyLgorCis0KSBJbnN0YWxsIHRoZSBjbGFzc2VzIHdoZXJldmVyIHlvdSBwcmVmZXIuCisKK1VzYWdlCis9PT09PQorCitUaGUgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBmb3IgUHJvdG9jb2wgQnVmZmVycyBpcyBhdmFpbGFibGUgdmlhIHRoZQord2ViIGF0OgorCisgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9wcm90b2NvbGJ1ZmZlcnMvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9wb20ueG1sIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjhkNmRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvcG9tLnhtbApAQCAtMCwwICsxLDE4NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5nb29nbGU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisgIDxncm91cElkPmNvbS5nb29nbGUucHJvdG9idWY8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPnByb3RvYnVmLWphdmE8L2FydGlmYWN0SWQ+CisgIDx2ZXJzaW9uPjIuNC4yLXByZTwvdmVyc2lvbj4KKyAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgPG5hbWU+UHJvdG9jb2wgQnVmZmVyIEphdmEgQVBJPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+CisgICAgUHJvdG9jb2wgQnVmZmVycyBhcmUgYSB3YXkgb2YgZW5jb2Rpbmcgc3RydWN0dXJlZCBkYXRhIGluIGFuIGVmZmljaWVudCB5ZXQKKyAgICBleHRlbnNpYmxlIGZvcm1hdC4KKyAgPC9kZXNjcmlwdGlvbj4KKyAgPGluY2VwdGlvblllYXI+MjAwODwvaW5jZXB0aW9uWWVhcj4KKyAgPHVybD5odHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWY8L3VybD4KKyAgPGxpY2Vuc2VzPgorICAgIDxsaWNlbnNlPgorICAgICAgPG5hbWU+TmV3IEJTRCBsaWNlbnNlPC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocDwvdXJsPgorICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgPC9saWNlbnNlPgorICA8L2xpY2Vuc2VzPgorICA8c2NtPgorICAgIDx1cmw+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmL3NvdXJjZS9icm93c2U8L3VybD4KKyAgICA8Y29ubmVjdGlvbj4KKyAgICAgIHNjbTpzdm46aHR0cDovL3Byb3RvYnVmLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay8KKyAgICA8L2Nvbm5lY3Rpb24+CisgIDwvc2NtPgorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjQuNDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lYXN5bW9jazwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5lYXN5bW9ja2NsYXNzZXh0ZW5zaW9uPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4yLjE8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgorICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1zb3VyY2VzPC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8dGFza3M+CisgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0idGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzIiAvPgorICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uL3NyYy9wcm90b2MiPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1qYXZhX291dD10YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMiIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLXByb3RvX3BhdGg9Li4vc3JjIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIiAvPgorICAgICAgICAgICAgICAgIDwvZXhlYz4KKyAgICAgICAgICAgICAgPC90YXNrcz4KKyAgICAgICAgICAgICAgPHNvdXJjZVJvb3Q+dGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzPC9zb3VyY2VSb290PgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDx0YXNrcz4KKyAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSJ0YXJnZXQvZ2VuZXJhdGVkLXRlc3Qtc291cmNlcyIgLz4KKyAgICAgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi9zcmMvcHJvdG9jIj4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tamF2YV9vdXQ9dGFyZ2V0L2dlbmVyYXRlZC10ZXN0LXNvdXJjZXMiIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLXByb3RvX3BhdGg9Li4vc3JjIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1wcm90b19wYXRoPXNyYy90ZXN0L2phdmEiIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbXVsdGlwbGVfZmlsZXNfdGVzdC5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfYnVpbGRlcnNfdGVzdC5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbi5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZworICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvIiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90byIgLz4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8iIC8+CisgICAgICAgICAgICAgICAgPC9leGVjPgorICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgICA8dGVzdFNvdXJjZVJvb3Q+dGFyZ2V0L2dlbmVyYXRlZC10ZXN0LXNvdXJjZXM8L3Rlc3RTb3VyY2VSb290PgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5saXRlPC9pZD4KKyAgICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0J5dGVTdHJpbmcuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9Db2RlZElucHV0U3RyZWFtLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovQ29kZWRPdXRwdXRTdHJlYW0uamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9FeHRlbnNpb25SZWdpc3RyeUxpdGUuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9GaWVsZFNldC5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0dlbmVyYXRlZE1lc3NhZ2VMaXRlLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovSW50ZXJuYWwuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9MYXp5U3RyaW5nQXJyYXlMaXN0LmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovTGF6eVN0cmluZ0xpc3QuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9NZXNzYWdlTGl0ZS5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL01lc3NhZ2VMaXRlT3JCdWlsZGVyLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovU21hbGxTb3J0ZWRNYXAuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9VbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0LmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovV2lyZUZvcm1hdC5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICA8dGVzdEluY2x1ZGVzPgorICAgICAgICAgICAgICAgIDx0ZXN0SW5jbHVkZT4qKi9MaXRlVGVzdC5qYXZhPC90ZXN0SW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8dGVzdEluY2x1ZGU+KiovKkxpdGUuamF2YTwvdGVzdEluY2x1ZGU+CisgICAgICAgICAgICAgIDwvdGVzdEluY2x1ZGVzPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0xpdGVUZXN0LmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+bGl0ZTwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkODMwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDc2NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1lc3NhZ2V9IGludGVyZmFjZSB3aGljaCBpbXBsZW1lbnRzCisgKiBhcyBtYW55IG1ldGhvZHMgb2YgdGhhdCBpbnRlcmZhY2UgYXMgcG9zc2libGUgaW4gdGVybXMgb2Ygb3RoZXIgbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXNzYWdlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTGl0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIE1lc3NhZ2UgeworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKKyAgICAvLyBDaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuCisgICAgZm9yIChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgOiBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldEZpZWxkcygpKSB7CisgICAgICBpZiAoZmllbGQuaXNSZXF1aXJlZCgpKSB7CisgICAgICAgIGlmICghaGFzRmllbGQoZmllbGQpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDoKKyAgICAgICAgZ2V0QWxsRmllbGRzKCkuZW50cnlTZXQoKSkgeworICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgZm9yIChmaW5hbCBNZXNzYWdlIGVsZW1lbnQgOiAoTGlzdDxNZXNzYWdlPikgZW50cnkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgaWYgKCFlbGVtZW50LmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICghKChNZXNzYWdlKSBlbnRyeS5nZXRWYWx1ZSgpKS5pc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBUZXh0Rm9ybWF0LnByaW50VG9TdHJpbmcodGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBib29sZWFuIGlzTWVzc2FnZVNldCA9CisgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCk7CisKKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgorICAgICAgICBnZXRBbGxGaWVsZHMoKS5lbnRyeVNldCgpKSB7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICBpZiAoaXNNZXNzYWdlU2V0ICYmIGZpZWxkLmlzRXh0ZW5zaW9uKCkgJiYKKyAgICAgICAgICBmaWVsZC5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuTUVTU0FHRSAmJgorICAgICAgICAgICFmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgb3V0cHV0LndyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihmaWVsZC5nZXROdW1iZXIoKSwgKE1lc3NhZ2UpIHZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZpZWxkU2V0LndyaXRlRmllbGQoZmllbGQsIHZhbHVlLCBvdXRwdXQpOworICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzID0gZ2V0VW5rbm93bkZpZWxkcygpOworICAgIGlmIChpc01lc3NhZ2VTZXQpIHsKKyAgICAgIHVua25vd25GaWVsZHMud3JpdGVBc01lc3NhZ2VTZXRUbyhvdXRwdXQpOworICAgIH0gZWxzZSB7CisgICAgICB1bmtub3duRmllbGRzLndyaXRlVG8ob3V0cHV0KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGludCBtZW1vaXplZFNpemUgPSAtMTsKKworICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgeworICAgIGludCBzaXplID0gbWVtb2l6ZWRTaXplOworICAgIGlmIChzaXplICE9IC0xKSB7CisgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICBzaXplID0gMDsKKyAgICBmaW5hbCBib29sZWFuIGlzTWVzc2FnZVNldCA9CisgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCk7CisKKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgorICAgICAgICBnZXRBbGxGaWVsZHMoKS5lbnRyeVNldCgpKSB7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICBpZiAoaXNNZXNzYWdlU2V0ICYmIGZpZWxkLmlzRXh0ZW5zaW9uKCkgJiYKKyAgICAgICAgICBmaWVsZC5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuTUVTU0FHRSAmJgorICAgICAgICAgICFmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgc2l6ZSArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlTWVzc2FnZVNldEV4dGVuc2lvblNpemUoCisgICAgICAgICAgICBmaWVsZC5nZXROdW1iZXIoKSwgKE1lc3NhZ2UpIHZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNpemUgKz0gRmllbGRTZXQuY29tcHV0ZUZpZWxkU2l6ZShmaWVsZCwgdmFsdWUpOworICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzID0gZ2V0VW5rbm93bkZpZWxkcygpOworICAgIGlmIChpc01lc3NhZ2VTZXQpIHsKKyAgICAgIHNpemUgKz0gdW5rbm93bkZpZWxkcy5nZXRTZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldCgpOworICAgIH0gZWxzZSB7CisgICAgICBzaXplICs9IHVua25vd25GaWVsZHMuZ2V0U2VyaWFsaXplZFNpemUoKTsKKyAgICB9CisKKyAgICBtZW1vaXplZFNpemUgPSBzaXplOworICAgIHJldHVybiBzaXplOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgTWVzc2FnZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZmluYWwgTWVzc2FnZSBvdGhlck1lc3NhZ2UgPSAoTWVzc2FnZSkgb3RoZXI7CisgICAgaWYgKGdldERlc2NyaXB0b3JGb3JUeXBlKCkgIT0gb3RoZXJNZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGdldEFsbEZpZWxkcygpLmVxdWFscyhvdGhlck1lc3NhZ2UuZ2V0QWxsRmllbGRzKCkpICYmCisgICAgICAgIGdldFVua25vd25GaWVsZHMoKS5lcXVhbHMob3RoZXJNZXNzYWdlLmdldFVua25vd25GaWVsZHMoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBpbnQgaGFzaCA9IDQxOworICAgIGhhc2ggPSAoMTkgKiBoYXNoKSArIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuaGFzaENvZGUoKTsKKyAgICBoYXNoID0gaGFzaEZpZWxkcyhoYXNoLCBnZXRBbGxGaWVsZHMoKSk7CisgICAgaGFzaCA9ICgyOSAqIGhhc2gpICsgZ2V0VW5rbm93bkZpZWxkcygpLmhhc2hDb2RlKCk7CisgICAgcmV0dXJuIGhhc2g7CisgIH0KKworICAvKiogR2V0IGEgaGFzaCBjb2RlIGZvciBnaXZlbiBmaWVsZHMgYW5kIHZhbHVlcywgdXNpbmcgdGhlIGdpdmVuIHNlZWQuICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwcm90ZWN0ZWQgaW50IGhhc2hGaWVsZHMoaW50IGhhc2gsIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gbWFwKSB7CisgICAgZm9yIChNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGVudHJ5LmdldEtleSgpOworICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgIGhhc2ggPSAoMzcgKiBoYXNoKSArIGZpZWxkLmdldE51bWJlcigpOworICAgICAgaWYgKGZpZWxkLmdldFR5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3IuVHlwZS5FTlVNKXsKKyAgICAgICAgaGFzaCA9ICg1MyAqIGhhc2gpICsgdmFsdWUuaGFzaENvZGUoKTsKKyAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgIExpc3Q8PyBleHRlbmRzIEVudW1MaXRlPiBsaXN0ID0gKExpc3Q8PyBleHRlbmRzIEVudW1MaXRlPikgdmFsdWU7CisgICAgICAgIGhhc2ggPSAoNTMgKiBoYXNoKSArIGhhc2hFbnVtTGlzdChsaXN0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhhc2ggPSAoNTMgKiBoYXNoKSArIGhhc2hFbnVtKChFbnVtTGl0ZSkgdmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGFzaDsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIE1lc3NhZ2UjaGFzaENvZGUoKX0uCisgICAqIEBzZWUgQm9vbGVhbiNoYXNoQ29kZSgpCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIGludCBoYXNoTG9uZyhsb25nIG4pIHsKKyAgICByZXR1cm4gKGludCkgKG4gXiAobiA+Pj4gMzIpKTsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIE1lc3NhZ2UjaGFzaENvZGUoKX0uCisgICAqIEBzZWUgQm9vbGVhbiNoYXNoQ29kZSgpCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIGludCBoYXNoQm9vbGVhbihib29sZWFuIGIpIHsKKyAgICByZXR1cm4gYiA/IDEyMzEgOiAxMjM3OworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciBtZXRob2QgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgTWVzc2FnZSNoYXNoQ29kZSgpfS4KKyAgICogPHA+CisgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Uge0BsaW5rIGphdmEubGFuZy5FbnVtI2hhc2hDb2RlKCl9IGlzIGZpbmFsLCBidXQgd2UKKyAgICogbmVlZCB0byB1c2UgdGhlIGZpZWxkIG51bWJlciBhcyB0aGUgaGFzaCBjb2RlIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5CisgICAqIGJldHdlZW4gc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGVudW0gb2JqZWN0cy4KKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgaW50IGhhc2hFbnVtKEVudW1MaXRlIGUpIHsKKyAgICByZXR1cm4gZS5nZXROdW1iZXIoKTsKKyAgfQorCisgIC8qKiBIZWxwZXIgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIE1lc3NhZ2UjaGFzaENvZGUoKX0uICovCisgIHByb3RlY3RlZCBzdGF0aWMgaW50IGhhc2hFbnVtTGlzdChMaXN0PD8gZXh0ZW5kcyBFbnVtTGl0ZT4gbGlzdCkgeworICAgIGludCBoYXNoID0gMTsKKyAgICBmb3IgKEVudW1MaXRlIGUgOiBsaXN0KSB7CisgICAgICBoYXNoID0gMzEgKiBoYXNoICsgaGFzaEVudW0oZSk7CisgICAgfQorICAgIHJldHVybiBoYXNoOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKioKKyAgICogQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSBpbnRlcmZhY2Ugd2hpY2gKKyAgICogaW1wbGVtZW50cyBhcyBtYW55IG1ldGhvZHMgb2YgdGhhdCBpbnRlcmZhY2UgYXMgcG9zc2libGUgaW4gdGVybXMgb2YKKyAgICogb3RoZXIgbWV0aG9kcy4KKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkZXI8QnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPgorICAgICAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VMaXRlLkJ1aWxkZXI8QnVpbGRlclR5cGU+CisgICAgICBpbXBsZW1lbnRzIE1lc3NhZ2UuQnVpbGRlciB7CisgICAgLy8gVGhlIGNvbXBpbGVyIHByb2R1Y2VzIGFuIGVycm9yIGlmIHRoaXMgaXMgbm90IGRlY2xhcmVkIGV4cGxpY2l0bHkuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFic3RyYWN0IEJ1aWxkZXJUeXBlIGNsb25lKCk7CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXIoKSB7CisgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgorICAgICAgICAgICBnZXRBbGxGaWVsZHMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgIGNsZWFyRmllbGQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgfQorICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIE1lc3NhZ2Ugb3RoZXIpIHsKKyAgICAgIGlmIChvdGhlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpICE9IGdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAibWVyZ2VGcm9tKE1lc3NhZ2UpIGNhbiBvbmx5IG1lcmdlIG1lc3NhZ2VzIG9mIHRoZSBzYW1lIHR5cGUuIik7CisgICAgICB9CisKKyAgICAgIC8vIE5vdGU6ICBXZSBkb24ndCBhdHRlbXB0IHRvIHZlcmlmeSB0aGF0IG90aGVyJ3MgZmllbGRzIGhhdmUgdmFsaWQKKyAgICAgIC8vICAgdHlwZXMuICBEb2luZyBzbyB3b3VsZCBiZSBhIGxvc2luZyBiYXR0bGUuICBXZSdkIGhhdmUgdG8gdmVyaWZ5CisgICAgICAvLyAgIGFsbCBzdWItbWVzc2FnZXMgYXMgd2VsbCwgYW5kIHdlJ2QgaGF2ZSB0byBtYWtlIGNvcGllcyBvZiBhbGwgb2YKKyAgICAgIC8vICAgdGhlbSB0byBpbnN1cmUgdGhhdCB0aGV5IGRvbid0IGNoYW5nZSBhZnRlciB2ZXJpZmljYXRpb24gKHNpbmNlCisgICAgICAvLyAgIHRoZSBNZXNzYWdlIGludGVyZmFjZSBpdHNlbGYgY2Fubm90IGVuZm9yY2UgaW1tdXRhYmlsaXR5IG9mCisgICAgICAvLyAgIGltcGxlbWVudGF0aW9ucykuCisgICAgICAvLyBUT0RPKGtlbnRvbik6ICBQcm92aWRlIGEgZnVuY3Rpb24gc29tZXdoZXJlIGNhbGxlZCBtYWtlRGVlcENvcHkoKQorICAgICAgLy8gICB3aGljaCBhbGxvd3MgcGVvcGxlIHRvIG1ha2Ugc2VjdXJlIGRlZXAgY29waWVzIG9mIG1lc3NhZ2VzLgorCisgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgorICAgICAgICAgICBvdGhlci5nZXRBbGxGaWVsZHMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGVudHJ5LmdldEtleSgpOworICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IChMaXN0KWVudHJ5LmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgIGFkZFJlcGVhdGVkRmllbGQoZmllbGQsIGVsZW1lbnQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgICAgZmluYWwgTWVzc2FnZSBleGlzdGluZ1ZhbHVlID0gKE1lc3NhZ2UpZ2V0RmllbGQoZmllbGQpOworICAgICAgICAgIGlmIChleGlzdGluZ1ZhbHVlID09IGV4aXN0aW5nVmFsdWUuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKSB7CisgICAgICAgICAgICBzZXRGaWVsZChmaWVsZCwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEZpZWxkKGZpZWxkLAorICAgICAgICAgICAgICBleGlzdGluZ1ZhbHVlLm5ld0J1aWxkZXJGb3JUeXBlKCkKKyAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKGV4aXN0aW5nVmFsdWUpCisgICAgICAgICAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSllbnRyeS5nZXRWYWx1ZSgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2V0RmllbGQoZmllbGQsIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5nZXRVbmtub3duRmllbGRzKCkpOworCisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbWVyZ2VGcm9tKGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeS5nZXRFbXB0eVJlZ2lzdHJ5KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCisgICAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPQorICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcihnZXRVbmtub3duRmllbGRzKCkpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgZmluYWwgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKKyAgICAgICAgaWYgKHRhZyA9PSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1lcmdlRmllbGRGcm9tKGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCB0YWcpKSB7CisgICAgICAgICAgLy8gZW5kIGdyb3VwIHRhZworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBzZXRVbmtub3duRmllbGRzKHVua25vd25GaWVsZHMuYnVpbGQoKSk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSwgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIsCisgICAgICogRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLCBNZXNzYWdlLkJ1aWxkZXIpfSwgYnV0IHBhcnNlcyBhIHNpbmdsZSBmaWVsZC4KKyAgICAgKiBQYWNrYWdlLXByaXZhdGUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IEdlbmVyYXRlZE1lc3NhZ2UuRXh0ZW5kYWJsZU1lc3NhZ2UuCisgICAgICogQHBhcmFtIHRhZyBUaGUgdGFnLCB3aGljaCBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIG1lcmdlRmllbGRGcm9tKAorICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCisgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLAorICAgICAgICBmaW5hbCBpbnQgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZmluYWwgRGVzY3JpcHRvciB0eXBlID0gYnVpbGRlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpOworCisgICAgICBpZiAodHlwZS5nZXRPcHRpb25zKCkuZ2V0TWVzc2FnZVNldFdpcmVGb3JtYXQoKSAmJgorICAgICAgICAgIHRhZyA9PSBXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU1fVEFHKSB7CisgICAgICAgIG1lcmdlTWVzc2FnZVNldEV4dGVuc2lvbkZyb21Db2RlZFN0cmVhbSgKKyAgICAgICAgICBpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIGJ1aWxkZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgZmluYWwgaW50IHdpcmVUeXBlID0gV2lyZUZvcm1hdC5nZXRUYWdXaXJlVHlwZSh0YWcpOworICAgICAgZmluYWwgaW50IGZpZWxkTnVtYmVyID0gV2lyZUZvcm1hdC5nZXRUYWdGaWVsZE51bWJlcih0YWcpOworCisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQ7CisgICAgICBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG51bGw7CisKKyAgICAgIGlmICh0eXBlLmlzRXh0ZW5zaW9uTnVtYmVyKGZpZWxkTnVtYmVyKSkgeworICAgICAgICAvLyBleHRlbnNpb25SZWdpc3RyeSBtYXkgYmUgZWl0aGVyIEV4dGVuc2lvblJlZ2lzdHJ5IG9yCisgICAgICAgIC8vIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS4gIFNpbmNlIHRoZSB0eXBlIHdlIGFyZSBwYXJzaW5nIGlzIGEgZnVsbAorICAgICAgICAvLyBtZXNzYWdlLCBvbmx5IGEgZnVsbCBFeHRlbnNpb25SZWdpc3RyeSBjb3VsZCBwb3NzaWJseSBjb250YWluCisgICAgICAgIC8vIGV4dGVuc2lvbnMgb2YgaXQuICBPdGhlcndpc2Ugd2Ugd2lsbCB0cmVhdCB0aGUgcmVnaXN0cnkgYXMgaWYgaXQKKyAgICAgICAgLy8gd2VyZSBlbXB0eS4KKyAgICAgICAgaWYgKGV4dGVuc2lvblJlZ2lzdHJ5IGluc3RhbmNlb2YgRXh0ZW5zaW9uUmVnaXN0cnkpIHsKKyAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeS5FeHRlbnNpb25JbmZvIGV4dGVuc2lvbiA9CisgICAgICAgICAgICAoKEV4dGVuc2lvblJlZ2lzdHJ5KSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgLmZpbmRFeHRlbnNpb25CeU51bWJlcih0eXBlLCBmaWVsZE51bWJlcik7CisgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBmaWVsZCA9IG51bGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpZWxkID0gZXh0ZW5zaW9uLmRlc2NyaXB0b3I7CisgICAgICAgICAgICBkZWZhdWx0SW5zdGFuY2UgPSBleHRlbnNpb24uZGVmYXVsdEluc3RhbmNlOworICAgICAgICAgICAgaWYgKGRlZmF1bHRJbnN0YW5jZSA9PSBudWxsICYmCisgICAgICAgICAgICAgICAgZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UtdHlwZWQgZXh0ZW5zaW9uIGxhY2tlZCBkZWZhdWx0IGluc3RhbmNlOiAiICsKKyAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZ1bGxOYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmaWVsZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpZWxkID0gdHlwZS5maW5kRmllbGRCeU51bWJlcihmaWVsZE51bWJlcik7CisgICAgICB9CisKKyAgICAgIGJvb2xlYW4gdW5rbm93biA9IGZhbHNlOworICAgICAgYm9vbGVhbiBwYWNrZWQgPSBmYWxzZTsKKyAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICAgIHVua25vd24gPSB0cnVlOyAgLy8gVW5rbm93biBmaWVsZC4KKyAgICAgIH0gZWxzZSBpZiAod2lyZVR5cGUgPT0gRmllbGRTZXQuZ2V0V2lyZUZvcm1hdEZvckZpZWxkVHlwZSgKKyAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRMaXRlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgIGZhbHNlICAvKiBpc1BhY2tlZCAqLykpIHsKKyAgICAgICAgcGFja2VkID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKGZpZWxkLmlzUGFja2FibGUoKSAmJgorICAgICAgICAgICAgICAgICB3aXJlVHlwZSA9PSBGaWVsZFNldC5nZXRXaXJlRm9ybWF0Rm9yRmllbGRUeXBlKAorICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldExpdGVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLyogaXNQYWNrZWQgKi8pKSB7CisgICAgICAgIHBhY2tlZCA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB1bmtub3duID0gdHJ1ZTsgIC8vIFVua25vd24gd2lyZSB0eXBlLgorICAgICAgfQorCisgICAgICBpZiAodW5rbm93bikgeyAgLy8gVW5rbm93biBmaWVsZCBvciB3cm9uZyB3aXJlIHR5cGUuICBTa2lwLgorICAgICAgICByZXR1cm4gdW5rbm93bkZpZWxkcy5tZXJnZUZpZWxkRnJvbSh0YWcsIGlucHV0KTsKKyAgICAgIH0KKworICAgICAgaWYgKHBhY2tlZCkgeworICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gaW5wdXQucmVhZFJhd1ZhcmludDMyKCk7CisgICAgICAgIGZpbmFsIGludCBsaW1pdCA9IGlucHV0LnB1c2hMaW1pdChsZW5ndGgpOworICAgICAgICBpZiAoZmllbGQuZ2V0TGl0ZVR5cGUoKSA9PSBXaXJlRm9ybWF0LkZpZWxkVHlwZS5FTlVNKSB7CisgICAgICAgICAgd2hpbGUgKGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkgeworICAgICAgICAgICAgZmluYWwgaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGZpZWxkLmdldEVudW1UeXBlKCkuZmluZFZhbHVlQnlOdW1iZXIocmF3VmFsdWUpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgLy8gSWYgdGhlIG51bWJlciBpc24ndCByZWNvZ25pemVkIGFzIGEgdmFsaWQgdmFsdWUgZm9yIHRoaXMKKyAgICAgICAgICAgICAgLy8gZW51bSwgZHJvcCBpdCAoZG9uJ3QgZXZlbiBhZGQgaXQgdG8gdW5rbm93bkZpZWxkcykuCisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdoaWxlIChpbnB1dC5nZXRCeXRlc1VudGlsTGltaXQoKSA+IDApIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9CisgICAgICAgICAgICAgIEZpZWxkU2V0LnJlYWRQcmltaXRpdmVGaWVsZChpbnB1dCwgZmllbGQuZ2V0TGl0ZVR5cGUoKSk7CisgICAgICAgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5wdXQucG9wTGltaXQobGltaXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlOworICAgICAgICBzd2l0Y2ggKGZpZWxkLmdldFR5cGUoKSkgeworICAgICAgICAgIGNhc2UgR1JPVVA6IHsKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyOworICAgICAgICAgICAgaWYgKGRlZmF1bHRJbnN0YW5jZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHN1YkJ1aWxkZXIgPSBkZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN1YkJ1aWxkZXIgPSBidWlsZGVyLm5ld0J1aWxkZXJGb3JGaWVsZChmaWVsZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZpZWxkLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICAgICAgICBzdWJCdWlsZGVyLm1lcmdlRnJvbSgoTWVzc2FnZSkgYnVpbGRlci5nZXRGaWVsZChmaWVsZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXQucmVhZEdyb3VwKGZpZWxkLmdldE51bWJlcigpLCBzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgICAgICAgICB2YWx1ZSA9IHN1YkJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIE1FU1NBR0U6IHsKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyOworICAgICAgICAgICAgaWYgKGRlZmF1bHRJbnN0YW5jZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHN1YkJ1aWxkZXIgPSBkZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN1YkJ1aWxkZXIgPSBidWlsZGVyLm5ld0J1aWxkZXJGb3JGaWVsZChmaWVsZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZpZWxkLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICAgICAgICBzdWJCdWlsZGVyLm1lcmdlRnJvbSgoTWVzc2FnZSkgYnVpbGRlci5nZXRGaWVsZChmaWVsZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgICAgICAgICAgdmFsdWUgPSBzdWJCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBFTlVNOgorICAgICAgICAgICAgZmluYWwgaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTsKKyAgICAgICAgICAgIHZhbHVlID0gZmllbGQuZ2V0RW51bVR5cGUoKS5maW5kVmFsdWVCeU51bWJlcihyYXdWYWx1ZSk7CisgICAgICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIGlzbid0IHJlY29nbml6ZWQgYXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcyBlbnVtLAorICAgICAgICAgICAgLy8gZHJvcCBpdC4KKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHVua25vd25GaWVsZHMubWVyZ2VWYXJpbnRGaWVsZChmaWVsZE51bWJlciwgcmF3VmFsdWUpOworICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB2YWx1ZSA9IEZpZWxkU2V0LnJlYWRQcmltaXRpdmVGaWVsZChpbnB1dCwgZmllbGQuZ2V0TGl0ZVR5cGUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWlsZGVyLnNldEZpZWxkKGZpZWxkLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqIENhbGxlZCBieSB7QGNvZGUgI21lcmdlRmllbGRGcm9tKCl9IHRvIHBhcnNlIGEgTWVzc2FnZVNldCBleHRlbnNpb24uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtZXJnZU1lc3NhZ2VTZXRFeHRlbnNpb25Gcm9tQ29kZWRTdHJlYW0oCisgICAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgIGZpbmFsIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMsCisgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgZmluYWwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBEZXNjcmlwdG9yIHR5cGUgPSBidWlsZGVyLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7CisKKyAgICAgIC8vIFRoZSB3aXJlIGZvcm1hdCBmb3IgTWVzc2FnZVNldCBpczoKKyAgICAgIC8vICAgbWVzc2FnZSBNZXNzYWdlU2V0IHsKKyAgICAgIC8vICAgICByZXBlYXRlZCBncm91cCBJdGVtID0gMSB7CisgICAgICAvLyAgICAgICByZXF1aXJlZCBpbnQzMiB0eXBlSWQgPSAyOworICAgICAgLy8gICAgICAgcmVxdWlyZWQgYnl0ZXMgbWVzc2FnZSA9IDM7CisgICAgICAvLyAgICAgfQorICAgICAgLy8gICB9CisgICAgICAvLyAidHlwZUlkIiBpcyB0aGUgZXh0ZW5zaW9uJ3MgZmllbGQgbnVtYmVyLiAgVGhlIGV4dGVuc2lvbiBjYW4gb25seSBiZQorICAgICAgLy8gYSBtZXNzYWdlIHR5cGUsIHdoZXJlICJtZXNzYWdlIiBjb250YWlucyB0aGUgZW5jb2RlZCBieXRlcyBvZiB0aGF0CisgICAgICAvLyBtZXNzYWdlLgorICAgICAgLy8KKyAgICAgIC8vIEluIHByYWN0aWNlLCB3ZSB3aWxsIHByb2JhYmx5IG5ldmVyIHNlZSBhIE1lc3NhZ2VTZXQgaXRlbSBpbiB3aGljaAorICAgICAgLy8gdGhlIG1lc3NhZ2UgYXBwZWFycyBiZWZvcmUgdGhlIHR5cGUgSUQsIG9yIHdoZXJlIGVpdGhlciBmaWVsZCBkb2VzIG5vdAorICAgICAgLy8gYXBwZWFyIGV4YWN0bHkgb25jZS4gIEhvd2V2ZXIsIGluIHRoZW9yeSBzdWNoIGNhc2VzIGFyZSB2YWxpZCwgc28gd2UKKyAgICAgIC8vIHNob3VsZCBiZSBwcmVwYXJlZCB0byBhY2NlcHQgdGhlbS4KKworICAgICAgaW50IHR5cGVJZCA9IDA7CisgICAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbnVsbDsgIC8vIElmIHdlIGVuY291bnRlciAibWVzc2FnZSIgYmVmb3JlICJ0eXBlSWQiCisgICAgICBNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IG51bGw7CisgICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBudWxsOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBmaW5hbCBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOworICAgICAgICBpZiAodGFnID09IDApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YWcgPT0gV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lEX1RBRykgeworICAgICAgICAgIHR5cGVJZCA9IGlucHV0LnJlYWRVSW50MzIoKTsKKyAgICAgICAgICAvLyBaZXJvIGlzIG5vdCBhIHZhbGlkIHR5cGUgSUQuCisgICAgICAgICAgaWYgKHR5cGVJZCAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeS5FeHRlbnNpb25JbmZvIGV4dGVuc2lvbjsKKworICAgICAgICAgICAgLy8gZXh0ZW5zaW9uUmVnaXN0cnkgbWF5IGJlIGVpdGhlciBFeHRlbnNpb25SZWdpc3RyeSBvcgorICAgICAgICAgICAgLy8gRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLiAgU2luY2UgdGhlIHR5cGUgd2UgYXJlIHBhcnNpbmcgaXMgYSBmdWxsCisgICAgICAgICAgICAvLyBtZXNzYWdlLCBvbmx5IGEgZnVsbCBFeHRlbnNpb25SZWdpc3RyeSBjb3VsZCBwb3NzaWJseSBjb250YWluCisgICAgICAgICAgICAvLyBleHRlbnNpb25zIG9mIGl0LiAgT3RoZXJ3aXNlIHdlIHdpbGwgdHJlYXQgdGhlIHJlZ2lzdHJ5IGFzIGlmIGl0CisgICAgICAgICAgICAvLyB3ZXJlIGVtcHR5LgorICAgICAgICAgICAgaWYgKGV4dGVuc2lvblJlZ2lzdHJ5IGluc3RhbmNlb2YgRXh0ZW5zaW9uUmVnaXN0cnkpIHsKKyAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gKChFeHRlbnNpb25SZWdpc3RyeSkgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgICAgICAgICAuZmluZEV4dGVuc2lvbkJ5TnVtYmVyKHR5cGUsIHR5cGVJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBleHRlbnNpb24gPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgZmllbGQgPSBleHRlbnNpb24uZGVzY3JpcHRvcjsKKyAgICAgICAgICAgICAgc3ViQnVpbGRlciA9IGV4dGVuc2lvbi5kZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKKyAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZSBvcmlnaW5hbE1lc3NhZ2UgPSAoTWVzc2FnZSlidWlsZGVyLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsTWVzc2FnZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5tZXJnZUZyb20ob3JpZ2luYWxNZXNzYWdlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAocmF3Qnl0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgZW5jb3VudGVyZWQgdGhlIG1lc3NhZ2UuICBQYXJzZSBpdCBub3cuCisgICAgICAgICAgICAgICAgc3ViQnVpbGRlci5tZXJnZUZyb20oCisgICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd0J5dGVzLm5ld0lucHV0KCkpKTsKKyAgICAgICAgICAgICAgICByYXdCeXRlcyA9IG51bGw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8vIFVua25vd24gZXh0ZW5zaW9uIG51bWJlci4gIElmIHdlIGFscmVhZHkgc2F3IGRhdGEsIHB1dCBpdAorICAgICAgICAgICAgICAvLyBpbiByYXdCeXRlcy4KKyAgICAgICAgICAgICAgaWYgKHJhd0J5dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1bmtub3duRmllbGRzLm1lcmdlRmllbGQodHlwZUlkLAorICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuYWRkTGVuZ3RoRGVsaW1pdGVkKHJhd0J5dGVzKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgcmF3Qnl0ZXMgPSBudWxsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX01FU1NBR0VfVEFHKSB7CisgICAgICAgICAgaWYgKHR5cGVJZCA9PSAwKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlbid0IHNlZW4gYSB0eXBlIElEIHlldCwgc28gd2UgaGF2ZSB0byBzdG9yZSB0aGUgcmF3IGJ5dGVzCisgICAgICAgICAgICAvLyBmb3Igbm93LgorICAgICAgICAgICAgcmF3Qnl0ZXMgPSBpbnB1dC5yZWFkQnl0ZXMoKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHN1YkJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyBob3cgdG8gcGFyc2UgdGhpcy4gIElnbm9yZSBpdC4KKyAgICAgICAgICAgIHVua25vd25GaWVsZHMubWVyZ2VGaWVsZCh0eXBlSWQsCisgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkTGVuZ3RoRGVsaW1pdGVkKGlucHV0LnJlYWRCeXRlcygpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoZSB0eXBlLCBzbyB3ZSBjYW4gcGFyc2UgZGlyZWN0bHkgZnJvbSB0aGUgaW5wdXQKKyAgICAgICAgICAgIC8vIHdpdGggbm8gY29weWluZy4gIEhvb3JheSEKKyAgICAgICAgICAgIGlucHV0LnJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gVW5rbm93biB0YWcuICBTa2lwIGl0LgorICAgICAgICAgIGlmICghaW5wdXQuc2tpcEZpZWxkKHRhZykpIHsKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gZW5kIG9mIGdyb3VwCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU1fRU5EX1RBRyk7CisKKyAgICAgIGlmIChzdWJCdWlsZGVyICE9IG51bGwpIHsKKyAgICAgICAgYnVpbGRlci5zZXRGaWVsZChmaWVsZCwgc3ViQnVpbGRlci5idWlsZCgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VVbmtub3duRmllbGRzKGZpbmFsIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzKSB7CisgICAgICBzZXRVbmtub3duRmllbGRzKAorICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcihnZXRVbmtub3duRmllbGRzKCkpCisgICAgICAgICAgICAgICAgICAgICAgIC5tZXJnZUZyb20odW5rbm93bkZpZWxkcykKKyAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gcmVwb3J0aW5nIG1pc3NpbmcgZmllbGRzIGluCisgICAgICogdGhlIGdpdmVuIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbgorICAgICAgICBuZXdVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgIHJldHVybiBuZXcgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oZmluZE1pc3NpbmdGaWVsZHMobWVzc2FnZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlcyB7QGNvZGUgdGhpcy5taXNzaW5nRmllbGRzfSB3aXRoIHRoZSBmdWxsICJwYXRoIiBvZiBlYWNoCisgICAgICogbWlzc2luZyByZXF1aXJlZCBmaWVsZCBpbiB0aGUgZ2l2ZW4gbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZmluZE1pc3NpbmdGaWVsZHMoZmluYWwgTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgZmluZE1pc3NpbmdGaWVsZHMobWVzc2FnZSwgIiIsIHJlc3VsdHMpOworICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorCisgICAgLyoqIFJlY3Vyc2l2ZSBoZWxwZXIgaW1wbGVtZW50aW5nIHtAbGluayAjZmluZE1pc3NpbmdGaWVsZHMoTWVzc2FnZSl9LiAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmluZE1pc3NpbmdGaWVsZHMoZmluYWwgTWVzc2FnZSBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByZXN1bHRzKSB7CisgICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6CisgICAgICAgICAgbWVzc2FnZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldEZpZWxkcygpKSB7CisgICAgICAgIGlmIChmaWVsZC5pc1JlcXVpcmVkKCkgJiYgIW1lc3NhZ2UuaGFzRmllbGQoZmllbGQpKSB7CisgICAgICAgICAgcmVzdWx0cy5hZGQocHJlZml4ICsgZmllbGQuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgorICAgICAgICAgICBtZXNzYWdlLmdldEFsbEZpZWxkcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisKKyAgICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpIHZhbHVlKSB7CisgICAgICAgICAgICAgIGZpbmRNaXNzaW5nRmllbGRzKChNZXNzYWdlKSBlbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJNZXNzYWdlUHJlZml4KHByZWZpeCwgZmllbGQsIGkrKyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobWVzc2FnZS5oYXNGaWVsZChmaWVsZCkpIHsKKyAgICAgICAgICAgICAgZmluZE1pc3NpbmdGaWVsZHMoKE1lc3NhZ2UpIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJNZXNzYWdlUHJlZml4KHByZWZpeCwgZmllbGQsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN1Yk1lc3NhZ2VQcmVmaXgoZmluYWwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KSB7CisgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKHByZWZpeCk7CisgICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCcoJykKKyAgICAgICAgICAgICAgLmFwcGVuZChmaWVsZC5nZXRGdWxsTmFtZSgpKQorICAgICAgICAgICAgICAuYXBwZW5kKCcpJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKGZpZWxkLmdldE5hbWUoKSk7CisgICAgICB9CisgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgnWycpCisgICAgICAgICAgICAgIC5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICAgIC5hcHBlbmQoJ10nKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQoJy4nKTsKKyAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHNlZW0gdG8gYmUgcmVxdWlyZWQgaW4gb3JkZXIgdG8gbWFrZSBqYXZhYworICAgIC8vIG5vdCBwcm9kdWNlIHdlaXJkIGVycm9ycyBsaWtlOgorICAgIC8vCisgICAgLy8gamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0R5bmFtaWNNZXNzYWdlLmphdmE6MjAzOiB0eXBlcworICAgIC8vICAgY29tLmdvb2dsZS5wcm90b2J1Zi5BYnN0cmFjdE1lc3NhZ2UuQnVpbGRlcjwKKyAgICAvLyAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EeW5hbWljTWVzc2FnZS5CdWlsZGVyPiBhbmQKKyAgICAvLyAgIGNvbS5nb29nbGUucHJvdG9idWYuQWJzdHJhY3RNZXNzYWdlLkJ1aWxkZXI8CisgICAgLy8gICAgIGNvbS5nb29nbGUucHJvdG9idWYuRHluYW1pY01lc3NhZ2UuQnVpbGRlcj4gYXJlIGluY29tcGF0aWJsZTsgYm90aAorICAgIC8vICAgZGVmaW5lIG1lcmdlRnJvbShjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpLCBidXQgd2l0aCB1bnJlbGF0ZWQKKyAgICAvLyAgIHJldHVybiB0eXBlcy4KKyAgICAvLworICAgIC8vIFN0cmFuZ2VseSwgdGhlc2UgbGluZXMgYXJlIG9ubHkgbmVlZGVkIGlmIGphdmFjIGlzIGludm9rZWQgc2VwYXJhdGVseQorICAgIC8vIG9uIEFic3RyYWN0TWVzc2FnZS5qYXZhIGFuZCBBYnN0cmFjdE1lc3NhZ2VMaXRlLmphdmEuICBJZiBqYXZhYyBpcworICAgIC8vIGludm9rZWQgb24gYm90aCBzaW11bHRhbmVvdXNseSwgaXQgd29ya3MuICAoT3IgbWF5YmUgdGhlIGltcG9ydGFudAorICAgIC8vIHBvaW50IGlzIHdoZXRoZXIgb3Igbm90IER5bmFtaWNNZXNzYWdlLmphdmEgaXMgY29tcGlsZWQgdG9nZXRoZXIgd2l0aAorICAgIC8vIEFic3RyYWN0TWVzc2FnZUxpdGUuamF2YSAtLSBub3Qgc3VyZS4pICBJIHN1c3BlY3QgdGhpcyBpcyBhIGNvbXBpbGVyCisgICAgLy8gYnVnLgorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBCeXRlU3RyaW5nIGRhdGEpCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRnJvbShkYXRhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKAorICAgICAgICBmaW5hbCBCeXRlU3RyaW5nIGRhdGEsCisgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc3VwZXIubWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIGJ5dGVbXSBkYXRhKQorICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBzdXBlci5tZXJnZUZyb20oZGF0YSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKKyAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRnJvbShkYXRhLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKKyAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEsCisgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc3VwZXIubWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKAorICAgICAgICBmaW5hbCBieXRlW10gZGF0YSwgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbiwKKyAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBzdXBlci5tZXJnZUZyb20oZGF0YSwgb2ZmLCBsZW4sIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRnJvbShpbnB1dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBzdXBlci5tZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc3VwZXIubWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oCisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc3VwZXIubWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgfQorCisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2VMaXRlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YjI3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhCkBAIC0wLDAgKzEsMzI1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBBIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNZXNzYWdlTGl0ZX0gaW50ZXJmYWNlIHdoaWNoCisgKiBpbXBsZW1lbnRzIGFzIG1hbnkgbWV0aG9kcyBvZiB0aGF0IGludGVyZmFjZSBhcyBwb3NzaWJsZSBpbiB0ZXJtcyBvZiBvdGhlcgorICogbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXNzYWdlTGl0ZSBpbXBsZW1lbnRzIE1lc3NhZ2VMaXRlIHsKKyAgcHVibGljIEJ5dGVTdHJpbmcgdG9CeXRlU3RyaW5nKCkgeworICAgIHRyeSB7CisgICAgICBmaW5hbCBCeXRlU3RyaW5nLkNvZGVkQnVpbGRlciBvdXQgPQorICAgICAgICBCeXRlU3RyaW5nLm5ld0NvZGVkQnVpbGRlcihnZXRTZXJpYWxpemVkU2l6ZSgpKTsKKyAgICAgIHdyaXRlVG8ob3V0LmdldENvZGVkT3V0cHV0KCkpOworICAgICAgcmV0dXJuIG91dC5idWlsZCgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAiU2VyaWFsaXppbmcgdG8gYSBCeXRlU3RyaW5nIHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCisgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtnZXRTZXJpYWxpemVkU2l6ZSgpXTsKKyAgICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJlc3VsdCk7CisgICAgICB3cml0ZVRvKG91dHB1dCk7CisgICAgICBvdXRwdXQuY2hlY2tOb1NwYWNlTGVmdCgpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgIlNlcmlhbGl6aW5nIHRvIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAiICsKKyAgICAgICAgIihzaG91bGQgbmV2ZXIgaGFwcGVuKS4iLCBlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgaW50IGJ1ZmZlclNpemUgPQorICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlUHJlZmVycmVkQnVmZmVyU2l6ZShnZXRTZXJpYWxpemVkU2l6ZSgpKTsKKyAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZE91dHB1dCA9CisgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKG91dHB1dCwgYnVmZmVyU2l6ZSk7CisgICAgd3JpdGVUbyhjb2RlZE91dHB1dCk7CisgICAgY29kZWRPdXRwdXQuZmx1c2goKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRGVsaW1pdGVkVG8oZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgc2VyaWFsaXplZCA9IGdldFNlcmlhbGl6ZWRTaXplKCk7CisgICAgZmluYWwgaW50IGJ1ZmZlclNpemUgPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlUHJlZmVycmVkQnVmZmVyU2l6ZSgKKyAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVJhd1ZhcmludDMyU2l6ZShzZXJpYWxpemVkKSArIHNlcmlhbGl6ZWQpOworICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkT3V0cHV0ID0KKyAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2Uob3V0cHV0LCBidWZmZXJTaXplKTsKKyAgICBjb2RlZE91dHB1dC53cml0ZVJhd1ZhcmludDMyKHNlcmlhbGl6ZWQpOworICAgIHdyaXRlVG8oY29kZWRPdXRwdXQpOworICAgIGNvZGVkT3V0cHV0LmZsdXNoKCk7CisgIH0KKworICAvKioKKyAgICogQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSBpbnRlcmZhY2Ugd2hpY2gKKyAgICogaW1wbGVtZW50cyBhcyBtYW55IG1ldGhvZHMgb2YgdGhhdCBpbnRlcmZhY2UgYXMgcG9zc2libGUgaW4gdGVybXMgb2YKKyAgICogb3RoZXIgbWV0aG9kcy4KKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkZXI8QnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPgorICAgICAgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZS5CdWlsZGVyIHsKKyAgICAvLyBUaGUgY29tcGlsZXIgcHJvZHVjZXMgYW4gZXJyb3IgaWYgdGhpcyBpcyBub3QgZGVjbGFyZWQgZXhwbGljaXRseS4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYWJzdHJhY3QgQnVpbGRlclR5cGUgY2xvbmUoKTsKKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbWVyZ2VGcm9tKGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUuZ2V0RW1wdHlSZWdpc3RyeSgpKTsKKyAgICB9CisKKyAgICAvLyBSZS1kZWZpbmVkIGhlcmUgZm9yIHJldHVybiB0eXBlIGNvdmFyaWFuY2UuCisgICAgcHVibGljIGFic3RyYWN0IEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKKyAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIEJ5dGVTdHJpbmcgZGF0YSkKKyAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gZGF0YS5uZXdDb2RlZElucHV0KCk7CisgICAgICAgIG1lcmdlRnJvbShpbnB1dCk7CisgICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKKyAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBCeXRlU3RyaW5nIHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCisgICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKKyAgICAgICAgZmluYWwgQnl0ZVN0cmluZyBkYXRhLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IGRhdGEubmV3Q29kZWRJbnB1dCgpOworICAgICAgICBtZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKKyAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOworICAgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgZTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgIlJlYWRpbmcgZnJvbSBhIEJ5dGVTdHJpbmcgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKKyAgICAgICAgICAibmV2ZXIgaGFwcGVuKS4iLCBlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIGJ5dGVbXSBkYXRhKQorICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBtZXJnZUZyb20oZGF0YSwgMCwgZGF0YS5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgYnl0ZVtdIGRhdGEsIGZpbmFsIGludCBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0KKyAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSwgb2ZmLCBsZW4pOworICAgICAgICBtZXJnZUZyb20oaW5wdXQpOworICAgICAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7CisgICAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBlOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAiUmVhZGluZyBmcm9tIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAoc2hvdWxkICIgKworICAgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCisgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgcmV0dXJuIG1lcmdlRnJvbShkYXRhLCAwLCBkYXRhLmxlbmd0aCwgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCisgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9CisgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgbWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKKyAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBieXRlIGFycmF5IHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCisgICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gY29kZWRJbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoaW5wdXQpOworICAgICAgbWVyZ2VGcm9tKGNvZGVkSW5wdXQpOworICAgICAgY29kZWRJbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGNvZGVkSW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGlucHV0KTsKKyAgICAgIG1lcmdlRnJvbShjb2RlZElucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgICBjb2RlZElucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKKyAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gSW5wdXRTdHJlYW0gaW1wbGVtZW50YXRpb25zIHdoaWNoIHJlYWRzIGZyb20gc29tZSBvdGhlciBJbnB1dFN0cmVhbQorICAgICAqIGJ1dCBpcyBsaW1pdGVkIHRvIGEgcGFydGljdWxhciBudW1iZXIgb2YgYnl0ZXMuICBVc2VkIGJ5CisgICAgICogbWVyZ2VEZWxpbWl0ZWRGcm9tKCkuICBUaGlzIGlzIGludGVudGlvbmFsbHkgcGFja2FnZS1wcml2YXRlIHNvIHRoYXQKKyAgICAgKiBVbmtub3duRmllbGRTZXQgY2FuIHNoYXJlIGl0LgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBMaW1pdGVkSW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7CisgICAgICBwcml2YXRlIGludCBsaW1pdDsKKworICAgICAgTGltaXRlZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBpbnQgbGltaXQpIHsKKyAgICAgICAgc3VwZXIoaW4pOworICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gTWF0aC5taW4oc3VwZXIuYXZhaWxhYmxlKCksIGxpbWl0KTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobGltaXQgPD0gMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gc3VwZXIucmVhZCgpOworICAgICAgICBpZiAocmVzdWx0ID49IDApIHsKKyAgICAgICAgICAtLWxpbWl0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCByZWFkKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsaW1pdCA8PSAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGxlbiA9IE1hdGgubWluKGxlbiwgbGltaXQpOworICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gc3VwZXIucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgIGlmIChyZXN1bHQgPj0gMCkgeworICAgICAgICAgIGxpbWl0IC09IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBsb25nIHNraXAoZmluYWwgbG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIHJlc3VsdCA9IHN1cGVyLnNraXAoTWF0aC5taW4obiwgbGltaXQpKTsKKyAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7CisgICAgICAgICAgbGltaXQgLT0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKAorICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZmluYWwgaW50IGZpcnN0Qnl0ZSA9IGlucHV0LnJlYWQoKTsKKyAgICAgIGlmIChmaXJzdEJ5dGUgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgZmluYWwgaW50IHNpemUgPSBDb2RlZElucHV0U3RyZWFtLnJlYWRSYXdWYXJpbnQzMihmaXJzdEJ5dGUsIGlucHV0KTsKKyAgICAgIGZpbmFsIElucHV0U3RyZWFtIGxpbWl0ZWRJbnB1dCA9IG5ldyBMaW1pdGVkSW5wdXRTdHJlYW0oaW5wdXQsIHNpemUpOworICAgICAgbWVyZ2VGcm9tKGxpbWl0ZWRJbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIG1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwKKyAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUuZ2V0RW1wdHlSZWdpc3RyeSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gcmVwb3J0aW5nIG1pc3NpbmcgZmllbGRzIGluCisgICAgICogdGhlIGdpdmVuIG1lc3NhZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbgorICAgICAgICBuZXdVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihNZXNzYWdlTGl0ZSBtZXNzYWdlKSB7CisgICAgICByZXR1cm4gbmV3IFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHtAY29kZSB2YWx1ZXN9IHRvIHRoZSB7QGNvZGUgbGlzdH0uICBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZAorICAgICAqIHVzZWQgYnkgZ2VuZXJhdGVkIGNvZGUuICBVc2VycyBzaG91bGQgaWdub3JlIGl0LgorICAgICAqCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mIHtAY29kZSB2YWx1ZXN9IGlzCisgICAgICogbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIDxUPiB2b2lkIGFkZEFsbChmaW5hbCBJdGVyYWJsZTxUPiB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjw/IHN1cGVyIFQ+IGxpc3QpIHsKKyAgICAgIGZvciAoZmluYWwgVCB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAodmFsdWVzIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgeworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFQ+IGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbjxUPikgdmFsdWVzOworICAgICAgICBsaXN0LmFkZEFsbChjb2xsZWN0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoZmluYWwgVCB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgICAgIGxpc3QuYWRkKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Jsb2NraW5nUnBjQ2hhbm5lbC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Jsb2NraW5nUnBjQ2hhbm5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlODExNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQmxvY2tpbmdScGNDaGFubmVsLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIDxwPkFic3RyYWN0IGludGVyZmFjZSBmb3IgYSBibG9ja2luZyBSUEMgY2hhbm5lbC4gIHtAY29kZSBCbG9ja2luZ1JwY0NoYW5uZWx9CisgKiBpcyB0aGUgYmxvY2tpbmcgZXF1aXZhbGVudCB0byB7QGxpbmsgUnBjQ2hhbm5lbH0uCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqIEBhdXRob3IgY3Bvdmlya0Bnb29nbGUuY29tIENocmlzIFBvdmlyaworICovCitwdWJsaWMgaW50ZXJmYWNlIEJsb2NraW5nUnBjQ2hhbm5lbCB7CisgIC8qKgorICAgKiBDYWxsIHRoZSBnaXZlbiBtZXRob2Qgb2YgdGhlIHJlbW90ZSBzZXJ2aWNlIGFuZCBibG9ja3MgdW50aWwgaXQgcmV0dXJucy4KKyAgICoge0Bjb2RlIGNhbGxCbG9ja2luZ01ldGhvZCgpfSBpcyB0aGUgYmxvY2tpbmcgZXF1aXZhbGVudCB0bworICAgKiB7QGxpbmsgUnBjQ2hhbm5lbCNjYWxsTWV0aG9kfS4KKyAgICovCisgIE1lc3NhZ2UgY2FsbEJsb2NraW5nTWV0aG9kKAorICAgICAgRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsCisgICAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsCisgICAgICBNZXNzYWdlIHJlcXVlc3QsCisgICAgICBNZXNzYWdlIHJlc3BvbnNlUHJvdG90eXBlKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CbG9ja2luZ1NlcnZpY2UuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CbG9ja2luZ1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M4MDA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Jsb2NraW5nU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworLyoqCisgKiBCbG9ja2luZyBlcXVpdmFsZW50IHRvIHtAbGluayBTZXJ2aWNlfS4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICogQGF1dGhvciBjcG92aXJrQGdvb2dsZS5jb20gQ2hyaXMgUG92aXJrCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQmxvY2tpbmdTZXJ2aWNlIHsKKyAgLyoqCisgICAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIFNlcnZpY2UjZ2V0RGVzY3JpcHRvckZvclR5cGV9LgorICAgKi8KKyAgRGVzY3JpcHRvcnMuU2VydmljZURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKKworICAvKioKKyAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgU2VydmljZSNjYWxsTWV0aG9kfSwgZXhjZXB0IHRoYXQKKyAgICoge0Bjb2RlIGNhbGxCbG9ja2luZ01ldGhvZCgpfSByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIFJQQyBvciB0aHJvd3MgYQorICAgKiB7QGxpbmsgU2VydmljZUV4Y2VwdGlvbn0gaWYgdGhlcmUgaXMgYSBmYWlsdXJlLCByYXRoZXIgdGhhbiBwYXNzaW5nIHRoZQorICAgKiBpbmZvcm1hdGlvbiB0byBhIGNhbGxiYWNrLgorICAgKi8KKyAgTWVzc2FnZSBjYWxsQmxvY2tpbmdNZXRob2QoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJwY0NvbnRyb2xsZXIgY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSByZXF1ZXN0KSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbjsKKworICAvKioKKyAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgU2VydmljZSNnZXRSZXF1ZXN0UHJvdG90eXBlfS4KKyAgICovCisgIE1lc3NhZ2UgZ2V0UmVxdWVzdFByb3RvdHlwZShEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIG1ldGhvZCk7CisKKyAgLyoqCisgICAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIFNlcnZpY2UjZ2V0UmVzcG9uc2VQcm90b3R5cGV9LgorICAgKi8KKyAgTWVzc2FnZSBnZXRSZXNwb25zZVByb3RvdHlwZShEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIG1ldGhvZCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQnl0ZVN0cmluZy5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVTdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTM1NjM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVTdHJpbmcuamF2YQpAQCAtMCwwICsxLDQwMyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEltbXV0YWJsZSBhcnJheSBvZiBieXRlcy4KKyAqCisgKiBAYXV0aG9yIGNyYXp5Ym9iQGdvb2dsZS5jb20gQm9iIExlZQorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJ5dGVTdHJpbmcgeworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBieXRlczsKKworICBwcml2YXRlIEJ5dGVTdHJpbmcoZmluYWwgYnl0ZVtdIGJ5dGVzKSB7CisgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOworICB9CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgKgorICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB7QGNvZGUgaW5kZXh9IGlzIDwgMCBvciA+PSBzaXplCisgICAqLworICBwdWJsaWMgYnl0ZSBieXRlQXQoZmluYWwgaW50IGluZGV4KSB7CisgICAgcmV0dXJuIGJ5dGVzW2luZGV4XTsKKyAgfQorCisgIC8qKgorICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMuCisgICAqLworICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgcmV0dXJuIGJ5dGVzLmxlbmd0aDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgc2l6ZSBpcyB7QGNvZGUgMH0sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICByZXR1cm4gYnl0ZXMubGVuZ3RoID09IDA7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBieXRlW10gLT4gQnl0ZVN0cmluZworCisgIC8qKgorICAgKiBFbXB0eSBCeXRlU3RyaW5nLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlU3RyaW5nIEVNUFRZID0gbmV3IEJ5dGVTdHJpbmcobmV3IGJ5dGVbMF0pOworCisgIC8qKgorICAgKiBDb3BpZXMgdGhlIGdpdmVuIGJ5dGVzIGludG8gYSB7QGNvZGUgQnl0ZVN0cmluZ30uCisgICAqLworICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgY29weUZyb20oZmluYWwgYnl0ZVtdIGJ5dGVzLCBmaW5hbCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNpemUpIHsKKyAgICBmaW5hbCBieXRlW10gY29weSA9IG5ldyBieXRlW3NpemVdOworICAgIFN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIG9mZnNldCwgY29weSwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIG5ldyBCeXRlU3RyaW5nKGNvcHkpOworICB9CisKKyAgLyoqCisgICAqIENvcGllcyB0aGUgZ2l2ZW4gYnl0ZXMgaW50byBhIHtAY29kZSBCeXRlU3RyaW5nfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbShmaW5hbCBieXRlW10gYnl0ZXMpIHsKKyAgICByZXR1cm4gY29weUZyb20oYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CisgIH0KKworICAvKioKKyAgICogQ29waWVzIHtAY29kZSBzaXplfSBieXRlcyBmcm9tIGEge0Bjb2RlIGphdmEubmlvLkJ5dGVCdWZmZXJ9IGludG8KKyAgICogYSB7QGNvZGUgQnl0ZVN0cmluZ30uCisgICAqLworICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgY29weUZyb20oZmluYWwgQnl0ZUJ1ZmZlciBieXRlcywgZmluYWwgaW50IHNpemUpIHsKKyAgICBmaW5hbCBieXRlW10gY29weSA9IG5ldyBieXRlW3NpemVdOworICAgIGJ5dGVzLmdldChjb3B5KTsKKyAgICByZXR1cm4gbmV3IEJ5dGVTdHJpbmcoY29weSk7CisgIH0KKworICAvKioKKyAgICogQ29waWVzIHRoZSByZW1haW5pbmcgYnl0ZXMgZnJvbSBhIHtAY29kZSBqYXZhLm5pby5CeXRlQnVmZmVyfSBpbnRvCisgICAqIGEge0Bjb2RlIEJ5dGVTdHJpbmd9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGNvcHlGcm9tKGZpbmFsIEJ5dGVCdWZmZXIgYnl0ZXMpIHsKKyAgICByZXR1cm4gY29weUZyb20oYnl0ZXMsIGJ5dGVzLnJlbWFpbmluZygpKTsKKyAgfQorCisgIC8qKgorICAgKiBFbmNvZGVzIHtAY29kZSB0ZXh0fSBpbnRvIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdXNpbmcgdGhlIG5hbWVkIGNoYXJzZXQKKyAgICogYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhIHtAY29kZSBCeXRlU3RyaW5nfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbShmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgU3RyaW5nIGNoYXJzZXROYW1lKQorICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIHJldHVybiBuZXcgQnl0ZVN0cmluZyh0ZXh0LmdldEJ5dGVzKGNoYXJzZXROYW1lKSk7CisgIH0KKworICAvKioKKyAgICogRW5jb2RlcyB7QGNvZGUgdGV4dH0gaW50byBhIHNlcXVlbmNlIG9mIFVURi04IGJ5dGVzIGFuZCByZXR1cm5zIHRoZQorICAgKiByZXN1bHQgYXMgYSB7QGNvZGUgQnl0ZVN0cmluZ30uCisgICAqLworICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgY29weUZyb21VdGY4KGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgQnl0ZVN0cmluZyh0ZXh0LmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVVEYtOCBub3Qgc3VwcG9ydGVkPyIsIGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDb25jYXRlbmF0ZXMgYWxsIGJ5dGUgc3RyaW5ncyBpbiB0aGUgbGlzdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgKgorICAgKiA8cD5UaGUgcmV0dXJuZWQge0Bjb2RlIEJ5dGVTdHJpbmd9IGlzIG5vdCBuZWNlc3NhcmlseSBhIHVuaXF1ZSBvYmplY3QuCisgICAqIElmIHRoZSBsaXN0IGlzIGVtcHR5LCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIHRoZSBzaW5nbGV0b24gZW1wdHkKKyAgICoge0Bjb2RlIEJ5dGVTdHJpbmd9LiAgSWYgdGhlIGxpc3QgaGFzIG9ubHkgb25lIGVsZW1lbnQsIHRoYXQKKyAgICoge0Bjb2RlIEJ5dGVTdHJpbmd9IHdpbGwgYmUgcmV0dXJuZWQgd2l0aG91dCBjb3B5aW5nLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGNvcHlGcm9tKExpc3Q8Qnl0ZVN0cmluZz4gbGlzdCkgeworICAgIGlmIChsaXN0LnNpemUoKSA9PSAwKSB7CisgICAgICByZXR1cm4gRU1QVFk7CisgICAgfSBlbHNlIGlmIChsaXN0LnNpemUoKSA9PSAxKSB7CisgICAgICByZXR1cm4gbGlzdC5nZXQoMCk7CisgICAgfQorCisgICAgaW50IHNpemUgPSAwOworICAgIGZvciAoQnl0ZVN0cmluZyBzdHIgOiBsaXN0KSB7CisgICAgICBzaXplICs9IHN0ci5zaXplKCk7CisgICAgfQorICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3NpemVdOworICAgIGludCBwb3MgPSAwOworICAgIGZvciAoQnl0ZVN0cmluZyBzdHIgOiBsaXN0KSB7CisgICAgICBTeXN0ZW0uYXJyYXljb3B5KHN0ci5ieXRlcywgMCwgYnl0ZXMsIHBvcywgc3RyLnNpemUoKSk7CisgICAgICBwb3MgKz0gc3RyLnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBCeXRlU3RyaW5nKGJ5dGVzKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEJ5dGVTdHJpbmcgLT4gYnl0ZVtdCisKKyAgLyoqCisgICAqIENvcGllcyBieXRlcyBpbnRvIGEgYnVmZmVyIGF0IHRoZSBnaXZlbiBvZmZzZXQuCisgICAqCisgICAqIEBwYXJhbSB0YXJnZXQgYnVmZmVyIHRvIGNvcHkgaW50bworICAgKiBAcGFyYW0gb2Zmc2V0IGluIHRoZSB0YXJnZXQgYnVmZmVyCisgICAqLworICBwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgYnl0ZVtdIHRhcmdldCwgZmluYWwgaW50IG9mZnNldCkgeworICAgIFN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsIHRhcmdldCwgb2Zmc2V0LCBieXRlcy5sZW5ndGgpOworICB9CisKKyAgLyoqCisgICAqIENvcGllcyBieXRlcyBpbnRvIGEgYnVmZmVyLgorICAgKgorICAgKiBAcGFyYW0gdGFyZ2V0IGJ1ZmZlciB0byBjb3B5IGludG8KKyAgICogQHBhcmFtIHNvdXJjZU9mZnNldCBvZmZzZXQgd2l0aGluIHRoZXNlIGJ5dGVzCisgICAqIEBwYXJhbSB0YXJnZXRPZmZzZXQgb2Zmc2V0IHdpdGhpbiB0aGUgdGFyZ2V0IGJ1ZmZlcgorICAgKiBAcGFyYW0gc2l6ZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICAgKi8KKyAgcHVibGljIHZvaWQgY29weVRvKGZpbmFsIGJ5dGVbXSB0YXJnZXQsIGZpbmFsIGludCBzb3VyY2VPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGFyZ2V0T2Zmc2V0LAorICAgICAgZmluYWwgaW50IHNpemUpIHsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCBzb3VyY2VPZmZzZXQsIHRhcmdldCwgdGFyZ2V0T2Zmc2V0LCBzaXplKTsKKyAgfQorCisgIC8qKgorICAgKiBDb3BpZXMgYnl0ZXMgaW50byBhIEJ5dGVCdWZmZXIuCisgICAqCisgICAqIEBwYXJhbSB0YXJnZXQgQnl0ZUJ1ZmZlciB0byBjb3B5IGludG8uCisgICAqIEB0aHJvd3MgUmVhZE9ubHlCdWZmZXJFeGNlcHRpb24gaWYgdGhlIHtAY29kZSB0YXJnZXR9IGlzIHJlYWQtb25seQorICAgKiBAdGhyb3dzIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uIGlmIHRoZSB7QGNvZGUgdGFyZ2V0fSdzIHJlbWFpbmluZygpCisgICAqICAgICAgICAgc3BhY2UgaXMgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBkYXRhLgorICAgKi8KKyAgcHVibGljIHZvaWQgY29weVRvKEJ5dGVCdWZmZXIgdGFyZ2V0KSB7CisgICAgdGFyZ2V0LnB1dChieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBDb3BpZXMgYnl0ZXMgdG8gYSB7QGNvZGUgYnl0ZVtdfS4KKyAgICovCisgIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7CisgICAgZmluYWwgaW50IHNpemUgPSBieXRlcy5sZW5ndGg7CisgICAgZmluYWwgYnl0ZVtdIGNvcHkgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCAwLCBjb3B5LCAwLCBzaXplKTsKKyAgICByZXR1cm4gY29weTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlYWQtb25seSB7QGNvZGUgamF2YS5uaW8uQnl0ZUJ1ZmZlcn0gd2l0aCB0aGUKKyAgICogc2FtZSBiYWNraW5nIGJ5dGUgYXJyYXkuCisgICAqLworICBwdWJsaWMgQnl0ZUJ1ZmZlciBhc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpIHsKKyAgICBmaW5hbCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLndyYXAoYnl0ZXMpOworICAgIHJldHVybiBieXRlQnVmZmVyLmFzUmVhZE9ubHlCdWZmZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJpbmd9IGJ5IGRlY29kaW5nIHRoZSBieXRlcyB1c2luZyB0aGUKKyAgICogc3BlY2lmaWVkIGNoYXJzZXQuCisgICAqLworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGZpbmFsIFN0cmluZyBjaGFyc2V0TmFtZSkKKyAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgY2hhcnNldE5hbWUpOworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFN0cmluZ30gYnkgZGVjb2RpbmcgdGhlIGJ5dGVzIGFzIFVURi04LgorICAgKi8KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZ1V0ZjgoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCAiVVRGLTgiKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVVEYtOCBub3Qgc3VwcG9ydGVkPyIsIGUpOworICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgIGlmIChvID09IHRoaXMpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICghKG8gaW5zdGFuY2VvZiBCeXRlU3RyaW5nKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZpbmFsIEJ5dGVTdHJpbmcgb3RoZXIgPSAoQnl0ZVN0cmluZykgbzsKKyAgICBmaW5hbCBpbnQgc2l6ZSA9IGJ5dGVzLmxlbmd0aDsKKyAgICBpZiAoc2l6ZSAhPSBvdGhlci5ieXRlcy5sZW5ndGgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmaW5hbCBieXRlW10gdGhpc0J5dGVzID0gYnl0ZXM7CisgICAgZmluYWwgYnl0ZVtdIG90aGVyQnl0ZXMgPSBvdGhlci5ieXRlczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgaWYgKHRoaXNCeXRlc1tpXSAhPSBvdGhlckJ5dGVzW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHByaXZhdGUgdm9sYXRpbGUgaW50IGhhc2ggPSAwOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGludCBoID0gaGFzaDsKKworICAgIGlmIChoID09IDApIHsKKyAgICAgIGZpbmFsIGJ5dGVbXSB0aGlzQnl0ZXMgPSBieXRlczsKKyAgICAgIGZpbmFsIGludCBzaXplID0gYnl0ZXMubGVuZ3RoOworCisgICAgICBoID0gc2l6ZTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGggPSBoICogMzEgKyB0aGlzQnl0ZXNbaV07CisgICAgICB9CisgICAgICBpZiAoaCA9PSAwKSB7CisgICAgICAgIGggPSAxOworICAgICAgfQorCisgICAgICBoYXNoID0gaDsKKyAgICB9CisKKyAgICByZXR1cm4gaDsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIElucHV0IHN0cmVhbQorCisgIC8qKgorICAgKiBDcmVhdGVzIGFuIHtAY29kZSBJbnB1dFN0cmVhbX0gd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVhZCB0aGUgYnl0ZXMuCisgICAqLworICBwdWJsaWMgSW5wdXRTdHJlYW0gbmV3SW5wdXQoKSB7CisgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIHtAbGluayBDb2RlZElucHV0U3RyZWFtfSB3aGljaCBjYW4gYmUgdXNlZCB0byByZWFkIHRoZSBieXRlcy4KKyAgICogVXNpbmcgdGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGNyZWF0aW5nIGEge0BsaW5rIENvZGVkSW5wdXRTdHJlYW19CisgICAqIHdyYXBwaW5nIHRoZSByZXN1bHQgb2Yge0BsaW5rICNuZXdJbnB1dCgpfS4KKyAgICovCisgIHB1YmxpYyBDb2RlZElucHV0U3RyZWFtIG5ld0NvZGVkSW5wdXQoKSB7CisgICAgLy8gV2UgdHJ1c3QgQ29kZWRJbnB1dFN0cmVhbSBub3QgdG8gbW9kaWZ5IHRoZSBieXRlcywgb3IgdG8gZ2l2ZSBhbnlvbmUKKyAgICAvLyBlbHNlIGFjY2VzcyB0byB0aGVtLgorICAgIHJldHVybiBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ5dGVzKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIE91dHB1dCBzdHJlYW0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgT3V0cHV0fSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGNhcGFjaXR5LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBPdXRwdXQgbmV3T3V0cHV0KGZpbmFsIGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICByZXR1cm4gbmV3IE91dHB1dChuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGluaXRpYWxDYXBhY2l0eSkpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE91dHB1dH0uCisgICAqLworICBwdWJsaWMgc3RhdGljIE91dHB1dCBuZXdPdXRwdXQoKSB7CisgICAgcmV0dXJuIG5ld091dHB1dCgzMik7CisgIH0KKworICAvKioKKyAgICogT3V0cHV0cyB0byBhIHtAY29kZSBCeXRlU3RyaW5nfSBpbnN0YW5jZS4gQ2FsbCB7QGxpbmsgI3RvQnl0ZVN0cmluZygpfSB0bworICAgKiBjcmVhdGUgdGhlIHtAY29kZSBCeXRlU3RyaW5nfSBpbnN0YW5jZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgT3V0cHV0IGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIHsKKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBvdXRwdXQgd2l0aCB0aGUgZ2l2ZW4gaW5pdGlhbCBjYXBhY2l0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE91dHB1dChmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCkgeworICAgICAgc3VwZXIoYm91dCk7CisgICAgICB0aGlzLmJvdXQgPSBib3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgQnl0ZVN0cmluZ30gaW5zdGFuY2UgZnJvbSB0aGlzIHtAY29kZSBPdXRwdXR9LgorICAgICAqLworICAgIHB1YmxpYyBCeXRlU3RyaW5nIHRvQnl0ZVN0cmluZygpIHsKKyAgICAgIGZpbmFsIGJ5dGVbXSBieXRlQXJyYXkgPSBib3V0LnRvQnl0ZUFycmF5KCk7CisgICAgICByZXR1cm4gbmV3IEJ5dGVTdHJpbmcoYnl0ZUFycmF5KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0cyBhIG5ldyBCeXRlU3RyaW5nIGJ1aWxkZXIsIHdoaWNoIGFsbG93cyB5b3UgdG8gZWZmaWNpZW50bHkKKyAgICogY29uc3RydWN0IGEge0Bjb2RlIEJ5dGVTdHJpbmd9IGJ5IHdyaXRpbmcgdG8gYSB7QGxpbmsgQ29kZWRPdXRwdXRTdHJlYW19LgorICAgKiBVc2luZyB0aGlzIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIHtAY29kZSBuZXdPdXRwdXQoKX0gYW5kCisgICAqIHdyYXBwaW5nIHRoYXQgaW4gYSB7QGNvZGUgQ29kZWRPdXRwdXRTdHJlYW19LgorICAgKgorICAgKiA8cD5UaGlzIGlzIHBhY2thZ2UtcHJpdmF0ZSBiZWNhdXNlIGl0J3MgYSBzb21ld2hhdCBjb25mdXNpbmcgaW50ZXJmYWNlLgorICAgKiBVc2VycyBjYW4gY2FsbCB7QGxpbmsgTWVzc2FnZSN0b0J5dGVTdHJpbmcoKX0gaW5zdGVhZCBvZiBjYWxsaW5nIHRoaXMKKyAgICogZGlyZWN0bHkuCisgICAqCisgICAqIEBwYXJhbSBzaXplIFRoZSB0YXJnZXQgYnl0ZSBzaXplIG9mIHRoZSB7QGNvZGUgQnl0ZVN0cmluZ30uICBZb3UgbXVzdAorICAgKiAgICAgICAgICAgICB3cml0ZSBleGFjdGx5IHRoaXMgbWFueSBieXRlcyBiZWZvcmUgYnVpbGRpbmcgdGhlIHJlc3VsdC4KKyAgICovCisgIHN0YXRpYyBDb2RlZEJ1aWxkZXIgbmV3Q29kZWRCdWlsZGVyKGZpbmFsIGludCBzaXplKSB7CisgICAgcmV0dXJuIG5ldyBDb2RlZEJ1aWxkZXIoc2l6ZSk7CisgIH0KKworICAvKiogU2VlIHtAbGluayBCeXRlU3RyaW5nI25ld0NvZGVkQnVpbGRlcihpbnQpfS4gKi8KKyAgc3RhdGljIGZpbmFsIGNsYXNzIENvZGVkQnVpbGRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYnVmZmVyOworCisgICAgcHJpdmF0ZSBDb2RlZEJ1aWxkZXIoZmluYWwgaW50IHNpemUpIHsKKyAgICAgIGJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOworICAgICAgb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UoYnVmZmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnl0ZVN0cmluZyBidWlsZCgpIHsKKyAgICAgIG91dHB1dC5jaGVja05vU3BhY2VMZWZ0KCk7CisKKyAgICAgIC8vIFdlIGNhbiBiZSBjb25maWRlbnQgdGhhdCB0aGUgQ29kZWRPdXRwdXRTdHJlYW0gd2lsbCBub3QgbW9kaWZ5IHRoZQorICAgICAgLy8gdW5kZXJseWluZyBieXRlcyBhbnltb3JlIGJlY2F1c2UgaXQgYWxyZWFkeSB3cm90ZSBhbGwgb2YgdGhlbS4gIFNvLAorICAgICAgLy8gbm8gbmVlZCB0byBtYWtlIGEgY29weS4KKyAgICAgIHJldHVybiBuZXcgQnl0ZVN0cmluZyhidWZmZXIpOworICAgIH0KKworICAgIHB1YmxpYyBDb2RlZE91dHB1dFN0cmVhbSBnZXRDb2RlZE91dHB1dCgpIHsKKyAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2UwODU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDg4NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUmVhZHMgYW5kIGRlY29kZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZHMuCisgKgorICogVGhpcyBjbGFzcyBjb250YWlucyB0d28ga2luZHMgb2YgbWV0aG9kczogIG1ldGhvZHMgdGhhdCByZWFkIHNwZWNpZmljCisgKiBwcm90b2NvbCBtZXNzYWdlIGNvbnN0cnVjdHMgYW5kIGZpZWxkIHR5cGVzIChlLmcuIHtAbGluayAjcmVhZFRhZygpfSBhbmQKKyAqIHtAbGluayAjcmVhZEludDMyKCl9KSBhbmQgbWV0aG9kcyB0aGF0IHJlYWQgbG93LWxldmVsIHZhbHVlcyAoZS5nLgorICoge0BsaW5rICNyZWFkUmF3VmFyaW50MzIoKX0gYW5kIHtAbGluayAjcmVhZFJhd0J5dGVzfSkuICBJZiB5b3UgYXJlIHJlYWRpbmcKKyAqIGVuY29kZWQgcHJvdG9jb2wgbWVzc2FnZXMsIHlvdSBzaG91bGQgdXNlIHRoZSBmb3JtZXIgbWV0aG9kcywgYnV0IGlmIHlvdSBhcmUKKyAqIHJlYWRpbmcgc29tZSBvdGhlciBmb3JtYXQgb2YgeW91ciBvd24gZGVzaWduLCB1c2UgdGhlIGxhdHRlci4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbSB7CisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgQ29kZWRJbnB1dFN0cmVhbSB3cmFwcGluZyB0aGUgZ2l2ZW4gSW5wdXRTdHJlYW0uCisgICAqLworICBwdWJsaWMgc3RhdGljIENvZGVkSW5wdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpIHsKKyAgICByZXR1cm4gbmV3IENvZGVkSW5wdXRTdHJlYW0oaW5wdXQpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHdyYXBwaW5nIHRoZSBnaXZlbiBieXRlIGFycmF5LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBDb2RlZElucHV0U3RyZWFtIG5ld0luc3RhbmNlKGZpbmFsIGJ5dGVbXSBidWYpIHsKKyAgICByZXR1cm4gbmV3SW5zdGFuY2UoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcgQ29kZWRJbnB1dFN0cmVhbSB3cmFwcGluZyB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSBzbGljZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQ29kZWRJbnB1dFN0cmVhbSBuZXdJbnN0YW5jZShmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbikgeworICAgIENvZGVkSW5wdXRTdHJlYW0gcmVzdWx0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oYnVmLCBvZmYsIGxlbik7CisgICAgdHJ5IHsKKyAgICAgIC8vIFNvbWUgdXNlcyBvZiBDb2RlZElucHV0U3RyZWFtIGNhbiBiZSBtb3JlIGVmZmljaWVudCBpZiB0aGV5IGtub3cKKyAgICAgIC8vIGV4YWN0bHkgaG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gIEJ5IHB1c2hpbmcgdGhlIGVuZCBwb2ludCBvZiB0aGUKKyAgICAgIC8vIGJ1ZmZlciBhcyBhIGxpbWl0LCB3ZSBhbGxvdyB0aGVtIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uIHZpYQorICAgICAgLy8gZ2V0Qnl0ZXNVbnRpbExpbWl0KCkuICBQdXNoaW5nIGEgbGltaXQgdGhhdCB3ZSBrbm93IGlzIGF0IHRoZSBlbmQgb2YKKyAgICAgIC8vIHRoZSBzdHJlYW0gY2FuIG5ldmVyIGh1cnQsIHNpbmNlIHdlIGNhbiBuZXZlciBwYXN0IHRoYXQgcG9pbnQgYW55d2F5LgorICAgICAgcmVzdWx0LnB1c2hMaW1pdChsZW4pOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBleCkgeworICAgICAgLy8gVGhlIG9ubHkgcmVhc29uIHB1c2hMaW1pdCgpIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbiBoZXJlIGlzIGlmIGxlbgorICAgICAgLy8gaXMgbmVnYXRpdmUuIE5vcm1hbGx5IHB1c2hMaW1pdCgpJ3MgcGFyYW1ldGVyIGNvbWVzIGRpcmVjdGx5IG9mZiB0aGUKKyAgICAgIC8vIHdpcmUsIHNvIGl0J3MgaW1wb3J0YW50IHRvIGNhdGNoIGV4Y2VwdGlvbnMgaW4gY2FzZSBvZiBjb3JydXB0IG9yCisgICAgICAvLyBtYWxpY2lvdXMgZGF0YS4gSG93ZXZlciwgaW4gdGhpcyBjYXNlLCB3ZSBleHBlY3QgdGhhdCBsZW4gaXMgbm90IGEKKyAgICAgIC8vIHVzZXItc3VwcGxpZWQgdmFsdWUsIHNvIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBiZWluZyBuZWdhdGl2ZSBpbmRpY2F0ZXMKKyAgICAgIC8vIGEgcHJvZ3JhbW1pbmcgZXJyb3IuIFRoZXJlZm9yZSwgdGhyb3dpbmcgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiBpcworICAgICAgLy8gYXBwcm9wcmlhdGUuCisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIEF0dGVtcHQgdG8gcmVhZCBhIGZpZWxkIHRhZywgcmV0dXJuaW5nIHplcm8gaWYgd2UgaGF2ZSByZWFjaGVkIEVPRi4KKyAgICogUHJvdG9jb2wgbWVzc2FnZSBwYXJzZXJzIHVzZSB0aGlzIHRvIHJlYWQgdGFncywgc2luY2UgYSBwcm90b2NvbCBtZXNzYWdlCisgICAqIG1heSBsZWdhbGx5IGVuZCB3aGVyZXZlciBhIHRhZyBvY2N1cnMsIGFuZCB6ZXJvIGlzIG5vdCBhIHZhbGlkIHRhZyBudW1iZXIuCisgICAqLworICBwdWJsaWMgaW50IHJlYWRUYWcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChpc0F0RW5kKCkpIHsKKyAgICAgIGxhc3RUYWcgPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbGFzdFRhZyA9IHJlYWRSYXdWYXJpbnQzMigpOworICAgIGlmIChXaXJlRm9ybWF0LmdldFRhZ0ZpZWxkTnVtYmVyKGxhc3RUYWcpID09IDApIHsKKyAgICAgIC8vIElmIHdlIGFjdHVhbGx5IHJlYWQgemVybyAob3IgYW55IHRhZyBudW1iZXIgY29ycmVzcG9uZGluZyB0byBmaWVsZAorICAgICAgLy8gbnVtYmVyIHplcm8pLCB0aGF0J3Mgbm90IGEgdmFsaWQgdGFnLgorICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmludmFsaWRUYWcoKTsKKyAgICB9CisgICAgcmV0dXJuIGxhc3RUYWc7CisgIH0KKworICAvKioKKyAgICogVmVyaWZpZXMgdGhhdCB0aGUgbGFzdCBjYWxsIHRvIHJlYWRUYWcoKSByZXR1cm5lZCB0aGUgZ2l2ZW4gdGFnIHZhbHVlLgorICAgKiBUaGlzIGlzIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYSBuZXN0ZWQgZ3JvdXAgZW5kZWQgd2l0aCB0aGUgY29ycmVjdAorICAgKiBlbmQgdGFnLgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7QGNvZGUgdmFsdWV9IGRvZXMgbm90IG1hdGNoIHRoZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IHRhZy4KKyAgICovCisgIHB1YmxpYyB2b2lkIGNoZWNrTGFzdFRhZ1dhcyhmaW5hbCBpbnQgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICBpZiAobGFzdFRhZyAhPSB2YWx1ZSkgeworICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmludmFsaWRFbmRUYWcoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVhZHMgYW5kIGRpc2NhcmRzIGEgc2luZ2xlIGZpZWxkLCBnaXZlbiBpdHMgdGFnIHZhbHVlLgorICAgKgorICAgKiBAcmV0dXJuIHtAY29kZSBmYWxzZX0gaWYgdGhlIHRhZyBpcyBhbiBlbmRncm91cCB0YWcsIGluIHdoaWNoIGNhc2UKKyAgICogICAgICAgICBub3RoaW5nIGlzIHNraXBwZWQuICBPdGhlcndpc2UsIHJldHVybnMge0Bjb2RlIHRydWV9LgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gc2tpcEZpZWxkKGZpbmFsIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3dpdGNoIChXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZykpIHsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQ6CisgICAgICAgIHJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDY0OgorICAgICAgICByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgICAgc2tpcFJhd0J5dGVzKHJlYWRSYXdWYXJpbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVA6CisgICAgICAgIHNraXBNZXNzYWdlKCk7CisgICAgICAgIGNoZWNrTGFzdFRhZ1dhcygKKyAgICAgICAgICBXaXJlRm9ybWF0Lm1ha2VUYWcoV2lyZUZvcm1hdC5nZXRUYWdGaWVsZE51bWJlcih0YWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVA6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyOgorICAgICAgICByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uaW52YWxpZFdpcmVUeXBlKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlYWRzIGFuZCBkaXNjYXJkcyBhbiBlbnRpcmUgbWVzc2FnZS4gIFRoaXMgd2lsbCByZWFkIGVpdGhlciB1bnRpbCBFT0YKKyAgICogb3IgdW50aWwgYW4gZW5kZ3JvdXAgdGFnLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCisgICAqLworICBwdWJsaWMgdm9pZCBza2lwTWVzc2FnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGZpbmFsIGludCB0YWcgPSByZWFkVGFnKCk7CisgICAgICBpZiAodGFnID09IDAgfHwgIXNraXBGaWVsZCh0YWcpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKiBSZWFkIGEge0Bjb2RlIGRvdWJsZX0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShyZWFkUmF3TGl0dGxlRW5kaWFuNjQoKSk7CisgIH0KKworICAvKiogUmVhZCBhIHtAY29kZSBmbG9hdH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgZmxvYXQgcmVhZEZsb2F0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gRmxvYXQuaW50Qml0c1RvRmxvYXQocmVhZFJhd0xpdHRsZUVuZGlhbjMyKCkpOworICB9CisKKyAgLyoqIFJlYWQgYSB7QGNvZGUgdWludDY0fSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBsb25nIHJlYWRVSW50NjQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiByZWFkUmF3VmFyaW50NjQoKTsKKyAgfQorCisgIC8qKiBSZWFkIGFuIHtAY29kZSBpbnQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgbG9uZyByZWFkSW50NjQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiByZWFkUmF3VmFyaW50NjQoKTsKKyAgfQorCisgIC8qKiBSZWFkIGFuIHtAY29kZSBpbnQzMn0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgaW50IHJlYWRJbnQzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRSYXdWYXJpbnQzMigpOworICB9CisKKyAgLyoqIFJlYWQgYSB7QGNvZGUgZml4ZWQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgbG9uZyByZWFkRml4ZWQ2NCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpOworICB9CisKKyAgLyoqIFJlYWQgYSB7QGNvZGUgZml4ZWQzMn0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgaW50IHJlYWRGaXhlZDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcmVhZFJhd0xpdHRsZUVuZGlhbjMyKCk7CisgIH0KKworICAvKiogUmVhZCBhIHtAY29kZSBib29sfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcmVhZFJhd1ZhcmludDMyKCkgIT0gMDsKKyAgfQorCisgIC8qKiBSZWFkIGEge0Bjb2RlIHN0cmluZ30gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIGludCBzaXplID0gcmVhZFJhd1ZhcmludDMyKCk7CisgICAgaWYgKHNpemUgPD0gKGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpICYmIHNpemUgPiAwKSB7CisgICAgICAvLyBGYXN0IHBhdGg6ICBXZSBhbHJlYWR5IGhhdmUgdGhlIGJ5dGVzIGluIGEgY29udGlndW91cyBidWZmZXIsIHNvCisgICAgICAvLyAgIGp1c3QgY29weSBkaXJlY3RseSBmcm9tIGl0LgorICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcoYnVmZmVyLCBidWZmZXJQb3MsIHNpemUsICJVVEYtOCIpOworICAgICAgYnVmZmVyUG9zICs9IHNpemU7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZWxzZSB7CisgICAgICAvLyBTbG93IHBhdGg6ICBCdWlsZCBhIGJ5dGUgYXJyYXkgZmlyc3QgdGhlbiBjb3B5IGl0LgorICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocmVhZFJhd0J5dGVzKHNpemUpLCAiVVRGLTgiKTsKKyAgICB9CisgIH0KKworICAvKiogUmVhZCBhIHtAY29kZSBncm91cH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCByZWFkR3JvdXAoZmluYWwgaW50IGZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUuQnVpbGRlciBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAocmVjdXJzaW9uRGVwdGggPj0gcmVjdXJzaW9uTGltaXQpIHsKKyAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5yZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCk7CisgICAgfQorICAgICsrcmVjdXJzaW9uRGVwdGg7CisgICAgYnVpbGRlci5tZXJnZUZyb20odGhpcywgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgIGNoZWNrTGFzdFRhZ1dhcygKKyAgICAgIFdpcmVGb3JtYXQubWFrZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApKTsKKyAgICAtLXJlY3Vyc2lvbkRlcHRoOworICB9CisKKyAgLyoqCisgICAqIFJlYWRzIGEge0Bjb2RlIGdyb3VwfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0gYW5kIG1lcmdlcyBpdCBpbnRvIHRoZQorICAgKiBnaXZlbiB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fS4KKyAgICoKKyAgICogQGRlcHJlY2F0ZWQgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgbm93IGltcGxlbWVudHMgTWVzc2FnZUxpdGUuQnVpbGRlciwgc28KKyAgICogICAgICAgICAgICAgeW91IGNhbiBqdXN0IGNhbGwge0BsaW5rICNyZWFkR3JvdXB9LgorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHZvaWQgcmVhZFVua25vd25Hcm91cChmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUuQnVpbGRlciBidWlsZGVyKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAvLyBXZSBrbm93IHRoYXQgVW5rbm93bkZpZWxkU2V0IHdpbGwgaWdub3JlIGFueSBFeHRlbnNpb25SZWdpc3RyeSBzbyBpdAorICAgIC8vIGlzIHNhZmUgdG8gcGFzcyBudWxsIGhlcmUuICAoV2UgY2FuJ3QgY2FsbAorICAgIC8vIEV4dGVuc2lvblJlZ2lzdHJ5LmdldEVtcHR5UmVnaXN0cnkoKSBiZWNhdXNlIHRoYXQgd291bGQgbWFrZSB0aGlzCisgICAgLy8gY2xhc3MgZGVwZW5kIG9uIEV4dGVuc2lvblJlZ2lzdHJ5LCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGUgbGl0ZQorICAgIC8vIGxpYnJhcnkuKQorICAgIHJlYWRHcm91cChmaWVsZE51bWJlciwgYnVpbGRlciwgbnVsbCk7CisgIH0KKworICAvKiogUmVhZCBhbiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2UoZmluYWwgTWVzc2FnZUxpdGUuQnVpbGRlciBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkUmF3VmFyaW50MzIoKTsKKyAgICBpZiAocmVjdXJzaW9uRGVwdGggPj0gcmVjdXJzaW9uTGltaXQpIHsKKyAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5yZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCk7CisgICAgfQorICAgIGZpbmFsIGludCBvbGRMaW1pdCA9IHB1c2hMaW1pdChsZW5ndGgpOworICAgICsrcmVjdXJzaW9uRGVwdGg7CisgICAgYnVpbGRlci5tZXJnZUZyb20odGhpcywgZXh0ZW5zaW9uUmVnaXN0cnkpOworICAgIGNoZWNrTGFzdFRhZ1dhcygwKTsKKyAgICAtLXJlY3Vyc2lvbkRlcHRoOworICAgIHBvcExpbWl0KG9sZExpbWl0KTsKKyAgfQorCisgIC8qKiBSZWFkIGEge0Bjb2RlIGJ5dGVzfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBCeXRlU3RyaW5nIHJlYWRCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgaW50IHNpemUgPSByZWFkUmF3VmFyaW50MzIoKTsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICByZXR1cm4gQnl0ZVN0cmluZy5FTVBUWTsKKyAgICB9IGVsc2UgaWYgKHNpemUgPD0gKGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpICYmIHNpemUgPiAwKSB7CisgICAgICAvLyBGYXN0IHBhdGg6ICBXZSBhbHJlYWR5IGhhdmUgdGhlIGJ5dGVzIGluIGEgY29udGlndW91cyBidWZmZXIsIHNvCisgICAgICAvLyAgIGp1c3QgY29weSBkaXJlY3RseSBmcm9tIGl0LgorICAgICAgZmluYWwgQnl0ZVN0cmluZyByZXN1bHQgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ1ZmZlciwgYnVmZmVyUG9zLCBzaXplKTsKKyAgICAgIGJ1ZmZlclBvcyArPSBzaXplOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU2xvdyBwYXRoOiAgQnVpbGQgYSBieXRlIGFycmF5IGZpcnN0IHRoZW4gY29weSBpdC4KKyAgICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKHJlYWRSYXdCeXRlcyhzaXplKSk7CisgICAgfQorICB9CisKKyAgLyoqIFJlYWQgYSB7QGNvZGUgdWludDMyfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyBpbnQgcmVhZFVJbnQzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRSYXdWYXJpbnQzMigpOworICB9CisKKyAgLyoqCisgICAqIFJlYWQgYW4gZW51bSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICBDYWxsZXIgaXMgcmVzcG9uc2libGUKKyAgICogZm9yIGNvbnZlcnRpbmcgdGhlIG51bWVyaWMgdmFsdWUgdG8gYW4gYWN0dWFsIGVudW0uCisgICAqLworICBwdWJsaWMgaW50IHJlYWRFbnVtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcmVhZFJhd1ZhcmludDMyKCk7CisgIH0KKworICAvKiogUmVhZCBhbiB7QGNvZGUgc2ZpeGVkMzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIGludCByZWFkU0ZpeGVkMzIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKTsKKyAgfQorCisgIC8qKiBSZWFkIGFuIHtAY29kZSBzZml4ZWQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgbG9uZyByZWFkU0ZpeGVkNjQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKTsKKyAgfQorCisgIC8qKiBSZWFkIGFuIHtAY29kZSBzaW50MzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIGludCByZWFkU0ludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZGVjb2RlWmlnWmFnMzIocmVhZFJhd1ZhcmludDMyKCkpOworICB9CisKKyAgLyoqIFJlYWQgYW4ge0Bjb2RlIHNpbnQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgbG9uZyByZWFkU0ludDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZGVjb2RlWmlnWmFnNjQocmVhZFJhd1ZhcmludDY0KCkpOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKioKKyAgICogUmVhZCBhIHJhdyBWYXJpbnQgZnJvbSB0aGUgc3RyZWFtLiAgSWYgbGFyZ2VyIHRoYW4gMzIgYml0cywgZGlzY2FyZCB0aGUKKyAgICogdXBwZXIgYml0cy4KKyAgICovCisgIHB1YmxpYyBpbnQgcmVhZFJhd1ZhcmludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBieXRlIHRtcCA9IHJlYWRSYXdCeXRlKCk7CisgICAgaWYgKHRtcCA+PSAwKSB7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICBpbnQgcmVzdWx0ID0gdG1wICYgMHg3ZjsKKyAgICBpZiAoKHRtcCA9IHJlYWRSYXdCeXRlKCkpID49IDApIHsKKyAgICAgIHJlc3VsdCB8PSB0bXAgPDwgNzsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0IHw9ICh0bXAgJiAweDdmKSA8PCA3OworICAgICAgaWYgKCh0bXAgPSByZWFkUmF3Qnl0ZSgpKSA+PSAwKSB7CisgICAgICAgIHJlc3VsdCB8PSB0bXAgPDwgMTQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDE0OworICAgICAgICBpZiAoKHRtcCA9IHJlYWRSYXdCeXRlKCkpID49IDApIHsKKyAgICAgICAgICByZXN1bHQgfD0gdG1wIDw8IDIxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdCB8PSAodG1wICYgMHg3ZikgPDwgMjE7CisgICAgICAgICAgcmVzdWx0IHw9ICh0bXAgPSByZWFkUmF3Qnl0ZSgpKSA8PCAyODsKKyAgICAgICAgICBpZiAodG1wIDwgMCkgeworICAgICAgICAgICAgLy8gRGlzY2FyZCB1cHBlciAzMiBiaXRzLgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgICAgaWYgKHJlYWRSYXdCeXRlKCkgPj0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5tYWxmb3JtZWRWYXJpbnQoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBSZWFkcyBhIHZhcmludCBmcm9tIHRoZSBpbnB1dCBvbmUgYnl0ZSBhdCBhIHRpbWUsIHNvIHRoYXQgaXQgZG9lcyBub3QKKyAgICogcmVhZCBhbnkgYnl0ZXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdmFyaW50LiAgSWYgeW91IHNpbXBseSB3cmFwcGVkIHRoZQorICAgKiBzdHJlYW0gaW4gYSBDb2RlZElucHV0U3RyZWFtIGFuZCB1c2VkIHtAbGluayAjcmVhZFJhd1ZhcmludDMyKElucHV0U3RyZWFtKX0KKyAgICogdGhlbiB5b3Ugd291bGQgcHJvYmFibHkgZW5kIHVwIHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSB2YXJpbnQgc2luY2UKKyAgICogQ29kZWRJbnB1dFN0cmVhbSBidWZmZXJzIGl0cyBpbnB1dC4KKyAgICovCisgIHN0YXRpYyBpbnQgcmVhZFJhd1ZhcmludDMyKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIGludCBmaXJzdEJ5dGUgPSBpbnB1dC5yZWFkKCk7CisgICAgaWYgKGZpcnN0Qnl0ZSA9PSAtMSkgeworICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRSYXdWYXJpbnQzMihmaXJzdEJ5dGUsIGlucHV0KTsKKyAgfQorCisgIC8qKgorICAgKiBMaWtlIHtAbGluayAjcmVhZFJhd1ZhcmludDMyKElucHV0U3RyZWFtKX0sIGJ1dCBleHBlY3RzIHRoYXQgdGhlIGNhbGxlcgorICAgKiBoYXMgYWxyZWFkeSByZWFkIG9uZSBieXRlLiAgVGhpcyBhbGxvd3MgdGhlIGNhbGxlciB0byBkZXRlcm1pbmUgaWYgRU9GCisgICAqIGhhcyBiZWVuIHJlYWNoZWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVhZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IHJlYWRSYXdWYXJpbnQzMigKKyAgICAgIGZpbmFsIGludCBmaXJzdEJ5dGUsIGZpbmFsIElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmICgoZmlyc3RCeXRlICYgMHg4MCkgPT0gMCkgeworICAgICAgcmV0dXJuIGZpcnN0Qnl0ZTsKKyAgICB9CisKKyAgICBpbnQgcmVzdWx0ID0gZmlyc3RCeXRlICYgMHg3ZjsKKyAgICBpbnQgb2Zmc2V0ID0gNzsKKyAgICBmb3IgKDsgb2Zmc2V0IDwgMzI7IG9mZnNldCArPSA3KSB7CisgICAgICBmaW5hbCBpbnQgYiA9IGlucHV0LnJlYWQoKTsKKyAgICAgIGlmIChiID09IC0xKSB7CisgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi50cnVuY2F0ZWRNZXNzYWdlKCk7CisgICAgICB9CisgICAgICByZXN1bHQgfD0gKGIgJiAweDdmKSA8PCBvZmZzZXQ7CisgICAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgfQorICAgIC8vIEtlZXAgcmVhZGluZyB1cCB0byA2NCBiaXRzLgorICAgIGZvciAoOyBvZmZzZXQgPCA2NDsgb2Zmc2V0ICs9IDcpIHsKKyAgICAgIGZpbmFsIGludCBiID0gaW5wdXQucmVhZCgpOworICAgICAgaWYgKGIgPT0gLTEpIHsKKyAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKKyAgICAgIH0KKyAgICAgIGlmICgoYiAmIDB4ODApID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm1hbGZvcm1lZFZhcmludCgpOworICB9CisKKyAgLyoqIFJlYWQgYSByYXcgVmFyaW50IGZyb20gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIGxvbmcgcmVhZFJhd1ZhcmludDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpbnQgc2hpZnQgPSAwOworICAgIGxvbmcgcmVzdWx0ID0gMDsKKyAgICB3aGlsZSAoc2hpZnQgPCA2NCkgeworICAgICAgZmluYWwgYnl0ZSBiID0gcmVhZFJhd0J5dGUoKTsKKyAgICAgIHJlc3VsdCB8PSAobG9uZykoYiAmIDB4N0YpIDw8IHNoaWZ0OworICAgICAgaWYgKChiICYgMHg4MCkgPT0gMCkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgICAgc2hpZnQgKz0gNzsKKyAgICB9CisgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm1hbGZvcm1lZFZhcmludCgpOworICB9CisKKyAgLyoqIFJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyIGZyb20gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIGludCByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIGJ5dGUgYjEgPSByZWFkUmF3Qnl0ZSgpOworICAgIGZpbmFsIGJ5dGUgYjIgPSByZWFkUmF3Qnl0ZSgpOworICAgIGZpbmFsIGJ5dGUgYjMgPSByZWFkUmF3Qnl0ZSgpOworICAgIGZpbmFsIGJ5dGUgYjQgPSByZWFkUmF3Qnl0ZSgpOworICAgIHJldHVybiAoKChpbnQpYjEgJiAweGZmKSAgICAgICkgfAorICAgICAgICAgICAoKChpbnQpYjIgJiAweGZmKSA8PCAgOCkgfAorICAgICAgICAgICAoKChpbnQpYjMgJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAoKChpbnQpYjQgJiAweGZmKSA8PCAyNCk7CisgIH0KKworICAvKiogUmVhZCBhIDY0LWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIgZnJvbSB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgbG9uZyByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIGJ5dGUgYjEgPSByZWFkUmF3Qnl0ZSgpOworICAgIGZpbmFsIGJ5dGUgYjIgPSByZWFkUmF3Qnl0ZSgpOworICAgIGZpbmFsIGJ5dGUgYjMgPSByZWFkUmF3Qnl0ZSgpOworICAgIGZpbmFsIGJ5dGUgYjQgPSByZWFkUmF3Qnl0ZSgpOworICAgIGZpbmFsIGJ5dGUgYjUgPSByZWFkUmF3Qnl0ZSgpOworICAgIGZpbmFsIGJ5dGUgYjYgPSByZWFkUmF3Qnl0ZSgpOworICAgIGZpbmFsIGJ5dGUgYjcgPSByZWFkUmF3Qnl0ZSgpOworICAgIGZpbmFsIGJ5dGUgYjggPSByZWFkUmF3Qnl0ZSgpOworICAgIHJldHVybiAoKChsb25nKWIxICYgMHhmZikgICAgICApIHwKKyAgICAgICAgICAgKCgobG9uZyliMiAmIDB4ZmYpIDw8ICA4KSB8CisgICAgICAgICAgICgoKGxvbmcpYjMgJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAoKChsb25nKWI0ICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICAgICAgKCgobG9uZyliNSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgICAgICAgICgoKGxvbmcpYjYgJiAweGZmKSA8PCA0MCkgfAorICAgICAgICAgICAoKChsb25nKWI3ICYgMHhmZikgPDwgNDgpIHwKKyAgICAgICAgICAgKCgobG9uZyliOCAmIDB4ZmYpIDw8IDU2KTsKKyAgfQorCisgIC8qKgorICAgKiBEZWNvZGUgYSBaaWdaYWctZW5jb2RlZCAzMi1iaXQgdmFsdWUuICBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMKKyAgICogaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkgZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsCisgICAqIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwKKyAgICogdGh1cyBhbHdheXMgdGFraW5nIDEwIGJ5dGVzIG9uIHRoZSB3aXJlLikKKyAgICoKKyAgICogQHBhcmFtIG4gQW4gdW5zaWduZWQgMzItYml0IGludGVnZXIsIHN0b3JlZCBpbiBhIHNpZ25lZCBpbnQgYmVjYXVzZQorICAgKiAgICAgICAgICBKYXZhIGhhcyBubyBleHBsaWNpdCB1bnNpZ25lZCBzdXBwb3J0LgorICAgKiBAcmV0dXJuIEEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgZGVjb2RlWmlnWmFnMzIoZmluYWwgaW50IG4pIHsKKyAgICByZXR1cm4gKG4gPj4+IDEpIF4gLShuICYgMSk7CisgIH0KKworICAvKioKKyAgICogRGVjb2RlIGEgWmlnWmFnLWVuY29kZWQgNjQtYml0IHZhbHVlLiAgWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzCisgICAqIGludG8gdmFsdWVzIHRoYXQgY2FuIGJlIGVmZmljaWVudGx5IGVuY29kZWQgd2l0aCB2YXJpbnQuICAoT3RoZXJ3aXNlLAorICAgKiBuZWdhdGl2ZSB2YWx1ZXMgbXVzdCBiZSBzaWduLWV4dGVuZGVkIHRvIDY0IGJpdHMgdG8gYmUgdmFyaW50IGVuY29kZWQsCisgICAqIHRodXMgYWx3YXlzIHRha2luZyAxMCBieXRlcyBvbiB0aGUgd2lyZS4pCisgICAqCisgICAqIEBwYXJhbSBuIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLCBzdG9yZWQgaW4gYSBzaWduZWQgaW50IGJlY2F1c2UKKyAgICogICAgICAgICAgSmF2YSBoYXMgbm8gZXhwbGljaXQgdW5zaWduZWQgc3VwcG9ydC4KKyAgICogQHJldHVybiBBIHNpZ25lZCA2NC1iaXQgaW50ZWdlci4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgbG9uZyBkZWNvZGVaaWdaYWc2NChmaW5hbCBsb25nIG4pIHsKKyAgICByZXR1cm4gKG4gPj4+IDEpIF4gLShuICYgMSk7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGJ1ZmZlcjsKKyAgcHJpdmF0ZSBpbnQgYnVmZmVyU2l6ZTsKKyAgcHJpdmF0ZSBpbnQgYnVmZmVyU2l6ZUFmdGVyTGltaXQ7CisgIHByaXZhdGUgaW50IGJ1ZmZlclBvczsKKyAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dDsKKyAgcHJpdmF0ZSBpbnQgbGFzdFRhZzsKKworICAvKioKKyAgICogVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIGJlZm9yZSB0aGUgY3VycmVudCBidWZmZXIuICBUaGUgdG90YWwKKyAgICogYnl0ZXMgcmVhZCB1cCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBjYW4gYmUgY29tcHV0ZWQgYXMKKyAgICoge0Bjb2RlIHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zfS4gIFRoaXMgdmFsdWUgbWF5IGJlIG5lZ2F0aXZlIGlmCisgICAqIHJlYWRpbmcgc3RhcnRlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciAoZS5nLiBpZiB0aGUKKyAgICogY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIGJ5dGUgYXJyYXkgYW5kIGFuIG9mZnNldCB3YXMgdXNlZCkuCisgICAqLworICBwcml2YXRlIGludCB0b3RhbEJ5dGVzUmV0aXJlZDsKKworICAvKiogVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbWVzc2FnZS4gKi8KKyAgcHJpdmF0ZSBpbnQgY3VycmVudExpbWl0ID0gSW50ZWdlci5NQVhfVkFMVUU7CisKKyAgLyoqIFNlZSBzZXRSZWN1cnNpb25MaW1pdCgpICovCisgIHByaXZhdGUgaW50IHJlY3Vyc2lvbkRlcHRoOworICBwcml2YXRlIGludCByZWN1cnNpb25MaW1pdCA9IERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUOworCisgIC8qKiBTZWUgc2V0U2l6ZUxpbWl0KCkgKi8KKyAgcHJpdmF0ZSBpbnQgc2l6ZUxpbWl0ID0gREVGQVVMVF9TSVpFX0xJTUlUOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1JFQ1VSU0lPTl9MSU1JVCA9IDY0OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TSVpFX0xJTUlUID0gNjQgPDwgMjA7ICAvLyA2NE1CCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDQwOTY7CisKKyAgcHJpdmF0ZSBDb2RlZElucHV0U3RyZWFtKGZpbmFsIGJ5dGVbXSBidWZmZXIsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pIHsKKyAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBidWZmZXJTaXplID0gb2ZmICsgbGVuOworICAgIGJ1ZmZlclBvcyA9IG9mZjsKKyAgICB0b3RhbEJ5dGVzUmV0aXJlZCA9IC1vZmY7CisgICAgaW5wdXQgPSBudWxsOworICB9CisKKyAgcHJpdmF0ZSBDb2RlZElucHV0U3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KSB7CisgICAgYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOworICAgIGJ1ZmZlclNpemUgPSAwOworICAgIGJ1ZmZlclBvcyA9IDA7CisgICAgdG90YWxCeXRlc1JldGlyZWQgPSAwOworICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIG1heGltdW0gbWVzc2FnZSByZWN1cnNpb24gZGVwdGguICBJbiBvcmRlciB0byBwcmV2ZW50IG1hbGljaW91cworICAgKiBtZXNzYWdlcyBmcm9tIGNhdXNpbmcgc3RhY2sgb3ZlcmZsb3dzLCB7QGNvZGUgQ29kZWRJbnB1dFN0cmVhbX0gbGltaXRzCisgICAqIGhvdyBkZWVwbHkgbWVzc2FnZXMgbWF5IGJlIG5lc3RlZC4gIFRoZSBkZWZhdWx0IGxpbWl0IGlzIDY0LgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBvbGQgbGltaXQuCisgICAqLworICBwdWJsaWMgaW50IHNldFJlY3Vyc2lvbkxpbWl0KGZpbmFsIGludCBsaW1pdCkgeworICAgIGlmIChsaW1pdCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICJSZWN1cnNpb24gbGltaXQgY2Fubm90IGJlIG5lZ2F0aXZlOiAiICsgbGltaXQpOworICAgIH0KKyAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSByZWN1cnNpb25MaW1pdDsKKyAgICByZWN1cnNpb25MaW1pdCA9IGxpbWl0OworICAgIHJldHVybiBvbGRMaW1pdDsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIG1heGltdW0gbWVzc2FnZSBzaXplLiAgSW4gb3JkZXIgdG8gcHJldmVudCBtYWxpY2lvdXMKKyAgICogbWVzc2FnZXMgZnJvbSBleGhhdXN0aW5nIG1lbW9yeSBvciBjYXVzaW5nIGludGVnZXIgb3ZlcmZsb3dzLAorICAgKiB7QGNvZGUgQ29kZWRJbnB1dFN0cmVhbX0gbGltaXRzIGhvdyBsYXJnZSBhIG1lc3NhZ2UgbWF5IGJlLgorICAgKiBUaGUgZGVmYXVsdCBsaW1pdCBpcyA2NE1CLiAgWW91IHNob3VsZCBzZXQgdGhpcyBsaW1pdCBhcyBzbWFsbAorICAgKiBhcyB5b3UgY2FuIHdpdGhvdXQgaGFybWluZyB5b3VyIGFwcCdzIGZ1bmN0aW9uYWxpdHkuICBOb3RlIHRoYXQKKyAgICogc2l6ZSBsaW1pdHMgb25seSBhcHBseSB3aGVuIHJlYWRpbmcgZnJvbSBhbiB7QGNvZGUgSW5wdXRTdHJlYW19LCBub3QKKyAgICogd2hlbiBjb25zdHJ1Y3RlZCBhcm91bmQgYSByYXcgYnl0ZSBhcnJheSAobm9yIHdpdGgKKyAgICoge0BsaW5rIEJ5dGVTdHJpbmcjbmV3Q29kZWRJbnB1dH0pLgorICAgKiA8cD4KKyAgICogSWYgeW91IHdhbnQgdG8gcmVhZCBzZXZlcmFsIG1lc3NhZ2VzIGZyb20gYSBzaW5nbGUgQ29kZWRJbnB1dFN0cmVhbSwgeW91CisgICAqIGNvdWxkIGNhbGwge0BsaW5rICNyZXNldFNpemVDb3VudGVyKCl9IGFmdGVyIGVhY2ggb25lIHRvIGF2b2lkIGhpdHRpbmcgdGhlCisgICAqIHNpemUgbGltaXQuCisgICAqCisgICAqIEByZXR1cm4gdGhlIG9sZCBsaW1pdC4KKyAgICovCisgIHB1YmxpYyBpbnQgc2V0U2l6ZUxpbWl0KGZpbmFsIGludCBsaW1pdCkgeworICAgIGlmIChsaW1pdCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICJTaXplIGxpbWl0IGNhbm5vdCBiZSBuZWdhdGl2ZTogIiArIGxpbWl0KTsKKyAgICB9CisgICAgZmluYWwgaW50IG9sZExpbWl0ID0gc2l6ZUxpbWl0OworICAgIHNpemVMaW1pdCA9IGxpbWl0OworICAgIHJldHVybiBvbGRMaW1pdDsKKyAgfQorCisgIC8qKgorICAgKiBSZXNldHMgdGhlIGN1cnJlbnQgc2l6ZSBjb3VudGVyIHRvIHplcm8gKHNlZSB7QGxpbmsgI3NldFNpemVMaW1pdChpbnQpfSkuCisgICAqLworICBwdWJsaWMgdm9pZCByZXNldFNpemVDb3VudGVyKCkgeworICAgIHRvdGFsQnl0ZXNSZXRpcmVkID0gLWJ1ZmZlclBvczsKKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHtAY29kZSBjdXJyZW50TGltaXR9IHRvIChjdXJyZW50IHBvc2l0aW9uKSArIHtAY29kZSBieXRlTGltaXR9LiAgVGhpcworICAgKiBpcyBjYWxsZWQgd2hlbiBkZXNjZW5kaW5nIGludG8gYSBsZW5ndGgtZGVsaW1pdGVkIGVtYmVkZGVkIG1lc3NhZ2UuCisgICAqCisgICAqIDxwPk5vdGUgdGhhdCB7QGNvZGUgcHVzaExpbWl0KCl9IGRvZXMgTk9UIGFmZmVjdCBob3cgbWFueSBieXRlcyB0aGUKKyAgICoge0Bjb2RlIENvZGVkSW5wdXRTdHJlYW19IHJlYWRzIGZyb20gYW4gdW5kZXJseWluZyB7QGNvZGUgSW5wdXRTdHJlYW19IHdoZW4KKyAgICogcmVmcmVzaGluZyBpdHMgYnVmZmVyLiAgSWYgeW91IG5lZWQgdG8gcHJldmVudCByZWFkaW5nIHBhc3QgYSBjZXJ0YWluCisgICAqIHBvaW50IGluIHRoZSB1bmRlcmx5aW5nIHtAY29kZSBJbnB1dFN0cmVhbX0gKGUuZy4gYmVjYXVzZSB5b3UgZXhwZWN0IGl0IHRvCisgICAqIGNvbnRhaW4gbW9yZSBkYXRhIGFmdGVyIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2Ugd2hpY2ggeW91IG5lZWQgdG8gaGFuZGxlCisgICAqIGRpZmZlcmVudGx5KSB0aGVuIHlvdSBtdXN0IHBsYWNlIGEgd3JhcHBlciBhcm91bmQgeW91IHtAY29kZSBJbnB1dFN0cmVhbX0KKyAgICogd2hpY2ggbGltaXRzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSByZWFkIGZyb20gaXQuCisgICAqCisgICAqIEByZXR1cm4gdGhlIG9sZCBsaW1pdC4KKyAgICovCisgIHB1YmxpYyBpbnQgcHVzaExpbWl0KGludCBieXRlTGltaXQpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgIGlmIChieXRlTGltaXQgPCAwKSB7CisgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ubmVnYXRpdmVTaXplKCk7CisgICAgfQorICAgIGJ5dGVMaW1pdCArPSB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvczsKKyAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSBjdXJyZW50TGltaXQ7CisgICAgaWYgKGJ5dGVMaW1pdCA+IG9sZExpbWl0KSB7CisgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOworICAgIH0KKyAgICBjdXJyZW50TGltaXQgPSBieXRlTGltaXQ7CisKKyAgICByZWNvbXB1dGVCdWZmZXJTaXplQWZ0ZXJMaW1pdCgpOworCisgICAgcmV0dXJuIG9sZExpbWl0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlY29tcHV0ZUJ1ZmZlclNpemVBZnRlckxpbWl0KCkgeworICAgIGJ1ZmZlclNpemUgKz0gYnVmZmVyU2l6ZUFmdGVyTGltaXQ7CisgICAgZmluYWwgaW50IGJ1ZmZlckVuZCA9IHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyU2l6ZTsKKyAgICBpZiAoYnVmZmVyRW5kID4gY3VycmVudExpbWl0KSB7CisgICAgICAvLyBMaW1pdCBpcyBpbiBjdXJyZW50IGJ1ZmZlci4KKyAgICAgIGJ1ZmZlclNpemVBZnRlckxpbWl0ID0gYnVmZmVyRW5kIC0gY3VycmVudExpbWl0OworICAgICAgYnVmZmVyU2l6ZSAtPSBidWZmZXJTaXplQWZ0ZXJMaW1pdDsKKyAgICB9IGVsc2UgeworICAgICAgYnVmZmVyU2l6ZUFmdGVyTGltaXQgPSAwOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBEaXNjYXJkcyB0aGUgY3VycmVudCBsaW1pdCwgcmV0dXJuaW5nIHRvIHRoZSBwcmV2aW91cyBsaW1pdC4KKyAgICoKKyAgICogQHBhcmFtIG9sZExpbWl0IFRoZSBvbGQgbGltaXQsIGFzIHJldHVybmVkIGJ5IHtAY29kZSBwdXNoTGltaXR9LgorICAgKi8KKyAgcHVibGljIHZvaWQgcG9wTGltaXQoZmluYWwgaW50IG9sZExpbWl0KSB7CisgICAgY3VycmVudExpbWl0ID0gb2xkTGltaXQ7CisgICAgcmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBiZWZvcmUgdGhlIGN1cnJlbnQgbGltaXQuCisgICAqIElmIG5vIGxpbWl0IGlzIHNldCwgcmV0dXJucyAtMS4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgeworICAgIGlmIChjdXJyZW50TGltaXQgPT0gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmaW5hbCBpbnQgY3VycmVudEFic29sdXRlUG9zaXRpb24gPSB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvczsKKyAgICByZXR1cm4gY3VycmVudExpbWl0IC0gY3VycmVudEFic29sdXRlUG9zaXRpb247CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZQorICAgKiBjYXNlIGlmIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB1bmRlcmx5aW5nIGlucHV0IHNvdXJjZSBoYXMgYmVlbiByZWFjaGVkIG9yCisgICAqIGlmIHRoZSBzdHJlYW0gaGFzIHJlYWNoZWQgYSBsaW1pdCBjcmVhdGVkIHVzaW5nIHtAbGluayAjcHVzaExpbWl0KGludCl9LgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNBdEVuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGJ1ZmZlclBvcyA9PSBidWZmZXJTaXplICYmICFyZWZpbGxCdWZmZXIoZmFsc2UpOworICB9CisKKyAgLyoqCisgICAqIFRoZSB0b3RhbCBieXRlcyByZWFkIHVwIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBDYWxsaW5nCisgICAqIHtAbGluayAjcmVzZXRTaXplQ291bnRlcigpfSByZXNldHMgdGhpcyB2YWx1ZSB0byB6ZXJvLgorICAgKi8KKyAgcHVibGljIGludCBnZXRUb3RhbEJ5dGVzUmVhZCgpIHsKKyAgICAgIHJldHVybiB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvczsKKyAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgd2l0aCB7QGNvZGUgdGhpcy5idWZmZXJ9IGlzIGVtcHR5IHRvIHJlYWQgbW9yZSBieXRlcyBmcm9tIHRoZQorICAgKiBpbnB1dC4gIElmIHtAY29kZSBtdXN0U3VjY2VlZH0gaXMgdHJ1ZSwgcmVmaWxsQnVmZmVyKCkgZ3VyYW50ZWVzIHRoYXQKKyAgICogZWl0aGVyIHRoZXJlIHdpbGwgYmUgYXQgbGVhc3Qgb25lIGJ5dGUgaW4gdGhlIGJ1ZmZlciB3aGVuIGl0IHJldHVybnMKKyAgICogb3IgaXQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uICBJZiB7QGNvZGUgbXVzdFN1Y2NlZWR9IGlzIGZhbHNlLAorICAgKiByZWZpbGxCdWZmZXIoKSByZXR1cm5zIGZhbHNlIGlmIG5vIG1vcmUgYnl0ZXMgd2VyZSBhdmFpbGFibGUuCisgICAqLworICBwcml2YXRlIGJvb2xlYW4gcmVmaWxsQnVmZmVyKGZpbmFsIGJvb2xlYW4gbXVzdFN1Y2NlZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGJ1ZmZlclBvcyA8IGJ1ZmZlclNpemUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICJyZWZpbGxCdWZmZXIoKSBjYWxsZWQgd2hlbiBidWZmZXIgd2Fzbid0IGVtcHR5LiIpOworICAgIH0KKworICAgIGlmICh0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclNpemUgPT0gY3VycmVudExpbWl0KSB7CisgICAgICAvLyBPb3BzLCB3ZSBoaXQgYSBsaW1pdC4KKyAgICAgIGlmIChtdXN0U3VjY2VlZCkgeworICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHRvdGFsQnl0ZXNSZXRpcmVkICs9IGJ1ZmZlclNpemU7CisKKyAgICBidWZmZXJQb3MgPSAwOworICAgIGJ1ZmZlclNpemUgPSAoaW5wdXQgPT0gbnVsbCkgPyAtMSA6IGlucHV0LnJlYWQoYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyU2l6ZSA9PSAwIHx8IGJ1ZmZlclNpemUgPCAtMSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAiSW5wdXRTdHJlYW0jcmVhZChieXRlW10pIHJldHVybmVkIGludmFsaWQgcmVzdWx0OiAiICsgYnVmZmVyU2l6ZSArCisgICAgICAgICAgIlxuVGhlIElucHV0U3RyZWFtIGltcGxlbWVudGF0aW9uIGlzIGJ1Z2d5LiIpOworICAgIH0KKyAgICBpZiAoYnVmZmVyU2l6ZSA9PSAtMSkgeworICAgICAgYnVmZmVyU2l6ZSA9IDA7CisgICAgICBpZiAobXVzdFN1Y2NlZWQpIHsKKyAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKTsKKyAgICAgIGZpbmFsIGludCB0b3RhbEJ5dGVzUmVhZCA9CisgICAgICAgIHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyU2l6ZSArIGJ1ZmZlclNpemVBZnRlckxpbWl0OworICAgICAgaWYgKHRvdGFsQnl0ZXNSZWFkID4gc2l6ZUxpbWl0IHx8IHRvdGFsQnl0ZXNSZWFkIDwgMCkgeworICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uc2l6ZUxpbWl0RXhjZWVkZWQoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZWFkIG9uZSBieXRlIGZyb20gdGhlIGlucHV0LgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBUaGUgZW5kIG9mIHRoZSBzdHJlYW0gb3IgdGhlIGN1cnJlbnQKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgd2FzIHJlYWNoZWQuCisgICAqLworICBwdWJsaWMgYnl0ZSByZWFkUmF3Qnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGJ1ZmZlclBvcyA9PSBidWZmZXJTaXplKSB7CisgICAgICByZWZpbGxCdWZmZXIodHJ1ZSk7CisgICAgfQorICAgIHJldHVybiBidWZmZXJbYnVmZmVyUG9zKytdOworICB9CisKKyAgLyoqCisgICAqIFJlYWQgYSBmaXhlZCBzaXplIG9mIGJ5dGVzIGZyb20gdGhlIGlucHV0LgorICAgKgorICAgKiBAdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBUaGUgZW5kIG9mIHRoZSBzdHJlYW0gb3IgdGhlIGN1cnJlbnQKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgd2FzIHJlYWNoZWQuCisgICAqLworICBwdWJsaWMgYnl0ZVtdIHJlYWRSYXdCeXRlcyhmaW5hbCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5uZWdhdGl2ZVNpemUoKTsKKyAgICB9CisKKyAgICBpZiAodG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJQb3MgKyBzaXplID4gY3VycmVudExpbWl0KSB7CisgICAgICAvLyBSZWFkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBhbnl3YXkuCisgICAgICBza2lwUmF3Qnl0ZXMoY3VycmVudExpbWl0IC0gdG90YWxCeXRlc1JldGlyZWQgLSBidWZmZXJQb3MpOworICAgICAgLy8gVGhlbiBmYWlsLgorICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8PSBidWZmZXJTaXplIC0gYnVmZmVyUG9zKSB7CisgICAgICAvLyBXZSBoYXZlIGFsbCB0aGUgYnl0ZXMgd2UgbmVlZCBhbHJlYWR5LgorICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmZmVyUG9zLCBieXRlcywgMCwgc2l6ZSk7CisgICAgICBidWZmZXJQb3MgKz0gc2l6ZTsKKyAgICAgIHJldHVybiBieXRlczsKKyAgICB9IGVsc2UgaWYgKHNpemUgPCBCVUZGRVJfU0laRSkgeworICAgICAgLy8gUmVhZGluZyBtb3JlIGJ5dGVzIHRoYW4gYXJlIGluIHRoZSBidWZmZXIsIGJ1dCBub3QgYW4gZXhjZXNzaXZlIG51bWJlcgorICAgICAgLy8gb2YgYnl0ZXMuICBXZSBjYW4gc2FmZWx5IGFsbG9jYXRlIHRoZSByZXN1bHRpbmcgYXJyYXkgYWhlYWQgb2YgdGltZS4KKworICAgICAgLy8gRmlyc3QgY29weSB3aGF0IHdlIGhhdmUuCisgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgIGludCBwb3MgPSBidWZmZXJTaXplIC0gYnVmZmVyUG9zOworICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZmZlclBvcywgYnl0ZXMsIDAsIHBvcyk7CisgICAgICBidWZmZXJQb3MgPSBidWZmZXJTaXplOworCisgICAgICAvLyBXZSB3YW50IHRvIHVzZSByZWZpbGxCdWZmZXIoKSBhbmQgdGhlbiBjb3B5IGZyb20gdGhlIGJ1ZmZlciBpbnRvIG91cgorICAgICAgLy8gYnl0ZSBhcnJheSByYXRoZXIgdGhhbiByZWFkaW5nIGRpcmVjdGx5IGludG8gb3VyIGJ5dGUgYXJyYXkgYmVjYXVzZQorICAgICAgLy8gdGhlIGlucHV0IG1heSBiZSB1bmJ1ZmZlcmVkLgorICAgICAgcmVmaWxsQnVmZmVyKHRydWUpOworCisgICAgICB3aGlsZSAoc2l6ZSAtIHBvcyA+IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIGJ5dGVzLCBwb3MsIGJ1ZmZlclNpemUpOworICAgICAgICBwb3MgKz0gYnVmZmVyU2l6ZTsKKyAgICAgICAgYnVmZmVyUG9zID0gYnVmZmVyU2l6ZTsKKyAgICAgICAgcmVmaWxsQnVmZmVyKHRydWUpOworICAgICAgfQorCisgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgYnl0ZXMsIHBvcywgc2l6ZSAtIHBvcyk7CisgICAgICBidWZmZXJQb3MgPSBzaXplIC0gcG9zOworCisgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZSBzaXplIGlzIHZlcnkgbGFyZ2UuICBGb3Igc2VjdXJpdHkgcmVhc29ucywgd2UgY2FuJ3QgYWxsb2NhdGUgdGhlCisgICAgICAvLyBlbnRpcmUgYnl0ZSBhcnJheSB5ZXQuICBUaGUgc2l6ZSBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBpbnB1dCwgc28gYQorICAgICAgLy8gbWFsaWNpb3VzbHktY3JhZnRlZCBtZXNzYWdlIGNvdWxkIHByb3ZpZGUgYSBib2d1cyB2ZXJ5IGxhcmdlIHNpemUgaW4KKyAgICAgIC8vIG9yZGVyIHRvIHRyaWNrIHRoZSBhcHAgaW50byBhbGxvY2F0aW5nIGEgbG90IG9mIG1lbW9yeS4gIFdlIGF2b2lkIHRoaXMKKyAgICAgIC8vIGJ5IGFsbG9jYXRpbmcgYW5kIHJlYWRpbmcgb25seSBhIHNtYWxsIGNodW5rIGF0IGEgdGltZSwgc28gdGhhdCB0aGUKKyAgICAgIC8vIG1hbGljaW91cyBtZXNzYWdlIG11c3QgYWN0dWFsbHkgKmJlKiBleHRyZW1lbHkgbGFyZ2UgdG8gY2F1c2UKKyAgICAgIC8vIHByb2JsZW1zLiAgTWVhbndoaWxlLCB3ZSBsaW1pdCB0aGUgYWxsb3dlZCBzaXplIG9mIGEgbWVzc2FnZSBlbHNld2hlcmUuCisKKyAgICAgIC8vIFJlbWVtYmVyIHRoZSBidWZmZXIgbWFya2VycyBzaW5jZSB3ZSdsbCBoYXZlIHRvIGNvcHkgdGhlIGJ5dGVzIG91dCBvZgorICAgICAgLy8gaXQgbGF0ZXIuCisgICAgICBmaW5hbCBpbnQgb3JpZ2luYWxCdWZmZXJQb3MgPSBidWZmZXJQb3M7CisgICAgICBmaW5hbCBpbnQgb3JpZ2luYWxCdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKKworICAgICAgLy8gTWFyayB0aGUgY3VycmVudCBidWZmZXIgY29uc3VtZWQuCisgICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBidWZmZXJTaXplOworICAgICAgYnVmZmVyUG9zID0gMDsKKyAgICAgIGJ1ZmZlclNpemUgPSAwOworCisgICAgICAvLyBSZWFkIGFsbCB0aGUgcmVzdCBvZiB0aGUgYnl0ZXMgd2UgbmVlZC4KKyAgICAgIGludCBzaXplTGVmdCA9IHNpemUgLSAob3JpZ2luYWxCdWZmZXJTaXplIC0gb3JpZ2luYWxCdWZmZXJQb3MpOworICAgICAgZmluYWwgTGlzdDxieXRlW10+IGNodW5rcyA9IG5ldyBBcnJheUxpc3Q8Ynl0ZVtdPigpOworCisgICAgICB3aGlsZSAoc2l6ZUxlZnQgPiAwKSB7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBjaHVuayA9IG5ldyBieXRlW01hdGgubWluKHNpemVMZWZ0LCBCVUZGRVJfU0laRSldOworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKHBvcyA8IGNodW5rLmxlbmd0aCkgeworICAgICAgICAgIGZpbmFsIGludCBuID0gKGlucHV0ID09IG51bGwpID8gLTEgOgorICAgICAgICAgICAgaW5wdXQucmVhZChjaHVuaywgcG9zLCBjaHVuay5sZW5ndGggLSBwb3MpOworICAgICAgICAgIGlmIChuID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBuOworICAgICAgICAgIHBvcyArPSBuOworICAgICAgICB9CisgICAgICAgIHNpemVMZWZ0IC09IGNodW5rLmxlbmd0aDsKKyAgICAgICAgY2h1bmtzLmFkZChjaHVuayk7CisgICAgICB9CisKKyAgICAgIC8vIE9LLCBnb3QgZXZlcnl0aGluZy4gIE5vdyBjb25jYXRlbmF0ZSBpdCBhbGwgaW50byBvbmUgYnVmZmVyLgorICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07CisKKyAgICAgIC8vIFN0YXJ0IGJ5IGNvcHlpbmcgdGhlIGxlZnRvdmVyIGJ5dGVzIGZyb20gdGhpcy5idWZmZXIuCisgICAgICBpbnQgcG9zID0gb3JpZ2luYWxCdWZmZXJTaXplIC0gb3JpZ2luYWxCdWZmZXJQb3M7CisgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgb3JpZ2luYWxCdWZmZXJQb3MsIGJ5dGVzLCAwLCBwb3MpOworCisgICAgICAvLyBBbmQgbm93IGFsbCB0aGUgY2h1bmtzLgorICAgICAgZm9yIChmaW5hbCBieXRlW10gY2h1bmsgOiBjaHVua3MpIHsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjaHVuaywgMCwgYnl0ZXMsIHBvcywgY2h1bmsubGVuZ3RoKTsKKyAgICAgICAgcG9zICs9IGNodW5rLmxlbmd0aDsKKyAgICAgIH0KKworICAgICAgLy8gRG9uZS4KKyAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVhZHMgYW5kIGRpc2NhcmRzIHtAY29kZSBzaXplfSBieXRlcy4KKyAgICoKKyAgICogQHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gVGhlIGVuZCBvZiB0aGUgc3RyZWFtIG9yIHRoZSBjdXJyZW50CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHdhcyByZWFjaGVkLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2tpcFJhd0J5dGVzKGZpbmFsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm5lZ2F0aXZlU2l6ZSgpOworICAgIH0KKworICAgIGlmICh0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvcyArIHNpemUgPiBjdXJyZW50TGltaXQpIHsKKyAgICAgIC8vIFJlYWQgdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGFueXdheS4KKyAgICAgIHNraXBSYXdCeXRlcyhjdXJyZW50TGltaXQgLSB0b3RhbEJ5dGVzUmV0aXJlZCAtIGJ1ZmZlclBvcyk7CisgICAgICAvLyBUaGVuIGZhaWwuCisgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOworICAgIH0KKworICAgIGlmIChzaXplIDw9IGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpIHsKKyAgICAgIC8vIFdlIGhhdmUgYWxsIHRoZSBieXRlcyB3ZSBuZWVkIGFscmVhZHkuCisgICAgICBidWZmZXJQb3MgKz0gc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU2tpcHBpbmcgbW9yZSBieXRlcyB0aGFuIGFyZSBpbiB0aGUgYnVmZmVyLiAgRmlyc3Qgc2tpcCB3aGF0IHdlIGhhdmUuCisgICAgICBpbnQgcG9zID0gYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvczsKKyAgICAgIGJ1ZmZlclBvcyA9IGJ1ZmZlclNpemU7CisKKyAgICAgIC8vIEtlZXAgcmVmaWxsaW5nIHRoZSBidWZmZXIgdW50aWwgd2UgZ2V0IHRvIHRoZSBwb2ludCB3ZSB3YW50ZWQgdG8gc2tpcAorICAgICAgLy8gdG8uICBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgZW5zdXJpbmcgdGhlIGxpbWl0cyBhcmUgdXBkYXRlZAorICAgICAgLy8gY29ycmVjdGx5LgorICAgICAgcmVmaWxsQnVmZmVyKHRydWUpOworICAgICAgd2hpbGUgKHNpemUgLSBwb3MgPiBidWZmZXJTaXplKSB7CisgICAgICAgIHBvcyArPSBidWZmZXJTaXplOworICAgICAgICBidWZmZXJQb3MgPSBidWZmZXJTaXplOworICAgICAgICByZWZpbGxCdWZmZXIodHJ1ZSk7CisgICAgICB9CisKKyAgICAgIGJ1ZmZlclBvcyA9IHNpemUgLSBwb3M7IAorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzVmMmQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMDgxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCisvKioKKyAqIEVuY29kZXMgYW5kIHdyaXRlcyBwcm90b2NvbCBtZXNzYWdlIGZpZWxkcy4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGNvbnRhaW5zIHR3byBraW5kcyBvZiBtZXRob2RzOiAgbWV0aG9kcyB0aGF0IHdyaXRlIHNwZWNpZmljCisgKiBwcm90b2NvbCBtZXNzYWdlIGNvbnN0cnVjdHMgYW5kIGZpZWxkIHR5cGVzIChlLmcuIHtAbGluayAjd3JpdGVUYWd9IGFuZAorICoge0BsaW5rICN3cml0ZUludDMyfSkgYW5kIG1ldGhvZHMgdGhhdCB3cml0ZSBsb3ctbGV2ZWwgdmFsdWVzIChlLmcuCisgKiB7QGxpbmsgI3dyaXRlUmF3VmFyaW50MzJ9IGFuZCB7QGxpbmsgI3dyaXRlUmF3Qnl0ZXN9KS4gIElmIHlvdSBhcmUKKyAqIHdyaXRpbmcgZW5jb2RlZCBwcm90b2NvbCBtZXNzYWdlcywgeW91IHNob3VsZCB1c2UgdGhlIGZvcm1lciBtZXRob2RzLCBidXQgaWYKKyAqIHlvdSBhcmUgd3JpdGluZyBzb21lIG90aGVyIGZvcm1hdCBvZiB5b3VyIG93biBkZXNpZ24sIHVzZSB0aGUgbGF0dGVyLgorICoKKyAqIDxwPlRoaXMgY2xhc3MgaXMgdG90YWxseSB1bnN5bmNocm9uaXplZC4KKyAqCisgKiBAYXV0aG9yIGtuZXRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW0geworICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWZmZXI7CisgIHByaXZhdGUgZmluYWwgaW50IGxpbWl0OworICBwcml2YXRlIGludCBwb3NpdGlvbjsKKworICBwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXQ7CisKKyAgLyoqCisgICAqIFRoZSBidWZmZXIgc2l6ZSB1c2VkIGluIHtAbGluayAjbmV3SW5zdGFuY2UoT3V0cHV0U3RyZWFtKX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNDA5NjsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgYnVmZmVyIHNpemUgdG8gZWZmaWNpZW50bHkgd3JpdGUgZGF0YUxlbmd0aCBieXRlcyB0byB0aGlzCisgICAqIENvZGVkT3V0cHV0U3RyZWFtLiBVc2VkIGJ5IEFic3RyYWN0TWVzc2FnZUxpdGUuCisgICAqCisgICAqIEByZXR1cm4gdGhlIGJ1ZmZlciBzaXplIHRvIGVmZmljaWVudGx5IHdyaXRlIGRhdGFMZW5ndGggYnl0ZXMgdG8gdGhpcworICAgKiAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLgorICAgKi8KKyAgc3RhdGljIGludCBjb21wdXRlUHJlZmVycmVkQnVmZmVyU2l6ZShpbnQgZGF0YUxlbmd0aCkgeworICAgIGlmIChkYXRhTGVuZ3RoID4gREVGQVVMVF9CVUZGRVJfU0laRSkgcmV0dXJuIERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgcmV0dXJuIGRhdGFMZW5ndGg7CisgIH0KKworICBwcml2YXRlIENvZGVkT3V0cHV0U3RyZWFtKGZpbmFsIGJ5dGVbXSBidWZmZXIsIGZpbmFsIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCkgeworICAgIG91dHB1dCA9IG51bGw7CisgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CisgICAgcG9zaXRpb24gPSBvZmZzZXQ7CisgICAgbGltaXQgPSBvZmZzZXQgKyBsZW5ndGg7CisgIH0KKworICBwcml2YXRlIENvZGVkT3V0cHV0U3RyZWFtKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXQsIGZpbmFsIGJ5dGVbXSBidWZmZXIpIHsKKyAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKKyAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBwb3NpdGlvbiA9IDA7CisgICAgbGltaXQgPSBidWZmZXIubGVuZ3RoOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgQ29kZWRPdXRwdXRTdHJlYW19IHdyYXBwaW5nIHRoZSBnaXZlbgorICAgKiB7QGNvZGUgT3V0cHV0U3RyZWFtfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQ29kZWRPdXRwdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dCkgeworICAgIHJldHVybiBuZXdJbnN0YW5jZShvdXRwdXQsIERFRkFVTFRfQlVGRkVSX1NJWkUpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgQ29kZWRPdXRwdXRTdHJlYW19IHdyYXBwaW5nIHRoZSBnaXZlbgorICAgKiB7QGNvZGUgT3V0cHV0U3RyZWFtfSB3aXRoIGEgZ2l2ZW4gYnVmZmVyIHNpemUuCisgICAqLworICBwdWJsaWMgc3RhdGljIENvZGVkT3V0cHV0U3RyZWFtIG5ld0luc3RhbmNlKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXQsCisgICAgICBmaW5hbCBpbnQgYnVmZmVyU2l6ZSkgeworICAgIHJldHVybiBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ob3V0cHV0LCBuZXcgYnl0ZVtidWZmZXJTaXplXSk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IHtAY29kZSBDb2RlZE91dHB1dFN0cmVhbX0gdGhhdCB3cml0ZXMgZGlyZWN0bHkgdG8gdGhlIGdpdmVuCisgICAqIGJ5dGUgYXJyYXkuICBJZiBtb3JlIGJ5dGVzIGFyZSB3cml0dGVuIHRoYW4gZml0IGluIHRoZSBhcnJheSwKKyAgICoge0BsaW5rIE91dE9mU3BhY2VFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLiAgV3JpdGluZyBkaXJlY3RseSB0byBhIGZsYXQKKyAgICogYXJyYXkgaXMgZmFzdGVyIHRoYW4gd3JpdGluZyB0byBhbiB7QGNvZGUgT3V0cHV0U3RyZWFtfS4gIFNlZSBhbHNvCisgICAqIHtAbGluayBCeXRlU3RyaW5nI25ld0NvZGVkQnVpbGRlcn0uCisgICAqLworICBwdWJsaWMgc3RhdGljIENvZGVkT3V0cHV0U3RyZWFtIG5ld0luc3RhbmNlKGZpbmFsIGJ5dGVbXSBmbGF0QXJyYXkpIHsKKyAgICByZXR1cm4gbmV3SW5zdGFuY2UoZmxhdEFycmF5LCAwLCBmbGF0QXJyYXkubGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfSB0aGF0IHdyaXRlcyBkaXJlY3RseSB0byB0aGUgZ2l2ZW4KKyAgICogYnl0ZSBhcnJheSBzbGljZS4gIElmIG1vcmUgYnl0ZXMgYXJlIHdyaXR0ZW4gdGhhbiBmaXQgaW4gdGhlIHNsaWNlLAorICAgKiB7QGxpbmsgT3V0T2ZTcGFjZUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uICBXcml0aW5nIGRpcmVjdGx5IHRvIGEgZmxhdAorICAgKiBhcnJheSBpcyBmYXN0ZXIgdGhhbiB3cml0aW5nIHRvIGFuIHtAY29kZSBPdXRwdXRTdHJlYW19LiAgU2VlIGFsc28KKyAgICoge0BsaW5rIEJ5dGVTdHJpbmcjbmV3Q29kZWRCdWlsZGVyfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQ29kZWRPdXRwdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgYnl0ZVtdIGZsYXRBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGgpIHsKKyAgICByZXR1cm4gbmV3IENvZGVkT3V0cHV0U3RyZWFtKGZsYXRBcnJheSwgb2Zmc2V0LCBsZW5ndGgpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZG91YmxlfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBkb3VibGUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCk7CisgICAgd3JpdGVEb3VibGVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZmxvYXR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZUZsb2F0KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgZmxvYXQgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyKTsKKyAgICB3cml0ZUZsb2F0Tm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIHVpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlVUludDY0KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOworICAgIHdyaXRlVUludDY0Tm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlSW50NjQoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKKyAgICB3cml0ZUludDY0Tm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBpbnQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlSW50MzIoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOworICAgIHdyaXRlSW50MzJOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZml4ZWQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQpOworICAgIHdyaXRlRml4ZWQ2NE5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKiBXcml0ZSBhIHtAY29kZSBmaXhlZDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVGaXhlZDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyKTsKKyAgICB3cml0ZUZpeGVkMzJOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgYm9vbH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGJvb2xlYW4gdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7CisgICAgd3JpdGVCb29sTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIHN0cmluZ30gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICAgIHdyaXRlU3RyaW5nTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIGdyb3VwfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVHcm91cChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApOworICAgIHdyaXRlR3JvdXBOb1RhZyh2YWx1ZSk7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSBhIGdyb3VwIHJlcHJlc2VudGVkIGJ5IGFuIHtAbGluayBVbmtub3duRmllbGRTZXR9LgorICAgKgorICAgKiBAZGVwcmVjYXRlZCBVbmtub3duRmllbGRTZXQgbm93IGltcGxlbWVudHMgTWVzc2FnZUxpdGUsIHNvIHlvdSBjYW4ganVzdAorICAgKiAgICAgICAgICAgICBjYWxsIHtAbGluayAjd3JpdGVHcm91cH0uCisgICAqLworICBARGVwcmVjYXRlZAorICBwdWJsaWMgdm9pZCB3cml0ZVVua25vd25Hcm91cChmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlR3JvdXAoZmllbGROdW1iZXIsIHZhbHVlKTsKKyAgfQorCisgIC8qKiBXcml0ZSBhbiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2UoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisgICAgd3JpdGVNZXNzYWdlTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIGJ5dGVzfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKyAgICB3cml0ZUJ5dGVzTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIHVpbnQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlVUludDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7CisgICAgd3JpdGVVSW50MzJOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogV3JpdGUgYW4gZW51bSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gIENhbGxlciBpcyByZXNwb25zaWJsZQorICAgKiBmb3IgY29udmVydGluZyB0aGUgZW51bSB2YWx1ZSB0byBpdHMgbnVtZXJpYyB2YWx1ZS4KKyAgICovCisgIHB1YmxpYyB2b2lkIHdyaXRlRW51bShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKKyAgICB3cml0ZUVudW1Ob1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNmaXhlZDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVTRml4ZWQzMihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIpOworICAgIHdyaXRlU0ZpeGVkMzJOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNmaXhlZDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVTRml4ZWQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDY0KTsKKyAgICB3cml0ZVNGaXhlZDY0Tm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBzaW50MzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVNJbnQzMihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOworICAgIHdyaXRlU0ludDMyTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBzaW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVNJbnQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKKyAgICB3cml0ZVNJbnQ2NE5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBXcml0ZSBhIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uIGZpZWxkIHRvIHRoZSBzdHJlYW0uICBGb3IgaGlzdG9yaWNhbCByZWFzb25zLAorICAgKiB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VTZXRFeHRlbnNpb24oZmluYWwgaW50IGZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUCk7CisgICAgd3JpdGVVSW50MzIoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lELCBmaWVsZE51bWJlcik7CisgICAgd3JpdGVNZXNzYWdlKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfTUVTU0FHRSwgdmFsdWUpOworICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlIGFuIHVucGFyc2VkIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uIGZpZWxkIHRvIHRoZSBzdHJlYW0uICBGb3IKKyAgICogaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb24oZmluYWwgaW50IGZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVUYWcoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNLCBXaXJlRm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKTsKKyAgICB3cml0ZVVJbnQzMihXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX1RZUEVfSUQsIGZpZWxkTnVtYmVyKTsKKyAgICB3cml0ZUJ5dGVzKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfTUVTU0FHRSwgdmFsdWUpOworICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZG91YmxlfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZU5vVGFnKGZpbmFsIGRvdWJsZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd0xpdHRsZUVuZGlhbjY0KERvdWJsZS5kb3VibGVUb1Jhd0xvbmdCaXRzKHZhbHVlKSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZmxvYXR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlRmxvYXROb1RhZyhmaW5hbCBmbG9hdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKHZhbHVlKSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgdWludDY0fSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVVJbnQ2NE5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdWYXJpbnQ2NCh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYW4ge0Bjb2RlIGludDY0fSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZUludDY0Tm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd1ZhcmludDY0KHZhbHVlKTsKKyAgfQorCisgIC8qKiBXcml0ZSBhbiB7QGNvZGUgaW50MzJ9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlSW50MzJOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHZhbHVlID49IDApIHsKKyAgICAgIHdyaXRlUmF3VmFyaW50MzIodmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBNdXN0IHNpZ24tZXh0ZW5kLgorICAgICAgd3JpdGVSYXdWYXJpbnQ2NCh2YWx1ZSk7CisgICAgfQorICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIGZpeGVkNjR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQ2NE5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdMaXR0bGVFbmRpYW42NCh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZml4ZWQzMn0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVGaXhlZDMyTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlUmF3TGl0dGxlRW5kaWFuMzIodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIGJvb2x9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbE5vVGFnKGZpbmFsIGJvb2xlYW4gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdCeXRlKHZhbHVlID8gMSA6IDApOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIHN0cmluZ30gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmdOb1RhZyhmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gVW5mb3J0dW5hdGVseSB0aGVyZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW55IHdheSB0byB0ZWxsIEphdmEgdG8gZW5jb2RlCisgICAgLy8gVVRGLTggZGlyZWN0bHkgaW50byBvdXIgYnVmZmVyLCBzbyB3ZSBoYXZlIHRvIGxldCBpdCBjcmVhdGUgaXRzIG93biBieXRlCisgICAgLy8gYXJyYXkgYW5kIHRoZW4gY29weS4KKyAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSB2YWx1ZS5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICB3cml0ZVJhd1ZhcmludDMyKGJ5dGVzLmxlbmd0aCk7CisgICAgd3JpdGVSYXdCeXRlcyhieXRlcyk7CisgIH0KKworICAvKiogV3JpdGUgYSB7QGNvZGUgZ3JvdXB9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlR3JvdXBOb1RhZyhmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB2YWx1ZS53cml0ZVRvKHRoaXMpOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlIGEgZ3JvdXAgcmVwcmVzZW50ZWQgYnkgYW4ge0BsaW5rIFVua25vd25GaWVsZFNldH0uCisgICAqCisgICAqIEBkZXByZWNhdGVkIFVua25vd25GaWVsZFNldCBub3cgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZSwgc28geW91IGNhbiBqdXN0CisgICAqICAgICAgICAgICAgIGNhbGwge0BsaW5rICN3cml0ZUdyb3VwTm9UYWd9LgorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHZvaWQgd3JpdGVVbmtub3duR3JvdXBOb1RhZyhmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVHcm91cE5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKiBXcml0ZSBhbiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZU5vVGFnKGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlUmF3VmFyaW50MzIodmFsdWUuZ2V0U2VyaWFsaXplZFNpemUoKSk7CisgICAgdmFsdWUud3JpdGVUbyh0aGlzKTsKKyAgfQorCisgIC8qKiBXcml0ZSBhIHtAY29kZSBieXRlc30gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVCeXRlc05vVGFnKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdWYXJpbnQzMih2YWx1ZS5zaXplKCkpOworICAgIHdyaXRlUmF3Qnl0ZXModmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEge0Bjb2RlIHVpbnQzMn0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVVSW50MzJOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdWYXJpbnQzMih2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogV3JpdGUgYW4gZW51bSBmaWVsZCB0byB0aGUgc3RyZWFtLiAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlCisgICAqIGZvciBjb252ZXJ0aW5nIHRoZSBlbnVtIHZhbHVlIHRvIGl0cyBudW1lcmljIHZhbHVlLgorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGVFbnVtTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlSW50MzJOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNmaXhlZDMyfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVNGaXhlZDMyTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlUmF3TGl0dGxlRW5kaWFuMzIodmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBzZml4ZWQ2NH0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVTRml4ZWQ2NE5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdMaXR0bGVFbmRpYW42NCh2YWx1ZSk7CisgIH0KKworICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNpbnQzMn0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVTSW50MzJOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdWYXJpbnQzMihlbmNvZGVaaWdaYWczMih2YWx1ZSkpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIHtAY29kZSBzaW50NjR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlU0ludDY0Tm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd1ZhcmludDY0KGVuY29kZVppZ1phZzY0KHZhbHVlKSk7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGRvdWJsZX0gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRG91YmxlU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlRG91YmxlU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGZsb2F0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGbG9hdFNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBmbG9hdCB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlRmxvYXRTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgdWludDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVVSW50NjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlVUludDY0U2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCisgICAqIHtAY29kZSBpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlSW50NjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlSW50NjRTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICoge0Bjb2RlIGludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVJbnQzMlNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUludDMyU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGZpeGVkNjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZpeGVkNjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUZpeGVkNjRTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgZml4ZWQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRml4ZWQzMlNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVGaXhlZDMyU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGJvb2x9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUJvb2xTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUJvb2xTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgc3RyaW5nfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTdHJpbmdTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVTdHJpbmdTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgZ3JvdXB9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUdyb3VwU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICogMiArIGNvbXB1dGVHcm91cFNpemVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSBncm91cH0gZmllbGQgcmVwcmVzZW50ZWQgYnkgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0sIGluY2x1ZGluZworICAgKiB0YWcuCisgICAqCisgICAqIEBkZXByZWNhdGVkIFVua25vd25GaWVsZFNldCBub3cgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZSwgc28geW91IGNhbiBqdXN0CisgICAqICAgICAgICAgICAgIGNhbGwge0BsaW5rICNjb21wdXRlR3JvdXBTaXplfS4KKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVVbmtub3duR3JvdXBTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZUdyb3VwU2l6ZShmaWVsZE51bWJlciwgdmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICogZW1iZWRkZWQgbWVzc2FnZSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVNZXNzYWdlU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlTWVzc2FnZVNpemVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSBieXRlc30gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlQnl0ZXNTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVCeXRlc1NpemVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSB1aW50MzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVVJbnQzMlNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZVVJbnQzMlNpemVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgorICAgKiBlbnVtIGZpZWxkLCBpbmNsdWRpbmcgdGFnLiAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIHRoZQorICAgKiBlbnVtIHZhbHVlIHRvIGl0cyBudW1lcmljIHZhbHVlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUVudW1TaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVFbnVtU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCisgICAqIHtAY29kZSBzZml4ZWQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ZpeGVkMzJTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZVNGaXhlZDMyU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCisgICAqIHtAY29kZSBzZml4ZWQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ZpeGVkNjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVTRml4ZWQ2NFNpemVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgorICAgKiB7QGNvZGUgc2ludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTSW50MzJTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVTSW50MzJTaXplTm9UYWcodmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgICoge0Bjb2RlIHNpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ludDY0U2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZVNJbnQ2NFNpemVOb1RhZyh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uIHRvIHRoZSBzdHJlYW0uICBGb3IgaGlzdG9yaWNhbCByZWFzb25zLAorICAgKiB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlTWVzc2FnZVNldEV4dGVuc2lvblNpemUoCisgICAgICBmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSkgKiAyICsKKyAgICAgICAgICAgY29tcHV0ZVVJbnQzMlNpemUoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lELCBmaWVsZE51bWJlcikgKworICAgICAgICAgICBjb21wdXRlTWVzc2FnZVNpemUoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9NRVNTQUdFLCB2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgorICAgKiB1bnBhcnNlZCBNZXNzYWdlU2V0IGV4dGVuc2lvbiBmaWVsZCB0byB0aGUgc3RyZWFtLiAgRm9yCisgICAqIGhpc3RvcmljYWwgcmVhc29ucywgdGhlIHdpcmUgZm9ybWF0IGRpZmZlcnMgZnJvbSBub3JtYWwgZmllbGRzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb25TaXplKAorICAgICAgZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSkgKiAyICsKKyAgICAgICAgICAgY29tcHV0ZVVJbnQzMlNpemUoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lELCBmaWVsZE51bWJlcikgKworICAgICAgICAgICBjb21wdXRlQnl0ZXNTaXplKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfTUVTU0FHRSwgdmFsdWUpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSBkb3VibGV9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZURvdWJsZVNpemVOb1RhZyhmaW5hbCBkb3VibGUgdmFsdWUpIHsKKyAgICByZXR1cm4gTElUVExFX0VORElBTl82NF9TSVpFOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgZmxvYXR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZsb2F0U2l6ZU5vVGFnKGZpbmFsIGZsb2F0IHZhbHVlKSB7CisgICAgcmV0dXJuIExJVFRMRV9FTkRJQU5fMzJfU0laRTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIHVpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlVUludDY0U2l6ZU5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDY0U2l6ZSh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgorICAgKiB7QGNvZGUgaW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUludDY0U2l6ZU5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDY0U2l6ZSh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgorICAgKiB7QGNvZGUgaW50MzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUludDMyU2l6ZU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA+PSAwKSB7CisgICAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE11c3Qgc2lnbi1leHRlbmQuCisgICAgICByZXR1cm4gMTA7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgZml4ZWQ2NH0gZmllbGQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRml4ZWQ2NFNpemVOb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIExJVFRMRV9FTkRJQU5fNjRfU0laRTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGZpeGVkMzJ9IGZpZWxkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZpeGVkMzJTaXplTm9UYWcoZmluYWwgaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIExJVFRMRV9FTkRJQU5fMzJfU0laRTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICoge0Bjb2RlIGJvb2x9IGZpZWxkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUJvb2xTaXplTm9UYWcoZmluYWwgYm9vbGVhbiB2YWx1ZSkgeworICAgIHJldHVybiAxOworICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgc3RyaW5nfSBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTdHJpbmdTaXplTm9UYWcoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IHZhbHVlLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUoYnl0ZXMubGVuZ3RoKSArCisgICAgICAgICAgICAgYnl0ZXMubGVuZ3RoOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQuIiwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQorICAgKiB7QGNvZGUgZ3JvdXB9IGZpZWxkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUdyb3VwU2l6ZU5vVGFnKGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlLmdldFNlcmlhbGl6ZWRTaXplKCk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSBncm91cH0gZmllbGQgcmVwcmVzZW50ZWQgYnkgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0sIGluY2x1ZGluZworICAgKiB0YWcuCisgICAqCisgICAqIEBkZXByZWNhdGVkIFVua25vd25GaWVsZFNldCBub3cgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZSwgc28geW91IGNhbiBqdXN0CisgICAqICAgICAgICAgICAgIGNhbGwge0BsaW5rICNjb21wdXRlVW5rbm93bkdyb3VwU2l6ZU5vVGFnfS4KKyAgICovCisgIEBEZXByZWNhdGVkCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVVbmtub3duR3JvdXBTaXplTm9UYWcoZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZUdyb3VwU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuIGVtYmVkZGVkCisgICAqIG1lc3NhZ2UgZmllbGQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlTWVzc2FnZVNpemVOb1RhZyhmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkgeworICAgIGZpbmFsIGludCBzaXplID0gdmFsdWUuZ2V0U2VyaWFsaXplZFNpemUoKTsKKyAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDMyU2l6ZShzaXplKSArIHNpemU7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSBieXRlc30gZmllbGQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlQnl0ZXNTaXplTm9UYWcoZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkgeworICAgIHJldHVybiBjb21wdXRlUmF3VmFyaW50MzJTaXplKHZhbHVlLnNpemUoKSkgKworICAgICAgICAgICB2YWx1ZS5zaXplKCk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHtAY29kZSB1aW50MzJ9IGZpZWxkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVVJbnQzMlNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbiBlbnVtIGZpZWxkLgorICAgKiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgdGhlIGVudW0gdmFsdWUgdG8gaXRzIG51bWVyaWMgdmFsdWUuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRW51bVNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gY29tcHV0ZUludDMyU2l6ZU5vVGFnKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCisgICAqIHtAY29kZSBzZml4ZWQzMn0gZmllbGQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ZpeGVkMzJTaXplTm9UYWcoZmluYWwgaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIExJVFRMRV9FTkRJQU5fMzJfU0laRTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCisgICAqIHtAY29kZSBzZml4ZWQ2NH0gZmllbGQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ZpeGVkNjRTaXplTm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgeworICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzY0X1NJWkU7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgorICAgKiB7QGNvZGUgc2ludDMyfSBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTSW50MzJTaXplTm9UYWcoZmluYWwgaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUoZW5jb2RlWmlnWmFnMzIodmFsdWUpKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCisgICAqIHtAY29kZSBzaW50NjR9IGZpZWxkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNJbnQ2NFNpemVOb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQ2NFNpemUoZW5jb2RlWmlnWmFnNjQodmFsdWUpKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqCisgICAqIEludGVybmFsIGhlbHBlciB0aGF0IHdyaXRlcyB0aGUgY3VycmVudCBidWZmZXIgdG8gdGhlIG91dHB1dC4gVGhlCisgICAqIGJ1ZmZlciBwb3NpdGlvbiBpcyByZXNldCB0byBpdHMgaW5pdGlhbCB2YWx1ZSB3aGVuIHRoaXMgcmV0dXJucy4KKyAgICovCisgIHByaXZhdGUgdm9pZCByZWZyZXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKKyAgICAgIC8vIFdlJ3JlIHdyaXRpbmcgdG8gYSBzaW5nbGUgYnVmZmVyLgorICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvLyBTaW5jZSB3ZSBoYXZlIGFuIG91dHB1dCBzdHJlYW0sIHRoaXMgaXMgb3VyIGJ1ZmZlcgorICAgIC8vIGFuZCBidWZmZXIgb2Zmc2V0ID09IDAKKyAgICBvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBwb3NpdGlvbik7CisgICAgcG9zaXRpb24gPSAwOworICB9CisKKyAgLyoqCisgICAqIEZsdXNoZXMgdGhlIHN0cmVhbSBhbmQgZm9yY2VzIGFueSBidWZmZXJlZCBieXRlcyB0byBiZSB3cml0dGVuLiAgVGhpcworICAgKiBkb2VzIG5vdCBmbHVzaCB0aGUgdW5kZXJseWluZyBPdXRwdXRTdHJlYW0uCisgICAqLworICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7CisgICAgICByZWZyZXNoQnVmZmVyKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIElmIHdyaXRpbmcgdG8gYSBmbGF0IGFycmF5LCByZXR1cm4gdGhlIHNwYWNlIGxlZnQgaW4gdGhlIGFycmF5LgorICAgKiBPdGhlcndpc2UsIHRocm93cyB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LgorICAgKi8KKyAgcHVibGljIGludCBzcGFjZUxlZnQoKSB7CisgICAgaWYgKG91dHB1dCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbGltaXQgLSBwb3NpdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAic3BhY2VMZWZ0KCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIENvZGVkT3V0cHV0U3RyZWFtcyB0aGF0IGFyZSAiICsKKyAgICAgICAgIndyaXRpbmcgdG8gYSBmbGF0IGFycmF5LiIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBWZXJpZmllcyB0aGF0IHtAbGluayAjc3BhY2VMZWZ0KCl9IHJldHVybnMgemVyby4gIEl0J3MgY29tbW9uIHRvIGNyZWF0ZQorICAgKiBhIGJ5dGUgYXJyYXkgdGhhdCBpcyBleGFjdGx5IGJpZyBlbm91Z2ggdG8gaG9sZCBhIG1lc3NhZ2UsIHRoZW4gd3JpdGUgdG8KKyAgICogaXQgd2l0aCBhIHtAY29kZSBDb2RlZE91dHB1dFN0cmVhbX0uICBDYWxsaW5nIHtAY29kZSBjaGVja05vU3BhY2VMZWZ0KCl9CisgICAqIGFmdGVyIHdyaXRpbmcgdmVyaWZpZXMgdGhhdCB0aGUgbWVzc2FnZSB3YXMgYWN0dWFsbHkgYXMgYmlnIGFzIGV4cGVjdGVkLAorICAgKiB3aGljaCBjYW4gaGVscCBjYXRjaCBidWdzLgorICAgKi8KKyAgcHVibGljIHZvaWQgY2hlY2tOb1NwYWNlTGVmdCgpIHsKKyAgICBpZiAoc3BhY2VMZWZ0KCkgIT0gMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgIkRpZCBub3Qgd3JpdGUgYXMgbXVjaCBkYXRhIGFzIGV4cGVjdGVkLiIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBJZiB5b3UgY3JlYXRlIGEgQ29kZWRPdXRwdXRTdHJlYW0gYXJvdW5kIGEgc2ltcGxlIGZsYXQgYXJyYXksIHlvdSBtdXN0CisgICAqIG5vdCBhdHRlbXB0IHRvIHdyaXRlIG1vcmUgYnl0ZXMgdGhhbiB0aGUgYXJyYXkgaGFzIHNwYWNlLiAgT3RoZXJ3aXNlLAorICAgKiB0aGlzIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3V0T2ZTcGFjZUV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjk0NzQ4Njg4Njk5Nzg4OTQ5OUw7CisKKyAgICBPdXRPZlNwYWNlRXhjZXB0aW9uKCkgeworICAgICAgc3VwZXIoIkNvZGVkT3V0cHV0U3RyZWFtIHdhcyB3cml0aW5nIHRvIGEgZmxhdCBieXRlIGFycmF5IGFuZCByYW4gIiArCisgICAgICAgICAgICAib3V0IG9mIHNwYWNlLiIpOworICAgIH0KKyAgfQorCisgIC8qKiBXcml0ZSBhIHNpbmdsZSBieXRlLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVJhd0J5dGUoZmluYWwgYnl0ZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAocG9zaXRpb24gPT0gbGltaXQpIHsKKyAgICAgIHJlZnJlc2hCdWZmZXIoKTsKKyAgICB9CisKKyAgICBidWZmZXJbcG9zaXRpb24rK10gPSB2YWx1ZTsKKyAgfQorCisgIC8qKiBXcml0ZSBhIHNpbmdsZSBieXRlLCByZXByZXNlbnRlZCBieSBhbiBpbnRlZ2VyIHZhbHVlLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVJhd0J5dGUoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlUmF3Qnl0ZSgoYnl0ZSkgdmFsdWUpOworICB9CisKKyAgLyoqIFdyaXRlIGEgYnl0ZSBzdHJpbmcuICovCisgIHB1YmxpYyB2b2lkIHdyaXRlUmF3Qnl0ZXMoZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd0J5dGVzKHZhbHVlLCAwLCB2YWx1ZS5zaXplKCkpOworICB9CisKKyAgLyoqIFdyaXRlIGFuIGFycmF5IG9mIGJ5dGVzLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVJhd0J5dGVzKGZpbmFsIGJ5dGVbXSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd0J5dGVzKHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgpOworICB9CisKKyAgLyoqIFdyaXRlIHBhcnQgb2YgYW4gYXJyYXkgb2YgYnl0ZXMuICovCisgIHB1YmxpYyB2b2lkIHdyaXRlUmF3Qnl0ZXMoZmluYWwgYnl0ZVtdIHZhbHVlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGxpbWl0IC0gcG9zaXRpb24gPj0gbGVuZ3RoKSB7CisgICAgICAvLyBXZSBoYXZlIHJvb20gaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgorICAgICAgU3lzdGVtLmFycmF5Y29weSh2YWx1ZSwgb2Zmc2V0LCBidWZmZXIsIHBvc2l0aW9uLCBsZW5ndGgpOworICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXcml0ZSBleHRlbmRzIHBhc3QgY3VycmVudCBidWZmZXIuICBGaWxsIHRoZSByZXN0IG9mIHRoaXMgYnVmZmVyIGFuZAorICAgICAgLy8gZmx1c2guCisgICAgICBmaW5hbCBpbnQgYnl0ZXNXcml0dGVuID0gbGltaXQgLSBwb3NpdGlvbjsKKyAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWUsIG9mZnNldCwgYnVmZmVyLCBwb3NpdGlvbiwgYnl0ZXNXcml0dGVuKTsKKyAgICAgIG9mZnNldCArPSBieXRlc1dyaXR0ZW47CisgICAgICBsZW5ndGggLT0gYnl0ZXNXcml0dGVuOworICAgICAgcG9zaXRpb24gPSBsaW1pdDsKKyAgICAgIHJlZnJlc2hCdWZmZXIoKTsKKworICAgICAgLy8gTm93IGRlYWwgd2l0aCB0aGUgcmVzdC4KKyAgICAgIC8vIFNpbmNlIHdlIGhhdmUgYW4gb3V0cHV0IHN0cmVhbSwgdGhpcyBpcyBvdXIgYnVmZmVyCisgICAgICAvLyBhbmQgYnVmZmVyIG9mZnNldCA9PSAwCisgICAgICBpZiAobGVuZ3RoIDw9IGxpbWl0KSB7CisgICAgICAgIC8vIEZpdHMgaW4gbmV3IGJ1ZmZlci4KKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh2YWx1ZSwgb2Zmc2V0LCBidWZmZXIsIDAsIGxlbmd0aCk7CisgICAgICAgIHBvc2l0aW9uID0gbGVuZ3RoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV3JpdGUgaXMgdmVyeSBiaWcuICBMZXQncyBkbyBpdCBhbGwgYXQgb25jZS4KKyAgICAgICAgb3V0cHV0LndyaXRlKHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqIFdyaXRlIHBhcnQgb2YgYSBieXRlIHN0cmluZy4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVSYXdCeXRlcyhmaW5hbCBCeXRlU3RyaW5nIHZhbHVlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGxpbWl0IC0gcG9zaXRpb24gPj0gbGVuZ3RoKSB7CisgICAgICAvLyBXZSBoYXZlIHJvb20gaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgorICAgICAgdmFsdWUuY29weVRvKGJ1ZmZlciwgb2Zmc2V0LCBwb3NpdGlvbiwgbGVuZ3RoKTsKKyAgICAgIHBvc2l0aW9uICs9IGxlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV3JpdGUgZXh0ZW5kcyBwYXN0IGN1cnJlbnQgYnVmZmVyLiAgRmlsbCB0aGUgcmVzdCBvZiB0aGlzIGJ1ZmZlciBhbmQKKyAgICAgIC8vIGZsdXNoLgorICAgICAgZmluYWwgaW50IGJ5dGVzV3JpdHRlbiA9IGxpbWl0IC0gcG9zaXRpb247CisgICAgICB2YWx1ZS5jb3B5VG8oYnVmZmVyLCBvZmZzZXQsIHBvc2l0aW9uLCBieXRlc1dyaXR0ZW4pOworICAgICAgb2Zmc2V0ICs9IGJ5dGVzV3JpdHRlbjsKKyAgICAgIGxlbmd0aCAtPSBieXRlc1dyaXR0ZW47CisgICAgICBwb3NpdGlvbiA9IGxpbWl0OworICAgICAgcmVmcmVzaEJ1ZmZlcigpOworCisgICAgICAvLyBOb3cgZGVhbCB3aXRoIHRoZSByZXN0LgorICAgICAgLy8gU2luY2Ugd2UgaGF2ZSBhbiBvdXRwdXQgc3RyZWFtLCB0aGlzIGlzIG91ciBidWZmZXIKKyAgICAgIC8vIGFuZCBidWZmZXIgb2Zmc2V0ID09IDAKKyAgICAgIGlmIChsZW5ndGggPD0gbGltaXQpIHsKKyAgICAgICAgLy8gRml0cyBpbiBuZXcgYnVmZmVyLgorICAgICAgICB2YWx1ZS5jb3B5VG8oYnVmZmVyLCBvZmZzZXQsIDAsIGxlbmd0aCk7CisgICAgICAgIHBvc2l0aW9uID0gbGVuZ3RoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV3JpdGUgaXMgdmVyeSBiaWcsIGJ1dCB3ZSBjYW4ndCBkbyBpdCBhbGwgYXQgb25jZSB3aXRob3V0IGFsbG9jYXRpbmcKKyAgICAgICAgLy8gYW4gYSBjb3B5IG9mIHRoZSBieXRlIGFycmF5IHNpbmNlIEJ5dGVTdHJpbmcgZG9lcyBub3QgZ2l2ZSB1cyBhY2Nlc3MKKyAgICAgICAgLy8gdG8gdGhlIHVuZGVybHlpbmcgYnl0ZXMuIFVzZSB0aGUgSW5wdXRTdHJlYW0gaW50ZXJmYWNlIG9uIHRoZQorICAgICAgICAvLyBCeXRlU3RyaW5nIGFuZCBvdXIgYnVmZmVyIHRvIGNvcHkgYmV0d2VlbiB0aGUgdHdvLgorICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbUZyb20gPSB2YWx1ZS5uZXdJbnB1dCgpOworICAgICAgICBpZiAob2Zmc2V0ICE9IGlucHV0U3RyZWFtRnJvbS5za2lwKG9mZnNldCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTa2lwIGZhaWxlZD8gU2hvdWxkIG5ldmVyIGhhcHBlbi4iKTsKKyAgICAgICAgfQorICAgICAgICAvLyBVc2UgdGhlIGJ1ZmZlciBhcyB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciB0byBhdm9pZCBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICBpbnQgYnl0ZXNUb1JlYWQgPSBNYXRoLm1pbihsZW5ndGgsIGxpbWl0KTsKKyAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaW5wdXRTdHJlYW1Gcm9tLnJlYWQoYnVmZmVyLCAwLCBieXRlc1RvUmVhZCk7CisgICAgICAgICAgaWYgKGJ5dGVzUmVhZCAhPSBieXRlc1RvUmVhZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVhZCBmYWlsZWQ/IFNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICBsZW5ndGggLT0gYnl0ZXNSZWFkOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqIEVuY29kZSBhbmQgd3JpdGUgYSB0YWcuICovCisgIHB1YmxpYyB2b2lkIHdyaXRlVGFnKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHdpcmVUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdyaXRlUmF3VmFyaW50MzIoV2lyZUZvcm1hdC5tYWtlVGFnKGZpZWxkTnVtYmVyLCB3aXJlVHlwZSkpOworICB9CisKKyAgLyoqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYSB0YWcuICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVUYWdTaXplKGZpbmFsIGludCBmaWVsZE51bWJlcikgeworICAgIHJldHVybiBjb21wdXRlUmF3VmFyaW50MzJTaXplKFdpcmVGb3JtYXQubWFrZVRhZyhmaWVsZE51bWJlciwgMCkpOworICB9CisKKyAgLyoqCisgICAqIEVuY29kZSBhbmQgd3JpdGUgYSB2YXJpbnQuICB7QGNvZGUgdmFsdWV9IGlzIHRyZWF0ZWQgYXMKKyAgICogdW5zaWduZWQsIHNvIGl0IHdvbid0IGJlIHNpZ24tZXh0ZW5kZWQgaWYgbmVnYXRpdmUuCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZVJhd1ZhcmludDMyKGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKCh2YWx1ZSAmIH4weDdGKSA9PSAwKSB7CisgICAgICAgIHdyaXRlUmF3Qnl0ZSh2YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlUmF3Qnl0ZSgodmFsdWUgJiAweDdGKSB8IDB4ODApOworICAgICAgICB2YWx1ZSA+Pj49IDc7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYSB2YXJpbnQuCisgICAqIHtAY29kZSB2YWx1ZX0gaXMgdHJlYXRlZCBhcyB1bnNpZ25lZCwgc28gaXQgd29uJ3QgYmUgc2lnbi1leHRlbmRlZCBpZgorICAgKiBuZWdhdGl2ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVSYXdWYXJpbnQzMlNpemUoZmluYWwgaW50IHZhbHVlKSB7CisgICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8ICA3KSkgPT0gMCkgcmV0dXJuIDE7CisgICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8IDE0KSkgPT0gMCkgcmV0dXJuIDI7CisgICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8IDIxKSkgPT0gMCkgcmV0dXJuIDM7CisgICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8IDI4KSkgPT0gMCkgcmV0dXJuIDQ7CisgICAgcmV0dXJuIDU7CisgIH0KKworICAvKiogRW5jb2RlIGFuZCB3cml0ZSBhIHZhcmludC4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVSYXdWYXJpbnQ2NChsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoKHZhbHVlICYgfjB4N0ZMKSA9PSAwKSB7CisgICAgICAgIHdyaXRlUmF3Qnl0ZSgoaW50KXZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVSYXdCeXRlKCgoaW50KXZhbHVlICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgdmFsdWUgPj4+PSA3OworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEgdmFyaW50LiAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlUmF3VmFyaW50NjRTaXplKGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgIDcpKSA9PSAwKSByZXR1cm4gMTsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMTQpKSA9PSAwKSByZXR1cm4gMjsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMjEpKSA9PSAwKSByZXR1cm4gMzsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMjgpKSA9PSAwKSByZXR1cm4gNDsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMzUpKSA9PSAwKSByZXR1cm4gNTsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNDIpKSA9PSAwKSByZXR1cm4gNjsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNDkpKSA9PSAwKSByZXR1cm4gNzsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNTYpKSA9PSAwKSByZXR1cm4gODsKKyAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNjMpKSA9PSAwKSByZXR1cm4gOTsKKyAgICByZXR1cm4gMTA7CisgIH0KKworICAvKiogV3JpdGUgYSBsaXR0bGUtZW5kaWFuIDMyLWJpdCBpbnRlZ2VyLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB3cml0ZVJhd0J5dGUoKHZhbHVlICAgICAgKSAmIDB4RkYpOworICAgIHdyaXRlUmF3Qnl0ZSgodmFsdWUgPj4gIDgpICYgMHhGRik7CisgICAgd3JpdGVSYXdCeXRlKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICB3cml0ZVJhd0J5dGUoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElUVExFX0VORElBTl8zMl9TSVpFID0gNDsKKworICAvKiogV3JpdGUgYSBsaXR0bGUtZW5kaWFuIDY0LWJpdCBpbnRlZ2VyLiAqLworICBwdWJsaWMgdm9pZCB3cml0ZVJhd0xpdHRsZUVuZGlhbjY0KGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgd3JpdGVSYXdCeXRlKChpbnQpKHZhbHVlICAgICAgKSAmIDB4RkYpOworICAgIHdyaXRlUmF3Qnl0ZSgoaW50KSh2YWx1ZSA+PiAgOCkgJiAweEZGKTsKKyAgICB3cml0ZVJhd0J5dGUoKGludCkodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgd3JpdGVSYXdCeXRlKChpbnQpKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIHdyaXRlUmF3Qnl0ZSgoaW50KSh2YWx1ZSA+PiAzMikgJiAweEZGKTsKKyAgICB3cml0ZVJhd0J5dGUoKGludCkodmFsdWUgPj4gNDApICYgMHhGRik7CisgICAgd3JpdGVSYXdCeXRlKChpbnQpKHZhbHVlID4+IDQ4KSAmIDB4RkYpOworICAgIHdyaXRlUmF3Qnl0ZSgoaW50KSh2YWx1ZSA+PiA1NikgJiAweEZGKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJVFRMRV9FTkRJQU5fNjRfU0laRSA9IDg7CisKKyAgLyoqCisgICAqIEVuY29kZSBhIFppZ1phZy1lbmNvZGVkIDMyLWJpdCB2YWx1ZS4gIFppZ1phZyBlbmNvZGVzIHNpZ25lZCBpbnRlZ2VycworICAgKiBpbnRvIHZhbHVlcyB0aGF0IGNhbiBiZSBlZmZpY2llbnRseSBlbmNvZGVkIHdpdGggdmFyaW50LiAgKE90aGVyd2lzZSwKKyAgICogbmVnYXRpdmUgdmFsdWVzIG11c3QgYmUgc2lnbi1leHRlbmRlZCB0byA2NCBiaXRzIHRvIGJlIHZhcmludCBlbmNvZGVkLAorICAgKiB0aHVzIGFsd2F5cyB0YWtpbmcgMTAgYnl0ZXMgb24gdGhlIHdpcmUuKQorICAgKgorICAgKiBAcGFyYW0gbiBBIHNpZ25lZCAzMi1iaXQgaW50ZWdlci4KKyAgICogQHJldHVybiBBbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgc3RvcmVkIGluIGEgc2lnbmVkIGludCBiZWNhdXNlCisgICAqICAgICAgICAgSmF2YSBoYXMgbm8gZXhwbGljaXQgdW5zaWduZWQgc3VwcG9ydC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgaW50IGVuY29kZVppZ1phZzMyKGZpbmFsIGludCBuKSB7CisgICAgLy8gTm90ZTogIHRoZSByaWdodC1zaGlmdCBtdXN0IGJlIGFyaXRobWV0aWMKKyAgICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAzMSk7CisgIH0KKworICAvKioKKyAgICogRW5jb2RlIGEgWmlnWmFnLWVuY29kZWQgNjQtYml0IHZhbHVlLiAgWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzCisgICAqIGludG8gdmFsdWVzIHRoYXQgY2FuIGJlIGVmZmljaWVudGx5IGVuY29kZWQgd2l0aCB2YXJpbnQuICAoT3RoZXJ3aXNlLAorICAgKiBuZWdhdGl2ZSB2YWx1ZXMgbXVzdCBiZSBzaWduLWV4dGVuZGVkIHRvIDY0IGJpdHMgdG8gYmUgdmFyaW50IGVuY29kZWQsCisgICAqIHRodXMgYWx3YXlzIHRha2luZyAxMCBieXRlcyBvbiB0aGUgd2lyZS4pCisgICAqCisgICAqIEBwYXJhbSBuIEEgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLgorICAgKiBAcmV0dXJuIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLCBzdG9yZWQgaW4gYSBzaWduZWQgaW50IGJlY2F1c2UKKyAgICogICAgICAgICBKYXZhIGhhcyBubyBleHBsaWNpdCB1bnNpZ25lZCBzdXBwb3J0LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBsb25nIGVuY29kZVppZ1phZzY0KGZpbmFsIGxvbmcgbikgeworICAgIC8vIE5vdGU6ICB0aGUgcmlnaHQtc2hpZnQgbXVzdCBiZSBhcml0aG1ldGljCisgICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gNjMpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnMuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9ycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTg0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnMuamF2YQpAQCAtMCwwICsxLDE4ODcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3Rvcy4qOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisKKy8qKgorICogQ29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIGNsYXNzZXMgd2hpY2ggZGVzY3JpYmUgcHJvdG9jb2wgbWVzc2FnZSB0eXBlcy4KKyAqCisgKiBFdmVyeSBtZXNzYWdlIHR5cGUgaGFzIGEge0BsaW5rIERlc2NyaXB0b3J9LCB3aGljaCBsaXN0cyBhbGwKKyAqIGl0cyBmaWVsZHMgYW5kIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IGEgdHlwZS4gIFlvdSBjYW4gZ2V0IGEgbWVzc2FnZQorICogdHlwZSdzIGRlc2NyaXB0b3IgYnkgY2FsbGluZyB7QGNvZGUgTWVzc2FnZVR5cGUuZ2V0RGVzY3JpcHRvcigpfSwgb3IKKyAqIChnaXZlbiBhIG1lc3NhZ2Ugb2JqZWN0IG9mIHRoZSB0eXBlKSB7QGNvZGUgbWVzc2FnZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KKyAqIEZ1cnRoZXJtb3JlLCBlYWNoIG1lc3NhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIGEge0BsaW5rIEZpbGVEZXNjcmlwdG9yfSBmb3IKKyAqIGEgcmVsZXZhbnQge0Bjb2RlIC5wcm90b30gZmlsZS4gWW91IGNhbiBvYnRhaW4gaXQgYnkgY2FsbGluZworICoge0Bjb2RlIERlc2NyaXB0b3IuZ2V0RmlsZSgpfS4gQSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5zIGRlc2NyaXB0b3JzCisgKiBmb3IgYWxsIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoYXQgZmlsZSwgYW5kIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGFsbCB0aGUKKyAqIGltcG9ydGVkIHtAY29kZSAucHJvdG99IGZpbGVzLgorICoKKyAqIERlc2NyaXB0b3JzIGFyZSBidWlsdCBmcm9tIERlc2NyaXB0b3JQcm90b3MsIGFzIGRlZmluZWQgaW4KKyAqIHtAY29kZSBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b30uCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERlc2NyaXB0b3JzIHsKKyAgLyoqCisgICAqIERlc2NyaWJlcyBhIHtAY29kZSAucHJvdG99IGZpbGUsIGluY2x1ZGluZyBldmVyeXRoaW5nIGRlZmluZWQgd2l0aGluLgorICAgKiBUaGF0IGluY2x1ZGVzLCBpbiBwYXJ0aWN1bGFyLCBkZXNjcmlwdG9ycyBmb3IgYWxsIHRoZSBtZXNzYWdlcyBhbmQKKyAgICogZmlsZSBkZXNjcmlwdG9ycyBmb3IgYWxsIG90aGVyIGltcG9ydGVkIHtAY29kZSAucHJvdG99IGZpbGVzCisgICAqIChkZXBlbmRlbmNpZXMpLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGaWxlRGVzY3JpcHRvciB7CisgICAgLyoqIENvbnZlcnQgdGhlIGRlc2NyaXB0b3IgdG8gaXRzIHByb3RvY29sIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uICovCisgICAgcHVibGljIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG9Qcm90bygpIHsgcmV0dXJuIHByb3RvOyB9CisKKyAgICAvKiogR2V0IHRoZSBmaWxlIG5hbWUuICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByb3RvIHBhY2thZ2UgbmFtZS4gIFRoaXMgaXMgdGhlIHBhY2thZ2UgbmFtZSBnaXZlbiBieSB0aGUKKyAgICAgKiB7QGNvZGUgcGFja2FnZX0gc3RhdGVtZW50IGluIHRoZSB7QGNvZGUgLnByb3RvfSBmaWxlLCB3aGljaCBkaWZmZXJzCisgICAgICogZnJvbSB0aGUgSmF2YSBwYWNrYWdlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZSgpIHsgcmV0dXJuIHByb3RvLmdldFBhY2thZ2UoKTsgfQorCisgICAgLyoqIEdldCB0aGUge0Bjb2RlIEZpbGVPcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uICovCisgICAgcHVibGljIEZpbGVPcHRpb25zIGdldE9wdGlvbnMoKSB7IHJldHVybiBwcm90by5nZXRPcHRpb25zKCk7IH0KKworICAgIC8qKiBHZXQgYSBsaXN0IG9mIHRvcC1sZXZlbCBtZXNzYWdlIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgZmlsZS4gKi8KKyAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdG9yPiBnZXRNZXNzYWdlVHlwZXMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KG1lc3NhZ2VUeXBlcykpOworICAgIH0KKworICAgIC8qKiBHZXQgYSBsaXN0IG9mIHRvcC1sZXZlbCBlbnVtIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgZmlsZS4gKi8KKyAgICBwdWJsaWMgTGlzdDxFbnVtRGVzY3JpcHRvcj4gZ2V0RW51bVR5cGVzKCkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChlbnVtVHlwZXMpKTsKKyAgICB9CisKKyAgICAvKiogR2V0IGEgbGlzdCBvZiB0b3AtbGV2ZWwgc2VydmljZXMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlLiAqLworICAgIHB1YmxpYyBMaXN0PFNlcnZpY2VEZXNjcmlwdG9yPiBnZXRTZXJ2aWNlcygpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3Qoc2VydmljZXMpKTsKKyAgICB9CisKKyAgICAvKiogR2V0IGEgbGlzdCBvZiB0b3AtbGV2ZWwgZXh0ZW5zaW9ucyBkZWNsYXJlZCBpbiB0aGlzIGZpbGUuICovCisgICAgcHVibGljIExpc3Q8RmllbGREZXNjcmlwdG9yPiBnZXRFeHRlbnNpb25zKCkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChleHRlbnNpb25zKSk7CisgICAgfQorCisgICAgLyoqIEdldCBhIGxpc3Qgb2YgdGhpcyBmaWxlJ3MgZGVwZW5kZW5jaWVzIChpbXBvcnRzKS4gKi8KKyAgICBwdWJsaWMgTGlzdDxGaWxlRGVzY3JpcHRvcj4gZ2V0RGVwZW5kZW5jaWVzKCkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChkZXBlbmRlbmNpZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgbWVzc2FnZSB0eXBlIGluIHRoZSBmaWxlIGJ5IG5hbWUuICBEb2VzIG5vdCBmaW5kIG5lc3RlZCB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCB0eXBlIG5hbWUgdG8gbG9vayBmb3IuCisgICAgICogQHJldHVybiBUaGUgbWVzc2FnZSB0eXBlJ3MgZGVzY3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVzY3JpcHRvciBmaW5kTWVzc2FnZVR5cGVCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgIC8vIERvbid0IGFsbG93IGxvb2tpbmcgdXAgbmVzdGVkIHR5cGVzLiAgVGhpcyB3aWxsIG1ha2Ugb3B0aW1pemF0aW9uCisgICAgICAvLyBlYXNpZXIgbGF0ZXIuCisgICAgICBpZiAobmFtZS5pbmRleE9mKCcuJykgIT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBpZiAoZ2V0UGFja2FnZSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICBuYW1lID0gZ2V0UGFja2FnZSgpICsgJy4nICsgbmFtZTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9IHBvb2wuZmluZFN5bWJvbChuYW1lKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yICYmCisgICAgICAgICAgcmVzdWx0LmdldEZpbGUoKSA9PSB0aGlzKSB7CisgICAgICAgIHJldHVybiAoRGVzY3JpcHRvcilyZXN1bHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGFuIGVudW0gdHlwZSBpbiB0aGUgZmlsZSBieSBuYW1lLiAgRG9lcyBub3QgZmluZCBuZXN0ZWQgdHlwZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5xdWFsaWZpZWQgdHlwZSBuYW1lIHRvIGxvb2sgZm9yLgorICAgICAqIEByZXR1cm4gVGhlIGVudW0gdHlwZSdzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIEVudW1EZXNjcmlwdG9yIGZpbmRFbnVtVHlwZUJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgLy8gRG9uJ3QgYWxsb3cgbG9va2luZyB1cCBuZXN0ZWQgdHlwZXMuICBUaGlzIHdpbGwgbWFrZSBvcHRpbWl6YXRpb24KKyAgICAgIC8vIGVhc2llciBsYXRlci4KKyAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIGlmIChnZXRQYWNrYWdlKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIG5hbWUgPSBnZXRQYWNrYWdlKCkgKyAnLicgKyBuYW1lOworICAgICAgfQorICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0gcG9vbC5maW5kU3ltYm9sKG5hbWUpOworICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIEVudW1EZXNjcmlwdG9yICYmCisgICAgICAgICAgcmVzdWx0LmdldEZpbGUoKSA9PSB0aGlzKSB7CisgICAgICAgIHJldHVybiAoRW51bURlc2NyaXB0b3IpcmVzdWx0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhIHNlcnZpY2UgdHlwZSBpbiB0aGUgZmlsZSBieSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVucXVhbGlmaWVkIHR5cGUgbmFtZSB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIFRoZSBzZXJ2aWNlIHR5cGUncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2aWNlRGVzY3JpcHRvciBmaW5kU2VydmljZUJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgLy8gRG9uJ3QgYWxsb3cgbG9va2luZyB1cCBuZXN0ZWQgdHlwZXMuICBUaGlzIHdpbGwgbWFrZSBvcHRpbWl6YXRpb24KKyAgICAgIC8vIGVhc2llciBsYXRlci4KKyAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIGlmIChnZXRQYWNrYWdlKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIG5hbWUgPSBnZXRQYWNrYWdlKCkgKyAnLicgKyBuYW1lOworICAgICAgfQorICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0gcG9vbC5maW5kU3ltYm9sKG5hbWUpOworICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIFNlcnZpY2VEZXNjcmlwdG9yICYmCisgICAgICAgICAgcmVzdWx0LmdldEZpbGUoKSA9PSB0aGlzKSB7CisgICAgICAgIHJldHVybiAoU2VydmljZURlc2NyaXB0b3IpcmVzdWx0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhbiBleHRlbnNpb24gaW4gdGhlIGZpbGUgYnkgbmFtZS4gIERvZXMgbm90IGZpbmQgZXh0ZW5zaW9ucyBuZXN0ZWQKKyAgICAgKiBpbnNpZGUgbWVzc2FnZSB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCBleHRlbnNpb24gbmFtZSB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24ncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZmluZEV4dGVuc2lvbkJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgaWYgKG5hbWUuaW5kZXhPZignLicpICE9IC0xKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgaWYgKGdldFBhY2thZ2UoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgbmFtZSA9IGdldFBhY2thZ2UoKSArICcuJyArIG5hbWU7CisgICAgICB9CisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPSBwb29sLmZpbmRTeW1ib2wobmFtZSk7CisgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgRmllbGREZXNjcmlwdG9yICYmCisgICAgICAgICAgcmVzdWx0LmdldEZpbGUoKSA9PSB0aGlzKSB7CisgICAgICAgIHJldHVybiAoRmllbGREZXNjcmlwdG9yKXJlc3VsdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIHtAY29kZSBGaWxlRGVzY3JpcHRvcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG8gVGhlIHByb3RvY29sIG1lc3NhZ2UgZm9ybSBvZiB0aGUgRmlsZURlc2NyaXB0b3IuCisgICAgICogQHBhcmFtIGRlcGVuZGVuY2llcyB7QGNvZGUgRmlsZURlc2NyaXB0b3J9cyBjb3JyZXNwb25kaW5nIHRvIGFsbCBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUncyBkZXBlbmRlbmNpZXMsIGluIHRoZSBleGFjdCBvcmRlciBsaXN0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGluIHtAY29kZSBwcm90b30uCisgICAgICogQHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7QGNvZGUgcHJvdG99IGlzIG5vdCBhIHZhbGlkCisgICAgICogICAgICAgICAgIGRlc2NyaXB0b3IuICBUaGlzIGNhbiBvY2N1ciBmb3IgYSBudW1iZXIgb2YgcmVhc29ucywgZS5nLgorICAgICAqICAgICAgICAgICBiZWNhdXNlIGEgZmllbGQgaGFzIGFuIHVuZGVmaW5lZCB0eXBlIG9yIGJlY2F1c2UgdHdvIG1lc3NhZ2VzCisgICAgICogICAgICAgICAgIHdlcmUgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvciBidWlsZEZyb20oZmluYWwgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvcltdIGRlcGVuZGVuY2llcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAvLyBCdWlsZGluZyBkZWNzcmlwdG9ycyBpbnZvbHZlcyB0d28gc3RlcHM6ICB0cmFuc2xhdGluZyBhbmQgbGlua2luZy4KKyAgICAgIC8vIEluIHRoZSB0cmFuc2xhdGlvbiBzdGVwIChpbXBsZW1lbnRlZCBieSBGaWxlRGVzY3JpcHRvcidzCisgICAgICAvLyBjb25zdHJ1Y3RvciksIHdlIGJ1aWxkIGFuIG9iamVjdCB0cmVlIG1pcnJvcmluZyB0aGUKKyAgICAgIC8vIEZpbGVEZXNjcmlwdG9yUHJvdG8ncyB0cmVlIGFuZCBwdXQgYWxsIG9mIHRoZSBkZXNjcmlwdG9ycyBpbnRvIHRoZQorICAgICAgLy8gRGVzY3JpcHRvclBvb2wncyBsb29rdXAgdGFibGVzLiAgSW4gdGhlIGxpbmtpbmcgc3RlcCwgd2UgbG9vayB1cCBhbGwKKyAgICAgIC8vIHR5cGUgcmVmZXJlbmNlcyBpbiB0aGUgRGVzY3JpcHRvclBvb2wsIHNvIHRoYXQsIGZvciBleGFtcGxlLCBhCisgICAgICAvLyBGaWVsZERlc2NyaXB0b3IgZm9yIGFuIGVtYmVkZGVkIG1lc3NhZ2UgY29udGFpbnMgYSBwb2ludGVyIGRpcmVjdGx5CisgICAgICAvLyB0byB0aGUgRGVzY3JpcHRvciBmb3IgdGhhdCBtZXNzYWdlJ3MgdHlwZS4gIFdlIGFsc28gZGV0ZWN0IHVuZGVmaW5lZAorICAgICAgLy8gdHlwZXMgaW4gdGhlIGxpbmtpbmcgc3RlcC4KKyAgICAgIGZpbmFsIERlc2NyaXB0b3JQb29sIHBvb2wgPSBuZXcgRGVzY3JpcHRvclBvb2woZGVwZW5kZW5jaWVzKTsKKyAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIHJlc3VsdCA9CisgICAgICAgICAgbmV3IEZpbGVEZXNjcmlwdG9yKHByb3RvLCBkZXBlbmRlbmNpZXMsIHBvb2wpOworCisgICAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCAhPSBwcm90by5nZXREZXBlbmRlbmN5Q291bnQoKSkgeworICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24ocmVzdWx0LAorICAgICAgICAgICJEZXBlbmRlbmNpZXMgcGFzc2VkIHRvIEZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbSgpIGRvbid0IG1hdGNoICIgKworICAgICAgICAgICJ0aG9zZSBsaXN0ZWQgaW4gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uIik7CisgICAgICB9CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldERlcGVuZGVuY3lDb3VudCgpOyBpKyspIHsKKyAgICAgICAgaWYgKCFkZXBlbmRlbmNpZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhwcm90by5nZXREZXBlbmRlbmN5KGkpKSkgeworICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihyZXN1bHQsCisgICAgICAgICAgICAiRGVwZW5kZW5jaWVzIHBhc3NlZCB0byBGaWxlRGVzY3JpcHRvci5idWlsZEZyb20oKSBkb24ndCBtYXRjaCAiICsKKyAgICAgICAgICAgICJ0aG9zZSBsaXN0ZWQgaW4gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmVzdWx0LmNyb3NzTGluaygpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBjYWxsZWQgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gIEl0IGlzIGVxdWl2YWxlbnQKKyAgICAgKiB0byB7QGNvZGUgYnVpbGRGcm9tfSBleGNlcHQgdGhhdCB0aGUge0Bjb2RlIEZpbGVEZXNjcmlwdG9yUHJvdG99IGlzCisgICAgICogZW5jb2RlZCBpbiBwcm90b2NvbCBidWZmZXIgd2lyZSBmb3JtYXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbSgKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZGVzY3JpcHRvckRhdGFQYXJ0cywKKyAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMsCisgICAgICAgIGZpbmFsIEludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyIGRlc2NyaXB0b3JBc3NpZ25lcikgeworICAgICAgLy8gSGFjazogIFdlIGNhbid0IGVtYmVkIGEgcmF3IGJ5dGUgYXJyYXkgaW5zaWRlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAgICAgIC8vICAgKGF0IGxlYXN0LCBub3QgZWZmaWNpZW50bHkpLCBidXQgd2UgY2FuIGVtYmVkIFN0cmluZ3MuICBTbywgdGhlCisgICAgICAvLyAgIHByb3RvY29sIGNvbXBpbGVyIGVtYmVkcyB0aGUgRmlsZURlc2NyaXB0b3JQcm90byBhcyBhIGdpYW50CisgICAgICAvLyAgIHN0cmluZyBsaXRlcmFsIHdoaWNoIGlzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCB0aGUKKyAgICAgIC8vICAgZmlsZSdzIEZpbGVEZXNjcmlwdG9yLiAgVGhlIHN0cmluZyBsaXRlcmFsIGNvbnRhaW5zIG9ubHkgOC1iaXQKKyAgICAgIC8vICAgY2hhcmFjdGVycywgZWFjaCBvbmUgcmVwcmVzZW50aW5nIGEgYnl0ZSBvZiB0aGUgRmlsZURlc2NyaXB0b3JQcm90bydzCisgICAgICAvLyAgIHNlcmlhbGl6ZWQgZm9ybS4gIFNvLCBpZiB3ZSBjb252ZXJ0IGl0IHRvIGJ5dGVzIGluIElTTy04ODU5LTEsIHdlCisgICAgICAvLyAgIHNob3VsZCBnZXQgdGhlIG9yaWdpbmFsIGJ5dGVzIHRoYXQgd2Ugd2FudC4KKworICAgICAgLy8gZGVzY3JpcHRvckRhdGEgbWF5IGNvbnRhaW4gbXVsdGlwbGUgc3RyaW5ncyBpbiBvcmRlciB0byBnZXQgYXJvdW5kIHRoZQorICAgICAgLy8gSmF2YSA2NGsgc3RyaW5nIGxpdGVyYWwgbGltaXQuCisgICAgICBTdHJpbmdCdWlsZGVyIGRlc2NyaXB0b3JEYXRhID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGZvciAoU3RyaW5nIHBhcnQgOiBkZXNjcmlwdG9yRGF0YVBhcnRzKSB7CisgICAgICAgIGRlc2NyaXB0b3JEYXRhLmFwcGVuZChwYXJ0KTsKKyAgICAgIH0KKworICAgICAgZmluYWwgYnl0ZVtdIGRlc2NyaXB0b3JCeXRlczsKKyAgICAgIHRyeSB7CisgICAgICAgIGRlc2NyaXB0b3JCeXRlcyA9IGRlc2NyaXB0b3JEYXRhLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAiU3RhbmRhcmQgZW5jb2RpbmcgSVNPLTg4NTktMSBub3Qgc3VwcG9ydGVkIGJ5IEpWTS4iLCBlKTsKKyAgICAgIH0KKworICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bzsKKyAgICAgIHRyeSB7CisgICAgICAgIHByb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5wYXJzZUZyb20oZGVzY3JpcHRvckJ5dGVzKTsKKyAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIkZhaWxlZCB0byBwYXJzZSBwcm90b2NvbCBidWZmZXIgZGVzY3JpcHRvciBmb3IgZ2VuZXJhdGVkIGNvZGUuIiwgZSk7CisgICAgICB9CisKKyAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIHJlc3VsdDsKKyAgICAgIHRyeSB7CisgICAgICAgIHJlc3VsdCA9IGJ1aWxkRnJvbShwcm90bywgZGVwZW5kZW5jaWVzKTsKKyAgICAgIH0gY2F0Y2ggKERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAiSW52YWxpZCBlbWJlZGRlZCBkZXNjcmlwdG9yIGZvciBcIiIgKyBwcm90by5nZXROYW1lKCkgKyAiXCIuIiwgZSk7CisgICAgICB9CisKKyAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0KKyAgICAgICAgICBkZXNjcmlwdG9yQXNzaWduZXIuYXNzaWduRGVzY3JpcHRvcnMocmVzdWx0KTsKKworICAgICAgaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsKKyAgICAgICAgLy8gV2UgbXVzdCByZS1wYXJzZSB0aGUgcHJvdG8gdXNpbmcgdGhlIHJlZ2lzdHJ5LgorICAgICAgICB0cnkgeworICAgICAgICAgIHByb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5wYXJzZUZyb20oZGVzY3JpcHRvckJ5dGVzLCByZWdpc3RyeSk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJGYWlsZWQgdG8gcGFyc2UgcHJvdG9jb2wgYnVmZmVyIGRlc2NyaXB0b3IgZm9yIGdlbmVyYXRlZCBjb2RlLiIsCisgICAgICAgICAgICBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdC5zZXRQcm90byhwcm90byk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiAgV2hlbiBjYWxsaW5nCisgICAgICoge0BsaW5rIEZpbGVEZXNjcmlwdG9yI2ludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbX0sIHRoZSBjYWxsZXIKKyAgICAgKiBwcm92aWRlcyBhIGNhbGxiYWNrIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZS4gIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQKKyAgICAgKiBhZnRlciB0aGUgRmlsZURlc2NyaXB0b3IgaGFzIGJlZW4gY29uc3RydWN0ZWQsIGluIG9yZGVyIHRvIGFzc2lnbiBhbGwKKyAgICAgKiB0aGUgZ2xvYmFsIHZhcmlhbGVzIGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIHdoaWNoIHBvaW50IGF0IHBhcnRzCisgICAgICogb2YgdGhlIEZpbGVEZXNjcmlwdG9yLiAgVGhlIGNhbGxiYWNrIHJldHVybnMgYW4gRXh0ZW5zaW9uUmVnaXN0cnkgd2hpY2gKKyAgICAgKiBjb250YWlucyBhbnkgZXh0ZW5zaW9ucyB3aGljaCBtaWdodCBiZSB1c2VkIGluIHRoZSBkZXNjcmlwdG9yIC0tIHRoYXQKKyAgICAgKiBpcywgZXh0ZW5zaW9ucyBvZiB0aGUgdmFyaW91cyAiT3B0aW9ucyIgbWVzc2FnZXMgZGVmaW5lZCBpbgorICAgICAqIGRlc2NyaXB0b3IucHJvdG8uICBUaGUgY2FsbGJhY2sgbWF5IGFsc28gcmV0dXJuIG51bGwgdG8gaW5kaWNhdGUgdGhhdAorICAgICAqIG5vIGV4dGVuc2lvbnMgYXJlIHVzZWQgaW4gdGhlIGRlY3NyaXB0b3IuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBJbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciB7CisgICAgICBFeHRlbnNpb25SZWdpc3RyeSBhc3NpZ25EZXNjcmlwdG9ycyhGaWxlRGVzY3JpcHRvciByb290KTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yW10gbWVzc2FnZVR5cGVzOworICAgIHByaXZhdGUgZmluYWwgRW51bURlc2NyaXB0b3JbXSBlbnVtVHlwZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlRGVzY3JpcHRvcltdIHNlcnZpY2VzOworICAgIHByaXZhdGUgZmluYWwgRmllbGREZXNjcmlwdG9yW10gZXh0ZW5zaW9uczsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVEZXNjcmlwdG9yW10gZGVwZW5kZW5jaWVzOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvclBvb2wgcG9vbDsKKworICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3IoZmluYWwgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yW10gZGVwZW5kZW5jaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGVzY3JpcHRvclBvb2wgcG9vbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMucG9vbCA9IHBvb2w7CisgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5jbG9uZSgpOworCisgICAgICBwb29sLmFkZFBhY2thZ2UoZ2V0UGFja2FnZSgpLCB0aGlzKTsKKworICAgICAgbWVzc2FnZVR5cGVzID0gbmV3IERlc2NyaXB0b3JbcHJvdG8uZ2V0TWVzc2FnZVR5cGVDb3VudCgpXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0TWVzc2FnZVR5cGVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgbWVzc2FnZVR5cGVzW2ldID0KKyAgICAgICAgICBuZXcgRGVzY3JpcHRvcihwcm90by5nZXRNZXNzYWdlVHlwZShpKSwgdGhpcywgbnVsbCwgaSk7CisgICAgICB9CisKKyAgICAgIGVudW1UeXBlcyA9IG5ldyBFbnVtRGVzY3JpcHRvcltwcm90by5nZXRFbnVtVHlwZUNvdW50KCldOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRFbnVtVHlwZUNvdW50KCk7IGkrKykgeworICAgICAgICBlbnVtVHlwZXNbaV0gPSBuZXcgRW51bURlc2NyaXB0b3IocHJvdG8uZ2V0RW51bVR5cGUoaSksIHRoaXMsIG51bGwsIGkpOworICAgICAgfQorCisgICAgICBzZXJ2aWNlcyA9IG5ldyBTZXJ2aWNlRGVzY3JpcHRvcltwcm90by5nZXRTZXJ2aWNlQ291bnQoKV07CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldFNlcnZpY2VDb3VudCgpOyBpKyspIHsKKyAgICAgICAgc2VydmljZXNbaV0gPSBuZXcgU2VydmljZURlc2NyaXB0b3IocHJvdG8uZ2V0U2VydmljZShpKSwgdGhpcywgaSk7CisgICAgICB9CisKKyAgICAgIGV4dGVuc2lvbnMgPSBuZXcgRmllbGREZXNjcmlwdG9yW3Byb3RvLmdldEV4dGVuc2lvbkNvdW50KCldOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRFeHRlbnNpb25Db3VudCgpOyBpKyspIHsKKyAgICAgICAgZXh0ZW5zaW9uc1tpXSA9IG5ldyBGaWVsZERlc2NyaXB0b3IoCisgICAgICAgICAgcHJvdG8uZ2V0RXh0ZW5zaW9uKGkpLCB0aGlzLCBudWxsLCBpLCB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogTG9vayB1cCBhbmQgY3Jvc3MtbGluayBhbGwgZmllbGQgdHlwZXMsIGV0Yy4gKi8KKyAgICBwcml2YXRlIHZvaWQgY3Jvc3NMaW5rKCkgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoZmluYWwgRGVzY3JpcHRvciBtZXNzYWdlVHlwZSA6IG1lc3NhZ2VUeXBlcykgeworICAgICAgICBtZXNzYWdlVHlwZS5jcm9zc0xpbmsoKTsKKyAgICAgIH0KKworICAgICAgZm9yIChmaW5hbCBTZXJ2aWNlRGVzY3JpcHRvciBzZXJ2aWNlIDogc2VydmljZXMpIHsKKyAgICAgICAgc2VydmljZS5jcm9zc0xpbmsoKTsKKyAgICAgIH0KKworICAgICAgZm9yIChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZXh0ZW5zaW9uIDogZXh0ZW5zaW9ucykgeworICAgICAgICBleHRlbnNpb24uY3Jvc3NMaW5rKCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSBvdXIge0BsaW5rIEZpbGVEZXNjcmlwdG9yUHJvdG99IHdpdGggdGhlIGdpdmVuIG9uZSwgd2hpY2ggaXMKKyAgICAgKiBpZGVudGljYWwgZXhjZXB0IHRoYXQgaXQgbWlnaHQgY29udGFpbiBleHRlbnNpb25zIHRoYXQgd2VyZW4ndCBwcmVzZW50CisgICAgICogaW4gdGhlIG9yaWdpbmFsLiAgVGhpcyBtZXRob2QgaXMgbmVlZGVkIGZvciBib290c3RyYXBwaW5nIHdoZW4gYSBmaWxlCisgICAgICogZGVmaW5lcyBjdXN0b20gb3B0aW9ucy4gIFRoZSBvcHRpb25zIG1heSBiZSBkZWZpbmVkIGluIHRoZSBmaWxlIGl0c2VsZiwKKyAgICAgKiBzbyB3ZSBjYW4ndCBhY3R1YWxseSBwYXJzZSB0aGVtIHVudGlsIHdlJ3ZlIGNvbnN0cnVjdGVkIHRoZSBkZXNjcmlwdG9ycywKKyAgICAgKiBidXQgdG8gY29uc3RydWN0IHRoZSBkZWNzcmlwdG9ycyB3ZSBoYXZlIHRvIGhhdmUgcGFyc2VkIHRoZSBkZXNjcmlwdG9yCisgICAgICogcHJvdG9zLiAgU28sIHdlIGhhdmUgdG8gcGFyc2UgdGhlIGRlc2NyaXB0b3IgcHJvdG9zIGEgc2Vjb25kIHRpbWUgYWZ0ZXIKKyAgICAgKiBjb25zdHJ1Y3RpbmcgdGhlIGRlc2NyaXB0b3JzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRQcm90byhmaW5hbCBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvKSB7CisgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIG1lc3NhZ2VUeXBlc1tpXS5zZXRQcm90byhwcm90by5nZXRNZXNzYWdlVHlwZShpKSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGVudW1UeXBlc1tpXS5zZXRQcm90byhwcm90by5nZXRFbnVtVHlwZShpKSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgc2VydmljZXNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0U2VydmljZShpKSk7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICBleHRlbnNpb25zW2ldLnNldFByb3RvKHByb3RvLmdldEV4dGVuc2lvbihpKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKiogRGVzY3JpYmVzIGEgbWVzc2FnZSB0eXBlLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERlc2NyaXB0b3IgaW1wbGVtZW50cyBHZW5lcmljRGVzY3JpcHRvciB7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIGl0cyBwYXJlbnQuICBJbiBvdGhlciB3b3JkcywKKyAgICAgKiBnaXZlbiBhIHtAbGluayBGaWxlRGVzY3JpcHRvcn0ge0Bjb2RlIGZpbGV9LCB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisgICAgICogPHByZT4KKyAgICAgKiAgIGZvciBhbGwgaSBpbiBbMCwgZmlsZS5nZXRNZXNzYWdlVHlwZUNvdW50KCkpOgorICAgICAqICAgICBmaWxlLmdldE1lc3NhZ2VUeXBlKGkpLmdldEluZGV4KCkgPT0gaQorICAgICAqIDwvcHJlPgorICAgICAqIFNpbWlsYXJseSwgZm9yIGEge0BsaW5rIERlc2NyaXB0b3J9IHtAY29kZSBtZXNzYWdlVHlwZX06CisgICAgICogPHByZT4KKyAgICAgKiAgIGZvciBhbGwgaSBpbiBbMCwgbWVzc2FnZVR5cGUuZ2V0TmVzdGVkVHlwZUNvdW50KCkpOgorICAgICAqICAgICBtZXNzYWdlVHlwZS5nZXROZXN0ZWRUeXBlKGkpLmdldEluZGV4KCkgPT0gaQorICAgICAqIDwvcHJlPgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7IHJldHVybiBpbmRleDsgfQorCisgICAgLyoqIENvbnZlcnQgdGhlIGRlc2NyaXB0b3IgdG8gaXRzIHByb3RvY29sIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uICovCisgICAgcHVibGljIERlc2NyaXB0b3JQcm90byB0b1Byb3RvKCkgeyByZXR1cm4gcHJvdG87IH0KKworICAgIC8qKiBHZXQgdGhlIHR5cGUncyB1bnF1YWxpZmllZCBuYW1lLiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIHByb3RvLmdldE5hbWUoKTsgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0eXBlJ3MgZnVsbHktcXVhbGlmaWVkIG5hbWUsIHdpdGhpbiB0aGUgcHJvdG8gbGFuZ3VhZ2UncworICAgICAqIG5hbWVzcGFjZS4gIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBKYXZhIG5hbWUuICBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhpcworICAgICAqIHtAY29kZSAucHJvdG99OgorICAgICAqIDxwcmU+CisgICAgICogICBwYWNrYWdlIGZvby5iYXI7CisgICAgICogICBvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5leGFtcGxlLnByb3RvcyIKKyAgICAgKiAgIG1lc3NhZ2UgQmF6IHt9CisgICAgICogPC9wcmU+CisgICAgICoge0Bjb2RlIEJhen0ncyBmdWxsIG5hbWUgaXMgImZvby5iYXIuQmF6Ii4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgeyByZXR1cm4gZnVsbE5hbWU7IH0KKworICAgIC8qKiBHZXQgdGhlIHtAbGluayBGaWxlRGVzY3JpcHRvcn0gY29udGFpbmluZyB0aGlzIGRlc2NyaXB0b3IuICovCisgICAgcHVibGljIEZpbGVEZXNjcmlwdG9yIGdldEZpbGUoKSB7IHJldHVybiBmaWxlOyB9CisKKyAgICAvKiogSWYgdGhpcyBpcyBhIG5lc3RlZCB0eXBlLCBnZXQgdGhlIG91dGVyIGRlc2NyaXB0b3IsIG90aGVyd2lzZSBudWxsLiAqLworICAgIHB1YmxpYyBEZXNjcmlwdG9yIGdldENvbnRhaW5pbmdUeXBlKCkgeyByZXR1cm4gY29udGFpbmluZ1R5cGU7IH0KKworICAgIC8qKiBHZXQgdGhlIHtAY29kZSBNZXNzYWdlT3B0aW9uc30sIGRlZmluZWQgaW4ge0Bjb2RlIGRlc2NyaXB0b3IucHJvdG99LiAqLworICAgIHB1YmxpYyBNZXNzYWdlT3B0aW9ucyBnZXRPcHRpb25zKCkgeyByZXR1cm4gcHJvdG8uZ2V0T3B0aW9ucygpOyB9CisKKyAgICAvKiogR2V0IGEgbGlzdCBvZiB0aGlzIG1lc3NhZ2UgdHlwZSdzIGZpZWxkcy4gKi8KKyAgICBwdWJsaWMgTGlzdDxGaWVsZERlc2NyaXB0b3I+IGdldEZpZWxkcygpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoZmllbGRzKSk7CisgICAgfQorCisgICAgLyoqIEdldCBhIGxpc3Qgb2YgdGhpcyBtZXNzYWdlIHR5cGUncyBleHRlbnNpb25zLiAqLworICAgIHB1YmxpYyBMaXN0PEZpZWxkRGVzY3JpcHRvcj4gZ2V0RXh0ZW5zaW9ucygpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoZXh0ZW5zaW9ucykpOworICAgIH0KKworICAgIC8qKiBHZXQgYSBsaXN0IG9mIG1lc3NhZ2UgdHlwZXMgbmVzdGVkIHdpdGhpbiB0aGlzIG9uZS4gKi8KKyAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdG9yPiBnZXROZXN0ZWRUeXBlcygpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QobmVzdGVkVHlwZXMpKTsKKyAgICB9CisKKyAgICAvKiogR2V0IGEgbGlzdCBvZiBlbnVtIHR5cGVzIG5lc3RlZCB3aXRoaW4gdGhpcyBvbmUuICovCisgICAgcHVibGljIExpc3Q8RW51bURlc2NyaXB0b3I+IGdldEVudW1UeXBlcygpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoZW51bVR5cGVzKSk7CisgICAgfQorCisgICAgLyoqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGZpZWxkIG51bWJlciBpcyBhbiBleHRlbnNpb24uICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb25OdW1iZXIoZmluYWwgaW50IG51bWJlcikgeworICAgICAgZm9yIChmaW5hbCBEZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgcmFuZ2UgOgorICAgICAgICAgIHByb3RvLmdldEV4dGVuc2lvblJhbmdlTGlzdCgpKSB7CisgICAgICAgIGlmIChyYW5nZS5nZXRTdGFydCgpIDw9IG51bWJlciAmJiBudW1iZXIgPCByYW5nZS5nZXRFbmQoKSkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSBmaWVsZCBieSBuYW1lLgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSBmaWVsZCAoZS5nLiAiZm9vIikuCisgICAgICogQHJldHVybiBUaGUgZmllbGQncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZmluZEZpZWxkQnlOYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPQorICAgICAgICAgIGZpbGUucG9vbC5maW5kU3ltYm9sKGZ1bGxOYW1lICsgJy4nICsgbmFtZSk7CisgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgRmllbGREZXNjcmlwdG9yKSB7CisgICAgICAgIHJldHVybiAoRmllbGREZXNjcmlwdG9yKXJlc3VsdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgZmllbGQgYnkgZmllbGQgbnVtYmVyLgorICAgICAqIEBwYXJhbSBudW1iZXIgVGhlIGZpZWxkIG51bWJlciB3aXRoaW4gdGhpcyBtZXNzYWdlIHR5cGUuCisgICAgICogQHJldHVybiBUaGUgZmllbGQncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZmluZEZpZWxkQnlOdW1iZXIoZmluYWwgaW50IG51bWJlcikgeworICAgICAgcmV0dXJuIGZpbGUucG9vbC5maWVsZHNCeU51bWJlci5nZXQoCisgICAgICAgIG5ldyBEZXNjcmlwdG9yUG9vbC5EZXNjcmlwdG9ySW50UGFpcih0aGlzLCBudW1iZXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIG5lc3RlZCBtZXNzYWdlIHR5cGUgYnkgbmFtZS4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgbmVzdGVkIHR5cGUgKGUuZy4gIkZvbyIpLgorICAgICAqIEByZXR1cm4gVGhlIHR5cGVzJ3MgZGVzY3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVzY3JpcHRvciBmaW5kTmVzdGVkVHlwZUJ5TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0KKyAgICAgICAgICBmaWxlLnBvb2wuZmluZFN5bWJvbChmdWxsTmFtZSArICcuJyArIG5hbWUpOworICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKKyAgICAgICAgcmV0dXJuIChEZXNjcmlwdG9yKXJlc3VsdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgbmVzdGVkIGVudW0gdHlwZSBieSBuYW1lLgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSBuZXN0ZWQgdHlwZSAoZS5nLiAiRm9vIikuCisgICAgICogQHJldHVybiBUaGUgdHlwZXMncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBFbnVtRGVzY3JpcHRvciBmaW5kRW51bVR5cGVCeU5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9CisgICAgICAgICAgZmlsZS5wb29sLmZpbmRTeW1ib2woZnVsbE5hbWUgKyAnLicgKyBuYW1lKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBFbnVtRGVzY3JpcHRvcikgeworICAgICAgICByZXR1cm4gKEVudW1EZXNjcmlwdG9yKXJlc3VsdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OworICAgIHByaXZhdGUgRGVzY3JpcHRvclByb3RvIHByb3RvOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGxOYW1lOworICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZTsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgY29udGFpbmluZ1R5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yW10gbmVzdGVkVHlwZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBFbnVtRGVzY3JpcHRvcltdIGVudW1UeXBlczsKKyAgICBwcml2YXRlIGZpbmFsIEZpZWxkRGVzY3JpcHRvcltdIGZpZWxkczsKKyAgICBwcml2YXRlIGZpbmFsIEZpZWxkRGVzY3JpcHRvcltdIGV4dGVuc2lvbnM7CisKKyAgICBwcml2YXRlIERlc2NyaXB0b3IoZmluYWwgRGVzY3JpcHRvclByb3RvIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZXNjcmlwdG9yIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KQorICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICBmdWxsTmFtZSA9IGNvbXB1dGVGdWxsTmFtZShmaWxlLCBwYXJlbnQsIHByb3RvLmdldE5hbWUoKSk7CisgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgY29udGFpbmluZ1R5cGUgPSBwYXJlbnQ7CisKKyAgICAgIG5lc3RlZFR5cGVzID0gbmV3IERlc2NyaXB0b3JbcHJvdG8uZ2V0TmVzdGVkVHlwZUNvdW50KCldOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXROZXN0ZWRUeXBlQ291bnQoKTsgaSsrKSB7CisgICAgICAgIG5lc3RlZFR5cGVzW2ldID0gbmV3IERlc2NyaXB0b3IoCisgICAgICAgICAgcHJvdG8uZ2V0TmVzdGVkVHlwZShpKSwgZmlsZSwgdGhpcywgaSk7CisgICAgICB9CisKKyAgICAgIGVudW1UeXBlcyA9IG5ldyBFbnVtRGVzY3JpcHRvcltwcm90by5nZXRFbnVtVHlwZUNvdW50KCldOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRFbnVtVHlwZUNvdW50KCk7IGkrKykgeworICAgICAgICBlbnVtVHlwZXNbaV0gPSBuZXcgRW51bURlc2NyaXB0b3IoCisgICAgICAgICAgcHJvdG8uZ2V0RW51bVR5cGUoaSksIGZpbGUsIHRoaXMsIGkpOworICAgICAgfQorCisgICAgICBmaWVsZHMgPSBuZXcgRmllbGREZXNjcmlwdG9yW3Byb3RvLmdldEZpZWxkQ291bnQoKV07CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldEZpZWxkQ291bnQoKTsgaSsrKSB7CisgICAgICAgIGZpZWxkc1tpXSA9IG5ldyBGaWVsZERlc2NyaXB0b3IoCisgICAgICAgICAgcHJvdG8uZ2V0RmllbGQoaSksIGZpbGUsIHRoaXMsIGksIGZhbHNlKTsKKyAgICAgIH0KKworICAgICAgZXh0ZW5zaW9ucyA9IG5ldyBGaWVsZERlc2NyaXB0b3JbcHJvdG8uZ2V0RXh0ZW5zaW9uQ291bnQoKV07CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldEV4dGVuc2lvbkNvdW50KCk7IGkrKykgeworICAgICAgICBleHRlbnNpb25zW2ldID0gbmV3IEZpZWxkRGVzY3JpcHRvcigKKyAgICAgICAgICBwcm90by5nZXRFeHRlbnNpb24oaSksIGZpbGUsIHRoaXMsIGksIHRydWUpOworICAgICAgfQorCisgICAgICBmaWxlLnBvb2wuYWRkU3ltYm9sKHRoaXMpOworICAgIH0KKworICAgIC8qKiBMb29rIHVwIGFuZCBjcm9zcy1saW5rIGFsbCBmaWVsZCB0eXBlcywgZXRjLiAqLworICAgIHByaXZhdGUgdm9pZCBjcm9zc0xpbmsoKSB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgZm9yIChmaW5hbCBEZXNjcmlwdG9yIG5lc3RlZFR5cGUgOiBuZXN0ZWRUeXBlcykgeworICAgICAgICBuZXN0ZWRUeXBlLmNyb3NzTGluaygpOworICAgICAgfQorCisgICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IGZpZWxkcykgeworICAgICAgICBmaWVsZC5jcm9zc0xpbmsoKTsKKyAgICAgIH0KKworICAgICAgZm9yIChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZXh0ZW5zaW9uIDogZXh0ZW5zaW9ucykgeworICAgICAgICBleHRlbnNpb24uY3Jvc3NMaW5rKCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqIFNlZSB7QGxpbmsgRmlsZURlc2NyaXB0b3Ijc2V0UHJvdG99LiAqLworICAgIHByaXZhdGUgdm9pZCBzZXRQcm90byhmaW5hbCBEZXNjcmlwdG9yUHJvdG8gcHJvdG8pIHsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICBuZXN0ZWRUeXBlc1tpXS5zZXRQcm90byhwcm90by5nZXROZXN0ZWRUeXBlKGkpKTsKKyAgICAgIH0KKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZW51bVR5cGVzW2ldLnNldFByb3RvKHByb3RvLmdldEVudW1UeXBlKGkpKTsKKyAgICAgIH0KKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZmllbGRzW2ldLnNldFByb3RvKHByb3RvLmdldEZpZWxkKGkpKTsKKyAgICAgIH0KKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGV4dGVuc2lvbnNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0RXh0ZW5zaW9uKGkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8qKiBEZXNjcmliZXMgYSBmaWVsZCBvZiBhIG1lc3NhZ2UgdHlwZS4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGaWVsZERlc2NyaXB0b3IKKyAgICAgIGltcGxlbWVudHMgR2VuZXJpY0Rlc2NyaXB0b3IsIENvbXBhcmFibGU8RmllbGREZXNjcmlwdG9yPiwKKyAgICAgICAgICAgICAgICAgRmllbGRTZXQuRmllbGREZXNjcmlwdG9yTGl0ZTxGaWVsZERlc2NyaXB0b3I+IHsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGluZGV4IG9mIHRoaXMgZGVzY3JpcHRvciB3aXRoaW4gaXRzIHBhcmVudC4KKyAgICAgKiBAc2VlIERlc2NyaXB0b3IjZ2V0SW5kZXgoKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7IHJldHVybiBpbmRleDsgfQorCisgICAgLyoqIENvbnZlcnQgdGhlIGRlc2NyaXB0b3IgdG8gaXRzIHByb3RvY29sIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uICovCisgICAgcHVibGljIEZpZWxkRGVzY3JpcHRvclByb3RvIHRvUHJvdG8oKSB7IHJldHVybiBwcm90bzsgfQorCisgICAgLyoqIEdldCB0aGUgZmllbGQncyB1bnF1YWxpZmllZCBuYW1lLiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIHByb3RvLmdldE5hbWUoKTsgfQorCisgICAgLyoqIEdldCB0aGUgZmllbGQncyBudW1iZXIuICovCisgICAgcHVibGljIGludCBnZXROdW1iZXIoKSB7IHJldHVybiBwcm90by5nZXROdW1iZXIoKTsgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmaWVsZCdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgorICAgICAqIEBzZWUgRGVzY3JpcHRvciNnZXRGdWxsTmFtZSgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsgcmV0dXJuIGZ1bGxOYW1lOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZpZWxkJ3MgamF2YSB0eXBlLiAgVGhpcyBpcyBqdXN0IGZvciBjb252ZW5pZW5jZS4gIEV2ZXJ5CisgICAgICoge0Bjb2RlIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGV9IG1hcHMgdG8gZXhhY3RseSBvbmUgSmF2YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBKYXZhVHlwZSBnZXRKYXZhVHlwZSgpIHsgcmV0dXJuIHR5cGUuZ2V0SmF2YVR5cGUoKTsgfQorCisgICAgLyoqIEZvciBpbnRlcm5hbCB1c2Ugb25seS4gKi8KKyAgICBwdWJsaWMgV2lyZUZvcm1hdC5KYXZhVHlwZSBnZXRMaXRlSmF2YVR5cGUoKSB7CisgICAgICByZXR1cm4gZ2V0TGl0ZVR5cGUoKS5nZXRKYXZhVHlwZSgpOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIHtAY29kZSBGaWxlRGVzY3JpcHRvcn0gY29udGFpbmluZyB0aGlzIGRlc2NyaXB0b3IuICovCisgICAgcHVibGljIEZpbGVEZXNjcmlwdG9yIGdldEZpbGUoKSB7IHJldHVybiBmaWxlOyB9CisKKyAgICAvKiogR2V0IHRoZSBmaWVsZCdzIGRlY2xhcmVkIHR5cGUuICovCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsgcmV0dXJuIHR5cGU7IH0KKworICAgIC8qKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuICovCisgICAgcHVibGljIFdpcmVGb3JtYXQuRmllbGRUeXBlIGdldExpdGVUeXBlKCkgeworICAgICAgcmV0dXJuIHRhYmxlW3R5cGUub3JkaW5hbCgpXTsKKyAgICB9CisgICAgLy8gSSdtIHByZXR0eSBzdXJlIHZhbHVlcygpIGNvbnN0cnVjdHMgYSBuZXcgYXJyYXkgZXZlcnkgdGltZSwgc2luY2UgdGhlcmUKKyAgICAvLyBpcyBub3RoaW5nIHN0b3BwaW5nIHRoZSBjYWxsZXIgZnJvbSBtdXRhdGluZyB0aGUgYXJyYXkuICBUaGVyZWZvcmUgd2UKKyAgICAvLyBtYWtlIGEgc3RhdGljIGNvcHkgaGVyZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXaXJlRm9ybWF0LkZpZWxkVHlwZVtdIHRhYmxlID0KKyAgICAgICAgV2lyZUZvcm1hdC5GaWVsZFR5cGUudmFsdWVzKCk7CisKKyAgICAvKiogSXMgdGhpcyBmaWVsZCBkZWNsYXJlZCByZXF1aXJlZD8gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgeworICAgICAgcmV0dXJuIHByb3RvLmdldExhYmVsKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwuTEFCRUxfUkVRVUlSRUQ7CisgICAgfQorCisgICAgLyoqIElzIHRoaXMgZmllbGQgZGVjbGFyZWQgb3B0aW9uYWw/ICovCisgICAgcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsKKyAgICAgIHJldHVybiBwcm90by5nZXRMYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsLkxBQkVMX09QVElPTkFMOworICAgIH0KKworICAgIC8qKiBJcyB0aGlzIGZpZWxkIGRlY2xhcmVkIHJlcGVhdGVkPyAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVwZWF0ZWQoKSB7CisgICAgICByZXR1cm4gcHJvdG8uZ2V0TGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC5MQUJFTF9SRVBFQVRFRDsKKyAgICB9CisKKyAgICAvKiogRG9lcyB0aGlzIGZpZWxkIGhhdmUgdGhlIHtAY29kZSBbcGFja2VkID0gdHJ1ZV19IG9wdGlvbj8gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2tlZCgpIHsKKyAgICAgIHJldHVybiBnZXRPcHRpb25zKCkuZ2V0UGFja2VkKCk7CisgICAgfQorCisgICAgLyoqIENhbiB0aGlzIGZpZWxkIGJlIHBhY2tlZD8gaS5lLiBpcyBpdCBhIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZD8gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgeworICAgICAgcmV0dXJuIGlzUmVwZWF0ZWQoKSAmJiBnZXRMaXRlVHlwZSgpLmlzUGFja2FibGUoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBoYWQgYW4gZXhwbGljaXRseS1kZWZpbmVkIGRlZmF1bHQgdmFsdWUuICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGVmYXVsdFZhbHVlKCkgeyByZXR1cm4gcHJvdG8uaGFzRGVmYXVsdFZhbHVlKCk7IH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpZWxkJ3MgZGVmYXVsdCB2YWx1ZS4gIFZhbGlkIGZvciBhbGwgdHlwZXMgZXhjZXB0IGZvcgorICAgICAqIG1lc3NhZ2VzIGFuZCBncm91cHMuICBGb3IgYWxsIG90aGVyIHR5cGVzLCB0aGUgb2JqZWN0IHJldHVybmVkIGlzIG9mCisgICAgICogdGhlIHNhbWUgY2xhc3MgdGhhdCB3b3VsZCByZXR1cm5lZCBieSBNZXNzYWdlLmdldEZpZWxkKHRoaXMpLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKCkgeworICAgICAgaWYgKGdldEphdmFUeXBlKCkgPT0gSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIkZpZWxkRGVzY3JpcHRvci5nZXREZWZhdWx0VmFsdWUoKSBjYWxsZWQgb24gYW4gZW1iZWRkZWQgbWVzc2FnZSAiICsKKyAgICAgICAgICAiZmllbGQuIik7CisgICAgICB9CisgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIHtAY29kZSBGaWVsZE9wdGlvbnN9LCBkZWZpbmVkIGluIHtAY29kZSBkZXNjcmlwdG9yLnByb3RvfS4gKi8KKyAgICBwdWJsaWMgRmllbGRPcHRpb25zIGdldE9wdGlvbnMoKSB7IHJldHVybiBwcm90by5nZXRPcHRpb25zKCk7IH0KKworICAgIC8qKiBJcyB0aGlzIGZpZWxkIGFuIGV4dGVuc2lvbj8gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVuc2lvbigpIHsgcmV0dXJuIHByb3RvLmhhc0V4dGVuZGVlKCk7IH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmllbGQncyBjb250YWluaW5nIHR5cGUuIEZvciBleHRlbnNpb25zLCB0aGlzIGlzIHRoZSB0eXBlIGJlaW5nCisgICAgICogZXh0ZW5kZWQsIG5vdCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGV4dGVuc2lvbiB3YXMgZGVmaW5lZC4gIFNlZQorICAgICAqIHtAbGluayAjZ2V0RXh0ZW5zaW9uU2NvcGUoKX0uCisgICAgICovCisgICAgcHVibGljIERlc2NyaXB0b3IgZ2V0Q29udGFpbmluZ1R5cGUoKSB7IHJldHVybiBjb250YWluaW5nVHlwZTsgfQorCisgICAgLyoqCisgICAgICogRm9yIGV4dGVuc2lvbnMgZGVmaW5lZCBuZXN0ZWQgd2l0aGluIG1lc3NhZ2UgdHlwZXMsIGdldHMgdGhlIG91dGVyCisgICAgICogdHlwZS4gIE5vdCB2YWxpZCBmb3Igbm9uLWV4dGVuc2lvbiBmaWVsZHMuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIKKyAgICAgKiB0aGlzIHtAY29kZSAucHJvdG99IGZpbGU6CisgICAgICogPHByZT4KKyAgICAgKiAgIG1lc3NhZ2UgRm9vIHsKKyAgICAgKiAgICAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKKyAgICAgKiAgIH0KKyAgICAgKiAgIGV4dGVuZCBGb28geworICAgICAqICAgICBvcHRpb25hbCBpbnQzMiBiYXogPSAxMjM0OworICAgICAqICAgfQorICAgICAqICAgbWVzc2FnZSBCYXIgeworICAgICAqICAgICBleHRlbmQgRm9vIHsKKyAgICAgKiAgICAgICBvcHRpb25hbCBpbnQzMiBxdXggPSA0MzIxOworICAgICAqICAgICB9CisgICAgICogICB9CisgICAgICogPC9wcmU+CisgICAgICogQm90aCB7QGNvZGUgYmF6fSdzIGFuZCB7QGNvZGUgcXV4fSdzIGNvbnRhaW5pbmcgdHlwZSBpcyB7QGNvZGUgRm9vfS4KKyAgICAgKiBIb3dldmVyLCB7QGNvZGUgYmF6fSdzIGV4dGVuc2lvbiBzY29wZSBpcyB7QGNvZGUgbnVsbH0gd2hpbGUKKyAgICAgKiB7QGNvZGUgcXV4fSdzIGV4dGVuc2lvbiBzY29wZSBpcyB7QGNvZGUgQmFyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRFeHRlbnNpb25TY29wZSgpIHsKKyAgICAgIGlmICghaXNFeHRlbnNpb24oKSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIlRoaXMgZmllbGQgaXMgbm90IGFuIGV4dGVuc2lvbi4iKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBleHRlbnNpb25TY29wZTsKKyAgICB9CisKKyAgICAvKiogRm9yIGVtYmVkZGVkIG1lc3NhZ2UgYW5kIGdyb3VwIGZpZWxkcywgZ2V0cyB0aGUgZmllbGQncyB0eXBlLiAqLworICAgIHB1YmxpYyBEZXNjcmlwdG9yIGdldE1lc3NhZ2VUeXBlKCkgeworICAgICAgaWYgKGdldEphdmFUeXBlKCkgIT0gSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIlRoaXMgZmllbGQgaXMgbm90IG9mIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtZXNzYWdlVHlwZTsKKyAgICB9CisKKyAgICAvKiogRm9yIGVudW0gZmllbGRzLCBnZXRzIHRoZSBmaWVsZCdzIHR5cGUuICovCisgICAgcHVibGljIEVudW1EZXNjcmlwdG9yIGdldEVudW1UeXBlKCkgeworICAgICAgaWYgKGdldEphdmFUeXBlKCkgIT0gSmF2YVR5cGUuRU5VTSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIlRoaXMgZmllbGQgaXMgbm90IG9mIGVudW0gdHlwZS4iKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBlbnVtVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHdpdGggYW5vdGhlciB7QGNvZGUgRmllbGREZXNjcmlwdG9yfS4gIFRoaXMgb3JkZXJzIGZpZWxkcyBpbgorICAgICAqICJjYW5vbmljYWwiIG9yZGVyLCB3aGljaCBzaW1wbHkgbWVhbnMgYXNjZW5kaW5nIG9yZGVyIGJ5IGZpZWxkIG51bWJlci4KKyAgICAgKiB7QGNvZGUgb3RoZXJ9IG11c3QgYmUgYSBmaWVsZCBvZiB0aGUgc2FtZSB0eXBlIC0tIGkuZS4KKyAgICAgKiB7QGNvZGUgZ2V0Q29udGFpbmluZ1R5cGUoKX0gbXVzdCByZXR1cm4gdGhlIHNhbWUge0Bjb2RlIERlc2NyaXB0b3J9IGZvcgorICAgICAqIGJvdGggZmllbGRzLgorICAgICAqCisgICAgICogQHJldHVybiBuZWdhdGl2ZSwgemVybywgb3IgcG9zaXRpdmUgaWYge0Bjb2RlIHRoaXN9IGlzIGxlc3MgdGhhbiwKKyAgICAgKiAgICAgICAgIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4ge0Bjb2RlIG90aGVyfSwgcmVzcGVjdGl2ZWx5LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBvdGhlcikgeworICAgICAgaWYgKG90aGVyLmNvbnRhaW5pbmdUeXBlICE9IGNvbnRhaW5pbmdUeXBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIkZpZWxkRGVzY3JpcHRvcnMgY2FuIG9ubHkgYmUgY29tcGFyZWQgdG8gb3RoZXIgRmllbGREZXNjcmlwdG9ycyAiICsKKyAgICAgICAgICAiZm9yIGZpZWxkcyBvZiB0aGUgc2FtZSBtZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgICByZXR1cm4gZ2V0TnVtYmVyKCkgLSBvdGhlci5nZXROdW1iZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleDsKKworICAgIHByaXZhdGUgRmllbGREZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvciBleHRlbnNpb25TY29wZTsKKworICAgIC8vIFBvc3NpYmx5IGluaXRpYWxpemVkIGR1cmluZyBjcm9zcy1saW5raW5nLgorICAgIHByaXZhdGUgVHlwZSB0eXBlOworICAgIHByaXZhdGUgRGVzY3JpcHRvciBjb250YWluaW5nVHlwZTsKKyAgICBwcml2YXRlIERlc2NyaXB0b3IgbWVzc2FnZVR5cGU7CisgICAgcHJpdmF0ZSBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZTsKKyAgICBwcml2YXRlIE9iamVjdCBkZWZhdWx0VmFsdWU7CisKKyAgICBwdWJsaWMgZW51bSBUeXBlIHsKKyAgICAgIERPVUJMRSAgKEphdmFUeXBlLkRPVUJMRSAgICAgKSwKKyAgICAgIEZMT0FUICAgKEphdmFUeXBlLkZMT0FUICAgICAgKSwKKyAgICAgIElOVDY0ICAgKEphdmFUeXBlLkxPTkcgICAgICAgKSwKKyAgICAgIFVJTlQ2NCAgKEphdmFUeXBlLkxPTkcgICAgICAgKSwKKyAgICAgIElOVDMyICAgKEphdmFUeXBlLklOVCAgICAgICAgKSwKKyAgICAgIEZJWEVENjQgKEphdmFUeXBlLkxPTkcgICAgICAgKSwKKyAgICAgIEZJWEVEMzIgKEphdmFUeXBlLklOVCAgICAgICAgKSwKKyAgICAgIEJPT0wgICAgKEphdmFUeXBlLkJPT0xFQU4gICAgKSwKKyAgICAgIFNUUklORyAgKEphdmFUeXBlLlNUUklORyAgICAgKSwKKyAgICAgIEdST1VQICAgKEphdmFUeXBlLk1FU1NBR0UgICAgKSwKKyAgICAgIE1FU1NBR0UgKEphdmFUeXBlLk1FU1NBR0UgICAgKSwKKyAgICAgIEJZVEVTICAgKEphdmFUeXBlLkJZVEVfU1RSSU5HKSwKKyAgICAgIFVJTlQzMiAgKEphdmFUeXBlLklOVCAgICAgICAgKSwKKyAgICAgIEVOVU0gICAgKEphdmFUeXBlLkVOVU0gICAgICAgKSwKKyAgICAgIFNGSVhFRDMyKEphdmFUeXBlLklOVCAgICAgICAgKSwKKyAgICAgIFNGSVhFRDY0KEphdmFUeXBlLkxPTkcgICAgICAgKSwKKyAgICAgIFNJTlQzMiAgKEphdmFUeXBlLklOVCAgICAgICAgKSwKKyAgICAgIFNJTlQ2NCAgKEphdmFUeXBlLkxPTkcgICAgICAgKTsKKworICAgICAgVHlwZShmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZSkgeworICAgICAgICB0aGlzLmphdmFUeXBlID0gamF2YVR5cGU7CisgICAgICB9CisKKyAgICAgIHByaXZhdGUgSmF2YVR5cGUgamF2YVR5cGU7CisKKyAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHRvUHJvdG8oKSB7CisgICAgICAgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlLnZhbHVlT2Yob3JkaW5hbCgpICsgMSk7CisgICAgICB9CisgICAgICBwdWJsaWMgSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKSB7IHJldHVybiBqYXZhVHlwZTsgfQorCisgICAgICBwdWJsaWMgc3RhdGljIFR5cGUgdmFsdWVPZihmaW5hbCBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlcygpW3R5cGUuZ2V0TnVtYmVyKCkgLSAxXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgeworICAgICAgLy8gUmVmdXNlIHRvIGluaXQgaWYgc29tZW9uZSBhZGRlZCBhIG5ldyBkZWNsYXJlZCB0eXBlLgorICAgICAgaWYgKFR5cGUudmFsdWVzKCkubGVuZ3RoICE9IEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUudmFsdWVzKCkubGVuZ3RoKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICJkZXNjcmlwdG9yLnByb3RvIGhhcyBhIG5ldyBkZWNsYXJlZCB0eXBlIGJ1dCBEZXNyY2lwdG9ycy5qYXZhICIgKworICAgICAgICAgICJ3YXNuJ3QgdXBkYXRlZC4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZW51bSBKYXZhVHlwZSB7CisgICAgICBJTlQoMCksCisgICAgICBMT05HKDBMKSwKKyAgICAgIEZMT0FUKDBGKSwKKyAgICAgIERPVUJMRSgwRCksCisgICAgICBCT09MRUFOKGZhbHNlKSwKKyAgICAgIFNUUklORygiIiksCisgICAgICBCWVRFX1NUUklORyhCeXRlU3RyaW5nLkVNUFRZKSwKKyAgICAgIEVOVU0obnVsbCksCisgICAgICBNRVNTQUdFKG51bGwpOworCisgICAgICBKYXZhVHlwZShmaW5hbCBPYmplY3QgZGVmYXVsdERlZmF1bHQpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0RGVmYXVsdCA9IGRlZmF1bHREZWZhdWx0OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIFRoZSBkZWZhdWx0IGRlZmF1bHQgdmFsdWUgZm9yIGZpZWxkcyBvZiB0aGlzIHR5cGUsIGlmIGl0J3MgYSBwcmltaXRpdmUKKyAgICAgICAqIHR5cGUuICBUaGlzIGlzIG1lYW50IGZvciB1c2UgaW5zaWRlIHRoaXMgZmlsZSBvbmx5LCBoZW5jZSBpcyBwcml2YXRlLgorICAgICAgICovCisgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBkZWZhdWx0RGVmYXVsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpZWxkRGVzY3JpcHRvcihmaW5hbCBGaWVsZERlc2NyaXB0b3JQcm90byBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlc2NyaXB0b3IgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICAgIGZ1bGxOYW1lID0gY29tcHV0ZUZ1bGxOYW1lKGZpbGUsIHBhcmVudCwgcHJvdG8uZ2V0TmFtZSgpKTsKKyAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisKKyAgICAgIGlmIChwcm90by5oYXNUeXBlKCkpIHsKKyAgICAgICAgdHlwZSA9IFR5cGUudmFsdWVPZihwcm90by5nZXRUeXBlKCkpOworICAgICAgfQorCisgICAgICBpZiAoZ2V0TnVtYmVyKCkgPD0gMCkgeworICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAiRmllbGQgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLiIpOworICAgICAgfQorCisgICAgICAvLyBPbmx5IHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMgbWF5IGJlIHBhY2tlZC4KKyAgICAgIGlmIChwcm90by5nZXRPcHRpb25zKCkuZ2V0UGFja2VkKCkgJiYgIWlzUGFja2FibGUoKSkgeworICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAiW3BhY2tlZCA9IHRydWVdIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgcmVwZWF0ZWQgcHJpbWl0aXZlICIgKworICAgICAgICAgICJmaWVsZHMuIik7CisgICAgICB9CisKKyAgICAgIGlmIChpc0V4dGVuc2lvbikgeworICAgICAgICBpZiAoIXByb3RvLmhhc0V4dGVuZGVlKCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBub3Qgc2V0IGZvciBleHRlbnNpb24gZmllbGQuIik7CisgICAgICAgIH0KKyAgICAgICAgY29udGFpbmluZ1R5cGUgPSBudWxsOyAgLy8gV2lsbCBiZSBmaWxsZWQgaW4gd2hlbiBjcm9zcy1saW5raW5nCisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgIGV4dGVuc2lvblNjb3BlID0gcGFyZW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGV4dGVuc2lvblNjb3BlID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHByb3RvLmhhc0V4dGVuZGVlKCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBzZXQgZm9yIG5vbi1leHRlbnNpb24gZmllbGQuIik7CisgICAgICAgIH0KKyAgICAgICAgY29udGFpbmluZ1R5cGUgPSBwYXJlbnQ7CisgICAgICAgIGV4dGVuc2lvblNjb3BlID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgZmlsZS5wb29sLmFkZFN5bWJvbCh0aGlzKTsKKyAgICB9CisKKyAgICAvKiogTG9vayB1cCBhbmQgY3Jvc3MtbGluayBhbGwgZmllbGQgdHlwZXMsIGV0Yy4gKi8KKyAgICBwcml2YXRlIHZvaWQgY3Jvc3NMaW5rKCkgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGlmIChwcm90by5oYXNFeHRlbmRlZSgpKSB7CisgICAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIGV4dGVuZGVlID0KKyAgICAgICAgICBmaWxlLnBvb2wubG9va3VwU3ltYm9sKHByb3RvLmdldEV4dGVuZGVlKCksIHRoaXMpOworICAgICAgICBpZiAoIShleHRlbmRlZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCisgICAgICAgICAgICAgICdcIicgKyBwcm90by5nZXRFeHRlbmRlZSgpICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICAgICAgfQorICAgICAgICBjb250YWluaW5nVHlwZSA9IChEZXNjcmlwdG9yKWV4dGVuZGVlOworCisgICAgICAgIGlmICghZ2V0Q29udGFpbmluZ1R5cGUoKS5pc0V4dGVuc2lvbk51bWJlcihnZXROdW1iZXIoKSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgJ1wiJyArIGdldENvbnRhaW5pbmdUeXBlKCkuZ2V0RnVsbE5hbWUoKSArCisgICAgICAgICAgICAgICJcIiBkb2VzIG5vdCBkZWNsYXJlICIgKyBnZXROdW1iZXIoKSArCisgICAgICAgICAgICAgICIgYXMgYW4gZXh0ZW5zaW9uIG51bWJlci4iKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAocHJvdG8uaGFzVHlwZU5hbWUoKSkgeworICAgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciB0eXBlRGVzY3JpcHRvciA9CisgICAgICAgICAgZmlsZS5wb29sLmxvb2t1cFN5bWJvbChwcm90by5nZXRUeXBlTmFtZSgpLCB0aGlzKTsKKworICAgICAgICBpZiAoIXByb3RvLmhhc1R5cGUoKSkgeworICAgICAgICAgIC8vIENob29zZSBmaWVsZCB0eXBlIGJhc2VkIG9uIHN5bWJvbC4KKyAgICAgICAgICBpZiAodHlwZURlc2NyaXB0b3IgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICB0eXBlID0gVHlwZS5NRVNTQUdFOworICAgICAgICAgIH0gZWxzZSBpZiAodHlwZURlc2NyaXB0b3IgaW5zdGFuY2VvZiBFbnVtRGVzY3JpcHRvcikgeworICAgICAgICAgICAgdHlwZSA9IFR5cGUuRU5VTTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCisgICAgICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldFR5cGVOYW1lKCkgKyAiXCIgaXMgbm90IGEgdHlwZS4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0SmF2YVR5cGUoKSA9PSBKYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgICAgaWYgKCEodHlwZURlc2NyaXB0b3IgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCisgICAgICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldFR5cGVOYW1lKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBtZXNzYWdlVHlwZSA9IChEZXNjcmlwdG9yKXR5cGVEZXNjcmlwdG9yOworCisgICAgICAgICAgaWYgKHByb3RvLmhhc0RlZmF1bHRWYWx1ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgIk1lc3NhZ2VzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGdldEphdmFUeXBlKCkgPT0gSmF2YVR5cGUuRU5VTSkgeworICAgICAgICAgIGlmICghKHR5cGVEZXNjcmlwdG9yIGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgICAnXCInICsgcHJvdG8uZ2V0VHlwZU5hbWUoKSArICJcIiBpcyBub3QgYW4gZW51bSB0eXBlLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbnVtVHlwZSA9IChFbnVtRGVzY3JpcHRvcil0eXBlRGVzY3JpcHRvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICJGaWVsZCB3aXRoIHByaW1pdGl2ZSB0eXBlIGhhcyB0eXBlX25hbWUuIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChnZXRKYXZhVHlwZSgpID09IEphdmFUeXBlLk1FU1NBR0UgfHwKKyAgICAgICAgICAgIGdldEphdmFUeXBlKCkgPT0gSmF2YVR5cGUuRU5VTSkgeworICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAorICAgICAgICAgICAgIkZpZWxkIHdpdGggbWVzc2FnZSBvciBlbnVtIHR5cGUgbWlzc2luZyB0eXBlX25hbWUuIik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gV2UgZG9uJ3QgYXR0ZW1wdCB0byBwYXJzZSB0aGUgZGVmYXVsdCB2YWx1ZSB1bnRpbCBoZXJlIGJlY2F1c2UgZm9yCisgICAgICAvLyBlbnVtcyB3ZSBuZWVkIHRoZSBlbnVtIHR5cGUncyBkZXNjcmlwdG9yLgorICAgICAgaWYgKHByb3RvLmhhc0RlZmF1bHRWYWx1ZSgpKSB7CisgICAgICAgIGlmIChpc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICJSZXBlYXRlZCBmaWVsZHMgY2Fubm90IGhhdmUgZGVmYXVsdCB2YWx1ZXMuIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgIHN3aXRjaCAoZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIElOVDMyOgorICAgICAgICAgICAgY2FzZSBTSU5UMzI6CisgICAgICAgICAgICBjYXNlIFNGSVhFRDMyOgorICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBUZXh0Rm9ybWF0LnBhcnNlSW50MzIocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVUlOVDMyOgorICAgICAgICAgICAgY2FzZSBGSVhFRDMyOgorICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBUZXh0Rm9ybWF0LnBhcnNlVUludDMyKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOVDY0OgorICAgICAgICAgICAgY2FzZSBTSU5UNjQ6CisgICAgICAgICAgICBjYXNlIFNGSVhFRDY0OgorICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBUZXh0Rm9ybWF0LnBhcnNlSW50NjQocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVUlOVDY0OgorICAgICAgICAgICAgY2FzZSBGSVhFRDY0OgorICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgICBpZiAocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJpbmYiKSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IEZsb2F0LlBPU0lUSVZFX0lORklOSVRZOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygiLWluZiIpKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJuYW4iKSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IEZsb2F0Lk5hTjsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBGbG9hdC52YWx1ZU9mKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgICAgICBpZiAocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCJpbmYiKSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IERvdWJsZS5QT1NJVElWRV9JTkZJTklUWTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIi1pbmYiKSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IERvdWJsZS5ORUdBVElWRV9JTkZJTklUWTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIm5hbiIpKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRG91YmxlLk5hTjsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBEb3VibGUudmFsdWVPZihwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJPT0w6CisgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IEJvb2xlYW4udmFsdWVPZihwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVFJJTkc6CisgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3RvLmdldERlZmF1bHRWYWx1ZSgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQllURVM6CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0KKyAgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQudW5lc2NhcGVCeXRlcyhwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgICAgICAgICAgIH0gY2F0Y2ggKFRleHRGb3JtYXQuSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBwYXJzZSBkZWZhdWx0IHZhbHVlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTlVNOgorICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBlbnVtVHlwZS5maW5kVmFsdWVCeU5hbWUocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgICAgICJVbmtub3duIGVudW0gZGVmYXVsdCB2YWx1ZTogXCIiICsKKyAgICAgICAgICAgICAgICAgIHByb3RvLmdldERlZmF1bHRWYWx1ZSgpICsgJ1wiJyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgICAgICBjYXNlIEdST1VQOgorICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICAgICAiTWVzc2FnZSB0eXBlIGhhZCBkZWZhdWx0IHZhbHVlLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgCisgICAgICAgICAgICAgICJDb3VsZCBub3QgcGFyc2UgZGVmYXVsdCB2YWx1ZTogXCIiICsgCisgICAgICAgICAgICAgIHByb3RvLmdldERlZmF1bHRWYWx1ZSgpICsgJ1wiJywgZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERldGVybWluZSB0aGUgZGVmYXVsdCBkZWZhdWx0IGZvciB0aGlzIGZpZWxkLgorICAgICAgICBpZiAoaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3dpdGNoIChnZXRKYXZhVHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIEVOVU06CisgICAgICAgICAgICAgIC8vIFdlIGd1YXJhbnRlZSBlbHNld2hlcmUgdGhhdCBhbiBlbnVtIHR5cGUgYWx3YXlzIGhhcyBhdCBsZWFzdAorICAgICAgICAgICAgICAvLyBvbmUgcG9zc2libGUgdmFsdWUuCisgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGVudW1UeXBlLmdldFZhbHVlcygpLmdldCgwKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG51bGw7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZ2V0SmF2YVR5cGUoKS5kZWZhdWx0RGVmYXVsdDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghaXNFeHRlbnNpb24oKSkgeworICAgICAgICBmaWxlLnBvb2wuYWRkRmllbGRCeU51bWJlcih0aGlzKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbnRhaW5pbmdUeXBlICE9IG51bGwgJiYKKyAgICAgICAgICBjb250YWluaW5nVHlwZS5nZXRPcHRpb25zKCkuZ2V0TWVzc2FnZVNldFdpcmVGb3JtYXQoKSkgeworICAgICAgICBpZiAoaXNFeHRlbnNpb24oKSkgeworICAgICAgICAgIGlmICghaXNPcHRpb25hbCgpIHx8IGdldFR5cGUoKSAhPSBUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAorICAgICAgICAgICAgICAiRXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0cyBtdXN0IGJlIG9wdGlvbmFsIG1lc3NhZ2VzLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICJNZXNzYWdlU2V0cyBjYW5ub3QgaGF2ZSBmaWVsZHMsIG9ubHkgZXh0ZW5zaW9ucy4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKiBTZWUge0BsaW5rIEZpbGVEZXNjcmlwdG9yI3NldFByb3RvfS4gKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0UHJvdG8oZmluYWwgRmllbGREZXNjcmlwdG9yUHJvdG8gcHJvdG8pIHsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBUaGlzIGlzIHRvIHNhdGlzZnkgdGhlIEZpZWxkRGVzY3JpcHRvckxpdGUKKyAgICAgKiBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgaW50ZXJuYWxNZXJnZUZyb20oCisgICAgICAgIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgdG8sIE1lc3NhZ2VMaXRlIGZyb20pIHsKKyAgICAgIC8vIEZpZWxkRGVzY3JpcHRvcnMgYXJlIG9ubHkgdXNlZCB3aXRoIG5vbi1saXRlIG1lc3NhZ2VzIHNvIHdlIGNhbiBqdXN0CisgICAgICAvLyBkb3duLWNhc3QgYW5kIGNhbGwgbWVyZ2VGcm9tIGRpcmVjdGx5LgorICAgICAgcmV0dXJuICgoTWVzc2FnZS5CdWlsZGVyKSB0bykubWVyZ2VGcm9tKChNZXNzYWdlKSBmcm9tKTsKKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8qKiBEZXNjcmliZXMgYW4gZW51bSB0eXBlLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVudW1EZXNjcmlwdG9yCisgICAgICBpbXBsZW1lbnRzIEdlbmVyaWNEZXNjcmlwdG9yLCBJbnRlcm5hbC5FbnVtTGl0ZU1hcDxFbnVtVmFsdWVEZXNjcmlwdG9yPiB7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIGl0cyBwYXJlbnQuCisgICAgICogQHNlZSBEZXNjcmlwdG9yI2dldEluZGV4KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeyByZXR1cm4gaW5kZXg7IH0KKworICAgIC8qKiBDb252ZXJ0IHRoZSBkZXNjcmlwdG9yIHRvIGl0cyBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiAqLworICAgIHB1YmxpYyBFbnVtRGVzY3JpcHRvclByb3RvIHRvUHJvdG8oKSB7IHJldHVybiBwcm90bzsgfQorCisgICAgLyoqIEdldCB0aGUgdHlwZSdzIHVucXVhbGlmaWVkIG5hbWUuICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHR5cGUncyBmdWxseS1xdWFsaWZpZWQgbmFtZS4KKyAgICAgKiBAc2VlIERlc2NyaXB0b3IjZ2V0RnVsbE5hbWUoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7IHJldHVybiBmdWxsTmFtZTsgfQorCisgICAgLyoqIEdldCB0aGUge0BsaW5rIEZpbGVEZXNjcmlwdG9yfSBjb250YWluaW5nIHRoaXMgZGVzY3JpcHRvci4gKi8KKyAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpIHsgcmV0dXJuIGZpbGU7IH0KKworICAgIC8qKiBJZiB0aGlzIGlzIGEgbmVzdGVkIHR5cGUsIGdldCB0aGUgb3V0ZXIgZGVzY3JpcHRvciwgb3RoZXJ3aXNlIG51bGwuICovCisgICAgcHVibGljIERlc2NyaXB0b3IgZ2V0Q29udGFpbmluZ1R5cGUoKSB7IHJldHVybiBjb250YWluaW5nVHlwZTsgfQorCisgICAgLyoqIEdldCB0aGUge0Bjb2RlIEVudW1PcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uICovCisgICAgcHVibGljIEVudW1PcHRpb25zIGdldE9wdGlvbnMoKSB7IHJldHVybiBwcm90by5nZXRPcHRpb25zKCk7IH0KKworICAgIC8qKiBHZXQgYSBsaXN0IG9mIGRlZmluZWQgdmFsdWVzIGZvciB0aGlzIGVudW0uICovCisgICAgcHVibGljIExpc3Q8RW51bVZhbHVlRGVzY3JpcHRvcj4gZ2V0VmFsdWVzKCkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGFuIGVudW0gdmFsdWUgYnkgbmFtZS4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgdmFsdWUgKGUuZy4gIkZPTyIpLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlJ3MgZGVjc3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bVZhbHVlRGVzY3JpcHRvciBmaW5kVmFsdWVCeU5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9CisgICAgICAgICAgZmlsZS5wb29sLmZpbmRTeW1ib2woZnVsbE5hbWUgKyAnLicgKyBuYW1lKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBFbnVtVmFsdWVEZXNjcmlwdG9yKSB7CisgICAgICAgIHJldHVybiAoRW51bVZhbHVlRGVzY3JpcHRvcilyZXN1bHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGFuIGVudW0gdmFsdWUgYnkgbnVtYmVyLiAgSWYgbXVsdGlwbGUgZW51bSB2YWx1ZXMgaGF2ZSB0aGUgc2FtZQorICAgICAqIG51bWJlciwgdGhpcyByZXR1cm5zIHRoZSBmaXJzdCBkZWZpbmVkIHZhbHVlIHdpdGggdGhhdCBudW1iZXIuCisgICAgICogQHBhcmFtIG51bWJlciBUaGUgdmFsdWUncyBudW1iZXIuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUncyBkZWNzcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBFbnVtVmFsdWVEZXNjcmlwdG9yIGZpbmRWYWx1ZUJ5TnVtYmVyKGZpbmFsIGludCBudW1iZXIpIHsKKyAgICAgIHJldHVybiBmaWxlLnBvb2wuZW51bVZhbHVlc0J5TnVtYmVyLmdldCgKKyAgICAgICAgbmV3IERlc2NyaXB0b3JQb29sLkRlc2NyaXB0b3JJbnRQYWlyKHRoaXMsIG51bWJlcikpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OworICAgIHByaXZhdGUgRW51bURlc2NyaXB0b3JQcm90byBwcm90bzsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmdWxsTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIGNvbnRhaW5pbmdUeXBlOworICAgIHByaXZhdGUgRW51bVZhbHVlRGVzY3JpcHRvcltdIHZhbHVlczsKKworICAgIHByaXZhdGUgRW51bURlc2NyaXB0b3IoZmluYWwgRW51bURlc2NyaXB0b3JQcm90byBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZXNjcmlwdG9yIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICAgIGZ1bGxOYW1lID0gY29tcHV0ZUZ1bGxOYW1lKGZpbGUsIHBhcmVudCwgcHJvdG8uZ2V0TmFtZSgpKTsKKyAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICBjb250YWluaW5nVHlwZSA9IHBhcmVudDsKKworICAgICAgaWYgKHByb3RvLmdldFZhbHVlQ291bnQoKSA9PSAwKSB7CisgICAgICAgIC8vIFdlIGNhbm5vdCBhbGxvdyBlbnVtcyB3aXRoIG5vIHZhbHVlcyBiZWNhdXNlIHRoaXMgd291bGQgbWVhbiB0aGVyZQorICAgICAgICAvLyB3b3VsZCBiZSBubyB2YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBmaWVsZHMgb2YgdGhpcyB0eXBlLgorICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAiRW51bXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSB2YWx1ZS4iKTsKKyAgICAgIH0KKworICAgICAgdmFsdWVzID0gbmV3IEVudW1WYWx1ZURlc2NyaXB0b3JbcHJvdG8uZ2V0VmFsdWVDb3VudCgpXTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0VmFsdWVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgdmFsdWVzW2ldID0gbmV3IEVudW1WYWx1ZURlc2NyaXB0b3IoCisgICAgICAgICAgcHJvdG8uZ2V0VmFsdWUoaSksIGZpbGUsIHRoaXMsIGkpOworICAgICAgfQorCisgICAgICBmaWxlLnBvb2wuYWRkU3ltYm9sKHRoaXMpOworICAgIH0KKworICAgIC8qKiBTZWUge0BsaW5rIEZpbGVEZXNjcmlwdG9yI3NldFByb3RvfS4gKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0UHJvdG8oZmluYWwgRW51bURlc2NyaXB0b3JQcm90byBwcm90bykgeworICAgICAgdGhpcy5wcm90byA9IHByb3RvOworCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YWx1ZXNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0VmFsdWUoaSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqCisgICAqIERlc2NyaWJlcyBvbmUgdmFsdWUgd2l0aGluIGFuIGVudW0gdHlwZS4gIE5vdGUgdGhhdCBtdWx0aXBsZSBkZWZpbmVkCisgICAqIHZhbHVlcyBtYXkgaGF2ZSB0aGUgc2FtZSBudW1iZXIuICBJbiBnZW5lcmF0ZWQgSmF2YSBjb2RlLCBhbGwgdmFsdWVzCisgICAqIHdpdGggdGhlIHNhbWUgbnVtYmVyIGFmdGVyIHRoZSBmaXJzdCBiZWNvbWUgYWxpYXNlcyBvZiB0aGUgZmlyc3QuCisgICAqIEhvd2V2ZXIsIHRoZXkgc3RpbGwgaGF2ZSBpbmRlcGVuZGVudCBFbnVtVmFsdWVEZXNjcmlwdG9ycy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcgorICAgICAgaW1wbGVtZW50cyBHZW5lcmljRGVzY3JpcHRvciwgSW50ZXJuYWwuRW51bUxpdGUgeworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW5kZXggb2YgdGhpcyBkZXNjcmlwdG9yIHdpdGhpbiBpdHMgcGFyZW50LgorICAgICAqIEBzZWUgRGVzY3JpcHRvciNnZXRJbmRleCgpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsgcmV0dXJuIGluZGV4OyB9CisKKyAgICAvKiogQ29udmVydCB0aGUgZGVzY3JpcHRvciB0byBpdHMgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gKi8KKyAgICBwdWJsaWMgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHRvUHJvdG8oKSB7IHJldHVybiBwcm90bzsgfQorCisgICAgLyoqIEdldCB0aGUgdmFsdWUncyB1bnF1YWxpZmllZCBuYW1lLiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIHByb3RvLmdldE5hbWUoKTsgfQorCisgICAgLyoqIEdldCB0aGUgdmFsdWUncyBudW1iZXIuICovCisgICAgcHVibGljIGludCBnZXROdW1iZXIoKSB7IHJldHVybiBwcm90by5nZXROdW1iZXIoKTsgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgorICAgICAqIEBzZWUgRGVzY3JpcHRvciNnZXRGdWxsTmFtZSgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsgcmV0dXJuIGZ1bGxOYW1lOyB9CisKKyAgICAvKiogR2V0IHRoZSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5pbmcgdGhpcyBkZXNjcmlwdG9yLiAqLworICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgeyByZXR1cm4gZmlsZTsgfQorCisgICAgLyoqIEdldCB0aGUgdmFsdWUncyBlbnVtIHR5cGUuICovCisgICAgcHVibGljIEVudW1EZXNjcmlwdG9yIGdldFR5cGUoKSB7IHJldHVybiB0eXBlOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHtAY29kZSBFbnVtVmFsdWVPcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uCisgICAgICovCisgICAgcHVibGljIEVudW1WYWx1ZU9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisgICAgcHJpdmF0ZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlOworICAgIHByaXZhdGUgZmluYWwgRW51bURlc2NyaXB0b3IgdHlwZTsKKworICAgIHByaXZhdGUgRW51bVZhbHVlRGVzY3JpcHRvcihmaW5hbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEVudW1EZXNjcmlwdG9yIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgdHlwZSA9IHBhcmVudDsKKworICAgICAgZnVsbE5hbWUgPSBwYXJlbnQuZ2V0RnVsbE5hbWUoKSArICcuJyArIHByb3RvLmdldE5hbWUoKTsKKworICAgICAgZmlsZS5wb29sLmFkZFN5bWJvbCh0aGlzKTsKKyAgICAgIGZpbGUucG9vbC5hZGRFbnVtVmFsdWVCeU51bWJlcih0aGlzKTsKKyAgICB9CisKKyAgICAvKiogU2VlIHtAbGluayBGaWxlRGVzY3JpcHRvciNzZXRQcm90b30uICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFByb3RvKGZpbmFsIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBwcm90bykgeworICAgICAgdGhpcy5wcm90byA9IHByb3RvOworICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqIERlc2NyaWJlcyBhIHNlcnZpY2UgdHlwZS4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvciBpbXBsZW1lbnRzIEdlbmVyaWNEZXNjcmlwdG9yIHsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGluZGV4IG9mIHRoaXMgZGVzY3JpcHRvciB3aXRoaW4gaXRzIHBhcmVudC4KKyAgICAgKiAqIEBzZWUgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciNnZXRJbmRleCgpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsgcmV0dXJuIGluZGV4OyB9CisKKyAgICAvKiogQ29udmVydCB0aGUgZGVzY3JpcHRvciB0byBpdHMgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gKi8KKyAgICBwdWJsaWMgU2VydmljZURlc2NyaXB0b3JQcm90byB0b1Byb3RvKCkgeyByZXR1cm4gcHJvdG87IH0KKworICAgIC8qKiBHZXQgdGhlIHR5cGUncyB1bnF1YWxpZmllZCBuYW1lLiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsgcmV0dXJuIHByb3RvLmdldE5hbWUoKTsgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0eXBlJ3MgZnVsbHktcXVhbGlmaWVkIG5hbWUuCisgICAgICogQHNlZSBEZXNjcmlwdG9yI2dldEZ1bGxOYW1lKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgeyByZXR1cm4gZnVsbE5hbWU7IH0KKworICAgIC8qKiBHZXQgdGhlIHtAbGluayBGaWxlRGVzY3JpcHRvcn0gY29udGFpbmluZyB0aGlzIGRlc2NyaXB0b3IuICovCisgICAgcHVibGljIEZpbGVEZXNjcmlwdG9yIGdldEZpbGUoKSB7IHJldHVybiBmaWxlOyB9CisKKyAgICAvKiogR2V0IHRoZSB7QGNvZGUgU2VydmljZU9wdGlvbnN9LCBkZWZpbmVkIGluIHtAY29kZSBkZXNjcmlwdG9yLnByb3RvfS4gKi8KKyAgICBwdWJsaWMgU2VydmljZU9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQorCisgICAgLyoqIEdldCBhIGxpc3Qgb2YgbWV0aG9kcyBmb3IgdGhpcyBzZXJ2aWNlLiAqLworICAgIHB1YmxpYyBMaXN0PE1ldGhvZERlc2NyaXB0b3I+IGdldE1ldGhvZHMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KG1ldGhvZHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgbWV0aG9kIGJ5IG5hbWUuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIG1ldGhvZCAoZS5nLiAiRm9vIikuCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kJ3MgZGVjc3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kRGVzY3JpcHRvciBmaW5kTWV0aG9kQnlOYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPQorICAgICAgICAgIGZpbGUucG9vbC5maW5kU3ltYm9sKGZ1bGxOYW1lICsgJy4nICsgbmFtZSk7CisgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgTWV0aG9kRGVzY3JpcHRvcikgeworICAgICAgICByZXR1cm4gKE1ldGhvZERlc2NyaXB0b3IpcmVzdWx0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisgICAgcHJpdmF0ZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIHByb3RvOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGxOYW1lOworICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZTsKKyAgICBwcml2YXRlIE1ldGhvZERlc2NyaXB0b3JbXSBtZXRob2RzOworCisgICAgcHJpdmF0ZSBTZXJ2aWNlRGVzY3JpcHRvcihmaW5hbCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICAgIGZ1bGxOYW1lID0gY29tcHV0ZUZ1bGxOYW1lKGZpbGUsIG51bGwsIHByb3RvLmdldE5hbWUoKSk7CisgICAgICB0aGlzLmZpbGUgPSBmaWxlOworCisgICAgICBtZXRob2RzID0gbmV3IE1ldGhvZERlc2NyaXB0b3JbcHJvdG8uZ2V0TWV0aG9kQ291bnQoKV07CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldE1ldGhvZENvdW50KCk7IGkrKykgeworICAgICAgICBtZXRob2RzW2ldID0gbmV3IE1ldGhvZERlc2NyaXB0b3IoCisgICAgICAgICAgcHJvdG8uZ2V0TWV0aG9kKGkpLCBmaWxlLCB0aGlzLCBpKTsKKyAgICAgIH0KKworICAgICAgZmlsZS5wb29sLmFkZFN5bWJvbCh0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3Jvc3NMaW5rKCkgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoZmluYWwgTWV0aG9kRGVzY3JpcHRvciBtZXRob2QgOiBtZXRob2RzKSB7CisgICAgICAgIG1ldGhvZC5jcm9zc0xpbmsoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogU2VlIHtAbGluayBGaWxlRGVzY3JpcHRvciNzZXRQcm90b30uICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFByb3RvKGZpbmFsIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gcHJvdG8pIHsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIG1ldGhvZHNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0TWV0aG9kKGkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8qKgorICAgKiBEZXNjcmliZXMgb25lIG1ldGhvZCB3aXRoaW4gYSBzZXJ2aWNlIHR5cGUuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE1ldGhvZERlc2NyaXB0b3IgaW1wbGVtZW50cyBHZW5lcmljRGVzY3JpcHRvciB7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIGl0cyBwYXJlbnQuCisgICAgICogKiBAc2VlIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IjZ2V0SW5kZXgoKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7IHJldHVybiBpbmRleDsgfQorCisgICAgLyoqIENvbnZlcnQgdGhlIGRlc2NyaXB0b3IgdG8gaXRzIHByb3RvY29sIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uICovCisgICAgcHVibGljIE1ldGhvZERlc2NyaXB0b3JQcm90byB0b1Byb3RvKCkgeyByZXR1cm4gcHJvdG87IH0KKworICAgIC8qKiBHZXQgdGhlIG1ldGhvZCdzIHVucXVhbGlmaWVkIG5hbWUuICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1ldGhvZCdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgorICAgICAqIEBzZWUgRGVzY3JpcHRvciNnZXRGdWxsTmFtZSgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsgcmV0dXJuIGZ1bGxOYW1lOyB9CisKKyAgICAvKiogR2V0IHRoZSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5pbmcgdGhpcyBkZXNjcmlwdG9yLiAqLworICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgeyByZXR1cm4gZmlsZTsgfQorCisgICAgLyoqIEdldCB0aGUgbWV0aG9kJ3Mgc2VydmljZSB0eXBlLiAqLworICAgIHB1YmxpYyBTZXJ2aWNlRGVzY3JpcHRvciBnZXRTZXJ2aWNlKCkgeyByZXR1cm4gc2VydmljZTsgfQorCisgICAgLyoqIEdldCB0aGUgbWV0aG9kJ3MgaW5wdXQgdHlwZS4gKi8KKyAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRJbnB1dFR5cGUoKSB7IHJldHVybiBpbnB1dFR5cGU7IH0KKworICAgIC8qKiBHZXQgdGhlIG1ldGhvZCdzIG91dHB1dCB0eXBlLiAqLworICAgIHB1YmxpYyBEZXNjcmlwdG9yIGdldE91dHB1dFR5cGUoKSB7IHJldHVybiBvdXRwdXRUeXBlOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHtAY29kZSBNZXRob2RPcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uCisgICAgICovCisgICAgcHVibGljIE1ldGhvZE9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7CisgICAgcHJpdmF0ZSBNZXRob2REZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlOworICAgIHByaXZhdGUgZmluYWwgU2VydmljZURlc2NyaXB0b3Igc2VydmljZTsKKworICAgIC8vIEluaXRpYWxpemVkIGR1cmluZyBjcm9zcy1saW5raW5nLgorICAgIHByaXZhdGUgRGVzY3JpcHRvciBpbnB1dFR5cGU7CisgICAgcHJpdmF0ZSBEZXNjcmlwdG9yIG91dHB1dFR5cGU7CisKKyAgICBwcml2YXRlIE1ldGhvZERlc2NyaXB0b3IoZmluYWwgTWV0aG9kRGVzY3JpcHRvclByb3RvIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXJ2aWNlRGVzY3JpcHRvciBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgdGhpcy5wcm90byA9IHByb3RvOworICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgIHNlcnZpY2UgPSBwYXJlbnQ7CisKKyAgICAgIGZ1bGxOYW1lID0gcGFyZW50LmdldEZ1bGxOYW1lKCkgKyAnLicgKyBwcm90by5nZXROYW1lKCk7CisKKyAgICAgIGZpbGUucG9vbC5hZGRTeW1ib2wodGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyb3NzTGluaygpIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBpbnB1dCA9CisgICAgICAgIGZpbGUucG9vbC5sb29rdXBTeW1ib2wocHJvdG8uZ2V0SW5wdXRUeXBlKCksIHRoaXMpOworICAgICAgaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSkgeworICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKKyAgICAgICAgICAgICdcIicgKyBwcm90by5nZXRJbnB1dFR5cGUoKSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgICBpbnB1dFR5cGUgPSAoRGVzY3JpcHRvcilpbnB1dDsKKworICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3Igb3V0cHV0ID0KKyAgICAgICAgZmlsZS5wb29sLmxvb2t1cFN5bWJvbChwcm90by5nZXRPdXRwdXRUeXBlKCksIHRoaXMpOworICAgICAgaWYgKCEob3V0cHV0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikpIHsKKyAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCisgICAgICAgICAgICAnXCInICsgcHJvdG8uZ2V0T3V0cHV0VHlwZSgpICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICAgIH0KKyAgICAgIG91dHB1dFR5cGUgPSAoRGVzY3JpcHRvcilvdXRwdXQ7CisgICAgfQorCisgICAgLyoqIFNlZSB7QGxpbmsgRmlsZURlc2NyaXB0b3Ijc2V0UHJvdG99LiAqLworICAgIHByaXZhdGUgdm9pZCBzZXRQcm90byhmaW5hbCBNZXRob2REZXNjcmlwdG9yUHJvdG8gcHJvdG8pIHsKKyAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb21wdXRlRnVsbE5hbWUoZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZXNjcmlwdG9yIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIHBhcmVudC5nZXRGdWxsTmFtZSgpICsgJy4nICsgbmFtZTsKKyAgICB9IGVsc2UgaWYgKGZpbGUuZ2V0UGFja2FnZSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgcmV0dXJuIGZpbGUuZ2V0UGFja2FnZSgpICsgJy4nICsgbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKioKKyAgICogQWxsIGRlc2NyaXB0b3JzIGV4Y2VwdCB7QGNvZGUgRmlsZURlc2NyaXB0b3J9IGltcGxlbWVudCB0aGlzIHRvIG1ha2UKKyAgICoge0Bjb2RlIERlc2NyaXB0b3JQb29sfSdzIGxpZmUgZWFzaWVyLgorICAgKi8KKyAgcHJpdmF0ZSBpbnRlcmZhY2UgR2VuZXJpY0Rlc2NyaXB0b3IgeworICAgIE1lc3NhZ2UgdG9Qcm90bygpOworICAgIFN0cmluZyBnZXROYW1lKCk7CisgICAgU3RyaW5nIGdldEZ1bGxOYW1lKCk7CisgICAgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpOworICB9CisKKyAgLyoqCisgICAqIFRocm93biB3aGVuIGJ1aWxkaW5nIGRlc2NyaXB0b3JzIGZhaWxzIGJlY2F1c2UgdGhlIHNvdXJjZSBEZXNjcmlwdG9yUHJvdG9zCisgICAqIGFyZSBub3QgdmFsaWQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1NzUwMjA1Nzc1NDkwNDgzMTQ4TDsKKworICAgIC8qKiBHZXRzIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3Igd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvYmxlbVN5bWJvbE5hbWUoKSB7IHJldHVybiBuYW1lOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aGUgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW52YWxpZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlIGdldFByb2JsZW1Qcm90bygpIHsgcmV0dXJuIHByb3RvOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7IHJldHVybiBkZXNjcmlwdGlvbjsgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2UgcHJvdG87CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247CisKKyAgICBwcml2YXRlIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBwcm9ibGVtRGVzY3JpcHRvciwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICBzdXBlcihwcm9ibGVtRGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpICsgIjogIiArIGRlc2NyaXB0aW9uKTsKKworICAgICAgLy8gTm90ZSB0aGF0IHByb2JsZW1EZXNjcmlwdG9yIG1heSBiZSBwYXJ0aWFsbHkgdW5pbml0aWFsaXplZCwgc28gd2UKKyAgICAgIC8vIGRvbid0IHdhbnQgdG8gZXhwb3NlIGl0IGRpcmVjdGx5IHRvIHRoZSB1c2VyLiAgU28sIHdlIG9ubHkgcHJvdmlkZQorICAgICAgLy8gdGhlIG5hbWUgYW5kIHRoZSBvcmlnaW5hbCBwcm90by4KKyAgICAgIG5hbWUgPSBwcm9ibGVtRGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpOworICAgICAgcHJvdG8gPSBwcm9ibGVtRGVzY3JpcHRvci50b1Byb3RvKCk7CisgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcHJvYmxlbURlc2NyaXB0b3IsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwKKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICB0aGlzKHByb2JsZW1EZXNjcmlwdG9yLCBkZXNjcmlwdGlvbik7CisgICAgICBpbml0Q2F1c2UoY2F1c2UpOworICAgIH0KKworICAgIHByaXZhdGUgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIHByb2JsZW1EZXNjcmlwdG9yLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgIHN1cGVyKHByb2JsZW1EZXNjcmlwdG9yLmdldE5hbWUoKSArICI6ICIgKyBkZXNjcmlwdGlvbik7CisKKyAgICAgIC8vIE5vdGUgdGhhdCBwcm9ibGVtRGVzY3JpcHRvciBtYXkgYmUgcGFydGlhbGx5IHVuaW5pdGlhbGl6ZWQsIHNvIHdlCisgICAgICAvLyBkb24ndCB3YW50IHRvIGV4cG9zZSBpdCBkaXJlY3RseSB0byB0aGUgdXNlci4gIFNvLCB3ZSBvbmx5IHByb3ZpZGUKKyAgICAgIC8vIHRoZSBuYW1lIGFuZCB0aGUgb3JpZ2luYWwgcHJvdG8uCisgICAgICBuYW1lID0gcHJvYmxlbURlc2NyaXB0b3IuZ2V0TmFtZSgpOworICAgICAgcHJvdG8gPSBwcm9ibGVtRGVzY3JpcHRvci50b1Byb3RvKCk7CisgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKioKKyAgICogQSBwcml2YXRlIGhlbHBlciBjbGFzcyB3aGljaCBjb250YWlucyBsb29rdXAgdGFibGVzIGNvbnRhaW5pbmcgYWxsIHRoZQorICAgKiBkZXNjcmlwdG9ycyBkZWZpbmVkIGluIGEgcGFydGljdWxhciBmaWxlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRGVzY3JpcHRvclBvb2wgeworICAgIERlc2NyaXB0b3JQb29sKGZpbmFsIEZpbGVEZXNjcmlwdG9yW10gZGVwZW5kZW5jaWVzKSB7CisgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG5ldyBEZXNjcmlwdG9yUG9vbFtkZXBlbmRlbmNpZXMubGVuZ3RoXTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspICB7CisgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzW2ldID0gZGVwZW5kZW5jaWVzW2ldLnBvb2w7CisgICAgICB9CisKKyAgICAgIGZvciAoZmluYWwgRmlsZURlc2NyaXB0b3IgZGVwZW5kZW5jeSA6IGRlcGVuZGVuY2llcykgeworICAgICAgICB0cnkgeworICAgICAgICAgIGFkZFBhY2thZ2UoZGVwZW5kZW5jeS5nZXRQYWNrYWdlKCksIGRlcGVuZGVuY3kpOworICAgICAgICB9IGNhdGNoIChEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgLy8gQ2FuJ3QgaGFwcGVuLCBiZWNhdXNlIGFkZFBhY2thZ2UoKSBvbmx5IGZhaWxzIHdoZW4gdGhlIG5hbWUKKyAgICAgICAgICAvLyBjb25mbGljdHMgd2l0aCBhIG5vbi1wYWNrYWdlLCBidXQgd2UgaGF2ZSBub3QgeWV0IGFkZGVkIGFueQorICAgICAgICAgIC8vIG5vbi1wYWNrYWdlcyBhdCB0aGlzIHBvaW50LgorICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvclBvb2xbXSBkZXBlbmRlbmNpZXM7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEdlbmVyaWNEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0J5TmFtZSA9CisgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIEdlbmVyaWNEZXNjcmlwdG9yPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPERlc2NyaXB0b3JJbnRQYWlyLCBGaWVsZERlc2NyaXB0b3I+IGZpZWxkc0J5TnVtYmVyID0KKyAgICAgIG5ldyBIYXNoTWFwPERlc2NyaXB0b3JJbnRQYWlyLCBGaWVsZERlc2NyaXB0b3I+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8RGVzY3JpcHRvckludFBhaXIsIEVudW1WYWx1ZURlc2NyaXB0b3I+IGVudW1WYWx1ZXNCeU51bWJlcgorICAgICAgICA9IG5ldyBIYXNoTWFwPERlc2NyaXB0b3JJbnRQYWlyLCBFbnVtVmFsdWVEZXNjcmlwdG9yPigpOworCisgICAgLyoqIEZpbmQgYSBnZW5lcmljIGRlc2NyaXB0b3IgYnkgZnVsbHktcXVhbGlmaWVkIG5hbWUuICovCisgICAgR2VuZXJpY0Rlc2NyaXB0b3IgZmluZFN5bWJvbChmaW5hbCBTdHJpbmcgZnVsbE5hbWUpIHsKKyAgICAgIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9IGRlc2NyaXB0b3JzQnlOYW1lLmdldChmdWxsTmFtZSk7CisgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKworICAgICAgZm9yIChmaW5hbCBEZXNjcmlwdG9yUG9vbCBkZXBlbmRlbmN5IDogZGVwZW5kZW5jaWVzKSB7CisgICAgICAgIHJlc3VsdCA9IGRlcGVuZGVuY3kuZGVzY3JpcHRvcnNCeU5hbWUuZ2V0KGZ1bGxOYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb29rIHVwIGEgZGVzY3JpcHRvciBieSBuYW1lLCByZWxhdGl2ZSB0byBzb21lIG90aGVyIGRlc2NyaXB0b3IuCisgICAgICogVGhlIG5hbWUgbWF5IGJlIGZ1bGx5LXF1YWxpZmllZCAod2l0aCBhIGxlYWRpbmcgJy4nKSwKKyAgICAgKiBwYXJ0aWFsbHktcXVhbGlmaWVkLCBvciB1bnF1YWxpZmllZC4gIEMrKy1saWtlIG5hbWUgbG9va3VwIHNlbWFudGljcworICAgICAqIGFyZSB1c2VkIHRvIHNlYXJjaCBmb3IgdGhlIG1hdGNoaW5nIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgR2VuZXJpY0Rlc2NyaXB0b3IgbG9va3VwU3ltYm9sKGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZWxhdGl2ZVRvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAvLyBUT0RPKGtlbnRvbik6ICBUaGlzIGNvdWxkIGJlIG9wdGltaXplZCBpbiBhIG51bWJlciBvZiB3YXlzLgorCisgICAgICBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQ7CisgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCIuIikpIHsKKyAgICAgICAgLy8gRnVsbHktcXVhbGlmaWVkIG5hbWUuCisgICAgICAgIHJlc3VsdCA9IGZpbmRTeW1ib2wobmFtZS5zdWJzdHJpbmcoMSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgIm5hbWUiIGlzIGEgY29tcG91bmQgaWRlbnRpZmllciwgd2Ugd2FudCB0byBzZWFyY2ggZm9yIHRoZQorICAgICAgICAvLyBmaXJzdCBjb21wb25lbnQgb2YgaXQsIHRoZW4gc2VhcmNoIHdpdGhpbiBpdCBmb3IgdGhlIHJlc3QuCisgICAgICAgIGZpbmFsIGludCBmaXJzdFBhcnRMZW5ndGggPSBuYW1lLmluZGV4T2YoJy4nKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpcnN0UGFydDsKKyAgICAgICAgaWYgKGZpcnN0UGFydExlbmd0aCA9PSAtMSkgeworICAgICAgICAgIGZpcnN0UGFydCA9IG5hbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZmlyc3RQYXJ0ID0gbmFtZS5zdWJzdHJpbmcoMCwgZmlyc3RQYXJ0TGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHdpbGwgc2VhcmNoIGVhY2ggcGFyZW50IHNjb3BlIG9mICJyZWxhdGl2ZVRvIiBsb29raW5nIGZvciB0aGUKKyAgICAgICAgLy8gc3ltYm9sLgorICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNjb3BlVG9UcnkgPQorICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIocmVsYXRpdmVUby5nZXRGdWxsTmFtZSgpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIC8vIENob3Agb2ZmIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgc2NvcGUuCisgICAgICAgICAgZmluYWwgaW50IGRvdHBvcyA9IHNjb3BlVG9UcnkubGFzdEluZGV4T2YoIi4iKTsKKyAgICAgICAgICBpZiAoZG90cG9zID09IC0xKSB7CisgICAgICAgICAgICByZXN1bHQgPSBmaW5kU3ltYm9sKG5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNjb3BlVG9Ucnkuc2V0TGVuZ3RoKGRvdHBvcyArIDEpOworCisgICAgICAgICAgICAvLyBBcHBlbmQgZmlyc3RQYXJ0IGFuZCB0cnkgdG8gZmluZC4KKyAgICAgICAgICAgIHNjb3BlVG9UcnkuYXBwZW5kKGZpcnN0UGFydCk7CisgICAgICAgICAgICByZXN1bHQgPSBmaW5kU3ltYm9sKHNjb3BlVG9UcnkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICBpZiAoZmlyc3RQYXJ0TGVuZ3RoICE9IC0xKSB7CisgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBmb3VuZCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3ltYm9sLiAgTm93IGxvb2sgZm9yCisgICAgICAgICAgICAgICAgLy8gdGhlIHdob2xlIHRoaW5nLiAgSWYgdGhpcyBmYWlscywgd2UgKmRvbid0KiB3YW50IHRvIGtlZXAKKyAgICAgICAgICAgICAgICAvLyBzZWFyY2hpbmcgcGFyZW50IHNjb3Blcy4KKyAgICAgICAgICAgICAgICBzY29wZVRvVHJ5LnNldExlbmd0aChkb3Rwb3MgKyAxKTsKKyAgICAgICAgICAgICAgICBzY29wZVRvVHJ5LmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmaW5kU3ltYm9sKHNjb3BlVG9UcnkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5vdCBmb3VuZC4gIFJlbW92ZSB0aGUgbmFtZSBzbyB3ZSBjYW4gdHJ5IGFnYWluLgorICAgICAgICAgICAgc2NvcGVUb1RyeS5zZXRMZW5ndGgoZG90cG9zKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihyZWxhdGl2ZVRvLAorICAgICAgICAgICAgJ1wiJyArIG5hbWUgKyAiXCIgaXMgbm90IGRlZmluZWQuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZS4gIElmIGEgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZQorICAgICAqIGFscmVhZHkgZXhpc3RzLCB0aHJvd3MgYW4gZXJyb3IuCisgICAgICovCisgICAgdm9pZCBhZGRTeW1ib2woZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICB2YWxpZGF0ZVN5bWJvbE5hbWUoZGVzY3JpcHRvcik7CisKKyAgICAgIGZpbmFsIFN0cmluZyBmdWxsTmFtZSA9IGRlc2NyaXB0b3IuZ2V0RnVsbE5hbWUoKTsKKyAgICAgIGZpbmFsIGludCBkb3Rwb3MgPSBmdWxsTmFtZS5sYXN0SW5kZXhPZignLicpOworCisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBvbGQgPSBkZXNjcmlwdG9yc0J5TmFtZS5wdXQoZnVsbE5hbWUsIGRlc2NyaXB0b3IpOworICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgIGRlc2NyaXB0b3JzQnlOYW1lLnB1dChmdWxsTmFtZSwgb2xkKTsKKworICAgICAgICBpZiAoZGVzY3JpcHRvci5nZXRGaWxlKCkgPT0gb2xkLmdldEZpbGUoKSkgeworICAgICAgICAgIGlmIChkb3Rwb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICdcIicgKyBmdWxsTmFtZSArICJcIiBpcyBhbHJlYWR5IGRlZmluZWQuIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICdcIicgKyBmdWxsTmFtZS5zdWJzdHJpbmcoZG90cG9zICsgMSkgKworICAgICAgICAgICAgICAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIFwiIiArCisgICAgICAgICAgICAgIGZ1bGxOYW1lLnN1YnN0cmluZygwLCBkb3Rwb3MpICsgIlwiLiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgJ1wiJyArIGZ1bGxOYW1lICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBmaWxlIFwiIiArCisgICAgICAgICAgICBvbGQuZ2V0RmlsZSgpLmdldE5hbWUoKSArICJcIi4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBwYWNrYWdlIGluIHRoZSBzeW1ib2wgdGFibGUuICBXZSB1c2UgUGFja2FnZURlc2NyaXB0b3JzCisgICAgICoganVzdCBhcyBwbGFjZWhvbGRlcnMgc28gdGhhdCBzb21lb25lIGNhbm5vdCBkZWZpbmUsIHNheSwgYSBtZXNzYWdlIHR5cGUKKyAgICAgKiB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGFuIGV4aXN0aW5nIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUGFja2FnZURlc2NyaXB0b3IgaW1wbGVtZW50cyBHZW5lcmljRGVzY3JpcHRvciB7CisgICAgICBwdWJsaWMgTWVzc2FnZSB0b1Byb3RvKCkgICAgICAgIHsgcmV0dXJuIGZpbGUudG9Qcm90bygpOyB9CisgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSAgICAgICAgIHsgcmV0dXJuIG5hbWU7ICAgICAgICAgICB9CisgICAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgICAgIHsgcmV0dXJuIGZ1bGxOYW1lOyAgICAgICB9CisgICAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpIHsgcmV0dXJuIGZpbGU7ICAgICAgICAgICB9CisKKyAgICAgIFBhY2thZ2VEZXNjcmlwdG9yKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZnVsbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlKSB7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIHRoaXMuZnVsbE5hbWUgPSBmdWxsTmFtZTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGxOYW1lOworICAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYWNrYWdlIHRvIHRoZSBzeW1ib2wgdGFibGVzLiAgSWYgYSBwYWNrYWdlIGJ5IHRoZSBzYW1lIG5hbWUKKyAgICAgKiBhbHJlYWR5IGV4aXN0cywgdGhhdCBpcyBmaW5lLCBidXQgaWYgc29tZSBvdGhlciBraW5kIG9mIHN5bWJvbCBleGlzdHMKKyAgICAgKiB1bmRlciB0aGUgc2FtZSBuYW1lLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLiAgSWYgdGhlIHBhY2thZ2UgaGFzCisgICAgICogbXVsdGlwbGUgY29tcG9uZW50cywgdGhpcyBhbHNvIGFkZHMgdGhlIHBhcmVudCBwYWNrYWdlKHMpLgorICAgICAqLworICAgIHZvaWQgYWRkUGFja2FnZShmaW5hbCBTdHJpbmcgZnVsbE5hbWUsIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUpCisgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIGludCBkb3Rwb3MgPSBmdWxsTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgICBpZiAoZG90cG9zID09IC0xKSB7CisgICAgICAgIG5hbWUgPSBmdWxsTmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFkZFBhY2thZ2UoZnVsbE5hbWUuc3Vic3RyaW5nKDAsIGRvdHBvcyksIGZpbGUpOworICAgICAgICBuYW1lID0gZnVsbE5hbWUuc3Vic3RyaW5nKGRvdHBvcyArIDEpOworICAgICAgfQorCisgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBvbGQgPQorICAgICAgICBkZXNjcmlwdG9yc0J5TmFtZS5wdXQoZnVsbE5hbWUsCisgICAgICAgICAgbmV3IFBhY2thZ2VEZXNjcmlwdG9yKG5hbWUsIGZ1bGxOYW1lLCBmaWxlKSk7CisgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgZGVzY3JpcHRvcnNCeU5hbWUucHV0KGZ1bGxOYW1lLCBvbGQpOworICAgICAgICBpZiAoIShvbGQgaW5zdGFuY2VvZiBQYWNrYWdlRGVzY3JpcHRvcikpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oZmlsZSwKKyAgICAgICAgICAgICAgJ1wiJyArIG5hbWUgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIChhcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBhICIKKyAgICAgICAgICAgICAgKyAicGFja2FnZSkgaW4gZmlsZSBcIiIgKyBvbGQuZ2V0RmlsZSgpLmdldE5hbWUoKSArICJcIi4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qKiBBIChHZW5lcmljRGVzY3JpcHRvciwgaW50KSBwYWlyLCB1c2VkIGFzIGEgbWFwIGtleS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEZXNjcmlwdG9ySW50UGFpciB7CisgICAgICBwcml2YXRlIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAgICBwcml2YXRlIGZpbmFsIGludCBudW1iZXI7CisKKyAgICAgIERlc2NyaXB0b3JJbnRQYWlyKGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIGludCBudW1iZXIpIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKKyAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuaGFzaENvZGUoKSAqICgoMSA8PCAxNikgLSAxKSArIG51bWJlcjsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGVzY3JpcHRvckludFBhaXIpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIERlc2NyaXB0b3JJbnRQYWlyIG90aGVyID0gKERlc2NyaXB0b3JJbnRQYWlyKW9iajsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IgPT0gb3RoZXIuZGVzY3JpcHRvciAmJiBudW1iZXIgPT0gb3RoZXIubnVtYmVyOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBmaWVsZCB0byB0aGUgZmllbGRzQnlOdW1iZXIgdGFibGUuICBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGEKKyAgICAgKiBmaWVsZCB3aXRoIGh0ZSBzYW1lIGNvbnRhaW5pbmcgdHlwZSBhbmQgbnVtYmVyIGFscmVhZHkgZXhpc3RzLgorICAgICAqLworICAgIHZvaWQgYWRkRmllbGRCeU51bWJlcihmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpCisgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIERlc2NyaXB0b3JJbnRQYWlyIGtleSA9CisgICAgICAgIG5ldyBEZXNjcmlwdG9ySW50UGFpcihmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpLCBmaWVsZC5nZXROdW1iZXIoKSk7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3Igb2xkID0gZmllbGRzQnlOdW1iZXIucHV0KGtleSwgZmllbGQpOworICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgIGZpZWxkc0J5TnVtYmVyLnB1dChrZXksIG9sZCk7CisgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihmaWVsZCwKKyAgICAgICAgICAiRmllbGQgbnVtYmVyICIgKyBmaWVsZC5nZXROdW1iZXIoKSArCisgICAgICAgICAgImhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiBcIiIgKworICAgICAgICAgIGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkuZ2V0RnVsbE5hbWUoKSArCisgICAgICAgICAgIlwiIGJ5IGZpZWxkIFwiIiArIG9sZC5nZXROYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBlbnVtIHZhbHVlIHRvIHRoZSBlbnVtVmFsdWVzQnlOdW1iZXIgdGFibGUuICBJZiBhbiBlbnVtIHZhbHVlCisgICAgICogd2l0aCB0aGUgc2FtZSB0eXBlIGFuZCBudW1iZXIgYWxyZWFkeSBleGlzdHMsIGRvZXMgbm90aGluZy4gIChUaGlzIGlzCisgICAgICogYWxsb3dlZDsgdGhlIGZpcnN0IHZhbHVlIGRlZmluZSB3aXRoIHRoZSBudW1iZXIgdGFrZXMgcHJlY2VkZW5jZS4pCisgICAgICovCisgICAgdm9pZCBhZGRFbnVtVmFsdWVCeU51bWJlcihmaW5hbCBFbnVtVmFsdWVEZXNjcmlwdG9yIHZhbHVlKSB7CisgICAgICBmaW5hbCBEZXNjcmlwdG9ySW50UGFpciBrZXkgPQorICAgICAgICBuZXcgRGVzY3JpcHRvckludFBhaXIodmFsdWUuZ2V0VHlwZSgpLCB2YWx1ZS5nZXROdW1iZXIoKSk7CisgICAgICBmaW5hbCBFbnVtVmFsdWVEZXNjcmlwdG9yIG9sZCA9IGVudW1WYWx1ZXNCeU51bWJlci5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgZW51bVZhbHVlc0J5TnVtYmVyLnB1dChrZXksIG9sZCk7CisgICAgICAgIC8vIE5vdCBhbiBlcnJvcjogIE11bHRpcGxlIGVudW0gdmFsdWVzIG1heSBoYXZlIHRoZSBzYW1lIG51bWJlciwgYnV0CisgICAgICAgIC8vIHdlIG9ubHkgd2FudCB0aGUgZmlyc3Qgb25lIGluIHRoZSBtYXAuCisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCB0aGUgZGVzY3JpcHRvcidzIG5hbWUgaXMgdmFsaWQgKGkuZS4gaXQgY29udGFpbnMgb25seQorICAgICAqIGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzLCBhbmQgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIGRpZ2l0KS4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCB2YWxpZGF0ZVN5bWJvbE5hbWUoZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZGVzY3JpcHRvci5nZXROYW1lKCk7CisgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihkZXNjcmlwdG9yLCAiTWlzc2luZyBuYW1lLiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgZmluYWwgY2hhciBjID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgLy8gTm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIG5vdCB2YWxpZCBpbiBwcm90b2J1ZiBpZGVudGlmaWVycywgZXZlbgorICAgICAgICAgIC8vIGlmIHRoZXkgYXJlIGxldHRlcnMgb3IgZGlnaXRzLgorICAgICAgICAgIGlmIChjID49IDEyOCkgeworICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gRmlyc3QgY2hhcmFjdGVyIG11c3QgYmUgbGV0dGVyIG9yIF8uICBTdWJzZXF1ZW50IGNoYXJhY3RlcnMgbWF5CisgICAgICAgICAgLy8gYmUgbGV0dGVycywgbnVtYmVycywgb3IgZGlnaXRzLgorICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoYykgfHwgYyA9PSAnXycgfHwKKyAgICAgICAgICAgICAgKENoYXJhY3Rlci5pc0RpZ2l0KGMpICYmIGkgPiAwKSkgeworICAgICAgICAgICAgLy8gVmFsaWQKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF2YWxpZCkgeworICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAnXCInICsgbmFtZSArICJcIiBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRHluYW1pY01lc3NhZ2UuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMDZiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRHluYW1pY01lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDQzOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE1lc3NhZ2V9IHRoYXQgY2FuIHJlcHJlc2VudCBhcmJpdHJhcnkgdHlwZXMsCisgKiBnaXZlbiBhIHtAbGluayBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yfS4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRHluYW1pY01lc3NhZ2UgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UgeworICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgdHlwZTsKKyAgcHJpdmF0ZSBmaW5hbCBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGZpZWxkczsKKyAgcHJpdmF0ZSBmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkczsKKyAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTaXplID0gLTE7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhIHtAY29kZSBEeW5hbWljTWVzc2FnZX0gdXNpbmcgdGhlIGdpdmVuIHtAY29kZSBGaWVsZFNldH0uCisgICAqLworICBwcml2YXRlIER5bmFtaWNNZXNzYWdlKERlc2NyaXB0b3IgdHlwZSwgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yPiBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIHRoaXMuZmllbGRzID0gZmllbGRzOworICAgIHRoaXMudW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHM7CisgIH0KKworICAvKioKKyAgICogR2V0IGEge0Bjb2RlIER5bmFtaWNNZXNzYWdlfSByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlCisgICAqIGdpdmVuIHR5cGUuCisgICAqLworICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIGdldERlZmF1bHRJbnN0YW5jZShEZXNjcmlwdG9yIHR5cGUpIHsKKyAgICByZXR1cm4gbmV3IER5bmFtaWNNZXNzYWdlKHR5cGUsIEZpZWxkU2V0LjxGaWVsZERlc2NyaXB0b3I+ZW1wdHlTZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5nZXREZWZhdWx0SW5zdGFuY2UoKSk7CisgIH0KKworICAvKiogUGFyc2UgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4gKi8KKyAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBwYXJzZUZyb20oRGVzY3JpcHRvciB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBuZXdCdWlsZGVyKHR5cGUpLm1lcmdlRnJvbShpbnB1dCkuYnVpbGRQYXJzZWQoKTsKKyAgfQorCisgIC8qKiBQYXJzZSBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLiAqLworICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIHBhcnNlRnJvbSgKKyAgICAgIERlc2NyaXB0b3IgdHlwZSwKKyAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCisgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuYnVpbGRQYXJzZWQoKTsKKyAgfQorCisgIC8qKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCByZXR1cm4gaXQuICovCisgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgcGFyc2VGcm9tKERlc2NyaXB0b3IgdHlwZSwgQnl0ZVN0cmluZyBkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlcih0eXBlKS5tZXJnZUZyb20oZGF0YSkuYnVpbGRQYXJzZWQoKTsKKyAgfQorCisgIC8qKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCByZXR1cm4gaXQuICovCisgIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgcGFyc2VGcm9tKERlc2NyaXB0b3IgdHlwZSwgQnl0ZVN0cmluZyBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KS5idWlsZFBhcnNlZCgpOworICB9CisKKyAgLyoqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgYW5kIHJldHVybiBpdC4gKi8KKyAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBwYXJzZUZyb20oRGVzY3JpcHRvciB0eXBlLCBieXRlW10gZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGRhdGEpLmJ1aWxkUGFyc2VkKCk7CisgIH0KKworICAvKiogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgcmV0dXJuIGl0LiAqLworICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIHBhcnNlRnJvbShEZXNjcmlwdG9yIHR5cGUsIGJ5dGVbXSBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KS5idWlsZFBhcnNlZCgpOworICB9CisKKyAgLyoqIFBhcnNlIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIHJldHVybiBpdC4gKi8KKyAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBwYXJzZUZyb20oRGVzY3JpcHRvciB0eXBlLCBJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlcih0eXBlKS5tZXJnZUZyb20oaW5wdXQpLmJ1aWxkUGFyc2VkKCk7CisgIH0KKworICAvKiogUGFyc2UgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgcmV0dXJuIGl0LiAqLworICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIHBhcnNlRnJvbShEZXNjcmlwdG9yIHR5cGUsIElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlcih0eXBlKS5tZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5idWlsZFBhcnNlZCgpOworICB9CisKKyAgLyoqIENvbnN0cnVjdCBhIHtAbGluayBNZXNzYWdlLkJ1aWxkZXJ9IGZvciB0aGUgZ2l2ZW4gdHlwZS4gKi8KKyAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoRGVzY3JpcHRvciB0eXBlKSB7CisgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHR5cGUpOworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhIHtAbGluayBNZXNzYWdlLkJ1aWxkZXJ9IGZvciBhIG1lc3NhZ2Ugb2YgdGhlIHNhbWUgdHlwZSBhcworICAgKiB7QGNvZGUgcHJvdG90eXBlfSwgYW5kIGluaXRpYWxpemUgaXQgd2l0aCB7QGNvZGUgcHJvdG90eXBlfSdzIGNvbnRlbnRzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoTWVzc2FnZSBwcm90b3R5cGUpIHsKKyAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkpLm1lcmdlRnJvbShwcm90b3R5cGUpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gSW1wbGVtZW50YXRpb24gb2YgTWVzc2FnZSBpbnRlcmZhY2UuCisKKyAgcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7CisgICAgcmV0dXJuIHR5cGU7CisgIH0KKworICBwdWJsaWMgRHluYW1pY01lc3NhZ2UgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKKyAgICByZXR1cm4gZ2V0RGVmYXVsdEluc3RhbmNlKHR5cGUpOworICB9CisKKyAgcHVibGljIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgeworICAgIHJldHVybiBmaWVsZHMuZ2V0QWxsRmllbGRzKCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7CisgICAgcmV0dXJuIGZpZWxkcy5oYXNGaWVsZChmaWVsZCk7CisgIH0KKworICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICBPYmplY3QgcmVzdWx0ID0gZmllbGRzLmdldEZpZWxkKGZpZWxkKTsKKyAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgIHJlc3VsdCA9IGdldERlZmF1bHRJbnN0YW5jZShmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgIHJldHVybiBmaWVsZHMuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKKyAgfQorCisgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleCkgeworICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICByZXR1cm4gZmllbGRzLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKKyAgfQorCisgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKKyAgICByZXR1cm4gdW5rbm93bkZpZWxkczsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZChEZXNjcmlwdG9yIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGZpZWxkcykgeworICAgIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudC4KKyAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IHR5cGUuZ2V0RmllbGRzKCkpIHsKKyAgICAgIGlmIChmaWVsZC5pc1JlcXVpcmVkKCkpIHsKKyAgICAgICAgaWYgKCFmaWVsZHMuaGFzRmllbGQoZmllbGQpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgICAgcmV0dXJuIGZpZWxkcy5pc0luaXRpYWxpemVkKCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgIHJldHVybiBpc0luaXRpYWxpemVkKHR5cGUsIGZpZWxkcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAodHlwZS5nZXRPcHRpb25zKCkuZ2V0TWVzc2FnZVNldFdpcmVGb3JtYXQoKSkgeworICAgICAgZmllbGRzLndyaXRlTWVzc2FnZVNldFRvKG91dHB1dCk7CisgICAgICB1bmtub3duRmllbGRzLndyaXRlQXNNZXNzYWdlU2V0VG8ob3V0cHV0KTsKKyAgICB9IGVsc2UgeworICAgICAgZmllbGRzLndyaXRlVG8ob3V0cHV0KTsKKyAgICAgIHVua25vd25GaWVsZHMud3JpdGVUbyhvdXRwdXQpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7CisgICAgaW50IHNpemUgPSBtZW1vaXplZFNpemU7CisgICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOworCisgICAgaWYgKHR5cGUuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCkpIHsKKyAgICAgIHNpemUgPSBmaWVsZHMuZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKCk7CisgICAgICBzaXplICs9IHVua25vd25GaWVsZHMuZ2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZSA9IGZpZWxkcy5nZXRTZXJpYWxpemVkU2l6ZSgpOworICAgICAgc2l6ZSArPSB1bmtub3duRmllbGRzLmdldFNlcmlhbGl6ZWRTaXplKCk7CisgICAgfQorCisgICAgbWVtb2l6ZWRTaXplID0gc2l6ZTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorCisgIHB1YmxpYyBCdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKCkgeworICAgIHJldHVybiBuZXcgQnVpbGRlcih0eXBlKTsKKyAgfQorCisgIHB1YmxpYyBCdWlsZGVyIHRvQnVpbGRlcigpIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlckZvclR5cGUoKS5tZXJnZUZyb20odGhpcyk7CisgIH0KKworICAvKiogVmVyaWZpZXMgdGhhdCB0aGUgZmllbGQgaXMgYSBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UuICovCisgIHByaXZhdGUgdm9pZCB2ZXJpZnlDb250YWluaW5nVHlwZShGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSB0eXBlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8qKgorICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgRHluYW1pY01lc3NhZ2V9cy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZS5CdWlsZGVyPEJ1aWxkZXI+IHsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgdHlwZTsKKyAgICBwcml2YXRlIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzOworICAgIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHM7CisKKyAgICAvKiogQ29uc3RydWN0IGEge0Bjb2RlIEJ1aWxkZXJ9IGZvciB0aGUgZ2l2ZW4gdHlwZS4gKi8KKyAgICBwcml2YXRlIEJ1aWxkZXIoRGVzY3JpcHRvciB0eXBlKSB7CisgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgdGhpcy5maWVsZHMgPSBGaWVsZFNldC5uZXdGaWVsZFNldCgpOworICAgICAgdGhpcy51bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIE1lc3NhZ2UuQnVpbGRlciBpbnRlcmZhY2UuCisKKyAgICBwdWJsaWMgQnVpbGRlciBjbGVhcigpIHsKKyAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgY2FsbCBjbGVhcigpIGFmdGVyIGJ1aWxkKCkuIik7CisgICAgICB9CisgICAgICBmaWVsZHMuY2xlYXIoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShNZXNzYWdlIG90aGVyKSB7CisgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBEeW5hbWljTWVzc2FnZSkgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBzb21ld2hhdCBmYXN0ZXIgdGhhbiBjYWxsaW5nIHN1cGVyLm1lcmdlRnJvbSgpLgorICAgICAgICBEeW5hbWljTWVzc2FnZSBvdGhlckR5bmFtaWNNZXNzYWdlID0gKER5bmFtaWNNZXNzYWdlKSBvdGhlcjsKKyAgICAgICAgaWYgKG90aGVyRHluYW1pY01lc3NhZ2UudHlwZSAhPSB0eXBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJtZXJnZUZyb20oTWVzc2FnZSkgY2FuIG9ubHkgbWVyZ2UgbWVzc2FnZXMgb2YgdGhlIHNhbWUgdHlwZS4iKTsKKyAgICAgICAgfQorICAgICAgICBmaWVsZHMubWVyZ2VGcm9tKG90aGVyRHluYW1pY01lc3NhZ2UuZmllbGRzKTsKKyAgICAgICAgbWVyZ2VVbmtub3duRmllbGRzKG90aGVyRHluYW1pY01lc3NhZ2UudW5rbm93bkZpZWxkcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRnJvbShvdGhlcik7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIER5bmFtaWNNZXNzYWdlIGJ1aWxkKCkgeworICAgICAgLy8gSWYgZmllbGRzID09IG51bGwsIHdlJ2xsIHRocm93IGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBsYXRlci4KKyAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCAmJiAhaXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgIHRocm93IG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKAorICAgICAgICAgIG5ldyBEeW5hbWljTWVzc2FnZSh0eXBlLCBmaWVsZHMsIHVua25vd25GaWVsZHMpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBidWlsZFBhcnRpYWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZm9yIER5bmFtaWNNZXNzYWdlLnBhcnNlRnJvbSgpIG1ldGhvZHMgdG8gY2FsbC4gIFRocm93cworICAgICAqIHtAbGluayBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb259IGluc3RlYWQgb2YKKyAgICAgKiB7QGxpbmsgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb259LgorICAgICAqLworICAgIHByaXZhdGUgRHluYW1pY01lc3NhZ2UgYnVpbGRQYXJzZWQoKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgIHRocm93IG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKAorICAgICAgICAgICAgbmV3IER5bmFtaWNNZXNzYWdlKHR5cGUsIGZpZWxkcywgdW5rbm93bkZpZWxkcykpCisgICAgICAgICAgLmFzSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICByZXR1cm4gYnVpbGRQYXJ0aWFsKCk7CisgICAgfQorCisgICAgcHVibGljIER5bmFtaWNNZXNzYWdlIGJ1aWxkUGFydGlhbCgpIHsKKyAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgImJ1aWxkKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgb24gdGhpcyBCdWlsZGVyLiIpOworICAgICAgfQorICAgICAgZmllbGRzLm1ha2VJbW11dGFibGUoKTsKKyAgICAgIER5bmFtaWNNZXNzYWdlIHJlc3VsdCA9CisgICAgICAgIG5ldyBEeW5hbWljTWVzc2FnZSh0eXBlLCBmaWVsZHMsIHVua25vd25GaWVsZHMpOworICAgICAgZmllbGRzID0gbnVsbDsKKyAgICAgIHVua25vd25GaWVsZHMgPSBudWxsOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBjbG9uZSgpIHsKKyAgICAgIEJ1aWxkZXIgcmVzdWx0ID0gbmV3IEJ1aWxkZXIodHlwZSk7CisgICAgICByZXN1bHQuZmllbGRzLm1lcmdlRnJvbShmaWVsZHMpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgcmV0dXJuIER5bmFtaWNNZXNzYWdlLmlzSW5pdGlhbGl6ZWQodHlwZSwgZmllbGRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHsKKyAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBEeW5hbWljTWVzc2FnZSBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkgeworICAgICAgcmV0dXJuIGdldERlZmF1bHRJbnN0YW5jZSh0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7CisgICAgICByZXR1cm4gZmllbGRzLmdldEFsbEZpZWxkcygpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIG5ld0J1aWxkZXJGb3JGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKworICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgIT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAibmV3QnVpbGRlckZvckZpZWxkIGlzIG9ubHkgdmFsaWQgZm9yIGZpZWxkcyB3aXRoIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKGZpZWxkLmdldE1lc3NhZ2VUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgcmV0dXJuIGZpZWxkcy5oYXNGaWVsZChmaWVsZCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgIE9iamVjdCByZXN1bHQgPSBmaWVsZHMuZ2V0RmllbGQoZmllbGQpOworICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgICAgcmVzdWx0ID0gZ2V0RGVmYXVsdEluc3RhbmNlKGZpZWxkLmdldE1lc3NhZ2VUeXBlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdCA9IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7CisgICAgICBmaWVsZHMuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7CisgICAgICBmaWVsZHMuY2xlYXJGaWVsZChmaWVsZCk7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgIHJldHVybiBmaWVsZHMuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXgpIHsKKyAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgIHJldHVybiBmaWVsZHMuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldFJlcGVhdGVkRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgIGZpZWxkcy5zZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCwgdmFsdWUpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgZmllbGRzLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKKyAgICAgIHJldHVybiB1bmtub3duRmllbGRzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIHNldFVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKKyAgICAgIHRoaXMudW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHM7CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBtZXJnZVVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKKyAgICAgIHRoaXMudW5rbm93bkZpZWxkcyA9CisgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKHRoaXMudW5rbm93bkZpZWxkcykKKyAgICAgICAgICAgICAgICAgICAgICAgLm1lcmdlRnJvbSh1bmtub3duRmllbGRzKQorICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKiBWZXJpZmllcyB0aGF0IHRoZSBmaWVsZCBpcyBhIGZpZWxkIG9mIHRoaXMgbWVzc2FnZS4gKi8KKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29udGFpbmluZ1R5cGUoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSB0eXBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIkZpZWxkRGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb25SZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjZiYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpAQCAtMCwwICsxLDI2NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSB0YWJsZSBvZiBrbm93biBleHRlbnNpb25zLCBzZWFyY2hhYmxlIGJ5IG5hbWUgb3IgZmllbGQgbnVtYmVyLiAgV2hlbgorICogcGFyc2luZyBhIHByb3RvY29sIG1lc3NhZ2UgdGhhdCBtaWdodCBoYXZlIGV4dGVuc2lvbnMsIHlvdSBtdXN0IHByb3ZpZGUKKyAqIGFuIHtAY29kZSBFeHRlbnNpb25SZWdpc3RyeX0gaW4gd2hpY2ggeW91IGhhdmUgcmVnaXN0ZXJlZCBhbnkgZXh0ZW5zaW9ucworICogdGhhdCB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHBhcnNlLiAgT3RoZXJ3aXNlLCB0aG9zZSBleHRlbnNpb25zIHdpbGwganVzdAorICogYmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzLgorICoKKyAqIDxwPkZvciBleGFtcGxlLCBpZiB5b3UgaGFkIHRoZSB7QGNvZGUgLnByb3RvfSBmaWxlOgorICoKKyAqIDxwcmU+CisgKiBvcHRpb24gamF2YV9jbGFzcyA9ICJNeVByb3RvIjsKKyAqCisgKiBtZXNzYWdlIEZvbyB7CisgKiAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisgKiB9CisgKgorICogZXh0ZW5kIEZvbyB7CisgKiAgIG9wdGlvbmFsIGludDMyIGJhcjsKKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIFRoZW4geW91IG1pZ2h0IHdyaXRlIGNvZGUgbGlrZToKKyAqCisgKiA8cHJlPgorICogRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpOworICogcmVnaXN0cnkuYWRkKE15UHJvdG8uYmFyKTsKKyAqIE15UHJvdG8uRm9vIG1lc3NhZ2UgPSBNeVByb3RvLkZvby5wYXJzZUZyb20oaW5wdXQsIHJlZ2lzdHJ5KTsKKyAqIDwvcHJlPgorICoKKyAqIDxwPkJhY2tncm91bmQ6CisgKgorICogPHA+WW91IG1pZ2h0IHdvbmRlciB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuICBUd28gYWx0ZXJuYXRpdmVzIG1pZ2h0IGNvbWUgdG8KKyAqIG1pbmQuICBGaXJzdCwgeW91IG1pZ2h0IGltYWdpbmUgYSBzeXN0ZW0gd2hlcmUgZ2VuZXJhdGVkIGV4dGVuc2lvbnMgYXJlCisgKiBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQgd2hlbiB0aGVpciBjb250YWluaW5nIGNsYXNzZXMgYXJlIGxvYWRlZC4gIFRoaXMKKyAqIGlzIGEgcG9wdWxhciB0ZWNobmlxdWUsIGJ1dCBpcyBiYWQgZGVzaWduOyBhbW9uZyBvdGhlciB0aGluZ3MsIGl0IGNyZWF0ZXMgYQorICogc2l0dWF0aW9uIHdoZXJlIGJlaGF2aW9yIGNhbiBjaGFuZ2UgZGVwZW5kaW5nIG9uIHdoYXQgY2xhc3NlcyBoYXBwZW4gdG8gYmUKKyAqIGxvYWRlZC4gIEl0IGFsc28gaW50cm9kdWNlcyBhIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHksIGJlY2F1c2UgYW4KKyAqIHVucHJpdmlsZWdlZCBjbGFzcyBjb3VsZCBjYXVzZSBpdHMgY29kZSB0byBiZSBjYWxsZWQgdW5leHBlY3RlZGx5IGZyb20gYQorICogcHJpdmlsZWdlZCBjbGFzcyBieSByZWdpc3RlcmluZyBpdHNlbGYgYXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSByaWdodCB0eXBlLgorICoKKyAqIDxwPkFub3RoZXIgb3B0aW9uIHlvdSBtaWdodCBjb25zaWRlciBpcyBsYXp5IHBhcnNpbmc6IGRvIG5vdCBwYXJzZSBhbgorICogZXh0ZW5zaW9uIHVudGlsIGl0IGlzIGZpcnN0IHJlcXVlc3RlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIGNhbGxlciBtdXN0CisgKiBwcm92aWRlIGEgdHlwZSB0byB1c2UuICBUaGlzIGludHJvZHVjZXMgYSBkaWZmZXJlbnQgc2V0IG9mIHByb2JsZW1zLiAgRmlyc3QsCisgKiBpdCB3b3VsZCByZXF1aXJlIGEgbXV0ZXggbG9jayBhbnkgdGltZSBhbiBleHRlbnNpb24gd2FzIGFjY2Vzc2VkLCB3aGljaAorICogd291bGQgYmUgc2xvdy4gIFNlY29uZCwgY29ycnVwdCBkYXRhIHdvdWxkIG5vdCBiZSBkZXRlY3RlZCB1bnRpbCBmaXJzdAorICogYWNjZXNzLCBhdCB3aGljaCBwb2ludCBpdCB3b3VsZCBiZSBtdWNoIGhhcmRlciB0byBkZWFsIHdpdGggaXQuICBUaGlyZCwgaXQKKyAqIGNvdWxkIHZpb2xhdGUgdGhlIGV4cGVjdGF0aW9uIHRoYXQgbWVzc2FnZSBvYmplY3RzIGFyZSBpbW11dGFibGUsIHNpbmNlIHRoZQorICogdHlwZSBwcm92aWRlZCBjb3VsZCBiZSBhbnkgYXJiaXRyYXJ5IG1lc3NhZ2UgY2xhc3MuICBBbiB1bnByaXZpbGVnZWQgdXNlcgorICogY291bGQgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyB0byBpbmplY3QgYSBtdXRhYmxlIG9iamVjdCBpbnRvIGEgbWVzc2FnZQorICogYmVsb25naW5nIHRvIHByaXZpbGVnZWQgY29kZSBhbmQgY3JlYXRlIG1pc2NoaWVmLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFeHRlbnNpb25SZWdpc3RyeSBleHRlbmRzIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSB7CisgIC8qKiBDb25zdHJ1Y3QgYSBuZXcsIGVtcHR5IGluc3RhbmNlLiAqLworICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJlZ2lzdHJ5IG5ld0luc3RhbmNlKCkgeworICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uUmVnaXN0cnkoKTsKKyAgfQorCisgIC8qKiBHZXQgdGhlIHVubW9kaWZpYWJsZSBzaW5nbGV0b24gZW1wdHkgaW5zdGFuY2UuICovCisgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0RW1wdHlSZWdpc3RyeSgpIHsKKyAgICByZXR1cm4gRU1QVFk7CisgIH0KKworICAvKiogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGUgcmVnaXN0cnkuICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0VW5tb2RpZmlhYmxlKCkgeworICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uUmVnaXN0cnkodGhpcyk7CisgIH0KKworICAvKiogQSAoRGVzY3JpcHRvciwgTWVzc2FnZSkgcGFpciwgcmV0dXJuZWQgYnkgbG9va3VwIG1ldGhvZHMuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXh0ZW5zaW9uSW5mbyB7CisgICAgLyoqIFRoZSBleHRlbnNpb24ncyBkZXNjcmlwdG9yLiAqLworICAgIHB1YmxpYyBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKworICAgIC8qKgorICAgICAqIEEgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uJ3MgdHlwZSwgaWYgaXQgaGFzIGEgbWVzc2FnZSB0eXBlLgorICAgICAqIE90aGVyd2lzZSwge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZTsKKworICAgIHByaXZhdGUgRXh0ZW5zaW9uSW5mbyhmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKKyAgICAgIGRlZmF1bHRJbnN0YW5jZSA9IG51bGw7CisgICAgfQorICAgIHByaXZhdGUgRXh0ZW5zaW9uSW5mbyhmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UpIHsKKyAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgICB0aGlzLmRlZmF1bHRJbnN0YW5jZSA9IGRlZmF1bHRJbnN0YW5jZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmluZCBhbiBleHRlbnNpb24gYnkgZnVsbHktcXVhbGlmaWVkIGZpZWxkIG5hbWUsIGluIHRoZSBwcm90byBuYW1lc3BhY2UuCisgICAqIEkuZS4ge0Bjb2RlIHJlc3VsdC5kZXNjcmlwdG9yLmZ1bGxOYW1lKCl9IHdpbGwgbWF0Y2gge0Bjb2RlIGZ1bGxOYW1lfSBpZgorICAgKiBhIG1hdGNoIGlzIGZvdW5kLgorICAgKgorICAgKiBAcmV0dXJuIEluZm9ybWF0aW9uIGFib3V0IHRoZSBleHRlbnNpb24gaWYgZm91bmQsIG9yIHtAY29kZSBudWxsfQorICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICovCisgIHB1YmxpYyBFeHRlbnNpb25JbmZvIGZpbmRFeHRlbnNpb25CeU5hbWUoZmluYWwgU3RyaW5nIGZ1bGxOYW1lKSB7CisgICAgcmV0dXJuIGV4dGVuc2lvbnNCeU5hbWUuZ2V0KGZ1bGxOYW1lKTsKKyAgfQorCisgIC8qKgorICAgKiBGaW5kIGFuIGV4dGVuc2lvbiBieSBjb250YWluaW5nIHR5cGUgYW5kIGZpZWxkIG51bWJlci4KKyAgICoKKyAgICogQHJldHVybiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXh0ZW5zaW9uIGlmIGZvdW5kLCBvciB7QGNvZGUgbnVsbH0KKyAgICogICAgICAgICBvdGhlcndpc2UuCisgICAqLworICBwdWJsaWMgRXh0ZW5zaW9uSW5mbyBmaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZmluYWwgRGVzY3JpcHRvciBjb250YWluaW5nVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlcikgeworICAgIHJldHVybiBleHRlbnNpb25zQnlOdW1iZXIuZ2V0KAorICAgICAgbmV3IERlc2NyaXB0b3JJbnRQYWlyKGNvbnRhaW5pbmdUeXBlLCBmaWVsZE51bWJlcikpOworICB9CisKKyAgLyoqIEFkZCBhbiBleHRlbnNpb24gZnJvbSBhIGdlbmVyYXRlZCBmaWxlIHRvIHRoZSByZWdpc3RyeS4gKi8KKyAgcHVibGljIHZvaWQgYWRkKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UuR2VuZXJhdGVkRXh0ZW5zaW9uPD8sID8+IGV4dGVuc2lvbikgeworICAgIGlmIChleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldEphdmFUeXBlKCkgPT0KKyAgICAgICAgRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgIGlmIChleHRlbnNpb24uZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICJSZWdpc3RlcmVkIG1lc3NhZ2UtdHlwZSBleHRlbnNpb24gaGFkIG51bGwgZGVmYXVsdCBpbnN0YW5jZTogIiArCisgICAgICAgICAgICBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCkpOworICAgICAgfQorICAgICAgYWRkKG5ldyBFeHRlbnNpb25JbmZvKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKSkpOworICAgIH0gZWxzZSB7CisgICAgICBhZGQobmV3IEV4dGVuc2lvbkluZm8oZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKSwgbnVsbCkpOworICAgIH0KKyAgfQorCisgIC8qKiBBZGQgYSBub24tbWVzc2FnZS10eXBlIGV4dGVuc2lvbiB0byB0aGUgcmVnaXN0cnkgYnkgZGVzY3JpcHRvci4gKi8KKyAgcHVibGljIHZvaWQgYWRkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciB0eXBlKSB7CisgICAgaWYgKHR5cGUuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgIkV4dGVuc2lvblJlZ2lzdHJ5LmFkZCgpIG11c3QgYmUgcHJvdmlkZWQgYSBkZWZhdWx0IGluc3RhbmNlIHdoZW4gIiArCisgICAgICAgICJhZGRpbmcgYW4gZW1iZWRkZWQgbWVzc2FnZSBleHRlbnNpb24uIik7CisgICAgfQorICAgIGFkZChuZXcgRXh0ZW5zaW9uSW5mbyh0eXBlLCBudWxsKSk7CisgIH0KKworICAvKiogQWRkIGEgbWVzc2FnZS10eXBlIGV4dGVuc2lvbiB0byB0aGUgcmVnaXN0cnkgYnkgZGVzY3JpcHRvci4gKi8KKyAgcHVibGljIHZvaWQgYWRkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciB0eXBlLCBmaW5hbCBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkgeworICAgIGlmICh0eXBlLmdldEphdmFUeXBlKCkgIT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICJFeHRlbnNpb25SZWdpc3RyeS5hZGQoKSBwcm92aWRlZCBhIGRlZmF1bHQgaW5zdGFuY2UgZm9yIGEgIiArCisgICAgICAgICJub24tbWVzc2FnZSBleHRlbnNpb24uIik7CisgICAgfQorICAgIGFkZChuZXcgRXh0ZW5zaW9uSW5mbyh0eXBlLCBkZWZhdWx0SW5zdGFuY2UpKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIFByaXZhdGUgc3R1ZmYuCisKKyAgcHJpdmF0ZSBFeHRlbnNpb25SZWdpc3RyeSgpIHsKKyAgICB0aGlzLmV4dGVuc2lvbnNCeU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEV4dGVuc2lvbkluZm8+KCk7CisgICAgdGhpcy5leHRlbnNpb25zQnlOdW1iZXIgPSBuZXcgSGFzaE1hcDxEZXNjcmlwdG9ySW50UGFpciwgRXh0ZW5zaW9uSW5mbz4oKTsKKyAgfQorCisgIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnkoRXh0ZW5zaW9uUmVnaXN0cnkgb3RoZXIpIHsKKyAgICBzdXBlcihvdGhlcik7CisgICAgdGhpcy5leHRlbnNpb25zQnlOYW1lID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG90aGVyLmV4dGVuc2lvbnNCeU5hbWUpOworICAgIHRoaXMuZXh0ZW5zaW9uc0J5TnVtYmVyID0KKyAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG90aGVyLmV4dGVuc2lvbnNCeU51bWJlcik7CisgIH0KKworICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEV4dGVuc2lvbkluZm8+IGV4dGVuc2lvbnNCeU5hbWU7CisgIHByaXZhdGUgZmluYWwgTWFwPERlc2NyaXB0b3JJbnRQYWlyLCBFeHRlbnNpb25JbmZvPiBleHRlbnNpb25zQnlOdW1iZXI7CisKKyAgcHJpdmF0ZSBFeHRlbnNpb25SZWdpc3RyeShib29sZWFuIGVtcHR5KSB7CisgICAgc3VwZXIoRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmdldEVtcHR5UmVnaXN0cnkoKSk7CisgICAgdGhpcy5leHRlbnNpb25zQnlOYW1lID0gQ29sbGVjdGlvbnMuPFN0cmluZywgRXh0ZW5zaW9uSW5mbz5lbXB0eU1hcCgpOworICAgIHRoaXMuZXh0ZW5zaW9uc0J5TnVtYmVyID0KKyAgICAgICAgQ29sbGVjdGlvbnMuPERlc2NyaXB0b3JJbnRQYWlyLCBFeHRlbnNpb25JbmZvPmVtcHR5TWFwKCk7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkgRU1QVFkgPSBuZXcgRXh0ZW5zaW9uUmVnaXN0cnkodHJ1ZSk7CisKKyAgcHJpdmF0ZSB2b2lkIGFkZChmaW5hbCBFeHRlbnNpb25JbmZvIGV4dGVuc2lvbikgeworICAgIGlmICghZXh0ZW5zaW9uLmRlc2NyaXB0b3IuaXNFeHRlbnNpb24oKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgIkV4dGVuc2lvblJlZ2lzdHJ5LmFkZCgpIHdhcyBnaXZlbiBhIEZpZWxkRGVzY3JpcHRvciBmb3IgYSByZWd1bGFyICIgKworICAgICAgICAiKG5vbi1leHRlbnNpb24pIGZpZWxkLiIpOworICAgIH0KKworICAgIGV4dGVuc2lvbnNCeU5hbWUucHV0KGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldEZ1bGxOYW1lKCksIGV4dGVuc2lvbik7CisgICAgZXh0ZW5zaW9uc0J5TnVtYmVyLnB1dCgKKyAgICAgIG5ldyBEZXNjcmlwdG9ySW50UGFpcihleHRlbnNpb24uZGVzY3JpcHRvci5nZXRDb250YWluaW5nVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldE51bWJlcigpKSwKKyAgICAgIGV4dGVuc2lvbik7CisKKyAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBleHRlbnNpb24uZGVzY3JpcHRvcjsKKyAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKS5nZXRPcHRpb25zKCkuZ2V0TWVzc2FnZVNldFdpcmVGb3JtYXQoKSAmJgorICAgICAgICBmaWVsZC5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuTUVTU0FHRSAmJgorICAgICAgICBmaWVsZC5pc09wdGlvbmFsKCkgJiYKKyAgICAgICAgZmllbGQuZ2V0RXh0ZW5zaW9uU2NvcGUoKSA9PSBmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKSB7CisgICAgICAvLyBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiBhIE1lc3NhZ2VTZXQgdHlwZSBkZWZpbmVkIHdpdGhpbiB0aGUgZXh0ZW5zaW9uCisgICAgICAvLyB0eXBlJ3Mgb3duIHNjb3BlLiAgRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LCBhbGxvdyBpdCB0byBiZSBsb29rZWQKKyAgICAgIC8vIHVwIGJ5IHR5cGUgbmFtZS4KKyAgICAgIGV4dGVuc2lvbnNCeU5hbWUucHV0KGZpZWxkLmdldE1lc3NhZ2VUeXBlKCkuZ2V0RnVsbE5hbWUoKSwgZXh0ZW5zaW9uKTsKKyAgICB9CisgIH0KKworICAvKiogQSAoR2VuZXJpY0Rlc2NyaXB0b3IsIGludCkgcGFpciwgdXNlZCBhcyBhIG1hcCBrZXkuICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERlc2NyaXB0b3JJbnRQYWlyIHsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBudW1iZXI7CisKKyAgICBEZXNjcmlwdG9ySW50UGFpcihmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIGludCBudW1iZXIpIHsKKyAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuaGFzaENvZGUoKSAqICgoMSA8PCAxNikgLSAxKSArIG51bWJlcjsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERlc2NyaXB0b3JJbnRQYWlyKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBmaW5hbCBEZXNjcmlwdG9ySW50UGFpciBvdGhlciA9IChEZXNjcmlwdG9ySW50UGFpcilvYmo7CisgICAgICByZXR1cm4gZGVzY3JpcHRvciA9PSBvdGhlci5kZXNjcmlwdG9yICYmIG51bWJlciA9PSBvdGhlci5udW1iZXI7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyODhkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb25SZWdpc3RyeUxpdGUuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogRXF1aXZhbGVudCB0byB7QGxpbmsgRXh0ZW5zaW9uUmVnaXN0cnl9IGJ1dCBzdXBwb3J0cyBvbmx5ICJsaXRlIiB0eXBlcy4KKyAqIDxwPgorICogSWYgYWxsIG9mIHlvdXIgdHlwZXMgYXJlIGxpdGUgdHlwZXMsIHRoZW4geW91IG9ubHkgbmVlZCB0byB1c2UKKyAqIHtAY29kZSBFeHRlbnNpb25SZWdpc3RyeUxpdGV9LiAgU2ltaWxhcmx5LCBpZiBhbGwgeW91ciB0eXBlcyBhcmUgcmVndWxhcgorICogdHlwZXMsIHRoZW4geW91IG9ubHkgbmVlZCB7QGxpbmsgRXh0ZW5zaW9uUmVnaXN0cnl9LiAgVHlwaWNhbGx5IGl0IGRvZXMgbm90CisgKiBtYWtlIHNlbnNlIHRvIG1peCB0aGUgdHdvLCBzaW5jZSBpZiB5b3UgaGF2ZSBhbnkgcmVndWxhciB0eXBlcyBpbiB5b3VyCisgKiBwcm9ncmFtLCB5b3UgdGhlbiByZXF1aXJlIHRoZSBmdWxsIHJ1bnRpbWUgYW5kIGxvc2UgYWxsIHRoZSBiZW5lZml0cyBvZgorICogdGhlIGxpdGUgcnVudGltZSwgc28geW91IG1pZ2h0IGFzIHdlbGwgbWFrZSBhbGwgeW91ciB0eXBlcyBiZSByZWd1bGFyIHR5cGVzLgorICogSG93ZXZlciwgaW4gc29tZSBjYXNlcyAoZS5nLiB3aGVuIGRlcGVuZGluZyBvbiBtdWx0aXBsZSB0aGlyZC1wYXRyeSBsaWJyYXJpZXMKKyAqIHdoZXJlIG9uZSB1c2VzIGxpdGUgdHlwZXMgYW5kIG9uZSB1c2VzIHJlZ3VsYXIpLCB5b3UgbWF5IGZpbmQgeW91cnNlbGYKKyAqIHdhbnRpbmcgdG8gbWl4IHRoZSB0d28uICBJbiB0aGlzIGNhc2UgdGhpbmdzIGdldCBtb3JlIGNvbXBsaWNhdGVkLgorICogPHA+CisgKiBUaGVyZSBhcmUgdGhyZWUgZmFjdG9ycyB0byBjb25zaWRlcjogIFdoZXRoZXIgdGhlIHR5cGUgYmVpbmcgZXh0ZW5kZWQgaXMKKyAqIGxpdGUsIHdoZXRoZXIgdGhlIGVtYmVkZGVkIHR5cGUgKGluIHRoZSBjYXNlIG9mIGEgbWVzc2FnZS10eXBlZCBleHRlbnNpb24pCisgKiBpcyBsaXRlLCBhbmQgd2hldGhlciB0aGUgZXh0ZW5zaW9uIGl0c2VsZiBpcyBsaXRlLiAgU2luY2UgYWxsIHRocmVlIGFyZQorICogZGVjbGFyZWQgaW4gZGlmZmVyZW50IGZpbGVzLCB0aGV5IGNvdWxkIGFsbCBiZSBkaWZmZXJlbnQuICBIZXJlIGFyZSBhbGwKKyAqIHRoZSBjb21iaW5hdGlvbnMgYW5kIHdoaWNoIHR5cGUgb2YgcmVnaXN0cnkgdG8gdXNlOgorICogPHByZT4KKyAqICAgRXh0ZW5kZWQgdHlwZSAgICAgSW5uZXIgdHlwZSAgICBFeHRlbnNpb24gICAgICAgICBVc2UgcmVnaXN0cnkKKyAqICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgbGl0ZSAgICAgICAgICAgICAgbGl0ZSAgICAgICAgICBsaXRlICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUKKyAqICAgbGl0ZSAgICAgICAgICAgICAgcmVndWxhciAgICAgICBsaXRlICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeQorICogICByZWd1bGFyICAgICAgICAgICByZWd1bGFyICAgICAgIHJlZ3VsYXIgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5CisgKiAgIGFsbCBvdGhlciBjb21iaW5hdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHN1cHBvcnRlZAorICogPC9wcmU+CisgKiA8cD4KKyAqIE5vdGUgdGhhdCBqdXN0IGFzIHJlZ3VsYXIgdHlwZXMgYXJlIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gbGl0ZS10eXBlIGZpZWxkcywKKyAqIHRoZXkgYXJlIGFsc28gbm90IGFsbG93ZWQgdG8gY29udGFpbiBsaXRlLXR5cGUgZXh0ZW5zaW9ucy4gIFRoaXMgaXMgYmVjYXVzZQorICogcmVndWxhciB0eXBlcyBtdXN0IGJlIGZ1bGx5IGFjY2Vzc2libGUgdmlhIHJlZmxlY3Rpb24sIHdoaWNoIGluIHR1cm4gbWVhbnMKKyAqIHRoYXQgYWxsIHRoZSBpbm5lciBtZXNzYWdlcyBtdXN0IGFsc28gc3VwcG9ydCByZWZsZWN0aW9uLiAgT24gdGhlIG90aGVyIGhhbmQsCisgKiBzaW5jZSByZWd1bGFyIHR5cGVzIGltcGxlbWVudCB0aGUgZW50aXJlIGxpdGUgaW50ZXJmYWNlLCB0aGVyZSBpcyBubyBwcm9ibGVtCisgKiB3aXRoIGVtYmVkZGluZyByZWd1bGFyIHR5cGVzIGluc2lkZSBsaXRlIHR5cGVzLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlbnNpb25SZWdpc3RyeUxpdGUgeworICAvKiogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBpbnN0YW5jZS4gKi8KKyAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25SZWdpc3RyeUxpdGUgbmV3SW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25SZWdpc3RyeUxpdGUoKTsKKyAgfQorCisgIC8qKiBHZXQgdGhlIHVubW9kaWZpYWJsZSBzaW5nbGV0b24gZW1wdHkgaW5zdGFuY2UuICovCisgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGdldEVtcHR5UmVnaXN0cnkoKSB7CisgICAgcmV0dXJuIEVNUFRZOworICB9CisKKyAgLyoqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIHJlZ2lzdHJ5LiAqLworICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGdldFVubW9kaWZpYWJsZSgpIHsKKyAgICByZXR1cm4gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSh0aGlzKTsKKyAgfQorCisgIC8qKgorICAgKiBGaW5kIGFuIGV4dGVuc2lvbiBieSBjb250YWluaW5nIHR5cGUgYW5kIGZpZWxkIG51bWJlci4KKyAgICoKKyAgICogQHJldHVybiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXh0ZW5zaW9uIGlmIGZvdW5kLCBvciB7QGNvZGUgbnVsbH0KKyAgICogICAgICAgICBvdGhlcndpc2UuCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIDxDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2VMaXRlPgorICAgICAgR2VuZXJhdGVkTWVzc2FnZUxpdGUuR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCA/PgorICAgICAgICBmaW5kTGl0ZUV4dGVuc2lvbkJ5TnVtYmVyKAorICAgICAgICAgIGZpbmFsIENvbnRhaW5pbmdUeXBlIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLAorICAgICAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlcikgeworICAgIHJldHVybiAoR2VuZXJhdGVkTWVzc2FnZUxpdGUuR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCA/PikKKyAgICAgIGV4dGVuc2lvbnNCeU51bWJlci5nZXQoCisgICAgICAgIG5ldyBPYmplY3RJbnRQYWlyKGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLCBmaWVsZE51bWJlcikpOworICB9CisKKyAgLyoqIEFkZCBhbiBleHRlbnNpb24gZnJvbSBhIGxpdGUgZ2VuZXJhdGVkIGZpbGUgdG8gdGhlIHJlZ2lzdHJ5LiAqLworICBwdWJsaWMgZmluYWwgdm9pZCBhZGQoCisgICAgICBmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5HZW5lcmF0ZWRFeHRlbnNpb248PywgPz4gZXh0ZW5zaW9uKSB7CisgICAgZXh0ZW5zaW9uc0J5TnVtYmVyLnB1dCgKKyAgICAgIG5ldyBPYmplY3RJbnRQYWlyKGV4dGVuc2lvbi5nZXRDb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmdldE51bWJlcigpKSwKKyAgICAgIGV4dGVuc2lvbik7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBQcml2YXRlIHN0dWZmLgorCisgIC8vIENvbnN0cnVjdG9ycyBhcmUgcGFja2FnZS1wcml2YXRlIHNvIHRoYXQgRXh0ZW5zaW9uUmVnaXN0cnkgY2FuIHN1YmNsYXNzCisgIC8vIHRoaXMuCisKKyAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCkgeworICAgIHRoaXMuZXh0ZW5zaW9uc0J5TnVtYmVyID0KKyAgICAgICAgbmV3IEhhc2hNYXA8T2JqZWN0SW50UGFpciwKKyAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVkTWVzc2FnZUxpdGUuR2VuZXJhdGVkRXh0ZW5zaW9uPD8sID8+PigpOworICB9CisKKyAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSBFTVBUWSkgeworICAgICAgdGhpcy5leHRlbnNpb25zQnlOdW1iZXIgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmV4dGVuc2lvbnNCeU51bWJlciA9CisgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChvdGhlci5leHRlbnNpb25zQnlOdW1iZXIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgTWFwPE9iamVjdEludFBhaXIsCisgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlZE1lc3NhZ2VMaXRlLkdlbmVyYXRlZEV4dGVuc2lvbjw/LCA/Pj4KKyAgICAgIGV4dGVuc2lvbnNCeU51bWJlcjsKKworICBwcml2YXRlIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZShib29sZWFuIGVtcHR5KSB7CisgICAgdGhpcy5leHRlbnNpb25zQnlOdW1iZXIgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICB9CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBFTVBUWSA9CisgICAgbmV3IEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSh0cnVlKTsKKworICAvKiogQSAoT2JqZWN0LCBpbnQpIHBhaXIsIHVzZWQgYXMgYSBtYXAga2V5LiAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBPYmplY3RJbnRQYWlyIHsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBvYmplY3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtYmVyOworCisgICAgT2JqZWN0SW50UGFpcihmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBpbnQgbnVtYmVyKSB7CisgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKKyAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUob2JqZWN0KSAqICgoMSA8PCAxNikgLSAxKSArIG51bWJlcjsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE9iamVjdEludFBhaXIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIE9iamVjdEludFBhaXIgb3RoZXIgPSAoT2JqZWN0SW50UGFpcilvYmo7CisgICAgICByZXR1cm4gb2JqZWN0ID09IG90aGVyLm9iamVjdCAmJiBudW1iZXIgPT0gb3RoZXIubnVtYmVyOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ZpZWxkU2V0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRmllbGRTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODVkYmFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ZpZWxkU2V0LmphdmEKQEAgLTAsMCArMSw3ODggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQSBjbGFzcyB3aGljaCByZXByZXNlbnRzIGFuIGFyYml0cmFyeSBzZXQgb2YgZmllbGRzIG9mIHNvbWUgbWVzc2FnZSB0eXBlLgorICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgRHluYW1pY01lc3NhZ2V9LCBhbmQgYWxzbyB0byByZXByZXNlbnQKKyAqIGV4dGVuc2lvbnMgaW4ge0BsaW5rIEdlbmVyYXRlZE1lc3NhZ2V9LiAgVGhpcyBjbGFzcyBpcyBwYWNrYWdlLXByaXZhdGUsCisgKiBzaW5jZSBvdXRzaWRlIHVzZXJzIHNob3VsZCBwcm9iYWJseSBiZSB1c2luZyB7QGxpbmsgRHluYW1pY01lc3NhZ2V9LgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK2ZpbmFsIGNsYXNzIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvclR5cGUgZXh0ZW5kcworICAgICAgRmllbGRTZXQuRmllbGREZXNjcmlwdG9yTGl0ZTxGaWVsZERlc2NyaXB0b3JUeXBlPj4geworICAvKioKKyAgICogSW50ZXJmYWNlIGZvciBhIEZpZWxkRGVzY3JpcHRvciBvciBsaXRlIGV4dGVuc2lvbiBkZXNjcmlwdG9yLiAgVGhpcworICAgKiBwcmV2ZW50cyBGaWVsZFNldCBmcm9tIGRlcGVuZGluZyBvbiB7QGxpbmsgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yfS4KKyAgICovCisgIHB1YmxpYyBpbnRlcmZhY2UgRmllbGREZXNjcmlwdG9yTGl0ZTxUIGV4dGVuZHMgRmllbGREZXNjcmlwdG9yTGl0ZTxUPj4KKyAgICAgIGV4dGVuZHMgQ29tcGFyYWJsZTxUPiB7CisgICAgaW50IGdldE51bWJlcigpOworICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlIGdldExpdGVUeXBlKCk7CisgICAgV2lyZUZvcm1hdC5KYXZhVHlwZSBnZXRMaXRlSmF2YVR5cGUoKTsKKyAgICBib29sZWFuIGlzUmVwZWF0ZWQoKTsKKyAgICBib29sZWFuIGlzUGFja2VkKCk7CisgICAgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZ2V0RW51bVR5cGUoKTsKKworICAgIC8vIElmIGdldExpdGVKYXZhVHlwZSgpID09IE1FU1NBR0UsIHRoaXMgbWVyZ2VzIGEgbWVzc2FnZSBvYmplY3Qgb2YgdGhlCisgICAgLy8gdHlwZSBpbnRvIGEgYnVpbGRlciBvZiB0aGUgdHlwZS4gIFJldHVybnMge0Bjb2RlIHRvfS4KKyAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIGludGVybmFsTWVyZ2VGcm9tKAorICAgICAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIHRvLCBNZXNzYWdlTGl0ZSBmcm9tKTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgU21hbGxTb3J0ZWRNYXA8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBmaWVsZHM7CisgIHByaXZhdGUgYm9vbGVhbiBpc0ltbXV0YWJsZTsKKworICAvKiogQ29uc3RydWN0IGEgbmV3IEZpZWxkU2V0LiAqLworICBwcml2YXRlIEZpZWxkU2V0KCkgeworICAgIHRoaXMuZmllbGRzID0gU21hbGxTb3J0ZWRNYXAubmV3RmllbGRNYXAoMTYpOworICB9CisKKyAgLyoqCisgICAqIENvbnN0cnVjdCBhbiBlbXB0eSBGaWVsZFNldC4gIFRoaXMgaXMgb25seSB1c2VkIHRvIGluaXRpYWxpemUKKyAgICogREVGQVVMVF9JTlNUQU5DRS4KKyAgICovCisgIHByaXZhdGUgRmllbGRTZXQoZmluYWwgYm9vbGVhbiBkdW1teSkgeworICAgIHRoaXMuZmllbGRzID0gU21hbGxTb3J0ZWRNYXAubmV3RmllbGRNYXAoMCk7CisgICAgbWFrZUltbXV0YWJsZSgpOworICB9CisKKyAgLyoqIENvbnN0cnVjdCBhIG5ldyBGaWVsZFNldC4gKi8KKyAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEZpZWxkU2V0LkZpZWxkRGVzY3JpcHRvckxpdGU8VD4+CisgICAgICBGaWVsZFNldDxUPiBuZXdGaWVsZFNldCgpIHsKKyAgICByZXR1cm4gbmV3IEZpZWxkU2V0PFQ+KCk7CisgIH0KKworICAvKiogR2V0IGFuIGltbXV0YWJsZSBlbXB0eSBGaWVsZFNldC4gKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBGaWVsZFNldC5GaWVsZERlc2NyaXB0b3JMaXRlPFQ+PgorICAgICAgRmllbGRTZXQ8VD4gZW1wdHlTZXQoKSB7CisgICAgcmV0dXJuIERFRkFVTFRfSU5TVEFOQ0U7CisgIH0KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpZWxkU2V0IERFRkFVTFRfSU5TVEFOQ0UgPSBuZXcgRmllbGRTZXQodHJ1ZSk7CisKKyAgLyoqIE1ha2UgdGhpcyBGaWVsZFNldCBpbW11dGFibGUgZnJvbSB0aGlzIHBvaW50IGZvcndhcmQuICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgdm9pZCBtYWtlSW1tdXRhYmxlKCkgeworICAgIGlmIChpc0ltbXV0YWJsZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmaWVsZHMubWFrZUltbXV0YWJsZSgpOworICAgIGlzSW1tdXRhYmxlID0gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1bnMgd2hldGhlciB0aGUgRmllbGRTZXQgaXMgaW1tdXRhYmxlLiBUaGlzIGlzIHRydWUgaWYgaXQgaXMgdGhlCisgICAqIHtAbGluayAjZW1wdHlTZXR9IG9yIGlmIHtAbGluayAjbWFrZUltbXV0YWJsZX0gd2VyZSBjYWxsZWQuCisgICAqCisgICAqIEByZXR1cm4gd2hldGhlciB0aGUgRmllbGRTZXQgaXMgaW1tdXRhYmxlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNJbW11dGFibGUoKSB7CisgICAgcmV0dXJuIGlzSW1tdXRhYmxlOworICB9CisKKyAgLyoqCisgICAqIENsb25lcyB0aGUgRmllbGRTZXQuIFRoZSByZXR1cm5lZCBGaWVsZFNldCB3aWxsIGJlIG11dGFibGUgZXZlbiBpZiB0aGUKKyAgICogb3JpZ2luYWwgRmllbGRTZXQgd2FzIGltbXV0YWJsZS4KKyAgICoKKyAgICogQHJldHVybiB0aGUgbmV3bHkgY2xvbmVkIEZpZWxkU2V0CisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvclR5cGU+IGNsb25lKCkgeworICAgIC8vIFdlIGNhbid0IGp1c3QgY2FsbCBmaWVsZHMuY2xvbmUgYmVjYXVzZSBMaXN0IG9iamVjdHMgaW4gdGhlIG1hcAorICAgIC8vIHNob3VsZCBub3QgYmUgc2hhcmVkLgorICAgIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvclR5cGU+IGNsb25lID0gRmllbGRTZXQubmV3RmllbGRTZXQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5nZXROdW1BcnJheUVudHJpZXMoKTsgaSsrKSB7CisgICAgICBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA9IGZpZWxkcy5nZXRBcnJheUVudHJ5QXQoaSk7CisgICAgICBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgIGNsb25lLnNldEZpZWxkKGRlc2NyaXB0b3IsIGVudHJ5LmdldFZhbHVlKCkpOworICAgIH0KKyAgICBmb3IgKE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5IDoKKyAgICAgICAgICAgICBmaWVsZHMuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKKyAgICAgIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciA9IGVudHJ5LmdldEtleSgpOworICAgICAgY2xvbmUuc2V0RmllbGQoZGVzY3JpcHRvciwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgfQorICAgIHJldHVybiBjbG9uZTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqIFNlZSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2NsZWFyKCl9LiAqLworICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICBmaWVsZHMuY2xlYXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYSBzaW1wbGUgbWFwIGNvbnRhaW5pbmcgYWxsIHRoZSBmaWVsZHMuCisgICAqLworICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgeworICAgIHJldHVybiBmaWVsZHMuaXNJbW11dGFibGUoKSA/IGZpZWxkcyA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChmaWVsZHMpOworICB9CisKKyAgLyoqCisgICAqIEdldCBhbiBpdGVyYXRvciB0byB0aGUgZmllbGQgbWFwLiBUaGlzIGl0ZXJhdG9yIHNob3VsZCBub3QgYmUgbGVha2VkIG91dAorICAgKiBvZiB0aGUgcHJvdG9idWYgbGlicmFyeSBhcyBpdCBpcyBub3QgcHJvdGVjdGVkIGZyb20gbXV0YXRpb24gd2hlbgorICAgKiBmaWVsZHMgaXMgbm90IGltbXV0YWJsZS4KKyAgICovCisgIHB1YmxpYyBJdGVyYXRvcjxNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0Pj4gaXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIGZpZWxkcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgIH0KKworICAvKioKKyAgICogVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKKyAgICoge0BsaW5rIE1lc3NhZ2UjaGFzRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0uCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IpIHsKKyAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICJoYXNGaWVsZCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBub24tcmVwZWF0ZWQgZmllbGRzLiIpOworICAgIH0KKworICAgIHJldHVybiBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpICE9IG51bGw7CisgIH0KKworICAvKioKKyAgICogVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKKyAgICoge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0uICBUaGlzIG1ldGhvZAorICAgKiByZXR1cm5zIHtAY29kZSBudWxsfSBpZiB0aGUgZmllbGQgaXMgbm90IHNldDsgaW4gdGhpcyBjYXNlIGl0IGlzIHVwCisgICAqIHRvIHRoZSBjYWxsZXIgdG8gZmV0Y2ggdGhlIGZpZWxkJ3MgZGVmYXVsdCB2YWx1ZS4KKyAgICovCisgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yKSB7CisgICAgcmV0dXJuIGZpZWxkcy5nZXQoZGVzY3JpcHRvcik7CisgIH0KKworICAvKioKKyAgICogVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKKyAgICoge0BsaW5rIE1lc3NhZ2UuQnVpbGRlciNzZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsT2JqZWN0KX0uCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIHZvaWQgc2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAiV3Jvbmcgb2JqZWN0IHR5cGUgdXNlZCB3aXRoIHByb3RvY29sIG1lc3NhZ2UgcmVmbGVjdGlvbi4iKTsKKyAgICAgIH0KKworICAgICAgLy8gV3JhcCB0aGUgY29udGVudHMgaW4gYSBuZXcgbGlzdCBzbyB0aGF0IHRoZSBjYWxsZXIgY2Fubm90IGNoYW5nZQorICAgICAgLy8gdGhlIGxpc3QncyBjb250ZW50cyBhZnRlciBzZXR0aW5nIGl0LgorICAgICAgZmluYWwgTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgbmV3TGlzdC5hZGRBbGwoKExpc3QpdmFsdWUpOworICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IG5ld0xpc3QpIHsKKyAgICAgICAgdmVyaWZ5VHlwZShkZXNjcmlwdG9yLmdldExpdGVUeXBlKCksIGVsZW1lbnQpOworICAgICAgfQorICAgICAgdmFsdWUgPSBuZXdMaXN0OworICAgIH0gZWxzZSB7CisgICAgICB2ZXJpZnlUeXBlKGRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSwgdmFsdWUpOworICAgIH0KKworICAgIGZpZWxkcy5wdXQoZGVzY3JpcHRvciwgdmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCisgICAqIHtAbGluayBNZXNzYWdlLkJ1aWxkZXIjY2xlYXJGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfS4KKyAgICovCisgIHB1YmxpYyB2b2lkIGNsZWFyRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yKSB7CisgICAgZmllbGRzLnJlbW92ZShkZXNjcmlwdG9yKTsKKyAgfQorCisgIC8qKgorICAgKiBVc2VmdWwgZm9yIGltcGxlbWVudGluZworICAgKiB7QGxpbmsgTWVzc2FnZSNnZXRSZXBlYXRlZEZpZWxkQ291bnQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0uCisgICAqLworICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IpIHsKKyAgICBpZiAoIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiByZXBlYXRlZCBmaWVsZHMuIik7CisgICAgfQorCisgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZmllbGRzLmdldChkZXNjcmlwdG9yKTsKKyAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAoKExpc3Q8Pz4pIHZhbHVlKS5zaXplKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCisgICAqIHtAbGluayBNZXNzYWdlI2dldFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLGludCl9LgorICAgKi8KKyAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkgeworICAgIGlmICghZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICJnZXRSZXBlYXRlZEZpZWxkKCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHJlcGVhdGVkIGZpZWxkcy4iKTsKKyAgICB9CisKKyAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpOworCisgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAoKExpc3Q8Pz4pIHZhbHVlKS5nZXQoaW5kZXgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2VmdWwgZm9yIGltcGxlbWVudGluZworICAgKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI3NldFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLGludCxPYmplY3QpfS4KKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgaWYgKCFkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgImdldFJlcGVhdGVkRmllbGQoKSBjYW4gb25seSBiZSBjYWxsZWQgb24gcmVwZWF0ZWQgZmllbGRzLiIpOworICAgIH0KKworICAgIGZpbmFsIE9iamVjdCBsaXN0ID0gZmllbGRzLmdldChkZXNjcmlwdG9yKTsKKyAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgIH0KKworICAgIHZlcmlmeVR5cGUoZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpLCB2YWx1ZSk7CisgICAgKChMaXN0KSBsaXN0KS5zZXQoaW5kZXgsIHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBVc2VmdWwgZm9yIGltcGxlbWVudGluZworICAgKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2FkZFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLE9iamVjdCl9LgorICAgKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyB2b2lkIGFkZFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgIGlmICghZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICJhZGRSZXBlYXRlZEZpZWxkKCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHJlcGVhdGVkIGZpZWxkcy4iKTsKKyAgICB9CisKKyAgICB2ZXJpZnlUeXBlKGRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSwgdmFsdWUpOworCisgICAgZmluYWwgT2JqZWN0IGV4aXN0aW5nVmFsdWUgPSBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpOworICAgIExpc3QgbGlzdDsKKyAgICBpZiAoZXhpc3RpbmdWYWx1ZSA9PSBudWxsKSB7CisgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgZmllbGRzLnB1dChkZXNjcmlwdG9yLCBsaXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgbGlzdCA9IChMaXN0KSBleGlzdGluZ1ZhbHVlOworICAgIH0KKworICAgIGxpc3QuYWRkKHZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSB0byBiZSBhIHZhbGlkCisgICAqIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQuICAoRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhpcyBjaGVja3MgaWYgdGhlCisgICAqIG9iamVjdCBpcyB0aGUgcmlnaHQgdHlwZSB0byBiZSBvbmUgZWxlbWVudCBvZiB0aGUgZmllbGQuKQorICAgKgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGUgdmFsdWUgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlUeXBlKGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7CisgICAgc3dpdGNoICh0eXBlLmdldEphdmFUeXBlKCkpIHsKKyAgICAgIGNhc2UgSU5UOiAgICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyICAgOyBicmVhazsKKyAgICAgIGNhc2UgTE9ORzogICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBMb25nICAgICAgOyBicmVhazsKKyAgICAgIGNhc2UgRkxPQVQ6ICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBGbG9hdCAgICAgOyBicmVhazsKKyAgICAgIGNhc2UgRE9VQkxFOiAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBEb3VibGUgICAgOyBicmVhazsKKyAgICAgIGNhc2UgQk9PTEVBTjogICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuICAgOyBicmVhazsKKyAgICAgIGNhc2UgU1RSSU5HOiAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgICAgOyBicmVhazsKKyAgICAgIGNhc2UgQllURV9TVFJJTkc6ICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBCeXRlU3RyaW5nOyBicmVhazsKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgLy8gVE9ETyhrZW50b24pOiAgQ2FsbGVyIG11c3QgZG8gdHlwZSBjaGVja2luZyBoZXJlLCBJIGd1ZXNzLgorICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbC5FbnVtTGl0ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgIC8vIFRPRE8oa2VudG9uKTogIENhbGxlciBtdXN0IGRvIHR5cGUgY2hlY2tpbmcgaGVyZSwgSSBndWVzcy4KKyAgICAgICAgaXNWYWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgTWVzc2FnZUxpdGU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghaXNWYWxpZCkgeworICAgICAgLy8gVE9ETyhrZW50b24pOiAgV2hlbiBjaGFpbmluZyBjYWxscyB0byBzZXRGaWVsZCgpLCBpdCBjYW4gYmUgaGFyZCB0bworICAgICAgLy8gICB0ZWxsIGZyb20gdGhlIHN0YWNrIHRyYWNlIHdoaWNoIGV4YWN0IGNhbGwgZmFpbGVkLCBzaW5jZSB0aGUgd2hvbGUKKyAgICAgIC8vICAgY2hhaW4gaXMgY29uc2lkZXJlZCBvbmUgbGluZSBvZiBjb2RlLiAgSXQgd291bGQgYmUgbmljZSB0byBwcmludAorICAgICAgLy8gICBtb3JlIGluZm9ybWF0aW9uIGhlcmUsIGUuZy4gbmFtaW5nIHRoZSBmaWVsZC4gIFdlIHVzZWQgdG8gZG8gdGhhdC4KKyAgICAgIC8vICAgQnV0IHdlIGNhbid0IG5vdyB0aGF0IEZpZWxkU2V0IGRvZXNuJ3QgdXNlIGRlc2NyaXB0b3JzLiAgTWF5YmUgdGhpcworICAgICAgLy8gICBpc24ndCBhIGJpZyBkZWFsLCB0aG91Z2gsIHNpbmNlIGl0IHdvdWxkIG9ubHkgcmVhbGx5IGFwcGx5IHdoZW4gdXNpbmcKKyAgICAgIC8vICAgcmVmbGVjdGlvbiBhbmQgZ2VuZXJhbGx5IHBlb3BsZSBkb24ndCBjaGFpbiByZWZsZWN0aW9uIHNldHRlcnMuCisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAiV3Jvbmcgb2JqZWN0IHR5cGUgdXNlZCB3aXRoIHByb3RvY29sIG1lc3NhZ2UgcmVmbGVjdGlvbi4iKTsKKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBQYXJzaW5nIGFuZCBzZXJpYWxpemF0aW9uCisKKyAgLyoqCisgICAqIFNlZSB7QGxpbmsgTWVzc2FnZSNpc0luaXRpYWxpemVkKCl9LiAgTm90ZTogIFNpbmNlIHtAY29kZSBGaWVsZFNldH0KKyAgICogaXRzZWxmIGRvZXMgbm90IGhhdmUgYW55IHdheSBvZiBrbm93aW5nIGFib3V0IHJlcXVpcmVkIGZpZWxkcyB0aGF0CisgICAqIGFyZW4ndCBhY3R1YWxseSBwcmVzZW50IGluIHRoZSBzZXQsIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gY2hlY2sKKyAgICogdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5nZXROdW1BcnJheUVudHJpZXMoKTsgaSsrKSB7CisgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoZmllbGRzLmdldEFycmF5RW50cnlBdChpKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5IDoKKyAgICAgICAgICAgICBmaWVsZHMuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKKyAgICAgIGlmICghaXNJbml0aWFsaXplZChlbnRyeSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCgKKyAgICAgIGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5KSB7CisgICAgZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7CisgICAgaWYgKGRlc2NyaXB0b3IuZ2V0TGl0ZUphdmFUeXBlKCkgPT0gV2lyZUZvcm1hdC5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgZm9yIChmaW5hbCBNZXNzYWdlTGl0ZSBlbGVtZW50OgorICAgICAgICAgICAgICAgICAoTGlzdDxNZXNzYWdlTGl0ZT4pIGVudHJ5LmdldFZhbHVlKCkpIHsKKyAgICAgICAgICBpZiAoIWVsZW1lbnQuaXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoISgoTWVzc2FnZUxpdGUpIGVudHJ5LmdldFZhbHVlKCkpLmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBHaXZlbiBhIGZpZWxkIHR5cGUsIHJldHVybiB0aGUgd2lyZSB0eXBlLgorICAgKgorICAgKiBAcmV0dXJucyBPbmUgb2YgdGhlIHtAY29kZSBXSVJFVFlQRV99IGNvbnN0YW50cyBkZWZpbmVkIGluCisgICAqICAgICAgICAgIHtAbGluayBXaXJlRm9ybWF0fS4KKyAgICovCisgIHN0YXRpYyBpbnQgZ2V0V2lyZUZvcm1hdEZvckZpZWxkVHlwZShmaW5hbCBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BhY2tlZCkgeworICAgIGlmIChpc1BhY2tlZCkgeworICAgICAgcmV0dXJuIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR5cGUuZ2V0V2lyZVR5cGUoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTGlrZSB7QGxpbmsgI21lcmdlRnJvbShNZXNzYWdlKX0sIGJ1dCBtZXJnZXMgZnJvbSBhbm90aGVyIHtAbGluayBGaWVsZFNldH0uCisgICAqLworICBwdWJsaWMgdm9pZCBtZXJnZUZyb20oZmluYWwgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yVHlwZT4gb3RoZXIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG90aGVyLmZpZWxkcy5nZXROdW1BcnJheUVudHJpZXMoKTsgaSsrKSB7CisgICAgICBtZXJnZUZyb21GaWVsZChvdGhlci5maWVsZHMuZ2V0QXJyYXlFbnRyeUF0KGkpKTsKKyAgICB9CisgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6CisgICAgICAgICAgICAgb3RoZXIuZmllbGRzLmdldE92ZXJmbG93RW50cmllcygpKSB7CisgICAgICBtZXJnZUZyb21GaWVsZChlbnRyeSk7CisgICAgfQorICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHByaXZhdGUgdm9pZCBtZXJnZUZyb21GaWVsZCgKKyAgICAgIGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5KSB7CisgICAgZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7CisgICAgZmluYWwgT2JqZWN0IG90aGVyVmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworCisgICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7CisgICAgICBPYmplY3QgdmFsdWUgPSBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpOworICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgLy8gT3VyIGxpc3QgaXMgZW1wdHksIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIG1ha2UgYSBkZWZlbnNpdmUgY29weSBvZgorICAgICAgICAvLyB0aGUgb3RoZXIgbGlzdCBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoZSBvdGhlciBGaWVsZFNldCBpcyBzdGlsbAorICAgICAgICAvLyBtdXRhYmxlLgorICAgICAgICBmaWVsZHMucHV0KGRlc2NyaXB0b3IsIG5ldyBBcnJheUxpc3QoKExpc3QpIG90aGVyVmFsdWUpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENvbmNhdGVuYXRlIHRoZSBsaXN0cy4KKyAgICAgICAgKChMaXN0KSB2YWx1ZSkuYWRkQWxsKChMaXN0KSBvdGhlclZhbHVlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3IuZ2V0TGl0ZUphdmFUeXBlKCkgPT0gV2lyZUZvcm1hdC5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICBPYmplY3QgdmFsdWUgPSBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpOworICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgZmllbGRzLnB1dChkZXNjcmlwdG9yLCBvdGhlclZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE1lcmdlIHRoZSBtZXNzYWdlcy4KKyAgICAgICAgZmllbGRzLnB1dCgKKyAgICAgICAgICAgIGRlc2NyaXB0b3IsCisgICAgICAgICAgICBkZXNjcmlwdG9yLmludGVybmFsTWVyZ2VGcm9tKAorICAgICAgICAgICAgICAgICgoTWVzc2FnZUxpdGUpIHZhbHVlKS50b0J1aWxkZXIoKSwgKE1lc3NhZ2VMaXRlKSBvdGhlclZhbHVlKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgIGZpZWxkcy5wdXQoZGVzY3JpcHRvciwgb3RoZXJWYWx1ZSk7CisgICAgfQorICB9CisKKyAgLy8gVE9ETyhrZW50b24pOiAgTW92ZSBzdGF0aWMgcGFyc2luZyBhbmQgc2VyaWFsaXphdGlvbiBtZXRob2RzIGludG8gc29tZQorICAvLyAgIG90aGVyIGNsYXNzLiAgUHJvYmFibHkgV2lyZUZvcm1hdC4KKworICAvKioKKyAgICogUmVhZCBhIGZpZWxkIG9mIGFueSBwcmltaXRpdmUgdHlwZSBmcm9tIGEgQ29kZWRJbnB1dFN0cmVhbS4gIEVudW1zLAorICAgKiBncm91cHMsIGFuZCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgbm90IGhhbmRsZWQgYnkgdGhpcyBtZXRob2QuCisgICAqCisgICAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZC4KKyAgICogQHBhcmFtIHR5cGUgRGVjbGFyZWQgdHlwZSBvZiB0aGUgZmllbGQuCisgICAqIEByZXR1cm4gQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmllbGQncyB2YWx1ZSwgb2YgdGhlIGV4YWN0CisgICAqICAgICAgICAgdHlwZSB3aGljaCB3b3VsZCBiZSByZXR1cm5lZCBieQorICAgKiAgICAgICAgIHtAbGluayBNZXNzYWdlI2dldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9IGZvcgorICAgKiAgICAgICAgIHRoaXMgZmllbGQuCisgICAqLworICBwdWJsaWMgc3RhdGljIE9iamVjdCByZWFkUHJpbWl0aXZlRmllbGQoCisgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgRE9VQkxFICA6IHJldHVybiBpbnB1dC5yZWFkRG91YmxlICAoKTsKKyAgICAgIGNhc2UgRkxPQVQgICA6IHJldHVybiBpbnB1dC5yZWFkRmxvYXQgICAoKTsKKyAgICAgIGNhc2UgSU5UNjQgICA6IHJldHVybiBpbnB1dC5yZWFkSW50NjQgICAoKTsKKyAgICAgIGNhc2UgVUlOVDY0ICA6IHJldHVybiBpbnB1dC5yZWFkVUludDY0ICAoKTsKKyAgICAgIGNhc2UgSU5UMzIgICA6IHJldHVybiBpbnB1dC5yZWFkSW50MzIgICAoKTsKKyAgICAgIGNhc2UgRklYRUQ2NCA6IHJldHVybiBpbnB1dC5yZWFkRml4ZWQ2NCAoKTsKKyAgICAgIGNhc2UgRklYRUQzMiA6IHJldHVybiBpbnB1dC5yZWFkRml4ZWQzMiAoKTsKKyAgICAgIGNhc2UgQk9PTCAgICA6IHJldHVybiBpbnB1dC5yZWFkQm9vbCAgICAoKTsKKyAgICAgIGNhc2UgU1RSSU5HICA6IHJldHVybiBpbnB1dC5yZWFkU3RyaW5nICAoKTsKKyAgICAgIGNhc2UgQllURVMgICA6IHJldHVybiBpbnB1dC5yZWFkQnl0ZXMgICAoKTsKKyAgICAgIGNhc2UgVUlOVDMyICA6IHJldHVybiBpbnB1dC5yZWFkVUludDMyICAoKTsKKyAgICAgIGNhc2UgU0ZJWEVEMzI6IHJldHVybiBpbnB1dC5yZWFkU0ZpeGVkMzIoKTsKKyAgICAgIGNhc2UgU0ZJWEVENjQ6IHJldHVybiBpbnB1dC5yZWFkU0ZpeGVkNjQoKTsKKyAgICAgIGNhc2UgU0lOVDMyICA6IHJldHVybiBpbnB1dC5yZWFkU0ludDMyICAoKTsKKyAgICAgIGNhc2UgU0lOVDY0ICA6IHJldHVybiBpbnB1dC5yZWFkU0ludDY0ICAoKTsKKworICAgICAgY2FzZSBHUk9VUDoKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAicmVhZFByaW1pdGl2ZUZpZWxkKCkgY2Fubm90IGhhbmRsZSBuZXN0ZWQgZ3JvdXBzLiIpOworICAgICAgY2FzZSBNRVNTQUdFOgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJyZWFkUHJpbWl0aXZlRmllbGQoKSBjYW5ub3QgaGFuZGxlIGVtYmVkZGVkIG1lc3NhZ2VzLiIpOworICAgICAgY2FzZSBFTlVNOgorICAgICAgICAvLyBXZSBkb24ndCBoYW5kbGUgZW51bXMgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaWYgdGhlCisgICAgICAgIC8vIHZhbHVlIGlzIG5vdCByZWNvZ25pemVkLgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJyZWFkUHJpbWl0aXZlRmllbGQoKSBjYW5ub3QgaGFuZGxlIGVudW1zLiIpOworICAgIH0KKworICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgIlRoZXJlIGlzIG5vIHdheSB0byBnZXQgaGVyZSwgYnV0IHRoZSBjb21waWxlciB0aGlua3Mgb3RoZXJ3aXNlLiIpOworICB9CisKKyAgLyoqIFNlZSB7QGxpbmsgTWVzc2FnZSN3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtKX0uICovCisgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgeworICAgICAgZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgPQorICAgICAgICAgIGZpZWxkcy5nZXRBcnJheUVudHJ5QXQoaSk7CisgICAgICB3cml0ZUZpZWxkKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpLCBvdXRwdXQpOworICAgIH0KKyAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5IDoKKyAgICAgICAgIGZpZWxkcy5nZXRPdmVyZmxvd0VudHJpZXMoKSkgeworICAgICAgd3JpdGVGaWVsZChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTGlrZSB7QGxpbmsgI3dyaXRlVG99IGJ1dCB1c2VzIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQuCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VTZXRUbyhmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgeworICAgICAgd3JpdGVNZXNzYWdlU2V0VG8oZmllbGRzLmdldEFycmF5RW50cnlBdChpKSwgb3V0cHV0KTsKKyAgICB9CisgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6CisgICAgICAgICAgICAgZmllbGRzLmdldE92ZXJmbG93RW50cmllcygpKSB7CisgICAgICB3cml0ZU1lc3NhZ2VTZXRUbyhlbnRyeSwgb3V0cHV0KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVNZXNzYWdlU2V0VG8oCisgICAgICBmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSwKKyAgICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICBpZiAoZGVzY3JpcHRvci5nZXRMaXRlSmF2YVR5cGUoKSA9PSBXaXJlRm9ybWF0LkphdmFUeXBlLk1FU1NBR0UgJiYKKyAgICAgICAgIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpICYmICFkZXNjcmlwdG9yLmlzUGFja2VkKCkpIHsKKyAgICAgIG91dHB1dC53cml0ZU1lc3NhZ2VTZXRFeHRlbnNpb24oZW50cnkuZ2V0S2V5KCkuZ2V0TnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlTGl0ZSkgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlRmllbGQoZGVzY3JpcHRvciwgZW50cnkuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogV3JpdGUgYSBzaW5nbGUgdGFnLXZhbHVlIHBhaXIgdG8gdGhlIHN0cmVhbS4KKyAgICoKKyAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIHR5cGUgICBUaGUgZmllbGQncyB0eXBlLgorICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBmaWVsZCdzIG51bWJlci4KKyAgICogQHBhcmFtIHZhbHVlICBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCdzIHZhbHVlLiAgTXVzdCBiZSBvZiB0aGUgZXhhY3QKKyAgICogICAgICAgICAgICAgICB0eXBlIHdoaWNoIHdvdWxkIGJlIHJldHVybmVkIGJ5CisgICAqICAgICAgICAgICAgICAge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0gZm9yCisgICAqICAgICAgICAgICAgICAgdGhpcyBmaWVsZC4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVFbGVtZW50KGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgZ3JvdXBzLCB3aGljaCBuZWVkIGEgc3RhcnQgYW5kIGVuZCB0YWc7IG90aGVyIGZpZWxkcworICAgIC8vIGNhbiBqdXN0IHVzZSB3cml0ZVRhZygpIGFuZCB3cml0ZUZpZWxkTm9UYWcoKS4KKyAgICBpZiAodHlwZSA9PSBXaXJlRm9ybWF0LkZpZWxkVHlwZS5HUk9VUCkgeworICAgICAgb3V0cHV0LndyaXRlR3JvdXAobnVtYmVyLCAoTWVzc2FnZUxpdGUpIHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0cHV0LndyaXRlVGFnKG51bWJlciwgZ2V0V2lyZUZvcm1hdEZvckZpZWxkVHlwZSh0eXBlLCBmYWxzZSkpOworICAgICAgd3JpdGVFbGVtZW50Tm9UYWcob3V0cHV0LCB0eXBlLCB2YWx1ZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdyaXRlIGEgZmllbGQgb2YgYXJiaXRyYXJ5IHR5cGUsIHdpdGhvdXQgaXRzIHRhZywgdG8gdGhlIHN0cmVhbS4KKyAgICoKKyAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIHR5cGUgVGhlIGZpZWxkJ3MgdHlwZS4KKyAgICogQHBhcmFtIHZhbHVlICBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCdzIHZhbHVlLiAgTXVzdCBiZSBvZiB0aGUgZXhhY3QKKyAgICogICAgICAgICAgICAgICB0eXBlIHdoaWNoIHdvdWxkIGJlIHJldHVybmVkIGJ5CisgICAqICAgICAgICAgICAgICAge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0gZm9yCisgICAqICAgICAgICAgICAgICAgdGhpcyBmaWVsZC4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVFbGVtZW50Tm9UYWcoCisgICAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQsCisgICAgICBmaW5hbCBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlLAorICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBET1VCTEUgIDogb3V0cHV0LndyaXRlRG91YmxlTm9UYWcgICgoRG91YmxlICAgICApIHZhbHVlKTsgYnJlYWs7CisgICAgICBjYXNlIEZMT0FUICAgOiBvdXRwdXQud3JpdGVGbG9hdE5vVGFnICAgKChGbG9hdCAgICAgICkgdmFsdWUpOyBicmVhazsKKyAgICAgIGNhc2UgSU5UNjQgICA6IG91dHB1dC53cml0ZUludDY0Tm9UYWcgICAoKExvbmcgICAgICAgKSB2YWx1ZSk7IGJyZWFrOworICAgICAgY2FzZSBVSU5UNjQgIDogb3V0cHV0LndyaXRlVUludDY0Tm9UYWcgICgoTG9uZyAgICAgICApIHZhbHVlKTsgYnJlYWs7CisgICAgICBjYXNlIElOVDMyICAgOiBvdXRwdXQud3JpdGVJbnQzMk5vVGFnICAgKChJbnRlZ2VyICAgICkgdmFsdWUpOyBicmVhazsKKyAgICAgIGNhc2UgRklYRUQ2NCA6IG91dHB1dC53cml0ZUZpeGVkNjROb1RhZyAoKExvbmcgICAgICAgKSB2YWx1ZSk7IGJyZWFrOworICAgICAgY2FzZSBGSVhFRDMyIDogb3V0cHV0LndyaXRlRml4ZWQzMk5vVGFnICgoSW50ZWdlciAgICApIHZhbHVlKTsgYnJlYWs7CisgICAgICBjYXNlIEJPT0wgICAgOiBvdXRwdXQud3JpdGVCb29sTm9UYWcgICAgKChCb29sZWFuICAgICkgdmFsdWUpOyBicmVhazsKKyAgICAgIGNhc2UgU1RSSU5HICA6IG91dHB1dC53cml0ZVN0cmluZ05vVGFnICAoKFN0cmluZyAgICAgKSB2YWx1ZSk7IGJyZWFrOworICAgICAgY2FzZSBHUk9VUCAgIDogb3V0cHV0LndyaXRlR3JvdXBOb1RhZyAgICgoTWVzc2FnZUxpdGUpIHZhbHVlKTsgYnJlYWs7CisgICAgICBjYXNlIE1FU1NBR0UgOiBvdXRwdXQud3JpdGVNZXNzYWdlTm9UYWcgKChNZXNzYWdlTGl0ZSkgdmFsdWUpOyBicmVhazsKKyAgICAgIGNhc2UgQllURVMgICA6IG91dHB1dC53cml0ZUJ5dGVzTm9UYWcgICAoKEJ5dGVTdHJpbmcgKSB2YWx1ZSk7IGJyZWFrOworICAgICAgY2FzZSBVSU5UMzIgIDogb3V0cHV0LndyaXRlVUludDMyTm9UYWcgICgoSW50ZWdlciAgICApIHZhbHVlKTsgYnJlYWs7CisgICAgICBjYXNlIFNGSVhFRDMyOiBvdXRwdXQud3JpdGVTRml4ZWQzMk5vVGFnKChJbnRlZ2VyICAgICkgdmFsdWUpOyBicmVhazsKKyAgICAgIGNhc2UgU0ZJWEVENjQ6IG91dHB1dC53cml0ZVNGaXhlZDY0Tm9UYWcoKExvbmcgICAgICAgKSB2YWx1ZSk7IGJyZWFrOworICAgICAgY2FzZSBTSU5UMzIgIDogb3V0cHV0LndyaXRlU0ludDMyTm9UYWcgICgoSW50ZWdlciAgICApIHZhbHVlKTsgYnJlYWs7CisgICAgICBjYXNlIFNJTlQ2NCAgOiBvdXRwdXQud3JpdGVTSW50NjROb1RhZyAgKChMb25nICAgICAgICkgdmFsdWUpOyBicmVhazsKKworICAgICAgY2FzZSBFTlVNOgorICAgICAgICBvdXRwdXQud3JpdGVFbnVtTm9UYWcoKChJbnRlcm5hbC5FbnVtTGl0ZSkgdmFsdWUpLmdldE51bWJlcigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLyoqIFdyaXRlIGEgc2luZ2xlIGZpZWxkLiAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3JMaXRlPD8+IGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUgPSBkZXNjcmlwdG9yLmdldExpdGVUeXBlKCk7CisgICAgaW50IG51bWJlciA9IGRlc2NyaXB0b3IuZ2V0TnVtYmVyKCk7CisgICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7CisgICAgICBmaW5hbCBMaXN0PD8+IHZhbHVlTGlzdCA9IChMaXN0PD8+KXZhbHVlOworICAgICAgaWYgKGRlc2NyaXB0b3IuaXNQYWNrZWQoKSkgeworICAgICAgICBvdXRwdXQud3JpdGVUYWcobnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICAgICAgICAvLyBDb21wdXRlIHRoZSB0b3RhbCBkYXRhIHNpemUgc28gdGhlIGxlbmd0aCBjYW4gYmUgd3JpdHRlbi4KKyAgICAgICAgaW50IGRhdGFTaXplID0gMDsKKyAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IHZhbHVlTGlzdCkgeworICAgICAgICAgIGRhdGFTaXplICs9IGNvbXB1dGVFbGVtZW50U2l6ZU5vVGFnKHR5cGUsIGVsZW1lbnQpOworICAgICAgICB9CisgICAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKGRhdGFTaXplKTsKKyAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgaXRzZWxmLCB3aXRob3V0IGFueSB0YWdzLgorICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogdmFsdWVMaXN0KSB7CisgICAgICAgICAgd3JpdGVFbGVtZW50Tm9UYWcob3V0cHV0LCB0eXBlLCBlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IHZhbHVlTGlzdCkgeworICAgICAgICAgIHdyaXRlRWxlbWVudChvdXRwdXQsIHR5cGUsIG51bWJlciwgZWxlbWVudCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVFbGVtZW50KG91dHB1dCwgdHlwZSwgbnVtYmVyLCB2YWx1ZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNlZSB7QGxpbmsgTWVzc2FnZSNnZXRTZXJpYWxpemVkU2l6ZSgpfS4gIEl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBjYWNoZQorICAgKiB0aGUgcmVzdWx0aW5nIHNpemUgaWYgZGVzaXJlZC4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7CisgICAgaW50IHNpemUgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKKyAgICAgIGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5ID0KKyAgICAgICAgICBmaWVsZHMuZ2V0QXJyYXlFbnRyeUF0KGkpOworICAgICAgc2l6ZSArPSBjb21wdXRlRmllbGRTaXplKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICB9CisgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6CisgICAgICAgICBmaWVsZHMuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKKyAgICAgIHNpemUgKz0gY29tcHV0ZUZpZWxkU2l6ZShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgfQorICAgIHJldHVybiBzaXplOworICB9CisKKyAgLyoqCisgICAqIExpa2Uge0BsaW5rICNnZXRTZXJpYWxpemVkU2l6ZX0gYnV0IHVzZXMgTWVzc2FnZVNldCB3aXJlIGZvcm1hdC4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKCkgeworICAgIGludCBzaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5nZXROdW1BcnJheUVudHJpZXMoKTsgaSsrKSB7CisgICAgICBzaXplICs9IGdldE1lc3NhZ2VTZXRTZXJpYWxpemVkU2l6ZShmaWVsZHMuZ2V0QXJyYXlFbnRyeUF0KGkpKTsKKyAgICB9CisgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6CisgICAgICAgICAgICAgZmllbGRzLmdldE92ZXJmbG93RW50cmllcygpKSB7CisgICAgICBzaXplICs9IGdldE1lc3NhZ2VTZXRTZXJpYWxpemVkU2l6ZShlbnRyeSk7CisgICAgfQorICAgIHJldHVybiBzaXplOworICB9CisKKyAgcHJpdmF0ZSBpbnQgZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKAorICAgICAgZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkpIHsKKyAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICBpZiAoZGVzY3JpcHRvci5nZXRMaXRlSmF2YVR5cGUoKSA9PSBXaXJlRm9ybWF0LkphdmFUeXBlLk1FU1NBR0UgJiYKKyAgICAgICAgIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpICYmICFkZXNjcmlwdG9yLmlzUGFja2VkKCkpIHsKKyAgICAgIHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlTWVzc2FnZVNldEV4dGVuc2lvblNpemUoCisgICAgICAgICAgZW50cnkuZ2V0S2V5KCkuZ2V0TnVtYmVyKCksIChNZXNzYWdlTGl0ZSkgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjb21wdXRlRmllbGRTaXplKGRlc2NyaXB0b3IsIGVudHJ5LmdldFZhbHVlKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKKyAgICogc2luZ2xlIHRhZy92YWx1ZSBwYWlyIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKgorICAgKiBAcGFyYW0gdHlwZSAgIFRoZSBmaWVsZCdzIHR5cGUuCisgICAqIEBwYXJhbSBudW1iZXIgVGhlIGZpZWxkJ3MgbnVtYmVyLgorICAgKiBAcGFyYW0gdmFsdWUgIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGZpZWxkJ3MgdmFsdWUuICBNdXN0IGJlIG9mIHRoZSBleGFjdAorICAgKiAgICAgICAgICAgICAgIHR5cGUgd2hpY2ggd291bGQgYmUgcmV0dXJuZWQgYnkKKyAgICogICAgICAgICAgICAgICB7QGxpbmsgTWVzc2FnZSNnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfSBmb3IKKyAgICogICAgICAgICAgICAgICB0aGlzIGZpZWxkLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXB1dGVFbGVtZW50U2l6ZSgKKyAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCisgICAgICBmaW5hbCBpbnQgbnVtYmVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICBpbnQgdGFnU2l6ZSA9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVUYWdTaXplKG51bWJlcik7CisgICAgaWYgKHR5cGUgPT0gV2lyZUZvcm1hdC5GaWVsZFR5cGUuR1JPVVApIHsKKyAgICAgIHRhZ1NpemUgKj0gMjsKKyAgICB9CisgICAgcmV0dXJuIHRhZ1NpemUgKyBjb21wdXRlRWxlbWVudFNpemVOb1RhZyh0eXBlLCB2YWx1ZSk7CisgIH0KKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCisgICAqIHBhcnRpY3VsYXIgdmFsdWUgb2YgYXJiaXRyYXJ5IHR5cGUsIGV4Y2x1ZGluZyB0YWcuCisgICAqCisgICAqIEBwYXJhbSB0eXBlICAgVGhlIGZpZWxkJ3MgdHlwZS4KKyAgICogQHBhcmFtIHZhbHVlICBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCdzIHZhbHVlLiAgTXVzdCBiZSBvZiB0aGUgZXhhY3QKKyAgICogICAgICAgICAgICAgICB0eXBlIHdoaWNoIHdvdWxkIGJlIHJldHVybmVkIGJ5CisgICAqICAgICAgICAgICAgICAge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0gZm9yCisgICAqICAgICAgICAgICAgICAgdGhpcyBmaWVsZC4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGludCBjb21wdXRlRWxlbWVudFNpemVOb1RhZygKKyAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgLy8gTm90ZTogIE1pbm9yIHZpb2xhdGlvbiBvZiA4MC1jaGFyIGxpbWl0IHJ1bGUgaGVyZSBiZWNhdXNlIHRoaXMgd291bGQKKyAgICAgIC8vICAgYWN0dWFsbHkgYmUgaGFyZGVyIHRvIHJlYWQgaWYgd2Ugd3JhcHBlZCB0aGUgbGluZXMuCisgICAgICBjYXNlIERPVUJMRSAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZURvdWJsZVNpemVOb1RhZyAgKChEb3VibGUgICAgICl2YWx1ZSk7CisgICAgICBjYXNlIEZMT0FUICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUZsb2F0U2l6ZU5vVGFnICAgKChGbG9hdCAgICAgICl2YWx1ZSk7CisgICAgICBjYXNlIElOVDY0ICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUludDY0U2l6ZU5vVGFnICAgKChMb25nICAgICAgICl2YWx1ZSk7CisgICAgICBjYXNlIFVJTlQ2NCAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVVJbnQ2NFNpemVOb1RhZyAgKChMb25nICAgICAgICl2YWx1ZSk7CisgICAgICBjYXNlIElOVDMyICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUludDMyU2l6ZU5vVGFnICAgKChJbnRlZ2VyICAgICl2YWx1ZSk7CisgICAgICBjYXNlIEZJWEVENjQgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUZpeGVkNjRTaXplTm9UYWcgKChMb25nICAgICAgICl2YWx1ZSk7CisgICAgICBjYXNlIEZJWEVEMzIgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUZpeGVkMzJTaXplTm9UYWcgKChJbnRlZ2VyICAgICl2YWx1ZSk7CisgICAgICBjYXNlIEJPT0wgICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUJvb2xTaXplTm9UYWcgICAgKChCb29sZWFuICAgICl2YWx1ZSk7CisgICAgICBjYXNlIFNUUklORyAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVN0cmluZ1NpemVOb1RhZyAgKChTdHJpbmcgICAgICl2YWx1ZSk7CisgICAgICBjYXNlIEdST1VQICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUdyb3VwU2l6ZU5vVGFnICAgKChNZXNzYWdlTGl0ZSl2YWx1ZSk7CisgICAgICBjYXNlIE1FU1NBR0UgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZU1lc3NhZ2VTaXplTm9UYWcgKChNZXNzYWdlTGl0ZSl2YWx1ZSk7CisgICAgICBjYXNlIEJZVEVTICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUJ5dGVzU2l6ZU5vVGFnICAgKChCeXRlU3RyaW5nICl2YWx1ZSk7CisgICAgICBjYXNlIFVJTlQzMiAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVVJbnQzMlNpemVOb1RhZyAgKChJbnRlZ2VyICAgICl2YWx1ZSk7CisgICAgICBjYXNlIFNGSVhFRDMyOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVNGaXhlZDMyU2l6ZU5vVGFnKChJbnRlZ2VyICAgICl2YWx1ZSk7CisgICAgICBjYXNlIFNGSVhFRDY0OiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVNGaXhlZDY0U2l6ZU5vVGFnKChMb25nICAgICAgICl2YWx1ZSk7CisgICAgICBjYXNlIFNJTlQzMiAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVNJbnQzMlNpemVOb1RhZyAgKChJbnRlZ2VyICAgICl2YWx1ZSk7CisgICAgICBjYXNlIFNJTlQ2NCAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVNJbnQ2NFNpemVOb1RhZyAgKChMb25nICAgICAgICl2YWx1ZSk7CisKKyAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVFbnVtU2l6ZU5vVGFnKAorICAgICAgICAgICAgKChJbnRlcm5hbC5FbnVtTGl0ZSkgdmFsdWUpLmdldE51bWJlcigpKTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICJUaGVyZSBpcyBubyB3YXkgdG8gZ2V0IGhlcmUsIGJ1dCB0aGUgY29tcGlsZXIgdGhpbmtzIG90aGVyd2lzZS4iKTsKKyAgfQorCisgIC8qKgorICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGVuY29kZSBhIHBhcnRpY3VsYXIgZmllbGQuCisgICAqLworICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRmllbGRTaXplKGZpbmFsIEZpZWxkRGVzY3JpcHRvckxpdGU8Pz4gZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlID0gZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpOworICAgIGludCBudW1iZXIgPSBkZXNjcmlwdG9yLmdldE51bWJlcigpOworICAgIGlmIChkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgeworICAgICAgaWYgKGRlc2NyaXB0b3IuaXNQYWNrZWQoKSkgeworICAgICAgICBpbnQgZGF0YVNpemUgPSAwOworICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3Q8Pz4pdmFsdWUpIHsKKyAgICAgICAgICBkYXRhU2l6ZSArPSBjb21wdXRlRWxlbWVudFNpemVOb1RhZyh0eXBlLCBlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YVNpemUgKworICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVRhZ1NpemUobnVtYmVyKSArCisgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlUmF3VmFyaW50MzJTaXplKGRhdGFTaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IChMaXN0PD8+KXZhbHVlKSB7CisgICAgICAgICAgc2l6ZSArPSBjb21wdXRlRWxlbWVudFNpemUodHlwZSwgbnVtYmVyLCBlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGNvbXB1dGVFbGVtZW50U2l6ZSh0eXBlLCBudW1iZXIsIHZhbHVlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZWFkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTgzNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKKy8qKgorICogQWxsIGdlbmVyYXRlZCBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgZXh0ZW5kIHRoaXMgY2xhc3MuICBUaGlzIGNsYXNzCisgKiBpbXBsZW1lbnRzIG1vc3Qgb2YgdGhlIE1lc3NhZ2UgYW5kIEJ1aWxkZXIgaW50ZXJmYWNlcyB1c2luZyBKYXZhIHJlZmxlY3Rpb24uCisgKiBVc2VycyBjYW4gaWdub3JlIHRoaXMgY2xhc3MgYW5kIHByZXRlbmQgdGhhdCBnZW5lcmF0ZWQgbWVzc2FnZXMgaW1wbGVtZW50CisgKiB0aGUgTWVzc2FnZSBpbnRlcmZhY2UgZGlyZWN0bHkuCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2UgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UKKyAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHByaXZhdGUgZmluYWwgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHM7CisKKyAgLyoqCisgICAqIEZvciB0ZXN0aW5nLiBBbGxvd3MgYSB0ZXN0IHRvIGRpc2FibGUgdGhlIG9wdGltaXphdGlvbiB0aGF0IGF2b2lkcyB1c2luZworICAgKiBmaWVsZCBidWlsZGVycyBmb3IgbmVzdGVkIG1lc3NhZ2VzIHVudGlsIHRoZXkgYXJlIHJlcXVlc3RlZC4gQnkgZGlzYWJsaW5nCisgICAqIHRoaXMgb3B0aW1pemF0aW9uLCBleGlzdGluZyB0ZXN0cyBjYW4gYmUgcmV1c2VkIHRvIHRlc3QgdGhlIGZpZWxkIGJ1aWxkZXJzLgorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGFsd2F5c1VzZUZpZWxkQnVpbGRlcnMgPSBmYWxzZTsKKworICBwcm90ZWN0ZWQgR2VuZXJhdGVkTWVzc2FnZSgpIHsKKyAgICB0aGlzLnVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7CisgIH0KKworICBwcm90ZWN0ZWQgR2VuZXJhdGVkTWVzc2FnZShCdWlsZGVyPD8+IGJ1aWxkZXIpIHsKKyAgICB0aGlzLnVua25vd25GaWVsZHMgPSBidWlsZGVyLmdldFVua25vd25GaWVsZHMoKTsKKyAgfQorCisgLyoqCisgICogRm9yIHRlc3RpbmcuIEFsbG93cyBhIHRlc3QgdG8gZGlzYWJsZSB0aGUgb3B0aW1pemF0aW9uIHRoYXQgYXZvaWRzIHVzaW5nCisgICogZmllbGQgYnVpbGRlcnMgZm9yIG5lc3RlZCBtZXNzYWdlcyB1bnRpbCB0aGV5IGFyZSByZXF1ZXN0ZWQuIEJ5IGRpc2FibGluZworICAqIHRoaXMgb3B0aW1pemF0aW9uLCBleGlzdGluZyB0ZXN0cyBjYW4gYmUgcmV1c2VkIHRvIHRlc3QgdGhlIGZpZWxkIGJ1aWxkZXJzLgorICAqIFNlZSB7QGxpbmsgUmVwZWF0ZWRGaWVsZEJ1aWxkZXJ9IGFuZCB7QGxpbmsgU2luZ2xlRmllbGRCdWlsZGVyfS4KKyAgKi8KKyAgc3RhdGljIHZvaWQgZW5hYmxlQWx3YXlzVXNlRmllbGRCdWlsZGVyc0ZvclRlc3RpbmcoKSB7CisgICAgYWx3YXlzVXNlRmllbGRCdWlsZGVycyA9IHRydWU7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBGaWVsZEFjY2Vzc29yVGFibGUgZm9yIHRoaXMgdHlwZS4gIFdlIGNhbid0IGhhdmUgdGhlIG1lc3NhZ2UKKyAgICogY2xhc3MgcGFzcyB0aGlzIGluIHRvIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIG9mIGJvb3RzdHJhcHBpbmcgdHJvdWJsZQorICAgKiB3aXRoIERlc2NyaXB0b3JQcm90b3MuCisgICAqLworICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmllbGRBY2Nlc3NvclRhYmxlIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCk7CisKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIHB1YmxpYyBEZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgeworICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmRlc2NyaXB0b3I7CisgIH0KKworICAvKiogSW50ZXJuYWwgaGVscGVyIHdoaWNoIHJldHVybnMgYSBtdXRhYmxlIG1hcC4gKi8KKyAgcHJpdmF0ZSBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkc011dGFibGUoKSB7CisgICAgZmluYWwgVHJlZU1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gcmVzdWx0ID0KKyAgICAgIG5ldyBUcmVlTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PigpOworICAgIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZGVzY3JpcHRvcjsKKyAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IGRlc2NyaXB0b3IuZ2V0RmllbGRzKCkpIHsKKyAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgZmluYWwgTGlzdDw/PiB2YWx1ZSA9IChMaXN0PD8+KSBnZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmICghdmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgcmVzdWx0LnB1dChmaWVsZCwgdmFsdWUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaGFzRmllbGQoZmllbGQpKSB7CisgICAgICAgICAgcmVzdWx0LnB1dChmaWVsZCwgZ2V0RmllbGQoZmllbGQpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7CisgICAgZm9yIChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgOiBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldEZpZWxkcygpKSB7CisgICAgICAvLyBDaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuCisgICAgICBpZiAoZmllbGQuaXNSZXF1aXJlZCgpKSB7CisgICAgICAgIGlmICghaGFzRmllbGQoZmllbGQpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBDaGVjayB0aGF0IGVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBpbml0aWFsaXplZC4KKyAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgZmluYWwKKyAgICAgICAgICBMaXN0PE1lc3NhZ2U+IG1lc3NhZ2VMaXN0ID0gKExpc3Q8TWVzc2FnZT4pIGdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICBmb3IgKGZpbmFsIE1lc3NhZ2UgZWxlbWVudCA6IG1lc3NhZ2VMaXN0KSB7CisgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGhhc0ZpZWxkKGZpZWxkKSAmJiAhKChNZXNzYWdlKSBnZXRGaWVsZChmaWVsZCkpLmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIHB1YmxpYyBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGdldEFsbEZpZWxkc011dGFibGUoKSk7CisgIH0KKworICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgcmV0dXJuIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpLmhhcyh0aGlzKTsKKyAgfQorCisgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5nZXQodGhpcyk7CisgIH0KKworICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgcmV0dXJuIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpCisgICAgICAuZ2V0UmVwZWF0ZWRDb3VudCh0aGlzKTsKKyAgfQorCisgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLCBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkKKyAgICAgIC5nZXRSZXBlYXRlZCh0aGlzLCBpbmRleCk7CisgIH0KKworICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgcHVibGljIGZpbmFsIFVua25vd25GaWVsZFNldCBnZXRVbmtub3duRmllbGRzKCkgeworICAgIHJldHVybiB1bmtub3duRmllbGRzOworICB9CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IE1lc3NhZ2UuQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZShCdWlsZGVyUGFyZW50IHBhcmVudCk7CisKKyAgLyoqCisgICAqIEludGVyZmFjZSBmb3IgdGhlIHBhcmVudCBvZiBhIEJ1aWxkZXIgdGhhdCBhbGxvd3MgdGhlIGJ1aWxkZXIgdG8KKyAgICogY29tbXVuaWNhdGUgaW52YWxpZGF0aW9ucyBiYWNrIHRvIHRoZSBwYXJlbnQgZm9yIHVzZSB3aGVuIHVzaW5nIG5lc3RlZAorICAgKiBidWlsZGVycy4KKyAgICovCisgIHByb3RlY3RlZCBpbnRlcmZhY2UgQnVpbGRlclBhcmVudCB7CisKKyAgICAvKioKKyAgICAgKiBBIGJ1aWxkZXIgYmVjb21lcyBkaXJ0eSB3aGVuZXZlciBhIGZpZWxkIGlzIG1vZGlmaWVkIC0tIGluY2x1ZGluZyBmaWVsZHMKKyAgICAgKiBpbiBuZXN0ZWQgYnVpbGRlcnMgLS0gYW5kIGJlY29tZXMgY2xlYW4gd2hlbiBidWlsZCgpIGlzIGNhbGxlZC4gIFRodXMsCisgICAgICogd2hlbiBhIGJ1aWxkZXIgYmVjb21lcyBkaXJ0eSwgYWxsIGl0cyBwYXJlbnRzIGJlY29tZSBkaXJ0eSBhcyB3ZWxsLCBhbmQKKyAgICAgKiB3aGVuIGl0IGJlY29tZXMgY2xlYW4sIGFsbCBpdHMgY2hpbGRyZW4gYmVjb21lIGNsZWFuLiAgVGhlIGRpcnRpbmVzcworICAgICAqIHN0YXRlIGlzIHVzZWQgdG8gaW52YWxpZGF0ZSBjZXJ0YWluIGNhY2hlZCB2YWx1ZXMuCisgICAgICogPGJyPgorICAgICAqIFRvIHRoaXMgZW5kLCBhIGJ1aWxkZXIgY2FsbHMgbWFya0FzRGlydHkoKSBvbiBpdHMgcGFyZW50IHdoZW5ldmVyIGl0CisgICAgICogdHJhbnNpdGlvbnMgZnJvbSBjbGVhbiB0byBkaXJ0eS4gIFRoZSBwYXJlbnQgbXVzdCBwcm9wYWdhdGUgdGhpcyBjYWxsIHRvCisgICAgICogaXRzIG93biBwYXJlbnQsIHVubGVzcyBpdCB3YXMgYWxyZWFkeSBkaXJ0eSwgaW4gd2hpY2ggY2FzZSB0aGUKKyAgICAgKiBncmFuZHBhcmVudCBtdXN0IG5lY2Vzc2FyaWx5IGFscmVhZHkgYmUgZGlydHkgYXMgd2VsbC4gIFRoZSBwYXJlbnQgY2FuCisgICAgICogb25seSB0cmFuc2l0aW9uIGJhY2sgdG8gImNsZWFuIiBhZnRlciBjYWxsaW5nIGJ1aWxkKCkgb24gYWxsIGNoaWxkcmVuLgorICAgICAqLworICAgIHZvaWQgbWFya0RpcnR5KCk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCdWlsZGVyIDxCdWlsZGVyVHlwZSBleHRlbmRzIEJ1aWxkZXI+CisgICAgICBleHRlbmRzIEFic3RyYWN0TWVzc2FnZS5CdWlsZGVyPEJ1aWxkZXJUeXBlPiB7CisKKyAgICBwcml2YXRlIEJ1aWxkZXJQYXJlbnQgYnVpbGRlclBhcmVudDsKKworICAgIHByaXZhdGUgQnVpbGRlclBhcmVudEltcGwgbWVBc1BhcmVudDsKKworICAgIC8vIEluZGljYXRlcyB0aGF0IHdlJ3ZlIGJ1aWx0IGEgbWVzc2FnZSBhbmQgc28gd2UgYXJlIG5vdyBvYmxpZ2F0ZWQKKyAgICAvLyB0byBkaXNwYXRjaCBkaXJ0eSBpbnZhbGlkYXRpb25zLiBTZWUgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyTGlzdGVuZXIuCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xlYW47CisKKyAgICBwcml2YXRlIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzID0KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOworCisgICAgcHJvdGVjdGVkIEJ1aWxkZXIoKSB7CisgICAgICB0aGlzKG51bGwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBCdWlsZGVyKEJ1aWxkZXJQYXJlbnQgYnVpbGRlclBhcmVudCkgeworICAgICAgdGhpcy5idWlsZGVyUGFyZW50ID0gYnVpbGRlclBhcmVudDsKKyAgICB9CisKKyAgICB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICBidWlsZGVyUGFyZW50ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHN1YmNsYXNzIHdoZW4gYSBtZXNzYWdlIGlzIGJ1aWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG9uQnVpbHQoKSB7CisgICAgICBpZiAoYnVpbGRlclBhcmVudCAhPSBudWxsKSB7CisgICAgICAgIG1hcmtDbGVhbigpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgc3ViY2xhc3Mgb3IgYSBidWlsZGVyIHRvIG5vdGlmeSB1cyB0aGF0IGEgbWVzc2FnZSB3YXMKKyAgICAgKiBidWlsdCBhbmQgbWF5IGJlIGNhY2hlZCBhbmQgdGhlcmVmb3JlIGludmFsaWRhdGlvbnMgYXJlIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBtYXJrQ2xlYW4oKSB7CisgICAgICB0aGlzLmlzQ2xlYW4gPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciBpbnZhbGlkYXRpb25zIGFyZSBuZWVkZWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciBpbnZhbGlkYXRpb25zIGFyZSBuZWVkZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NsZWFuKCkgeworICAgICAgcmV0dXJuIGlzQ2xlYW47CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBpbXBsZW1lbnRlZCBoZXJlIG9ubHkgdG8gd29yayBhcm91bmQgYW4gYXBwYXJlbnQgYnVnIGluIHRoZQorICAgIC8vIEphdmEgY29tcGlsZXIgYW5kL29yIGJ1aWxkIHN5c3RlbS4gIFNlZSBidWcgIzE4OTg0NjMuICBUaGUgbWVyZSBwcmVzZW5jZQorICAgIC8vIG9mIHRoaXMgZHVtbXkgY2xvbmUoKSBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBnbyBhd2F5LgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbG9uZSgpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBpbml0aWFsaXphdGlvbiBhbmQgY2xlYXIgY29kZSBwYXRocyB0byBhbGxvdyBzdWJjbGFzc2VzIHRvCisgICAgICogcmVzZXQgYW55IG9mIHRoZWlyIGJ1aWx0aW4gZmllbGRzIGJhY2sgdG8gdGhlIGluaXRpYWwgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbGVhcigpIHsKKyAgICAgIHVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7CisgICAgICBvbkNoYW5nZWQoKTsKKyAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBGaWVsZEFjY2Vzc29yVGFibGUgZm9yIHRoaXMgdHlwZS4gIFdlIGNhbid0IGhhdmUgdGhlIG1lc3NhZ2UKKyAgICAgKiBjbGFzcyBwYXNzIHRoaXMgaW4gdG8gdGhlIGNvbnN0cnVjdG9yIGJlY2F1c2Ugb2YgYm9vdHN0cmFwcGluZyB0cm91YmxlCisgICAgICogd2l0aCBEZXNjcmlwdG9yUHJvdG9zLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGaWVsZEFjY2Vzc29yVGFibGUgaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKTsKKworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBEZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgeworICAgICAgcmV0dXJuIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGdldEFsbEZpZWxkc011dGFibGUoKSk7CisgICAgfQorCisgICAgLyoqIEludGVybmFsIGhlbHBlciB3aGljaCByZXR1cm5zIGEgbXV0YWJsZSBtYXAuICovCisgICAgcHJpdmF0ZSBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkc011dGFibGUoKSB7CisgICAgICBmaW5hbCBUcmVlTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiByZXN1bHQgPQorICAgICAgICBuZXcgVHJlZU1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4oKTsKKyAgICAgIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZGVzY3JpcHRvcjsKKyAgICAgIGZvciAoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkIDogZGVzY3JpcHRvci5nZXRGaWVsZHMoKSkgeworICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgZmluYWwgTGlzdCB2YWx1ZSA9IChMaXN0KSBnZXRGaWVsZChmaWVsZCk7CisgICAgICAgICAgaWYgKCF2YWx1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdC5wdXQoZmllbGQsIHZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGhhc0ZpZWxkKGZpZWxkKSkgeworICAgICAgICAgICAgcmVzdWx0LnB1dChmaWVsZCwgZ2V0RmllbGQoZmllbGQpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBuZXdCdWlsZGVyRm9yRmllbGQoCisgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgcmV0dXJuIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpLm5ld0J1aWxkZXIoKTsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5oYXModGhpcyk7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIE9iamVjdCBvYmplY3QgPSBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5nZXQodGhpcyk7CisgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgIC8vIFRoZSB1bmRlcmx5aW5nIGxpc3Qgb2JqZWN0IGlzIHN0aWxsIG1vZGlmaWFibGUgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgLy8gTWFrZSBzdXJlIG5vdCB0byBleHBvc2UgdGhlIG1vZGlmaWFibGUgbGlzdCB0byB0aGUgY2FsbGVyLgorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgoTGlzdCkgb2JqZWN0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIHNldEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5zZXQodGhpcywgdmFsdWUpOworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXJGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpLmNsZWFyKHRoaXMpOworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKQorICAgICAgICAgIC5nZXRSZXBlYXRlZENvdW50KHRoaXMpOworICAgIH0KKworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkgeworICAgICAgcmV0dXJuIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpCisgICAgICAgICAgLmdldFJlcGVhdGVkKHRoaXMsIGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgc2V0UmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpCisgICAgICAgIC5zZXRSZXBlYXRlZCh0aGlzLCBpbmRleCwgdmFsdWUpOworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgYWRkUmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5hZGRSZXBlYXRlZCh0aGlzLCB2YWx1ZSk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBCdWlsZGVyVHlwZSBzZXRVbmtub3duRmllbGRzKAorICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykgeworICAgICAgdGhpcy51bmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkczsKKyAgICAgIG9uQ2hhbmdlZCgpOworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgQnVpbGRlclR5cGUgbWVyZ2VVbmtub3duRmllbGRzKAorICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykgeworICAgICAgdGhpcy51bmtub3duRmllbGRzID0KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIodGhpcy51bmtub3duRmllbGRzKQorICAgICAgICAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKHVua25vd25GaWVsZHMpCisgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgb25DaGFuZ2VkKCk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7CisgICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RmllbGRzKCkpIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LgorICAgICAgICBpZiAoZmllbGQuaXNSZXF1aXJlZCgpKSB7CisgICAgICAgICAgaWYgKCFoYXNGaWVsZChmaWVsZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIGZpbmFsCisgICAgICAgICAgICBMaXN0PE1lc3NhZ2U+IG1lc3NhZ2VMaXN0ID0gKExpc3Q8TWVzc2FnZT4pIGdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgTWVzc2FnZSBlbGVtZW50IDogbWVzc2FnZUxpc3QpIHsKKyAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LmlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaGFzRmllbGQoZmllbGQpICYmCisgICAgICAgICAgICAgICAgISgoTWVzc2FnZSkgZ2V0RmllbGQoZmllbGQpKS5pc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIGZpbmFsIFVua25vd25GaWVsZFNldCBnZXRVbmtub3duRmllbGRzKCkgeworICAgICAgcmV0dXJuIHVua25vd25GaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gcGFyc2UgYW4gdW5rbm93biBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHBhcnNlVW5rbm93bkZpZWxkKAorICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCisgICAgICAgIGZpbmFsIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gdW5rbm93bkZpZWxkcy5tZXJnZUZpZWxkRnJvbSh0YWcsIGlucHV0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQnVpbGRlclBhcmVudH0gZm9yIGdpdmluZyB0byBvdXIgY2hpbGRyZW4uIFRoaXMKKyAgICAgKiBzbWFsbCBpbm5lciBjbGFzcyBtYWtlcyBpdCBzbyB3ZSBkb24ndCBwdWJsaWNseSBleHBvc2UgdGhlIEJ1aWxkZXJQYXJlbnQKKyAgICAgKiBtZXRob2RzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQnVpbGRlclBhcmVudEltcGwgaW1wbGVtZW50cyBCdWlsZGVyUGFyZW50IHsKKworICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgICBwdWJsaWMgdm9pZCBtYXJrRGlydHkoKSB7CisgICAgICAgIG9uQ2hhbmdlZCgpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBCdWlsZGVyUGFyZW50fSBmb3IgZ2l2aW5nIHRvIG91ciBjaGlsZHJlbi4KKyAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIHBhcmVudCBmb3Igb3VyIGNoaWxkcmVuLgorICAgICAqLworICAgIHByb3RlY3RlZCBCdWlsZGVyUGFyZW50IGdldFBhcmVudEZvckNoaWxkcmVuKCkgeworICAgICAgaWYgKG1lQXNQYXJlbnQgPT0gbnVsbCkgeworICAgICAgICBtZUFzUGFyZW50ID0gbmV3IEJ1aWxkZXJQYXJlbnRJbXBsKCk7CisgICAgICB9CisgICAgICByZXR1cm4gbWVBc1BhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIHRoZSBidWlsZGVyIG9yIG9uZSBvZiBpdHMgbmVzdGVkIGNoaWxkcmVuIGhhcyBjaGFuZ2VkCisgICAgICogYW5kIGFueSBwYXJlbnQgc2hvdWxkIGJlIG5vdGlmaWVkIG9mIGl0cyBpbnZhbGlkYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgb25DaGFuZ2VkKCkgeworICAgICAgaWYgKGlzQ2xlYW4gJiYgYnVpbGRlclBhcmVudCAhPSBudWxsKSB7CisgICAgICAgIGJ1aWxkZXJQYXJlbnQubWFya0RpcnR5KCk7CisKKyAgICAgICAgLy8gRG9uJ3Qga2VlcCBkaXNwYXRjaGluZyBpbnZhbGlkYXRpb25zIHVudGlsIGJ1aWxkIGlzIGNhbGxlZCBhZ2Fpbi4KKyAgICAgICAgaXNDbGVhbiA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEV4dGVuc2lvbnMtcmVsYXRlZCBzdHVmZgorCisgIHB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXI8CisgICAgICBNZXNzYWdlVHlwZSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlPiBleHRlbmRzIE1lc3NhZ2VPckJ1aWxkZXIgeworCisgICAgLyoqIENoZWNrIGlmIGEgc2luZ3VsYXIgZXh0ZW5zaW9uIGlzIHByZXNlbnQuICovCisgICAgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKAorICAgICAgICBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbik7CisKKyAgICAvKiogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSByZXBlYXRlZCBleHRlbnNpb24uICovCisgICAgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKKyAgICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24pOworCisgICAgLyoqIEdldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLworICAgIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbihHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbik7CisKKyAgICAvKiogR2V0IG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbigKKyAgICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCisgICAgICAgIGludCBpbmRleCk7CisgIH0KKworICAvKioKKyAgICogR2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3NlcyBmb3IgbWVzc2FnZSB0eXBlcyB0aGF0IGNvbnRhaW4gZXh0ZW5zaW9uIHJhbmdlcworICAgKiBzdWJjbGFzcyB0aGlzLgorICAgKgorICAgKiA8cD5UaGlzIGNsYXNzIGltcGxlbWVudHMgdHlwZS1zYWZlIGFjY2Vzc29ycyBmb3IgZXh0ZW5zaW9ucy4gIFRoZXkKKyAgICogaW1wbGVtZW50IGFsbCB0aGUgc2FtZSBvcGVyYXRpb25zIHRoYXQgeW91IGNhbiBkbyB3aXRoIG5vcm1hbCBmaWVsZHMgLS0KKyAgICogZS5nLiAiaGFzIiwgImdldCIsIGFuZCAiZ2V0Q291bnQiIC0tIGJ1dCBmb3IgZXh0ZW5zaW9ucy4gIFRoZSBleHRlbnNpb25zCisgICAqIGFyZSBpZGVudGlmaWVkIHVzaW5nIGluc3RhbmNlcyBvZiB0aGUgY2xhc3Mge0BsaW5rIEdlbmVyYXRlZEV4dGVuc2lvbn07CisgICAqIHRoZSBwcm90b2NvbCBjb21waWxlciBnZW5lcmF0ZXMgYSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmb3IgZXZlcnkKKyAgICogZXh0ZW5zaW9uIGluIGl0cyBpbnB1dC4gIFRocm91Z2ggdGhlIG1hZ2ljIG9mIGdlbmVyaWNzLCBhbGwgaXMgbWFkZQorICAgKiB0eXBlLXNhZmUuCisgICAqCisgICAqIDxwPkZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSBoYXZlIHRoZSB7QGNvZGUgLnByb3RvfSBmaWxlOgorICAgKgorICAgKiA8cHJlPgorICAgKiBvcHRpb24gamF2YV9jbGFzcyA9ICJNeVByb3RvIjsKKyAgICoKKyAgICogbWVzc2FnZSBGb28geworICAgKiAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisgICAqIH0KKyAgICoKKyAgICogZXh0ZW5kIEZvbyB7CisgICAqICAgb3B0aW9uYWwgaW50MzIgYmFyOworICAgKiB9CisgICAqIDwvcHJlPgorICAgKgorICAgKiA8cD5UaGVuIHlvdSBtaWdodCB3cml0ZSBjb2RlIGxpa2U6CisgICAqCisgICAqIDxwcmU+CisgICAqIE15UHJvdG8uRm9vIGZvbyA9IGdldEZvbygpOworICAgKiBpbnQgaSA9IGZvby5nZXRFeHRlbnNpb24oTXlQcm90by5iYXIpOworICAgKiA8L3ByZT4KKyAgICoKKyAgICogPHA+U2VlIGFsc28ge0BsaW5rIEV4dGVuZGFibGVCdWlsZGVyfS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRXh0ZW5kYWJsZU1lc3NhZ2U8CisgICAgICAgIE1lc3NhZ2VUeXBlIGV4dGVuZHMgRXh0ZW5kYWJsZU1lc3NhZ2U+CisgICAgICBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UKKyAgICAgIGltcGxlbWVudHMgRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXI8TWVzc2FnZVR5cGU+IHsKKworICAgIHByaXZhdGUgZmluYWwgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yPiBleHRlbnNpb25zOworCisgICAgcHJvdGVjdGVkIEV4dGVuZGFibGVNZXNzYWdlKCkgeworICAgICAgdGhpcy5leHRlbnNpb25zID0gRmllbGRTZXQubmV3RmllbGRTZXQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZU1lc3NhZ2UoCisgICAgICAgIEV4dGVuZGFibGVCdWlsZGVyPE1lc3NhZ2VUeXBlLCA/PiBidWlsZGVyKSB7CisgICAgICBzdXBlcihidWlsZGVyKTsKKyAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGJ1aWxkZXIuYnVpbGRFeHRlbnNpb25zKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbikgeworICAgICAgaWYgKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPQorICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc29tZW9uZSB1c2VzIHVuY2hlY2tlZCBvcGVyYXRpb25zLgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJFeHRlbnNpb24gaXMgZm9yIHR5cGUgXCIiICsKKyAgICAgICAgICBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldENvbnRhaW5pbmdUeXBlKCkuZ2V0RnVsbE5hbWUoKSArCisgICAgICAgICAgIlwiIHdoaWNoIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZSBcIiIgKworICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RnVsbE5hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIHJldHVybiBleHRlbnNpb25zLmhhc0ZpZWxkKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkpOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24pIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZGVzY3JpcHRvcik7CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOworICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZXh0ZW5zaW9ucy5nZXRGaWVsZChkZXNjcmlwdG9yKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICAgIHJldHVybiAoVHlwZSkgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci5nZXRKYXZhVHlwZSgpID09CisgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICByZXR1cm4gKFR5cGUpIGV4dGVuc2lvbi5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZnJvbVJlZmxlY3Rpb25UeXBlKAorICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZnJvbVJlZmxlY3Rpb25UeXBlKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgICByZXR1cm4gKFR5cGUpIGV4dGVuc2lvbi5zaW5ndWxhckZyb21SZWZsZWN0aW9uVHlwZSgKKyAgICAgICAgICBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGQoZGVzY3JpcHRvciwgaW5kZXgpKTsKKyAgICB9CisKKyAgICAvKiogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY2hlY2sgaWYgYWxsIGV4dGVuc2lvbnMgYXJlIGluaXRpYWxpemVkLiAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCgpIHsKKyAgICAgIHJldHVybiBleHRlbnNpb25zLmlzSW5pdGlhbGl6ZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgcmV0dXJuIHN1cGVyLmlzSW5pdGlhbGl6ZWQoKSAmJiBleHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGJ5IHN1YmNsYXNzZXMgdG8gc2VyaWFsaXplIGV4dGVuc2lvbnMuICBFeHRlbnNpb24gcmFuZ2VzIG1heSBiZQorICAgICAqIGludGVybGVhdmVkIHdpdGggZmllbGQgbnVtYmVycywgYnV0IHdlIG11c3Qgd3JpdGUgdGhlbSBpbiBjYW5vbmljYWwKKyAgICAgKiAoc29ydGVkIGJ5IGZpZWxkIG51bWJlcikgb3JkZXIuICBFeHRlbnNpb25Xcml0ZXIgaGVscHMgdXMgd3JpdGUKKyAgICAgKiBpbmRpdmlkdWFsIHJhbmdlcyBvZiBleHRlbnNpb25zIGF0IG9uY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIEV4dGVuc2lvbldyaXRlciB7CisgICAgICAvLyBJbWFnaW5lIGhvdyBtdWNoIHNpbXBsZXIgdGhpcyBjb2RlIHdvdWxkIGJlIGlmIEphdmEgaXRlcmF0b3JzIGhhZAorICAgICAgLy8gYSB3YXkgdG8gZ2V0IHRoZSBuZXh0IGVsZW1lbnQgd2l0aG91dCBhZHZhbmNpbmcgdGhlIGl0ZXJhdG9yLgorCisgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4+IGl0ZXIgPQorICAgICAgICBleHRlbnNpb25zLml0ZXJhdG9yKCk7CisgICAgICBwcml2YXRlIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gbmV4dDsKKyAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtZXNzYWdlU2V0V2lyZUZvcm1hdDsKKworICAgICAgcHJpdmF0ZSBFeHRlbnNpb25Xcml0ZXIoZmluYWwgYm9vbGVhbiBtZXNzYWdlU2V0V2lyZUZvcm1hdCkgeworICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBuZXh0ID0gaXRlci5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5tZXNzYWdlU2V0V2lyZUZvcm1hdCA9IG1lc3NhZ2VTZXRXaXJlRm9ybWF0OworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZVVudGlsKGZpbmFsIGludCBlbmQsIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldEtleSgpLmdldE51bWJlcigpIDwgZW5kKSB7CisgICAgICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXh0LmdldEtleSgpOworICAgICAgICAgIGlmIChtZXNzYWdlU2V0V2lyZUZvcm1hdCAmJiBkZXNjcmlwdG9yLmdldExpdGVKYXZhVHlwZSgpID09CisgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0LkphdmFUeXBlLk1FU1NBR0UgJiYKKyAgICAgICAgICAgICAgIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgICBvdXRwdXQud3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uKGRlc2NyaXB0b3IuZ2V0TnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlKSBuZXh0LmdldFZhbHVlKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGaWVsZFNldC53cml0ZUZpZWxkKGRlc2NyaXB0b3IsIG5leHQuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBuZXh0ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBFeHRlbnNpb25Xcml0ZXIgbmV3RXh0ZW5zaW9uV3JpdGVyKCkgeworICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25Xcml0ZXIoZmFsc2UpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgRXh0ZW5zaW9uV3JpdGVyIG5ld01lc3NhZ2VTZXRFeHRlbnNpb25Xcml0ZXIoKSB7CisgICAgICByZXR1cm4gbmV3IEV4dGVuc2lvbldyaXRlcih0cnVlKTsKKyAgICB9CisKKyAgICAvKiogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBleHRlbnNpb25zLiAqLworICAgIHByb3RlY3RlZCBpbnQgZXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplKCkgeworICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0U2VyaWFsaXplZFNpemUoKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIGludCBleHRlbnNpb25zU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKSB7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRNZXNzYWdlU2V0U2VyaWFsaXplZFNpemUoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBSZWZsZWN0aW9uCisKKyAgICBwcm90ZWN0ZWQgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRFeHRlbnNpb25GaWVsZHMoKSB7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRBbGxGaWVsZHMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7CisgICAgICBmaW5hbCBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IHJlc3VsdCA9IHN1cGVyLmdldEFsbEZpZWxkc011dGFibGUoKTsKKyAgICAgIHJlc3VsdC5wdXRBbGwoZ2V0RXh0ZW5zaW9uRmllbGRzKCkpOworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChyZXN1bHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5oYXNGaWVsZChmaWVsZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3VwZXIuaGFzRmllbGQoZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgeworICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7CisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0RmllbGQoZmllbGQpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICAgICAgICAvLyBMYWNraW5nIGFuIEV4dGVuc2lvblJlZ2lzdHJ5LCB3ZSBoYXZlIG5vIHdheSB0byBkZXRlcm1pbmUgdGhlCisgICAgICAgICAgICAvLyBleHRlbnNpb24ncyByZWFsIHR5cGUsIHNvIHdlIHJldHVybiBhIER5bmFtaWNNZXNzYWdlLgorICAgICAgICAgICAgcmV0dXJuIER5bmFtaWNNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZShmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRGaWVsZChmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgeworICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7CisgICAgICAgIHJldHVybiBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7CisgICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIkZpZWxkRGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlZCBtZXNzYWdlIGJ1aWxkZXJzIGZvciBtZXNzYWdlIHR5cGVzIHRoYXQgY29udGFpbiBleHRlbnNpb24gcmFuZ2VzCisgICAqIHN1YmNsYXNzIHRoaXMuCisgICAqCisgICAqIDxwPlRoaXMgY2xhc3MgaW1wbGVtZW50cyB0eXBlLXNhZmUgYWNjZXNzb3JzIGZvciBleHRlbnNpb25zLiAgVGhleQorICAgKiBpbXBsZW1lbnQgYWxsIHRoZSBzYW1lIG9wZXJhdGlvbnMgdGhhdCB5b3UgY2FuIGRvIHdpdGggbm9ybWFsIGZpZWxkcyAtLQorICAgKiBlLmcuICJnZXQiLCAic2V0IiwgYW5kICJhZGQiIC0tIGJ1dCBmb3IgZXh0ZW5zaW9ucy4gIFRoZSBleHRlbnNpb25zIGFyZQorICAgKiBpZGVudGlmaWVkIHVzaW5nIGluc3RhbmNlcyBvZiB0aGUgY2xhc3Mge0BsaW5rIEdlbmVyYXRlZEV4dGVuc2lvbn07IHRoZQorICAgKiBwcm90b2NvbCBjb21waWxlciBnZW5lcmF0ZXMgYSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmb3IgZXZlcnkKKyAgICogZXh0ZW5zaW9uIGluIGl0cyBpbnB1dC4gIFRocm91Z2ggdGhlIG1hZ2ljIG9mIGdlbmVyaWNzLCBhbGwgaXMgbWFkZQorICAgKiB0eXBlLXNhZmUuCisgICAqCisgICAqIDxwPkZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSBoYXZlIHRoZSB7QGNvZGUgLnByb3RvfSBmaWxlOgorICAgKgorICAgKiA8cHJlPgorICAgKiBvcHRpb24gamF2YV9jbGFzcyA9ICJNeVByb3RvIjsKKyAgICoKKyAgICogbWVzc2FnZSBGb28geworICAgKiAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisgICAqIH0KKyAgICoKKyAgICogZXh0ZW5kIEZvbyB7CisgICAqICAgb3B0aW9uYWwgaW50MzIgYmFyOworICAgKiB9CisgICAqIDwvcHJlPgorICAgKgorICAgKiA8cD5UaGVuIHlvdSBtaWdodCB3cml0ZSBjb2RlIGxpa2U6CisgICAqCisgICAqIDxwcmU+CisgICAqIE15UHJvdG8uRm9vIGZvbyA9CisgICAqICAgTXlQcm90by5Gb28ubmV3QnVpbGRlcigpCisgICAqICAgICAuc2V0RXh0ZW5zaW9uKE15UHJvdG8uYmFyLCAxMjMpCisgICAqICAgICAuYnVpbGQoKTsKKyAgICogPC9wcmU+CisgICAqCisgICAqIDxwPlNlZSBhbHNvIHtAbGluayBFeHRlbmRhYmxlTWVzc2FnZX0uCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBFeHRlbmRhYmxlQnVpbGRlcjwKKyAgICAgICAgTWVzc2FnZVR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlTWVzc2FnZSwKKyAgICAgICAgQnVpbGRlclR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlQnVpbGRlcj4KKyAgICAgIGV4dGVuZHMgQnVpbGRlcjxCdWlsZGVyVHlwZT4KKyAgICAgIGltcGxlbWVudHMgRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXI8TWVzc2FnZVR5cGU+IHsKKworICAgIHByaXZhdGUgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yPiBleHRlbnNpb25zID0gRmllbGRTZXQuZW1wdHlTZXQoKTsKKworICAgIHByb3RlY3RlZCBFeHRlbmRhYmxlQnVpbGRlcigpIHt9CisKKyAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZUJ1aWxkZXIoCisgICAgICAgIEJ1aWxkZXJQYXJlbnQgcGFyZW50KSB7CisgICAgICBzdXBlcihwYXJlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbGVhcigpIHsKKyAgICAgIGV4dGVuc2lvbnMgPSBGaWVsZFNldC5lbXB0eVNldCgpOworICAgICAgcmV0dXJuIHN1cGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBpbXBsZW1lbnRlZCBoZXJlIG9ubHkgdG8gd29yayBhcm91bmQgYW4gYXBwYXJlbnQgYnVnIGluIHRoZQorICAgIC8vIEphdmEgY29tcGlsZXIgYW5kL29yIGJ1aWxkIHN5c3RlbS4gIFNlZSBidWcgIzE4OTg0NjMuICBUaGUgbWVyZSBwcmVzZW5jZQorICAgIC8vIG9mIHRoaXMgZHVtbXkgY2xvbmUoKSBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBnbyBhd2F5LgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbG9uZSgpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKSB7CisgICAgICBpZiAoZXh0ZW5zaW9ucy5pc0ltbXV0YWJsZSgpKSB7CisgICAgICAgIGV4dGVuc2lvbnMgPSBleHRlbnNpb25zLmNsb25lKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbikgeworICAgICAgaWYgKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPQorICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc29tZW9uZSB1c2VzIHVuY2hlY2tlZCBvcGVyYXRpb25zLgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJFeHRlbnNpb24gaXMgZm9yIHR5cGUgXCIiICsKKyAgICAgICAgICBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldENvbnRhaW5pbmdUeXBlKCkuZ2V0RnVsbE5hbWUoKSArCisgICAgICAgICAgIlwiIHdoaWNoIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZSBcIiIgKworICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RnVsbE5hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIHJldHVybiBleHRlbnNpb25zLmhhc0ZpZWxkKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkpOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24pIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZGVzY3JpcHRvcik7CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOworICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZXh0ZW5zaW9ucy5nZXRGaWVsZChkZXNjcmlwdG9yKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgeworICAgICAgICAgIHJldHVybiAoVHlwZSkgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci5nZXRKYXZhVHlwZSgpID09CisgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICByZXR1cm4gKFR5cGUpIGV4dGVuc2lvbi5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZnJvbVJlZmxlY3Rpb25UeXBlKAorICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZnJvbVJlZmxlY3Rpb25UeXBlKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgICByZXR1cm4gKFR5cGUpIGV4dGVuc2lvbi5zaW5ndWxhckZyb21SZWZsZWN0aW9uVHlwZSgKKyAgICAgICAgICBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGQoZGVzY3JpcHRvciwgaW5kZXgpKTsKKyAgICB9CisKKyAgICAvKiogU2V0IHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uICovCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBCdWlsZGVyVHlwZSBzZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uLAorICAgICAgICBmaW5hbCBUeXBlIHZhbHVlKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOworICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOworICAgICAgZXh0ZW5zaW9ucy5zZXRGaWVsZChkZXNjcmlwdG9yLCBleHRlbnNpb24udG9SZWZsZWN0aW9uVHlwZSh2YWx1ZSkpOworICAgICAgb25DaGFuZ2VkKCk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKiBTZXQgdGhlIHZhbHVlIG9mIG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gQnVpbGRlclR5cGUgc2V0RXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbiwKKyAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBUeXBlIHZhbHVlKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOworICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOworICAgICAgZXh0ZW5zaW9ucy5zZXRSZXBlYXRlZEZpZWxkKAorICAgICAgICBkZXNjcmlwdG9yLCBpbmRleCwKKyAgICAgICAgZXh0ZW5zaW9uLnNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZSh2YWx1ZSkpOworICAgICAgb25DaGFuZ2VkKCk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKiBBcHBlbmQgYSB2YWx1ZSB0byBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IEJ1aWxkZXJUeXBlIGFkZEV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCisgICAgICAgIGZpbmFsIFR5cGUgdmFsdWUpIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7CisgICAgICBleHRlbnNpb25zLmFkZFJlcGVhdGVkRmllbGQoCisgICAgICAgICAgZGVzY3JpcHRvciwgZXh0ZW5zaW9uLnNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZSh2YWx1ZSkpOworICAgICAgb25DaGFuZ2VkKCk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKiBDbGVhciBhbiBleHRlbnNpb24uICovCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBCdWlsZGVyVHlwZSBjbGVhckV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCA/PiBleHRlbnNpb24pIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICBleHRlbnNpb25zLmNsZWFyRmllbGQoZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKSk7CisgICAgICBvbkNoYW5nZWQoKTsKKyAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgfQorCisgICAgLyoqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIGNoZWNrIGlmIGFsbCBleHRlbnNpb25zIGFyZSBpbml0aWFsaXplZC4gKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQoKSB7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5pc0luaXRpYWxpemVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBidWlsZCBjb2RlIHBhdGggdG8gY3JlYXRlIGEgY29weSBvZiB0aGUgZXh0ZW5zaW9ucyBmb3IKKyAgICAgKiBidWlsZGluZyB0aGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gYnVpbGRFeHRlbnNpb25zKCkgeworICAgICAgZXh0ZW5zaW9ucy5tYWtlSW1tdXRhYmxlKCk7CisgICAgICByZXR1cm4gZXh0ZW5zaW9uczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgcmV0dXJuIHN1cGVyLmlzSW5pdGlhbGl6ZWQoKSAmJiBleHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBwYXJzZSBhbiB1bmtub3duIGZpZWxkIG9yIGFuIGV4dGVuc2lvbi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIHBhcnNlVW5rbm93bkZpZWxkKAorICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCisgICAgICAgIGZpbmFsIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gQWJzdHJhY3RNZXNzYWdlLkJ1aWxkZXIubWVyZ2VGaWVsZEZyb20oCisgICAgICAgIGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgdGhpcywgdGFnKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBSZWZsZWN0aW9uCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7CisgICAgICBmaW5hbCBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IHJlc3VsdCA9IHN1cGVyLmdldEFsbEZpZWxkc011dGFibGUoKTsKKyAgICAgIHJlc3VsdC5wdXRBbGwoZXh0ZW5zaW9ucy5nZXRBbGxGaWVsZHMoKSk7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHJlc3VsdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7CisgICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZXh0ZW5zaW9ucy5nZXRGaWVsZChmaWVsZCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICAgIC8vIExhY2tpbmcgYW4gRXh0ZW5zaW9uUmVnaXN0cnksIHdlIGhhdmUgbm8gd2F5IHRvIGRldGVybWluZSB0aGUKKyAgICAgICAgICAgIC8vIGV4dGVuc2lvbidzIHJlYWwgdHlwZSwgc28gd2UgcmV0dXJuIGEgRHluYW1pY01lc3NhZ2UuCisgICAgICAgICAgICByZXR1cm4gRHluYW1pY01lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKGZpZWxkLmdldE1lc3NhZ2VUeXBlKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0RGVmYXVsdFZhbHVlKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEZpZWxkKGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7CisgICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkgeworICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5oYXNGaWVsZChmaWVsZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3VwZXIuaGFzRmllbGQoZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBzZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICAgIGV4dGVuc2lvbnMuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgICAgb25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3VwZXIuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXJGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7CisgICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOworICAgICAgICBleHRlbnNpb25zLmNsZWFyRmllbGQoZmllbGQpOworICAgICAgICBvbkNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdXBlci5jbGVhckZpZWxkKGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgc2V0UmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7CisgICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKKyAgICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOworICAgICAgICBleHRlbnNpb25zLnNldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4LCB2YWx1ZSk7CisgICAgICAgIG9uQ2hhbmdlZCgpOworICAgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnNldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4LCB2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIGFkZFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOworICAgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICAgIGV4dGVuc2lvbnMuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgdmFsdWUpOworICAgICAgICBvbkNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdXBlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgbWVyZ2VFeHRlbnNpb25GaWVsZHMoZmluYWwgRXh0ZW5kYWJsZU1lc3NhZ2Ugb3RoZXIpIHsKKyAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKKyAgICAgIGV4dGVuc2lvbnMubWVyZ2VGcm9tKG90aGVyLmV4dGVuc2lvbnMpOworICAgICAgb25DaGFuZ2VkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJGaWVsZERlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlLiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIEdldHMgdGhlIGRlc2NyaXB0b3IgZm9yIGFuIGV4dGVuc2lvbi4gVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gd2hldGhlcgorICAgKiB0aGUgZXh0ZW5zaW9uIGlzIHNjb3BlZCBpbiB0aGUgdG9wIGxldmVsIG9mIGEgZmlsZSBvciBzY29wZWQgaW4gYSBNZXNzYWdlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIEV4dGVuc2lvbkRlc2NyaXB0b3JSZXRyaWV2ZXIgeworICAgIEZpZWxkRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCk7CisgIH0KKworICAvKiogRm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiAqLworICBwdWJsaWMgc3RhdGljIDxDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2UsIFR5cGU+CisgICAgICBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+CisgICAgICBuZXdNZXNzYWdlU2NvcGVkR2VuZXJhdGVkRXh0ZW5zaW9uKGZpbmFsIE1lc3NhZ2Ugc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZXNjcmlwdG9ySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIHNpbmd1bGFyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UpIHsKKyAgICAvLyBGb3IgZXh0ZW5zaW9ucyBzY29wZWQgd2l0aGluIGEgTWVzc2FnZSwgd2UgdXNlIHRoZSBNZXNzYWdlIHRvIHJlc29sdmUKKyAgICAvLyB0aGUgb3V0ZXIgY2xhc3MncyBkZXNjcmlwdG9yLCBmcm9tIHdoaWNoIHRoZSBleHRlbnNpb24gZGVzY3JpcHRvciBpcworICAgIC8vIG9idGFpbmVkLgorICAgIHJldHVybiBuZXcgR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCBUeXBlPigKKyAgICAgICAgbmV3IEV4dGVuc2lvbkRlc2NyaXB0b3JSZXRyaWV2ZXIoKSB7CisgICAgICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgICAgICAgcHVibGljIEZpZWxkRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RXh0ZW5zaW9ucygpCisgICAgICAgICAgICAgICAgLmdldChkZXNjcmlwdG9ySW5kZXgpOworICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgc2luZ3VsYXJUeXBlLAorICAgICAgICBkZWZhdWx0SW5zdGFuY2UpOworICB9CisKKyAgLyoqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gKi8KKyAgcHVibGljIHN0YXRpYyA8Q29udGFpbmluZ1R5cGUgZXh0ZW5kcyBNZXNzYWdlLCBUeXBlPgorICAgICBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+CisgICAgIG5ld0ZpbGVTY29wZWRHZW5lcmF0ZWRFeHRlbnNpb24oZmluYWwgQ2xhc3Mgc2luZ3VsYXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlKSB7CisgICAgLy8gRm9yIGV4dGVuc2lvbnMgc2NvcGVkIHdpdGhpbiBhIGZpbGUsIHdlIHJlbHkgb24gdGhlIG91dGVyIGNsYXNzJ3MKKyAgICAvLyBzdGF0aWMgaW5pdGlhbGl6ZXIgdG8gY2FsbCBpbnRlcm5hbEluaXQoKSBvbiB0aGUgZXh0ZW5zaW9uIHdoZW4gdGhlCisgICAgLy8gZGVzY3JpcHRvciBpcyBhdmFpbGFibGUuCisgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+KAorICAgICAgICBudWxsLCAgLy8gRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlciBpcyBpbml0aWFsaXplZCBpbiBpbnRlcm5hbEluaXQoKTsKKyAgICAgICAgc2luZ3VsYXJUeXBlLAorICAgICAgICBkZWZhdWx0SW5zdGFuY2UpOworICB9CisKKyAgLyoqCisgICAqIFR5cGUgdXNlZCB0byByZXByZXNlbnQgZ2VuZXJhdGVkIGV4dGVuc2lvbnMuICBUaGUgcHJvdG9jb2wgY29tcGlsZXIKKyAgICogZ2VuZXJhdGVzIGEgc3RhdGljIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZvciBlYWNoIGV4dGVuc2lvbi4KKyAgICoKKyAgICogPHA+Rm9yIGV4YW1wbGUsIGltYWdpbmUgeW91IGhhdmUgdGhlIHtAY29kZSAucHJvdG99IGZpbGU6CisgICAqCisgICAqIDxwcmU+CisgICAqIG9wdGlvbiBqYXZhX2NsYXNzID0gIk15UHJvdG8iOworICAgKgorICAgKiBtZXNzYWdlIEZvbyB7CisgICAqICAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKKyAgICogfQorICAgKgorICAgKiBleHRlbmQgRm9vIHsKKyAgICogICBvcHRpb25hbCBpbnQzMiBiYXI7CisgICAqIH0KKyAgICogPC9wcmU+CisgICAqCisgICAqIDxwPlRoZW4sIHtAY29kZSBNeVByb3RvLkZvby5iYXJ9IGhhcyB0eXBlCisgICAqIHtAY29kZSBHZW5lcmF0ZWRFeHRlbnNpb248TXlQcm90by5Gb28sIEludGVnZXI+fS4KKyAgICoKKyAgICogPHA+SW4gZ2VuZXJhbCwgdXNlcnMgc2hvdWxkIGlnbm9yZSB0aGUgZGV0YWlscyBvZiB0aGlzIHR5cGUsIGFuZCBzaW1wbHkgdXNlCisgICAqIHRoZXNlIHN0YXRpYyBzaW5nbGV0b25zIGFzIHBhcmFtZXRlcnMgdG8gdGhlIGV4dGVuc2lvbiBhY2Nlc3NvcnMgZGVmaW5lZAorICAgKiBpbiB7QGxpbmsgRXh0ZW5kYWJsZU1lc3NhZ2V9IGFuZCB7QGxpbmsgRXh0ZW5kYWJsZUJ1aWxkZXJ9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZW5lcmF0ZWRFeHRlbnNpb248CisgICAgICBDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2UsIFR5cGU+IHsKKyAgICAvLyBUT0RPKGtlbnRvbik6ICBGaW5kIHdheXMgdG8gYXZvaWQgdXNpbmcgSmF2YSByZWZsZWN0aW9uIHdpdGhpbiB0aGlzCisgICAgLy8gICBjbGFzcy4gIEFsc28gdHJ5IHRvIGF2b2lkIHN1cHByZXNzaW5nIHVuY2hlY2tlZCB3YXJuaW5ncy4KKworICAgIC8vIFdlIGNhbid0IGFsd2F5cyBpbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIG9mIGEgR2VuZXJhdGVkRXh0ZW5zaW9uIHdoZW4KKyAgICAvLyB3ZSBmaXJzdCBjb25zdHJ1Y3QgaXQgZHVlIHRvIGluaXRpYWxpemF0aW9uIG9yZGVyIGRpZmZpY3VsdGllcyAobmFtZWx5LAorICAgIC8vIHRoZSBkZXNjcmlwdG9yIG1heSBub3QgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkIHlldCwgc2luY2UgaXQgaXMgb2Z0ZW4KKyAgICAvLyBjb25zdHJ1Y3RlZCBieSB0aGUgaW5pdGlhbGl6ZXIgb2YgYSBzZXBhcmF0ZSBtb2R1bGUpLgorICAgIC8vCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgbmVzdGVkIGV4dGVuc2lvbnMsIHdlIGluaXRpYWxpemUgdGhlCisgICAgLy8gRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlciB3aXRoIGFuIGluc3RhbmNlIHRoYXQgdXNlcyB0aGUgc2NvcGluZworICAgIC8vIE1lc3NhZ2UncyBkZWZhdWx0IGluc3RhbmNlIHRvIHJldHJpZXZlIHRoZSBleHRlbnNpb24ncyBkZXNjcmlwdG9yLgorICAgIC8vCisgICAgLy8gSW4gdGhlIGNhc2Ugb2Ygbm9uLW5lc3RlZCBleHRlbnNpb25zLCB3ZSBpbml0aWFsaXplIHRoZQorICAgIC8vIEV4dGVuc2lvbkRlc2NyaXB0b3JSZXRyaWV2ZXIgdG8gbnVsbCBhbmQgcmVseSBvbiB0aGUgb3V0ZXIgY2xhc3MncyBzdGF0aWMKKyAgICAvLyBpbml0aWFsaXplciB0byBjYWxsIGludGVybmFsSW5pdCgpIGFmdGVyIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIHBhcnNlZC4KKyAgICBwcml2YXRlIEdlbmVyYXRlZEV4dGVuc2lvbihFeHRlbnNpb25EZXNjcmlwdG9yUmV0cmlldmVyIGRlc2NyaXB0b3JSZXRyaWV2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2luZ3VsYXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSkgeworICAgICAgaWYgKE1lc3NhZ2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzaW5ndWxhclR5cGUpICYmCisgICAgICAgICAgIXNpbmd1bGFyVHlwZS5pc0luc3RhbmNlKG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UpKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAiQmFkIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UgZm9yICIgKyBzaW5ndWxhclR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuZGVzY3JpcHRvclJldHJpZXZlciA9IGRlc2NyaXB0b3JSZXRyaWV2ZXI7CisgICAgICB0aGlzLnNpbmd1bGFyVHlwZSA9IHNpbmd1bGFyVHlwZTsKKyAgICAgIHRoaXMubWVzc2FnZURlZmF1bHRJbnN0YW5jZSA9IG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2U7CisKKyAgICAgIGlmIChQcm90b2NvbE1lc3NhZ2VFbnVtLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc2luZ3VsYXJUeXBlKSkgeworICAgICAgICB0aGlzLmVudW1WYWx1ZU9mID0gZ2V0TWV0aG9kT3JEaWUoc2luZ3VsYXJUeXBlLCAidmFsdWVPZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yLmNsYXNzKTsKKyAgICAgICAgdGhpcy5lbnVtR2V0VmFsdWVEZXNjcmlwdG9yID0KKyAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKHNpbmd1bGFyVHlwZSwgImdldFZhbHVlRGVzY3JpcHRvciIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5lbnVtVmFsdWVPZiA9IG51bGw7CisgICAgICAgIHRoaXMuZW51bUdldFZhbHVlRGVzY3JpcHRvciA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gKi8KKyAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbEluaXQoZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgIGlmIChkZXNjcmlwdG9yUmV0cmlldmVyICE9IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQWxyZWFkeSBpbml0aWFsaXplZC4iKTsKKyAgICAgIH0KKyAgICAgIGRlc2NyaXB0b3JSZXRyaWV2ZXIgPSBuZXcgRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlcigpIHsKKyAgICAgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgICAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBFeHRlbnNpb25EZXNjcmlwdG9yUmV0cmlldmVyIGRlc2NyaXB0b3JSZXRyaWV2ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBzaW5ndWxhclR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgZW51bVZhbHVlT2Y7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgZW51bUdldFZhbHVlRGVzY3JpcHRvcjsKKworICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKKyAgICAgIGlmIChkZXNjcmlwdG9yUmV0cmlldmVyID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICJnZXREZXNjcmlwdG9yKCkgY2FsbGVkIGJlZm9yZSBpbnRlcm5hbEluaXQoKSIpOworICAgICAgfQorICAgICAgcmV0dXJuIGRlc2NyaXB0b3JSZXRyaWV2ZXIuZ2V0RGVzY3JpcHRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBleHRlbnNpb24gaXMgYW4gZW1iZWRkZWQgbWVzc2FnZSBvciBncm91cCwgcmV0dXJucyB0aGUgZGVmYXVsdAorICAgICAqIGluc3RhbmNlIG9mIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKSB7CisgICAgICByZXR1cm4gbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gdGhlIHR5cGUgdXNlZCBieSB0aGUgcmVmbGVjdGlvbiBhY2Nlc3NvcnMgdG8gdGhlIHR5cGUgdXNlZAorICAgICAqIGJ5IG5hdGl2ZSBhY2Nlc3NvcnMuICBFLmcuLCBmb3IgZW51bXMsIHRoZSByZWZsZWN0aW9uIGFjY2Vzc29ycyB1c2UKKyAgICAgKiBFbnVtVmFsdWVEZXNjcmlwdG9ycyBidXQgdGhlIG5hdGl2ZSBhY2Nlc3NvcnMgdXNlIHRoZSBnZW5lcmF0ZWQgZW51bQorICAgICAqIHR5cGUuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBPYmplY3QgZnJvbVJlZmxlY3Rpb25UeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7CisgICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSB8fAorICAgICAgICAgICAgZGVzY3JpcHRvci5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5FTlVNKSB7CisgICAgICAgICAgLy8gTXVzdCBjb252ZXJ0IHRoZSB3aG9sZSBsaXN0LgorICAgICAgICAgIGZpbmFsIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiAoTGlzdCkgdmFsdWUpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUoZWxlbWVudCkpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNpbmd1bGFyRnJvbVJlZmxlY3Rpb25UeXBlKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjZnJvbVJlZmxlY3Rpb25UeXBlKE9iamVjdCl9LCBidXQgaWYgdGhlIHR5cGUgaXMgYSByZXBlYXRlZAorICAgICAqIHR5cGUsIHRoaXMgY29udmVydHMgYSBzaW5nbGUgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBzaW5ndWxhckZyb21SZWZsZWN0aW9uVHlwZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcigpOworICAgICAgc3dpdGNoIChkZXNjcmlwdG9yLmdldEphdmFUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBNRVNTQUdFOgorICAgICAgICAgIGlmIChzaW5ndWxhclR5cGUuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSXQgc2VlbXMgdGhlIGNvcHkgb2YgdGhlIGVtYmVkZGVkIG1lc3NhZ2Ugc3RvcmVkIGluc2lkZSB0aGUKKyAgICAgICAgICAgIC8vIGV4dGVuZGVkIG1lc3NhZ2UgaXMgbm90IG9mIHRoZSBleGFjdCB0eXBlIHRoZSB1c2VyIHdhcworICAgICAgICAgICAgLy8gZXhwZWN0aW5nLiAgVGhpcyBjYW4gaGFwcGVuIGlmIGEgdXNlciBkZWZpbmVzIGEKKyAgICAgICAgICAgIC8vIEdlbmVyYXRlZEV4dGVuc2lvbiBtYW51YWxseSBhbmQgZ2l2ZXMgaXQgYSBkaWZmZXJlbnQgdHlwZS4KKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaW4gbm9ybWFsIHVzZS4gIEJ1dCwgdG8gYmUgbmljZSwgd2UnbGwKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIG1lc3NhZ2UgdG8gd2hhdGV2ZXIgdHlwZSB0aGUgY2FsbGVyIHdhcyBleHBlY3RpbmcuCisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZURlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKChNZXNzYWdlKSB2YWx1ZSkuYnVpbGQoKTsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZW51bVZhbHVlT2YsIG51bGwsIChFbnVtVmFsdWVEZXNjcmlwdG9yKSB2YWx1ZSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZnJvbSB0aGUgdHlwZSB1c2VkIGJ5IHRoZSBuYXRpdmUgYWNjZXNzb3JzIHRvIHRoZSB0eXBlIHVzZWQKKyAgICAgKiBieSByZWZsZWN0aW9uIGFjY2Vzc29ycy4gIEUuZy4sIGZvciBlbnVtcywgdGhlIHJlZmxlY3Rpb24gYWNjZXNzb3JzIHVzZQorICAgICAqIEVudW1WYWx1ZURlc2NyaXB0b3JzIGJ1dCB0aGUgbmF0aXZlIGFjY2Vzc29ycyB1c2UgdGhlIGdlbmVyYXRlZCBlbnVtCisgICAgICogdHlwZS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIE9iamVjdCB0b1JlZmxlY3Rpb25UeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7CisgICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuRU5VTSkgeworICAgICAgICAgIC8vIE11c3QgY29udmVydCB0aGUgd2hvbGUgbGlzdC4KKyAgICAgICAgICBmaW5hbCBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpIHZhbHVlKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKHNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZShlbGVtZW50KSk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc2luZ3VsYXJUb1JlZmxlY3Rpb25UeXBlKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjdG9SZWZsZWN0aW9uVHlwZShPYmplY3QpfSwgYnV0IGlmIHRoZSB0eXBlIGlzIGEgcmVwZWF0ZWQKKyAgICAgKiB0eXBlLCB0aGlzIGNvbnZlcnRzIGEgc2luZ2xlIGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3Qgc2luZ3VsYXJUb1JlZmxlY3Rpb25UeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7CisgICAgICBzd2l0Y2ggKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSkgeworICAgICAgICBjYXNlIEVOVU06CisgICAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGVudW1HZXRWYWx1ZURlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKiogQ2FsbHMgQ2xhc3MuZ2V0TWV0aG9kIGFuZCB0aHJvd3MgYSBSdW50aW1lRXhjZXB0aW9uIGlmIGl0IGZhaWxzLiAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZE9yRGllKAorICAgICAgZmluYWwgQ2xhc3MgY2xhenosIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBDbGFzcy4uLiBwYXJhbXMpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGNsYXp6LmdldE1ldGhvZChuYW1lLCBwYXJhbXMpOworICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgIkdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzIFwiIiArIGNsYXp6LmdldE5hbWUoKSArCisgICAgICAgICJcIiBtaXNzaW5nIG1ldGhvZCBcIiIgKyBuYW1lICsgIlwiLiIsIGUpOworICAgIH0KKyAgfQorCisgIC8qKiBDYWxscyBpbnZva2UgYW5kIHRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24gaWYgaXQgZmFpbHMuICovCisgIHByaXZhdGUgc3RhdGljIE9iamVjdCBpbnZva2VPckRpZSgKKyAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QsIGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIE9iamVjdC4uLiBwYXJhbXMpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2Uob2JqZWN0LCBwYXJhbXMpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICJDb3VsZG4ndCB1c2UgSmF2YSByZWZsZWN0aW9uIHRvIGltcGxlbWVudCBwcm90b2NvbCBtZXNzYWdlICIgKworICAgICAgICAicmVmbGVjdGlvbi4iLCBlKTsKKyAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGZpbmFsIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGNhdXNlOworICAgICAgfSBlbHNlIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7CisgICAgICAgIHRocm93IChFcnJvcikgY2F1c2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAiVW5leHBlY3RlZCBleGNlcHRpb24gdGhyb3duIGJ5IGdlbmVyYXRlZCBhY2Nlc3NvciBtZXRob2QuIiwgY2F1c2UpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2VycyBzaG91bGQgaWdub3JlIHRoaXMgY2xhc3MuICBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgKiB3aXRoIGFjY2VzcyB0byB0aGUgZmllbGRzIG9mIGEgbWVzc2FnZSBvYmplY3QgdXNpbmcgSmF2YSByZWZsZWN0aW9uLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGaWVsZEFjY2Vzc29yVGFibGUgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgRmllbGRBY2Nlc3NvclRhYmxlIGZvciBhIHBhcnRpY3VsYXIgbWVzc2FnZSBjbGFzcy4gIE9ubHkKKyAgICAgKiBvbmUgRmllbGRBY2Nlc3NvclRhYmxlIHNob3VsZCBldmVyIGJlIGNvbnN0cnVjdGVkIHBlciBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yICAgICBUaGUgdHlwZSdzIGRlc2NyaXB0b3IuCisgICAgICogQHBhcmFtIGNhbWVsQ2FzZU5hbWVzIFRoZSBjYW1lbGNhc2UgbmFtZXMgb2YgYWxsIGZpZWxkcyBpbiB0aGUgbWVzc2FnZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgYXJlIHVzZWQgdG8gZGVyaXZlIHRoZSBhY2Nlc3NvciBtZXRob2QgbmFtZXMuCisgICAgICogQHBhcmFtIG1lc3NhZ2VDbGFzcyAgIFRoZSBtZXNzYWdlIHR5cGUuCisgICAgICogQHBhcmFtIGJ1aWxkZXJDbGFzcyAgIFRoZSBidWlsZGVyIHR5cGUuCisgICAgICovCisgICAgcHVibGljIEZpZWxkQWNjZXNzb3JUYWJsZSgKKyAgICAgICAgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBjYW1lbENhc2VOYW1lcywKKyAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKKyAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcykgeworICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKKyAgICAgIGZpZWxkcyA9IG5ldyBGaWVsZEFjY2Vzc29yW2Rlc2NyaXB0b3IuZ2V0RmllbGRzKCkuc2l6ZSgpXTsKKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZGVzY3JpcHRvci5nZXRGaWVsZHMoKS5nZXQoaSk7CisgICAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFJlcGVhdGVkTWVzc2FnZUZpZWxkQWNjZXNzb3IoCisgICAgICAgICAgICAgIGZpZWxkLCBjYW1lbENhc2VOYW1lc1tpXSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOworICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuRU5VTSkgeworICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFJlcGVhdGVkRW51bUZpZWxkQWNjZXNzb3IoCisgICAgICAgICAgICAgIGZpZWxkLCBjYW1lbENhc2VOYW1lc1tpXSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWVsZHNbaV0gPSBuZXcgUmVwZWF0ZWRGaWVsZEFjY2Vzc29yKAorICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKKyAgICAgICAgICAgIGZpZWxkc1tpXSA9IG5ldyBTaW5ndWxhck1lc3NhZ2VGaWVsZEFjY2Vzc29yKAorICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLkVOVU0pIHsKKyAgICAgICAgICAgIGZpZWxkc1tpXSA9IG5ldyBTaW5ndWxhckVudW1GaWVsZEFjY2Vzc29yKAorICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFNpbmd1bGFyRmllbGRBY2Nlc3NvcigKKyAgICAgICAgICAgICAgZmllbGQsIGNhbWVsQ2FzZU5hbWVzW2ldLCBtZXNzYWdlQ2xhc3MsIGJ1aWxkZXJDbGFzcyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWVsZEFjY2Vzc29yW10gZmllbGRzOworCisgICAgLyoqIEdldCB0aGUgRmllbGRBY2Nlc3NvciBmb3IgYSBwYXJ0aWN1bGFyIGZpZWxkLiAqLworICAgIHByaXZhdGUgRmllbGRBY2Nlc3NvciBnZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9IGRlc2NyaXB0b3IpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgeworICAgICAgICAvLyBJZiB0aGlzIHR5cGUgaGFkIGV4dGVuc2lvbnMsIGl0IHdvdWxkIHN1YmNsYXNzIEV4dGVuZGFibGVNZXNzYWdlLAorICAgICAgICAvLyB3aGljaCBvdmVycmlkZXMgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlIHRvIGhhbmRsZSBleHRlbnNpb25zLgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJUaGlzIHR5cGUgZG9lcyBub3QgaGF2ZSBleHRlbnNpb25zLiIpOworICAgICAgfQorICAgICAgcmV0dXJuIGZpZWxkc1tmaWVsZC5nZXRJbmRleCgpXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBYnN0cmFjdCBpbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gYSBzaW5nbGUgZmllbGQuICBUaGlzIGlzCisgICAgICogaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlIGFuZCBjYXJkaW5hbGl0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludGVyZmFjZSBGaWVsZEFjY2Vzc29yIHsKKyAgICAgIE9iamVjdCBnZXQoR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKTsKKyAgICAgIE9iamVjdCBnZXQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpOworICAgICAgdm9pZCBzZXQoQnVpbGRlciBidWlsZGVyLCBPYmplY3QgdmFsdWUpOworICAgICAgT2JqZWN0IGdldFJlcGVhdGVkKEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSwgaW50IGluZGV4KTsKKyAgICAgIE9iamVjdCBnZXRSZXBlYXRlZChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4KTsKKyAgICAgIHZvaWQgc2V0UmVwZWF0ZWQoQnVpbGRlciBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSk7CisgICAgICB2b2lkIGFkZFJlcGVhdGVkKEJ1aWxkZXIgYnVpbGRlciwgT2JqZWN0IHZhbHVlKTsKKyAgICAgIGJvb2xlYW4gaGFzKEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSk7CisgICAgICBib29sZWFuIGhhcyhHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcik7CisgICAgICBpbnQgZ2V0UmVwZWF0ZWRDb3VudChHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpOworICAgICAgaW50IGdldFJlcGVhdGVkQ291bnQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpOworICAgICAgdm9pZCBjbGVhcihCdWlsZGVyIGJ1aWxkZXIpOworICAgICAgTWVzc2FnZS5CdWlsZGVyIG5ld0J1aWxkZXIoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNpbmd1bGFyRmllbGRBY2Nlc3NvciBpbXBsZW1lbnRzIEZpZWxkQWNjZXNzb3IgeworICAgICAgU2luZ3VsYXJGaWVsZEFjY2Vzc29yKAorICAgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBTdHJpbmcgY2FtZWxDYXNlTmFtZSwKKyAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZT4gbWVzc2FnZUNsYXNzLAorICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MpIHsKKyAgICAgICAgZ2V0TWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUobWVzc2FnZUNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUpOworICAgICAgICBnZXRNZXRob2RCdWlsZGVyID0gZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUpOworICAgICAgICB0eXBlID0gZ2V0TWV0aG9kLmdldFJldHVyblR5cGUoKTsKKyAgICAgICAgc2V0TWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAic2V0IiArIGNhbWVsQ2FzZU5hbWUsIHR5cGUpOworICAgICAgICBoYXNNZXRob2QgPQorICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUobWVzc2FnZUNsYXNzLCAiaGFzIiArIGNhbWVsQ2FzZU5hbWUpOworICAgICAgICBoYXNNZXRob2RCdWlsZGVyID0KKyAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImhhcyIgKyBjYW1lbENhc2VOYW1lKTsKKyAgICAgICAgY2xlYXJNZXRob2QgPSBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsICJjbGVhciIgKyBjYW1lbENhc2VOYW1lKTsKKyAgICAgIH0KKworICAgICAgLy8gTm90ZTogIFdlIHVzZSBKYXZhIHJlZmxlY3Rpb24gdG8gY2FsbCBwdWJsaWMgbWV0aG9kcyByYXRoZXIgdGhhbgorICAgICAgLy8gICBhY2Nlc3MgcHJpdmF0ZSBmaWVsZHMgZGlyZWN0bHkgYXMgdGhpcyBhdm9pZHMgcnVudGltZSBzZWN1cml0eQorICAgICAgLy8gICBjaGVja3MuCisgICAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3M8Pz4gdHlwZTsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgZ2V0TWV0aG9kOworICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRNZXRob2RCdWlsZGVyOworICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBzZXRNZXRob2Q7CisgICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGhhc01ldGhvZDsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgaGFzTWV0aG9kQnVpbGRlcjsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgY2xlYXJNZXRob2Q7CisKKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZ2V0TWV0aG9kLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgIHJldHVybiBpbnZva2VPckRpZShnZXRNZXRob2RCdWlsZGVyLCBidWlsZGVyKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIHNldChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpbnZva2VPckRpZShzZXRNZXRob2QsIGJ1aWxkZXIsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJnZXRSZXBlYXRlZEZpZWxkKCkgY2FsbGVkIG9uIGEgc2luZ3VsYXIgZmllbGQuIik7CisgICAgICB9CisgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJnZXRSZXBlYXRlZEZpZWxkKCkgY2FsbGVkIG9uIGEgc2luZ3VsYXIgZmllbGQuIik7CisgICAgICB9CisgICAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRlZChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgInNldFJlcGVhdGVkRmllbGQoKSBjYWxsZWQgb24gYSBzaW5ndWxhciBmaWVsZC4iKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIGFkZFJlcGVhdGVkKGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiYWRkUmVwZWF0ZWRGaWVsZCgpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOworICAgICAgfQorICAgICAgcHVibGljIGJvb2xlYW4gaGFzKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICByZXR1cm4gKEJvb2xlYW4pIGludm9rZU9yRGllKGhhc01ldGhvZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgICBwdWJsaWMgYm9vbGVhbiBoYXMoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgcmV0dXJuIChCb29sZWFuKSBpbnZva2VPckRpZShoYXNNZXRob2RCdWlsZGVyLCBidWlsZGVyKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRDb3VudChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJnZXRSZXBlYXRlZEZpZWxkU2l6ZSgpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOworICAgICAgfQorICAgICAgcHVibGljIGludCBnZXRSZXBlYXRlZENvdW50KEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZFNpemUoKSBjYWxsZWQgb24gYSBzaW5ndWxhciBmaWVsZC4iKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKGZpbmFsIEJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICBpbnZva2VPckRpZShjbGVhck1ldGhvZCwgYnVpbGRlcik7CisgICAgICB9CisgICAgICBwdWJsaWMgTWVzc2FnZS5CdWlsZGVyIG5ld0J1aWxkZXIoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAibmV3QnVpbGRlckZvckZpZWxkKCkgY2FsbGVkIG9uIGEgbm9uLU1lc3NhZ2UgdHlwZS4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXBlYXRlZEZpZWxkQWNjZXNzb3IgaW1wbGVtZW50cyBGaWVsZEFjY2Vzc29yIHsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBDbGFzcyB0eXBlOworICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRNZXRob2Q7CisgICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGdldE1ldGhvZEJ1aWxkZXI7CisgICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGdldFJlcGVhdGVkTWV0aG9kOworICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRSZXBlYXRlZE1ldGhvZEJ1aWxkZXI7CisgICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIHNldFJlcGVhdGVkTWV0aG9kOworICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBhZGRSZXBlYXRlZE1ldGhvZDsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgZ2V0Q291bnRNZXRob2Q7CisgICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGdldENvdW50TWV0aG9kQnVpbGRlcjsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgY2xlYXJNZXRob2Q7CisKKyAgICAgIFJlcGVhdGVkRmllbGRBY2Nlc3NvcigKKyAgICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgZmluYWwgU3RyaW5nIGNhbWVsQ2FzZU5hbWUsCisgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKKyAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQnVpbGRlcj4gYnVpbGRlckNsYXNzKSB7CisgICAgICAgIGdldE1ldGhvZCA9IGdldE1ldGhvZE9yRGllKG1lc3NhZ2VDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIkxpc3QiKTsKKyAgICAgICAgZ2V0TWV0aG9kQnVpbGRlciA9IGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIkxpc3QiKTsKKworCisgICAgICAgIGdldFJlcGVhdGVkTWV0aG9kID0KKyAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKG1lc3NhZ2VDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lLCBJbnRlZ2VyLlRZUEUpOworICAgICAgICBnZXRSZXBlYXRlZE1ldGhvZEJ1aWxkZXIgPQorICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUsIEludGVnZXIuVFlQRSk7CisgICAgICAgIHR5cGUgPSBnZXRSZXBlYXRlZE1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7CisgICAgICAgIHNldFJlcGVhdGVkTWV0aG9kID0KKyAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgInNldCIgKyBjYW1lbENhc2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5UWVBFLCB0eXBlKTsKKyAgICAgICAgYWRkUmVwZWF0ZWRNZXRob2QgPQorICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiYWRkIiArIGNhbWVsQ2FzZU5hbWUsIHR5cGUpOworICAgICAgICBnZXRDb3VudE1ldGhvZCA9CisgICAgICAgICAgICBnZXRNZXRob2RPckRpZShtZXNzYWdlQ2xhc3MsICJnZXQiICsgY2FtZWxDYXNlTmFtZSArICJDb3VudCIpOworICAgICAgICBnZXRDb3VudE1ldGhvZEJ1aWxkZXIgPQorICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUgKyAiQ291bnQiKTsKKworICAgICAgICBjbGVhck1ldGhvZCA9IGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImNsZWFyIiArIGNhbWVsQ2FzZU5hbWUpOworICAgICAgfQorCisgICAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldE1ldGhvZCwgbWVzc2FnZSk7CisgICAgICB9CisgICAgICBwdWJsaWMgT2JqZWN0IGdldChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZ2V0TWV0aG9kQnVpbGRlciwgYnVpbGRlcik7CisgICAgICB9CisgICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgLy8gQWRkIGFsbCB0aGUgZWxlbWVudHMgaW5kaXZpZHVhbGx5LiAgVGhpcyBzZXJ2ZXMgdHdvIHB1cnBvc2VzOgorICAgICAgICAvLyAxKSBWZXJpZmllcyB0aGF0IGVhY2ggZWxlbWVudCBoYXMgdGhlIGNvcnJlY3QgdHlwZS4KKyAgICAgICAgLy8gMikgSW5zdXJlcyB0aGF0IHRoZSBjYWxsZXIgY2Fubm90IG1vZGlmeSB0aGUgbGlzdCBsYXRlciBvbiBhbmQKKyAgICAgICAgLy8gICAgaGF2ZSB0aGUgbW9kaWZpY2F0aW9ucyBiZSByZWZsZWN0ZWQgaW4gdGhlIG1lc3NhZ2UuCisgICAgICAgIGNsZWFyKGJ1aWxkZXIpOworICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3Q8Pz4pIHZhbHVlKSB7CisgICAgICAgICAgYWRkUmVwZWF0ZWQoYnVpbGRlciwgZWxlbWVudCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFJlcGVhdGVkTWV0aG9kLCBtZXNzYWdlLCBpbmRleCk7CisgICAgICB9CisgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFJlcGVhdGVkTWV0aG9kQnVpbGRlciwgYnVpbGRlciwgaW5kZXgpOworICAgICAgfQorICAgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaW52b2tlT3JEaWUoc2V0UmVwZWF0ZWRNZXRob2QsIGJ1aWxkZXIsIGluZGV4LCB2YWx1ZSk7CisgICAgICB9CisgICAgICBwdWJsaWMgdm9pZCBhZGRSZXBlYXRlZChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpbnZva2VPckRpZShhZGRSZXBlYXRlZE1ldGhvZCwgYnVpbGRlciwgdmFsdWUpOworICAgICAgfQorICAgICAgcHVibGljIGJvb2xlYW4gaGFzKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgImhhc0ZpZWxkKCkgY2FsbGVkIG9uIGEgc2luZ3VsYXIgZmllbGQuIik7CisgICAgICB9CisgICAgICBwdWJsaWMgYm9vbGVhbiBoYXMoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJoYXNGaWVsZCgpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOworICAgICAgfQorICAgICAgcHVibGljIGludCBnZXRSZXBlYXRlZENvdW50KGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICByZXR1cm4gKEludGVnZXIpIGludm9rZU9yRGllKGdldENvdW50TWV0aG9kLCBtZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRDb3VudChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICByZXR1cm4gKEludGVnZXIpIGludm9rZU9yRGllKGdldENvdW50TWV0aG9kQnVpbGRlciwgYnVpbGRlcik7CisgICAgICB9CisgICAgICBwdWJsaWMgdm9pZCBjbGVhcihmaW5hbCBCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgaW52b2tlT3JEaWUoY2xlYXJNZXRob2QsIGJ1aWxkZXIpOworICAgICAgfQorICAgICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBuZXdCdWlsZGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIm5ld0J1aWxkZXJGb3JGaWVsZCgpIGNhbGxlZCBvbiBhIG5vbi1NZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTaW5ndWxhckVudW1GaWVsZEFjY2Vzc29yCisgICAgICAgIGV4dGVuZHMgU2luZ3VsYXJGaWVsZEFjY2Vzc29yIHsKKyAgICAgIFNpbmd1bGFyRW51bUZpZWxkQWNjZXNzb3IoCisgICAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIFN0cmluZyBjYW1lbENhc2VOYW1lLAorICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlPiBtZXNzYWdlQ2xhc3MsCisgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcykgeworICAgICAgICBzdXBlcihkZXNjcmlwdG9yLCBjYW1lbENhc2VOYW1lLCBtZXNzYWdlQ2xhc3MsIGJ1aWxkZXJDbGFzcyk7CisKKyAgICAgICAgdmFsdWVPZk1ldGhvZCA9IGdldE1ldGhvZE9yRGllKHR5cGUsICJ2YWx1ZU9mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3IuY2xhc3MpOworICAgICAgICBnZXRWYWx1ZURlc2NyaXB0b3JNZXRob2QgPQorICAgICAgICAgIGdldE1ldGhvZE9yRGllKHR5cGUsICJnZXRWYWx1ZURlc2NyaXB0b3IiKTsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBNZXRob2QgdmFsdWVPZk1ldGhvZDsKKyAgICAgIHByaXZhdGUgTWV0aG9kIGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZDsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwgc3VwZXIuZ2V0KG1lc3NhZ2UpKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZ2V0VmFsdWVEZXNjcmlwdG9yTWV0aG9kLCBzdXBlci5nZXQoYnVpbGRlcikpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHNldChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzdXBlci5zZXQoYnVpbGRlciwgaW52b2tlT3JEaWUodmFsdWVPZk1ldGhvZCwgbnVsbCwgdmFsdWUpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXBlYXRlZEVudW1GaWVsZEFjY2Vzc29yCisgICAgICAgIGV4dGVuZHMgUmVwZWF0ZWRGaWVsZEFjY2Vzc29yIHsKKyAgICAgIFJlcGVhdGVkRW51bUZpZWxkQWNjZXNzb3IoCisgICAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIFN0cmluZyBjYW1lbENhc2VOYW1lLAorICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlPiBtZXNzYWdlQ2xhc3MsCisgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcykgeworICAgICAgICBzdXBlcihkZXNjcmlwdG9yLCBjYW1lbENhc2VOYW1lLCBtZXNzYWdlQ2xhc3MsIGJ1aWxkZXJDbGFzcyk7CisKKyAgICAgICAgdmFsdWVPZk1ldGhvZCA9IGdldE1ldGhvZE9yRGllKHR5cGUsICJ2YWx1ZU9mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3IuY2xhc3MpOworICAgICAgICBnZXRWYWx1ZURlc2NyaXB0b3JNZXRob2QgPQorICAgICAgICAgIGdldE1ldGhvZE9yRGllKHR5cGUsICJnZXRWYWx1ZURlc2NyaXB0b3IiKTsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgdmFsdWVPZk1ldGhvZDsKKyAgICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZDsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBmaW5hbCBMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiAoTGlzdCkgc3VwZXIuZ2V0KG1lc3NhZ2UpKSB7CisgICAgICAgICAgbmV3TGlzdC5hZGQoaW52b2tlT3JEaWUoZ2V0VmFsdWVEZXNjcmlwdG9yTWV0aG9kLCBlbGVtZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3TGlzdCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICBmaW5hbCBMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiAoTGlzdCkgc3VwZXIuZ2V0KGJ1aWxkZXIpKSB7CisgICAgICAgICAgbmV3TGlzdC5hZGQoaW52b2tlT3JEaWUoZ2V0VmFsdWVEZXNjcmlwdG9yTWV0aG9kLCBlbGVtZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3TGlzdCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZ2V0VmFsdWVEZXNjcmlwdG9yTWV0aG9kLAorICAgICAgICAgIHN1cGVyLmdldFJlcGVhdGVkKG1lc3NhZ2UsIGluZGV4KSk7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZ2V0VmFsdWVEZXNjcmlwdG9yTWV0aG9kLAorICAgICAgICAgIHN1cGVyLmdldFJlcGVhdGVkKGJ1aWxkZXIsIGluZGV4KSk7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdGVkKGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHN1cGVyLnNldFJlcGVhdGVkKGJ1aWxkZXIsIGluZGV4LCBpbnZva2VPckRpZSh2YWx1ZU9mTWV0aG9kLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBhZGRSZXBlYXRlZChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzdXBlci5hZGRSZXBlYXRlZChidWlsZGVyLCBpbnZva2VPckRpZSh2YWx1ZU9mTWV0aG9kLCBudWxsLCB2YWx1ZSkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2luZ3VsYXJNZXNzYWdlRmllbGRBY2Nlc3NvcgorICAgICAgICBleHRlbmRzIFNpbmd1bGFyRmllbGRBY2Nlc3NvciB7CisgICAgICBTaW5ndWxhck1lc3NhZ2VGaWVsZEFjY2Vzc29yKAorICAgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBTdHJpbmcgY2FtZWxDYXNlTmFtZSwKKyAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZT4gbWVzc2FnZUNsYXNzLAorICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MpIHsKKyAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwgY2FtZWxDYXNlTmFtZSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOworCisgICAgICAgIG5ld0J1aWxkZXJNZXRob2QgPSBnZXRNZXRob2RPckRpZSh0eXBlLCAibmV3QnVpbGRlciIpOworICAgICAgfQorCisgICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBuZXdCdWlsZGVyTWV0aG9kOworCisgICAgICBwcml2YXRlIE9iamVjdCBjb2VyY2VUeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodHlwZS5pc0luc3RhbmNlKHZhbHVlKSkgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBUaGUgdmFsdWUgaXMgbm90IHRoZSBleGFjdCByaWdodCBtZXNzYWdlIHR5cGUuICBIb3dldmVyLCBpZiBpdAorICAgICAgICAgIC8vIGlzIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzYW1lIHR5cGUgLS0gZS5nLiBhCisgICAgICAgICAgLy8gRHluYW1pY01lc3NhZ2UgLS0gd2Ugc2hvdWxkIGFjY2VwdCBpdC4gIEluIHRoaXMgY2FzZSB3ZSBjYW4gbWFrZQorICAgICAgICAgIC8vIGEgY29weSBvZiB0aGUgbWVzc2FnZS4KKyAgICAgICAgICByZXR1cm4gKChNZXNzYWdlLkJ1aWxkZXIpIGludm9rZU9yRGllKG5ld0J1aWxkZXJNZXRob2QsIG51bGwpKQorICAgICAgICAgICAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSkgdmFsdWUpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIuc2V0KGJ1aWxkZXIsIGNvZXJjZVR5cGUodmFsdWUpKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBuZXdCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gKE1lc3NhZ2UuQnVpbGRlcikgaW52b2tlT3JEaWUobmV3QnVpbGRlck1ldGhvZCwgbnVsbCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVwZWF0ZWRNZXNzYWdlRmllbGRBY2Nlc3NvcgorICAgICAgICBleHRlbmRzIFJlcGVhdGVkRmllbGRBY2Nlc3NvciB7CisgICAgICBSZXBlYXRlZE1lc3NhZ2VGaWVsZEFjY2Vzc29yKAorICAgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBTdHJpbmcgY2FtZWxDYXNlTmFtZSwKKyAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZT4gbWVzc2FnZUNsYXNzLAorICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MpIHsKKyAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwgY2FtZWxDYXNlTmFtZSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOworCisgICAgICAgIG5ld0J1aWxkZXJNZXRob2QgPSBnZXRNZXRob2RPckRpZSh0eXBlLCAibmV3QnVpbGRlciIpOworICAgICAgfQorCisgICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBuZXdCdWlsZGVyTWV0aG9kOworCisgICAgICBwcml2YXRlIE9iamVjdCBjb2VyY2VUeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodHlwZS5pc0luc3RhbmNlKHZhbHVlKSkgeworICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBUaGUgdmFsdWUgaXMgbm90IHRoZSBleGFjdCByaWdodCBtZXNzYWdlIHR5cGUuICBIb3dldmVyLCBpZiBpdAorICAgICAgICAgIC8vIGlzIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzYW1lIHR5cGUgLS0gZS5nLiBhCisgICAgICAgICAgLy8gRHluYW1pY01lc3NhZ2UgLS0gd2Ugc2hvdWxkIGFjY2VwdCBpdC4gIEluIHRoaXMgY2FzZSB3ZSBjYW4gbWFrZQorICAgICAgICAgIC8vIGEgY29weSBvZiB0aGUgbWVzc2FnZS4KKyAgICAgICAgICByZXR1cm4gKChNZXNzYWdlLkJ1aWxkZXIpIGludm9rZU9yRGllKG5ld0J1aWxkZXJNZXRob2QsIG51bGwpKQorICAgICAgICAgICAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSkgdmFsdWUpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRlZChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzdXBlci5zZXRSZXBlYXRlZChidWlsZGVyLCBpbmRleCwgY29lcmNlVHlwZSh2YWx1ZSkpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBhZGRSZXBlYXRlZChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzdXBlci5hZGRSZXBlYXRlZChidWlsZGVyLCBjb2VyY2VUeXBlKHZhbHVlKSk7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlcigpIHsKKyAgICAgICAgcmV0dXJuIChNZXNzYWdlLkJ1aWxkZXIpIGludm9rZU9yRGllKG5ld0J1aWxkZXJNZXRob2QsIG51bGwpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXBsYWNlcyB0aGlzIG9iamVjdCBpbiB0aGUgb3V0cHV0IHN0cmVhbSB3aXRoIGEgc2VyaWFsaXplZCBmb3JtLgorICAgKiBQYXJ0IG9mIEphdmEncyBzZXJpYWxpemF0aW9uIG1hZ2ljLiAgR2VuZXJhdGVkIHN1Yi1jbGFzc2VzIG11c3Qgb3ZlcnJpZGUKKyAgICogdGhpcyBtZXRob2QgYnkgY2FsbGluZyA8Y29kZT5yZXR1cm4gc3VwZXIud3JpdGVSZXBsYWNlKCk7PC9jb2RlPgorICAgKiBAcmV0dXJuIGEgU2VyaWFsaXplZEZvcm0gb2YgdGhpcyBtZXNzYWdlCisgICAqLworICBwcm90ZWN0ZWQgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24geworICAgIHJldHVybiBuZXcgR2VuZXJhdGVkTWVzc2FnZUxpdGUuU2VyaWFsaXplZEZvcm0odGhpcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0dlbmVyYXRlZE1lc3NhZ2VMaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxM2U5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5qYXZhCkBAIC0wLDAgKzEsNzMxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBMaXRlIHZlcnNpb24gb2Yge0BsaW5rIEdlbmVyYXRlZE1lc3NhZ2V9LgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZUxpdGUKKyAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHByb3RlY3RlZCBHZW5lcmF0ZWRNZXNzYWdlTGl0ZSgpIHsKKyAgfQorCisgIHByb3RlY3RlZCBHZW5lcmF0ZWRNZXNzYWdlTGl0ZShCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEJ1aWxkZXI8TWVzc2FnZVR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXJUeXBlIGV4dGVuZHMgQnVpbGRlcj4KKyAgICAgIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTGl0ZS5CdWlsZGVyPEJ1aWxkZXJUeXBlPiB7CisgICAgcHJvdGVjdGVkIEJ1aWxkZXIoKSB7fQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsZWFyKCkgeworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIGltcGxlbWVudGVkIGhlcmUgb25seSB0byB3b3JrIGFyb3VuZCBhbiBhcHBhcmVudCBidWcgaW4gdGhlCisgICAgLy8gSmF2YSBjb21waWxlciBhbmQvb3IgYnVpbGQgc3lzdGVtLiAgU2VlIGJ1ZyAjMTg5ODQ2My4gIFRoZSBtZXJlIHByZXNlbmNlCisgICAgLy8gb2YgdGhpcyBkdW1teSBjbG9uZSgpIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGdvIGF3YXkuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsb25lKCkgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4iKTsKKyAgICB9CisKKyAgICAvKiogQWxsIHN1YmNsYXNzZXMgaW1wbGVtZW50IHRoaXMuICovCisgICAgcHVibGljIGFic3RyYWN0IEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShNZXNzYWdlVHlwZSBtZXNzYWdlKTsKKworICAgIC8vIERlZmluZWQgaGVyZSBmb3IgcmV0dXJuIHR5cGUgY292YXJpYW5jZS4KKyAgICBwdWJsaWMgYWJzdHJhY3QgTWVzc2FnZVR5cGUgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gcGFyc2UgYW4gdW5rbm93biBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHBhcnNlVW5rbm93bkZpZWxkKAorICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCisgICAgICAgIGZpbmFsIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gaW5wdXQuc2tpcEZpZWxkKHRhZyk7CisgICAgfQorICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gRXh0ZW5zaW9ucy1yZWxhdGVkIHN0dWZmCisKKyAgLyoqCisgICAqIExpdGUgZXF1aXZhbGVudCBvZiB7QGxpbmsgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyfS4KKyAgICovCisgIHB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXI8CisgICAgICBNZXNzYWdlVHlwZSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlPiBleHRlbmRzIE1lc3NhZ2VMaXRlT3JCdWlsZGVyIHsKKworICAgIC8qKiBDaGVjayBpZiBhIHNpbmd1bGFyIGV4dGVuc2lvbiBpcyBwcmVzZW50LiAqLworICAgIDxUeXBlPiBib29sZWFuIGhhc0V4dGVuc2lvbigKKyAgICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24pOworCisgICAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIDxUeXBlPiBpbnQgZ2V0RXh0ZW5zaW9uQ291bnQoCisgICAgICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uKTsKKworICAgIC8qKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGV4dGVuc2lvbi4gKi8KKyAgICA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24pOworCisgICAgLyoqIEdldCBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KKyAgICA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCisgICAgICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAorICAgICAgICBpbnQgaW5kZXgpOworICB9CisKKyAgLyoqCisgICAqIExpdGUgZXF1aXZhbGVudCBvZiB7QGxpbmsgR2VuZXJhdGVkTWVzc2FnZS5FeHRlbmRhYmxlTWVzc2FnZX0uCisgICAqLworICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEV4dGVuZGFibGVNZXNzYWdlPAorICAgICAgICBNZXNzYWdlVHlwZSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlPE1lc3NhZ2VUeXBlPj4KKyAgICAgIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZUxpdGUKKyAgICAgIGltcGxlbWVudHMgRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXI8TWVzc2FnZVR5cGU+IHsKKworICAgIHByaXZhdGUgZmluYWwgRmllbGRTZXQ8RXh0ZW5zaW9uRGVzY3JpcHRvcj4gZXh0ZW5zaW9uczsKKworICAgIHByb3RlY3RlZCBFeHRlbmRhYmxlTWVzc2FnZSgpIHsKKyAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IEZpZWxkU2V0Lm5ld0ZpZWxkU2V0KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4dGVuZGFibGVNZXNzYWdlKEV4dGVuZGFibGVCdWlsZGVyPE1lc3NhZ2VUeXBlLCA/PiBidWlsZGVyKSB7CisgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBidWlsZGVyLmJ1aWxkRXh0ZW5zaW9ucygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZSgKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCA/PiBleHRlbnNpb24pIHsKKyAgICAgIGlmIChleHRlbnNpb24uZ2V0Q29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UoKSAhPQorICAgICAgICAgIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSkgeworICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBzb21lb25lIHVzZXMgdW5jaGVja2VkIG9wZXJhdGlvbnMuCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIlRoaXMgZXh0ZW5zaW9uIGlzIGZvciBhIGRpZmZlcmVudCBtZXNzYWdlIHR5cGUuICBQbGVhc2UgbWFrZSAiICsKKyAgICAgICAgICAic3VyZSB0aGF0IHlvdSBhcmUgbm90IHN1cHByZXNzaW5nIGFueSBnZW5lcmljcyB0eXBlIHdhcm5pbmdzLiIpOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBDaGVjayBpZiBhIHNpbmd1bGFyIGV4dGVuc2lvbiBpcyBwcmVzZW50LiAqLworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gYm9vbGVhbiBoYXNFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaGFzRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24pIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGV4dGVuc2lvbi4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0RmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbi5kZWZhdWx0VmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKFR5cGUpIHZhbHVlOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBHZXQgb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBleHRlbnNpb24uICovCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCisgICAgICAgIGZpbmFsIGludCBpbmRleCkgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgfQorCisgICAgLyoqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIGNoZWNrIGlmIGFsbCBleHRlbnNpb25zIGFyZSBpbml0aWFsaXplZC4gKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQoKSB7CisgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5pc0luaXRpYWxpemVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBieSBzdWJjbGFzc2VzIHRvIHNlcmlhbGl6ZSBleHRlbnNpb25zLiAgRXh0ZW5zaW9uIHJhbmdlcyBtYXkgYmUKKyAgICAgKiBpbnRlcmxlYXZlZCB3aXRoIGZpZWxkIG51bWJlcnMsIGJ1dCB3ZSBtdXN0IHdyaXRlIHRoZW0gaW4gY2Fub25pY2FsCisgICAgICogKHNvcnRlZCBieSBmaWVsZCBudW1iZXIpIG9yZGVyLiAgRXh0ZW5zaW9uV3JpdGVyIGhlbHBzIHVzIHdyaXRlCisgICAgICogaW5kaXZpZHVhbCByYW5nZXMgb2YgZXh0ZW5zaW9ucyBhdCBvbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBFeHRlbnNpb25Xcml0ZXIgeworICAgICAgLy8gSW1hZ2luZSBob3cgbXVjaCBzaW1wbGVyIHRoaXMgY29kZSB3b3VsZCBiZSBpZiBKYXZhIGl0ZXJhdG9ycyBoYWQKKyAgICAgIC8vIGEgd2F5IHRvIGdldCB0aGUgbmV4dCBlbGVtZW50IHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBpdGVyYXRvci4KKworICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxNYXAuRW50cnk8RXh0ZW5zaW9uRGVzY3JpcHRvciwgT2JqZWN0Pj4gaXRlciA9CisgICAgICAgICAgICBleHRlbnNpb25zLml0ZXJhdG9yKCk7CisgICAgICBwcml2YXRlIE1hcC5FbnRyeTxFeHRlbnNpb25EZXNjcmlwdG9yLCBPYmplY3Q+IG5leHQ7CisgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbWVzc2FnZVNldFdpcmVGb3JtYXQ7CisKKyAgICAgIHByaXZhdGUgRXh0ZW5zaW9uV3JpdGVyKGJvb2xlYW4gbWVzc2FnZVNldFdpcmVGb3JtYXQpIHsKKyAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgbmV4dCA9IGl0ZXIubmV4dCgpOworICAgICAgICB9CisgICAgICAgIHRoaXMubWVzc2FnZVNldFdpcmVGb3JtYXQgPSBtZXNzYWdlU2V0V2lyZUZvcm1hdDsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgd3JpdGVVbnRpbChmaW5hbCBpbnQgZW5kLCBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdoaWxlIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXRLZXkoKS5nZXROdW1iZXIoKSA8IGVuZCkgeworICAgICAgICAgIEV4dGVuc2lvbkRlc2NyaXB0b3IgZXh0ZW5zaW9uID0gbmV4dC5nZXRLZXkoKTsKKyAgICAgICAgICBpZiAobWVzc2FnZVNldFdpcmVGb3JtYXQgJiYgZXh0ZW5zaW9uLmdldExpdGVKYXZhVHlwZSgpID09CisgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0LkphdmFUeXBlLk1FU1NBR0UgJiYKKyAgICAgICAgICAgICAgIWV4dGVuc2lvbi5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICAgIG91dHB1dC53cml0ZU1lc3NhZ2VTZXRFeHRlbnNpb24oZXh0ZW5zaW9uLmdldE51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZUxpdGUpIG5leHQuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZpZWxkU2V0LndyaXRlRmllbGQoZXh0ZW5zaW9uLCBuZXh0LmdldFZhbHVlKCksIG91dHB1dCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgbmV4dCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRXh0ZW5zaW9uV3JpdGVyIG5ld0V4dGVuc2lvbldyaXRlcigpIHsKKyAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uV3JpdGVyKGZhbHNlKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIEV4dGVuc2lvbldyaXRlciBuZXdNZXNzYWdlU2V0RXh0ZW5zaW9uV3JpdGVyKCkgeworICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25Xcml0ZXIodHJ1ZSk7CisgICAgfQorCisgICAgLyoqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgZXh0ZW5zaW9ucy4gKi8KKyAgICBwcm90ZWN0ZWQgaW50IGV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZSgpIHsKKyAgICAgIHJldHVybiBleHRlbnNpb25zLmdldFNlcmlhbGl6ZWRTaXplKCk7CisgICAgfQorICAgIHByb3RlY3RlZCBpbnQgZXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0KCkgeworICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIExpdGUgZXF1aXZhbGVudCBvZiB7QGxpbmsgR2VuZXJhdGVkTWVzc2FnZS5FeHRlbmRhYmxlQnVpbGRlcn0uCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBFeHRlbmRhYmxlQnVpbGRlcjwKKyAgICAgICAgTWVzc2FnZVR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlTWVzc2FnZTxNZXNzYWdlVHlwZT4sCisgICAgICAgIEJ1aWxkZXJUeXBlIGV4dGVuZHMgRXh0ZW5kYWJsZUJ1aWxkZXI8TWVzc2FnZVR5cGUsIEJ1aWxkZXJUeXBlPj4KKyAgICAgIGV4dGVuZHMgQnVpbGRlcjxNZXNzYWdlVHlwZSwgQnVpbGRlclR5cGU+CisgICAgICBpbXBsZW1lbnRzIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPE1lc3NhZ2VUeXBlPiB7CisgICAgcHJvdGVjdGVkIEV4dGVuZGFibGVCdWlsZGVyKCkge30KKworICAgIHByaXZhdGUgRmllbGRTZXQ8RXh0ZW5zaW9uRGVzY3JpcHRvcj4gZXh0ZW5zaW9ucyA9IEZpZWxkU2V0LmVtcHR5U2V0KCk7CisgICAgcHJpdmF0ZSBib29sZWFuIGV4dGVuc2lvbnNJc011dGFibGU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXIoKSB7CisgICAgICBleHRlbnNpb25zLmNsZWFyKCk7CisgICAgICBleHRlbnNpb25zSXNNdXRhYmxlID0gZmFsc2U7CisgICAgICByZXR1cm4gc3VwZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpIHsKKyAgICAgIGlmICghZXh0ZW5zaW9uc0lzTXV0YWJsZSkgeworICAgICAgICBleHRlbnNpb25zID0gZXh0ZW5zaW9ucy5jbG9uZSgpOworICAgICAgICBleHRlbnNpb25zSXNNdXRhYmxlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGJ1aWxkIGNvZGUgcGF0aCB0byBjcmVhdGUgYSBjb3B5IG9mIHRoZSBleHRlbnNpb25zIGZvcgorICAgICAqIGJ1aWxkaW5nIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHByaXZhdGUgRmllbGRTZXQ8RXh0ZW5zaW9uRGVzY3JpcHRvcj4gYnVpbGRFeHRlbnNpb25zKCkgeworICAgICAgZXh0ZW5zaW9ucy5tYWtlSW1tdXRhYmxlKCk7CisgICAgICBleHRlbnNpb25zSXNNdXRhYmxlID0gZmFsc2U7CisgICAgICByZXR1cm4gZXh0ZW5zaW9uczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgPz4gZXh0ZW5zaW9uKSB7CisgICAgICBpZiAoZXh0ZW5zaW9uLmdldENvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlKCkgIT0KKyAgICAgICAgICBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkpIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc29tZW9uZSB1c2VzIHVuY2hlY2tlZCBvcGVyYXRpb25zLgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJUaGlzIGV4dGVuc2lvbiBpcyBmb3IgYSBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlLiAgUGxlYXNlIG1ha2UgIiArCisgICAgICAgICAgInN1cmUgdGhhdCB5b3UgYXJlIG5vdCBzdXBwcmVzc2luZyBhbnkgZ2VuZXJpY3MgdHlwZSB3YXJuaW5ncy4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgeworICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKKyAgICAgIHJldHVybiBleHRlbnNpb25zLmhhc0ZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSByZXBlYXRlZCBleHRlbnNpb24uICovCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBpbnQgZ2V0RXh0ZW5zaW9uQ291bnQoCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uICovCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24pIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBleHRlbnNpb25zLmdldEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBleHRlbnNpb24uZGVmYXVsdFZhbHVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChUeXBlKSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICByZXR1cm4gKFR5cGUpIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvciwgaW5kZXgpOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZSBvbmx5IHRvIHdvcmsgYXJvdW5kIGFuIGFwcGFyZW50IGJ1ZyBpbiB0aGUKKyAgICAvLyBKYXZhIGNvbXBpbGVyIGFuZC9vciBidWlsZCBzeXN0ZW0uICBTZWUgYnVnICMxODk4NDYzLiAgVGhlIG1lcmUgcHJlc2VuY2UKKyAgICAvLyBvZiB0aGlzIGR1bW15IGNsb25lKCkgaW1wbGVtZW50YXRpb24gbWFrZXMgaXQgZ28gYXdheS4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xvbmUoKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIlRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLiIpOworICAgIH0KKworICAgIC8qKiBTZXQgdGhlIHZhbHVlIG9mIGFuIGV4dGVuc2lvbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgPFR5cGU+IEJ1aWxkZXJUeXBlIHNldEV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24sCisgICAgICAgIGZpbmFsIFR5cGUgdmFsdWUpIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICBleHRlbnNpb25zLnNldEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKiBTZXQgdGhlIHZhbHVlIG9mIG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLworICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gQnVpbGRlclR5cGUgc2V0RXh0ZW5zaW9uKAorICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbiwKKyAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBUeXBlIHZhbHVlKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOworICAgICAgZXh0ZW5zaW9ucy5zZXRSZXBlYXRlZEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLCBpbmRleCwgdmFsdWUpOworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICAvKiogQXBwZW5kIGEgdmFsdWUgdG8gYSByZXBlYXRlZCBleHRlbnNpb24uICovCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBCdWlsZGVyVHlwZSBhZGRFeHRlbnNpb24oCisgICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAorICAgICAgICBmaW5hbCBUeXBlIHZhbHVlKSB7CisgICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOworICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOworICAgICAgZXh0ZW5zaW9ucy5hZGRSZXBlYXRlZEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOworICAgIH0KKworICAgIC8qKiBDbGVhciBhbiBleHRlbnNpb24uICovCisgICAgcHVibGljIGZpbmFsIDxUeXBlPiBCdWlsZGVyVHlwZSBjbGVhckV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCA/PiBleHRlbnNpb24pIHsKKyAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7CisgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICBleHRlbnNpb25zLmNsZWFyRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKKyAgICB9CisKKyAgICAvKiogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY2hlY2sgaWYgYWxsIGV4dGVuc2lvbnMgYXJlIGluaXRpYWxpemVkLiAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCgpIHsKKyAgICAgIHJldHVybiBleHRlbnNpb25zLmlzSW5pdGlhbGl6ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBwYXJzZSBhbiB1bmtub3duIGZpZWxkIG9yIGFuIGV4dGVuc2lvbi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIHBhcnNlVW5rbm93bkZpZWxkKAorICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCisgICAgICAgIGZpbmFsIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBpbnQgd2lyZVR5cGUgPSBXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZyk7CisgICAgICBmaW5hbCBpbnQgZmllbGROdW1iZXIgPSBXaXJlRm9ybWF0LmdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7CisKKyAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgPz4gZXh0ZW5zaW9uID0KKyAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnkuZmluZExpdGVFeHRlbnNpb25CeU51bWJlcigKKyAgICAgICAgICAgIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSwgZmllbGROdW1iZXIpOworCisgICAgICBib29sZWFuIHVua25vd24gPSBmYWxzZTsKKyAgICAgIGJvb2xlYW4gcGFja2VkID0gZmFsc2U7CisgICAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKKyAgICAgICAgdW5rbm93biA9IHRydWU7ICAvLyBVbmtub3duIGZpZWxkLgorICAgICAgfSBlbHNlIGlmICh3aXJlVHlwZSA9PSBGaWVsZFNldC5nZXRXaXJlRm9ybWF0Rm9yRmllbGRUeXBlKAorICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldExpdGVUeXBlKCksCisgICAgICAgICAgICAgICAgICAgZmFsc2UgIC8qIGlzUGFja2VkICovKSkgeworICAgICAgICBwYWNrZWQgPSBmYWxzZTsgIC8vIE5vcm1hbCwgdW5wYWNrZWQgdmFsdWUuCisgICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbi5kZXNjcmlwdG9yLmlzUmVwZWF0ZWQgJiYKKyAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IudHlwZS5pc1BhY2thYmxlKCkgJiYKKyAgICAgICAgICAgICAgICAgd2lyZVR5cGUgPT0gRmllbGRTZXQuZ2V0V2lyZUZvcm1hdEZvckZpZWxkVHlwZSgKKyAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgIHRydWUgIC8qIGlzUGFja2VkICovKSkgeworICAgICAgICBwYWNrZWQgPSB0cnVlOyAgLy8gUGFja2VkIHZhbHVlLgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdW5rbm93biA9IHRydWU7ICAvLyBXcm9uZyB3aXJlIHR5cGUuCisgICAgICB9CisKKyAgICAgIGlmICh1bmtub3duKSB7ICAvLyBVbmtub3duIGZpZWxkIG9yIHdyb25nIHdpcmUgdHlwZS4gIFNraXAuCisgICAgICAgIHJldHVybiBpbnB1dC5za2lwRmllbGQodGFnKTsKKyAgICAgIH0KKworICAgICAgaWYgKHBhY2tlZCkgeworICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gaW5wdXQucmVhZFJhd1ZhcmludDMyKCk7CisgICAgICAgIGZpbmFsIGludCBsaW1pdCA9IGlucHV0LnB1c2hMaW1pdChsZW5ndGgpOworICAgICAgICBpZiAoZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSA9PSBXaXJlRm9ybWF0LkZpZWxkVHlwZS5FTlVNKSB7CisgICAgICAgICAgd2hpbGUgKGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkgeworICAgICAgICAgICAgZmluYWwgaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0RW51bVR5cGUoKS5maW5kVmFsdWVCeU51bWJlcihyYXdWYWx1ZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIGlzbid0IHJlY29nbml6ZWQgYXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcworICAgICAgICAgICAgICAvLyBlbnVtLCBkcm9wIGl0IChkb24ndCBldmVuIGFkZCBpdCB0byB1bmtub3duRmllbGRzKS4KKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICAgICAgICBleHRlbnNpb25zLmFkZFJlcGVhdGVkRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgd2hpbGUgKGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0KKyAgICAgICAgICAgICAgRmllbGRTZXQucmVhZFByaW1pdGl2ZUZpZWxkKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSk7CisgICAgICAgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7CisgICAgICAgICAgICBleHRlbnNpb25zLmFkZFJlcGVhdGVkRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsIHZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5wdXQucG9wTGltaXQobGltaXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlOworICAgICAgICBzd2l0Y2ggKGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldExpdGVKYXZhVHlwZSgpKSB7CisgICAgICAgICAgY2FzZSBNRVNTQUdFOiB7CisgICAgICAgICAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBudWxsOworICAgICAgICAgICAgaWYgKCFleHRlbnNpb24uZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICAgICAgTWVzc2FnZUxpdGUgZXhpc3RpbmdWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAoTWVzc2FnZUxpdGUpIGV4dGVuc2lvbnMuZ2V0RmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3ViQnVpbGRlciA9IGV4aXN0aW5nVmFsdWUudG9CdWlsZGVyKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdWJCdWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgc3ViQnVpbGRlciA9IGV4dGVuc2lvbi5tZXNzYWdlRGVmYXVsdEluc3RhbmNlLm5ld0J1aWxkZXJGb3JUeXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSA9PQorICAgICAgICAgICAgICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlLkdST1VQKSB7CisgICAgICAgICAgICAgIGlucHV0LnJlYWRHcm91cChleHRlbnNpb24uZ2V0TnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9IHN1YkJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEVOVU06CisgICAgICAgICAgICBmaW5hbCBpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpOworICAgICAgICAgICAgdmFsdWUgPSBleHRlbnNpb24uZGVzY3JpcHRvci5nZXRFbnVtVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kVmFsdWVCeU51bWJlcihyYXdWYWx1ZSk7CisgICAgICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIGlzbid0IHJlY29nbml6ZWQgYXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcyBlbnVtLAorICAgICAgICAgICAgLy8gZHJvcCBpdC4KKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhbHVlID0gRmllbGRTZXQucmVhZFByaW1pdGl2ZUZpZWxkKGlucHV0LAorICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldExpdGVUeXBlKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXh0ZW5zaW9uLmRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOworICAgICAgICAgIGV4dGVuc2lvbnMuYWRkUmVwZWF0ZWRGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKKyAgICAgICAgICBleHRlbnNpb25zLnNldEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgbWVyZ2VFeHRlbnNpb25GaWVsZHMoZmluYWwgTWVzc2FnZVR5cGUgb3RoZXIpIHsKKyAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKKyAgICAgIGV4dGVuc2lvbnMubWVyZ2VGcm9tKCgoRXh0ZW5kYWJsZU1lc3NhZ2UpIG90aGVyKS5leHRlbnNpb25zKTsKKyAgICB9CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKiBGb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICovCisgIHB1YmxpYyBzdGF0aWMgPENvbnRhaW5pbmdUeXBlIGV4dGVuZHMgTWVzc2FnZUxpdGUsIFR5cGU+CisgICAgICBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+CisgICAgICAgICAgbmV3U2luZ3VsYXJHZW5lcmF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgICAgIGZpbmFsIENvbnRhaW5pbmdUeXBlIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLAorICAgICAgICAgICAgICBmaW5hbCBUeXBlIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgZmluYWwgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZW51bVR5cGVNYXAsCisgICAgICAgICAgICAgIGZpbmFsIGludCBudW1iZXIsCisgICAgICAgICAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUpIHsKKyAgICByZXR1cm4gbmV3IEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4oCisgICAgICAgIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLAorICAgICAgICBkZWZhdWx0VmFsdWUsCisgICAgICAgIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UsCisgICAgICAgIG5ldyBFeHRlbnNpb25EZXNjcmlwdG9yKGVudW1UeXBlTWFwLCBudW1iZXIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGlzUmVwZWF0ZWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGlzUGFja2VkICovKSk7CisgIH0KKworICAvKiogRm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiAqLworICBwdWJsaWMgc3RhdGljIDxDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2VMaXRlLCBUeXBlPgorICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCBUeXBlPgorICAgICAgICAgIG5ld1JlcGVhdGVkR2VuZXJhdGVkRXh0ZW5zaW9uKAorICAgICAgICAgICAgICBmaW5hbCBDb250YWluaW5nVHlwZSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgZmluYWwgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZW51bVR5cGVNYXAsCisgICAgICAgICAgICAgIGZpbmFsIGludCBudW1iZXIsCisgICAgICAgICAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQYWNrZWQpIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgIC8vIFN1YmNsYXNzZXMgZW5zdXJlIFR5cGUgaXMgYSBMaXN0CisgICAgVHlwZSBlbXB0eUxpc3QgPSAoVHlwZSkgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+KAorICAgICAgICBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwKKyAgICAgICAgZW1wdHlMaXN0LAorICAgICAgICBtZXNzYWdlRGVmYXVsdEluc3RhbmNlLAorICAgICAgICBuZXcgRXh0ZW5zaW9uRGVzY3JpcHRvcigKKyAgICAgICAgICAgIGVudW1UeXBlTWFwLCBudW1iZXIsIHR5cGUsIHRydWUgLyogaXNSZXBlYXRlZCAqLywgaXNQYWNrZWQpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEV4dGVuc2lvbkRlc2NyaXB0b3IKKyAgICAgIGltcGxlbWVudHMgRmllbGRTZXQuRmllbGREZXNjcmlwdG9yTGl0ZTwKKyAgICAgICAgRXh0ZW5zaW9uRGVzY3JpcHRvcj4geworICAgIHByaXZhdGUgRXh0ZW5zaW9uRGVzY3JpcHRvcigKKyAgICAgICAgZmluYWwgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZW51bVR5cGVNYXAsCisgICAgICAgIGZpbmFsIGludCBudW1iZXIsCisgICAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNSZXBlYXRlZCwKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1BhY2tlZCkgeworICAgICAgdGhpcy5lbnVtVHlwZU1hcCA9IGVudW1UeXBlTWFwOworICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7CisgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgdGhpcy5pc1JlcGVhdGVkID0gaXNSZXBlYXRlZDsKKyAgICAgIHRoaXMuaXNQYWNrZWQgPSBpc1BhY2tlZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEludGVybmFsLkVudW1MaXRlTWFwPD8+IGVudW1UeXBlTWFwOworICAgIHByaXZhdGUgZmluYWwgaW50IG51bWJlcjsKKyAgICBwcml2YXRlIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzUmVwZWF0ZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzUGFja2VkOworCisgICAgcHVibGljIGludCBnZXROdW1iZXIoKSB7CisgICAgICByZXR1cm4gbnVtYmVyOworICAgIH0KKworICAgIHB1YmxpYyBXaXJlRm9ybWF0LkZpZWxkVHlwZSBnZXRMaXRlVHlwZSgpIHsKKyAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBXaXJlRm9ybWF0LkphdmFUeXBlIGdldExpdGVKYXZhVHlwZSgpIHsKKyAgICAgIHJldHVybiB0eXBlLmdldEphdmFUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXBlYXRlZCgpIHsKKyAgICAgIHJldHVybiBpc1JlcGVhdGVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2VkKCkgeworICAgICAgcmV0dXJuIGlzUGFja2VkOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlcm5hbC5FbnVtTGl0ZU1hcDw/PiBnZXRFbnVtVHlwZSgpIHsKKyAgICAgIHJldHVybiBlbnVtVHlwZU1hcDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTWVzc2FnZUxpdGUuQnVpbGRlciBpbnRlcm5hbE1lcmdlRnJvbSgKKyAgICAgICAgTWVzc2FnZUxpdGUuQnVpbGRlciB0bywgTWVzc2FnZUxpdGUgZnJvbSkgeworICAgICAgcmV0dXJuICgoQnVpbGRlcikgdG8pLm1lcmdlRnJvbSgoR2VuZXJhdGVkTWVzc2FnZUxpdGUpIGZyb20pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEV4dGVuc2lvbkRlc2NyaXB0b3Igb3RoZXIpIHsKKyAgICAgIHJldHVybiBudW1iZXIgLSBvdGhlci5udW1iZXI7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIExpdGUgZXF1aXZhbGVudCB0byB7QGxpbmsgR2VuZXJhdGVkTWVzc2FnZS5HZW5lcmF0ZWRFeHRlbnNpb259LgorICAgKgorICAgKiBVc2VycyBzaG91bGQgaWdub3JlIHRoZSBjb250ZW50cyBvZiB0aGlzIGNsYXNzIGFuZCBvbmx5IHVzZSBvYmplY3RzIG9mCisgICAqIHRoaXMgdHlwZSBhcyBwYXJhbWV0ZXJzIHRvIGV4dGVuc2lvbiBhY2Nlc3NvcnMgYW5kIEV4dGVuc2lvblJlZ2lzdHJ5LmFkZCgpLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZW5lcmF0ZWRFeHRlbnNpb248CisgICAgICBDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2VMaXRlLCBUeXBlPiB7CisKKyAgICBwcml2YXRlIEdlbmVyYXRlZEV4dGVuc2lvbigKKyAgICAgICAgZmluYWwgQ29udGFpbmluZ1R5cGUgY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UsCisgICAgICAgIGZpbmFsIFR5cGUgZGVmYXVsdFZhbHVlLAorICAgICAgICBmaW5hbCBNZXNzYWdlTGl0ZSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlLAorICAgICAgICBmaW5hbCBFeHRlbnNpb25EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgIC8vIERlZmVuc2l2ZSBjaGVja3MgdG8gdmVyaWZ5IHRoZSBjb3JyZWN0IGluaXRpYWxpemF0aW9uIG9yZGVyIG9mCisgICAgICAvLyBHZW5lcmF0ZWRFeHRlbnNpb25zIGFuZCB0aGVpciByZWxhdGVkIEdlbmVyYXRlZE1lc3NhZ2VzLgorICAgICAgaWYgKGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJOdWxsIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlIik7CisgICAgICB9CisgICAgICBpZiAoZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpID09IFdpcmVGb3JtYXQuRmllbGRUeXBlLk1FU1NBR0UgJiYKKyAgICAgICAgICBtZXNzYWdlRGVmYXVsdEluc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJOdWxsIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UiKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UgPSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZTsKKyAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOworICAgICAgdGhpcy5tZXNzYWdlRGVmYXVsdEluc3RhbmNlID0gbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKKyAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBDb250YWluaW5nVHlwZSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgZGVmYXVsdFZhbHVlOworICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIEV4dGVuc2lvbkRlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZXh0ZW5kZWQsIHVzZWQgdG8gaWRlbnRpZnkgdGhhdCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluaW5nVHlwZSBnZXRDb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSgpIHsKKyAgICAgIHJldHVybiBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZTsKKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBmaWVsZCBudW1iZXIuICovCisgICAgcHVibGljIGludCBnZXROdW1iZXIoKSB7CisgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXROdW1iZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgZXh0ZW5zaW9uIGlzIGFuIGVtYmVkZGVkIG1lc3NhZ2UsIHRoaXMgaXMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YKKyAgICAgKiB0aGF0IHR5cGUuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VMaXRlIGdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKSB7CisgICAgICByZXR1cm4gbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQSBzZXJpYWxpemVkIChzZXJpYWxpemFibGUpIGZvcm0gb2YgdGhlIGdlbmVyYXRlZCBtZXNzYWdlLiAgU3RvcmVzIHRoZQorICAgKiBtZXNzYWdlIGFzIGEgY2xhc3MgbmFtZSBhbmQgYSBieXRlIGFycmF5LgorICAgKi8KKyAgc3RhdGljIGZpbmFsIGNsYXNzIFNlcmlhbGl6ZWRGb3JtIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VDbGFzc05hbWU7CisgICAgcHJpdmF0ZSBieXRlW10gYXNCeXRlczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIHNlcmlhbGl6ZWQgZm9ybSBieSBjYWxsaW5nIHtAbGluayBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VMaXRlI3RvQnl0ZUFycmF5fS4KKyAgICAgKiBAcGFyYW0gcmVndWxhckZvcm0gdGhlIG1lc3NhZ2UgdG8gc2VyaWFsaXplCisgICAgICovCisgICAgU2VyaWFsaXplZEZvcm0oTWVzc2FnZUxpdGUgcmVndWxhckZvcm0pIHsKKyAgICAgIG1lc3NhZ2VDbGFzc05hbWUgPSByZWd1bGFyRm9ybS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgIGFzQnl0ZXMgPSByZWd1bGFyRm9ybS50b0J5dGVBcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gcmVhZCBmcm9tIGFuIE9iamVjdElucHV0U3RyZWFtLCB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGlzIG9iamVjdAorICAgICAqIGJhY2sgdG8gdGhlIHJlZ3VsYXIgZm9ybS4gIFBhcnQgb2YgSmF2YSdzIHNlcmlhbGl6YXRpb24gbWFnaWMuCisgICAgICogQHJldHVybiBhIEdlbmVyYXRlZE1lc3NhZ2Ugb2YgdGhlIHR5cGUgdGhhdCB3YXMgc2VyaWFsaXplZAorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIENsYXNzIG1lc3NhZ2VDbGFzcyA9IENsYXNzLmZvck5hbWUobWVzc2FnZUNsYXNzTmFtZSk7CisgICAgICAgIE1ldGhvZCBuZXdCdWlsZGVyID0gbWVzc2FnZUNsYXNzLmdldE1ldGhvZCgibmV3QnVpbGRlciIpOworICAgICAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgICAgICAgKE1lc3NhZ2VMaXRlLkJ1aWxkZXIpIG5ld0J1aWxkZXIuaW52b2tlKG51bGwpOworICAgICAgICBidWlsZGVyLm1lcmdlRnJvbShhc0J5dGVzKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIHByb3RvIGJ1ZmZlciBjbGFzcyIsIGUpOworICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIG5ld0J1aWxkZXIgbWV0aG9kIiwgZSk7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBjYWxsIG5ld0J1aWxkZXIgbWV0aG9kIiwgZSk7CisgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIGNhbGxpbmcgbmV3QnVpbGRlciIsIGUuZ2V0Q2F1c2UoKSk7CisgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHVuZGVyc3RhbmQgcHJvdG8gYnVmZmVyIiwgZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJlcGxhY2VzIHRoaXMgb2JqZWN0IGluIHRoZSBvdXRwdXQgc3RyZWFtIHdpdGggYSBzZXJpYWxpemVkIGZvcm0uCisgICAqIFBhcnQgb2YgSmF2YSdzIHNlcmlhbGl6YXRpb24gbWFnaWMuICBHZW5lcmF0ZWQgc3ViLWNsYXNzZXMgbXVzdCBvdmVycmlkZQorICAgKiB0aGlzIG1ldGhvZCBieSBjYWxsaW5nIDxjb2RlPnJldHVybiBzdXBlci53cml0ZVJlcGxhY2UoKTs8L2NvZGU+CisgICAqIEByZXR1cm4gYSBTZXJpYWxpemVkRm9ybSBvZiB0aGlzIG1lc3NhZ2UKKyAgICovCisgIHByb3RlY3RlZCBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVkRm9ybSh0aGlzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ludGVybmFsLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW50ZXJuYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWVhYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ludGVybmFsLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBUaGUgY2xhc3NlcyBjb250YWluZWQgd2l0aGluIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIFByb3RvY29sIEJ1ZmZlcgorICogbGlicmFyeSBhbmQgZ2VuZXJhdGVkIG1lc3NhZ2UgaW1wbGVtZW50YXRpb25zLiBUaGV5IGFyZSBwdWJsaWMgb25seSBiZWNhdXNlCisgKiB0aG9zZSBnZW5lcmF0ZWQgbWVzc2FnZXMgZG8gbm90IHJlc2lkZSBpbiB0aGUge0Bjb2RlIHByb3RvYnVmfSBwYWNrYWdlLgorICogT3RoZXJzIHNob3VsZCBub3QgdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkuCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorICovCitwdWJsaWMgY2xhc3MgSW50ZXJuYWwgeworICAvKioKKyAgICogSGVscGVyIGNhbGxlZCBieSBnZW5lcmF0ZWQgY29kZSB0byBjb25zdHJ1Y3QgZGVmYXVsdCB2YWx1ZXMgZm9yIHN0cmluZworICAgKiBmaWVsZHMuCisgICAqIDxwPgorICAgKiBUaGUgcHJvdG9jb2wgY29tcGlsZXIgZG9lcyBub3QgYWN0dWFsbHkgY29udGFpbiBhIFVURi04IGRlY29kZXIgLS0gaXQKKyAgICoganVzdCBwdXNoZXMgVVRGLTgtZW5jb2RlZCB0ZXh0IGFyb3VuZCB3aXRob3V0IHRvdWNoaW5nIGl0LiAgVGhlIG9uZSBwbGFjZQorICAgKiB3aGVyZSB0aGlzIHByZXNlbnRzIGEgcHJvYmxlbSBpcyB3aGVuIGdlbmVyYXRpbmcgSmF2YSBzdHJpbmcgbGl0ZXJhbHMuCisgICAqIFVuaWNvZGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGxpdGVyYWwgd291bGQgbm9ybWFsbHkgbmVlZCB0byBiZSBlbmNvZGVkCisgICAqIHVzaW5nIGEgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UsIHdoaWNoIHdvdWxkIHJlcXVpcmUgZGVjb2RpbmcgdGhlbS4KKyAgICogVG8gZ2V0IGFyb3VuZCB0aGlzLCBwcm90b2MgaW5zdGVhZCBlbWJlZHMgdGhlIFVURi04IGJ5dGVzIGludG8gdGhlCisgICAqIGdlbmVyYXRlZCBjb2RlIGFuZCBsZWF2ZXMgaXQgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSB0byBkZWNvZGUgdGhlbS4KKyAgICogPHA+CisgICAqIEl0IGdldHMgd29yc2UsIHRob3VnaC4gIElmIHByb3RvYyBqdXN0IGdlbmVyYXRlZCBhIGJ5dGUgYXJyYXksIGxpa2U6CisgICAqICAgbmV3IGJ5dGVbXSB7MHgxMiwgMHgzNCwgMHg1NiwgMHg3OH0KKyAgICogSmF2YSBhY3R1YWxseSBnZW5lcmF0ZXMgKmNvZGUqIHdoaWNoIGFsbG9jYXRlcyBhbiBhcnJheSBhbmQgdGhlbiBmaWxscworICAgKiBpbiBlYWNoIHZhbHVlLiAgVGhpcyBpcyBtdWNoIGxlc3MgZWZmaWNpZW50IHRoYW4ganVzdCBlbWJlZGRpbmcgdGhlIGJ5dGVzCisgICAqIGRpcmVjdGx5IGludG8gdGhlIGJ5dGVjb2RlLiAgVG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSBuZWVkIGFub3RoZXIKKyAgICogd29yay1hcm91bmQuICBTdHJpbmcgbGl0ZXJhbHMgYXJlIGVtYmVkZGVkIGRpcmVjdGx5LCBzbyBwcm90b2MgYWN0dWFsbHkKKyAgICogZ2VuZXJhdGVzIGEgc3RyaW5nIGxpdGVyYWwgY29ycmVzcG9uZGluZyB0byB0aGUgYnl0ZXMuICBUaGUgZWFzaWVzdCB3YXkKKyAgICogdG8gZG8gdGhpcyBpcyB0byB1c2UgdGhlIElTTy04ODU5LTEgY2hhcmFjdGVyIHNldCwgd2hpY2ggY29ycmVzcG9uZHMgdG8KKyAgICogdGhlIGZpcnN0IDI1NiBjaGFyYWN0ZXJzIG9mIHRoZSBVbmljb2RlIHJhbmdlLiAgUHJvdG9jIGNhbiB0aGVuIHVzZQorICAgKiBnb29kIG9sZCBDRXNjYXBlIHRvIGdlbmVyYXRlIHRoZSBzdHJpbmcuCisgICAqIDxwPgorICAgKiBTbyB3ZSBoYXZlIGEgc3RyaW5nIGxpdGVyYWwgd2hpY2ggcmVwcmVzZW50cyBhIHNldCBvZiBieXRlcyB3aGljaAorICAgKiByZXByZXNlbnRzIGFub3RoZXIgc3RyaW5nLiAgVGhpcyBmdW5jdGlvbiAtLSBzdHJpbmdEZWZhdWx0VmFsdWUgLS0KKyAgICogY29udmVydHMgZnJvbSB0aGUgZ2VuZXJhdGVkIHN0cmluZyB0byB0aGUgc3RyaW5nIHdlIGFjdHVhbGx5IHdhbnQuICBUaGUKKyAgICogZ2VuZXJhdGVkIGNvZGUgY2FsbHMgdGhpcyBhdXRvbWF0aWNhbGx5LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaW5nRGVmYXVsdFZhbHVlKFN0cmluZyBieXRlcykgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcy5nZXRCeXRlcygiSVNPLTg4NTktMSIpLCAiVVRGLTgiKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBzaW5jZSBhbGwgSlZNcyBhcmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50CisgICAgICAvLyBib3RoIG9mIHRoZSBhYm92ZSBjaGFyYWN0ZXIgc2V0cy4KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgIkphdmEgVk0gZG9lcyBub3Qgc3VwcG9ydCBhIHN0YW5kYXJkIGNoYXJhY3RlciBzZXQuIiwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEhlbHBlciBjYWxsZWQgYnkgZ2VuZXJhdGVkIGNvZGUgdG8gY29uc3RydWN0IGRlZmF1bHQgdmFsdWVzIGZvciBieXRlcworICAgKiBmaWVsZHMuCisgICAqIDxwPgorICAgKiBUaGlzIGlzIGEgbG90IGxpa2Uge0BsaW5rICNzdHJpbmdEZWZhdWx0VmFsdWV9LCBidXQgZm9yIGJ5dGVzIGZpZWxkcy4KKyAgICogSW4gdGhpcyBjYXNlIHdlIG9ubHkgbmVlZCB0aGUgc2Vjb25kIG9mIHRoZSB0d28gaGFja3MgLS0gYWxsb3dpbmcgdXMgdG8KKyAgICogZW1iZWQgcmF3IGJ5dGVzIGFzIGEgc3RyaW5nIGxpdGVyYWwgd2l0aCBJU08tODg1OS0xIGVuY29kaW5nLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGJ5dGVzRGVmYXVsdFZhbHVlKFN0cmluZyBieXRlcykgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbShieXRlcy5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBzaW5jZSBhbGwgSlZNcyBhcmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50CisgICAgICAvLyBJU08tODg1OS0xLgorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAiSmF2YSBWTSBkb2VzIG5vdCBzdXBwb3J0IGEgc3RhbmRhcmQgY2hhcmFjdGVyIHNldC4iLCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSGVscGVyIGNhbGxlZCBieSBnZW5lcmF0ZWQgY29kZSB0byBkZXRlcm1pbmUgaWYgYSBieXRlIGFycmF5IGlzIGEgdmFsaWQKKyAgICogVVRGLTggZW5jb2RlZCBzdHJpbmcgc3VjaCB0aGF0IHRoZSBvcmlnaW5hbCBieXRlcyBjYW4gYmUgY29udmVydGVkIHRvCisgICAqIGEgU3RyaW5nIG9iamVjdCBhbmQgdGhlbiBiYWNrIHRvIGEgYnl0ZSBhcnJheSByb3VuZCB0cmlwcGluZyB0aGUgYnl0ZXMKKyAgICogd2l0aG91dCBsb3NzLgorICAgKiA8cD4KKyAgICogVGhpcyBpcyBpbnNwaXJlZCBieSBVVEZfOC5qYXZhIGluIHN1bi5uaW8uY3MuCisgICAqCisgICAqIEBwYXJhbSBieXRlU3RyaW5nIHRoZSBzdHJpbmcgdG8gY2hlY2sKKyAgICogQHJldHVybiB3aGV0aGVyIHRoZSBieXRlIGFycmF5IGlzIHJvdW5kIHRyaXBwYWJsZQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRVdGY4KEJ5dGVTdHJpbmcgYnl0ZVN0cmluZykgeworICAgIGludCBpbmRleCA9IDA7CisgICAgaW50IHNpemUgPSBieXRlU3RyaW5nLnNpemUoKTsKKyAgICAvLyBUbyBhdm9pZCB0aGUgbWFza2luZywgd2UgY291bGQgY2hhbmdlIHRoaXMgdG8gdXNlIGJ5dGVzOworICAgIC8vIFRoZW4gWCA+IDB4QzIgZ2V0cyB0dXJuZWQgaW50byBYIDwgLTB4QzI7IFggPCAweDgwCisgICAgLy8gZ2V0cyB0dXJuZWQgaW50byBYID49IDAsIGV0Yy4KKworICAgIHdoaWxlIChpbmRleCA8IHNpemUpIHsKKyAgICAgIGludCBieXRlMSA9IGJ5dGVTdHJpbmcuYnl0ZUF0KGluZGV4KyspICYgMHhGRjsKKyAgICAgIGlmIChieXRlMSA8IDB4ODApIHsKKyAgICAgICAgLy8gZmFzdCBsb29wIGZvciBzaW5nbGUgYnl0ZXMKKyAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gd2Uga25vdyBmcm9tIHRoaXMgcG9pbnQgb24gdGhhdCB3ZSBoYXZlIDItNCBieXRlIGZvcm1zCisgICAgICB9IGVsc2UgaWYgKGJ5dGUxIDwgMHhDMiB8fCBieXRlMSA+IDB4RjQpIHsKKyAgICAgICAgLy8gY2F0Y2ggaWxsZWdhbCBmaXJzdCBieXRlczogPCBDMiBvciA+IEY0CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmRleCA+PSBzaXplKSB7CisgICAgICAgIC8vIGZhaWwgaWYgd2UgcnVuIG91dCBvZiBieXRlcworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpbnQgYnl0ZTIgPSBieXRlU3RyaW5nLmJ5dGVBdChpbmRleCsrKSAmIDB4RkY7CisgICAgICBpZiAoYnl0ZTIgPCAweDgwIHx8IGJ5dGUyID4gMHhCRikgeworICAgICAgICAvLyBnZW5lcmFsIHRyYWlsLWJ5dGUgdGVzdAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoYnl0ZTEgPD0gMHhERikgeworICAgICAgICAvLyB0d28tYnl0ZSBmb3JtOyBnZW5lcmFsIHRyYWlsLWJ5dGUgdGVzdCBpcyBzdWZmaWNpZW50CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyB3ZSBrbm93IGZyb20gdGhpcyBwb2ludCBvbiB0aGF0IHdlIGhhdmUgMyBvciA0IGJ5dGUgZm9ybXMKKyAgICAgIGlmIChpbmRleCA+PSBzaXplKSB7CisgICAgICAgIC8vIGZhaWwgaWYgd2UgcnVuIG91dCBvZiBieXRlcworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpbnQgYnl0ZTMgPSBieXRlU3RyaW5nLmJ5dGVBdChpbmRleCsrKSAmIDB4RkY7CisgICAgICBpZiAoYnl0ZTMgPCAweDgwIHx8IGJ5dGUzID4gMHhCRikgeworICAgICAgICAvLyBnZW5lcmFsIHRyYWlsLWJ5dGUgdGVzdAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoYnl0ZTEgPD0gMHhFRikgeworICAgICAgICAvLyB0aHJlZS1ieXRlIGZvcm0uIFZhc3RseSBtb3JlIGZyZXF1ZW50IHRoYW4gZm91ci1ieXRlIGZvcm1zCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFzIGFuIGV4dHJhIHRlc3QsIGJ1dCBub3Qgd29ydGggcmVzdHJ1Y3R1cmluZworICAgICAgICBpZiAoYnl0ZTEgPT0gMHhFMCAmJiBieXRlMiA8IDB4QTAgfHwKKyAgICAgICAgICAgIGJ5dGUxID09IDB4RUQgJiYgYnl0ZTIgPiAweDlGKSB7CisgICAgICAgICAgLy8gY2hlY2sgc3BlY2lhbCBjYXNlcyBvZiBieXRlMgorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBmb3VyLWJ5dGUgZm9ybQorCisgICAgICAgIGlmIChpbmRleCA+PSBzaXplKSB7CisgICAgICAgICAgLy8gZmFpbCBpZiB3ZSBydW4gb3V0IG9mIGJ5dGVzCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludCBieXRlNCA9IGJ5dGVTdHJpbmcuYnl0ZUF0KGluZGV4KyspICYgMHhGRjsKKyAgICAgICAgaWYgKGJ5dGU0IDwgMHg4MCB8fCBieXRlNCA+IDB4QkYpIHsKKyAgICAgICAgICAvLyBnZW5lcmFsIHRyYWlsLWJ5dGUgdGVzdAorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGhhcyBhbiBleHRyYSB0ZXN0LCBidXQgbm90IHdvcnRoIHJlc3RydWN0dXJpbmcKKyAgICAgICAgaWYgKGJ5dGUxID09IDB4RjAgJiYgYnl0ZTIgPCAweDkwIHx8CisgICAgICAgICAgICBieXRlMSA9PSAweEY0ICYmIGJ5dGUyID4gMHg4RikgeworICAgICAgICAgIC8vIGNoZWNrIHNwZWNpYWwgY2FzZXMgb2YgYnl0ZTIKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogSW50ZXJmYWNlIGZvciBhbiBlbnVtIHZhbHVlIG9yIHZhbHVlIGRlc2NyaXB0b3IsIHRvIGJlIHVzZWQgaW4gRmllbGRTZXQuCisgICAqIFRoZSBsaXRlIGxpYnJhcnkgc3RvcmVzIGVudW0gdmFsdWVzIGRpcmVjdGx5IGluIEZpZWxkU2V0cyBidXQgdGhlIGZ1bGwKKyAgICogbGlicmFyeSBzdG9yZXMgRW51bVZhbHVlRGVzY3JpcHRvcnMgaW4gb3JkZXIgdG8gYmV0dGVyIHN1cHBvcnQgcmVmbGVjdGlvbi4KKyAgICovCisgIHB1YmxpYyBpbnRlcmZhY2UgRW51bUxpdGUgeworICAgIGludCBnZXROdW1iZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBJbnRlcmZhY2UgZm9yIGFuIG9iamVjdCB3aGljaCBtYXBzIGludGVnZXJzIHRvIHtAbGluayBFbnVtTGl0ZX1zLgorICAgKiB7QGxpbmsgRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3J9IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgYnkgbWFwcGluZworICAgKiBudW1iZXJzIHRvIHtAbGluayBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yfXMuICBBZGRpdGlvbmFsbHksCisgICAqIGV2ZXJ5IGdlbmVyYXRlZCBlbnVtIHR5cGUgaGFzIGEgc3RhdGljIG1ldGhvZCBpbnRlcm5hbEdldFZhbHVlTWFwKCkgd2hpY2gKKyAgICogcmV0dXJucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHR5cGUgdGhhdCBtYXBzIG51bWJlcnMgdG8gZW51bSB2YWx1ZXMuCisgICAqLworICBwdWJsaWMgaW50ZXJmYWNlIEVudW1MaXRlTWFwPFQgZXh0ZW5kcyBFbnVtTGl0ZT4geworICAgIFQgZmluZFZhbHVlQnlOdW1iZXIoaW50IG51bWJlcik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGY3ZmZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGhyb3duIHdoZW4gYSBwcm90b2NvbCBtZXNzYWdlIGJlaW5nIHBhcnNlZCBpcyBpbnZhbGlkIGluIHNvbWUgd2F5LAorICogZS5nLiBpdCBjb250YWlucyBhIG1hbGZvcm1lZCB2YXJpbnQgb3IgYSBuZWdhdGl2ZSBieXRlIGxlbmd0aC4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgY2xhc3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTYxNjE1MTc2MzA3MjQ1MDQ3Nkw7CisKKyAgcHVibGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICBzdXBlcihkZXNjcmlwdGlvbik7CisgIH0KKworICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHRydW5jYXRlZE1lc3NhZ2UoKSB7CisgICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCisgICAgICAiV2hpbGUgcGFyc2luZyBhIHByb3RvY29sIG1lc3NhZ2UsIHRoZSBpbnB1dCBlbmRlZCB1bmV4cGVjdGVkbHkgIiArCisgICAgICAiaW4gdGhlIG1pZGRsZSBvZiBhIGZpZWxkLiAgVGhpcyBjb3VsZCBtZWFuIGVpdGhlciB0aGFuIHRoZSAiICsKKyAgICAgICJpbnB1dCBoYXMgYmVlbiB0cnVuY2F0ZWQgb3IgdGhhdCBhbiBlbWJlZGRlZCBtZXNzYWdlICIgKworICAgICAgIm1pc3JlcG9ydGVkIGl0cyBvd24gbGVuZ3RoLiIpOworICB9CisKKyAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBuZWdhdGl2ZVNpemUoKSB7CisgICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCisgICAgICAiQ29kZWRJbnB1dFN0cmVhbSBlbmNvdW50ZXJlZCBhbiBlbWJlZGRlZCBzdHJpbmcgb3IgbWVzc2FnZSAiICsKKyAgICAgICJ3aGljaCBjbGFpbWVkIHRvIGhhdmUgbmVnYXRpdmUgc2l6ZS4iKTsKKyAgfQorCisgIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gbWFsZm9ybWVkVmFyaW50KCkgeworICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAorICAgICAgIkNvZGVkSW5wdXRTdHJlYW0gZW5jb3VudGVyZWQgYSBtYWxmb3JtZWQgdmFyaW50LiIpOworICB9CisKKyAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBpbnZhbGlkVGFnKCkgeworICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAorICAgICAgIlByb3RvY29sIG1lc3NhZ2UgY29udGFpbmVkIGFuIGludmFsaWQgdGFnICh6ZXJvKS4iKTsKKyAgfQorCisgIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gaW52YWxpZEVuZFRhZygpIHsKKyAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKKyAgICAgICJQcm90b2NvbCBtZXNzYWdlIGVuZC1ncm91cCB0YWcgZGlkIG5vdCBtYXRjaCBleHBlY3RlZCB0YWcuIik7CisgIH0KKworICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGludmFsaWRXaXJlVHlwZSgpIHsKKyAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKKyAgICAgICJQcm90b2NvbCBtZXNzYWdlIHRhZyBoYWQgaW52YWxpZCB3aXJlIHR5cGUuIik7CisgIH0KKworICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQoKSB7CisgICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCisgICAgICAiUHJvdG9jb2wgbWVzc2FnZSBoYWQgdG9vIG1hbnkgbGV2ZWxzIG9mIG5lc3RpbmcuICBNYXkgYmUgbWFsaWNpb3VzLiAgIiArCisgICAgICAiVXNlIENvZGVkSW5wdXRTdHJlYW0uc2V0UmVjdXJzaW9uTGltaXQoKSB0byBpbmNyZWFzZSB0aGUgZGVwdGggbGltaXQuIik7CisgIH0KKworICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHNpemVMaW1pdEV4Y2VlZGVkKCkgeworICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAorICAgICAgIlByb3RvY29sIG1lc3NhZ2Ugd2FzIHRvbyBsYXJnZS4gIE1heSBiZSBtYWxpY2lvdXMuICAiICsKKyAgICAgICJVc2UgQ29kZWRJbnB1dFN0cmVhbS5zZXRTaXplTGltaXQoKSB0byBpbmNyZWFzZSB0aGUgc2l6ZSBsaW1pdC4iKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nQXJyYXlMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4M2E2NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nQXJyYXlMaXN0LmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tQWNjZXNzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBMYXp5U3RyaW5nTGlzdH0gdGhhdCB3cmFwcyBhbiBBcnJheUxpc3QuIEVhY2gKKyAqIGVsZW1lbnQgaXMgZWl0aGVyIGEgQnl0ZVN0cmluZyBvciBhIFN0cmluZy4gSXQgY2FjaGVzIHRoZSBsYXN0IG9uZSByZXF1ZXN0ZWQKKyAqIHdoaWNoIGlzIG1vc3QgbGlrZWx5IHRoZSBvbmUgbmVlZGVkIG5leHQuIFRoaXMgbWluaW1pemVzIG1lbW9yeSB1c2FnZSB3aGlsZQorICogc2F0aXNmeWluZyB0aGUgbW9zdCBjb21tb24gdXNlIGNhc2VzLgorICogPHA+CisgKiA8c3Ryb25nPk5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuPC9zdHJvbmc+CisgKiBJZiBtdWx0aXBsZSB0aHJlYWRzIGFjY2VzcyBhbiA8dHQ+QXJyYXlMaXN0PC90dD4gaW5zdGFuY2UgY29uY3VycmVudGx5LAorICogYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGUgdGhyZWFkcyBtb2RpZmllcyB0aGUgbGlzdCBzdHJ1Y3R1cmFsbHksIGl0CisgKiA8aT5tdXN0PC9pPiBiZSBzeW5jaHJvbml6ZWQgZXh0ZXJuYWxseS4gIChBIHN0cnVjdHVyYWwgbW9kaWZpY2F0aW9uIGlzCisgKiBhbnkgb3BlcmF0aW9uIHRoYXQgYWRkcyBvciBkZWxldGVzIG9uZSBvciBtb3JlIGVsZW1lbnRzLCBvciBleHBsaWNpdGx5CisgKiByZXNpemVzIHRoZSBiYWNraW5nIGFycmF5OyBtZXJlbHkgc2V0dGluZyB0aGUgdmFsdWUgb2YgYW4gZWxlbWVudCBpcyBub3QKKyAqIGEgc3RydWN0dXJhbCBtb2RpZmljYXRpb24uKSAgVGhpcyBpcyB0eXBpY2FsbHkgYWNjb21wbGlzaGVkIGJ5CisgKiBzeW5jaHJvbml6aW5nIG9uIHNvbWUgb2JqZWN0IHRoYXQgbmF0dXJhbGx5IGVuY2Fwc3VsYXRlcyB0aGUgbGlzdC4KKyAqIDxwPgorICogSWYgdGhlIGltcGxlbWVudGF0aW9uIGlzIGFjY2Vzc2VkIHZpYSBjb25jdXJyZW50IHJlYWRzLCB0aGlzIGlzIHRocmVhZCBzYWZlLgorICogQ29udmVyc2lvbnMgYXJlIGRvbmUgaW4gYSB0aHJlYWQgc2FmZSBtYW5uZXIuIEl0J3MgcG9zc2libGUgdGhhdCB0aGUKKyAqIGNvbnZlcnNpb24gbWF5IGhhcHBlbiBtb3JlIHRoYW4gb25jZSBpZiB0d28gdGhyZWFkcyBhdHRlbXB0IHRvIGFjY2VzcyB0aGUKKyAqIHNhbWUgZWxlbWVudCBhbmQgdGhlIG1vZGlmaWNhdGlvbnMgd2VyZSBub3QgdmlzaWJsZSB0byBlYWNoIG90aGVyLCBidXQgdGhpcworICogd2lsbCBub3QgcmVzdWx0IGluIGFueSBjb3JydXB0aW9uIG9mIHRoZSBsaXN0IG9yIGNoYW5nZSBpbiBiZWhhdmlvciBvdGhlcgorICogdGhhbiBwZXJmb3JtYW5jZS4KKyAqCisgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKyAqLworcHVibGljIGNsYXNzIExhenlTdHJpbmdBcnJheUxpc3QgZXh0ZW5kcyBBYnN0cmFjdExpc3Q8U3RyaW5nPgorICAgIGltcGxlbWVudHMgTGF6eVN0cmluZ0xpc3QsIFJhbmRvbUFjY2VzcyB7CisKKyAgcHVibGljIGZpbmFsIHN0YXRpYyBMYXp5U3RyaW5nTGlzdCBFTVBUWSA9IG5ldyBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdCgKKyAgICAgIG5ldyBMYXp5U3RyaW5nQXJyYXlMaXN0KCkpOworCisgIHByaXZhdGUgZmluYWwgTGlzdDxPYmplY3Q+IGxpc3Q7CisKKyAgcHVibGljIExhenlTdHJpbmdBcnJheUxpc3QoKSB7CisgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICB9CisKKyAgcHVibGljIExhenlTdHJpbmdBcnJheUxpc3QoTGlzdDxTdHJpbmc+IGZyb20pIHsKKyAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGZyb20pOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0KGludCBpbmRleCkgeworICAgIE9iamVjdCBvID0gbGlzdC5nZXQoaW5kZXgpOworICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICByZXR1cm4gKFN0cmluZykgbzsKKyAgICB9IGVsc2UgeworICAgICAgQnl0ZVN0cmluZyBicyA9IChCeXRlU3RyaW5nKSBvOworICAgICAgU3RyaW5nIHMgPSBicy50b1N0cmluZ1V0ZjgoKTsKKyAgICAgIGlmIChJbnRlcm5hbC5pc1ZhbGlkVXRmOChicykpIHsKKyAgICAgICAgbGlzdC5zZXQoaW5kZXgsIHMpOworICAgICAgfQorICAgICAgcmV0dXJuIHM7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICByZXR1cm4gbGlzdC5zaXplKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBzZXQoaW50IGluZGV4LCBTdHJpbmcgcykgeworICAgIE9iamVjdCBvID0gbGlzdC5zZXQoaW5kZXgsIHMpOworICAgIHJldHVybiBhc1N0cmluZyhvKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgeworICAgIGxpc3QuYWRkKGluZGV4LCBlbGVtZW50KTsKKyAgICBtb2RDb3VudCsrOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4gYykgeworICAgIGJvb2xlYW4gcmV0ID0gbGlzdC5hZGRBbGwoaW5kZXgsIGMpOworICAgIG1vZENvdW50Kys7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHJlbW92ZShpbnQgaW5kZXgpIHsKKyAgICBPYmplY3QgbyA9IGxpc3QucmVtb3ZlKGluZGV4KTsKKyAgICBtb2RDb3VudCsrOworICAgIHJldHVybiBhc1N0cmluZyhvKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIGxpc3QuY2xlYXIoKTsKKyAgICBtb2RDb3VudCsrOworICB9CisKKyAgLy8gQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGFkZChCeXRlU3RyaW5nIGVsZW1lbnQpIHsKKyAgICBsaXN0LmFkZChlbGVtZW50KTsKKyAgICBtb2RDb3VudCsrOworICB9CisKKyAgLy8gQE92ZXJyaWRlCisgIHB1YmxpYyBCeXRlU3RyaW5nIGdldEJ5dGVTdHJpbmcoaW50IGluZGV4KSB7CisgICAgT2JqZWN0IG8gPSBsaXN0LmdldChpbmRleCk7CisgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgIEJ5dGVTdHJpbmcgYiA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KChTdHJpbmcpIG8pOworICAgICAgbGlzdC5zZXQoaW5kZXgsIGIpOworICAgICAgcmV0dXJuIGI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAoQnl0ZVN0cmluZykgbzsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFN0cmluZyBhc1N0cmluZyhPYmplY3QgbykgeworICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICByZXR1cm4gKFN0cmluZykgbzsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICgoQnl0ZVN0cmluZykgbykudG9TdHJpbmdVdGY4KCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0xpc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MTM5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0xpc3QuamF2YQpAQCAtMCwwICsxLDcyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgZXh0ZW5kaW5nIExpc3QmbHQ7U3RyaW5nJmd0OyB0aGF0IGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQorICogaXRlbXMgb2YgdGhlIGxpc3QgYXMgVVRGOC1lbmNvZGVkIEJ5dGVTdHJpbmcgb2JqZWN0cy4gVGhpcyBpcyB1c2VkIGJ5IHRoZQorICogcHJvdG9jb2wgYnVmZmVyIGltcGxlbWVudGF0aW9uIHRvIHN1cHBvcnQgbGF6aWx5IGNvbnZlcnRpbmcgYnl0ZXMgcGFyc2VkCisgKiBvdmVyIHRoZSB3aXJlIHRvIFN0cmluZyBvYmplY3RzIHVudGlsIG5lZWRlZCBhbmQgYWxzbyBpbmNyZWFzZXMgdGhlCisgKiBlZmZpY2llbmN5IG9mIHNlcmlhbGl6YXRpb24gaWYgdGhlIFN0cmluZyB3YXMgbmV2ZXIgcmVxdWVzdGVkIGFzIHRoZQorICogQnl0ZVN0cmluZyBpcyBhbHJlYWR5IGNhY2hlZC4KKyAqIDxwPgorICogVGhpcyBvbmx5IGFkZHMgYWRkaXRpb25hbCBtZXRob2RzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGUgdXNlIGluIHRoZQorICogcHJvdG9jb2wgYnVmZmVyIGNvZGUgaW4gb3JkZXIgdG8gYmUgYWJsZSBzdWNjZXNzZnVseSByb3VuZCB0cmlwIGJ5dGUgYXJyYXlzCisgKiB0aHJvdWdoIHBhcnNpbmcgYW5kIHNlcmlhbGl6YXRpb24gd2l0aG91dCBjb252ZXJzaW9uIHRvIHN0cmluZ3MuIEl0J3Mgbm90CisgKiBhdHRlbXB0aW5nIHRvIHN1cHBvcnQgdGhlIGZ1bmN0aW9uYWxpdHkgb2Ygc2F5IExpc3QmbHRCeXRlU3RyaW5nJmd0LCBoZW5jZQorICogd2h5IG9ubHkgdGhlc2UgdHdvIHZlcnkgc3BlY2lmaWMgbWV0aG9kcyBhcmUgYWRkZWQuCisgKgorICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTGF6eVN0cmluZ0xpc3QgZXh0ZW5kcyBMaXN0PFN0cmluZz4geworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0IGFzIGEgQnl0ZVN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybgorICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0CisgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisgICAqICAgICAgICAgKDx0dD5pbmRleCAmbHQ7IDAgfHwgaW5kZXggJmd0Oz0gc2l6ZSgpPC90dD4pCisgICAqLworICBCeXRlU3RyaW5nIGdldEJ5dGVTdHJpbmcoaW50IGluZGV4KTsKKworICAvKioKKyAgICogQXBwZW5kcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGxpc3QgKG9wdGlvbmFsCisgICAqIG9wZXJhdGlvbikuCisgICAqCisgICAqIEBwYXJhbSBlbGVtZW50IGVsZW1lbnQgdG8gYmUgYXBwZW5kZWQgdG8gdGhpcyBsaXN0CisgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIDx0dD5hZGQ8L3R0PiBvcGVyYXRpb24KKyAgICogICAgICAgICBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbGlzdAorICAgKi8KKyAgdm9pZCBhZGQoQnl0ZVN0cmluZyBlbGVtZW50KTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzQxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUT0RPKGtlbnRvbik6ICBVc2UgZ2VuZXJpY3M/ICBFLmcuIEJ1aWxkZXI8QnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPiwgdGhlbgorLy8gICBtZXJnZUZyb20qKCkgY291bGQgcmV0dXJuIEJ1aWxkZXJUeXBlIGZvciBiZXR0ZXIgdHlwZS1zYWZldHkuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBQcm90b2NvbCBNZXNzYWdlIG9iamVjdHMuCisgKiA8cD4KKyAqIFNlZSBhbHNvIHtAbGluayBNZXNzYWdlTGl0ZX0sIHdoaWNoIGRlZmluZXMgbW9zdCBvZiB0aGUgbWV0aG9kcyB0aGF0IHR5cGljYWwKKyAqIHVzZXJzIGNhcmUgYWJvdXQuICB7QGxpbmsgTWVzc2FnZX0gYWRkcyB0byBpdCBtZXRob2RzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUKKyAqIGluIHRoZSAibGl0ZSIgcnVudGltZS4gIFRoZSBiaWdnZXN0IGFkZGVkIGZlYXR1cmVzIGFyZSBpbnRyb3NwZWN0aW9uIGFuZAorICogcmVmbGVjdGlvbiAtLSBpLmUuLCBnZXR0aW5nIGRlc2NyaXB0b3JzIGZvciB0aGUgbWVzc2FnZSB0eXBlIGFuZCBhY2Nlc3NpbmcKKyAqIHRoZSBmaWVsZCB2YWx1ZXMgZHluYW1pY2FsbHkuCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGludGVyZmFjZSBNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZUxpdGUsIE1lc3NhZ2VPckJ1aWxkZXIgeworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIENvbXBhcmlzb24gYW5kIGhhc2hpbmcKKworICAvKioKKyAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIG1lc3NhZ2UgZm9yIGVxdWFsaXR5LiAgUmV0dXJucworICAgKiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgKGFzCisgICAqIGRlZmluZWQgYnkge0Bjb2RlIGdldERlc2NyaXB0b3JGb3JUeXBlKCl9KSBhbmQgaGFzIGlkZW50aWNhbCB2YWx1ZXMgZm9yCisgICAqIGFsbCBvZiBpdHMgZmllbGRzLiAgU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzOyBpbmhlcml0aW5nCisgICAqIHtAY29kZSBPYmplY3QuZXF1YWxzKCl9IGlzIGluY29ycmVjdC4KKyAgICoKKyAgICogQHBhcmFtIG90aGVyIG9iamVjdCB0byBiZSBjb21wYXJlZCBmb3IgZXF1YWxpdHkgd2l0aCB0aGlzIG1lc3NhZ2UKKyAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgbWVzc2FnZQorICAgKi8KKyAgQE92ZXJyaWRlCisgIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcik7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBtZXNzYWdlLiAgVGhlIGhhc2ggY29kZSBvZiBhIG1lc3NhZ2UKKyAgICogc2hvdWxkIG1peCB0aGUgbWVzc2FnZSdzIHR5cGUgKG9iamVjdCBpZGVudGl0eSBvZiB0aGUgZGVjc3JpcHRvcikgd2l0aCBpdHMKKyAgICogY29udGVudHMgKGtub3duIGFuZCB1bmtub3duIGZpZWxkIHZhbHVlcykuICBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXM7CisgICAqIGluaGVyaXRpbmcge0Bjb2RlIE9iamVjdC5oYXNoQ29kZSgpfSBpcyBpbmNvcnJlY3QuCisgICAqCisgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBtZXNzYWdlCisgICAqIEBzZWUgTWFwI2hhc2hDb2RlKCkKKyAgICovCisgIEBPdmVycmlkZQorICBpbnQgaGFzaENvZGUoKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBDb252ZW5pZW5jZSBtZXRob2RzLgorCisgIC8qKgorICAgKiBDb252ZXJ0cyB0aGUgbWVzc2FnZSB0byBhIHN0cmluZyBpbiBwcm90b2NvbCBidWZmZXIgdGV4dCBmb3JtYXQuIFRoaXMgaXMKKyAgICoganVzdCBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQge0BsaW5rIFRleHRGb3JtYXQjcHJpbnRUb1N0cmluZyhNZXNzYWdlKX0uCisgICAqLworICBAT3ZlcnJpZGUKKyAgU3RyaW5nIHRvU3RyaW5nKCk7CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gQnVpbGRlcnMKKworICAvLyAoRnJvbSBNZXNzYWdlTGl0ZSwgcmUtZGVjbGFyZWQgaGVyZSBvbmx5IGZvciByZXR1cm4gdHlwZSBjb3ZhcmlhbmNlLikKKyAgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZSgpOworICBCdWlsZGVyIHRvQnVpbGRlcigpOworCisgIC8qKgorICAgKiBBYnN0cmFjdCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgUHJvdG9jb2wgTWVzc2FnZSBidWlsZGVycy4KKyAgICovCisgIGludGVyZmFjZSBCdWlsZGVyIGV4dGVuZHMgTWVzc2FnZUxpdGUuQnVpbGRlciwgTWVzc2FnZU9yQnVpbGRlciB7CisgICAgLy8gKEZyb20gTWVzc2FnZUxpdGUuQnVpbGRlciwgcmUtZGVjbGFyZWQgaGVyZSBvbmx5IGZvciByZXR1cm4gdHlwZQorICAgIC8vIGNvdmFyaWFuY2UuKQorICAgIEJ1aWxkZXIgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIE1lcmdlIHtAY29kZSBvdGhlcn0gaW50byB0aGUgbWVzc2FnZSBiZWluZyBidWlsdC4gIHtAY29kZSBvdGhlcn0gbXVzdAorICAgICAqIGhhdmUgdGhlIGV4YWN0IHNhbWUgdHlwZSBhcyB7QGNvZGUgdGhpc30gKGkuZS4KKyAgICAgKiB7QGNvZGUgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSA9PSBvdGhlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpfSkuCisgICAgICoKKyAgICAgKiBNZXJnaW5nIG9jY3VycyBhcyBmb2xsb3dzLiAgRm9yIGVhY2ggZmllbGQ6PGJyPgorICAgICAqICogRm9yIHNpbmd1bGFyIHByaW1pdGl2ZSBmaWVsZHMsIGlmIHRoZSBmaWVsZCBpcyBzZXQgaW4ge0Bjb2RlIG90aGVyfSwKKyAgICAgKiAgIHRoZW4ge0Bjb2RlIG90aGVyfSdzIHZhbHVlIG92ZXJ3cml0ZXMgdGhlIHZhbHVlIGluIHRoaXMgbWVzc2FnZS48YnI+CisgICAgICogKiBGb3Igc2luZ3VsYXIgbWVzc2FnZSBmaWVsZHMsIGlmIHRoZSBmaWVsZCBpcyBzZXQgaW4ge0Bjb2RlIG90aGVyfSwKKyAgICAgKiAgIGl0IGlzIG1lcmdlZCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHN1Yi1tZXNzYWdlIG9mIHRoaXMgbWVzc2FnZQorICAgICAqICAgdXNpbmcgdGhlIHNhbWUgbWVyZ2luZyBydWxlcy48YnI+CisgICAgICogKiBGb3IgcmVwZWF0ZWQgZmllbGRzLCB0aGUgZWxlbWVudHMgaW4ge0Bjb2RlIG90aGVyfSBhcmUgY29uY2F0ZW5hdGVkCisgICAgICogICB3aXRoIHRoZSBlbGVtZW50cyBpbiB0aGlzIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHtAY29kZSBNZXNzYWdlOjpNZXJnZUZyb219IG1ldGhvZCBpbiBDKysuCisgICAgICovCisgICAgQnVpbGRlciBtZXJnZUZyb20oTWVzc2FnZSBvdGhlcik7CisKKyAgICAvLyAoRnJvbSBNZXNzYWdlTGl0ZS5CdWlsZGVyLCByZS1kZWNsYXJlZCBoZXJlIG9ubHkgZm9yIHJldHVybiB0eXBlCisgICAgLy8gY292YXJpYW5jZS4pCisgICAgTWVzc2FnZSBidWlsZCgpOworICAgIE1lc3NhZ2UgYnVpbGRQYXJ0aWFsKCk7CisgICAgQnVpbGRlciBjbG9uZSgpOworICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICBCdWlsZGVyIG1lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1lc3NhZ2UncyB0eXBlJ3MgZGVzY3JpcHRvci4KKyAgICAgKiBTZWUge0BsaW5rIE1lc3NhZ2UjZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0uCisgICAgICovCisgICAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgQnVpbGRlciBmb3IgbWVzc2FnZXMgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSBnaXZlbgorICAgICAqIGZpZWxkLiAgTWVzc2FnZXMgYnVpbHQgd2l0aCB0aGlzIGNhbiB0aGVuIGJlIHBhc3NlZCB0byBzZXRGaWVsZCgpLAorICAgICAqIHNldFJlcGVhdGVkRmllbGQoKSwgb3IgYWRkUmVwZWF0ZWRGaWVsZCgpLgorICAgICAqLworICAgIEJ1aWxkZXIgbmV3QnVpbGRlckZvckZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZmllbGQgdG8gdGhlIGdpdmVuIHZhbHVlLiAgVGhlIHZhbHVlIG11c3QgYmUgb2YgdGhlIGNvcnJlY3QgdHlwZQorICAgICAqIGZvciB0aGlzIGZpZWxkLCBpLmUuIHRoZSBzYW1lIHR5cGUgdGhhdAorICAgICAqIHtAbGluayBNZXNzYWdlI2dldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9IHdvdWxkIHJldHVybi4KKyAgICAgKi8KKyAgICBCdWlsZGVyIHNldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgZmllbGQuICBUaGlzIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byBjYWxsaW5nIHRoZSBnZW5lcmF0ZWQKKyAgICAgKiAiY2xlYXIiIGFjY2Vzc29yIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICBCdWlsZGVyIGNsZWFyRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFNldHMgYW4gZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkIHRvIHRoZSBnaXZlbiB2YWx1ZS4gIFRoZSB2YWx1ZSBtdXN0CisgICAgICogYmUgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhpcyBmaWVsZCwgaS5lLiB0aGUgc2FtZSB0eXBlIHRoYXQKKyAgICAgKiB7QGxpbmsgTWVzc2FnZSNnZXRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcixpbnQpfSB3b3VsZAorICAgICAqIHJldHVybi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGUgZmllbGQgaXMgbm90IGEgcmVwZWF0ZWQgZmllbGQsIG9yCisgICAgICogICAgICAgICAgIHtAY29kZSBmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9IGdldERlc2NyaXB0b3JGb3JUeXBlKCl9LgorICAgICAqLworICAgIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgT2JqZWN0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIExpa2Uge0Bjb2RlIHNldFJlcGVhdGVkRmllbGR9LCBidXQgYXBwZW5kcyB0aGUgdmFsdWUgYXMgYSBuZXcgZWxlbWVudC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGUgZmllbGQgaXMgbm90IGEgcmVwZWF0ZWQgZmllbGQsIG9yCisgICAgICogICAgICAgICAgIHtAY29kZSBmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9IGdldERlc2NyaXB0b3JGb3JUeXBlKCl9LgorICAgICAqLworICAgIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSk7CisKKyAgICAvKiogU2V0IHRoZSB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fSBmb3IgdGhpcyBtZXNzYWdlLiAqLworICAgIEJ1aWxkZXIgc2V0VW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyk7CisKKyAgICAvKioKKyAgICAgKiBNZXJnZSBzb21lIHVua25vd24gZmllbGRzIGludG8gdGhlIHtAbGluayBVbmtub3duRmllbGRTZXR9IGZvciB0aGlzCisgICAgICogbWVzc2FnZS4KKyAgICAgKi8KKyAgICBCdWlsZGVyIG1lcmdlVW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzLgorCisgICAgLy8gKEZyb20gTWVzc2FnZUxpdGUuQnVpbGRlciwgcmUtZGVjbGFyZWQgaGVyZSBvbmx5IGZvciByZXR1cm4gdHlwZQorICAgIC8vIGNvdmFyaWFuY2UuKQorICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKyAgICBCdWlsZGVyIG1lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisgICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisgICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKyAgICBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKyAgICBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSwgaW50IG9mZiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKyAgICBCdWlsZGVyIG1lcmdlRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VMaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiODI1NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZS5qYXZhCkBAIC0wLDAgKzEsMzI1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUT0RPKGtlbnRvbik6ICBVc2UgZ2VuZXJpY3M/ICBFLmcuIEJ1aWxkZXI8QnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPiwgdGhlbgorLy8gICBtZXJnZUZyb20qKCkgY291bGQgcmV0dXJuIEJ1aWxkZXJUeXBlIGZvciBiZXR0ZXIgdHlwZS1zYWZldHkuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBBYnN0cmFjdCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgUHJvdG9jb2wgTWVzc2FnZSBvYmplY3RzLgorICoKKyAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGFsbCBwcm90b2NvbCBtZXNzYWdlIG9iamVjdHMuICBOb24tbGl0ZQorICogbWVzc2FnZXMgYWRkaXRpb25hbGx5IGltcGxlbWVudCB0aGUgTWVzc2FnZSBpbnRlcmZhY2UsIHdoaWNoIGlzIGEgc3ViY2xhc3MKKyAqIG9mIE1lc3NhZ2VMaXRlLiAgVXNlIE1lc3NhZ2VMaXRlIGluc3RlYWQgd2hlbiB5b3Ugb25seSBuZWVkIHRoZSBzdWJzZXQgb2YKKyAqIGZlYXR1cmVzIHdoaWNoIGl0IHN1cHBvcnRzIC0tIG5hbWVseSwgbm90aGluZyB0aGF0IHVzZXMgZGVzY3JpcHRvcnMgb3IKKyAqIHJlZmxlY3Rpb24uICBZb3UgY2FuIGluc3RydWN0IHRoZSBwcm90b2NvbCBjb21waWxlciB0byBnZW5lcmF0ZSBjbGFzc2VzCisgKiB3aGljaCBpbXBsZW1lbnQgb25seSBNZXNzYWdlTGl0ZSwgbm90IHRoZSBmdWxsIE1lc3NhZ2UgaW50ZXJmYWNlLCBieSBhZGRpbmcKKyAqIHRoZSBmb2xsb3cgbGluZSB0byB0aGUgLnByb3RvIGZpbGU6CisgKiA8cHJlPgorICogICBvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworICogPC9wcmU+CisgKgorICogPHA+VGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIG9uIHJlc291cmNlLWNvbnN0cmFpbmVkIHN5c3RlbXMgd2hlcmUgdGhlCisgKiBmdWxsIHByb3RvY29sIGJ1ZmZlcnMgcnVudGltZSBsaWJyYXJ5IGlzIHRvbyBiaWcuCisgKgorICogPHA+Tm90ZSB0aGF0IG9uIG5vbi1jb25zdHJhaW5lZCBzeXN0ZW1zIChlLmcuIHNlcnZlcnMpIHdoZW4geW91IG5lZWQgdG8gbGluaworICogaW4gbG90cyBvZiBwcm90b2NvbCBkZWZpbml0aW9ucywgYSBiZXR0ZXIgd2F5IHRvIHJlZHVjZSB0b3RhbCBjb2RlIGZvb3RwcmludAorICogaXMgdG8gdXNlIHtAY29kZSBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkV9LiAgVGhpcyB3aWxsIG1ha2UgdGhlIGdlbmVyYXRlZAorICogY29kZSBzbWFsbGVyIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgYWxsIHRoZSBzYW1lIGZlYXR1cmVzIChhdCB0aGUgZXhwZW5zZSBvZgorICogc3BlZWQpLiAge0Bjb2RlIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRX0gaXMgYmVzdCB3aGVuIHlvdSBvbmx5IGhhdmUgYQorICogc21hbGwgbnVtYmVyIG9mIG1lc3NhZ2UgdHlwZXMgbGlua2VkIGludG8geW91ciBiaW5hcnksIGluIHdoaWNoIGNhc2UgdGhlCisgKiBzaXplIG9mIHRoZSBwcm90b2NvbCBidWZmZXJzIHJ1bnRpbWUgaXRzZWxmIGlzIHRoZSBiaWdnZXN0IHByb2JsZW0uCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGludGVyZmFjZSBNZXNzYWdlTGl0ZSBleHRlbmRzIE1lc3NhZ2VMaXRlT3JCdWlsZGVyIHsKKworCisgIC8qKgorICAgKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIGFuZCB3cml0ZXMgaXQgdG8ge0Bjb2RlIG91dHB1dH0uICBUaGlzIGRvZXMgbm90CisgICAqIGZsdXNoIG9yIGNsb3NlIHRoZSBzdHJlYW0uCisgICAqLworICB2b2lkIHdyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgLyoqCisgICAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGVuY29kZSB0aGlzIG1lc3NhZ2UuICBUaGUgcmVzdWx0CisgICAqIGlzIG9ubHkgY29tcHV0ZWQgb24gdGhlIGZpcnN0IGNhbGwgYW5kIG1lbW9pemVkIGFmdGVyIHRoYXQuCisgICAqLworICBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBDb252ZW5pZW5jZSBtZXRob2RzLgorCisgIC8qKgorICAgKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGEge0Bjb2RlIEJ5dGVTdHJpbmd9IGFuZCByZXR1cm5zIGl0LiBUaGlzIGlzCisgICAqIGp1c3QgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kCisgICAqIHtAbGluayAjd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSl9LgorICAgKi8KKyAgQnl0ZVN0cmluZyB0b0J5dGVTdHJpbmcoKTsKKworICAvKioKKyAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIHtAY29kZSBieXRlfSBhcnJheSBhbmQgcmV0dXJucyBpdC4gIFRoaXMgaXMKKyAgICoganVzdCBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQKKyAgICoge0BsaW5rICN3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtKX0uCisgICAqLworICBieXRlW10gdG9CeXRlQXJyYXkoKTsKKworICAvKioKKyAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9LiAgVGhpcyBpcyBqdXN0IGEKKyAgICogdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgI3dyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0pfS4gIFRoaXMgZG9lcworICAgKiBub3QgZmx1c2ggb3IgY2xvc2UgdGhlIHN0cmVhbS4KKyAgICogPHA+CisgICAqIE5PVEU6ICBQcm90b2NvbCBCdWZmZXJzIGFyZSBub3Qgc2VsZi1kZWxpbWl0aW5nLiAgVGhlcmVmb3JlLCBpZiB5b3Ugd3JpdGUKKyAgICogYW55IG1vcmUgZGF0YSB0byB0aGUgc3RyZWFtIGFmdGVyIHRoZSBtZXNzYWdlLCB5b3UgbXVzdCBzb21laG93IGVuc3VyZQorICAgKiB0aGF0IHRoZSBwYXJzZXIgb24gdGhlIHJlY2VpdmluZyBlbmQgZG9lcyBub3QgaW50ZXJwcmV0IHRoaXMgYXMgYmVpbmcKKyAgICogcGFydCBvZiB0aGUgcHJvdG9jb2wgbWVzc2FnZS4gIFRoaXMgY2FuIGJlIGRvbmUgZS5nLiBieSB3cml0aW5nIHRoZSBzaXplCisgICAqIG9mIHRoZSBtZXNzYWdlIGJlZm9yZSB0aGUgZGF0YSwgdGhlbiBtYWtpbmcgc3VyZSB0byBsaW1pdCB0aGUgaW5wdXQgdG8KKyAgICogdGhhdCBzaXplIG9uIHRoZSByZWNlaXZpbmcgZW5kIChlLmcuIGJ5IHdyYXBwaW5nIHRoZSBJbnB1dFN0cmVhbSBpbiBvbmUKKyAgICogd2hpY2ggbGltaXRzIHRoZSBpbnB1dCkuICBBbHRlcm5hdGl2ZWx5LCBqdXN0IHVzZQorICAgKiB7QGxpbmsgI3dyaXRlRGVsaW1pdGVkVG8oT3V0cHV0U3RyZWFtKX0uCisgICAqLworICB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBMaWtlIHtAbGluayAjd3JpdGVUbyhPdXRwdXRTdHJlYW0pfSwgYnV0IHdyaXRlcyB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZQorICAgKiBhcyBhIHZhcmludCBiZWZvcmUgd3JpdGluZyB0aGUgZGF0YS4gIFRoaXMgYWxsb3dzIG1vcmUgZGF0YSB0byBiZSB3cml0dGVuCisgICAqIHRvIHRoZSBzdHJlYW0gYWZ0ZXIgdGhlIG1lc3NhZ2Ugd2l0aG91dCB0aGUgbmVlZCB0byBkZWxpbWl0IHRoZSBtZXNzYWdlCisgICAqIGRhdGEgeW91cnNlbGYuICBVc2Uge0BsaW5rIEJ1aWxkZXIjbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtKX0gKG9yCisgICAqIHRoZSBzdGF0aWMgbWV0aG9kIHtAY29kZSBZb3VyTWVzc2FnZVR5cGUucGFyc2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtKX0pCisgICAqIHRvIHBhcnNlIG1lc3NhZ2VzIHdyaXR0ZW4gYnkgdGhpcyBtZXRob2QuCisgICAqLworICB2b2lkIHdyaXRlRGVsaW1pdGVkVG8oT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEJ1aWxkZXJzCisKKyAgLyoqCisgICAqIENvbnN0cnVjdHMgYSBuZXcgYnVpbGRlciBmb3IgYSBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhpcyBtZXNzYWdlLgorICAgKi8KKyAgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZSgpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgYnVpbGRlciBpbml0aWFsaXplZCB3aXRoIHRoZSBjdXJyZW50IG1lc3NhZ2UuICBVc2UgdGhpcyB0bworICAgKiBkZXJpdmUgYSBuZXcgbWVzc2FnZSBmcm9tIHRoZSBjdXJyZW50IG9uZS4KKyAgICovCisgIEJ1aWxkZXIgdG9CdWlsZGVyKCk7CisKKyAgLyoqCisgICAqIEFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBQcm90b2NvbCBNZXNzYWdlIGJ1aWxkZXJzLgorICAgKi8KKyAgaW50ZXJmYWNlIEJ1aWxkZXIgZXh0ZW5kcyBNZXNzYWdlTGl0ZU9yQnVpbGRlciwgQ2xvbmVhYmxlIHsKKyAgICAvKiogUmVzZXRzIGFsbCBmaWVsZHMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuICovCisgICAgQnVpbGRlciBjbGVhcigpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHRoZSBmaW5hbCBtZXNzYWdlLiAgT25jZSB0aGlzIGlzIGNhbGxlZCwgdGhlIEJ1aWxkZXIgaXMgbm8KKyAgICAgKiBsb25nZXIgdmFsaWQsIGFuZCBjYWxsaW5nIGFueSBvdGhlciBtZXRob2Qgd2lsbCByZXN1bHQgaW4gdW5kZWZpbmVkCisgICAgICogYmVoYXZpb3IgYW5kIG1heSB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLiAgSWYgeW91IG5lZWQgdG8gY29udGludWUKKyAgICAgKiB3b3JraW5nIHdpdGggdGhlIGJ1aWxkZXIgYWZ0ZXIgY2FsbGluZyB7QGNvZGUgYnVpbGQoKX0sIHtAY29kZSBjbG9uZSgpfQorICAgICAqIGl0IGZpcnN0LgorICAgICAqIEB0aHJvd3MgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gVGhlIG1lc3NhZ2UgaXMgbWlzc2luZyBvbmUgb3IgbW9yZQorICAgICAqICAgICAgICAgcmVxdWlyZWQgZmllbGRzIChpLmUuIHtAbGluayAjaXNJbml0aWFsaXplZCgpfSByZXR1cm5zIGZhbHNlKS4KKyAgICAgKiAgICAgICAgIFVzZSB7QGxpbmsgI2J1aWxkUGFydGlhbCgpfSB0byBieXBhc3MgdGhpcyBjaGVjay4KKyAgICAgKi8KKyAgICBNZXNzYWdlTGl0ZSBidWlsZCgpOworCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2J1aWxkKCl9LCBidXQgZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlCisgICAgICogaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuICBJbnN0ZWFkLCBhIHBhcnRpYWwgbWVzc2FnZSBpcyByZXR1cm5lZC4KKyAgICAgKiBPbmNlIHRoaXMgaXMgY2FsbGVkLCB0aGUgQnVpbGRlciBpcyBubyBsb25nZXIgdmFsaWQsIGFuZCBjYWxsaW5nIGFueQorICAgICAqIHdpbGwgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvciBhbmQgbWF5IHRocm93IGEgTnVsbFBvaW50ZXJFeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBJZiB5b3UgbmVlZCB0byBjb250aW51ZSB3b3JraW5nIHdpdGggdGhlIGJ1aWxkZXIgYWZ0ZXIgY2FsbGluZworICAgICAqIHtAY29kZSBidWlsZFBhcnRpYWwoKX0sIHtAY29kZSBjbG9uZSgpfSBpdCBmaXJzdC4KKyAgICAgKi8KKyAgICBNZXNzYWdlTGl0ZSBidWlsZFBhcnRpYWwoKTsKKworICAgIC8qKgorICAgICAqIENsb25lcyB0aGUgQnVpbGRlci4KKyAgICAgKiBAc2VlIE9iamVjdCNjbG9uZSgpCisgICAgICovCisgICAgQnVpbGRlciBjbG9uZSgpOworCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgZnJvbSB0aGUgaW5wdXQgYW5kIG1lcmdlcyBpdCB3aXRoIHRoaXMKKyAgICAgKiBtZXNzYWdlLCBhcyBpZiB1c2luZyB7QGxpbmsgQnVpbGRlciNtZXJnZUZyb20oTWVzc2FnZUxpdGUpfS4KKyAgICAgKgorICAgICAqIDxwPldhcm5pbmc6ICBUaGlzIGRvZXMgbm90IHZlcmlmeSB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQgaW4KKyAgICAgKiB0aGUgaW5wdXQgbWVzc2FnZS4gIElmIHlvdSBjYWxsIHtAbGluayAjYnVpbGQoKX0gd2l0aG91dCBzZXR0aW5nIGFsbAorICAgICAqIHJlcXVpcmVkIGZpZWxkcywgaXQgd2lsbCB0aHJvdyBhbiB7QGxpbmsgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb259LAorICAgICAqIHdoaWNoIGlzIGEge0Bjb2RlIFJ1bnRpbWVFeGNlcHRpb259IGFuZCB0aHVzIG1pZ2h0IG5vdCBiZSBjYXVnaHQuICBUaGVyZQorICAgICAqIGFyZSBhIGZldyBnb29kIHdheXMgdG8gZGVhbCB3aXRoIHRoaXM6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkNhbGwge0BsaW5rICNpc0luaXRpYWxpemVkKCl9IHRvIHZlcmlmeSB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMKKyAgICAgKiAgICAgICBhcmUgc2V0IGJlZm9yZSBidWlsZGluZy4KKyAgICAgKiAgIDxsaT5QYXJzZSB0aGUgbWVzc2FnZSBzZXBhcmF0ZWx5IHVzaW5nIG9uZSBvZiB0aGUgc3RhdGljCisgICAgICogICAgICAge0Bjb2RlIHBhcnNlRnJvbX0gbWV0aG9kcywgdGhlbiB1c2Uge0BsaW5rICNtZXJnZUZyb20oTWVzc2FnZUxpdGUpfQorICAgICAqICAgICAgIHRvIG1lcmdlIGl0IHdpdGggdGhpcyBvbmUuICB7QGNvZGUgcGFyc2VGcm9tfSB3aWxsIHRocm93IGFuCisgICAgICogICAgICAge0BsaW5rIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbn0gKGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0pCisgICAgICogICAgICAgaWYgc29tZSByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcuCisgICAgICogICA8bGk+VXNlIHtAY29kZSBidWlsZFBhcnRpYWwoKX0gdG8gYnVpbGQsIHdoaWNoIGlnbm9yZXMgbWlzc2luZworICAgICAqICAgICAgIHJlcXVpcmVkIGZpZWxkcy4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPHA+Tm90ZTogIFRoZSBjYWxsZXIgc2hvdWxkIGNhbGwKKyAgICAgKiB7QGxpbmsgQ29kZWRJbnB1dFN0cmVhbSNjaGVja0xhc3RUYWdXYXMoaW50KX0gYWZ0ZXIgY2FsbGluZyB0aGlzIHRvCisgICAgICogdmVyaWZ5IHRoYXQgdGhlIGxhc3QgdGFnIHNlZW4gd2FzIHRoZSBhcHByb3ByaWF0ZSBlbmQtZ3JvdXAgdGFnLAorICAgICAqIG9yIHplcm8gZm9yIEVPRi4KKyAgICAgKi8KKyAgICBCdWlsZGVyIG1lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayBCdWlsZGVyI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0sIGJ1dCBhbHNvCisgICAgICogcGFyc2VzIGV4dGVuc2lvbnMuICBUaGUgZXh0ZW5zaW9ucyB0aGF0IHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcGFyc2UKKyAgICAgKiBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4ge0Bjb2RlIGV4dGVuc2lvblJlZ2lzdHJ5fS4gIEV4dGVuc2lvbnMgbm90IGluCisgICAgICogdGhlIHJlZ2lzdHJ5IHdpbGwgYmUgdHJlYXRlZCBhcyB1bmtub3duIGZpZWxkcy4KKyAgICAgKi8KKyAgICBCdWlsZGVyIG1lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzLgorCisgICAgLyoqCisgICAgICogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgYW5kIG1lcmdlIGl0IHdpdGggdGhlCisgICAgICogbWVzc2FnZSBiZWluZyBidWlsdC4gIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kCisgICAgICoge0BsaW5rICNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgQnVpbGRlciBtZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgYW5kIG1lcmdlIGl0IHdpdGggdGhlCisgICAgICogbWVzc2FnZSBiZWluZyBidWlsdC4gIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kCisgICAgICoge0BsaW5rICNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSxFeHRlbnNpb25SZWdpc3RyeSl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgQnVpbGRlciBtZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgYW5kIG1lcmdlIGl0IHdpdGggdGhlCisgICAgICogbWVzc2FnZSBiZWluZyBidWlsdC4gIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kCisgICAgICoge0BsaW5rICNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKKyAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKKyAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgYW5kIG1lcmdlIGl0IHdpdGggdGhlCisgICAgICogbWVzc2FnZSBiZWluZyBidWlsdC4gIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kCisgICAgICoge0BsaW5rICNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSxFeHRlbnNpb25SZWdpc3RyeSl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKKyAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKKyAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtLEV4dGVuc2lvblJlZ2lzdHJ5KX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgKi8KKyAgICBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSwgaW50IG9mZiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCisgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSBpdCB3aXRoIHRoZQorICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAorICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBhbHdheXMKKyAgICAgKiByZWFkcyB0aGUgPGk+ZW50aXJlPC9pPiBpbnB1dCAodW5sZXNzIGl0IHRocm93cyBhbiBleGNlcHRpb24pLiAgSWYgeW91CisgICAgICogd2FudCBpdCB0byBzdG9wIGVhcmxpZXIsIHlvdSB3aWxsIG5lZWQgdG8gd3JhcCB5b3VyIGlucHV0IGluIHNvbWUKKyAgICAgKiB3cmFwcGVyIHN0cmVhbSB0aGF0IGxpbWl0cyByZWFkaW5nLiAgT3IsIHVzZQorICAgICAqIHtAbGluayBNZXNzYWdlTGl0ZSN3cml0ZURlbGltaXRlZFRvKE91dHB1dFN0cmVhbSl9IHRvIHdyaXRlIHlvdXIgbWVzc2FnZQorICAgICAqIGFuZCB7QGxpbmsgI21lcmdlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSl9IHRvIHJlYWQgaXQuCisgICAgICogPHA+CisgICAgICogRGVzcGl0ZSB1c3VhbGx5IHJlYWRpbmcgdGhlIGVudGlyZSBpbnB1dCwgdGhpcyBkb2VzIG5vdCBjbG9zZSB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzCisgICAgICovCisgICAgQnVpbGRlciBtZXJnZUZyb20oSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSBpdCB3aXRoIHRoZQorICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAorICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0sRXh0ZW5zaW9uUmVnaXN0cnkpfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcworICAgICAqLworICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjbWVyZ2VGcm9tKElucHV0U3RyZWFtKX0sIGJ1dCBkb2VzIG5vdCByZWFkIHVudGlsIEVPRi4KKyAgICAgKiBJbnN0ZWFkLCB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSAoZW5jb2RlZCBhcyBhIHZhcmludCkgaXMgcmVhZCBmaXJzdCwKKyAgICAgKiB0aGVuIHRoZSBtZXNzYWdlIGRhdGEuICBVc2UKKyAgICAgKiB7QGxpbmsgTWVzc2FnZUxpdGUjd3JpdGVEZWxpbWl0ZWRUbyhPdXRwdXRTdHJlYW0pfSB0byB3cml0ZSBtZXNzYWdlcyBpbgorICAgICAqIHRoaXMgZm9ybWF0LgorICAgICAqCisgICAgICogQHJldHVybnMgVHJ1ZSBpZiBzdWNjZXNzZnVsLCBvciBmYWxzZSBpZiB0aGUgc3RyZWFtIGlzIGF0IEVPRiB3aGVuIHRoZQorICAgICAqICAgICAgICAgIG1ldGhvZCBzdGFydHMuICBBbnkgb3RoZXIgZXJyb3IgKGluY2x1ZGluZyByZWFjaGluZyBFT0YgZHVyaW5nCisgICAgICogICAgICAgICAgcGFyc2luZykgd2lsbCBjYXVzZSBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duLgorICAgICAqLworICAgIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0pfSBidXQgc3VwcG9ydGluZyBleHRlbnNpb25zLgorICAgICAqLworICAgIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZU9yQnVpbGRlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VMaXRlT3JCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjNzJlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZU9yQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworLyoqCisgKiBCYXNlIGludGVyZmFjZSBmb3IgbWV0aG9kcyBjb21tb24gdG8ge0BsaW5rIE1lc3NhZ2VMaXRlfQorICogYW5kIHtAbGluayBNZXNzYWdlTGl0ZS5CdWlsZGVyfSB0byBwcm92aWRlIHR5cGUgZXF1aXZhbGVuY3kuCisgKgorICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUxpdGVPckJ1aWxkZXIgeworICAvKioKKyAgICogR2V0IGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlIHdpdGggbm8gZmllbGRzIHNldC4gQmVjYXVzZSBubyBmaWVsZHMgYXJlIHNldCwKKyAgICogYWxsIGdldHRlcnMgZm9yIHNpbmd1bGFyIGZpZWxkcyB3aWxsIHJldHVybiBkZWZhdWx0IHZhbHVlcyBhbmQgcmVwZWF0ZWQKKyAgICogZmllbGRzIHdpbGwgYXBwZWFyIGVtcHR5LgorICAgKiBUaGlzIG1heSBvciBtYXkgbm90IGJlIGEgc2luZ2xldG9uLiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlCisgICAqIHtAY29kZSBnZXREZWZhdWx0SW5zdGFuY2UoKX0gbWV0aG9kIG9mIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMgaW4gdGhhdAorICAgKiB0aGlzIG1ldGhvZCBpcyBhbiBhYnN0cmFjdCBtZXRob2Qgb2YgdGhlIHtAY29kZSBNZXNzYWdlTGl0ZX0gaW50ZXJmYWNlCisgICAqIHdoZXJlYXMge0Bjb2RlIGdldERlZmF1bHRJbnN0YW5jZSgpfSBpcyBhIHN0YXRpYyBtZXRob2Qgb2YgYSBzcGVjaWZpYworICAgKiBjbGFzcy4gIFRoZXkgcmV0dXJuIHRoZSBzYW1lIHRoaW5nLgorICAgKi8KKyAgTWVzc2FnZUxpdGUgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBhbmQgYWxsIGVtYmVkZGVkCisgICAqIG1lc3NhZ2VzIGFyZSBzZXQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpOworCit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZU9yQnVpbGRlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VPckJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTMyZTdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VPckJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBCYXNlIGludGVyZmFjZSBmb3IgbWV0aG9kcyBjb21tb24gdG8ge0BsaW5rIE1lc3NhZ2V9IGFuZAorICoge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0gdG8gcHJvdmlkZSB0eXBlIGVxdWl2YWxlbmN5LgorICoKKyAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICovCitwdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VPckJ1aWxkZXIgZXh0ZW5kcyBNZXNzYWdlTGl0ZU9yQnVpbGRlciB7CisKKyAgLy8gKEZyb20gTWVzc2FnZUxpdGUsIHJlLWRlY2xhcmVkIGhlcmUgb25seSBmb3IgcmV0dXJuIHR5cGUgY292YXJpYW5jZS4pCisgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICBNZXNzYWdlIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKTsKKworICAvKioKKyAgICogR2V0IHRoZSBtZXNzYWdlJ3MgdHlwZSdzIGRlc2NyaXB0b3IuICBUaGlzIGRpZmZlcnMgZnJvbSB0aGUKKyAgICoge0Bjb2RlIGdldERlc2NyaXB0b3IoKX0gbWV0aG9kIG9mIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMgaW4gdGhhdAorICAgKiB0aGlzIG1ldGhvZCBpcyBhbiBhYnN0cmFjdCBtZXRob2Qgb2YgdGhlIHtAY29kZSBNZXNzYWdlfSBpbnRlcmZhY2UKKyAgICogd2hlcmVhcyB7QGNvZGUgZ2V0RGVzY3JpcHRvcigpfSBpcyBhIHN0YXRpYyBtZXRob2Qgb2YgYSBzcGVjaWZpYyBjbGFzcy4KKyAgICogVGhleSByZXR1cm4gdGhlIHNhbWUgdGhpbmcuCisgICAqLworICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIGFsbCB0aGUgZmllbGRzIGluIHRoaXMgbWVzc2FnZSB3aGljaCBhcmUgc2V0CisgICAqIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcy4gIEEgc2luZ3VsYXIgKCJyZXF1aXJlZCIgb3IgIm9wdGlvbmFsIikKKyAgICogZmllbGQgaXMgc2V0IGlmZiBoYXNGaWVsZCgpIHJldHVybnMgdHJ1ZSBmb3IgdGhhdCBmaWVsZC4gIEEgInJlcGVhdGVkIgorICAgKiBmaWVsZCBpcyBzZXQgaWZmIGdldFJlcGVhdGVkRmllbGRTaXplKCkgaXMgZ3JlYXRlciB0aGFuIHplcm8uICBUaGUKKyAgICogdmFsdWVzIGFyZSBleGFjdGx5IHdoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgY2FsbGluZworICAgKiB7QGxpbmsgI2dldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9IGZvciBlYWNoIGZpZWxkLiAgVGhlIG1hcAorICAgKiBpcyBndWFyYW50ZWVkIHRvIGJlIGEgc29ydGVkIG1hcCwgc28gaXRlcmF0aW5nIG92ZXIgaXQgd2lsbCByZXR1cm4gZmllbGRzCisgICAqIGluIG9yZGVyIGJ5IGZpZWxkIG51bWJlci4KKyAgICogPGJyPgorICAgKiBJZiB0aGlzIGlzIGZvciBhIGJ1aWxkZXIsIHRoZSByZXR1cm5lZCBtYXAgbWF5IG9yIG1heSBub3QgcmVmbGVjdCBmdXR1cmUKKyAgICogY2hhbmdlcyB0byB0aGUgYnVpbGRlci4gIEVpdGhlciB3YXksIHRoZSByZXR1cm5lZCBtYXAgaXMgaXRzZWxmCisgICAqIHVubW9kaWZpYWJsZS4KKyAgICovCisgIE1hcDxEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZmllbGQgaXMgc2V0LiAgVGhpcyBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8KKyAgICogY2FsbGluZyB0aGUgZ2VuZXJhdGVkICJoYXMiIGFjY2Vzc29yIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWVsZC4KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhlIGZpZWxkIGlzIGEgcmVwZWF0ZWQgZmllbGQsIG9yCisgICAqICAgICAgICAgICB7QGNvZGUgZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KKyAgICovCisgIGJvb2xlYW4gaGFzRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKTsKKworICAvKioKKyAgICogT2J0YWlucyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLCBvciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBpdCBpcworICAgKiBub3Qgc2V0LiAgRm9yIHByaW1pdGl2ZSBmaWVsZHMsIHRoZSBib3hlZCBwcmltaXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuCisgICAqIEZvciBlbnVtIGZpZWxkcywgdGhlIEVudW1WYWx1ZURlc2NyaXB0b3IgZm9yIHRoZSB2YWx1ZSBpcyByZXR1cmVuZC4gRm9yCisgICAqIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGRzLCB0aGUgc3ViLW1lc3NhZ2UgaXMgcmV0dXJuZWQuICBGb3IgcmVwZWF0ZWQKKyAgICogZmllbGRzLCBhIGphdmEudXRpbC5MaXN0IGlzIHJldHVybmVkLgorICAgKi8KKyAgT2JqZWN0IGdldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCk7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiBhIHJlcGVhdGVkIGZpZWxkLiAgVGhpcyBpcyBleGFjdGx5CisgICAqIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUgZ2VuZXJhdGVkICJDb3VudCIgYWNjZXNzb3IgbWV0aG9kIGNvcnJlc3BvbmRpbmcKKyAgICogdG8gdGhlIGZpZWxkLgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGUgZmllbGQgaXMgbm90IGEgcmVwZWF0ZWQgZmllbGQsIG9yCisgICAqICAgICAgICAgICB7QGNvZGUgZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KKyAgICovCisgIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKTsKKworICAvKioKKyAgICogR2V0cyBhbiBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZmllbGQuICBGb3IgcHJpbWl0aXZlIGZpZWxkcywgdGhlIGJveGVkCisgICAqIHByaW1pdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZC4gIEZvciBlbnVtIGZpZWxkcywgdGhlIEVudW1WYWx1ZURlc2NyaXB0b3IKKyAgICogZm9yIHRoZSB2YWx1ZSBpcyByZXR1cmVuZC4gRm9yIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGRzLCB0aGUgc3ViLW1lc3NhZ2UKKyAgICogaXMgcmV0dXJuZWQuCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRoZSBmaWVsZCBpcyBub3QgYSByZXBlYXRlZCBmaWVsZCwgb3IKKyAgICogICAgICAgICAgIHtAY29kZSBmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9IGdldERlc2NyaXB0b3JGb3JUeXBlKCl9LgorICAgKi8KKyAgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXgpOworCisgIC8qKiBHZXQgdGhlIHtAbGluayBVbmtub3duRmllbGRTZXR9IGZvciB0aGlzIG1lc3NhZ2UuICovCisgIFVua25vd25GaWVsZFNldCBnZXRVbmtub3duRmllbGRzKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUHJvdG9jb2xNZXNzYWdlRW51bS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Byb3RvY29sTWVzc2FnZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTI0MDBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Byb3RvY29sTWVzc2FnZUVudW0uamF2YQpAQCAtMCwwICsxLDU4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvcjsKKworLyoqCisgKiBJbnRlcmZhY2Ugb2YgdXNlZnVsIG1ldGhvZHMgYWRkZWQgdG8gYWxsIGVudW1zIGdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wKKyAqIGNvbXBpbGVyLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFByb3RvY29sTWVzc2FnZUVudW0gZXh0ZW5kcyBJbnRlcm5hbC5FbnVtTGl0ZSB7CisKKyAgLyoqCisgICAqIFJldHVybiB0aGUgdmFsdWUncyBudW1lcmljIHZhbHVlIGFzIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICAgKi8KKyAgaW50IGdldE51bWJlcigpOworCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIHZhbHVlJ3MgZGVzY3JpcHRvciwgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gc3VjaCBhcworICAgKiB2YWx1ZSBuYW1lLCBudW1iZXIsIGFuZCB0eXBlLgorICAgKi8KKyAgRW51bVZhbHVlRGVzY3JpcHRvciBnZXRWYWx1ZURlc2NyaXB0b3IoKTsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSBlbnVtIHR5cGUncyBkZXNjcmlwdG9yLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbgorICAgKiBhYm91dCBlYWNoIGRlZmluZWQgdmFsdWUsIGV0Yy4KKyAgICovCisgIEVudW1EZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXIuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9SZXBlYXRlZEZpZWxkQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMjRmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDY5NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiA8Y29kZT5SZXBlYXRlZEZpZWxkQnVpbGRlcjwvY29kZT4gaW1wbGVtZW50cyBhIHN0cnVjdHVyZSB0aGF0IGEgcHJvdG9jb2wKKyAqIG1lc3NhZ2UgdXNlcyB0byBob2xkIGEgcmVwZWF0ZWQgZmllbGQgb2Ygb3RoZXIgcHJvdG9jb2wgbWVzc2FnZXMuIEl0IHN1cHBvcnRzCisgKiB0aGUgY2xhc3NpY2FsIHVzZSBjYXNlIG9mIGFkZGluZyBpbW11dGFibGUge0BsaW5rIE1lc3NhZ2V9J3MgdG8gdGhlCisgKiByZXBlYXRlZCBmaWVsZCBhbmQgaXMgaGlnaGx5IG9wdGltaXplZCBhcm91bmQgdGhpcyAobm8gZXh0cmEgbWVtb3J5CisgKiBhbGxvY2F0aW9ucyBhbmQgc2hhcmluZyBvZiBpbW11dGFibGUgYXJyYXlzKS4KKyAqIDxicj4KKyAqIEl0IGFsc28gc3VwcG9ydHMgdGhlIGFkZGl0aW9uYWwgdXNlIGNhc2Ugb2YgYWRkaW5nIGEge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0KKyAqIHRvIHRoZSByZXBlYXRlZCBmaWVsZCBhbmQgZGVmZXJyaW5nIGNvbnZlcnNpb24gb2YgdGhhdCA8Y29kZT5CdWlsZGVyPC9jb2RlPgorICogdG8gYW4gaW1tdXRhYmxlIDxjb2RlPk1lc3NhZ2U8L2NvZGU+LiBJbiB0aGlzIHdheSwgaXQncyBwb3NzaWJsZSB0byBtYWludGFpbgorICogYSB0cmVlIG9mIDxjb2RlPkJ1aWxkZXI8L2NvZGU+J3MgdGhhdCBhY3RzIGFzIGEgZnVsbHkgcmVhZC93cml0ZSBkYXRhCisgKiBzdHJ1Y3R1cmUuCisgKiA8YnI+CisgKiBMb2dpY2FsbHksIG9uZSBjYW4gdGhpbmsgb2YgYSB0cmVlIG9mIGJ1aWxkZXJzIGFzIGNvbnZlcnRpbmcgdGhlIGVudGlyZSB0cmVlCisgKiB0byBtZXNzYWdlcyB3aGVuIGJ1aWxkIGlzIGNhbGxlZCBvbiB0aGUgcm9vdCBvciB3aGVuIGFueSBtZXRob2QgaXMgY2FsbGVkCisgKiB0aGF0IGRlc2lyZXMgYSBNZXNzYWdlIGluc3RlYWQgb2YgYSBCdWlsZGVyLiBJbiB0ZXJtcyBvZiB0aGUgaW1wbGVtZW50YXRpb24sCisgKiB0aGUgPGNvZGU+U2luZ2xlRmllbGRCdWlsZGVyPC9jb2RlPiBhbmQgPGNvZGU+UmVwZWF0ZWRGaWVsZEJ1aWxkZXI8L2NvZGU+CisgKiBjbGFzc2VzIGNhY2hlIG1lc3NhZ2VzIHRoYXQgd2VyZSBjcmVhdGVkIHNvIHRoYXQgbWVzc2FnZXMgb25seSBuZWVkIHRvIGJlCisgKiBjcmVhdGVkIHdoZW4gc29tZSBjaGFuZ2Ugb2NjdXJlZCBpbiBpdHMgYnVpbGRlciBvciBhIGJ1aWxkZXIgZm9yIG9uZSBvZiBpdHMKKyAqIGRlc2NlbmRhbnRzLgorICoKKyAqIEBwYXJhbSA8TVR5cGU+IHRoZSB0eXBlIG9mIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZAorICogQHBhcmFtIDxCVHlwZT4gdGhlIHR5cGUgb2YgYnVpbGRlciBmb3IgdGhlIGZpZWxkCisgKiBAcGFyYW0gPElUeXBlPiB0aGUgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlIG1lc3NhZ2UgYW5kIHRoZSBidWlsZGVyCisgKgorICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisgKi8KK3B1YmxpYyBjbGFzcyBSZXBlYXRlZEZpZWxkQnVpbGRlcgorICAgIDxNVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UsCisgICAgIEJUeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyLAorICAgICBJVHlwZSBleHRlbmRzIE1lc3NhZ2VPckJ1aWxkZXI+CisgICAgaW1wbGVtZW50cyBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgeworCisgIC8vIFBhcmVudCB0byBzZW5kIGNoYW5nZXMgdG8uCisgIHByaXZhdGUgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudDsKKworICAvLyBMaXN0IG9mIG1lc3NhZ2VzLiBOZXZlciBudWxsLiBJdCBtYXkgYmUgaW1tdXRhYmxlLCBpbiB3aGljaCBjYXNlCisgIC8vIGlzTWVzc2FnZXNMaXN0SW1tdXRhYmxlIHdpbGwgYmUgdHJ1ZS4gU2VlIG5vdGUgYmVsb3cuCisgIHByaXZhdGUgTGlzdDxNVHlwZT4gbWVzc2FnZXM7CisKKyAgLy8gV2hldGhlciBtZXNzYWdlcyBpcyBhbiBtdXRhYmxlIGFycmF5IHRoYXQgY2FuIGJlIG1vZGlmaWVkLgorICBwcml2YXRlIGJvb2xlYW4gaXNNZXNzYWdlc0xpc3RNdXRhYmxlOworCisgIC8vIExpc3Qgb2YgYnVpbGRlcnMuIE1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlLCBubyBuZXN0ZWQgYnVpbGRlcnMgd2VyZQorICAvLyBjcmVhdGVkLiBJZiBub3QgbnVsbCwgZW50cmllcyByZXByZXNlbnQgdGhlIGJ1aWxkZXIgZm9yIHRoYXQgaW5kZXguCisgIHByaXZhdGUgTGlzdDxTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4+IGJ1aWxkZXJzOworCisgIC8vIEhlcmUgYXJlIHRoZSBpbnZhcmlhbnRzIGZvciBtZXNzYWdlcyBhbmQgYnVpbGRlcnM6CisgIC8vIDEuIG1lc3NhZ2VzIGlzIG5ldmVyIG51bGwgYW5kIGl0cyBjb3VudCBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zCisgIC8vICAgIGluIHRoZSByZXBlYXRlZCBmaWVsZC4KKyAgLy8gMi4gSWYgYnVpbGRlcnMgaXMgbm9uLW51bGwsIG1lc3NhZ2VzIGFuZCBidWlsZGVycyBNVVNUIGFsd2F5cworICAvLyAgICBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcy4KKyAgLy8gMy4gRW50cmllcyBpbiBlaXRoZXIgYXJyYXkgY2FuIGJlIG51bGwsIGJ1dCBmb3IgYW55IGluZGV4LCB0aGVyZSBNVVNUIGJlCisgIC8vICAgIGVpdGhlciBhIE1lc3NhZ2UgaW4gbWVzc2FnZXMgb3IgYSBidWlsZGVyIGluIGJ1aWxkZXJzLgorICAvLyA0LiBJZiB0aGUgYnVpbGRlciBhdCBhbiBpbmRleCBpcyBub24tbnVsbCwgdGhlIGJ1aWxkZXIgaXMKKyAgLy8gICAgYXV0aG9yaXRhdGl2ZS4gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBhIEJ1aWxkZXIgd2FzIHNldCBvbiB0aGUgaW5kZXguCisgIC8vICAgIEFueSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlcyBhcnJheSBNVVNUIGJlIGlnbm9yZWQuCisgIC8vIHQuIElmIHRoZSBidWlsZGVyIGF0IGFuIGluZGV4IGlzIG51bGwsIHRoZSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlcworICAvLyAgICBsaXN0IGlzIGF1dGhvcml0YXRpdmUuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgYSBNZXNzYWdlIChub3QgYSBCdWlsZGVyKQorICAvLyAgICB3YXMgc2V0IGRpcmVjdGx5IGZvciBhbiBpbmRleC4KKworICAvLyBJbmRpY2F0ZXMgdGhhdCB3ZSd2ZSBidWlsdCBhIG1lc3NhZ2UgYW5kIHNvIHdlIGFyZSBub3cgb2JsaWdhdGVkCisgIC8vIHRvIGRpc3BhdGNoIGRpcnR5IGludmFsaWRhdGlvbnMuIFNlZSBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJMaXN0ZW5lci4KKyAgcHJpdmF0ZSBib29sZWFuIGlzQ2xlYW47CisKKyAgLy8gQSB2aWV3IG9mIHRoaXMgYnVpbGRlciB0aGF0IGV4cG9zZXMgYSBMaXN0IGludGVyZmFjZSBvZiBtZXNzYWdlcy4gVGhpcyBpcworICAvLyBpbml0aWFsaXplZCBvbiBkZW1hbmQuIFRoaXMgaXMgZnVsbHkgYmFja2VkIGJ5IHRoaXMgb2JqZWN0IGFuZCBhbGwgY2hhbmdlcworICAvLyBhcmUgcmVmbGVjdGVkIGluIGl0LiBBY2Nlc3MgdG8gYW55IGl0ZW0gY29udmVydHMgaXQgdG8gYSBtZXNzYWdlIGlmIGl0CisgIC8vIHdhcyBhIGJ1aWxkZXIuCisgIHByaXZhdGUgTWVzc2FnZUV4dGVybmFsTGlzdDxNVHlwZSwgQlR5cGUsIElUeXBlPiBleHRlcm5hbE1lc3NhZ2VMaXN0OworCisgIC8vIEEgdmlldyBvZiB0aGlzIGJ1aWxkZXIgdGhhdCBleHBvc2VzIGEgTGlzdCBpbnRlcmZhY2Ugb2YgYnVpbGRlcnMuIFRoaXMgaXMKKyAgLy8gaW5pdGlhbGl6ZWQgb24gZGVtYW5kLiBUaGlzIGlzIGZ1bGx5IGJhY2tlZCBieSB0aGlzIG9iamVjdCBhbmQgYWxsIGNoYW5nZXMKKyAgLy8gYXJlIHJlZmxlY3RlZCBpbiBpdC4gQWNjZXNzIHRvIGFueSBpdGVtIGNvbnZlcnRzIGl0IHRvIGEgYnVpbGRlciBpZiBpdAorICAvLyB3YXMgYSBtZXNzYWdlLgorICBwcml2YXRlIEJ1aWxkZXJFeHRlcm5hbExpc3Q8TVR5cGUsIEJUeXBlLCBJVHlwZT4gZXh0ZXJuYWxCdWlsZGVyTGlzdDsKKworICAvLyBBIHZpZXcgb2YgdGhpcyBidWlsZGVyIHRoYXQgZXhwb3NlcyBhIExpc3QgaW50ZXJmYWNlIG9mIHRoZSBpbnRlcmZhY2UKKyAgLy8gaW1wbGVtZW50ZWQgYnkgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLiBUaGlzIGlzIGluaXRpYWxpemVkIG9uIGRlbWFuZC4gVGhpcworICAvLyBpcyBmdWxseSBiYWNrZWQgYnkgdGhpcyBvYmplY3QgYW5kIGFsbCBjaGFuZ2VzIGFyZSByZWZsZWN0ZWQgaW4gaXQuCisgIC8vIEFjY2VzcyB0byBhbnkgaXRlbSByZXR1cm5zIGVpdGhlciBhIGJ1aWxkZXIgb3IgbWVzc2FnZSBkZXBlbmRpbmcgb24KKyAgLy8gd2hhdCBpcyBtb3N0IGVmZmljaWVudC4KKyAgcHJpdmF0ZSBNZXNzYWdlT3JCdWlsZGVyRXh0ZXJuYWxMaXN0PE1UeXBlLCBCVHlwZSwgSVR5cGU+CisgICAgICBleHRlcm5hbE1lc3NhZ2VPckJ1aWxkZXJMaXN0OworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1aWxkZXIgd2l0aCBhbiBlbXB0eSBsaXN0IG9mIG1lc3NhZ2VzLgorICAgKgorICAgKiBAcGFyYW0gbWVzc2FnZXMgdGhlIGN1cnJlbnQgbGlzdCBvZiBtZXNzYWdlcworICAgKiBAcGFyYW0gaXNNZXNzYWdlc0xpc3RNdXRhYmxlIFdoZXRoZXIgdGhlIG1lc3NhZ2VzIGxpc3QgaXMgbXV0YWJsZQorICAgKiBAcGFyYW0gcGFyZW50IGEgbGlzdGVuZXIgdG8gbm90aWZ5IG9mIGNoYW5nZXMKKyAgICogQHBhcmFtIGlzQ2xlYW4gd2hldGhlciB0aGUgYnVpbGRlciBpcyBpbml0aWFsbHkgbWFya2VkIGNsZWFuCisgICAqLworICBwdWJsaWMgUmVwZWF0ZWRGaWVsZEJ1aWxkZXIoCisgICAgICBMaXN0PE1UeXBlPiBtZXNzYWdlcywKKyAgICAgIGJvb2xlYW4gaXNNZXNzYWdlc0xpc3RNdXRhYmxlLAorICAgICAgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudCwKKyAgICAgIGJvb2xlYW4gaXNDbGVhbikgeworICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlczsKKyAgICB0aGlzLmlzTWVzc2FnZXNMaXN0TXV0YWJsZSA9IGlzTWVzc2FnZXNMaXN0TXV0YWJsZTsKKyAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICB0aGlzLmlzQ2xlYW4gPSBpc0NsZWFuOworICB9CisKKyAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAvLyBOdWxsIG91dCBwYXJlbnQgc28gd2Ugc3RvcCBzZW5kaW5nIGl0IGludmFsaWRhdGlvbnMuCisgICAgcGFyZW50ID0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBFbnN1cmVzIHRoYXQgdGhlIGxpc3Qgb2YgbWVzc2FnZXMgaXMgbXV0YWJsZSBzbyBpdCBjYW4gYmUgdXBkYXRlZC4gSWYgaXQncworICAgKiBpbW11dGFibGUsIGEgY29weSBpcyBtYWRlLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpIHsKKyAgICBpZiAoIWlzTWVzc2FnZXNMaXN0TXV0YWJsZSkgeworICAgICAgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PE1UeXBlPihtZXNzYWdlcyk7CisgICAgICBpc01lc3NhZ2VzTGlzdE11dGFibGUgPSB0cnVlOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBFbnN1cmVzIHRoYXQgdGhlIGxpc3Qgb2YgYnVpbGRlcnMgaXMgbm90IG51bGwuIElmIGl0J3MgbnVsbCwgdGhlIGxpc3QgaXMKKyAgICogY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdG8gYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWVzc2FnZXMgbGlzdCB3aXRoCisgICAqIG51bGwgZW50cmllcy4KKyAgICovCisgIHByaXZhdGUgdm9pZCBlbnN1cmVCdWlsZGVycygpIHsKKyAgICBpZiAodGhpcy5idWlsZGVycyA9PSBudWxsKSB7CisgICAgICB0aGlzLmJ1aWxkZXJzID0KKyAgICAgICAgICBuZXcgQXJyYXlMaXN0PFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPj4oCisgICAgICAgICAgICAgIG1lc3NhZ2VzLnNpemUoKSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGJ1aWxkZXJzLmFkZChudWxsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0cyB0aGUgY291bnQgb2YgaXRlbXMgaW4gdGhlIGxpc3QuCisgICAqCisgICAqIEByZXR1cm4gdGhlIGNvdW50IG9mIGl0ZW1zIGluIHRoZSBsaXN0LgorICAgKi8KKyAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICByZXR1cm4gbWVzc2FnZXMuc2l6ZSgpOworICB9CisKKyAgLyoqCisgICAqIEdldHMgd2hldGhlciB0aGUgbGlzdCBpcyBlbXB0eS4KKyAgICoKKyAgICogQHJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGlzIGVtcHR5CisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgIHJldHVybiBtZXNzYWdlcy5pc0VtcHR5KCk7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBtZXNzYWdlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguIElmIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSBzdG9yZWQKKyAgICogYXMgYSA8Y29kZT5CdWlsZGVyPC9jb2RlPiwgaXQgaXMgY29udmVydGVkIHRvIGEgPGNvZGU+TWVzc2FnZTwvY29kZT4gYnkKKyAgICogY2FsbGluZyB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2J1aWxkUGFydGlhbH0gb24gaXQuCisgICAqCisgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0CisgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgaW5kZXgKKyAgICovCisgIHB1YmxpYyBNVHlwZSBnZXRNZXNzYWdlKGludCBpbmRleCkgeworICAgIHJldHVybiBnZXRNZXNzYWdlKGluZGV4LCBmYWxzZSk7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBtZXNzYWdlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguIElmIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSBzdG9yZWQKKyAgICogYXMgYSA8Y29kZT5CdWlsZGVyPC9jb2RlPiwgaXQgaXMgY29udmVydGVkIHRvIGEgPGNvZGU+TWVzc2FnZTwvY29kZT4gYnkKKyAgICogY2FsbGluZyB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2J1aWxkUGFydGlhbH0gb24gaXQuCisgICAqCisgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0CisgICAqIEBwYXJhbSBmb3JCdWlsZCB0aGlzIGlzIGJlaW5nIGNhbGxlZCBmb3IgYnVpbGQgc28gd2Ugd2FudCB0byBtYWtlIHN1cmUKKyAgICogICAgIHdlIFNpbmdsZUZpZWxkQnVpbGRlci5idWlsZCB0byBzZW5kIGRpcnR5IGludmFsaWRhdGlvbnMKKyAgICogQHJldHVybiB0aGUgbWVzc2FnZSBmb3IgdGhlIHNwZWNpZmllZCBpbmRleAorICAgKi8KKyAgcHJpdmF0ZSBNVHlwZSBnZXRNZXNzYWdlKGludCBpbmRleCwgYm9vbGVhbiBmb3JCdWlsZCkgeworICAgIGlmICh0aGlzLmJ1aWxkZXJzID09IG51bGwpIHsKKyAgICAgIC8vIFdlIGRvbid0IGhhdmUgYW55IGJ1aWxkZXJzIC0tIHJldHVybiB0aGUgY3VycmVudCBNZXNzYWdlLgorICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBubyBidWlsZGVyIHdhcyBjcmVhdGVkLCBzbyB3ZSBNVVNUIGhhdmUgYQorICAgICAgLy8gTWVzc2FnZS4KKyAgICAgIHJldHVybiBtZXNzYWdlcy5nZXQoaW5kZXgpOworICAgIH0KKworICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyID0gYnVpbGRlcnMuZ2V0KGluZGV4KTsKKyAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAvLyBXZSBkb24ndCBoYXZlIGEgYnVpbGRlciAtLSByZXR1cm4gdGhlIGN1cnJlbnQgbWVzc2FnZS4KKyAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgbm8gYnVpbGRlciB3YXMgY3JlYXRlZCBmb3IgdGhlIGVudHJ5IGF0IGluZGV4LAorICAgICAgLy8gc28gd2UgTVVTVCBoYXZlIGEgbWVzc2FnZS4KKyAgICAgIHJldHVybiBtZXNzYWdlcy5nZXQoaW5kZXgpOworCisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmb3JCdWlsZCA/IGJ1aWxkZXIuYnVpbGQoKSA6IGJ1aWxkZXIuZ2V0TWVzc2FnZSgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHZXRzIGEgYnVpbGRlciBmb3IgdGhlIHNwZWNpZmllZCBpbmRleC4gSWYgbm8gYnVpbGRlciBoYXMgYmVlbiBjcmVhdGVkIGZvcgorICAgKiB0aGF0IGluZGV4LCBhIGJ1aWxkZXIgaXMgY3JlYXRlZCBvbiBkZW1hbmQgYnkgY2FsbGluZworICAgKiB7QGxpbmsgTWVzc2FnZSN0b0J1aWxkZXJ9LgorICAgKgorICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBtZXNzYWdlIHRvIGdldAorICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGZvciB0aGF0IGluZGV4CisgICAqLworICBwdWJsaWMgQlR5cGUgZ2V0QnVpbGRlcihpbnQgaW5kZXgpIHsKKyAgICBlbnN1cmVCdWlsZGVycygpOworICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyID0gYnVpbGRlcnMuZ2V0KGluZGV4KTsKKyAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICBNVHlwZSBtZXNzYWdlID0gbWVzc2FnZXMuZ2V0KGluZGV4KTsKKyAgICAgIGJ1aWxkZXIgPSBuZXcgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+KAorICAgICAgICAgIG1lc3NhZ2UsIHRoaXMsIGlzQ2xlYW4pOworICAgICAgYnVpbGRlcnMuc2V0KGluZGV4LCBidWlsZGVyKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QnVpbGRlcigpOworICB9CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGJhc2UgY2xhc3MgaW50ZXJmYWNlIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4LiBUaGlzIG1heSBlaXRoZXIgYmUKKyAgICogYSBidWlsZGVyIG9yIGEgbWVzc2FnZS4gSXQgd2lsbCByZXR1cm4gd2hhdGV2ZXIgaXMgbW9yZSBlZmZpY2llbnQuCisgICAqCisgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0CisgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugb3IgYnVpbGRlciBmb3IgdGhlIGluZGV4IGFzIHRoZSBiYXNlIGNsYXNzIGludGVyZmFjZQorICAgKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyBJVHlwZSBnZXRNZXNzYWdlT3JCdWlsZGVyKGludCBpbmRleCkgeworICAgIGlmICh0aGlzLmJ1aWxkZXJzID09IG51bGwpIHsKKyAgICAgIC8vIFdlIGRvbid0IGhhdmUgYW55IGJ1aWxkZXJzIC0tIHJldHVybiB0aGUgY3VycmVudCBNZXNzYWdlLgorICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBubyBidWlsZGVyIHdhcyBjcmVhdGVkLCBzbyB3ZSBNVVNUIGhhdmUgYQorICAgICAgLy8gTWVzc2FnZS4KKyAgICAgIHJldHVybiAoSVR5cGUpIG1lc3NhZ2VzLmdldChpbmRleCk7CisgICAgfQorCisgICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIgPSBidWlsZGVycy5nZXQoaW5kZXgpOworICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSBidWlsZGVyIC0tIHJldHVybiB0aGUgY3VycmVudCBtZXNzYWdlLgorICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBubyBidWlsZGVyIHdhcyBjcmVhdGVkIGZvciB0aGUgZW50cnkgYXQgaW5kZXgsCisgICAgICAvLyBzbyB3ZSBNVVNUIGhhdmUgYSBtZXNzYWdlLgorICAgICAgcmV0dXJuIChJVHlwZSkgbWVzc2FnZXMuZ2V0KGluZGV4KTsKKworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gYnVpbGRlci5nZXRNZXNzYWdlT3JCdWlsZGVyKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNldHMgYSAgbWVzc2FnZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHJlcGxhY2luZyB0aGUgZXhpc3RpbmcgaXRlbSBhdAorICAgKiB0aGF0IGluZGV4LgorICAgKgorICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IHRvIHNldC4KKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gc2V0CisgICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIKKyAgICovCisgIHB1YmxpYyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBzZXRNZXNzYWdlKAorICAgICAgaW50IGluZGV4LCBNVHlwZSBtZXNzYWdlKSB7CisgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOworICAgIG1lc3NhZ2VzLnNldChpbmRleCwgbWVzc2FnZSk7CisgICAgaWYgKGJ1aWxkZXJzICE9IG51bGwpIHsKKyAgICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBlbnRyeSA9CisgICAgICAgICAgYnVpbGRlcnMuc2V0KGluZGV4LCBudWxsKTsKKyAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgIGVudHJ5LmRpc3Bvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgICAgb25DaGFuZ2VkKCk7CisgICAgaW5jcmVtZW50TW9kQ291bnRzKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQXBwZW5kcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGxpc3QuCisgICAqCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGFkZAorICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCisgICAqLworICBwdWJsaWMgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYWRkTWVzc2FnZSgKKyAgICAgIE1UeXBlIG1lc3NhZ2UpIHsKKyAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7CisgICAgbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOworICAgIGlmIChidWlsZGVycyAhPSBudWxsKSB7CisgICAgICBidWlsZGVycy5hZGQobnVsbCk7CisgICAgfQorICAgIG9uQ2hhbmdlZCgpOworICAgIGluY3JlbWVudE1vZENvdW50cygpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LgorICAgKiBTaGlmdHMgdGhlIGVsZW1lbnQgY3VycmVudGx5IGF0IHRoYXQgcG9zaXRpb24gKGlmIGFueSkgYW5kIGFueSBzdWJzZXF1ZW50CisgICAqIGVsZW1lbnRzIHRvIHRoZSByaWdodCAoYWRkcyBvbmUgdG8gdGhlaXIgaW5kaWNlcykuCisgICAqCisgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBtZXNzYWdlCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGFkZAorICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCisgICAqLworICBwdWJsaWMgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYWRkTWVzc2FnZSgKKyAgICAgIGludCBpbmRleCwgTVR5cGUgbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKyAgICBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKTsKKyAgICBtZXNzYWdlcy5hZGQoaW5kZXgsIG1lc3NhZ2UpOworICAgIGlmIChidWlsZGVycyAhPSBudWxsKSB7CisgICAgICBidWlsZGVycy5hZGQoaW5kZXgsIG51bGwpOworICAgIH0KKyAgICBvbkNoYW5nZWQoKTsKKyAgICBpbmNyZW1lbnRNb2RDb3VudHMoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBBcHBlbmRzIGFsbCBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRvIHRoZSBlbmQgb2YKKyAgICogdGhpcyBsaXN0LCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkCisgICAqIGNvbGxlY3Rpb24ncyBpdGVyYXRvci4KKyAgICoKKyAgICogQHBhcmFtIHZhbHVlcyB0aGUgbWVzc2FnZXMgdG8gYWRkCisgICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIKKyAgICovCisgIHB1YmxpYyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBhZGRBbGxNZXNzYWdlcygKKyAgICAgIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNVHlwZT4gdmFsdWVzKSB7CisgICAgZm9yIChmaW5hbCBNVHlwZSB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgfQorICAgIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgZmluYWwKKyAgICAgIENvbGxlY3Rpb248TVR5cGU+IGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbjxNVHlwZT4pIHZhbHVlczsKKyAgICAgIGlmIChjb2xsZWN0aW9uLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7CisgICAgICBmb3IgKE1UeXBlIHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgIGFkZE1lc3NhZ2UodmFsdWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKTsKKyAgICAgIGZvciAoTVR5cGUgdmFsdWUgOiB2YWx1ZXMpIHsKKyAgICAgICAgYWRkTWVzc2FnZSh2YWx1ZSk7CisgICAgICB9CisgICAgfQorICAgIG9uQ2hhbmdlZCgpOworICAgIGluY3JlbWVudE1vZENvdW50cygpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIEFwcGVuZHMgYSBuZXcgYnVpbGRlciB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdCBhbmQgcmV0dXJucyB0aGUgYnVpbGRlci4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYWRkIHdoaWNoIGlzIHRoZSBiYXNpcyBvZiB0aGUgYnVpbGRlcgorICAgKiBAcmV0dXJuIHRoZSBuZXcgYnVpbGRlcgorICAgKi8KKyAgcHVibGljIEJUeXBlIGFkZEJ1aWxkZXIoTVR5cGUgbWVzc2FnZSkgeworICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOworICAgIGVuc3VyZUJ1aWxkZXJzKCk7CisgICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIgPQorICAgICAgICBuZXcgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+KAorICAgICAgICAgICAgbWVzc2FnZSwgdGhpcywgaXNDbGVhbik7CisgICAgbWVzc2FnZXMuYWRkKG51bGwpOworICAgIGJ1aWxkZXJzLmFkZChidWlsZGVyKTsKKyAgICBvbkNoYW5nZWQoKTsKKyAgICBpbmNyZW1lbnRNb2RDb3VudHMoKTsKKyAgICByZXR1cm4gYnVpbGRlci5nZXRCdWlsZGVyKCk7CisgIH0KKworICAvKioKKyAgICogSW5zZXJ0cyBhIG5ldyBidWlsZGVyIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LgorICAgKiBTaGlmdHMgdGhlIGVsZW1lbnQgY3VycmVudGx5IGF0IHRoYXQgcG9zaXRpb24gKGlmIGFueSkgYW5kIGFueSBzdWJzZXF1ZW50CisgICAqIGVsZW1lbnRzIHRvIHRoZSByaWdodCAoYWRkcyBvbmUgdG8gdGhlaXIgaW5kaWNlcykuCisgICAqCisgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBidWlsZGVyCisgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGFkZCB3aGljaCBpcyB0aGUgYmFzaXMgb2YgdGhlIGJ1aWxkZXIKKyAgICogQHJldHVybiB0aGUgYnVpbGRlcgorICAgKi8KKyAgcHVibGljIEJUeXBlIGFkZEJ1aWxkZXIoaW50IGluZGV4LCBNVHlwZSBtZXNzYWdlKSB7CisgICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7CisgICAgZW5zdXJlQnVpbGRlcnMoKTsKKyAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlciA9CisgICAgICAgIG5ldyBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4oCisgICAgICAgICAgICBtZXNzYWdlLCB0aGlzLCBpc0NsZWFuKTsKKyAgICBtZXNzYWdlcy5hZGQoaW5kZXgsIG51bGwpOworICAgIGJ1aWxkZXJzLmFkZChpbmRleCwgYnVpbGRlcik7CisgICAgb25DaGFuZ2VkKCk7CisgICAgaW5jcmVtZW50TW9kQ291bnRzKCk7CisgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QnVpbGRlcigpOworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZXMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuIFNoaWZ0cyBhbnkKKyAgICogc3Vic2VxdWVudCBlbGVtZW50cyB0byB0aGUgbGVmdCAoc3VidHJhY3RzIG9uZSBmcm9tIHRoZWlyIGluZGljZXMpLgorICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHRoYXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KKyAgICoKKyAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBhdCB3aGljaCB0byByZW1vdmUgdGhlIG1lc3NhZ2UKKyAgICovCisgIHB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKKyAgICBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKTsKKyAgICBtZXNzYWdlcy5yZW1vdmUoaW5kZXgpOworICAgIGlmIChidWlsZGVycyAhPSBudWxsKSB7CisgICAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gZW50cnkgPQorICAgICAgICAgIGJ1aWxkZXJzLnJlbW92ZShpbmRleCk7CisgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgeworICAgICAgICBlbnRyeS5kaXNwb3NlKCk7CisgICAgICB9CisgICAgfQorICAgIG9uQ2hhbmdlZCgpOworICAgIGluY3JlbWVudE1vZENvdW50cygpOworICB9CisKKyAgLyoqCisgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgbGlzdC4KKyAgICogVGhlIGxpc3Qgd2lsbCBiZSBlbXB0eSBhZnRlciB0aGlzIGNhbGwgcmV0dXJucy4KKyAgICovCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIG1lc3NhZ2VzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgaXNNZXNzYWdlc0xpc3RNdXRhYmxlID0gZmFsc2U7CisgICAgaWYgKGJ1aWxkZXJzICE9IG51bGwpIHsKKyAgICAgIGZvciAoU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGVudHJ5IDoKKyAgICAgICAgICBidWlsZGVycykgeworICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgeworICAgICAgICAgIGVudHJ5LmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnVpbGRlcnMgPSBudWxsOworICAgIH0KKyAgICBvbkNoYW5nZWQoKTsKKyAgICBpbmNyZW1lbnRNb2RDb3VudHMoKTsKKyAgfQorCisgIC8qKgorICAgKiBCdWlsZHMgdGhlIGxpc3Qgb2YgbWVzc2FnZXMgZnJvbSB0aGUgYnVpbGRlciBhbmQgcmV0dXJucyB0aGVtLgorICAgKgorICAgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBsaXN0IG9mIG1lc3NhZ2VzCisgICAqLworICBwdWJsaWMgTGlzdDxNVHlwZT4gYnVpbGQoKSB7CisgICAgLy8gTm93IHRoYXQgYnVpbGQgaGFzIGJlZW4gY2FsbGVkLCB3ZSBhcmUgcmVxdWlyZWQgdG8gZGlzcGF0Y2gKKyAgICAvLyBpbnZhbGlkYXRpb25zLgorICAgIGlzQ2xlYW4gPSB0cnVlOworCisgICAgaWYgKCFpc01lc3NhZ2VzTGlzdE11dGFibGUgJiYgYnVpbGRlcnMgPT0gbnVsbCkgeworICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSBhbiBpbW11dGFibGUgbGlzdCBhbmQgd2UgbmV2ZXIgY3JlYXRlZCBhIGJ1aWxkZXIuCisgICAgICByZXR1cm4gbWVzc2FnZXM7CisgICAgfQorCisgICAgYm9vbGVhbiBhbGxNZXNzYWdlc0luU3luYyA9IHRydWU7CisgICAgaWYgKCFpc01lc3NhZ2VzTGlzdE11dGFibGUpIHsKKyAgICAgIC8vIFdlIHN0aWxsIGhhdmUgYW4gaW1tdXRhYmxlIGxpc3QuIExldCdzIHNlZSBpZiBhbnkgb2YgdGhlbSBhcmUgb3V0CisgICAgICAvLyBvZiBzeW5jIHdpdGggdGhlaXIgYnVpbGRlcnMuCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VzLmdldChpKTsKKyAgICAgICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIgPSBidWlsZGVycy5nZXQoaSk7CisgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKKyAgICAgICAgICBpZiAoYnVpbGRlci5idWlsZCgpICE9IG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGFsbE1lc3NhZ2VzSW5TeW5jID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChhbGxNZXNzYWdlc0luU3luYykgeworICAgICAgICAvLyBJbW11dGFibGUgbGlzdCBpcyBzdGlsbCBpbiBzeW5jLgorICAgICAgICByZXR1cm4gbWVzc2FnZXM7CisgICAgICB9CisgICAgfQorCisgICAgLy8gTmVlZCB0byBtYWtlIHN1cmUgbWVzc2FnZXMgaXMgdXAgdG8gZGF0ZQorICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIG1lc3NhZ2VzLnNldChpLCBnZXRNZXNzYWdlKGksIHRydWUpKTsKKyAgICB9CisKKyAgICAvLyBXZSdyZSBnb2luZyB0byByZXR1cm4gb3VyIGxpc3QgYXMgaW1tdXRhYmxlIHNvIHdlIG1hcmsgdGhhdCB3ZSBjYW4KKyAgICAvLyBubyBsb25nZXIgdXBkYXRlIGl0LgorICAgIG1lc3NhZ2VzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtZXNzYWdlcyk7CisgICAgaXNNZXNzYWdlc0xpc3RNdXRhYmxlID0gZmFsc2U7CisgICAgcmV0dXJuIG1lc3NhZ2VzOworICB9CisKKyAgLyoqCisgICAqIEdldHMgYSB2aWV3IG9mIHRoZSBidWlsZGVyIGFzIGEgbGlzdCBvZiBtZXNzYWdlcy4gVGhlIHJldHVybmVkIGxpc3QgaXMgbGl2ZQorICAgKiBhbmQgd2lsbCByZWZsZWN0IGFueSBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGJ1aWxkZXIuCisgICAqCisgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2VzIGluIHRoZSBsaXN0CisgICAqLworICBwdWJsaWMgTGlzdDxNVHlwZT4gZ2V0TWVzc2FnZUxpc3QoKSB7CisgICAgaWYgKGV4dGVybmFsTWVzc2FnZUxpc3QgPT0gbnVsbCkgeworICAgICAgZXh0ZXJuYWxNZXNzYWdlTGlzdCA9CisgICAgICAgICAgbmV3IE1lc3NhZ2VFeHRlcm5hbExpc3Q8TVR5cGUsIEJUeXBlLCBJVHlwZT4odGhpcyk7CisgICAgfQorICAgIHJldHVybiBleHRlcm5hbE1lc3NhZ2VMaXN0OworICB9CisKKyAgLyoqCisgICAqIEdldHMgYSB2aWV3IG9mIHRoZSBidWlsZGVyIGFzIGEgbGlzdCBvZiBidWlsZGVycy4gVGhpcyByZXR1cm5lZCBsaXN0IGlzCisgICAqIGxpdmUgYW5kIHdpbGwgcmVmbGVjdCBhbnkgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBidWlsZGVyLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBidWlsZGVycyBpbiB0aGUgbGlzdAorICAgKi8KKyAgcHVibGljIExpc3Q8QlR5cGU+IGdldEJ1aWxkZXJMaXN0KCkgeworICAgIGlmIChleHRlcm5hbEJ1aWxkZXJMaXN0ID09IG51bGwpIHsKKyAgICAgIGV4dGVybmFsQnVpbGRlckxpc3QgPQorICAgICAgICAgIG5ldyBCdWlsZGVyRXh0ZXJuYWxMaXN0PE1UeXBlLCBCVHlwZSwgSVR5cGU+KHRoaXMpOworICAgIH0KKyAgICByZXR1cm4gZXh0ZXJuYWxCdWlsZGVyTGlzdDsKKyAgfQorCisgIC8qKgorICAgKiBHZXRzIGEgdmlldyBvZiB0aGUgYnVpbGRlciBhcyBhIGxpc3Qgb2YgTWVzc2FnZU9yQnVpbGRlcnMuIFRoaXMgcmV0dXJuZWQKKyAgICogbGlzdCBpcyBsaXZlIGFuZCB3aWxsIHJlZmxlY3QgYW55IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgYnVpbGRlci4KKyAgICoKKyAgICogQHJldHVybiB0aGUgYnVpbGRlcnMgaW4gdGhlIGxpc3QKKyAgICovCisgIHB1YmxpYyBMaXN0PElUeXBlPiBnZXRNZXNzYWdlT3JCdWlsZGVyTGlzdCgpIHsKKyAgICBpZiAoZXh0ZXJuYWxNZXNzYWdlT3JCdWlsZGVyTGlzdCA9PSBudWxsKSB7CisgICAgICBleHRlcm5hbE1lc3NhZ2VPckJ1aWxkZXJMaXN0ID0KKyAgICAgICAgICBuZXcgTWVzc2FnZU9yQnVpbGRlckV4dGVybmFsTGlzdDxNVHlwZSwgQlR5cGUsIElUeXBlPih0aGlzKTsKKyAgICB9CisgICAgcmV0dXJuIGV4dGVybmFsTWVzc2FnZU9yQnVpbGRlckxpc3Q7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSB0aGUgYnVpbGRlciBvciBvbmUgb2YgaXRzIG5lc3RlZCBjaGlsZHJlbiBoYXMgY2hhbmdlZAorICAgKiBhbmQgYW55IHBhcmVudCBzaG91bGQgYmUgbm90aWZpZWQgb2YgaXRzIGludmFsaWRhdGlvbi4KKyAgICovCisgIHByaXZhdGUgdm9pZCBvbkNoYW5nZWQoKSB7CisgICAgaWYgKGlzQ2xlYW4gJiYgcGFyZW50ICE9IG51bGwpIHsKKyAgICAgIHBhcmVudC5tYXJrRGlydHkoKTsKKworICAgICAgLy8gRG9uJ3Qga2VlcCBkaXNwYXRjaGluZyBpbnZhbGlkYXRpb25zIHVudGlsIGJ1aWxkIGlzIGNhbGxlZCBhZ2Fpbi4KKyAgICAgIGlzQ2xlYW4gPSBmYWxzZTsKKyAgICB9CisgIH0KKworICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgcHVibGljIHZvaWQgbWFya0RpcnR5KCkgeworICAgIG9uQ2hhbmdlZCgpOworICB9CisKKyAgLyoqCisgICAqIEluY3JlbWVudHMgdGhlIG1vZCBjb3VudHMgc28gdGhhdCBhbiBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGNhbgorICAgKiBiZSB0aHJvd24gaWYgY2FsbGluZyBjb2RlIHRyaWVzIHRvIG1vZGlmeSB0aGUgYnVpbGRlciB3aGlsZSBpdHMgaXRlcmF0aW5nCisgICAqIHRoZSBsaXN0LgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGluY3JlbWVudE1vZENvdW50cygpIHsKKyAgICBpZiAoZXh0ZXJuYWxNZXNzYWdlTGlzdCAhPSBudWxsKSB7CisgICAgICBleHRlcm5hbE1lc3NhZ2VMaXN0LmluY3JlbWVudE1vZENvdW50KCk7CisgICAgfQorICAgIGlmIChleHRlcm5hbEJ1aWxkZXJMaXN0ICE9IG51bGwpIHsKKyAgICAgIGV4dGVybmFsQnVpbGRlckxpc3QuaW5jcmVtZW50TW9kQ291bnQoKTsKKyAgICB9CisgICAgaWYgKGV4dGVybmFsTWVzc2FnZU9yQnVpbGRlckxpc3QgIT0gbnVsbCkgeworICAgICAgZXh0ZXJuYWxNZXNzYWdlT3JCdWlsZGVyTGlzdC5pbmNyZW1lbnRNb2RDb3VudCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQcm92aWRlcyBhIGxpdmUgdmlldyBvZiB0aGUgYnVpbGRlciBhcyBhIGxpc3Qgb2YgbWVzc2FnZXMuCisgICAqCisgICAqIEBwYXJhbSA8TVR5cGU+IHRoZSB0eXBlIG9mIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZAorICAgKiBAcGFyYW0gPEJUeXBlPiB0aGUgdHlwZSBvZiBidWlsZGVyIGZvciB0aGUgZmllbGQKKyAgICogQHBhcmFtIDxJVHlwZT4gdGhlIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHRoZSBtZXNzYWdlIGFuZCB0aGUgYnVpbGRlcgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWVzc2FnZUV4dGVybmFsTGlzdDwKKyAgICAgIE1UeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZSwKKyAgICAgIEJUeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyLAorICAgICAgSVR5cGUgZXh0ZW5kcyBNZXNzYWdlT3JCdWlsZGVyPgorICAgICAgZXh0ZW5kcyBBYnN0cmFjdExpc3Q8TVR5cGU+IGltcGxlbWVudHMgTGlzdDxNVHlwZT4geworCisgICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlcjsKKworICAgIE1lc3NhZ2VFeHRlcm5hbExpc3QoCisgICAgICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIpIHsKKyAgICAgIHRoaXMuYnVpbGRlciA9IGJ1aWxkZXI7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgcmV0dXJuIHRoaXMuYnVpbGRlci5nZXRDb3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyBNVHlwZSBnZXQoaW50IGluZGV4KSB7CisgICAgICByZXR1cm4gYnVpbGRlci5nZXRNZXNzYWdlKGluZGV4KTsKKyAgICB9CisKKyAgICB2b2lkIGluY3JlbWVudE1vZENvdW50KCkgeworICAgICAgbW9kQ291bnQrKzsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUHJvdmlkZXMgYSBsaXZlIHZpZXcgb2YgdGhlIGJ1aWxkZXIgYXMgYSBsaXN0IG9mIGJ1aWxkZXJzLgorICAgKgorICAgKiBAcGFyYW0gPE1UeXBlPiB0aGUgdHlwZSBvZiBtZXNzYWdlIGZvciB0aGUgZmllbGQKKyAgICogQHBhcmFtIDxCVHlwZT4gdGhlIHR5cGUgb2YgYnVpbGRlciBmb3IgdGhlIGZpZWxkCisgICAqIEBwYXJhbSA8SVR5cGU+IHRoZSBjb21tb24gaW50ZXJmYWNlIGZvciB0aGUgbWVzc2FnZSBhbmQgdGhlIGJ1aWxkZXIKKyAgICovCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJ1aWxkZXJFeHRlcm5hbExpc3Q8CisgICAgICBNVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UsCisgICAgICBCVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciwKKyAgICAgIElUeXBlIGV4dGVuZHMgTWVzc2FnZU9yQnVpbGRlcj4KKyAgICAgIGV4dGVuZHMgQWJzdHJhY3RMaXN0PEJUeXBlPiBpbXBsZW1lbnRzIExpc3Q8QlR5cGU+IHsKKworICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXI7CisKKyAgICBCdWlsZGVyRXh0ZXJuYWxMaXN0KAorICAgICAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyKSB7CisgICAgICB0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLmJ1aWxkZXIuZ2V0Q291bnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQlR5cGUgZ2V0KGludCBpbmRleCkgeworICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QnVpbGRlcihpbmRleCk7CisgICAgfQorCisgICAgdm9pZCBpbmNyZW1lbnRNb2RDb3VudCgpIHsKKyAgICAgIG1vZENvdW50Kys7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFByb3ZpZGVzIGEgbGl2ZSB2aWV3IG9mIHRoZSBidWlsZGVyIGFzIGEgbGlzdCBvZiBidWlsZGVycy4KKyAgICoKKyAgICogQHBhcmFtIDxNVHlwZT4gdGhlIHR5cGUgb2YgbWVzc2FnZSBmb3IgdGhlIGZpZWxkCisgICAqIEBwYXJhbSA8QlR5cGU+IHRoZSB0eXBlIG9mIGJ1aWxkZXIgZm9yIHRoZSBmaWVsZAorICAgKiBAcGFyYW0gPElUeXBlPiB0aGUgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlIG1lc3NhZ2UgYW5kIHRoZSBidWlsZGVyCisgICAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNZXNzYWdlT3JCdWlsZGVyRXh0ZXJuYWxMaXN0PAorICAgICAgTVR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLAorICAgICAgQlR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIsCisgICAgICBJVHlwZSBleHRlbmRzIE1lc3NhZ2VPckJ1aWxkZXI+CisgICAgICBleHRlbmRzIEFic3RyYWN0TGlzdDxJVHlwZT4gaW1wbGVtZW50cyBMaXN0PElUeXBlPiB7CisKKyAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyOworCisgICAgTWVzc2FnZU9yQnVpbGRlckV4dGVybmFsTGlzdCgKKyAgICAgICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlcikgeworICAgICAgdGhpcy5idWlsZGVyID0gYnVpbGRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICByZXR1cm4gdGhpcy5idWlsZGVyLmdldENvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIElUeXBlIGdldChpbnQgaW5kZXgpIHsKKyAgICAgIHJldHVybiBidWlsZGVyLmdldE1lc3NhZ2VPckJ1aWxkZXIoaW5kZXgpOworICAgIH0KKworICAgIHZvaWQgaW5jcmVtZW50TW9kQ291bnQoKSB7CisgICAgICBtb2RDb3VudCsrOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NhbGxiYWNrLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQzNWVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NhbGxiYWNrLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgYW4gUlBDIGNhbGxiYWNrLCBub3JtYWxseSBjYWxsZWQgd2hlbiBhbiBSUEMgY29tcGxldGVzLgorICoge0Bjb2RlIFBhcmFtZXRlclR5cGV9IGlzIG5vcm1hbGx5IHRoZSBtZXRob2QncyByZXNwb25zZSBtZXNzYWdlIHR5cGUuCisgKgorICogPHA+U3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIuMy4wLCBSUEMgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3QgdHJ5IHRvIGJ1aWxkCisgKiBvbiB0aGlzLCBidXQgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBjb2RlIGdlbmVyYXRvciBwbHVnaW5zIHdoaWNoIGdlbmVyYXRlCisgKiBjb2RlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIFJQQyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgd2F5IHRoZSBnZW5lcmF0ZWQKKyAqIGNvZGUgY2FuIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UgYW5kIGNhbiBhdm9pZAorICogdW5uZWNlc3NhcnkgbGF5ZXJzIG9mIGluZGlyZWN0aW9uLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUnBjQ2FsbGJhY2s8UGFyYW1ldGVyVHlwZT4geworICB2b2lkIHJ1bihQYXJhbWV0ZXJUeXBlIHBhcmFtZXRlcik7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ2hhbm5lbC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NoYW5uZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmVjNTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NoYW5uZWwuamF2YQpAQCAtMCwwICsxLDcxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKKy8qKgorICogPHA+QWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhbiBSUEMgY2hhbm5lbC4gIEFuIHtAY29kZSBScGNDaGFubmVsfSByZXByZXNlbnRzIGEKKyAqIGNvbW11bmljYXRpb24gbGluZSB0byBhIHtAbGluayBTZXJ2aWNlfSB3aGljaCBjYW4gYmUgdXNlZCB0byBjYWxsIHRoYXQKKyAqIHtAbGluayBTZXJ2aWNlfSdzIG1ldGhvZHMuICBUaGUge0BsaW5rIFNlcnZpY2V9IG1heSBiZSBydW5uaW5nIG9uIGFub3RoZXIKKyAqIG1hY2hpbmUuICBOb3JtYWxseSwgeW91IHNob3VsZCBub3QgY2FsbCBhbiB7QGNvZGUgUnBjQ2hhbm5lbH0gZGlyZWN0bHksIGJ1dAorICogaW5zdGVhZCBjb25zdHJ1Y3QgYSBzdHViIHtAbGluayBTZXJ2aWNlfSB3cmFwcGluZyBpdC4gIEV4YW1wbGU6CisgKgorICogPHByZT4KKyAqICAgUnBjQ2hhbm5lbCBjaGFubmVsID0gcnBjSW1wbC5uZXdDaGFubmVsKCJyZW1vdGVob3N0LmV4YW1wbGUuY29tOjEyMzQiKTsKKyAqICAgUnBjQ29udHJvbGxlciBjb250cm9sbGVyID0gcnBjSW1wbC5uZXdDb250cm9sbGVyKCk7CisgKiAgIE15U2VydmljZSBzZXJ2aWNlID0gTXlTZXJ2aWNlLm5ld1N0dWIoY2hhbm5lbCk7CisgKiAgIHNlcnZpY2UubXlNZXRob2QoY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spOworICogPC9wcmU+CisgKgorICogPHA+U3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIuMy4wLCBSUEMgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3QgdHJ5IHRvIGJ1aWxkCisgKiBvbiB0aGlzLCBidXQgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBjb2RlIGdlbmVyYXRvciBwbHVnaW5zIHdoaWNoIGdlbmVyYXRlCisgKiBjb2RlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIFJQQyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgd2F5IHRoZSBnZW5lcmF0ZWQKKyAqIGNvZGUgY2FuIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UgYW5kIGNhbiBhdm9pZAorICogdW5uZWNlc3NhcnkgbGF5ZXJzIG9mIGluZGlyZWN0aW9uLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUnBjQ2hhbm5lbCB7CisgIC8qKgorICAgKiBDYWxsIHRoZSBnaXZlbiBtZXRob2Qgb2YgdGhlIHJlbW90ZSBzZXJ2aWNlLiAgVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0bworICAgKiB7QGNvZGUgU2VydmljZS5jYWxsTWV0aG9kKCl9IHdpdGggb25lIGltcG9ydGFudCBkaWZmZXJlbmNlOiAgdGhlIGNhbGxlcgorICAgKiBkZWNpZGVzIHRoZSB0eXBlcyBvZiB0aGUge0Bjb2RlIE1lc3NhZ2V9IG9iamVjdHMsIG5vdCB0aGUgY2FsbGVlLiAgVGhlCisgICAqIHJlcXVlc3QgbWF5IGJlIG9mIGFueSB0eXBlIGFzIGxvbmcgYXMKKyAgICoge0Bjb2RlIHJlcXVlc3QuZ2V0RGVzY3JpcHRvcigpID09IG1ldGhvZC5nZXRJbnB1dFR5cGUoKX0uCisgICAqIFRoZSByZXNwb25zZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIHdpbGwgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcworICAgKiB7QGNvZGUgcmVzcG9uc2VQcm90b3R5cGV9ICh3aGljaCBtdXN0IGhhdmUKKyAgICoge0Bjb2RlIGdldERlc2NyaXB0b3IoKSA9PSBtZXRob2QuZ2V0T3V0cHV0VHlwZSgpfSkuCisgICAqLworICB2b2lkIGNhbGxNZXRob2QoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsCisgICAgICAgICAgICAgICAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICBNZXNzYWdlIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICBNZXNzYWdlIHJlc3BvbnNlUHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgUnBjQ2FsbGJhY2s8TWVzc2FnZT4gZG9uZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ29udHJvbGxlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWE1NDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIDxwPkFuIHtAY29kZSBScGNDb250cm9sbGVyfSBtZWRpYXRlcyBhIHNpbmdsZSBtZXRob2QgY2FsbC4gIFRoZSBwcmltYXJ5CisgKiBwdXJwb3NlIG9mIHRoZSBjb250cm9sbGVyIGlzIHRvIHByb3ZpZGUgYSB3YXkgdG8gbWFuaXB1bGF0ZSBzZXR0aW5ncworICogc3BlY2lmaWMgdG8gdGhlIFJQQyBpbXBsZW1lbnRhdGlvbiBhbmQgdG8gZmluZCBvdXQgYWJvdXQgUlBDLWxldmVsIGVycm9ycy4KKyAqCisgKiA8cD5TdGFydGluZyB3aXRoIHZlcnNpb24gMi4zLjAsIFJQQyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCB0cnkgdG8gYnVpbGQKKyAqIG9uIHRoaXMsIGJ1dCBzaG91bGQgaW5zdGVhZCBwcm92aWRlIGNvZGUgZ2VuZXJhdG9yIHBsdWdpbnMgd2hpY2ggZ2VuZXJhdGUKKyAqIGNvZGUgc3BlY2lmaWMgdG8gdGhlIHBhcnRpY3VsYXIgUlBDIGltcGxlbWVudGF0aW9uLiAgVGhpcyB3YXkgdGhlIGdlbmVyYXRlZAorICogY29kZSBjYW4gYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGluIHVzZSBhbmQgY2FuIGF2b2lkCisgKiB1bm5lY2Vzc2FyeSBsYXllcnMgb2YgaW5kaXJlY3Rpb24uCisgKgorICogPHA+VGhlIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIHtAY29kZSBScGNDb250cm9sbGVyfSBpbnRlcmZhY2UgYXJlIGludGVuZGVkCisgKiB0byBiZSBhICJsZWFzdCBjb21tb24gZGVub21pbmF0b3IiIHNldCBvZiBmZWF0dXJlcyB3aGljaCB3ZSBleHBlY3QgYWxsCisgKiBpbXBsZW1lbnRhdGlvbnMgdG8gc3VwcG9ydC4gIFNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZSBtb3JlCisgKiBhZHZhbmNlZCBmZWF0dXJlcyAoZS5nLiBkZWFkbGluZSBwcm9wYWdhdGlvbikuCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGludGVyZmFjZSBScGNDb250cm9sbGVyIHsKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgY2FsbHMgbWF5IGJlIG1hZGUgZnJvbSB0aGUgY2xpZW50IHNpZGUgb25seS4gIFRoZWlyIHJlc3VsdHMKKyAgLy8gYXJlIHVuZGVmaW5lZCBvbiB0aGUgc2VydmVyIHNpZGUgKG1heSB0aHJvdyBSdW50aW1lRXhjZXB0aW9ucykuCisKKyAgLyoqCisgICAqIFJlc2V0cyB0aGUgUnBjQ29udHJvbGxlciB0byBpdHMgaW5pdGlhbCBzdGF0ZSBzbyB0aGF0IGl0IG1heSBiZSByZXVzZWQgaW4KKyAgICogYSBuZXcgY2FsbC4gIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSBjbGllbnQgc2lkZSBvbmx5LiAgSXQgbXVzdCBub3QKKyAgICogYmUgY2FsbGVkIHdoaWxlIGFuIFJQQyBpcyBpbiBwcm9ncmVzcy4KKyAgICovCisgIHZvaWQgcmVzZXQoKTsKKworICAvKioKKyAgICogQWZ0ZXIgYSBjYWxsIGhhcyBmaW5pc2hlZCwgcmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsIGZhaWxlZC4gIFRoZSBwb3NzaWJsZQorICAgKiByZWFzb25zIGZvciBmYWlsdXJlIGRlcGVuZCBvbiB0aGUgUlBDIGltcGxlbWVudGF0aW9uLiAge0Bjb2RlIGZhaWxlZCgpfQorICAgKiBtb3N0IG9ubHkgYmUgY2FsbGVkIG9uIHRoZSBjbGllbnQgc2lkZSwgYW5kIG11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgYQorICAgKiBjYWxsIGhhcyBmaW5pc2hlZC4KKyAgICovCisgIGJvb2xlYW4gZmFpbGVkKCk7CisKKyAgLyoqCisgICAqIElmIHtAY29kZSBmYWlsZWQoKX0gaXMge0Bjb2RlIHRydWV9LCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24KKyAgICogb2YgdGhlIGVycm9yLgorICAgKi8KKyAgU3RyaW5nIGVycm9yVGV4dCgpOworCisgIC8qKgorICAgKiBBZHZpc2VzIHRoZSBSUEMgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhlIFJQQyBjYWxsIGJlCisgICAqIGNhbmNlbGVkLiAgVGhlIFJQQyBzeXN0ZW0gbWF5IGNhbmNlbCBpdCBpbW1lZGlhdGVseSwgbWF5IHdhaXQgYXdoaWxlIGFuZAorICAgKiB0aGVuIGNhbmNlbCBpdCwgb3IgbWF5IG5vdCBldmVuIGNhbmNlbCB0aGUgY2FsbCBhdCBhbGwuICBJZiB0aGUgY2FsbCBpcworICAgKiBjYW5jZWxlZCwgdGhlICJkb25lIiBjYWxsYmFjayB3aWxsIHN0aWxsIGJlIGNhbGxlZCBhbmQgdGhlIFJwY0NvbnRyb2xsZXIKKyAgICogd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsIGZhaWxlZCBhdCB0aGF0IHRpbWUuCisgICAqLworICB2b2lkIHN0YXJ0Q2FuY2VsKCk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgY2FsbHMgbWF5IGJlIG1hZGUgZnJvbSB0aGUgc2VydmVyIHNpZGUgb25seS4gIFRoZWlyIHJlc3VsdHMKKyAgLy8gYXJlIHVuZGVmaW5lZCBvbiB0aGUgY2xpZW50IHNpZGUgKG1heSB0aHJvdyBSdW50aW1lRXhjZXB0aW9ucykuCisKKyAgLyoqCisgICAqIENhdXNlcyB7QGNvZGUgZmFpbGVkKCl9IHRvIHJldHVybiB0cnVlIG9uIHRoZSBjbGllbnQgc2lkZS4gIHtAY29kZSByZWFzb259CisgICAqIHdpbGwgYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG1lc3NhZ2UgcmV0dXJuZWQgYnkge0Bjb2RlIGVycm9yVGV4dCgpfS4KKyAgICogSWYgeW91IGZpbmQgeW91IG5lZWQgdG8gcmV0dXJuIG1hY2hpbmUtcmVhZGFibGUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICogZmFpbHVyZXMsIHlvdSBzaG91bGQgaW5jb3Jwb3JhdGUgaXQgaW50byB5b3VyIHJlc3BvbnNlIHByb3RvY29sIGJ1ZmZlcgorICAgKiBhbmQgc2hvdWxkIE5PVCBjYWxsIHtAY29kZSBzZXRGYWlsZWQoKX0uCisgICAqLworICB2b2lkIHNldEZhaWxlZChTdHJpbmcgcmVhc29uKTsKKworICAvKioKKyAgICogSWYge0Bjb2RlIHRydWV9LCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50IGNhbmNlbGVkIHRoZSBSUEMsIHNvIHRoZSBzZXJ2ZXIKKyAgICogbWF5IGFzIHdlbGwgZ2l2ZSB1cCBvbiByZXBseWluZyB0byBpdC4gIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9uIHRoZQorICAgKiBzZXJ2ZXIgc2lkZSBvbmx5LiAgVGhlIHNlcnZlciBzaG91bGQgc3RpbGwgY2FsbCB0aGUgZmluYWwgImRvbmUiIGNhbGxiYWNrLgorICAgKi8KKyAgYm9vbGVhbiBpc0NhbmNlbGVkKCk7CisKKyAgLyoqCisgICAqIEFza3MgdGhhdCB0aGUgZ2l2ZW4gY2FsbGJhY2sgYmUgY2FsbGVkIHdoZW4gdGhlIFJQQyBpcyBjYW5jZWxlZC4gIFRoZQorICAgKiBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSB7QGNvZGUgbnVsbH0uICBUaGUKKyAgICogY2FsbGJhY2sgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4gIElmIHRoZSBSUEMgY29tcGxldGVzIHdpdGhvdXQKKyAgICogYmVpbmcgY2FuY2VsZWQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhZnRlciBjb21wbGV0aW9uLiAgSWYgdGhlIFJQQworICAgKiBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGVkIHdoZW4gTm90aWZ5T25DYW5jZWwoKSBpcyBjYWxsZWQsIHRoZSBjYWxsYmFjaworICAgKiB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseS4KKyAgICoKKyAgICogPHA+e0Bjb2RlIG5vdGlmeU9uQ2FuY2VsKCl9IG11c3QgYmUgY2FsbGVkIG5vIG1vcmUgdGhhbiBvbmNlIHBlciByZXF1ZXN0LgorICAgKiBJdCBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgc2VydmVyIHNpZGUgb25seS4KKyAgICovCisgIHZvaWQgbm90aWZ5T25DYW5jZWwoUnBjQ2FsbGJhY2s8T2JqZWN0PiBjYWxsYmFjayk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjVXRpbC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWI5NTlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY1V0aWwuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIEdyYWItYmFnIG9mIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBSUENzLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBScGNVdGlsIHsKKyAgcHJpdmF0ZSBScGNVdGlsKCkge30KKworICAvKioKKyAgICogVGFrZSBhbiB7QGNvZGUgUnBjQ2FsbGJhY2s8TWVzc2FnZT59IGFuZCBjb252ZXJ0IGl0IHRvIGFuCisgICAqIHtAY29kZSBScGNDYWxsYmFja30gYWNjZXB0aW5nIGEgc3BlY2lmaWMgbWVzc2FnZSB0eXBlLiAgVGhpcyBpcyBhbHdheXMKKyAgICogdHlwZS1zYWZlIChwYXJhbWV0ZXIgdHlwZSBjb250cmF2YXJpYW5jZSkuCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIHN0YXRpYyA8VHlwZSBleHRlbmRzIE1lc3NhZ2U+IFJwY0NhbGxiYWNrPFR5cGU+CisgIHNwZWNpYWxpemVDYWxsYmFjayhmaW5hbCBScGNDYWxsYmFjazxNZXNzYWdlPiBvcmlnaW5hbENhbGxiYWNrKSB7CisgICAgcmV0dXJuIChScGNDYWxsYmFjazxUeXBlPilvcmlnaW5hbENhbGxiYWNrOworICAgIC8vIFRoZSBhYm92ZSBjYXN0IHdvcmtzLCBidXQgb25seSBkdWUgdG8gdGVjaG5pY2FsIGRldGFpbHMgb2YgdGhlIEphdmEKKyAgICAvLyBpbXBsZW1lbnRhdGlvbi4gIEEgbW9yZSB0aGVvcmV0aWNhbGx5IGNvcnJlY3QgLS0gYnV0IGxlc3MgZWZmaWNpZW50IC0tCisgICAgLy8gaW1wbGVtZW50YXRpb24gd291bGQgYmUgYXMgZm9sbG93czoKKyAgICAvLyAgIHJldHVybiBuZXcgUnBjQ2FsbGJhY2s8VHlwZT4oKSB7CisgICAgLy8gICAgIHB1YmxpYyB2b2lkIHJ1bihUeXBlIHBhcmFtZXRlcikgeworICAgIC8vICAgICAgIG9yaWdpbmFsQ2FsbGJhY2sucnVuKHBhcmFtZXRlcik7CisgICAgLy8gICAgIH0KKyAgICAvLyAgIH07CisgIH0KKworICAvKioKKyAgICogVGFrZSBhbiB7QGNvZGUgUnBjQ2FsbGJhY2t9IGFjY2VwdGluZyBhIHNwZWNpZmljIG1lc3NhZ2UgdHlwZSBhbmQgY29udmVydAorICAgKiBpdCB0byBhbiB7QGNvZGUgUnBjQ2FsbGJhY2s8TWVzc2FnZT59LiAgVGhlIGdlbmVyYWxpemVkIGNhbGxiYWNrIHdpbGwKKyAgICogYWNjZXB0IGFueSBtZXNzYWdlIG9iamVjdCB3aGljaCBoYXMgdGhlIHNhbWUgZGVzY3JpcHRvciwgYW5kIHdpbGwgY29udmVydAorICAgKiBpdCB0byB0aGUgY29ycmVjdCBjbGFzcyBiZWZvcmUgY2FsbGluZyB0aGUgb3JpZ2luYWwgY2FsbGJhY2suICBIb3dldmVyLAorICAgKiBpZiB0aGUgZ2VuZXJhbGl6ZWQgY2FsbGJhY2sgaXMgZ2l2ZW4gYSBtZXNzYWdlIHdpdGggYSBkaWZmZXJlbnQgZGVzY3JpcHRvciwKKyAgICogYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyA8VHlwZSBleHRlbmRzIE1lc3NhZ2U+CisgIFJwY0NhbGxiYWNrPE1lc3NhZ2U+IGdlbmVyYWxpemVDYWxsYmFjaygKKyAgICAgIGZpbmFsIFJwY0NhbGxiYWNrPFR5cGU+IG9yaWdpbmFsQ2FsbGJhY2ssCisgICAgICBmaW5hbCBDbGFzczxUeXBlPiBvcmlnaW5hbENsYXNzLAorICAgICAgZmluYWwgVHlwZSBkZWZhdWx0SW5zdGFuY2UpIHsKKyAgICByZXR1cm4gbmV3IFJwY0NhbGxiYWNrPE1lc3NhZ2U+KCkgeworICAgICAgcHVibGljIHZvaWQgcnVuKGZpbmFsIE1lc3NhZ2UgcGFyYW1ldGVyKSB7CisgICAgICAgIFR5cGUgdHlwZWRQYXJhbWV0ZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdHlwZWRQYXJhbWV0ZXIgPSBvcmlnaW5hbENsYXNzLmNhc3QocGFyYW1ldGVyKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICB0eXBlZFBhcmFtZXRlciA9IGNvcHlBc1R5cGUoZGVmYXVsdEluc3RhbmNlLCBwYXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIG9yaWdpbmFsQ2FsbGJhY2sucnVuKHR5cGVkUGFyYW1ldGVyKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSBvZiB0eXBlICJUeXBlIiB3aGljaCBpcyBhIGNvcHkgb2YgInNvdXJjZSIuICAic291cmNlIgorICAgKiBtdXN0IGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvciBidXQgbWF5IGJlIGEgZGlmZmVyZW50IGNsYXNzIChlLmcuCisgICAqIER5bmFtaWNNZXNzYWdlKS4KKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwcml2YXRlIHN0YXRpYyA8VHlwZSBleHRlbmRzIE1lc3NhZ2U+IFR5cGUgY29weUFzVHlwZSgKKyAgICAgIGZpbmFsIFR5cGUgdHlwZURlZmF1bHRJbnN0YW5jZSwgZmluYWwgTWVzc2FnZSBzb3VyY2UpIHsKKyAgICByZXR1cm4gKFR5cGUpdHlwZURlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKHNvdXJjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBjYWxsYmFjayB3aGljaCBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4gIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IKKyAgICogc2VjdXJpdHksIHdoZW4gcGFzc2luZyBhIGNhbGxiYWNrIHRvIHVudHJ1c3RlZCBjb2RlOiAgbW9zdCBjYWxsYmFja3MgZG8KKyAgICogbm90IGV4cGVjdCB0byBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UsIHNvIGRvaW5nIHNvIG1heSBleHBvc2UgYnVncyBpZiBpdAorICAgKiBpcyBub3QgcHJldmVudGVkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyA8UGFyYW1ldGVyVHlwZT4KKyAgICBScGNDYWxsYmFjazxQYXJhbWV0ZXJUeXBlPiBuZXdPbmVUaW1lQ2FsbGJhY2soCisgICAgICBmaW5hbCBScGNDYWxsYmFjazxQYXJhbWV0ZXJUeXBlPiBvcmlnaW5hbENhbGxiYWNrKSB7CisgICAgcmV0dXJuIG5ldyBScGNDYWxsYmFjazxQYXJhbWV0ZXJUeXBlPigpIHsKKyAgICAgIHByaXZhdGUgYm9vbGVhbiBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7CisKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBQYXJhbWV0ZXJUeXBlIHBhcmFtZXRlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWxyZWFkeUNhbGxlZEV4Y2VwdGlvbigpOworICAgICAgICAgIH0KKyAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG9yaWdpbmFsQ2FsbGJhY2sucnVuKHBhcmFtZXRlcik7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIC8qKgorICAgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYSBvbmUtdGltZSBjYWxsYmFjayBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFscmVhZHlDYWxsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1NDY5NzQxMjc5NTA3ODQ4MjY2TDsKKworICAgIHB1YmxpYyBBbHJlYWR5Q2FsbGVkRXhjZXB0aW9uKCkgeworICAgICAgc3VwZXIoIlRoaXMgUnBjQ2FsbGJhY2sgd2FzIGFscmVhZHkgY2FsbGVkIGFuZCBjYW5ub3QgYmUgY2FsbGVkICIgKworICAgICAgICAgICAgIm11bHRpcGxlIHRpbWVzLiIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2UuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxNTg1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworLyoqCisgKiBBYnN0cmFjdCBiYXNlIGludGVyZmFjZSBmb3IgcHJvdG9jb2wtYnVmZmVyLWJhc2VkIFJQQyBzZXJ2aWNlcy4gIFNlcnZpY2VzCisgKiB0aGVtc2VsdmVzIGFyZSBhYnN0cmFjdCBjbGFzc2VzIChpbXBsZW1lbnRlZCBlaXRoZXIgYnkgc2VydmVycyBvciBhcworICogc3R1YnMpLCBidXQgdGhleSBzdWJjbGFzcyB0aGlzIGJhc2UgaW50ZXJmYWNlLiAgVGhlIG1ldGhvZHMgb2YgdGhpcworICogaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNlcnZpY2Ugd2l0aG91dCBrbm93aW5nCisgKiBpdHMgZXhhY3QgdHlwZSBhdCBjb21waWxlIHRpbWUgKGFuYWxvZ291cyB0byB0aGUgTWVzc2FnZSBpbnRlcmZhY2UpLgorICoKKyAqIDxwPlN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjMuMCwgUlBDIGltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IHRyeSB0byBidWlsZAorICogb24gdGhpcywgYnV0IHNob3VsZCBpbnN0ZWFkIHByb3ZpZGUgY29kZSBnZW5lcmF0b3IgcGx1Z2lucyB3aGljaCBnZW5lcmF0ZQorICogY29kZSBzcGVjaWZpYyB0byB0aGUgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uICBUaGlzIHdheSB0aGUgZ2VuZXJhdGVkCisgKiBjb2RlIGNhbiBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gaW4gdXNlIGFuZCBjYW4gYXZvaWQKKyAqIHVubmVjZXNzYXJ5IGxheWVycyBvZiBpbmRpcmVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UgeworICAvKioKKyAgICogR2V0IHRoZSB7QGNvZGUgU2VydmljZURlc2NyaXB0b3J9IGRlc2NyaWJpbmcgdGhpcyBzZXJ2aWNlIGFuZCBpdHMgbWV0aG9kcy4KKyAgICovCisgIERlc2NyaXB0b3JzLlNlcnZpY2VEZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCk7CisKKyAgLyoqCisgICAqIDxwPkNhbGwgYSBtZXRob2Qgb2YgdGhlIHNlcnZpY2Ugc3BlY2lmaWVkIGJ5IE1ldGhvZERlc2NyaXB0b3IuICBUaGlzIGlzCisgICAqIG5vcm1hbGx5IGltcGxlbWVudGVkIGFzIGEgc2ltcGxlIHtAY29kZSBzd2l0Y2goKX0gdGhhdCBjYWxscyB0aGUgc3RhbmRhcmQKKyAgICogZGVmaW5pdGlvbnMgb2YgdGhlIHNlcnZpY2UncyBtZXRob2RzLgorICAgKgorICAgKiA8cD5QcmVjb25kaXRpb25zOgorICAgKiA8dWw+CisgICAqICAgPGxpPntAY29kZSBtZXRob2QuZ2V0U2VydmljZSgpID09IGdldERlc2NyaXB0b3JGb3JUeXBlKCl9CisgICAqICAgPGxpPntAY29kZSByZXF1ZXN0fSBpcyBvZiB0aGUgZXhhY3Qgc2FtZSBjbGFzcyBhcyB0aGUgb2JqZWN0IHJldHVybmVkIGJ5CisgICAqICAgICAgIHtAY29kZSBnZXRSZXF1ZXN0UHJvdG90eXBlKG1ldGhvZCl9LgorICAgKiAgIDxsaT57QGNvZGUgY29udHJvbGxlcn0gaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhlIFJQQyBpbXBsZW1lbnRhdGlvbgorICAgKiAgICAgICBiZWluZyB1c2VkIGJ5IHRoaXMgU2VydmljZS4gIEZvciBzdHVicywgdGhlICJjb3JyZWN0IHR5cGUiIGRlcGVuZHMKKyAgICogICAgICAgb24gdGhlIFJwY0NoYW5uZWwgd2hpY2ggdGhlIHN0dWIgaXMgdXNpbmcuICBTZXJ2ZXItc2lkZSBTZXJ2aWNlCisgICAqICAgICAgIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYWNjZXB0IHdoYXRldmVyIHR5cGUgb2YKKyAgICogICAgICAge0Bjb2RlIFJwY0NvbnRyb2xsZXJ9IHRoZSBzZXJ2ZXItc2lkZSBSUEMgaW1wbGVtZW50YXRpb24gdXNlcy4KKyAgICogPC91bD4KKyAgICoKKyAgICogPHA+UG9zdGNvbmRpdGlvbnM6CisgICAqIDx1bD4KKyAgICogICA8bGk+e0Bjb2RlIGRvbmV9IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1ldGhvZCBpcyBjb21wbGV0ZS4gIFRoaXMgbWF5IGJlCisgICAqICAgICAgIGJlZm9yZSB7QGNvZGUgY2FsbE1ldGhvZCgpfSByZXR1cm5zIG9yIGl0IG1heSBiZSBhdCBzb21lIHBvaW50IGluCisgICAqICAgICAgIHRoZSBmdXR1cmUuCisgICAqICAgPGxpPlRoZSBwYXJhbWV0ZXIgdG8ge0Bjb2RlIGRvbmV9IGlzIHRoZSByZXNwb25zZS4gIEl0IG11c3QgYmUgb2YgdGhlCisgICAqICAgICAgIGV4YWN0IHNhbWUgdHlwZSBhcyB3b3VsZCBiZSByZXR1cm5lZCBieQorICAgKiAgICAgICB7QGNvZGUgZ2V0UmVzcG9uc2VQcm90b3R5cGUobWV0aG9kKX0uCisgICAqICAgPGxpPklmIHRoZSBSUEMgZmFpbGVkLCB0aGUgcGFyYW1ldGVyIHRvIHtAY29kZSBkb25lfSB3aWxsIGJlCisgICAqICAgICAgIHtAY29kZSBudWxsfS4gIEZ1cnRoZXIgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZSBjYW4gYmUgZm91bmQgYnkKKyAgICogICAgICAgcXVlcnlpbmcge0Bjb2RlIGNvbnRyb2xsZXJ9LgorICAgKiA8L3VsPgorICAgKi8KKyAgdm9pZCBjYWxsTWV0aG9kKERlc2NyaXB0b3JzLk1ldGhvZERlc2NyaXB0b3IgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgUnBjQ29udHJvbGxlciBjb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgTWVzc2FnZSByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgUnBjQ2FsbGJhY2s8TWVzc2FnZT4gZG9uZSk7CisKKyAgLyoqCisgICAqIDxwPntAY29kZSBjYWxsTWV0aG9kKCl9IHJlcXVpcmVzIHRoYXQgdGhlIHJlcXVlc3QgcGFzc2VkIGluIGlzIG9mIGEKKyAgICogcGFydGljdWxhciBzdWJjbGFzcyBvZiB7QGNvZGUgTWVzc2FnZX0uICB7QGNvZGUgZ2V0UmVxdWVzdFByb3RvdHlwZSgpfQorICAgKiBnZXRzIHRoZSBkZWZhdWx0IGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgZm9yIGEgZ2l2ZW4gbWV0aG9kLiAgWW91IGNhbiB0aGVuCisgICAqIGNhbGwge0Bjb2RlIE1lc3NhZ2UubmV3QnVpbGRlckZvclR5cGUoKX0gb24gdGhpcyBpbnN0YW5jZSB0bworICAgKiBjb25zdHJ1Y3QgYSBidWlsZGVyIHRvIGJ1aWxkIGFuIG9iamVjdCB3aGljaCB5b3UgY2FuIHRoZW4gcGFzcyB0bworICAgKiB7QGNvZGUgY2FsbE1ldGhvZCgpfS4KKyAgICoKKyAgICogPHA+RXhhbXBsZToKKyAgICogPHByZT4KKyAgICogICBNZXRob2REZXNjcmlwdG9yIG1ldGhvZCA9CisgICAqICAgICBzZXJ2aWNlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7CisgICAqICAgTWVzc2FnZSByZXF1ZXN0ID0KKyAgICogICAgIHN0dWIuZ2V0UmVxdWVzdFByb3RvdHlwZShtZXRob2QpLm5ld0J1aWxkZXJGb3JUeXBlKCkKKyAgICogICAgICAgICAubWVyZ2VGcm9tKGlucHV0KS5idWlsZCgpOworICAgKiAgIHNlcnZpY2UuY2FsbE1ldGhvZChtZXRob2QsIHJlcXVlc3QsIGNhbGxiYWNrKTsKKyAgICogPC9wcmU+CisgICAqLworICBNZXNzYWdlIGdldFJlcXVlc3RQcm90b3R5cGUoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpOworCisgIC8qKgorICAgKiBMaWtlIHtAY29kZSBnZXRSZXF1ZXN0UHJvdG90eXBlKCl9LCBidXQgZ2V0cyBhIHByb3RvdHlwZSBvZiB0aGUgcmVzcG9uc2UKKyAgICogbWVzc2FnZS4gIHtAY29kZSBnZXRSZXNwb25zZVByb3RvdHlwZSgpfSBpcyBnZW5lcmFsbHkgbm90IG5lZWRlZCBiZWNhdXNlCisgICAqIHRoZSB7QGNvZGUgU2VydmljZX0gaW1wbGVtZW50YXRpb24gY29uc3RydWN0cyB0aGUgcmVzcG9uc2UgbWVzc2FnZSBpdHNlbGYsCisgICAqIGJ1dCBpdCBtYXkgYmUgdXNlZnVsIGluIHNvbWUgY2FzZXMgdG8ga25vdyBhaGVhZCBvZiB0aW1lIHdoYXQgdHlwZSBvZgorICAgKiBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4KKyAgICovCisgIE1lc3NhZ2UgZ2V0UmVzcG9uc2VQcm90b3R5cGUoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2VFeGNlcHRpb24uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlNjY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIFRocm93biBieSBibG9ja2luZyBSUEMgbWV0aG9kcyB3aGVuIGEgZmFpbHVyZSBvY2N1cnMuCisgKgorICogQGF1dGhvciBjcG92aXJrQGdvb2dsZS5jb20gKENocmlzIFBvdmlyaykKKyAqLworcHVibGljIGNsYXNzIFNlcnZpY2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTIxOTI2MjMzNTcyOTg5MTkyMEw7CisKKyAgcHVibGljIFNlcnZpY2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyBTZXJ2aWNlRXhjZXB0aW9uKGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgfQorCisgIHB1YmxpYyBTZXJ2aWNlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TaW5nbGVGaWVsZEJ1aWxkZXIuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TaW5nbGVGaWVsZEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQ3NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NpbmdsZUZpZWxkQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKKy8qKgorICogPGNvZGU+U2luZ2xlRmllbGRCdWlsZGVyPC9jb2RlPiBpbXBsZW1lbnRzIGEgc3RydWN0dXJlIHRoYXQgYSBwcm90b2NvbAorICogbWVzc2FnZSB1c2VzIHRvIGhvbGQgYSBzaW5nbGUgZmllbGQgb2YgYW5vdGhlciBwcm90b2NvbCBtZXNzYWdlLiBJdCBzdXBwb3J0cworICogdGhlIGNsYXNzaWNhbCB1c2UgY2FzZSBvZiBzZXR0aW5nIGFuIGltbXV0YWJsZSB7QGxpbmsgTWVzc2FnZX0gYXMgdGhlIHZhbHVlCisgKiBvZiB0aGUgZmllbGQgYW5kIGlzIGhpZ2hseSBvcHRpbWl6ZWQgYXJvdW5kIHRoaXMuCisgKiA8YnI+CisgKiBJdCBhbHNvIHN1cHBvcnRzIHRoZSBhZGRpdGlvbmFsIHVzZSBjYXNlIG9mIHNldHRpbmcgYSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfQorICogYXMgdGhlIGZpZWxkIGFuZCBkZWZlcnJpbmcgY29udmVyc2lvbiBvZiB0aGF0IDxjb2RlPkJ1aWxkZXI8L2NvZGU+CisgKiB0byBhbiBpbW11dGFibGUgPGNvZGU+TWVzc2FnZTwvY29kZT4uIEluIHRoaXMgd2F5LCBpdCdzIHBvc3NpYmxlIHRvIG1haW50YWluCisgKiBhIHRyZWUgb2YgPGNvZGU+QnVpbGRlcjwvY29kZT4ncyB0aGF0IGFjdHMgYXMgYSBmdWxseSByZWFkL3dyaXRlIGRhdGEKKyAqIHN0cnVjdHVyZS4KKyAqIDxicj4KKyAqIExvZ2ljYWxseSwgb25lIGNhbiB0aGluayBvZiBhIHRyZWUgb2YgYnVpbGRlcnMgYXMgY29udmVydGluZyB0aGUgZW50aXJlIHRyZWUKKyAqIHRvIG1lc3NhZ2VzIHdoZW4gYnVpbGQgaXMgY2FsbGVkIG9uIHRoZSByb290IG9yIHdoZW4gYW55IG1ldGhvZCBpcyBjYWxsZWQKKyAqIHRoYXQgZGVzaXJlcyBhIE1lc3NhZ2UgaW5zdGVhZCBvZiBhIEJ1aWxkZXIuIEluIHRlcm1zIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwKKyAqIHRoZSA8Y29kZT5TaW5nbGVGaWVsZEJ1aWxkZXI8L2NvZGU+IGFuZCA8Y29kZT5SZXBlYXRlZEZpZWxkQnVpbGRlcjwvY29kZT4KKyAqIGNsYXNzZXMgY2FjaGUgbWVzc2FnZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgc28gdGhhdCBtZXNzYWdlcyBvbmx5IG5lZWQgdG8gYmUKKyAqIGNyZWF0ZWQgd2hlbiBzb21lIGNoYW5nZSBvY2N1cmVkIGluIGl0cyBidWlsZGVyIG9yIGEgYnVpbGRlciBmb3Igb25lIG9mIGl0cworICogZGVzY2VuZGFudHMuCisgKgorICogQHBhcmFtIDxNVHlwZT4gdGhlIHR5cGUgb2YgbWVzc2FnZSBmb3IgdGhlIGZpZWxkCisgKiBAcGFyYW0gPEJUeXBlPiB0aGUgdHlwZSBvZiBidWlsZGVyIGZvciB0aGUgZmllbGQKKyAqIEBwYXJhbSA8SVR5cGU+IHRoZSBjb21tb24gaW50ZXJmYWNlIGZvciB0aGUgbWVzc2FnZSBhbmQgdGhlIGJ1aWxkZXIKKyAqCisgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKyAqLworcHVibGljIGNsYXNzIFNpbmdsZUZpZWxkQnVpbGRlcgorICAgIDxNVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UsCisgICAgIEJUeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyLAorICAgICBJVHlwZSBleHRlbmRzIE1lc3NhZ2VPckJ1aWxkZXI+CisgICAgaW1wbGVtZW50cyBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgeworCisgIC8vIFBhcmVudCB0byBzZW5kIGNoYW5nZXMgdG8uCisgIHByaXZhdGUgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudDsKKworICAvLyBJbnZhcmlhbnQ6IG9uZSBvZiBidWlsZGVyIG9yIG1lc3NhZ2UgZmllbGRzIG11c3QgYmUgbm9uLW51bGwuCisKKyAgLy8gSWYgc2V0LCB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIGFyZSBiYWNrZWQgYnkgYSBidWlsZGVyLiBJbiB0aGlzIGNhc2UsCisgIC8vIG1lc3NhZ2UgZmllbGQgcmVwcmVzZW50cyBhIGNhY2hlZCBtZXNzYWdlIGZvciB0aGUgYnVpbGRlciAob3IgbnVsbCBpZgorICAvLyB0aGVyZSBpcyBubyBjYWNoZWQgbWVzc2FnZSkuCisgIHByaXZhdGUgQlR5cGUgYnVpbGRlcjsKKworICAvLyBJZiBidWlsZGVyIGlzIG5vbi1udWxsLCB0aGlzIHJlcHJlc2VudHMgYSBjYWNoZWQgbWVzc2FnZSBmcm9tIHRoZSBidWlsZGVyLgorICAvLyBJZiBidWlsZGVyIGlzIG51bGwsIHRoaXMgaXMgdGhlIGF1dGhvcml0YXRpdmUgbWVzc2FnZSBmb3IgdGhlIGZpZWxkLgorICBwcml2YXRlIE1UeXBlIG1lc3NhZ2U7CisKKyAgLy8gSW5kaWNhdGVzIHRoYXQgd2UndmUgYnVpbHQgYSBtZXNzYWdlIGFuZCBzbyB3ZSBhcmUgbm93IG9ibGlnYXRlZAorICAvLyB0byBkaXNwYXRjaCBkaXJ0eSBpbnZhbGlkYXRpb25zLiBTZWUgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyTGlzdGVuZXIuCisgIHByaXZhdGUgYm9vbGVhbiBpc0NsZWFuOworCisgIHB1YmxpYyBTaW5nbGVGaWVsZEJ1aWxkZXIoCisgICAgICBNVHlwZSBtZXNzYWdlLAorICAgICAgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudCwKKyAgICAgIGJvb2xlYW4gaXNDbGVhbikgeworICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIHRoaXMuaXNDbGVhbiA9IGlzQ2xlYW47CisgIH0KKworICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgIC8vIE51bGwgb3V0IHBhcmVudCBzbyB3ZSBzdG9wIHNlbmRpbmcgaXQgaW52YWxpZGF0aW9ucy4KKyAgICBwYXJlbnQgPSBudWxsOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbWVzc2FnZSBmb3IgdGhlIGZpZWxkLiBJZiB0aGUgbWVzc2FnZSBpcyBjdXJyZW50bHkgc3RvcmVkCisgICAqIGFzIGEgPGNvZGU+QnVpbGRlcjwvY29kZT4sIGl0IGlzIGNvbnZlcnRlZCB0byBhIDxjb2RlPk1lc3NhZ2U8L2NvZGU+IGJ5CisgICAqIGNhbGxpbmcge0BsaW5rIE1lc3NhZ2UuQnVpbGRlciNidWlsZFBhcnRpYWx9IG9uIGl0LiBJZiBubyBtZXNzYWdlIGhhcworICAgKiBiZWVuIHNldCwgcmV0dXJucyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgbWVzc2FnZS4KKyAgICoKKyAgICogQHJldHVybiB0aGUgbWVzc2FnZSBmb3IgdGhlIGZpZWxkCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIE1UeXBlIGdldE1lc3NhZ2UoKSB7CisgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgLy8gSWYgbWVzc2FnZSBpcyBudWxsLCB0aGUgaW52YXJpYW50IGlzIHRoYXQgd2UgbXVzdCBiZSBoYXZlIGEgYnVpbGRlci4KKyAgICAgIG1lc3NhZ2UgPSAoTVR5cGUpIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgfQorICAgIHJldHVybiBtZXNzYWdlOworICB9CisKKyAgLyoqCisgICAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBhbmQgcmV0dXJucyBpdC4KKyAgICoKKyAgICogQHJldHVybiB0aGUgbWVzc2FnZQorICAgKi8KKyAgcHVibGljIE1UeXBlIGJ1aWxkKCkgeworICAgIC8vIE5vdyB0aGF0IGJ1aWxkIGhhcyBiZWVuIGNhbGxlZCwgd2UgYXJlIHJlcXVpcmVkIHRvIGRpc3BhdGNoCisgICAgLy8gaW52YWxpZGF0aW9ucy4KKyAgICBpc0NsZWFuID0gdHJ1ZTsKKyAgICByZXR1cm4gZ2V0TWVzc2FnZSgpOworICB9CisKKyAgLyoqCisgICAqIEdldHMgYSBidWlsZGVyIGZvciB0aGUgZmllbGQuIElmIG5vIGJ1aWxkZXIgaGFzIGJlZW4gY3JlYXRlZCB5ZXQsIGEKKyAgICogYnVpbGRlciBpcyBjcmVhdGVkIG9uIGRlbWFuZCBieSBjYWxsaW5nIHtAbGluayBNZXNzYWdlI3RvQnVpbGRlcn0uCisgICAqCisgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgZm9yIHRoZSBmaWVsZAorICAgKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyBCVHlwZSBnZXRCdWlsZGVyKCkgeworICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgIC8vIGJ1aWxkZXIubWVyZ2VGcm9tKCkgb24gYSBmcmVzaCBidWlsZGVyCisgICAgICAvLyBkb2VzIG5vdCBjcmVhdGUgYW55IHN1Yi1vYmplY3RzIHdpdGggaW5kZXBlbmRlbnQgY2xlYW4vZGlydHkgc3RhdGVzLAorICAgICAgLy8gdGhlcmVmb3JlIHNldHRpbmcgdGhlIGJ1aWxkZXIgaXRzZWxmIHRvIGNsZWFuIHdpdGhvdXQgYWN0dWFsbHkgY2FsbGluZworICAgICAgLy8gYnVpbGQoKSBjYW5ub3QgYnJlYWsgYW55IGludmFyaWFudHMuCisgICAgICBidWlsZGVyID0gKEJUeXBlKSBtZXNzYWdlLm5ld0J1aWxkZXJGb3JUeXBlKHRoaXMpOworICAgICAgYnVpbGRlci5tZXJnZUZyb20obWVzc2FnZSk7IC8vIG5vLW9wIGlmIG1lc3NhZ2UgaXMgdGhlIGRlZmF1bHQgbWVzc2FnZQorICAgICAgYnVpbGRlci5tYXJrQ2xlYW4oKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkZXI7CisgIH0KKworICAvKioKKyAgICogR2V0cyB0aGUgYmFzZSBjbGFzcyBpbnRlcmZhY2UgZm9yIHRoZSBmaWVsZC4gVGhpcyBtYXkgZWl0aGVyIGJlIGEgYnVpbGRlcgorICAgKiBvciBhIG1lc3NhZ2UuIEl0IHdpbGwgcmV0dXJuIHdoYXRldmVyIGlzIG1vcmUgZWZmaWNpZW50LgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIG9yIGJ1aWxkZXIgZm9yIHRoZSBmaWVsZCBhcyB0aGUgYmFzZSBjbGFzcyBpbnRlcmZhY2UKKyAgICovCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgSVR5cGUgZ2V0TWVzc2FnZU9yQnVpbGRlcigpIHsKKyAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7CisgICAgICByZXR1cm4gIChJVHlwZSkgYnVpbGRlcjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIChJVHlwZSkgbWVzc2FnZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2V0cyBhICBtZXNzYWdlIGZvciB0aGUgZmllbGQgcmVwbGFjaW5nIGFueSBleGlzdGluZyB2YWx1ZS4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gc2V0CisgICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIKKyAgICovCisgIHB1YmxpYyBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gc2V0TWVzc2FnZSgKKyAgICAgIE1UeXBlIG1lc3NhZ2UpIHsKKyAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICB9CisgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7CisgICAgICBidWlsZGVyLmRpc3Bvc2UoKTsKKyAgICAgIGJ1aWxkZXIgPSBudWxsOworICAgIH0KKyAgICBvbkNoYW5nZWQoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBNZXJnZXMgdGhlIGZpZWxkIGZyb20gYW5vdGhlciBmaWVsZC4KKyAgICoKKyAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBtZXJnZSBmcm9tCisgICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIKKyAgICovCisgIHB1YmxpYyBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gbWVyZ2VGcm9tKAorICAgICAgTVR5cGUgdmFsdWUpIHsKKyAgICBpZiAoYnVpbGRlciA9PSBudWxsICYmIG1lc3NhZ2UgPT0gbWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkpIHsKKyAgICAgIG1lc3NhZ2UgPSB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgZ2V0QnVpbGRlcigpLm1lcmdlRnJvbSh2YWx1ZSk7CisgICAgfQorICAgIG9uQ2hhbmdlZCgpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIENsZWFycyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBjbGVhcigpIHsKKyAgICBtZXNzYWdlID0gKE1UeXBlKSAobWVzc2FnZSAhPSBudWxsID8KKyAgICAgICAgbWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkgOgorICAgICAgICBidWlsZGVyLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSk7CisgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgeworICAgICAgYnVpbGRlci5kaXNwb3NlKCk7CisgICAgICBidWlsZGVyID0gbnVsbDsKKyAgICB9CisgICAgb25DaGFuZ2VkKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQ2FsbGVkIHdoZW4gYSB0aGUgYnVpbGRlciBvciBvbmUgb2YgaXRzIG5lc3RlZCBjaGlsZHJlbiBoYXMgY2hhbmdlZAorICAgKiBhbmQgYW55IHBhcmVudCBzaG91bGQgYmUgbm90aWZpZWQgb2YgaXRzIGludmFsaWRhdGlvbi4KKyAgICovCisgIHByaXZhdGUgdm9pZCBvbkNoYW5nZWQoKSB7CisgICAgLy8gSWYgYnVpbGRlciBpcyBudWxsLCB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIG9uQ2hhbmdlZCBpcyBiZWluZyBjYWxsZWQKKyAgICAvLyBmcm9tIHNldE1lc3NhZ2Ugb3IgY2xlYXIuCisgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgeworICAgICAgbWVzc2FnZSA9IG51bGw7CisgICAgfQorICAgIGlmIChpc0NsZWFuICYmIHBhcmVudCAhPSBudWxsKSB7CisgICAgICBwYXJlbnQubWFya0RpcnR5KCk7CisKKyAgICAgIC8vIERvbid0IGtlZXAgZGlzcGF0Y2hpbmcgaW52YWxpZGF0aW9ucyB1bnRpbCBidWlsZCBpcyBjYWxsZWQgYWdhaW4uCisgICAgICBpc0NsZWFuID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIHB1YmxpYyB2b2lkIG1hcmtEaXJ0eSgpIHsKKyAgICBvbkNoYW5nZWQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NtYWxsU29ydGVkTWFwLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU21hbGxTb3J0ZWRNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2YyNzBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NtYWxsU29ydGVkTWFwLmphdmEKQEAgLTAsMCArMSw2MTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworCisvKioKKyAqIEEgY3VzdG9tIG1hcCBpbXBsZW1lbnRhdGlvbiBmcm9tIEZpZWxkRGVzY3JpcHRvciB0byBPYmplY3Qgb3B0aW1pemVkIHRvCisgKiBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIG1lbW9yeSBhbGxvY2F0aW9ucyBmb3IgaW5zdGFuY2VzIHdpdGggYSBzbWFsbCBudW1iZXIKKyAqIG9mIG1hcHBpbmdzLiBUaGUgaW1wbGVtZW50YXRpb24gc3RvcmVzIHRoZSBmaXJzdCB7QGNvZGUga30gbWFwcGluZ3MgaW4gYW4KKyAqIGFycmF5IGZvciBhIGNvbmZpZ3VyYWJsZSB2YWx1ZSBvZiB7QGNvZGUga30sIGFsbG93aW5nIGRpcmVjdCBhY2Nlc3MgdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIHtAY29kZSBFbnRyeX1zIHdpdGhvdXQgdGhlIG5lZWQgdG8gY3JlYXRlIGFuIEl0ZXJhdG9yLiBUaGUKKyAqIHJlbWFpbmluZyBlbnRyaWVzIGFyZSBzdG9yZWQgaW4gYW4gb3ZlcmZsb3cgbWFwLiBJdGVyYXRpb24gb3ZlciB0aGUgZW50cmllcworICogaW4gdGhlIG1hcCBzaG91bGQgYmUgZG9uZSBhcyBmb2xsb3dzOgorICoKKyAqIDxwcmU+CisgKiBmb3IgKGludCBpID0gMDsgaSAmbHQ7IGZpZWxkTWFwLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKKyAqICAgcHJvY2VzcyhmaWVsZE1hcC5nZXRBcnJheUVudHJ5QXQoaSkpOworICogfQorICogZm9yIChNYXAuRW50cnkmbHQ7SywgViZndDsgZW50cnkgOiBmaWVsZE1hcC5nZXRPdmVyZmxvd0VudHJpZXMoKSkgeworICogICBwcm9jZXNzKGVudHJ5KTsKKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIFRoZSByZXN1bHRpbmcgaXRlcmF0aW9uIGlzIGluIG9yZGVyIG9mIGFzY2VuZGluZyBmaWVsZCB0YWcgbnVtYmVyLiBUaGUKKyAqIG9iamVjdCByZXR1cm5lZCBieSB7QGxpbmsgI2VudHJ5U2V0KCl9IGFkaGVyZXMgdG8gdGhlIHNhbWUgY29udHJhY3QgYnV0IGlzCisgKiBsZXNzIGVmZmljaWVudCBhcyBpdCBuZWNlc3NhcmlseSBpbnZvbHZlcyBjcmVhdGluZyBhbiBvYmplY3QgZm9yIGl0ZXJhdGlvbi4KKyAqIDxwPgorICogVGhlIHRyYWRlb2ZmIGZvciB0aGlzIG1lbW9yeSBlZmZpY2llbmN5IGlzIHRoYXQgdGhlIHdvcnN0IGNhc2UgcnVubmluZyB0aW1lCisgKiBvZiB0aGUge0Bjb2RlIHB1dCgpfSBvcGVyYXRpb24gaXMge0Bjb2RlIE8oayArIGxnIG4pfSwgd2hpY2ggaGFwcGVucyB3aGVuCisgKiBlbnRyaWVzIGFyZSBhZGRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyLiB7QGNvZGUga30gc2hvdWxkIGJlIGNob3NlbiBzdWNoIHRoYXQKKyAqIGl0IGNvdmVycyBlbm91Z2ggY29tbW9uIGNhc2VzIHdpdGhvdXQgYWR2ZXJzZWx5IGFmZmVjdGluZyBsYXJnZXIgbWFwcy4gSW4KKyAqIHByYWN0aWNlLCB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbyBkb2VzIG5vdCBoYXBwZW4gZm9yIGV4dGVuc2lvbnMgYmVjYXVzZQorICogZXh0ZW5zaW9uIGZpZWxkcyBhcmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIGluIG9yZGVyIG9mIGFzY2VuZGluZyB0YWcKKyAqIG51bWJlciwgYnV0IHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvIGNhbiBoYXBwZW4gZm9yIER5bmFtaWNNZXNzYWdlcy4KKyAqIDxwPgorICogVGhlIHJ1bm5pbmcgdGltZSBmb3IgYWxsIG90aGVyIG9wZXJhdGlvbnMgaXMgc2ltaWxhciB0byB0aGF0IG9mCisgKiB7QGNvZGUgVHJlZU1hcH0uCisgKiA8cD4KKyAqIEluc3RhbmNlcyBhcmUgbm90IHRocmVhZC1zYWZlIHVudGlsIHtAbGluayAjbWFrZUltbXV0YWJsZSgpfSBpcyBjYWxsZWQsCisgKiBhZnRlciB3aGljaCBhbnkgbW9kaWZ5aW5nIG9wZXJhdGlvbiB3aWxsIHJlc3VsdCBpbiBhbgorICoge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KKyAqCisgKiBAYXV0aG9yIGRhcmlja0Bnb29nbGUuY29tIERhcmljayBUb25nCisgKi8KKy8vIFRoaXMgY2xhc3MgaXMgZmluYWwgZm9yIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcyBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBpcworLy8gcHJpdmF0ZS4gSG93ZXZlciwgdGhlIEZpZWxkRGVzY3JpcHRvci1zcGVjaWZpYyBsb2dpYyBpcyBlbmNhcHN1bGF0ZWQgaW4KKy8vIGEgc3ViY2xhc3MgdG8gYWlkIHRlc3RhYmlsaXR5IG9mIHRoZSBjb3JlIGxvZ2ljLgorY2xhc3MgU21hbGxTb3J0ZWRNYXA8SyBleHRlbmRzIENvbXBhcmFibGU8Sz4sIFY+IGV4dGVuZHMgQWJzdHJhY3RNYXA8SywgVj4geworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGZvciBtYXBwaW5nIEZpZWxkRGVzY3JpcHRvcnMgdG8gdGhlaXIgdmFsdWVzLgorICAgKiBUaGUge0BsaW5rICNtYWtlSW1tdXRhYmxlKCl9IGltcGxlbWVudGF0aW9uIHdpbGwgY29udmVydCB0aGUgTGlzdCB2YWx1ZXMKKyAgICogb2YgYW55IHJlcGVhdGVkIGZpZWxkcyB0byB1bm1vZGlmaWFibGUgbGlzdHMuCisgICAqCisgICAqIEBwYXJhbSBhcnJheVNpemUgVGhlIHNpemUgb2YgdGhlIGVudHJ5IGFycmF5IGNvbnRhaW5pbmcgdGhlCisgICAqICAgICAgICBsZXhpY29ncmFwaGljYWxseSBzbWFsbGVzdCBtYXBwaW5ncy4KKyAgICovCisgIHN0YXRpYyA8RmllbGREZXNjcmlwdG9yVHlwZSBleHRlbmRzCisgICAgICBGaWVsZFNldC5GaWVsZERlc2NyaXB0b3JMaXRlPEZpZWxkRGVzY3JpcHRvclR5cGU+PgorICAgICAgU21hbGxTb3J0ZWRNYXA8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBuZXdGaWVsZE1hcChpbnQgYXJyYXlTaXplKSB7CisgICAgcmV0dXJuIG5ldyBTbWFsbFNvcnRlZE1hcDxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+KGFycmF5U2l6ZSkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIHB1YmxpYyB2b2lkIG1ha2VJbW11dGFibGUoKSB7CisgICAgICAgIGlmICghaXNJbW11dGFibGUoKSkgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgPQorICAgICAgICAgICAgICAgIGdldEFycmF5RW50cnlBdChpKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKS5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgICAgICAgZmluYWwgTGlzdCB2YWx1ZSA9IChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgOgorICAgICAgICAgICAgICAgICAgIGdldE92ZXJmbG93RW50cmllcygpKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkuaXNSZXBlYXRlZCgpKSB7CisgICAgICAgICAgICAgIGZpbmFsIExpc3QgdmFsdWUgPSAoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUoQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh2YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdXBlci5tYWtlSW1tdXRhYmxlKCk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGZvciB0ZXN0aW5nLgorICAgKgorICAgKiBAcGFyYW0gYXJyYXlTaXplIFRoZSBzaXplIG9mIHRoZSBlbnRyeSBhcnJheSBjb250YWluaW5nIHRoZQorICAgKiAgICAgICAgbGV4aWNvZ3JhcGhpY2FsbHkgc21hbGxlc3QgbWFwcGluZ3MuCisgICAqLworICBzdGF0aWMgPEsgZXh0ZW5kcyBDb21wYXJhYmxlPEs+LCBWPiBTbWFsbFNvcnRlZE1hcDxLLCBWPiBuZXdJbnN0YW5jZUZvclRlc3QoCisgICAgICBpbnQgYXJyYXlTaXplKSB7CisgICAgcmV0dXJuIG5ldyBTbWFsbFNvcnRlZE1hcDxLLCBWPihhcnJheVNpemUpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4QXJyYXlTaXplOworICAvLyBUaGUgImVudHJ5IGFycmF5IiBpcyBhY3R1YWxseSBhIExpc3QgYmVjYXVzZSBnZW5lcmljIGFycmF5cyBhcmUgbm90CisgIC8vIGFsbG93ZWQuIEFycmF5TGlzdCBhbHNvIG5pY2VseSBoYW5kbGVzIHRoZSBlbnRyeSBzaGlmdGluZyBvbiBpbnNlcnRzIGFuZAorICAvLyByZW1vdmVzLgorICBwcml2YXRlIExpc3Q8RW50cnk+IGVudHJ5TGlzdDsKKyAgcHJpdmF0ZSBNYXA8SywgVj4gb3ZlcmZsb3dFbnRyaWVzOworICBwcml2YXRlIGJvb2xlYW4gaXNJbW11dGFibGU7CisgIC8vIFRoZSBFbnRyeVNldCBpcyBhIHN0YXRlbGVzcyB2aWV3IG9mIHRoZSBNYXAuIEl0J3MgaW5pdGlhbGl6ZWQgdGhlIGZpcnN0CisgIC8vIHRpbWUgaXQgaXMgcmVxdWVzdGVkIGFuZCByZXVzZWQgaGVuY2Vmb3J0aC4KKyAgcHJpdmF0ZSB2b2xhdGlsZSBFbnRyeVNldCBsYXp5RW50cnlTZXQ7CisKKyAgLyoqCisgICAqIEBjb2RlIGFycmF5U2l6ZSBTaXplIG9mIHRoZSBhcnJheSBpbiB3aGljaCB0aGUgbGV4aWNvZ3JhcGhpY2FsbHkgc21hbGxlc3QKKyAgICogICAgICAgbWFwcGluZ3MgYXJlIHN0b3JlZC4gKGkuZS4gdGhlIHtAY29kZSBrfSByZWZlcnJlZCB0byBpbiB0aGUgY2xhc3MKKyAgICogICAgICAgZG9jdW1lbnRhdGlvbikuCisgICAqLworICBwcml2YXRlIFNtYWxsU29ydGVkTWFwKGludCBhcnJheVNpemUpIHsKKyAgICB0aGlzLm1heEFycmF5U2l6ZSA9IGFycmF5U2l6ZTsKKyAgICB0aGlzLmVudHJ5TGlzdCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIHRoaXMub3ZlcmZsb3dFbnRyaWVzID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgfQorCisgIC8qKiBNYWtlIHRoaXMgbWFwIGltbXV0YWJsZSBmcm9tIHRoaXMgcG9pbnQgZm9yd2FyZC4gKi8KKyAgcHVibGljIHZvaWQgbWFrZUltbXV0YWJsZSgpIHsKKyAgICBpZiAoIWlzSW1tdXRhYmxlKSB7CisgICAgICAvLyBOb3RlOiBUaGVyZSdzIG5vIG5lZWQgdG8gd3JhcCB0aGUgZW50cnlMaXN0IGluIGFuIHVubW9kaWZpYWJsZUxpc3QKKyAgICAgIC8vIGJlY2F1c2Ugbm9uZSBvZiB0aGUgbGlzdCdzIGFjY2Vzc29ycyBhcmUgZXhwb3NlZC4gVGhlIGl0ZXJhdG9yKCkgb2YKKyAgICAgIC8vIG92ZXJmbG93RW50cmllcywgb24gdGhlIG90aGVyIGhhbmQsIGlzIGV4cG9zZWQgc28gaXQgbXVzdCBiZSBtYWRlCisgICAgICAvLyB1bm1vZGlmaWFibGUuCisgICAgICBvdmVyZmxvd0VudHJpZXMgPSBvdmVyZmxvd0VudHJpZXMuaXNFbXB0eSgpID8KKyAgICAgICAgICBDb2xsZWN0aW9ucy48SywgVj5lbXB0eU1hcCgpIDoKKyAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAob3ZlcmZsb3dFbnRyaWVzKTsKKyAgICAgIGlzSW1tdXRhYmxlID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvKiogQHJldHVybiBXaGV0aGVyIHtAbGluayAjbWFrZUltbXV0YWJsZSgpfSBoYXMgYmVlbiBjYWxsZWQuICovCisgIHB1YmxpYyBib29sZWFuIGlzSW1tdXRhYmxlKCkgeworICAgIHJldHVybiBpc0ltbXV0YWJsZTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZW50cnkgYXJyYXkuICovCisgIHB1YmxpYyBpbnQgZ2V0TnVtQXJyYXlFbnRyaWVzKCkgeworICAgIHJldHVybiBlbnRyeUxpc3Quc2l6ZSgpOworICB9CisKKyAgLyoqIEByZXR1cm4gVGhlIGFycmF5IGVudHJ5IGF0IHRoZSBnaXZlbiB7QGNvZGUgaW5kZXh9LiAqLworICBwdWJsaWMgTWFwLkVudHJ5PEssIFY+IGdldEFycmF5RW50cnlBdChpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gZW50cnlMaXN0LmdldChpbmRleCk7CisgIH0KKworICAvKiogQHJldHVybiBUaGVyZSBudW1iZXIgb2Ygb3ZlcmZsb3cgZW50cmllcy4gKi8KKyAgcHVibGljIGludCBnZXROdW1PdmVyZmxvd0VudHJpZXMoKSB7CisgICAgcmV0dXJuIG92ZXJmbG93RW50cmllcy5zaXplKCk7CisgIH0KKworICAvKiogQHJldHVybiBBbiBpdGVyYWJsZSBvdmVyIHRoZSBvdmVyZmxvdyBlbnRyaWVzLiAqLworICBwdWJsaWMgSXRlcmFibGU8TWFwLkVudHJ5PEssIFY+PiBnZXRPdmVyZmxvd0VudHJpZXMoKSB7CisgICAgcmV0dXJuIG92ZXJmbG93RW50cmllcy5pc0VtcHR5KCkgPworICAgICAgICBFbXB0eVNldC48TWFwLkVudHJ5PEssIFY+Pml0ZXJhYmxlKCkgOgorICAgICAgICBvdmVyZmxvd0VudHJpZXMuZW50cnlTZXQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgcmV0dXJuIGVudHJ5TGlzdC5zaXplKCkgKyBvdmVyZmxvd0VudHJpZXMuc2l6ZSgpOworICB9CisKKyAgLyoqCisgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgYSB7QGNvZGUgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiBvIGlzIG5vdCBhbgorICAgKiBvYmplY3Qgb2YgdHlwZSB7QGNvZGUgS30uCisgICAqCisgICAqIHtAaW5oZXJpdERvY30KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3QgbykgeworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGZpbmFsIEsga2V5ID0gKEspIG87CisgICAgcmV0dXJuIGJpbmFyeVNlYXJjaEluQXJyYXkoa2V5KSA+PSAwIHx8IG92ZXJmbG93RW50cmllcy5jb250YWluc0tleShrZXkpOworICB9CisKKyAgLyoqCisgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgYSB7QGNvZGUgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiBvIGlzIG5vdCBhbgorICAgKiBvYmplY3Qgb2YgdHlwZSB7QGNvZGUgS30uCisgICAqCisgICAqIHtAaW5oZXJpdERvY30KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgViBnZXQoT2JqZWN0IG8pIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBmaW5hbCBLIGtleSA9IChLKSBvOworICAgIGZpbmFsIGludCBpbmRleCA9IGJpbmFyeVNlYXJjaEluQXJyYXkoa2V5KTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgcmV0dXJuIGVudHJ5TGlzdC5nZXQoaW5kZXgpLmdldFZhbHVlKCk7CisgICAgfQorICAgIHJldHVybiBvdmVyZmxvd0VudHJpZXMuZ2V0KGtleSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFYgcHV0KEsga2V5LCBWIHZhbHVlKSB7CisgICAgY2hlY2tNdXRhYmxlKCk7CisgICAgZmluYWwgaW50IGluZGV4ID0gYmluYXJ5U2VhcmNoSW5BcnJheShrZXkpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIGFycmF5IGVudHJ5LgorICAgICAgcmV0dXJuIGVudHJ5TGlzdC5nZXQoaW5kZXgpLnNldFZhbHVlKHZhbHVlKTsKKyAgICB9CisgICAgZW5zdXJlRW50cnlBcnJheU11dGFibGUoKTsKKyAgICBmaW5hbCBpbnQgaW5zZXJ0aW9uUG9pbnQgPSAtKGluZGV4ICsgMSk7CisgICAgaWYgKGluc2VydGlvblBvaW50ID49IG1heEFycmF5U2l6ZSkgeworICAgICAgLy8gUHV0IGRpcmVjdGx5IGluIG92ZXJmbG93LgorICAgICAgcmV0dXJuIGdldE92ZXJmbG93RW50cmllc011dGFibGUoKS5wdXQoa2V5LCB2YWx1ZSk7CisgICAgfQorICAgIC8vIEluc2VydCBuZXcgRW50cnkgaW4gYXJyYXkuCisgICAgaWYgKGVudHJ5TGlzdC5zaXplKCkgPT0gbWF4QXJyYXlTaXplKSB7CisgICAgICAvLyBTaGlmdCB0aGUgbGFzdCBhcnJheSBlbnRyeSBpbnRvIG92ZXJmbG93LgorICAgICAgZmluYWwgRW50cnkgbGFzdEVudHJ5SW5BcnJheSA9IGVudHJ5TGlzdC5yZW1vdmUobWF4QXJyYXlTaXplIC0gMSk7CisgICAgICBnZXRPdmVyZmxvd0VudHJpZXNNdXRhYmxlKCkucHV0KGxhc3RFbnRyeUluQXJyYXkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFbnRyeUluQXJyYXkuZ2V0VmFsdWUoKSk7CisgICAgfQorICAgIGVudHJ5TGlzdC5hZGQoaW5zZXJ0aW9uUG9pbnQsIG5ldyBFbnRyeShrZXksIHZhbHVlKSk7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgY2hlY2tNdXRhYmxlKCk7CisgICAgaWYgKCFlbnRyeUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICBlbnRyeUxpc3QuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKCFvdmVyZmxvd0VudHJpZXMuaXNFbXB0eSgpKSB7CisgICAgICBvdmVyZmxvd0VudHJpZXMuY2xlYXIoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVGhlIGltcGxlbWVudGF0aW9uIHRocm93cyBhIHtAY29kZSBDbGFzc0Nhc3RFeGNlcHRpb259IGlmIG8gaXMgbm90IGFuCisgICAqIG9iamVjdCBvZiB0eXBlIHtAY29kZSBLfS4KKyAgICoKKyAgICoge0Bpbmhlcml0RG9jfQorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBWIHJlbW92ZShPYmplY3QgbykgeworICAgIGNoZWNrTXV0YWJsZSgpOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIGZpbmFsIEsga2V5ID0gKEspIG87CisgICAgZmluYWwgaW50IGluZGV4ID0gYmluYXJ5U2VhcmNoSW5BcnJheShrZXkpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICByZXR1cm4gcmVtb3ZlQXJyYXlFbnRyeUF0KGluZGV4KTsKKyAgICB9CisgICAgLy8gb3ZlcmZsb3dFbnRyaWVzIG1pZ2h0IGJlIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCgpLCBzbyBvbmx5CisgICAgLy8gY2FsbCByZW1vdmUoKSBpZiBpdCBpcyBub24tZW1wdHkuCisgICAgaWYgKG92ZXJmbG93RW50cmllcy5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gb3ZlcmZsb3dFbnRyaWVzLnJlbW92ZShrZXkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgViByZW1vdmVBcnJheUVudHJ5QXQoaW50IGluZGV4KSB7CisgICAgY2hlY2tNdXRhYmxlKCk7CisgICAgZmluYWwgViByZW1vdmVkID0gZW50cnlMaXN0LnJlbW92ZShpbmRleCkuZ2V0VmFsdWUoKTsKKyAgICBpZiAoIW92ZXJmbG93RW50cmllcy5pc0VtcHR5KCkpIHsKKyAgICAgIC8vIFNoaWZ0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgb3ZlcmZsb3cgdG8gYmUgdGhlIGxhc3QgZW50cnkgaW4gdGhlCisgICAgICAvLyBhcnJheS4KKyAgICAgIGZpbmFsIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4gaXRlcmF0b3IgPQorICAgICAgICAgIGdldE92ZXJmbG93RW50cmllc011dGFibGUoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICBlbnRyeUxpc3QuYWRkKG5ldyBFbnRyeShpdGVyYXRvci5uZXh0KCkpKTsKKyAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOworICAgIH0KKyAgICByZXR1cm4gcmVtb3ZlZDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gZmluZCBpbiB0aGUgZW50cnkgYXJyYXkuCisgICAqIEByZXR1cm4gVGhlIHJldHVybmVkIGludGVnZXIgcG9zaXRpb24gZm9sbG93cyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlCisgICAqICAgICB2YWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgamF2YS51dGlsLkFycmF5cyNiaW5hcnlTZWFyY2goKX0uCisgICAqLworICBwcml2YXRlIGludCBiaW5hcnlTZWFyY2hJbkFycmF5KEsga2V5KSB7CisgICAgaW50IGxlZnQgPSAwOworICAgIGludCByaWdodCA9IGVudHJ5TGlzdC5zaXplKCkgLSAxOworCisgICAgLy8gT3B0aW1pemF0aW9uOiBGb3IgdGhlIGNvbW1vbiBjYXNlIGluIHdoaWNoIGVudHJpZXMgYXJlIGFkZGVkIGluCisgICAgLy8gYXNjZW5kaW5nIHRhZyBvcmRlciwgY2hlY2sgdGhlIGxhcmdlc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgYmVmb3JlCisgICAgLy8gZG9pbmcgYSBmdWxsIGJpbmFyeSBzZWFyY2guCisgICAgaWYgKHJpZ2h0ID49IDApIHsKKyAgICAgIGludCBjbXAgPSBrZXkuY29tcGFyZVRvKGVudHJ5TGlzdC5nZXQocmlnaHQpLmdldEtleSgpKTsKKyAgICAgIGlmIChjbXAgPiAwKSB7CisgICAgICAgIHJldHVybiAtKHJpZ2h0ICsgMik7ICAvLyBJbnNlcnQgcG9pbnQgaXMgYWZ0ZXIgInJpZ2h0Ii4KKyAgICAgIH0gZWxzZSBpZiAoY21wID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJpZ2h0OworICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChsZWZ0IDw9IHJpZ2h0KSB7CisgICAgICBpbnQgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOworICAgICAgaW50IGNtcCA9IGtleS5jb21wYXJlVG8oZW50cnlMaXN0LmdldChtaWQpLmdldEtleSgpKTsKKyAgICAgIGlmIChjbXAgPCAwKSB7CisgICAgICAgIHJpZ2h0ID0gbWlkIC0gMTsKKyAgICAgIH0gZWxzZSBpZiAoY21wID4gMCkgeworICAgICAgICBsZWZ0ID0gbWlkICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtaWQ7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAtKGxlZnQgKyAxKTsKKyAgfQorCisgIC8qKgorICAgKiBTaW1pbGFyIHRvIHRoZSBBYnN0cmFjdE1hcCBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUga2V5U2V0KCl9IGFuZAorICAgKiB7QGNvZGUgdmFsdWVzKCl9LCB0aGUgZW50cnkgc2V0IGlzIGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMKKyAgICogY2FsbGVkLCBhbmQgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gYWxsIHN1YnNlcXVlbnQgY2FsbHMuCisgICAqCisgICAqIHtAaW5oZXJpdERvY30KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2V0PE1hcC5FbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7CisgICAgaWYgKGxhenlFbnRyeVNldCA9PSBudWxsKSB7CisgICAgICBsYXp5RW50cnlTZXQgPSBuZXcgRW50cnlTZXQoKTsKKyAgICB9CisgICAgcmV0dXJuIGxhenlFbnRyeVNldDsKKyAgfQorCisgIC8qKgorICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHtAbGluayAjbWFrZUltbXV0YWJsZSgpfSBoYXMKKyAgICogICAgICAgICBoYXMgYmVlbiBjYWxsZWQuCisgICAqLworICBwcml2YXRlIHZvaWQgY2hlY2tNdXRhYmxlKCkgeworICAgIGlmIChpc0ltbXV0YWJsZSkgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEByZXR1cm4gYSB7QGxpbmsgU29ydGVkTWFwfSB0byB3aGljaCBvdmVyZmxvdyBlbnRyaWVzIG1hcHBpbmdzIGNhbiBiZQorICAgKiAgICAgICAgIGFkZGVkIG9yIHJlbW92ZWQuCisgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYge0BsaW5rICNtYWtlSW1tdXRhYmxlKCl9IGhhcyBiZWVuCisgICAqICAgICAgICAgY2FsbGVkLgorICAgKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHByaXZhdGUgU29ydGVkTWFwPEssIFY+IGdldE92ZXJmbG93RW50cmllc011dGFibGUoKSB7CisgICAgY2hlY2tNdXRhYmxlKCk7CisgICAgaWYgKG92ZXJmbG93RW50cmllcy5pc0VtcHR5KCkgJiYgIShvdmVyZmxvd0VudHJpZXMgaW5zdGFuY2VvZiBUcmVlTWFwKSkgeworICAgICAgb3ZlcmZsb3dFbnRyaWVzID0gbmV3IFRyZWVNYXA8SywgVj4oKTsKKyAgICB9CisgICAgcmV0dXJuIChTb3J0ZWRNYXA8SywgVj4pIG92ZXJmbG93RW50cmllczsKKyAgfQorCisgIC8qKgorICAgKiBMYXppbHkgY3JlYXRlcyB0aGUgZW50cnkgbGlzdC4gQW55IGNvZGUgdGhhdCBhZGRzIHRvIHRoZSBsaXN0IG11c3QgZmlyc3QKKyAgICogY2FsbCB0aGlzIG1ldGhvZC4KKyAgICovCisgIHByaXZhdGUgdm9pZCBlbnN1cmVFbnRyeUFycmF5TXV0YWJsZSgpIHsKKyAgICBjaGVja011dGFibGUoKTsKKyAgICBpZiAoZW50cnlMaXN0LmlzRW1wdHkoKSAmJiAhKGVudHJ5TGlzdCBpbnN0YW5jZW9mIEFycmF5TGlzdCkpIHsKKyAgICAgIGVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8RW50cnk+KG1heEFycmF5U2l6ZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEVudHJ5IGltcGxlbWVudGF0aW9uIHRoYXQgaW1wbGVtZW50cyBDb21wYXJhYmxlIGluIG9yZGVyIHRvIHN1cHBvcnQKKyAgICogYmluYXJ5IHNlYXJjaCB3aXRpbiB0aGUgZW50cnkgYXJyYXkuIEFsc28gY2hlY2tzIG11dGFiaWxpdHkgaW4KKyAgICoge0BsaW5rICNzZXRWYWx1ZSgpfS4KKyAgICovCisgIHByaXZhdGUgY2xhc3MgRW50cnkgaW1wbGVtZW50cyBNYXAuRW50cnk8SywgVj4sIENvbXBhcmFibGU8RW50cnk+IHsKKworICAgIHByaXZhdGUgZmluYWwgSyBrZXk7CisgICAgcHJpdmF0ZSBWIHZhbHVlOworCisgICAgRW50cnkoTWFwLkVudHJ5PEssIFY+IGNvcHkpIHsKKyAgICAgIHRoaXMoY29weS5nZXRLZXkoKSwgY29weS5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBFbnRyeShLIGtleSwgViB2YWx1ZSkgeworICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIEsgZ2V0S2V5KCkgeworICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgViBnZXRWYWx1ZSgpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhFbnRyeSBvdGhlcikgeworICAgICAgcmV0dXJuIGdldEtleSgpLmNvbXBhcmVUbyhvdGhlci5nZXRLZXkoKSk7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIFYgc2V0VmFsdWUoViBuZXdWYWx1ZSkgeworICAgICAgY2hlY2tNdXRhYmxlKCk7CisgICAgICBmaW5hbCBWIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKKyAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKKyAgICAgIHJldHVybiBvbGRWYWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgIGlmIChvID09IHRoaXMpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIE1hcC5FbnRyeTw/LCA/PiBvdGhlciA9IChNYXAuRW50cnk8PywgPz4pIG87CisgICAgICByZXR1cm4gZXF1YWxzKGtleSwgb3RoZXIuZ2V0S2V5KCkpICYmIGVxdWFscyh2YWx1ZSwgb3RoZXIuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiAoa2V5ID09IG51bGwgPyAwIDoga2V5Lmhhc2hDb2RlKCkpIF4KKyAgICAgICAgICAodmFsdWUgPT0gbnVsbCA/IDAgOiB2YWx1ZS5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIGtleSArICI9IiArIHZhbHVlOworICAgIH0KKworICAgIC8qKiBlcXVhbHMoKSB0aGF0IGhhbmRsZXMgbnVsbCB2YWx1ZXMuICovCisgICAgcHJpdmF0ZSBib29sZWFuIGVxdWFscyhPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgcmV0dXJuIG8xID09IG51bGwgPyBvMiA9PSBudWxsIDogbzEuZXF1YWxzKG8yKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU3RhdGVsZXNzIHZpZXcgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGZpZWxkIG1hcC4KKyAgICovCisgIHByaXZhdGUgY2xhc3MgRW50cnlTZXQgZXh0ZW5kcyBBYnN0cmFjdFNldDxNYXAuRW50cnk8SywgVj4+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJdGVyYXRvcjxNYXAuRW50cnk8SywgVj4+IGl0ZXJhdG9yKCkgeworICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgcmV0dXJuIFNtYWxsU29ydGVkTWFwLnRoaXMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93cyBhIHtAbGluayBDbGFzc0Nhc3RFeGNlcHRpb259IGlmIG8gaXMgbm90IG9mIHRoZSBleHBlY3RlZCB0eXBlLgorICAgICAqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIGZpbmFsIE1hcC5FbnRyeTxLLCBWPiBlbnRyeSA9IChNYXAuRW50cnk8SywgVj4pIG87CisgICAgICBmaW5hbCBWIGV4aXN0aW5nID0gZ2V0KGVudHJ5LmdldEtleSgpKTsKKyAgICAgIGZpbmFsIFYgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgcmV0dXJuIGV4aXN0aW5nID09IHZhbHVlIHx8CisgICAgICAgICAgKGV4aXN0aW5nICE9IG51bGwgJiYgZXhpc3RpbmcuZXF1YWxzKHZhbHVlKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYWRkKE1hcC5FbnRyeTxLLCBWPiBlbnRyeSkgeworICAgICAgaWYgKCFjb250YWlucyhlbnRyeSkpIHsKKyAgICAgICAgcHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhyb3dzIGEge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgbyBpcyBub3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGUuCisgICAgICoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIGZpbmFsIE1hcC5FbnRyeTxLLCBWPiBlbnRyeSA9IChNYXAuRW50cnk8SywgVj4pIG87CisgICAgICBpZiAoY29udGFpbnMoZW50cnkpKSB7CisgICAgICAgIFNtYWxsU29ydGVkTWFwLnRoaXMucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICBTbWFsbFNvcnRlZE1hcC50aGlzLmNsZWFyKCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIHRoYXQgc3dpdGNoZXMgZnJvbSB0aGUgZW50cnkgYXJyYXkgdG8gdGhlIG92ZXJmbG93CisgICAqIGVudHJpZXMgYXBwcm9wcmlhdGVseS4KKyAgICovCisgIHByaXZhdGUgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4geworCisgICAgcHJpdmF0ZSBpbnQgcG9zID0gLTE7CisgICAgcHJpdmF0ZSBib29sZWFuIG5leHRDYWxsZWRCZWZvcmVSZW1vdmU7CisgICAgcHJpdmF0ZSBJdGVyYXRvcjxNYXAuRW50cnk8SywgVj4+IGxhenlPdmVyZmxvd0l0ZXJhdG9yOworCisgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgIHJldHVybiAocG9zICsgMSkgPCBlbnRyeUxpc3Quc2l6ZSgpIHx8CisgICAgICAgICAgZ2V0T3ZlcmZsb3dJdGVyYXRvcigpLmhhc05leHQoKTsKKyAgICB9CisKKyAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICBwdWJsaWMgTWFwLkVudHJ5PEssIFY+IG5leHQoKSB7CisgICAgICBuZXh0Q2FsbGVkQmVmb3JlUmVtb3ZlID0gdHJ1ZTsKKyAgICAgIC8vIEFsd2F5cyBpbmNyZW1lbnQgcG9zIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIHRoZSBsYXN0IHJldHVybmVkIHZhbHVlCisgICAgICAvLyB3YXMgZnJvbSB0aGUgYXJyYXkgb3IgZnJvbSBvdmVyZmxvdy4KKyAgICAgIGlmICgrK3BvcyA8IGVudHJ5TGlzdC5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGVudHJ5TGlzdC5nZXQocG9zKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBnZXRPdmVyZmxvd0l0ZXJhdG9yKCkubmV4dCgpOworICAgIH0KKworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgIGlmICghbmV4dENhbGxlZEJlZm9yZVJlbW92ZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJyZW1vdmUoKSB3YXMgY2FsbGVkIGJlZm9yZSBuZXh0KCkiKTsKKyAgICAgIH0KKyAgICAgIG5leHRDYWxsZWRCZWZvcmVSZW1vdmUgPSBmYWxzZTsKKyAgICAgIGNoZWNrTXV0YWJsZSgpOworCisgICAgICBpZiAocG9zIDwgZW50cnlMaXN0LnNpemUoKSkgeworICAgICAgICByZW1vdmVBcnJheUVudHJ5QXQocG9zLS0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2V0T3ZlcmZsb3dJdGVyYXRvcigpLnJlbW92ZSgpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEl0IGlzIGltcG9ydGFudCB0byBjcmVhdGUgdGhlIG92ZXJmbG93IGl0ZXJhdG9yIG9ubHkgYWZ0ZXIgdGhlIGFycmF5CisgICAgICogZW50cmllcyBoYXZlIGJlZW4gaXRlcmF0ZWQgb3ZlciBiZWNhdXNlIHRoZSBvdmVyZmxvdyBlbnRyeSBzZXQgY2hhbmdlcworICAgICAqIHdoZW4gdGhlIGNsaWVudCBjYWxscyByZW1vdmUoKSBvbiB0aGUgYXJyYXkgZW50cmllcywgd2hpY2ggaW52YWxpZGF0ZXMKKyAgICAgKiBhbnkgZXhpc3RpbmcgaXRlcmF0b3JzLgorICAgICAqLworICAgIHByaXZhdGUgSXRlcmF0b3I8TWFwLkVudHJ5PEssIFY+PiBnZXRPdmVyZmxvd0l0ZXJhdG9yKCkgeworICAgICAgaWYgKGxhenlPdmVyZmxvd0l0ZXJhdG9yID09IG51bGwpIHsKKyAgICAgICAgbGF6eU92ZXJmbG93SXRlcmF0b3IgPSBvdmVyZmxvd0VudHJpZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgfQorICAgICAgcmV0dXJuIGxhenlPdmVyZmxvd0l0ZXJhdG9yOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgY2xhc3MgdGhhdCBob2xkcyBpbW11dGFibGUgaW5zdGFuY2VzIG9mIGFuIEl0ZXJhYmxlL0l0ZXJhdG9yIHRoYXQKKyAgICogd2UgcmV0dXJuIHdoZW4gdGhlIG92ZXJmbG93IGVudHJpZXMgaXMgZW1wdHkuIFRoaXMgZWxpbWluYXRlcyB0aGUgY3JlYXRpb24KKyAgICogb2YgYW4gSXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBpdGVyYXRlIG92ZXIuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbXB0eVNldCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYXRvcjxPYmplY3Q+IElURVJBVE9SID0gbmV3IEl0ZXJhdG9yPE9iamVjdD4oKSB7CisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxPYmplY3Q+IElURVJBQkxFID0gbmV3IEl0ZXJhYmxlPE9iamVjdD4oKSB7CisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyBJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gSVRFUkFUT1I7CisgICAgICB9CisgICAgfTsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHN0YXRpYyA8VD4gSXRlcmFibGU8VD4gaXRlcmFibGUoKSB7CisgICAgICByZXR1cm4gKEl0ZXJhYmxlPFQ+KSBJVEVSQUJMRTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZmJkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdC5qYXZhCkBAIC0wLDAgKzEsMTQ3NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIFByb3ZpZGUgdGV4dCBwYXJzaW5nIGFuZCBmb3JtYXR0aW5nIHN1cHBvcnQgZm9yIHByb3RvMiBpbnN0YW5jZXMuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gbGFyZ2VseSBmb2xsb3dzIGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYy4KKyAqCisgKiBAYXV0aG9yIHdlbmJvekBnb29nbGUuY29tIFdlbmJvIFpodQorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRleHRGb3JtYXQgeworICBwcml2YXRlIFRleHRGb3JtYXQoKSB7fQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByaW50ZXIgREVGQVVMVF9QUklOVEVSID0gbmV3IFByaW50ZXIoZmFsc2UpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmludGVyIFNJTkdMRV9MSU5FX1BSSU5URVIgPSBuZXcgUHJpbnRlcih0cnVlKTsKKworICAvKioKKyAgICogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFByb3RvY29sIE1lc3NhZ2Ugc3VwcGxpZWQgaW50bworICAgKiB0aGUgcGFyYW1ldGVyIG91dHB1dC4gKFRoaXMgcmVwcmVzZW50YXRpb24gaXMgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZQorICAgKiBjbGFzc2ljICJQcm90b2NvbFByaW50ZXIiIG91dHB1dCBmcm9tIHRoZSBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXIgc3lzdGVtKQorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50KGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSwgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIERFRkFVTFRfUFJJTlRFUi5wcmludChtZXNzYWdlLCBuZXcgVGV4dEdlbmVyYXRvcihvdXRwdXQpKTsKKyAgfQorCisgIC8qKiBPdXRwdXRzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgZmllbGRzfSB0byB7QGNvZGUgb3V0cHV0fS4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50KGZpbmFsIFVua25vd25GaWVsZFNldCBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcHBlbmRhYmxlIG91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgREVGQVVMVF9QUklOVEVSLnByaW50VW5rbm93bkZpZWxkcyhmaWVsZHMsIG5ldyBUZXh0R2VuZXJhdG9yKG91dHB1dCkpOworICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlcyBhIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgdGhpcyBtZXNzYWdlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQKKyAgICogb3RoZXIgcHVycG9zZXMsIHdpdGggbm8gbmV3bGluZSBjaGFyYWN0ZXJzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnREZWJ1Z1N0cmluZyhmaW5hbCBNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICB0cnkgeworICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBTSU5HTEVfTElORV9QUklOVEVSLnByaW50KG1lc3NhZ2UsIG5ldyBUZXh0R2VuZXJhdG9yKHNiKSk7CisgICAgICAvLyBTaW5nbGUgbGluZSBtb2RlIGN1cnJlbnRseSBtaWdodCBoYXZlIGFuIGV4dHJhIHNwYWNlIGF0IHRoZSBlbmQuCisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKS50cmltKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2VuZXJhdGVzIGEgaHVtYW4gcmVhZGFibGUgZm9ybSBvZiB0aGUgdW5rbm93biBmaWVsZHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisgICAqIGFuZCBvdGhlciBwdXJwb3Nlcywgd2l0aCBubyBuZXdsaW5lIGNoYXJhY3RlcnMuCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydERlYnVnU3RyaW5nKGZpbmFsIFVua25vd25GaWVsZFNldCBmaWVsZHMpIHsKKyAgICB0cnkgeworICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBTSU5HTEVfTElORV9QUklOVEVSLnByaW50VW5rbm93bkZpZWxkcyhmaWVsZHMsIG5ldyBUZXh0R2VuZXJhdG9yKHNiKSk7CisgICAgICAvLyBTaW5nbGUgbGluZSBtb2RlIGN1cnJlbnRseSBtaWdodCBoYXZlIGFuIGV4dHJhIHNwYWNlIGF0IHRoZSBlbmQuCisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKS50cmltKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTGlrZSB7QGNvZGUgcHJpbnQoKX0sIGJ1dCB3cml0ZXMgZGlyZWN0bHkgdG8gYSB7QGNvZGUgU3RyaW5nfSBhbmQKKyAgICogcmV0dXJucyBpdC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50VG9TdHJpbmcoZmluYWwgTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBwcmludChtZXNzYWdlLCB0ZXh0KTsKKyAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTGlrZSB7QGNvZGUgcHJpbnQoKX0sIGJ1dCB3cml0ZXMgZGlyZWN0bHkgdG8gYSB7QGNvZGUgU3RyaW5nfSBhbmQKKyAgICogcmV0dXJucyBpdC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50VG9TdHJpbmcoZmluYWwgVW5rbm93bkZpZWxkU2V0IGZpZWxkcykgeworICAgIHRyeSB7CisgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgcHJpbnQoZmllbGRzLCB0ZXh0KTsKKyAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgREVGQVVMVF9QUklOVEVSLnByaW50RmllbGQoZmllbGQsIHZhbHVlLCBuZXcgVGV4dEdlbmVyYXRvcihvdXRwdXQpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50RmllbGRUb1N0cmluZyhmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICB0cnkgeworICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIHByaW50RmllbGQoZmllbGQsIHZhbHVlLCB0ZXh0KTsKKyAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGdpdmVuIGZpZWxkIHZhbHVlLgorICAgKgorICAgKiBAcGFyYW0gZmllbGQgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkCisgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCisgICAqIEBwYXJhbSBvdXRwdXQgdGhlIG91dHB1dCB0byB3aGljaCB0byBhcHBlbmQgdGhlIGZvcm1hdHRlZCB2YWx1ZQorICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbm90IGFwcHJvcHJpYXRlIGZvciB0aGUKKyAgICogICAgIGdpdmVuIGZpZWxkIGRlc2NyaXB0b3IKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBleGNlcHRpb24gd3JpdGluZyB0byB0aGUgb3V0cHV0CisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRGaWVsZFZhbHVlKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBERUZBVUxUX1BSSU5URVIucHJpbnRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgbmV3IFRleHRHZW5lcmF0b3Iob3V0cHV0KSk7CisgIH0KKworICAvKioKKyAgICogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGFuIHVua25vd24gZmllbGQuCisgICAqCisgICAqIEBwYXJhbSB0YWcgdGhlIGZpZWxkJ3MgdGFnIG51bWJlcgorICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAorICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgdG8gd2hpY2ggdG8gYXBwZW5kIHRoZSBmb3JtYXR0ZWQgdmFsdWUKKyAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdGhlCisgICAqICAgICBnaXZlbiBmaWVsZCBkZXNjcmlwdG9yCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXhjZXB0aW9uIHdyaXRpbmcgdG8gdGhlIG91dHB1dAorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VW5rbm93bkZpZWxkVmFsdWUoZmluYWwgaW50IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcHBlbmRhYmxlIG91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcmludFVua25vd25GaWVsZFZhbHVlKHRhZywgdmFsdWUsIG5ldyBUZXh0R2VuZXJhdG9yKG91dHB1dCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVua25vd25GaWVsZFZhbHVlKGZpbmFsIGludCB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3dpdGNoIChXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZykpIHsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQ6CisgICAgICAgIGdlbmVyYXRvci5wcmludCh1bnNpZ25lZFRvU3RyaW5nKChMb25nKSB2YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyOgorICAgICAgICBnZW5lcmF0b3IucHJpbnQoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KChMb2NhbGUpIG51bGwsICIweCUwOHgiLCAoSW50ZWdlcikgdmFsdWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NDoKKyAgICAgICAgZ2VuZXJhdG9yLnByaW50KFN0cmluZy5mb3JtYXQoKExvY2FsZSkgbnVsbCwgIjB4JTAxNngiLCAoTG9uZykgdmFsdWUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIpOworICAgICAgICBnZW5lcmF0b3IucHJpbnQoZXNjYXBlQnl0ZXMoKEJ5dGVTdHJpbmcpIHZhbHVlKSk7CisgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVA6CisgICAgICAgIERFRkFVTFRfUFJJTlRFUi5wcmludFVua25vd25GaWVsZHMoKFVua25vd25GaWVsZFNldCkgdmFsdWUsIGdlbmVyYXRvcik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIHRhZzogIiArIHRhZyk7CisgICAgfQorICB9CisKKyAgLyoqIEhlbHBlciBjbGFzcyBmb3IgY29udmVydGluZyBwcm90b2J1ZnMgdG8gdGV4dC4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJpbnRlciB7CisgICAgLyoqIFdoZXRoZXIgdG8gb21pdCBuZXdsaW5lcyBmcm9tIHRoZSBvdXRwdXQuICovCisgICAgZmluYWwgYm9vbGVhbiBzaW5nbGVMaW5lTW9kZTsKKworICAgIHByaXZhdGUgUHJpbnRlcihmaW5hbCBib29sZWFuIHNpbmdsZUxpbmVNb2RlKSB7CisgICAgICB0aGlzLnNpbmdsZUxpbmVNb2RlID0gc2luZ2xlTGluZU1vZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByaW50KGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSwgZmluYWwgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmb3IgKE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZmllbGQKKyAgICAgICAgICA6IG1lc3NhZ2UuZ2V0QWxsRmllbGRzKCkuZW50cnlTZXQoKSkgeworICAgICAgICBwcmludEZpZWxkKGZpZWxkLmdldEtleSgpLCBmaWVsZC5nZXRWYWx1ZSgpLCBnZW5lcmF0b3IpOworICAgICAgfQorICAgICAgcHJpbnRVbmtub3duRmllbGRzKG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpLCBnZW5lcmF0b3IpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgZmluYWwgT2JqZWN0IHZhbHVlLAorICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKKyAgICAgICAgLy8gUmVwZWF0ZWQgZmllbGQuICBQcmludCBlYWNoIGVsZW1lbnQuCisgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiAoTGlzdDw/PikgdmFsdWUpIHsKKyAgICAgICAgICBwcmludFNpbmdsZUZpZWxkKGZpZWxkLCBlbGVtZW50LCBnZW5lcmF0b3IpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludFNpbmdsZUZpZWxkKGZpZWxkLCB2YWx1ZSwgZ2VuZXJhdG9yKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRTaW5nbGVGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgeworICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlsiKTsKKyAgICAgICAgLy8gV2Ugc3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQgZWxlbWVudHMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcm90bzEuCisgICAgICAgIGlmIChmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpLmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlU2V0V2lyZUZvcm1hdCgpCisgICAgICAgICAgICAmJiAoZmllbGQuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UpCisgICAgICAgICAgICAmJiAoZmllbGQuaXNPcHRpb25hbCgpKQorICAgICAgICAgICAgLy8gb2JqZWN0IGVxdWFsaXR5CisgICAgICAgICAgICAmJiAoZmllbGQuZ2V0RXh0ZW5zaW9uU2NvcGUoKSA9PSBmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKSkgeworICAgICAgICAgIGdlbmVyYXRvci5wcmludChmaWVsZC5nZXRNZXNzYWdlVHlwZSgpLmdldEZ1bGxOYW1lKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdlbmVyYXRvci5wcmludChmaWVsZC5nZXRGdWxsTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0b3IucHJpbnQoIl0iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuR1JPVVApIHsKKyAgICAgICAgICAvLyBHcm91cHMgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggdGhlaXIgb3JpZ2luYWwgY2FwaXRhbGl6YXRpb24uCisgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KGZpZWxkLmdldE1lc3NhZ2VUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoZmllbGQuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIiB7ICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiIHtcbiIpOworICAgICAgICAgIGdlbmVyYXRvci5pbmRlbnQoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuZXJhdG9yLnByaW50KCI6ICIpOworICAgICAgfQorCisgICAgICBwcmludEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlLCBnZW5lcmF0b3IpOworCisgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgeworICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIn0gIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2VuZXJhdG9yLm91dGRlbnQoKTsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIn1cbiIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIiAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlxuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRGaWVsZFZhbHVlKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHN3aXRjaCAoZmllbGQuZ2V0VHlwZSgpKSB7CisgICAgICAgIGNhc2UgSU5UMzI6CisgICAgICAgIGNhc2UgU0lOVDMyOgorICAgICAgICBjYXNlIFNGSVhFRDMyOgorICAgICAgICAgIGdlbmVyYXRvci5wcmludCgoKEludGVnZXIpIHZhbHVlKS50b1N0cmluZygpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOVDY0OgorICAgICAgICBjYXNlIFNJTlQ2NDoKKyAgICAgICAgY2FzZSBTRklYRUQ2NDoKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoKChMb25nKSB2YWx1ZSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCT09MOgorICAgICAgICAgIGdlbmVyYXRvci5wcmludCgoKEJvb2xlYW4pIHZhbHVlKS50b1N0cmluZygpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgIGdlbmVyYXRvci5wcmludCgoKEZsb2F0KSB2YWx1ZSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCgoRG91YmxlKSB2YWx1ZSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBVSU5UMzI6CisgICAgICAgIGNhc2UgRklYRUQzMjoKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQodW5zaWduZWRUb1N0cmluZygoSW50ZWdlcikgdmFsdWUpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFVJTlQ2NDoKKyAgICAgICAgY2FzZSBGSVhFRDY0OgorICAgICAgICAgIGdlbmVyYXRvci5wcmludCh1bnNpZ25lZFRvU3RyaW5nKChMb25nKSB2YWx1ZSkpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RSSU5HOgorICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoZXNjYXBlVGV4dCgoU3RyaW5nKSB2YWx1ZSkpOworICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJZVEVTOgorICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoZXNjYXBlQnl0ZXMoKEJ5dGVTdHJpbmcpIHZhbHVlKSk7CisgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoKChFbnVtVmFsdWVEZXNjcmlwdG9yKSB2YWx1ZSkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1FU1NBR0U6CisgICAgICAgIGNhc2UgR1JPVVA6CisgICAgICAgICAgcHJpbnQoKE1lc3NhZ2UpIHZhbHVlLCBnZW5lcmF0b3IpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFVua25vd25GaWVsZHMoZmluYWwgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBVbmtub3duRmllbGRTZXQuRmllbGQ+IGVudHJ5IDoKKyAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuYXNNYXAoKS5lbnRyeVNldCgpKSB7CisgICAgICAgIGZpbmFsIGludCBudW1iZXIgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgZmluYWwgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgcHJpbnRVbmtub3duRmllbGQobnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKKyAgICAgICAgICAgIGZpZWxkLmdldFZhcmludExpc3QoKSwgZ2VuZXJhdG9yKTsKKyAgICAgICAgcHJpbnRVbmtub3duRmllbGQobnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsCisgICAgICAgICAgICBmaWVsZC5nZXRGaXhlZDMyTGlzdCgpLCBnZW5lcmF0b3IpOworICAgICAgICBwcmludFVua25vd25GaWVsZChudW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwKKyAgICAgICAgICAgIGZpZWxkLmdldEZpeGVkNjRMaXN0KCksIGdlbmVyYXRvcik7CisgICAgICAgIHByaW50VW5rbm93bkZpZWxkKG51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAorICAgICAgICAgICAgZmllbGQuZ2V0TGVuZ3RoRGVsaW1pdGVkTGlzdCgpLCBnZW5lcmF0b3IpOworICAgICAgICBmb3IgKGZpbmFsIFVua25vd25GaWVsZFNldCB2YWx1ZSA6IGZpZWxkLmdldEdyb3VwTGlzdCgpKSB7CisgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgIGlmIChzaW5nbGVMaW5lTW9kZSkgeworICAgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCIgeyAiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCIge1xuIik7CisgICAgICAgICAgICBnZW5lcmF0b3IuaW5kZW50KCk7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50VW5rbm93bkZpZWxkcyh2YWx1ZSwgZ2VuZXJhdG9yKTsKKyAgICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKKyAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgifSAiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuZXJhdG9yLm91dGRlbnQoKTsKKyAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgifVxuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByaW50VW5rbm93bkZpZWxkKGZpbmFsIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aXJlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDw/PiB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZm9yIChmaW5hbCBPYmplY3QgdmFsdWUgOiB2YWx1ZXMpIHsKKyAgICAgICAgZ2VuZXJhdG9yLnByaW50KFN0cmluZy52YWx1ZU9mKG51bWJlcikpOworICAgICAgICBnZW5lcmF0b3IucHJpbnQoIjogIik7CisgICAgICAgIHByaW50VW5rbm93bkZpZWxkVmFsdWUod2lyZVR5cGUsIHZhbHVlLCBnZW5lcmF0b3IpOworICAgICAgICBnZW5lcmF0b3IucHJpbnQoc2luZ2xlTGluZU1vZGUgPyAiICIgOiAiXG4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiogQ29udmVydCBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciB0byBhIHN0cmluZy4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVuc2lnbmVkVG9TdHJpbmcoZmluYWwgaW50IHZhbHVlKSB7CisgICAgaWYgKHZhbHVlID49IDApIHsKKyAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcoKChsb25nKSB2YWx1ZSkgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKKyAgICB9CisgIH0KKworICAvKiogQ29udmVydCBhbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB0byBhIHN0cmluZy4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVuc2lnbmVkVG9TdHJpbmcoZmluYWwgbG9uZyB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA+PSAwKSB7CisgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyh2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFB1bGwgb2ZmIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBzbyB0aGF0IEJpZ0ludGVnZXIgZG9lc24ndCB0aGluaworICAgICAgLy8gdGhlIG51bWJlciBpcyBuZWdhdGl2ZSwgdGhlbiBzZXQgaXQgYWdhaW4gdXNpbmcgc2V0Qml0KCkuCisgICAgICByZXR1cm4gQmlnSW50ZWdlci52YWx1ZU9mKHZhbHVlICYgMHg3RkZGRkZGRkZGRkZGRkZGTCkKKyAgICAgICAgICAgICAgICAgICAgICAgLnNldEJpdCg2MykudG9TdHJpbmcoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQW4gaW5uZXIgY2xhc3MgZm9yIHdyaXRpbmcgdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRleHRHZW5lcmF0b3IgeworICAgIHByaXZhdGUgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgcHJpdmF0ZSBib29sZWFuIGF0U3RhcnRPZkxpbmUgPSB0cnVlOworCisgICAgcHJpdmF0ZSBUZXh0R2VuZXJhdG9yKGZpbmFsIEFwcGVuZGFibGUgb3V0cHV0KSB7CisgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRlbnQgdGV4dCBieSB0d28gc3BhY2VzLiAgQWZ0ZXIgY2FsbGluZyBJbmRlbnQoKSwgdHdvIHNwYWNlcyB3aWxsIGJlCisgICAgICogaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgb2YgdGV4dC4gIEluZGVudCgpIG1heSBiZSBjYWxsZWQKKyAgICAgKiBtdWx0aXBsZSB0aW1lcyB0byBwcm9kdWNlIGRlZXBlciBpbmRlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluZGVudCgpIHsKKyAgICAgIGluZGVudC5hcHBlbmQoIiAgIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVkdWNlcyB0aGUgY3VycmVudCBpbmRlbnQgbGV2ZWwgYnkgdHdvIHNwYWNlcywgb3IgY3Jhc2hlcyBpZiB0aGUgaW5kZW50CisgICAgICogbGV2ZWwgaXMgemVyby4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvdXRkZW50KCkgeworICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGluZGVudC5sZW5ndGgoKTsKKyAgICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgIiBPdXRkZW50KCkgd2l0aG91dCBtYXRjaGluZyBJbmRlbnQoKS4iKTsKKyAgICAgIH0KKyAgICAgIGluZGVudC5kZWxldGUobGVuZ3RoIC0gMiwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCB0ZXh0IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGZpbmFsIENoYXJTZXF1ZW5jZSB0ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZmluYWwgaW50IHNpemUgPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgaW50IHBvcyA9IDA7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PSAnXG4nKSB7CisgICAgICAgICAgd3JpdGUodGV4dC5zdWJTZXF1ZW5jZShwb3MsIHNpemUpLCBpIC0gcG9zICsgMSk7CisgICAgICAgICAgcG9zID0gaSArIDE7CisgICAgICAgICAgYXRTdGFydE9mTGluZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdyaXRlKHRleHQuc3ViU2VxdWVuY2UocG9zLCBzaXplKSwgc2l6ZSAtIHBvcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlKGZpbmFsIENoYXJTZXF1ZW5jZSBkYXRhLCBmaW5hbCBpbnQgc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKGF0U3RhcnRPZkxpbmUpIHsKKyAgICAgICAgYXRTdGFydE9mTGluZSA9IGZhbHNlOworICAgICAgICBvdXRwdXQuYXBwZW5kKGluZGVudCk7CisgICAgICB9CisgICAgICBvdXRwdXQuYXBwZW5kKGRhdGEpOworICAgIH0KKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIFBhcnNpbmcKKworICAvKioKKyAgICogUmVwcmVzZW50cyBhIHN0cmVhbSBvZiB0b2tlbnMgcGFyc2VkIGZyb20gYSB7QGNvZGUgU3RyaW5nfS4KKyAgICoKKyAgICogPHA+VGhlIEphdmEgc3RhbmRhcmQgbGlicmFyeSBwcm92aWRlcyBtYW55IGNsYXNzZXMgdGhhdCB5b3UgbWlnaHQgdGhpbmsKKyAgICogd291bGQgYmUgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgdGhpcywgYnV0IGFyZW4ndC4gIEZvciBleGFtcGxlOgorICAgKgorICAgKiA8dWw+CisgICAqIDxsaT57QGNvZGUgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXJ9OiAgVGhpcyBhbG1vc3QgZG9lcyB3aGF0IHdlIHdhbnQgLS0gb3IsCisgICAqICAgYXQgbGVhc3QsIHNvbWV0aGluZyB0aGF0IHdvdWxkIGdldCB1cyBjbG9zZSB0byB3aGF0IHdlIHdhbnQgLS0gZXhjZXB0CisgICAqICAgZm9yIG9uZSBmYXRhbCBmbGF3OiAgSXQgYXV0b21hdGljYWxseSB1bi1lc2NhcGVzIHN0cmluZ3MgdXNpbmcgSmF2YQorICAgKiAgIGVzY2FwZSBzZXF1ZW5jZXMsIHdoaWNoIGRvIG5vdCBpbmNsdWRlIGFsbCB0aGUgZXNjYXBlIHNlcXVlbmNlcyB3ZQorICAgKiAgIG5lZWQgdG8gc3VwcG9ydCAoZS5nLiAnXHgnKS4KKyAgICogPGxpPntAY29kZSBqYXZhLnV0aWwuU2Nhbm5lcn06ICBUaGlzIHNlZW1zIGxpa2UgYSBncmVhdCB3YXkgYXQgbGVhc3QgdG8KKyAgICogICBwYXJzZSByZWd1bGFyIGV4cHJlc3Npb25zIG91dCBvZiBhIHN0cmVhbSAoc28gd2Ugd291bGRuJ3QgaGF2ZSB0byBsb2FkCisgICAqICAgdGhlIGVudGlyZSBpbnB1dCBpbnRvIGEgc2luZ2xlIHN0cmluZyBiZWZvcmUgcGFyc2luZykuICBTYWRseSwKKyAgICogICB7QGNvZGUgU2Nhbm5lcn0gcmVxdWlyZXMgdGhhdCB0b2tlbnMgYmUgZGVsaW1pdGVkIHdpdGggc29tZSBkZWxpbWl0ZXIuCisgICAqICAgVGh1cywgYWx0aG91Z2ggdGhlIHRleHQgImZvbzoiIHNob3VsZCBwYXJzZSB0byB0d28gdG9rZW5zICgiZm9vIiBhbmQKKyAgICogICAiOiIpLCB7QGNvZGUgU2Nhbm5lcn0gd291bGQgcmVjb2duaXplIGl0IG9ubHkgYXMgYSBzaW5nbGUgdG9rZW4uCisgICAqICAgRnVydGhlcm1vcmUsIHtAY29kZSBTY2FubmVyfSBwcm92aWRlcyBubyB3YXkgdG8gaW5zcGVjdCB0aGUgY29udGVudHMKKyAgICogICBvZiBkZWxpbWl0ZXJzLCBtYWtpbmcgaXQgaW1wb3NzaWJsZSB0byBrZWVwIHRyYWNrIG9mIGxpbmUgYW5kIGNvbHVtbgorICAgKiAgIG51bWJlcnMuCisgICAqIDwvdWw+CisgICAqCisgICAqIDxwPkx1Y2tpbHksIEphdmEncyByZWd1bGFyIGV4cHJlc3Npb24gc3VwcG9ydCBkb2VzIG1hbmFnZSB0byBiZSB1c2VmdWwgdG8KKyAgICogdXMuICAoQmFyZWx5OiAgV2UgbmVlZCB7QGNvZGUgTWF0Y2hlci51c2VQYXR0ZXJuKCl9LCB3aGljaCBpcyBuZXcgaW4KKyAgICogSmF2YSAxLjUuKSAgU28sIHdlIGNhbiB1c2UgdGhhdCwgYXQgbGVhc3QuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGltcGxpZXMKKyAgICogdGhhdCB3ZSBuZWVkIHRvIGhhdmUgdGhlIGVudGlyZSBpbnB1dCBpbiBvbmUgY29udGlndW91cyBzdHJpbmcuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUb2tlbml6ZXIgeworICAgIHByaXZhdGUgZmluYWwgQ2hhclNlcXVlbmNlIHRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXRjaGVyIG1hdGNoZXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudFRva2VuOworCisgICAgLy8gVGhlIGNoYXJhY3RlciBpbmRleCB3aXRoaW4gdGhpcy50ZXh0IGF0IHdoaWNoIHRoZSBjdXJyZW50IHRva2VuIGJlZ2lucy4KKyAgICBwcml2YXRlIGludCBwb3MgPSAwOworCisgICAgLy8gVGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIG9mIHRoZSBjdXJyZW50IHRva2VuLgorICAgIHByaXZhdGUgaW50IGxpbmUgPSAwOworICAgIHByaXZhdGUgaW50IGNvbHVtbiA9IDA7CisKKyAgICAvLyBUaGUgbGluZSBhbmQgY29sdW1uIG51bWJlcnMgb2YgdGhlIHByZXZpb3VzIHRva2VuIChhbGxvd3MgdGhyb3dpbmcKKyAgICAvLyBlcnJvcnMgKmFmdGVyKiBjb25zdW1pbmcpLgorICAgIHByaXZhdGUgaW50IHByZXZpb3VzTGluZSA9IDA7CisgICAgcHJpdmF0ZSBpbnQgcHJldmlvdXNDb2x1bW4gPSAwOworCisgICAgLy8gV2UgdXNlIHBvc3Nlc2l2ZSBxdWFudGlmaWVycyAoKisgYW5kICsrKSBiZWNhdXNlIG90aGVyd2lzZSB0aGUgSmF2YQorICAgIC8vIHJlZ2V4IG1hdGNoZXIgaGFzIHN0YWNrIG92ZXJmbG93cyBvbiBsYXJnZSBpbnB1dHMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBXSElURVNQQUNFID0KKyAgICAgIFBhdHRlcm4uY29tcGlsZSgiKFxcc3woIy4qJCkpKysiLCBQYXR0ZXJuLk1VTFRJTElORSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBUT0tFTiA9IFBhdHRlcm4uY29tcGlsZSgKKyAgICAgICJbYS16QS1aX11bMC05YS16QS1aXystXSorfCIgKyAgICAgICAgICAgICAgICAvLyBhbiBpZGVudGlmaWVyCisgICAgICAiWy5dP1swLTkrLV1bMC05YS16QS1aXy4rLV0qK3wiICsgICAgICAgICAgICAgLy8gYSBudW1iZXIKKyAgICAgICJcIihbXlwiXG5cXFxcXXxcXFxcLikqKyhcInxcXFxcPyQpfCIgKyAgICAgICAvLyBhIGRvdWJsZS1xdW90ZWQgc3RyaW5nCisgICAgICAiXCcoW15cJ1xuXFxcXF18XFxcXC4pKisoXCd8XFxcXD8kKSIsICAgICAgICAgLy8gYSBzaW5nbGUtcXVvdGVkIHN0cmluZworICAgICAgUGF0dGVybi5NVUxUSUxJTkUpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBET1VCTEVfSU5GSU5JVFkgPSBQYXR0ZXJuLmNvbXBpbGUoCisgICAgICAiLT9pbmYoaW5pdHkpPyIsCisgICAgICBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gRkxPQVRfSU5GSU5JVFkgPSBQYXR0ZXJuLmNvbXBpbGUoCisgICAgICAiLT9pbmYoaW5pdHkpP2Y/IiwKKyAgICAgIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBGTE9BVF9OQU4gPSBQYXR0ZXJuLmNvbXBpbGUoCisgICAgICAibmFuZj8iLAorICAgICAgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKKworICAgIC8qKiBDb25zdHJ1Y3QgYSB0b2tlbml6ZXIgdGhhdCBwYXJzZXMgdG9rZW5zIGZyb20gdGhlIGdpdmVuIHRleHQuICovCisgICAgcHJpdmF0ZSBUb2tlbml6ZXIoZmluYWwgQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICB0aGlzLm1hdGNoZXIgPSBXSElURVNQQUNFLm1hdGNoZXIodGV4dCk7CisgICAgICBza2lwV2hpdGVzcGFjZSgpOworICAgICAgbmV4dFRva2VuKCk7CisgICAgfQorCisgICAgLyoqIEFyZSB3ZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dD8gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhdEVuZCgpIHsKKyAgICAgIHJldHVybiBjdXJyZW50VG9rZW4ubGVuZ3RoKCkgPT0gMDsKKyAgICB9CisKKyAgICAvKiogQWR2YW5jZSB0byB0aGUgbmV4dCB0b2tlbi4gKi8KKyAgICBwdWJsaWMgdm9pZCBuZXh0VG9rZW4oKSB7CisgICAgICBwcmV2aW91c0xpbmUgPSBsaW5lOworICAgICAgcHJldmlvdXNDb2x1bW4gPSBjb2x1bW47CisKKyAgICAgIC8vIEFkdmFuY2UgdGhlIGxpbmUgY291bnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgIHdoaWxlIChwb3MgPCBtYXRjaGVyLnJlZ2lvblN0YXJ0KCkpIHsKKyAgICAgICAgaWYgKHRleHQuY2hhckF0KHBvcykgPT0gJ1xuJykgeworICAgICAgICAgICsrbGluZTsKKyAgICAgICAgICBjb2x1bW4gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICsrY29sdW1uOworICAgICAgICB9CisgICAgICAgICsrcG9zOworICAgICAgfQorCisgICAgICAvLyBNYXRjaCB0aGUgbmV4dCB0b2tlbi4KKyAgICAgIGlmIChtYXRjaGVyLnJlZ2lvblN0YXJ0KCkgPT0gbWF0Y2hlci5yZWdpb25FbmQoKSkgeworICAgICAgICAvLyBFT0YKKyAgICAgICAgY3VycmVudFRva2VuID0gIiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXRjaGVyLnVzZVBhdHRlcm4oVE9LRU4pOworICAgICAgICBpZiAobWF0Y2hlci5sb29raW5nQXQoKSkgeworICAgICAgICAgIGN1cnJlbnRUb2tlbiA9IG1hdGNoZXIuZ3JvdXAoKTsKKyAgICAgICAgICBtYXRjaGVyLnJlZ2lvbihtYXRjaGVyLmVuZCgpLCBtYXRjaGVyLnJlZ2lvbkVuZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBUYWtlIG9uZSBjaGFyYWN0ZXIuCisgICAgICAgICAgY3VycmVudFRva2VuID0gU3RyaW5nLnZhbHVlT2YodGV4dC5jaGFyQXQocG9zKSk7CisgICAgICAgICAgbWF0Y2hlci5yZWdpb24ocG9zICsgMSwgbWF0Y2hlci5yZWdpb25FbmQoKSk7CisgICAgICAgIH0KKworICAgICAgICBza2lwV2hpdGVzcGFjZSgpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNraXAgb3ZlciBhbnkgd2hpdGVzcGFjZSBzbyB0aGF0IHRoZSBtYXRjaGVyIHJlZ2lvbiBzdGFydHMgYXQgdGhlIG5leHQKKyAgICAgKiB0b2tlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2tpcFdoaXRlc3BhY2UoKSB7CisgICAgICBtYXRjaGVyLnVzZVBhdHRlcm4oV0hJVEVTUEFDRSk7CisgICAgICBpZiAobWF0Y2hlci5sb29raW5nQXQoKSkgeworICAgICAgICBtYXRjaGVyLnJlZ2lvbihtYXRjaGVyLmVuZCgpLCBtYXRjaGVyLnJlZ2lvbkVuZCgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBleGFjdGx5IG1hdGNoZXMge0Bjb2RlIHRva2VufSwgY29uc3VtZSBpdCBhbmQgcmV0dXJuCisgICAgICoge0Bjb2RlIHRydWV9LiAgT3RoZXJ3aXNlLCByZXR1cm4ge0Bjb2RlIGZhbHNlfSB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHRyeUNvbnN1bWUoZmluYWwgU3RyaW5nIHRva2VuKSB7CisgICAgICBpZiAoY3VycmVudFRva2VuLmVxdWFscyh0b2tlbikpIHsKKyAgICAgICAgbmV4dFRva2VuKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGV4YWN0bHkgbWF0Y2hlcyB7QGNvZGUgdG9rZW59LCBjb25zdW1lIGl0LiAgT3RoZXJ3aXNlLAorICAgICAqIHRocm93IGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25zdW1lKGZpbmFsIFN0cmluZyB0b2tlbikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgIGlmICghdHJ5Q29uc3VtZSh0b2tlbikpIHsKKyAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oIkV4cGVjdGVkIFwiIiArIHRva2VuICsgIlwiLiIpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGludGVnZXIsIGJ1dCBkb2VzCisgICAgICogbm90IGNvbnN1bWUgaXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbG9va2luZ0F0SW50ZWdlcigpIHsKKyAgICAgIGlmIChjdXJyZW50VG9rZW4ubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGZpbmFsIGNoYXIgYyA9IGN1cnJlbnRUb2tlbi5jaGFyQXQoMCk7CisgICAgICByZXR1cm4gKCcwJyA8PSBjICYmIGMgPD0gJzknKSB8fAorICAgICAgICAgICAgIGMgPT0gJy0nIHx8IGMgPT0gJysnOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGlkZW50aWZpZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuCisgICAgICogT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjb25zdW1lSWRlbnRpZmllcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRUb2tlbi5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIGZpbmFsIGNoYXIgYyA9IGN1cnJlbnRUb2tlbi5jaGFyQXQoaSk7CisgICAgICAgIGlmICgoJ2EnIDw9IGMgJiYgYyA8PSAneicpIHx8CisgICAgICAgICAgICAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpIHx8CisgICAgICAgICAgICAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8CisgICAgICAgICAgICAoYyA9PSAnXycpIHx8IChjID09ICcuJykpIHsKKyAgICAgICAgICAvLyBPSworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKCJFeHBlY3RlZCBpZGVudGlmaWVyLiIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBjdXJyZW50VG9rZW47CisgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMKKyAgICAgKiB2YWx1ZS4gIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29uc3VtZUludDMyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSBwYXJzZUludDMyKGN1cnJlbnRUb2tlbik7CisgICAgICAgIG5leHRUb2tlbigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgaW50ZWdlclBhcnNlRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMKKyAgICAgKiB2YWx1ZS4gIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29uc3VtZVVJbnQzMigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gcGFyc2VVSW50MzIoY3VycmVudFRva2VuKTsKKyAgICAgICAgbmV4dFRva2VuKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBpbnRlZ2VyUGFyc2VFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMKKyAgICAgKiB2YWx1ZS4gIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGNvbnN1bWVJbnQ2NCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBsb25nIHJlc3VsdCA9IHBhcnNlSW50NjQoY3VycmVudFRva2VuKTsKKyAgICAgICAgbmV4dFRva2VuKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBpbnRlZ2VyUGFyc2VFeGNlcHRpb24oZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cworICAgICAqIHZhbHVlLiAgT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGxvbmcgY29uc3VtZVVJbnQ2NCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBsb25nIHJlc3VsdCA9IHBhcnNlVUludDY0KGN1cnJlbnRUb2tlbik7CisgICAgICAgIG5leHRUb2tlbigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgaW50ZWdlclBhcnNlRXhjZXB0aW9uKGUpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgZG91YmxlLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlLgorICAgICAqIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgY29uc3VtZURvdWJsZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAvLyBXZSBuZWVkIHRvIHBhcnNlIGluZmluaXR5IGFuZCBuYW4gc2VwYXJhdGVseSBiZWNhdXNlCisgICAgICAvLyBEb3VibGUucGFyc2VEb3VibGUoKSBkb2VzIG5vdCBhY2NlcHQgImluZiIsICJpbmZpbml0eSIsIG9yICJuYW4iLgorICAgICAgaWYgKERPVUJMRV9JTkZJTklUWS5tYXRjaGVyKGN1cnJlbnRUb2tlbikubWF0Y2hlcygpKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbmVnYXRpdmUgPSBjdXJyZW50VG9rZW4uc3RhcnRzV2l0aCgiLSIpOworICAgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuIG5lZ2F0aXZlID8gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZIDogRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOworICAgICAgfQorICAgICAgaWYgKGN1cnJlbnRUb2tlbi5lcXVhbHNJZ25vcmVDYXNlKCJuYW4iKSkgeworICAgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuIERvdWJsZS5OYU47CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBkb3VibGUgcmVzdWx0ID0gRG91YmxlLnBhcnNlRG91YmxlKGN1cnJlbnRUb2tlbik7CisgICAgICAgIG5leHRUb2tlbigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgZmxvYXRQYXJzZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGZsb2F0LCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlLgorICAgICAqIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBjb25zdW1lRmxvYXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgLy8gV2UgbmVlZCB0byBwYXJzZSBpbmZpbml0eSBhbmQgbmFuIHNlcGFyYXRlbHkgYmVjYXVzZQorICAgICAgLy8gRmxvYXQucGFyc2VGbG9hdCgpIGRvZXMgbm90IGFjY2VwdCAiaW5mIiwgImluZmluaXR5Iiwgb3IgIm5hbiIuCisgICAgICBpZiAoRkxPQVRfSU5GSU5JVFkubWF0Y2hlcihjdXJyZW50VG9rZW4pLm1hdGNoZXMoKSkgeworICAgICAgICBmaW5hbCBib29sZWFuIG5lZ2F0aXZlID0gY3VycmVudFRva2VuLnN0YXJ0c1dpdGgoIi0iKTsKKyAgICAgICAgbmV4dFRva2VuKCk7CisgICAgICAgIHJldHVybiBuZWdhdGl2ZSA/IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZIDogRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFk7CisgICAgICB9CisgICAgICBpZiAoRkxPQVRfTkFOLm1hdGNoZXIoY3VycmVudFRva2VuKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgbmV4dFRva2VuKCk7CisgICAgICAgIHJldHVybiBGbG9hdC5OYU47CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBmbG9hdCByZXN1bHQgPSBGbG9hdC5wYXJzZUZsb2F0KGN1cnJlbnRUb2tlbik7CisgICAgICAgIG5leHRUb2tlbigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgZmxvYXRQYXJzZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGJvb2xlYW4sIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuCisgICAgICogT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29uc3VtZUJvb2xlYW4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgaWYgKGN1cnJlbnRUb2tlbi5lcXVhbHMoInRydWUiKSB8fAorICAgICAgICAgIGN1cnJlbnRUb2tlbi5lcXVhbHMoInQiKSB8fAorICAgICAgICAgIGN1cnJlbnRUb2tlbi5lcXVhbHMoIjEiKSkgeworICAgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRUb2tlbi5lcXVhbHMoImZhbHNlIikgfHwKKyAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLmVxdWFscygiZiIpIHx8CisgICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5lcXVhbHMoIjAiKSkgeworICAgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oIkV4cGVjdGVkIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIi4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIHN0cmluZywgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cyAodW5lc2NhcGVkKQorICAgICAqIHZhbHVlLiAgT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjb25zdW1lU3RyaW5nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBjb25zdW1lQnl0ZVN0cmluZygpLnRvU3RyaW5nVXRmOCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgc3RyaW5nLCBjb25zdW1lIGl0LCB1bmVzY2FwZSBpdCBhcyBhCisgICAgICoge0BsaW5rIEJ5dGVTdHJpbmd9LCBhbmQgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlLCB0aHJvdyBhCisgICAgICoge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZVN0cmluZyBjb25zdW1lQnl0ZVN0cmluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICBMaXN0PEJ5dGVTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEJ5dGVTdHJpbmc+KCk7CisgICAgICBjb25zdW1lQnl0ZVN0cmluZyhsaXN0KTsKKyAgICAgIHdoaWxlIChjdXJyZW50VG9rZW4uc3RhcnRzV2l0aCgiJyIpIHx8IGN1cnJlbnRUb2tlbi5zdGFydHNXaXRoKCJcIiIpKSB7CisgICAgICAgIGNvbnN1bWVCeXRlU3RyaW5nKGxpc3QpOworICAgICAgfQorICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20obGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2NvbnN1bWVCeXRlU3RyaW5nKCl9IGJ1dCBhZGRzIGVhY2ggdG9rZW4gb2YgdGhlIHN0cmluZyB0bworICAgICAqIHRoZSBnaXZlbiBsaXN0LiAgU3RyaW5nIGxpdGVyYWxzICh3aGV0aGVyIGJ5dGVzIG9yIHRleHQpIG1heSBjb21lIGluCisgICAgICogbXVsdGlwbGUgYWRqYWNlbnQgdG9rZW5zIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGNvbmNhdGVuYXRlZCwgbGlrZSBpbgorICAgICAqIEMgb3IgUHl0aG9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb25zdW1lQnl0ZVN0cmluZyhMaXN0PEJ5dGVTdHJpbmc+IGxpc3QpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBjaGFyIHF1b3RlID0gY3VycmVudFRva2VuLmxlbmd0aCgpID4gMCA/IGN1cnJlbnRUb2tlbi5jaGFyQXQoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1wwJzsKKyAgICAgIGlmIChxdW90ZSAhPSAnXCInICYmIHF1b3RlICE9ICdcJycpIHsKKyAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oIkV4cGVjdGVkIHN0cmluZy4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKGN1cnJlbnRUb2tlbi5sZW5ndGgoKSA8IDIgfHwKKyAgICAgICAgICBjdXJyZW50VG9rZW4uY2hhckF0KGN1cnJlbnRUb2tlbi5sZW5ndGgoKSAtIDEpICE9IHF1b3RlKSB7CisgICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKCJTdHJpbmcgbWlzc2luZyBlbmRpbmcgcXVvdGUuIik7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkID0KKyAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5zdWJzdHJpbmcoMSwgY3VycmVudFRva2VuLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIGZpbmFsIEJ5dGVTdHJpbmcgcmVzdWx0ID0gdW5lc2NhcGVCeXRlcyhlc2NhcGVkKTsKKyAgICAgICAgbmV4dFRva2VuKCk7CisgICAgICAgIGxpc3QuYWRkKHJlc3VsdCk7CisgICAgICB9IGNhdGNoIChJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBsaW5lIGFuZCBjb2x1bW4KKyAgICAgKiBudW1iZXJzIGluIHRoZSBkZXNjcmlwdGlvbiwgc3VpdGFibGUgZm9yIHRocm93aW5nLgorICAgICAqLworICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbiBwYXJzZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgIC8vIE5vdGU6ICBQZW9wbGUgZ2VuZXJhbGx5IHByZWZlciBvbmUtYmFzZWQgbGluZSBhbmQgY29sdW1uIG51bWJlcnMuCisgICAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAobGluZSArIDEpICsgIjoiICsgKGNvbHVtbiArIDEpICsgIjogIiArIGRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufSB3aXRoIHRoZSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBvZgorICAgICAqIHRoZSBwcmV2aW91cyB0b2tlbiBpbiB0aGUgZGVzY3JpcHRpb24sIHN1aXRhYmxlIGZvciB0aHJvd2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24gcGFyc2VFeGNlcHRpb25QcmV2aW91c1Rva2VuKAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgIC8vIE5vdGU6ICBQZW9wbGUgZ2VuZXJhbGx5IHByZWZlciBvbmUtYmFzZWQgbGluZSBhbmQgY29sdW1uIG51bWJlcnMuCisgICAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAocHJldmlvdXNMaW5lICsgMSkgKyAiOiIgKyAocHJldmlvdXNDb2x1bW4gKyAxKSArICI6ICIgKyBkZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBhcHByb3ByaWF0ZSB7QGxpbmsgUGFyc2VFeGNlcHRpb259IGZvciB0aGUgZ2l2ZW4KKyAgICAgKiB7QGNvZGUgTnVtYmVyRm9ybWF0RXhjZXB0aW9ufSB3aGVuIHRyeWluZyB0byBwYXJzZSBhbiBpbnRlZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgUGFyc2VFeGNlcHRpb24gaW50ZWdlclBhcnNlRXhjZXB0aW9uKAorICAgICAgICBmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIHBhcnNlRXhjZXB0aW9uKCJDb3VsZG4ndCBwYXJzZSBpbnRlZ2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gYXBwcm9wcmlhdGUge0BsaW5rIFBhcnNlRXhjZXB0aW9ufSBmb3IgdGhlIGdpdmVuCisgICAgICoge0Bjb2RlIE51bWJlckZvcm1hdEV4Y2VwdGlvbn0gd2hlbiB0cnlpbmcgdG8gcGFyc2UgYSBmbG9hdCBvciBkb3VibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXJzZUV4Y2VwdGlvbiBmbG9hdFBhcnNlRXhjZXB0aW9uKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gcGFyc2VFeGNlcHRpb24oIkNvdWxkbid0IHBhcnNlIG51bWJlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKiogVGhyb3duIHdoZW4gcGFyc2luZyBhbiBpbnZhbGlkIHRleHQgZm9ybWF0IG1lc3NhZ2UuICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzE5NjE4ODA2MDIyNTEwNzcwMkw7CisKKyAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSBhIHRleHQtZm9ybWF0IG1lc3NhZ2UgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSB0aGUgY29udGVudHMKKyAgICogaW50byB7QGNvZGUgYnVpbGRlcn0uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2UoZmluYWwgUmVhZGFibGUgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgbWVyZ2UoaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5LmdldEVtcHR5UmVnaXN0cnkoKSwgYnVpbGRlcik7CisgIH0KKworICAvKioKKyAgICogUGFyc2UgYSB0ZXh0LWZvcm1hdCBtZXNzYWdlIGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgbWVyZ2UgdGhlIGNvbnRlbnRzCisgICAqIGludG8ge0Bjb2RlIGJ1aWxkZXJ9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIG1lcmdlKGZpbmFsIENoYXJTZXF1ZW5jZSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICBtZXJnZShpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RW1wdHlSZWdpc3RyeSgpLCBidWlsZGVyKTsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSBhIHRleHQtZm9ybWF0IG1lc3NhZ2UgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSB0aGUgY29udGVudHMKKyAgICogaW50byB7QGNvZGUgYnVpbGRlcn0uICBFeHRlbnNpb25zIHdpbGwgYmUgcmVjb2duaXplZCBpZiB0aGV5IGFyZQorICAgKiByZWdpc3RlcmVkIGluIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2UoZmluYWwgUmVhZGFibGUgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAvLyBSZWFkIHRoZSBlbnRpcmUgaW5wdXQgdG8gYSBTdHJpbmcgdGhlbiBwYXJzZSB0aGF0LgorCisgICAgLy8gSWYgU3RyZWFtVG9rZW5pemVyIHdlcmUgbm90IHF1aXRlIHNvIGNyaXBwbGVkLCBvciBpZiB0aGVyZSB3ZXJlIGEga2luZAorICAgIC8vIG9mIFJlYWRlciB0aGF0IGNvdWxkIHJlYWQgaW4gY2h1bmtzIHRoYXQgbWF0Y2ggc29tZSBwYXJ0aWN1bGFyIHJlZ2V4LAorICAgIC8vIG9yIGlmIHdlIHdhbnRlZCB0byB3cml0ZSBhIGN1c3RvbSBSZWFkZXIgdG8gdG9rZW5pemUgb3VyIHN0cmVhbSwgdGhlbgorICAgIC8vIHdlIHdvdWxkIG5vdCBoYXZlIHRvIHJlYWQgdG8gb25lIGJpZyBTdHJpbmcuICBBbGFzLCBub25lIG9mIHRoZXNlIGlzCisgICAgLy8gdGhlIGNhc2UuICBPaCB3ZWxsLgorCisgICAgbWVyZ2UodG9TdHJpbmdCdWlsZGVyKGlucHV0KSwgZXh0ZW5zaW9uUmVnaXN0cnksIGJ1aWxkZXIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsKKworICAvLyBUT0RPKGNocmlzbik6IFNlZSBpZiB3b3JraW5nIGFyb3VuZCBqYXZhLmlvLlJlYWRlciNyZWFkKENoYXJCdWZmZXIpCisgIC8vIG92ZXJoZWFkIGlzIHdvcnRod2hpbGUKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nQnVpbGRlciB0b1N0cmluZ0J1aWxkZXIoZmluYWwgUmVhZGFibGUgaW5wdXQpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgZmluYWwgQ2hhckJ1ZmZlciBidWZmZXIgPSBDaGFyQnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9TSVpFKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgZmluYWwgaW50IG4gPSBpbnB1dC5yZWFkKGJ1ZmZlcik7CisgICAgICBpZiAobiA9PSAtMSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJ1ZmZlci5mbGlwKCk7CisgICAgICB0ZXh0LmFwcGVuZChidWZmZXIsIDAsIG4pOworICAgIH0KKyAgICByZXR1cm4gdGV4dDsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSBhIHRleHQtZm9ybWF0IG1lc3NhZ2UgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSB0aGUgY29udGVudHMKKyAgICogaW50byB7QGNvZGUgYnVpbGRlcn0uICBFeHRlbnNpb25zIHdpbGwgYmUgcmVjb2duaXplZCBpZiB0aGV5IGFyZQorICAgKiByZWdpc3RlcmVkIGluIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2UoZmluYWwgQ2hhclNlcXVlbmNlIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgZmluYWwgVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoaW5wdXQpOworCisgICAgd2hpbGUgKCF0b2tlbml6ZXIuYXRFbmQoKSkgeworICAgICAgbWVyZ2VGaWVsZCh0b2tlbml6ZXIsIGV4dGVuc2lvblJlZ2lzdHJ5LCBidWlsZGVyKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUGFyc2UgYSBzaW5nbGUgZmllbGQgZnJvbSB7QGNvZGUgdG9rZW5pemVyfSBhbmQgbWVyZ2UgaXQgaW50bworICAgKiB7QGNvZGUgYnVpbGRlcn0uCisgICAqLworICBwcml2YXRlIHN0YXRpYyB2b2lkIG1lcmdlRmllbGQoZmluYWwgVG9rZW5pemVyIHRva2VuaXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZDsKKyAgICBmaW5hbCBEZXNjcmlwdG9yIHR5cGUgPSBidWlsZGVyLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7CisgICAgRXh0ZW5zaW9uUmVnaXN0cnkuRXh0ZW5zaW9uSW5mbyBleHRlbnNpb24gPSBudWxsOworCisgICAgaWYgKHRva2VuaXplci50cnlDb25zdW1lKCJbIikpIHsKKyAgICAgIC8vIEFuIGV4dGVuc2lvbi4KKyAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgbmFtZSA9CisgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIodG9rZW5pemVyLmNvbnN1bWVJZGVudGlmaWVyKCkpOworICAgICAgd2hpbGUgKHRva2VuaXplci50cnlDb25zdW1lKCIuIikpIHsKKyAgICAgICAgbmFtZS5hcHBlbmQoJy4nKTsKKyAgICAgICAgbmFtZS5hcHBlbmQodG9rZW5pemVyLmNvbnN1bWVJZGVudGlmaWVyKCkpOworICAgICAgfQorCisgICAgICBleHRlbnNpb24gPSBleHRlbnNpb25SZWdpc3RyeS5maW5kRXh0ZW5zaW9uQnlOYW1lKG5hbWUudG9TdHJpbmcoKSk7CisKKyAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgeworICAgICAgICB0aHJvdyB0b2tlbml6ZXIucGFyc2VFeGNlcHRpb25QcmV2aW91c1Rva2VuKAorICAgICAgICAgICJFeHRlbnNpb24gXCIiICsgbmFtZSArICJcIiBub3QgZm91bmQgaW4gdGhlIEV4dGVuc2lvblJlZ2lzdHJ5LiIpOworICAgICAgfSBlbHNlIGlmIChleHRlbnNpb24uZGVzY3JpcHRvci5nZXRDb250YWluaW5nVHlwZSgpICE9IHR5cGUpIHsKKyAgICAgICAgdGhyb3cgdG9rZW5pemVyLnBhcnNlRXhjZXB0aW9uUHJldmlvdXNUb2tlbigKKyAgICAgICAgICAiRXh0ZW5zaW9uIFwiIiArIG5hbWUgKyAiXCIgZG9lcyBub3QgZXh0ZW5kIG1lc3NhZ2UgdHlwZSBcIiIgKworICAgICAgICAgIHR5cGUuZ2V0RnVsbE5hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKworICAgICAgdG9rZW5pemVyLmNvbnN1bWUoIl0iKTsKKworICAgICAgZmllbGQgPSBleHRlbnNpb24uZGVzY3JpcHRvcjsKKyAgICB9IGVsc2UgeworICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSB0b2tlbml6ZXIuY29uc3VtZUlkZW50aWZpZXIoKTsKKyAgICAgIGZpZWxkID0gdHlwZS5maW5kRmllbGRCeU5hbWUobmFtZSk7CisKKyAgICAgIC8vIEdyb3VwIG5hbWVzIGFyZSBleHBlY3RlZCB0byBiZSBjYXBpdGFsaXplZCBhcyB0aGV5IGFwcGVhciBpbiB0aGUKKyAgICAgIC8vIC5wcm90byBmaWxlLCB3aGljaCBhY3R1YWxseSBtYXRjaGVzIHRoZWlyIHR5cGUgbmFtZXMsIG5vdCB0aGVpciBmaWVsZAorICAgICAgLy8gbmFtZXMuCisgICAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgICAvLyBFeHBsaWNpdGx5IHNwZWNpZnkgVVMgbG9jYWxlIHNvIHRoYXQgdGhpcyBjb2RlIGRvZXMgbm90IGJyZWFrIHdoZW4KKyAgICAgICAgLy8gZXhlY3V0aW5nIGluIFR1cmtleS4KKyAgICAgICAgZmluYWwgU3RyaW5nIGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKKyAgICAgICAgZmllbGQgPSB0eXBlLmZpbmRGaWVsZEJ5TmFtZShsb3dlck5hbWUpOworICAgICAgICAvLyBJZiB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCB3b3JrZWQgYnV0IHRoZSBmaWVsZCBpcyBOT1QgYSBncm91cCwKKyAgICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgZmllbGQuZ2V0VHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvci5UeXBlLkdST1VQKSB7CisgICAgICAgICAgZmllbGQgPSBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBBZ2Fpbiwgc3BlY2lhbC1jYXNlIGdyb3VwIG5hbWVzIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmIGZpZWxkLmdldFR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuVHlwZS5HUk9VUCAmJgorICAgICAgICAgICFmaWVsZC5nZXRNZXNzYWdlVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgZmllbGQgPSBudWxsOworICAgICAgfQorCisgICAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyB0b2tlbml6ZXIucGFyc2VFeGNlcHRpb25QcmV2aW91c1Rva2VuKAorICAgICAgICAgICJNZXNzYWdlIHR5cGUgXCIiICsgdHlwZS5nZXRGdWxsTmFtZSgpICsKKyAgICAgICAgICAiXCIgaGFzIG5vIGZpZWxkIG5hbWVkIFwiIiArIG5hbWUgKyAiXCIuIik7CisgICAgICB9CisgICAgfQorCisgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKworICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7CisgICAgICB0b2tlbml6ZXIudHJ5Q29uc3VtZSgiOiIpOyAgLy8gb3B0aW9uYWwKKworICAgICAgZmluYWwgU3RyaW5nIGVuZFRva2VuOworICAgICAgaWYgKHRva2VuaXplci50cnlDb25zdW1lKCI8IikpIHsKKyAgICAgICAgZW5kVG9rZW4gPSAiPiI7CisgICAgICB9IGVsc2UgeworICAgICAgICB0b2tlbml6ZXIuY29uc3VtZSgieyIpOworICAgICAgICBlbmRUb2tlbiA9ICJ9IjsKKyAgICAgIH0KKworICAgICAgZmluYWwgTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXI7CisgICAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKKyAgICAgICAgc3ViQnVpbGRlciA9IGJ1aWxkZXIubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN1YkJ1aWxkZXIgPSBleHRlbnNpb24uZGVmYXVsdEluc3RhbmNlLm5ld0J1aWxkZXJGb3JUeXBlKCk7CisgICAgICB9CisKKyAgICAgIHdoaWxlICghdG9rZW5pemVyLnRyeUNvbnN1bWUoZW5kVG9rZW4pKSB7CisgICAgICAgIGlmICh0b2tlbml6ZXIuYXRFbmQoKSkgeworICAgICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICJFeHBlY3RlZCBcIiIgKyBlbmRUb2tlbiArICJcIi4iKTsKKyAgICAgICAgfQorICAgICAgICBtZXJnZUZpZWxkKHRva2VuaXplciwgZXh0ZW5zaW9uUmVnaXN0cnksIHN1YkJ1aWxkZXIpOworICAgICAgfQorCisgICAgICB2YWx1ZSA9IHN1YkJ1aWxkZXIuYnVpbGQoKTsKKworICAgIH0gZWxzZSB7CisgICAgICB0b2tlbml6ZXIuY29uc3VtZSgiOiIpOworCisgICAgICBzd2l0Y2ggKGZpZWxkLmdldFR5cGUoKSkgeworICAgICAgICBjYXNlIElOVDMyOgorICAgICAgICBjYXNlIFNJTlQzMjoKKyAgICAgICAgY2FzZSBTRklYRUQzMjoKKyAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lSW50MzIoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOVDY0OgorICAgICAgICBjYXNlIFNJTlQ2NDoKKyAgICAgICAgY2FzZSBTRklYRUQ2NDoKKyAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lSW50NjQoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFVJTlQzMjoKKyAgICAgICAgY2FzZSBGSVhFRDMyOgorICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVVSW50MzIoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFVJTlQ2NDoKKyAgICAgICAgY2FzZSBGSVhFRDY0OgorICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVVSW50NjQoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVGbG9hdCgpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVEb3VibGUoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJPT0w6CisgICAgICAgICAgdmFsdWUgPSB0b2tlbml6ZXIuY29uc3VtZUJvb2xlYW4oKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUUklORzoKKyAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lU3RyaW5nKCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCWVRFUzoKKyAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lQnl0ZVN0cmluZygpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRU5VTToKKyAgICAgICAgICBmaW5hbCBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZSA9IGZpZWxkLmdldEVudW1UeXBlKCk7CisKKyAgICAgICAgICBpZiAodG9rZW5pemVyLmxvb2tpbmdBdEludGVnZXIoKSkgeworICAgICAgICAgICAgZmluYWwgaW50IG51bWJlciA9IHRva2VuaXplci5jb25zdW1lSW50MzIoKTsKKyAgICAgICAgICAgIHZhbHVlID0gZW51bVR5cGUuZmluZFZhbHVlQnlOdW1iZXIobnVtYmVyKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvblByZXZpb3VzVG9rZW4oCisgICAgICAgICAgICAgICAgIkVudW0gdHlwZSBcIiIgKyBlbnVtVHlwZS5nZXRGdWxsTmFtZSgpICsKKyAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIHZhbHVlIHdpdGggbnVtYmVyICIgKyBudW1iZXIgKyAnLicpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSB0b2tlbml6ZXIuY29uc3VtZUlkZW50aWZpZXIoKTsKKyAgICAgICAgICAgIHZhbHVlID0gZW51bVR5cGUuZmluZFZhbHVlQnlOYW1lKGlkKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvblByZXZpb3VzVG9rZW4oCisgICAgICAgICAgICAgICAgIkVudW0gdHlwZSBcIiIgKyBlbnVtVHlwZS5nZXRGdWxsTmFtZSgpICsKKyAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIHZhbHVlIG5hbWVkIFwiIiArIGlkICsgIlwiLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUVTU0FHRToKKyAgICAgICAgY2FzZSBHUk9VUDoKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3QgZ2V0IGhlcmUuIik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgeworICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBVdGlsaXR5IGZ1bmN0aW9ucworICAvLworICAvLyBTb21lIG9mIHRoZXNlIG1ldGhvZHMgYXJlIHBhY2thZ2UtcHJpdmF0ZSBiZWNhdXNlIERlc2NyaXB0b3JzLmphdmEgdXNlcworICAvLyB0aGVtLgorCisgIC8qKgorICAgKiBFc2NhcGVzIGJ5dGVzIGluIHRoZSBmb3JtYXQgdXNlZCBpbiBwcm90b2NvbCBidWZmZXIgdGV4dCBmb3JtYXQsIHdoaWNoCisgICAqIGlzIHRoZSBzYW1lIGFzIHRoZSBmb3JtYXQgdXNlZCBmb3IgQyBzdHJpbmcgbGl0ZXJhbHMuICBBbGwgYnl0ZXMKKyAgICogdGhhdCBhcmUgbm90IHByaW50YWJsZSA3LWJpdCBBU0NJSSBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLCBhcyB3ZWxsIGFzCisgICAqIGJhY2tzbGFzaCwgc2luZ2xlLXF1b3RlLCBhbmQgZG91YmxlLXF1b3RlIGNoYXJhY3RlcnMuICBDaGFyYWN0ZXJzIGZvcgorICAgKiB3aGljaCBubyBkZWZpbmVkIHNob3J0LWhhbmQgZXNjYXBlIHNlcXVlbmNlIGlzIGRlZmluZWQgd2lsbCBiZSBlc2NhcGVkCisgICAqIHVzaW5nIDMtZGlnaXQgb2N0YWwgc2VxdWVuY2VzLgorICAgKi8KKyAgc3RhdGljIFN0cmluZyBlc2NhcGVCeXRlcyhmaW5hbCBCeXRlU3RyaW5nIGlucHV0KSB7CisgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoaW5wdXQuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgaSsrKSB7CisgICAgICBmaW5hbCBieXRlIGIgPSBpbnB1dC5ieXRlQXQoaSk7CisgICAgICBzd2l0Y2ggKGIpIHsKKyAgICAgICAgLy8gSmF2YSBkb2VzIG5vdCByZWNvZ25pemUgXGEgb3IgXHYsIGFwcGFyZW50bHkuCisgICAgICAgIGNhc2UgMHgwNzogYnVpbGRlci5hcHBlbmQoIlxcYSIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xiJzogYnVpbGRlci5hcHBlbmQoIlxcYiIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xmJzogYnVpbGRlci5hcHBlbmQoIlxcZiIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xuJzogYnVpbGRlci5hcHBlbmQoIlxcbiIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xyJzogYnVpbGRlci5hcHBlbmQoIlxcciIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1x0JzogYnVpbGRlci5hcHBlbmQoIlxcdCIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwYjogYnVpbGRlci5hcHBlbmQoIlxcdiIgKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xcJzogYnVpbGRlci5hcHBlbmQoIlxcXFwiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wnJzogYnVpbGRlci5hcHBlbmQoIlxcXCciKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJyInIDogYnVpbGRlci5hcHBlbmQoIlxcXCIiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLy8gTm90ZTogIEJ5dGVzIHdpdGggdGhlIGhpZ2gtb3JkZXIgYml0IHNldCBzaG91bGQgYmUgZXNjYXBlZC4gIFNpbmNlCisgICAgICAgICAgLy8gICBieXRlcyBhcmUgc2lnbmVkLCBzdWNoIGJ5dGVzIHdpbGwgY29tcGFyZSBsZXNzIHRoYW4gMHgyMCwgaGVuY2UKKyAgICAgICAgICAvLyAgIHRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0LgorICAgICAgICAgIGlmIChiID49IDB4MjApIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKSBiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1xcJyk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgoY2hhcikgKCcwJyArICgoYiA+Pj4gNikgJiAzKSkpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoKGNoYXIpICgnMCcgKyAoKGIgPj4+IDMpICYgNykpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKSAoJzAnICsgKGIgJiA3KSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgfQorCisgIC8qKgorICAgKiBVbi1lc2NhcGUgYSBieXRlIHNlcXVlbmNlIGFzIGVzY2FwZWQgdXNpbmcKKyAgICoge0BsaW5rICNlc2NhcGVCeXRlcyhCeXRlU3RyaW5nKX0uICBUd28tZGlnaXQgaGV4IGVzY2FwZXMgKHN0YXJ0aW5nIHdpdGgKKyAgICogIlx4IikgYXJlIGFsc28gcmVjb2duaXplZC4KKyAgICovCisgIHN0YXRpYyBCeXRlU3RyaW5nIHVuZXNjYXBlQnl0ZXMoZmluYWwgQ2hhclNlcXVlbmNlIGNoYXJTdHJpbmcpCisgICAgICB0aHJvd3MgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIHsKKyAgICAvLyBGaXJzdCBjb252ZXJ0IHRoZSBKYXZhIGNoYXJhY2F0ZXIgc2VxdWVuY2UgdG8gVVRGLTggYnl0ZXMuCisgICAgQnl0ZVN0cmluZyBpbnB1dCA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KGNoYXJTdHJpbmcudG9TdHJpbmcoKSk7CisgICAgLy8gVGhlbiB1bmVzY2FwZSBjZXJ0YWluIGJ5dGUgc2VxdWVuY2VzIGludHJvZHVjZWQgYnkgQVNDSUkgJ1xcJy4gIFRoZSB2YWxpZAorICAgIC8vIGVzY2FwZXMgY2FuIGFsbCBiZSBleHByZXNzZWQgd2l0aCBBU0NJSSBjaGFyYWN0ZXJzLCBzbyBpdCBpcyBzYWZlIHRvCisgICAgLy8gb3BlcmF0ZSBvbiBieXRlcyBoZXJlLgorICAgIC8vCisgICAgLy8gVW5lc2NhcGluZyB0aGUgaW5wdXQgYnl0ZSBhcnJheSB3aWxsIHJlc3VsdCBpbiBhIGJ5dGUgc2VxdWVuY2UgdGhhdCdzIG5vCisgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIGlucHV0LiAgVGhhdCdzIGJlY2F1c2UgZWFjaCBlc2NhcGUgc2VxdWVuY2UgaXMgYmV0d2VlbgorICAgIC8vIHR3byBhbmQgZm91ciBieXRlcyBsb25nIGFuZCBzdGFuZHMgZm9yIGEgc2luZ2xlIGJ5dGUuCisgICAgZmluYWwgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2lucHV0LnNpemUoKV07CisgICAgaW50IHBvcyA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7IGkrKykgeworICAgICAgYnl0ZSBjID0gaW5wdXQuYnl0ZUF0KGkpOworICAgICAgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkpIHsKKyAgICAgICAgICArK2k7CisgICAgICAgICAgYyA9IGlucHV0LmJ5dGVBdChpKTsKKyAgICAgICAgICBpZiAoaXNPY3RhbChjKSkgeworICAgICAgICAgICAgLy8gT2N0YWwgZXNjYXBlLgorICAgICAgICAgICAgaW50IGNvZGUgPSBkaWdpdFZhbHVlKGMpOworICAgICAgICAgICAgaWYgKGkgKyAxIDwgaW5wdXQuc2l6ZSgpICYmIGlzT2N0YWwoaW5wdXQuYnl0ZUF0KGkgKyAxKSkpIHsKKyAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICBjb2RlID0gY29kZSAqIDggKyBkaWdpdFZhbHVlKGlucHV0LmJ5dGVBdChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkgJiYgaXNPY3RhbChpbnB1dC5ieXRlQXQoaSArIDEpKSkgeworICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogOCArIGRpZ2l0VmFsdWUoaW5wdXQuYnl0ZUF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IENoZWNrIHRoYXQgMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhGRi4KKyAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSAoYnl0ZSljb2RlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgY2FzZSAnYScgOiByZXN1bHRbcG9zKytdID0gMHgwNzsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ2InIDogcmVzdWx0W3BvcysrXSA9ICdcYic7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlICdmJyA6IHJlc3VsdFtwb3MrK10gPSAnXGYnOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAnbicgOiByZXN1bHRbcG9zKytdID0gJ1xuJzsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ3InIDogcmVzdWx0W3BvcysrXSA9ICdccic7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlICd0JyA6IHJlc3VsdFtwb3MrK10gPSAnXHQnOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAndicgOiByZXN1bHRbcG9zKytdID0gMHgwYjsgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJ1xcJzogcmVzdWx0W3BvcysrXSA9ICdcXCc7IGJyZWFrOworICAgICAgICAgICAgICBjYXNlICdcJyc6IHJlc3VsdFtwb3MrK10gPSAnXCcnOyBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAnIicgOiByZXN1bHRbcG9zKytdID0gJ1wiJzsgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICAgICAgLy8gaGV4IGVzY2FwZQorICAgICAgICAgICAgICAgIGludCBjb2RlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkgJiYgaXNIZXgoaW5wdXQuYnl0ZUF0KGkgKyAxKSkpIHsKKyAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgIGNvZGUgPSBkaWdpdFZhbHVlKGlucHV0LmJ5dGVBdChpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlOiAnXFx4JyB3aXRoIG5vIGRpZ2l0cyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkgJiYgaXNIZXgoaW5wdXQuYnl0ZUF0KGkgKyAxKSkpIHsKKyAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogMTYgKyBkaWdpdFZhbHVlKGlucHV0LmJ5dGVBdChpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSAoYnl0ZSljb2RlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFc2NhcGVTZXF1ZW5jZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlOiAnXFwiICsgKGNoYXIpYyArICdcJycpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6ICdcXCcgYXQgZW5kIG9mIHN0cmluZy4iKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0W3BvcysrXSA9IGM7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20ocmVzdWx0LCAwLCBwb3MpOworICB9CisKKyAgLyoqCisgICAqIFRocm93biBieSB7QGxpbmsgVGV4dEZvcm1hdCN1bmVzY2FwZUJ5dGVzfSBhbmQKKyAgICoge0BsaW5rIFRleHRGb3JtYXQjdW5lc2NhcGVUZXh0fSB3aGVuIGFuIGludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGlzIHNlZW4uCisgICAqLworICBzdGF0aWMgY2xhc3MgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MTY0MDMzNjUwMTQyNTkzMzA0TDsKKworICAgIEludmFsaWRFc2NhcGVTZXF1ZW5jZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgIHN1cGVyKGRlc2NyaXB0aW9uKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTGlrZSB7QGxpbmsgI2VzY2FwZUJ5dGVzKEJ5dGVTdHJpbmcpfSwgYnV0IGVzY2FwZXMgYSB0ZXh0IHN0cmluZy4KKyAgICogTm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIGZpcnN0IGVuY29kZWQgYXMgVVRGLTgsIHRoZW4gZWFjaCBieXRlIGlzIGVzY2FwZWQKKyAgICogaW5kaXZpZHVhbGx5IGFzIGEgMy1kaWdpdCBvY3RhbCBlc2NhcGUuICBZZXMsIGl0J3Mgd2VpcmQuCisgICAqLworICBzdGF0aWMgU3RyaW5nIGVzY2FwZVRleHQoZmluYWwgU3RyaW5nIGlucHV0KSB7CisgICAgcmV0dXJuIGVzY2FwZUJ5dGVzKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KGlucHV0KSk7CisgIH0KKworICAvKioKKyAgICogVW4tZXNjYXBlIGEgdGV4dCBzdHJpbmcgYXMgZXNjYXBlZCB1c2luZyB7QGxpbmsgI2VzY2FwZVRleHQoU3RyaW5nKX0uCisgICAqIFR3by1kaWdpdCBoZXggZXNjYXBlcyAoc3RhcnRpbmcgd2l0aCAiXHgiKSBhcmUgYWxzbyByZWNvZ25pemVkLgorICAgKi8KKyAgc3RhdGljIFN0cmluZyB1bmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIGlucHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gdW5lc2NhcGVCeXRlcyhpbnB1dCkudG9TdHJpbmdVdGY4KCk7CisgIH0KKworICAvKiogSXMgdGhpcyBhbiBvY3RhbCBkaWdpdD8gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09jdGFsKGZpbmFsIGJ5dGUgYykgeworICAgIHJldHVybiAnMCcgPD0gYyAmJiBjIDw9ICc3JzsKKyAgfQorCisgIC8qKiBJcyB0aGlzIGEgaGV4IGRpZ2l0PyAqLworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSGV4KGZpbmFsIGJ5dGUgYykgeworICAgIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8CisgICAgICAgICAgICgnYScgPD0gYyAmJiBjIDw9ICdmJykgfHwKKyAgICAgICAgICAgKCdBJyA8PSBjICYmIGMgPD0gJ0YnKTsKKyAgfQorCisgIC8qKgorICAgKiBJbnRlcnByZXQgYSBjaGFyYWN0ZXIgYXMgYSBkaWdpdCAoaW4gYW55IGJhc2UgdXAgdG8gMzYpIGFuZCByZXR1cm4gdGhlCisgICAqIG51bWVyaWMgdmFsdWUuICBUaGlzIGlzIGxpa2Uge0Bjb2RlIENoYXJhY3Rlci5kaWdpdCgpfSBidXQgd2UgZG9uJ3QgYWNjZXB0CisgICAqIG5vbi1BU0NJSSBkaWdpdHMuCisgICAqLworICBwcml2YXRlIHN0YXRpYyBpbnQgZGlnaXRWYWx1ZShmaW5hbCBieXRlIGMpIHsKKyAgICBpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHsKKyAgICAgIHJldHVybiBjIC0gJzAnOworICAgIH0gZWxzZSBpZiAoJ2EnIDw9IGMgJiYgYyA8PSAneicpIHsKKyAgICAgIHJldHVybiBjIC0gJ2EnICsgMTA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjIC0gJ0EnICsgMTA7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFBhcnNlIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGZyb20gdGhlIHRleHQuICBVbmxpa2UgdGhlIEphdmEgc3RhbmRhcmQKKyAgICoge0Bjb2RlIEludGVnZXIucGFyc2VJbnQoKX0sIHRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyB0aGUgcHJlZml4ZXMgIjB4IgorICAgKiBhbmQgIjAiIHRvIHNpZ25pZnkgaGV4aWRlY2ltYWwgYW5kIG9jdGFsIG51bWJlcnMsIHJlc3BlY3RpdmVseS4KKyAgICovCisgIHN0YXRpYyBpbnQgcGFyc2VJbnQzMihmaW5hbCBTdHJpbmcgdGV4dCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChpbnQpIHBhcnNlSW50ZWdlcih0ZXh0LCB0cnVlLCBmYWxzZSk7CisgIH0KKworICAvKioKKyAgICogUGFyc2UgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBmcm9tIHRoZSB0ZXh0LiAgVW5saWtlIHRoZSBKYXZhIHN0YW5kYXJkCisgICAqIHtAY29kZSBJbnRlZ2VyLnBhcnNlSW50KCl9LCB0aGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHByZWZpeGVzICIweCIKKyAgICogYW5kICIwIiB0byBzaWduaWZ5IGhleGlkZWNpbWFsIGFuZCBvY3RhbCBudW1iZXJzLCByZXNwZWN0aXZlbHkuICBUaGUKKyAgICogcmVzdWx0IGlzIGNvZXJjZWQgdG8gYSAoc2lnbmVkKSB7QGNvZGUgaW50fSB3aGVuIHJldHVybmVkIHNpbmNlIEphdmEgaGFzCisgICAqIG5vIHVuc2lnbmVkIGludGVnZXIgdHlwZS4KKyAgICovCisgIHN0YXRpYyBpbnQgcGFyc2VVSW50MzIoZmluYWwgU3RyaW5nIHRleHQpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24geworICAgIHJldHVybiAoaW50KSBwYXJzZUludGVnZXIodGV4dCwgZmFsc2UsIGZhbHNlKTsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZSBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciBmcm9tIHRoZSB0ZXh0LiAgVW5saWtlIHRoZSBKYXZhIHN0YW5kYXJkCisgICAqIHtAY29kZSBJbnRlZ2VyLnBhcnNlSW50KCl9LCB0aGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHByZWZpeGVzICIweCIKKyAgICogYW5kICIwIiB0byBzaWduaWZ5IGhleGlkZWNpbWFsIGFuZCBvY3RhbCBudW1iZXJzLCByZXNwZWN0aXZlbHkuCisgICAqLworICBzdGF0aWMgbG9uZyBwYXJzZUludDY0KGZpbmFsIFN0cmluZyB0ZXh0KSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcGFyc2VJbnRlZ2VyKHRleHQsIHRydWUsIHRydWUpOworICB9CisKKyAgLyoqCisgICAqIFBhcnNlIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgZnJvbSB0aGUgdGV4dC4gIFVubGlrZSB0aGUgSmF2YSBzdGFuZGFyZAorICAgKiB7QGNvZGUgSW50ZWdlci5wYXJzZUludCgpfSwgdGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIHRoZSBwcmVmaXhlcyAiMHgiCisgICAqIGFuZCAiMCIgdG8gc2lnbmlmeSBoZXhpZGVjaW1hbCBhbmQgb2N0YWwgbnVtYmVycywgcmVzcGVjdGl2ZWx5LiAgVGhlCisgICAqIHJlc3VsdCBpcyBjb2VyY2VkIHRvIGEgKHNpZ25lZCkge0Bjb2RlIGxvbmd9IHdoZW4gcmV0dXJuZWQgc2luY2UgSmF2YSBoYXMKKyAgICogbm8gdW5zaWduZWQgbG9uZyB0eXBlLgorICAgKi8KKyAgc3RhdGljIGxvbmcgcGFyc2VVSW50NjQoZmluYWwgU3RyaW5nIHRleHQpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZUludGVnZXIodGV4dCwgZmFsc2UsIHRydWUpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBwYXJzZUludGVnZXIoZmluYWwgU3RyaW5nIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNMb25nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKKyAgICBpbnQgcG9zID0gMDsKKworICAgIGJvb2xlYW4gbmVnYXRpdmUgPSBmYWxzZTsKKyAgICBpZiAodGV4dC5zdGFydHNXaXRoKCItIiwgcG9zKSkgeworICAgICAgaWYgKCFpc1NpZ25lZCkgeworICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJOdW1iZXIgbXVzdCBiZSBwb3NpdGl2ZTogIiArIHRleHQpOworICAgICAgfQorICAgICAgKytwb3M7CisgICAgICBuZWdhdGl2ZSA9IHRydWU7CisgICAgfQorCisgICAgaW50IHJhZGl4ID0gMTA7CisgICAgaWYgKHRleHQuc3RhcnRzV2l0aCgiMHgiLCBwb3MpKSB7CisgICAgICBwb3MgKz0gMjsKKyAgICAgIHJhZGl4ID0gMTY7CisgICAgfSBlbHNlIGlmICh0ZXh0LnN0YXJ0c1dpdGgoIjAiLCBwb3MpKSB7CisgICAgICByYWRpeCA9IDg7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIG51bWJlclRleHQgPSB0ZXh0LnN1YnN0cmluZyhwb3MpOworCisgICAgbG9uZyByZXN1bHQgPSAwOworICAgIGlmIChudW1iZXJUZXh0Lmxlbmd0aCgpIDwgMTYpIHsKKyAgICAgIC8vIENhbiBzYWZlbHkgYXNzdW1lIG5vIG92ZXJmbG93LgorICAgICAgcmVzdWx0ID0gTG9uZy5wYXJzZUxvbmcobnVtYmVyVGV4dCwgcmFkaXgpOworICAgICAgaWYgKG5lZ2F0aXZlKSB7CisgICAgICAgIHJlc3VsdCA9IC1yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGJvdW5kcy4KKyAgICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgZm9yIDY0LWJpdCBudW1iZXJzIHNpbmNlIHRoZXknZCBoYXZlIHRvIGJlIDE2IGNoYXJzCisgICAgICAvLyBvciBsb25nZXIgdG8gb3ZlcmZsb3cuCisgICAgICBpZiAoIWlzTG9uZykgeworICAgICAgICBpZiAoaXNTaWduZWQpIHsKKyAgICAgICAgICBpZiAocmVzdWx0ID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgcmVzdWx0IDwgSW50ZWdlci5NSU5fVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAzMi1iaXQgc2lnbmVkIGludGVnZXI6ICIgKyB0ZXh0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHJlc3VsdCA+PSAoMUwgPDwgMzIpIHx8IHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcjogIiArIHRleHQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBCaWdJbnRlZ2VyIGJpZ1ZhbHVlID0gbmV3IEJpZ0ludGVnZXIobnVtYmVyVGV4dCwgcmFkaXgpOworICAgICAgaWYgKG5lZ2F0aXZlKSB7CisgICAgICAgIGJpZ1ZhbHVlID0gYmlnVmFsdWUubmVnYXRlKCk7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGJvdW5kcy4KKyAgICAgIGlmICghaXNMb25nKSB7CisgICAgICAgIGlmIChpc1NpZ25lZCkgeworICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDMxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgMzItYml0IHNpZ25lZCBpbnRlZ2VyOiAiICsgdGV4dCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDMyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgMzItYml0IHVuc2lnbmVkIGludGVnZXI6ICIgKyB0ZXh0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc1NpZ25lZCkgeworICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDYzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgNjQtYml0IHNpZ25lZCBpbnRlZ2VyOiAiICsgdGV4dCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDY0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgNjQtYml0IHVuc2lnbmVkIGludGVnZXI6ICIgKyB0ZXh0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmVzdWx0ID0gYmlnVmFsdWUubG9uZ1ZhbHVlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzQzYzEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gYnVpbGQgYSBwcm90b2NvbCBtZXNzYWdlIHRoYXQgaXMgbWlzc2luZyByZXF1aXJlZAorICogZmllbGRzLiAgVGhpcyBpcyBhIHtAY29kZSBSdW50aW1lRXhjZXB0aW9ufSBiZWNhdXNlIGl0IG5vcm1hbGx5IHJlcHJlc2VudHMKKyAqIGEgcHJvZ3JhbW1pbmcgZXJyb3I6ICBpdCBoYXBwZW5zIHdoZW4gc29tZSBjb2RlIHdoaWNoIGNvbnN0cnVjdHMgYSBtZXNzYWdlCisgKiBmYWlscyB0byBzZXQgYWxsIHRoZSBmaWVsZHMuICB7QGNvZGUgcGFyc2VGcm9tKCl9IG1ldGhvZHMgPGI+ZG8gbm90PC9iPgorICogdGhyb3cgdGhpczsgdGhleSB0aHJvdyBhbiB7QGxpbmsgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9ufSBpZgorICogcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLCBiZWNhdXNlIGl0IGlzIG5vdCBhIHByb2dyYW1taW5nIGVycm9yIHRvCisgKiByZWNlaXZlIGFuIGluY29tcGxldGUgbWVzc2FnZS4gIEluIG90aGVyIHdvcmRzLAorICoge0Bjb2RlIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9ufSBzaG91bGQgbmV2ZXIgYmUgdGhyb3duIGJ5IGNvcnJlY3QKKyAqIGNvZGUsIGJ1dCB7QGNvZGUgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9ufSBtaWdodCBiZS4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgY2xhc3MgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc0NjY5Mjk5NTMzNzQ4ODM1MDdMOworCisgIHB1YmxpYyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihmaW5hbCBNZXNzYWdlTGl0ZSBtZXNzYWdlKSB7CisgICAgc3VwZXIoIk1lc3NhZ2Ugd2FzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLiAgKExpdGUgcnVudGltZSBjb3VsZCBub3QgIiArCisgICAgICAgICAgImRldGVybWluZSB3aGljaCBmaWVsZHMgd2VyZSBtaXNzaW5nKS4iKTsKKyAgICBtaXNzaW5nRmllbGRzID0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihmaW5hbCBMaXN0PFN0cmluZz4gbWlzc2luZ0ZpZWxkcykgeworICAgIHN1cGVyKGJ1aWxkRGVzY3JpcHRpb24obWlzc2luZ0ZpZWxkcykpOworICAgIHRoaXMubWlzc2luZ0ZpZWxkcyA9IG1pc3NpbmdGaWVsZHM7CisgIH0KKworICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBtaXNzaW5nRmllbGRzOworCisgIC8qKgorICAgKiBHZXQgYSBsaXN0IG9mIGh1bWFuLXJlYWRhYmxlIG5hbWVzIG9mIHJlcXVpcmVkIGZpZWxkcyBtaXNzaW5nIGZyb20gdGhpcworICAgKiBtZXNzYWdlLiAgRWFjaCBuYW1lIGlzIGEgZnVsbCBwYXRoIHRvIGEgZmllbGQsIGUuZy4gImZvby5iYXJbNV0uYmF6Ii4KKyAgICogUmV0dXJucyBudWxsIGlmIHRoZSBsaXRlIHJ1bnRpbWUgd2FzIHVzZWQsIHNpbmNlIGl0IGxhY2tzIHRoZSBhYmlsaXR5IHRvCisgICAqIGZpbmQgbWlzc2luZyBmaWVsZHMuCisgICAqLworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1pc3NpbmdGaWVsZHMoKSB7CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobWlzc2luZ0ZpZWxkcyk7CisgIH0KKworICAvKioKKyAgICogQ29udmVydHMgdGhpcyBleGNlcHRpb24gdG8gYW4ge0BsaW5rIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbn0uCisgICAqIFdoZW4gYSBwYXJzZWQgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcywgdGhpcyBzaG91bGQgYmUgdGhyb3duCisgICAqIGluc3RlYWQgb2Yge0Bjb2RlIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9ufS4KKyAgICovCisgIHB1YmxpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gYXNJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oKSB7CisgICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oZ2V0TWVzc2FnZSgpKTsKKyAgfQorCisgIC8qKiBDb25zdHJ1Y3QgdGhlIGRlc2NyaXB0aW9uIHN0cmluZyBmb3IgdGhpcyBleGNlcHRpb24uICovCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZERlc2NyaXB0aW9uKGZpbmFsIExpc3Q8U3RyaW5nPiBtaXNzaW5nRmllbGRzKSB7CisgICAgZmluYWwgU3RyaW5nQnVpbGRlciBkZXNjcmlwdGlvbiA9CisgICAgICBuZXcgU3RyaW5nQnVpbGRlcigiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmaW5hbCBTdHJpbmcgZmllbGQgOiBtaXNzaW5nRmllbGRzKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2NyaXB0aW9uLmFwcGVuZCgiLCAiKTsKKyAgICAgIH0KKyAgICAgIGRlc2NyaXB0aW9uLmFwcGVuZChmaWVsZCk7CisgICAgfQorICAgIHJldHVybiBkZXNjcmlwdGlvbi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5rbm93bkZpZWxkU2V0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5rbm93bkZpZWxkU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhMTVkMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRmllbGRTZXQuamF2YQpAQCAtMCwwICsxLDk1MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5BYnN0cmFjdE1lc3NhZ2VMaXRlLkJ1aWxkZXIuTGltaXRlZElucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworLyoqCisgKiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgZmllbGRzIHdoaWNoIHdlcmUgc2VlbiB3aGVuCisgKiBwYXJzaW5nIGEgcHJvdG9jb2wgbWVzc2FnZSBidXQgd2hvc2UgZmllbGQgbnVtYmVycyBvciB0eXBlcyBhcmUgdW5yZWNvZ25pemVkLgorICogVGhpcyBtb3N0IGZyZXF1ZW50bHkgb2NjdXJzIHdoZW4gbmV3IGZpZWxkcyBhcmUgYWRkZWQgdG8gYSBtZXNzYWdlIHR5cGUKKyAqIGFuZCB0aGVuIG1lc3NhZ2VzIGNvbnRhaW5pbmcgdGhvc2UgZmVpbGRzIGFyZSByZWFkIGJ5IG9sZCBzb2Z0d2FyZSB0aGF0IHdhcworICogY29tcGlsZWQgYmVmb3JlIHRoZSBuZXcgdHlwZXMgd2VyZSBhZGRlZC4KKyAqCisgKiA8cD5FdmVyeSB7QGxpbmsgTWVzc2FnZX0gY29udGFpbnMgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gKGFuZCBldmVyeQorICoge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0gY29udGFpbnMgYW4ge0BsaW5rIEJ1aWxkZXJ9KS4KKyAqCisgKiA8cD5Nb3N0IHVzZXJzIHdpbGwgbmV2ZXIgbmVlZCB0byB1c2UgdGhpcyBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVW5rbm93bkZpZWxkU2V0IGltcGxlbWVudHMgTWVzc2FnZUxpdGUgeworICBwcml2YXRlIFVua25vd25GaWVsZFNldCgpIHt9CisKKyAgLyoqIENyZWF0ZSBhIG5ldyB7QGxpbmsgQnVpbGRlcn0uICovCisgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKCkgeworICAgIHJldHVybiBCdWlsZGVyLmNyZWF0ZSgpOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgQnVpbGRlcn0gYW5kIGluaXRpYWxpemUgaXQgdG8gYmUgYSBjb3B5CisgICAqIG9mIHtAY29kZSBjb3B5RnJvbX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcihmaW5hbCBVbmtub3duRmllbGRTZXQgY29weUZyb20pIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShjb3B5RnJvbSk7CisgIH0KKworICAvKiogR2V0IGFuIGVtcHR5IHtAY29kZSBVbmtub3duRmllbGRTZXR9LiAqLworICBwdWJsaWMgc3RhdGljIFVua25vd25GaWVsZFNldCBnZXREZWZhdWx0SW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsKKyAgfQorICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsKKyAgfQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVbmtub3duRmllbGRTZXQgZGVmYXVsdEluc3RhbmNlID0KKyAgICBuZXcgVW5rbm93bkZpZWxkU2V0KENvbGxlY3Rpb25zLjxJbnRlZ2VyLCBGaWVsZD5lbXB0eU1hcCgpKTsKKworICAvKioKKyAgICogQ29uc3RydWN0IGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGFyb3VuZCB0aGUgZ2l2ZW4gbWFwLiAgVGhlIG1hcCBpcworICAgKiBleHBlY3RlZCB0byBiZSBpbW11dGFibGUuCisgICAqLworICBwcml2YXRlIFVua25vd25GaWVsZFNldChmaW5hbCBNYXA8SW50ZWdlciwgRmllbGQ+IGZpZWxkcykgeworICAgIHRoaXMuZmllbGRzID0gZmllbGRzOworICB9CisgIHByaXZhdGUgTWFwPEludGVnZXIsIEZpZWxkPiBmaWVsZHM7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb3RoZXIpIHsKKyAgICBpZiAodGhpcyA9PSBvdGhlcikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiAob3RoZXIgaW5zdGFuY2VvZiBVbmtub3duRmllbGRTZXQpICYmCisgICAgICAgICAgIGZpZWxkcy5lcXVhbHMoKChVbmtub3duRmllbGRTZXQpIG90aGVyKS5maWVsZHMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIGZpZWxkcy5oYXNoQ29kZSgpOworICB9CisKKyAgLyoqIEdldCBhIG1hcCBvZiBmaWVsZHMgaW4gdGhlIHNldCBieSBudW1iZXIuICovCisgIHB1YmxpYyBNYXA8SW50ZWdlciwgRmllbGQ+IGFzTWFwKCkgeworICAgIHJldHVybiBmaWVsZHM7CisgIH0KKworICAvKiogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpZWxkIG51bWJlciBpcyBwcmVzZW50IGluIHRoZSBzZXQuICovCisgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKGZpbmFsIGludCBudW1iZXIpIHsKKyAgICByZXR1cm4gZmllbGRzLmNvbnRhaW5zS2V5KG51bWJlcik7CisgIH0KKworICAvKioKKyAgICogR2V0IGEgZmllbGQgYnkgbnVtYmVyLiAgUmV0dXJucyBhbiBlbXB0eSBmaWVsZCBpZiBub3QgcHJlc2VudC4gIE5ldmVyCisgICAqIHJldHVybnMge0Bjb2RlIG51bGx9LgorICAgKi8KKyAgcHVibGljIEZpZWxkIGdldEZpZWxkKGZpbmFsIGludCBudW1iZXIpIHsKKyAgICBmaW5hbCBGaWVsZCByZXN1bHQgPSBmaWVsZHMuZ2V0KG51bWJlcik7CisgICAgcmV0dXJuIChyZXN1bHQgPT0gbnVsbCkgPyBGaWVsZC5nZXREZWZhdWx0SW5zdGFuY2UoKSA6IHJlc3VsdDsKKyAgfQorCisgIC8qKiBTZXJpYWxpemVzIHRoZSBzZXQgYW5kIHdyaXRlcyBpdCB0byB7QGNvZGUgb3V0cHV0fS4gKi8KKyAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgRmllbGQ+IGVudHJ5IDogZmllbGRzLmVudHJ5U2V0KCkpIHsKKyAgICAgIGVudHJ5LmdldFZhbHVlKCkud3JpdGVUbyhlbnRyeS5nZXRLZXkoKSwgb3V0cHV0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ29udmVydHMgdGhlIHNldCB0byBhIHN0cmluZyBpbiBwcm90b2NvbCBidWZmZXIgdGV4dCBmb3JtYXQuIFRoaXMgaXMKKyAgICoganVzdCBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQKKyAgICoge0BsaW5rIFRleHRGb3JtYXQjcHJpbnRUb1N0cmluZyhVbmtub3duRmllbGRTZXQpfS4KKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBUZXh0Rm9ybWF0LnByaW50VG9TdHJpbmcodGhpcyk7CisgIH0KKworICAvKioKKyAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIHtAY29kZSBCeXRlU3RyaW5nfSBhbmQgcmV0dXJucyBpdC4gVGhpcyBpcworICAgKiBqdXN0IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgI3dyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0pfS4KKyAgICovCisgIHB1YmxpYyBCeXRlU3RyaW5nIHRvQnl0ZVN0cmluZygpIHsKKyAgICB0cnkgeworICAgICAgZmluYWwgQnl0ZVN0cmluZy5Db2RlZEJ1aWxkZXIgb3V0ID0KKyAgICAgICAgQnl0ZVN0cmluZy5uZXdDb2RlZEJ1aWxkZXIoZ2V0U2VyaWFsaXplZFNpemUoKSk7CisgICAgICB3cml0ZVRvKG91dC5nZXRDb2RlZE91dHB1dCgpKTsKKyAgICAgIHJldHVybiBvdXQuYnVpbGQoKTsKKyAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgIlNlcmlhbGl6aW5nIHRvIGEgQnl0ZVN0cmluZyB0aHJldyBhbiBJT0V4Y2VwdGlvbiAoc2hvdWxkICIgKworICAgICAgICAibmV2ZXIgaGFwcGVuKS4iLCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIHtAY29kZSBieXRlfSBhcnJheSBhbmQgcmV0dXJucyBpdC4gIFRoaXMgaXMKKyAgICoganVzdCBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQge0BsaW5rICN3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtKX0uCisgICAqLworICBwdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgeworICAgIHRyeSB7CisgICAgICBmaW5hbCBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbZ2V0U2VyaWFsaXplZFNpemUoKV07CisgICAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShyZXN1bHQpOworICAgICAgd3JpdGVUbyhvdXRwdXQpOworICAgICAgb3V0cHV0LmNoZWNrTm9TcGFjZUxlZnQoKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICJTZXJpYWxpemluZyB0byBhIGJ5dGUgYXJyYXkgdGhyZXcgYW4gSU9FeGNlcHRpb24gIiArCisgICAgICAgICIoc2hvdWxkIG5ldmVyIGhhcHBlbikuIiwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgYW5kIHdyaXRlcyBpdCB0byB7QGNvZGUgb3V0cHV0fS4gIFRoaXMgaXMganVzdCBhCisgICAqIHRyaXZpYWwgd3JhcHBlciBhcm91bmQge0BsaW5rICN3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtKX0uCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRPdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShvdXRwdXQpOworICAgIHdyaXRlVG8oY29kZWRPdXRwdXQpOworICAgIGNvZGVkT3V0cHV0LmZsdXNoKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZURlbGltaXRlZFRvKE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRPdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShvdXRwdXQpOworICAgIGNvZGVkT3V0cHV0LndyaXRlUmF3VmFyaW50MzIoZ2V0U2VyaWFsaXplZFNpemUoKSk7CisgICAgd3JpdGVUbyhjb2RlZE91dHB1dCk7CisgICAgY29kZWRPdXRwdXQuZmx1c2goKTsKKyAgfQorCisgIC8qKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBlbmNvZGUgdGhpcyBzZXQuICovCisgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgRmllbGQ+IGVudHJ5IDogZmllbGRzLmVudHJ5U2V0KCkpIHsKKyAgICAgIHJlc3VsdCArPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFNlcmlhbGl6ZWRTaXplKGVudHJ5LmdldEtleSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBTZXJpYWxpemVzIHRoZSBzZXQgYW5kIHdyaXRlcyBpdCB0byB7QGNvZGUgb3V0cHV0fSB1c2luZworICAgKiB7QGNvZGUgTWVzc2FnZVNldH0gd2lyZSBmb3JtYXQuCisgICAqLworICBwdWJsaWMgdm9pZCB3cml0ZUFzTWVzc2FnZVNldFRvKGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgRmllbGQ+IGVudHJ5IDogZmllbGRzLmVudHJ5U2V0KCkpIHsKKyAgICAgIGVudHJ5LmdldFZhbHVlKCkud3JpdGVBc01lc3NhZ2VTZXRFeHRlbnNpb25UbygKKyAgICAgICAgZW50cnkuZ2V0S2V5KCksIG91dHB1dCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGVuY29kZSB0aGlzIHNldCB1c2luZworICAgKiB7QGNvZGUgTWVzc2FnZVNldH0gd2lyZSBmb3JtYXQuCisgICAqLworICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0KCkgeworICAgIGludCByZXN1bHQgPSAwOworICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEludGVnZXIsIEZpZWxkPiBlbnRyeSA6IGZpZWxkcy5lbnRyeVNldCgpKSB7CisgICAgICByZXN1bHQgKz0gZW50cnkuZ2V0VmFsdWUoKS5nZXRTZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldEV4dGVuc2lvbigKKyAgICAgICAgZW50cnkuZ2V0S2V5KCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKKyAgICAvLyBVbmtub3duRmllbGRTZXRzIGRvIG5vdCBoYXZlIHJlcXVpcmVkIGZpZWxkcywgc28gdGhleSBhcmUgYWx3YXlzCisgICAgLy8gaW5pdGlhbGl6ZWQuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKiogUGFyc2UgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLiAqLworICBwdWJsaWMgc3RhdGljIFVua25vd25GaWVsZFNldCBwYXJzZUZyb20oZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oaW5wdXQpLmJ1aWxkKCk7CisgIH0KKworICAvKiogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGFuZCByZXR1cm4gaXQuICovCisgIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IHBhcnNlRnJvbShmaW5hbCBCeXRlU3RyaW5nIGRhdGEpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShkYXRhKS5idWlsZCgpOworICB9CisKKyAgLyoqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSBhbmQgcmV0dXJuIGl0LiAqLworICBwdWJsaWMgc3RhdGljIFVua25vd25GaWVsZFNldCBwYXJzZUZyb20oZmluYWwgYnl0ZVtdIGRhdGEpCisgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShkYXRhKS5idWlsZCgpOworICB9CisKKyAgLyoqIFBhcnNlIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgcmV0dXJuIGl0LiAqLworICBwdWJsaWMgc3RhdGljIFVua25vd25GaWVsZFNldCBwYXJzZUZyb20oZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGlucHV0KS5idWlsZCgpOworICB9CisKKyAgcHVibGljIEJ1aWxkZXIgbmV3QnVpbGRlckZvclR5cGUoKSB7CisgICAgcmV0dXJuIG5ld0J1aWxkZXIoKTsKKyAgfQorCisgIHB1YmxpYyBCdWlsZGVyIHRvQnVpbGRlcigpIHsKKyAgICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbSh0aGlzKTsKKyAgfQorCisgIC8qKgorICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fXMuCisgICAqCisgICAqIDxwPk5vdGUgdGhhdCB0aGlzIGNsYXNzIG1haW50YWlucyB7QGxpbmsgRmllbGQuQnVpbGRlcn1zIGZvciBhbGwgZmllbGRzCisgICAqIGluIHRoZSBzZXQuICBUaHVzLCBhZGRpbmcgb25lIGVsZW1lbnQgdG8gYW4gZXhpc3Rpbmcge0BsaW5rIEZpZWxkfSBkb2VzIG5vdAorICAgKiByZXF1aXJlIG1ha2luZyBhIGNvcHkuICBUaGlzIGlzIGltcG9ydGFudCBmb3IgZWZmaWNpZW50IHBhcnNpbmcgb2YKKyAgICogdW5rbm93biByZXBlYXRlZCBmaWVsZHMuICBIb3dldmVyLCBpdCBpbXBsaWVzIHRoYXQge0BsaW5rIEZpZWxkfXMgY2Fubm90CisgICAqIGJlIGNvbnN0cnVjdGVkIGluZGVwZW5kZW50bHksIG5vciBjYW4gdHdvIHtAbGluayBVbmtub3duRmllbGRTZXR9cyBzaGFyZQorICAgKiB0aGUgc2FtZSB7QGNvZGUgRmllbGR9IG9iamVjdC4KKyAgICoKKyAgICogPHA+VXNlIHtAbGluayBVbmtub3duRmllbGRTZXQjbmV3QnVpbGRlcigpfSB0byBjb25zdHJ1Y3QgYSB7QGNvZGUgQnVpbGRlcn0uCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZS5CdWlsZGVyIHsKKyAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZGlyZWN0bHkgKGV4Y2VwdCBmcm9tICdjcmVhdGUnKS4KKyAgICBwcml2YXRlIEJ1aWxkZXIoKSB7fQorCisgICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgRmllbGQ+IGZpZWxkczsKKworICAgIC8vIE9wdGltaXphdGlvbjogIFdlIGtlZXAgYXJvdW5kIGEgYnVpbGRlciBmb3IgdGhlIGxhc3QgZmllbGQgdGhhdCB3YXMKKyAgICAvLyAgIG1vZGlmaWVkIHNvIHRoYXQgd2UgY2FuIGVmZmljaWVudGx5IGFkZCB0byBpdCBtdWx0aXBsZSB0aW1lcyBpbiBhCisgICAgLy8gICByb3cgKGltcG9ydGFudCB3aGVuIHBhcnNpbmcgYW4gdW5rbm93biByZXBlYXRlZCBmaWVsZCkuCisgICAgcHJpdmF0ZSBpbnQgbGFzdEZpZWxkTnVtYmVyOworICAgIHByaXZhdGUgRmllbGQuQnVpbGRlciBsYXN0RmllbGQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBCdWlsZGVyIGNyZWF0ZSgpIHsKKyAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7CisgICAgICBidWlsZGVyLnJlaW5pdGlhbGl6ZSgpOworICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgZmllbGQgYnVpbGRlciBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlciB3aGljaCBpbmNsdWRlcyBhbnkKKyAgICAgKiB2YWx1ZXMgdGhhdCBhbHJlYWR5IGV4aXN0LgorICAgICAqLworICAgIHByaXZhdGUgRmllbGQuQnVpbGRlciBnZXRGaWVsZEJ1aWxkZXIoZmluYWwgaW50IG51bWJlcikgeworICAgICAgaWYgKGxhc3RGaWVsZCAhPSBudWxsKSB7CisgICAgICAgIGlmIChudW1iZXIgPT0gbGFzdEZpZWxkTnVtYmVyKSB7CisgICAgICAgICAgcmV0dXJuIGxhc3RGaWVsZDsKKyAgICAgICAgfQorICAgICAgICAvLyBOb3RlOiAgYWRkRmllbGQoKSB3aWxsIHJlc2V0IGxhc3RGaWVsZCBhbmQgbGFzdEZpZWxkTnVtYmVyLgorICAgICAgICBhZGRGaWVsZChsYXN0RmllbGROdW1iZXIsIGxhc3RGaWVsZC5idWlsZCgpKTsKKyAgICAgIH0KKyAgICAgIGlmIChudW1iZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmFsIEZpZWxkIGV4aXN0aW5nID0gZmllbGRzLmdldChudW1iZXIpOworICAgICAgICBsYXN0RmllbGROdW1iZXIgPSBudW1iZXI7CisgICAgICAgIGxhc3RGaWVsZCA9IEZpZWxkLm5ld0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKKyAgICAgICAgICBsYXN0RmllbGQubWVyZ2VGcm9tKGV4aXN0aW5nKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFzdEZpZWxkOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkIHRoZSB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fSBhbmQgcmV0dXJuIGl0LgorICAgICAqCisgICAgICogPHA+T25jZSB7QGNvZGUgYnVpbGQoKX0gaGFzIGJlZW4gY2FsbGVkLCB0aGUge0Bjb2RlIEJ1aWxkZXJ9IHdpbGwgbm8KKyAgICAgKiBsb25nZXIgYmUgdXNhYmxlLiAgQ2FsbGluZyBhbnkgbWV0aG9kIGFmdGVyIHtAY29kZSBidWlsZCgpfSB3aWxsIHJlc3VsdAorICAgICAqIGluIHVuZGVmaW5lZCBiZWhhdmlvciBhbmQgY2FuIGNhdXNlIGEge0Bjb2RlIE51bGxQb2ludGVyRXhjZXB0aW9ufSB0byBiZQorICAgICAqIHRocm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IGJ1aWxkKCkgeworICAgICAgZ2V0RmllbGRCdWlsZGVyKDApOyAgLy8gRm9yY2UgbGFzdEZpZWxkIHRvIGJlIGJ1aWx0LgorICAgICAgZmluYWwgVW5rbm93bkZpZWxkU2V0IHJlc3VsdDsKKyAgICAgIGlmIChmaWVsZHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdCA9IGdldERlZmF1bHRJbnN0YW5jZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gbmV3IFVua25vd25GaWVsZFNldChDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoZmllbGRzKSk7CisgICAgICB9CisgICAgICBmaWVsZHMgPSBudWxsOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IGJ1aWxkUGFydGlhbCgpIHsKKyAgICAgIC8vIE5vIHJlcXVpcmVkIGZpZWxkcywgc28gdGhpcyBpcyB0aGUgc2FtZSBhcyBidWlsZCgpLgorICAgICAgcmV0dXJuIGJ1aWxkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXIgY2xvbmUoKSB7CisgICAgICBnZXRGaWVsZEJ1aWxkZXIoMCk7ICAvLyBGb3JjZSBsYXN0RmllbGQgdG8gYmUgYnVpbHQuCisgICAgICByZXR1cm4gVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKS5tZXJnZUZyb20oCisgICAgICAgICAgbmV3IFVua25vd25GaWVsZFNldChmaWVsZHMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7CisgICAgICByZXR1cm4gVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWluaXRpYWxpemUoKSB7CisgICAgICBmaWVsZHMgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICAgICAgbGFzdEZpZWxkTnVtYmVyID0gMDsKKyAgICAgIGxhc3RGaWVsZCA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJlc2V0IHRoZSBidWlsZGVyIHRvIGFuIGVtcHR5IHNldC4gKi8KKyAgICBwdWJsaWMgQnVpbGRlciBjbGVhcigpIHsKKyAgICAgIHJlaW5pdGlhbGl6ZSgpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVyZ2UgdGhlIGZpZWxkcyBmcm9tIHtAY29kZSBvdGhlcn0gaW50byB0aGlzIHNldC4gIElmIGEgZmllbGQgbnVtYmVyCisgICAgICogZXhpc3RzIGluIGJvdGggc2V0cywge0Bjb2RlIG90aGVyfSdzIHZhbHVlcyBmb3IgdGhhdCBmaWVsZCB3aWxsIGJlCisgICAgICogYXBwZW5kZWQgdG8gdGhlIHZhbHVlcyBpbiB0aGlzIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oZmluYWwgVW5rbm93bkZpZWxkU2V0IG90aGVyKSB7CisgICAgICBpZiAob3RoZXIgIT0gZ2V0RGVmYXVsdEluc3RhbmNlKCkpIHsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgRmllbGQ+IGVudHJ5IDogb3RoZXIuZmllbGRzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICBtZXJnZUZpZWxkKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgZmllbGQgdG8gdGhlIHtAY29kZSBVbmtub3duRmllbGRTZXR9LiAgSWYgYSBmaWVsZCB3aXRoIHRoZSBzYW1lCisgICAgICogbnVtYmVyIGFscmVhZHkgZXhpc3RzLCB0aGUgdHdvIGFyZSBtZXJnZWQuCisgICAgICovCisgICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGaWVsZChmaW5hbCBpbnQgbnVtYmVyLCBmaW5hbCBGaWVsZCBmaWVsZCkgeworICAgICAgaWYgKG51bWJlciA9PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgbnVtYmVyLiIpOworICAgICAgfQorICAgICAgaWYgKGhhc0ZpZWxkKG51bWJlcikpIHsKKyAgICAgICAgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikubWVyZ2VGcm9tKGZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE9wdGltaXphdGlvbjogIFdlIGNvdWxkIGNhbGwgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikubWVyZ2VGcm9tKGZpZWxkKQorICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGF0IHdvdWxkIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIEZpZWxkIG9iamVjdC4KKyAgICAgICAgLy8gV2UnZCByYXRoZXIgcmV1c2UgdGhlIG9uZSBwYXNzZWQgdG8gdXMsIHNvIGNhbGwgYWRkRmllbGQoKSBpbnN0ZWFkLgorICAgICAgICBhZGRGaWVsZChudW1iZXIsIGZpZWxkKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbWVyZ2luZyBhIG5ldyBmaWVsZCBjb250YWluaW5nIGEgc2luZ2xlIHZhcmludAorICAgICAqIHZhbHVlLiAgVGhpcyBpcyB1c2VkIGluIHBhcnRpY3VsYXIgd2hlbiBhbiB1bmtub3duIGVudW0gdmFsdWUgaXMKKyAgICAgKiBlbmNvdW50ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRlciBtZXJnZVZhcmludEZpZWxkKGZpbmFsIGludCBudW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgeworICAgICAgaWYgKG51bWJlciA9PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgbnVtYmVyLiIpOworICAgICAgfQorICAgICAgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikuYWRkVmFyaW50KHZhbHVlKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIGlzIHByZXNlbnQgaW4gdGhlIHNldC4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChmaW5hbCBpbnQgbnVtYmVyKSB7CisgICAgICBpZiAobnVtYmVyID09IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWmVybyBpcyBub3QgYSB2YWxpZCBmaWVsZCBudW1iZXIuIik7CisgICAgICB9CisgICAgICByZXR1cm4gbnVtYmVyID09IGxhc3RGaWVsZE51bWJlciB8fCBmaWVsZHMuY29udGFpbnNLZXkobnVtYmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmaWVsZCB0byB0aGUge0Bjb2RlIFVua25vd25GaWVsZFNldH0uICBJZiBhIGZpZWxkIHdpdGggdGhlIHNhbWUKKyAgICAgKiBudW1iZXIgYWxyZWFkeSBleGlzdHMsIGl0IGlzIHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIEJ1aWxkZXIgYWRkRmllbGQoZmluYWwgaW50IG51bWJlciwgZmluYWwgRmllbGQgZmllbGQpIHsKKyAgICAgIGlmIChudW1iZXIgPT0gMCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJaZXJvIGlzIG5vdCBhIHZhbGlkIGZpZWxkIG51bWJlci4iKTsKKyAgICAgIH0KKyAgICAgIGlmIChsYXN0RmllbGQgIT0gbnVsbCAmJiBsYXN0RmllbGROdW1iZXIgPT0gbnVtYmVyKSB7CisgICAgICAgIC8vIERpc2NhcmQgdGhpcy4KKyAgICAgICAgbGFzdEZpZWxkID0gbnVsbDsKKyAgICAgICAgbGFzdEZpZWxkTnVtYmVyID0gMDsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZHMuaXNFbXB0eSgpKSB7CisgICAgICAgIGZpZWxkcyA9IG5ldyBUcmVlTWFwPEludGVnZXIsRmllbGQ+KCk7CisgICAgICB9CisgICAgICBmaWVsZHMucHV0KG51bWJlciwgZmllbGQpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCBwcmVzZW50IHtAY29kZSBGaWVsZH1zIGFzIGFuIGltbXV0YWJsZSB7QGNvZGUgTWFwfS4gIElmIG1vcmUKKyAgICAgKiBmaWVsZHMgYXJlIGFkZGVkLCB0aGUgY2hhbmdlcyBtYXkgb3IgbWF5IG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhpcyBtYXAuCisgICAgICovCisgICAgcHVibGljIE1hcDxJbnRlZ2VyLCBGaWVsZD4gYXNNYXAoKSB7CisgICAgICBnZXRGaWVsZEJ1aWxkZXIoMCk7ICAvLyBGb3JjZSBsYXN0RmllbGQgdG8gYmUgYnVpbHQuCisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGZpZWxkcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYW4gZW50aXJlIG1lc3NhZ2UgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSBpdHMgZmllbGRzIGludG8KKyAgICAgKiB0aGlzIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGZpbmFsIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7CisgICAgICAgIGlmICh0YWcgPT0gMCB8fCAhbWVyZ2VGaWVsZEZyb20odGFnLCBpbnB1dCkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYSBzaW5nbGUgZmllbGQgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSBpdCBpbnRvIHRoaXMgc2V0LgorICAgICAqIEBwYXJhbSB0YWcgVGhlIGZpZWxkJ3MgdGFnIG51bWJlciwgd2hpY2ggd2FzIGFscmVhZHkgcGFyc2VkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIGZhbHNlfSBpZiB0aGUgdGFnIGlzIGFuIGVuZ3JvdXAgdGFnLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1lcmdlRmllbGRGcm9tKGZpbmFsIGludCB0YWcsIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIGludCBudW1iZXIgPSBXaXJlRm9ybWF0LmdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7CisgICAgICBzd2l0Y2ggKFdpcmVGb3JtYXQuZ2V0VGFnV2lyZVR5cGUodGFnKSkgeworICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UOgorICAgICAgICAgIGdldEZpZWxkQnVpbGRlcihudW1iZXIpLmFkZFZhcmludChpbnB1dC5yZWFkSW50NjQoKSk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDY0OgorICAgICAgICAgIGdldEZpZWxkQnVpbGRlcihudW1iZXIpLmFkZEZpeGVkNjQoaW5wdXQucmVhZEZpeGVkNjQoKSk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgICAgIGdldEZpZWxkQnVpbGRlcihudW1iZXIpLmFkZExlbmd0aERlbGltaXRlZChpbnB1dC5yZWFkQnl0ZXMoKSk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUDoKKyAgICAgICAgICBmaW5hbCBCdWlsZGVyIHN1YkJ1aWxkZXIgPSBuZXdCdWlsZGVyKCk7CisgICAgICAgICAgaW5wdXQucmVhZEdyb3VwKG51bWJlciwgc3ViQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RW1wdHlSZWdpc3RyeSgpKTsKKyAgICAgICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5hZGRHcm91cChzdWJCdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQOgorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVEMzI6CisgICAgICAgICAgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikuYWRkRml4ZWQzMihpbnB1dC5yZWFkRml4ZWQzMigpKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uaW52YWxpZFdpcmVUeXBlKCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGFuZCBtZXJnZSBpdCB3aXRoIHRoZQorICAgICAqIHNldCBiZWluZyBidWlsdC4gIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kCisgICAgICoge0BsaW5rICNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSl9LgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShmaW5hbCBCeXRlU3RyaW5nIGRhdGEpCisgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IGRhdGEubmV3Q29kZWRJbnB1dCgpOworICAgICAgICBtZXJnZUZyb20oaW5wdXQpOworICAgICAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfSBjYXRjaCAoZmluYWwgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgZTsKKyAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgIlJlYWRpbmcgZnJvbSBhIEJ5dGVTdHJpbmcgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKKyAgICAgICAgICAibmV2ZXIgaGFwcGVuKS4iLCBlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gYW5kIG1lcmdlIGl0IHdpdGggdGhlCisgICAgICogc2V0IGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKKyAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKGZpbmFsIGJ5dGVbXSBkYXRhKQorICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEpOworICAgICAgICBtZXJnZUZyb20oaW5wdXQpOworICAgICAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfSBjYXRjaCAoZmluYWwgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgZTsKKyAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgIlJlYWRpbmcgZnJvbSBhIGJ5dGUgYXJyYXkgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKKyAgICAgICAgICAibmV2ZXIgaGFwcGVuKS4iLCBlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIGl0IHdpdGggdGhlCisgICAgICogc2V0IGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKKyAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uCisgICAgICovCisgICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZElucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShpbnB1dCk7CisgICAgICBtZXJnZUZyb20oY29kZWRJbnB1dCk7CisgICAgICBjb2RlZElucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG1lcmdlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIGludCBmaXJzdEJ5dGUgPSBpbnB1dC5yZWFkKCk7CisgICAgICBpZiAoZmlyc3RCeXRlID09IC0xKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIGludCBzaXplID0gQ29kZWRJbnB1dFN0cmVhbS5yZWFkUmF3VmFyaW50MzIoZmlyc3RCeXRlLCBpbnB1dCk7CisgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBsaW1pdGVkSW5wdXQgPSBuZXcgTGltaXRlZElucHV0U3RyZWFtKGlucHV0LCBzaXplKTsKKyAgICAgIG1lcmdlRnJvbShsaW1pdGVkSW5wdXQpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKAorICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCwKKyAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgLy8gVW5rbm93bkZpZWxkU2V0IGhhcyBubyBleHRlbnNpb25zLgorICAgICAgcmV0dXJuIG1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCk7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKAorICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAvLyBVbmtub3duRmllbGRTZXQgaGFzIG5vIGV4dGVuc2lvbnMuCisgICAgICByZXR1cm4gbWVyZ2VGcm9tKGlucHV0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oCisgICAgICAgIEJ5dGVTdHJpbmcgZGF0YSwKKyAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQorICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIC8vIFVua25vd25GaWVsZFNldCBoYXMgbm8gZXh0ZW5zaW9ucy4KKyAgICAgIHJldHVybiBtZXJnZUZyb20oZGF0YSk7CisgICAgfQorCisgICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPQorICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhLCBvZmYsIGxlbik7CisgICAgICAgIG1lcmdlRnJvbShpbnB1dCk7CisgICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBlOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAiUmVhZGluZyBmcm9tIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAoc2hvdWxkICIgKworICAgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbSgKKyAgICAgICAgYnl0ZVtdIGRhdGEsCisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICAvLyBVbmtub3duRmllbGRTZXQgaGFzIG5vIGV4dGVuc2lvbnMuCisgICAgICByZXR1cm4gbWVyZ2VGcm9tKGRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbSgKKyAgICAgICAgYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4sCisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKKyAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7CisgICAgICAvLyBVbmtub3duRmllbGRTZXQgaGFzIG5vIGV4dGVuc2lvbnMuCisgICAgICByZXR1cm4gbWVyZ2VGcm9tKGRhdGEsIG9mZiwgbGVuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oCisgICAgICAgIElucHV0U3RyZWFtIGlucHV0LAorICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAvLyBVbmtub3duRmllbGRTZXQgaGFzIG5vIGV4dGVuc2lvbnMuCisgICAgICByZXR1cm4gbWVyZ2VGcm9tKGlucHV0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgLy8gVW5rbm93bkZpZWxkU2V0cyBkbyBub3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMsIHNvIHRoZXkgYXJlIGFsd2F5cworICAgICAgLy8gaW5pdGlhbGl6ZWQuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmVwcmVzZW50cyBhIHNpbmdsZSBmaWVsZCBpbiBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fS4KKyAgICoKKyAgICogPHA+QSB7QGNvZGUgRmllbGR9IGNvbnNpc3RzIG9mIGZpdmUgbGlzdHMgb2YgdmFsdWVzLiAgVGhlIGxpc3RzIGNvcnJlc3BvbmQKKyAgICogdG8gdGhlIGZpdmUgIndpcmUgdHlwZXMiIHVzZWQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciBiaW5hcnkgZm9ybWF0LgorICAgKiBUaGUgd2lyZSB0eXBlIG9mIGVhY2ggZmllbGQgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgZW5jb2RlZCBmb3JtIGFsb25lLAorICAgKiB3aXRob3V0IGtub3dpbmcgdGhlIGZpZWxkJ3MgZGVjbGFyZWQgdHlwZS4gIFNvLCB3ZSBhcmUgYWJsZSB0byBwYXJzZQorICAgKiB1bmtub3duIHZhbHVlcyBhdCBsZWFzdCB0aGlzIGZhciBhbmQgc2VwYXJhdGUgdGhlbS4gIE5vcm1hbGx5LCBvbmx5IG9uZQorICAgKiBvZiB0aGUgZml2ZSBsaXN0cyB3aWxsIGNvbnRhaW4gYW55IHZhbHVlcywgc2luY2UgaXQgaXMgaW1wb3NzaWJsZSB0bworICAgKiBkZWZpbmUgYSB2YWxpZCBtZXNzYWdlIHR5cGUgdGhhdCBkZWNsYXJlcyB0d28gZGlmZmVyZW50IHR5cGVzIGZvciB0aGUKKyAgICogc2FtZSBmaWVsZCBudW1iZXIuICBIb3dldmVyLCB0aGUgY29kZSBpcyBkZXNpZ25lZCB0byBhbGxvdyBmb3IgdGhlIGNhc2UKKyAgICogd2hlcmUgdGhlIHNhbWUgdW5rbm93biBmaWVsZCBudW1iZXIgaXMgZW5jb3VudGVyZWQgdXNpbmcgbXVsdGlwbGUgZGlmZmVyZW50CisgICAqIHdpcmUgdHlwZXMuCisgICAqCisgICAqIDxwPntAY29kZSBGaWVsZH0gaXMgYW4gaW1tdXRhYmxlIGNsYXNzLiAgVG8gY29uc3RydWN0IG9uZSwgeW91IG11c3QgdXNlIGEKKyAgICoge0BsaW5rIEJ1aWxkZXJ9LgorICAgKgorICAgKiBAc2VlIFVua25vd25GaWVsZFNldAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGaWVsZCB7CisgICAgcHJpdmF0ZSBGaWVsZCgpIHt9CisKKyAgICAvKiogQ29uc3RydWN0IGEgbmV3IHtAbGluayBCdWlsZGVyfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcigpIHsKKyAgICAgIHJldHVybiBCdWlsZGVyLmNyZWF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyB7QGxpbmsgQnVpbGRlcn0gYW5kIGluaXRpYWxpemUgaXQgdG8gYSBjb3B5IG9mCisgICAgICoge0Bjb2RlIGNvcHlGcm9tfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcihmaW5hbCBGaWVsZCBjb3B5RnJvbSkgeworICAgICAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oY29weUZyb20pOworICAgIH0KKworICAgIC8qKiBHZXQgYW4gZW1wdHkge0Bjb2RlIEZpZWxkfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpZWxkIGdldERlZmF1bHRJbnN0YW5jZSgpIHsKKyAgICAgIHJldHVybiBmaWVsZERlZmF1bHRJbnN0YW5jZTsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmllbGQgZmllbGREZWZhdWx0SW5zdGFuY2UgPSBuZXdCdWlsZGVyKCkuYnVpbGQoKTsKKworICAgIC8qKiBHZXQgdGhlIGxpc3Qgb2YgdmFyaW50IHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gKi8KKyAgICBwdWJsaWMgTGlzdDxMb25nPiBnZXRWYXJpbnRMaXN0KCkgICAgICAgICAgICAgICB7IHJldHVybiB2YXJpbnQ7ICAgICAgICAgIH0KKworICAgIC8qKiBHZXQgdGhlIGxpc3Qgb2YgZml4ZWQzMiB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuICovCisgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gZ2V0Rml4ZWQzMkxpc3QoKSAgICAgICAgICAgeyByZXR1cm4gZml4ZWQzMjsgICAgICAgICB9CisKKyAgICAvKiogR2V0IHRoZSBsaXN0IG9mIGZpeGVkNjQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiAqLworICAgIHB1YmxpYyBMaXN0PExvbmc+IGdldEZpeGVkNjRMaXN0KCkgICAgICAgICAgICAgIHsgcmV0dXJuIGZpeGVkNjQ7ICAgICAgICAgfQorCisgICAgLyoqIEdldCB0aGUgbGlzdCBvZiBsZW5ndGgtZGVsaW1pdGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gKi8KKyAgICBwdWJsaWMgTGlzdDxCeXRlU3RyaW5nPiBnZXRMZW5ndGhEZWxpbWl0ZWRMaXN0KCkgeyByZXR1cm4gbGVuZ3RoRGVsaW1pdGVkOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgZW1iZWRkZWQgZ3JvdXAgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiAgVGhlc2UgYXJlCisgICAgICogcmVwcmVzZW50ZWQgdXNpbmcge0BsaW5rIFVua25vd25GaWVsZFNldH1zIHJhdGhlciB0aGFuIHtAbGluayBNZXNzYWdlfXMKKyAgICAgKiBzaW5jZSB0aGUgZ3JvdXAncyB0eXBlIGlzIHByZXN1bWFibHkgdW5rbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxVbmtub3duRmllbGRTZXQ+IGdldEdyb3VwTGlzdCgpICAgICAgeyByZXR1cm4gZ3JvdXA7ICAgICAgICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG90aGVyKSB7CisgICAgICBpZiAodGhpcyA9PSBvdGhlcikgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgRmllbGQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKGdldElkZW50aXR5QXJyYXkoKSwKKyAgICAgICAgICAoKEZpZWxkKSBvdGhlcikuZ2V0SWRlbnRpdHlBcnJheSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIEFycmF5cy5oYXNoQ29kZShnZXRJZGVudGl0eUFycmF5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIG9iamVjdHMgdG8gYmUgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzCisgICAgICoge0BsaW5rIEZpZWxkfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdFtdIGdldElkZW50aXR5QXJyYXkoKSB7CisgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICB2YXJpbnQsCisgICAgICAgICAgZml4ZWQzMiwKKyAgICAgICAgICBmaXhlZDY0LAorICAgICAgICAgIGxlbmd0aERlbGltaXRlZCwKKyAgICAgICAgICBncm91cH07CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZmllbGQsIGluY2x1ZGluZyBmaWVsZCBudW1iZXIsIGFuZCB3cml0ZXMgaXQgdG8KKyAgICAgKiB7QGNvZGUgb3V0cHV0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoZmluYWwgbG9uZyB2YWx1ZSA6IHZhcmludCkgeworICAgICAgICBvdXRwdXQud3JpdGVVSW50NjQoZmllbGROdW1iZXIsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGZvciAoZmluYWwgaW50IHZhbHVlIDogZml4ZWQzMikgeworICAgICAgICBvdXRwdXQud3JpdGVGaXhlZDMyKGZpZWxkTnVtYmVyLCB2YWx1ZSk7CisgICAgICB9CisgICAgICBmb3IgKGZpbmFsIGxvbmcgdmFsdWUgOiBmaXhlZDY0KSB7CisgICAgICAgIG91dHB1dC53cml0ZUZpeGVkNjQoZmllbGROdW1iZXIsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGZvciAoZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSA6IGxlbmd0aERlbGltaXRlZCkgeworICAgICAgICBvdXRwdXQud3JpdGVCeXRlcyhmaWVsZE51bWJlciwgdmFsdWUpOworICAgICAgfQorICAgICAgZm9yIChmaW5hbCBVbmtub3duRmllbGRTZXQgdmFsdWUgOiBncm91cCkgeworICAgICAgICBvdXRwdXQud3JpdGVHcm91cChmaWVsZE51bWJlciwgdmFsdWUpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGVuY29kZSB0aGlzIGZpZWxkLCBpbmNsdWRpbmcgZmllbGQKKyAgICAgKiBudW1iZXIuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIpIHsKKyAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgZm9yIChmaW5hbCBsb25nIHZhbHVlIDogdmFyaW50KSB7CisgICAgICAgIHJlc3VsdCArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlVUludDY0U2l6ZShmaWVsZE51bWJlciwgdmFsdWUpOworICAgICAgfQorICAgICAgZm9yIChmaW5hbCBpbnQgdmFsdWUgOiBmaXhlZDMyKSB7CisgICAgICAgIHJlc3VsdCArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRml4ZWQzMlNpemUoZmllbGROdW1iZXIsIHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGZvciAoZmluYWwgbG9uZyB2YWx1ZSA6IGZpeGVkNjQpIHsKKyAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVGaXhlZDY0U2l6ZShmaWVsZE51bWJlciwgdmFsdWUpOworICAgICAgfQorICAgICAgZm9yIChmaW5hbCBCeXRlU3RyaW5nIHZhbHVlIDogbGVuZ3RoRGVsaW1pdGVkKSB7CisgICAgICAgIHJlc3VsdCArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlQnl0ZXNTaXplKGZpZWxkTnVtYmVyLCB2YWx1ZSk7CisgICAgICB9CisgICAgICBmb3IgKGZpbmFsIFVua25vd25GaWVsZFNldCB2YWx1ZSA6IGdyb3VwKSB7CisgICAgICAgIHJlc3VsdCArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlR3JvdXBTaXplKGZpZWxkTnVtYmVyLCB2YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGZpZWxkLCBpbmNsdWRpbmcgZmllbGQgbnVtYmVyLCBhbmQgd3JpdGVzIGl0IHRvCisgICAgICoge0Bjb2RlIG91dHB1dH0sIHVzaW5nIHtAY29kZSBNZXNzYWdlU2V0fSB3aXJlIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZUFzTWVzc2FnZVNldEV4dGVuc2lvblRvKAorICAgICAgICBmaW5hbCBpbnQgZmllbGROdW1iZXIsCisgICAgICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSA6IGxlbmd0aERlbGltaXRlZCkgeworICAgICAgICBvdXRwdXQud3JpdGVSYXdNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpZWxkTnVtYmVyLCB2YWx1ZSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgZmllbGQsIGluY2x1ZGluZyBmaWVsZAorICAgICAqIG51bWJlciwgdXNpbmcge0Bjb2RlIE1lc3NhZ2VTZXR9IHdpcmUgZm9ybWF0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXRFeHRlbnNpb24oZmluYWwgaW50IGZpZWxkTnVtYmVyKSB7CisgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgIGZvciAoZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSA6IGxlbmd0aERlbGltaXRlZCkgeworICAgICAgICByZXN1bHQgKz0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb25TaXplKAorICAgICAgICAgIGZpZWxkTnVtYmVyLCB2YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxMb25nPiB2YXJpbnQ7CisgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IGZpeGVkMzI7CisgICAgcHJpdmF0ZSBMaXN0PExvbmc+IGZpeGVkNjQ7CisgICAgcHJpdmF0ZSBMaXN0PEJ5dGVTdHJpbmc+IGxlbmd0aERlbGltaXRlZDsKKyAgICBwcml2YXRlIExpc3Q8VW5rbm93bkZpZWxkU2V0PiBncm91cDsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gYnVpbGQgYSB7QGxpbmsgRmllbGR9IHdpdGhpbiBhbiB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fS4KKyAgICAgKgorICAgICAqIDxwPlVzZSB7QGxpbmsgRmllbGQjbmV3QnVpbGRlcigpfSB0byBjb25zdHJ1Y3QgYSB7QGNvZGUgQnVpbGRlcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKyAgICAgIC8vIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBkaXJlY3RseSAoZXhjZXB0IGZyb20gJ2NyZWF0ZScpLgorICAgICAgcHJpdmF0ZSBCdWlsZGVyKCkge30KKworICAgICAgcHJpdmF0ZSBzdGF0aWMgQnVpbGRlciBjcmVhdGUoKSB7CisgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIucmVzdWx0ID0gbmV3IEZpZWxkKCk7CisgICAgICAgIHJldHVybiBidWlsZGVyOworICAgICAgfQorCisgICAgICBwcml2YXRlIEZpZWxkIHJlc3VsdDsKKworICAgICAgLyoqCisgICAgICAgKiBCdWlsZCB0aGUgZmllbGQuICBBZnRlciB7QGNvZGUgYnVpbGQoKX0gaGFzIGJlZW4gY2FsbGVkLCB0aGUKKyAgICAgICAqIHtAY29kZSBCdWlsZGVyfSBpcyBubyBsb25nZXIgdXNhYmxlLiAgQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIHdpbGwKKyAgICAgICAqIHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IgYW5kIGNhbiBjYXVzZSBhCisgICAgICAgKiB7QGNvZGUgTnVsbFBvaW50ZXJFeGNlcHRpb259IHRvIGJlIHRocm93bi4KKyAgICAgICAqLworICAgICAgcHVibGljIEZpZWxkIGJ1aWxkKCkgeworICAgICAgICBpZiAocmVzdWx0LnZhcmludCA9PSBudWxsKSB7CisgICAgICAgICAgcmVzdWx0LnZhcmludCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdC52YXJpbnQgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlc3VsdC52YXJpbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuZml4ZWQzMiA9PSBudWxsKSB7CisgICAgICAgICAgcmVzdWx0LmZpeGVkMzIgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQuZml4ZWQzMiA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0LmZpeGVkMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuZml4ZWQ2NCA9PSBudWxsKSB7CisgICAgICAgICAgcmVzdWx0LmZpeGVkNjQgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXN1bHQuZml4ZWQ2NCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0LmZpeGVkNjQpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoRGVsaW1pdGVkID09IG51bGwpIHsKKyAgICAgICAgICByZXN1bHQubGVuZ3RoRGVsaW1pdGVkID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0Lmxlbmd0aERlbGltaXRlZCA9CisgICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuZ3JvdXAgPT0gbnVsbCkgeworICAgICAgICAgIHJlc3VsdC5ncm91cCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdC5ncm91cCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0Lmdyb3VwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEZpZWxkIHJldHVybk1lID0gcmVzdWx0OworICAgICAgICByZXN1bHQgPSBudWxsOworICAgICAgICByZXR1cm4gcmV0dXJuTWU7CisgICAgICB9CisKKyAgICAgIC8qKiBEaXNjYXJkIHRoZSBmaWVsZCdzIGNvbnRlbnRzLiAqLworICAgICAgcHVibGljIEJ1aWxkZXIgY2xlYXIoKSB7CisgICAgICAgIHJlc3VsdCA9IG5ldyBGaWVsZCgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBNZXJnZSB0aGUgdmFsdWVzIGluIHtAY29kZSBvdGhlcn0gaW50byB0aGlzIGZpZWxkLiAgRm9yIGVhY2ggbGlzdAorICAgICAgICogb2YgdmFsdWVzLCB7QGNvZGUgb3RoZXJ9J3MgdmFsdWVzIGFyZSBhcHBlbmQgdG8gdGhlIG9uZXMgaW4gdGhpcworICAgICAgICogZmllbGQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShmaW5hbCBGaWVsZCBvdGhlcikgeworICAgICAgICBpZiAoIW90aGVyLnZhcmludC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBpZiAocmVzdWx0LnZhcmludCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQudmFyaW50ID0gbmV3IEFycmF5TGlzdDxMb25nPigpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXN1bHQudmFyaW50LmFkZEFsbChvdGhlci52YXJpbnQpOworICAgICAgICB9CisgICAgICAgIGlmICghb3RoZXIuZml4ZWQzMi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBpZiAocmVzdWx0LmZpeGVkMzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0LmZpeGVkMzIgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJlc3VsdC5maXhlZDMyLmFkZEFsbChvdGhlci5maXhlZDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW90aGVyLmZpeGVkNjQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgaWYgKHJlc3VsdC5maXhlZDY0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5maXhlZDY0ID0gbmV3IEFycmF5TGlzdDxMb25nPigpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXN1bHQuZml4ZWQ2NC5hZGRBbGwob3RoZXIuZml4ZWQ2NCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvdGhlci5sZW5ndGhEZWxpbWl0ZWQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0Lmxlbmd0aERlbGltaXRlZCA9IG5ldyBBcnJheUxpc3Q8Qnl0ZVN0cmluZz4oKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVzdWx0Lmxlbmd0aERlbGltaXRlZC5hZGRBbGwob3RoZXIubGVuZ3RoRGVsaW1pdGVkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW90aGVyLmdyb3VwLmlzRW1wdHkoKSkgeworICAgICAgICAgIGlmIChyZXN1bHQuZ3JvdXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0Lmdyb3VwID0gbmV3IEFycmF5TGlzdDxVbmtub3duRmllbGRTZXQ+KCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJlc3VsdC5ncm91cC5hZGRBbGwob3RoZXIuZ3JvdXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgICAvKiogQWRkIGEgdmFyaW50IHZhbHVlLiAqLworICAgICAgcHVibGljIEJ1aWxkZXIgYWRkVmFyaW50KGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHJlc3VsdC52YXJpbnQgPT0gbnVsbCkgeworICAgICAgICAgIHJlc3VsdC52YXJpbnQgPSBuZXcgQXJyYXlMaXN0PExvbmc+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LnZhcmludC5hZGQodmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqIEFkZCBhIGZpeGVkMzIgdmFsdWUuICovCisgICAgICBwdWJsaWMgQnVpbGRlciBhZGRGaXhlZDMyKGZpbmFsIGludCB2YWx1ZSkgeworICAgICAgICBpZiAocmVzdWx0LmZpeGVkMzIgPT0gbnVsbCkgeworICAgICAgICAgIHJlc3VsdC5maXhlZDMyID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5maXhlZDMyLmFkZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgICAvKiogQWRkIGEgZml4ZWQ2NCB2YWx1ZS4gKi8KKyAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEZpeGVkNjQoZmluYWwgbG9uZyB2YWx1ZSkgeworICAgICAgICBpZiAocmVzdWx0LmZpeGVkNjQgPT0gbnVsbCkgeworICAgICAgICAgIHJlc3VsdC5maXhlZDY0ID0gbmV3IEFycmF5TGlzdDxMb25nPigpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5maXhlZDY0LmFkZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorCisgICAgICAvKiogQWRkIGEgbGVuZ3RoLWRlbGltaXRlZCB2YWx1ZS4gKi8KKyAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZExlbmd0aERlbGltaXRlZChmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoRGVsaW1pdGVkID09IG51bGwpIHsKKyAgICAgICAgICByZXN1bHQubGVuZ3RoRGVsaW1pdGVkID0gbmV3IEFycmF5TGlzdDxCeXRlU3RyaW5nPigpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQuYWRkKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKiBBZGQgYW4gZW1iZWRkZWQgZ3JvdXAuICovCisgICAgICBwdWJsaWMgQnVpbGRlciBhZGRHcm91cChmaW5hbCBVbmtub3duRmllbGRTZXQgdmFsdWUpIHsKKyAgICAgICAgaWYgKHJlc3VsdC5ncm91cCA9PSBudWxsKSB7CisgICAgICAgICAgcmVzdWx0Lmdyb3VwID0gbmV3IEFycmF5TGlzdDxVbmtub3duRmllbGRTZXQ+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0Lmdyb3VwLmFkZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2U1Yzc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0LmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbUFjY2VzczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTGF6eVN0cmluZ0xpc3R9IHRoYXQgd3JhcHMgYW5vdGhlcgorICoge0BsaW5rIExhenlTdHJpbmdMaXN0fSBzdWNoIHRoYXQgaXQgY2Fubm90IGJlIG1vZGlmaWVkIHZpYSB0aGUgd3JhcHBlci4KKyAqCisgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKyAqLworcHVibGljIGNsYXNzIFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0IGV4dGVuZHMgQWJzdHJhY3RMaXN0PFN0cmluZz4KKyAgICBpbXBsZW1lbnRzIExhenlTdHJpbmdMaXN0LCBSYW5kb21BY2Nlc3MgeworCisgIHByaXZhdGUgZmluYWwgTGF6eVN0cmluZ0xpc3QgbGlzdDsKKworICBwdWJsaWMgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QoTGF6eVN0cmluZ0xpc3QgbGlzdCkgeworICAgIHRoaXMubGlzdCA9IGxpc3Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXQoaW50IGluZGV4KSB7CisgICAgcmV0dXJuIGxpc3QuZ2V0KGluZGV4KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgcmV0dXJuIGxpc3Quc2l6ZSgpOworICB9CisKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIHB1YmxpYyBCeXRlU3RyaW5nIGdldEJ5dGVTdHJpbmcoaW50IGluZGV4KSB7CisgICAgcmV0dXJuIGxpc3QuZ2V0Qnl0ZVN0cmluZyhpbmRleCk7CisgIH0KKworICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgcHVibGljIHZvaWQgYWRkKEJ5dGVTdHJpbmcgZWxlbWVudCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9CisKKyAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgIHB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3IoZmluYWwgaW50IGluZGV4KSB7CisgICAgcmV0dXJuIG5ldyBMaXN0SXRlcmF0b3I8U3RyaW5nPigpIHsKKyAgICAgIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBsaXN0Lmxpc3RJdGVyYXRvcihpbmRleCk7CisKKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZXIuaGFzTmV4dCgpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyBTdHJpbmcgbmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgeworICAgICAgICByZXR1cm4gaXRlci5oYXNQcmV2aW91cygpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyBTdHJpbmcgcHJldmlvdXMoKSB7CisgICAgICAgIHJldHVybiBpdGVyLnByZXZpb3VzKCk7CisgICAgICB9CisKKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBpdGVyLm5leHRJbmRleCgpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZXIucHJldmlvdXNJbmRleCgpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICB9CisKKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIHZvaWQgc2V0KFN0cmluZyBvKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKKyAgICAgIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgbykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKCkgeworICAgIHJldHVybiBuZXcgSXRlcmF0b3I8U3RyaW5nPigpIHsKKyAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKKworICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCisgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICByZXR1cm4gaXRlci5oYXNOZXh0KCk7CisgICAgICB9CisKKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIFN0cmluZyBuZXh0KCkgeworICAgICAgICByZXR1cm4gaXRlci5uZXh0KCk7CisgICAgICB9CisKKyAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICB9OworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBmMmEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXQuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBQcm90b2NvbCBCdWZmZXIgbGlicmFyeSBhbmQgZ2VuZXJhdGVkCisgKiBtZXNzYWdlIGltcGxlbWVudGF0aW9ucy4gIEl0IGlzIHB1YmxpYyBvbmx5IGJlY2F1c2UgdGhvc2UgZ2VuZXJhdGVkIG1lc3NhZ2VzCisgKiBkbyBub3QgcmVzaWRlIGluIHRoZSB7QGNvZGUgcHJvdG9idWZ9IHBhY2thZ2UuICBPdGhlcnMgc2hvdWxkIG5vdCB1c2UgdGhpcworICogY2xhc3MgZGlyZWN0bHkuCisgKgorICogVGhpcyBjbGFzcyBjb250YWlucyBjb25zdGFudHMgYW5kIGhlbHBlciBmdW5jdGlvbnMgdXNlZnVsIGZvciBkZWFsaW5nIHdpdGgKKyAqIHRoZSBQcm90b2NvbCBCdWZmZXIgd2lyZSBmb3JtYXQuCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdpcmVGb3JtYXQgeworICAvLyBEbyBub3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KKyAgcHJpdmF0ZSBXaXJlRm9ybWF0KCkge30KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgID0gMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lSRVRZUEVfRklYRUQ2NCAgICAgICAgICA9IDE7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQgPSAyOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSVJFVFlQRV9TVEFSVF9HUk9VUCAgICAgID0gMzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lSRVRZUEVfRU5EX0dST1VQICAgICAgICA9IDQ7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICAgPSA1OworCisgIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1RZUEVfQklUUyA9IDM7CisgIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1RZUEVfTUFTSyA9ICgxIDw8IFRBR19UWVBFX0JJVFMpIC0gMTsKKworICAvKiogR2l2ZW4gYSB0YWcgdmFsdWUsIGRldGVybWluZXMgdGhlIHdpcmUgdHlwZSAodGhlIGxvd2VyIDMgYml0cykuICovCisgIHN0YXRpYyBpbnQgZ2V0VGFnV2lyZVR5cGUoZmluYWwgaW50IHRhZykgeworICAgIHJldHVybiB0YWcgJiBUQUdfVFlQRV9NQVNLOworICB9CisKKyAgLyoqIEdpdmVuIGEgdGFnIHZhbHVlLCBkZXRlcm1pbmVzIHRoZSBmaWVsZCBudW1iZXIgKHRoZSB1cHBlciAyOSBiaXRzKS4gKi8KKyAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VGFnRmllbGROdW1iZXIoZmluYWwgaW50IHRhZykgeworICAgIHJldHVybiB0YWcgPj4+IFRBR19UWVBFX0JJVFM7CisgIH0KKworICAvKiogTWFrZXMgYSB0YWcgdmFsdWUgZ2l2ZW4gYSBmaWVsZCBudW1iZXIgYW5kIHdpcmUgdHlwZS4gKi8KKyAgc3RhdGljIGludCBtYWtlVGFnKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHdpcmVUeXBlKSB7CisgICAgcmV0dXJuIChmaWVsZE51bWJlciA8PCBUQUdfVFlQRV9CSVRTKSB8IHdpcmVUeXBlOworICB9CisKKyAgLyoqCisgICAqIExpdGUgZXF1aXZhbGVudCB0byB7QGxpbmsgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLkphdmFUeXBlfS4gIFRoaXMgaXMKKyAgICogb25seSBoZXJlIHRvIHN1cHBvcnQgdGhlIGxpdGUgcnVudGltZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHVzZXJzLgorICAgKi8KKyAgcHVibGljIGVudW0gSmF2YVR5cGUgeworICAgIElOVCgwKSwKKyAgICBMT05HKDBMKSwKKyAgICBGTE9BVCgwRiksCisgICAgRE9VQkxFKDBEKSwKKyAgICBCT09MRUFOKGZhbHNlKSwKKyAgICBTVFJJTkcoIiIpLAorICAgIEJZVEVfU1RSSU5HKEJ5dGVTdHJpbmcuRU1QVFkpLAorICAgIEVOVU0obnVsbCksCisgICAgTUVTU0FHRShudWxsKTsKKworICAgIEphdmFUeXBlKGZpbmFsIE9iamVjdCBkZWZhdWx0RGVmYXVsdCkgeworICAgICAgdGhpcy5kZWZhdWx0RGVmYXVsdCA9IGRlZmF1bHREZWZhdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGRlZmF1bHQgdmFsdWUgZm9yIGZpZWxkcyBvZiB0aGlzIHR5cGUsIGlmIGl0J3MgYSBwcmltaXRpdmUKKyAgICAgKiB0eXBlLgorICAgICAqLworICAgIE9iamVjdCBnZXREZWZhdWx0RGVmYXVsdCgpIHsKKyAgICAgIHJldHVybiBkZWZhdWx0RGVmYXVsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBkZWZhdWx0RGVmYXVsdDsKKyAgfQorCisgIC8qKgorICAgKiBMaXRlIGVxdWl2YWxlbnQgdG8ge0BsaW5rIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlfS4gIFRoaXMgaXMKKyAgICogb25seSBoZXJlIHRvIHN1cHBvcnQgdGhlIGxpdGUgcnVudGltZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHVzZXJzLgorICAgKi8KKyAgcHVibGljIGVudW0gRmllbGRUeXBlIHsKKyAgICBET1VCTEUgIChKYXZhVHlwZS5ET1VCTEUgICAgICwgV0lSRVRZUEVfRklYRUQ2NCAgICAgICAgICksCisgICAgRkxPQVQgICAoSmF2YVR5cGUuRkxPQVQgICAgICAsIFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICApLAorICAgIElOVDY0ICAgKEphdmFUeXBlLkxPTkcgICAgICAgLCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgKSwKKyAgICBVSU5UNjQgIChKYXZhVHlwZS5MT05HICAgICAgICwgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICksCisgICAgSU5UMzIgICAoSmF2YVR5cGUuSU5UICAgICAgICAsIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICApLAorICAgIEZJWEVENjQgKEphdmFUeXBlLkxPTkcgICAgICAgLCBXSVJFVFlQRV9GSVhFRDY0ICAgICAgICAgKSwKKyAgICBGSVhFRDMyIChKYXZhVHlwZS5JTlQgICAgICAgICwgV0lSRVRZUEVfRklYRUQzMiAgICAgICAgICksCisgICAgQk9PTCAgICAoSmF2YVR5cGUuQk9PTEVBTiAgICAsIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICApLAorICAgIFNUUklORyAgKEphdmFUeXBlLlNUUklORyAgICAgLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9LAorICAgIEdST1VQICAgKEphdmFUeXBlLk1FU1NBR0UgICAgLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCAgICAgKSB7CisgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9LAorICAgIE1FU1NBR0UgKEphdmFUeXBlLk1FU1NBR0UgICAgLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9LAorICAgIEJZVEVTICAgKEphdmFUeXBlLkJZVEVfU1RSSU5HLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9LAorICAgIFVJTlQzMiAgKEphdmFUeXBlLklOVCAgICAgICAgLCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgKSwKKyAgICBFTlVNICAgIChKYXZhVHlwZS5FTlVNICAgICAgICwgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICksCisgICAgU0ZJWEVEMzIoSmF2YVR5cGUuSU5UICAgICAgICAsIFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICApLAorICAgIFNGSVhFRDY0KEphdmFUeXBlLkxPTkcgICAgICAgLCBXSVJFVFlQRV9GSVhFRDY0ICAgICAgICAgKSwKKyAgICBTSU5UMzIgIChKYXZhVHlwZS5JTlQgICAgICAgICwgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICksCisgICAgU0lOVDY0ICAoSmF2YVR5cGUuTE9ORyAgICAgICAsIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICApOworCisgICAgRmllbGRUeXBlKGZpbmFsIEphdmFUeXBlIGphdmFUeXBlLCBmaW5hbCBpbnQgd2lyZVR5cGUpIHsKKyAgICAgIHRoaXMuamF2YVR5cGUgPSBqYXZhVHlwZTsKKyAgICAgIHRoaXMud2lyZVR5cGUgPSB3aXJlVHlwZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEphdmFUeXBlIGphdmFUeXBlOworICAgIHByaXZhdGUgZmluYWwgaW50IHdpcmVUeXBlOworCisgICAgcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgeyByZXR1cm4gamF2YVR5cGU7IH0KKyAgICBwdWJsaWMgaW50IGdldFdpcmVUeXBlKCkgeyByZXR1cm4gd2lyZVR5cGU7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2FibGUoKSB7IHJldHVybiB0cnVlOyB9CisgIH0KKworICAvLyBGaWVsZCBudW1iZXJzIGZvciBmZWlsZHMgaW4gTWVzc2FnZVNldCB3aXJlIGZvcm1hdC4KKyAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9JVEVNICAgID0gMTsKKyAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9UWVBFX0lEID0gMjsKKyAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9NRVNTQUdFID0gMzsKKworICAvLyBUYWcgbnVtYmVycy4KKyAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9JVEVNX1RBRyA9CisgICAgbWFrZVRhZyhNRVNTQUdFX1NFVF9JVEVNLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCk7CisgIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfSVRFTV9FTkRfVEFHID0KKyAgICBtYWtlVGFnKE1FU1NBR0VfU0VUX0lURU0sIFdJUkVUWVBFX0VORF9HUk9VUCk7CisgIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfVFlQRV9JRF9UQUcgPQorICAgIG1ha2VUYWcoTUVTU0FHRV9TRVRfVFlQRV9JRCwgV0lSRVRZUEVfVkFSSU5UKTsKKyAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9NRVNTQUdFX1RBRyA9CisgICAgbWFrZVRhZyhNRVNTQUdFX1NFVF9NRVNTQUdFLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2VUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1M2NlOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdE9wdGltaXplRm9yLlRlc3RPcHRpbWl6ZWRGb3JTaXplOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduTWVzc2FnZTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFJlcXVpcmVkOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFJlcXVpcmVkRm9yZWlnbjsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RVbnBhY2tlZFR5cGVzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIHtAbGluayBBYnN0cmFjdE1lc3NhZ2V9LgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBjbGFzcyBBYnN0cmFjdE1lc3NhZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAvKioKKyAgICogRXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UgYW5kIHdyYXBzIHNvbWUgb3RoZXIgbWVzc2FnZSBvYmplY3QuICBUaGUgbWV0aG9kcworICAgKiBvZiB0aGUgTWVzc2FnZSBpbnRlcmZhY2Ugd2hpY2ggYXJlbid0IGV4cGxpY2l0bHkgaW1wbGVtZW50ZWQgYnkKKyAgICogQWJzdHJhY3RNZXNzYWdlIGFyZSBmb3J3YXJkZWQgdG8gdGhlIHdyYXBwZWQgb2JqZWN0LiAgVGhpcyBhbGxvd3MgdXMgdG8KKyAgICogdGVzdCB0aGF0IEFic3RyYWN0TWVzc2FnZSdzIGltcGxlbWVudGF0aW9ucyB3b3JrIGV2ZW4gaWYgdGhlIHdyYXBwZWQKKyAgICogb2JqZWN0IGRvZXMgbm90IHVzZSB0aGVtLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlIHdyYXBwZWRNZXNzYWdlOworCisgICAgcHVibGljIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoTWVzc2FnZSB3cmFwcGVkTWVzc2FnZSkgeworICAgICAgdGhpcy53cmFwcGVkTWVzc2FnZSA9IHdyYXBwZWRNZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgeworICAgICAgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7CisgICAgfQorICAgIHB1YmxpYyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7CisgICAgICByZXR1cm4gbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoCisgICAgICAgIHdyYXBwZWRNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBNYXA8RGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpIHsKKyAgICAgIHJldHVybiB3cmFwcGVkTWVzc2FnZS5nZXRBbGxGaWVsZHMoKTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuaGFzRmllbGQoZmllbGQpOworICAgIH0KKyAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLmdldEZpZWxkKGZpZWxkKTsKKyAgICB9CisgICAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKKyAgICB9CisgICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKAorICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleCkgeworICAgICAgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKKyAgICB9CisgICAgcHVibGljIFVua25vd25GaWVsZFNldCBnZXRVbmtub3duRmllbGRzKCkgeworICAgICAgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLmdldFVua25vd25GaWVsZHMoKTsKKyAgICB9CisgICAgcHVibGljIEJ1aWxkZXIgbmV3QnVpbGRlckZvclR5cGUoKSB7CisgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIod3JhcHBlZE1lc3NhZ2UubmV3QnVpbGRlckZvclR5cGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBCdWlsZGVyIHRvQnVpbGRlcigpIHsKKyAgICAgIHJldHVybiBuZXcgQnVpbGRlcih3cmFwcGVkTWVzc2FnZS50b0J1aWxkZXIoKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UuQnVpbGRlcjxCdWlsZGVyPiB7CisgICAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciB3cmFwcGVkQnVpbGRlcjsKKworICAgICAgcHVibGljIEJ1aWxkZXIoTWVzc2FnZS5CdWlsZGVyIHdyYXBwZWRCdWlsZGVyKSB7CisgICAgICAgIHRoaXMud3JhcHBlZEJ1aWxkZXIgPSB3cmFwcGVkQnVpbGRlcjsKKyAgICAgIH0KKworICAgICAgcHVibGljIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgYnVpbGQoKSB7CisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcih3cmFwcGVkQnVpbGRlci5idWlsZCgpKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIGJ1aWxkUGFydGlhbCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKHdyYXBwZWRCdWlsZGVyLmJ1aWxkUGFydGlhbCgpKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIGNsb25lKCkgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIod3JhcHBlZEJ1aWxkZXIuY2xvbmUoKSk7CisgICAgICB9CisgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgICByZXR1cm4gY2xvbmUoKS5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCk7CisgICAgICB9CisgICAgICBwdWJsaWMgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWRCdWlsZGVyLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7CisgICAgICB9CisgICAgICBwdWJsaWMgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkgeworICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoCisgICAgICAgICAgd3JhcHBlZEJ1aWxkZXIuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBNYXA8RGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWRCdWlsZGVyLmdldEFsbEZpZWxkcygpOworICAgICAgfQorICAgICAgcHVibGljIEJ1aWxkZXIgbmV3QnVpbGRlckZvckZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIod3JhcHBlZEJ1aWxkZXIubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKSk7CisgICAgICB9CisgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWRCdWlsZGVyLmhhc0ZpZWxkKGZpZWxkKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICAgIHJldHVybiB3cmFwcGVkQnVpbGRlci5nZXRGaWVsZChmaWVsZCk7CisgICAgICB9CisgICAgICBwdWJsaWMgQnVpbGRlciBzZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB3cmFwcGVkQnVpbGRlci5zZXRGaWVsZChmaWVsZCwgdmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7CisgICAgICAgIHdyYXBwZWRCdWlsZGVyLmNsZWFyRmllbGQoZmllbGQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKKyAgICAgIH0KKyAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZCgKKyAgICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOworICAgICAgfQorICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHdyYXBwZWRCdWlsZGVyLnNldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZCgKKyAgICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB3cmFwcGVkQnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgICAgfQorICAgICAgcHVibGljIFVua25vd25GaWVsZFNldCBnZXRVbmtub3duRmllbGRzKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuZ2V0VW5rbm93bkZpZWxkcygpOworICAgICAgfQorICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykgeworICAgICAgICB3cmFwcGVkQnVpbGRlci5zZXRVbmtub3duRmllbGRzKHVua25vd25GaWVsZHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvblRlc3RlciA9CisgICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSwgbnVsbCk7CisKKyAgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlciBleHRlbnNpb25zUmVmbGVjdGlvblRlc3RlciA9CisgICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkpOworCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBFeGNlcHRpb24geworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9CisgICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyKAorICAgICAgICAgIFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKFRlc3RVdGlsLmdldEFsbFNldCgpKSkKKyAgICAgICAgLmNsZWFyKCkuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRDbGVhcigoVGVzdEFsbFR5cGVzKSBtZXNzYWdlLndyYXBwZWRNZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBtZXNzYWdlID0KKyAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKSkKKyAgICAgICAgLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRBbGxTZXQoKSkuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoKFRlc3RBbGxUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplZFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOworICAgIE1lc3NhZ2UgYWJzdHJhY3RNZXNzYWdlID0gbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoVGVzdFV0aWwuZ2V0QWxsU2V0KCkpOworCisgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSwKKyAgICAgICAgICAgICAgICAgYWJzdHJhY3RNZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNZXNzYWdlIGFic3RyYWN0TWVzc2FnZSA9IG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKFRlc3RVdGlsLmdldEFsbFNldCgpKTsKKworICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldCgKKyAgICAgIFRlc3RBbGxUeXBlcy5wYXJzZUZyb20oYWJzdHJhY3RNZXNzYWdlLnRvQnl0ZVN0cmluZygpKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkudG9CeXRlU3RyaW5nKCksCisgICAgICAgICAgICAgICAgIGFic3RyYWN0TWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKSk7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBtZXNzYWdlID0KKyAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKFRlc3RVdGlsLmdldEFsbFNldCgpLnRvQnl0ZVN0cmluZygpKS5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldCgoVGVzdEFsbFR5cGVzKSBtZXNzYWdlLndyYXBwZWRNZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYWNrZWRTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZSBhYnN0cmFjdE1lc3NhZ2UgPQorICAgICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcihUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKSk7CisKKyAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQoCisgICAgICBUZXN0UGFja2VkVHlwZXMucGFyc2VGcm9tKGFic3RyYWN0TWVzc2FnZS50b0J5dGVTdHJpbmcoKSkpOworCisgICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLmdldFBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpLAorICAgICAgICAgICAgICAgICBhYnN0cmFjdE1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhY2tlZFBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyKFRlc3RQYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCkpOworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9CisgICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQoKFRlc3RQYWNrZWRUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5wYWNrZWRTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZSBhYnN0cmFjdE1lc3NhZ2UgPQorICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoVGVzdFV0aWwuZ2V0VW5wYWNrZWRTZXQoKSk7CisKKyAgICBUZXN0VXRpbC5hc3NlcnRVbnBhY2tlZEZpZWxkc1NldCgKKyAgICAgIFRlc3RVbnBhY2tlZFR5cGVzLnBhcnNlRnJvbShhYnN0cmFjdE1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpKTsKKworICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC5nZXRVbnBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpLAorICAgICAgICAgICAgICAgICBhYnN0cmFjdE1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlUGFja2VkVG9VbnBhY2tlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdFVucGFja2VkVHlwZXMubmV3QnVpbGRlcigpKTsKKyAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIG1lc3NhZ2UgPQorICAgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCkudG9CeXRlU3RyaW5nKCkpLmJ1aWxkKCk7CisgICAgVGVzdFV0aWwuYXNzZXJ0VW5wYWNrZWRGaWVsZHNTZXQoCisgICAgICAoVGVzdFVucGFja2VkVHlwZXMpIG1lc3NhZ2Uud3JhcHBlZE1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlVW5wYWNrZWRUb1BhY2tlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdFBhY2tlZFR5cGVzLm5ld0J1aWxkZXIoKSk7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBtZXNzYWdlID0KKyAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKFRlc3RVdGlsLmdldFVucGFja2VkU2V0KCkudG9CeXRlU3RyaW5nKCkpLmJ1aWxkKCk7CisgICAgVGVzdFV0aWwuYXNzZXJ0UGFja2VkRmllbGRzU2V0KChUZXN0UGFja2VkVHlwZXMpIG1lc3NhZ2Uud3JhcHBlZE1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVucGFja2VkUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdFVucGFja2VkVHlwZXMubmV3QnVpbGRlcigpKTsKKyAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIG1lc3NhZ2UgPQorICAgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdFV0aWwuZ2V0VW5wYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRVbnBhY2tlZEZpZWxkc1NldCgKKyAgICAgIChUZXN0VW5wYWNrZWRUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW1pemVkRm9yU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFdlJ3JlIG1vc3RseSBvbmx5IGNoZWNraW5nIHRoYXQgdGhpcyBjbGFzcyB3YXMgY29tcGlsZWQgc3VjY2Vzc2Z1bGx5LgorICAgIFRlc3RPcHRpbWl6ZWRGb3JTaXplIG1lc3NhZ2UgPQorICAgICAgVGVzdE9wdGltaXplZEZvclNpemUubmV3QnVpbGRlcigpLnNldEkoMSkuYnVpbGQoKTsKKyAgICBtZXNzYWdlID0gVGVzdE9wdGltaXplZEZvclNpemUucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOworICAgIGFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGVzdHMgZm9yIGlzSW5pdGlhbGl6ZWQoKS4KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUZXN0UmVxdWlyZWQgVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEID0KKyAgICBUZXN0UmVxdWlyZWQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRlc3RSZXF1aXJlZCBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEID0KKyAgICBUZXN0UmVxdWlyZWQubmV3QnVpbGRlcigpLnNldEEoMSkuc2V0QigyKS5zZXRDKDMpLmJ1aWxkKCk7CisKKyAgcHVibGljIHZvaWQgdGVzdElzSW5pdGlhbGl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0UmVxdWlyZWQuQnVpbGRlciBidWlsZGVyID0gVGVzdFJlcXVpcmVkLm5ld0J1aWxkZXIoKTsKKyAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIgYWJzdHJhY3RCdWlsZGVyID0KKyAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoYnVpbGRlcik7CisKKyAgICBhc3NlcnRGYWxzZShhYnN0cmFjdEJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgICBidWlsZGVyLnNldEEoMSk7CisgICAgYXNzZXJ0RmFsc2UoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgICAgYnVpbGRlci5zZXRCKDEpOworICAgIGFzc2VydEZhbHNlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICAgIGJ1aWxkZXIuc2V0QygxKTsKKyAgICBhc3NlcnRUcnVlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEZvcmVpZ25Jc0luaXRpYWxpemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdFJlcXVpcmVkRm9yZWlnbi5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UmVxdWlyZWRGb3JlaWduLm5ld0J1aWxkZXIoKTsKKyAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIgYWJzdHJhY3RCdWlsZGVyID0KKyAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoYnVpbGRlcik7CisKKyAgICBhc3NlcnRUcnVlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworCisgICAgYnVpbGRlci5zZXRPcHRpb25hbE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKKyAgICBhc3NlcnRGYWxzZShhYnN0cmFjdEJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxNZXNzYWdlKFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOworICAgIGFzc2VydFRydWUoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpOworICAgIGFzc2VydEZhbHNlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworCisgICAgYnVpbGRlci5zZXRSZXBlYXRlZE1lc3NhZ2UoMCwgVEVTVF9SRVFVSVJFRF9JTklUSUFMSVpFRCk7CisgICAgYXNzZXJ0VHJ1ZShhYnN0cmFjdEJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRlc3RzIGZvciBtZXJnZUZyb20KKworICBzdGF0aWMgZmluYWwgVGVzdEFsbFR5cGVzIE1FUkdFX1NPVVJDRSA9CisgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgLnNldE9wdGlvbmFsSW50MzIoMSkKKyAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiZm9vIikKKyAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKQorICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJiYXIiKQorICAgICAgLmJ1aWxkKCk7CisKKyAgc3RhdGljIGZpbmFsIFRlc3RBbGxUeXBlcyBNRVJHRV9ERVNUID0KKyAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAuc2V0T3B0aW9uYWxJbnQ2NCgyKQorICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJiYXoiKQorICAgICAgLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMykuYnVpbGQoKSkKKyAgICAgIC5hZGRSZXBlYXRlZFN0cmluZygicXV4IikKKyAgICAgIC5idWlsZCgpOworCisgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0VfUkVTVUxUX1RFWFQgPQorICAgICAgIm9wdGlvbmFsX2ludDMyOiAxXG4iICsKKyAgICAgICJvcHRpb25hbF9pbnQ2NDogMlxuIiArCisgICAgICAib3B0aW9uYWxfc3RyaW5nOiBcImZvb1wiXG4iICsKKyAgICAgICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2Uge1xuIiArCisgICAgICAiICBjOiAzXG4iICsKKyAgICAgICJ9XG4iICsKKyAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFwicXV4XCJcbiIgKworICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJiYXJcIlxuIjsKKworICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VGcm9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciByZXN1bHQgPQorICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcigKKyAgICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoTUVSR0VfREVTVCkpCisgICAgICAubWVyZ2VGcm9tKE1FUkdFX1NPVVJDRSkuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscyhNRVJHRV9SRVNVTFRfVEVYVCwgcmVzdWx0LnRvU3RyaW5nKCkpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGVzdHMgZm9yIGVxdWFscyBhbmQgaGFzaENvZGUKKworICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQW5kSGFzaENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMgYSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOworICAgIFRlc3RBbGxUeXBlcyBiID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5idWlsZCgpOworICAgIFRlc3RBbGxUeXBlcyBjID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoYikuYWRkUmVwZWF0ZWRTdHJpbmcoIngiKS5idWlsZCgpOworICAgIFRlc3RBbGxUeXBlcyBkID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoYykuYWRkUmVwZWF0ZWRTdHJpbmcoInkiKS5idWlsZCgpOworICAgIFRlc3RBbGxFeHRlbnNpb25zIGUgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgZiA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoZSkKKyAgICAgICAgLmFkZEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDk5OSkuYnVpbGQoKTsKKworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGEpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGIpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGMpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGQpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGUpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGYpOworCisgICAgY2hlY2tOb3RFcXVhbChhLCBiKTsKKyAgICBjaGVja05vdEVxdWFsKGEsIGMpOworICAgIGNoZWNrTm90RXF1YWwoYSwgZCk7CisgICAgY2hlY2tOb3RFcXVhbChhLCBlKTsKKyAgICBjaGVja05vdEVxdWFsKGEsIGYpOworCisgICAgY2hlY2tOb3RFcXVhbChiLCBjKTsKKyAgICBjaGVja05vdEVxdWFsKGIsIGQpOworICAgIGNoZWNrTm90RXF1YWwoYiwgZSk7CisgICAgY2hlY2tOb3RFcXVhbChiLCBmKTsKKworICAgIGNoZWNrTm90RXF1YWwoYywgZCk7CisgICAgY2hlY2tOb3RFcXVhbChjLCBlKTsKKyAgICBjaGVja05vdEVxdWFsKGMsIGYpOworCisgICAgY2hlY2tOb3RFcXVhbChkLCBlKTsKKyAgICBjaGVja05vdEVxdWFsKGQsIGYpOworCisgICAgY2hlY2tOb3RFcXVhbChlLCBmKTsKKworICAgIC8vIERlc2VyaWFsaXppbmcgaW50byB0aGUgVGVzdEVtcHR5TWVzc2FnZSBzdWNoIHRoYXQgZXZlcnkgZmllbGQKKyAgICAvLyBpcyBhbiB7QGxpbmsgVW5rbm93bkZpZWxkU2V0LkZpZWxkfS4KKyAgICBVbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2UgZVVua25vd25GaWVsZHMgPQorICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2UucGFyc2VGcm9tKGUudG9CeXRlQXJyYXkoKSk7CisgICAgVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlIGZVbmtub3duRmllbGRzID0KKyAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlLnBhcnNlRnJvbShmLnRvQnl0ZUFycmF5KCkpOworICAgIGNoZWNrTm90RXF1YWwoZVVua25vd25GaWVsZHMsIGZVbmtub3duRmllbGRzKTsKKyAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChlVW5rbm93bkZpZWxkcyk7CisgICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoZlVua25vd25GaWVsZHMpOworCisgICAgLy8gU3Vic2VxdWVudCByZWNvbnN0aXR1dGlvbnMgc2hvdWxkIGJlIGlkZW50aWNhbAorICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEVtcHR5TWVzc2FnZSBlVW5rbm93bkZpZWxkczIgPQorICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2UucGFyc2VGcm9tKGUudG9CeXRlQXJyYXkoKSk7CisgICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoZVVua25vd25GaWVsZHMsIGVVbmtub3duRmllbGRzMik7CisgIH0KKworCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHByb3RvIGhhcyBzeW1ldHJpYyBlcXVhbHMgYW5kIGhhc2hDb2RlIG1ldGhvZHMuCisgICAqLworICBwcml2YXRlIHZvaWQgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgLy8gT2JqZWN0IHNob3VsZCBiZSBlcXVhbCB0byBpdHNlbGYuCisgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIG1lc3NhZ2UpOworCisgICAgLy8gT2JqZWN0IHNob3VsZCBiZSBlcXVhbCB0byBhIGR5bmFtaWMgY29weSBvZiBpdHNlbGYuCisgICAgRHluYW1pY01lc3NhZ2UgZHluYW1pYyA9IER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIobWVzc2FnZSkuYnVpbGQoKTsKKyAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChtZXNzYWdlLCBkeW5hbWljKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHByb3RvcyBhcmUgZXF1YWwgYW5kIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KE1lc3NhZ2UgbWVzc2FnZTEsIE1lc3NhZ2UgbWVzc2FnZTIpIHsKKyAgICBhc3NlcnRFcXVhbHMobWVzc2FnZTEsIG1lc3NhZ2UyKTsKKyAgICBhc3NlcnRFcXVhbHMobWVzc2FnZTIsIG1lc3NhZ2UxKTsKKyAgICBhc3NlcnRFcXVhbHMobWVzc2FnZTIuaGFzaENvZGUoKSwgbWVzc2FnZTEuaGFzaENvZGUoKSk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBwcm90b3MgYXJlIG5vdCBlcXVhbCBhbmQgaGF2ZSBkaWZmZXJlbnQgaGFzaCBjb2Rlcy4KKyAgICoKKyAgICogQHdhcm5pbmcgSXQncyB2YWxpZCBmb3Igbm9uLWVxdWFsIG9iamVjdHMgdG8gaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUsIHNvCisgICAqICAgdGhpcyB0ZXN0IGlzIHN0cmljdGVyIHRoYW4gaXQgbmVlZHMgdG8gYmUuIEhvd2V2ZXIsIHRoaXMgc2hvdWxkIGhhcHBlbgorICAgKiAgIHJlbGF0aXZlbHkgcmFyZWx5LgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGNoZWNrTm90RXF1YWwoTWVzc2FnZSBtMSwgTWVzc2FnZSBtMikgeworICAgIFN0cmluZyBlcXVhbHNFcnJvciA9IFN0cmluZy5mb3JtYXQoIiVzIHNob3VsZCBub3QgYmUgZXF1YWwgdG8gJXMiLCBtMSwgbTIpOworICAgIGFzc2VydEZhbHNlKGVxdWFsc0Vycm9yLCBtMS5lcXVhbHMobTIpKTsKKyAgICBhc3NlcnRGYWxzZShlcXVhbHNFcnJvciwgbTIuZXF1YWxzKG0xKSk7CisKKyAgICBhc3NlcnRGYWxzZSgKKyAgICAgICAgU3RyaW5nLmZvcm1hdCgiJXMgc2hvdWxkIGhhdmUgYSBkaWZmZXJlbnQgaGFzaCBjb2RlIGZyb20gJXMiLCBtMSwgbTIpLAorICAgICAgICBtMS5oYXNoQ29kZSgpID09IG0yLmhhc2hDb2RlKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRJbnB1dFN0cmVhbVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZElucHV0U3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjdmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMCwwICsxLDUyOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWVzc2FnZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgQ29kZWRJbnB1dFN0cmVhbX0uCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGNsYXNzIENvZGVkSW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAvKioKKyAgICogSGVscGVyIHRvIGNvbnN0cnVjdCBhIGJ5dGUgYXJyYXkgZnJvbSBhIGJ1bmNoIG9mIGJ5dGVzLiAgVGhlIGlucHV0cyBhcmUKKyAgICogYWN0dWFsbHkgaW50cyBzbyB0aGF0IEkgY2FuIHVzZSBoZXggbm90YXRpb24gYW5kIG5vdCBnZXQgc3R1cGlkIGVycm9ycworICAgKiBhYm91dCBwcmVjaXNpb24uCisgICAqLworICBwcml2YXRlIGJ5dGVbXSBieXRlcyhpbnQuLi4gYnl0ZXNBc0ludHMpIHsKKyAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlc0FzSW50cy5sZW5ndGhdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXNBc0ludHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGJ5dGVzW2ldID0gKGJ5dGUpIGJ5dGVzQXNJbnRzW2ldOworICAgIH0KKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICAvKioKKyAgICogQW4gSW5wdXRTdHJlYW0gd2hpY2ggbGltaXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXQgcmVhZHMgYXQgYSB0aW1lLgorICAgKiBXZSB1c2UgdGhpcyB0byBtYWtlIHN1cmUgdGhhdCBDb2RlZElucHV0U3RyZWFtIGRvZXNuJ3Qgc2NyZXcgdXAgd2hlbgorICAgKiByZWFkaW5nIGluIHNtYWxsIGJsb2Nrcy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNtYWxsQmxvY2tJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBibG9ja1NpemU7CisKKyAgICBwdWJsaWMgU21hbGxCbG9ja0lucHV0U3RyZWFtKGJ5dGVbXSBkYXRhLCBpbnQgYmxvY2tTaXplKSB7CisgICAgICB0aGlzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSwgYmxvY2tTaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU21hbGxCbG9ja0lucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBpbnQgYmxvY2tTaXplKSB7CisgICAgICBzdXBlcihpbik7CisgICAgICB0aGlzLmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc3VwZXIucmVhZChiLCAwLCBNYXRoLm1pbihiLmxlbmd0aCwgYmxvY2tTaXplKSk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIHN1cGVyLnJlYWQoYiwgb2ZmLCBNYXRoLm1pbihsZW4sIGJsb2NrU2l6ZSkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIHJlYWRSYXdWYXJpbnQzMigpIGFuZCByZWFkUmF3VmFyaW50NjQoKSBhbmQKKyAgICogY2hlY2tzIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBhc3NlcnRSZWFkVmFyaW50KGJ5dGVbXSBkYXRhLCBsb25nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKKyAgICBhc3NlcnRFcXVhbHMoKGludCl2YWx1ZSwgaW5wdXQucmVhZFJhd1ZhcmludDMyKCkpOworCisgICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd1ZhcmludDY0KCkpOworICAgIGFzc2VydFRydWUoaW5wdXQuaXNBdEVuZCgpKTsKKworICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCisgICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDw9IDE2OyBibG9ja1NpemUgKj0gMikgeworICAgICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKAorICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKGRhdGEsIGJsb2NrU2l6ZSkpOworICAgICAgYXNzZXJ0RXF1YWxzKChpbnQpdmFsdWUsIGlucHV0LnJlYWRSYXdWYXJpbnQzMigpKTsKKworICAgICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKAorICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKGRhdGEsIGJsb2NrU2l6ZSkpOworICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBpbnB1dC5yZWFkUmF3VmFyaW50NjQoKSk7CisgICAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7CisgICAgfQorCisgICAgLy8gVHJ5IHJlYWRpbmcgZGlyZWN0IGZyb20gYW4gSW5wdXRTdHJlYW0uICBXZSB3YW50IHRvIHZlcmlmeSB0aGF0IGl0CisgICAgLy8gZG9lc24ndCByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW5wdXQsIHNvIHdlIGNvcHkgdG8gYSBuZXcsIGJpZ2dlcgorICAgIC8vIGFycmF5IGZpcnN0LgorICAgIGJ5dGVbXSBsb25nZXJEYXRhID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGggKyAxXTsKKyAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIGxvbmdlckRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICBJbnB1dFN0cmVhbSByYXdJbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShsb25nZXJEYXRhKTsKKyAgICBhc3NlcnRFcXVhbHMoKGludCl2YWx1ZSwgQ29kZWRJbnB1dFN0cmVhbS5yZWFkUmF3VmFyaW50MzIocmF3SW5wdXQpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgcmF3SW5wdXQuYXZhaWxhYmxlKCkpOworICB9CisKKyAgLyoqCisgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gYnl0ZXMgdXNpbmcgcmVhZFJhd1ZhcmludDMyKCkgYW5kIHJlYWRSYXdWYXJpbnQ2NCgpIGFuZAorICAgKiBleHBlY3RzIHRoZW0gdG8gZmFpbCB3aXRoIGFuIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB3aG9zZQorICAgKiBkZXNjcmlwdGlvbiBtYXRjaGVzIHRoZSBnaXZlbiBvbmUuCisgICAqLworICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVhZFZhcmludEZhaWx1cmUoCisgICAgICBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZXhwZWN0ZWQsIGJ5dGVbXSBkYXRhKQorICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSk7CisgICAgdHJ5IHsKKyAgICAgIGlucHV0LnJlYWRSYXdWYXJpbnQzMigpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldE1lc3NhZ2UoKSwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKKyAgICB0cnkgeworICAgICAgaW5wdXQucmVhZFJhd1ZhcmludDY0KCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHdlIGdldCB0aGUgc2FtZSBlcnJvciB3aGVuIHJlYWRpbmcgZGlyZWN0IGZyb20gYW4gSW5wdXRTdHJlYW0uCisgICAgdHJ5IHsKKyAgICAgIENvZGVkSW5wdXRTdHJlYW0ucmVhZFJhd1ZhcmludDMyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqIFRlc3RzIHJlYWRSYXdWYXJpbnQzMigpIGFuZCByZWFkUmF3VmFyaW50NjQoKS4gKi8KKyAgcHVibGljIHZvaWQgdGVzdFJlYWRWYXJpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4MDApLCAwKTsKKyAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4MDEpLCAxKTsKKyAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4N2YpLCAxMjcpOworICAgIC8vIDE0ODgyCisgICAgYXNzZXJ0UmVhZFZhcmludChieXRlcygweGEyLCAweDc0KSwgKDB4MjIgPDwgMCkgfCAoMHg3NCA8PCA3KSk7CisgICAgLy8gMjk2MTQ4ODgzMAorICAgIGFzc2VydFJlYWRWYXJpbnQoYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgwYiksCisgICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKKyAgICAgICgweDBiTCA8PCAyOCkpOworCisgICAgLy8gNjQtYml0CisgICAgLy8gNzI1NjQ1NjEyNgorICAgIGFzc2VydFJlYWRWYXJpbnQoYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgxYiksCisgICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKKyAgICAgICgweDFiTCA8PCAyOCkpOworICAgIC8vIDQxMjU2MjAyNTgwNzE4MzM2CisgICAgYXNzZXJ0UmVhZFZhcmludCgKKyAgICAgIGJ5dGVzKDB4ODAsIDB4ZTYsIDB4ZWIsIDB4OWMsIDB4YzMsIDB4YzksIDB4YTQsIDB4NDkpLAorICAgICAgKDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8ICgweDFjIDw8IDIxKSB8CisgICAgICAoMHg0M0wgPDwgMjgpIHwgKDB4NDlMIDw8IDM1KSB8ICgweDI0TCA8PCA0MikgfCAoMHg0OUwgPDwgNDkpKTsKKyAgICAvLyAxMTk2NDM3ODMzMDk3ODczNTEzMQorICAgIGFzc2VydFJlYWRWYXJpbnQoCisgICAgICBieXRlcygweDliLCAweGE4LCAweGY5LCAweGMyLCAweGJiLCAweGQ2LCAweDgwLCAweDg1LCAweGE2LCAweDAxKSwKKyAgICAgICgweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfAorICAgICAgKDB4M2JMIDw8IDI4KSB8ICgweDU2TCA8PCAzNSkgfCAoMHgwMEwgPDwgNDIpIHwKKyAgICAgICgweDA1TCA8PCA0OSkgfCAoMHgyNkwgPDwgNTYpIHwgKDB4MDFMIDw8IDYzKSk7CisKKyAgICAvLyBGYWlsdXJlcworICAgIGFzc2VydFJlYWRWYXJpbnRGYWlsdXJlKAorICAgICAgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm1hbGZvcm1lZFZhcmludCgpLAorICAgICAgYnl0ZXMoMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgICAgICAgICAgIDB4MDApKTsKKyAgICBhc3NlcnRSZWFkVmFyaW50RmFpbHVyZSgKKyAgICAgIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi50cnVuY2F0ZWRNZXNzYWdlKCksCisgICAgICBieXRlcygweDgwKSk7CisgIH0KKworICAvKioKKyAgICogUGFyc2VzIHRoZSBnaXZlbiBieXRlcyB1c2luZyByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKSBhbmQgY2hlY2tzCisgICAqIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzIoYnl0ZVtdIGRhdGEsIGludCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsIGlucHV0LnJlYWRSYXdMaXR0bGVFbmRpYW4zMigpKTsKKyAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7CisKKyAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgorICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKKyAgICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKKyAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsKKyAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd0xpdHRsZUVuZGlhbjMyKCkpOworICAgICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpIGFuZCBjaGVja3MKKyAgICogdGhhdCB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGdpdmVuIHZhbHVlLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlYWRMaXR0bGVFbmRpYW42NChieXRlW10gZGF0YSwgbG9uZyB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKKyAgICBhc3NlcnRFcXVhbHModmFsdWUsIGlucHV0LnJlYWRSYXdMaXR0bGVFbmRpYW42NCgpKTsKKyAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7CisKKyAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgorICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKKyAgICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKKyAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsKKyAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkpOworICAgICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOworICAgIH0KKyAgfQorCisgIC8qKiBUZXN0cyByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKSBhbmQgcmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkuICovCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkTGl0dGxlRW5kaWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0UmVhZExpdHRsZUVuZGlhbjMyKGJ5dGVzKDB4NzgsIDB4NTYsIDB4MzQsIDB4MTIpLCAweDEyMzQ1Njc4KTsKKyAgICBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzIoYnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSksIDB4OWFiY2RlZjApOworCisgICAgYXNzZXJ0UmVhZExpdHRsZUVuZGlhbjY0KAorICAgICAgYnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSwgMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiksCisgICAgICAweDEyMzQ1Njc4OWFiY2RlZjBMKTsKKyAgICBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuNjQoCisgICAgICBieXRlcygweDc4LCAweDU2LCAweDM0LCAweDEyLCAweGYwLCAweGRlLCAweGJjLCAweDlhKSwKKyAgICAgIDB4OWFiY2RlZjAxMjM0NTY3OEwpOworICB9CisKKyAgLyoqIFRlc3QgZGVjb2RlWmlnWmFnMzIoKSBhbmQgZGVjb2RlWmlnWmFnNjQoKS4gKi8KKyAgcHVibGljIHZvaWQgdGVzdERlY29kZVppZ1phZygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyggMCwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigwKSk7CisgICAgYXNzZXJ0RXF1YWxzKC0xLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoIDEsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMikpOworICAgIGFzc2VydEVxdWFscygtMiwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigzKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4M0ZGRkZGRkYsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMHg3RkZGRkZGRSkpOworICAgIGFzc2VydEVxdWFscygweEMwMDAwMDAwLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKDB4N0ZGRkZGRkYpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHg3RkZGRkZGRiwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigweEZGRkZGRkZFKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4ODAwMDAwMDAsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMHhGRkZGRkZGRikpOworCisgICAgYXNzZXJ0RXF1YWxzKCAwLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDApKTsKKyAgICBhc3NlcnRFcXVhbHMoLTEsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMSkpOworICAgIGFzc2VydEVxdWFscyggMSwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKC0yLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDMpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHgwMDAwMDAwMDNGRkZGRkZGTCwKKyAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgweDAwMDAwMDAwN0ZGRkZGRkVMKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4RkZGRkZGRkZDMDAwMDAwMEwsCisgICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMDdGRkZGRkZGTCkpOworICAgIGFzc2VydEVxdWFscygweDAwMDAwMDAwN0ZGRkZGRkZMLAorICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDB4MDAwMDAwMDBGRkZGRkZGRUwpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHhGRkZGRkZGRjgwMDAwMDAwTCwKKyAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgweDAwMDAwMDAwRkZGRkZGRkZMKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4N0ZGRkZGRkZGRkZGRkZGRkwsCisgICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMHhGRkZGRkZGRkZGRkZGRkZFTCkpOworICAgIGFzc2VydEVxdWFscygweDgwMDAwMDAwMDAwMDAwMDBMLAorICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDB4RkZGRkZGRkZGRkZGRkZGRkwpKTsKKyAgfQorCisgIC8qKiBUZXN0cyByZWFkaW5nIGFuZCBwYXJzaW5nIGEgd2hvbGUgbWVzc2FnZSB3aXRoIGV2ZXJ5IGZpZWxkIHR5cGUuICovCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV2hvbGVNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKKworICAgIGJ5dGVbXSByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlQXJyYXkoKTsKKyAgICBhc3NlcnRFcXVhbHMocmF3Qnl0ZXMubGVuZ3RoLCBtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOworCisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShyYXdCeXRlcyk7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKworICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCisgICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDwgMjU2OyBibG9ja1NpemUgKj0gMikgeworICAgICAgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKAorICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKHJhd0J5dGVzLCBibG9ja1NpemUpKTsKKyAgICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisgICAgfQorICB9CisKKyAgLyoqIFRlc3RzIHNraXBGaWVsZCgpLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0U2tpcFdob2xlTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7CisgICAgYnl0ZVtdIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVBcnJheSgpOworCisgICAgLy8gQ3JlYXRlIHR3byBwYXJhbGxlbCBpbnB1dHMuICBQYXJzZSBvbmUgYXMgdW5rbm93biBmaWVsZHMgd2hpbGUgdXNpbmcKKyAgICAvLyBza2lwRmllbGQoKSB0byBza2lwIGVhY2ggZmllbGQgb24gdGhlIG90aGVyLiAgRXhwZWN0IHRoZSBzYW1lIHRhZ3MuCisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dDEgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd0J5dGVzKTsKKyAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0MiA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3Qnl0ZXMpOworICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGludCB0YWcgPSBpbnB1dDEucmVhZFRhZygpOworICAgICAgYXNzZXJ0RXF1YWxzKHRhZywgaW5wdXQyLnJlYWRUYWcoKSk7CisgICAgICBpZiAodGFnID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB1bmtub3duRmllbGRzLm1lcmdlRmllbGRGcm9tKHRhZywgaW5wdXQxKTsKKyAgICAgIGlucHV0Mi5za2lwRmllbGQodGFnKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVGVzdCB0aGF0IGEgYnVnIGluIHNraXBSYXdCeXRlcygpIGhhcyBiZWVuIGZpeGVkOiAgaWYgdGhlIHNraXAgc2tpcHMKKyAgICogZXhhY3RseSB1cCB0byBhIGxpbWl0LCB0aGlzIHNob3VsZCBub3QgYnJlYWsgdGhpbmdzLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdFNraXBSYXdCeXRlc0J1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ5dGVbXSByYXdCeXRlcyA9IG5ldyBieXRlW10geyAxLCAyIH07CisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3Qnl0ZXMpOworCisgICAgaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KDEpOworICAgIGlucHV0LnNraXBSYXdCeXRlcygxKTsKKyAgICBpbnB1dC5wb3BMaW1pdChsaW1pdCk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGlucHV0LnJlYWRSYXdCeXRlKCkpOworICB9CisKKyAgLyoqCisgICAqIFRlc3QgdGhhdCBhIGJ1ZyBpbiBza2lwUmF3Qnl0ZXMoKSBoYXMgYmVlbiBmaXhlZDogIGlmIHRoZSBza2lwIHNraXBzCisgICAqIHBhc3QgdGhlIGVuZCBvZiBhIGJ1ZmZlciB3aXRoIGEgbGltaXQgdGhhdCBoYXMgYmVlbiBzZXQgcGFzdCB0aGUgZW5kIG9mCisgICAqIHRoYXQgYnVmZmVyLCB0aGlzIHNob3VsZCBub3QgYnJlYWsgdGhpbmdzLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdFNraXBSYXdCeXRlc1Bhc3RFbmRPZkJ1ZmZlcldpdGhMaW1pdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ5dGVbXSByYXdCeXRlcyA9IG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1IH07CisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoCisgICAgICAgIG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0ocmF3Qnl0ZXMsIDMpKTsKKworICAgIGludCBsaW1pdCA9IGlucHV0LnB1c2hMaW1pdCg0KTsKKyAgICAvLyBJbiBvcmRlciB0byBleHBvc2UgdGhlIGJ1ZyB3ZSBuZWVkIHRvIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUgdG8gcHJpbWUgdGhlCisgICAgLy8gYnVmZmVyIGluc2lkZSB0aGUgQ29kZWRJbnB1dFN0cmVhbS4KKyAgICBhc3NlcnRFcXVhbHMoMSwgaW5wdXQucmVhZFJhd0J5dGUoKSk7CisgICAgLy8gU2tpcCB0byB0aGUgZW5kIG9mIHRoZSBsaW1pdC4KKyAgICBpbnB1dC5za2lwUmF3Qnl0ZXMoMyk7CisgICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOworICAgIGlucHV0LnBvcExpbWl0KGxpbWl0KTsKKyAgICBhc3NlcnRFcXVhbHMoNSwgaW5wdXQucmVhZFJhd0J5dGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEh1Z2VCbG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSAxTUIgYmxvYi4KKyAgICBieXRlW10gYmxvYiA9IG5ldyBieXRlWzEgPDwgMjBdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvYi5sZW5ndGg7IGkrKykgeworICAgICAgYmxvYltpXSA9IChieXRlKWk7CisgICAgfQorCisgICAgLy8gTWFrZSBhIG1lc3NhZ2UgY29udGFpbmluZyBpdC4KKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7CisgICAgYnVpbGRlci5zZXRPcHRpb25hbEJ5dGVzKEJ5dGVTdHJpbmcuY29weUZyb20oYmxvYikpOworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworCisgICAgLy8gU2VyaWFsaXplIGFuZCBwYXJzZSBpdC4gIE1ha2Ugc3VyZSB0byBwYXJzZSBmcm9tIGFuIElucHV0U3RyZWFtLCBub3QKKyAgICAvLyBkaXJlY3RseSBmcm9tIGEgQnl0ZVN0cmluZywgc28gdGhhdCBDb2RlZElucHV0U3RyZWFtIHVzZXMgYnVmZmVyZWQKKyAgICAvLyByZWFkaW5nLgorICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9CisgICAgICBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkubmV3SW5wdXQoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRPcHRpb25hbEJ5dGVzKCksIG1lc3NhZ2UyLmdldE9wdGlvbmFsQnl0ZXMoKSk7CisKKyAgICAvLyBNYWtlIHN1cmUgYWxsIHRoZSBvdGhlciBmaWVsZHMgd2VyZSBwYXJzZWQgY29ycmVjdGx5LgorICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMyA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKG1lc3NhZ2UyKQorICAgICAgLnNldE9wdGlvbmFsQnl0ZXMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkuZ2V0T3B0aW9uYWxCeXRlcygpKQorICAgICAgLmJ1aWxkKCk7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkTWFsaWNpb3VzbHlMYXJnZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBCeXRlU3RyaW5nLk91dHB1dCByYXdPdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpOworICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCk7CisKKyAgICBpbnQgdGFnID0gV2lyZUZvcm1hdC5tYWtlVGFnKDEsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisgICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIodGFnKTsKKyAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigweDdGRkZGRkZGKTsKKyAgICBvdXRwdXQud3JpdGVSYXdCeXRlcyhuZXcgYnl0ZVszMl0pOyAgLy8gUGFkIHdpdGggYSBmZXcgcmFuZG9tIGJ5dGVzLgorICAgIG91dHB1dC5mbHVzaCgpOworCisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IHJhd091dHB1dC50b0J5dGVTdHJpbmcoKS5uZXdDb2RlZElucHV0KCk7CisgICAgYXNzZXJ0RXF1YWxzKHRhZywgaW5wdXQucmVhZFRhZygpKTsKKworICAgIHRyeSB7CisgICAgICBpbnB1dC5yZWFkQnl0ZXMoKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MuCisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBtYWtlUmVjdXJzaXZlTWVzc2FnZShpbnQgZGVwdGgpIHsKKyAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgcmV0dXJuIFRlc3RSZWN1cnNpdmVNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRJKDUpLmJ1aWxkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBUZXN0UmVjdXJzaXZlTWVzc2FnZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEEobWFrZVJlY3Vyc2l2ZU1lc3NhZ2UoZGVwdGggLSAxKSkuYnVpbGQoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVzc2FnZURlcHRoKFRlc3RSZWN1cnNpdmVNZXNzYWdlIG1lc3NhZ2UsIGludCBkZXB0aCkgeworICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0EoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoNSwgbWVzc2FnZS5nZXRJKCkpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzQSgpKTsKKyAgICAgIGFzc2VydE1lc3NhZ2VEZXB0aChtZXNzYWdlLmdldEEoKSwgZGVwdGggLSAxKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TWFsaWNpb3VzUmVjdXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQnl0ZVN0cmluZyBkYXRhNjQgPSBtYWtlUmVjdXJzaXZlTWVzc2FnZSg2NCkudG9CeXRlU3RyaW5nKCk7CisgICAgQnl0ZVN0cmluZyBkYXRhNjUgPSBtYWtlUmVjdXJzaXZlTWVzc2FnZSg2NSkudG9CeXRlU3RyaW5nKCk7CisKKyAgICBhc3NlcnRNZXNzYWdlRGVwdGgoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UucGFyc2VGcm9tKGRhdGE2NCksIDY0KTsKKworICAgIHRyeSB7CisgICAgICBUZXN0UmVjdXJzaXZlTWVzc2FnZS5wYXJzZUZyb20oZGF0YTY1KTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MuCisgICAgfQorCisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IGRhdGE2NC5uZXdDb2RlZElucHV0KCk7CisgICAgaW5wdXQuc2V0UmVjdXJzaW9uTGltaXQoOCk7CisgICAgdHJ5IHsKKyAgICAgIFRlc3RSZWN1cnNpdmVNZXNzYWdlLnBhcnNlRnJvbShpbnB1dCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzLgorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTaXplTGltaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKKyAgICAgIFRlc3RVdGlsLmdldEFsbFNldCgpLnRvQnl0ZVN0cmluZygpLm5ld0lucHV0KCkpOworICAgIGlucHV0LnNldFNpemVMaW1pdCgxNik7CisKKyAgICB0cnkgeworICAgICAgVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShpbnB1dCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzLgorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXNldFNpemVDb3VudGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoCisgICAgICAgIG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0obmV3IGJ5dGVbMjU2XSwgOCkpOworICAgIGlucHV0LnNldFNpemVMaW1pdCgxNik7CisgICAgaW5wdXQucmVhZFJhd0J5dGVzKDE2KTsKKyAgICBhc3NlcnRFcXVhbHMoMTYsIGlucHV0LmdldFRvdGFsQnl0ZXNSZWFkKCkpOworCisgICAgdHJ5IHsKKyAgICAgIGlucHV0LnJlYWRSYXdCeXRlKCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOworICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzLgorICAgIH0KKworICAgIGlucHV0LnJlc2V0U2l6ZUNvdW50ZXIoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgaW5wdXQuZ2V0VG90YWxCeXRlc1JlYWQoKSk7CisgICAgaW5wdXQucmVhZFJhd0J5dGUoKTsgIC8vIE5vIGV4Y2VwdGlvbiB0aHJvd24uCisgICAgaW5wdXQucmVzZXRTaXplQ291bnRlcigpOworICAgIGFzc2VydEVxdWFscygwLCBpbnB1dC5nZXRUb3RhbEJ5dGVzUmVhZCgpKTsKKworICAgIHRyeSB7CisgICAgICBpbnB1dC5yZWFkUmF3Qnl0ZXMoMTYpOyAgLy8gSGl0cyBsaW1pdCBhZ2Fpbi4KKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7CisgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MuCisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFRlc3RzIHRoYXQgaWYgd2UgcmVhZCBhbiBzdHJpbmcgdGhhdCBjb250YWlucyBpbnZhbGlkIFVURi04LCBubyBleGNlcHRpb24KKyAgICogaXMgdGhyb3duLiAgSW5zdGVhZCwgdGhlIGludmFsaWQgYnl0ZXMgYXJlIHJlcGxhY2VkIHdpdGggdGhlIFVuaWNvZGUKKyAgICogInJlcGxhY2VtZW50IGNoYXJhY3RlciIgVStGRkZELgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdFJlYWRJbnZhbGlkVXRmOCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVTdHJpbmcuT3V0cHV0IHJhd091dHB1dCA9IEJ5dGVTdHJpbmcubmV3T3V0cHV0KCk7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0KTsKKworICAgIGludCB0YWcgPSBXaXJlRm9ybWF0Lm1ha2VUYWcoMSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKyAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMih0YWcpOworICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKDEpOworICAgIG91dHB1dC53cml0ZVJhd0J5dGVzKG5ldyBieXRlW10geyAoYnl0ZSkweDgwIH0pOworICAgIG91dHB1dC5mbHVzaCgpOworCisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IHJhd091dHB1dC50b0J5dGVTdHJpbmcoKS5uZXdDb2RlZElucHV0KCk7CisgICAgYXNzZXJ0RXF1YWxzKHRhZywgaW5wdXQucmVhZFRhZygpKTsKKyAgICBTdHJpbmcgdGV4dCA9IGlucHV0LnJlYWRTdHJpbmcoKTsKKyAgICBhc3NlcnRFcXVhbHMoMHhmZmZkLCB0ZXh0LmNoYXJBdCgwKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZyb21TbGljZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGJ5dGVbXSBieXRlcyA9IGJ5dGVzKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpOworICAgIENvZGVkSW5wdXRTdHJlYW0gaW4gPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ5dGVzLCAzLCA1KTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgaW4uZ2V0VG90YWxCeXRlc1JlYWQoKSk7CisgICAgZm9yIChpbnQgaSA9IDM7IGkgPCA4OyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyhpLCBpbi5yZWFkUmF3Qnl0ZSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhpLTIsIGluLmdldFRvdGFsQnl0ZXNSZWFkKCkpOworICAgIH0KKyAgICAvLyBlb2YKKyAgICBhc3NlcnRFcXVhbHMoMCwgaW4ucmVhZFRhZygpKTsKKyAgICBhc3NlcnRFcXVhbHMoNSwgaW4uZ2V0VG90YWxCeXRlc1JlYWQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRhZygpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIEFueSB0YWcgbnVtYmVyIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGZpZWxkIG51bWJlciB6ZXJvIGlzIGludmFsaWQgYW5kCisgICAgLy8gc2hvdWxkIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgdHJ5IHsKKyAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShieXRlcyhpKSkucmVhZFRhZygpOworICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5pbnZhbGlkVGFnKCkuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDc2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwzMTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZFR5cGVzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIHtAbGluayBDb2RlZE91dHB1dFN0cmVhbX0uCisgKgorICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKKyAqLworcHVibGljIGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgLyoqCisgICAqIEhlbHBlciB0byBjb25zdHJ1Y3QgYSBieXRlIGFycmF5IGZyb20gYSBidW5jaCBvZiBieXRlcy4gIFRoZSBpbnB1dHMgYXJlCisgICAqIGFjdHVhbGx5IGludHMgc28gdGhhdCBJIGNhbiB1c2UgaGV4IG5vdGF0aW9uIGFuZCBub3QgZ2V0IHN0dXBpZCBlcnJvcnMKKyAgICogYWJvdXQgcHJlY2lzaW9uLgorICAgKi8KKyAgcHJpdmF0ZSBieXRlW10gYnl0ZXMoaW50Li4uIGJ5dGVzQXNJbnRzKSB7CisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXNBc0ludHMubGVuZ3RoXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzQXNJbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICBieXRlc1tpXSA9IChieXRlKSBieXRlc0FzSW50c1tpXTsKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVzOworICB9CisKKyAgLyoqIEFycmF5cy5hc0xpc3QoKSBkb2VzIG5vdCB3b3JrIHdpdGggYXJyYXlzIG9mIHByaW1pdGl2ZXMuICA6KCAqLworICBwcml2YXRlIExpc3Q8Qnl0ZT4gdG9MaXN0KGJ5dGVbXSBieXRlcykgeworICAgIExpc3Q8Qnl0ZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxCeXRlPigpOworICAgIGZvciAoYnl0ZSBiIDogYnl0ZXMpIHsKKyAgICAgIHJlc3VsdC5hZGQoYik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxCeXRlcyhieXRlW10gYSwgYnl0ZVtdIGIpIHsKKyAgICBhc3NlcnRFcXVhbHModG9MaXN0KGEpLCB0b0xpc3QoYikpOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgZ2l2ZW4gdmFsdWUgdXNpbmcgd3JpdGVSYXdWYXJpbnQzMigpIGFuZCB3cml0ZVJhd1ZhcmludDY0KCkgYW5kCisgICAqIGNoZWNrcyB0aGF0IHRoZSByZXN1bHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gYnl0ZXMuCisgICAqLworICBwcml2YXRlIHZvaWQgYXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZVtdIGRhdGEsIGxvbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIE9ubHkgZG8gMzItYml0IHdyaXRlIGlmIHRoZSB2YWx1ZSBmaXRzIGluIDMyIGJpdHMuCisgICAgaWYgKCh2YWx1ZSA+Pj4gMzIpID09IDApIHsKKyAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByYXdPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdPdXRwdXQpOworICAgICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoKGludCkgdmFsdWUpOworICAgICAgb3V0cHV0LmZsdXNoKCk7CisgICAgICBhc3NlcnRFcXVhbEJ5dGVzKGRhdGEsIHJhd091dHB1dC50b0J5dGVBcnJheSgpKTsKKworICAgICAgLy8gQWxzbyB0cnkgY29tcHV0aW5nIHNpemUuCisgICAgICBhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVJhd1ZhcmludDMyU2l6ZSgoaW50KSB2YWx1ZSkpOworICAgIH0KKworICAgIHsKKyAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByYXdPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdPdXRwdXQpOworICAgICAgb3V0cHV0LndyaXRlUmF3VmFyaW50NjQodmFsdWUpOworICAgICAgb3V0cHV0LmZsdXNoKCk7CisgICAgICBhc3NlcnRFcXVhbEJ5dGVzKGRhdGEsIHJhd091dHB1dC50b0J5dGVBcnJheSgpKTsKKworICAgICAgLy8gQWxzbyB0cnkgY29tcHV0aW5nIHNpemUuCisgICAgICBhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVJhd1ZhcmludDY0U2l6ZSh2YWx1ZSkpOworICAgIH0KKworICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCisgICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDw9IDE2OyBibG9ja1NpemUgKj0gMikgeworICAgICAgLy8gT25seSBkbyAzMi1iaXQgd3JpdGUgaWYgdGhlIHZhbHVlIGZpdHMgaW4gMzIgYml0cy4KKyAgICAgIGlmICgodmFsdWUgPj4+IDMyKSA9PSAwKSB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByYXdPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9CisgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0LCBibG9ja1NpemUpOworICAgICAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigoaW50KSB2YWx1ZSk7CisgICAgICAgIG91dHB1dC5mbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbEJ5dGVzKGRhdGEsIHJhd091dHB1dC50b0J5dGVBcnJheSgpKTsKKyAgICAgIH0KKworICAgICAgeworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPQorICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCwgYmxvY2tTaXplKTsKKyAgICAgICAgb3V0cHV0LndyaXRlUmF3VmFyaW50NjQodmFsdWUpOworICAgICAgICBvdXRwdXQuZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhkYXRhLCByYXdPdXRwdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqIFRlc3RzIHdyaXRlUmF3VmFyaW50MzIoKSBhbmQgd3JpdGVSYXdWYXJpbnQ2NCgpLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVWYXJpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRXcml0ZVZhcmludChieXRlcygweDAwKSwgMCk7CisgICAgYXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZXMoMHgwMSksIDEpOworICAgIGFzc2VydFdyaXRlVmFyaW50KGJ5dGVzKDB4N2YpLCAxMjcpOworICAgIC8vIDE0ODgyCisgICAgYXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZXMoMHhhMiwgMHg3NCksICgweDIyIDw8IDApIHwgKDB4NzQgPDwgNykpOworICAgIC8vIDI5NjE0ODg4MzAKKyAgICBhc3NlcnRXcml0ZVZhcmludChieXRlcygweGJlLCAweGY3LCAweDkyLCAweDg0LCAweDBiKSwKKyAgICAgICgweDNlIDw8IDApIHwgKDB4NzcgPDwgNykgfCAoMHgxMiA8PCAxNCkgfCAoMHgwNCA8PCAyMSkgfAorICAgICAgKDB4MGJMIDw8IDI4KSk7CisKKyAgICAvLyA2NC1iaXQKKyAgICAvLyA3MjU2NDU2MTI2CisgICAgYXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgxYiksCisgICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKKyAgICAgICgweDFiTCA8PCAyOCkpOworICAgIC8vIDQxMjU2MjAyNTgwNzE4MzM2CisgICAgYXNzZXJ0V3JpdGVWYXJpbnQoCisgICAgICBieXRlcygweDgwLCAweGU2LCAweGViLCAweDljLCAweGMzLCAweGM5LCAweGE0LCAweDQ5KSwKKyAgICAgICgweDAwIDw8IDApIHwgKDB4NjYgPDwgNykgfCAoMHg2YiA8PCAxNCkgfCAoMHgxYyA8PCAyMSkgfAorICAgICAgKDB4NDNMIDw8IDI4KSB8ICgweDQ5TCA8PCAzNSkgfCAoMHgyNEwgPDwgNDIpIHwgKDB4NDlMIDw8IDQ5KSk7CisgICAgLy8gMTE5NjQzNzgzMzA5Nzg3MzUxMzEKKyAgICBhc3NlcnRXcml0ZVZhcmludCgKKyAgICAgIGJ5dGVzKDB4OWIsIDB4YTgsIDB4ZjksIDB4YzIsIDB4YmIsIDB4ZDYsIDB4ODAsIDB4ODUsIDB4YTYsIDB4MDEpLAorICAgICAgKDB4MWIgPDwgMCkgfCAoMHgyOCA8PCA3KSB8ICgweDc5IDw8IDE0KSB8ICgweDQyIDw8IDIxKSB8CisgICAgICAoMHgzYkwgPDwgMjgpIHwgKDB4NTZMIDw8IDM1KSB8ICgweDAwTCA8PCA0MikgfAorICAgICAgKDB4MDVMIDw8IDQ5KSB8ICgweDI2TCA8PCA1NikgfCAoMHgwMUwgPDwgNjMpKTsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIHdyaXRlUmF3TGl0dGxlRW5kaWFuMzIoKSBhbmQgY2hlY2tzCisgICAqIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICovCisgIHByaXZhdGUgdm9pZCBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjMyKGJ5dGVbXSBkYXRhLCBpbnQgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByYXdPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0KTsKKyAgICBvdXRwdXQud3JpdGVSYXdMaXR0bGVFbmRpYW4zMih2YWx1ZSk7CisgICAgb3V0cHV0LmZsdXNoKCk7CisgICAgYXNzZXJ0RXF1YWxCeXRlcyhkYXRhLCByYXdPdXRwdXQudG9CeXRlQXJyYXkoKSk7CisKKyAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgorICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKKyAgICAgIHJhd091dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCwgYmxvY2tTaXplKTsKKyAgICAgIG91dHB1dC53cml0ZVJhd0xpdHRsZUVuZGlhbjMyKHZhbHVlKTsKKyAgICAgIG91dHB1dC5mbHVzaCgpOworICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhkYXRhLCByYXdPdXRwdXQudG9CeXRlQXJyYXkoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gYnl0ZXMgdXNpbmcgd3JpdGVSYXdMaXR0bGVFbmRpYW42NCgpIGFuZCBjaGVja3MKKyAgICogdGhhdCB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGdpdmVuIHZhbHVlLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGFzc2VydFdyaXRlTGl0dGxlRW5kaWFuNjQoYnl0ZVtdIGRhdGEsIGxvbmcgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByYXdPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0KTsKKyAgICBvdXRwdXQud3JpdGVSYXdMaXR0bGVFbmRpYW42NCh2YWx1ZSk7CisgICAgb3V0cHV0LmZsdXNoKCk7CisgICAgYXNzZXJ0RXF1YWxCeXRlcyhkYXRhLCByYXdPdXRwdXQudG9CeXRlQXJyYXkoKSk7CisKKyAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgorICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKKyAgICAgIHJhd091dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCwgYmxvY2tTaXplKTsKKyAgICAgIG91dHB1dC53cml0ZVJhd0xpdHRsZUVuZGlhbjY0KHZhbHVlKTsKKyAgICAgIG91dHB1dC5mbHVzaCgpOworICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhkYXRhLCByYXdPdXRwdXQudG9CeXRlQXJyYXkoKSk7CisgICAgfQorICB9CisKKyAgLyoqIFRlc3RzIHdyaXRlUmF3TGl0dGxlRW5kaWFuMzIoKSBhbmQgd3JpdGVSYXdMaXR0bGVFbmRpYW42NCgpLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVMaXR0bGVFbmRpYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjMyKGJ5dGVzKDB4NzgsIDB4NTYsIDB4MzQsIDB4MTIpLCAweDEyMzQ1Njc4KTsKKyAgICBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjMyKGJ5dGVzKDB4ZjAsIDB4ZGUsIDB4YmMsIDB4OWEpLCAweDlhYmNkZWYwKTsKKworICAgIGFzc2VydFdyaXRlTGl0dGxlRW5kaWFuNjQoCisgICAgICBieXRlcygweGYwLCAweGRlLCAweGJjLCAweDlhLCAweDc4LCAweDU2LCAweDM0LCAweDEyKSwKKyAgICAgIDB4MTIzNDU2Nzg5YWJjZGVmMEwpOworICAgIGFzc2VydFdyaXRlTGl0dGxlRW5kaWFuNjQoCisgICAgICBieXRlcygweDc4LCAweDU2LCAweDM0LCAweDEyLCAweGYwLCAweGRlLCAweGJjLCAweDlhKSwKKyAgICAgIDB4OWFiY2RlZjAxMjM0NTY3OEwpOworICB9CisKKyAgLyoqIFRlc3QgZW5jb2RlWmlnWmFnMzIoKSBhbmQgZW5jb2RlWmlnWmFnNjQoKS4gKi8KKyAgcHVibGljIHZvaWQgdGVzdEVuY29kZVppZ1phZygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscygwLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMiggMCkpOworICAgIGFzc2VydEVxdWFscygxLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMigtMSkpOworICAgIGFzc2VydEVxdWFscygyLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMiggMSkpOworICAgIGFzc2VydEVxdWFscygzLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMigtMikpOworICAgIGFzc2VydEVxdWFscygweDdGRkZGRkZFLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMigweDNGRkZGRkZGKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4N0ZGRkZGRkYsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKDB4QzAwMDAwMDApKTsKKyAgICBhc3NlcnRFcXVhbHMoMHhGRkZGRkZGRSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoMHg3RkZGRkZGRikpOworICAgIGFzc2VydEVxdWFscygweEZGRkZGRkZGLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMigweDgwMDAwMDAwKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoMCwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoIDApKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoLTEpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoIDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoLTIpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHgwMDAwMDAwMDdGRkZGRkZFTCwKKyAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoMHgwMDAwMDAwMDNGRkZGRkZGTCkpOworICAgIGFzc2VydEVxdWFscygweDAwMDAwMDAwN0ZGRkZGRkZMLAorICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgweEZGRkZGRkZGQzAwMDAwMDBMKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4MDAwMDAwMDBGRkZGRkZGRUwsCisgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KDB4MDAwMDAwMDA3RkZGRkZGRkwpKTsKKyAgICBhc3NlcnRFcXVhbHMoMHgwMDAwMDAwMEZGRkZGRkZGTCwKKyAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoMHhGRkZGRkZGRjgwMDAwMDAwTCkpOworICAgIGFzc2VydEVxdWFscygweEZGRkZGRkZGRkZGRkZGRkVMLAorICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgweDdGRkZGRkZGRkZGRkZGRkZMKSk7CisgICAgYXNzZXJ0RXF1YWxzKDB4RkZGRkZGRkZGRkZGRkZGRkwsCisgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KDB4ODAwMDAwMDAwMDAwMDAwMEwpKTsKKworICAgIC8vIFNvbWUgZWFzaWVyLXRvLXZlcmlmeSByb3VuZC10cmlwIHRlc3RzLiAgVGhlIGlucHV0cyAob3RoZXIgdGhhbiAwLCAxLCAtMSkKKyAgICAvLyB3ZXJlIGNob3NlbiBzZW1pLXJhbmRvbWx5IHZpYSBrZXlib2FyZCBiYXNoaW5nLgorICAgIGFzc2VydEVxdWFscygwLAorICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigwKSkpOworICAgIGFzc2VydEVxdWFscygxLAorICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigxKSkpOworICAgIGFzc2VydEVxdWFscygtMSwKKyAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoLTEpKSk7CisgICAgYXNzZXJ0RXF1YWxzKDE0OTI3LAorICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigxNDkyNykpKTsKKyAgICBhc3NlcnRFcXVhbHMoLTM2MTIsCisgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMihDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKC0zNjEyKSkpOworCisgICAgYXNzZXJ0RXF1YWxzKDAsCisgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NChDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDApKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsCisgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NChDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDEpKSk7CisgICAgYXNzZXJ0RXF1YWxzKC0xLAorICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgtMSkpKTsKKyAgICBhc3NlcnRFcXVhbHMoMTQ5MjcsCisgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NChDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDE0OTI3KSkpOworICAgIGFzc2VydEVxdWFscygtMzYxMiwKKyAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoLTM2MTIpKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoODU2OTEyMzA0ODAxNDE2TCwKKyAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KAorICAgICAgICBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KAorICAgICAgICAgIDg1NjkxMjMwNDgwMTQxNkwpKSk7CisgICAgYXNzZXJ0RXF1YWxzKC03NTEyMzkwNTQzOTU3MTI1NkwsCisgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgKKyAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgKKyAgICAgICAgICAtNzUxMjM5MDU0Mzk1NzEyNTZMKSkpOworICB9CisKKyAgLyoqIFRlc3RzIHdyaXRpbmcgYSB3aG9sZSBtZXNzYWdlIHdpdGggZXZlcnkgZmllbGQgdHlwZS4gKi8KKyAgcHVibGljIHZvaWQgdGVzdFdyaXRlV2hvbGVNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKKworICAgIGJ5dGVbXSByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlQXJyYXkoKTsKKyAgICBhc3NlcnRFcXVhbEJ5dGVzKFRlc3RVdGlsLmdldEdvbGRlbk1lc3NhZ2UoKS50b0J5dGVBcnJheSgpLCByYXdCeXRlcyk7CisKKyAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgorICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8IDI1NjsgYmxvY2tTaXplICo9IDIpIHsKKyAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSByYXdPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPQorICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdPdXRwdXQsIGJsb2NrU2l6ZSk7CisgICAgICBtZXNzYWdlLndyaXRlVG8ob3V0cHV0KTsKKyAgICAgIG91dHB1dC5mbHVzaCgpOworICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhyYXdCeXRlcywgcmF3T3V0cHV0LnRvQnl0ZUFycmF5KCkpOworICAgIH0KKyAgfQorCisgIC8qKiBUZXN0cyB3cml0aW5nIGEgd2hvbGUgbWVzc2FnZSB3aXRoIGV2ZXJ5IHBhY2tlZCBmaWVsZCB0eXBlLiBFbnN1cmVzIHRoZQorICAgKiB3aXJlIGZvcm1hdCBvZiBwYWNrZWQgZmllbGRzIGlzIGNvbXBhdGlibGUgd2l0aCBDKysuICovCisgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVdob2xlUGFja2VkRmllbGRzTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCk7CisKKyAgICBieXRlW10gcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZUFycmF5KCk7CisgICAgYXNzZXJ0RXF1YWxCeXRlcyhUZXN0VXRpbC5nZXRHb2xkZW5QYWNrZWRGaWVsZHNNZXNzYWdlKCkudG9CeXRlQXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgIHJhd0J5dGVzKTsKKyAgfQorCisgIC8qKiBUZXN0IHdyaXRpbmcgYSBtZXNzYWdlIGNvbnRhaW5pbmcgYSBuZWdhdGl2ZSBlbnVtIHZhbHVlLiBUaGlzIHVzZWQgdG8KKyAgICogZmFpbCBiZWNhdXNlIHRoZSBzaXplIHdhcyBub3QgcHJvcGVybHkgY29tcHV0ZWQgYXMgYSBzaWduLWV4dGVuZGVkIHZhcmludC4gKi8KKyAgcHVibGljIHZvaWQgdGVzdFdyaXRlTWVzc2FnZVdpdGhOZWdhdGl2ZUVudW1WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uU3BhcnNlRW51bU1lc3NhZ2UgbWVzc2FnZSA9CisgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uU3BhcnNlRW51bU1lc3NhZ2UubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRTcGFyc2VFbnVtKHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFNwYXJzZUVudW0uU1BBUlNFX0UpCisgICAgICAgIC5idWlsZCgpOworICAgIGFzc2VydFRydWUobWVzc2FnZS5nZXRTcGFyc2VFbnVtKCkuZ2V0TnVtYmVyKCkgPCAwKTsKKyAgICBieXRlW10gcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZUFycmF5KCk7CisgICAgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5TcGFyc2VFbnVtTWVzc2FnZSBtZXNzYWdlMiA9CisgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uU3BhcnNlRW51bU1lc3NhZ2UucGFyc2VGcm9tKHJhd0J5dGVzKTsKKyAgICBhc3NlcnRFcXVhbHMocHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0U3BhcnNlRW51bS5TUEFSU0VfRSwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZTIuZ2V0U3BhcnNlRW51bSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0RlcHJlY2F0ZWRGaWVsZFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXByZWNhdGVkRmllbGRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4YmI0NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXByZWNhdGVkRmllbGRUZXN0LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0RGVwcmVjYXRlZEZpZWxkczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworLyoqCisgKiBUZXN0IGZpZWxkIGRlcHJlY2F0aW9uCisgKiAKKyAqIEBhdXRob3IgYmlyZG9AZ29vZ2xlLmNvbSAoUm9iZXJ0byBTY2FyYW11enppKQorICovCitwdWJsaWMgY2xhc3MgRGVwcmVjYXRlZEZpZWxkVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHJpdmF0ZSBTdHJpbmdbXSBkZXByZWNhdGVkR2V0dGVyTmFtZXMgPSB7CisgICAgICAiaGFzRGVwcmVjYXRlZEludDMyIiwKKyAgICAgICJnZXREZXByZWNhdGVkSW50MzIifTsKKyAgCisgIHByaXZhdGUgU3RyaW5nW10gZGVwcmVjYXRlZEJ1aWxkZXJHZXR0ZXJOYW1lcyA9IHsKKyAgICAgICJoYXNEZXByZWNhdGVkSW50MzIiLAorICAgICAgImdldERlcHJlY2F0ZWRJbnQzMiIsCisgICAgICAiY2xlYXJEZXByZWNhdGVkSW50MzIifTsKKyAgCisgIHByaXZhdGUgU3RyaW5nW10gZGVwcmVjYXRlZEJ1aWxkZXJTZXR0ZXJOYW1lcyA9IHsKKyAgICAgICJzZXREZXByZWNhdGVkSW50MzIifTsgCisgIAorICBwdWJsaWMgdm9pZCB0ZXN0RGVwcmVjYXRlZEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQ2xhc3M8Pz4gZGVwcmVjYXRlZEZpZWxkcyA9IFRlc3REZXByZWNhdGVkRmllbGRzLmNsYXNzOworICAgIENsYXNzPD8+IGRlcHJlY2F0ZWRGaWVsZHNCdWlsZGVyID0gVGVzdERlcHJlY2F0ZWRGaWVsZHMuQnVpbGRlci5jbGFzczsKKyAgICBmb3IgKFN0cmluZyBuYW1lIDogZGVwcmVjYXRlZEdldHRlck5hbWVzKSB7CisgICAgICBNZXRob2QgbWV0aG9kID0gZGVwcmVjYXRlZEZpZWxkcy5nZXRNZXRob2QobmFtZSk7CisgICAgICBhc3NlcnRUcnVlKCJNZXRob2QgIiArIG5hbWUgKyAiIHNob3VsZCBiZSBkZXByZWNhdGVkIiwKKyAgICAgICAgICBpc0RlcHJlY2F0ZWQobWV0aG9kKSk7CisgICAgfQorICAgIGZvciAoU3RyaW5nIG5hbWUgOiBkZXByZWNhdGVkQnVpbGRlckdldHRlck5hbWVzKSB7CisgICAgICBNZXRob2QgbWV0aG9kID0gZGVwcmVjYXRlZEZpZWxkc0J1aWxkZXIuZ2V0TWV0aG9kKG5hbWUpOworICAgICAgYXNzZXJ0VHJ1ZSgiTWV0aG9kICIgKyBuYW1lICsgIiBzaG91bGQgYmUgZGVwcmVjYXRlZCIsCisgICAgICAgICAgaXNEZXByZWNhdGVkKG1ldGhvZCkpOworICAgIH0KKyAgICBmb3IgKFN0cmluZyBuYW1lIDogZGVwcmVjYXRlZEJ1aWxkZXJTZXR0ZXJOYW1lcykgeworICAgICAgTWV0aG9kIG1ldGhvZCA9IGRlcHJlY2F0ZWRGaWVsZHNCdWlsZGVyLmdldE1ldGhvZChuYW1lLCBpbnQuY2xhc3MpOworICAgICAgYXNzZXJ0VHJ1ZSgiTWV0aG9kICIgKyBuYW1lICsgIiBzaG91bGQgYmUgZGVwcmVjYXRlZCIsCisgICAgICAgICAgaXNEZXByZWNhdGVkKG1ldGhvZCkpOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSBib29sZWFuIGlzRGVwcmVjYXRlZChBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZCkgeworICAgIHJldHVybiBhbm5vdGF0ZWQuaXNBbm5vdGF0aW9uUHJlc2VudChEZXByZWNhdGVkLmNsYXNzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Rlc2NyaXB0b3JzVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Rlc2NyaXB0b3JzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDA2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnNUZXN0LmphdmEKQEAgLTAsMCArMSw0NjAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG87CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5TZXJ2aWNlRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLk1ldGhvZERlc2NyaXB0b3I7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QuVW5pdHRlc3RJbXBvcnQ7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW07CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0LkltcG9ydE1lc3NhZ2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25FbnVtOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZDsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RTZXJ2aWNlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0Q3VzdG9tT3B0aW9uczsKKworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgRGVzY3JpcHRvcnN9LgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBjbGFzcyBEZXNjcmlwdG9yc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgd2hlcmUgcmVmZXJlbmNpbmcgYSBGaWVsZERlc2NyaXB0b3IuVHlwZSB2YWx1ZQorICAvLyBiZWZvcmUgYSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHZhbHVlIHdvdWxkIHlpZWxkIGEKKyAgLy8gRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yLgorICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFNUQVRJQ19JTklUX1RFU1QgPSBGaWVsZERlc2NyaXB0b3IuVHlwZS5CT09MOworCisgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZFR5cGVFbnVtTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuVHlwZS52YWx1ZXMoKS5sZW5ndGgsCisgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUudmFsdWVzKCkubGVuZ3RoKTsKKyAgICBmb3IgKEZpZWxkRGVzY3JpcHRvci5UeXBlIHR5cGUgOiBGaWVsZERlc2NyaXB0b3IuVHlwZS52YWx1ZXMoKSkgeworICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSBwcm90b1R5cGUgPSB0eXBlLnRvUHJvdG8oKTsKKyAgICAgIGFzc2VydEVxdWFscygiVFlQRV8iICsgdHlwZS5uYW1lKCksIHByb3RvVHlwZS5uYW1lKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKHR5cGUsIEZpZWxkRGVzY3JpcHRvci5UeXBlLnZhbHVlT2YocHJvdG9UeXBlKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEZpbGVEZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRmlsZURlc2NyaXB0b3IgZmlsZSA9IFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpOworCisgICAgYXNzZXJ0RXF1YWxzKCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iLCBmaWxlLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdCIsIGZpbGUuZ2V0UGFja2FnZSgpKTsKKworICAgIGFzc2VydEVxdWFscygiVW5pdHRlc3RQcm90byIsIGZpbGUuZ2V0T3B0aW9ucygpLmdldEphdmFPdXRlckNsYXNzbmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byIsCisgICAgICAgICAgICAgICAgIGZpbGUudG9Qcm90bygpLmdldE5hbWUoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChVbml0dGVzdEltcG9ydC5nZXREZXNjcmlwdG9yKCkpLAorICAgICAgICAgICAgICAgICBmaWxlLmdldERlcGVuZGVuY2llcygpKTsKKworICAgIERlc2NyaXB0b3IgbWVzc2FnZVR5cGUgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlVHlwZSwgZmlsZS5nZXRNZXNzYWdlVHlwZXMoKS5nZXQoMCkpOworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlVHlwZSwgZmlsZS5maW5kTWVzc2FnZVR5cGVCeU5hbWUoIlRlc3RBbGxUeXBlcyIpKTsKKyAgICBhc3NlcnROdWxsKGZpbGUuZmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJOb1N1Y2hUeXBlIikpOworICAgIGFzc2VydE51bGwoZmlsZS5maW5kTWVzc2FnZVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUuZ2V0TWVzc2FnZVR5cGVzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyhpLCBmaWxlLmdldE1lc3NhZ2VUeXBlcygpLmdldChpKS5nZXRJbmRleCgpKTsKKyAgICB9CisKKyAgICBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZSA9IEZvcmVpZ25FbnVtLmdldERlc2NyaXB0b3IoKTsKKyAgICBhc3NlcnRFcXVhbHMoZW51bVR5cGUsIGZpbGUuZ2V0RW51bVR5cGVzKCkuZ2V0KDApKTsKKyAgICBhc3NlcnRFcXVhbHMoZW51bVR5cGUsIGZpbGUuZmluZEVudW1UeXBlQnlOYW1lKCJGb3JlaWduRW51bSIpKTsKKyAgICBhc3NlcnROdWxsKGZpbGUuZmluZEVudW1UeXBlQnlOYW1lKCJOb1N1Y2hUeXBlIikpOworICAgIGFzc2VydE51bGwoZmlsZS5maW5kRW51bVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtIikpOworICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KEltcG9ydEVudW0uZ2V0RGVzY3JpcHRvcigpKSwKKyAgICAgICAgICAgICAgICAgVW5pdHRlc3RJbXBvcnQuZ2V0RGVzY3JpcHRvcigpLmdldEVudW1UeXBlcygpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUuZ2V0RW51bVR5cGVzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyhpLCBmaWxlLmdldEVudW1UeXBlcygpLmdldChpKS5nZXRJbmRleCgpKTsKKyAgICB9CisKKyAgICBTZXJ2aWNlRGVzY3JpcHRvciBzZXJ2aWNlID0gVGVzdFNlcnZpY2UuZ2V0RGVzY3JpcHRvcigpOworICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlLCBmaWxlLmdldFNlcnZpY2VzKCkuZ2V0KDApKTsKKyAgICBhc3NlcnRFcXVhbHMoc2VydmljZSwgZmlsZS5maW5kU2VydmljZUJ5TmFtZSgiVGVzdFNlcnZpY2UiKSk7CisgICAgYXNzZXJ0TnVsbChmaWxlLmZpbmRTZXJ2aWNlQnlOYW1lKCJOb1N1Y2hUeXBlIikpOworICAgIGFzc2VydE51bGwoZmlsZS5maW5kU2VydmljZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2UiKSk7CisgICAgYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLAorICAgICAgICAgICAgICAgICBVbml0dGVzdEltcG9ydC5nZXREZXNjcmlwdG9yKCkuZ2V0U2VydmljZXMoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmdldFNlcnZpY2VzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyhpLCBmaWxlLmdldFNlcnZpY2VzKCkuZ2V0KGkpLmdldEluZGV4KCkpOworICAgIH0KKworICAgIEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gPQorICAgICAgVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKKyAgICBhc3NlcnRFcXVhbHMoZXh0ZW5zaW9uLCBmaWxlLmdldEV4dGVuc2lvbnMoKS5nZXQoMCkpOworICAgIGFzc2VydEVxdWFscyhleHRlbnNpb24sCisgICAgICAgICAgICAgICAgIGZpbGUuZmluZEV4dGVuc2lvbkJ5TmFtZSgib3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uIikpOworICAgIGFzc2VydE51bGwoZmlsZS5maW5kRXh0ZW5zaW9uQnlOYW1lKCJub19zdWNoX2V4dCIpKTsKKyAgICBhc3NlcnROdWxsKGZpbGUuZmluZEV4dGVuc2lvbkJ5TmFtZSgKKyAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24iKSk7CisgICAgYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLAorICAgICAgICAgICAgICAgICBVbml0dGVzdEltcG9ydC5nZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9ucygpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUuZ2V0RXh0ZW5zaW9ucygpLnNpemUoKTsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMoaSwgZmlsZS5nZXRFeHRlbnNpb25zKCkuZ2V0KGkpLmdldEluZGV4KCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRGVzY3JpcHRvciBtZXNzYWdlVHlwZSA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7CisgICAgRGVzY3JpcHRvciBuZXN0ZWRUeXBlID0gVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuZ2V0RGVzY3JpcHRvcigpOworCisgICAgYXNzZXJ0RXF1YWxzKCJUZXN0QWxsVHlwZXMiLCBtZXNzYWdlVHlwZS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiwgbWVzc2FnZVR5cGUuZ2V0RnVsbE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBtZXNzYWdlVHlwZS5nZXRGaWxlKCkpOworICAgIGFzc2VydE51bGwobWVzc2FnZVR5cGUuZ2V0Q29udGFpbmluZ1R5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKERlc2NyaXB0b3JQcm90b3MuTWVzc2FnZU9wdGlvbnMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlLmdldE9wdGlvbnMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJUZXN0QWxsVHlwZXMiLCBtZXNzYWdlVHlwZS50b1Byb3RvKCkuZ2V0TmFtZSgpKTsKKworICAgIGFzc2VydEVxdWFscygiTmVzdGVkTWVzc2FnZSIsIG5lc3RlZFR5cGUuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlIiwKKyAgICAgICAgICAgICAgICAgbmVzdGVkVHlwZS5nZXRGdWxsTmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5nZXREZXNjcmlwdG9yKCksIG5lc3RlZFR5cGUuZ2V0RmlsZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWVzc2FnZVR5cGUsIG5lc3RlZFR5cGUuZ2V0Q29udGFpbmluZ1R5cGUoKSk7CisKKyAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBtZXNzYWdlVHlwZS5nZXRGaWVsZHMoKS5nZXQoMCk7CisgICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9pbnQzMiIsIGZpZWxkLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGZpZWxkLCBtZXNzYWdlVHlwZS5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIikpOworICAgIGFzc2VydE51bGwobWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOYW1lKCJub19zdWNoX2ZpZWxkIikpOworICAgIGFzc2VydEVxdWFscyhmaWVsZCwgbWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOdW1iZXIoMSkpOworICAgIGFzc2VydE51bGwobWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOdW1iZXIoNTcxMjgzKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlVHlwZS5nZXRGaWVsZHMoKS5zaXplKCk7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKGksIG1lc3NhZ2VUeXBlLmdldEZpZWxkcygpLmdldChpKS5nZXRJbmRleCgpKTsKKyAgICB9CisKKyAgICBhc3NlcnRFcXVhbHMobmVzdGVkVHlwZSwgbWVzc2FnZVR5cGUuZ2V0TmVzdGVkVHlwZXMoKS5nZXQoMCkpOworICAgIGFzc2VydEVxdWFscyhuZXN0ZWRUeXBlLCBtZXNzYWdlVHlwZS5maW5kTmVzdGVkVHlwZUJ5TmFtZSgiTmVzdGVkTWVzc2FnZSIpKTsKKyAgICBhc3NlcnROdWxsKG1lc3NhZ2VUeXBlLmZpbmROZXN0ZWRUeXBlQnlOYW1lKCJOb1N1Y2hUeXBlIikpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZVR5cGUuZ2V0TmVzdGVkVHlwZXMoKS5zaXplKCk7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKGksIG1lc3NhZ2VUeXBlLmdldE5lc3RlZFR5cGVzKCkuZ2V0KGkpLmdldEluZGV4KCkpOworICAgIH0KKworICAgIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlID0gVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uZ2V0RGVzY3JpcHRvcigpOworICAgIGFzc2VydEVxdWFscyhlbnVtVHlwZSwgbWVzc2FnZVR5cGUuZ2V0RW51bVR5cGVzKCkuZ2V0KDApKTsKKyAgICBhc3NlcnRFcXVhbHMoZW51bVR5cGUsIG1lc3NhZ2VUeXBlLmZpbmRFbnVtVHlwZUJ5TmFtZSgiTmVzdGVkRW51bSIpKTsKKyAgICBhc3NlcnROdWxsKG1lc3NhZ2VUeXBlLmZpbmRFbnVtVHlwZUJ5TmFtZSgiTm9TdWNoVHlwZSIpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VUeXBlLmdldEVudW1UeXBlcygpLnNpemUoKTsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMoaSwgbWVzc2FnZVR5cGUuZ2V0RW51bVR5cGVzKCkuZ2V0KGkpLmdldEluZGV4KCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBEZXNjcmlwdG9yIG1lc3NhZ2VUeXBlID0gVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKTsKKyAgICBGaWVsZERlc2NyaXB0b3IgcHJpbWl0aXZlRmllbGQgPQorICAgICAgbWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpOworICAgIEZpZWxkRGVzY3JpcHRvciBlbnVtRmllbGQgPQorICAgICAgbWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpOworICAgIEZpZWxkRGVzY3JpcHRvciBtZXNzYWdlRmllbGQgPQorICAgICAgbWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKTsKKyAgICBGaWVsZERlc2NyaXB0b3IgY29yZEZpZWxkID0KKyAgICAgIG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfY29yZCIpOworICAgIEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gPQorICAgICAgVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKKyAgICBGaWVsZERlc2NyaXB0b3IgbmVzdGVkRXh0ZW5zaW9uID0gVGVzdFJlcXVpcmVkLnNpbmdsZS5nZXREZXNjcmlwdG9yKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX2ludDMyIiwgcHJpbWl0aXZlRmllbGQuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5vcHRpb25hbF9pbnQzMiIsCisgICAgICAgICAgICAgICAgIHByaW1pdGl2ZUZpZWxkLmdldEZ1bGxOYW1lKCkpOworICAgIGFzc2VydEVxdWFscygxLCBwcmltaXRpdmVGaWVsZC5nZXROdW1iZXIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2VUeXBlLCBwcmltaXRpdmVGaWVsZC5nZXRDb250YWluaW5nVHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5nZXREZXNjcmlwdG9yKCksIHByaW1pdGl2ZUZpZWxkLmdldEZpbGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5UeXBlLklOVDMyLCBwcmltaXRpdmVGaWVsZC5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuSU5ULCBwcmltaXRpdmVGaWVsZC5nZXRKYXZhVHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgIHByaW1pdGl2ZUZpZWxkLmdldE9wdGlvbnMoKSk7CisgICAgYXNzZXJ0RmFsc2UocHJpbWl0aXZlRmllbGQuaXNFeHRlbnNpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9pbnQzMiIsIHByaW1pdGl2ZUZpZWxkLnRvUHJvdG8oKS5nZXROYW1lKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIsIGVudW1GaWVsZC5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuVHlwZS5FTlVNLCBlbnVtRmllbGQuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLkVOVU0sIGVudW1GaWVsZC5nZXRKYXZhVHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICBlbnVtRmllbGQuZ2V0RW51bVR5cGUoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIsIG1lc3NhZ2VGaWVsZC5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuVHlwZS5NRVNTQUdFLCBtZXNzYWdlRmllbGQuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UsIG1lc3NhZ2VGaWVsZC5nZXRKYXZhVHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRm9yZWlnbk1lc3NhZ2UuZ2V0RGVzY3JpcHRvcigpLCBtZXNzYWdlRmllbGQuZ2V0TWVzc2FnZVR5cGUoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX2NvcmQiLCBjb3JkRmllbGQuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLlR5cGUuU1RSSU5HLCBjb3JkRmllbGQuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLlNUUklORywgY29yZEZpZWxkLmdldEphdmFUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhEZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucy5DVHlwZS5DT1JELAorICAgICAgICAgICAgICAgICBjb3JkRmllbGQuZ2V0T3B0aW9ucygpLmdldEN0eXBlKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9pbnQzMl9leHRlbnNpb24iLCBleHRlbnNpb24uZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIsCisgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5nZXRGdWxsTmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZXh0ZW5zaW9uLmdldE51bWJlcigpKTsKKyAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0Q29udGFpbmluZ1R5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBleHRlbnNpb24uZ2V0RmlsZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLlR5cGUuSU5UMzIsIGV4dGVuc2lvbi5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuSU5ULCBleHRlbnNpb24uZ2V0SmF2YVR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKERlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0T3B0aW9ucygpKTsKKyAgICBhc3NlcnRUcnVlKGV4dGVuc2lvbi5pc0V4dGVuc2lvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMobnVsbCwgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblNjb3BlKCkpOworICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uIiwgZXh0ZW5zaW9uLnRvUHJvdG8oKS5nZXROYW1lKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKCJzaW5nbGUiLCBuZXN0ZWRFeHRlbnNpb24uZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5zaW5nbGUiLAorICAgICAgICAgICAgICAgICBuZXN0ZWRFeHRlbnNpb24uZ2V0RnVsbE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RSZXF1aXJlZC5nZXREZXNjcmlwdG9yKCksCisgICAgICAgICAgICAgICAgIG5lc3RlZEV4dGVuc2lvbi5nZXRFeHRlbnNpb25TY29wZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZERlc2NyaXB0b3JMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEZpZWxkRGVzY3JpcHRvciByZXF1aXJlZEZpZWxkID0KKyAgICAgIFRlc3RSZXF1aXJlZC5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJhIik7CisgICAgRmllbGREZXNjcmlwdG9yIG9wdGlvbmFsRmllbGQgPQorICAgICAgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIik7CisgICAgRmllbGREZXNjcmlwdG9yIHJlcGVhdGVkRmllbGQgPQorICAgICAgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ludDMyIik7CisKKyAgICBhc3NlcnRUcnVlKHJlcXVpcmVkRmllbGQuaXNSZXF1aXJlZCgpKTsKKyAgICBhc3NlcnRGYWxzZShyZXF1aXJlZEZpZWxkLmlzUmVwZWF0ZWQoKSk7CisgICAgYXNzZXJ0RmFsc2Uob3B0aW9uYWxGaWVsZC5pc1JlcXVpcmVkKCkpOworICAgIGFzc2VydEZhbHNlKG9wdGlvbmFsRmllbGQuaXNSZXBlYXRlZCgpKTsKKyAgICBhc3NlcnRGYWxzZShyZXBlYXRlZEZpZWxkLmlzUmVxdWlyZWQoKSk7CisgICAgYXNzZXJ0VHJ1ZShyZXBlYXRlZEZpZWxkLmlzUmVwZWF0ZWQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RmllbGREZXNjcmlwdG9yRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIERlc2NyaXB0b3IgZCA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7CisgICAgYXNzZXJ0RmFsc2UoZC5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIikuaGFzRGVmYXVsdFZhbHVlKCkpOworICAgIGFzc2VydEVxdWFscygwLCBkLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKS5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgYXNzZXJ0VHJ1ZShkLmZpbmRGaWVsZEJ5TmFtZSgiZGVmYXVsdF9pbnQzMiIpLmhhc0RlZmF1bHRWYWx1ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoNDEsIGQuZmluZEZpZWxkQnlOYW1lKCJkZWZhdWx0X2ludDMyIikuZ2V0RGVmYXVsdFZhbHVlKCkpOworCisgICAgZCA9IFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5nZXREZXNjcmlwdG9yKCk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbSgKKyAgICAgICAgIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIlx1MDBmZSIuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSksCisgICAgICBkLmZpbmRGaWVsZEJ5TmFtZSgiZXNjYXBlZF9ieXRlcyIpLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoLTEsIGQuZmluZEZpZWxkQnlOYW1lKCJsYXJnZV91aW50MzIiKS5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKC0xTCwgZC5maW5kRmllbGRCeU5hbWUoImxhcmdlX3VpbnQ2NCIpLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbnVtRGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlID0gRm9yZWlnbkVudW0uZ2V0RGVzY3JpcHRvcigpOworICAgIEVudW1EZXNjcmlwdG9yIG5lc3RlZFR5cGUgPSBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5nZXREZXNjcmlwdG9yKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoIkZvcmVpZ25FbnVtIiwgZW51bVR5cGUuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtIiwgZW51bVR5cGUuZ2V0RnVsbE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBlbnVtVHlwZS5nZXRGaWxlKCkpOworICAgIGFzc2VydE51bGwoZW51bVR5cGUuZ2V0Q29udGFpbmluZ1R5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKERlc2NyaXB0b3JQcm90b3MuRW51bU9wdGlvbnMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgIGVudW1UeXBlLmdldE9wdGlvbnMoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoIk5lc3RlZEVudW0iLCBuZXN0ZWRUeXBlLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bSIsCisgICAgICAgICAgICAgICAgIG5lc3RlZFR5cGUuZ2V0RnVsbE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBuZXN0ZWRUeXBlLmdldEZpbGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCksIG5lc3RlZFR5cGUuZ2V0Q29udGFpbmluZ1R5cGUoKSk7CisKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yIHZhbHVlID0gRm9yZWlnbkVudW0uRk9SRUlHTl9GT08uZ2V0VmFsdWVEZXNjcmlwdG9yKCk7CisgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBlbnVtVHlwZS5nZXRWYWx1ZXMoKS5nZXQoMCkpOworICAgIGFzc2VydEVxdWFscygiRk9SRUlHTl9GT08iLCB2YWx1ZS5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscyg0LCB2YWx1ZS5nZXROdW1iZXIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBlbnVtVHlwZS5maW5kVmFsdWVCeU5hbWUoIkZPUkVJR05fRk9PIikpOworICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgZW51bVR5cGUuZmluZFZhbHVlQnlOdW1iZXIoNCkpOworICAgIGFzc2VydE51bGwoZW51bVR5cGUuZmluZFZhbHVlQnlOYW1lKCJOT19TVUNIX1ZBTFVFIikpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bVR5cGUuZ2V0VmFsdWVzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGFzc2VydEVxdWFscyhpLCBlbnVtVHlwZS5nZXRWYWx1ZXMoKS5nZXQoaSkuZ2V0SW5kZXgoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VEZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU2VydmljZURlc2NyaXB0b3Igc2VydmljZSA9IFRlc3RTZXJ2aWNlLmdldERlc2NyaXB0b3IoKTsKKworICAgIGFzc2VydEVxdWFscygiVGVzdFNlcnZpY2UiLCBzZXJ2aWNlLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0U2VydmljZSIsIHNlcnZpY2UuZ2V0RnVsbE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBzZXJ2aWNlLmdldEZpbGUoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoMiwgc2VydmljZS5nZXRNZXRob2RzKCkuc2l6ZSgpKTsKKworICAgIE1ldGhvZERlc2NyaXB0b3IgZm9vTWV0aG9kID0gc2VydmljZS5nZXRNZXRob2RzKCkuZ2V0KDApOworICAgIGFzc2VydEVxdWFscygiRm9vIiwgZm9vTWV0aG9kLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uRm9vUmVxdWVzdC5nZXREZXNjcmlwdG9yKCksCisgICAgICAgICAgICAgICAgIGZvb01ldGhvZC5nZXRJbnB1dFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uRm9vUmVzcG9uc2UuZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICBmb29NZXRob2QuZ2V0T3V0cHV0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZm9vTWV0aG9kLCBzZXJ2aWNlLmZpbmRNZXRob2RCeU5hbWUoIkZvbyIpKTsKKworICAgIE1ldGhvZERlc2NyaXB0b3IgYmFyTWV0aG9kID0gc2VydmljZS5nZXRNZXRob2RzKCkuZ2V0KDEpOworICAgIGFzc2VydEVxdWFscygiQmFyIiwgYmFyTWV0aG9kLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uQmFyUmVxdWVzdC5nZXREZXNjcmlwdG9yKCksCisgICAgICAgICAgICAgICAgIGJhck1ldGhvZC5nZXRJbnB1dFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uQmFyUmVzcG9uc2UuZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICBiYXJNZXRob2QuZ2V0T3V0cHV0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoYmFyTWV0aG9kLCBzZXJ2aWNlLmZpbmRNZXRob2RCeU5hbWUoIkJhciIpKTsKKworICAgIGFzc2VydE51bGwoc2VydmljZS5maW5kTWV0aG9kQnlOYW1lKCJOb1N1Y2hNZXRob2QiKSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2UuZ2V0TWV0aG9kcygpLnNpemUoKTsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMoaSwgc2VydmljZS5nZXRNZXRob2RzKCkuZ2V0KGkpLmdldEluZGV4KCkpOworICAgIH0KKyAgfQorCisKKyAgcHVibGljIHZvaWQgdGVzdEN1c3RvbU9wdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPQorICAgICAgVW5pdHRlc3RDdXN0b21PcHRpb25zLlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMuZ2V0RGVzY3JpcHRvcigpOworCisgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgIGRlc2NyaXB0b3IuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMubWVzc2FnZU9wdDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKC01NiksCisgICAgICBkZXNjcmlwdG9yLmdldE9wdGlvbnMoKS5nZXRFeHRlbnNpb24oVW5pdHRlc3RDdXN0b21PcHRpb25zLm1lc3NhZ2VPcHQxKSk7CisKKyAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgiZmllbGQxIik7CisgICAgYXNzZXJ0Tm90TnVsbChmaWVsZCk7CisKKyAgICBhc3NlcnRUcnVlKAorICAgICAgZmllbGQuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZmllbGRPcHQxKSk7CisgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZig4NzY1NDMyMTA5TCksCisgICAgICBmaWVsZC5nZXRPcHRpb25zKCkuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5maWVsZE9wdDEpKTsKKworICAgIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlID0KKyAgICAgIFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5UZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zLkFuRW51bS5nZXREZXNjcmlwdG9yKCk7CisKKyAgICBhc3NlcnRUcnVlKAorICAgICAgZW51bVR5cGUuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZW51bU9wdDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKC03ODkpLAorICAgICAgZW51bVR5cGUuZ2V0T3B0aW9ucygpLmdldEV4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZW51bU9wdDEpKTsKKworICAgIFNlcnZpY2VEZXNjcmlwdG9yIHNlcnZpY2UgPQorICAgICAgVW5pdHRlc3RDdXN0b21PcHRpb25zLlRlc3RTZXJ2aWNlV2l0aEN1c3RvbU9wdGlvbnMuZ2V0RGVzY3JpcHRvcigpOworCisgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgIHNlcnZpY2UuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuc2VydmljZU9wdDEpKTsKKyAgICBhc3NlcnRFcXVhbHMoTG9uZy52YWx1ZU9mKC05ODc2NTQzMjEwTCksCisgICAgICBzZXJ2aWNlLmdldE9wdGlvbnMoKS5nZXRFeHRlbnNpb24oVW5pdHRlc3RDdXN0b21PcHRpb25zLnNlcnZpY2VPcHQxKSk7CisKKyAgICBNZXRob2REZXNjcmlwdG9yIG1ldGhvZCA9IHNlcnZpY2UuZmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7CisgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOworCisgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgIG1ldGhvZC5nZXRPcHRpb25zKCkuaGFzRXh0ZW5zaW9uKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5tZXRob2RPcHQxKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5NZXRob2RPcHQxLk1FVEhPRE9QVDFfVkFMMiwKKyAgICAgIG1ldGhvZC5nZXRPcHRpb25zKCkuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5tZXRob2RPcHQxKSk7CisgIH0KKworICAvKioKKyAgICogVGVzdCB0aGF0IHRoZSBGaWVsZERlc2NyaXB0b3IuVHlwZSBlbnVtIGlzIHRoZSBzYW1lIGFzIHRoZQorICAgKiBXaXJlRm9ybWF0LkZpZWxkVHlwZSBlbnVtLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdEZpZWxkVHlwZVRhYmxlc01hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRmllbGREZXNjcmlwdG9yLlR5cGVbXSB2YWx1ZXMxID0gRmllbGREZXNjcmlwdG9yLlR5cGUudmFsdWVzKCk7CisgICAgV2lyZUZvcm1hdC5GaWVsZFR5cGVbXSB2YWx1ZXMyID0gV2lyZUZvcm1hdC5GaWVsZFR5cGUudmFsdWVzKCk7CisKKyAgICBhc3NlcnRFcXVhbHModmFsdWVzMS5sZW5ndGgsIHZhbHVlczIubGVuZ3RoKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzMS5sZW5ndGg7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlczFbaV0udG9TdHJpbmcoKSwgdmFsdWVzMltpXS50b1N0cmluZygpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogVGVzdCB0aGF0IHRoZSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUgZW51bSBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgICogV2lyZUZvcm1hdC5KYXZhVHlwZSBlbnVtLgorICAgKi8KKyAgcHVibGljIHZvaWQgdGVzdEphdmFUeXBlVGFibGVzTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGVbXSB2YWx1ZXMxID0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLnZhbHVlcygpOworICAgIFdpcmVGb3JtYXQuSmF2YVR5cGVbXSB2YWx1ZXMyID0gV2lyZUZvcm1hdC5KYXZhVHlwZS52YWx1ZXMoKTsKKworICAgIGFzc2VydEVxdWFscyh2YWx1ZXMxLmxlbmd0aCwgdmFsdWVzMi5sZW5ndGgpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMxLmxlbmd0aDsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHModmFsdWVzMVtpXS50b1N0cmluZygpLCB2YWx1ZXMyW2ldLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbm9ybW91c0Rlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyBmaWxlIGlzIGxhcmdlciB0aGFuIDY0aywgeWV0IGl0IGRpZCBub3QgY2F1c2UKKyAgICAvLyBhIGNvbXBpbGVyIGVycm9yIGR1ZSB0byBhbiBvdmVyLWxvbmcgc3RyaW5nIGxpdGVyYWwuCisgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgVW5pdHRlc3RFbm9ybW91c0Rlc2NyaXB0b3IuZ2V0RGVzY3JpcHRvcigpCisgICAgICAgICAgLnRvUHJvdG8oKS5nZXRTZXJpYWxpemVkU2l6ZSgpID4gNjU1MzYpOworICB9CisgIAorICAvKioKKyAgICogVGVzdHMgdGhhdCB0aGUgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gd29ya3MgYXMgaW50ZW5kZWQuCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRvclZhbGlkYXRvckV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZURlc2NyaXB0b3JQcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCisgICAgICAuc2V0TmFtZSgiZm9vLnByb3RvIikKKyAgICAgIC5hZGRNZXNzYWdlVHlwZShEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCisgICAgICAuc2V0TmFtZSgiRm9vIikKKyAgICAgICAgLmFkZEZpZWxkKEZpZWxkRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQorICAgICAgICAgIC5zZXRMYWJlbChGaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC5MQUJFTF9PUFRJT05BTCkKKyAgICAgICAgICAuc2V0VHlwZShGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlLlRZUEVfSU5UMzIpCisgICAgICAgICAgLnNldE5hbWUoImZvbyIpCisgICAgICAgICAgLnNldE51bWJlcigxKQorICAgICAgICAgIC5zZXREZWZhdWx0VmFsdWUoImludmFsaWQiKQorICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKSkKKyAgICAgIC5idWlsZCgpOworICAgIHRyeSB7CisgICAgICBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oZmlsZURlc2NyaXB0b3JQcm90bywgCisgICAgICAgICAgbmV3IEZpbGVEZXNjcmlwdG9yWzBdKTsKKyAgICAgIGZhaWwoIkRlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgfSBjYXRjaCAoRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgLy8gRXhwZWN0ZWQ7IGNoZWNrIHRoYXQgdGhlIGVycm9yIG1lc3NhZ2UgY29udGFpbnMgc29tZSB1c2VmdWwgaGludHMKKyAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiZm9vIikgIT0gLTEpOworICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJGb28iKSAhPSAtMSk7CisgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoImludmFsaWQiKSAhPSAtMSk7CisgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE51bWJlckZvcm1hdEV4Y2VwdGlvbik7CisgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiaW52YWxpZCIpICE9IC0xKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWJjY2RhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0R5bmFtaWNNZXNzYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZFR5cGVzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgRHluYW1pY01lc3NhZ2V9LiAgU2VlIGFsc28ge0BsaW5rIE1lc3NhZ2VUZXN0fSwgd2hpY2gKKyAqIHRlc3RzIHNvbWUge0BsaW5rIER5bmFtaWNNZXNzYWdlfSBmdW5jdGlvbmFsaXR5LgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBjbGFzcyBEeW5hbWljTWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvblRlc3RlciA9CisgICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSwgbnVsbCk7CisKKyAgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlciBleHRlbnNpb25zUmVmbGVjdGlvblRlc3RlciA9CisgICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkpOworICBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyIHBhY2tlZFJlZmxlY3Rpb25UZXN0ZXIgPQorICAgIG5ldyBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyKFRlc3RQYWNrZWRUeXBlcy5nZXREZXNjcmlwdG9yKCksIG51bGwpOworCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZUFjY2Vzc29ycygpIHRocm93cyBFeGNlcHRpb24geworICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlQnVpbGRFcnJvcigpIHRocm93cyBFeGNlcHRpb24geworICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7CisgICAgYnVpbGRlci5idWlsZCgpOworICAgIHRyeSB7CisgICAgICBidWlsZGVyLmJ1aWxkKCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBTdWNjZXNzLgorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhckFmdGVyQnVpbGRFcnJvcigpIHRocm93cyBFeGNlcHRpb24geworICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7CisgICAgYnVpbGRlci5idWlsZCgpOworICAgIHRyeSB7CisgICAgICBidWlsZGVyLmNsZWFyKCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBTdWNjZXNzLgorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZUV4dGVuc2lvbkFjY2Vzc29ycygpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gZXh0ZW5zaXZlbHkgdGVzdCBEeW5hbWljTWVzc2FnZSdzIGhhbmRsaW5nIG9mCisgICAgLy8gZXh0ZW5zaW9ucyBiZWNhdXNlLCBmcmFua2x5LCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nIHNwZWNpYWwgd2l0aCB0aGVtLgorICAgIC8vIEl0IHRyZWF0cyB0aGVtIGp1c3QgbGlrZSBhbnkgb3RoZXIgZmllbGRzLgorICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uU2V0dGVyc1JlamVjdE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxFeHRlbnNpb25zLmdldERlc2NyaXB0b3IoKSk7CisgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKGJ1aWxkZXIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlUmVwZWF0ZWRTZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLnNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7CisgICAgcmVmbGVjdGlvblRlc3Rlci5tb2RpZnlSZXBlYXRlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7CisgICAgTWVzc2FnZSBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZFZpYVJlZmxlY3Rpb24obWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VSZXBlYXRlZFNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlZmxlY3Rpb25SZXBlYXRlZFNldHRlcnNSZWplY3ROdWxsKGJ1aWxkZXIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydENsZWFyVmlhUmVmbGVjdGlvbigKKyAgICAgIER5bmFtaWNNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZShUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKSk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCisgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpLmJ1aWxkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlU2VyaWFsaXplZFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOworCisgICAgTWVzc2FnZS5CdWlsZGVyIGR5bmFtaWNCdWlsZGVyID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGR5bmFtaWNCdWlsZGVyKTsKKyAgICBNZXNzYWdlIGR5bmFtaWNNZXNzYWdlID0gZHluYW1pY0J1aWxkZXIuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCksCisgICAgICAgICAgICAgICAgIGR5bmFtaWNNZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlU2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKworICAgIC8vIEluIGZhY3QsIHRoZSBzZXJpYWxpemVkIGZvcm1zIHNob3VsZCBiZSBleGFjdGx5IHRoZSBzYW1lLCBieXRlLWZvci1ieXRlLgorICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC5nZXRBbGxTZXQoKS50b0J5dGVTdHJpbmcoKSwgcmF3Qnl0ZXMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworCisgICAgTWVzc2FnZSBtZXNzYWdlMiA9CisgICAgICBEeW5hbWljTWVzc2FnZS5wYXJzZUZyb20oVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSwgcmF3Qnl0ZXMpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VQYWNrZWRTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RQYWNrZWRUeXBlcy5nZXREZXNjcmlwdG9yKCkpOworICAgIHBhY2tlZFJlZmxlY3Rpb25UZXN0ZXIuc2V0UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKyAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKKyAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTIgPSBUZXN0UGFja2VkVHlwZXMucGFyc2VGcm9tKHJhd0J5dGVzKTsKKworICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7CisKKyAgICAvLyBJbiBmYWN0LCB0aGUgc2VyaWFsaXplZCBmb3JtcyBzaG91bGQgYmUgZXhhY3RseSB0aGUgc2FtZSwgYnl0ZS1mb3ItYnl0ZS4KKyAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCkudG9CeXRlU3RyaW5nKCksIHJhd0J5dGVzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVBhY2tlZFBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0UGFja2VkVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdFBhY2tlZFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5zZXRQYWNrZWRGaWVsZHMoYnVpbGRlcik7CisgICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKKworICAgIE1lc3NhZ2UgbWVzc2FnZTIgPQorICAgICAgRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKFRlc3RQYWNrZWRUeXBlcy5nZXREZXNjcmlwdG9yKCksIHJhd0J5dGVzKTsKKyAgICBwYWNrZWRSZWZsZWN0aW9uVGVzdGVyLmFzc2VydFBhY2tlZEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZTIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlQ29weSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgIER5bmFtaWNNZXNzYWdlIGNvcHkgPSBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKG1lc3NhZ2UpLmJ1aWxkKCk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKGNvcHkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRvQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIER5bmFtaWNNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIGludCB1bmtub3duRmllbGROdW0gPSA5OworICAgIGxvbmcgdW5rbm93bkZpZWxkVmFsID0gOTA7CisgICAgYnVpbGRlci5zZXRVbmtub3duRmllbGRzKFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgLmFkZEZpZWxkKHVua25vd25GaWVsZE51bSwKKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkVmFyaW50KHVua25vd25GaWVsZFZhbCkuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCkpOworICAgIER5bmFtaWNNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICBEeW5hbWljTWVzc2FnZSBkZXJpdmVkID0gbWVzc2FnZS50b0J1aWxkZXIoKS5idWlsZCgpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihkZXJpdmVkKTsKKyAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCh1bmtub3duRmllbGRWYWwpLAorICAgICAgICBkZXJpdmVkLmdldFVua25vd25GaWVsZHMoKS5nZXRGaWVsZCh1bmtub3duRmllbGROdW0pLmdldFZhcmludExpc3QoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Gb3JjZUZpZWxkQnVpbGRlcnNQcmVSdW4uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Gb3JjZUZpZWxkQnVpbGRlcnNQcmVSdW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjc4ODkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ZvcmNlRmllbGRCdWlsZGVyc1ByZVJ1bi5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworLyoqCisgKiBBIHByZXJ1biBmb3IgYSB0ZXN0IHN1aXRlIHRoYXQgYWxsb3dzIHJ1bm5pbmcgdGhlIGZ1bGwgcHJvdG9jb2wgYnVmZmVyCisgKiB0ZXN0cyBpbiBhIG1vZGUgdGhhdCBkaXNhYmxlcyB0aGUgb3B0aW1pemF0aW9uIGZvciBub3QgdXNpbmcKKyAqIHtAbGluayBSZXBlYXRlZEZpZWxkQnVpbGRlcn0gYW5kIHtAbGluayBTaW5nbGVGaWVsZEJ1aWxkZXJ9IHVudGlsIHRoZXkgYXJlCisgKiByZXF1ZXN0ZWQuIFRoaXMgYWxsb3dzIHVzIHRvIHJ1biBhbGwgdGhlIHRlc3RzIHRocm91Z2ggYm90aCBjb2RlIHBhdGhzCisgKiBhbmQgZW5zdXJlcyB0aGF0IGJvdGggY29kZSBwYXRocyBwcm9kdWNlIGlkZW50aWNhbCByZXN1bHRzLgorICoKKyAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICovCitwdWJsaWMgY2xhc3MgRm9yY2VGaWVsZEJ1aWxkZXJzUHJlUnVuIGltcGxlbWVudHMgUnVubmFibGUgeworCisgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgR2VuZXJhdGVkTWVzc2FnZS5lbmFibGVBbHdheXNVc2VGaWVsZEJ1aWxkZXJzRm9yVGVzdGluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjIyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDk4MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdEFsbEV4dGVuc2lvbnNMaXRlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudGVzdC5Vbml0dGVzdEltcG9ydDsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5FbnVtV2l0aE5vT3V0ZXI7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTWVzc2FnZVdpdGhOb091dGVyOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk11bHRpcGxlRmlsZXNUZXN0UHJvdG87CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTmVzdGVkRXh0ZW5zaW9uLk15TmVzdGVkRXh0ZW5zaW9uOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk5lc3RlZEV4dGVuc2lvbkxpdGUuTXlOZXN0ZWRFeHRlbnNpb25MaXRlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk5vbk5lc3RlZEV4dGVuc2lvbjsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Ob25OZXN0ZWRFeHRlbnNpb24uTWVzc2FnZVRvQmVFeHRlbmRlZDsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Ob25OZXN0ZWRFeHRlbnNpb24uTXlOb25OZXN0ZWRFeHRlbnNpb247CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTm9uTmVzdGVkRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Ob25OZXN0ZWRFeHRlbnNpb25MaXRlLk1lc3NhZ2VMaXRlVG9CZUV4dGVuZGVkOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk5vbk5lc3RlZEV4dGVuc2lvbkxpdGUuTXlOb25OZXN0ZWRFeHRlbnNpb25MaXRlOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlNlcnZpY2VXaXRoTm9PdXRlcjsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdE9wdGltaXplRm9yLlRlc3RPcHRpbWl6ZWRGb3JTaXplOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0T3B0aW1pemVGb3IuVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZTsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdE9wdGltaXplRm9yLlRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemU7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25FbnVtOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduTWVzc2FnZU9yQnVpbGRlcjsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzT3JCdWlsZGVyOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFVucGFja2VkVHlwZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciBnZW5lcmF0ZWQgbWVzc2FnZXMgYW5kIGdlbmVyYXRlZCBjb2RlLiAgU2VlIGFsc28KKyAqIHtAbGluayBNZXNzYWdlVGVzdH0sIHdoaWNoIHRlc3RzIHNvbWUgZ2VuZXJhdGVkIG1lc3NhZ2UgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgY2xhc3MgR2VuZXJhdGVkTWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvblRlc3RlciA9CisgICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSwgbnVsbCk7CisKKyAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSk7CisgICAgYXNzZXJ0U2FtZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCisgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZU9yQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VXNpbmdCdWlsZGVyTXVsdGlwbGVUaW1lcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIC8vIHByaW1pdGl2ZSBmaWVsZCBzY2FsYXIgYW5kIHJlcGVhdGVkCisgICAgYnVpbGRlci5zZXRPcHRpb25hbFNmaXhlZDY0KDEwMCk7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZEludDMyKDEwMCk7CisgICAgLy8gZW51bSBmaWVsZCBzY2FsYXIgYW5kIHJlcGVhdGVkCisgICAgYnVpbGRlci5zZXRPcHRpb25hbEltcG9ydEVudW0oVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bS5JTVBPUlRfQkFSKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW1wb3J0RW51bShVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIpOworICAgIC8vIHByb3RvIGZpZWxkIHNjYWxhciBhbmQgcmVwZWF0ZWQKKyAgICBidWlsZGVyLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMSkpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygxKSk7CisKKyAgICBUZXN0QWxsVHlwZXMgdmFsdWUxID0gYnVpbGRlci5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldFJlcGVhdGVkSW50MzIoMCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIsCisgICAgICAgIHZhbHVlMS5nZXRPcHRpb25hbEltcG9ydEVudW0oKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUiwKKyAgICAgICAgdmFsdWUxLmdldFJlcGVhdGVkSW1wb3J0RW51bSgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHZhbHVlMS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkuZ2V0QygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWUxLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGJ1aWxkZXIgZGlkbid0IHVwZGF0ZSBwcmV2aW91c2x5IGNyZWF0ZWQgdmFsdWVzCisgICAgYnVpbGRlci5zZXRPcHRpb25hbFNmaXhlZDY0KDIwMCk7CisgICAgYnVpbGRlci5zZXRSZXBlYXRlZEludDMyKDAsIDIwMCk7CisgICAgYnVpbGRlci5zZXRPcHRpb25hbEltcG9ydEVudW0oVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bS5JTVBPUlRfRk9PKTsKKyAgICBidWlsZGVyLnNldFJlcGVhdGVkSW1wb3J0RW51bSgwLCBVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9GT08pOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygyKSk7CisgICAgYnVpbGRlci5zZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDAsIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDIpKTsKKworICAgIFRlc3RBbGxUeXBlcyB2YWx1ZTIgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAvLyBNYWtlIHN1cmUgdmFsdWUxIGRpZG4ndCBjaGFuZ2UuCisgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldFJlcGVhdGVkSW50MzIoMCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIsCisgICAgICAgIHZhbHVlMS5nZXRPcHRpb25hbEltcG9ydEVudW0oKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUiwKKyAgICAgICAgdmFsdWUxLmdldFJlcGVhdGVkSW1wb3J0RW51bSgwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHZhbHVlMS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkuZ2V0QygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWUxLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKKworICAgIC8vIE1ha2Ugc3VyZSB2YWx1ZTIgaXMgY29ycmVjdAorICAgIGFzc2VydEVxdWFscygyMDAsIHZhbHVlMi5nZXRPcHRpb25hbFNmaXhlZDY0KCkpOworICAgIGFzc2VydEVxdWFscygyMDAsIHZhbHVlMi5nZXRSZXBlYXRlZEludDMyKDApKTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bS5JTVBPUlRfRk9PLAorICAgICAgICB2YWx1ZTIuZ2V0T3B0aW9uYWxJbXBvcnRFbnVtKCkpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9GT08sCisgICAgICAgIHZhbHVlMi5nZXRSZXBlYXRlZEltcG9ydEVudW0oMCkpOworICAgIGFzc2VydEVxdWFscygyLCB2YWx1ZTIuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpLmdldEMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIHZhbHVlMi5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApLmdldEMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UHJvdG9zU2hhcmVSZXBlYXRlZEFycmF5c0lmRGlkbnRDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMTAwKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW1wb3J0RW51bShVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7CisKKyAgICBUZXN0QWxsVHlwZXMgdmFsdWUxID0gYnVpbGRlci5idWlsZCgpOworICAgIFRlc3RBbGxUeXBlcyB2YWx1ZTIgPSB2YWx1ZTEudG9CdWlsZGVyKCkuYnVpbGQoKTsKKworICAgIGFzc2VydFNhbWUodmFsdWUxLmdldFJlcGVhdGVkSW50MzJMaXN0KCksIHZhbHVlMi5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKKyAgICBhc3NlcnRTYW1lKHZhbHVlMS5nZXRSZXBlYXRlZEltcG9ydEVudW1MaXN0KCksCisgICAgICAgIHZhbHVlMi5nZXRSZXBlYXRlZEltcG9ydEVudW1MaXN0KCkpOworICAgIGFzc2VydFNhbWUodmFsdWUxLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCksCisgICAgICAgIHZhbHVlMi5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZEFycmF5c0FyZUltbXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbnQzMigxMDApOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbXBvcnRFbnVtKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUik7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShidWlsZGVyLmdldFJlcGVhdGVkSW50MzJMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKGJ1aWxkZXIuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGbG9hdExpc3QoKSk7CisKKworICAgIFRlc3RBbGxUeXBlcyB2YWx1ZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEltcG9ydEVudW1MaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCkpOworICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkRmxvYXRMaXN0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydElzVW5tb2RpZmlhYmxlKExpc3Q8Pz4gbGlzdCkgeworICAgIGlmIChsaXN0ID09IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKSB7CisgICAgICAvLyBPS0FZIC0tIE5lZWQgdG8gY2hlY2sgdGhpcyBiL2MgRW1wdHlMaXN0IGFsbG93cyB5b3UgdG8gY2FsbCBjbGVhci4KKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHsKKyAgICAgICAgbGlzdC5jbGVhcigpOworICAgICAgICBmYWlsKCJMaXN0IHdhc24ndCBpbW11dGFibGUiKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gZ29vZAorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIHRyeSB7CisgICAgICBidWlsZGVyLnNldE9wdGlvbmFsU3RyaW5nKG51bGwpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5zZXRPcHRpb25hbEJ5dGVzKG51bGwpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKSBudWxsKTsKKyAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKAorICAgICAgICAgIChUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyKSBudWxsKTsKKyAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtKG51bGwpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZFN0cmluZyhudWxsKTsKKyAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRCeXRlcyhudWxsKTsKKyAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKChUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSkgbnVsbCk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorICAgIHRyeSB7CisgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgKKyAgICAgICAgICAoVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcikgbnVsbCk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorICAgIHRyeSB7CisgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkRW51bShudWxsKTsKKyAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWRTZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGVzdFV0aWwuc2V0QWxsRmllbGRzKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLm1vZGlmeVJlcGVhdGVkRmllbGRzKGJ1aWxkZXIpOworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWQobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworCisgICAgYnVpbGRlci5hZGRSZXBlYXRlZFN0cmluZygib25lIik7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZFN0cmluZygidHdvIik7CisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRTdHJpbmcoMSwgbnVsbCk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorCisgICAgYnVpbGRlci5hZGRSZXBlYXRlZEJ5dGVzKFRlc3RVdGlsLnRvQnl0ZXMoIm9uZSIpKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkQnl0ZXMoVGVzdFV0aWwudG9CeXRlcygidHdvIikpOworICAgIHRyeSB7CisgICAgICBidWlsZGVyLnNldFJlcGVhdGVkQnl0ZXMoMSwgbnVsbCk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorCisgICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoCisgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjE4KS5idWlsZCgpKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgKKyAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig0NTYpLmJ1aWxkKCkpOworICAgIHRyeSB7CisgICAgICBidWlsZGVyLnNldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgxLCAoVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UpIG51bGwpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgICB0cnkgeworICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgMSwgKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIpIG51bGwpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTyk7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSKTsKKyAgICB0cnkgeworICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZE5lc3RlZEVudW0oMSwgbnVsbCk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkQXBwZW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisKKyAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkSW50MzIoQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0KSk7CisgICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZEZvcmVpZ25FbnVtKEFycmF5cy5hc0xpc3QoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopKTsKKworICAgIEZvcmVpZ25NZXNzYWdlIGZvcmVpZ25NZXNzYWdlID0KKyAgICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMTIpLmJ1aWxkKCk7CisgICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEFycmF5cy5hc0xpc3QoZm9yZWlnbk1lc3NhZ2UpKTsKKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFJlcGVhdGVkSW50MzJMaXN0KCksIEFycmF5cy5hc0xpc3QoMSwgMiwgMywgNCkpOworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCksCisgICAgICAgIEFycmF5cy5hc0xpc3QoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlQ291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEyLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZEFwcGVuZFJlamVjdHNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisKKyAgICBGb3JlaWduTWVzc2FnZSBmb3JlaWduTWVzc2FnZSA9CisgICAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDEyKS5idWlsZCgpOworICAgIHRyeSB7CisgICAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoCisgICAgICAgICAgQXJyYXlzLmFzTGlzdChmb3JlaWduTWVzc2FnZSwgKEZvcmVpZ25NZXNzYWdlKSBudWxsKSk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRGb3JlaWduRW51bSgKKyAgICAgICAgICBBcnJheXMuYXNMaXN0KEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLCBudWxsKSk7CisgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRTdHJpbmcoQXJyYXlzLmFzTGlzdCgib25lIiwgbnVsbCkpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKworICAgIHRyeSB7CisgICAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkQnl0ZXMoQXJyYXlzLmFzTGlzdChUZXN0VXRpbC50b0J5dGVzKCJvbmUiKSwgbnVsbCkpOworICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXR0aW5nRm9yZWlnbk1lc3NhZ2VVc2luZ0J1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKKyAgICAgICAgLy8gUGFzcyBidWlsZGVyIGZvciBmb3JlaWduIG1lc3NhZ2UgaW5zdGFuY2UuCisgICAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDEyMykpCisgICAgICAgIC5idWlsZCgpOworICAgIFRlc3RBbGxUeXBlcyBleHBlY3RlZE1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAgIC8vIENyZWF0ZSBleHBlY3RlZCB2ZXJzaW9uIHBhc3NpbmcgZm9yZWlnbiBtZXNzYWdlIGluc3RhbmNlIGV4cGxpY2l0bHkuCisgICAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKAorICAgICAgICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMTIzKS5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKTsKKyAgICAvLyBUT0RPKG5nZCk6IFVwZ3JhZGUgdG8gdXNpbmcgcmVhbCAjZXF1YWxzIG1ldGhvZCBvbmNlIGltcGxlbWVudGVkCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVzc2FnZS50b1N0cmluZygpLCBtZXNzYWdlLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNldHRpbmdSZXBlYXRlZEZvcmVpZ25NZXNzYWdlVXNpbmdCdWlsZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAgIC8vIFBhc3MgYnVpbGRlciBmb3IgZm9yZWlnbiBtZXNzYWdlIGluc3RhbmNlLgorICAgICAgICAuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0Qyg0NTYpKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBUZXN0QWxsVHlwZXMgZXhwZWN0ZWRNZXNzYWdlID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAvLyBDcmVhdGUgZXhwZWN0ZWQgdmVyc2lvbiBwYXNzaW5nIGZvcmVpZ24gbWVzc2FnZSBpbnN0YW5jZSBleHBsaWNpdGx5LgorICAgICAgICAuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgKKyAgICAgICAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDQ1NikuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVzc2FnZS50b1N0cmluZygpLCBtZXNzYWdlLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdFV0aWwuYXNzZXJ0Q2xlYXIoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRDbGVhcihUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLmJ1aWxkKCkpOworCisgICAgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIG1lc3NhZ2UgPQorICAgICAgICBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCk7CisgICAgYXNzZXJ0RXF1YWxzKCJcdTEyMzQiLCBtZXNzYWdlLmdldFV0ZjhTdHJpbmcoKSk7CisgICAgYXNzZXJ0RXF1YWxzKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSwgbWVzc2FnZS5nZXRJbmZEb3VibGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSwgbWVzc2FnZS5nZXROZWdJbmZEb3VibGUoKSk7CisgICAgYXNzZXJ0VHJ1ZShEb3VibGUuaXNOYU4obWVzc2FnZS5nZXROYW5Eb3VibGUoKSkpOworICAgIGFzc2VydEVxdWFscyhGbG9hdC5QT1NJVElWRV9JTkZJTklUWSwgbWVzc2FnZS5nZXRJbmZGbG9hdCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFksIG1lc3NhZ2UuZ2V0TmVnSW5mRmxvYXQoKSk7CisgICAgYXNzZXJ0VHJ1ZShGbG9hdC5pc05hTihtZXNzYWdlLmdldE5hbkZsb2F0KCkpKTsKKyAgICBhc3NlcnRFcXVhbHMoIj8gPyA/PyA/PyA/Pz8gPz8vID8/LSIsIG1lc3NhZ2UuZ2V0Q3BwVHJpZ3JhcGgoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRDbGVhcihidWlsZGVyKTsKKyAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7CisgICAgYnVpbGRlci5jbGVhcigpOworICAgIFRlc3RVdGlsLmFzc2VydENsZWFyKGJ1aWxkZXIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlZmxlY3Rpb25HZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGVzdFV0aWwuc2V0QWxsRmllbGRzKGJ1aWxkZXIpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoYnVpbGRlcik7CisKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZWZsZWN0aW9uU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKyAgICByZWZsZWN0aW9uVGVzdGVyLm1vZGlmeVJlcGVhdGVkRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkKGJ1aWxkZXIpOworCisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgVGVzdFV0aWwuYXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZChtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCisgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOworICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKAorICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5idWlsZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbnVtSW50ZXJmYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0VHJ1ZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZ2V0RGVmYXVsdE5lc3RlZEVudW0oKQorICAgICAgICBpbnN0YW5jZW9mIFByb3RvY29sTWVzc2FnZUVudW0pOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEVudW1NYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbnRlcm5hbC5FbnVtTGl0ZU1hcDxGb3JlaWduRW51bT4gbWFwID0gRm9yZWlnbkVudW0uaW50ZXJuYWxHZXRWYWx1ZU1hcCgpOworCisgICAgZm9yIChGb3JlaWduRW51bSB2YWx1ZSA6IEZvcmVpZ25FbnVtLnZhbHVlcygpKSB7CisgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIG1hcC5maW5kVmFsdWVCeU51bWJlcih2YWx1ZS5nZXROdW1iZXIoKSkpOworICAgIH0KKworICAgIGFzc2VydFRydWUobWFwLmZpbmRWYWx1ZUJ5TnVtYmVyKDEyMzQ1KSA9PSBudWxsKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVBhY2tlZFRvVW5wYWNrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0VW5wYWNrZWRUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0VW5wYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGVzdFVucGFja2VkVHlwZXMgbWVzc2FnZSA9CisgICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRVbnBhY2tlZEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVVucGFja2VkVG9QYWNrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0UGFja2VkVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdFBhY2tlZFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9CisgICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRVbnBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpKS5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEV4dGVuc2lvbnMuCisKKyAgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlciBleHRlbnNpb25zUmVmbGVjdGlvblRlc3RlciA9CisgICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkpOworCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25NZXNzYWdlT3JCdWlsZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEV4dGVuc2lvbnMoYnVpbGRlcik7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblJlcGVhdGVkU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5zZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLm1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9ucyhidWlsZGVyKTsKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdFV0aWwuYXNzZXJ0RXh0ZW5zaW9uc0NsZWFyKFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRFeHRlbnNpb25zQ2xlYXIoVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpLmJ1aWxkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblJlZmxlY3Rpb25HZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEV4dGVuc2lvbnMoYnVpbGRlcik7CisgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihidWlsZGVyKTsKKworICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKKyAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQoYnVpbGRlcik7CisKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uUmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLnNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7CisgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIubW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKGJ1aWxkZXIpOworCisgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChtZXNzYWdlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7CisgICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVyc1JlamVjdE51bGwoCisgICAgICAgIGJ1aWxkZXIpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblJlZmxlY3Rpb25EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24geworICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLmFzc2VydENsZWFyVmlhUmVmbGVjdGlvbigKKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCisgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkuYnVpbGQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJFeHRlbnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBjbGVhckV4dGVuc2lvbigpIGlzIG5vdCBhY3R1YWxseSB1c2VkIGluIFRlc3RVdGlsLCBzbyB0cnkgaXQgbWFudWFsbHkuCisgICAgYXNzZXJ0RmFsc2UoCisgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24sIDEpCisgICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24pCisgICAgICAgIC5oYXNFeHRlbnNpb24oVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsCisgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKKyAgICAgICAgLmFkZEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDEpCisgICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pCisgICAgICAgIC5nZXRFeHRlbnNpb25Db3VudChVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25Db3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgb3JpZ2luYWwgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgY29weSA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIob3JpZ2luYWwpLmJ1aWxkKCk7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChjb3B5KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25NZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucyBvcmlnaW5hbCA9CisgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24sIDEpLmJ1aWxkKCk7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVyZ2VkID0KKyAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpLm1lcmdlRnJvbShvcmlnaW5hbCkuYnVpbGQoKTsKKyAgICBhc3NlcnRUcnVlKG1lcmdlZC5oYXNFeHRlbnNpb24oVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAxLCAoaW50KSBtZXJnZWQuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQzMkV4dGVuc2lvbikpOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gTGl0ZSBFeHRlbnNpb25zLgorCisgIC8vIFdlIHRlc3QgbGl0ZSBleHRlbnNpb25zIGRpcmVjdGx5IGJlY2F1c2UgdGhleSBoYXZlIGEgc2VwYXJhdGUKKyAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBmdWxsIGV4dGVuc2lvbnMuICBJbiBjb250cmFzdCwgd2UgZG8gbm90IHRlc3QKKyAgLy8gbGl0ZSBmaWVsZHMgZGlyZWN0bHkgc2luY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgZXhhY3RseSB0aGUgc2FtZSBhcworICAvLyByZWd1bGFyIGZpZWxkcy4KKworICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZUV4dGVuc2lvbk1lc3NhZ2VPckJ1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5zZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQoYnVpbGRlcik7CisKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExpdGVFeHRlbnNpb25SZXBlYXRlZFNldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIoKTsKKyAgICBUZXN0VXRpbC5zZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLm1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9ucyhidWlsZGVyKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChidWlsZGVyKTsKKworICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOworICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExpdGVFeHRlbnNpb25EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RVdGlsLmFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOworICAgIFRlc3RVdGlsLmFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpLmJ1aWxkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENsZWFyTGl0ZUV4dGVuc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIGNsZWFyRXh0ZW5zaW9uKCkgaXMgbm90IGFjdHVhbGx5IHVzZWQgaW4gVGVzdFV0aWwsIHNvIHRyeSBpdCBtYW51YWxseS4KKyAgICBhc3NlcnRGYWxzZSgKKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEpCisgICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpCisgICAgICAgIC5oYXNFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsCisgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpCisgICAgICAgIC5hZGRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCAxKQorICAgICAgICAuY2xlYXJFeHRlbnNpb24oVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlKQorICAgICAgICAuZ2V0RXh0ZW5zaW9uQ291bnQoVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZUV4dGVuc2lvbkNvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgb3JpZ2luYWwgPSBUZXN0VXRpbC5nZXRBbGxMaXRlRXh0ZW5zaW9uc1NldCgpOworICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBjb3B5ID0KKyAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIob3JpZ2luYWwpLmJ1aWxkKCk7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChjb3B5KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RMaXRlRXh0ZW5zaW9uTWVyZ2VGcm9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG9yaWdpbmFsID0KKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEpLmJ1aWxkKCk7CisgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1lcmdlZCA9CisgICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkubWVyZ2VGcm9tKG9yaWdpbmFsKS5idWlsZCgpOworICAgIGFzc2VydFRydWUobWVyZ2VkLmhhc0V4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIDEsIChpbnQpIG1lcmdlZC5nZXRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBtdWx0aXBsZV9maWxlc190ZXN0CisKKyAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRmlsZXNPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBXZSBtb3N0bHkganVzdCB3YW50IHRvIGNoZWNrIHRoYXQgdGhpbmdzIGNvbXBpbGUuCisgICAgTWVzc2FnZVdpdGhOb091dGVyIG1lc3NhZ2UgPQorICAgICAgTWVzc2FnZVdpdGhOb091dGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0TmVzdGVkKE1lc3NhZ2VXaXRoTm9PdXRlci5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRJKDEpKQorICAgICAgICAuYWRkRm9yZWlnbihUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMSkpCisgICAgICAgIC5zZXROZXN0ZWRFbnVtKE1lc3NhZ2VXaXRoTm9PdXRlci5OZXN0ZWRFbnVtLkJBWikKKyAgICAgICAgLnNldEZvcmVpZ25FbnVtKEVudW1XaXRoTm9PdXRlci5CQVIpCisgICAgICAgIC5idWlsZCgpOworICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBNZXNzYWdlV2l0aE5vT3V0ZXIucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpKTsKKworICAgIGFzc2VydEVxdWFscyhNdWx0aXBsZUZpbGVzVGVzdFByb3RvLmdldERlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICAgTWVzc2FnZVdpdGhOb091dGVyLmdldERlc2NyaXB0b3IoKS5nZXRGaWxlKCkpOworCisgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkID0KKyAgICAgIE1lc3NhZ2VXaXRoTm9PdXRlci5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJmb3JlaWduX2VudW0iKTsKKyAgICBhc3NlcnRFcXVhbHMoRW51bVdpdGhOb091dGVyLkJBUi5nZXRWYWx1ZURlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRGaWVsZChmaWVsZCkpOworCisgICAgYXNzZXJ0RXF1YWxzKE11bHRpcGxlRmlsZXNUZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLAorICAgICAgICAgICAgICAgICBTZXJ2aWNlV2l0aE5vT3V0ZXIuZ2V0RGVzY3JpcHRvcigpLmdldEZpbGUoKSk7CisKKyAgICBhc3NlcnRGYWxzZSgKKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpLmhhc0V4dGVuc2lvbigKKyAgICAgICAgTXVsdGlwbGVGaWxlc1Rlc3RQcm90by5leHRlbnNpb25XaXRoT3V0ZXIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPcHRpb25hbEZpZWxkV2l0aFJlcXVpcmVkU3ViZmllbGRzT3B0aW1pemVkRm9yU2l6ZSgpCisgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSBtZXNzYWdlID0KKyAgICAgICAgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKKyAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKKworICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRPKAorICAgICAgICBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5idWlsZFBhcnRpYWwoKQorICAgICAgICApLmJ1aWxkUGFydGlhbCgpOworICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKKworICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRPKAorICAgICAgICBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRYKDUpLmJ1aWxkUGFydGlhbCgpCisgICAgICAgICkuYnVpbGRQYXJ0aWFsKCk7CisgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmlzSW5pdGlhbGl6ZWQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5pbml0aWFsaXplZEV4dGVuc2lvbkluT3B0aW1pemVkRm9yU2l6ZSgpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0T3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0T3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCk7CisgICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVGVzdE9wdGltaXplZEZvclNpemUudGVzdEV4dGVuc2lvbjIsCisgICAgICAgIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUubmV3QnVpbGRlcigpLmJ1aWxkUGFydGlhbCgpKTsKKyAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCkpOworCisgICAgYnVpbGRlciA9IFRlc3RPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKTsKKyAgICBidWlsZGVyLnNldEV4dGVuc2lvbihUZXN0T3B0aW1pemVkRm9yU2l6ZS50ZXN0RXh0ZW5zaW9uMiwKKyAgICAgICAgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCkuc2V0WCgxMCkuYnVpbGRQYXJ0aWFsKCkpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFRvQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UudG9CdWlsZGVyKCkuYnVpbGQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRDb25zdGFudFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CQl9GSUVMRF9OVU1CRVIsIDEpOworICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuT1BUSU9OQUxfSU5UMzJfRklFTERfTlVNQkVSLCAxKTsKKyAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk9QVElPTkFMR1JPVVBfRklFTERfTlVNQkVSLCAxNik7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5PUFRJT05BTF9ORVNURURfTUVTU0FHRV9GSUVMRF9OVU1CRVIsIDE4KTsKKyAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk9QVElPTkFMX05FU1RFRF9FTlVNX0ZJRUxEX05VTUJFUiwgMjEpOworICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuUkVQRUFURURfSU5UMzJfRklFTERfTlVNQkVSLCAzMSk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5SRVBFQVRFREdST1VQX0ZJRUxEX05VTUJFUiwgNDYpOworICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuUkVQRUFURURfTkVTVEVEX01FU1NBR0VfRklFTERfTlVNQkVSLCA0OCk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5SRVBFQVRFRF9ORVNURURfRU5VTV9GSUVMRF9OVU1CRVIsIDUxKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25Db25zdGFudFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZC5TSU5HTEVfRklFTERfTlVNQkVSLCAxMDAwKTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5UZXN0UmVxdWlyZWQuTVVMVElfRklFTERfTlVNQkVSLCAxMDAxKTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTF9JTlQzMl9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAxKTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTEdST1VQX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE2KTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICBVbml0dGVzdFByb3RvLk9QVElPTkFMX05FU1RFRF9NRVNTQUdFX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE4KTsKKyAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTF9ORVNURURfRU5VTV9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAyMSk7CisgICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uUkVQRUFURURfSU5UMzJfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgMzEpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlJFUEVBVEVER1JPVVBfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDYpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgIFVuaXR0ZXN0UHJvdG8uUkVQRUFURURfTkVTVEVEX01FU1NBR0VfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDgpOworICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlJFUEVBVEVEX05FU1RFRF9FTlVNX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDUxKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVW5pdHRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlID0KKyAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKKyAgICBhc3NlcnRUcnVlKG1lc3NhZ2UgIT0gbnVsbCk7CisgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEEoKSAhPSBudWxsKTsKKyAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0QSgpID09IG1lc3NhZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKKyAgICBUZXN0QWxsVHlwZXMgZXhwZWN0ZWQgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgdHJ5IHsKKyAgICAgIG91dC53cml0ZU9iamVjdChleHBlY3RlZCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKyAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7CisgICAgVGVzdEFsbFR5cGVzIGFjdHVhbCA9IChUZXN0QWxsVHlwZXMpIGluLnJlYWRPYmplY3QoKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplUGFydGlhbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRlc3RBbGxUeXBlcyBleHBlY3RlZCA9IGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgdHJ5IHsKKyAgICAgIG91dC53cml0ZU9iamVjdChleHBlY3RlZCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKyAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7CisgICAgVGVzdEFsbFR5cGVzIGFjdHVhbCA9IChUZXN0QWxsVHlwZXMpIGluLnJlYWRPYmplY3QoKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RW51bVZhbHVlcygpIHsKKyAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLmdldE51bWJlcigpLAorICAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSX1ZBTFVFKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWi5nZXROdW1iZXIoKSwKKyAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaX1ZBTFVFKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTy5nZXROdW1iZXIoKSwKKyAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PX1ZBTFVFKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROb25OZXN0ZWRFeHRlbnNpb25Jbml0aWFsaXphdGlvbigpIHsKKyAgICBhc3NlcnRUcnVlKE5vbk5lc3RlZEV4dGVuc2lvbi5ub25OZXN0ZWRFeHRlbnNpb24KKyAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgaW5zdGFuY2VvZiBNeU5vbk5lc3RlZEV4dGVuc2lvbik7CisgICAgYXNzZXJ0RXF1YWxzKCJub25OZXN0ZWRFeHRlbnNpb24iLAorICAgICAgICAgICAgICAgICBOb25OZXN0ZWRFeHRlbnNpb24ubm9uTmVzdGVkRXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKS5nZXROYW1lKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEV4dGVuc2lvbkluaXRpYWxpemF0aW9uKCkgeworICAgIGFzc2VydFRydWUoTXlOZXN0ZWRFeHRlbnNpb24ucmVjdXJzaXZlRXh0ZW5zaW9uLmdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgaW5zdGFuY2VvZiBNZXNzYWdlVG9CZUV4dGVuZGVkKTsKKyAgICBhc3NlcnRFcXVhbHMoInJlY3Vyc2l2ZUV4dGVuc2lvbiIsCisgICAgICAgICAgICAgICAgIE15TmVzdGVkRXh0ZW5zaW9uLnJlY3Vyc2l2ZUV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0TmFtZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROb25OZXN0ZWRFeHRlbnNpb25MaXRlSW5pdGlhbGl6YXRpb24oKSB7CisgICAgYXNzZXJ0VHJ1ZShOb25OZXN0ZWRFeHRlbnNpb25MaXRlLm5vbk5lc3RlZEV4dGVuc2lvbkxpdGUKKyAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgaW5zdGFuY2VvZiBNeU5vbk5lc3RlZEV4dGVuc2lvbkxpdGUpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEV4dGVuc2lvbkxpdGVJbml0aWFsaXphdGlvbigpIHsKKyAgICBhc3NlcnRUcnVlKE15TmVzdGVkRXh0ZW5zaW9uTGl0ZS5yZWN1cnNpdmVFeHRlbnNpb25MaXRlCisgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpIGluc3RhbmNlb2YgTWVzc2FnZUxpdGVUb0JlRXh0ZW5kZWQpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEludmFsaWRhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBHZW5lcmF0ZWRNZXNzYWdlLmVuYWJsZUFsd2F5c1VzZUZpZWxkQnVpbGRlcnNGb3JUZXN0aW5nKCk7CisgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UgbmVzdGVkTWVzc2FnZTEgPQorICAgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSBuZXN0ZWRNZXNzYWdlMiA9CisgICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5idWlsZCgpOworCisgICAgLy8gU2V0IGFsbCB0aHJlZSBmbGF2b3JzIChlbnVtLCBwcmltaXRpdmUsIG1lc3NhZ2UgYW5kIHNpbmd1bGFyL3JlcGVhdGVkKQorICAgIC8vIGFuZCB2ZXJpZnkgbm8gaW52YWxpZGF0aW9ucyBmaXJlZAorICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKKworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSAoVGVzdEFsbFR5cGVzLkJ1aWxkZXIpCisgICAgICAgICgoR2VuZXJhdGVkTWVzc2FnZSkgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKS4KKyAgICAgICAgICAgIG5ld0J1aWxkZXJGb3JUeXBlKG1vY2tQYXJlbnQpOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQzMigxKTsKKyAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIpOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKG5lc3RlZE1lc3NhZ2UxKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMSk7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZShuZXN0ZWRNZXNzYWdlMSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisKKyAgICAvLyBOb3cgdGVsbCBpdCB3ZSB3YW50IGNoYW5nZXMgYW5kIG1ha2Ugc3VyZSBpdCdzIG9ubHkgZmlyZWQgb25jZQorICAgIC8vIEFuZCBkbyB0aGlzIGZvciBlYWNoIGZsYXZvcgorCisgICAgLy8gcHJpbWl0aXZlIHNpbmdsZQorICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgYnVpbGRlci5zZXRPcHRpb25hbEludDMyKDIpOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQzMigzKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKworICAgIC8vIGVudW0gc2luZ2xlCisgICAgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKKyAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUik7CisgICAgYXNzZXJ0RXF1YWxzKDIsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisKKyAgICAvLyBtZXNzYWdlIHNpbmdsZQorICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UobmVzdGVkTWVzc2FnZTIpOworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKG5lc3RlZE1lc3NhZ2UxKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKworICAgIC8vIHByaW1pdGl2ZSByZXBhdGVkCisgICAgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMik7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZEludDMyKDMpOworICAgIGFzc2VydEVxdWFscyg0LCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworCisgICAgLy8gZW51bSByZXBlYXRlZAorICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopOworICAgIGFzc2VydEVxdWFscyg1LCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworCisgICAgLy8gbWVzc2FnZSByZXBlYXRlZAorICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UobmVzdGVkTWVzc2FnZTIpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKG5lc3RlZE1lc3NhZ2UxKTsKKyAgICBhc3NlcnRFcXVhbHMoNiwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEludmFsaWRhdGlvbnNfRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKKworICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IChUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyKQorICAgICAgICAoKEdlbmVyYXRlZE1lc3NhZ2UpIFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKS4KKyAgICAgICAgICAgIG5ld0J1aWxkZXJGb3JUeXBlKG1vY2tQYXJlbnQpOworCisgICAgYnVpbGRlci5hZGRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uLCAxKTsKKyAgICBidWlsZGVyLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDAsIDIpOworICAgIGJ1aWxkZXIuY2xlYXJFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKworICAgIC8vIE5vdyB0ZWxsIGl0IHdlIHdhbnQgY2hhbmdlcyBhbmQgbWFrZSBzdXJlIGl0J3Mgb25seSBmaXJlZCBvbmNlCisgICAgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKKyAgICBidWlsZGVyLmFkZEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDIpOworICAgIGJ1aWxkZXIuYWRkRXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMyk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisKKyAgICBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOworICAgIGJ1aWxkZXIuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMCwgNCk7CisgICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uLCAxLCA1KTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKworICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgYnVpbGRlci5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pOworICAgIGJ1aWxkZXIuY2xlYXJFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RCYXNlTWVzc2FnZU9yQnVpbGRlcigpIHsKKyAgICAvLyBNb3N0bHkganVzdCBtYWtlcyBzdXJlIHRoZSBiYXNlIGludGVyZmFjZSBleGlzdHMgYW5kIGhhcyBzb21lIG1ldGhvZHMuCisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOworICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlciBidWlsZGVyQXNJbnRlcmZhY2UgPSAoVGVzdEFsbFR5cGVzT3JCdWlsZGVyKSBidWlsZGVyOworICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlciBtZXNzYWdlQXNJbnRlcmZhY2UgPSAoVGVzdEFsbFR5cGVzT3JCdWlsZGVyKSBtZXNzYWdlOworCisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICBtZXNzYWdlQXNJbnRlcmZhY2UuZ2V0RGVmYXVsdEJvb2woKSwKKyAgICAgICAgbWVzc2FnZUFzSW50ZXJmYWNlLmdldERlZmF1bHRCb29sKCkpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgbWVzc2FnZUFzSW50ZXJmYWNlLmdldE9wdGlvbmFsRG91YmxlKCksCisgICAgICAgIG1lc3NhZ2VBc0ludGVyZmFjZS5nZXRPcHRpb25hbERvdWJsZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlT3JCdWlsZGVyR2V0dGVycygpIHsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKworICAgIC8vIHNpbmdsZSBmaWVsZHMKKyAgICBhc3NlcnRTYW1lKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICBidWlsZGVyLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXIoKSk7CisgICAgRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0KKyAgICAgICAgYnVpbGRlci5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlQnVpbGRlcigpOworICAgIGFzc2VydFNhbWUoc3ViQnVpbGRlciwgYnVpbGRlci5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyKCkpOworCisgICAgLy8gcmVwZWF0ZWQgZmllbGRzCisgICAgRm9yZWlnbk1lc3NhZ2UgbTAgPSBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuYnVpbGRQYXJ0aWFsKCk7CisgICAgRm9yZWlnbk1lc3NhZ2UgbTEgPSBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuYnVpbGRQYXJ0aWFsKCk7CisgICAgRm9yZWlnbk1lc3NhZ2UgbTIgPSBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuYnVpbGRQYXJ0aWFsKCk7CisgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKG0wKTsKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UobTEpOworICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShtMik7CisgICAgYXNzZXJ0U2FtZShtMCwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyKDApKTsKKyAgICBhc3NlcnRTYW1lKG0xLCBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXIoMSkpOworICAgIGFzc2VydFNhbWUobTIsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZU9yQnVpbGRlcigyKSk7CisgICAgRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBiMCA9IGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUJ1aWxkZXIoMCk7CisgICAgRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBiMSA9IGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUJ1aWxkZXIoMSk7CisgICAgYXNzZXJ0U2FtZShiMCwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyKDApKTsKKyAgICBhc3NlcnRTYW1lKGIxLCBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXIoMSkpOworICAgIGFzc2VydFNhbWUobTIsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZU9yQnVpbGRlcigyKSk7CisKKyAgICBMaXN0PD8gZXh0ZW5kcyBGb3JlaWduTWVzc2FnZU9yQnVpbGRlcj4gbWVzc2FnZU9yQnVpbGRlckxpc3QgPQorICAgICAgICBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXJMaXN0KCk7CisgICAgYXNzZXJ0U2FtZShiMCwgbWVzc2FnZU9yQnVpbGRlckxpc3QuZ2V0KDApKTsKKyAgICBhc3NlcnRTYW1lKGIxLCBtZXNzYWdlT3JCdWlsZGVyTGlzdC5nZXQoMSkpOworICAgIGFzc2VydFNhbWUobTIsIG1lc3NhZ2VPckJ1aWxkZXJMaXN0LmdldCgyKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nQXJyYXlMaXN0VGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjZGM3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nQXJyYXlMaXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgZm9yIHtAbGluayBMYXp5U3RyaW5nQXJyYXlMaXN0fS4KKyAqCisgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKyAqLworcHVibGljIGNsYXNzIExhenlTdHJpbmdBcnJheUxpc3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfQSA9ICJBIjsKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR19CID0gIkIiOworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0MgPSAiQyI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19BID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkEiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19CID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkIiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19DID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkMiKTsKKworICBwdWJsaWMgdm9pZCB0ZXN0SnVzdFN0cmluZ3MoKSB7CisgICAgTGF6eVN0cmluZ0FycmF5TGlzdCBsaXN0ID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKTsKKyAgICBsaXN0LmFkZChTVFJJTkdfQSk7CisgICAgbGlzdC5hZGQoU1RSSU5HX0IpOworICAgIGxpc3QuYWRkKFNUUklOR19DKTsKKworICAgIGFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7CisgICAgYXNzZXJ0U2FtZShTVFJJTkdfQSwgbGlzdC5nZXQoMCkpOworICAgIGFzc2VydFNhbWUoU1RSSU5HX0IsIGxpc3QuZ2V0KDEpKTsKKyAgICBhc3NlcnRTYW1lKFNUUklOR19DLCBsaXN0LmdldCgyKSk7CisKKyAgICBsaXN0LnNldCgxLCBTVFJJTkdfQyk7CisgICAgYXNzZXJ0U2FtZShTVFJJTkdfQywgbGlzdC5nZXQoMSkpOworCisgICAgbGlzdC5yZW1vdmUoMSk7CisgICAgYXNzZXJ0U2FtZShTVFJJTkdfQSwgbGlzdC5nZXQoMCkpOworICAgIGFzc2VydFNhbWUoU1RSSU5HX0MsIGxpc3QuZ2V0KDEpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RKdXN0Qnl0ZVN0cmluZygpIHsKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IGxpc3QgPSBuZXcgTGF6eVN0cmluZ0FycmF5TGlzdCgpOworICAgIGxpc3QuYWRkKEJZVEVfU1RSSU5HX0EpOworICAgIGxpc3QuYWRkKEJZVEVfU1RSSU5HX0IpOworICAgIGxpc3QuYWRkKEJZVEVfU1RSSU5HX0MpOworCisgICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKKyAgICBhc3NlcnRTYW1lKEJZVEVfU1RSSU5HX0EsIGxpc3QuZ2V0Qnl0ZVN0cmluZygwKSk7CisgICAgYXNzZXJ0U2FtZShCWVRFX1NUUklOR19CLCBsaXN0LmdldEJ5dGVTdHJpbmcoMSkpOworICAgIGFzc2VydFNhbWUoQllURV9TVFJJTkdfQywgbGlzdC5nZXRCeXRlU3RyaW5nKDIpKTsKKworICAgIGxpc3QucmVtb3ZlKDEpOworICAgIGFzc2VydFNhbWUoQllURV9TVFJJTkdfQSwgbGlzdC5nZXRCeXRlU3RyaW5nKDApKTsKKyAgICBhc3NlcnRTYW1lKEJZVEVfU1RSSU5HX0MsIGxpc3QuZ2V0Qnl0ZVN0cmluZygxKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVyc2lvbkJhY2tBbmRGb3J0aCgpIHsKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IGxpc3QgPSBuZXcgTGF6eVN0cmluZ0FycmF5TGlzdCgpOworICAgIGxpc3QuYWRkKFNUUklOR19BKTsKKyAgICBsaXN0LmFkZChCWVRFX1NUUklOR19CKTsKKyAgICBsaXN0LmFkZChCWVRFX1NUUklOR19DKTsKKworICAgIC8vIFN0cmluZyBhIHNob3VsZCBiZSB0aGUgc2FtZSBiZWNhdXNlIGl0IHdhcyBvcmlnaW5hbGx5IGEgc3RyaW5nCisgICAgYXNzZXJ0U2FtZShTVFJJTkdfQSwgbGlzdC5nZXQoMCkpOworCisgICAgLy8gU3RyaW5nIGIgYW5kIGMgc2hvdWxkIGJlIGRpZmZlcmVudCBiZWNhdXNlIHRoZSBzdHJpbmcgaGFzIHRvIGJlIGNvbXB1dGVkCisgICAgLy8gZnJvbSB0aGUgQnl0ZVN0cmluZworICAgIFN0cmluZyBiUHJpbWUgPSBsaXN0LmdldCgxKTsKKyAgICBhc3NlcnROb3RTYW1lKFNUUklOR19CLCBiUHJpbWUpOworICAgIGFzc2VydEVxdWFscyhTVFJJTkdfQiwgYlByaW1lKTsKKyAgICBTdHJpbmcgY1ByaW1lID0gbGlzdC5nZXQoMik7CisgICAgYXNzZXJ0Tm90U2FtZShTVFJJTkdfQywgY1ByaW1lKTsKKyAgICBhc3NlcnRFcXVhbHMoU1RSSU5HX0MsIGNQcmltZSk7CisKKyAgICAvLyBTdHJpbmcgYyBhbmQgYyBzaG91bGQgc3RheSB0aGUgc2FtZSBvbmNlIGNhY2hlZC4KKyAgICBhc3NlcnRTYW1lKGJQcmltZSwgbGlzdC5nZXQoMSkpOworICAgIGFzc2VydFNhbWUoY1ByaW1lLCBsaXN0LmdldCgyKSk7CisKKyAgICAvLyBCeXRlU3RyaW5nIG5lZWRzIHRvIGJlIGNvbXB1dGVkIGZyb20gc3RyaW5nIGZvciBib3RoIGEgYW5kIGIKKyAgICBCeXRlU3RyaW5nIGFQcmltZUJ5dGVTdHJpbmcgPSBsaXN0LmdldEJ5dGVTdHJpbmcoMCk7CisgICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0EsIGFQcmltZUJ5dGVTdHJpbmcpOworICAgIEJ5dGVTdHJpbmcgYlByaW1lQnl0ZVN0cmluZyA9IGxpc3QuZ2V0Qnl0ZVN0cmluZygxKTsKKyAgICBhc3NlcnROb3RTYW1lKEJZVEVfU1RSSU5HX0IsIGJQcmltZUJ5dGVTdHJpbmcpOworICAgIGFzc2VydEVxdWFscyhCWVRFX1NUUklOR19CLCBsaXN0LmdldEJ5dGVTdHJpbmcoMSkpOworCisgICAgLy8gT25jZSBjYWNoZWQsIEJ5dGVTdHJpbmcgc2hvdWxkIHN0YXkgY2FjaGVkLgorICAgIGFzc2VydFNhbWUoYVByaW1lQnl0ZVN0cmluZywgbGlzdC5nZXRCeXRlU3RyaW5nKDApKTsKKyAgICBhc3NlcnRTYW1lKGJQcmltZUJ5dGVTdHJpbmcsIGxpc3QuZ2V0Qnl0ZVN0cmluZygxKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nRW5kVG9FbmRUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0VuZFRvRW5kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODcwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0VuZFRvRW5kVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKKworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIFRlc3RzIHRvIG1ha2Ugc3VyZSB0aGUgbGF6eSBjb252ZXJzaW9uIG9mIFVURjgtZW5jb2RlZCBieXRlIGFycmF5cyB0bworICogc3RyaW5ncyB3b3JrcyBjb3JyZWN0bHkuCisgKgorICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisgKi8KK3B1YmxpYyBjbGFzcyBMYXp5U3RyaW5nRW5kVG9FbmRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgVEVTVF9BTExfVFlQRVNfU0VSSUFMSVpFRF9XSVRIX0lMTEVHQUxfVVRGOCA9CisgICAgICBCeXRlU3RyaW5nLmNvcHlGcm9tKG5ldyBieXRlW10geworICAgICAgICAgIDExNCwgNCwgLTEsIDAsIC0xLCAwLCAtMzAsIDIsIDQsIC0xLAorICAgICAgICAgIDAsIC0xLCAwLCAtMzAsIDIsIDQsIC0xLCAwLCAtMSwgMCwgfSk7CisKKyAgLyoqCisgICAqIFRlc3RzIHRoYXQgYW4gaW52YWxpZCBVVEY4IHN0cmluZyB3aWxsIHJvdW5kdHJpcCB0aHJvdWdoIGEgcGFyc2UKKyAgICogYW5kIHNlcmlhbGl6YXRpb24uCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VBbmRTZXJpYWxpemUoKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKKyAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcyB0VjIgPSBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5wYXJzZUZyb20oCisgICAgICAgIFRFU1RfQUxMX1RZUEVTX1NFUklBTElaRURfV0lUSF9JTExFR0FMX1VURjgpOworICAgIEJ5dGVTdHJpbmcgYnl0ZXMgPSB0VjIudG9CeXRlU3RyaW5nKCk7CisgICAgYXNzZXJ0RXF1YWxzKFRFU1RfQUxMX1RZUEVTX1NFUklBTElaRURfV0lUSF9JTExFR0FMX1VURjgsIGJ5dGVzKTsKKworICAgIHRWMi5nZXRPcHRpb25hbFN0cmluZygpOworICAgIGJ5dGVzID0gdFYyLnRvQnl0ZVN0cmluZygpOworICAgIGFzc2VydEVxdWFscyhURVNUX0FMTF9UWVBFU19TRVJJQUxJWkVEX1dJVEhfSUxMRUdBTF9VVEY4LCBieXRlcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VBbmRXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMgdFYyID0gVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMucGFyc2VGcm9tKAorICAgICAgICBURVNUX0FMTF9UWVBFU19TRVJJQUxJWkVEX1dJVEhfSUxMRUdBTF9VVEY4KTsKKyAgICBieXRlW10gc2luayA9IG5ldyBieXRlW1RFU1RfQUxMX1RZUEVTX1NFUklBTElaRURfV0lUSF9JTExFR0FMX1VURjguc2l6ZSgpXTsKKyAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShzaW5rKTsKKyAgICB0VjIud3JpdGVUbyhvdXRwdXRTdHJlYW0pOworICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgVEVTVF9BTExfVFlQRVNfU0VSSUFMSVpFRF9XSVRIX0lMTEVHQUxfVVRGOCwKKyAgICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbShzaW5rKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGluZygpIHsKKyAgICBTdHJpbmcgYSA9ICJhIjsKKyAgICBTdHJpbmcgYiA9ICJiIjsKKyAgICBTdHJpbmcgYyA9ICJjIjsKKyAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcyBwcm90byA9IFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoYSkKKyAgICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKGIpCisgICAgICAgIC5hZGRSZXBlYXRlZFN0cmluZyhjKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIC8vIFN0cmluZyBzaG91bGQgYmUgdGhlIG9uZSB3ZSBwYXNzZWQgaXQuCisgICAgYXNzZXJ0U2FtZShhLCBwcm90by5nZXRPcHRpb25hbFN0cmluZygpKTsKKyAgICBhc3NlcnRTYW1lKGIsIHByb3RvLmdldFJlcGVhdGVkU3RyaW5nKDApKTsKKyAgICBhc3NlcnRTYW1lKGMsIHByb3RvLmdldFJlcGVhdGVkU3RyaW5nKDEpKTsKKworCisgICAgLy8gVGhlcmUncyBubyB3YXkgdG8gZGlyZWN0bHkgb2JzZXJ2ZSB0aGF0IHRoZSBCeXRlU3RyaW5nIGlzIGNhY2hlZAorICAgIC8vIGNvcnJlY3RseSBvbiBzZXJpYWxpemF0aW9uLCBidXQgd2UgY2FuIG9ic2VydmUgdGhhdCBpdCBoYWQgdG8gcmVjb21wdXRlCisgICAgLy8gdGhlIHN0cmluZyBhZnRlciBzZXJpYWxpemF0aW9uLgorICAgIHByb3RvLnRvQnl0ZVN0cmluZygpOworICAgIFN0cmluZyBhUHJpbWUgPSBwcm90by5nZXRPcHRpb25hbFN0cmluZygpOworICAgIGFzc2VydE5vdFNhbWUoYSwgYVByaW1lKTsKKyAgICBhc3NlcnRFcXVhbHMoYSwgYVByaW1lKTsKKyAgICBTdHJpbmcgYlByaW1lID0gcHJvdG8uZ2V0UmVwZWF0ZWRTdHJpbmcoMCk7CisgICAgYXNzZXJ0Tm90U2FtZShiLCBiUHJpbWUpOworICAgIGFzc2VydEVxdWFscyhiLCBiUHJpbWUpOworICAgIFN0cmluZyBjUHJpbWUgPSBwcm90by5nZXRSZXBlYXRlZFN0cmluZygxKTsKKyAgICBhc3NlcnROb3RTYW1lKGMsIGNQcmltZSk7CisgICAgYXNzZXJ0RXF1YWxzKGMsIGNQcmltZSk7CisKKyAgICAvLyBBbmQgbm93IHRoZSBzdHJpbmcgc2hvdWxkIHN0YXkgY2FjaGVkLgorICAgIGFzc2VydFNhbWUoYVByaW1lLCBwcm90by5nZXRPcHRpb25hbFN0cmluZygpKTsKKyAgICBhc3NlcnRTYW1lKGJQcmltZSwgcHJvdG8uZ2V0UmVwZWF0ZWRTdHJpbmcoMCkpOworICAgIGFzc2VydFNhbWUoY1ByaW1lLCBwcm90by5nZXRSZXBlYXRlZFN0cmluZygxKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MaXRlVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xpdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5Njk0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MaXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsVHlwZXNMaXRlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxFeHRlbnNpb25zTGl0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKKworLyoqCisgKiBUZXN0IGxpdGUgcnVudGltZS4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgY2xhc3MgTGl0ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVGVzdCB0aGF0IG5lc3RlZCBleHRlbnNpb25zIGFyZSBpbml0aWFsaXplZCBjb3JyZWN0bHkgZXZlbiBpZiB0aGUgb3V0ZXIKKyAgICAvLyBjbGFzcyBoYXMgbm90IGJlZW4gYWNjZXNzZWQgZGlyZWN0bHkuICBUaGlzIHdhcyBvbmNlIGEgYnVnIHdpdGggbGl0ZQorICAgIC8vIG1lc3NhZ2VzLgorICAgIC8vCisgICAgLy8gV2UgcHV0IHRoaXMgaW4gc2V0VXAoKSByYXRoZXIgdGhhbiBpbiBpdHMgb3duIHRlc3QgbWV0aG9kIGJlY2F1c2Ugd2UKKyAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBydW5zIGJlZm9yZSBhbnkgYWN0dWFsIHRlc3RzLgorICAgIGFzc2VydFRydWUoVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUubmVzdGVkRXh0ZW5zaW9uICE9IG51bGwpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBTaW5jZSBsaXRlIG1lc3NhZ2VzIGFyZSBhIHN1YnNldCBvZiByZWd1bGFyIG1lc3NhZ2VzLCB3ZSBjYW4gbW9zdGx5CisgICAgLy8gYXNzdW1lIHRoYXQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgbGl0ZSBtZXNzYWdlcyBpcyBhbHJlYWR5IHRob3JvdWdobHkKKyAgICAvLyB0ZXN0ZWQgYnkgdGhlIHJlZ3VsYXIgdGVzdHMuICBBbGwgdGhpcyB0ZXN0IHJlYWxseSB2ZXJpZmllcyBpcyB0aGF0CisgICAgLy8gYSBwcm90byB3aXRoIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSBjb21waWxlcyBjb3JyZWN0bHkgd2hlbgorICAgIC8vIGxpbmtlZCBvbmx5IGFnYWluc3QgdGhlIGxpdGUgbGlicmFyeS4gIFRoYXQgaXMgYWxsIHRlc3RlZCBhdCBjb21waWxlCisgICAgLy8gdGltZSwgbGVhdmluZyBub3QgbXVjaCB0byBkbyBpbiB0aGlzIG1ldGhvZC4gIExldCdzIGp1c3QgZG8gc29tZSByYW5kb20KKyAgICAvLyBzdHVmZiB0byBtYWtlIHN1cmUgdGhlIGxpdGUgbWVzc2FnZSBpcyBhY3R1YWxseSBoZXJlIGFuZCB1c2FibGUuCisKKyAgICBUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UgPQorICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAuc2V0T3B0aW9uYWxJbnQzMigxMjMpCisgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJoZWxsbyIpCisgICAgICAgICAgICAgICAgICAgICAgLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig3KSkKKyAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgIEJ5dGVTdHJpbmcgZGF0YSA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisKKyAgICBUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzTGl0ZS5wYXJzZUZyb20oZGF0YSk7CisKKyAgICBhc3NlcnRFcXVhbHMoMTIzLCBtZXNzYWdlMi5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlMi5nZXRSZXBlYXRlZFN0cmluZ0NvdW50KCkpOworICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCBtZXNzYWdlMi5nZXRSZXBlYXRlZFN0cmluZygwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDcsIG1lc3NhZ2UyLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpLmdldEJiKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExpdGVFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVE9ETyhrZW50b24pOiAgVW5saWtlIG90aGVyIGZlYXR1cmVzIG9mIHRoZSBsaXRlIGxpYnJhcnksIGV4dGVuc2lvbnMgYXJlCisgICAgLy8gICBpbXBsZW1lbnRlZCBjb21wbGV0ZWx5IGRpZmZlcmVudGx5IGZyb20gdGhlIHJlZ3VsYXIgbGlicmFyeS4gIFdlCisgICAgLy8gICBzaG91bGQgcHJvYmFibHkgdGVzdCB0aGVtIG1vcmUgdGhvcm91Z2hseS4KKworICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0KKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEyMykKKyAgICAgICAgLmFkZEV4dGVuc2lvbihVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlLCAiaGVsbG8iKQorICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5vcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLAorICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBWikKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoNykuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAvLyBUZXN0IGNvcHlpbmcgYSBtZXNzYWdlLCBzaW5jZSBjb3BpbmcgZXh0ZW5zaW9ucyBhY3R1YWxseSBkb2VzIHVzZSBhCisgICAgLy8gZGlmZmVyZW50IGNvZGUgcGF0aCBiZXR3ZWVuIGxpdGUgYW5kIHJlZ3VsYXIgbGlicmFyaWVzLCBhbmQgYXMgb2YgdGhpcworICAgIC8vIHdyaXRpbmcsIHBhcnNpbmcgaGFzbid0IGJlZW4gaW1wbGVtZW50ZWQgeWV0LgorICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlMiA9IG1lc3NhZ2UudG9CdWlsZGVyKCkuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygxMjMsIChpbnQpIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKKyAgICAgICAgVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2UyLmdldEV4dGVuc2lvbkNvdW50KAorICAgICAgICBVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKKyAgICAgICAgVW5pdHRlc3RMaXRlLnJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbWVzc2FnZTIuZ2V0RXh0ZW5zaW9uKAorICAgICAgICBVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVosIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKKyAgICAgICAgVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHMoNywgbWVzc2FnZTIuZ2V0RXh0ZW5zaW9uKAorICAgICAgICBVbml0dGVzdExpdGUub3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkuZ2V0QmIoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgVGVzdEFsbFR5cGVzTGl0ZSBleHBlY3RlZCA9CisgICAgICBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcHRpb25hbEludDMyKDEyMykKKyAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoImhlbGxvIikKKyAgICAgICAgICAgICAgICAgICAgICAuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDcpKQorICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOworICAgIHRyeSB7CisgICAgICBvdXQud3JpdGVPYmplY3QoZXhwZWN0ZWQpOworICAgIH0gZmluYWxseSB7CisgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9CisgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOworICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOworICAgIFRlc3RBbGxUeXBlc0xpdGUgYWN0dWFsID0gKFRlc3RBbGxUeXBlc0xpdGUpIGluLnJlYWRPYmplY3QoKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0T3B0aW9uYWxJbnQzMigpLCBhY3R1YWwuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCgpLAorICAgICAgICBhY3R1YWwuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0UmVwZWF0ZWRTdHJpbmcoMCksCisgICAgICAgIGFjdHVhbC5nZXRSZXBlYXRlZFN0cmluZygwKSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpLmdldEJiKCksCisgICAgICAgIGFjdHVhbC5nZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKS5nZXRCYigpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmY0N2ViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VUZXN0LmphdmEKQEAgLTAsMCArMSwzMTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbEV4dGVuc2lvbnM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UmVxdWlyZWQ7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UmVxdWlyZWRGb3JlaWduOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2U7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogTWlzYy4gdW5pdCB0ZXN0cyBmb3IgbWVzc2FnZSBvcGVyYXRpb25zIHRoYXQgYXBwbHkgdG8gYm90aCBnZW5lcmF0ZWQKKyAqIGFuZCBkeW5hbWljIG1lc3NhZ2VzLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gTWVzc2FnZS1tZXJnaW5nIHRlc3RzLgorCisgIHN0YXRpYyBmaW5hbCBUZXN0QWxsVHlwZXMgTUVSR0VfU09VUkNFID0KKyAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAuc2V0T3B0aW9uYWxJbnQzMigxKQorICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJmb28iKQorICAgICAgLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCisgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoImJhciIpCisgICAgICAuYnVpbGQoKTsKKworICBzdGF0aWMgZmluYWwgVGVzdEFsbFR5cGVzIE1FUkdFX0RFU1QgPQorICAgIFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKKyAgICAgIC5zZXRPcHRpb25hbEludDY0KDIpCisgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoImJheiIpCisgICAgICAuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygzKS5idWlsZCgpKQorICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJxdXgiKQorICAgICAgLmJ1aWxkKCk7CisKKyAgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9SRVNVTFRfVEVYVCA9CisgICAgICAib3B0aW9uYWxfaW50MzI6IDFcbiIgKworICAgICAgIm9wdGlvbmFsX2ludDY0OiAyXG4iICsKKyAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwiZm9vXCJcbiIgKworICAgICAgIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSB7XG4iICsKKyAgICAgICIgIGM6IDNcbiIgKworICAgICAgIn1cbiIgKworICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJxdXhcIlxuIiArCisgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcImJhclwiXG4iOworCisgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMgcmVzdWx0ID0KKyAgICAgIFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKE1FUkdFX0RFU1QpCisgICAgICAgIC5tZXJnZUZyb20oTUVSR0VfU09VUkNFKS5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKE1FUkdFX1JFU1VMVF9URVhULCByZXN1bHQudG9TdHJpbmcoKSk7CisgIH0KKworICAvKioKKyAgICogVGVzdCBtZXJnaW5nIGEgRHluYW1pY01lc3NhZ2UgaW50byBhIEdlbmVyYXRlZE1lc3NhZ2UuICBBcyBsb25nIGFzIHRoZXkKKyAgICogaGF2ZSB0aGUgc2FtZSBkZXNjcmlwdG9yLCB0aGlzIHNob3VsZCB3b3JrLCBidXQgaXQgaXMgYW4gZW50aXJlbHkgZGlmZmVyZW50CisgICAqIGNvZGUgcGF0aC4KKyAgICovCisgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUZyb21EeW5hbWljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzIHJlc3VsdCA9CisgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcihNRVJHRV9ERVNUKQorICAgICAgICAubWVyZ2VGcm9tKER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoTUVSR0VfU09VUkNFKS5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscyhNRVJHRV9SRVNVTFRfVEVYVCwgcmVzdWx0LnRvU3RyaW5nKCkpOworICB9CisKKyAgLyoqIFRlc3QgbWVyZ2luZyB0d28gRHluYW1pY01lc3NhZ2VzLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lcmdlRnJvbSgpIHRocm93cyBFeGNlcHRpb24geworICAgIER5bmFtaWNNZXNzYWdlIHJlc3VsdCA9CisgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKE1FUkdFX0RFU1QpCisgICAgICAgIC5tZXJnZUZyb20oRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihNRVJHRV9TT1VSQ0UpLmJ1aWxkKCkpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKE1FUkdFX1JFU1VMVF9URVhULCByZXN1bHQudG9TdHJpbmcoKSk7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBSZXF1aXJlZC1maWVsZC1yZWxhdGVkIHRlc3RzLgorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRlc3RSZXF1aXJlZCBURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQgPQorICAgIFRlc3RSZXF1aXJlZC5nZXREZWZhdWx0SW5zdGFuY2UoKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGVzdFJlcXVpcmVkIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQgPQorICAgIFRlc3RSZXF1aXJlZC5uZXdCdWlsZGVyKCkuc2V0QSgxKS5zZXRCKDIpLnNldEMoMykuYnVpbGQoKTsKKworICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0UmVxdWlyZWQuQnVpbGRlciBidWlsZGVyID0gVGVzdFJlcXVpcmVkLm5ld0J1aWxkZXIoKTsKKworICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgICBidWlsZGVyLnNldEEoMSk7CisgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICAgIGJ1aWxkZXIuc2V0QigxKTsKKyAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgICAgYnVpbGRlci5zZXRDKDEpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkRm9yZWlnbigpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RSZXF1aXJlZEZvcmVpZ24uQnVpbGRlciBidWlsZGVyID0gVGVzdFJlcXVpcmVkRm9yZWlnbi5uZXdCdWlsZGVyKCk7CisKKyAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKworICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCk7CisgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworCisgICAgYnVpbGRlci5zZXRPcHRpb25hbE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9JTklUSUFMSVpFRCk7CisgICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpOworICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKworICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRNZXNzYWdlKDAsIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkRXh0ZW5zaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOworCisgICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICBidWlsZGVyLnNldEV4dGVuc2lvbihUZXN0UmVxdWlyZWQuc2luZ2xlLCBURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpOworICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKworICAgIGJ1aWxkZXIuc2V0RXh0ZW5zaW9uKFRlc3RSZXF1aXJlZC5zaW5nbGUsIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworCisgICAgYnVpbGRlci5hZGRFeHRlbnNpb24oVGVzdFJlcXVpcmVkLm11bHRpLCBURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpOworICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKworICAgIGJ1aWxkZXIuc2V0RXh0ZW5zaW9uKFRlc3RSZXF1aXJlZC5tdWx0aSwgMCwgVEVTVF9SRVFVSVJFRF9JTklUSUFMSVpFRCk7CisgICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWREeW5hbWljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdFJlcXVpcmVkLmdldERlc2NyaXB0b3IoKTsKKyAgICBEeW5hbWljTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPSBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKGRlc2NyaXB0b3IpOworCisgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICAgIGJ1aWxkZXIuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoImEiKSwgMSk7CisgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICAgIGJ1aWxkZXIuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoImIiKSwgMSk7CisgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworICAgIGJ1aWxkZXIuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoImMiKSwgMSk7CisgICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWREeW5hbWljRm9yZWlnbigpIHRocm93cyBFeGNlcHRpb24geworICAgIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFRlc3RSZXF1aXJlZEZvcmVpZ24uZ2V0RGVzY3JpcHRvcigpOworICAgIER5bmFtaWNNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoZGVzY3JpcHRvcik7CisKKyAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKKworICAgIGJ1aWxkZXIuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX21lc3NhZ2UiKSwKKyAgICAgICAgICAgICAgICAgICAgIFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCk7CisgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOworCisgICAgYnVpbGRlci5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbWVzc2FnZSIpLAorICAgICAgICAgICAgICAgICAgICAgVEVTVF9SRVFVSVJFRF9JTklUSUFMSVpFRCk7CisgICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX21lc3NhZ2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKKyAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICBidWlsZGVyLnNldFJlcGVhdGVkRmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX21lc3NhZ2UiKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9SRVFVSVJFRF9JTklUSUFMSVpFRCk7CisgICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5pbml0aWFsaXplZEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBUZXN0UmVxdWlyZWQubmV3QnVpbGRlcigpLmJ1aWxkKCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRQYXJ0aWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gV2UncmUgbW9zdGx5IHRlc3RpbmcgdGhhdCBubyBleGNlcHRpb24gaXMgdGhyb3duLgorICAgIFRlc3RSZXF1aXJlZCBtZXNzYWdlID0gVGVzdFJlcXVpcmVkLm5ld0J1aWxkZXIoKS5idWlsZFBhcnRpYWwoKTsKKyAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmlzSW5pdGlhbGl6ZWQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVW5pbml0aWFsaXplZEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBUZXN0UmVxdWlyZWRGb3JlaWduLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0T3B0aW9uYWxNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKKyAgICAgICAgLmFkZFJlcGVhdGVkTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCisgICAgICAgIC5hZGRSZXBlYXRlZE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQorICAgICAgICAuYnVpbGQoKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogIiArCisgICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmEsICIgKworICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5iLCAiICsKKyAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYywgIiArCisgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmEsICIgKworICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5iLCAiICsKKyAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYywgIiArCisgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmEsICIgKworICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5iLCAiICsKKyAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYyIsCisgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGROZXN0ZWRQYXJ0aWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gV2UncmUgbW9zdGx5IHRlc3RpbmcgdGhhdCBubyBleGNlcHRpb24gaXMgdGhyb3duLgorICAgIFRlc3RSZXF1aXJlZEZvcmVpZ24gbWVzc2FnZSA9CisgICAgICBUZXN0UmVxdWlyZWRGb3JlaWduLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0T3B0aW9uYWxNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKKyAgICAgICAgLmFkZFJlcGVhdGVkTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCisgICAgICAgIC5hZGRSZXBlYXRlZE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQorICAgICAgICAuYnVpbGRQYXJ0aWFsKCk7CisgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5pc0luaXRpYWxpemVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlVW5pdGl0aWFsaXplZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBUZXN0UmVxdWlyZWQucGFyc2VGcm9tKEJ5dGVTdHJpbmcuRU1QVFkpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKCJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBhLCBiLCBjIiwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU5lc3RlZFVuaXRpdGlhbGl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBCeXRlU3RyaW5nIGRhdGEgPQorICAgICAgVGVzdFJlcXVpcmVkRm9yZWlnbi5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldE9wdGlvbmFsTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCisgICAgICAgIC5hZGRSZXBlYXRlZE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQorICAgICAgICAuYWRkUmVwZWF0ZWRNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKKyAgICAgICAgLmJ1aWxkUGFydGlhbCgpLnRvQnl0ZVN0cmluZygpOworCisgICAgdHJ5IHsKKyAgICAgIFRlc3RSZXF1aXJlZEZvcmVpZ24ucGFyc2VGcm9tKGRhdGEpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogIiArCisgICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmEsICIgKworICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5iLCAiICsKKyAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYywgIiArCisgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmEsICIgKworICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5iLCAiICsKKyAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYywgIiArCisgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmEsICIgKworICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5iLCAiICsKKyAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYyIsCisgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY1VuaW5pdGlhbGl6ZWRFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0UmVxdWlyZWQuZ2V0RGVzY3JpcHRvcigpKS5idWlsZCgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGEsIGIsIGMiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNCdWlsZFBhcnRpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBXZSdyZSBtb3N0bHkgdGVzdGluZyB0aGF0IG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgRHluYW1pY01lc3NhZ2UgbWVzc2FnZSA9CisgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RSZXF1aXJlZC5nZXREZXNjcmlwdG9yKCkpCisgICAgICAgIC5idWlsZFBhcnRpYWwoKTsKKyAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmlzSW5pdGlhbGl6ZWQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY1BhcnNlVW5pdGl0aWFsaXplZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0UmVxdWlyZWQuZ2V0RGVzY3JpcHRvcigpOworICAgICAgRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKGRlc2NyaXB0b3IsIEJ5dGVTdHJpbmcuRU1QVFkpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKCJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBhLCBiLCBjIiwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL05lc3RlZEJ1aWxkZXJzVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL05lc3RlZEJ1aWxkZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Mzc1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTmVzdGVkQnVpbGRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlZlaGljbGU7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuV2hlZWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFRlc3QgY2FzZXMgdGhhdCBleGVyY2lzZSBlbmQtdG8tZW5kIHVzZSBjYXNlcyBpbnZvbHZpbmcKKyAqIHtAbGluayBTaW5nbGVGaWVsZEJ1aWxkZXJ9IGFuZCB7QGxpbmsgUmVwZWF0ZWRGaWVsZEJ1aWxkZXJ9LgorICoKKyAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICovCitwdWJsaWMgY2xhc3MgTmVzdGVkQnVpbGRlcnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlc0FuZEJ1aWxkZXJzKCkgeworICAgIFZlaGljbGUuQnVpbGRlciB2ZWhpY2xlQnVpbGRlciA9IFZlaGljbGUubmV3QnVpbGRlcigpOworICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCisgICAgICAgIC5zZXRSYWRpdXMoNCkKKyAgICAgICAgLnNldFdpZHRoKDEpOworICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCisgICAgICAgIC5zZXRSYWRpdXMoNCkKKyAgICAgICAgLnNldFdpZHRoKDIpOworICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCisgICAgICAgIC5zZXRSYWRpdXMoNCkKKyAgICAgICAgLnNldFdpZHRoKDMpOworICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCisgICAgICAgIC5zZXRSYWRpdXMoNCkKKyAgICAgICAgLnNldFdpZHRoKDQpOworICAgIHZlaGljbGVCdWlsZGVyLmdldEVuZ2luZUJ1aWxkZXIoKQorICAgICAgICAuc2V0TGl0ZXJzKDEwKTsKKworICAgIFZlaGljbGUgdmVoaWNsZSA9IHZlaGljbGVCdWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKDQsIHZlaGljbGUuZ2V0V2hlZWxDb3VudCgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgV2hlZWwgd2hlZWwgPSB2ZWhpY2xlLmdldFdoZWVsKGkpOworICAgICAgYXNzZXJ0RXF1YWxzKDQsIHdoZWVsLmdldFJhZGl1cygpKTsKKyAgICAgIGFzc2VydEVxdWFscyhpICsgMSwgd2hlZWwuZ2V0V2lkdGgoKSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscygxMCwgdmVoaWNsZS5nZXRFbmdpbmUoKS5nZXRMaXRlcnMoKSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWxCdWlsZGVyKGkpCisgICAgICAgICAgLnNldFJhZGl1cyg1KQorICAgICAgICAgIC5zZXRXaWR0aChpICsgMTApOworICAgIH0KKyAgICB2ZWhpY2xlQnVpbGRlci5nZXRFbmdpbmVCdWlsZGVyKCkuc2V0TGl0ZXJzKDIwKTsKKworICAgIHZlaGljbGUgPSB2ZWhpY2xlQnVpbGRlci5idWlsZCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBXaGVlbCB3aGVlbCA9IHZlaGljbGUuZ2V0V2hlZWwoaSk7CisgICAgICBhc3NlcnRFcXVhbHMoNSwgd2hlZWwuZ2V0UmFkaXVzKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAxMCwgd2hlZWwuZ2V0V2lkdGgoKSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscygyMCwgdmVoaWNsZS5nZXRFbmdpbmUoKS5nZXRMaXRlcnMoKSk7CisgICAgYXNzZXJ0VHJ1ZSh2ZWhpY2xlLmhhc0VuZ2luZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlc0FyZUNhY2hlZCgpIHsKKyAgICBWZWhpY2xlLkJ1aWxkZXIgdmVoaWNsZUJ1aWxkZXIgPSBWZWhpY2xlLm5ld0J1aWxkZXIoKTsKKyAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQorICAgICAgICAuc2V0UmFkaXVzKDEpCisgICAgICAgIC5zZXRXaWR0aCgyKTsKKyAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQorICAgICAgICAuc2V0UmFkaXVzKDMpCisgICAgICAgIC5zZXRXaWR0aCg0KTsKKyAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQorICAgICAgICAuc2V0UmFkaXVzKDUpCisgICAgICAgIC5zZXRXaWR0aCg2KTsKKyAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQorICAgICAgICAuc2V0UmFkaXVzKDcpCisgICAgICAgIC5zZXRXaWR0aCg4KTsKKworICAgIC8vIE1ha2Ugc3VyZSBtZXNzYWdlcyBhcmUgY2FjaGVkLgorICAgIExpc3Q8V2hlZWw+IHdoZWVscyA9IG5ldyBBcnJheUxpc3Q8V2hlZWw+KHZlaGljbGVCdWlsZGVyLmdldFdoZWVsTGlzdCgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHdoZWVscy5zaXplKCk7IGkrKykgeworICAgICAgYXNzZXJ0U2FtZSh3aGVlbHMuZ2V0KGkpLCB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbChpKSk7CisgICAgfQorCisgICAgLy8gTm93IGdldCBidWlsZGVycyBhbmQgY2hlY2sgdGhleSBkaWRuJ3QgY2hhbmdlLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2hlZWxzLnNpemUoKTsgaSsrKSB7CisgICAgICB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbChpKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aGVlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGFzc2VydFNhbWUod2hlZWxzLmdldChpKSwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWwoaSkpOworICAgIH0KKworICAgIC8vIENoYW5nZSBqdXN0IG9uZQorICAgIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsQnVpbGRlcigzKQorICAgICAgICAuc2V0UmFkaXVzKDIwKS5zZXRXaWR0aCgyMCk7CisKKyAgICAvLyBOb3cgZ2V0IHdoZWVscyBhbmQgY2hlY2sgdGhhdCBvbmx5IHRoYXQgb25lIGNoYW5nZWQKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHdoZWVscy5zaXplKCk7IGkrKykgeworICAgICAgaWYgKGkgPCAzKSB7CisgICAgICAgIGFzc2VydFNhbWUod2hlZWxzLmdldChpKSwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWwoaSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZSh3aGVlbHMuZ2V0KGkpLCB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbChpKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlbW92ZV9XaXRoTmVzdGVkQnVpbGRlcnMoKSB7CisgICAgVmVoaWNsZS5CdWlsZGVyIHZlaGljbGVCdWlsZGVyID0gVmVoaWNsZS5uZXdCdWlsZGVyKCk7CisgICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWxCdWlsZGVyKCkKKyAgICAgICAgLnNldFJhZGl1cygxKQorICAgICAgICAuc2V0V2lkdGgoMSk7CisgICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWxCdWlsZGVyKCkKKyAgICAgICAgLnNldFJhZGl1cygyKQorICAgICAgICAuc2V0V2lkdGgoMik7CisgICAgdmVoaWNsZUJ1aWxkZXIucmVtb3ZlV2hlZWwoMCk7CisKKyAgICBhc3NlcnRFcXVhbHMoMSwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWxDb3VudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWwoMCkuZ2V0UmFkaXVzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJlbW92ZV9XaXRoTmVzdGVkTWVzc2FnZXMoKSB7CisgICAgVmVoaWNsZS5CdWlsZGVyIHZlaGljbGVCdWlsZGVyID0gVmVoaWNsZS5uZXdCdWlsZGVyKCk7CisgICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWwoV2hlZWwubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRSYWRpdXMoMSkKKyAgICAgICAgLnNldFdpZHRoKDEpKTsKKyAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbChXaGVlbC5uZXdCdWlsZGVyKCkKKyAgICAgICAgLnNldFJhZGl1cygyKQorICAgICAgICAuc2V0V2lkdGgoMikpOworICAgIHZlaGljbGVCdWlsZGVyLnJlbW92ZVdoZWVsKDApOworCisgICAgYXNzZXJ0RXF1YWxzKDEsIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsQ291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsKDApLmdldFJhZGl1cygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZSgpIHsKKyAgICBWZWhpY2xlIHZlaGljbGUxID0gVmVoaWNsZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLmFkZFdoZWVsKFdoZWVsLm5ld0J1aWxkZXIoKS5zZXRSYWRpdXMoMSkuYnVpbGQoKSkKKyAgICAgICAgLmFkZFdoZWVsKFdoZWVsLm5ld0J1aWxkZXIoKS5zZXRSYWRpdXMoMikuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisKKyAgICBWZWhpY2xlIHZlaGljbGUyID0gVmVoaWNsZS5uZXdCdWlsZGVyKCkKKyAgICAgICAgLm1lcmdlRnJvbSh2ZWhpY2xlMSkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgLy8gTGlzdCBzaG91bGQgYmUgdGhlIHNhbWUgLS0gbm8gYWxsb2NhdGlvbgorICAgIGFzc2VydFNhbWUodmVoaWNsZTEuZ2V0V2hlZWxMaXN0KCksIHZlaGljbGUyLmdldFdoZWVsTGlzdCgpKTsKKworICAgIFZlaGljbGUgdmVoaWNsZTMgPSB2ZWhpY2xlMS50b0J1aWxkZXIoKS5idWlsZCgpOworICAgIGFzc2VydFNhbWUodmVoaWNsZTEuZ2V0V2hlZWxMaXN0KCksIHZlaGljbGUzLmdldFdoZWVsTGlzdCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RHZXR0aW5nQnVpbGRlck1hcmtzRmllbGRBc0hhdmluZygpIHsKKyAgICBWZWhpY2xlLkJ1aWxkZXIgdmVoaWNsZUJ1aWxkZXIgPSBWZWhpY2xlLm5ld0J1aWxkZXIoKTsKKyAgICB2ZWhpY2xlQnVpbGRlci5nZXRFbmdpbmVCdWlsZGVyKCk7CisgICAgVmVoaWNsZSB2ZWhpY2xlID0gdmVoaWNsZUJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7CisgICAgYXNzZXJ0VHJ1ZSh2ZWhpY2xlLmhhc0VuZ2luZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JlcGVhdGVkRmllbGRCdWlsZGVyVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JlcGVhdGVkRmllbGRCdWlsZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2RjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxOTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzT3JCdWlsZGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgUmVwZWF0ZWRGaWVsZEJ1aWxkZXJ9LiBUaGlzIHRlc3RzIGJhc2ljIGZ1bmN0aW9uYWxpdHkuCisgKiBNb3JlIGV4dGVuc2l2ZSB0ZXN0aW5nIGlzIHByb3ZpZGVkIHZpYSBvdGhlciB0ZXN0cyB0aGF0IGV4ZXJjaXNlIHRoZQorICogYnVpbGRlci4KKyAqCisgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKKyAqLworcHVibGljIGNsYXNzIFJlcGVhdGVkRmllbGRCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNVc2UoKSB7CisgICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOworICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCisgICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9IG5ld1JlcGVhdGVkRmllbGRCdWlsZGVyKG1vY2tQYXJlbnQpOworICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7CisgICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOworCisgICAgTGlzdDxUZXN0QWxsVHlwZXM+IGxpc3QgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKKworICAgIC8vIE1ha2Ugc3VyZSBpdCBkb2Vzbid0IGNoYW5nZS4KKyAgICBMaXN0PFRlc3RBbGxUeXBlcz4gbGlzdDIgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0U2FtZShsaXN0LCBsaXN0Mik7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0R29pbmdCYWNrQW5kRm9ydGgoKSB7CisgICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOworICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCisgICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9IG5ld1JlcGVhdGVkRmllbGRCdWlsZGVyKG1vY2tQYXJlbnQpOworICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7CisgICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOworCisgICAgLy8gQ29udmVydCB0byBsaXN0CisgICAgTGlzdDxUZXN0QWxsVHlwZXM+IGxpc3QgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKKworICAgIC8vIFVwZGF0ZSAwdGggaXRlbQorICAgIGFzc2VydEVxdWFscygwLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigwKS5zZXRPcHRpb25hbFN0cmluZygiZm9vIik7CisgICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisgICAgbGlzdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygwLCBsaXN0LmdldCgwKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBsaXN0LmdldCgwKS5nZXRPcHRpb25hbFN0cmluZygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RWYXJpb3VzTWV0aG9kcygpIHsKKyAgICBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCBtb2NrUGFyZW50ID0gbmV3IFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50KCk7CisgICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKKyAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPiBidWlsZGVyID0gbmV3UmVwZWF0ZWRGaWVsZEJ1aWxkZXIobW9ja1BhcmVudCk7CisgICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKKyAgICBidWlsZGVyLmFkZE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDIpLmJ1aWxkKCkpOworICAgIGJ1aWxkZXIuYWRkQnVpbGRlcigwLCBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCisgICAgICAgIC5zZXRPcHRpb25hbEludDMyKDApOworICAgIGJ1aWxkZXIuYWRkQnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLnNldE9wdGlvbmFsSW50MzIoMyk7CisKKyAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygyLCBidWlsZGVyLmdldE1lc3NhZ2UoMikuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgYnVpbGRlci5nZXRNZXNzYWdlKDMpLmdldE9wdGlvbmFsSW50MzIoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoMCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKyAgICBMaXN0PFRlc3RBbGxUeXBlcz4gbWVzc2FnZXMgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKDQsIG1lc3NhZ2VzLnNpemUoKSk7CisgICAgYXNzZXJ0U2FtZShtZXNzYWdlcywgYnVpbGRlci5idWlsZCgpKTsgLy8gZXhwZWN0IHNhbWUgbGlzdAorCisgICAgLy8gUmVtb3ZlIGEgbWVzc2FnZS4KKyAgICBidWlsZGVyLnJlbW92ZSgyKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMywgYnVpbGRlci5nZXRDb3VudCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVyLmdldE1lc3NhZ2UoMikuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKworICAgIC8vIFJlbW92ZSBhIGJ1aWxkZXIuCisgICAgYnVpbGRlci5yZW1vdmUoMCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0Q291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgwKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVyLmdldE1lc3NhZ2UoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKworICAgIC8vIFRlc3QgY2xlYXIuCisgICAgYnVpbGRlci5jbGVhcigpOworICAgIGFzc2VydEVxdWFscygxLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVyLmdldENvdW50KCkpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0VtcHR5KCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExpc3RzKCkgeworICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKKyAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAorICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+IGJ1aWxkZXIgPSBuZXdSZXBlYXRlZEZpZWxkQnVpbGRlcihtb2NrUGFyZW50KTsKKyAgICBidWlsZGVyLmFkZE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEpLmJ1aWxkKCkpOworICAgIGJ1aWxkZXIuYWRkTWVzc2FnZSgwLAorICAgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgwKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE1lc3NhZ2UoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKworICAgIC8vIFVzZSBsaXN0IG9mIGJ1aWxkZXJzLgorICAgIExpc3Q8VGVzdEFsbFR5cGVzLkJ1aWxkZXI+IGJ1aWxkZXJzID0gYnVpbGRlci5nZXRCdWlsZGVyTGlzdCgpOworICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVycy5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgYnVpbGRlcnMuZ2V0KDEpLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYnVpbGRlcnMuZ2V0KDApLnNldE9wdGlvbmFsSW50MzIoMTApOworICAgIGJ1aWxkZXJzLmdldCgxKS5zZXRPcHRpb25hbEludDMyKDExKTsKKworICAgIC8vIFVzZSBsaXN0IG9mIHByb3RvcworICAgIExpc3Q8VGVzdEFsbFR5cGVzPiBwcm90b3MgPSBidWlsZGVyLmdldE1lc3NhZ2VMaXN0KCk7CisgICAgYXNzZXJ0RXF1YWxzKDEwLCBwcm90b3MuZ2V0KDApLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDExLCBwcm90b3MuZ2V0KDEpLmdldE9wdGlvbmFsSW50MzIoKSk7CisKKyAgICAvLyBBZGQgYW4gaXRlbSB0byB0aGUgYnVpbGRlcnMgYW5kIHZlcmlmeSBpdCdzIHVwZGF0ZWQgaW4gYm90aAorICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMTIpLmJ1aWxkKCkpOworICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVycy5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygzLCBwcm90b3Muc2l6ZSgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRJc1VubW9kaWZpYWJsZShMaXN0PD8+IGxpc3QpIHsKKyAgICBpZiAobGlzdCA9PSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkgeworICAgICAgLy8gT0tBWSAtLSBOZWVkIHRvIGNoZWNrIHRoaXMgYi9jIEVtcHR5TGlzdCBhbGxvd3MgeW91IHRvIGNhbGwgY2xlYXIuCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGxpc3QuY2xlYXIoKTsKKyAgICAgICAgZmFpbCgiTGlzdCB3YXNuJ3QgaW1tdXRhYmxlIik7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIGdvb2QKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCisgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+CisgICAgICBuZXdSZXBlYXRlZEZpZWxkQnVpbGRlcihHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgcGFyZW50KSB7CisgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAorICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+KENvbGxlY3Rpb25zLjxUZXN0QWxsVHlwZXM+ZW1wdHlMaXN0KCksIGZhbHNlLAorICAgICAgICBwYXJlbnQsIGZhbHNlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2VUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmU4NGY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSwzMjAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yOworaW1wb3J0IGdvb2dsZS5wcm90b2J1Zi5ub19nZW5lcmljX3NlcnZpY2VzX3Rlc3QuVW5pdHRlc3ROb0dlbmVyaWNTZXJ2aWNlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5NZXNzYWdlV2l0aE5vT3V0ZXI7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuU2VydmljZVdpdGhOb091dGVyOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFNlcnZpY2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb29SZXF1ZXN0OworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9vUmVzcG9uc2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5CYXJSZXF1ZXN0OworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uQmFyUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2s7CitpbXBvcnQgb3JnLmVhc3ltb2NrLmNsYXNzZXh0ZW5zaW9uLklNb2Nrc0NvbnRyb2w7CitpbXBvcnQgb3JnLmVhc3ltb2NrLklBcmd1bWVudE1hdGNoZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3RzIHNlcnZpY2VzIGFuZCBzdHVicy4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQorICovCitwdWJsaWMgY2xhc3MgU2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHByaXZhdGUgSU1vY2tzQ29udHJvbCBjb250cm9sOworICBwcml2YXRlIFJwY0NvbnRyb2xsZXIgbW9ja0NvbnRyb2xsZXI7CisKKyAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIGZvb0Rlc2NyaXB0b3IgPQorICAgIFRlc3RTZXJ2aWNlLmdldERlc2NyaXB0b3IoKS5nZXRNZXRob2RzKCkuZ2V0KDApOworICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLk1ldGhvZERlc2NyaXB0b3IgYmFyRGVzY3JpcHRvciA9CisgICAgVGVzdFNlcnZpY2UuZ2V0RGVzY3JpcHRvcigpLmdldE1ldGhvZHMoKS5nZXQoMSk7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc3VwZXIuc2V0VXAoKTsKKyAgICBjb250cm9sID0gRWFzeU1vY2suY3JlYXRlU3RyaWN0Q29udHJvbCgpOworICAgIG1vY2tDb250cm9sbGVyID0gY29udHJvbC5jcmVhdGVNb2NrKFJwY0NvbnRyb2xsZXIuY2xhc3MpOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKiogVGVzdHMgU2VydmljZS5jYWxsTWV0aG9kKCkuICovCisgIHB1YmxpYyB2b2lkIHRlc3RDYWxsTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRm9vUmVxdWVzdCBmb29SZXF1ZXN0ID0gRm9vUmVxdWVzdC5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICBCYXJSZXF1ZXN0IGJhclJlcXVlc3QgPSBCYXJSZXF1ZXN0Lm5ld0J1aWxkZXIoKS5idWlsZCgpOworICAgIE1vY2tDYWxsYmFjazxNZXNzYWdlPiBmb29DYWxsYmFjayA9IG5ldyBNb2NrQ2FsbGJhY2s8TWVzc2FnZT4oKTsKKyAgICBNb2NrQ2FsbGJhY2s8TWVzc2FnZT4gYmFyQ2FsbGJhY2sgPSBuZXcgTW9ja0NhbGxiYWNrPE1lc3NhZ2U+KCk7CisgICAgVGVzdFNlcnZpY2UgbW9ja1NlcnZpY2UgPSBjb250cm9sLmNyZWF0ZU1vY2soVGVzdFNlcnZpY2UuY2xhc3MpOworCisgICAgbW9ja1NlcnZpY2UuZm9vKEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLCBFYXN5TW9jay5zYW1lKGZvb1JlcXVlc3QpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLjxGb29SZXNwb25zZT53cmFwc0NhbGxiYWNrKGZvb0NhbGxiYWNrKSk7CisgICAgbW9ja1NlcnZpY2UuYmFyKEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLCBFYXN5TW9jay5zYW1lKGJhclJlcXVlc3QpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLjxCYXJSZXNwb25zZT53cmFwc0NhbGxiYWNrKGJhckNhbGxiYWNrKSk7CisgICAgY29udHJvbC5yZXBsYXkoKTsKKworICAgIG1vY2tTZXJ2aWNlLmNhbGxNZXRob2QoZm9vRGVzY3JpcHRvciwgbW9ja0NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb29SZXF1ZXN0LCBmb29DYWxsYmFjayk7CisgICAgbW9ja1NlcnZpY2UuY2FsbE1ldGhvZChiYXJEZXNjcmlwdG9yLCBtb2NrQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhclJlcXVlc3QsIGJhckNhbGxiYWNrKTsKKyAgICBjb250cm9sLnZlcmlmeSgpOworICB9CisKKyAgLyoqIFRlc3RzIFNlcnZpY2UuZ2V0e1JlcXVlc3QsUmVzcG9uc2V9UHJvdG90eXBlKCkuICovCisgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm90b3R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0U2VydmljZSBtb2NrU2VydmljZSA9IGNvbnRyb2wuY3JlYXRlTW9jayhUZXN0U2VydmljZS5jbGFzcyk7CisKKyAgICBhc3NlcnRTYW1lKG1vY2tTZXJ2aWNlLmdldFJlcXVlc3RQcm90b3R5cGUoZm9vRGVzY3JpcHRvciksCisgICAgICAgICAgICAgICBGb29SZXF1ZXN0LmdldERlZmF1bHRJbnN0YW5jZSgpKTsKKyAgICBhc3NlcnRTYW1lKG1vY2tTZXJ2aWNlLmdldFJlc3BvbnNlUHJvdG90eXBlKGZvb0Rlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgRm9vUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOworICAgIGFzc2VydFNhbWUobW9ja1NlcnZpY2UuZ2V0UmVxdWVzdFByb3RvdHlwZShiYXJEZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgIEJhclJlcXVlc3QuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOworICAgIGFzc2VydFNhbWUobW9ja1NlcnZpY2UuZ2V0UmVzcG9uc2VQcm90b3R5cGUoYmFyRGVzY3JpcHRvciksCisgICAgICAgICAgICAgICBCYXJSZXNwb25zZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7CisgIH0KKworICAvKiogVGVzdHMgZ2VuZXJhdGVkIHN0dWJzLiAqLworICBwdWJsaWMgdm9pZCB0ZXN0U3R1YigpIHRocm93cyBFeGNlcHRpb24geworICAgIEZvb1JlcXVlc3QgZm9vUmVxdWVzdCA9IEZvb1JlcXVlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7CisgICAgQmFyUmVxdWVzdCBiYXJSZXF1ZXN0ID0gQmFyUmVxdWVzdC5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICBNb2NrQ2FsbGJhY2s8Rm9vUmVzcG9uc2U+IGZvb0NhbGxiYWNrID0gbmV3IE1vY2tDYWxsYmFjazxGb29SZXNwb25zZT4oKTsKKyAgICBNb2NrQ2FsbGJhY2s8QmFyUmVzcG9uc2U+IGJhckNhbGxiYWNrID0gbmV3IE1vY2tDYWxsYmFjazxCYXJSZXNwb25zZT4oKTsKKyAgICBScGNDaGFubmVsIG1vY2tDaGFubmVsID0gY29udHJvbC5jcmVhdGVNb2NrKFJwY0NoYW5uZWwuY2xhc3MpOworICAgIFRlc3RTZXJ2aWNlIHN0dWIgPSBUZXN0U2VydmljZS5uZXdTdHViKG1vY2tDaGFubmVsKTsKKworICAgIG1vY2tDaGFubmVsLmNhbGxNZXRob2QoCisgICAgICBFYXN5TW9jay5zYW1lKGZvb0Rlc2NyaXB0b3IpLAorICAgICAgRWFzeU1vY2suc2FtZShtb2NrQ29udHJvbGxlciksCisgICAgICBFYXN5TW9jay5zYW1lKGZvb1JlcXVlc3QpLAorICAgICAgRWFzeU1vY2suc2FtZShGb29SZXNwb25zZS5nZXREZWZhdWx0SW5zdGFuY2UoKSksCisgICAgICB0aGlzLjxNZXNzYWdlPndyYXBzQ2FsbGJhY2soZm9vQ2FsbGJhY2spKTsKKyAgICBtb2NrQ2hhbm5lbC5jYWxsTWV0aG9kKAorICAgICAgRWFzeU1vY2suc2FtZShiYXJEZXNjcmlwdG9yKSwKKyAgICAgIEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLAorICAgICAgRWFzeU1vY2suc2FtZShiYXJSZXF1ZXN0KSwKKyAgICAgIEVhc3lNb2NrLnNhbWUoQmFyUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLAorICAgICAgdGhpcy48TWVzc2FnZT53cmFwc0NhbGxiYWNrKGJhckNhbGxiYWNrKSk7CisgICAgY29udHJvbC5yZXBsYXkoKTsKKworICAgIHN0dWIuZm9vKG1vY2tDb250cm9sbGVyLCBmb29SZXF1ZXN0LCBmb29DYWxsYmFjayk7CisgICAgc3R1Yi5iYXIobW9ja0NvbnRyb2xsZXIsIGJhclJlcXVlc3QsIGJhckNhbGxiYWNrKTsKKyAgICBjb250cm9sLnZlcmlmeSgpOworICB9CisKKyAgLyoqIFRlc3RzIGdlbmVyYXRlZCBibG9ja2luZyBzdHVicy4gKi8KKyAgcHVibGljIHZvaWQgdGVzdEJsb2NraW5nU3R1YigpIHRocm93cyBFeGNlcHRpb24geworICAgIEZvb1JlcXVlc3QgZm9vUmVxdWVzdCA9IEZvb1JlcXVlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7CisgICAgQmFyUmVxdWVzdCBiYXJSZXF1ZXN0ID0gQmFyUmVxdWVzdC5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICBCbG9ja2luZ1JwY0NoYW5uZWwgbW9ja0NoYW5uZWwgPQorICAgICAgICBjb250cm9sLmNyZWF0ZU1vY2soQmxvY2tpbmdScGNDaGFubmVsLmNsYXNzKTsKKyAgICBUZXN0U2VydmljZS5CbG9ja2luZ0ludGVyZmFjZSBzdHViID0KKyAgICAgICAgVGVzdFNlcnZpY2UubmV3QmxvY2tpbmdTdHViKG1vY2tDaGFubmVsKTsKKworICAgIEZvb1Jlc3BvbnNlIGZvb1Jlc3BvbnNlID0gRm9vUmVzcG9uc2UubmV3QnVpbGRlcigpLmJ1aWxkKCk7CisgICAgQmFyUmVzcG9uc2UgYmFyUmVzcG9uc2UgPSBCYXJSZXNwb25zZS5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKKworICAgIEVhc3lNb2NrLmV4cGVjdChtb2NrQ2hhbm5lbC5jYWxsQmxvY2tpbmdNZXRob2QoCisgICAgICBFYXN5TW9jay5zYW1lKGZvb0Rlc2NyaXB0b3IpLAorICAgICAgRWFzeU1vY2suc2FtZShtb2NrQ29udHJvbGxlciksCisgICAgICBFYXN5TW9jay5zYW1lKGZvb1JlcXVlc3QpLAorICAgICAgRWFzeU1vY2suc2FtZShGb29SZXNwb25zZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpKS5hbmRSZXR1cm4oZm9vUmVzcG9uc2UpOworICAgIEVhc3lNb2NrLmV4cGVjdChtb2NrQ2hhbm5lbC5jYWxsQmxvY2tpbmdNZXRob2QoCisgICAgICBFYXN5TW9jay5zYW1lKGJhckRlc2NyaXB0b3IpLAorICAgICAgRWFzeU1vY2suc2FtZShtb2NrQ29udHJvbGxlciksCisgICAgICBFYXN5TW9jay5zYW1lKGJhclJlcXVlc3QpLAorICAgICAgRWFzeU1vY2suc2FtZShCYXJSZXNwb25zZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpKS5hbmRSZXR1cm4oYmFyUmVzcG9uc2UpOworICAgIGNvbnRyb2wucmVwbGF5KCk7CisKKyAgICBhc3NlcnRTYW1lKGZvb1Jlc3BvbnNlLCBzdHViLmZvbyhtb2NrQ29udHJvbGxlciwgZm9vUmVxdWVzdCkpOworICAgIGFzc2VydFNhbWUoYmFyUmVzcG9uc2UsIHN0dWIuYmFyKG1vY2tDb250cm9sbGVyLCBiYXJSZXF1ZXN0KSk7CisgICAgY29udHJvbC52ZXJpZnkoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3ROZXdSZWZsZWN0aXZlU2VydmljZSgpIHsKKyAgICBTZXJ2aWNlV2l0aE5vT3V0ZXIuSW50ZXJmYWNlIGltcGwgPQorICAgICAgICBjb250cm9sLmNyZWF0ZU1vY2soU2VydmljZVdpdGhOb091dGVyLkludGVyZmFjZS5jbGFzcyk7CisgICAgUnBjQ29udHJvbGxlciBjb250cm9sbGVyID0gY29udHJvbC5jcmVhdGVNb2NrKFJwY0NvbnRyb2xsZXIuY2xhc3MpOworICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2VXaXRoTm9PdXRlci5uZXdSZWZsZWN0aXZlU2VydmljZShpbXBsKTsKKworICAgIE1ldGhvZERlc2NyaXB0b3IgZm9vTWV0aG9kID0KKyAgICAgICAgU2VydmljZVdpdGhOb091dGVyLmdldERlc2NyaXB0b3IoKS5maW5kTWV0aG9kQnlOYW1lKCJGb28iKTsKKyAgICBNZXNzYWdlV2l0aE5vT3V0ZXIgcmVxdWVzdCA9IE1lc3NhZ2VXaXRoTm9PdXRlci5nZXREZWZhdWx0SW5zdGFuY2UoKTsKKyAgICBScGNDYWxsYmFjazxNZXNzYWdlPiBjYWxsYmFjayA9IG5ldyBScGNDYWxsYmFjazxNZXNzYWdlPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bihNZXNzYWdlIHBhcmFtZXRlcikgeworICAgICAgICAvLyBObyByZWFzb24gdGhpcyBzaG91bGQgYmUgcnVuLgorICAgICAgICBmYWlsKCk7CisgICAgICB9CisgICAgfTsKKyAgICBScGNDYWxsYmFjazxUZXN0QWxsVHlwZXM+IHNwZWNpYWxpemVkQ2FsbGJhY2sgPQorICAgICAgICBScGNVdGlsLnNwZWNpYWxpemVDYWxsYmFjayhjYWxsYmFjayk7CisKKyAgICBpbXBsLmZvbyhFYXN5TW9jay5zYW1lKGNvbnRyb2xsZXIpLCBFYXN5TW9jay5zYW1lKHJlcXVlc3QpLAorICAgICAgICBFYXN5TW9jay5zYW1lKHNwZWNpYWxpemVkQ2FsbGJhY2spKTsKKyAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpOworCisgICAgY29udHJvbC5yZXBsYXkoKTsKKworICAgIHNlcnZpY2UuY2FsbE1ldGhvZChmb29NZXRob2QsIGNvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKTsKKworICAgIGNvbnRyb2wudmVyaWZ5KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZSgpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKKyAgICBTZXJ2aWNlV2l0aE5vT3V0ZXIuQmxvY2tpbmdJbnRlcmZhY2UgaW1wbCA9CisgICAgICAgIGNvbnRyb2wuY3JlYXRlTW9jayhTZXJ2aWNlV2l0aE5vT3V0ZXIuQmxvY2tpbmdJbnRlcmZhY2UuY2xhc3MpOworICAgIFJwY0NvbnRyb2xsZXIgY29udHJvbGxlciA9IGNvbnRyb2wuY3JlYXRlTW9jayhScGNDb250cm9sbGVyLmNsYXNzKTsKKyAgICBCbG9ja2luZ1NlcnZpY2Ugc2VydmljZSA9CisgICAgICAgIFNlcnZpY2VXaXRoTm9PdXRlci5uZXdSZWZsZWN0aXZlQmxvY2tpbmdTZXJ2aWNlKGltcGwpOworCisgICAgTWV0aG9kRGVzY3JpcHRvciBmb29NZXRob2QgPQorICAgICAgICBTZXJ2aWNlV2l0aE5vT3V0ZXIuZ2V0RGVzY3JpcHRvcigpLmZpbmRNZXRob2RCeU5hbWUoIkZvbyIpOworICAgIE1lc3NhZ2VXaXRoTm9PdXRlciByZXF1ZXN0ID0gTWVzc2FnZVdpdGhOb091dGVyLmdldERlZmF1bHRJbnN0YW5jZSgpOworCisgICAgVGVzdEFsbFR5cGVzIGV4cGVjdGVkUmVzcG9uc2UgPSBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCk7CisgICAgRWFzeU1vY2suZXhwZWN0KGltcGwuZm9vKEVhc3lNb2NrLnNhbWUoY29udHJvbGxlciksIEVhc3lNb2NrLnNhbWUocmVxdWVzdCkpKQorICAgICAgICAuYW5kUmV0dXJuKGV4cGVjdGVkUmVzcG9uc2UpOworCisgICAgY29udHJvbC5yZXBsYXkoKTsKKworICAgIE1lc3NhZ2UgcmVzcG9uc2UgPQorICAgICAgICBzZXJ2aWNlLmNhbGxCbG9ja2luZ01ldGhvZChmb29NZXRob2QsIGNvbnRyb2xsZXIsIHJlcXVlc3QpOworICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3BvbnNlLCByZXNwb25zZSk7CisKKyAgICBjb250cm9sLnZlcmlmeSgpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE5vR2VuZXJpY1NlcnZpY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gTm9uLXNlcnZpY2VzIHNob3VsZCBiZSB1c2FibGUuCisgICAgVW5pdHRlc3ROb0dlbmVyaWNTZXJ2aWNlcy5UZXN0TWVzc2FnZSBtZXNzYWdlID0KKyAgICAgIFVuaXR0ZXN0Tm9HZW5lcmljU2VydmljZXMuVGVzdE1lc3NhZ2UubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRBKDEyMykKKyAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzLnRlc3RFeHRlbnNpb24sIDQ1NikKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgYXNzZXJ0RXF1YWxzKDEyMywgbWVzc2FnZS5nZXRBKCkpOworICAgIGFzc2VydEVxdWFscygxLCBVbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzLlRlc3RFbnVtLkZPTy5nZXROdW1iZXIoKSk7CisKKyAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgdGhlIGNsYXNzIG5hbWVzIG5lc3RlZCBpbiBVbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzLgorICAgIFN0cmluZyBvdXRlck5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLm5vX2dlbmVyaWNfc2VydmljZXNfdGVzdC4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIlVuaXR0ZXN0Tm9HZW5lcmljU2VydmljZXMiOworICAgIENsYXNzPD8+IG91dGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG91dGVyTmFtZSk7CisKKyAgICBTZXQ8U3RyaW5nPiBpbm5lckNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgZm9yIChDbGFzczw/PiBpbm5lckNsYXNzIDogb3V0ZXJDbGFzcy5nZXRDbGFzc2VzKCkpIHsKKyAgICAgIFN0cmluZyBmdWxsTmFtZSA9IGlubmVyQ2xhc3MuZ2V0TmFtZSgpOworICAgICAgLy8gRmlndXJlIG91dCB0aGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgaW5uZXIgY2xhc3MuCisgICAgICAvLyBOb3RlOiAgU3VycHJpc2luZ2x5LCB0aGUgZnVsbCBuYW1lIG9mIGFuIGlubmVyIGNsYXNzIHdpbGwgYmUgc2VwYXJhdGVkCisgICAgICAvLyAgIGZyb20gdGhlIG91dGVyIGNsYXNzIG5hbWUgYnkgYSAnJCcgcmF0aGVyIHRoYW4gYSAnLicuICBUaGlzIGlzIG5vdAorICAgICAgLy8gICBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGphdmEubGFuZy5DbGFzcy4gIEkgZG9uJ3Qgd2FudCB0bworICAgICAgLy8gICBtYWtlIGFzc3VtcHRpb25zLCBzbyBJJ20ganVzdCBnb2luZyB0byBhY2NlcHQgYW55IGNoYXJhY3RlciBhcyB0aGUKKyAgICAgIC8vICAgc2VwYXJhdG9yLgorICAgICAgYXNzZXJ0VHJ1ZShmdWxsTmFtZS5zdGFydHNXaXRoKG91dGVyTmFtZSkpOworCisgICAgICBpZiAoIVNlcnZpY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpbm5lckNsYXNzKSAmJgorICAgICAgICAgICFNZXNzYWdlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW5uZXJDbGFzcykgJiYKKyAgICAgICAgICAhUHJvdG9jb2xNZXNzYWdlRW51bS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGlubmVyQ2xhc3MpKSB7CisgICAgICAgIC8vIElnbm9yZSBhbnkgY2xhc3NlcyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBiYXNlIGNvZGUgZ2VuZXJhdG9yLgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaW5uZXJDbGFzc05hbWVzLmFkZChmdWxsTmFtZS5zdWJzdHJpbmcob3V0ZXJOYW1lLmxlbmd0aCgpICsgMSkpOworICAgIH0KKworICAgIC8vIE5vIHNlcnZpY2UgY2xhc3Mgc2hvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQuCisgICAgYXNzZXJ0VHJ1ZShpbm5lckNsYXNzTmFtZXMuY29udGFpbnMoIlRlc3RNZXNzYWdlIikpOworICAgIGFzc2VydFRydWUoaW5uZXJDbGFzc05hbWVzLmNvbnRhaW5zKCJUZXN0RW51bSIpKTsKKyAgICBhc3NlcnRGYWxzZShpbm5lckNsYXNzTmFtZXMuY29udGFpbnMoIlRlc3RTZXJ2aWNlIikpOworCisgICAgLy8gQnV0IGRlc2NyaXB0b3JzIGFyZSB0aGVyZS4KKyAgICBGaWxlRGVzY3JpcHRvciBmaWxlID0gVW5pdHRlc3ROb0dlbmVyaWNTZXJ2aWNlcy5nZXREZXNjcmlwdG9yKCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGZpbGUuZ2V0U2VydmljZXMoKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygiVGVzdFNlcnZpY2UiLCBmaWxlLmdldFNlcnZpY2VzKCkuZ2V0KDApLmdldE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGZpbGUuZ2V0U2VydmljZXMoKS5nZXQoMCkuZ2V0TWV0aG9kcygpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJGb28iLAorICAgICAgICBmaWxlLmdldFNlcnZpY2VzKCkuZ2V0KDApLmdldE1ldGhvZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqCisgICAqIHdyYXBzQ2FsbGJhY2soKSBpcyBhbiBFYXN5TW9jayBhcmd1bWVudCBwcmVkaWNhdGUuICB3cmFwc0NhbGxiYWNrKGMpCisgICAqIG1hdGNoZXMgYSBjYWxsYmFjayBpZiBjYWxsaW5nIHRoYXQgY2FsbGJhY2sgY2F1c2VzIGMgdG8gYmUgY2FsbGVkLgorICAgKiBJbiBvdGhlciB3b3JkcywgYyB3cmFwcyB0aGUgZ2l2ZW4gY2FsbGJhY2suCisgICAqLworICBwcml2YXRlIDxUeXBlIGV4dGVuZHMgTWVzc2FnZT4gUnBjQ2FsbGJhY2s8VHlwZT4gd3JhcHNDYWxsYmFjaygKKyAgICAgIE1vY2tDYWxsYmFjazw/PiBjYWxsYmFjaykgeworICAgIEVhc3lNb2NrLnJlcG9ydE1hdGNoZXIobmV3IFdyYXBzQ2FsbGJhY2soY2FsbGJhY2spKTsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKiBUaGUgcGFyYW1ldGVyIHRvIHdyYXBzQ2FsbGJhY2soKSBtdXN0IGJlIGEgTW9ja0NhbGxiYWNrLiAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrQ2FsbGJhY2s8VHlwZSBleHRlbmRzIE1lc3NhZ2U+CisgICAgICBpbXBsZW1lbnRzIFJwY0NhbGxiYWNrPFR5cGU+IHsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FsbGVkID0gZmFsc2U7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbGxlZCgpIHsgcmV0dXJuIGNhbGxlZDsgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7IGNhbGxlZCA9IGZhbHNlOyB9CisgICAgcHVibGljIHZvaWQgcnVuKFR5cGUgbWVzc2FnZSkgeyBjYWxsZWQgPSB0cnVlOyB9CisgIH0KKworICAvKiogSW1wbGVtZW50YXRpb24gb2YgdGhlIHdyYXBzQ2FsbGJhY2soKSBhcmd1bWVudCBtYXRjaGVyLiAqLworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXcmFwc0NhbGxiYWNrIGltcGxlbWVudHMgSUFyZ3VtZW50TWF0Y2hlciB7CisgICAgcHJpdmF0ZSBNb2NrQ2FsbGJhY2s8Pz4gY2FsbGJhY2s7CisKKyAgICBwdWJsaWMgV3JhcHNDYWxsYmFjayhNb2NrQ2FsbGJhY2s8Pz4gY2FsbGJhY2spIHsKKyAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBhY3R1YWwpIHsKKyAgICAgIGlmICghKGFjdHVhbCBpbnN0YW5jZW9mIFJwY0NhbGxiYWNrKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBScGNDYWxsYmFjayBhY3R1YWxDYWxsYmFjayA9IChScGNDYWxsYmFjaylhY3R1YWw7CisKKyAgICAgIGNhbGxiYWNrLnJlc2V0KCk7CisgICAgICBhY3R1YWxDYWxsYmFjay5ydW4obnVsbCk7CisgICAgICByZXR1cm4gY2FsbGJhY2suaXNDYWxsZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisgICAgICBidWZmZXIuYXBwZW5kKCJ3cmFwc0NhbGxiYWNrKG1vY2tDYWxsYmFjaykiKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TaW5nbGVGaWVsZEJ1aWxkZXJUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2luZ2xlRmllbGRCdWlsZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMmY3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2luZ2xlRmllbGRCdWlsZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlc09yQnVpbGRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIFNpbmdsZUZpZWxkQnVpbGRlcn0uIFRoaXMgdGVzdHMgYmFzaWMgZnVuY3Rpb25hbGl0eS4KKyAqIE1vcmUgZXh0ZW5zaXZlIHRlc3RpbmcgaXMgcHJvdmlkZWQgdmlhIG90aGVyIHRlc3RzIHRoYXQgZXhlcmNpc2UgdGhlCisgKiBidWlsZGVyLgorICoKKyAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICovCitwdWJsaWMgY2xhc3MgU2luZ2xlRmllbGRCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNVc2VBbmRJbnZhbGlkYXRpb25zKCkgeworICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKKyAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKKyAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPiBidWlsZGVyID0KKyAgICAgICAgbmV3IFNpbmdsZUZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAorICAgICAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPigKKyAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgIG1vY2tQYXJlbnQsCisgICAgICAgICAgICBmYWxzZSk7CisgICAgYXNzZXJ0U2FtZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICBidWlsZGVyLmdldEJ1aWxkZXIoKS5idWlsZFBhcnRpYWwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisKKyAgICBidWlsZGVyLmdldEJ1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEwKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICBhc3NlcnRFcXVhbHMoMTAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbnQzMigpKTsKKworICAgIC8vIFRlc3QgdGhhdCB3ZSByZWNlaXZlIGludmFsaWRhdGlvbnMgbm93IHRoYXQgYnVpbGQgaGFzIGJlZW4gY2FsbGVkLgorICAgIGFzc2VydEVxdWFscygwLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMjApOworICAgIGFzc2VydEVxdWFscygxLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworCisgICAgLy8gVGVzdCB0aGF0IHdlIGRvbid0IGtlZXAgZ2V0dGluZyBpbnZhbGlkYXRpb25zIG9uIGV2ZXJ5IGNoYW5nZQorICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMzApOworICAgIGFzc2VydEVxdWFscygxLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2V0TWVzc2FnZSgpIHsKKyAgICBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCBtb2NrUGFyZW50ID0gbmV3IFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50KCk7CisgICAgU2luZ2xlRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCisgICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9CisgICAgICAgIG5ldyBTaW5nbGVGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKKyAgICAgICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4oCisgICAgICAgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCisgICAgICAgICAgICBtb2NrUGFyZW50LAorICAgICAgICAgICAgZmFsc2UpOworICAgIGJ1aWxkZXIuc2V0TWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsSW50MzIoKSk7CisKKyAgICAvLyBVcGRhdGUgbWVzc2FnZSB1c2luZyB0aGUgYnVpbGRlcgorICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYnVpbGRlci5idWlsZCgpOworICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMik7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsSW50MzIoKSk7CisKKyAgICAvLyBNYWtlIHN1cmUgbWVzc2FnZSBzdGF5cyBjYWNoZWQKKyAgICBhc3NlcnRTYW1lKGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7CisgICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOworICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAorICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+IGJ1aWxkZXIgPQorICAgICAgICBuZXcgU2luZ2xlRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCisgICAgICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+KAorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICAgICAgbW9ja1BhcmVudCwKKyAgICAgICAgICAgIGZhbHNlKTsKKyAgICBidWlsZGVyLnNldE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDApLmJ1aWxkKCkpOworICAgIGFzc2VydE5vdFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7CisgICAgYnVpbGRlci5jbGVhcigpOworICAgIGFzc2VydFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7CisKKyAgICBidWlsZGVyLmdldEJ1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEpOworICAgIGFzc2VydE5vdFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7CisgICAgYnVpbGRlci5jbGVhcigpOworICAgIGFzc2VydFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2UoKSB7CisgICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOworICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAorICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+IGJ1aWxkZXIgPQorICAgICAgICBuZXcgU2luZ2xlRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCisgICAgICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+KAorICAgICAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLAorICAgICAgICAgICAgbW9ja1BhcmVudCwKKyAgICAgICAgICAgIGZhbHNlKTsKKworICAgIC8vIE1lcmdlIGludG8gZGVmYXVsdCBmaWVsZC4KKyAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOworICAgIGFzc2VydFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7CisKKyAgICAvLyBNZXJnZSBpbnRvIG5vbi1kZWZhdWx0IGZpZWxkIG9uIGV4aXN0aW5nIGJ1aWxkZXIuCisgICAgYnVpbGRlci5nZXRCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigyKTsKKyAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRPcHRpb25hbERvdWJsZSg0LjApCisgICAgICAgIC5idWlsZFBhcnRpYWwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDQuMCwgYnVpbGRlci5nZXRNZXNzYWdlKCkuZ2V0T3B0aW9uYWxEb3VibGUoKSk7CisKKyAgICAvLyBNZXJnZSBpbnRvIG5vbi1kZWZhdWx0IGZpZWxkIG9uIGV4aXN0aW5nIG1lc3NhZ2UKKyAgICBidWlsZGVyLnNldE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0T3B0aW9uYWxJbnQzMigxMCkKKyAgICAgICAgLmJ1aWxkUGFydGlhbCgpKTsKKyAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRPcHRpb25hbERvdWJsZSg1LjApCisgICAgICAgIC5idWlsZFBhcnRpYWwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEwLCBidWlsZGVyLmdldE1lc3NhZ2UoKS5nZXRPcHRpb25hbEludDMyKCkpOworICAgIGFzc2VydEVxdWFscyg1LjAsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsRG91YmxlKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU21hbGxTb3J0ZWRNYXBUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU21hbGxTb3J0ZWRNYXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3N2EwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TbWFsbFNvcnRlZE1hcFRlc3QuamF2YQpAQCAtMCwwICsxLDQyMCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKKy8qKgorICogQGF1dGhvciBkYXJpY2tAZ29vZ2xlLmNvbSBEYXJpY2sgVG9uZworICovCitwdWJsaWMgY2xhc3MgU21hbGxTb3J0ZWRNYXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAvLyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAuU2ltcGxlRW50cnkgaXMgcHJpdmF0ZSBpbiBKREsgMS41LiBXZSByZS1pbXBsZW1lbnQgaXQKKyAgLy8gaGVyZSBmb3IgSkRLIDEuNSB1c2Vycy4KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlRW50cnk8SywgVj4gaW1wbGVtZW50cyBNYXAuRW50cnk8SywgVj4geworICAgIHByaXZhdGUgZmluYWwgSyBrZXk7CisgICAgcHJpdmF0ZSBWIHZhbHVlOworCisgICAgU2ltcGxlRW50cnkoSyBrZXksIFYgdmFsdWUpIHsKKyAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBLIGdldEtleSgpIHsKKyAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgcHVibGljIFYgZ2V0VmFsdWUoKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFYgc2V0VmFsdWUoViB2YWx1ZSkgeworICAgICAgViBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CisgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICByZXR1cm4gb2xkVmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgcmV0dXJuIG8xID09IG51bGwgPyBvMiA9PSBudWxsIDogbzEuZXF1YWxzKG8yKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIG87CisgICAgICByZXR1cm4gZXEoa2V5LCBlLmdldEtleSgpKSAmJiBlcSh2YWx1ZSwgZS5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuICgoa2V5ID09IG51bGwpID8gMCA6IGtleS5oYXNoQ29kZSgpKSBeCisgICAgICAgICAgKCh2YWx1ZSA9PSBudWxsKSA/IDAgOiB2YWx1ZS5oYXNoQ29kZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UHV0QW5kR2V0QXJyYXlFbnRyaWVzT25seSgpIHsKKyAgICBydW5QdXRBbmRHZXRUZXN0KDMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFB1dEFuZEdldE92ZXJmbG93RW50cmllcygpIHsKKyAgICBydW5QdXRBbmRHZXRUZXN0KDYpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJ1blB1dEFuZEdldFRlc3QoaW50IG51bUVsZW1lbnRzKSB7CisgICAgLy8gVGVzdCB3aXRoIGV2ZW4gYW5kIG9kZCBhcnJheVNpemUKKyAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAxID0KKyAgICAgICAgU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcDIgPQorICAgICAgICBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoNCk7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwMyA9CisgICAgICAgIFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKKyAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXA0ID0KKyAgICAgICAgU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDQpOworCisgICAgLy8gVGVzdCB3aXRoIHB1dHMgaW4gYXNjZW5kaW5nIG9yZGVyLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7IGkrKykgeworICAgICAgYXNzZXJ0TnVsbChtYXAxLnB1dChpLCBpICsgMSkpOworICAgICAgYXNzZXJ0TnVsbChtYXAyLnB1dChpLCBpICsgMSkpOworICAgIH0KKyAgICAvLyBUZXN0IHdpdGggcHV0cyBpbiBkZXNjZW5kaW5nIG9yZGVyLgorICAgIGZvciAoaW50IGkgPSBudW1FbGVtZW50cyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBhc3NlcnROdWxsKG1hcDMucHV0KGksIGkgKyAxKSk7CisgICAgICBhc3NlcnROdWxsKG1hcDQucHV0KGksIGkgKyAxKSk7CisgICAgfQorCisgICAgYXNzZXJ0RXF1YWxzKE1hdGgubWluKDMsIG51bUVsZW1lbnRzKSwgbWFwMS5nZXROdW1BcnJheUVudHJpZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKE1hdGgubWluKDQsIG51bUVsZW1lbnRzKSwgbWFwMi5nZXROdW1BcnJheUVudHJpZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKE1hdGgubWluKDMsIG51bUVsZW1lbnRzKSwgbWFwMy5nZXROdW1BcnJheUVudHJpZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKE1hdGgubWluKDQsIG51bUVsZW1lbnRzKSwgbWFwNC5nZXROdW1BcnJheUVudHJpZXMoKSk7CisKKyAgICBMaXN0PFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+PiBhbGxNYXBzID0KKyAgICAgICAgbmV3IEFycmF5TGlzdDxTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPj4oKTsKKyAgICBhbGxNYXBzLmFkZChtYXAxKTsKKyAgICBhbGxNYXBzLmFkZChtYXAyKTsKKyAgICBhbGxNYXBzLmFkZChtYXAzKTsKKyAgICBhbGxNYXBzLmFkZChtYXA0KTsKKworICAgIGZvciAoU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwIDogYWxsTWFwcykgeworICAgICAgYXNzZXJ0RXF1YWxzKG51bUVsZW1lbnRzLCBtYXAuc2l6ZSgpKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7IGkrKykgeworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSArIDEpLCBtYXAuZ2V0KGkpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnRFcXVhbHMobWFwMSwgbWFwMik7CisgICAgYXNzZXJ0RXF1YWxzKG1hcDIsIG1hcDMpOworICAgIGFzc2VydEVxdWFscyhtYXAzLCBtYXA0KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNpbmdQdXQoKSB7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKKyAgICAgIGFzc2VydE51bGwobWFwLnJlbW92ZShpICsgMSkpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkgKyAxKSwgbWFwLnB1dChpLCBpICsgMikpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKKyAgICAgIGFzc2VydE51bGwobWFwLnJlbW92ZShpICsgMSkpOworICAgIH0KKworICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscyg2LCAgbWFwLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1ha2VTb3J0ZWRLZXlTZXQoMCwgMSwgMiwgMywgNCwgNSksIG1hcC5rZXlTZXQoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMiksIG1hcC5yZW1vdmUoMSkpOworICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygyLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscyg1LCAgbWFwLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1ha2VTb3J0ZWRLZXlTZXQoMCwgMiwgMywgNCwgNSksIG1hcC5rZXlTZXQoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNSksIG1hcC5yZW1vdmUoNCkpOworICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygxLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscyg0LCAgbWFwLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG1ha2VTb3J0ZWRLZXlTZXQoMCwgMiwgMywgNSksIG1hcC5rZXlTZXQoKSk7CisKKyAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNCksIG1hcC5yZW1vdmUoMykpOworICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygzLCBtYXAuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobWFrZVNvcnRlZEtleVNldCgwLCAyLCA1KSwgbWFwLmtleVNldCgpKTsKKworICAgIGFzc2VydE51bGwobWFwLnJlbW92ZSgzKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5zaXplKCkpOworCisgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEpLCBtYXAucmVtb3ZlKDApKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLmdldE51bU92ZXJmbG93RW50cmllcygpKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLnNpemUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKKyAgICB9CisgICAgbWFwLmNsZWFyKCk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5zaXplKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEdldEFycmF5RW50cnlBbmRPdmVyZmxvd0VudHJpZXMoKSB7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBlbnRyeSA9IG1hcC5nZXRBcnJheUVudHJ5QXQoaSk7CisgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSksIGVudHJ5LmdldEtleSgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpICsgMSksIGVudHJ5LmdldFZhbHVlKCkpOworICAgIH0KKyAgICBJdGVyYXRvcjxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGl0ID0KKyAgICAgICAgbWFwLmdldE92ZXJmbG93RW50cmllcygpLml0ZXJhdG9yKCk7CisgICAgZm9yIChpbnQgaSA9IDM7IGkgPCA2OyBpKyspIHsKKyAgICAgIGFzc2VydFRydWUoaXQuaGFzTmV4dCgpKTsKKyAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBlbnRyeSA9IGl0Lm5leHQoKTsKKyAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpKSwgZW50cnkuZ2V0S2V5KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkgKyAxKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgfQorICAgIGFzc2VydEZhbHNlKGl0Lmhhc05leHQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RW50cnlTZXRDb250YWlucygpIHsKKyAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOworICAgIH0KKyAgICBTZXQ8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBlbnRyeVNldCA9IG1hcC5lbnRyeVNldCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgIGVudHJ5U2V0LmNvbnRhaW5zKG5ldyBTaW1wbGVFbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPihpLCBpICsgMSkpKTsKKyAgICAgIGFzc2VydEZhbHNlKAorICAgICAgICAgIGVudHJ5U2V0LmNvbnRhaW5zKG5ldyBTaW1wbGVFbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPihpLCBpKSkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbnRyeVNldEFkZCgpIHsKKyAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7CisgICAgU2V0PE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gZW50cnlTZXQgPSBtYXAuZW50cnlTZXQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGVudHJ5ID0KKyAgICAgICAgICBuZXcgU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4oaSwgaSArIDEpOworICAgICAgYXNzZXJ0VHJ1ZShlbnRyeVNldC5hZGQoZW50cnkpKTsKKyAgICAgIGFzc2VydEZhbHNlKGVudHJ5U2V0LmFkZChlbnRyeSkpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkgKyAxKSwgbWFwLmdldChpKSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscyg2LCBtYXAuc2l6ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbnRyeVNldFJlbW92ZSgpIHsKKyAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7CisgICAgU2V0PE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gZW50cnlTZXQgPSBtYXAuZW50cnlTZXQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZW50cnkgPQorICAgICAgICAgIG5ldyBTaW1wbGVFbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPihpLCBpICsgMSk7CisgICAgICBhc3NlcnRUcnVlKGVudHJ5U2V0LnJlbW92ZShlbnRyeSkpOworICAgICAgYXNzZXJ0RmFsc2UoZW50cnlTZXQucmVtb3ZlKGVudHJ5KSk7CisgICAgfQorICAgIGFzc2VydFRydWUobWFwLmlzRW1wdHkoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5zaXplKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEVudHJ5U2V0Q2xlYXIoKSB7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKKyAgICB9CisgICAgbWFwLmVudHJ5U2V0KCkuY2xlYXIoKTsKKyAgICBhc3NlcnRUcnVlKG1hcC5pc0VtcHR5KCkpOworICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOworICAgIGFzc2VydEVxdWFscygwLCBtYXAuc2l6ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbnRyeVNldEl0ZXJhdG9yTmV4dCgpIHsKKyAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOworICAgIH0KKyAgICBJdGVyYXRvcjxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0VHJ1ZShpdC5oYXNOZXh0KCkpOworICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGVudHJ5ID0gaXQubmV4dCgpOworICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSArIDEpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICB9CisgICAgYXNzZXJ0RmFsc2UoaXQuaGFzTmV4dCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFbnRyeVNldEl0ZXJhdG9yUmVtb3ZlKCkgeworICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7CisgICAgfQorICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleShpKSk7CisgICAgICBpdC5uZXh0KCk7CisgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgIGFzc2VydEZhbHNlKG1hcC5jb250YWluc0tleShpKSk7CisgICAgICBhc3NlcnRFcXVhbHMoNiAtIGkgLSAxLCBtYXAuc2l6ZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TWFwRW50cnlNb2RpZmljYXRpb24oKSB7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKKyAgICB9CisgICAgSXRlcmF0b3I8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBlbnRyeSA9IGl0Lm5leHQoKTsKKyAgICAgIGVudHJ5LnNldFZhbHVlKGkgKyAyMyk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSArIDIzKSwgbWFwLmdldChpKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE1ha2VJbW11dGFibGUoKSB7CisgICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKKyAgICB9CisgICAgbWFwLm1ha2VJbW11dGFibGUoKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMSksIG1hcC5nZXQoMCkpOworICAgIGFzc2VydEVxdWFscyg2LCBtYXAuc2l6ZSgpKTsKKworICAgIHRyeSB7CisgICAgICBtYXAucHV0KDIzLCAyMyk7CisgICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgfQorCisgICAgTWFwPEludGVnZXIsIEludGVnZXI+IG90aGVyID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKKyAgICBvdGhlci5wdXQoMjMsIDIzKTsKKyAgICB0cnkgeworICAgICAgbWFwLnB1dEFsbChvdGhlcik7CisgICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIG1hcC5yZW1vdmUoMCk7CisgICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIG1hcC5jbGVhcigpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgIH0KKworICAgIFNldDxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGVudHJ5U2V0ID0gbWFwLmVudHJ5U2V0KCk7CisgICAgdHJ5IHsKKyAgICAgIGVudHJ5U2V0LmNsZWFyKCk7CisgICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgfQorCisgICAgSXRlcmF0b3I8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBpdCA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7CisgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGVudHJ5ID0gaXQubmV4dCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgZW50cnkuc2V0VmFsdWUoMCk7CisgICAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgfQorICAgIH0KKworICAgIFNldDxJbnRlZ2VyPiBrZXlTZXQgPSBtYXAua2V5U2V0KCk7CisgICAgdHJ5IHsKKyAgICAgIGtleVNldC5jbGVhcigpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgIH0KKworICAgIEl0ZXJhdG9yPEludGVnZXI+IGtleXMgPSBrZXlTZXQuaXRlcmF0b3IoKTsKKyAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgIEludGVnZXIga2V5ID0ga2V5cy5uZXh0KCk7CisgICAgICB0cnkgeworICAgICAgICBrZXlTZXQucmVtb3ZlKGtleSk7CisgICAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAga2V5cy5yZW1vdmUoKTsKKyAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTZXQ8SW50ZWdlcj4gbWFrZVNvcnRlZEtleVNldChJbnRlZ2VyLi4uIGtleXMpIHsKKyAgICByZXR1cm4gbmV3IFRyZWVTZXQ8SW50ZWdlcj4oQXJyYXlzLjxJbnRlZ2VyPmFzTGlzdChrZXlzKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0QmFkSWRlbnRpZmllcnMuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0QmFkSWRlbnRpZmllcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmVlYzRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Rlc3RCYWRJZGVudGlmaWVycy5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0cyB0aGF0IHByb3RvMiBhcGkgZ2VuZXJhdGlvbiBkb2Vzbid0IGNhdXNlIGNvbXBpbGUgZXJyb3JzIHdoZW4KKyAqIGNvbXBpbGluZyBwcm90b2NvbCBidWZmZXJzIHRoYXQgaGF2ZSBuYW1lcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBjb25mbGljdAorICogaWYgbm90IGZ1bGx5IHF1YWxpZmllZCAobGlrZSBARGVwcmVjYXRlZCBhbmQgQE92ZXJyaWRlKS4gCisgKgorICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QmFkSWRlbnRpZmllcnMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdENvbXBpbGF0aW9uKCkgeworICAgIC8vIElmIHRoaXMgY29tcGlsZXMsIGl0IG1lYW5zIHRoZSBnZW5lcmF0aW9uIHdhcyBjb3JyZWN0LgorICAgIFRlc3RCYWRJZGVudGlmaWVyc1Byb3RvLkRlcHJlY2F0ZWQubmV3QnVpbGRlcigpOworICAgIFRlc3RCYWRJZGVudGlmaWVyc1Byb3RvLk92ZXJyaWRlLm5ld0J1aWxkZXIoKTsKKyAgfSAKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0VXRpbC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Rlc3RVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwOWY0MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0VXRpbC5qYXZhCkBAIC0wLDAgKzEsMzgxMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZTsKKworLy8gVGhlIHN0YXRpYyBpbXBvcnRzIGFyZSB0byBhdm9pZCAxMDArIGNoYXIgbGluZXMuICBUaGUgZm9sbG93aW5nIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0bworLy8gaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLio7CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEludDMyRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRJbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0VWludDMyRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRVaW50NjRFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdFNpbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0U2ludDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEZsb2F0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHREb3VibGVFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEJvb2xFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdFN0cmluZ0V4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0Qnl0ZXNFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0Q29yZEV4dGVuc2lvbjsKKworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFVpbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFVpbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFNpbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFNpbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEZpeGVkMzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEZsb2F0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsQm9vbEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFN0cmluZ0V4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEJ5dGVzRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsR3JvdXBFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsQ29yZEV4dGVuc2lvbjsKKworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFVpbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFNpbnQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEZpeGVkMzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEZsb2F0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkQm9vbEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFN0cmluZ0V4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkR3JvdXBFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkQ29yZEV4dGVuc2lvbjsKKworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uOworCitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkSW50MzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkSW50NjRFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkVWludDMyRXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZFVpbnQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRTaW50MzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkU2ludDY0RXh0ZW5zaW9uOworaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZEZpeGVkMzJFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkRml4ZWQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRTZml4ZWQzMkV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRGbG9hdEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWREb3VibGVFeHRlbnNpb247CitpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkQm9vbEV4dGVuc2lvbjsKK2ltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRFbnVtRXh0ZW5zaW9uOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRJbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRJbnQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRVaW50MzJFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0VWludDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFNpbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRTaW50NjRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEZsb2F0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRCb29sRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFN0cmluZ0V4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRCeXRlc0V4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0Q29yZEV4dGVuc2lvbkxpdGU7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50NjRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFVpbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsVWludDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFNpbnQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxTdHJpbmdFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEJ5dGVzRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsQ29yZEV4dGVuc2lvbkxpdGU7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGU7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkVWludDMyRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkVWludDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkU2ludDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkRml4ZWQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZEZpeGVkNjRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkRmxvYXRFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWREb3VibGVFeHRlbnNpb25MaXRlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkRW51bUV4dGVuc2lvbkxpdGU7CisKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbEV4dGVuc2lvbnNPckJ1aWxkZXI7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXNPckJ1aWxkZXI7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UGFja2VkRXh0ZW5zaW9uczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RQYWNrZWRUeXBlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RVbnBhY2tlZFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduRW51bTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QuVW5pdHRlc3RJbXBvcnQuSW1wb3J0TWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QuVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bTsKKworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxUeXBlc0xpdGU7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdEFsbEV4dGVuc2lvbnNMaXRlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxFeHRlbnNpb25zTGl0ZU9yQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGU7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuRm9yZWlnbk1lc3NhZ2VMaXRlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLkZvcmVpZ25FbnVtTGl0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0SW1wb3J0TGl0ZS5JbXBvcnRNZXNzYWdlTGl0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0SW1wb3J0TGl0ZS5JbXBvcnRFbnVtTGl0ZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CisKKy8qKgorICogQ29udGFpbnMgbWV0aG9kcyBmb3Igc2V0dGluZyBhbGwgZmllbGRzIG9mIHtAY29kZSBUZXN0QWxsVHlwZXN9IHRvCisgKiBzb21lIHZhdWxlcyBhcyB3ZWxsIGFzIGNoZWNraW5nIHRoYXQgYWxsIHRoZSBmaWVsZHMgYXJlIHNldCB0byB0aG9zZSB2YWx1ZXMuCisgKiBUaGVzZSBhcmUgdXNlZnVsIGZvciB0ZXN0aW5nIHZhcmlvdXMgcHJvdG9jb2wgbWVzc2FnZSBmZWF0dXJlcywgZS5nLgorICogc2V0IGFsbCBmaWVsZHMgb2YgYSBtZXNzYWdlLCBzZXJpYWxpemUgaXQsIHBhcnNlIGl0LCBhbmQgY2hlY2sgdGhhdCBhbGwKKyAqIGZpZWxkcyBhcmUgc2V0LgorICoKKyAqIDxwPlRoaXMgY29kZSBpcyBub3QgdG8gYmUgdXNlZCBvdXRzaWRlIG9mIHtAY29kZSBjb20uZ29vZ2xlLnByb3RvYnVmfSBhbmQKKyAqIHN1YnBhY2thZ2VzLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUZXN0VXRpbCB7CisgIHByaXZhdGUgVGVzdFV0aWwoKSB7fQorCisgIC8qKiBIZWxwZXIgdG8gY29udmVydCBhIFN0cmluZyB0byBCeXRlU3RyaW5nLiAqLworICBzdGF0aWMgQnl0ZVN0cmluZyB0b0J5dGVzKFN0cmluZyBzdHIpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oc3RyLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICB9IGNhdGNoKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVVRGLTggbm90IHN1cHBvcnRlZC4iLCBlKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IGEge0Bjb2RlIFRlc3RBbGxUeXBlc30gd2l0aCBhbGwgZmllbGRzIHNldCBhcyB0aGV5IHdvdWxkIGJlIGJ5CisgICAqIHtAbGluayAjc2V0QWxsRmllbGRzKFRlc3RBbGxUeXBlcy5CdWlsZGVyKX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBnZXRBbGxTZXQoKSB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgc2V0QWxsRmllbGRzKGJ1aWxkZXIpOworICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgIH0KKworICAvKioKKyAgICogR2V0IGEge0Bjb2RlIFRlc3RBbGxFeHRlbnNpb25zfSB3aXRoIGFsbCBmaWVsZHMgc2V0IGFzIHRoZXkgd291bGQgYmUgYnkKKyAgICoge0BsaW5rICNzZXRBbGxFeHRlbnNpb25zKFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIpfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgZ2V0QWxsRXh0ZW5zaW9uc1NldCgpIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7CisgICAgc2V0QWxsRXh0ZW5zaW9ucyhidWlsZGVyKTsKKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgZ2V0QWxsTGl0ZUV4dGVuc2lvbnNTZXQoKSB7CisgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCk7CisgICAgc2V0QWxsRXh0ZW5zaW9ucyhidWlsZGVyKTsKKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgZ2V0UGFja2VkU2V0KCkgeworICAgIFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UGFja2VkVHlwZXMubmV3QnVpbGRlcigpOworICAgIHNldFBhY2tlZEZpZWxkcyhidWlsZGVyKTsKKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlcyBnZXRVbnBhY2tlZFNldCgpIHsKKyAgICBUZXN0VW5wYWNrZWRUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0VW5wYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgc2V0VW5wYWNrZWRGaWVsZHMoYnVpbGRlcik7CisgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgZ2V0UGFja2VkRXh0ZW5zaW9uc1NldCgpIHsKKyAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UGFja2VkRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7CisgICAgc2V0UGFja2VkRXh0ZW5zaW9ucyhidWlsZGVyKTsKKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgZ2V0TGl0ZVBhY2tlZEV4dGVuc2lvbnNTZXQoKSB7CisgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCk7CisgICAgc2V0UGFja2VkRXh0ZW5zaW9ucyhidWlsZGVyKTsKKyAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICB9CisKKyAgLyoqCisgICAqIFNldCBldmVyeSBmaWVsZCBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gdGhlIHZhbHVlcyBleHBlY3RlZCBieQorICAgKiB7QGNvZGUgYXNzZXJ0QWxsRmllbGRzU2V0KCl9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldEFsbEZpZWxkcyhUZXN0QWxsVHlwZXMuQnVpbGRlciBtZXNzYWdlKSB7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbEludDMyICAgKDEwMSk7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbEludDY0ICAgKDEwMik7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbFVpbnQzMiAgKDEwMyk7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbFVpbnQ2NCAgKDEwNCk7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbFNpbnQzMiAgKDEwNSk7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbFNpbnQ2NCAgKDEwNik7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbEZpeGVkMzIgKDEwNyk7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbEZpeGVkNjQgKDEwOCk7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbFNmaXhlZDMyKDEwOSk7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbFNmaXhlZDY0KDExMCk7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbEZsb2F0ICAgKDExMSk7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbERvdWJsZSAgKDExMik7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbEJvb2wgICAgKHRydWUpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxTdHJpbmcgICgiMTE1Iik7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbEJ5dGVzICAgKHRvQnl0ZXMoIjExNiIpKTsKKworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxHcm91cCgKKyAgICAgIFRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwLm5ld0J1aWxkZXIoKS5zZXRBKDExNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoCisgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMTE4KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoCisgICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygxMTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlKAorICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCgxMjApLmJ1aWxkKCkpOworCisgICAgbWVzc2FnZS5zZXRPcHRpb25hbE5lc3RlZEVudW0gKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWik7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbEZvcmVpZ25FbnVtKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKTsKKyAgICBtZXNzYWdlLnNldE9wdGlvbmFsSW1wb3J0RW51bSAoSW1wb3J0RW51bS5JTVBPUlRfQkFaKTsKKworICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxTdHJpbmdQaWVjZSgiMTI0Iik7CisgICAgbWVzc2FnZS5zZXRPcHRpb25hbENvcmQoIjEyNSIpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRJbnQzMiAgICgyMDEpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRJbnQ2NCAgICgyMDIpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRVaW50MzIgICgyMDMpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRVaW50NjQgICgyMDQpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTaW50MzIgICgyMDUpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTaW50NjQgICgyMDYpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaXhlZDMyICgyMDcpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaXhlZDY0ICgyMDgpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTZml4ZWQzMigyMDkpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTZml4ZWQ2NCgyMTApOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGbG9hdCAgICgyMTEpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWREb3VibGUgICgyMTIpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRCb29sICAgICh0cnVlKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU3RyaW5nICAoIjIxNSIpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRCeXRlcyAgICh0b0J5dGVzKCIyMTYiKSk7CisKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkR3JvdXAoCisgICAgICBUZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cC5uZXdCdWlsZGVyKCkuc2V0QSgyMTcpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKAorICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDIxOCkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKAorICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMjE5KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW1wb3J0TWVzc2FnZSgKKyAgICAgIEltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEQoMjIwKS5idWlsZCgpKTsKKworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtIChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGb3JlaWduRW51bShGb3JlaWduRW51bS5GT1JFSUdOX0JBUik7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEltcG9ydEVudW0gKEltcG9ydEVudW0uSU1QT1JUX0JBUik7CisKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU3RyaW5nUGllY2UoIjIyNCIpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRDb3JkKCIyMjUiKTsKKworICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW50MzIgICAoMzAxKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW50NjQgICAoMzAyKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkVWludDMyICAoMzAzKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkVWludDY0ICAoMzA0KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ludDMyICAoMzA1KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ludDY0ICAoMzA2KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRml4ZWQzMiAoMzA3KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRml4ZWQ2NCAoMzA4KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ZpeGVkMzIoMzA5KTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ZpeGVkNjQoMzEwKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmxvYXQgICAoMzExKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRG91YmxlICAoMzEyKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkQm9vbCAgICAoZmFsc2UpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTdHJpbmcgICgiMzE1Iik7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEJ5dGVzICAgKHRvQnl0ZXMoIjMxNiIpKTsKKworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRHcm91cCgKKyAgICAgIFRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLm5ld0J1aWxkZXIoKS5zZXRBKDMxNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoCisgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMzE4KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoCisgICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygzMTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRJbXBvcnRNZXNzYWdlKAorICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCgzMjApLmJ1aWxkKCkpOworCisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZE5lc3RlZEVudW0gKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWik7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZvcmVpZ25FbnVtKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKTsKKyAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW1wb3J0RW51bSAoSW1wb3J0RW51bS5JTVBPUlRfQkFaKTsKKworICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTdHJpbmdQaWVjZSgiMzI0Iik7CisgICAgbWVzc2FnZS5hZGRSZXBlYXRlZENvcmQoIjMyNSIpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEludDMyICAgKDQwMSk7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0SW50NjQgICAoNDAyKTsKKyAgICBtZXNzYWdlLnNldERlZmF1bHRVaW50MzIgICg0MDMpOworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdFVpbnQ2NCAgKDQwNCk7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0U2ludDMyICAoNDA1KTsKKyAgICBtZXNzYWdlLnNldERlZmF1bHRTaW50NjQgICg0MDYpOworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEZpeGVkMzIgKDQwNyk7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0Rml4ZWQ2NCAoNDA4KTsKKyAgICBtZXNzYWdlLnNldERlZmF1bHRTZml4ZWQzMig0MDkpOworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdFNmaXhlZDY0KDQxMCk7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0RmxvYXQgICAoNDExKTsKKyAgICBtZXNzYWdlLnNldERlZmF1bHREb3VibGUgICg0MTIpOworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEJvb2wgICAgKGZhbHNlKTsKKyAgICBtZXNzYWdlLnNldERlZmF1bHRTdHJpbmcgICgiNDE1Iik7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0Qnl0ZXMgICAodG9CeXRlcygiNDE2IikpOworCisgICAgbWVzc2FnZS5zZXREZWZhdWx0TmVzdGVkRW51bSAoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PKTsKKyAgICBtZXNzYWdlLnNldERlZmF1bHRGb3JlaWduRW51bShGb3JlaWduRW51bS5GT1JFSUdOX0ZPTyk7CisgICAgbWVzc2FnZS5zZXREZWZhdWx0SW1wb3J0RW51bSAoSW1wb3J0RW51bS5JTVBPUlRfRk9PKTsKKworICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdFN0cmluZ1BpZWNlKCI0MjQiKTsKKyAgICBtZXNzYWdlLnNldERlZmF1bHRDb3JkKCI0MjUiKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKioKKyAgICogTW9kaWZ5IHRoZSByZXBlYXRlZCBmaWVsZHMgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIGNvbnRhaW4gdGhlIHZhbHVlcworICAgKiBleHBlY3RlZCBieSB7QGNvZGUgYXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZCgpfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlSZXBlYXRlZEZpZWxkcyhUZXN0QWxsVHlwZXMuQnVpbGRlciBtZXNzYWdlKSB7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEludDMyICAgKDEsIDUwMSk7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEludDY0ICAgKDEsIDUwMik7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZFVpbnQzMiAgKDEsIDUwMyk7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZFVpbnQ2NCAgKDEsIDUwNCk7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZFNpbnQzMiAgKDEsIDUwNSk7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZFNpbnQ2NCAgKDEsIDUwNik7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpeGVkMzIgKDEsIDUwNyk7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpeGVkNjQgKDEsIDUwOCk7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZFNmaXhlZDMyKDEsIDUwOSk7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZFNmaXhlZDY0KDEsIDUxMCk7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZsb2F0ICAgKDEsIDUxMSk7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZERvdWJsZSAgKDEsIDUxMik7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEJvb2wgICAgKDEsIHRydWUpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRTdHJpbmcgICgxLCAiNTE1Iik7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEJ5dGVzICAgKDEsIHRvQnl0ZXMoIjUxNiIpKTsKKworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRHcm91cCgxLAorICAgICAgVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAubmV3QnVpbGRlcigpLnNldEEoNTE3KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgxLAorICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDUxOCkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDEsCisgICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0Qyg1MTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlKDEsCisgICAgICBJbXBvcnRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXREKDUyMCkuYnVpbGQoKSk7CisKKyAgICBtZXNzYWdlLnNldFJlcGVhdGVkTmVzdGVkRW51bSAoMSwgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PKTsKKyAgICBtZXNzYWdlLnNldFJlcGVhdGVkRm9yZWlnbkVudW0oMSwgRm9yZWlnbkVudW0uRk9SRUlHTl9GT08pOworICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRJbXBvcnRFbnVtICgxLCBJbXBvcnRFbnVtLklNUE9SVF9GT08pOworCisgICAgbWVzc2FnZS5zZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDEsICI1MjQiKTsKKyAgICBtZXNzYWdlLnNldFJlcGVhdGVkQ29yZCgxLCAiNTI1Iik7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKKyAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRmllbGRzfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBbGxGaWVsZHNTZXQoVGVzdEFsbFR5cGVzT3JCdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsSW50MzIgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEludDY0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxVaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsVWludDY0ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFNpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsRml4ZWQzMiAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZpeGVkNjQgKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTZml4ZWQzMigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsU2ZpeGVkNjQoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZsb2F0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxEb3VibGUgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsQm9vbCAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFN0cmluZyAgKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxCeXRlcyAgICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxHcm91cCAgICAgICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSAoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxHcm91cCAgICAgICAgICgpLmhhc0EoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UgKCkuaGFzQmIoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkuaGFzQygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldE9wdGlvbmFsSW1wb3J0TWVzc2FnZSAoKS5oYXNEKCkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbE5lc3RlZEVudW0gKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGb3JlaWduRW51bSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsSW1wb3J0RW51bSAoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsU3RyaW5nUGllY2UoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbENvcmQoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwMSAgLCBtZXNzYWdlLmdldE9wdGlvbmFsSW50MzIgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDIgICwgbWVzc2FnZS5nZXRPcHRpb25hbEludDY0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAzICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxVaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNCAgLCBtZXNzYWdlLmdldE9wdGlvbmFsVWludDY0ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDUgICwgbWVzc2FnZS5nZXRPcHRpb25hbFNpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA2ICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNyAgLCBtZXNzYWdlLmdldE9wdGlvbmFsRml4ZWQzMiAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDggICwgbWVzc2FnZS5nZXRPcHRpb25hbEZpeGVkNjQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA5ICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTZml4ZWQzMigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExMCAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTEgICwgbWVzc2FnZS5nZXRPcHRpb25hbEZsb2F0ICAgKCksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTIgICwgbWVzc2FnZS5nZXRPcHRpb25hbERvdWJsZSAgKCksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRPcHRpb25hbEJvb2wgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjExNSIsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTdHJpbmcgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjExNiIpLCBtZXNzYWdlLmdldE9wdGlvbmFsQnl0ZXMoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExNywgbWVzc2FnZS5nZXRPcHRpb25hbEdyb3VwICAgICAgICAgKCkuZ2V0QSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExOCwgbWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UgKCkuZ2V0QmIoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTksIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpLmdldEMoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMjAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlICgpLmdldEQoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWiwgbWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZEVudW0oKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwgbWVzc2FnZS5nZXRPcHRpb25hbEZvcmVpZ25FbnVtKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSW1wb3J0RW51bS5JTVBPUlRfQkFaLCBtZXNzYWdlLmdldE9wdGlvbmFsSW1wb3J0RW51bSgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjEyNCIsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTdHJpbmdQaWVjZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjUiLCBtZXNzYWdlLmdldE9wdGlvbmFsQ29yZCgpKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMkNvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0Q291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjRDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMkNvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0Q291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyQ291bnQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjRDb3VudCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzJDb3VudCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NENvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0Q291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRG91YmxlQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sQ291bnQgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ0NvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXNDb3VudCAgICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEdyb3VwQ291bnQgICAgICAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUNvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2VDb3VudCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bUNvdW50ICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bUNvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydEVudW1Db3VudCAgICAoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUNvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZENvcmRDb3VudCgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMiAgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDIgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0ICAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA0ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjQgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMiAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNiAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0ICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDggICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjQgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzIoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEwICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NCgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0ICAgKDApLCAwLjApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEyICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGUgICgwKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldFJlcGVhdGVkQm9vbCAgICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmcgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzKDApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE3LCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXAgICAgICAgICAoMCkuZ2V0QSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxOCwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UgKDApLmdldEJiKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE5LCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIyMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UgKDApLmdldEQoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW0gKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW0oMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSW1wb3J0RW51bS5JTVBPUlRfQkFSLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bSgwKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nUGllY2UoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRDb3JkKDApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMiAgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDIgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0ICAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA0ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjQgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMiAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwNiAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0ICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDggICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjQgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzIoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzEwICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NCgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0ICAgKDEpLCAwLjApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzEyICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGUgICgxKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldFJlcGVhdGVkQm9vbCAgICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjMxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmcgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCIzMTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzKDEpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzE3LCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXAgICAgICAgICAoMSkuZ2V0QSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxOCwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UgKDEpLmdldEJiKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzE5LCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMSkuZ2V0QygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMyMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UgKDEpLmdldEQoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWiwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW0gKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW0oMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSW1wb3J0RW51bS5JTVBPUlRfQkFaLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bSgxKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzMjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nUGllY2UoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjMyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRDb3JkKDEpKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRJbnQzMiAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRJbnQ2NCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRVaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRVaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRTaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRTaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRGaXhlZDMyICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRGaXhlZDY0ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRTZml4ZWQzMigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRTZml4ZWQ2NCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRGbG9hdCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHREb3VibGUgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRCb29sICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRTdHJpbmcgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRCeXRlcyAgICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdE5lc3RlZEVudW0gKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdEZvcmVpZ25FbnVtKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdEltcG9ydEVudW0gKCkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U3RyaW5nUGllY2UoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Q29yZCgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAxICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEludDMyICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAyICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEludDY0ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAzICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFVpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA0ICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFVpbnQ2NCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA1ICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFNpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA2ICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFNpbnQ2NCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA3ICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEZpeGVkMzIgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA4ICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEZpeGVkNjQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA5ICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFNmaXhlZDMyKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDEwICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFNmaXhlZDY0KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDExICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEZsb2F0ICAgKCksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MTIgICwgbWVzc2FnZS5nZXREZWZhdWx0RG91YmxlICAoKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldERlZmF1bHRCb29sICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI0MTUiLCBtZXNzYWdlLmdldERlZmF1bHRTdHJpbmcgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjQxNiIpLCBtZXNzYWdlLmdldERlZmF1bHRCeXRlcygpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLCBtZXNzYWdlLmdldERlZmF1bHROZXN0ZWRFbnVtICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLCBtZXNzYWdlLmdldERlZmF1bHRGb3JlaWduRW51bSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEltcG9ydEVudW0uSU1QT1JUX0ZPTywgbWVzc2FnZS5nZXREZWZhdWx0SW1wb3J0RW51bSgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjQyNCIsIG1lc3NhZ2UuZ2V0RGVmYXVsdFN0cmluZ1BpZWNlKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjQyNSIsIG1lc3NhZ2UuZ2V0RGVmYXVsdENvcmQoKSk7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8qKgorICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZmllbGRzIG9mCisgICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgY2xlYXJlZCwgYW5kIHRoYXQgZ2V0dGluZyB0aGUgZmllbGRzIHJldHVybnMgdGhlaXIKKyAgICogZGVmYXVsdCB2YWx1ZXMuCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0Q2xlYXIoVGVzdEFsbFR5cGVzT3JCdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICAvLyBoYXNCbGFoKCkgc2hvdWxkIGluaXRpYWxseSBiZSBmYWxzZSBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcy4KKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEludDMyICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsSW50NjQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxVaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFVpbnQ2NCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsU2ludDMyICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEZpeGVkMzIgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsRml4ZWQ2NCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTZml4ZWQzMigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFNmaXhlZDY0KCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsRmxvYXQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxEb3VibGUgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEJvb2wgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsU3RyaW5nICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxCeXRlcyAgICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsR3JvdXAgICAgICAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSAoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbE5lc3RlZEVudW0gKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsRm9yZWlnbkVudW0oKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbXBvcnRFbnVtICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsU3RyaW5nUGllY2UoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxDb3JkKCkpOworCisgICAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbnQzMiAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsSW50NjQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbFVpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxVaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ludDMyICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbFNpbnQ2NCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGaXhlZDMyICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsRml4ZWQ2NCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbFNmaXhlZDMyKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTZml4ZWQ2NCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsRmxvYXQgICAoKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsRG91YmxlICAoKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldE9wdGlvbmFsQm9vbCAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiAgICwgbWVzc2FnZS5nZXRPcHRpb25hbFN0cmluZyAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQnl0ZVN0cmluZy5FTVBUWSwgbWVzc2FnZS5nZXRPcHRpb25hbEJ5dGVzKCkpOworCisgICAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxHcm91cCAgICAgICAgICgpLmhhc0EoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlICgpLmhhc0JiKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKS5oYXNDKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldE9wdGlvbmFsSW1wb3J0TWVzc2FnZSAoKS5oYXNEKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsR3JvdXAgICAgICAgICAoKS5nZXRBKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UgKCkuZ2V0QmIoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKS5nZXRDKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRPcHRpb25hbEltcG9ydE1lc3NhZ2UgKCkuZ2V0RCgpKTsKKworICAgIC8vIEVudW1zIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGVudW0uCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sIG1lc3NhZ2UuZ2V0T3B0aW9uYWxOZXN0ZWRFbnVtICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLCBtZXNzYWdlLmdldE9wdGlvbmFsRm9yZWlnbkVudW0oKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJbXBvcnRFbnVtLklNUE9SVF9GT08sIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbXBvcnRFbnVtKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiwgbWVzc2FnZS5nZXRPcHRpb25hbFN0cmluZ1BpZWNlKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiIsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxDb3JkKCkpOworCisgICAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMkNvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0Q291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjRDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMkNvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0Q291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyQ291bnQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjRDb3VudCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzJDb3VudCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NENvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0Q291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRG91YmxlQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sQ291bnQgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ0NvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXNDb3VudCAgICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEdyb3VwQ291bnQgICAgICAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUNvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2VDb3VudCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bUNvdW50ICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bUNvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydEVudW1Db3VudCAgICAoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUNvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZENvcmRDb3VudCgpKTsKKworICAgIC8vIGhhc0JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRJbnQzMiAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0SW50NjQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFVpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRVaW50NjQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0U2ludDMyICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFNpbnQ2NCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRGaXhlZDMyICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0Rml4ZWQ2NCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFNmaXhlZDMyKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTZml4ZWQ2NCgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0RmxvYXQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdERvdWJsZSAgKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRCb29sICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0U3RyaW5nICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEJ5dGVzICAgKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdE5lc3RlZEVudW0gKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRGb3JlaWduRW51bSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0SW1wb3J0RW51bSAoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0U3RyaW5nUGllY2UoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdENvcmQoKSk7CisKKyAgICAvLyBGaWVsZHMgd2l0aCBkZWZhdWx0cyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzIChkdWgpLgorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQxICAgICwgbWVzc2FnZS5nZXREZWZhdWx0SW50MzIgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDIgICAgLCBtZXNzYWdlLmdldERlZmF1bHRJbnQ2NCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0MyAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFVpbnQzMiAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ0ICAgICwgbWVzc2FnZS5nZXREZWZhdWx0VWludDY0ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtNDUgICAgLCBtZXNzYWdlLmdldERlZmF1bHRTaW50MzIgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0NiAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFNpbnQ2NCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ3ICAgICwgbWVzc2FnZS5nZXREZWZhdWx0Rml4ZWQzMiAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDggICAgLCBtZXNzYWdlLmdldERlZmF1bHRGaXhlZDY0ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0OSAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFNmaXhlZDMyKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTUwICAgICwgbWVzc2FnZS5nZXREZWZhdWx0U2ZpeGVkNjQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNTEuNSAgLCBtZXNzYWdlLmdldERlZmF1bHRGbG9hdCAgICgpLCAwLjApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDUyZTMgICwgbWVzc2FnZS5nZXREZWZhdWx0RG91YmxlICAoKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEJvb2wgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImhlbGxvIiwgbWVzc2FnZS5nZXREZWZhdWx0U3RyaW5nICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCJ3b3JsZCIpLCBtZXNzYWdlLmdldERlZmF1bHRCeXRlcygpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLCBtZXNzYWdlLmdldERlZmF1bHROZXN0ZWRFbnVtICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLCBtZXNzYWdlLmdldERlZmF1bHRGb3JlaWduRW51bSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEltcG9ydEVudW0uSU1QT1JUX0JBUiwgbWVzc2FnZS5nZXREZWZhdWx0SW1wb3J0RW51bSgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImFiYyIsIG1lc3NhZ2UuZ2V0RGVmYXVsdFN0cmluZ1BpZWNlKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjEyMyIsIG1lc3NhZ2UuZ2V0RGVmYXVsdENvcmQoKSk7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKKyAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRmllbGRzfQorICAgKiBmb2xsb3dlZCBieSB7QGNvZGUgbW9kaWZ5UmVwZWF0ZWRGaWVsZHN9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWQoCisgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAorICAgIC8vIGZpZWxkLiAgSW4gYWRkaXRpb24gdG8gdmVyaWZ5aW5nIHRoaXMsIHdlIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGZpcnN0CisgICAgLy8gZWxlbWVudCBhbmQgc2l6ZSB3ZXJlICpub3QqIG1vZGlmaWVkLgorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyQ291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjRDb3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50MzJDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NENvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50NjRDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzJDb3VudCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NENvdW50ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMkNvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0Q291bnQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXRDb3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGVDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEJvb2xDb3VudCAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCeXRlc0NvdW50ICAgKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXBDb3VudCAgICAgICAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlQ291bnQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlQ291bnQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZUNvdW50ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtQ291bnQgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtQ291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bUNvdW50ICAgICgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlQ291bnQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZENvdW50KCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyICAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjQgICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAzICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50MzIgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NCAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA2TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50NjQgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzIgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NCAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA5ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMigwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0KDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXQgICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEyRCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGUgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRSZXBlYXRlZEJvb2wgICAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMTUiLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiMjE2IiksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCeXRlcygwKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxNywgbWVzc2FnZS5nZXRSZXBlYXRlZEdyb3VwICAgICAgICAgKDApLmdldEEoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTgsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlICgwKS5nZXRCYigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxOSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApLmdldEMoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMjAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlICgwKS5nZXREKCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEltcG9ydEVudW0uSU1QT1JUX0JBUiwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydEVudW0oMCkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMjI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZCgwKSk7CisKKyAgICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwMSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50MzIgICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQ2NCAgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQzMiAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwNEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDY0ICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50MzIgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQ2NCAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwNyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQzMiAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDY0ICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDMyKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxMEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkNjQoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGbG9hdCAgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZSAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldFJlcGVhdGVkQm9vbCAgICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjUxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmcgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCI1MTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzKDEpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTE3LCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXAgICAgICAgICAoMSkuZ2V0QSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxOCwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UgKDEpLmdldEJiKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTE5LCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMSkuZ2V0QygpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUyMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UgKDEpLmdldEQoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTywgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW0gKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW0oMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSW1wb3J0RW51bS5JTVBPUlRfRk9PLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bSgxKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI1MjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nUGllY2UoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjUyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRDb3JkKDEpKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgZXZlcnkgZmllbGQgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIGEgdW5pcXVlIHZhbHVlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBhY2tlZEZpZWxkcyhUZXN0UGFja2VkVHlwZXMuQnVpbGRlciBtZXNzYWdlKSB7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRJbnQzMiAgICg2MDEpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkSW50NjQgICAoNjAyKTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZFVpbnQzMiAgKDYwMyk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRVaW50NjQgICg2MDQpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkU2ludDMyICAoNjA1KTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZFNpbnQ2NCAgKDYwNik7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRGaXhlZDMyICg2MDcpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkRml4ZWQ2NCAoNjA4KTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZFNmaXhlZDMyKDYwOSk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRTZml4ZWQ2NCg2MTApOworICAgIG1lc3NhZ2UuYWRkUGFja2VkRmxvYXQgICAoNjExKTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZERvdWJsZSAgKDYxMik7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRCb29sICAgICh0cnVlKTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZEVudW0gICAgKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSKTsKKyAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgICAgbWVzc2FnZS5hZGRQYWNrZWRJbnQzMiAgICg3MDEpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkSW50NjQgICAoNzAyKTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZFVpbnQzMiAgKDcwMyk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRVaW50NjQgICg3MDQpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkU2ludDMyICAoNzA1KTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZFNpbnQ2NCAgKDcwNik7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRGaXhlZDMyICg3MDcpOworICAgIG1lc3NhZ2UuYWRkUGFja2VkRml4ZWQ2NCAoNzA4KTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZFNmaXhlZDMyKDcwOSk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRTZml4ZWQ2NCg3MTApOworICAgIG1lc3NhZ2UuYWRkUGFja2VkRmxvYXQgICAoNzExKTsKKyAgICBtZXNzYWdlLmFkZFBhY2tlZERvdWJsZSAgKDcxMik7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRCb29sICAgIChmYWxzZSk7CisgICAgbWVzc2FnZS5hZGRQYWNrZWRFbnVtICAgIChGb3JlaWduRW51bS5GT1JFSUdOX0JBWik7CisgIH0KKworICAvKioKKyAgICogU2V0IGV2ZXJ5IGZpZWxkIG9mIHtAY29kZSBtZXNzYWdlfSB0byBhIHVuaXF1ZSB2YWx1ZS4gTXVzdCBjb3JyZXNwb25kIHdpdGgKKyAgICogdGhlIHZhbHVlcyBhcHBsaWVkIGJ5IHtAY29kZSBzZXRQYWNrZWRGaWVsZHN9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVucGFja2VkRmllbGRzKFRlc3RVbnBhY2tlZFR5cGVzLkJ1aWxkZXIgbWVzc2FnZSkgeworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRJbnQzMiAgICg2MDEpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRJbnQ2NCAgICg2MDIpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRVaW50MzIgICg2MDMpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRVaW50NjQgICg2MDQpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRTaW50MzIgICg2MDUpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRTaW50NjQgICg2MDYpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRGaXhlZDMyICg2MDcpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRGaXhlZDY0ICg2MDgpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRTZml4ZWQzMig2MDkpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRTZml4ZWQ2NCg2MTApOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRGbG9hdCAgICg2MTEpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWREb3VibGUgICg2MTIpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRCb29sICAgICh0cnVlKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkRW51bSAgICAoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIpOworICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgICBtZXNzYWdlLmFkZFVucGFja2VkSW50MzIgICAoNzAxKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkSW50NjQgICAoNzAyKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkVWludDMyICAoNzAzKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkVWludDY0ICAoNzA0KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ludDMyICAoNzA1KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ludDY0ICAoNzA2KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkRml4ZWQzMiAoNzA3KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkRml4ZWQ2NCAoNzA4KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ZpeGVkMzIoNzA5KTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ZpeGVkNjQoNzEwKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkRmxvYXQgICAoNzExKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkRG91YmxlICAoNzEyKTsKKyAgICBtZXNzYWdlLmFkZFVucGFja2VkQm9vbCAgICAoZmFsc2UpOworICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRFbnVtICAgIChGb3JlaWduRW51bS5GT1JFSUdOX0JBWik7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGZpZWxkcyBvZgorICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRQYWNrZWRGaWVsZHN9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFBhY2tlZEZpZWxkc1NldChUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRJbnQzMkNvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRJbnQ2NENvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRVaW50MzJDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRVaW50NjRDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRTaW50MzJDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRTaW50NjRDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRGaXhlZDMyQ291bnQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRGaXhlZDY0Q291bnQgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRTZml4ZWQzMkNvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRTZml4ZWQ2NENvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRGbG9hdENvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWREb3VibGVDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRCb29sQ291bnQgICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRQYWNrZWRFbnVtQ291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDEgICwgbWVzc2FnZS5nZXRQYWNrZWRJbnQzMiAgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDIgICwgbWVzc2FnZS5nZXRQYWNrZWRJbnQ2NCAgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDMgICwgbWVzc2FnZS5nZXRQYWNrZWRVaW50MzIgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDQgICwgbWVzc2FnZS5nZXRQYWNrZWRVaW50NjQgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDUgICwgbWVzc2FnZS5nZXRQYWNrZWRTaW50MzIgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDYgICwgbWVzc2FnZS5nZXRQYWNrZWRTaW50NjQgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDcgICwgbWVzc2FnZS5nZXRQYWNrZWRGaXhlZDMyICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDggICwgbWVzc2FnZS5nZXRQYWNrZWRGaXhlZDY0ICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDkgICwgbWVzc2FnZS5nZXRQYWNrZWRTZml4ZWQzMigwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MTAgICwgbWVzc2FnZS5nZXRQYWNrZWRTZml4ZWQ2NCgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MTEgICwgbWVzc2FnZS5nZXRQYWNrZWRGbG9hdCAgICgwKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMiAgLCBtZXNzYWdlLmdldFBhY2tlZERvdWJsZSAgKDApLCAwLjApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0UGFja2VkQm9vbCAgICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsIG1lc3NhZ2UuZ2V0UGFja2VkRW51bSgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDEgICwgbWVzc2FnZS5nZXRQYWNrZWRJbnQzMiAgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDIgICwgbWVzc2FnZS5nZXRQYWNrZWRJbnQ2NCAgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDMgICwgbWVzc2FnZS5nZXRQYWNrZWRVaW50MzIgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDQgICwgbWVzc2FnZS5nZXRQYWNrZWRVaW50NjQgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDUgICwgbWVzc2FnZS5nZXRQYWNrZWRTaW50MzIgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDYgICwgbWVzc2FnZS5nZXRQYWNrZWRTaW50NjQgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDcgICwgbWVzc2FnZS5nZXRQYWNrZWRGaXhlZDMyICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDggICwgbWVzc2FnZS5nZXRQYWNrZWRGaXhlZDY0ICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDkgICwgbWVzc2FnZS5nZXRQYWNrZWRTZml4ZWQzMigxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTAgICwgbWVzc2FnZS5nZXRQYWNrZWRTZml4ZWQ2NCgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTEgICwgbWVzc2FnZS5nZXRQYWNrZWRGbG9hdCAgICgxKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcxMiAgLCBtZXNzYWdlLmdldFBhY2tlZERvdWJsZSAgKDEpLCAwLjApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0UGFja2VkQm9vbCAgICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosIG1lc3NhZ2UuZ2V0UGFja2VkRW51bSgxKSk7CisgIH0KKworICAvKioKKyAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGZpZWxkcyBvZgorICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRVbnBhY2tlZEZpZWxkc30uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0VW5wYWNrZWRGaWVsZHNTZXQoVGVzdFVucGFja2VkVHlwZXMgbWVzc2FnZSkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZEludDMyQ291bnQgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkSW50NjRDb3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRVaW50MzJDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZFVpbnQ2NENvdW50ICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkU2ludDMyQ291bnQgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTaW50NjRDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZEZpeGVkMzJDb3VudCAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkRml4ZWQ2NENvdW50ICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTZml4ZWQzMkNvdW50KCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZFNmaXhlZDY0Q291bnQoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkRmxvYXRDb3VudCAgICgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWREb3VibGVDb3VudCAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZEJvb2xDb3VudCAgICAoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkRW51bUNvdW50ICAgKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAxICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRJbnQzMiAgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDIgICwgbWVzc2FnZS5nZXRVbnBhY2tlZEludDY0ICAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMyAgLCBtZXNzYWdlLmdldFVucGFja2VkVWludDMyICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA0ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRVaW50NjQgICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDUgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFNpbnQzMiAgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNiAgLCBtZXNzYWdlLmdldFVucGFja2VkU2ludDY0ICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA3ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGaXhlZDMyICgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDggICwgbWVzc2FnZS5nZXRVbnBhY2tlZEZpeGVkNjQgKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwOSAgLCBtZXNzYWdlLmdldFVucGFja2VkU2ZpeGVkMzIoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjEwICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTZml4ZWQ2NCgwKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MTEgICwgbWVzc2FnZS5nZXRVbnBhY2tlZEZsb2F0ICAgKDApLCAwLjApOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjEyICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWREb3VibGUgICgwKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldFVucGFja2VkQm9vbCAgICAoMCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRFbnVtKDApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwMSAgLCBtZXNzYWdlLmdldFVucGFja2VkSW50MzIgICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAyICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRJbnQ2NCAgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDMgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFVpbnQzMiAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNCAgLCBtZXNzYWdlLmdldFVucGFja2VkVWludDY0ICAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA1ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTaW50MzIgICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDYgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFNpbnQ2NCAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNyAgLCBtZXNzYWdlLmdldFVucGFja2VkRml4ZWQzMiAoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA4ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGaXhlZDY0ICgxKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDkgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFNmaXhlZDMyKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcxMCAgLCBtZXNzYWdlLmdldFVucGFja2VkU2ZpeGVkNjQoMSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzExICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGbG9hdCAgICgxKSwgMC4wKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcxMiAgLCBtZXNzYWdlLmdldFVucGFja2VkRG91YmxlICAoMSksIDAuMCk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgbWVzc2FnZS5nZXRVbnBhY2tlZEJvb2wgICAgKDEpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLCBtZXNzYWdlLmdldFVucGFja2VkRW51bSgxKSk7CisgIH0KKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIExpa2UgYWJvdmUsIGJ1dCBmb3IgZXh0ZW5zaW9ucworCisgIC8vIEphdmEgZ2V0cyBjb25mdXNlZCB3aXRoIHRoaW5ncyBsaWtlIGFzc2VydEVxdWFscyhpbnQsIEludGVnZXIpOiAgaXQgY2FuJ3QKKyAgLy8gZGVjaWRlIHdoZXRoZXIgdG8gY2FsbCBhc3NlcnRFcXVhbHMoaW50LCBpbnQpIG9yIGFzc2VydEVxdWFscyhPYmplY3QsCisgIC8vIE9iamVjdCkuICBTbyB3ZSBkZWZpbmUgdGhlc2UgbWV0aG9kcyB0byBoZWxwIGl0LgorICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShpbnQgYSwgaW50IGIpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOworICB9CisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGxvbmcgYSwgbG9uZyBiKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKKyAgfQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmbG9hdCBhLCBmbG9hdCBiKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiLCAwLjApOworICB9CisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGRvdWJsZSBhLCBkb3VibGUgYikgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYiwgMC4wKTsKKyAgfQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShib29sZWFuIGEsIGJvb2xlYW4gYikgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoU3RyaW5nIGEsIFN0cmluZyBiKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKKyAgfQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShCeXRlU3RyaW5nIGEsIEJ5dGVTdHJpbmcgYikgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0gYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0gYikgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0gYSwgRm9yZWlnbkVudW0gYikgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bSBhLCBJbXBvcnRFbnVtIGIpIHsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOworICB9CisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0gYikgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcmVpZ25FbnVtTGl0ZSBiKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKKyAgfQorICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRFbnVtTGl0ZSBiKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgYW4gdW5tb2RpZmlhYmxlIHtAbGluayBFeHRlbnNpb25SZWdpc3RyeX0gY29udGFpbmluZyBhbGwgdGhlCisgICAqIGV4dGVuc2lvbnMgb2Yge0Bjb2RlIFRlc3RBbGxFeHRlbnNpb25zfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSB7CisgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpOworICAgIHJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7CisgICAgcmV0dXJuIHJlZ2lzdHJ5LmdldFVubW9kaWZpYWJsZSgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZ2V0RXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCkgeworICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5uZXdJbnN0YW5jZSgpOworICAgIHJlZ2lzdGVyQWxsRXh0ZW5zaW9uc0xpdGUocmVnaXN0cnkpOworICAgIHJldHVybiByZWdpc3RyeS5nZXRVbm1vZGlmaWFibGUoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZWdpc3RlciBhbGwgb2Yge0Bjb2RlIFRlc3RBbGxFeHRlbnNpb25zfSdzIGV4dGVuc2lvbnMgd2l0aCB0aGUKKyAgICogZ2l2ZW4ge0BsaW5rIEV4dGVuc2lvblJlZ2lzdHJ5fS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckFsbEV4dGVuc2lvbnMoRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsKKyAgICBVbml0dGVzdFByb3RvLnJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7CisgICAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zTGl0ZShyZWdpc3RyeSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJBbGxFeHRlbnNpb25zTGl0ZShFeHRlbnNpb25SZWdpc3RyeUxpdGUgcmVnaXN0cnkpIHsKKyAgICBVbml0dGVzdExpdGUucmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgZXZlcnkgZmllbGQgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIHRoZSB2YWx1ZXMgZXhwZWN0ZWQgYnkKKyAgICoge0Bjb2RlIGFzc2VydEFsbEV4dGVuc2lvbnNTZXQoKX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWxsRXh0ZW5zaW9ucyhUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uICAgLCAxMDEpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb24gICAsIDEwMkwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uICAsIDEwMyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb24gICwgMTA0TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb24gICwgMTA1KTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbiAgLCAxMDZMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb24gLCAxMDcpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbiAsIDEwOEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb24sIDEwOSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbiwgMTEwTCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbiAgICwgMTExRik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb24gICwgMTEyRCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uICAgICwgdHJ1ZSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb24gICwgIjExNSIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsQnl0ZXNFeHRlbnNpb24gICAsIHRvQnl0ZXMoIjExNiIpKTsKKworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb24sCisgICAgICBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5uZXdCdWlsZGVyKCkuc2V0QSgxMTcpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwKKyAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigxMTgpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sCisgICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygxMTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiwKKyAgICAgIEltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEQoMTIwKS5idWlsZCgpKTsKKworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbiwgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCBGb3JlaWduRW51bS5GT1JFSUdOX0JBWik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uLCBJbXBvcnRFbnVtLklNUE9SVF9CQVopOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbiwgIjEyNCIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbiwgIjEyNSIpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICAsIDIwMSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICwgMjAyTCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICwgMjAzKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiAgLCAyMDRMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgLCAyMDUpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICAsIDIwNkwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiAsIDIwNyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICwgMjA4TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMjA5KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAyMTBMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgLCAyMTFGKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgLCAyMTJEKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb24gICAgLCB0cnVlKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgLCAiMjE1Iik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiAgICwgdG9CeXRlcygiMjE2IikpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiwKKyAgICAgIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLm5ld0J1aWxkZXIoKS5zZXRBKDIxNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uLAorICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDIxOCkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiwKKyAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDIxOSkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uLAorICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCgyMjApLmJ1aWxkKCkpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24sIEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24sIEltcG9ydEVudW0uSU1QT1JUX0JBUik7CisKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAiMjI0Iik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAiMjI1Iik7CisKKyAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICwgMzAxKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgLCAzMDJMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgLCAzMDMpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICAsIDMwNEwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uICAsIDMwNSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICwgMzA2TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICwgMzA3KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gLCAzMDhMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAzMDkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24sIDMxMEwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb24gICAsIDMxMUYpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICAsIDMxMkQpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICAsIGZhbHNlKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgLCAiMzE1Iik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiAgICwgdG9CeXRlcygiMzE2IikpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiwKKyAgICAgIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLm5ld0J1aWxkZXIoKS5zZXRBKDMxNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uLAorICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDMxOCkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiwKKyAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDMxOSkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uLAorICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCgzMjApLmJ1aWxkKCkpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24sIEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24sIEltcG9ydEVudW0uSU1QT1JUX0JBWik7CisKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAiMzI0Iik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAiMzI1Iik7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uICAgLCA0MDEpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbiAgICwgNDAyTCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbiAgLCA0MDMpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb24gICwgNDA0TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbiAgLCA0MDUpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb24gICwgNDA2TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb24gLCA0MDcpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uICwgNDA4TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uLCA0MDkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbiwgNDEwTCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uICAgLCA0MTFGKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uICAsIDQxMkQpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uICAgICwgZmFsc2UpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb24gICwgIjQxNSIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbiAgICwgdG9CeXRlcygiNDE2IikpOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb24sIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCBGb3JlaWduRW51bS5GT1JFSUdOX0ZPTyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb24sIEltcG9ydEVudW0uSU1QT1JUX0ZPTyk7CisKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb24sICI0MjQiKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbiwgIjQyNSIpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKgorICAgKiBNb2RpZnkgdGhlIHJlcGVhdGVkIGV4dGVuc2lvbnMgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIGNvbnRhaW4gdGhlIHZhbHVlcworICAgKiBleHBlY3RlZCBieSB7QGNvZGUgYXNzZXJ0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoKX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKAorICAgICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBtZXNzYWdlKSB7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICwgMSwgNTAxKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgLCAxLCA1MDJMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgLCAxLCA1MDMpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICAsIDEsIDUwNEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uICAsIDEsIDUwNSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICwgMSwgNTA2TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICwgMSwgNTA3KTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gLCAxLCA1MDhMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAxLCA1MDkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24sIDEsIDUxMEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb24gICAsIDEsIDUxMUYpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICAsIDEsIDUxMkQpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICAsIDEsIHRydWUpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICAsIDEsICI1MTUiKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uICAgLCAxLCB0b0J5dGVzKCI1MTYiKSk7CisKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uLCAxLAorICAgICAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24ubmV3QnVpbGRlcigpLnNldEEoNTE3KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24sIDEsCisgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoNTE4KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLCAxLAorICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoNTE5KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24sIDEsCisgICAgICBJbXBvcnRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXREKDUyMCkuYnVpbGQoKSk7CisKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24gLCAxLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08pOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24sIDEsIEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24gLCAxLCBJbXBvcnRFbnVtLklNUE9SVF9GT08pOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMSwgIjUyNCIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbiwgMSwgIjUyNSIpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKgorICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZXh0ZW5zaW9ucyBvZgorICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRBbGxFeHRlbnNpb25zfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBbGxFeHRlbnNpb25zU2V0KAorICAgICAgVGVzdEFsbEV4dGVuc2lvbnNPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQm9vbEV4dGVuc2lvbiAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbiAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICkuaGFzQSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKS5oYXNCYigpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKS5oYXNDKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiApLmhhc0QoKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbiApKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb24pKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbiAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbiAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbiAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uICAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCIxMTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbikpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICkuZ2V0QSgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKS5nZXRCYigpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKS5nZXRDKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiApLmdldEQoKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtLklNUE9SVF9CQVosCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb24pKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uKSk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24gICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uICAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24sIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb24gICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodHJ1ZSAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiMjE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24sIDApKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTcsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb24gICAgICAgICAsIDApLmdldEEoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxOCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICwgMCkuZ2V0QmIoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiwgMCkuZ2V0QygpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjIwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gLCAwKS5nZXREKCkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24sIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bS5JTVBPUlRfQkFSLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uLCAwKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24sIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbiwgMCkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGZhbHNlLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb24gICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIzMTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjMxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uLCAxKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgLCAxKS5nZXRBKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiAsIDEpLmdldEJiKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDEpLmdldEMoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICwgMSkuZ2V0RCgpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVosCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0JBWiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgMSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIzMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIzMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb24sIDEpKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW50NjRFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ludDMyRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0RmxvYXRFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbiAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb24gICApKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uICkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdENvcmRFeHRlbnNpb24pKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW50NjRFeHRlbnNpb24gICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50MzJFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ludDMyRXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb24gKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbiApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0RmxvYXRFeHRlbnNpb24gICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb24gICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI0MTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiNDE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbikpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTywKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0ZPTywKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtLklNUE9SVF9GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbikpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI0MjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjQyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uKSk7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBleHRlbnNpb25zIG9mCisgICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgY2xlYXJlZCwgYW5kIHRoYXQgZ2V0dGluZyB0aGUgZXh0ZW5zaW9ucyByZXR1cm5zIHRoZWlyCisgICAqIGRlZmF1bHQgdmFsdWVzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9uc09yQnVpbGRlciBtZXNzYWdlKSB7CisgICAgLy8gaGFzQmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQm9vbEV4dGVuc2lvbiAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkpOworCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb24gKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb24pKTsKKworICAgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb24gICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb24gICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbiApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbiApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEYgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb24gICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEQgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmFsc2UsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsQm9vbEV4dGVuc2lvbiAgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIiIgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoQnl0ZVN0cmluZy5FTVBUWSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbikpOworCisgICAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb24gICAgICAgICApLmhhc0EoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApLmhhc0JiKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKS5oYXNDKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKS5oYXNEKCkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb24gICAgICAgICApLmdldEEoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApLmdldEJiKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKS5nZXRDKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKS5nZXREKCkpOworCisgICAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0ZPTywKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bS5JTVBPUlRfRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIiIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIiIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbikpOworCisgICAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gICApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24gICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZENvcmRFeHRlbnNpb24pKTsKKworICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkgdmlhIGdldEV4dGVuc2lvbigpLnNpemUoKS4KKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbikuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24pLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiAgICkuc2l6ZSgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiAgICApLnNpemUoKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uICAgKS5zaXplKCkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uICAgICkuc2l6ZSgpKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbikuc2l6ZSgpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbikuc2l6ZSgpKTsKKworICAgIC8vIGhhc0JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRVaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbiAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbiAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24pKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb24gKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uKSk7CisKKyAgICAvLyBGaWVsZHMgd2l0aCBkZWZhdWx0cyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzIChkdWgpLgorICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDEgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb24gICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQyTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0MyAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50MzJFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDRMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoLTQ1ICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0NkwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDcgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbiApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ4TCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb24gKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0OSAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgtNTBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDUxLjVGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA1MmUzRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb24gICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbiAgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoImhlbGxvIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbiAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIndvcmxkIiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbikpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbikpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtLklNUE9SVF9CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbikpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCJhYmMiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjEyMyIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uKSk7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBleHRlbnNpb25zIG9mCisgICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgYXNzaWduZWQgYnkge0Bjb2RlIHNldEFsbEV4dGVuc2lvbnN9CisgICAqIGZvbGxvd2VkIGJ5IHtAY29kZSBtb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnN9LgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKAorICAgICAgVGVzdEFsbEV4dGVuc2lvbnNPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAorICAgIC8vIGZpZWxkLiAgSW4gYWRkaXRpb24gdG8gdmVyaWZ5aW5nIHRoaXMsIHdlIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGZpcnN0CisgICAgLy8gZWxlbWVudCBhbmQgc2l6ZSB3ZXJlICpub3QqIG1vZGlmaWVkLgorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRmxvYXRFeHRlbnNpb24gICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJvb2xFeHRlbnNpb24gICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkR3JvdXBFeHRlbnNpb24gICAgICAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiAgICApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQ29yZEV4dGVuc2lvbikpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb24gICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uLCAwKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgLCAwKS5nZXRBKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiAsIDApLmdldEJiKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDApLmdldEMoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICwgMCkuZ2V0RCgpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0JBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgMCkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb24sIDApKTsKKworICAgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgorICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNTE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCI1MTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiwgMSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICwgMSkuZ2V0QSgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gLCAxKS5nZXRCYigpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLCAxKS5nZXRDKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiAsIDEpLmdldEQoKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtLklNUE9SVF9GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24sIDEpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNTI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNTI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAxKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGFja2VkRXh0ZW5zaW9ucyhUZXN0UGFja2VkRXh0ZW5zaW9ucy5CdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQzMkV4dGVuc2lvbiAgICwgNjAxKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQ2NEV4dGVuc2lvbiAgICwgNjAyTCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkVWludDMyRXh0ZW5zaW9uICAsIDYwMyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkVWludDY0RXh0ZW5zaW9uICAsIDYwNEwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbiAgLCA2MDUpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQ2NEV4dGVuc2lvbiAgLCA2MDZMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uICwgNjA3KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uICwgNjA4TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ZpeGVkMzJFeHRlbnNpb24sIDYwOSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ZpeGVkNjRFeHRlbnNpb24sIDYxMEwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uICAgLCA2MTFGKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb24gICwgNjEyRCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkQm9vbEV4dGVuc2lvbiAgICAsIHRydWUpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEVudW1FeHRlbnNpb24sIEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSKTsKKyAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkSW50MzJFeHRlbnNpb24gICAsIDcwMSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb24gICAsIDcwMkwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbiAgLCA3MDMpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQ2NEV4dGVuc2lvbiAgLCA3MDRMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50MzJFeHRlbnNpb24gICwgNzA1KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb24gICwgNzA2TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRml4ZWQzMkV4dGVuc2lvbiAsIDcwNyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbiAsIDcwOEwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uLCA3MDkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uLCA3MTBMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGbG9hdEV4dGVuc2lvbiAgICwgNzExRik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRG91YmxlRXh0ZW5zaW9uICAsIDcxMkQpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEJvb2xFeHRlbnNpb24gICAgLCBmYWxzZSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFBhY2tlZEV4dGVuc2lvbnNTZXQoVGVzdFBhY2tlZEV4dGVuc2lvbnMgbWVzc2FnZSkgeworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRJbnQzMkV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRJbnQ2NEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRVaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRVaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTaW50MzJFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTaW50NjRFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbikpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRGbG9hdEV4dGVuc2lvbiAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWREb3VibGVFeHRlbnNpb24gICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRCb29sRXh0ZW5zaW9uICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRFbnVtRXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRJbnQzMkV4dGVuc2lvbiAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb24gICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50NjRFeHRlbnNpb24gICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ludDMyRXh0ZW5zaW9uICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNpbnQ2NEV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbiAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRmxvYXRFeHRlbnNpb24gICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZERvdWJsZUV4dGVuc2lvbiAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRCb29sRXh0ZW5zaW9uICAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbiwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50MzJFeHRlbnNpb24gICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEludDY0RXh0ZW5zaW9uICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50MzJFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkVWludDY0RXh0ZW5zaW9uICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbiAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQzMkV4dGVuc2lvbiAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZpeGVkNjRFeHRlbnNpb24gLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbiwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ZpeGVkNjRFeHRlbnNpb24sIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb24gICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkQm9vbEV4dGVuc2lvbiAgICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEVudW1FeHRlbnNpb24sIDEpKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gTGl0ZSBleHRlbnNpb25zCisKKyAgLyoqCisgICAqIFNldCBldmVyeSBmaWVsZCBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gdGhlIHZhbHVlcyBleHBlY3RlZCBieQorICAgKiB7QGNvZGUgYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldCgpfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBbGxFeHRlbnNpb25zKFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMTAxKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgMTAyTCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb25MaXRlICAsIDEwMyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlICAsIDEwNEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxMDUpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAxMDZMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMTA3KTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlICwgMTA4TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDEwOSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDExMEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb25MaXRlICAgLCAxMTFGKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMTEyRCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIHRydWUpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAiMTE1Iik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGUgICAsIHRvQnl0ZXMoIjExNiIpKTsKKworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlLAorICAgICAgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZS5uZXdCdWlsZGVyKCkuc2V0QSgxMTcpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUsCisgICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDExOCkuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUsCisgICAgICBGb3JlaWduTWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEMoMTE5KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlLAorICAgICAgSW1wb3J0TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEQoMTIwKS5idWlsZCgpKTsKKworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVopOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBWik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSwgSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFaKTsKKworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAiMTI0Iik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSwgIjEyNSIpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgLCAyMDEpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgLCAyMDJMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMjAzKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMjA0TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDIwNSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDIwNkwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAyMDcpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAyMDhMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMjA5KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMjEwTCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDIxMUYpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAyMTJEKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgdHJ1ZSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsICIyMTUiKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICwgdG9CeXRlcygiMjE2IikpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUsCisgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlLm5ld0J1aWxkZXIoKS5zZXRBKDIxNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKKyAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjE4KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKKyAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0QygyMTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUsCisgICAgICBJbXBvcnRNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0RCgyMjApLmJ1aWxkKCkpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBUik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCBJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVIpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsICIyMjQiKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCAiMjI1Iik7CisKKyAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDMwMSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDMwMkwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAzMDMpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAzMDRMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMzA1KTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMzA2TCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDMwNyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDMwOEwpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAzMDkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAzMTBMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMzExRik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDMxMkQpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCBmYWxzZSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsICIzMTUiKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICwgdG9CeXRlcygiMzE2IikpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUsCisgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlLm5ld0J1aWxkZXIoKS5zZXRBKDMxNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKKyAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMzE4KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKKyAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0QygzMTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUsCisgICAgICBJbXBvcnRNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0RCgzMjApLmJ1aWxkKCkpOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBWik7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFaKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCBJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVopOworCisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsICIzMjQiKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCAiMzI1Iik7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgNDAxKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0SW50NjRFeHRlbnNpb25MaXRlICAgLCA0MDJMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZSAgLCA0MDMpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlICAsIDQwNEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb25MaXRlICAsIDQwNSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgNDA2TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlICwgNDA3KTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCA0MDhMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlLCA0MDkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDQxMEwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDQxMUYpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb25MaXRlICAsIDQxMkQpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIGZhbHNlKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAiNDE1Iik7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICwgdG9CeXRlcygiNDE2IikpOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uRk9PKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCBJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9GT08pOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSwgIjQyNCIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZSwgIjQyNSIpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKgorICAgKiBNb2RpZnkgdGhlIHJlcGVhdGVkIGV4dGVuc2lvbnMgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIGNvbnRhaW4gdGhlIHZhbHVlcworICAgKiBleHBlY3RlZCBieSB7QGNvZGUgYXNzZXJ0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoKX0uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgbW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKAorICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgbWVzc2FnZSkgeworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgLCAxLCA1MDEpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgLCAxLCA1MDJMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSwgNTAzKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSwgNTA0TCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDEsIDUwNSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDEsIDUwNkwpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAxLCA1MDcpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAxLCA1MDhMKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMSwgNTA5KTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMSwgNTEwTCk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDEsIDUxMUYpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAxLCA1MTJEKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMSwgdHJ1ZSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsIDEsICI1MTUiKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICwgMSwgdG9CeXRlcygiNTE2IikpOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUsIDEsCisgICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlLm5ld0J1aWxkZXIoKS5zZXRBKDUxNykuYnVpbGQoKSk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwgMSwKKyAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoNTE4KS5idWlsZCgpKTsKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwgMSwKKyAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0Qyg1MTkpLmJ1aWxkKCkpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUsIDEsCisgICAgICBJbXBvcnRNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0RCg1MjApLmJ1aWxkKCkpOworCisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSAsIDEsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5GT08pOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCAxLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTyk7CisgICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSAsIDEsIEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0ZPTyk7CisKKyAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSwgMSwgIjUyNCIpOworICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUsIDEsICI1MjUiKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvKioKKyAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGV4dGVuc2lvbnMgb2YKKyAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRXh0ZW5zaW9uc30uCisgICAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldCgKKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZU9yQnVpbGRlciBtZXNzYWdlKSB7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICApLmhhc0EoKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApLmhhc0JiKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKS5oYXNDKCkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKS5oYXNEKCkpOworCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbkxpdGUpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjExNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjExNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICApLmdldEEoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExOCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApLmdldEJiKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKS5nZXRDKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKS5nZXREKCkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVosCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFaLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFaLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUgICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiMjE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlLCAwKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICwwKS5nZXRBKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgLDApLmdldEJiKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlLDApLmdldEMoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAsMCkuZ2V0RCgpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFSLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIDApKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUsIDApKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjMxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjMxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSwgMSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICAsMSkuZ2V0QSgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICwxKS5nZXRCYigpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwxKS5nZXRDKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgLDEpLmdldEQoKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBWiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVosCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVosCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCAxKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjMyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIzMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCAxKSk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlICAgICkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb25MaXRlICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKKworICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbkxpdGUpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlICAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNDE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCI0MTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkxpdGUpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNDI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNDI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdENvcmRFeHRlbnNpb25MaXRlKSk7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLyoqCisgICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBleHRlbnNpb25zIG9mCisgICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgY2xlYXJlZCwgYW5kIHRoYXQgZ2V0dGluZyB0aGUgZXh0ZW5zaW9ucyByZXR1cm5zIHRoZWlyCisgICAqIGRlZmF1bHQgdmFsdWVzLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEV4dGVuc2lvbnNDbGVhcigKKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZU9yQnVpbGRlciBtZXNzYWdlKSB7CisgICAgLy8gaGFzQmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQm9vbEV4dGVuc2lvbkxpdGUgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApKTsKKworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb25MaXRlICkpOworCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbkxpdGUpKTsKKworICAgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbkxpdGUgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBGICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwRCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmFsc2UsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsQm9vbEV4dGVuc2lvbkxpdGUgICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIiICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShCeXRlU3RyaW5nLkVNUFRZLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgKS5oYXNBKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICkuaGFzQmIoKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKS5oYXNDKCkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICkuaGFzRCgpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkuZ2V0QSgpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApLmdldEJiKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSkuZ2V0QygpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApLmdldEQoKSk7CisKKyAgICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgorICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9GT08sCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb25MaXRlKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIiIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb25MaXRlKSk7CisKKyAgICAvLyBSZXBlYXRlZCBmaWVsZHMgYXJlIGVtcHR5LgorICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICkpOworCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUgICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgLy8gaGFzQmxhaCgpIHNob3VsZCBhbHNvIGJlIGZhbHNlIGZvciBhbGwgZGVmYXVsdCBmaWVsZHMuCisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb25MaXRlICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKKworICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZSkpOworCisgICAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQxICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDJMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW50NjRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0MyAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ0TCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgtNDUgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0NkwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ3ICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDhMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0OSAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoLTUwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNTEuNUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0RmxvYXRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA1MmUzRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb25MaXRlICApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodHJ1ZSAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlICAgICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiaGVsbG8iLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIndvcmxkIiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbkxpdGUpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFSLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUiwKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFSLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25MaXRlKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoImFiYyIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjEyMyIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZSkpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qKgorICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZXh0ZW5zaW9ucyBvZgorICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRBbGxFeHRlbnNpb25zfQorICAgKiBmb2xsb3dlZCBieSB7QGNvZGUgbW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zfS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgKKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZU9yQnVpbGRlciBtZXNzYWdlKSB7CisgICAgLy8gTW9kaWZ5UmVwZWF0ZWRGaWVsZHMgb25seSBzZXRzIHRoZSBzZWNvbmQgcmVwZWF0ZWQgZWxlbWVudCBvZiBlYWNoCisgICAgLy8gZmllbGQuICBJbiBhZGRpdGlvbiB0byB2ZXJpZnlpbmcgdGhpcywgd2UgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QKKyAgICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlICAgKSk7CisKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSAgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSAgICApKTsKKworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodHJ1ZSAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUsIDApKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTcsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgLDApLmdldEEoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxOCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAsMCkuZ2V0QmIoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUsMCkuZ2V0QygpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjIwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICwwKS5nZXREKCkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVIsCisgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFSLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSwgMCkpOworCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSwgMCkpOworCisgICAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNTE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiNTE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlLCAxKSk7CisKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICwxKS5nZXRBKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgLDEpLmdldEJiKCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlLDEpLmdldEMoKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAsMSkuZ2V0RCgpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uRk9PLAorICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTywKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0ZPTywKKyAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIDEpKTsKKworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNTI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjUyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUsIDEpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQYWNrZWRFeHRlbnNpb25zKFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDYwMSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb25MaXRlICAgLCA2MDJMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDYwMyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCA2MDRMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDYwNSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCA2MDZMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDYwNyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCA2MDhMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDYwOSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCA2MTBMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDYxMUYpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgNjEyRCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCB0cnVlKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIpOworICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDcwMSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb25MaXRlICAgLCA3MDJMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDcwMyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCA3MDRMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDcwNSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCA3MDZMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDcwNyk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCA3MDhMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDcwOSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCA3MTBMKTsKKyAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDcxMUYpOworICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgNzEyRCk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCBmYWxzZSk7CisgICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbkxpdGUsIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFaKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRQYWNrZWRFeHRlbnNpb25zU2V0KFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBtZXNzYWdlKSB7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkVWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTaW50MzJFeHRlbnNpb25MaXRlICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKKyAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7CisgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEJvb2xFeHRlbnNpb25MaXRlICAgICkpOworICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50MzJFeHRlbnNpb25MaXRlICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDApKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCAwKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgMCkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50MzJFeHRlbnNpb25MaXRlICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDEpKTsKKyAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMSkpOworICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCAxKSk7CisgICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFaLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgMSkpOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvKioKKyAgICogUGVyZm9ybXMgdGhlIHNhbWUgdGhpbmdzIHRoYXQgdGhlIG1ldGhvZHMgb2Yge0Bjb2RlIFRlc3RVdGlsfSBkbywgYnV0CisgICAqIHZpYSB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UuICBUaGlzIGlzIGl0cyBvd24gY2xhc3MgYmVjYXVzZSBpdCBuZWVkcworICAgKiB0byBrbm93IHdoYXQgZGVzY3JpcHRvciB0byB1c2UuCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlZmxlY3Rpb25UZXN0ZXIgeworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBiYXNlRGVzY3JpcHRvcjsKKyAgICBwcml2YXRlIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5OworCisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvciBmaWxlOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IgaW1wb3J0RmlsZTsKKworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBvcHRpb25hbEdyb3VwOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciByZXBlYXRlZEdyb3VwOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBuZXN0ZWRNZXNzYWdlOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBmb3JlaWduTWVzc2FnZTsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgaW1wb3J0TWVzc2FnZTsKKworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGdyb3VwQTsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciByZXBlYXRlZEdyb3VwQTsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBuZXN0ZWRCOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZvcmVpZ25DOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGltcG9ydEQ7CisKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yIG5lc3RlZEVudW07CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBmb3JlaWduRW51bTsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yIGltcG9ydEVudW07CisKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgbmVzdGVkRm9vOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBuZXN0ZWRCYXI7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIG5lc3RlZEJhejsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgZm9yZWlnbkZvbzsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgZm9yZWlnbkJhcjsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgZm9yZWlnbkJhejsKKyAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgaW1wb3J0Rm9vOworICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBpbXBvcnRCYXI7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGltcG9ydEJhejsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIHtAY29kZSBSZWZsZWN0aW9uVGVzdGVyfSB0aGF0IHdpbGwgZXhwZWN0IG1lc3NhZ2VzIHVzaW5nCisgICAgICogdGhlIGdpdmVuIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBOb3JtYWxseSB7QGNvZGUgYmFzZURlc2NyaXB0b3J9IHNob3VsZCBiZSBhIGRlc2NyaXB0b3IgZm9yIHRoZSB0eXBlCisgICAgICoge0Bjb2RlIFRlc3RBbGxUeXBlc30sIGRlZmluZWQgaW4KKyAgICAgKiB7QGNvZGUgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvfS4gIEhvd2V2ZXIsIGlmCisgICAgICoge0Bjb2RlIGV4dGVuc2lvblJlZ2lzdHJ5fSBpcyBub24tbnVsbCwgdGhlbiB7QGNvZGUgYmFzZURlc2NyaXB0b3J9IHNob3VsZAorICAgICAqIGJlIGZvciB7QGNvZGUgVGVzdEFsbEV4dGVuc2lvbnN9IGluc3RlYWQsIGFuZCBpbnN0ZWFkIG9mIHJlYWRpbmcgYW5kCisgICAgICogd3JpdGluZyBub3JtYWwgZmllbGRzLCB0aGUgdGVzdGVyIHdpbGwgcmVhZCBhbmQgd3JpdGUgZXh0ZW5zaW9ucy4KKyAgICAgKiBBbGwgb2Yge0Bjb2RlIFRlc3RBbGxFeHRlbnNpb25zfScgZXh0ZW5zaW9ucyBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAgICogcmVnaXN0cnkuCisgICAgICovCisgICAgcHVibGljIFJlZmxlY3Rpb25UZXN0ZXIoRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBiYXNlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkgeworICAgICAgdGhpcy5iYXNlRGVzY3JpcHRvciA9IGJhc2VEZXNjcmlwdG9yOworICAgICAgdGhpcy5leHRlbnNpb25SZWdpc3RyeSA9IGV4dGVuc2lvblJlZ2lzdHJ5OworCisgICAgICB0aGlzLmZpbGUgPSBiYXNlRGVzY3JpcHRvci5nZXRGaWxlKCk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGZpbGUuZ2V0RGVwZW5kZW5jaWVzKCkuc2l6ZSgpKTsKKyAgICAgIHRoaXMuaW1wb3J0RmlsZSA9IGZpbGUuZ2V0RGVwZW5kZW5jaWVzKCkuZ2V0KDApOworCisgICAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIHRlc3RBbGxUeXBlczsKKyAgICAgIGlmIChiYXNlRGVzY3JpcHRvci5nZXROYW1lKCkgPT0gIlRlc3RBbGxUeXBlcyIpIHsKKyAgICAgICAgdGVzdEFsbFR5cGVzID0gYmFzZURlc2NyaXB0b3I7CisgICAgICB9IGVsc2UgeworICAgICAgICB0ZXN0QWxsVHlwZXMgPSBmaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiVGVzdEFsbFR5cGVzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHRlc3RBbGxUeXBlcyk7CisgICAgICB9CisKKyAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKSB7CisgICAgICAgIC8vIFVzZSB0ZXN0QWxsVHlwZXMsIHJhdGhlciB0aGFuIGJhc2VEZXNjcmlwdG9yLCB0byBhbGxvdworICAgICAgICAvLyBpbml0aWFsaXphdGlvbiB1c2luZyBUZXN0UGFja2VkVHlwZXMgZGVzY3JpcHRvcnMuIFRoZXNlIG9iamVjdHMKKyAgICAgICAgLy8gd29uJ3QgYmUgdXNlZCBieSB0aGUgbWV0aG9kcyBmb3IgcGFja2VkIGZpZWxkcy4KKyAgICAgICAgdGhpcy5vcHRpb25hbEdyb3VwID0KKyAgICAgICAgICB0ZXN0QWxsVHlwZXMuZmluZE5lc3RlZFR5cGVCeU5hbWUoIk9wdGlvbmFsR3JvdXAiKTsKKyAgICAgICAgdGhpcy5yZXBlYXRlZEdyb3VwID0KKyAgICAgICAgICB0ZXN0QWxsVHlwZXMuZmluZE5lc3RlZFR5cGVCeU5hbWUoIlJlcGVhdGVkR3JvdXAiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXMub3B0aW9uYWxHcm91cCA9CisgICAgICAgICAgZmlsZS5maW5kTWVzc2FnZVR5cGVCeU5hbWUoIk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIik7CisgICAgICAgIHRoaXMucmVwZWF0ZWRHcm91cCA9CisgICAgICAgICAgZmlsZS5maW5kTWVzc2FnZVR5cGVCeU5hbWUoIlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIik7CisgICAgICB9CisgICAgICB0aGlzLm5lc3RlZE1lc3NhZ2UgPSB0ZXN0QWxsVHlwZXMuZmluZE5lc3RlZFR5cGVCeU5hbWUoIk5lc3RlZE1lc3NhZ2UiKTsKKyAgICAgIHRoaXMuZm9yZWlnbk1lc3NhZ2UgPSBmaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9yZWlnbk1lc3NhZ2UiKTsKKyAgICAgIHRoaXMuaW1wb3J0TWVzc2FnZSA9IGltcG9ydEZpbGUuZmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJJbXBvcnRNZXNzYWdlIik7CisKKyAgICAgIHRoaXMubmVzdGVkRW51bSA9IHRlc3RBbGxUeXBlcy5maW5kRW51bVR5cGVCeU5hbWUoIk5lc3RlZEVudW0iKTsKKyAgICAgIHRoaXMuZm9yZWlnbkVudW0gPSBmaWxlLmZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9yZWlnbkVudW0iKTsKKyAgICAgIHRoaXMuaW1wb3J0RW51bSA9IGltcG9ydEZpbGUuZmluZEVudW1UeXBlQnlOYW1lKCJJbXBvcnRFbnVtIik7CisKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG9wdGlvbmFsR3JvdXAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHJlcGVhdGVkR3JvdXAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZE1lc3NhZ2UgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25NZXNzYWdlKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydE1lc3NhZ2UgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEVudW0gICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25FbnVtICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEVudW0gICAgKTsKKworICAgICAgdGhpcy5uZXN0ZWRCICA9IG5lc3RlZE1lc3NhZ2UgLmZpbmRGaWVsZEJ5TmFtZSgiYmIiKTsKKyAgICAgIHRoaXMuZm9yZWlnbkMgPSBmb3JlaWduTWVzc2FnZS5maW5kRmllbGRCeU5hbWUoImMiKTsKKyAgICAgIHRoaXMuaW1wb3J0RCAgPSBpbXBvcnRNZXNzYWdlIC5maW5kRmllbGRCeU5hbWUoImQiKTsKKyAgICAgIHRoaXMubmVzdGVkRm9vID0gbmVzdGVkRW51bS5maW5kVmFsdWVCeU5hbWUoIkZPTyIpOworICAgICAgdGhpcy5uZXN0ZWRCYXIgPSBuZXN0ZWRFbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiQkFSIik7CisgICAgICB0aGlzLm5lc3RlZEJheiA9IG5lc3RlZEVudW0uZmluZFZhbHVlQnlOYW1lKCJCQVoiKTsKKyAgICAgIHRoaXMuZm9yZWlnbkZvbyA9IGZvcmVpZ25FbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9GT08iKTsKKyAgICAgIHRoaXMuZm9yZWlnbkJhciA9IGZvcmVpZ25FbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9CQVIiKTsKKyAgICAgIHRoaXMuZm9yZWlnbkJheiA9IGZvcmVpZ25FbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9CQVoiKTsKKyAgICAgIHRoaXMuaW1wb3J0Rm9vID0gaW1wb3J0RW51bS5maW5kVmFsdWVCeU5hbWUoIklNUE9SVF9GT08iKTsKKyAgICAgIHRoaXMuaW1wb3J0QmFyID0gaW1wb3J0RW51bS5maW5kVmFsdWVCeU5hbWUoIklNUE9SVF9CQVIiKTsKKyAgICAgIHRoaXMuaW1wb3J0QmF6ID0gaW1wb3J0RW51bS5maW5kVmFsdWVCeU5hbWUoIklNUE9SVF9CQVoiKTsKKworICAgICAgdGhpcy5ncm91cEEgPSBvcHRpb25hbEdyb3VwLmZpbmRGaWVsZEJ5TmFtZSgiYSIpOworICAgICAgdGhpcy5yZXBlYXRlZEdyb3VwQSA9IHJlcGVhdGVkR3JvdXAuZmluZEZpZWxkQnlOYW1lKCJhIik7CisKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGdyb3VwQSAgICAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHJlcGVhdGVkR3JvdXBBKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEIgICAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25DICAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEQgICAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEZvbyAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEJhciAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEJheiAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25Gb28gICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25CYXIgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25CYXogICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEZvbyAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEJhciAgICAgKTsKKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEJheiAgICAgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG9ydGhhbmQgdG8gZ2V0IGEgRmllbGREZXNjcmlwdG9yIGZvciBhIGZpZWxkIG9mIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZihTdHJpbmcgbmFtZSkgeworICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIHJlc3VsdDsKKyAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKSB7CisgICAgICAgIHJlc3VsdCA9IGJhc2VEZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IGZpbGUuZmluZEV4dGVuc2lvbkJ5TmFtZShuYW1lICsgIl9leHRlbnNpb24iKTsKKyAgICAgIH0KKyAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHJlc3VsdCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHtAY29kZSBwYXJlbnQubmV3QnVpbGRlckZvckZpZWxkKCl9IG9yIHVzZXMgdGhlCisgICAgICoge0Bjb2RlIEV4dGVuc2lvblJlZ2lzdHJ5fSB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGJ1aWxkZXIsIGRlcGVuZGluZworICAgICAqIG9uIHdoYXQgdHlwZSBpcyBiZWluZyB0ZXN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlckZvckZpZWxkKAorICAgICAgICBNZXNzYWdlLkJ1aWxkZXIgcGFyZW50LCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKKyAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5LkV4dGVuc2lvbkluZm8gZXh0ZW5zaW9uID0KKyAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeS5maW5kRXh0ZW5zaW9uQnlOdW1iZXIoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0TnVtYmVyKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChleHRlbnNpb24pOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChleHRlbnNpb24uZGVmYXVsdEluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbi5kZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBTZXQgZXZlcnkgZmllbGQgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIHRoZSB2YWx1ZXMgZXhwZWN0ZWQgYnkKKyAgICAgKiB7QGNvZGUgYXNzZXJ0QWxsRmllbGRzU2V0KCl9LCB1c2luZyB0aGUge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0KKyAgICAgKiByZWZsZWN0aW9uIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZS5CdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfaW50MzIiICAgKSwgMTAxICk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ludDY0IiAgICksIDEwMkwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF91aW50MzIiICApLCAxMDMgKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfdWludDY0IiAgKSwgMTA0TCk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3NpbnQzMiIgICksIDEwNSApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9zaW50NjQiICApLCAxMDZMKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfZml4ZWQzMiIgKSwgMTA3ICk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkNjQiICksIDEwOEwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQzMiIpLCAxMDkgKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfc2ZpeGVkNjQiKSwgMTEwTCk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2Zsb2F0IiAgICksIDExMUYpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9kb3VibGUiICApLCAxMTJEKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfYm9vbCIgICAgKSwgdHJ1ZSk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZyIgICksICIxMTUiKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfYnl0ZXMiICAgKSwgdG9CeXRlcygiMTE2IikpOworCisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsZ3JvdXAiKSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoIm9wdGlvbmFsZ3JvdXAiKSkKKyAgICAgICAgICAgICAgIC5zZXRGaWVsZChncm91cEEsIDExNykuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiksCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKG5lc3RlZEIsIDExOCkuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpLAorICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQoZm9yZWlnbkMsIDExOSkuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIiksCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKGltcG9ydEQsIDEyMCkuYnVpbGQoKSk7CisKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX2VudW0iICksICBuZXN0ZWRCYXopOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX2VudW0iKSwgZm9yZWlnbkJheik7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiApLCAgaW1wb3J0QmF6KTsKKworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiICksICIxMjQiKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfY29yZCIgKSwgIjEyNSIpOworCisgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50MzIiICAgKSwgMjAxICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiICAgKSwgMjAyTCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiAgKSwgMjAzICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDY0IiAgKSwgMjA0TCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMjA1ICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMjA2TCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQzMiIgKSwgMjA3ICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMjA4TCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMjA5ICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMjEwTCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMjExRik7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMjEyRCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYm9vbCIgICAgKSwgdHJ1ZSk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgIjIxNSIpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiAgICksIHRvQnl0ZXMoIjIxNiIpKTsKKworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkZ3JvdXAiKSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkZ3JvdXAiKSkKKyAgICAgICAgICAgICAgIC5zZXRGaWVsZChyZXBlYXRlZEdyb3VwQSwgMjE3KS5idWlsZCgpKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLAorICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSkKKyAgICAgICAgICAgICAgIC5zZXRGaWVsZChuZXN0ZWRCLCAyMTgpLmJ1aWxkKCkpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLAorICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQoZm9yZWlnbkMsIDIxOSkuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQoaW1wb3J0RCwgMjIwKS5idWlsZCgpKTsKKworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLCAgbmVzdGVkQmFyKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgZm9yZWlnbkJhcik7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksICBpbXBvcnRCYXIpOworCisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiApLCAiMjI0Iik7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfY29yZCIgKSwgIjIyNSIpOworCisgICAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50MzIiICAgKSwgMzAxICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiICAgKSwgMzAyTCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiAgKSwgMzAzICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDY0IiAgKSwgMzA0TCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMzA1ICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMzA2TCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQzMiIgKSwgMzA3ICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMzA4TCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMzA5ICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMzEwTCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMzExRik7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMzEyRCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYm9vbCIgICAgKSwgZmFsc2UpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIgICksICIzMTUiKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIgICApLCB0b0J5dGVzKCIzMTYiKSk7CisKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZGdyb3VwIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQocmVwZWF0ZWRHcm91cEEsIDMxNykuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQobmVzdGVkQiwgMzE4KS5idWlsZCgpKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKGZvcmVpZ25DLCAzMTkpLmJ1aWxkKCkpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKGltcG9ydEQsIDMyMCkuYnVpbGQoKSk7CisKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgKSwgIG5lc3RlZEJheik7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25CYXopOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLCAgaW1wb3J0QmF6KTsKKworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIgKSwgIjMyNCIpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2NvcmQiICksICIzMjUiKTsKKworICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2ludDMyIiAgICksIDQwMSApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2ludDY0IiAgICksIDQwMkwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3VpbnQzMiIgICksIDQwMyApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3VpbnQ2NCIgICksIDQwNEwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3NpbnQzMiIgICksIDQwNSApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3NpbnQ2NCIgICksIDQwNkwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2ZpeGVkMzIiICksIDQwNyApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2ZpeGVkNjQiICksIDQwOEwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDMyIiksIDQwOSApOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDY0IiksIDQxMEwpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2Zsb2F0IiAgICksIDQxMUYpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2RvdWJsZSIgICksIDQxMkQpOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2Jvb2wiICAgICksIGZhbHNlKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9zdHJpbmciICApLCAiNDE1Iik7CisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfYnl0ZXMiICAgKSwgdG9CeXRlcygiNDE2IikpOworCisgICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRGb28pOworICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpLCBmb3JlaWduRm9vKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSwgIGltcG9ydEZvbyk7CisKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9zdHJpbmdfcGllY2UiICksICI0MjQiKTsKKyAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9jb3JkIiApLCAiNDI1Iik7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogTW9kaWZ5IHRoZSByZXBlYXRlZCBmaWVsZHMgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIGNvbnRhaW4gdGhlIHZhbHVlcworICAgICAqIGV4cGVjdGVkIGJ5IHtAY29kZSBhc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkKCl9LCB1c2luZyB0aGUKKyAgICAgKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSByZWZsZWN0aW9uIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICB2b2lkIG1vZGlmeVJlcGVhdGVkRmllbGRzVmlhUmVmbGVjdGlvbihNZXNzYWdlLkJ1aWxkZXIgbWVzc2FnZSkgeworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDMyIiAgICksIDEsIDUwMSApOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDY0IiAgICksIDEsIDUwMkwpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQzMiIgICksIDEsIDUwMyApOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDEsIDUwNEwpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQzMiIgICksIDEsIDUwNSApOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDEsIDUwNkwpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDEsIDUwNyApOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDEsIDUwOEwpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDEsIDUwOSApOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDEsIDUxMEwpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDEsIDUxMUYpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2RvdWJsZSIgICksIDEsIDUxMkQpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Jvb2wiICAgICksIDEsIHRydWUpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIgICksIDEsICI1MTUiKTsKKyAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIgICApLCAxLCB0b0J5dGVzKCI1MTYiKSk7CisKKyAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksIDEsCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZGdyb3VwIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQocmVwZWF0ZWRHcm91cEEsIDUxNykuYnVpbGQoKSk7CisgICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpCisgICAgICAgICAgICAgICAuc2V0RmllbGQobmVzdGVkQiwgNTE4KS5idWlsZCgpKTsKKyAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSwKKyAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKGZvcmVpZ25DLCA1MTkpLmJ1aWxkKCkpOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDEsCisgICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpKQorICAgICAgICAgICAgICAgLnNldEZpZWxkKGltcG9ydEQsIDUyMCkuYnVpbGQoKSk7CisKKyAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgKSwgMSwgIG5lc3RlZEZvbyk7CisgICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIDEsIGZvcmVpZ25Gb28pOworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLCAxLCAgaW1wb3J0Rm9vKTsKKworICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAxLCAiNTI0Iik7CisgICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfY29yZCIpLCAxLCAiNTI1Iik7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGZpZWxkcyBvZgorICAgICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgYXNzaWduZWQgYnkge0Bjb2RlIHNldEFsbEZpZWxkc30sCisgICAgICogdXNpbmcgdGhlIHtAbGluayBNZXNzYWdlfSByZWZsZWN0aW9uIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgeworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9pbnQzMiIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ludDY0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfdWludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF91aW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3NpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc2ludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9maXhlZDMyIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkNjQiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc2ZpeGVkMzIiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2Zsb2F0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZG91YmxlIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9ib29sIiAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZyIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfYnl0ZXMiICAgKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsZ3JvdXAiICAgICAgICAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIiApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbGdyb3VwIikpKS5oYXNGaWVsZChncm91cEEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzRmllbGQobmVzdGVkQikpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzRmllbGQoZm9yZWlnbkMpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzRmllbGQoaW1wb3J0RCkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfY29yZCIpKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAxICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW50MzIiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDJMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbnQ2NCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwMyAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3VpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA0TCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfdWludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDUgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zaW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNkwgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3NpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA3ICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZml4ZWQzMiIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDhMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9maXhlZDY0IiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwOSAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDMyIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTEwTCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTFGICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9mbG9hdCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExMkQgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2RvdWJsZSIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfYm9vbCIgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTE1IiwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zdHJpbmciICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjExNiIpLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2J5dGVzIikpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTcsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsZ3JvdXAiKSkpLmdldEZpZWxkKGdyb3VwQSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTgsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExOSwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChmb3JlaWduQykpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMjAsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChpbXBvcnREKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEJheiwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduQmF6LCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpbXBvcnRCYXosIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW1wb3J0X2VudW0iICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTI0IiwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTI1IiwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9jb3JkIikpKTsKKworICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbnQzMiIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ludDY0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfdWludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9maXhlZDMyIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZpeGVkNjQiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Zsb2F0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9ib29sIiAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3N0cmluZyIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfYnl0ZXMiICAgKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkZ3JvdXAiICAgICAgICAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiAgICApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfY29yZCIpKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiICAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQzMiIgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2RvdWJsZSIgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMTUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIDApKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTcsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRncm91cCIpLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQocmVwZWF0ZWRHcm91cEEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE4LAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxOSwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGZvcmVpZ25DKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIyMCwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoaW1wb3J0RCkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBuZXN0ZWRCYXIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgKSwwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25CYXIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpbXBvcnRCYXIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwwKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIyNCIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMjI1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2NvcmQiKSwgMCkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwMSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50MzIiICAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDJMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDY0IiAgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAzICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50MzIiICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwNEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDY0IiAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQzMiIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA2TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50NjQiICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwNyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQzMiIgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDhMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA5ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxMEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTFGICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzEyRCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9kb3VibGUiICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYm9vbCIgICAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMzE1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiMzE2IiksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIpLCAxKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzE3LAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkZ3JvdXAiKSwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKHJlcGVhdGVkR3JvdXBBKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxOCwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQobmVzdGVkQikpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTksCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiksIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChmb3JlaWduQykpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMjAsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGltcG9ydEQpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkQmF6LCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduQmF6LCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0QmF6LCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksMSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzMjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjMyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiksIDEpKTsKKworICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ludDMyIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9pbnQ2NCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfdWludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3VpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zaW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc2ludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ZpeGVkMzIiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9maXhlZDY0IiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9mbG9hdCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZG91YmxlIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zdHJpbmciICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfYnl0ZXMiICAgKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2NvcmQiKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMSAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfaW50MzIiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDJMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAzICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF91aW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNEwgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfdWludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDUgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA2TCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zaW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNyAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfZml4ZWQzMiIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDhMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA5ICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zZml4ZWQzMiIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQxMEwgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkNjQiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MTFGICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDEyRCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9kb3VibGUiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfYm9vbCIgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNDE1IiwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiNDE2IiksIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9ieXRlcyIpKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEZvbywgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25Gb28sIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0Rm9vLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfaW1wb3J0X2VudW0iICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNDI0IiwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI0MjUiLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfY29yZCIpKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGZpZWxkcyBvZgorICAgICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgY2xlYXJlZCwgYW5kIHRoYXQgZ2V0dGluZyB0aGUgZmllbGRzIHJldHVybnMgdGhlaXIKKyAgICAgKiBkZWZhdWx0IHZhbHVlcywgdXNpbmcgdGhlIHtAbGluayBNZXNzYWdlfSByZWZsZWN0aW9uIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB7CisgICAgICAvLyBoYXNfYmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9pbnQzMiIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9pbnQ2NCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF91aW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF91aW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zaW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zaW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9maXhlZDMyIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9maXhlZDY0IiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9mbG9hdCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9kb3VibGUiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9ib29sIiAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zdHJpbmciICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9ieXRlcyIgICApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsZ3JvdXAiICAgICAgICAgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIiApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX2VudW0iKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW1wb3J0X2VudW0iICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2NvcmQiKSkpOworCisgICAgICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ludDMyIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW50NjQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF91aW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDBMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3VpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc2ludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwTCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zaW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkMzIiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZml4ZWQ2NCIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDBMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMEYgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZmxvYXQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwRCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9kb3VibGUiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2Jvb2wiICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiIgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc3RyaW5nIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2J5dGVzIikpKTsKKworICAgICAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsZ3JvdXAiKSkpLmhhc0ZpZWxkKGdyb3VwQSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzRmllbGQobmVzdGVkQikpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc0ZpZWxkKGZvcmVpZ25DKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNGaWVsZChpbXBvcnREKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxncm91cCIpKSkuZ2V0RmllbGQoZ3JvdXBBKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoZm9yZWlnbkMpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGltcG9ydEQpKTsKKworICAgICAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEZvbywgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduRm9vLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpbXBvcnRGb28sIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW1wb3J0X2VudW0iICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9jb3JkIikpKTsKKworICAgICAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW50MzIiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbnQ2NCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3VpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfdWludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZml4ZWQzMiIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9maXhlZDY0IiApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NmaXhlZDMyIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mbG9hdCIgICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2RvdWJsZSIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfYm9vbCIgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zdHJpbmciICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2J5dGVzIiAgICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZGdyb3VwIiAgICAgICAgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgICAgKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2NvcmQiKSkpOworCisgICAgICAvLyBoYXNfYmxhaCgpIHNob3VsZCBhbHNvIGJlIGZhbHNlIGZvciBhbGwgZGVmYXVsdCBmaWVsZHMuCisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ludDMyIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfaW50NjQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF91aW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3VpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc2ludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zaW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ZpeGVkMzIiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZml4ZWQ2NCIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zZml4ZWQzMiIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZmxvYXQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9kb3VibGUiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc3RyaW5nIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9ieXRlcyIgICApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZm9yZWlnbl9lbnVtIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfaW1wb3J0X2VudW0iICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zdHJpbmdfcGllY2UiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfY29yZCIgKSkpOworCisgICAgICAvLyBGaWVsZHMgd2l0aCBkZWZhdWx0cyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzIChkdWgpLgorICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDEgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfaW50MzIiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDJMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfaW50NjQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDMgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfdWludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDRMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfdWludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtNDUgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc2ludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDZMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc2ludDY0IiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDcgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfZml4ZWQzMiIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDhMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfZml4ZWQ2NCIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDkgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtNTBMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkNjQiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNTEuNUYgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfZmxvYXQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNTJlM0QgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfZG91YmxlIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfYm9vbCIgICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaGVsbG8iLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc3RyaW5nIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCJ3b3JsZCIpLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfYnl0ZXMiKSkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBuZXN0ZWRCYXIsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9uZXN0ZWRfZW51bSIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduQmFyLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfZm9yZWlnbl9lbnVtIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEJhciwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImFiYyIsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTIzIiwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2NvcmQiKSkpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkVmlhUmVmbGVjdGlvbigKKyAgICAgICAgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB7CisgICAgICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gKKyAgICAgIC8vIGZpZWxkLiAgSW4gYWRkaXRpb24gdG8gdmVyaWZ5aW5nIHRoaXMsIHdlIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGZpcnN0CisgICAgICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ludDMyIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW50NjQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50MzIiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3VpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50NjQiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZpeGVkMzIiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NmaXhlZDY0IikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9kb3VibGUiICApKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Jvb2wiICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9ieXRlcyIgICApKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRncm91cCIgICAgICAgICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICAgICkpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9jb3JkIikpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDMyIiAgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Jvb2wiICAgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgMCkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxNywKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChyZXBlYXRlZEdyb3VwQSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTgsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE5LAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoZm9yZWlnbkMpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjIwLAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChpbXBvcnREKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLDApKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMjI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfY29yZCIpLCAwKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiICAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQzMiIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2RvdWJsZSIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI1MTUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCI1MTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIDEpKTsKKworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTcsCisgICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRncm91cCIpLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQocmVwZWF0ZWRHcm91cEEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTE4LAorICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxOSwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGZvcmVpZ25DKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUyMCwKKyAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoaW1wb3J0RCkpOworCisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBuZXN0ZWRGb28sIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgKSwxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25Gb28sIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpbXBvcnRGb28sIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwxKSk7CisKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjUyNCIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNTI1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2NvcmQiKSwgMSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhY2tlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZS5CdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50MzIiICAgKSwgNjAxICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ludDY0IiAgICksIDYwMkwpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50MzIiICApLCA2MDMgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfdWludDY0IiAgKSwgNjA0TCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NpbnQzMiIgICksIDYwNSApOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50NjQiICApLCA2MDZMKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQzMiIgKSwgNjA3ICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ZpeGVkNjQiICksIDYwOEwpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQzMiIpLCA2MDkgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ZpeGVkNjQiKSwgNjEwTCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2Zsb2F0IiAgICksIDYxMUYpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9kb3VibGUiICApLCA2MTJEKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfYm9vbCIgICAgKSwgdHJ1ZSk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2VudW0iICksICBmb3JlaWduQmFyKTsKKyAgICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50MzIiICAgKSwgNzAxICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ludDY0IiAgICksIDcwMkwpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50MzIiICApLCA3MDMgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfdWludDY0IiAgKSwgNzA0TCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NpbnQzMiIgICksIDcwNSApOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50NjQiICApLCA3MDZMKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQzMiIgKSwgNzA3ICk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ZpeGVkNjQiICksIDcwOEwpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQzMiIpLCA3MDkgKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ZpeGVkNjQiKSwgNzEwTCk7CisgICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2Zsb2F0IiAgICksIDcxMUYpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9kb3VibGUiICApLCA3MTJEKTsKKyAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfYm9vbCIgICAgKSwgZmFsc2UpOworICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9lbnVtIiApLCAgZm9yZWlnbkJheik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXNzZXJ0UGFja2VkRmllbGRzU2V0VmlhUmVmbGVjdGlvbihNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UpIHsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2ludDMyIiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2ludDY0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX3VpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX3VpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX3NpbnQzMiIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX3NpbnQ2NCIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2ZpeGVkMzIiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2ZpeGVkNjQiICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX3NmaXhlZDMyIikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX3NmaXhlZDY0IikpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2Zsb2F0IiAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2RvdWJsZSIgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2Jvb2wiICAgICkpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicGFja2VkX2VudW0iICAgKSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQzMiIgICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ludDY0IiAgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAzICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfdWludDMyIiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50NjQiICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NpbnQzMiIgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA2TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDY0IiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDMyIiApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ZpeGVkNjQiICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA5ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ZpeGVkMzIiKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQ2NCIpLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2Zsb2F0IiAgICksIDApKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjEyRCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZG91YmxlIiAgKSwgMCkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9ib29sIiAgICApLCAwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25CYXIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZW51bSIgKSwwKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwMSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ludDMyIiAgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50NjQiICAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50MzIiICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQ2NCIgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDMyIiAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50NjQiICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ZpeGVkMzIiICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQ2NCIgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQzMiIpLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcxMEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDY0IiksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZmxvYXQiICAgKSwgMSkpOworICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9kb3VibGUiICApLCAxKSk7CisgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2Jvb2wiICAgICksIDEpKTsKKyAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkJheiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9lbnVtIiApLDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSByZWZsZWN0aW9uIHNldHRlcnMgZm9yIHRoZSBnaXZlbi5CdWlsZGVyIG9iamVjdCB0aHJvdyBhCisgICAgICogTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhleSBhcmUgcGFzc2VkIGEgbnVsbCB2YWx1ZS4gIFVzZXMgQXNzZXJ0IHRvIHRocm93IGFuCisgICAgICogYXBwcm9wcmlhdGUgYXNzZXJ0aW9uIGZhaWx1cmUsIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IHZlcmlmaWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFzc2VydFJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbChNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICBidWlsZGVyLnNldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZyIpLCBudWxsKTsKKyAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBidWlsZGVyLnNldEZpZWxkKGYoIm9wdGlvbmFsX2J5dGVzIiksIG51bGwpOworICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX2VudW0iKSwgbnVsbCk7CisgICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgYnVpbGRlci5zZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSkgbnVsbCk7CisgICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgYnVpbGRlci5zZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyKSBudWxsKTsKKyAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciKSwgbnVsbCk7CisgICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIG51bGwpOworICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpLCBudWxsKTsKKyAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgbnVsbCk7CisgICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZmxlY3Rpb24gcmVwZWF0ZWQgc2V0dGVycyBmb3IgdGhlIGdpdmVuIEJ1aWxkZXIgb2JqZWN0IHRocm93IGEKKyAgICAgKiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBwYXNzZWQgYSBudWxsIHZhbHVlLiAgVXNlcyBBc3NlcnQgdG8gdGhyb3cgYW4gYXBwcm9wcmlhdGUKKyAgICAgKiBhc3NlcnRpb24gZmFpbHVyZSwgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgdmVyaWZpZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXNzZXJ0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVyc1JlamVjdE51bGwoTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIpLCAib25lIik7CisgICAgICB0cnkgeworICAgICAgICBidWlsZGVyLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiksIDAsIG51bGwpOworICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgIH0KKworICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIHRvQnl0ZXMoIm9uZSIpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIpLCAwLCBudWxsKTsKKyAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOworICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCisgICAgICB9CisKKyAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpLCBuZXN0ZWRCYXopOworICAgICAgdHJ5IHsKKyAgICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiksIDAsIG51bGwpOworICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7CisgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgIH0KKworICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKAorICAgICAgICAgIGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksCisgICAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDIxOCkuYnVpbGQoKSk7CisgICAgICB0cnkgeworICAgICAgICBidWlsZGVyLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMCwgbnVsbCk7CisgICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKKyAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZmlsZVBhdGggVGhlIHBhdGggcmVsYXRpdmUgdG8KKyAgICoge0BsaW5rICNnZXRUZXN0RGF0YURpcn0uCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkVGV4dEZyb21GaWxlKFN0cmluZyBmaWxlUGF0aCkgeworICAgIHJldHVybiByZWFkQnl0ZXNGcm9tRmlsZShmaWxlUGF0aCkudG9TdHJpbmdVdGY4KCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldFRlc3REYXRhRGlyKCkgeworICAgIC8vIFNlYXJjaCBlYWNoIHBhcmVudCBkaXJlY3RvcnkgbG9va2luZyBmb3IgInNyYy9nb29nbGUvcHJvdG9idWYiLgorICAgIEZpbGUgYW5jZXN0b3IgPSBuZXcgRmlsZSgiLiIpOworICAgIHRyeSB7CisgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgIkNvdWxkbid0IGdldCBjYW5vbmljYWwgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeS4iLCBlKTsKKyAgICB9CisgICAgd2hpbGUgKGFuY2VzdG9yICE9IG51bGwgJiYgYW5jZXN0b3IuZXhpc3RzKCkpIHsKKyAgICAgIGlmIChuZXcgRmlsZShhbmNlc3RvciwgInNyYy9nb29nbGUvcHJvdG9idWYiKS5leGlzdHMoKSkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUoYW5jZXN0b3IsICJzcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhIik7CisgICAgICB9CisgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLmdldFBhcmVudEZpbGUoKTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICJDb3VsZCBub3QgZmluZCBnb2xkZW4gZmlsZXMuICBUaGlzIHRlc3QgbXVzdCBiZSBydW4gZnJvbSB3aXRoaW4gdGhlICIgKworICAgICAgInByb3RvYnVmIHNvdXJjZSBwYWNrYWdlIHNvIHRoYXQgaXQgY2FuIHJlYWQgdGVzdCBkYXRhIGZpbGVzIGZyb20gdGhlICIgKworICAgICAgIkMrKyBzb3VyY2UgdHJlZS4iKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIHBhdGggcmVsYXRpdmUgdG8KKyAgICoge0BsaW5rICNnZXRUZXN0RGF0YURpcn0uCisgICAqLworICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgcmVhZEJ5dGVzRnJvbUZpbGUoU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgRmlsZSBmdWxsUGF0aCA9IG5ldyBGaWxlKGdldFRlc3REYXRhRGlyKCksIGZpbGVuYW1lKTsKKyAgICB0cnkgeworICAgICAgUmFuZG9tQWNjZXNzRmlsZSBmaWxlID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZnVsbFBhdGgsICJyIik7CisgICAgICBieXRlW10gY29udGVudCA9IG5ldyBieXRlWyhpbnQpIGZpbGUubGVuZ3RoKCldOworICAgICAgZmlsZS5yZWFkRnVsbHkoY29udGVudCk7CisgICAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbShjb250ZW50KTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUaHJvdyBhIFJ1bnRpbWVFeGNlcHRpb24gaGVyZSBzbyB0aGF0IHdlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbQorICAgICAgLy8gc3RhdGljIGluaXRpYWxpemVycy4KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICJDb3VsZG4ndCByZWFkIGZpbGU6ICIgKyBmdWxsUGF0aC5nZXRQYXRoKCksIGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGJ5dGVzIG9mIHRoZSAiZ29sZGVuIG1lc3NhZ2UiLiAgVGhpcyBpcyBhIHNlcmlhbGl6ZWQgVGVzdEFsbFR5cGVzCisgICAqIHdpdGggYWxsIGZpZWxkcyBzZXQgYXMgdGhleSB3b3VsZCBiZSBieQorICAgKiB7QGxpbmsgI3NldEFsbEZpZWxkcyhUZXN0QWxsVHlwZXMuQnVpbGRlcil9LCBidXQgaXQgaXMgbG9hZGVkIGZyb20gYSBmaWxlCisgICAqIG9uIGRpc2sgcmF0aGVyIHRoYW4gZ2VuZXJhdGVkIGR5bmFtaWNhbGx5LiAgVGhlIGZpbGUgaXMgYWN0dWFsbHkgZ2VuZXJhdGVkCisgICAqIGJ5IEMrKyBjb2RlLCBzbyB0ZXN0aW5nIGFnYWluc3QgaXQgdmVyaWZpZXMgY29tcGF0aWJpbGl0eSB3aXRoIEMrKy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBnZXRHb2xkZW5NZXNzYWdlKCkgeworICAgIGlmIChnb2xkZW5NZXNzYWdlID09IG51bGwpIHsKKyAgICAgIGdvbGRlbk1lc3NhZ2UgPSByZWFkQnl0ZXNGcm9tRmlsZSgiZ29sZGVuX21lc3NhZ2UiKTsKKyAgICB9CisgICAgcmV0dXJuIGdvbGRlbk1lc3NhZ2U7CisgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBnb2xkZW5NZXNzYWdlID0gbnVsbDsKKworICAvKioKKyAgICogR2V0IHRoZSBieXRlcyBvZiB0aGUgImdvbGRlbiBwYWNrZWQgZmllbGRzIG1lc3NhZ2UiLiAgVGhpcyBpcyBhIHNlcmlhbGl6ZWQKKyAgICogVGVzdFBhY2tlZFR5cGVzIHdpdGggYWxsIGZpZWxkcyBzZXQgYXMgdGhleSB3b3VsZCBiZSBieQorICAgKiB7QGxpbmsgI3NldFBhY2tlZEZpZWxkcyhUZXN0UGFja2VkVHlwZXMuQnVpbGRlcil9LCBidXQgaXQgaXMgbG9hZGVkIGZyb20gYQorICAgKiBmaWxlIG9uIGRpc2sgcmF0aGVyIHRoYW4gZ2VuZXJhdGVkIGR5bmFtaWNhbGx5LiAgVGhlIGZpbGUgaXMgYWN0dWFsbHkKKyAgICogZ2VuZXJhdGVkIGJ5IEMrKyBjb2RlLCBzbyB0ZXN0aW5nIGFnYWluc3QgaXQgdmVyaWZpZXMgY29tcGF0aWJpbGl0eSB3aXRoCisgICAqIEMrKy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBnZXRHb2xkZW5QYWNrZWRGaWVsZHNNZXNzYWdlKCkgeworICAgIGlmIChnb2xkZW5QYWNrZWRGaWVsZHNNZXNzYWdlID09IG51bGwpIHsKKyAgICAgIGdvbGRlblBhY2tlZEZpZWxkc01lc3NhZ2UgPQorICAgICAgICAgIHJlYWRCeXRlc0Zyb21GaWxlKCJnb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlIik7CisgICAgfQorICAgIHJldHVybiBnb2xkZW5QYWNrZWRGaWVsZHNNZXNzYWdlOworICB9CisgIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgZ29sZGVuUGFja2VkRmllbGRzTWVzc2FnZSA9IG51bGw7CisKKyAgLyoqCisgICAqIE1vY2sgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudH0gZm9yIHRlc3RpbmcuCisgICAqCisgICAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2NrQnVpbGRlclBhcmVudAorICAgICAgaW1wbGVtZW50cyBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgeworCisgICAgcHJpdmF0ZSBpbnQgaW52YWxpZGF0aW9uczsKKworICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQorICAgIHB1YmxpYyB2b2lkIG1hcmtEaXJ0eSgpIHsKKyAgICAgIGludmFsaWRhdGlvbnMrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEludmFsaWRhdGlvbkNvdW50KCkgeworICAgICAgcmV0dXJuIGludmFsaWRhdGlvbnM7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjkwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdFRlc3QuamF2YQpAQCAtMCwwICsxLDc1MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOworCitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0OworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0TXNldC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLk9uZVN0cmluZzsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CisKKy8qKgorICogVGVzdCBjYXNlIGZvciB7QGxpbmsgVGV4dEZvcm1hdH0uCisgKgorICogVE9ETyh3ZW5ib3opOiBFeHRlbnNpb25UZXN0IGFuZCByZXN0IG9mIHRleHRfZm9ybWF0X3VuaXR0ZXN0LmNjLgorICoKKyAqIEBhdXRob3Igd2VuYm96QGdvb2dsZS5jb20gKFdlbmJvIFpodSkKKyAqLworcHVibGljIGNsYXNzIFRleHRGb3JtYXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIC8vIEEgYmFzaWMgc3RyaW5nIHdpdGggZGlmZmVyZW50IGVzY2FwYWJsZSBjaGFyYWN0ZXJzIGZvciB0ZXN0aW5nLgorICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcga0VzY2FwZVRlc3RTdHJpbmcgPQorICAgICAgIlwiQSBzdHJpbmcgd2l0aCAnIGNoYXJhY3RlcnMgXG4gYW5kIFxyIG5ld2xpbmVzIGFuZCBcdCB0YWJzIGFuZCBcMDAxICIKKyAgICAgICAgICArICJzbGFzaGVzIFxcIjsKKworICAvLyBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhYm92ZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNoYXJhY3RlcnMgZXNjYXBlZC4KKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZCA9CisgICAgICAiXFxcIkEgc3RyaW5nIHdpdGggXFwnIGNoYXJhY3RlcnMgXFxuIGFuZCBcXHIgbmV3bGluZXMgIgorICAgICAgICAgICsgImFuZCBcXHQgdGFicyBhbmQgXFwwMDEgc2xhc2hlcyBcXFxcIjsKKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYWxsRmllbGRzU2V0VGV4dCA9IFRlc3RVdGlsLnJlYWRUZXh0RnJvbUZpbGUoCisgICAgInRleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0Iik7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBhbGxFeHRlbnNpb25zU2V0VGV4dCA9IFRlc3RVdGlsLnJlYWRUZXh0RnJvbUZpbGUoCisgICAgInRleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQiKTsKKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXhvdGljVGV4dCA9CisgICAgInJlcGVhdGVkX2ludDMyOiAtMVxuIiArCisgICAgInJlcGVhdGVkX2ludDMyOiAtMjE0NzQ4MzY0OFxuIiArCisgICAgInJlcGVhdGVkX2ludDY0OiAtMVxuIiArCisgICAgInJlcGVhdGVkX2ludDY0OiAtOTIyMzM3MjAzNjg1NDc3NTgwOFxuIiArCisgICAgInJlcGVhdGVkX3VpbnQzMjogNDI5NDk2NzI5NVxuIiArCisgICAgInJlcGVhdGVkX3VpbnQzMjogMjE0NzQ4MzY0OFxuIiArCisgICAgInJlcGVhdGVkX3VpbnQ2NDogMTg0NDY3NDQwNzM3MDk1NTE2MTVcbiIgKworICAgICJyZXBlYXRlZF91aW50NjQ6IDkyMjMzNzIwMzY4NTQ3NzU4MDhcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IDEyMy4wXG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxMjMuNVxuIiArCisgICAgInJlcGVhdGVkX2RvdWJsZTogMC4xMjVcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IC4xMjVcbiIgKworICAgICJyZXBlYXRlZF9kb3VibGU6IC0uMTI1XG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzRTE3XG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzRSsxN1xuIiArCisgICAgInJlcGVhdGVkX2RvdWJsZTogLTEuMjNlLTE3XG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAuMjNlKzE3XG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAtLjIzRTE3XG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNUUyMlxuIiArCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzVFLTE4XG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxMjMuNDU2Nzg5XG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiBJbmZpbml0eVxuIiArCisgICAgInJlcGVhdGVkX2RvdWJsZTogLUluZmluaXR5XG4iICsKKyAgICAicmVwZWF0ZWRfZG91YmxlOiBOYU5cbiIgKworICAgICJyZXBlYXRlZF9zdHJpbmc6IFwiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiIiArCisgICAgICAiXFwzNDFcXDIxMFxcMjY0XCJcbiIgKworICAgICJyZXBlYXRlZF9ieXRlczogXCJcXDAwMFxcMDAxXFxhXFxiXFxmXFxuXFxyXFx0XFx2XFxcXFxcJ1xcXCJcXDM3NlwiXG4iOworCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjYW5vbmljYWxFeG90aWNUZXh0ID0KKyAgICAgIGV4b3RpY1RleHQucmVwbGFjZSgiOiAuIiwgIjogMC4iKS5yZXBsYWNlKCI6IC0uIiwgIjogLTAuIikgICAvLyBzaG9ydC1mb3JtIGRvdWJsZQorICAgICAgLnJlcGxhY2UoIjIzZSIsICIyM0UiKS5yZXBsYWNlKCJFKyIsICJFIikucmVwbGFjZSgiMC4yM0UxNyIsICIyLjNFMTYiKTsKKworICBwcml2YXRlIFN0cmluZyBtZXNzYWdlU2V0VGV4dCA9CisgICAgIltwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFdIHtcbiIgKworICAgICIgIGk6IDEyM1xuIiArCisgICAgIn1cbiIgKworICAgICJbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yXSB7XG4iICsKKyAgICAiICBzdHI6IFwiZm9vXCJcbiIgKworICAgICJ9XG4iOworCisgIC8qKiBQcmludCBUZXN0QWxsVHlwZXMgYW5kIGNvbXBhcmUgd2l0aCBnb2xkZW4gZmlsZS4gKi8KKyAgcHVibGljIHZvaWQgdGVzdFByaW50TWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cmluZyBqYXZhVGV4dCA9IFRleHRGb3JtYXQucHJpbnRUb1N0cmluZyhUZXN0VXRpbC5nZXRBbGxTZXQoKSk7CisKKyAgICAvLyBKYXZhIGxpa2VzIHRvIGFkZCBhIHRyYWlsaW5nICIuMCIgdG8gZmxvYXRzIGFuZCBkb3VibGVzLiAgQyBwcmludGYKKyAgICAvLyAod2l0aCAlZyBmb3JtYXQpIGRvZXMgbm90LiAgT3VyIGdvbGRlbiBmaWxlcyBhcmUgdXNlZCBmb3IgYm90aAorICAgIC8vIEMrKyBhbmQgSmF2YSBUZXh0Rm9ybWF0IGNsYXNzZXMsIHNvIHdlIG5lZWQgdG8gY29uZm9ybS4KKyAgICBqYXZhVGV4dCA9IGphdmFUZXh0LnJlcGxhY2UoIi4wXG4iLCAiXG4iKTsKKworICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHNTZXRUZXh0LCBqYXZhVGV4dCk7CisgIH0KKworICAvKiogUHJpbnQgVGVzdEFsbEV4dGVuc2lvbnMgYW5kIGNvbXBhcmUgd2l0aCBnb2xkZW4gZmlsZS4gKi8KKyAgcHVibGljIHZvaWQgdGVzdFByaW50RXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgIFN0cmluZyBqYXZhVGV4dCA9IFRleHRGb3JtYXQucHJpbnRUb1N0cmluZyhUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCkpOworCisgICAgLy8gSmF2YSBsaWtlcyB0byBhZGQgYSB0cmFpbGluZyAiLjAiIHRvIGZsb2F0cyBhbmQgZG91Ymxlcy4gIEMgcHJpbnRmCisgICAgLy8gKHdpdGggJWcgZm9ybWF0KSBkb2VzIG5vdC4gIE91ciBnb2xkZW4gZmlsZXMgYXJlIHVzZWQgZm9yIGJvdGgKKyAgICAvLyBDKysgYW5kIEphdmEgVGV4dEZvcm1hdCBjbGFzc2VzLCBzbyB3ZSBuZWVkIHRvIGNvbmZvcm0uCisgICAgamF2YVRleHQgPSBqYXZhVGV4dC5yZXBsYWNlKCIuMFxuIiwgIlxuIik7CisKKyAgICBhc3NlcnRFcXVhbHMoYWxsRXh0ZW5zaW9uc1NldFRleHQsIGphdmFUZXh0KTsKKyAgfQorCisgIC8vIENyZWF0ZXMgYW4gZXhhbXBsZSB1bmtub3duIGZpZWxkIHNldC4KKyAgcHJpdmF0ZSBVbmtub3duRmllbGRTZXQgbWFrZVVua25vd25GaWVsZFNldCgpIHsKKyAgICByZXR1cm4gVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQorICAgICAgICAuYWRkRmllbGQoNSwKKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRWYXJpbnQoMSkKKyAgICAgICAgICAgIC5hZGRGaXhlZDMyKDIpCisgICAgICAgICAgICAuYWRkRml4ZWQ2NCgzKQorICAgICAgICAgICAgLmFkZExlbmd0aERlbGltaXRlZChCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiNCIpKQorICAgICAgICAgICAgLmFkZEdyb3VwKAorICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRmllbGQoMTAsCisgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLmFkZFZhcmludCg1KQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAuYWRkRmllbGQoOCwKKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRWYXJpbnQoMSkKKyAgICAgICAgICAgIC5hZGRWYXJpbnQoMikKKyAgICAgICAgICAgIC5hZGRWYXJpbnQoMykKKyAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAuYWRkRmllbGQoMTUsCisgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkVmFyaW50KDB4QUJDREVGMTIzNDU2Nzg5MEwpCisgICAgICAgICAgICAuYWRkRml4ZWQzMigweEFCQ0QxMjM0KQorICAgICAgICAgICAgLmFkZEZpeGVkNjQoMHhBQkNERUYxMjM0NTY3ODkwTCkKKyAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQcmludFVua25vd25GaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUZXN0IHByaW50aW5nIG9mIHVua25vd24gZmllbGRzIGluIGEgbWVzc2FnZS4KKworICAgIFRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZSA9CisgICAgICBUZXN0RW1wdHlNZXNzYWdlLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0VW5rbm93bkZpZWxkcyhtYWtlVW5rbm93bkZpZWxkU2V0KCkpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgIjU6IDFcbiIgKworICAgICAgIjU6IDB4MDAwMDAwMDJcbiIgKworICAgICAgIjU6IDB4MDAwMDAwMDAwMDAwMDAwM1xuIiArCisgICAgICAiNTogXCI0XCJcbiIgKworICAgICAgIjUge1xuIiArCisgICAgICAiICAxMDogNVxuIiArCisgICAgICAifVxuIiArCisgICAgICAiODogMVxuIiArCisgICAgICAiODogMlxuIiArCisgICAgICAiODogM1xuIiArCisgICAgICAiMTU6IDEyMzc5ODEzODEyMTc3ODkzNTIwXG4iICsKKyAgICAgICIxNTogMHhhYmNkMTIzNFxuIiArCisgICAgICAiMTU6IDB4YWJjZGVmMTIzNDU2Nzg5MFxuIiwKKyAgICAgIFRleHRGb3JtYXQucHJpbnRUb1N0cmluZyhtZXNzYWdlKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkYXRhRmllbGQgPQorICAgICAgT25lU3RyaW5nLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoImRhdGEiKTsKKyAgICBhc3NlcnRFcXVhbHMoCisgICAgICAiZGF0YTogXCJ0ZXN0IGRhdGFcIlxuIiwKKyAgICAgIFRleHRGb3JtYXQucHJpbnRGaWVsZFRvU3RyaW5nKGRhdGFGaWVsZCwgInRlc3QgZGF0YSIpKTsKKworICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBvcHRpb25hbEZpZWxkID0KKyAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpOworICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDQyKS5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHtcbiAgYmI6IDQyXG59XG4iLAorICAgICAgVGV4dEZvcm1hdC5wcmludEZpZWxkVG9TdHJpbmcob3B0aW9uYWxGaWVsZCwgdmFsdWUpKTsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgdG8gY29uc3RydWN0IGEgQnl0ZVN0cmluZyBmcm9tIGEgU3RyaW5nIGNvbnRhaW5pbmcgb25seSA4LWJpdAorICAgKiBjaGFyYWN0ZXJzLiAgVGhlIGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCBkaXJlY3RseSB0byBieXRlcywgKm5vdCoKKyAgICogZW5jb2RlZCB1c2luZyBVVEYtOC4KKyAgICovCisgIHByaXZhdGUgQnl0ZVN0cmluZyBieXRlcyhTdHJpbmcgc3RyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbShzdHIuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7CisgIH0KKworICAvKioKKyAgICogSGVscGVyIHRvIGNvbnN0cnVjdCBhIEJ5dGVTdHJpbmcgZnJvbSBhIGJ1bmNoIG9mIGJ5dGVzLiAgVGhlIGlucHV0cyBhcmUKKyAgICogYWN0dWFsbHkgaW50cyBzbyB0aGF0IEkgY2FuIHVzZSBoZXggbm90YXRpb24gYW5kIG5vdCBnZXQgc3R1cGlkIGVycm9ycworICAgKiBhYm91dCBwcmVjaXNpb24uCisgICAqLworICBwcml2YXRlIEJ5dGVTdHJpbmcgYnl0ZXMoaW50Li4uIGJ5dGVzQXNJbnRzKSB7CisgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXNBc0ludHMubGVuZ3RoXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzQXNJbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICBieXRlc1tpXSA9IChieXRlKSBieXRlc0FzSW50c1tpXTsKKyAgICB9CisgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFByaW50RXhvdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTWVzc2FnZSBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQorICAgICAgLy8gU2lnbmVkIHZzLiB1bnNpZ25lZCBudW1iZXJzLgorICAgICAgLmFkZFJlcGVhdGVkSW50MzIgKC0xKQorICAgICAgLmFkZFJlcGVhdGVkVWludDMyKC0xKQorICAgICAgLmFkZFJlcGVhdGVkSW50NjQgKC0xKQorICAgICAgLmFkZFJlcGVhdGVkVWludDY0KC0xKQorCisgICAgICAuYWRkUmVwZWF0ZWRJbnQzMiAoMSAgPDwgMzEpCisgICAgICAuYWRkUmVwZWF0ZWRVaW50MzIoMSAgPDwgMzEpCisgICAgICAuYWRkUmVwZWF0ZWRJbnQ2NCAoMWwgPDwgNjMpCisgICAgICAuYWRkUmVwZWF0ZWRVaW50NjQoMWwgPDwgNjMpCisKKyAgICAgIC8vIEZsb2F0cyBvZiB2YXJpb3VzIHByZWNpc2lvbnMgYW5kIGV4cG9uZW50cy4KKyAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgxMjMpCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMTIzLjUpCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMC4xMjUpCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoLjEyNSkKKyAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgtLjEyNSkKKyAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgxMjNlMTUpCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMTIzZTE1KQorICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKC0xLjIzZS0xNykKKyAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSguMjNlMTcpCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoLTIzZTE1KQorICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKDEyMy41ZTIwKQorICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKDEyMy41ZS0yMCkKKyAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgxMjMuNDU2Nzg5KQorICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSkKKyAgICAgIC5hZGRSZXBlYXRlZERvdWJsZShEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkpCisgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoRG91YmxlLk5hTikKKworICAgICAgLy8gU3RyaW5ncyBhbmQgYnl0ZXMgdGhhdCBuZWVkaW5nIGVzY2FwaW5nLgorICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJcMFwwMDFcMDA3XGJcZlxuXHJcdFwwMTNcXFwnXCJcdTEyMzQiKQorICAgICAgLmFkZFJlcGVhdGVkQnl0ZXMoYnl0ZXMoIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIlx1MDBmZSIpKQorICAgICAgLmJ1aWxkKCk7CisKKyAgICBhc3NlcnRFcXVhbHMoY2Fub25pY2FsRXhvdGljVGV4dCwgbWVzc2FnZS50b1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQcmludE1lc3NhZ2VTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0KKyAgICAgIFRlc3RNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0RXh0ZW5zaW9uKAorICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uLAorICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5uZXdCdWlsZGVyKCkuc2V0SSgxMjMpLmJ1aWxkKCkpCisgICAgICAgIC5zZXRFeHRlbnNpb24oCisgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24sCisgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm5ld0J1aWxkZXIoKS5zZXRTdHIoImZvbyIpLmJ1aWxkKCkpCisgICAgICAgIC5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2VTZXRUZXh0LCBtZXNzYWdlU2V0LnRvU3RyaW5nKCkpOworICB9CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXh0Rm9ybWF0Lm1lcmdlKGFsbEZpZWxkc1NldFRleHQsIGJ1aWxkZXIpOworICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChidWlsZGVyLmJ1aWxkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlUmVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGV4dEZvcm1hdC5tZXJnZShuZXcgU3RyaW5nUmVhZGVyKGFsbEZpZWxkc1NldFRleHQpLCBidWlsZGVyKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoYnVpbGRlci5idWlsZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7CisgICAgVGV4dEZvcm1hdC5tZXJnZShhbGxFeHRlbnNpb25zU2V0VGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCksCisgICAgICAgICAgICAgICAgICAgICBidWlsZGVyKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KGJ1aWxkZXIuYnVpbGQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VDb21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIG9yaWdpbmFsID0gInJlcGVhdGVkX2Zsb2F0OiBpbmZcbiIgKworICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogLWluZlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBuYW5cbiIgKworICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogaW5mZlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtaW5mZlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBuYW5mXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMGZcbiIgKworICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogaW5maW5pdHlmXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IC1JbmZpbml0eWZcbiIgKworICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IGluZmluaXR5XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiAtaW5maW5pdHlcbiIgKworICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IG5hblxuIjsKKyAgICBTdHJpbmcgY2Fub25pY2FsID0gICJyZXBlYXRlZF9mbG9hdDogSW5maW5pdHlcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtSW5maW5pdHlcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBOYU5cbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBJbmZpbml0eVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IC1JbmZpbml0eVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IE5hTlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IEluZmluaXR5XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogLUluZmluaXR5XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IEluZmluaXR5XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IC1JbmZpbml0eVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiBOYU5cbiI7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGV4dEZvcm1hdC5tZXJnZShvcmlnaW5hbCwgYnVpbGRlcik7CisgICAgYXNzZXJ0RXF1YWxzKGNhbm9uaWNhbCwgYnVpbGRlci5idWlsZCgpLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlRXhvdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGV4dEZvcm1hdC5tZXJnZShleG90aWNUZXh0LCBidWlsZGVyKTsKKworICAgIC8vIFRvbyBsYXp5IHRvIGNoZWNrIHRoaW5ncyBpbmRpdmlkdWFsbHkuICBEb24ndCB0cnkgdG8gZGVidWcgdGhpcworICAgIC8vIGlmIHRlc3RQcmludEV4b3RpYygpIGlzIGZhaWxpbmcuCisgICAgYXNzZXJ0RXF1YWxzKGNhbm9uaWNhbEV4b3RpY1RleHQsIGJ1aWxkZXIuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7CisgICAgZXh0ZW5zaW9uUmVnaXN0cnkuYWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKTsKKyAgICBleHRlbnNpb25SZWdpc3RyeS5hZGQoVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pOworCisgICAgVGVzdE1lc3NhZ2VTZXQuQnVpbGRlciBidWlsZGVyID0gVGVzdE1lc3NhZ2VTZXQubmV3QnVpbGRlcigpOworICAgIFRleHRGb3JtYXQubWVyZ2UobWVzc2FnZVNldFRleHQsIGV4dGVuc2lvblJlZ2lzdHJ5LCBidWlsZGVyKTsKKyAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0gYnVpbGRlci5idWlsZCgpOworCisgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlU2V0Lmhhc0V4dGVuc2lvbigKKyAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEyMywgbWVzc2FnZVNldC5nZXRFeHRlbnNpb24oCisgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbikuZ2V0SSgpKTsKKyAgICBhc3NlcnRUcnVlKG1lc3NhZ2VTZXQuaGFzRXh0ZW5zaW9uKAorICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyIsIG1lc3NhZ2VTZXQuZ2V0RXh0ZW5zaW9uKAorICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pLmdldFN0cigpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU51bWVyaWNFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGV4dEZvcm1hdC5tZXJnZSgib3B0aW9uYWxfbmVzdGVkX2VudW06IDIiLCBidWlsZGVyKTsKKyAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLCBidWlsZGVyLmdldE9wdGlvbmFsTmVzdGVkRW51bSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUFuZ2xlQnJhY2tldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBUZXh0Rm9ybWF0Lm1lcmdlKCJPcHRpb25hbEdyb3VwOiA8IGE6IDEgPiIsIGJ1aWxkZXIpOworICAgIGFzc2VydFRydWUoYnVpbGRlci5oYXNPcHRpb25hbEdyb3VwKCkpOworICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE9wdGlvbmFsR3JvdXAoKS5nZXRBKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlQ29tbWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRleHRGb3JtYXQubWVyZ2UoCisgICAgICAiIyB0aGlzIGlzIGEgY29tbWVudFxuIiArCisgICAgICAib3B0aW9uYWxfaW50MzI6IDEgICMgYW5vdGhlciBjb21tZW50XG4iICsKKyAgICAgICJvcHRpb25hbF9pbnQ2NDogMlxuIiArCisgICAgICAiIyBFT0YgY29tbWVudCIsIGJ1aWxkZXIpOworICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE9wdGlvbmFsSW50MzIoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxJbnQ2NCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRQYXJzZUVycm9yKFN0cmluZyBlcnJvciwgU3RyaW5nIHRleHQpIHsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICB0cnkgeworICAgICAgVGV4dEZvcm1hdC5tZXJnZSh0ZXh0LCBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLCBidWlsZGVyKTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIHBhcnNlIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChUZXh0Rm9ybWF0LlBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscyhlcnJvciwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUVycm9ycygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToxNjogRXhwZWN0ZWQgXCI6XCIuIiwKKyAgICAgICJvcHRpb25hbF9pbnQzMiAxMjMiKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MjM6IEV4cGVjdGVkIGlkZW50aWZpZXIuIiwKKyAgICAgICJvcHRpb25hbF9uZXN0ZWRfZW51bTogPyIpOworICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToxODogQ291bGRuJ3QgcGFyc2UgaW50ZWdlcjogTnVtYmVyIG11c3QgYmUgcG9zaXRpdmU6IC0xIiwKKyAgICAgICJvcHRpb25hbF91aW50MzI6IC0xIik7CisgICAgYXNzZXJ0UGFyc2VFcnJvcigKKyAgICAgICIxOjE3OiBDb3VsZG4ndCBwYXJzZSBpbnRlZ2VyOiBOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAzMi1iaXQgc2lnbmVkICIgKworICAgICAgICAiaW50ZWdlcjogODIzMDE0ODEyOTA4NDkwMTIzODUyMzAxNTciLAorICAgICAgIm9wdGlvbmFsX2ludDMyOiA4MjMwMTQ4MTI5MDg0OTAxMjM4NTIzMDE1NyIpOworICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToxNjogRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLiIsCisgICAgICAib3B0aW9uYWxfYm9vbDogbWF5YmUiKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MTY6IEV4cGVjdGVkIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIi4iLAorICAgICAgIm9wdGlvbmFsX2Jvb2w6IDIiKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MTg6IEV4cGVjdGVkIHN0cmluZy4iLAorICAgICAgIm9wdGlvbmFsX3N0cmluZzogMTIzIik7CisgICAgYXNzZXJ0UGFyc2VFcnJvcigKKyAgICAgICIxOjE4OiBTdHJpbmcgbWlzc2luZyBlbmRpbmcgcXVvdGUuIiwKKyAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwidWVvYXVhb2UiKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MTg6IFN0cmluZyBtaXNzaW5nIGVuZGluZyBxdW90ZS4iLAorICAgICAgIm9wdGlvbmFsX3N0cmluZzogXCJ1ZW9hdWFvZVxuIiArCisgICAgICAib3B0aW9uYWxfaW50MzI6IDEyMyIpOworICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToxODogSW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6ICdcXHonIiwKKyAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwiXFx6XCIiKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MTg6IFN0cmluZyBtaXNzaW5nIGVuZGluZyBxdW90ZS4iLAorICAgICAgIm9wdGlvbmFsX3N0cmluZzogXCJ1ZW9hdWFvZVxuIiArCisgICAgICAib3B0aW9uYWxfaW50MzI6IDEyMyIpOworICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToyOiBFeHRlbnNpb24gXCJub3N1Y2hleHRcIiBub3QgZm91bmQgaW4gdGhlIEV4dGVuc2lvblJlZ2lzdHJ5LiIsCisgICAgICAiW25vc3VjaGV4dF06IDEyMyIpOworICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToyMDogRXh0ZW5zaW9uIFwicHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXCIgZG9lcyAiICsKKyAgICAgICAgIm5vdCBleHRlbmQgbWVzc2FnZSB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIuIiwKKyAgICAgICJbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXTogMTIzIik7CisgICAgYXNzZXJ0UGFyc2VFcnJvcigKKyAgICAgICIxOjE6IE1lc3NhZ2UgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1wiIGhhcyBubyBmaWVsZCAiICsKKyAgICAgICAgIm5hbWVkIFwibm9zdWNoZmllbGRcIi4iLAorICAgICAgIm5vc3VjaGZpZWxkOiAxMjMiKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MjE6IEV4cGVjdGVkIFwiPlwiLiIsCisgICAgICAiT3B0aW9uYWxHcm91cCA8IGE6IDEiKTsKKyAgICBhc3NlcnRQYXJzZUVycm9yKAorICAgICAgIjE6MjM6IEVudW0gdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtXCIgaGFzIG5vICIgKworICAgICAgICAidmFsdWUgbmFtZWQgXCJOT19TVUNIX1ZBTFVFXCIuIiwKKyAgICAgICJvcHRpb25hbF9uZXN0ZWRfZW51bTogTk9fU1VDSF9WQUxVRSIpOworICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToyMzogRW51bSB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW1cIiBoYXMgbm8gIiArCisgICAgICAgICJ2YWx1ZSB3aXRoIG51bWJlciAxMjMuIiwKKyAgICAgICJvcHRpb25hbF9uZXN0ZWRfZW51bTogMTIzIik7CisKKyAgICAvLyBEZWxpbWl0ZXJzIG11c3QgbWF0Y2guCisgICAgYXNzZXJ0UGFyc2VFcnJvcigKKyAgICAgICIxOjIyOiBFeHBlY3RlZCBpZGVudGlmaWVyLiIsCisgICAgICAiT3B0aW9uYWxHcm91cCA8IGE6IDEgfSIpOworICAgIGFzc2VydFBhcnNlRXJyb3IoCisgICAgICAiMToyMjogRXhwZWN0ZWQgaWRlbnRpZmllci4iLAorICAgICAgIk9wdGlvbmFsR3JvdXAgeyBhOiAxID4iKTsKKyAgfQorCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgcHVibGljIHZvaWQgdGVzdEVzY2FwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIEVzY2FwZSBzZXF1ZW5jZXMuCisgICAgYXNzZXJ0RXF1YWxzKCJcXDAwMFxcMDAxXFxhXFxiXFxmXFxuXFxyXFx0XFx2XFxcXFxcJ1xcXCIiLAorICAgICAgVGV4dEZvcm1hdC5lc2NhcGVCeXRlcyhieXRlcygiXDBcMDAxXDAwN1xiXGZcblxyXHRcMDEzXFxcJ1wiIikpKTsKKyAgICBhc3NlcnRFcXVhbHMoIlxcMDAwXFwwMDFcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXFxcXFwnXFxcIiIsCisgICAgICBUZXh0Rm9ybWF0LmVzY2FwZVRleHQoIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIiIpKTsKKyAgICBhc3NlcnRFcXVhbHMoYnl0ZXMoIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIiIpLAorICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZUJ5dGVzKCJcXDAwMFxcMDAxXFxhXFxiXFxmXFxuXFxyXFx0XFx2XFxcXFxcJ1xcXCIiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJcMFwwMDFcMDA3XGJcZlxuXHJcdFwwMTNcXFwnXCIiLAorICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZVRleHQoIlxcMDAwXFwwMDFcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXFxcXFwnXFxcIiIpKTsKKyAgICBhc3NlcnRFcXVhbHMoa0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkLAorICAgICAgVGV4dEZvcm1hdC5lc2NhcGVUZXh0KGtFc2NhcGVUZXN0U3RyaW5nKSk7CisgICAgYXNzZXJ0RXF1YWxzKGtFc2NhcGVUZXN0U3RyaW5nLAorICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZVRleHQoa0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkKSk7CisKKyAgICAvLyBVbmljb2RlIGhhbmRsaW5nLgorICAgIGFzc2VydEVxdWFscygiXFwzNDFcXDIxMFxcMjY0IiwgVGV4dEZvcm1hdC5lc2NhcGVUZXh0KCJcdTEyMzQiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJcXDM0MVxcMjEwXFwyNjQiLAorICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0LmVzY2FwZUJ5dGVzKGJ5dGVzKDB4ZTEsIDB4ODgsIDB4YjQpKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJcdTEyMzQiLCBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiXFwzNDFcXDIxMFxcMjY0IikpOworICAgIGFzc2VydEVxdWFscyhieXRlcygweGUxLCAweDg4LCAweGI0KSwKKyAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZUJ5dGVzKCJcXDM0MVxcMjEwXFwyNjQiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJcdTEyMzQiLCBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiXFx4ZTFcXHg4OFxceGI0IikpOworICAgIGFzc2VydEVxdWFscyhieXRlcygweGUxLCAweDg4LCAweGI0KSwKKyAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZUJ5dGVzKCJcXHhlMVxceDg4XFx4YjQiKSk7CisKKyAgICAvLyBIYW5kbGluZyBvZiBzdHJpbmdzIHdpdGggdW5lc2NhcGVkIFVuaWNvZGUgY2hhcmFjdGVycyA+IDI1NS4KKyAgICBmaW5hbCBTdHJpbmcgemggPSAiXHU5OTk5XHU2ZTJmXHU0ZTBhXHU2ZDc3XHVkODRmXHVkZjgwXHU4YzUwXHU5MjgwXHU4ODRjIjsKKyAgICBCeXRlU3RyaW5nIHpoQnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KHpoKTsKKyAgICBhc3NlcnRFcXVhbHMoemhCeXRlU3RyaW5nLCBUZXh0Rm9ybWF0LnVuZXNjYXBlQnl0ZXMoemgpKTsKKworICAgIC8vIEVycm9ycy4KKyAgICB0cnkgeworICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZVRleHQoIlxceCIpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChUZXh0Rm9ybWF0LkludmFsaWRFc2NhcGVTZXF1ZW5jZUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIFRleHRGb3JtYXQudW5lc2NhcGVUZXh0KCJcXHoiKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5JbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgeworICAgICAgLy8gc3VjY2VzcworICAgIH0KKworICAgIHRyeSB7CisgICAgICBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiXFwiKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5JbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgeworICAgICAgLy8gc3VjY2VzcworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUludGVnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgIDAsIFRleHRGb3JtYXQucGFyc2VJbnQzMiggICAgICAgICAgIjAiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAxLCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoICAgICAgICAgICIxIikpOworICAgIGFzc2VydEVxdWFscyggICAgICAgICAtMSwgVGV4dEZvcm1hdC5wYXJzZUludDMyKCAgICAgICAgICItMSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgMTIzNDUsIFRleHRGb3JtYXQucGFyc2VJbnQzMiggICAgICAiMTIzNDUiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAgICAgLTEyMzQ1LCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoICAgICAiLTEyMzQ1IikpOworICAgIGFzc2VydEVxdWFscyggMjE0NzQ4MzY0NywgVGV4dEZvcm1hdC5wYXJzZUludDMyKCAiMjE0NzQ4MzY0NyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoLTIxNDc0ODM2NDgsIFRleHRGb3JtYXQucGFyc2VJbnQzMigiLTIxNDc0ODM2NDgiKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgICAgICAgIDAsIFRleHRGb3JtYXQucGFyc2VVSW50MzIoICAgICAgICAgIjAiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAgICAgICAxLCBUZXh0Rm9ybWF0LnBhcnNlVUludDMyKCAgICAgICAgICIxIikpOworICAgIGFzc2VydEVxdWFscyggICAgICAgICAgICAxMjM0NSwgVGV4dEZvcm1hdC5wYXJzZVVJbnQzMiggICAgICIxMjM0NSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgIDIxNDc0ODM2NDcsIFRleHRGb3JtYXQucGFyc2VVSW50MzIoIjIxNDc0ODM2NDciKSk7CisgICAgYXNzZXJ0RXF1YWxzKChpbnQpIDIxNDc0ODM2NDhMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDMyKCIyMTQ3NDgzNjQ4IikpOworICAgIGFzc2VydEVxdWFscygoaW50KSA0Mjk0OTY3Mjk1TCwgVGV4dEZvcm1hdC5wYXJzZVVJbnQzMigiNDI5NDk2NzI5NSIpKTsKKworICAgIGFzc2VydEVxdWFscyggICAgICAgICAgMEwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCggICAgICAgICAgIjAiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAxTCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAgICAgICAgICAiMSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgLTFMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoICAgICAgICAgIi0xIikpOworICAgIGFzc2VydEVxdWFscyggICAgICAxMjM0NUwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCggICAgICAiMTIzNDUiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCAgICAgLTEyMzQ1TCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAgICAgIi0xMjM0NSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIDIxNDc0ODM2NDdMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoICIyMTQ3NDgzNjQ3IikpOworICAgIGFzc2VydEVxdWFscygtMjE0NzQ4MzY0OEwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCgiLTIxNDc0ODM2NDgiKSk7CisgICAgYXNzZXJ0RXF1YWxzKCA0Mjk0OTY3Mjk1TCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAiNDI5NDk2NzI5NSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIDQyOTQ5NjcyOTZMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoICI0Mjk0OTY3Mjk2IikpOworICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwKKyAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5wYXJzZUludDY0KCI5MjIzMzcyMDM2ODU0Nzc1ODA3IikpOworICAgIGFzc2VydEVxdWFscygtOTIyMzM3MjAzNjg1NDc3NTgwOEwsCisgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQ2NCgiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiKSk7CisKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgIDBMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAgICAgICAgICAiMCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgIDFMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAgICAgICAgICAiMSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoICAgICAgMTIzNDVMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAgICAgICIxMjM0NSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIDIxNDc0ODM2NDdMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAiMjE0NzQ4MzY0NyIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIDQyOTQ5NjcyOTVMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAiNDI5NDk2NzI5NSIpKTsKKyAgICBhc3NlcnRFcXVhbHMoIDQyOTQ5NjcyOTZMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAiNDI5NDk2NzI5NiIpKTsKKyAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsCisgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQucGFyc2VVSW50NjQoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKSk7CisgICAgYXNzZXJ0RXF1YWxzKC05MjIzMzcyMDM2ODU0Nzc1ODA4TCwKKyAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiOTIyMzM3MjAzNjg1NDc3NTgwOCIpKTsKKyAgICBhc3NlcnRFcXVhbHMoLTFMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCIxODQ0Njc0NDA3MzcwOTU1MTYxNSIpKTsKKworICAgIC8vIEhleAorICAgIGFzc2VydEVxdWFscygweDEyMzRhYmNkLCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIjB4MTIzNGFiY2QiKSk7CisgICAgYXNzZXJ0RXF1YWxzKC0weDEyMzRhYmNkLCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIi0weDEyMzRhYmNkIikpOworICAgIGFzc2VydEVxdWFscygtMSwgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiMHhmZmZmZmZmZmZmZmZmZmZmIikpOworICAgIGFzc2VydEVxdWFscygweDdmZmZmZmZmZmZmZmZmZmZMLAorICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoIjB4N2ZmZmZmZmZmZmZmZmZmZiIpKTsKKworICAgIC8vIE9jdGFsCisgICAgYXNzZXJ0RXF1YWxzKDAxMjM0NTY3LCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIjAxMjM0NTY3IikpOworCisgICAgLy8gT3V0LW9mLXJhbmdlCisgICAgdHJ5IHsKKyAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQzMigiMjE0NzQ4MzY0OCIpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgLy8gc3VjY2VzcworICAgIH0KKworICAgIHRyeSB7CisgICAgICBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIi0yMTQ3NDgzNjQ5Iik7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIFRleHRGb3JtYXQucGFyc2VVSW50MzIoIjQyOTQ5NjcyOTYiKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQzMigiLTEiKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgVGV4dEZvcm1hdC5wYXJzZUludDY0KCI5MjIzMzcyMDM2ODU0Nzc1ODA4Iik7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzCisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQ2NCgiLTkyMjMzNzIwMzY4NTQ3NzU4MDkiKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiMTg0NDY3NDQwNzM3MDk1NTE2MTYiKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiLTEiKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MKKyAgICB9CisKKyAgICAvLyBOb3QgYSBudW1iZXIuCisgICAgdHJ5IHsKKyAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQzMigiYWJjZCIpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgLy8gc3VjY2VzcworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFN0cmluZyB6aCA9ICJcdTk5OTlcdTZlMmZcdTRlMGFcdTZkNzdcdWQ4NGZcdWRmODBcdThjNTBcdTkyODBcdTg4NGMiOworICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOworICAgIFRleHRGb3JtYXQubWVyZ2UoIm9wdGlvbmFsX3N0cmluZzogXCIiICsgemggKyAiXCIiLCBidWlsZGVyKTsKKyAgICBhc3NlcnRFcXVhbHMoemgsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxTdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VMb25nU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGxvbmdUZXh0ID0KKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiOworCisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGV4dEZvcm1hdC5tZXJnZSgib3B0aW9uYWxfc3RyaW5nOiBcIiIgKyBsb25nVGV4dCArICJcIiIsIGJ1aWxkZXIpOworICAgIGFzc2VydEVxdWFscyhsb25nVGV4dCwgYnVpbGRlci5nZXRPcHRpb25hbFN0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUJvb2xlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgZ29vZFRleHQgPQorICAgICAgICAicmVwZWF0ZWRfYm9vbDogdCAgcmVwZWF0ZWRfYm9vbCA6IDBcbiIgKworICAgICAgICAicmVwZWF0ZWRfYm9vbCA6ZiByZXBlYXRlZF9ib29sOjEiOworICAgIFN0cmluZyBnb29kVGV4dENhbm9uaWNhbCA9CisgICAgICAgICJyZXBlYXRlZF9ib29sOiB0cnVlXG4iICsKKyAgICAgICAgInJlcGVhdGVkX2Jvb2w6IGZhbHNlXG4iICsKKyAgICAgICAgInJlcGVhdGVkX2Jvb2w6IGZhbHNlXG4iICsKKyAgICAgICAgInJlcGVhdGVkX2Jvb2w6IHRydWVcbiI7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGV4dEZvcm1hdC5tZXJnZShnb29kVGV4dCwgYnVpbGRlcik7CisgICAgYXNzZXJ0RXF1YWxzKGdvb2RUZXh0Q2Fub25pY2FsLCBidWlsZGVyLmJ1aWxkKCkudG9TdHJpbmcoKSk7CisKKyAgICB0cnkgeworICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYmFkQnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgICBUZXh0Rm9ybWF0Lm1lcmdlKCJvcHRpb25hbF9ib29sOjIiLCBiYWRCdWlsZGVyKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5QYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBzdWNjZXNzCisgICAgfQorICAgIHRyeSB7CisgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBiYWRCdWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICAgIFRleHRGb3JtYXQubWVyZ2UoIm9wdGlvbmFsX2Jvb2w6IGZvbyIsIGJhZEJ1aWxkZXIpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChUZXh0Rm9ybWF0LlBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHN1Y2Nlc3MKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VBZGphY2VudFN0cmluZ0xpdGVyYWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7CisgICAgVGV4dEZvcm1hdC5tZXJnZSgib3B0aW9uYWxfc3RyaW5nOiBcImZvb1wiICdjb3JnZScgXCJncmF1bHRcIiIsIGJ1aWxkZXIpOworICAgIGFzc2VydEVxdWFscygiZm9vY29yZ2VncmF1bHQiLCBidWlsZGVyLmdldE9wdGlvbmFsU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFByaW50RmllbGRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiXCJIZWxsb1wiIiwgIkhlbGxvIiwgInJlcGVhdGVkX3N0cmluZyIpOworICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiMTIzLjAiLCAgMTIzZiwgInJlcGVhdGVkX2Zsb2F0Iik7CisgICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCIxMjMuMCIsICAxMjNkLCAicmVwZWF0ZWRfZG91YmxlIik7CisgICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCIxMjMiLCAgMTIzLCAicmVwZWF0ZWRfaW50MzIiKTsKKyAgICBhc3NlcnRQcmludEZpZWxkVmFsdWUoIjEyMyIsICAxMjNMLCAicmVwZWF0ZWRfaW50NjQiKTsKKyAgICBhc3NlcnRQcmludEZpZWxkVmFsdWUoInRydWUiLCAgdHJ1ZSwgInJlcGVhdGVkX2Jvb2wiKTsKKyAgICBhc3NlcnRQcmludEZpZWxkVmFsdWUoIjQyOTQ5NjcyOTUiLCAweEZGRkZGRkZGLCAicmVwZWF0ZWRfdWludDMyIik7CisgICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCIxODQ0Njc0NDA3MzcwOTU1MTYxNSIsICAweEZGRkZGRkZGRkZGRkZGRkZMLAorICAgICAgICAicmVwZWF0ZWRfdWludDY0Iik7CisgICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCJcIlxcMDAxXFwwMDJcXDAwM1wiIiwKKyAgICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbShuZXcgYnl0ZVtdIHsxLCAyLCAzfSksICJyZXBlYXRlZF9ieXRlcyIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydFByaW50RmllbGRWYWx1ZShTdHJpbmcgZXhwZWN0LCBPYmplY3QgdmFsdWUsCisgICAgICBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBUZXh0Rm9ybWF0LnByaW50RmllbGRWYWx1ZSgKKyAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoZmllbGROYW1lKSwKKyAgICAgICAgdmFsdWUsIHNiKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0LCBzYi50b1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTaG9ydERlYnVnU3RyaW5nKCkgeworICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeyBiYjogNDIgfSByZXBlYXRlZF9pbnQzMjogMSIKKyAgICAgICAgKyAiIHJlcGVhdGVkX3VpbnQzMjogMiIsCisgICAgICAgIFRleHRGb3JtYXQuc2hvcnREZWJ1Z1N0cmluZyhUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkUmVwZWF0ZWRJbnQzMigxKQorICAgICAgICAgICAgLmFkZFJlcGVhdGVkVWludDMyKDIpCisgICAgICAgICAgICAuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgICAgIE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDQyKS5idWlsZCgpKQorICAgICAgICAgICAgLmJ1aWxkKCkpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTaG9ydERlYnVnU3RyaW5nX3Vua25vd24oKSB7CisgICAgYXNzZXJ0RXF1YWxzKCI1OiAxIDU6IDB4MDAwMDAwMDIgNTogMHgwMDAwMDAwMDAwMDAwMDAzIDU6IFwiNFwiIDUgeyAxMDogNSB9IgorICAgICAgICArICIgODogMSA4OiAyIDg6IDMgMTU6IDEyMzc5ODEzODEyMTc3ODkzNTIwIDE1OiAweGFiY2QxMjM0IDE1OiIKKyAgICAgICAgKyAiIDB4YWJjZGVmMTIzNDU2Nzg5MCIsCisgICAgICAgIFRleHRGb3JtYXQuc2hvcnREZWJ1Z1N0cmluZyhtYWtlVW5rbm93bkZpZWxkU2V0KCkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRmllbGRTZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwODhiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRmllbGRTZXRUZXN0LmphdmEKQEAgLTAsMCArMSw0MzcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2U7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVGVzdHMgcmVsYXRlZCB0byB1bmtub3duIGZpZWxkIGhhbmRsaW5nLgorICoKKyAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKyAqLworcHVibGljIGNsYXNzIFVua25vd25GaWVsZFNldFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZGVzY3JpcHRvciA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7CisgICAgYWxsRmllbGRzID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7CisgICAgYWxsRmllbGRzRGF0YSA9IGFsbEZpZWxkcy50b0J5dGVTdHJpbmcoKTsKKyAgICBlbXB0eU1lc3NhZ2UgPSBUZXN0RW1wdHlNZXNzYWdlLnBhcnNlRnJvbShhbGxGaWVsZHNEYXRhKTsKKyAgICB1bmtub3duRmllbGRzID0gZW1wdHlNZXNzYWdlLmdldFVua25vd25GaWVsZHMoKTsKKyAgfQorCisgIFVua25vd25GaWVsZFNldC5GaWVsZCBnZXRGaWVsZChTdHJpbmcgbmFtZSkgeworICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKG5hbWUpOworICAgIGFzc2VydE5vdE51bGwoZmllbGQpOworICAgIHJldHVybiB1bmtub3duRmllbGRzLmdldEZpZWxkKGZpZWxkLmdldE51bWJlcigpKTsKKyAgfQorCisgIC8vIENvbnN0cnVjdHMgYSBwcm90b2NvbCBidWZmZXIgd2hpY2ggY29udGFpbnMgZmllbGRzIHdpdGggYWxsIHRoZSBzYW1lCisgIC8vIG51bWJlcnMgYXMgYWxsRmllbGRzRGF0YSBleGNlcHQgdGhhdCBlYWNoIGZpZWxkIGlzIHNvbWUgb3RoZXIgd2lyZQorICAvLyB0eXBlLgorICBCeXRlU3RyaW5nIGdldEJpemFycm9EYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgYml6YXJyb0ZpZWxkcyA9IFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCk7CisKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgdmFyaW50RmllbGQgPQorICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKS5hZGRWYXJpbnQoMSkuYnVpbGQoKTsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZml4ZWQzMkZpZWxkID0KKyAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkuYWRkRml4ZWQzMigxKS5idWlsZCgpOworCisgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgVW5rbm93bkZpZWxkU2V0LkZpZWxkPiBlbnRyeSA6CisgICAgICAgICB1bmtub3duRmllbGRzLmFzTWFwKCkuZW50cnlTZXQoKSkgeworICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkuZ2V0VmFyaW50TGlzdCgpLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBPcmlnaW5hbCBmaWVsZCBpcyBub3QgYSB2YXJpbnQsIHNvIHVzZSBhIHZhcmludC4KKyAgICAgICAgYml6YXJyb0ZpZWxkcy5hZGRGaWVsZChlbnRyeS5nZXRLZXkoKSwgdmFyaW50RmllbGQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gT3JpZ2luYWwgZmllbGQgKmlzKiBhIHZhcmludCwgc28gdXNlIHNvbWV0aGluZyBlbHNlLgorICAgICAgICBiaXphcnJvRmllbGRzLmFkZEZpZWxkKGVudHJ5LmdldEtleSgpLCBmaXhlZDMyRmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiaXphcnJvRmllbGRzLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCk7CisgIH0KKworICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgIFRlc3RBbGxUeXBlcyBhbGxGaWVsZHM7CisgIEJ5dGVTdHJpbmcgYWxsRmllbGRzRGF0YTsKKworICAvLyBBbiBlbXB0eSBtZXNzYWdlIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYWxsRmllbGRzRGF0YS4gIFNvLCBpdCBoYXMKKyAgLy8gdW5rbm93biBmaWVsZHMgb2YgZXZlcnkgdHlwZS4KKyAgVGVzdEVtcHR5TWVzc2FnZSBlbXB0eU1lc3NhZ2U7CisgIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgcHVibGljIHZvaWQgdGVzdFZhcmludCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBmaWVsZCA9IGdldEZpZWxkKCJvcHRpb25hbF9pbnQzMiIpOworICAgIGFzc2VydEVxdWFscygxLCBmaWVsZC5nZXRWYXJpbnRMaXN0KCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoYWxsRmllbGRzLmdldE9wdGlvbmFsSW50MzIoKSwKKyAgICAgICAgICAgICAgICAgKGxvbmcpIGZpZWxkLmdldFZhcmludExpc3QoKS5nZXQoMCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEZpeGVkMzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPSBnZXRGaWVsZCgib3B0aW9uYWxfZml4ZWQzMiIpOworICAgIGFzc2VydEVxdWFscygxLCBmaWVsZC5nZXRGaXhlZDMyTGlzdCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkcy5nZXRPcHRpb25hbEZpeGVkMzIoKSwKKyAgICAgICAgICAgICAgICAgKGludCkgZmllbGQuZ2V0Rml4ZWQzMkxpc3QoKS5nZXQoMCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEZpeGVkNjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPSBnZXRGaWVsZCgib3B0aW9uYWxfZml4ZWQ2NCIpOworICAgIGFzc2VydEVxdWFscygxLCBmaWVsZC5nZXRGaXhlZDY0TGlzdCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkcy5nZXRPcHRpb25hbEZpeGVkNjQoKSwKKyAgICAgICAgICAgICAgICAgKGxvbmcpIGZpZWxkLmdldEZpeGVkNjRMaXN0KCkuZ2V0KDApKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RMZW5ndGhEZWxpbWl0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPSBnZXRGaWVsZCgib3B0aW9uYWxfYnl0ZXMiKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0TGVuZ3RoRGVsaW1pdGVkTGlzdCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkcy5nZXRPcHRpb25hbEJ5dGVzKCksCisgICAgICAgICAgICAgICAgIGZpZWxkLmdldExlbmd0aERlbGltaXRlZExpc3QoKS5nZXQoMCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEdyb3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIG5lc3RlZEZpZWxkRGVzY3JpcHRvciA9CisgICAgICBUZXN0QWxsVHlwZXMuT3B0aW9uYWxHcm91cC5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJhIik7CisgICAgYXNzZXJ0Tm90TnVsbChuZXN0ZWRGaWVsZERlc2NyaXB0b3IpOworCisgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gZ2V0RmllbGQoIm9wdGlvbmFsZ3JvdXAiKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0R3JvdXBMaXN0KCkuc2l6ZSgpKTsKKworICAgIFVua25vd25GaWVsZFNldCBncm91cCA9IGZpZWxkLmdldEdyb3VwTGlzdCgpLmdldCgwKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZ3JvdXAuYXNNYXAoKS5zaXplKCkpOworICAgIGFzc2VydFRydWUoZ3JvdXAuaGFzRmllbGQobmVzdGVkRmllbGREZXNjcmlwdG9yLmdldE51bWJlcigpKSk7CisKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgbmVzdGVkRmllbGQgPQorICAgICAgZ3JvdXAuZ2V0RmllbGQobmVzdGVkRmllbGREZXNjcmlwdG9yLmdldE51bWJlcigpKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgbmVzdGVkRmllbGQuZ2V0VmFyaW50TGlzdCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkcy5nZXRPcHRpb25hbEdyb3VwKCkuZ2V0QSgpLAorICAgICAgICAgICAgICAgICAobG9uZykgbmVzdGVkRmllbGQuZ2V0VmFyaW50TGlzdCgpLmdldCgwKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gQ2hlY2sgdGhhdCBzZXJpYWxpemluZyB0aGUgVW5rbm93bkZpZWxkU2V0IHByb2R1Y2VzIHRoZSBvcmlnaW5hbCBkYXRhCisgICAgLy8gYWdhaW4uCisgICAgQnl0ZVN0cmluZyBkYXRhID0gZW1wdHlNZXNzYWdlLnRvQnl0ZVN0cmluZygpOworICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHNEYXRhLCBkYXRhKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDb3B5RnJvbSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZSA9CisgICAgICBUZXN0RW1wdHlNZXNzYWdlLm5ld0J1aWxkZXIoKS5tZXJnZUZyb20oZW1wdHlNZXNzYWdlKS5idWlsZCgpOworCisgICAgYXNzZXJ0RXF1YWxzKGVtcHR5TWVzc2FnZS50b1N0cmluZygpLCBtZXNzYWdlLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdE1lcmdlRnJvbSgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RFbXB0eU1lc3NhZ2Ugc291cmNlID0KKyAgICAgIFRlc3RFbXB0eU1lc3NhZ2UubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRVbmtub3duRmllbGRzKAorICAgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRGaWVsZCgyLAorICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZFZhcmludCgyKS5idWlsZCgpKQorICAgICAgICAgICAgLmFkZEZpZWxkKDMsCisgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkVmFyaW50KDQpLmJ1aWxkKCkpCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCk7CisgICAgVGVzdEVtcHR5TWVzc2FnZSBkZXN0aW5hdGlvbiA9CisgICAgICBUZXN0RW1wdHlNZXNzYWdlLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0VW5rbm93bkZpZWxkcygKKyAgICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRmllbGQoMSwKKyAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGRWYXJpbnQoMSkuYnVpbGQoKSkKKyAgICAgICAgICAgIC5hZGRGaWVsZCgzLAorICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZFZhcmludCgzKS5idWlsZCgpKQorICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgIC5tZXJnZUZyb20oc291cmNlKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIGFzc2VydEVxdWFscygKKyAgICAgICIxOiAxXG4iICsKKyAgICAgICIyOiAyXG4iICsKKyAgICAgICIzOiAzXG4iICsKKyAgICAgICIzOiA0XG4iLAorICAgICAgZGVzdGluYXRpb24udG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBVbmtub3duRmllbGRTZXQgZmllbGRzID0KKyAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkubWVyZ2VGcm9tKHVua25vd25GaWVsZHMpLmNsZWFyKCkuYnVpbGQoKTsKKyAgICBhc3NlcnRUcnVlKGZpZWxkcy5hc01hcCgpLmlzRW1wdHkoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlID0KKyAgICAgIFRlc3RFbXB0eU1lc3NhZ2UubmV3QnVpbGRlcigpLm1lcmdlRnJvbShlbXB0eU1lc3NhZ2UpLmNsZWFyKCkuYnVpbGQoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUtub3duQW5kVW5rbm93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFRlc3QgbWl4aW5nIGtub3duIGFuZCB1bmtub3duIGZpZWxkcyB3aGVuIHBhcnNpbmcuCisKKyAgICBVbmtub3duRmllbGRTZXQgZmllbGRzID0KKyAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKHVua25vd25GaWVsZHMpCisgICAgICAgIC5hZGRGaWVsZCgxMjM0NTYsCisgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKS5hZGRWYXJpbnQoNjU0MzIxKS5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIEJ5dGVTdHJpbmcgZGF0YSA9IGZpZWxkcy50b0J5dGVTdHJpbmcoKTsKKyAgICBUZXN0QWxsVHlwZXMgZGVzdGluYXRpb24gPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKGRhdGEpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KGRlc3RpbmF0aW9uKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZGVzdGluYXRpb24uZ2V0VW5rbm93bkZpZWxkcygpLmFzTWFwKCkuc2l6ZSgpKTsKKworICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBmaWVsZCA9CisgICAgICBkZXN0aW5hdGlvbi5nZXRVbmtub3duRmllbGRzKCkuZ2V0RmllbGQoMTIzNDU2KTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0VmFyaW50TGlzdCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDY1NDMyMSwgKGxvbmcpIGZpZWxkLmdldFZhcmludExpc3QoKS5nZXQoMCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFdyb25nVHlwZVRyZWF0ZWRBc1Vua25vd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUZXN0IHRoYXQgZmllbGRzIG9mIHRoZSB3cm9uZyB3aXJlIHR5cGUgYXJlIHRyZWF0ZWQgbGlrZSB1bmtub3duIGZpZWxkcworICAgIC8vIHdoZW4gcGFyc2luZy4KKworICAgIEJ5dGVTdHJpbmcgYml6YXJyb0RhdGEgPSBnZXRCaXphcnJvRGF0YSgpOworICAgIFRlc3RBbGxUeXBlcyBhbGxUeXBlc01lc3NhZ2UgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKGJpemFycm9EYXRhKTsKKyAgICBUZXN0RW1wdHlNZXNzYWdlIGVtcHR5TWVzc2FnZSA9IFRlc3RFbXB0eU1lc3NhZ2UucGFyc2VGcm9tKGJpemFycm9EYXRhKTsKKworICAgIC8vIEFsbCBmaWVsZHMgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcnByZXRlZCBhcyB1bmtub3duLCBzbyB0aGUgZGVidWcgc3RyaW5ncworICAgIC8vIHNob3VsZCBiZSB0aGUgc2FtZS4KKyAgICBhc3NlcnRFcXVhbHMoZW1wdHlNZXNzYWdlLnRvU3RyaW5nKCksIGFsbFR5cGVzTWVzc2FnZS50b1N0cmluZygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIE1ha2Ugc3VyZSBmaWVsZHMgYXJlIHByb3Blcmx5IHBhcnNlZCB0byB0aGUgVW5rbm93bkZpZWxkU2V0IGV2ZW4gd2hlbgorICAgIC8vIHRoZXkgYXJlIGRlY2xhcmVkIGFzIGV4dGVuc2lvbiBudW1iZXJzLgorCisgICAgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zIG1lc3NhZ2UgPQorICAgICAgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLnBhcnNlRnJvbShhbGxGaWVsZHNEYXRhKTsKKworICAgIGFzc2VydEVxdWFscyh1bmtub3duRmllbGRzLmFzTWFwKCkuc2l6ZSgpLAorICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFVua25vd25GaWVsZHMoKS5hc01hcCgpLnNpemUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkc0RhdGEsIG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFdyb25nRXh0ZW5zaW9uVHlwZVRyZWF0ZWRBc1Vua25vd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUZXN0IHRoYXQgZmllbGRzIG9mIHRoZSB3cm9uZyB3aXJlIHR5cGUgYXJlIHRyZWF0ZWQgbGlrZSB1bmtub3duIGZpZWxkcworICAgIC8vIHdoZW4gcGFyc2luZyBleHRlbnNpb25zLgorCisgICAgQnl0ZVN0cmluZyBiaXphcnJvRGF0YSA9IGdldEJpemFycm9EYXRhKCk7CisgICAgVGVzdEFsbEV4dGVuc2lvbnMgYWxsRXh0ZW5zaW9uc01lc3NhZ2UgPQorICAgICAgVGVzdEFsbEV4dGVuc2lvbnMucGFyc2VGcm9tKGJpemFycm9EYXRhKTsKKyAgICBUZXN0RW1wdHlNZXNzYWdlIGVtcHR5TWVzc2FnZSA9IFRlc3RFbXB0eU1lc3NhZ2UucGFyc2VGcm9tKGJpemFycm9EYXRhKTsKKworICAgIC8vIEFsbCBmaWVsZHMgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcnByZXRlZCBhcyB1bmtub3duLCBzbyB0aGUgZGVidWcgc3RyaW5ncworICAgIC8vIHNob3VsZCBiZSB0aGUgc2FtZS4KKyAgICBhc3NlcnRFcXVhbHMoZW1wdHlNZXNzYWdlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgIGFsbEV4dGVuc2lvbnNNZXNzYWdlLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFBhcnNlVW5rbm93bkVudW1WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBzaW5ndWxhckZpZWxkID0KKyAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpOworICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciByZXBlYXRlZEZpZWxkID0KKyAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpOworICAgIGFzc2VydE5vdE51bGwoc2luZ3VsYXJGaWVsZCk7CisgICAgYXNzZXJ0Tm90TnVsbChyZXBlYXRlZEZpZWxkKTsKKworICAgIEJ5dGVTdHJpbmcgZGF0YSA9CisgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgIC5hZGRGaWVsZChzaW5ndWxhckZpZWxkLmdldE51bWJlcigpLAorICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRWYXJpbnQoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLmdldE51bWJlcigpKQorICAgICAgICAgICAgLmFkZFZhcmludCg1KSAgIC8vIG5vdCB2YWxpZAorICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgIC5hZGRGaWVsZChyZXBlYXRlZEZpZWxkLmdldE51bWJlcigpLAorICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRWYXJpbnQoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLmdldE51bWJlcigpKQorICAgICAgICAgICAgLmFkZFZhcmludCg0KSAgIC8vIG5vdCB2YWxpZAorICAgICAgICAgICAgLmFkZFZhcmludChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVouZ2V0TnVtYmVyKCkpCisgICAgICAgICAgICAuYWRkVmFyaW50KDYpICAgLy8gbm90IHZhbGlkCisgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgLnRvQnl0ZVN0cmluZygpOworCisgICAgeworICAgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKGRhdGEpOworICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwKKyAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkRW51bSgpKTsKKyAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgQXJyYXlzLmFzTGlzdChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWiksCisgICAgICAgIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtTGlzdCgpKTsKKyAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDVMKSwKKyAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFVua25vd25GaWVsZHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoc2luZ3VsYXJGaWVsZC5nZXROdW1iZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhcmludExpc3QoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCg0TCwgNkwpLAorICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChyZXBlYXRlZEZpZWxkLmdldE51bWJlcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFyaW50TGlzdCgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0KKyAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMucGFyc2VGcm9tKGRhdGEsIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwKKyAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5vcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24pKTsKKyAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgQXJyYXlzLmFzTGlzdChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWiksCisgICAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uKSk7CisgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCg1TCksCisgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKHNpbmd1bGFyRmllbGQuZ2V0TnVtYmVyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYXJpbnRMaXN0KCkpOworICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoNEwsIDZMKSwKKyAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFVua25vd25GaWVsZHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQocmVwZWF0ZWRGaWVsZC5nZXROdW1iZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhcmludExpc3QoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgdGVzdExhcmdlVmFyaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQnl0ZVN0cmluZyBkYXRhID0KKyAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgLmFkZEZpZWxkKDEsCisgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZFZhcmludCgweDdGRkZGRkZGRkZGRkZGRkZMKQorICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgIC5idWlsZCgpCisgICAgICAgIC50b0J5dGVTdHJpbmcoKTsKKyAgICBVbmtub3duRmllbGRTZXQgcGFyc2VkID0gVW5rbm93bkZpZWxkU2V0LnBhcnNlRnJvbShkYXRhKTsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPSBwYXJzZWQuZ2V0RmllbGQoMSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGZpZWxkLmdldFZhcmludExpc3QoKS5zaXplKCkpOworICAgIGFzc2VydEVxdWFscygweDdGRkZGRkZGRkZGRkZGRkZMLCAobG9uZylmaWVsZC5nZXRWYXJpbnRMaXN0KCkuZ2V0KDApKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNBbmRIYXNoQ29kZSgpIHsKKyAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZml4ZWQzMkZpZWxkID0KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZEZpeGVkMzIoMSkKKyAgICAgICAgICAgIC5idWlsZCgpOworICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBmaXhlZDY0RmllbGQgPQorICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRml4ZWQ2NCgxKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIHZhckludEZpZWxkID0KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZFZhcmludCgxKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGxlbmd0aERlbGltaXRlZEZpZWxkID0KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZExlbmd0aERlbGltaXRlZChCeXRlU3RyaW5nLkVNUFRZKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGdyb3VwRmllbGQgPQorICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkR3JvdXAodW5rbm93bkZpZWxkcykKKyAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgVW5rbm93bkZpZWxkU2V0IGEgPQorICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRmllbGQoMSwgZml4ZWQzMkZpZWxkKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgVW5rbm93bkZpZWxkU2V0IGIgPQorICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRmllbGQoMSwgZml4ZWQ2NEZpZWxkKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgVW5rbm93bkZpZWxkU2V0IGMgPQorICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuYWRkRmllbGQoMSwgdmFySW50RmllbGQpCisgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICBVbmtub3duRmllbGRTZXQgZCA9CisgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRGaWVsZCgxLCBsZW5ndGhEZWxpbWl0ZWRGaWVsZCkKKyAgICAgICAgICAgIC5idWlsZCgpOworICAgIFVua25vd25GaWVsZFNldCBlID0KKyAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLmFkZEZpZWxkKDEsIGdyb3VwRmllbGQpCisgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGEpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGIpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGMpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGQpOworICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGUpOworCisgICAgY2hlY2tOb3RFcXVhbChhLCBiKTsKKyAgICBjaGVja05vdEVxdWFsKGEsIGMpOworICAgIGNoZWNrTm90RXF1YWwoYSwgZCk7CisgICAgY2hlY2tOb3RFcXVhbChhLCBlKTsKKyAgICBjaGVja05vdEVxdWFsKGIsIGMpOworICAgIGNoZWNrTm90RXF1YWwoYiwgZCk7CisgICAgY2hlY2tOb3RFcXVhbChiLCBlKTsKKyAgICBjaGVja05vdEVxdWFsKGMsIGQpOworICAgIGNoZWNrTm90RXF1YWwoYywgZSk7CisgICAgY2hlY2tOb3RFcXVhbChkLCBlKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGZpZWxkIHNldHMgYXJlIG5vdCBlcXVhbCBhbmQgaGF2ZSBkaWZmZXJlbnQKKyAgICogaGFzaCBjb2Rlcy4KKyAgICoKKyAgICogQHdhcm5pbmcgSXQncyB2YWxpZCBmb3Igbm9uLWVxdWFsIG9iamVjdHMgdG8gaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUsIHNvCisgICAqICAgdGhpcyB0ZXN0IGlzIHN0cmljdGVyIHRoYW4gaXQgbmVlZHMgdG8gYmUuIEhvd2V2ZXIsIHRoaXMgc2hvdWxkIGhhcHBlbgorICAgKiAgIHJlbGF0aXZlbHkgcmFyZWx5LgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGNoZWNrTm90RXF1YWwoVW5rbm93bkZpZWxkU2V0IHMxLCBVbmtub3duRmllbGRTZXQgczIpIHsKKyAgICBTdHJpbmcgZXF1YWxzRXJyb3IgPSBTdHJpbmcuZm9ybWF0KCIlcyBzaG91bGQgbm90IGJlIGVxdWFsIHRvICVzIiwgczEsIHMyKTsKKyAgICBhc3NlcnRGYWxzZShlcXVhbHNFcnJvciwgczEuZXF1YWxzKHMyKSk7CisgICAgYXNzZXJ0RmFsc2UoZXF1YWxzRXJyb3IsIHMyLmVxdWFscyhzMSkpOworCisgICAgYXNzZXJ0RmFsc2UoCisgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIHNob3VsZCBoYXZlIGEgZGlmZmVyZW50IGhhc2ggY29kZSBmcm9tICVzIiwgczEsIHMyKSwKKyAgICAgICAgczEuaGFzaENvZGUoKSA9PSBzMi5oYXNoQ29kZSgpKTsKKyAgfQorCisgIC8qKgorICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGZpZWxkIHNldHMgYXJlIGVxdWFsIGFuZCBoYXZlIGlkZW50aWNhbCBoYXNoIGNvZGVzLgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KFVua25vd25GaWVsZFNldCBzZXQpIHsKKyAgICAvLyBPYmplY3Qgc2hvdWxkIGJlIGVxdWFsIHRvIGl0c2VsZi4KKyAgICBhc3NlcnRFcXVhbHMoc2V0LCBzZXQpOworCisgICAgLy8gT2JqZWN0IHNob3VsZCBiZSBlcXVhbCB0byBhIGNvcHkgb2YgaXRzZWxmLgorICAgIFVua25vd25GaWVsZFNldCBjb3B5ID0gVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoc2V0KS5idWlsZCgpOworICAgIGFzc2VydEVxdWFscyhzZXQsIGNvcHkpOworICAgIGFzc2VydEVxdWFscyhjb3B5LCBzZXQpOworICAgIGFzc2VydEVxdWFscyhzZXQuaGFzaENvZGUoKSwgY29weS5oYXNoQ29kZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0VGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNWQwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3RUZXN0LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3R9LgorICoKKyAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorICovCitwdWJsaWMgY2xhc3MgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfQSA9ICJBIjsKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR19CID0gIkIiOworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0MgPSAiQyI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19BID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkEiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19CID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkIiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19DID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkMiKTsKKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE9ubHlNZXRob2RzKCkgeworICAgIExhenlTdHJpbmdBcnJheUxpc3QgcmF3TGlzdCA9IGNyZWF0ZVNhbXBsZUxpc3QoKTsKKyAgICBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdCBsaXN0ID0gbmV3IFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0KHJhd0xpc3QpOworICAgIGFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7CisgICAgYXNzZXJ0U2FtZShTVFJJTkdfQSwgbGlzdC5nZXQoMCkpOworICAgIGFzc2VydFNhbWUoU1RSSU5HX0IsIGxpc3QuZ2V0KDEpKTsKKyAgICBhc3NlcnRTYW1lKFNUUklOR19DLCBsaXN0LmdldCgyKSk7CisgICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0EsIGxpc3QuZ2V0Qnl0ZVN0cmluZygwKSk7CisgICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0IsIGxpc3QuZ2V0Qnl0ZVN0cmluZygxKSk7CisgICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0MsIGxpc3QuZ2V0Qnl0ZVN0cmluZygyKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWV0aG9kcygpIHsKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IHJhd0xpc3QgPSBjcmVhdGVTYW1wbGVMaXN0KCk7CisgICAgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QgbGlzdCA9IG5ldyBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdChyYXdMaXN0KTsKKworICAgIHRyeSB7CisgICAgICBsaXN0LnJlbW92ZSgwKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBleHBlY3RlZAorICAgIH0KKyAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOworCisgICAgdHJ5IHsKKyAgICAgIGxpc3QuYWRkKFNUUklOR19CKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBleHBlY3RlZAorICAgIH0KKyAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOworCisgICAgdHJ5IHsKKyAgICAgIGxpc3Quc2V0KDEsIFNUUklOR19CKTsKKyAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBleHBlY3RlZAorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKKyAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IHJhd0xpc3QgPSBjcmVhdGVTYW1wbGVMaXN0KCk7CisgICAgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QgbGlzdCA9IG5ldyBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdChyYXdMaXN0KTsKKworICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKKyAgICBpbnQgY291bnQgPSAwOworICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgaXRlci5uZXh0KCk7CisgICAgICBjb3VudCsrOworICAgICAgdHJ5IHsKKyAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgZmFpbCgpOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAvLyBleHBlY3RlZAorICAgICAgfQorICAgIH0KKyAgICBhc3NlcnRFcXVhbHMoMywgY291bnQpOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yKCkgeworICAgIExhenlTdHJpbmdBcnJheUxpc3QgcmF3TGlzdCA9IGNyZWF0ZVNhbXBsZUxpc3QoKTsKKyAgICBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdCBsaXN0ID0gbmV3IFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0KHJhd0xpc3QpOworCisgICAgTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGxpc3QubGlzdEl0ZXJhdG9yKCk7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgIGl0ZXIubmV4dCgpOworICAgICAgY291bnQrKzsKKyAgICAgIHRyeSB7CisgICAgICAgIGl0ZXIucmVtb3ZlKCk7CisgICAgICAgIGZhaWwoKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGl0ZXIuc2V0KCJiYXIiKTsKKyAgICAgICAgZmFpbCgpOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAvLyBleHBlY3RlZAorICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgaXRlci5hZGQoImJhciIpOworICAgICAgICBmYWlsKCk7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICB9CisgICAgfQorICAgIGFzc2VydEVxdWFscygzLCBjb3VudCk7CisKKyAgfQorCisgIHByaXZhdGUgTGF6eVN0cmluZ0FycmF5TGlzdCBjcmVhdGVTYW1wbGVMaXN0KCkgeworICAgIExhenlTdHJpbmdBcnJheUxpc3QgcmF3TGlzdCA9IG5ldyBMYXp5U3RyaW5nQXJyYXlMaXN0KCk7CisgICAgcmF3TGlzdC5hZGQoU1RSSU5HX0EpOworICAgIHJhd0xpc3QuYWRkKFNUUklOR19CKTsKKyAgICByYXdMaXN0LmFkZChTVFJJTkdfQyk7CisgICAgcmV0dXJuIHJhd0xpc3Q7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9XaXJlRm9ybWF0VGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVhMWRkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9XaXJlRm9ybWF0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDI3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitwYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworCitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKK2ltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEZpZWxkT3JkZXJpbmdzOworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZEV4dGVuc2lvbnM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UGFja2VkVHlwZXM7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0OworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0TXNldC5SYXdNZXNzYWdlU2V0OworaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0TXNldC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE7CitpbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsRXh0ZW5zaW9uc0xpdGU7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlOworCisvKioKKyAqIFRlc3RzIHJlbGF0ZWQgdG8gcGFyc2luZyBhbmQgc2VyaWFsaXphdGlvbi4KKyAqCisgKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisgKi8KK3B1YmxpYyBjbGFzcyBXaXJlRm9ybWF0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOworCisgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisgICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLnNpemUoKSwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uUGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKTsKKworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcy5zaXplKCksIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7CisKKyAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTIgPSBUZXN0UGFja2VkVHlwZXMucGFyc2VGcm9tKHJhd0J5dGVzKTsKKworICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFRlc3RBbGxUeXBlcyBhbmQgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlIGZvcm1hdHMsCisgICAgLy8gc28gaWYgd2Ugc2VyaWFsaXplIGEgVGVzdEFsbEV4dGVuc2lvbnMgdGhlbiBwYXJzZSBpdCBhcyBUZXN0QWxsVHlwZXMKKyAgICAvLyBpdCBzaG91bGQgd29yay4KKworICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisgICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLnNpemUoKSwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVQYWNrZWRFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVGVzdFBhY2tlZFR5cGVzIGFuZCBUZXN0UGFja2VkRXh0ZW5zaW9ucyBzaG91bGQgaGF2ZSBjb21wYXRpYmxlIHdpcmUKKyAgICAvLyBmb3JtYXRzOyBjaGVjayB0aGF0IHRoZXkgc2VyaWFsaXplIHRvIHRoZSBzYW1lIHN0cmluZy4KKyAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0UGFja2VkRXh0ZW5zaW9uc1NldCgpOworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworCisgICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UyID0gVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlczIgPSBtZXNzYWdlMi50b0J5dGVTdHJpbmcoKTsKKworICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcywgcmF3Qnl0ZXMyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uUGFja2VkV2l0aG91dEdldFNlcmlhbGl6ZWRTaXplKCkKKyAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFdyaXRlIGRpcmVjdGx5IHRvIGFuIE91dHB1dFN0cmVhbSwgd2l0aG91dCBpbnZva2luZyBnZXRTZXJpYWxpemVkU2l6ZSgpCisgICAgLy8gVGhpcyB1c2VkIHRvIGJlIGEgYnVnIHdoZXJlIHRoZSBzaXplIG9mIGEgcGFja2VkIGZpZWxkIHdhcyBpbmNvcnJlY3QsCisgICAgLy8gc2luY2UgZ2V0U2VyaWFsaXplZFNpemUoKSB3YXMgbmV2ZXIgaW52b2tlZC4KKyAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldFBhY2tlZFNldCgpOworCisgICAgLy8gRGlyZWN0bHkgY29uc3RydWN0IGEgQ29kZWRPdXRwdXRTdHJlYW0gYXJvdW5kIHRoZSBhY3R1YWwgT3V0cHV0U3RyZWFtLAorICAgIC8vIGluIGNhc2Ugd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0cHV0KSBpbnZva2VzIGdldFNlcmlhbGl6ZWRTaXplKCk7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZE91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKG91dHB1dFN0cmVhbSk7CisKKyAgICBtZXNzYWdlLndyaXRlVG8oY29kZWRPdXRwdXQpOworCisgICAgY29kZWRPdXRwdXQuZmx1c2goKTsKKworICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlMiA9IFRlc3RQYWNrZWRUeXBlcy5wYXJzZUZyb20oCisgICAgICAgIG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKKworICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplRXh0ZW5zaW9uc0xpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUZXN0QWxsVHlwZXMgYW5kIFRlc3RBbGxFeHRlbnNpb25zIHNob3VsZCBoYXZlIGNvbXBhdGlibGUgd2lyZSBmb3JtYXRzLAorICAgIC8vIHNvIGlmIHdlIHNlcmlhbGl6ZSBhIFRlc3RBbGxFeHRlbnNpb25zIHRoZW4gcGFyc2UgaXQgYXMgVGVzdEFsbFR5cGVzCisgICAgLy8gaXQgc2hvdWxkIHdvcmsuCisKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbExpdGVFeHRlbnNpb25zU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisgICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLnNpemUoKSwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVQYWNrZWRFeHRlbnNpb25zTGl0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFRlc3RQYWNrZWRUeXBlcyBhbmQgVGVzdFBhY2tlZEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlCisgICAgLy8gZm9ybWF0czsgY2hlY2sgdGhhdCB0aGV5IHNlcmlhbGl6ZSB0byB0aGUgc2FtZSBzdHJpbmcuCisgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRMaXRlUGFja2VkRXh0ZW5zaW9uc1NldCgpOworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworCisgICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UyID0gVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlczIgPSBtZXNzYWdlMi50b0J5dGVTdHJpbmcoKTsKKworICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcywgcmF3Qnl0ZXMyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBUZXN0QWxsVHlwZXMgYW5kIFRlc3RBbGxFeHRlbnNpb25zIHNob3VsZCBoYXZlIGNvbXBhdGlibGUgd2lyZSBmb3JtYXRzLAorICAgIC8vIHNvIGlmIHdlIHNlcmlhbGl6ZSBhIFRlc3RBbGxUeXBlcyB0aGVuIHBhcnNlIGl0IGFzIFRlc3RBbGxFeHRlbnNpb25zCisgICAgLy8gaXQgc2hvdWxkIHdvcmsuCisKKyAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworCisgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCisgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTIgPQorICAgICAgVGVzdEFsbEV4dGVuc2lvbnMucGFyc2VGcm9tKHJhd0J5dGVzLCByZWdpc3RyeSk7CisKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVBhY2tlZEV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBFbnN1cmUgdGhhdCBwYWNrZWQgZXh0ZW5zaW9ucyBjYW4gYmUgcHJvcGVybHkgcGFyc2VkLgorICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRQYWNrZWRFeHRlbnNpb25zU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisKKyAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisKKyAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlMiA9CisgICAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zLnBhcnNlRnJvbShyYXdCeXRlcywgcmVnaXN0cnkpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VFeHRlbnNpb25zTGl0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFRlc3RBbGxUeXBlcyBhbmQgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlIGZvcm1hdHMsCisgICAgLy8gc28gaWYgd2Ugc2VyaWFsaXplIGEgVGVzdEFsbFR5cGVzIHRoZW4gcGFyc2UgaXQgYXMgVGVzdEFsbEV4dGVuc2lvbnMKKyAgICAvLyBpdCBzaG91bGQgd29yay4KKworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7CisgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7CisKKyAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgcmVnaXN0cnlfbGl0ZSA9IFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSgpOworCisgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UyID0KKyAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5wYXJzZUZyb20ocmF3Qnl0ZXMsIHJlZ2lzdHJ5X2xpdGUpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7CisKKyAgICAvLyBUcnkgYWdhaW4gdXNpbmcgYSBmdWxsIGV4dGVuc2lvbiByZWdpc3RyeS4KKyAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisKKyAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZTMgPQorICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLnBhcnNlRnJvbShyYXdCeXRlcywgcmVnaXN0cnkpOworCisgICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQYWNrZWRFeHRlbnNpb25zTGl0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIEVuc3VyZSB0aGF0IHBhY2tlZCBleHRlbnNpb25zIGNhbiBiZSBwcm9wZXJseSBwYXJzZWQuCisgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRMaXRlUGFja2VkRXh0ZW5zaW9uc1NldCgpOworICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOworCisgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIHJlZ2lzdHJ5ID0gVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCk7CisKKyAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZTIgPQorICAgICAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUucGFyc2VGcm9tKHJhd0J5dGVzLCByZWdpc3RyeSk7CisKKyAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25zU2VyaWFsaXplZFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkuZ2V0U2VyaWFsaXplZFNpemUoKSwKKyAgICAgICAgICAgICAgICAgVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpLmdldFNlcmlhbGl6ZWRTaXplKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZURlbGltaXRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgVGVzdFV0aWwuZ2V0QWxsU2V0KCkud3JpdGVEZWxpbWl0ZWRUbyhvdXRwdXQpOworICAgIG91dHB1dC53cml0ZSgxMik7CisgICAgVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCkud3JpdGVEZWxpbWl0ZWRUbyhvdXRwdXQpOworICAgIG91dHB1dC53cml0ZSgzNCk7CisKKyAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXQudG9CeXRlQXJyYXkoKSk7CisKKyAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoVGVzdEFsbFR5cGVzLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCkpOworICAgIGFzc2VydEVxdWFscygxMiwgaW5wdXQucmVhZCgpKTsKKyAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQoVGVzdFBhY2tlZFR5cGVzLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCkpOworICAgIGFzc2VydEVxdWFscygzNCwgaW5wdXQucmVhZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoLTEsIGlucHV0LnJlYWQoKSk7CisKKyAgICAvLyBXZSdyZSBhdCBFT0YsIHNvIHBhcnNpbmcgYWdhaW4gc2hvdWxkIHJldHVybiBudWxsLgorICAgIGFzc2VydFRydWUoVGVzdEFsbFR5cGVzLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCkgPT0gbnVsbCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0RmllbGRzSW5PcmRlcihCeXRlU3RyaW5nIGRhdGEpIHRocm93cyBFeGNlcHRpb24geworICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBkYXRhLm5ld0NvZGVkSW5wdXQoKTsKKyAgICBpbnQgcHJldmlvdXNUYWcgPSAwOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7CisgICAgICBpZiAodGFnID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGFzc2VydFRydWUodGFnID4gcHJldmlvdXNUYWcpOworICAgICAgcHJldmlvdXNUYWcgPSB0YWc7CisgICAgICBpbnB1dC5za2lwRmllbGQodGFnKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJsZWF2ZWRGaWVsZHNBbmRFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gVGVzdHMgdGhhdCBmaWVsZHMgYXJlIHdyaXR0ZW4gaW4gb3JkZXIgZXZlbiB3aGVuIGV4dGVuc2lvbiByYW5nZXMKKyAgICAvLyBhcmUgaW50ZXJsZWF2ZWQgd2l0aCBmaWVsZCBudW1iZXJzLgorICAgIEJ5dGVTdHJpbmcgZGF0YSA9CisgICAgICBUZXN0RmllbGRPcmRlcmluZ3MubmV3QnVpbGRlcigpCisgICAgICAgIC5zZXRNeUludCgxKQorICAgICAgICAuc2V0TXlTdHJpbmcoImZvbyIpCisgICAgICAgIC5zZXRNeUZsb2F0KDEuMEYpCisgICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5teUV4dGVuc2lvbkludCwgMjMpCisgICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5teUV4dGVuc2lvblN0cmluZywgImJhciIpCisgICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpOworICAgIGFzc2VydEZpZWxkc0luT3JkZXIoZGF0YSk7CisKKyAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0RmllbGRPcmRlcmluZ3MuZ2V0RGVzY3JpcHRvcigpOworICAgIEJ5dGVTdHJpbmcgZHluYW1pY19kYXRhID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEZpZWxkT3JkZXJpbmdzLmdldERlc2NyaXB0b3IoKSkKKyAgICAgICAgLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJteV9pbnQiKSwgMUwpCisgICAgICAgIC5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgibXlfc3RyaW5nIiksICJmb28iKQorICAgICAgICAuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm15X2Zsb2F0IiksIDEuMEYpCisgICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uSW50LmdldERlc2NyaXB0b3IoKSwgMjMpCisgICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uU3RyaW5nLmdldERlc2NyaXB0b3IoKSwgImJhciIpCisgICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpOworICAgIGFzc2VydEZpZWxkc0luT3JkZXIoZHluYW1pY19kYXRhKTsKKyAgfQorCisgIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0VGVzdEZpZWxkT3JkZXJpbmdzUmVnaXN0cnkoKSB7CisgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVzdWx0ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKKyAgICByZXN1bHQuYWRkKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25JbnQpOworICAgIHJlc3VsdC5hZGQoVW5pdHRlc3RQcm90by5teUV4dGVuc2lvblN0cmluZyk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBwYXJzZSBhIG1lc3NhZ2UgdGhhdCBjb250YWlucyBtdWx0aXBsZSBleHRlbnNpb25zCisgICAgLy8gcmFuZ2VzLgorICAgIFRlc3RGaWVsZE9yZGVyaW5ncyBzb3VyY2UgPQorICAgICAgVGVzdEZpZWxkT3JkZXJpbmdzLm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0TXlJbnQoMSkKKyAgICAgICAgLnNldE15U3RyaW5nKCJmb28iKQorICAgICAgICAuc2V0TXlGbG9hdCgxLjBGKQorICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25JbnQsIDIzKQorICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25TdHJpbmcsICJiYXIiKQorICAgICAgICAuYnVpbGQoKTsKKyAgICBUZXN0RmllbGRPcmRlcmluZ3MgZGVzdCA9CisgICAgICBUZXN0RmllbGRPcmRlcmluZ3MucGFyc2VGcm9tKHNvdXJjZS50b0J5dGVTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGVzdEZpZWxkT3JkZXJpbmdzUmVnaXN0cnkoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZGVzdCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VNdWx0aXBsZUV4dGVuc2lvblJhbmdlc0R5bmFtaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyBTYW1lIGFzIGFib3ZlIGV4Y2VwdCB3aXRoIER5bmFtaWNNZXNzYWdlLgorICAgIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFRlc3RGaWVsZE9yZGVyaW5ncy5nZXREZXNjcmlwdG9yKCk7CisgICAgRHluYW1pY01lc3NhZ2Ugc291cmNlID0KKyAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEZpZWxkT3JkZXJpbmdzLmdldERlc2NyaXB0b3IoKSkKKyAgICAgICAgLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJteV9pbnQiKSwgMUwpCisgICAgICAgIC5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgibXlfc3RyaW5nIiksICJmb28iKQorICAgICAgICAuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm15X2Zsb2F0IiksIDEuMEYpCisgICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uSW50LmdldERlc2NyaXB0b3IoKSwgMjMpCisgICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uU3RyaW5nLmdldERlc2NyaXB0b3IoKSwgImJhciIpCisgICAgICAgIC5idWlsZCgpOworICAgIER5bmFtaWNNZXNzYWdlIGRlc3QgPQorICAgICAgRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKGRlc2NyaXB0b3IsIHNvdXJjZS50b0J5dGVTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUZXN0RmllbGRPcmRlcmluZ3NSZWdpc3RyeSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoc291cmNlLCBkZXN0KTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTktOT1dOX1RZUEVfSUQgPSAxNTUwMDU1OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JRF8xID0KKyAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEuZ2V0RGVzY3JpcHRvcigpLmdldEV4dGVuc2lvbnMoKS5nZXQoMCkuZ2V0TnVtYmVyKCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0lEXzIgPQorICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5nZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9ucygpLmdldCgwKS5nZXROdW1iZXIoKTsKKworICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplTWVzc2FnZVNldCgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vIFNldCB1cCBhIFRlc3RNZXNzYWdlU2V0IHdpdGggdHdvIGtub3duIG1lc3NhZ2VzIGFuZCBhbiB1bmtub3duIG9uZS4KKyAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0KKyAgICAgIFRlc3RNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKQorICAgICAgICAuc2V0RXh0ZW5zaW9uKAorICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uLAorICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5uZXdCdWlsZGVyKCkuc2V0SSgxMjMpLmJ1aWxkKCkpCisgICAgICAgIC5zZXRFeHRlbnNpb24oCisgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24sCisgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm5ld0J1aWxkZXIoKS5zZXRTdHIoImZvbyIpLmJ1aWxkKCkpCisgICAgICAgIC5zZXRVbmtub3duRmllbGRzKAorICAgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgIC5hZGRGaWVsZChVTktOT1dOX1RZUEVfSUQsCisgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkTGVuZ3RoRGVsaW1pdGVkKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJiYXIiKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIEJ5dGVTdHJpbmcgZGF0YSA9IG1lc3NhZ2VTZXQudG9CeXRlU3RyaW5nKCk7CisKKyAgICAvLyBQYXJzZSBiYWNrIHVzaW5nIFJhd01lc3NhZ2VTZXQgYW5kIGNoZWNrIHRoZSBjb250ZW50cy4KKyAgICBSYXdNZXNzYWdlU2V0IHJhdyA9IFJhd01lc3NhZ2VTZXQucGFyc2VGcm9tKGRhdGEpOworCisgICAgYXNzZXJ0VHJ1ZShyYXcuZ2V0VW5rbm93bkZpZWxkcygpLmFzTWFwKCkuaXNFbXB0eSgpKTsKKworICAgIGFzc2VydEVxdWFscygzLCByYXcuZ2V0SXRlbUNvdW50KCkpOworICAgIGFzc2VydEVxdWFscyhUWVBFX0lEXzEsIHJhdy5nZXRJdGVtKDApLmdldFR5cGVJZCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoVFlQRV9JRF8yLCByYXcuZ2V0SXRlbSgxKS5nZXRUeXBlSWQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKFVOS05PV05fVFlQRV9JRCwgcmF3LmdldEl0ZW0oMikuZ2V0VHlwZUlkKCkpOworCisgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2UxID0KKyAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5wYXJzZUZyb20oCisgICAgICAgIHJhdy5nZXRJdGVtKDApLmdldE1lc3NhZ2UoKS50b0J5dGVBcnJheSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoMTIzLCBtZXNzYWdlMS5nZXRJKCkpOworCisgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIG1lc3NhZ2UyID0KKyAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5wYXJzZUZyb20oCisgICAgICAgIHJhdy5nZXRJdGVtKDEpLmdldE1lc3NhZ2UoKS50b0J5dGVBcnJheSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImZvbyIsIG1lc3NhZ2UyLmdldFN0cigpKTsKKworICAgIGFzc2VydEVxdWFscygiYmFyIiwgcmF3LmdldEl0ZW0oMikuZ2V0TWVzc2FnZSgpLnRvU3RyaW5nVXRmOCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7CisgICAgZXh0ZW5zaW9uUmVnaXN0cnkuYWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKTsKKyAgICBleHRlbnNpb25SZWdpc3RyeS5hZGQoVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pOworCisgICAgLy8gU2V0IHVwIGEgUmF3TWVzc2FnZVNldCB3aXRoIHR3byBrbm93biBtZXNzYWdlcyBhbmQgYW4gdW5rbm93biBvbmUuCisgICAgUmF3TWVzc2FnZVNldCByYXcgPQorICAgICAgUmF3TWVzc2FnZVNldC5uZXdCdWlsZGVyKCkKKyAgICAgICAgLmFkZEl0ZW0oCisgICAgICAgICAgUmF3TWVzc2FnZVNldC5JdGVtLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgLnNldFR5cGVJZChUWVBFX0lEXzEpCisgICAgICAgICAgICAuc2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRJKDEyMykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKS50b0J5dGVTdHJpbmcoKSkKKyAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAuYWRkSXRlbSgKKyAgICAgICAgICBSYXdNZXNzYWdlU2V0Lkl0ZW0ubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0VHlwZUlkKFRZUEVfSURfMikKKyAgICAgICAgICAgIC5zZXRNZXNzYWdlKAorICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldFN0cigiZm9vIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKS50b0J5dGVTdHJpbmcoKSkKKyAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAuYWRkSXRlbSgKKyAgICAgICAgICBSYXdNZXNzYWdlU2V0Lkl0ZW0ubmV3QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0VHlwZUlkKFVOS05PV05fVFlQRV9JRCkKKyAgICAgICAgICAgIC5zZXRNZXNzYWdlKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJiYXIiKSkKKyAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAuYnVpbGQoKTsKKworICAgIEJ5dGVTdHJpbmcgZGF0YSA9IHJhdy50b0J5dGVTdHJpbmcoKTsKKworICAgIC8vIFBhcnNlIGFzIGEgVGVzdE1lc3NhZ2VTZXQgYW5kIGNoZWNrIHRoZSBjb250ZW50cy4KKyAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0KKyAgICAgIFRlc3RNZXNzYWdlU2V0LnBhcnNlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7CisKKyAgICBhc3NlcnRFcXVhbHMoMTIzLCBtZXNzYWdlU2V0LmdldEV4dGVuc2lvbigKKyAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKS5nZXRJKCkpOworICAgIGFzc2VydEVxdWFscygiZm9vIiwgbWVzc2FnZVNldC5nZXRFeHRlbnNpb24oCisgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZVNldEV4dGVuc2lvbikuZ2V0U3RyKCkpOworCisgICAgLy8gQ2hlY2sgZm9yIHVua25vd24gZmllbGQgd2l0aCB0eXBlIExFTkdUSF9ERUxJTUlURUQsCisgICAgLy8gICBudW1iZXIgVU5LTk9XTl9UWVBFX0lELCBhbmQgY29udGVudHMgImJhciIuCisgICAgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMgPSBtZXNzYWdlU2V0LmdldFVua25vd25GaWVsZHMoKTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgdW5rbm93bkZpZWxkcy5hc01hcCgpLnNpemUoKSk7CisgICAgYXNzZXJ0VHJ1ZSh1bmtub3duRmllbGRzLmhhc0ZpZWxkKFVOS05PV05fVFlQRV9JRCkpOworCisgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gdW5rbm93bkZpZWxkcy5nZXRGaWVsZChVTktOT1dOX1RZUEVfSUQpOworICAgIGFzc2VydEVxdWFscygxLCBmaWVsZC5nZXRMZW5ndGhEZWxpbWl0ZWRMaXN0KCkuc2l6ZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoImJhciIsIGZpZWxkLmdldExlbmd0aERlbGltaXRlZExpc3QoKS5nZXQoMCkudG9TdHJpbmdVdGY4KCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbXVsdGlwbGVfZmlsZXNfdGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9tdWx0aXBsZV9maWxlc190ZXN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMDQwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbXVsdGlwbGVfZmlsZXNfdGVzdC5wcm90bwpAQCAtMCwwICsxLDcxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLworLy8gQSBwcm90byBmaWxlIHdoaWNoIHRlc3RzIHRoZSBqYXZhX211bHRpcGxlX2ZpbGVzIG9wdGlvbi4KKworCisvLyBTb21lIGdlbmVyaWNfc2VydmljZXMgb3B0aW9uKHMpIGFkZGVkIGF1dG9tYXRpY2FsbHkuCisvLyBTZWU6ICBodHRwOi8vZ28vcHJvdG8yLWdlbmVyaWMtc2VydmljZXMtZGVmYXVsdAorb3B0aW9uIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7ICAgLy8gYXV0by1hZGRlZAorCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byI7CisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK29wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJNdWx0aXBsZUZpbGVzVGVzdFByb3RvIjsKKworbWVzc2FnZSBNZXNzYWdlV2l0aE5vT3V0ZXIgeworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIG9wdGlvbmFsIGludDMyIGkgPSAxOworICB9CisgIGVudW0gTmVzdGVkRW51bSB7CisgICAgQkFaID0gMzsKKyAgfQorICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG5lc3RlZCA9IDE7CisgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyBmb3JlaWduID0gMjsKKyAgb3B0aW9uYWwgTmVzdGVkRW51bSBuZXN0ZWRfZW51bSA9IDM7CisgIG9wdGlvbmFsIEVudW1XaXRoTm9PdXRlciBmb3JlaWduX2VudW0gPSA0OworfQorCitlbnVtIEVudW1XaXRoTm9PdXRlciB7CisgIEZPTyA9IDE7CisgIEJBUiA9IDI7Cit9CisKK3NlcnZpY2UgU2VydmljZVdpdGhOb091dGVyIHsKKyAgcnBjIEZvbyhNZXNzYWdlV2l0aE5vT3V0ZXIpIHJldHVybnMoVGVzdEFsbFR5cGVzKTsKK30KKworZXh0ZW5kIFRlc3RBbGxFeHRlbnNpb25zIHsKKyAgb3B0aW9uYWwgaW50MzIgZXh0ZW5zaW9uX3dpdGhfb3V0ZXIgPSAxMjM0NTY3OworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9idWlsZGVyc190ZXN0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9idWlsZGVyc190ZXN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZmZiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2J1aWxkZXJzX3Rlc3QucHJvdG8KQEAgLTAsMCArMSw1MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCisvLworCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCitvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiTmVzdGVkQnVpbGRlcnMiOworCisKK21lc3NhZ2UgVmVoaWNsZSB7CisgIG9wdGlvbmFsIEVuZ2luZSBlbmdpbmUgPSAxOworICByZXBlYXRlZCBXaGVlbCB3aGVlbCA9IDI7Cit9CisKK21lc3NhZ2UgRW5naW5lIHsKKyAgb3B0aW9uYWwgaW50MzIgY3lsaW5kZXIgPSAxOworICBvcHRpb25hbCBpbnQzMiBsaXRlcnMgPSAyOworfQorCittZXNzYWdlIFdoZWVsIHsKKyAgb3B0aW9uYWwgaW50MzIgcmFkaXVzID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgd2lkdGggPSAyOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9leHRlbnNpb24ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2V4dGVuc2lvbi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmU1ZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9leHRlbnNpb24ucHJvdG8KQEAgLTAsMCArMSw0NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBEYXJpY2sgVG9uZyAoZGFyaWNrQGdvb2dsZS5jb20pCisvLworLy8gQSBwcm90byBmaWxlIHdpdGggbmVzdGVkIGV4dGVuc2lvbnMuIE5vdGUgdGhhdCB0aGlzIG11c3QgYmUgZGVmaW5lZCBpbgorLy8gYSBzZXBhcmF0ZSBmaWxlIHRvIHByb3Blcmx5IHRlc3QgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdXRlciBjbGFzcy4KKworCitpbXBvcnQgImNvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb24ucHJvdG8iOworCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCittZXNzYWdlIE15TmVzdGVkRXh0ZW5zaW9uIHsKKyAgZXh0ZW5kIE1lc3NhZ2VUb0JlRXh0ZW5kZWQgeworICAgIG9wdGlvbmFsIE1lc3NhZ2VUb0JlRXh0ZW5kZWQgcmVjdXJzaXZlRXh0ZW5zaW9uID0gMjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlZTQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8KQEAgLTAsMCArMSw0OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBEYXJpY2sgVG9uZyAoZGFyaWNrQGdvb2dsZS5jb20pCisvLworLy8gQSBwcm90byBmaWxlIHdpdGggbmVzdGVkIGV4dGVuc2lvbnMgZm9yIGEgTWVzc2FnZUxpdGUgbWVzc2FnZXMuIE5vdGUgdGhhdAorLy8gdGhpcyBtdXN0IGJlIGRlZmluZWQgaW4gYSBzZXBhcmF0ZSBmaWxlIHRvIHByb3Blcmx5IHRlc3QgdGhlIGluaXRpYWxpemF0aW9uCisvLyBvZiB0aGUgb3V0ZXIgY2xhc3MuCisKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworaW1wb3J0ICJjb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8iOworCittZXNzYWdlIE15TmVzdGVkRXh0ZW5zaW9uTGl0ZSB7CisgIGV4dGVuZCBNZXNzYWdlTGl0ZVRvQmVFeHRlbmRlZCB7CisgICAgb3B0aW9uYWwgTWVzc2FnZUxpdGVUb0JlRXh0ZW5kZWQgcmVjdXJzaXZlRXh0ZW5zaW9uTGl0ZSA9IDM7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbi5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbi5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFiNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvCkBAIC0wLDAgKzEsNDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogRGFyaWNrIFRvbmcgKGRhcmlja0Bnb29nbGUuY29tKQorLy8KKy8vIEEgcHJvdG8gZmlsZSB3aXRoIGV4dGVuc2lvbnMuCisKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworbWVzc2FnZSBNZXNzYWdlVG9CZUV4dGVuZGVkIHsKKyAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKK30KKworbWVzc2FnZSBNeU5vbk5lc3RlZEV4dGVuc2lvbiB7Cit9CisKK2V4dGVuZCBNZXNzYWdlVG9CZUV4dGVuZGVkIHsKKyAgb3B0aW9uYWwgTXlOb25OZXN0ZWRFeHRlbnNpb24gbm9uTmVzdGVkRXh0ZW5zaW9uID0gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzgyNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8KQEAgLTAsMCArMSw1MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBEYXJpY2sgVG9uZyAoZGFyaWNrQGdvb2dsZS5jb20pCisvLworLy8gQSBwcm90byBmaWxlIHdpdGggZXh0ZW5zaW9ucyBmb3IgYSBNZXNzYWdlTGl0ZSBtZXNzYWdlcy4KKworCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworCittZXNzYWdlIE1lc3NhZ2VMaXRlVG9CZUV4dGVuZGVkIHsKKyAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKK30KKworbWVzc2FnZSBNeU5vbk5lc3RlZEV4dGVuc2lvbkxpdGUgeworfQorCitleHRlbmQgTWVzc2FnZUxpdGVUb0JlRXh0ZW5kZWQgeworICBvcHRpb25hbCBNeU5vbk5lc3RlZEV4dGVuc2lvbkxpdGUgbm9uTmVzdGVkRXh0ZW5zaW9uTGl0ZSA9IDE7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjEwZTlkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvCkBAIC0wLDAgKzEsOTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorCisvLyBUaGlzIGZpbGUgdGVzdHMgdGhhdCB2YXJpb3VzIGlkZW50aWZpZXJzIHdvcmsgYXMgZmllbGQgYW5kIHR5cGUgbmFtZXMgZXZlbgorLy8gdGhvdWdoIHRoZSBzYW1lIGlkZW50aWZpZXJzIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGphdmEgY29kZSBnZW5lcmF0b3IuCisKKworLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgorLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKK29wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgIC8vIGF1dG8tYWRkZWQKKworcGFja2FnZSBpb19wcm90b2NvbF90ZXN0czsKKworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKK29wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJUZXN0QmFkSWRlbnRpZmllcnNQcm90byI7CisKK21lc3NhZ2UgVGVzdE1lc3NhZ2UgeworfQorCittZXNzYWdlIERlcHJlY2F0ZWQgeworICBlbnVtIFRlc3RFbnVtIHsKKyAgICBGT08gPSAxOworICB9CisKKyAgb3B0aW9uYWwgaW50MzIgZmllbGQxID0gMSBbZGVwcmVjYXRlZD10cnVlXTsKKyAgb3B0aW9uYWwgVGVzdEVudW0gZmllbGQyID0gMiBbZGVwcmVjYXRlZD10cnVlXTsKKyAgb3B0aW9uYWwgVGVzdE1lc3NhZ2UgZmllbGQzID0gMyBbZGVwcmVjYXRlZD10cnVlXTsKK30KKworbWVzc2FnZSBPdmVycmlkZSB7CisgIG9wdGlvbmFsIGludDMyIG92ZXJyaWRlID0gMTsKK30KKworbWVzc2FnZSBPYmplY3QgeworICBvcHRpb25hbCBpbnQzMiBvYmplY3QgPSAxOworfQorCittZXNzYWdlIFN0cmluZyB7CisgIG9wdGlvbmFsIHN0cmluZyBzdHJpbmcgPSAxOworfQorCittZXNzYWdlIEludGVnZXIgeworICBvcHRpb25hbCBpbnQzMiBpbnRlZ2VyID0gMTsKK30KKworbWVzc2FnZSBMb25nIHsKKyAgb3B0aW9uYWwgaW50MzIgbG9uZyA9IDE7Cit9CisKK21lc3NhZ2UgRmxvYXQgeworICBvcHRpb25hbCBmbG9hdCBmbG9hdCA9IDE7Cit9CisKK21lc3NhZ2UgRG91YmxlIHsKKyAgb3B0aW9uYWwgZG91YmxlIGRvdWJsZSA9IDE7Cit9CisKK3NlcnZpY2UgVGVzdENvbmZsaWN0aW5nTWV0aG9kTmFtZXMgeworICBycGMgT3ZlcnJpZGUoVGVzdE1lc3NhZ2UpIHJldHVybnMgKFRlc3RNZXNzYWdlKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmLmd5cCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zi5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3OWNhZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zi5neXAKQEAgLTAsMCArMSw0ODAgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK3sKKyAgJ2NvbmRpdGlvbnMnOiBbCisgICAgWyd1c2Vfc3lzdGVtX3Byb3RvYnVmPT0wJywgeworICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgIFsnT1MhPSJ3aW4iJywgeworICAgICAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICAgICAnY29uZmlnX2hfZGlyJzoKKyAgICAgICAgICAgICAgJy4nLCAgIyBjcmFmdGVkIGZvciBnY2MvbGludXguCisgICAgICAgICAgfSwKKyAgICAgICAgfSwgeyAgIyBlbHNlLCBPUz09IndpbiIKKyAgICAgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAgICAgJ2NvbmZpZ19oX2Rpcic6CisgICAgICAgICAgICAgICd2c3Byb2plY3RzJywgICMgY3JhZnRlZCBmb3IgbXN2Yy4KKyAgICAgICAgICB9LAorICAgICAgICAgICd0YXJnZXRfZGVmYXVsdHMnOiB7CisgICAgICAgICAgICAnbXN2c19kaXNhYmxlZF93YXJuaW5ncyc6IFsKKyAgICAgICAgICAgICAgNDAxOCwgICMgc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoIGluIGNvbXBhcmlzb24KKyAgICAgICAgICAgICAgNDI0NCwgICMgaW1wbGljaXQgY29udmVyc2lvbiwgcG9zc2libGUgbG9zcyBvZiBkYXRhCisgICAgICAgICAgICAgIDQzNTUsICAjICd0aGlzJyB1c2VkIGluIGJhc2UgbWVtYmVyIGluaXRpYWxpemVyIGxpc3QKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAnZGVmaW5lcyEnOiBbCisgICAgICAgICAgICAgICdXSU4zMl9MRUFOX0FORF9NRUFOJywgICMgUHJvdG9idWYgZGVmaW5lcyB0aGlzIGl0c2VsZi4KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgfSwKKyAgICAgICAgfV0sCisgICAgICAgIFsnT1M9PSJpb3MiJywgeworICAgICAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICAgICAnbmluamFfb3V0cHV0X2Rpcic6ICduaW5qYS1wcm90b2MnLAorICAgICAgICAgICAgJ25pbmphX3Byb2R1Y3RfZGlyJzoKKyAgICAgICAgICAgICAgJzwoREVQVEgpL3hjb2RlYnVpbGQvPChuaW5qYV9vdXRwdXRfZGlyKS88KENPTkZJR1VSQVRJT05fTkFNRSknLAorICAgICAgICAgICAgIyBHeXAgdG8gcmVydW4KKyAgICAgICAgICAgICdyZV9ydW5fdGFyZ2V0cyc6IFsKKyAgICAgICAgICAgICAgJ3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmLmd5cCcsCisgICAgICAgICAgICBdLAorICAgICAgICAgIH0sCisgICAgICAgICAgJ3RhcmdldHMnOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICMgT24gaU9TLCBnZW5lcmF0aW5nIHByb3RvYyBpcyBkb25lIHZpYSB0d28gYWN0aW9uczogKDEpIGNvbXBpbGluZworICAgICAgICAgICAgICAjIHRoZSBleGVjdXRhYmxlIHdpdGggbmluamEsIGFuZCAoMikgY29weWluZyB0aGUgZXhlY3V0YWJsZSBpbnRvIGEKKyAgICAgICAgICAgICAgIyBsb2NhdGlvbiB0aGF0IGlzIHNoYXJlZCB3aXRoIG90aGVyIHByb2plY3RzLiBUaGVzZSBhY3Rpb25zIGFyZQorICAgICAgICAgICAgICAjIHNlcGFyYXRlZCBpbnRvIHR3byB0YXJnZXRzIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gc3BlY2lmeSB0aGF0IHRoZQorICAgICAgICAgICAgICAjIHNlY29uZCBhY3Rpb24gc2hvdWxkIG5vdCBydW4gdW50aWwgdGhlIGZpcnN0IGFjdGlvbiBmaW5pc2hlcyAoc2luY2UKKyAgICAgICAgICAgICAgIyB0aGUgb3JkZXJpbmcgb2YgbXVsdGlwbGUgYWN0aW9ucyBpbiBvbmUgdGFyZ2V0IGlzIGRlZmluZWQgb25seSBieQorICAgICAgICAgICAgICAjIGlucHV0cyBhbmQgb3V0cHV0cywgYW5kIGl0J3MgaW1wb3NzaWJsZSB0byBzZXQgY29ycmVjdCBpbnB1dHMgZm9yCisgICAgICAgICAgICAgICMgdGhlIG5pbmphIGJ1aWxkLCBzbyBzZXR0aW5nIGFsbCB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzIGlzbid0IGFuCisgICAgICAgICAgICAgICMgb3B0aW9uKS4gVGhlIGZpcnN0IHRhcmdldCBpcyBnaXZlbiBoZXJlOyB0aGUgc2Vjb25kIHRhcmdldCBpcyB0aGUKKyAgICAgICAgICAgICAgIyBub3JtYWwgcHJvdG9jIHRhcmdldCB1bmRlciB0aGUgY29uZGl0aW9uIHRoYXQgIk9TPT1pT1MiLgorICAgICAgICAgICAgICAndGFyZ2V0X25hbWUnOiAnY29tcGlsZV9wcm90b2MnLAorICAgICAgICAgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICAgICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi9idWlsZC9pb3MvbWFjX2J1aWxkLmd5cGknXSwKKyAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgJ2FjdGlvbl9uYW1lJzogJ2NvbXBpbGUgcHJvdG9jJywKKyAgICAgICAgICAgICAgICAgICdpbnB1dHMnOiBbXSwKKyAgICAgICAgICAgICAgICAgICdvdXRwdXRzJzogW10sCisgICAgICAgICAgICAgICAgICAnYWN0aW9uJzogWworICAgICAgICAgICAgICAgICAgICAnPEAobmluamFfY21kKScsCisgICAgICAgICAgICAgICAgICAgICdwcm90b2MnLAorICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogJ0dlbmVyYXRpbmcgdGhlIEMrKyBwcm90b2NvbCBidWZmZXJzIGNvbXBpbGVyJywKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKKyAgICAgICAgWydPUz09ImFuZHJvaWQiJywgeworICAgICAgICAgICd0YXJnZXRzJzogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncHJvdG9idWZfbGl0ZV9qYXZhbGliJywKKyAgICAgICAgICAgICAgJ3R5cGUnIDogJ25vbmUnLAorICAgICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgICAgICdwcm90b2MjaG9zdCcsCisgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICAgICAgICAgJ3NjcmlwdF9kZXNjcmlwdG9ycyc6ICcuL3Byb3RvYnVmX2xpdGVfamF2YV9kZXNjcmlwdG9yX3Byb3RvLnB5JywKKyAgICAgICAgICAgICAgICAnc2NyaXB0X3BvbSc6ICcuL3Byb3RvYnVmX2xpdGVfamF2YV9wYXJzZV9wb20ucHknLAorICAgICAgICAgICAgICAgICdwcm90b2MnOiAnPChQUk9EVUNUX0RJUikvPChFWEVDVVRBQkxFX1BSRUZJWClwcm90b2M8KEVYRUNVVEFCTEVfU1VGRklYKScsCisgICAgICAgICAgICAgICAgIyBWYXJpYWJsZXMgbmVlZGVkIGJ5IGphdmEuZ3lwaSBiZWxvdy4KKyAgICAgICAgICAgICAgICAnamF2YV9vdXRfZGlyJzogJzwoUFJPRFVDVF9ESVIpL2phdmFfcHJvdG8vcHJvdG9idWZfbGl0ZV9qYXZhX2Rlc2NyaXB0b3JfcHJvdG8nLAorICAgICAgICAgICAgICAgICdnZW5lcmF0ZWRfc3JjX2RpcnMnOiBbJzwoamF2YV9vdXRfZGlyKSddLAorICAgICAgICAgICAgICAgICdwYWNrYWdlX25hbWUnOiAnPChfdGFyZ2V0X25hbWUpJywKKyAgICAgICAgICAgICAgICAnamF2YV9pbl9kaXInOiAnamF2YScsCisgICAgICAgICAgICAgICAgJ21hdmVuX3BvbSc6ICc8KGphdmFfaW5fZGlyKS9wb20ueG1sJywKKyAgICAgICAgICAgICAgICAnamF2YWNfaW5jbHVkZXMnOiBbJzwhQCg8KHNjcmlwdF9wb20pIDwobWF2ZW5fcG9tKSknXSwKKyAgICAgICAgICAgICAgICAnYWRkaXRpb25hbF9pbnB1dF9wYXRocyc6IFsKKyAgICAgICAgICAgICAgICAgICc8KGphdmFfb3V0X2RpcikvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9yUHJvdG9zLmphdmEnCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgJ2FjdGlvbl9uYW1lJzogJ3Byb3RvYnVmX2xpdGVfamF2YV9nZW5fZGVzY3JpcHRvcl9wcm90bycsCisgICAgICAgICAgICAgICAgICAnaW5wdXRzJzogWworICAgICAgICAgICAgICAgICAgICAnPChzY3JpcHRfZGVzY3JpcHRvcnMpJywKKyAgICAgICAgICAgICAgICAgICAgJzwocHJvdG9jKScsCisgICAgICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8nLAorICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICdvdXRwdXRzJzogWworICAgICAgICAgICAgICAgICAgICAnPChqYXZhX291dF9kaXIpL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvclByb3Rvcy5qYXZhJywKKyAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAnYWN0aW9uJzogWworICAgICAgICAgICAgICAgICAgICAnPChzY3JpcHRfZGVzY3JpcHRvcnMpJywKKyAgICAgICAgICAgICAgICAgICAgJzwocHJvdG9jKScsCisgICAgICAgICAgICAgICAgICAgICc8KGphdmFfb3V0X2RpciknLAorICAgICAgICAgICAgICAgICAgICAnc3JjJywKKyAgICAgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bycsCisgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiAnR2VuZXJhdGluZyBkZXNjcmlwdG9yIHByb3RvcyBmb3IgSmF2YScsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgIyBOb3cgdGhhdCB3ZSBoYXZlIGdlbmVyYXRlZCBEZXNjcmlwdG9yUHJvdG9zLmphdmEsIGJ1aWxkIGphci4KKyAgICAgICAgICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi9idWlsZC9qYXZhLmd5cGknXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgXQorICAgICAgICB9XSwKKyAgICAgIF0sCisgICAgICAndGFyZ2V0cyc6IFsKKyAgICAgICAgIyBUaGUgImxpdGUiIGxpYiBpcyBhYm91dCAxLzd0aCB0aGUgc2l6ZSBvZiB0aGUgaGVhdnkgbGliLAorICAgICAgICAjIGJ1dCBpdCBkb2Vzbid0IHN1cHBvcnQgc29tZSBvZiB0aGUgbW9yZSBleG90aWMgZmVhdHVyZXMgb2YKKyAgICAgICAgIyBwcm90b2J1ZnMsIGxpa2UgcmVmbGVjdGlvbi4gIFRvIGdlbmVyYXRlIEMrKyBjb2RlIHRoYXQgY2FuIGxpbmsKKyAgICAgICAgIyBhZ2FpbnN0IHRoZSBsaXRlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGFkZCB0aGUgb3B0aW9uIGxpbmU6CisgICAgICAgICMKKyAgICAgICAgIyAgIG9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisgICAgICAgICMKKyAgICAgICAgIyB0byB5b3VyIC5wcm90byBmaWxlLgorICAgICAgICB7CisgICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ3Byb3RvYnVmX2xpdGUnLAorICAgICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICAgICAndG9vbHNldHMnOiBbJ2hvc3QnLCAndGFyZ2V0J10sCisgICAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHMuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9nY2MuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2F0b21pY3dvcmRfY29tcGF0LmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19tYWNvc3guaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21pcHNfZ2NjLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wbGF0Zm9ybV9tYWNyb3MuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaCcsCisKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLWlubC5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX2lubC5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MnLAorICAgICAgICAgICAgJzwoY29uZmlnX2hfZGlyKS9jb25maWcuaCcsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgICAgICAgJzwoY29uZmlnX2hfZGlyKScsCisgICAgICAgICAgICAnc3JjJywKKyAgICAgICAgICBdLAorICAgICAgICAgICMgVGhpcyBtYWNybyBtdXN0IGJlIGRlZmluZWQgdG8gc3VwcHJlc3MgdGhlIHVzZSBvZiBkeW5hbWljX2Nhc3Q8PiwKKyAgICAgICAgICAjIHdoaWNoIHJlcXVpcmVzIFJUVEkuCisgICAgICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICAgICAnR09PR0xFX1BST1RPQlVGX05PX1JUVEknLAorICAgICAgICAgICAgJ0dPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVInLAorICAgICAgICAgIF0sCisKKyAgICAgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKKyAgICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCisgICAgICAgICAgICAgICc8KGNvbmZpZ19oX2RpciknLAorICAgICAgICAgICAgICAnc3JjJywKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAnZGVmaW5lcyc6IFsKKyAgICAgICAgICAgICAgJ0dPT0dMRV9QUk9UT0JVRl9OT19SVFRJJywKKyAgICAgICAgICAgICAgJ0dPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVInLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAjIFRoaXMgaXMgdGhlIGZ1bGwsIGhlYXZ5IHByb3RvYnVmIGxpYiB0aGF0J3MgbmVlZGVkIGZvciBjKysgLnByb3RvJ3MKKyAgICAgICAgIyB0aGF0IGRvbid0IHNwZWNpZnkgdGhlIExJVEVfUlVOVElNRSBvcHRpb24uICBUaGUgcHJvdG9jb2wKKyAgICAgICAgIyBjb21waWxlciBpdHNlbGYgKHByb3RvYykgZmFsbHMgaW50byB0aGF0IGNhdGVnb3J5LgorICAgICAgICAjCisgICAgICAgICMgRE8gTk9UIExJTksgQUdBSU5TVCBUSElTIFRBUkdFVCBJTiBDSFJPTUUgQ09ERSAgLS1hZ2wKKyAgICAgICAgeworICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdwcm90b2J1Zl9mdWxsX2RvX25vdF91c2UnLAorICAgICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICAgICAndG9vbHNldHMnOiBbJ2hvc3QnLCd0YXJnZXQnXSwKKyAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmgnLAorCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWQuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuY2MnLAorICAgICAgICAgICAgIyBUaGlzIGZpbGUgcHVsbHMgaW4gemxpYiwgYnV0IGl0J3Mgbm90IGFjdHVhbGx5IHVzZWQgYnkgcHJvdG9jLCBzbworICAgICAgICAgICAgIyBpbnN0ZWFkIG9mIGNvbXBpbGluZyB6bGliIGZvciB0aGUgaG9zdCwgbGV0J3MganVzdCBleGNsdWRlIHRoaXMuCisgICAgICAgICAgICAjICdzcmMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAncHJvdG9idWZfbGl0ZScsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgICAgICdwcm90b2J1Zl9saXRlJywKKyAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ3Byb3RvYycsCisgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgICAgICBbJ09TIT0iaW9zIicsIHsKKyAgICAgICAgICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAgICAgICAgICd0b29sc2V0cyc6IFsnaG9zdCddLAorICAgICAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5jYycsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYycsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYycsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5jYycsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYycsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5jYycsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmNjJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmgnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5jYycsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmgnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmNjJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5jYycsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmgnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmgnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oJywKKyAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5jYycsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmgnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmgnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuY2MnLAorICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MnLAorICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgICAgICdwcm90b2J1Zl9mdWxsX2RvX25vdF91c2UnLAorICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgICAgICAgICAgICc8KGNvbmZpZ19oX2RpciknLAorICAgICAgICAgICAgICAgICdzcmMvc3JjJywKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH0sIHsgICMgZWxzZSwgT1M9PSJpb3MiCisgICAgICAgICAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgICAgICdjb21waWxlX3Byb3RvYycsCisgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICdhY3Rpb25zJzogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICdhY3Rpb25fbmFtZSc6ICdjb3B5IHByb3RvYycsCisgICAgICAgICAgICAgICAgICAnaW5wdXRzJzogWworICAgICAgICAgICAgICAgICAgICAnPChuaW5qYV9wcm9kdWN0X2RpcikvcHJvdG9jJywKKyAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAnb3V0cHV0cyc6IFsKKyAgICAgICAgICAgICAgICAgICAgJzwoUFJPRFVDVF9ESVIpL3Byb3RvYycsCisgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgJ2FjdGlvbic6IFsKKyAgICAgICAgICAgICAgICAgICAgJ2NwJywKKyAgICAgICAgICAgICAgICAgICAgJzwobmluamFfcHJvZHVjdF9kaXIpL3Byb3RvYycsCisgICAgICAgICAgICAgICAgICAgICc8KFBST0RVQ1RfRElSKS9wcm90b2MnLAorICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfV0sCisgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICMgR2VuZXJhdGUgdGhlIHB5dGhvbiBtb2R1bGUgbmVlZGVkIGJ5IGFsbCBwcm90b2MtZ2VuZXJhdGVkIFB5dGhvbiBjb2RlLgorICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdweV9wcm90bycsCisgICAgICAgICAgJ3R5cGUnOiAnbm9uZScsCisgICAgICAgICAgJ2NvcGllcyc6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ2Rlc3RpbmF0aW9uJzogJzwoUFJPRFVDVF9ESVIpL3B5cHJvdG8vZ29vZ2xlLycsCisgICAgICAgICAgICAgICdmaWxlcyc6IFsKKyAgICAgICAgICAgICAgICAjIGdvb2dsZS8gbW9kdWxlIGdldHMgYW4gZW1wdHkgX19pbml0X18ucHkuCisgICAgICAgICAgICAgICAgJ19faW5pdF9fLnB5JywKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICdkZXN0aW5hdGlvbic6ICc8KFBST0RVQ1RfRElSKS9weXByb3RvL2dvb2dsZS9wcm90b2J1ZicsCisgICAgICAgICAgICAgICdmaWxlcyc6IFsKKyAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9fX2luaXRfXy5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZS5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZV9yZWZsZWN0aW9uLnB5JywKKyAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5weScsCisKKyAgICAgICAgICAgICAgICAjIFRPRE8obmNhcnRlcik6IHByb3RvYydzIHB5dGhvbiBnZW5lcmF0b3IgdHJlYXRzCisgICAgICAgICAgICAgICAgIyBkZXNjcmlwdG9yLnByb3RvIHNwZWNpYWxseSwgYnV0IGl0J3Mgbm90IHBvc3NpYmxlIHRvIHRyaWdnZXIKKyAgICAgICAgICAgICAgICAjIHRoZSBzcGVjaWFsIHRyZWF0bWVudCB1bmxlc3MgeW91IHJ1biBwcm90b2MgZnJvbSAuL3NyYy9zcmMKKyAgICAgICAgICAgICAgICAjICh0aGUgdHJlYXRtZW50IGlzIGJhc2VkIG9uIHRoZSBwYXRoIHRvIHRoZSAucHJvdG8gZmlsZQorICAgICAgICAgICAgICAgICMgbWF0Y2hpbmcgYSBjb25zdGFudCBleGFjdGx5KS4gSSdtIG5vdCBzdXJlIGhvdyB0byBjb252aW5jZQorICAgICAgICAgICAgICAgICMgZ3lwIHRvIGV4ZWN1dGUgYSBydWxlIGZyb20gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LiAgVW50aWwgdGhpcworICAgICAgICAgICAgICAgICMgaXMgcmVzb2x2ZWQsIHVzZSBhIGNvcHkgb2YgZGVzY3JpcHRvcl9wYjIucHkgdGhhdCBJIG1hbnVhbGx5CisgICAgICAgICAgICAgICAgIyBnZW5lcmF0ZWQuCisgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3JfcGIyLnB5JywKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICdkZXN0aW5hdGlvbic6ICc8KFBST0RVQ1RfRElSKS9weXByb3RvL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbCcsCisgICAgICAgICAgICAgICdmaWxlcyc6IFsKKyAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9fX2luaXRfXy5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLnB5JywKKyAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jb250YWluZXJzLnB5JywKKyAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jcHBfbWVzc2FnZS5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVjb2Rlci5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2Rlci5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZ2VuZXJhdG9yX3Rlc3QucHknLAorICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfbGlzdGVuZXIucHknLAorICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3B5dGhvbl9tZXNzYWdlLnB5JywKKyAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90eXBlX2NoZWNrZXJzLnB5JywKKyAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93aXJlX2Zvcm1hdC5weScsCisgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9LAorICAgICAgICAgIF0sCisgICAgICAjICAgIyBXZSBjYW4ndCBnZW5lcmF0ZSBhIHByb3BlciBkZXNjcmlwdG9yX3BiMi5weSAtLSBzZWUgZWFybGllciBjb21tZW50LgorICAgICAgIyAgICdydWxlcyc6IFsKKyAgICAgICMgICAgIHsKKyAgICAgICMgICAgICAgJ3J1bGVfbmFtZSc6ICdnZW5wcm90bycsCisgICAgICAjICAgICAgICdleHRlbnNpb24nOiAncHJvdG8nLAorICAgICAgIyAgICAgICAnaW5wdXRzJzogWworICAgICAgIyAgICAgICAgICc8KFBST0RVQ1RfRElSKS88KEVYRUNVVEFCTEVfUFJFRklYKXByb3RvYzwoRVhFQ1VUQUJMRV9TVUZGSVgpJywKKyAgICAgICMgICAgICAgXSwKKyAgICAgICMgICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICMgICAgICAgICAjIFRoZSBwcm90b2MgY29tcGlsZXIgcmVxdWlyZXMgYSBwcm90b19wYXRoIGFyZ3VtZW50IHdpdGggdGhlCisgICAgICAjICAgICAgICAgICAjIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAucHJvdG8gZmlsZS4KKyAgICAgICMgICAgICAgICAgICdydWxlX2lucHV0X3JlbHBhdGgnOiAnc3JjL2dvb2dsZS9wcm90b2J1ZicsCisgICAgICAjICAgICAgICAgfSwKKyAgICAgICMgICAgICAgICAnb3V0cHV0cyc6IFsKKyAgICAgICMgICAgICAgICAgICc8KFBST0RVQ1RfRElSKS9weXByb3RvL2dvb2dsZS9wcm90b2J1Zi88KFJVTEVfSU5QVVRfUk9PVClfcGIyLnB5JywKKyAgICAgICMgICAgICAgICBdLAorICAgICAgIyAgICAgICAgICdhY3Rpb24nOiBbCisgICAgICAjICAgICAgICAgICAnPChQUk9EVUNUX0RJUikvPChFWEVDVVRBQkxFX1BSRUZJWClwcm90b2M8KEVYRUNVVEFCTEVfU1VGRklYKScsCisgICAgICAjICAgICAgICAgICAnLUkuL3NyYycsCisgICAgICAjICAgICAgICAgICAnLUkuJywKKyAgICAgICMgICAgICAgICAgICctLXB5dGhvbl9vdXQ9PChQUk9EVUNUX0RJUikvcHlwcm90by9nb29nbGUvcHJvdG9idWYnLAorICAgICAgIyAgICAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvJywKKyAgICAgICMgICAgICAgICBdLAorICAgICAgIyAgICAgICAgICdtZXNzYWdlJzogJ0dlbmVyYXRpbmcgUHl0aG9uIGNvZGUgZnJvbSA8KFJVTEVfSU5QVVRfUEFUSCknLAorICAgICAgIyAgICAgICB9LAorICAgICAgIyAgICAgXSwKKyAgICAgICMgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAjICAgICAgICdwcm90b2MjaG9zdCcsCisgICAgICAjICAgICBdLAorICAgICAgIyAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAjICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8nLAorICAgICAgIyAgICAgXSwKKyAgICAgICAgIH0sCisgICAgICBdLAorICAgIH0sIHsgIyB1c2Vfc3lzdGVtX3Byb3RvYnVmPT0xCisgICAgICAndGFyZ2V0cyc6IFsKKyAgICAgICAgeworICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdwcm90b2J1Zl9saXRlJywKKyAgICAgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKKyAgICAgICAgICAgICdjZmxhZ3MnOiBbCisgICAgICAgICAgICAgICMgVXNlIGZ1bGwgcHJvdG9idWYsIGJlY2F1c2UgdmFuaWxsYSBwcm90b2J1ZiBkb2Vzbid0IGhhdmUKKyAgICAgICAgICAgICAgIyBvdXIgY3VzdG9tIHBhdGNoIHRvIHJldGFpbiB1bmtub3duIGZpZWxkcyBpbiBsaXRlIG1vZGUuCisgICAgICAgICAgICAgICc8IUAocGtnLWNvbmZpZyAtLWNmbGFncyBwcm90b2J1ZiknLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICdkZWZpbmVzJzogWworICAgICAgICAgICAgICAnVVNFX1NZU1RFTV9QUk9UT0JVRicsCisKKyAgICAgICAgICAgICAgIyBUaGlzIG1hY3JvIG11c3QgYmUgZGVmaW5lZCB0byBzdXBwcmVzcyB0aGUgdXNlCisgICAgICAgICAgICAgICMgb2YgZHluYW1pY19jYXN0PD4sIHdoaWNoIHJlcXVpcmVzIFJUVEkuCisgICAgICAgICAgICAgICdHT09HTEVfUFJPVE9CVUZfTk9fUlRUSScsCisgICAgICAgICAgICAgICdHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSJywKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgfSwKKyAgICAgICAgICAnbGlua19zZXR0aW5ncyc6IHsKKyAgICAgICAgICAgICMgVXNlIGZ1bGwgcHJvdG9idWYsIGJlY2F1c2UgdmFuaWxsYSBwcm90b2J1ZiBkb2Vzbid0IGhhdmUKKyAgICAgICAgICAgICMgb3VyIGN1c3RvbSBwYXRjaCB0byByZXRhaW4gdW5rbm93biBmaWVsZHMgaW4gbGl0ZSBtb2RlLgorICAgICAgICAgICAgJ2xkZmxhZ3MnOiBbCisgICAgICAgICAgICAgICc8IUAocGtnLWNvbmZpZyAtLWxpYnMtb25seS1MIC0tbGlicy1vbmx5LW90aGVyIHByb3RvYnVmKScsCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgJ2xpYnJhcmllcyc6IFsKKyAgICAgICAgICAgICAgJzwhQChwa2ctY29uZmlnIC0tbGlicy1vbmx5LWwgcHJvdG9idWYpJywKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdwcm90b2MnLAorICAgICAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgICAgICd0b29sc2V0cyc6IFsnaG9zdCcsICd0YXJnZXQnXSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICd0YXJnZXRfbmFtZSc6ICdweV9wcm90bycsCisgICAgICAgICAgJ3R5cGUnOiAnbm9uZScsCisgICAgICAgIH0sCisgICAgICBdLAorICAgIH1dLAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfamF2YV9kZXNjcmlwdG9yX3Byb3RvLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfamF2YV9kZXNjcmlwdG9yX3Byb3RvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5NjdjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9qYXZhX2Rlc2NyaXB0b3JfcHJvdG8ucHkKQEAgLTAsMCArMSw0OSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisiIiJHZW5lcmF0ZSBqYXZhIERlc2NyaXB0b3JQcm90byBmaWxlLgorCitVc2FnZToKKyAgICBwcm90b2J1Zl9saXRlX2phdmFfZGVzY3JpcHRvcl9wcm90by5weSB7cHJvdG9jfSB7amF2YV9vdXR9IHtpbmNsdWRlfSB7cHJvdG9fZmlsZXN9CisKK1RoaXMgaXMgYSBoZWxwZXIgZmlsZSBmb3IgdGhlIHByb3RvYnVmX2xpdGVfamF2YV9nZW5fZGVzY3JpcHRvcl9wcm90byBhY3Rpb24gaW4KK3Byb3RvYnVmLmd5cC4KKworSXQgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKzEuIFJlY3Vyc2l2ZWx5IGRlbGV0ZXMgb2xkIGphdmFfb3V0IGRpcmVjdG9yeS4KKzIuIENyZWF0ZXMgamF2YV9vdXQgZGlyZWN0b3J5LgorMy4gR2VuZXJhdGVzIEphdmEgZGVzY3JpcHRvciBwcm90byBmaWxlIHVzaW5nIHByb3RvYy4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCisKK2RlZiBtYWluKGFyZ3YpOgorICBpZiBsZW4oYXJndikgPCA0OgorICAgIHVzYWdlKCkKKyAgICByZXR1cm4gMQorCisgIHByb3RvY19wYXRoLCBqYXZhX291dCwgaW5jbHVkZSA9IGFyZ3ZbMTo0XQorICBwcm90b19maWxlcyA9IGFyZ3ZbNDpdCisKKyAgIyBEZWxldGUgYWxsIG9sZCBzb3VyY2VzCisgIGlmIG9zLnBhdGguZXhpc3RzKGphdmFfb3V0KToKKyAgICBzaHV0aWwucm10cmVlKGphdmFfb3V0KQorCisgICMgQ3JlYXRlIHNvdXJjZSBkaXJlY3RvcnkKKyAgb3MubWFrZWRpcnMoamF2YV9vdXQpCisKKyAgIyBHZW5lcmF0ZSBKYXZhIGZpbGVzIHVzaW5nIHByb3RvYworICByZXR1cm4gc3VicHJvY2Vzcy5jYWxsKAorICAgICAgW3Byb3RvY19wYXRoLCAnLS1qYXZhX291dCcsIGphdmFfb3V0LCAnLUknICsgaW5jbHVkZV0KKyAgICAgICsgcHJvdG9fZmlsZXMpCisKK2RlZiB1c2FnZSgpOgorICBwcmludChfX2RvY19fKTsKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbihzeXMuYXJndikpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9qYXZhX3BhcnNlX3BvbS5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2phdmFfcGFyc2VfcG9tLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3NWM1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9qYXZhX3BhcnNlX3BvbS5weQpAQCAtMCwwICsxLDU3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyIiIlBhcnNlcyB0aGUgTWF2ZW4gcG9tLnhtbCBmaWxlIGZvciB3aGljaCBmaWxlcyB0byBpbmNsdWRlIGluIGEgbGl0ZSBidWlsZC4KKworVXNhZ2U6CisgICAgcHJvdG9idWZfbGl0ZV9qYXZhX3BhcnNlX3BvbS5weSB7cGF0aCB0byBwb20ueG1sfQorCitUaGlzIGlzIGEgaGVscGVyIGZpbGUgZm9yIHRoZSBwcm90b2J1Zl9saXRlX2phdmEgdGFyZ2V0IGluIHByb3RvYnVmLmd5cC4KKworSXQgcGFyc2VzIHRoZSBwb20ueG1sIGZpbGUsIGFuZCBsb29rcyBmb3IgYWxsIHRoZSBpbmNsdWRlcyBzcGVjaWZpZWQgaW4gdGhlCisnbGl0ZScgcHJvZmlsZS4gSXQgZG9lcyBub3QgcmV0dXJuIGFuZCB0ZXN0IGluY2x1ZGVzLgorCitUaGUgcmVzdWx0IGlzIHByaW50ZWQgYXMgb25lIGxpbmUgcGVyIGVudHJ5LgorIiIiCisKK2ltcG9ydCBzeXMKKworZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlCisKK2RlZiBtYWluKGFyZ3YpOgorICBpZiAobGVuKGFyZ3YpIDwgMik6CisgICAgdXNhZ2UoKQorICAgIHJldHVybiAxCisKKyAgIyBTZXR1cCBhbGwgZmlsZSBhbmQgWE1MIHF1ZXJ5IHBhdGhzLgorICBwb21fcGF0aCA9IGFyZ3ZbMV0KKyAgbmFtZXNwYWNlID0gIntodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjB9IgorICBwcm9maWxlX3BhdGggPSAnezB9cHJvZmlsZXMvezB9cHJvZmlsZScuZm9ybWF0KG5hbWVzcGFjZSkKKyAgaWRfcGF0aCA9ICd7MH1pZCcuZm9ybWF0KG5hbWVzcGFjZSkKKyAgcGx1Z2luX3BhdGggPSBcCisgICAgJ3swfWJ1aWxkL3swfXBsdWdpbnMvezB9cGx1Z2luJy5mb3JtYXQobmFtZXNwYWNlKQorICBhcnRpZmFjdF9wYXRoID0gJ3swfWFydGlmYWN0SWQnLmZvcm1hdChuYW1lc3BhY2UpCisgIGluY2x1ZGVfcGF0aCA9ICd7MH1jb25maWd1cmF0aW9uL3swfWluY2x1ZGVzL3swfWluY2x1ZGUnLmZvcm1hdChuYW1lc3BhY2UpCisKKyAgIyBQYXJzZSBYTUwgZmlsZSBhbmQgc3RvcmUgcmVzdWx0IGluIGluY2x1ZGVzIGxpc3QuCisgIGluY2x1ZGVzID0gW10KKyAgZm9yIHByb2ZpbGUgaW4gRWxlbWVudFRyZWUucGFyc2UocG9tX3BhdGgpLmdldHJvb3QoKS5maW5kYWxsKHByb2ZpbGVfcGF0aCk6CisgICAgaWRfZWxlbWVudCA9IHByb2ZpbGUuZmluZChpZF9wYXRoKQorICAgIGlmIChpZF9lbGVtZW50IGlzIG5vdCBOb25lIGFuZCBpZF9lbGVtZW50LnRleHQgPT0gJ2xpdGUnKToKKyAgICAgIGZvciBwbHVnaW4gaW4gcHJvZmlsZS5maW5kYWxsKHBsdWdpbl9wYXRoKToKKyAgICAgICAgYXJ0aWZhY3RfZWxlbWVudCA9IHBsdWdpbi5maW5kKGFydGlmYWN0X3BhdGgpCisgICAgICAgIGlmIChhcnRpZmFjdF9lbGVtZW50IGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgYXJ0aWZhY3RfZWxlbWVudC50ZXh0ID09ICdtYXZlbi1jb21waWxlci1wbHVnaW4nKToKKyAgICAgICAgICBmb3IgaW5jbHVkZSBpbiBwbHVnaW4uZmluZGFsbChpbmNsdWRlX3BhdGgpOgorICAgICAgICAgICAgaW5jbHVkZXMuYXBwZW5kKGluY2x1ZGUudGV4dCkKKworICAjIFByaW50IHJlc3VsdCB0byBzdGRvdXQsIG9uZSBpdGVtIG9uIGVhY2ggbGluZS4KKyAgcHJpbnQgJ1xuJy5qb2luKGluY2x1ZGVzKQorCitkZWYgdXNhZ2UoKToKKyAgcHJpbnQoX19kb2NfXyk7CisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3YpKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9SRUFETUUudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYzE0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL1JFQURNRS50eHQKQEAgLTAsMCArMSwxMDAgQEAKK1Byb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIFB5dGhvbiBQcm90b2NvbCBCdWZmZXJzIHJ1bnRpbWUgbGlicmFyeS4KKworTm9ybWFsbHksIHRoaXMgZGlyZWN0b3J5IGNvbWVzIGFzIHBhcnQgb2YgdGhlIHByb3RvYnVmIHBhY2thZ2UsIGF2YWlsYWJsZQorZnJvbToKKworICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYKKworVGhlIGNvbXBsZXRlIHBhY2thZ2UgaW5jbHVkZXMgdGhlIEMrKyBzb3VyY2UgY29kZSwgd2hpY2ggaW5jbHVkZXMgdGhlCitQcm90b2NvbCBDb21waWxlciAocHJvdG9jKS4gIElmIHlvdSBkb3dubG9hZGVkIHRoaXMgcGFja2FnZSBmcm9tIFB5UEkKK29yIHNvbWUgb3RoZXIgUHl0aG9uLXNwZWNpZmljIHNvdXJjZSwgeW91IG1heSBoYXZlIHJlY2VpdmVkIG9ubHkgdGhlCitQeXRob24gcGFydCBvZiB0aGUgY29kZS4gIEluIHRoaXMgY2FzZSwgeW91IHdpbGwgbmVlZCB0byBvYnRhaW4gdGhlCitQcm90b2NvbCBDb21waWxlciBmcm9tIHNvbWUgb3RoZXIgc291cmNlIGJlZm9yZSB5b3UgY2FuIHVzZSB0aGlzCitwYWNrYWdlLgorCitEZXZlbG9wbWVudCBXYXJuaW5nCis9PT09PT09PT09PT09PT09PT09CisKK1RoZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgUHJvdG9jb2wgQnVmZmVycyBpcyBub3QgYXMgbWF0dXJlIGFzIHRoZSBDKysKK2FuZCBKYXZhIGltcGxlbWVudGF0aW9ucy4gIEl0IG1heSBiZSBtb3JlIGJ1Z2d5LCBhbmQgaXQgaXMga25vd24gdG8gYmUKK3ByZXR0eSBzbG93IGF0IHRoaXMgdGltZS4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIGhlbHAgZml4IHRoZXNlIGlzc3VlcywKK2pvaW4gdGhlIFByb3RvY29sIEJ1ZmZlcnMgZGlzY3Vzc2lvbiBsaXN0IGFuZCBsZXQgdXMga25vdyEKKworSW5zdGFsbGF0aW9uCis9PT09PT09PT09PT0KKworMSkgTWFrZSBzdXJlIHlvdSBoYXZlIFB5dGhvbiAyLjQgb3IgbmV3ZXIuICBJZiBpbiBkb3VidCwgcnVuOgorCisgICAgICQgcHl0aG9uIC1WCisKKzIpIElmIHlvdSBkbyBub3QgaGF2ZSBzZXR1cHRvb2xzIGluc3RhbGxlZCwgbm90ZSB0aGF0IGl0IHdpbGwgYmUKKyAgIGRvd25sb2FkZWQgYW5kIGluc3RhbGxlZCBhdXRvbWF0aWNhbGx5IGFzIHNvb24gYXMgeW91IHJ1biBzZXR1cC5weS4KKyAgIElmIHlvdSB3b3VsZCByYXRoZXIgaW5zdGFsbCBpdCBtYW51YWxseSwgeW91IG1heSBkbyBzbyBieSBmb2xsb3dpbmcKKyAgIHRoZSBpbnN0cnVjdGlvbnMgb24gdGhpcyBwYWdlOgorCisgICAgIGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL0RldkNlbnRlci9FYXN5SW5zdGFsbCNpbnN0YWxsYXRpb24taW5zdHJ1Y3Rpb25zCisKKzMpIEJ1aWxkIHRoZSBDKysgY29kZSwgb3IgaW5zdGFsbCBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgcHJvdG9jLiAgSWYKKyAgIHlvdSBpbnN0YWxsIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiwgbWFrZSBzdXJlIHRoYXQgaXQgaXMgdGhlIHNhbWUKKyAgIHZlcnNpb24gYXMgdGhpcyBwYWNrYWdlLiAgSWYgaW4gZG91YnQsIHJ1bjoKKworICAgICAkIHByb3RvYyAtLXZlcnNpb24KKworNCkgUnVuIHRoZSB0ZXN0czoKKworICAgICAkIHB5dGhvbiBzZXR1cC5weSB0ZXN0CisKKyAgIElmIHNvbWUgdGVzdHMgZmFpbCwgdGhpcyBsaWJyYXJ5IG1heSBub3Qgd29yayBjb3JyZWN0bHkgb24geW91cgorICAgc3lzdGVtLiAgQ29udGludWUgYXQgeW91ciBvd24gcmlzay4KKworICAgUGxlYXNlIG5vdGUgdGhhdCB0aGVyZSBpcyBhIGtub3duIHByb2JsZW0gd2l0aCBzb21lIHZlcnNpb25zIG9mCisgICBQeXRob24gb24gQ3lnd2luIHdoaWNoIGNhdXNlcyB0aGUgdGVzdHMgdG8gZmFpbCBhZnRlciBwcmludGluZyB0aGUKKyAgIGVycm9yOiAgInNlbV9pbml0OiBSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSIuICBUaGlzIGFwcGVhcnMKKyAgIHRvIGJlIGEgYnVnIGVpdGhlciBpbiBDeWd3aW4gb3IgaW4gUHl0aG9uOgorICAgICBodHRwOi8vd3d3LmN5Z3dpbi5jb20vbWwvY3lnd2luLzIwMDUtMDcvbXNnMDEzNzguaHRtbAorICAgV2UgZG8gbm90IGtub3cgaWYgb3Igd2hlbiBpdCBtaWdodCBtZSBmaXhlZC4gIFdlIGFsc28gZG8gbm90IGtub3cKKyAgIGhvdyBsaWtlbHkgaXQgaXMgdGhhdCB0aGlzIGJ1ZyB3aWxsIGFmZmVjdCB1c2VycyBpbiBwcmFjdGljZS4KKworNSkgSW5zdGFsbDoKKworICAgICAkIHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsCisKKyAgIFRoaXMgc3RlcCBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4KKyAgIE5PVEU6IFRvIHVzZSBDKysgaW1wbGVtZW50YXRpb24sIHlvdSBuZWVkIHRvIGluc3RhbGwgQysrIHByb3RvYnVmIHJ1bnRpbWUKKyAgIGxpYnJhcnkgb2YgdGhlIHNhbWUgdmVyc2lvbiBhbmQgZXhwb3J0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgdGhpcworICAgc3RlcC4gU2VlIHRoZSAiQysrIEltcGxlbWVudGF0aW9uIiBzZWN0aW9uIGJlbG93IGZvciBtb3JlIGRldGFpbHMuCisKK1VzYWdlCis9PT09PQorCitUaGUgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBmb3IgUHJvdG9jb2wgQnVmZmVycyBpcyBhdmFpbGFibGUgdmlhIHRoZQord2ViIGF0OgorCisgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9wcm90b2NvbGJ1ZmZlcnMvCisKK0MrKyBJbXBsZW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09CisKK1dBUk5JTkc6IFRoaXMgaXMgRVhQRVJJTUVOVEFMIGFuZCBvbmx5IGF2YWlsYWJsZSBmb3IgQ1B5dGhvbiBwbGF0Zm9ybXMuCisKK1RoZSBDKysgaW1wbGVtZW50YXRpb24gZm9yIFB5dGhvbiBtZXNzYWdlcyBpcyBidWlsdCBhcyBhIFB5dGhvbiBleHRlbnNpb24gdG8KK2ltcHJvdmUgdGhlIG92ZXJhbGwgcHJvdG9idWYgUHl0aG9uIHBlcmZvcm1hbmNlLgorCitUbyB1c2UgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwgeW91IG5lZWQgdG86CisxKSBJbnN0YWxsIHRoZSBDKysgcHJvdG9idWYgcnVudGltZSBsaWJyYXJ5LCBwbGVhc2Ugc2VlIGluc3RydWN0aW9ucyBpbiB0aGUKKyAgIHBhcmVudCBkaXJlY3RvcnkuCisyKSBFeHBvcnQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGU6CisKKyAgJCBleHBvcnQgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT049Y3BwCisKK1lvdSBuZWVkIHRvIGV4cG9ydCB0aGlzIHZhcmlhYmxlIGJlZm9yZSBydW5uaW5nIHNldHVwLnB5IHNjcmlwdCB0byBidWlsZCBhbmQKK2luc3RhbGwgdGhlIGV4dGVuc2lvbi4gIFlvdSBtdXN0IGFsc28gc2V0IHRoZSB2YXJpYWJsZSBhdCBydW50aW1lLCBvdGhlcndpc2UKK3RoZSBwdXJlLVB5dGhvbiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQuIEluIGEgZnV0dXJlIHJlbGVhc2UsIHdlIHdpbGwKK2NoYW5nZSB0aGUgZGVmYXVsdCBzbyB0aGF0IEMrKyBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHdoZW5ldmVyIGl0IGlzIGF2YWlsYWJsZS4KK0l0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHJ1biBgcHl0aG9uIHNldHVwLnB5IHRlc3RgIGFmdGVyIHNldHRpbmcgdGhlCit2YXJpYWJsZSB0byAiY3BwIiwgc28gdGhlIHRlc3RzIHdpbGwgYmUgYWdhaW5zdCBDKysgaW1wbGVtZW50ZWQgUHl0aG9uCittZXNzYWdlcy4KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9lel9zZXR1cC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZXpfc2V0dXAucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTJjZjc3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZXpfc2V0dXAucHkKQEAgLTAsMCArMSwyODMgQEAKKyMhcHl0aG9uCisKKyMgVGhpcyBmaWxlIHdhcyBvYnRhaW5lZCBmcm9tOgorIyAgIGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL2Rpc3QvZXpfc2V0dXAucHkKKyMgb24gMjAxMS8xLzIxLgorCisiIiJCb290c3RyYXAgc2V0dXB0b29scyBpbnN0YWxsYXRpb24KKworSWYgeW91IHdhbnQgdG8gdXNlIHNldHVwdG9vbHMgaW4geW91ciBwYWNrYWdlJ3Mgc2V0dXAucHksIGp1c3QgaW5jbHVkZSB0aGlzCitmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3aXRoIGl0LCBhbmQgYWRkIHRoaXMgdG8gdGhlIHRvcCBvZiB5b3VyIHNldHVwLnB5OjoKKworICAgIGZyb20gZXpfc2V0dXAgaW1wb3J0IHVzZV9zZXR1cHRvb2xzCisgICAgdXNlX3NldHVwdG9vbHMoKQorCitJZiB5b3Ugd2FudCB0byByZXF1aXJlIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBzZXR1cHRvb2xzLCBzZXQgYSBkb3dubG9hZAorbWlycm9yLCBvciB1c2UgYW4gYWx0ZXJuYXRlIGRvd25sb2FkIGRpcmVjdG9yeSwgeW91IGNhbiBkbyBzbyBieSBzdXBwbHlpbmcKK3RoZSBhcHByb3ByaWF0ZSBvcHRpb25zIHRvIGBgdXNlX3NldHVwdG9vbHMoKWBgLgorCitUaGlzIGZpbGUgY2FuIGFsc28gYmUgcnVuIGFzIGEgc2NyaXB0IHRvIGluc3RhbGwgb3IgdXBncmFkZSBzZXR1cHRvb2xzLgorIiIiCitpbXBvcnQgc3lzCitERUZBVUxUX1ZFUlNJT04gPSAiMC42YzExIgorREVGQVVMVF9VUkwgICAgID0gImh0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcGFja2FnZXMvJXMvcy9zZXR1cHRvb2xzLyIgJSBzeXMudmVyc2lvbls6M10KKworbWQ1X2RhdGEgPSB7CisgICAgJ3NldHVwdG9vbHMtMC42YjEtcHkyLjMuZWdnJzogJzg4MjJjYWY5MDEyNTBkODQ4Yjk5NmI3ZjI1YzZlNmNhJywKKyAgICAnc2V0dXB0b29scy0wLjZiMS1weTIuNC5lZ2cnOiAnYjc5YThhNDAzZTQ1MDJmYmI4NWVlM2YxOTQxNzM1Y2InLAorICAgICdzZXR1cHRvb2xzLTAuNmIyLXB5Mi4zLmVnZyc6ICc1NjU3NzU5ZDhhNmQ4ZmM0NDA3MGE5ZDA3MjcyZDk5YicsCisgICAgJ3NldHVwdG9vbHMtMC42YjItcHkyLjQuZWdnJzogJzQ5OTZhOGQxNjlkMmJlNjYxZmEzMmE2ZTUyZTRmODJhJywKKyAgICAnc2V0dXB0b29scy0wLjZiMy1weTIuMy5lZ2cnOiAnYmIzMWMwZmM3Mzk5YTYzNTc5OTc1Y2FkOWY1YTA2MTgnLAorICAgICdzZXR1cHRvb2xzLTAuNmIzLXB5Mi40LmVnZyc6ICczOGE4YzZiM2Q2ZWNkMjIyNDdmMTc5ZjdkYTY2OWZhYycsCisgICAgJ3NldHVwdG9vbHMtMC42YjQtcHkyLjMuZWdnJzogJzYyMDQ1YTI0ZWQ0ZTFlYmM3N2ZlMDM5YWE0ZTZmN2U1JywKKyAgICAnc2V0dXB0b29scy0wLjZiNC1weTIuNC5lZ2cnOiAnNGNiMmExODVkMjI4ZGFjZmZiMmQxN2YxMDNiM2IxYzQnLAorICAgICdzZXR1cHRvb2xzLTAuNmMxLXB5Mi4zLmVnZyc6ICdiM2YyYjU1MzlkNjVjYjdmNzRhZDc5MTI3ZjFhOTA4YycsCisgICAgJ3NldHVwdG9vbHMtMC42YzEtcHkyLjQuZWdnJzogJ2I0NWFkZWRhMDY2N2QyZDJmZmUxNDAwOTM2NGYyYTRiJywKKyAgICAnc2V0dXB0b29scy0wLjZjMTAtcHkyLjMuZWdnJzogJ2NlMWUyYWI1ZDNhMDI1NjQ1NmQ5ZmMxMzgwMGE3MDkwJywKKyAgICAnc2V0dXB0b29scy0wLjZjMTAtcHkyLjQuZWdnJzogJzU3ZDZkOWQ2ZTliODA3NzJjNTlhNTNhODQzM2E1ZGQ0JywKKyAgICAnc2V0dXB0b29scy0wLjZjMTAtcHkyLjUuZWdnJzogJ2RlNDZhYzhiMWM5N2M4OTU1NzJlNWU4NTk2YWViOGM3JywKKyAgICAnc2V0dXB0b29scy0wLjZjMTAtcHkyLjYuZWdnJzogJzU4ZWE0MGFlZjA2ZGEwMmNlNjQxNDk1NTIzYTBiN2Y1JywKKyAgICAnc2V0dXB0b29scy0wLjZjMTEtcHkyLjMuZWdnJzogJzJiYWVhYzZlMTNkNDE0YTlkMjhlN2JhNWI1YTU5NmRlJywKKyAgICAnc2V0dXB0b29scy0wLjZjMTEtcHkyLjQuZWdnJzogJ2JkNjM5ZjliMGVhYzRjNDI0OTcwMzRkZWMyZWMwYzJiJywKKyAgICAnc2V0dXB0b29scy0wLjZjMTEtcHkyLjUuZWdnJzogJzY0Yzk0ZjNiZjdhNzJhMTNlYzgzZTBiMjRmMjc0OWIyJywKKyAgICAnc2V0dXB0b29scy0wLjZjMTEtcHkyLjYuZWdnJzogJ2JmYTkyMTAwYmQ3NzJkNWEyMTNlZWRkMzU2ZDY0MDg2JywKKyAgICAnc2V0dXB0b29scy0wLjZjMi1weTIuMy5lZ2cnOiAnZjAwNjRiZjZhYTJiN2QwZjNiYTBiNDNmMjA4MTdjMjcnLAorICAgICdzZXR1cHRvb2xzLTAuNmMyLXB5Mi40LmVnZyc6ICc2MTYxOTJlZWMzNWY0N2U4ZWExNmNkNmExMjJiNzI3NycsCisgICAgJ3NldHVwdG9vbHMtMC42YzMtcHkyLjMuZWdnJzogJ2YxODFmYTEyNWRmZTg1YTI1OWM5Y2Q2ZjFkN2I3OGZhJywKKyAgICAnc2V0dXB0b29scy0wLjZjMy1weTIuNC5lZ2cnOiAnZTBlZDc0NjgyYzk5OGJmYjczYmY4MDNhNTBlN2I3MWUnLAorICAgICdzZXR1cHRvb2xzLTAuNmMzLXB5Mi41LmVnZyc6ICdhYmVmMTZmZGQ2MTk1NTUxNDg0MWM3YzZiZDk4OTY1ZScsCisgICAgJ3NldHVwdG9vbHMtMC42YzQtcHkyLjMuZWdnJzogJ2IwYjkxMzFhY2FiMzIwMjJiZmFjN2Y0NGM1ZDc5NzFmJywKKyAgICAnc2V0dXB0b29scy0wLjZjNC1weTIuNC5lZ2cnOiAnMmExZjk2NTZkNGZiZjNjOTdiZjk0NmMwYTEyNGU2ZTInLAorICAgICdzZXR1cHRvb2xzLTAuNmM0LXB5Mi41LmVnZyc6ICc4ZjVhMDUyZTMyY2RiOWM3MmJjZjRiNTUyNmYyOGFmYycsCisgICAgJ3NldHVwdG9vbHMtMC42YzUtcHkyLjMuZWdnJzogJ2VlOWZkODA5NjVkYTA0ZjJmM2U2YjM1NzZlOWQ4MTY3JywKKyAgICAnc2V0dXB0b29scy0wLjZjNS1weTIuNC5lZ2cnOiAnYWZlMmFkZjFjMDE3MDFlZTg0MTc2MWY1YmNkOGFhNjQnLAorICAgICdzZXR1cHRvb2xzLTAuNmM1LXB5Mi41LmVnZyc6ICdhOGQzZjYxNDk0Y2NhYTg3MTRkZmVkMzdiY2NkM2Q1ZCcsCisgICAgJ3NldHVwdG9vbHMtMC42YzYtcHkyLjMuZWdnJzogJzM1Njg2Yjc4MTE2YTY2ODg0NzIzN2I2OWQ1NDllYzIwJywKKyAgICAnc2V0dXB0b29scy0wLjZjNi1weTIuNC5lZ2cnOiAnM2M1NmFmNTdiZTMyMjUwMTkyNjBhNjQ0NDMwMDY1YWInLAorICAgICdzZXR1cHRvb2xzLTAuNmM2LXB5Mi41LmVnZyc6ICdiMmY4YTc1MjA3MDlhNWIzNGY4MDk0NmRlNWYwMmY1MycsCisgICAgJ3NldHVwdG9vbHMtMC42YzctcHkyLjMuZWdnJzogJzIwOWZkZjlhZGMzYTYxNWU1MTE1YjcyNTY1OGUxM2UyJywKKyAgICAnc2V0dXB0b29scy0wLjZjNy1weTIuNC5lZ2cnOiAnNWE4Zjk1NDgwN2Q0NmEwZmI2N2NmMWYyNmM1NWE4MmUnLAorICAgICdzZXR1cHRvb2xzLTAuNmM3LXB5Mi41LmVnZyc6ICc0NWQyYWQyOGY5NzUwZTc0MzQxMTFmZGU4MzFlODM3MicsCisgICAgJ3NldHVwdG9vbHMtMC42YzgtcHkyLjMuZWdnJzogJzUwNzU5ZDI5YjM0OWRiOGNmZDgwN2JhODMwM2YxOTAyJywKKyAgICAnc2V0dXB0b29scy0wLjZjOC1weTIuNC5lZ2cnOiAnY2JhMzhkNzRmN2Q0ODNjMDZlOWRhYTYwNzBjY2U2ZGUnLAorICAgICdzZXR1cHRvb2xzLTAuNmM4LXB5Mi41LmVnZyc6ICcxNzIxNzQ3ZWUzMjlkYzE1MDU5MGE1OGIzZTFhYzk1YicsCisgICAgJ3NldHVwdG9vbHMtMC42YzktcHkyLjMuZWdnJzogJ2E4M2M0MDIwNDE0ODA3YjQ5NmU0Y2ZiZTA4NTA3YzAzJywKKyAgICAnc2V0dXB0b29scy0wLjZjOS1weTIuNC5lZ2cnOiAnMjYwYTJiZTJlNTM4OGQ2NmJkYWVlMDZhYmVjNjM0MmEnLAorICAgICdzZXR1cHRvb2xzLTAuNmM5LXB5Mi41LmVnZyc6ICdmZTY3YzNlNWExN2IxMmMwZTdjNTQxYjdlYTQzYThlNicsCisgICAgJ3NldHVwdG9vbHMtMC42YzktcHkyLjYuZWdnJzogJ2NhMzdiMWZmMTZmYTJlZGU2ZTE5MzgzZTdiNTkyNDVhJywKK30KKworaW1wb3J0IHN5cywgb3MKK3RyeTogZnJvbSBoYXNobGliIGltcG9ydCBtZDUKK2V4Y2VwdCBJbXBvcnRFcnJvcjogZnJvbSBtZDUgaW1wb3J0IG1kNQorCitkZWYgX3ZhbGlkYXRlX21kNShlZ2dfbmFtZSwgZGF0YSk6CisgICAgaWYgZWdnX25hbWUgaW4gbWQ1X2RhdGE6CisgICAgICAgIGRpZ2VzdCA9IG1kNShkYXRhKS5oZXhkaWdlc3QoKQorICAgICAgICBpZiBkaWdlc3QgIT0gbWQ1X2RhdGFbZWdnX25hbWVdOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoCisgICAgICAgICAgICAgICAgIm1kNSB2YWxpZGF0aW9uIG9mICVzIGZhaWxlZCEgIChQb3NzaWJsZSBkb3dubG9hZCBwcm9ibGVtPykiCisgICAgICAgICAgICAgICAgJSBlZ2dfbmFtZQorICAgICAgICAgICAgKQorICAgICAgICAgICAgc3lzLmV4aXQoMikKKyAgICByZXR1cm4gZGF0YQorCitkZWYgdXNlX3NldHVwdG9vbHMoCisgICAgdmVyc2lvbj1ERUZBVUxUX1ZFUlNJT04sIGRvd25sb2FkX2Jhc2U9REVGQVVMVF9VUkwsIHRvX2Rpcj1vcy5jdXJkaXIsCisgICAgZG93bmxvYWRfZGVsYXk9MTUKKyk6CisgICAgIiIiQXV0b21hdGljYWxseSBmaW5kL2Rvd25sb2FkIHNldHVwdG9vbHMgYW5kIG1ha2UgaXQgYXZhaWxhYmxlIG9uIHN5cy5wYXRoCisKKyAgICBgdmVyc2lvbmAgc2hvdWxkIGJlIGEgdmFsaWQgc2V0dXB0b29scyB2ZXJzaW9uIG51bWJlciB0aGF0IGlzIGF2YWlsYWJsZQorICAgIGFzIGFuIGVnZyBmb3IgZG93bmxvYWQgdW5kZXIgdGhlIGBkb3dubG9hZF9iYXNlYCBVUkwgKHdoaWNoIHNob3VsZCBlbmQgd2l0aAorICAgIGEgJy8nKS4gIGB0b19kaXJgIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgc2V0dXB0b29scyB3aWxsIGJlIGRvd25sb2FkZWQsIGlmCisgICAgaXQgaXMgbm90IGFscmVhZHkgYXZhaWxhYmxlLiAgSWYgYGRvd25sb2FkX2RlbGF5YCBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZAorICAgIGJlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IHdpbGwgYmUgcGF1c2VkIGJlZm9yZSBpbml0aWF0aW5nIGEgZG93bmxvYWQsCisgICAgc2hvdWxkIG9uZSBiZSByZXF1aXJlZC4gIElmIGFuIG9sZGVyIHZlcnNpb24gb2Ygc2V0dXB0b29scyBpcyBpbnN0YWxsZWQsCisgICAgdGhpcyByb3V0aW5lIHdpbGwgcHJpbnQgYSBtZXNzYWdlIHRvIGBgc3lzLnN0ZGVycmBgIGFuZCByYWlzZSBTeXN0ZW1FeGl0IGluCisgICAgYW4gYXR0ZW1wdCB0byBhYm9ydCB0aGUgY2FsbGluZyBzY3JpcHQuCisgICAgIiIiCisgICAgd2FzX2ltcG9ydGVkID0gJ3BrZ19yZXNvdXJjZXMnIGluIHN5cy5tb2R1bGVzIG9yICdzZXR1cHRvb2xzJyBpbiBzeXMubW9kdWxlcworICAgIGRlZiBkb19kb3dubG9hZCgpOgorICAgICAgICBlZ2cgPSBkb3dubG9hZF9zZXR1cHRvb2xzKHZlcnNpb24sIGRvd25sb2FkX2Jhc2UsIHRvX2RpciwgZG93bmxvYWRfZGVsYXkpCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBlZ2cpCisgICAgICAgIGltcG9ydCBzZXR1cHRvb2xzOyBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20gPSBlZ2cKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBwa2dfcmVzb3VyY2VzCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICByZXR1cm4gZG9fZG93bmxvYWQoKSAgICAgICAKKyAgICB0cnk6CisgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgic2V0dXB0b29scz49Iit2ZXJzaW9uKTsgcmV0dXJuCisgICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuVmVyc2lvbkNvbmZsaWN0LCBlOgorICAgICAgICBpZiB3YXNfaW1wb3J0ZWQ6CisgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICgKKyAgICAgICAgICAgICJUaGUgcmVxdWlyZWQgdmVyc2lvbiBvZiBzZXR1cHRvb2xzICg+PSVzKSBpcyBub3QgYXZhaWxhYmxlLCBhbmRcbiIKKyAgICAgICAgICAgICJjYW4ndCBiZSBpbnN0YWxsZWQgd2hpbGUgdGhpcyBzY3JpcHQgaXMgcnVubmluZy4gUGxlYXNlIGluc3RhbGxcbiIKKyAgICAgICAgICAgICIgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIGZpcnN0LCB1c2luZyAnZWFzeV9pbnN0YWxsIC1VIHNldHVwdG9vbHMnLiIKKyAgICAgICAgICAgICJcblxuKEN1cnJlbnRseSB1c2luZyAlcikiCisgICAgICAgICAgICApICUgKHZlcnNpb24sIGUuYXJnc1swXSkKKyAgICAgICAgICAgIHN5cy5leGl0KDIpCisgICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uTm90Rm91bmQ6CisgICAgICAgIHBhc3MKKworICAgIGRlbCBwa2dfcmVzb3VyY2VzLCBzeXMubW9kdWxlc1sncGtnX3Jlc291cmNlcyddICAgICMgcmVsb2FkIG9rCisgICAgcmV0dXJuIGRvX2Rvd25sb2FkKCkKKworZGVmIGRvd25sb2FkX3NldHVwdG9vbHMoCisgICAgdmVyc2lvbj1ERUZBVUxUX1ZFUlNJT04sIGRvd25sb2FkX2Jhc2U9REVGQVVMVF9VUkwsIHRvX2Rpcj1vcy5jdXJkaXIsCisgICAgZGVsYXkgPSAxNQorKToKKyAgICAiIiJEb3dubG9hZCBzZXR1cHRvb2xzIGZyb20gYSBzcGVjaWZpZWQgbG9jYXRpb24gYW5kIHJldHVybiBpdHMgZmlsZW5hbWUKKworICAgIGB2ZXJzaW9uYCBzaG91bGQgYmUgYSB2YWxpZCBzZXR1cHRvb2xzIHZlcnNpb24gbnVtYmVyIHRoYXQgaXMgYXZhaWxhYmxlCisgICAgYXMgYW4gZWdnIGZvciBkb3dubG9hZCB1bmRlciB0aGUgYGRvd25sb2FkX2Jhc2VgIFVSTCAod2hpY2ggc2hvdWxkIGVuZAorICAgIHdpdGggYSAnLycpLiBgdG9fZGlyYCBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBlZ2cgd2lsbCBiZSBkb3dubG9hZGVkLgorICAgIGBkZWxheWAgaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHBhdXNlIGJlZm9yZSBhbiBhY3R1YWwgZG93bmxvYWQgYXR0ZW1wdC4KKyAgICAiIiIKKyAgICBpbXBvcnQgdXJsbGliMiwgc2h1dGlsCisgICAgZWdnX25hbWUgPSAic2V0dXB0b29scy0lcy1weSVzLmVnZyIgJSAodmVyc2lvbixzeXMudmVyc2lvbls6M10pCisgICAgdXJsID0gZG93bmxvYWRfYmFzZSArIGVnZ19uYW1lCisgICAgc2F2ZXRvID0gb3MucGF0aC5qb2luKHRvX2RpciwgZWdnX25hbWUpCisgICAgc3JjID0gZHN0ID0gTm9uZQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzYXZldG8pOiAgIyBBdm9pZCByZXBlYXRlZCBkb3dubG9hZHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworICAgICAgICAgICAgaWYgZGVsYXk6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIiIiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgc2NyaXB0IHJlcXVpcmVzIHNldHVwdG9vbHMgdmVyc2lvbiAlcyB0byBydW4gKGV2ZW4gdG8gZGlzcGxheQoraGVscCkuICBJIHdpbGwgYXR0ZW1wdCB0byBkb3dubG9hZCBpdCBmb3IgeW91IChmcm9tCislcyksIGJ1dAoreW91IG1heSBuZWVkIHRvIGVuYWJsZSBmaXJld2FsbCBhY2Nlc3MgZm9yIHRoaXMgc2NyaXB0IGZpcnN0LgorSSB3aWxsIHN0YXJ0IHRoZSBkb3dubG9hZCBpbiAlZCBzZWNvbmRzLgorCisoTm90ZTogaWYgdGhpcyBtYWNoaW5lIGRvZXMgbm90IGhhdmUgbmV0d29yayBhY2Nlc3MsIHBsZWFzZSBvYnRhaW4gdGhlIGZpbGUKKworICAgJXMKKworYW5kIHBsYWNlIGl0IGluIHRoaXMgZGlyZWN0b3J5IGJlZm9yZSByZXJ1bm5pbmcgdGhpcyBzY3JpcHQuKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiIiLAorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLCBkb3dubG9hZF9iYXNlLCBkZWxheSwgdXJsCisgICAgICAgICAgICAgICAgKTsgZnJvbSB0aW1lIGltcG9ydCBzbGVlcDsgc2xlZXAoZGVsYXkpCisgICAgICAgICAgICBsb2cud2FybigiRG93bmxvYWRpbmcgJXMiLCB1cmwpCisgICAgICAgICAgICBzcmMgPSB1cmxsaWIyLnVybG9wZW4odXJsKQorICAgICAgICAgICAgIyBSZWFkL3dyaXRlIGFsbCBpbiBvbmUgYmxvY2ssIHNvIHdlIGRvbid0IGNyZWF0ZSBhIGNvcnJ1cHQgZmlsZQorICAgICAgICAgICAgIyBpZiB0aGUgZG93bmxvYWQgaXMgaW50ZXJydXB0ZWQuCisgICAgICAgICAgICBkYXRhID0gX3ZhbGlkYXRlX21kNShlZ2dfbmFtZSwgc3JjLnJlYWQoKSkKKyAgICAgICAgICAgIGRzdCA9IG9wZW4oc2F2ZXRvLCJ3YiIpOyBkc3Qud3JpdGUoZGF0YSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHNyYzogc3JjLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIGRzdDogZHN0LmNsb3NlKCkKKyAgICByZXR1cm4gb3MucGF0aC5yZWFscGF0aChzYXZldG8pCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitkZWYgbWFpbihhcmd2LCB2ZXJzaW9uPURFRkFVTFRfVkVSU0lPTik6CisgICAgIiIiSW5zdGFsbCBvciB1cGdyYWRlIHNldHVwdG9vbHMgYW5kIEVhc3lJbnN0YWxsIiIiCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgc2V0dXB0b29scworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgZWdnID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlZ2cgPSBkb3dubG9hZF9zZXR1cHRvb2xzKHZlcnNpb24sIGRlbGF5PTApCisgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCxlZ2cpCisgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICAgICAgICAgIHJldHVybiBtYWluKGxpc3QoYXJndikrW2VnZ10pICAgIyB3ZSdyZSBkb25lIGhlcmUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGVnZyBhbmQgb3MucGF0aC5leGlzdHMoZWdnKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZWdnKQorICAgIGVsc2U6CisgICAgICAgIGlmIHNldHVwdG9vbHMuX192ZXJzaW9uX18gPT0gJzAuMC4xJzoKKyAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgKAorICAgICAgICAgICAgIllvdSBoYXZlIGFuIG9ic29sZXRlIHZlcnNpb24gb2Ygc2V0dXB0b29scyBpbnN0YWxsZWQuICBQbGVhc2VcbiIKKyAgICAgICAgICAgICJyZW1vdmUgaXQgZnJvbSB5b3VyIHN5c3RlbSBlbnRpcmVseSBiZWZvcmUgcmVydW5uaW5nIHRoaXMgc2NyaXB0LiIKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICByZXEgPSAic2V0dXB0b29scz49Iit2ZXJzaW9uCisgICAgaW1wb3J0IHBrZ19yZXNvdXJjZXMKKyAgICB0cnk6CisgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZShyZXEpCisgICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuVmVyc2lvbkNvbmZsaWN0OgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZnJvbSBlYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICAgICAgbWFpbihsaXN0KGFyZ3YpK1tkb3dubG9hZF9zZXR1cHRvb2xzKGRlbGF5PTApXSkKKyAgICAgICAgc3lzLmV4aXQoMCkgIyB0cnkgdG8gZm9yY2UgYW4gZXhpdAorICAgIGVsc2U6CisgICAgICAgIGlmIGFyZ3Y6CisgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICAgICAgICAgIG1haW4oYXJndikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJTZXR1cHRvb2xzIHZlcnNpb24iLHZlcnNpb24sIm9yIGdyZWF0ZXIgaGFzIGJlZW4gaW5zdGFsbGVkLiIKKyAgICAgICAgICAgIHByaW50ICcoUnVuICJlel9zZXR1cC5weSAtVSBzZXR1cHRvb2xzIiB0byByZWluc3RhbGwgb3IgdXBncmFkZS4pJworCitkZWYgdXBkYXRlX21kNShmaWxlbmFtZXMpOgorICAgICIiIlVwZGF0ZSBvdXIgYnVpbHQtaW4gbWQ1IHJlZ2lzdHJ5IiIiCisKKyAgICBpbXBvcnQgcmUKKworICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUobmFtZSkKKyAgICAgICAgZiA9IG9wZW4obmFtZSwncmInKQorICAgICAgICBtZDVfZGF0YVtiYXNlXSA9IG1kNShmLnJlYWQoKSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkYXRhID0gWyIgICAgJXI6ICVyLFxuIiAlIGl0IGZvciBpdCBpbiBtZDVfZGF0YS5pdGVtcygpXQorICAgIGRhdGEuc29ydCgpCisgICAgcmVwbCA9ICIiLmpvaW4oZGF0YSkKKworICAgIGltcG9ydCBpbnNwZWN0CisgICAgc3JjZmlsZSA9IGluc3BlY3QuZ2V0c291cmNlZmlsZShzeXMubW9kdWxlc1tfX25hbWVfX10pCisgICAgZiA9IG9wZW4oc3JjZmlsZSwgJ3JiJyk7IHNyYyA9IGYucmVhZCgpOyBmLmNsb3NlKCkKKworICAgIG1hdGNoID0gcmUuc2VhcmNoKCJcbm1kNV9kYXRhID0ge1xuKFtefV0rKX0iLCBzcmMpCisgICAgaWYgbm90IG1hdGNoOgorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJJbnRlcm5hbCBlcnJvciEiCisgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICBzcmMgPSBzcmNbOm1hdGNoLnN0YXJ0KDEpXSArIHJlcGwgKyBzcmNbbWF0Y2guZW5kKDEpOl0KKyAgICBmID0gb3BlbihzcmNmaWxlLCd3JykKKyAgICBmLndyaXRlKHNyYykKKyAgICBmLmNsb3NlKCkKKworCitpZiBfX25hbWVfXz09J19fbWFpbl9fJzoKKyAgICBpZiBsZW4oc3lzLmFyZ3YpPjIgYW5kIHN5cy5hcmd2WzFdPT0nLS1tZDV1cGRhdGUnOgorICAgICAgICB1cGRhdGVfbWQ1KHN5cy5hcmd2WzI6XSkKKyAgICBlbHNlOgorICAgICAgICBtYWluKHN5cy5hcmd2WzE6XSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL19faW5pdF9fLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGU0MGVhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKK19faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMnKS5kZWNsYXJlX25hbWVzcGFjZShfX25hbWVfXykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL19faW5pdF9fLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGQxYzhiNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKKyAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmNjA5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnB5CkBAIC0wLDAgKzEsNTk4IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiRGVzY3JpcHRvcnMgZXNzZW50aWFsbHkgY29udGFpbiBleGFjdGx5IHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiBhIC5wcm90bworZmlsZSwgaW4gdHlwZXMgdGhhdCBtYWtlIHRoaXMgaW5mb3JtYXRpb24gYWNjZXNzaWJsZSBpbiBQeXRob24uCisiIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgYXBpX2ltcGxlbWVudGF0aW9uCisKKworaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAnY3BwJzoKKyAgZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGNwcF9tZXNzYWdlCisKKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgIiIiQmFzZSBlcnJvciBmb3IgdGhpcyBtb2R1bGUuIiIiCisKKworY2xhc3MgRGVzY3JpcHRvckJhc2Uob2JqZWN0KToKKworICAiIiJEZXNjcmlwdG9ycyBiYXNlIGNsYXNzLgorCisgIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2Ugb2YgYWxsIGRlc2NyaXB0b3IgY2xhc3Nlcy4gSXQgcHJvdmlkZXMgY29tbW9uIG9wdGlvbnMKKyAgcmVsYXRlZCBmdW5jdGlvbmFpbGl0eS4KKworICBBdHRyaWJ1dGVzOgorICAgIGhhc19vcHRpb25zOiAgVHJ1ZSBpZiB0aGUgZGVzY3JpcHRvciBoYXMgbm9uLWRlZmF1bHQgb3B0aW9ucy4gIFVzdWFsbHkgaXQKKyAgICAgICAgaXMgbm90IG5lY2Vzc2FyeSB0byByZWFkIHRoaXMgLS0ganVzdCBjYWxsIEdldE9wdGlvbnMoKSB3aGljaCB3aWxsCisgICAgICAgIGhhcHBpbHkgcmV0dXJuIHRoZSBkZWZhdWx0IGluc3RhbmNlLiAgSG93ZXZlciwgaXQncyBzb21ldGltZXMgdXNlZnVsCisgICAgICAgIGZvciBlZmZpY2llbmN5LCBhbmQgYWxzbyB1c2VmdWwgaW5zaWRlIHRoZSBwcm90b2J1ZiBpbXBsZW1lbnRhdGlvbiB0bworICAgICAgICBhdm9pZCBzb21lIGJvb3RzdHJhcHBpbmcgaXNzdWVzLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucywgb3B0aW9uc19jbGFzc19uYW1lKToKKyAgICAiIiJJbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIGdpdmVuIGl0cyBvcHRpb25zIG1lc3NhZ2UgYW5kIHRoZSBuYW1lIG9mIHRoZQorICAgIGNsYXNzIG9mIHRoZSBvcHRpb25zIG1lc3NhZ2UuIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyByZXF1aXJlZCBpbiBjYXNlCisgICAgdGhlIG9wdGlvbnMgbWVzc2FnZSBpcyBOb25lIGFuZCBoYXMgdG8gYmUgY3JlYXRlZC4KKyAgICAiIiIKKyAgICBzZWxmLl9vcHRpb25zID0gb3B0aW9ucworICAgIHNlbGYuX29wdGlvbnNfY2xhc3NfbmFtZSA9IG9wdGlvbnNfY2xhc3NfbmFtZQorCisgICAgIyBEb2VzIHRoaXMgZGVzY3JpcHRvciBoYXZlIG5vbi1kZWZhdWx0IG9wdGlvbnM/CisgICAgc2VsZi5oYXNfb3B0aW9ucyA9IG9wdGlvbnMgaXMgbm90IE5vbmUKKworICBkZWYgR2V0T3B0aW9ucyhzZWxmKToKKyAgICAiIiJSZXRyaWV2ZXMgZGVzY3JpcHRvciBvcHRpb25zLgorCisgICAgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgb3B0aW9ucyBzZXQgb3IgY3JlYXRlcyB0aGUgZGVmYXVsdCBvcHRpb25zIGZvciB0aGUKKyAgICBkZXNjcmlwdG9yLgorICAgICIiIgorICAgIGlmIHNlbGYuX29wdGlvbnM6CisgICAgICByZXR1cm4gc2VsZi5fb3B0aW9ucworICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgorICAgIHRyeToKKyAgICAgIG9wdGlvbnNfY2xhc3MgPSBnZXRhdHRyKGRlc2NyaXB0b3JfcGIyLCBzZWxmLl9vcHRpb25zX2NsYXNzX25hbWUpCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdVbmtub3duIG9wdGlvbnMgY2xhc3MgbmFtZSAlcyEnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fb3B0aW9uc19jbGFzc19uYW1lKSkKKyAgICBzZWxmLl9vcHRpb25zID0gb3B0aW9uc19jbGFzcygpCisgICAgcmV0dXJuIHNlbGYuX29wdGlvbnMKKworCitjbGFzcyBfTmVzdGVkRGVzY3JpcHRvckJhc2UoRGVzY3JpcHRvckJhc2UpOgorICAiIiJDb21tb24gY2xhc3MgZm9yIGRlc2NyaXB0b3JzIHRoYXQgY2FuIGJlIG5lc3RlZC4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucywgb3B0aW9uc19jbGFzc19uYW1lLCBuYW1lLCBmdWxsX25hbWUsCisgICAgICAgICAgICAgICBmaWxlLCBjb250YWluaW5nX3R5cGUsIHNlcmlhbGl6ZWRfc3RhcnQ9Tm9uZSwKKyAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfZW5kPU5vbmUpOgorICAgICIiIkNvbnN0cnVjdG9yLgorCisgICAgQXJnczoKKyAgICAgIG9wdGlvbnM6IFByb3RvY29sIG1lc3NhZ2Ugb3B0aW9ucyBvciBOb25lCisgICAgICAgIHRvIHVzZSBkZWZhdWx0IG1lc3NhZ2Ugb3B0aW9ucy4KKyAgICAgIG9wdGlvbnNfY2xhc3NfbmFtZTogKHN0cikgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIGFib3ZlIG9wdGlvbnMuCisKKyAgICAgIG5hbWU6IChzdHIpIE5hbWUgb2YgdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUuCisgICAgICBmdWxsX25hbWU6IChzdHIpIEZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLAorICAgICAgICB3aGljaCB3aWxsIGluY2x1ZGUgcHJvdG9jb2wgInBhY2thZ2UiIG5hbWUgYW5kIHRoZSBuYW1lIG9mIGFueQorICAgICAgICBlbmNsb3NpbmcgdHlwZXMuCisgICAgICBmaWxlOiAoRmlsZURlc2NyaXB0b3IpIFJlZmVyZW5jZSB0byBmaWxlIGluZm8uCisgICAgICBjb250YWluaW5nX3R5cGU6IGlmIHByb3ZpZGVkLCB0aGlzIGlzIGEgbmVzdGVkIGRlc2NyaXB0b3IsIHdpdGggdGhpcworICAgICAgICBkZXNjcmlwdG9yIGFzIHBhcmVudCwgb3RoZXJ3aXNlIE5vbmUuCisgICAgICBzZXJpYWxpemVkX3N0YXJ0OiBUaGUgc3RhcnQgaW5kZXggKGluY2x1c2l2ZSkgaW4gYmxvY2sgaW4gdGhlCisgICAgICAgIGZpbGUuc2VyaWFsaXplZF9wYiB0aGF0IGRlc2NyaWJlcyB0aGlzIGRlc2NyaXB0b3IuCisgICAgICBzZXJpYWxpemVkX2VuZDogVGhlIGVuZCBpbmRleCAoZXhjbHVzaXZlKSBpbiBibG9jayBpbiB0aGUKKyAgICAgICAgZmlsZS5zZXJpYWxpemVkX3BiIHRoYXQgZGVzY3JpYmVzIHRoaXMgZGVzY3JpcHRvci4KKyAgICAiIiIKKyAgICBzdXBlcihfTmVzdGVkRGVzY3JpcHRvckJhc2UsIHNlbGYpLl9faW5pdF9fKAorICAgICAgICBvcHRpb25zLCBvcHRpb25zX2NsYXNzX25hbWUpCisKKyAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgIyBUT0RPKGZhbGspOiBBZGQgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGZ1bGxfbmFtZSBpbnN0ZWFkIG9mIGhhdmluZyBpdCBpbgorICAgICMgICAgICAgICAgICAgbWVtb3J5PworICAgIHNlbGYuZnVsbF9uYW1lID0gZnVsbF9uYW1lCisgICAgc2VsZi5maWxlID0gZmlsZQorICAgIHNlbGYuY29udGFpbmluZ190eXBlID0gY29udGFpbmluZ190eXBlCisKKyAgICBzZWxmLl9zZXJpYWxpemVkX3N0YXJ0ID0gc2VyaWFsaXplZF9zdGFydAorICAgIHNlbGYuX3NlcmlhbGl6ZWRfZW5kID0gc2VyaWFsaXplZF9lbmQKKworICBkZWYgR2V0VG9wTGV2ZWxDb250YWluaW5nVHlwZShzZWxmKToKKyAgICAiIiJSZXR1cm5zIHRoZSByb290IGlmIHRoaXMgaXMgYSBuZXN0ZWQgdHlwZSwgb3IgaXRzZWxmIGlmIGl0cyB0aGUgcm9vdC4iIiIKKyAgICBkZXNjID0gc2VsZgorICAgIHdoaWxlIGRlc2MuY29udGFpbmluZ190eXBlIGlzIG5vdCBOb25lOgorICAgICAgZGVzYyA9IGRlc2MuY29udGFpbmluZ190eXBlCisgICAgcmV0dXJuIGRlc2MKKworICBkZWYgQ29weVRvUHJvdG8oc2VsZiwgcHJvdG8pOgorICAgICIiIkNvcGllcyB0aGlzIHRvIHRoZSBtYXRjaGluZyBwcm90byBpbiBkZXNjcmlwdG9yX3BiMi4KKworICAgIEFyZ3M6CisgICAgICBwcm90bzogQW4gZW1wdHkgcHJvdG8gaW5zdGFuY2UgZnJvbSBkZXNjcmlwdG9yX3BiMi4KKworICAgIFJhaXNlczoKKyAgICAgIEVycm9yOiBJZiBzZWxmIGNvdWxkbnQgYmUgc2VyaWFsaXplZCwgZHVlIHRvIHRvIGZldyBjb25zdHJ1Y3RvciBhcmd1bWVudHMuCisgICAgIiIiCisgICAgaWYgKHNlbGYuZmlsZSBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgc2VsZi5fc2VyaWFsaXplZF9zdGFydCBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgc2VsZi5fc2VyaWFsaXplZF9lbmQgaXMgbm90IE5vbmUpOgorICAgICAgcHJvdG8uUGFyc2VGcm9tU3RyaW5nKHNlbGYuZmlsZS5zZXJpYWxpemVkX3BiWworICAgICAgICAgIHNlbGYuX3NlcmlhbGl6ZWRfc3RhcnQ6c2VsZi5fc2VyaWFsaXplZF9lbmRdKQorICAgIGVsc2U6CisgICAgICByYWlzZSBFcnJvcignRGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIHNlcmlhbGl6YXRpb24uJykKKworCitjbGFzcyBEZXNjcmlwdG9yKF9OZXN0ZWREZXNjcmlwdG9yQmFzZSk6CisKKyAgIiIiRGVzY3JpcHRvciBmb3IgYSBwcm90b2NvbCBtZXNzYWdlIHR5cGUuCisKKyAgQSBEZXNjcmlwdG9yIGluc3RhbmNlIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisKKyAgICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLgorICAgIGZ1bGxfbmFtZTogKHN0cikgRnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUsCisgICAgICB3aGljaCB3aWxsIGluY2x1ZGUgcHJvdG9jb2wgInBhY2thZ2UiIG5hbWUgYW5kIHRoZSBuYW1lIG9mIGFueQorICAgICAgZW5jbG9zaW5nIHR5cGVzLgorCisgICAgY29udGFpbmluZ190eXBlOiAoRGVzY3JpcHRvcikgUmVmZXJlbmNlIHRvIHRoZSBkZXNjcmlwdG9yIG9mIHRoZQorICAgICAgdHlwZSBjb250YWluaW5nIHVzLCBvciBOb25lIGlmIHRoaXMgaXMgdG9wLWxldmVsLgorCisgICAgZmllbGRzOiAobGlzdCBvZiBGaWVsZERlc2NyaXB0b3JzKSBGaWVsZCBkZXNjcmlwdG9ycyBmb3IgYWxsCisgICAgICBmaWVsZHMgaW4gdGhpcyB0eXBlLgorICAgIGZpZWxkc19ieV9udW1iZXI6IChkaWN0IGludCAtPiBGaWVsZERlc2NyaXB0b3IpIFNhbWUgRmllbGREZXNjcmlwdG9yCisgICAgICBvYmplY3RzIGFzIGluIHxmaWVsZHN8LCBidXQgaW5kZXhlZCBieSAibnVtYmVyIiBhdHRyaWJ1dGUgaW4gZWFjaAorICAgICAgRmllbGREZXNjcmlwdG9yLgorICAgIGZpZWxkc19ieV9uYW1lOiAoZGljdCBzdHIgLT4gRmllbGREZXNjcmlwdG9yKSBTYW1lIEZpZWxkRGVzY3JpcHRvcgorICAgICAgb2JqZWN0cyBhcyBpbiB8ZmllbGRzfCwgYnV0IGluZGV4ZWQgYnkgIm5hbWUiIGF0dHJpYnV0ZSBpbiBlYWNoCisgICAgICBGaWVsZERlc2NyaXB0b3IuCisKKyAgICBuZXN0ZWRfdHlwZXM6IChsaXN0IG9mIERlc2NyaXB0b3JzKSBEZXNjcmlwdG9yIHJlZmVyZW5jZXMKKyAgICAgIGZvciBhbGwgcHJvdG9jb2wgbWVzc2FnZSB0eXBlcyBuZXN0ZWQgd2l0aGluIHRoaXMgb25lLgorICAgIG5lc3RlZF90eXBlc19ieV9uYW1lOiAoZGljdCBzdHIgLT4gRGVzY3JpcHRvcikgU2FtZSBEZXNjcmlwdG9yCisgICAgICBvYmplY3RzIGFzIGluIHxuZXN0ZWRfdHlwZXN8LCBidXQgaW5kZXhlZCBieSAibmFtZSIgYXR0cmlidXRlCisgICAgICBpbiBlYWNoIERlc2NyaXB0b3IuCisKKyAgICBlbnVtX3R5cGVzOiAobGlzdCBvZiBFbnVtRGVzY3JpcHRvcnMpIEVudW1EZXNjcmlwdG9yIHJlZmVyZW5jZXMKKyAgICAgIGZvciBhbGwgZW51bXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHR5cGUuCisgICAgZW51bV90eXBlc19ieV9uYW1lOiAoZGljdCBzdHIgLT5FbnVtRGVzY3JpcHRvcikgU2FtZSBFbnVtRGVzY3JpcHRvcgorICAgICAgb2JqZWN0cyBhcyBpbiB8ZW51bV90eXBlc3wsIGJ1dCBpbmRleGVkIGJ5ICJuYW1lIiBhdHRyaWJ1dGUKKyAgICAgIGluIGVhY2ggRW51bURlc2NyaXB0b3IuCisgICAgZW51bV92YWx1ZXNfYnlfbmFtZTogKGRpY3Qgc3RyIC0+IEVudW1WYWx1ZURlc2NyaXB0b3IpIERpY3QgbWFwcGluZworICAgICAgZnJvbSBlbnVtIHZhbHVlIG5hbWUgdG8gRW51bVZhbHVlRGVzY3JpcHRvciBmb3IgdGhhdCB2YWx1ZS4KKworICAgIGV4dGVuc2lvbnM6IChsaXN0IG9mIEZpZWxkRGVzY3JpcHRvcikgQWxsIGV4dGVuc2lvbnMgZGVmaW5lZCBkaXJlY3RseQorICAgICAgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlIChOT1Qgd2l0aGluIGEgbmVzdGVkIHR5cGUpLgorICAgIGV4dGVuc2lvbnNfYnlfbmFtZTogKGRpY3QsIHN0cmluZyAtPiBGaWVsZERlc2NyaXB0b3IpIFNhbWUgRmllbGREZXNjcmlwdG9yCisgICAgICBvYmplY3RzIGFzIHxleHRlbnNpb25zfCwgYnV0IGluZGV4ZWQgYnkgIm5hbWUiIGF0dHJpYnV0ZSBvZiBlYWNoCisgICAgICBGaWVsZERlc2NyaXB0b3IuCisKKyAgICBpc19leHRlbmRhYmxlOiAgRG9lcyB0aGlzIHR5cGUgZGVmaW5lIGFueSBleHRlbnNpb24gcmFuZ2VzPworCisgICAgb3B0aW9uczogKGRlc2NyaXB0b3JfcGIyLk1lc3NhZ2VPcHRpb25zKSBQcm90b2NvbCBtZXNzYWdlIG9wdGlvbnMgb3IgTm9uZQorICAgICAgdG8gdXNlIGRlZmF1bHQgbWVzc2FnZSBvcHRpb25zLgorCisgICAgZmlsZTogKEZpbGVEZXNjcmlwdG9yKSBSZWZlcmVuY2UgdG8gZmlsZSBkZXNjcmlwdG9yLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBmaWxlbmFtZSwgY29udGFpbmluZ190eXBlLCBmaWVsZHMsCisgICAgICAgICAgICAgICBuZXN0ZWRfdHlwZXMsIGVudW1fdHlwZXMsIGV4dGVuc2lvbnMsIG9wdGlvbnM9Tm9uZSwKKyAgICAgICAgICAgICAgIGlzX2V4dGVuZGFibGU9VHJ1ZSwgZXh0ZW5zaW9uX3Jhbmdlcz1Ob25lLCBmaWxlPU5vbmUsCisgICAgICAgICAgICAgICBzZXJpYWxpemVkX3N0YXJ0PU5vbmUsIHNlcmlhbGl6ZWRfZW5kPU5vbmUpOgorICAgICIiIkFyZ3VtZW50cyB0byBfX2luaXRfXygpIGFyZSBhcyBkZXNjcmliZWQgaW4gdGhlIGRlc2NyaXB0aW9uCisgICAgb2YgRGVzY3JpcHRvciBmaWVsZHMgYWJvdmUuCisKKyAgICBOb3RlIHRoYXQgZmlsZW5hbWUgaXMgYW4gb2Jzb2xldGUgYXJndW1lbnQsIHRoYXQgaXMgbm90IHVzZWQgYW55bW9yZS4KKyAgICBQbGVhc2UgdXNlIGZpbGUubmFtZSB0byBhY2Nlc3MgdGhpcyBhcyBhbiBhdHRyaWJ1dGUuCisgICAgIiIiCisgICAgc3VwZXIoRGVzY3JpcHRvciwgc2VsZikuX19pbml0X18oCisgICAgICAgIG9wdGlvbnMsICdNZXNzYWdlT3B0aW9ucycsIG5hbWUsIGZ1bGxfbmFtZSwgZmlsZSwKKyAgICAgICAgY29udGFpbmluZ190eXBlLCBzZXJpYWxpemVkX3N0YXJ0PXNlcmlhbGl6ZWRfc3RhcnQsCisgICAgICAgIHNlcmlhbGl6ZWRfZW5kPXNlcmlhbGl6ZWRfc3RhcnQpCisKKyAgICAjIFdlIGhhdmUgZmllbGRzIGluIGFkZGl0aW9uIHRvIGZpZWxkc19ieV9uYW1lIGFuZCBmaWVsZHNfYnlfbnVtYmVyLAorICAgICMgc28gdGhhdDoKKyAgICAjICAgMS4gQ2xpZW50cyBjYW4gaW5kZXggZmllbGRzIGJ5ICJvcmRlciBpbiB3aGljaCB0aGV5J3JlIGxpc3RlZC4iCisgICAgIyAgIDIuIENsaWVudHMgY2FuIGVhc2lseSBpdGVyYXRlIG92ZXIgYWxsIGZpZWxkcyB3aXRoIHRoZSB0ZXJzZQorICAgICMgICAgICBzeW50YXg6IGZvciBmIGluIGRlc2NyaXB0b3IuZmllbGRzOiAuLi4KKyAgICBzZWxmLmZpZWxkcyA9IGZpZWxkcworICAgIGZvciBmaWVsZCBpbiBzZWxmLmZpZWxkczoKKyAgICAgIGZpZWxkLmNvbnRhaW5pbmdfdHlwZSA9IHNlbGYKKyAgICBzZWxmLmZpZWxkc19ieV9udW1iZXIgPSBkaWN0KChmLm51bWJlciwgZikgZm9yIGYgaW4gZmllbGRzKQorICAgIHNlbGYuZmllbGRzX2J5X25hbWUgPSBkaWN0KChmLm5hbWUsIGYpIGZvciBmIGluIGZpZWxkcykKKworICAgIHNlbGYubmVzdGVkX3R5cGVzID0gbmVzdGVkX3R5cGVzCisgICAgc2VsZi5uZXN0ZWRfdHlwZXNfYnlfbmFtZSA9IGRpY3QoKHQubmFtZSwgdCkgZm9yIHQgaW4gbmVzdGVkX3R5cGVzKQorCisgICAgc2VsZi5lbnVtX3R5cGVzID0gZW51bV90eXBlcworICAgIGZvciBlbnVtX3R5cGUgaW4gc2VsZi5lbnVtX3R5cGVzOgorICAgICAgZW51bV90eXBlLmNvbnRhaW5pbmdfdHlwZSA9IHNlbGYKKyAgICBzZWxmLmVudW1fdHlwZXNfYnlfbmFtZSA9IGRpY3QoKHQubmFtZSwgdCkgZm9yIHQgaW4gZW51bV90eXBlcykKKyAgICBzZWxmLmVudW1fdmFsdWVzX2J5X25hbWUgPSBkaWN0KAorICAgICAgICAodi5uYW1lLCB2KSBmb3IgdCBpbiBlbnVtX3R5cGVzIGZvciB2IGluIHQudmFsdWVzKQorCisgICAgc2VsZi5leHRlbnNpb25zID0gZXh0ZW5zaW9ucworICAgIGZvciBleHRlbnNpb24gaW4gc2VsZi5leHRlbnNpb25zOgorICAgICAgZXh0ZW5zaW9uLmV4dGVuc2lvbl9zY29wZSA9IHNlbGYKKyAgICBzZWxmLmV4dGVuc2lvbnNfYnlfbmFtZSA9IGRpY3QoKGYubmFtZSwgZikgZm9yIGYgaW4gZXh0ZW5zaW9ucykKKyAgICBzZWxmLmlzX2V4dGVuZGFibGUgPSBpc19leHRlbmRhYmxlCisgICAgc2VsZi5leHRlbnNpb25fcmFuZ2VzID0gZXh0ZW5zaW9uX3JhbmdlcworCisgICAgc2VsZi5fc2VyaWFsaXplZF9zdGFydCA9IHNlcmlhbGl6ZWRfc3RhcnQKKyAgICBzZWxmLl9zZXJpYWxpemVkX2VuZCA9IHNlcmlhbGl6ZWRfZW5kCisKKyAgZGVmIENvcHlUb1Byb3RvKHNlbGYsIHByb3RvKToKKyAgICAiIiJDb3BpZXMgdGhpcyB0byBhIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90by4KKworICAgIEFyZ3M6CisgICAgICBwcm90bzogQW4gZW1wdHkgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLgorICAgICIiIgorICAgICMgVGhpcyBmdW5jdGlvbiBpcyBvdmVycmlkZW4gdG8gZ2l2ZSBhIGJldHRlciBkb2MgY29tbWVudC4KKyAgICBzdXBlcihEZXNjcmlwdG9yLCBzZWxmKS5Db3B5VG9Qcm90byhwcm90bykKKworCisjIFRPRE8ocm9iaW5zb24pOiBXZSBzaG91bGQgaGF2ZSBhZ2dyZXNzaXZlIGNoZWNraW5nIGhlcmUsCisjIGZvciBleGFtcGxlOgorIyAgICogSWYgeW91IHNwZWNpZnkgYSByZXBlYXRlZCBmaWVsZCwgeW91IHNob3VsZCBub3QgYmUgYWxsb3dlZAorIyAgICAgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUuCisjICAgKiBbT3RoZXIgZXhhbXBsZXMgaGVyZSBhcyBuZWVkZWRdLgorIworIyBUT0RPKHJvYmluc29uKTogZm9yIHRoaXMgYW5kIG90aGVyICpEZXNjcmlwdG9yIGNsYXNzZXMsIHdlCisjIG1pZ2h0IGFsc28gd2FudCB0byBsb2NrIHRoaW5ncyBkb3duIGFnZ3Jlc3NpdmVseSAoZS5nLiwKKyMgcHJldmVudCBjbGllbnRzIGZyb20gc2V0dGluZyB0aGUgYXR0cmlidXRlcykuICBIYXZpbmcKKyMgc3Ryb25nZXIgaW52YXJpYW50cyBoZXJlIGluIGdlbmVyYWwgd2lsbCByZWR1Y2UgdGhlIG51bWJlcgorIyBvZiBydW50aW1lIGNoZWNrcyB3ZSBtdXN0IGRvIGluIHJlZmxlY3Rpb24ucHkuLi4KK2NsYXNzIEZpZWxkRGVzY3JpcHRvcihEZXNjcmlwdG9yQmFzZSk6CisKKyAgIiIiRGVzY3JpcHRvciBmb3IgYSBzaW5nbGUgZmllbGQgaW4gYSAucHJvdG8gZmlsZS4KKworICBBIEZpZWxkRGVzY3JpcHRvciBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaXVidGVzOgorCisgICAgbmFtZTogKHN0cikgTmFtZSBvZiB0aGlzIGZpZWxkLCBleGFjdGx5IGFzIGl0IGFwcGVhcnMgaW4gLnByb3RvLgorICAgIGZ1bGxfbmFtZTogKHN0cikgTmFtZSBvZiB0aGlzIGZpZWxkLCBpbmNsdWRpbmcgY29udGFpbmluZyBzY29wZS4gIFRoaXMgaXMKKyAgICAgIHBhcnRpY3VsYXJseSByZWxldmFudCBmb3IgZXh0ZW5zaW9ucy4KKyAgICBpbmRleDogKGludCkgRGVuc2UsIDAtaW5kZXhlZCBpbmRleCBnaXZpbmcgdGhlIG9yZGVyIHRoYXQgdGhpcworICAgICAgZmllbGQgdGV4dHVhbGx5IGFwcGVhcnMgd2l0aGluIGl0cyBtZXNzYWdlIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgICBudW1iZXI6IChpbnQpIFRhZyBudW1iZXIgZGVjbGFyZWQgZm9yIHRoaXMgZmllbGQgaW4gdGhlIC5wcm90byBmaWxlLgorCisgICAgdHlwZTogKE9uZSBvZiB0aGUgVFlQRV8qIGNvbnN0YW50cyBiZWxvdykgRGVjbGFyZWQgdHlwZS4KKyAgICBjcHBfdHlwZTogKE9uZSBvZiB0aGUgQ1BQVFlQRV8qIGNvbnN0YW50cyBiZWxvdykgQysrIHR5cGUgdXNlZCB0bworICAgICAgcmVwcmVzZW50IHRoaXMgZmllbGQuCisKKyAgICBsYWJlbDogKE9uZSBvZiB0aGUgTEFCRUxfKiBjb25zdGFudHMgYmVsb3cpIFRlbGxzIHdoZXRoZXIgdGhpcworICAgICAgZmllbGQgaXMgb3B0aW9uYWwsIHJlcXVpcmVkLCBvciByZXBlYXRlZC4KKyAgICBoYXNfZGVmYXVsdF92YWx1ZTogKGJvb2wpIFRydWUgaWYgdGhpcyBmaWVsZCBoYXMgYSBkZWZhdWx0IHZhbHVlIGRlZmluZWQsCisgICAgICBvdGhlcndpc2UgZmFsc2UuCisgICAgZGVmYXVsdF92YWx1ZTogKFZhcmllcykgRGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGZpZWxkLiAgT25seQorICAgICAgbWVhbmluZ2Z1bCBmb3Igbm9uLXJlcGVhdGVkIHNjYWxhciBmaWVsZHMuICBSZXBlYXRlZCBmaWVsZHMKKyAgICAgIHNob3VsZCBhbHdheXMgc2V0IHRoaXMgdG8gW10sIGFuZCBub24tcmVwZWF0ZWQgY29tcG9zaXRlCisgICAgICBmaWVsZHMgc2hvdWxkIGFsd2F5cyBzZXQgdGhpcyB0byBOb25lLgorCisgICAgY29udGFpbmluZ190eXBlOiAoRGVzY3JpcHRvcikgRGVzY3JpcHRvciBvZiB0aGUgcHJvdG9jb2wgbWVzc2FnZQorICAgICAgdHlwZSB0aGF0IGNvbnRhaW5zIHRoaXMgZmllbGQuICBTZXQgYnkgdGhlIERlc2NyaXB0b3IgY29uc3RydWN0b3IKKyAgICAgIGlmIHdlJ3JlIHBhc3NlZCBpbnRvIG9uZS4KKyAgICAgIFNvbWV3aGF0IGNvbmZ1c2luZ2x5LCBmb3IgZXh0ZW5zaW9uIGZpZWxkcywgdGhpcyBpcyB0aGUKKyAgICAgIGRlc2NyaXB0b3Igb2YgdGhlIEVYVEVOREVEIG1lc3NhZ2UsIG5vdCB0aGUgZGVzY3JpcHRvcgorICAgICAgb2YgdGhlIG1lc3NhZ2UgY29udGFpbmluZyB0aGlzIGZpZWxkLiAgKFNlZSBpc19leHRlbnNpb24gYW5kCisgICAgICBleHRlbnNpb25fc2NvcGUgYmVsb3cpLgorICAgIG1lc3NhZ2VfdHlwZTogKERlc2NyaXB0b3IpIElmIGEgY29tcG9zaXRlIGZpZWxkLCBhIGRlc2NyaXB0b3IKKyAgICAgIG9mIHRoZSBtZXNzYWdlIHR5cGUgY29udGFpbmVkIGluIHRoaXMgZmllbGQuICBPdGhlcndpc2UsIHRoaXMgaXMgTm9uZS4KKyAgICBlbnVtX3R5cGU6IChFbnVtRGVzY3JpcHRvcikgSWYgdGhpcyBmaWVsZCBjb250YWlucyBhbiBlbnVtLCBhCisgICAgICBkZXNjcmlwdG9yIG9mIHRoYXQgZW51bS4gIE90aGVyd2lzZSwgdGhpcyBpcyBOb25lLgorCisgICAgaXNfZXh0ZW5zaW9uOiBUcnVlIGlmZiB0aGlzIGRlc2NyaWJlcyBhbiBleHRlbnNpb24gZmllbGQuCisgICAgZXh0ZW5zaW9uX3Njb3BlOiAoRGVzY3JpcHRvcikgT25seSBtZWFuaW5nZnVsIGlmIGlzX2V4dGVuc2lvbiBpcyBUcnVlLgorICAgICAgR2l2ZXMgdGhlIG1lc3NhZ2UgdGhhdCBpbW1lZGlhdGVseSBjb250YWlucyB0aGlzIGV4dGVuc2lvbiBmaWVsZC4KKyAgICAgIFdpbGwgYmUgTm9uZSBpZmYgd2UncmUgYSB0b3AtbGV2ZWwgKGZpbGUtbGV2ZWwpIGV4dGVuc2lvbiBmaWVsZC4KKworICAgIG9wdGlvbnM6IChkZXNjcmlwdG9yX3BiMi5GaWVsZE9wdGlvbnMpIFByb3RvY29sIG1lc3NhZ2UgZmllbGQgb3B0aW9ucyBvcgorICAgICAgTm9uZSB0byB1c2UgZGVmYXVsdCBmaWVsZCBvcHRpb25zLgorICAiIiIKKworICAjIE11c3QgYmUgY29uc2lzdGVudCB3aXRoIEMrKyBGaWVsZERlc2NyaXB0b3I6OlR5cGUgZW51bSBpbgorICAjIGRlc2NyaXB0b3IuaC4KKyAgIworICAjIFRPRE8ocm9iaW5zb24pOiBGaW5kIGEgd2F5IHRvIGVsaW1pbmF0ZSB0aGlzIHJlcGV0aXRpb24uCisgIFRZUEVfRE9VQkxFICAgICAgICAgPSAxCisgIFRZUEVfRkxPQVQgICAgICAgICAgPSAyCisgIFRZUEVfSU5UNjQgICAgICAgICAgPSAzCisgIFRZUEVfVUlOVDY0ICAgICAgICAgPSA0CisgIFRZUEVfSU5UMzIgICAgICAgICAgPSA1CisgIFRZUEVfRklYRUQ2NCAgICAgICAgPSA2CisgIFRZUEVfRklYRUQzMiAgICAgICAgPSA3CisgIFRZUEVfQk9PTCAgICAgICAgICAgPSA4CisgIFRZUEVfU1RSSU5HICAgICAgICAgPSA5CisgIFRZUEVfR1JPVVAgICAgICAgICAgPSAxMAorICBUWVBFX01FU1NBR0UgICAgICAgID0gMTEKKyAgVFlQRV9CWVRFUyAgICAgICAgICA9IDEyCisgIFRZUEVfVUlOVDMyICAgICAgICAgPSAxMworICBUWVBFX0VOVU0gICAgICAgICAgID0gMTQKKyAgVFlQRV9TRklYRUQzMiAgICAgICA9IDE1CisgIFRZUEVfU0ZJWEVENjQgICAgICAgPSAxNgorICBUWVBFX1NJTlQzMiAgICAgICAgID0gMTcKKyAgVFlQRV9TSU5UNjQgICAgICAgICA9IDE4CisgIE1BWF9UWVBFICAgICAgICAgICAgPSAxOAorCisgICMgTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggQysrIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBlbnVtIGluCisgICMgZGVzY3JpcHRvci5oLgorICAjCisgICMgVE9ETyhyb2JpbnNvbik6IEZpbmQgYSB3YXkgdG8gZWxpbWluYXRlIHRoaXMgcmVwZXRpdGlvbi4KKyAgQ1BQVFlQRV9JTlQzMiAgICAgICA9IDEKKyAgQ1BQVFlQRV9JTlQ2NCAgICAgICA9IDIKKyAgQ1BQVFlQRV9VSU5UMzIgICAgICA9IDMKKyAgQ1BQVFlQRV9VSU5UNjQgICAgICA9IDQKKyAgQ1BQVFlQRV9ET1VCTEUgICAgICA9IDUKKyAgQ1BQVFlQRV9GTE9BVCAgICAgICA9IDYKKyAgQ1BQVFlQRV9CT09MICAgICAgICA9IDcKKyAgQ1BQVFlQRV9FTlVNICAgICAgICA9IDgKKyAgQ1BQVFlQRV9TVFJJTkcgICAgICA9IDkKKyAgQ1BQVFlQRV9NRVNTQUdFICAgICA9IDEwCisgIE1BWF9DUFBUWVBFICAgICAgICAgPSAxMAorCisgICMgTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggQysrIEZpZWxkRGVzY3JpcHRvcjo6TGFiZWwgZW51bSBpbgorICAjIGRlc2NyaXB0b3IuaC4KKyAgIworICAjIFRPRE8ocm9iaW5zb24pOiBGaW5kIGEgd2F5IHRvIGVsaW1pbmF0ZSB0aGlzIHJlcGV0aXRpb24uCisgIExBQkVMX09QVElPTkFMICAgICAgPSAxCisgIExBQkVMX1JFUVVJUkVEICAgICAgPSAyCisgIExBQkVMX1JFUEVBVEVEICAgICAgPSAzCisgIE1BWF9MQUJFTCAgICAgICAgICAgPSAzCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZ1bGxfbmFtZSwgaW5kZXgsIG51bWJlciwgdHlwZSwgY3BwX3R5cGUsIGxhYmVsLAorICAgICAgICAgICAgICAgZGVmYXVsdF92YWx1ZSwgbWVzc2FnZV90eXBlLCBlbnVtX3R5cGUsIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbiwgZXh0ZW5zaW9uX3Njb3BlLCBvcHRpb25zPU5vbmUsCisgICAgICAgICAgICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlKToKKyAgICAiIiJUaGUgYXJndW1lbnRzIGFyZSBhcyBkZXNjcmliZWQgaW4gdGhlIGRlc2NyaXB0aW9uIG9mIEZpZWxkRGVzY3JpcHRvcgorICAgIGF0dHJpYnV0ZXMgYWJvdmUuCisKKyAgICBOb3RlIHRoYXQgY29udGFpbmluZ190eXBlIG1heSBiZSBOb25lLCBhbmQgbWF5IGJlIHNldCBsYXRlciBpZiBuZWNlc3NhcnkKKyAgICAodG8gZGVhbCB3aXRoIGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiBtZXNzYWdlIHR5cGVzLCBmb3IgZXhhbXBsZSkuCisgICAgTGlrZXdpc2UgZm9yIGV4dGVuc2lvbl9zY29wZS4KKyAgICAiIiIKKyAgICBzdXBlcihGaWVsZERlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKG9wdGlvbnMsICdGaWVsZE9wdGlvbnMnKQorICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICBzZWxmLmZ1bGxfbmFtZSA9IGZ1bGxfbmFtZQorICAgIHNlbGYuaW5kZXggPSBpbmRleAorICAgIHNlbGYubnVtYmVyID0gbnVtYmVyCisgICAgc2VsZi50eXBlID0gdHlwZQorICAgIHNlbGYuY3BwX3R5cGUgPSBjcHBfdHlwZQorICAgIHNlbGYubGFiZWwgPSBsYWJlbAorICAgIHNlbGYuaGFzX2RlZmF1bHRfdmFsdWUgPSBoYXNfZGVmYXVsdF92YWx1ZQorICAgIHNlbGYuZGVmYXVsdF92YWx1ZSA9IGRlZmF1bHRfdmFsdWUKKyAgICBzZWxmLmNvbnRhaW5pbmdfdHlwZSA9IGNvbnRhaW5pbmdfdHlwZQorICAgIHNlbGYubWVzc2FnZV90eXBlID0gbWVzc2FnZV90eXBlCisgICAgc2VsZi5lbnVtX3R5cGUgPSBlbnVtX3R5cGUKKyAgICBzZWxmLmlzX2V4dGVuc2lvbiA9IGlzX2V4dGVuc2lvbgorICAgIHNlbGYuZXh0ZW5zaW9uX3Njb3BlID0gZXh0ZW5zaW9uX3Njb3BlCisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAnY3BwJzoKKyAgICAgIGlmIGlzX2V4dGVuc2lvbjoKKyAgICAgICAgc2VsZi5fY2Rlc2NyaXB0b3IgPSBjcHBfbWVzc2FnZS5HZXRFeHRlbnNpb25EZXNjcmlwdG9yKGZ1bGxfbmFtZSkKKyAgICAgIGVsc2U6CisgICAgICAgIHNlbGYuX2NkZXNjcmlwdG9yID0gY3BwX21lc3NhZ2UuR2V0RmllbGREZXNjcmlwdG9yKGZ1bGxfbmFtZSkKKyAgICBlbHNlOgorICAgICAgc2VsZi5fY2Rlc2NyaXB0b3IgPSBOb25lCisKKworY2xhc3MgRW51bURlc2NyaXB0b3IoX05lc3RlZERlc2NyaXB0b3JCYXNlKToKKworICAiIiJEZXNjcmlwdG9yIGZvciBhbiBlbnVtIGRlZmluZWQgaW4gYSAucHJvdG8gZmlsZS4KKworICBBbiBFbnVtRGVzY3JpcHRvciBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorCisgICAgbmFtZTogKHN0cikgTmFtZSBvZiB0aGUgZW51bSB0eXBlLgorICAgIGZ1bGxfbmFtZTogKHN0cikgRnVsbCBuYW1lIG9mIHRoZSB0eXBlLCBpbmNsdWRpbmcgcGFja2FnZSBuYW1lCisgICAgICBhbmQgYW55IGVuY2xvc2luZyB0eXBlKHMpLgorCisgICAgdmFsdWVzOiAobGlzdCBvZiBFbnVtVmFsdWVEZXNjcmlwdG9ycykgTGlzdCBvZiB0aGUgdmFsdWVzCisgICAgICBpbiB0aGlzIGVudW0uCisgICAgdmFsdWVzX2J5X25hbWU6IChkaWN0IHN0ciAtPiBFbnVtVmFsdWVEZXNjcmlwdG9yKSBTYW1lIGFzIHx2YWx1ZXN8LAorICAgICAgYnV0IGluZGV4ZWQgYnkgdGhlICJuYW1lIiBmaWVsZCBvZiBlYWNoIEVudW1WYWx1ZURlc2NyaXB0b3IuCisgICAgdmFsdWVzX2J5X251bWJlcjogKGRpY3QgaW50IC0+IEVudW1WYWx1ZURlc2NyaXB0b3IpIFNhbWUgYXMgfHZhbHVlc3wsCisgICAgICBidXQgaW5kZXhlZCBieSB0aGUgIm51bWJlciIgZmllbGQgb2YgZWFjaCBFbnVtVmFsdWVEZXNjcmlwdG9yLgorICAgIGNvbnRhaW5pbmdfdHlwZTogKERlc2NyaXB0b3IpIERlc2NyaXB0b3Igb2YgdGhlIGltbWVkaWF0ZSBjb250YWluaW5nCisgICAgICB0eXBlIG9mIHRoaXMgZW51bSwgb3IgTm9uZSBpZiB0aGlzIGlzIGFuIGVudW0gZGVmaW5lZCBhdCB0aGUKKyAgICAgIHRvcCBsZXZlbCBpbiBhIC5wcm90byBmaWxlLiAgU2V0IGJ5IERlc2NyaXB0b3IncyBjb25zdHJ1Y3RvcgorICAgICAgaWYgd2UncmUgcGFzc2VkIGludG8gb25lLgorICAgIGZpbGU6IChGaWxlRGVzY3JpcHRvcikgUmVmZXJlbmNlIHRvIGZpbGUgZGVzY3JpcHRvci4KKyAgICBvcHRpb25zOiAoZGVzY3JpcHRvcl9wYjIuRW51bU9wdGlvbnMpIEVudW0gb3B0aW9ucyBtZXNzYWdlIG9yCisgICAgICBOb25lIHRvIHVzZSBkZWZhdWx0IGVudW0gb3B0aW9ucy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZ1bGxfbmFtZSwgZmlsZW5hbWUsIHZhbHVlcywKKyAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLCBvcHRpb25zPU5vbmUsIGZpbGU9Tm9uZSwKKyAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfc3RhcnQ9Tm9uZSwgc2VyaWFsaXplZF9lbmQ9Tm9uZSk6CisgICAgIiIiQXJndW1lbnRzIGFyZSBhcyBkZXNjcmliZWQgaW4gdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbiBhYm92ZS4KKworICAgIE5vdGUgdGhhdCBmaWxlbmFtZSBpcyBhbiBvYnNvbGV0ZSBhcmd1bWVudCwgdGhhdCBpcyBub3QgdXNlZCBhbnltb3JlLgorICAgIFBsZWFzZSB1c2UgZmlsZS5uYW1lIHRvIGFjY2VzcyB0aGlzIGFzIGFuIGF0dHJpYnV0ZS4KKyAgICAiIiIKKyAgICBzdXBlcihFbnVtRGVzY3JpcHRvciwgc2VsZikuX19pbml0X18oCisgICAgICAgIG9wdGlvbnMsICdFbnVtT3B0aW9ucycsIG5hbWUsIGZ1bGxfbmFtZSwgZmlsZSwKKyAgICAgICAgY29udGFpbmluZ190eXBlLCBzZXJpYWxpemVkX3N0YXJ0PXNlcmlhbGl6ZWRfc3RhcnQsCisgICAgICAgIHNlcmlhbGl6ZWRfZW5kPXNlcmlhbGl6ZWRfc3RhcnQpCisKKyAgICBzZWxmLnZhbHVlcyA9IHZhbHVlcworICAgIGZvciB2YWx1ZSBpbiBzZWxmLnZhbHVlczoKKyAgICAgIHZhbHVlLnR5cGUgPSBzZWxmCisgICAgc2VsZi52YWx1ZXNfYnlfbmFtZSA9IGRpY3QoKHYubmFtZSwgdikgZm9yIHYgaW4gdmFsdWVzKQorICAgIHNlbGYudmFsdWVzX2J5X251bWJlciA9IGRpY3QoKHYubnVtYmVyLCB2KSBmb3IgdiBpbiB2YWx1ZXMpCisKKyAgICBzZWxmLl9zZXJpYWxpemVkX3N0YXJ0ID0gc2VyaWFsaXplZF9zdGFydAorICAgIHNlbGYuX3NlcmlhbGl6ZWRfZW5kID0gc2VyaWFsaXplZF9lbmQKKworICBkZWYgQ29weVRvUHJvdG8oc2VsZiwgcHJvdG8pOgorICAgICIiIkNvcGllcyB0aGlzIHRvIGEgZGVzY3JpcHRvcl9wYjIuRW51bURlc2NyaXB0b3JQcm90by4KKworICAgIEFyZ3M6CisgICAgICBwcm90bzogQW4gZW1wdHkgZGVzY3JpcHRvcl9wYjIuRW51bURlc2NyaXB0b3JQcm90by4KKyAgICAiIiIKKyAgICAjIFRoaXMgZnVuY3Rpb24gaXMgb3ZlcnJpZGVuIHRvIGdpdmUgYSBiZXR0ZXIgZG9jIGNvbW1lbnQuCisgICAgc3VwZXIoRW51bURlc2NyaXB0b3IsIHNlbGYpLkNvcHlUb1Byb3RvKHByb3RvKQorCisKK2NsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3IoRGVzY3JpcHRvckJhc2UpOgorCisgICIiIkRlc2NyaXB0b3IgZm9yIGEgc2luZ2xlIHZhbHVlIHdpdGhpbiBhbiBlbnVtLgorCisgICAgbmFtZTogKHN0cikgTmFtZSBvZiB0aGlzIHZhbHVlLgorICAgIGluZGV4OiAoaW50KSBEZW5zZSwgMC1pbmRleGVkIGluZGV4IGdpdmluZyB0aGUgb3JkZXIgdGhhdCB0aGlzCisgICAgICB2YWx1ZSBhcHBlYXJzIHRleHR1YWxseSB3aXRoaW4gaXRzIGVudW0gaW4gdGhlIC5wcm90byBmaWxlLgorICAgIG51bWJlcjogKGludCkgQWN0dWFsIG51bWJlciBhc3NpZ25lZCB0byB0aGlzIGVudW0gdmFsdWUuCisgICAgdHlwZTogKEVudW1EZXNjcmlwdG9yKSBFbnVtRGVzY3JpcHRvciB0byB3aGljaCB0aGlzIHZhbHVlCisgICAgICBiZWxvbmdzLiAgU2V0IGJ5IEVudW1EZXNjcmlwdG9yJ3MgY29uc3RydWN0b3IgaWYgd2UncmUKKyAgICAgIHBhc3NlZCBpbnRvIG9uZS4KKyAgICBvcHRpb25zOiAoZGVzY3JpcHRvcl9wYjIuRW51bVZhbHVlT3B0aW9ucykgRW51bSB2YWx1ZSBvcHRpb25zIG1lc3NhZ2Ugb3IKKyAgICAgIE5vbmUgdG8gdXNlIGRlZmF1bHQgZW51bSB2YWx1ZSBvcHRpb25zIG9wdGlvbnMuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBpbmRleCwgbnVtYmVyLCB0eXBlPU5vbmUsIG9wdGlvbnM9Tm9uZSk6CisgICAgIiIiQXJndW1lbnRzIGFyZSBhcyBkZXNjcmliZWQgaW4gdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbiBhYm92ZS4iIiIKKyAgICBzdXBlcihFbnVtVmFsdWVEZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zLCAnRW51bVZhbHVlT3B0aW9ucycpCisgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHNlbGYuaW5kZXggPSBpbmRleAorICAgIHNlbGYubnVtYmVyID0gbnVtYmVyCisgICAgc2VsZi50eXBlID0gdHlwZQorCisKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yKF9OZXN0ZWREZXNjcmlwdG9yQmFzZSk6CisKKyAgIiIiRGVzY3JpcHRvciBmb3IgYSBzZXJ2aWNlLgorCisgICAgbmFtZTogKHN0cikgTmFtZSBvZiB0aGUgc2VydmljZS4KKyAgICBmdWxsX25hbWU6IChzdHIpIEZ1bGwgbmFtZSBvZiB0aGUgc2VydmljZSwgaW5jbHVkaW5nIHBhY2thZ2UgbmFtZS4KKyAgICBpbmRleDogKGludCkgMC1pbmRleGVkIGluZGV4IGdpdmluZyB0aGUgb3JkZXIgdGhhdCB0aGlzIHNlcnZpY2VzCisgICAgICBkZWZpbml0aW9uIGFwcGVhcnMgd2l0aGluZyB0aGUgLnByb3RvIGZpbGUuCisgICAgbWV0aG9kczogKGxpc3Qgb2YgTWV0aG9kRGVzY3JpcHRvcikgTGlzdCBvZiBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoaXMKKyAgICAgIHNlcnZpY2UuCisgICAgb3B0aW9uczogKGRlc2NyaXB0b3JfcGIyLlNlcnZpY2VPcHRpb25zKSBTZXJ2aWNlIG9wdGlvbnMgbWVzc2FnZSBvcgorICAgICAgTm9uZSB0byB1c2UgZGVmYXVsdCBzZXJ2aWNlIG9wdGlvbnMuCisgICAgZmlsZTogKEZpbGVEZXNjcmlwdG9yKSBSZWZlcmVuY2UgdG8gZmlsZSBpbmZvLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBpbmRleCwgbWV0aG9kcywgb3B0aW9ucz1Ob25lLCBmaWxlPU5vbmUsCisgICAgICAgICAgICAgICBzZXJpYWxpemVkX3N0YXJ0PU5vbmUsIHNlcmlhbGl6ZWRfZW5kPU5vbmUpOgorICAgIHN1cGVyKFNlcnZpY2VEZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXygKKyAgICAgICAgb3B0aW9ucywgJ1NlcnZpY2VPcHRpb25zJywgbmFtZSwgZnVsbF9uYW1lLCBmaWxlLAorICAgICAgICBOb25lLCBzZXJpYWxpemVkX3N0YXJ0PXNlcmlhbGl6ZWRfc3RhcnQsCisgICAgICAgIHNlcmlhbGl6ZWRfZW5kPXNlcmlhbGl6ZWRfZW5kKQorICAgIHNlbGYuaW5kZXggPSBpbmRleAorICAgIHNlbGYubWV0aG9kcyA9IG1ldGhvZHMKKyAgICAjIFNldCB0aGUgY29udGFpbmluZyBzZXJ2aWNlIGZvciBlYWNoIG1ldGhvZCBpbiB0aGlzIHNlcnZpY2UuCisgICAgZm9yIG1ldGhvZCBpbiBzZWxmLm1ldGhvZHM6CisgICAgICBtZXRob2QuY29udGFpbmluZ19zZXJ2aWNlID0gc2VsZgorCisgIGRlZiBGaW5kTWV0aG9kQnlOYW1lKHNlbGYsIG5hbWUpOgorICAgICIiIlNlYXJjaGVzIGZvciB0aGUgc3BlY2lmaWVkIG1ldGhvZCwgYW5kIHJldHVybnMgaXRzIGRlc2NyaXB0b3IuIiIiCisgICAgZm9yIG1ldGhvZCBpbiBzZWxmLm1ldGhvZHM6CisgICAgICBpZiBuYW1lID09IG1ldGhvZC5uYW1lOgorICAgICAgICByZXR1cm4gbWV0aG9kCisgICAgcmV0dXJuIE5vbmUKKworICBkZWYgQ29weVRvUHJvdG8oc2VsZiwgcHJvdG8pOgorICAgICIiIkNvcGllcyB0aGlzIHRvIGEgZGVzY3JpcHRvcl9wYjIuU2VydmljZURlc2NyaXB0b3JQcm90by4KKworICAgIEFyZ3M6CisgICAgICBwcm90bzogQW4gZW1wdHkgZGVzY3JpcHRvcl9wYjIuU2VydmljZURlc2NyaXB0b3JQcm90by4KKyAgICAiIiIKKyAgICAjIFRoaXMgZnVuY3Rpb24gaXMgb3ZlcnJpZGVuIHRvIGdpdmUgYSBiZXR0ZXIgZG9jIGNvbW1lbnQuCisgICAgc3VwZXIoU2VydmljZURlc2NyaXB0b3IsIHNlbGYpLkNvcHlUb1Byb3RvKHByb3RvKQorCisKK2NsYXNzIE1ldGhvZERlc2NyaXB0b3IoRGVzY3JpcHRvckJhc2UpOgorCisgICIiIkRlc2NyaXB0b3IgZm9yIGEgbWV0aG9kIGluIGEgc2VydmljZS4KKworICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoZSBtZXRob2Qgd2l0aGluIHRoZSBzZXJ2aWNlLgorICBmdWxsX25hbWU6IChzdHIpIEZ1bGwgbmFtZSBvZiBtZXRob2QuCisgIGluZGV4OiAoaW50KSAwLWluZGV4ZWQgaW5kZXggb2YgdGhlIG1ldGhvZCBpbnNpZGUgdGhlIHNlcnZpY2UuCisgIGNvbnRhaW5pbmdfc2VydmljZTogKFNlcnZpY2VEZXNjcmlwdG9yKSBUaGUgc2VydmljZSB0aGF0IGNvbnRhaW5zIHRoaXMKKyAgICBtZXRob2QuCisgIGlucHV0X3R5cGU6IFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBtZXNzYWdlIHRoYXQgdGhpcyBtZXRob2QgYWNjZXB0cy4KKyAgb3V0cHV0X3R5cGU6IFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBtZXNzYWdlIHRoYXQgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgb3B0aW9uczogKGRlc2NyaXB0b3JfcGIyLk1ldGhvZE9wdGlvbnMpIE1ldGhvZCBvcHRpb25zIG1lc3NhZ2Ugb3IKKyAgICBOb25lIHRvIHVzZSBkZWZhdWx0IG1ldGhvZCBvcHRpb25zLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBpbmRleCwgY29udGFpbmluZ19zZXJ2aWNlLAorICAgICAgICAgICAgICAgaW5wdXRfdHlwZSwgb3V0cHV0X3R5cGUsIG9wdGlvbnM9Tm9uZSk6CisgICAgIiIiVGhlIGFyZ3VtZW50cyBhcmUgYXMgZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBNZXRob2REZXNjcmlwdG9yCisgICAgYXR0cmlidXRlcyBhYm92ZS4KKworICAgIE5vdGUgdGhhdCBjb250YWluaW5nX3NlcnZpY2UgbWF5IGJlIE5vbmUsIGFuZCBtYXkgYmUgc2V0IGxhdGVyIGlmIG5lY2Vzc2FyeS4KKyAgICAiIiIKKyAgICBzdXBlcihNZXRob2REZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zLCAnTWV0aG9kT3B0aW9ucycpCisgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHNlbGYuZnVsbF9uYW1lID0gZnVsbF9uYW1lCisgICAgc2VsZi5pbmRleCA9IGluZGV4CisgICAgc2VsZi5jb250YWluaW5nX3NlcnZpY2UgPSBjb250YWluaW5nX3NlcnZpY2UKKyAgICBzZWxmLmlucHV0X3R5cGUgPSBpbnB1dF90eXBlCisgICAgc2VsZi5vdXRwdXRfdHlwZSA9IG91dHB1dF90eXBlCisKKworY2xhc3MgRmlsZURlc2NyaXB0b3IoRGVzY3JpcHRvckJhc2UpOgorICAiIiJEZXNjcmlwdG9yIGZvciBhIGZpbGUuIE1pbWljcyB0aGUgZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by4KKworICBuYW1lOiBuYW1lIG9mIGZpbGUsIHJlbGF0aXZlIHRvIHJvb3Qgb2Ygc291cmNlIHRyZWUuCisgIHBhY2thZ2U6IG5hbWUgb2YgdGhlIHBhY2thZ2UKKyAgc2VyaWFsaXplZF9wYjogKHN0cikgQnl0ZSBzdHJpbmcgb2Ygc2VyaWFsaXplZAorICAgIGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwYWNrYWdlLCBvcHRpb25zPU5vbmUsIHNlcmlhbGl6ZWRfcGI9Tm9uZSk6CisgICAgIiIiQ29uc3RydWN0b3IuIiIiCisgICAgc3VwZXIoRmlsZURlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKG9wdGlvbnMsICdGaWxlT3B0aW9ucycpCisKKyAgICBzZWxmLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZSA9IHt9CisgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHNlbGYucGFja2FnZSA9IHBhY2thZ2UKKyAgICBzZWxmLnNlcmlhbGl6ZWRfcGIgPSBzZXJpYWxpemVkX3BiCisgICAgaWYgKGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ2NwcCcgYW5kCisgICAgICAgIHNlbGYuc2VyaWFsaXplZF9wYiBpcyBub3QgTm9uZSk6CisgICAgICBjcHBfbWVzc2FnZS5CdWlsZEZpbGUoc2VsZi5zZXJpYWxpemVkX3BiKQorCisgIGRlZiBDb3B5VG9Qcm90byhzZWxmLCBwcm90byk6CisgICAgIiIiQ29waWVzIHRoaXMgdG8gYSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLgorCisgICAgQXJnczoKKyAgICAgIHByb3RvOiBBbiBlbXB0eSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLgorICAgICIiIgorICAgIHByb3RvLlBhcnNlRnJvbVN0cmluZyhzZWxmLnNlcmlhbGl6ZWRfcGIpCisKKworZGVmIF9QYXJzZU9wdGlvbnMobWVzc2FnZSwgc3RyaW5nKToKKyAgIiIiUGFyc2VzIHNlcmlhbGl6ZWQgb3B0aW9ucy4KKworICBUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhcnNlIHNlcmlhbGl6ZWQgb3B0aW9ucyBpbiBnZW5lcmF0ZWQKKyAgcHJvdG8yIGZpbGVzLiBJdCBtdXN0IG5vdCBiZSB1c2VkIG91dHNpZGUgcHJvdG8yLgorICAiIiIKKyAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc3RyaW5nKQorICByZXR1cm4gbWVzc2FnZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvX19pbml0X18ucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZDFjOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvX19pbml0X18ucHkKQEAgLTAsMCArMSBAQAorIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTQxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9hcGlfaW1wbGVtZW50YXRpb24ucHkKQEAgLTAsMCArMSw2NCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIgorVGhpcyBtb2R1bGUgaXMgdGhlIGNlbnRyYWwgZW50aXR5IHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKK0FQSSBpcyB1c2VkLgorIiIiCisKK19fYXV0aG9yX18gPSAncGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KScKKworaW1wb3J0IG9zCisjIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHVzZWQgdG8gc3dpdGNoIHRvIGEgY2VydGFpbiBpbXBsZW1lbnRhdGlvbgorIyBvZiB0aGUgUHl0aG9uIEFQSS4gUmlnaHQgbm93IG9ubHkgJ3B5dGhvbicgYW5kICdjcHAnIGFyZSB2YWxpZCB2YWx1ZXMuIEFueQorIyBvdGhlciB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuCitfaW1wbGVtZW50YXRpb25fdHlwZSA9IG9zLmdldGVudignUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT04nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbicpCisKKworaWYgX2ltcGxlbWVudGF0aW9uX3R5cGUgIT0gJ3B5dGhvbic6CisgICMgRm9yIG5vdywgYnkgZGVmYXVsdCB1c2UgdGhlIHB1cmUtUHl0aG9uIGltcGxlbWVudGF0aW9uLgorICAjIFRoZSBjb2RlIGJlbG93IGNoZWNrcyBpZiB0aGUgQyBleHRlbnNpb24gaXMgYXZhaWxhYmxlIGFuZAorICAjIHVzZXMgaXQgaWYgaXQgaXMgYXZhaWxhYmxlLgorICBfaW1wbGVtZW50YXRpb25fdHlwZSA9ICdjcHAnCisgICMjIERldGVybWluZSBhdXRvbWF0aWNhbGx5IHdoaWNoIGltcGxlbWVudGF0aW9uIHRvIHVzZS4KKyAgI3RyeToKKyAgIyAgZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGNwcF9tZXNzYWdlCisgICMgIF9pbXBsZW1lbnRhdGlvbl90eXBlID0gJ2NwcCcKKyAgI2V4Y2VwdCBJbXBvcnRFcnJvciwgZToKKyAgIyAgX2ltcGxlbWVudGF0aW9uX3R5cGUgPSAncHl0aG9uJworCisKKyMgVXNhZ2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBkaXNjb3VyYWdlZC4gQ2xpZW50cyBzaG91bGRuJ3QgY2FyZSB3aGljaAorIyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJIGlzIGluIHVzZS4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZQorIyB0aGF0IGRpZmZlcmVuY2VzIGJldHdlZW4gQVBJcyB3aWxsIGJlIG1haW50YWluZWQuCisjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBpZiBwb3NzaWJsZS4KK2RlZiBUeXBlKCk6CisgIHJldHVybiBfaW1wbGVtZW50YXRpb25fdHlwZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY29udGFpbmVycy5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NvbnRhaW5lcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDk3YTNjMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NvbnRhaW5lcnMucHkKQEAgLTAsMCArMSwyNTkgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb250YWlucyBjb250YWluZXIgY2xhc3NlcyB0byByZXByZXNlbnQgZGlmZmVyZW50IHByb3RvY29sIGJ1ZmZlciB0eXBlcy4KKworVGhpcyBmaWxlIGRlZmluZXMgY29udGFpbmVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGNhdGVnb3JpZXMgb2YgcHJvdG9jb2wKK2J1ZmZlciBmaWVsZCB0eXBlcyB3aGljaCBuZWVkIGV4dHJhIG1haW50ZW5hbmNlLiBDdXJyZW50bHkgdGhlc2UgY2F0ZWdvcmllcworYXJlOgorICAtIFJlcGVhdGVkIHNjYWxhciBmaWVsZHMgLSBUaGVzZSBhcmUgYWxsIHJlcGVhdGVkIGZpZWxkcyB3aGljaCBhcmVuJ3QKKyAgICBjb21wb3NpdGUgKGUuZy4gdGhleSBhcmUgb2Ygc2ltcGxlIHR5cGVzIGxpa2UgaW50MzIsIHN0cmluZywgZXRjKS4KKyAgLSBSZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzIC0gUmVwZWF0ZWQgZmllbGRzIHdoaWNoIGFyZSBjb21wb3NpdGUuIFRoaXMKKyAgICBpbmNsdWRlcyBncm91cHMgYW5kIG5lc3RlZCBtZXNzYWdlcy4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3BldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdiknCisKKworY2xhc3MgQmFzZUNvbnRhaW5lcihvYmplY3QpOgorCisgICIiIkJhc2UgY29udGFpbmVyIGNsYXNzLiIiIgorCisgICMgTWluaW1pemVzIG1lbW9yeSB1c2FnZSBhbmQgZGlzYWxsb3dzIGFzc2lnbm1lbnQgdG8gb3RoZXIgYXR0cmlidXRlcy4KKyAgX19zbG90c19fID0gWydfbWVzc2FnZV9saXN0ZW5lcicsICdfdmFsdWVzJ10KKworICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZV9saXN0ZW5lcik6CisgICAgIiIiCisgICAgQXJnczoKKyAgICAgIG1lc3NhZ2VfbGlzdGVuZXI6IEEgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLgorICAgICAgICBUaGUgUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lciB3aWxsIGNhbGwgdGhpcyBvYmplY3QncworICAgICAgICBNb2RpZmllZCgpIG1ldGhvZCB3aGVuIGl0IGlzIG1vZGlmaWVkLgorICAgICIiIgorICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIgPSBtZXNzYWdlX2xpc3RlbmVyCisgICAgc2VsZi5fdmFsdWVzID0gW10KKworICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAiIiJSZXRyaWV2ZXMgaXRlbSBieSB0aGUgc3BlY2lmaWVkIGtleS4iIiIKKyAgICByZXR1cm4gc2VsZi5fdmFsdWVzW2tleV0KKworICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAiIiJSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRhaW5lci4iIiIKKyAgICByZXR1cm4gbGVuKHNlbGYuX3ZhbHVlcykKKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAiIiJDaGVja3MgaWYgYW5vdGhlciBpbnN0YW5jZSBpc24ndCBlcXVhbCB0byB0aGlzIG9uZS4iIiIKKyAgICAjIFRoZSBjb25jcmV0ZSBjbGFzc2VzIHNob3VsZCBkZWZpbmUgX19lcV9fLgorICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICByYWlzZSBUeXBlRXJyb3IoJ3VuaGFzaGFibGUgb2JqZWN0JykKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuIHJlcHIoc2VsZi5fdmFsdWVzKQorCisgIGRlZiBzb3J0KHNlbGYsIHNvcnRfZnVuY3Rpb249Y21wKToKKyAgICBzZWxmLl92YWx1ZXMuc29ydChzb3J0X2Z1bmN0aW9uKQorCisKK2NsYXNzIFJlcGVhdGVkU2NhbGFyRmllbGRDb250YWluZXIoQmFzZUNvbnRhaW5lcik6CisKKyAgIiIiU2ltcGxlLCB0eXBlLWNoZWNrZWQsIGxpc3QtbGlrZSBjb250YWluZXIgZm9yIGhvbGRpbmcgcmVwZWF0ZWQgc2NhbGFycy4iIiIKKworICAjIERpc2FsbG93cyBhc3NpZ25tZW50IHRvIG90aGVyIGF0dHJpYnV0ZXMuCisgIF9fc2xvdHNfXyA9IFsnX3R5cGVfY2hlY2tlciddCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2VfbGlzdGVuZXIsIHR5cGVfY2hlY2tlcik6CisgICAgIiIiCisgICAgQXJnczoKKyAgICAgIG1lc3NhZ2VfbGlzdGVuZXI6IEEgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLgorICAgICAgICBUaGUgUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lciB3aWxsIGNhbGwgdGhpcyBvYmplY3QncworICAgICAgICBNb2RpZmllZCgpIG1ldGhvZCB3aGVuIGl0IGlzIG1vZGlmaWVkLgorICAgICAgdHlwZV9jaGVja2VyOiBBIHR5cGVfY2hlY2tlcnMuVmFsdWVDaGVja2VyIGluc3RhbmNlIHRvIHJ1biBvbiBlbGVtZW50cworICAgICAgICBpbnNlcnRlZCBpbnRvIHRoaXMgY29udGFpbmVyLgorICAgICIiIgorICAgIHN1cGVyKFJlcGVhdGVkU2NhbGFyRmllbGRDb250YWluZXIsIHNlbGYpLl9faW5pdF9fKG1lc3NhZ2VfbGlzdGVuZXIpCisgICAgc2VsZi5fdHlwZV9jaGVja2VyID0gdHlwZV9jaGVja2VyCisKKyAgZGVmIGFwcGVuZChzZWxmLCB2YWx1ZSk6CisgICAgIiIiQXBwZW5kcyBhbiBpdGVtIHRvIHRoZSBsaXN0LiBTaW1pbGFyIHRvIGxpc3QuYXBwZW5kKCkuIiIiCisgICAgc2VsZi5fdHlwZV9jaGVja2VyLkNoZWNrVmFsdWUodmFsdWUpCisgICAgc2VsZi5fdmFsdWVzLmFwcGVuZCh2YWx1ZSkKKyAgICBpZiBub3Qgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5kaXJ0eToKKyAgICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBpbnNlcnQoc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgIiIiSW5zZXJ0cyB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBTaW1pbGFyIHRvIGxpc3QuaW5zZXJ0KCkuIiIiCisgICAgc2VsZi5fdHlwZV9jaGVja2VyLkNoZWNrVmFsdWUodmFsdWUpCisgICAgc2VsZi5fdmFsdWVzLmluc2VydChrZXksIHZhbHVlKQorICAgIGlmIG5vdCBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLmRpcnR5OgorICAgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIGV4dGVuZChzZWxmLCBlbGVtX3NlcSk6CisgICAgIiIiRXh0ZW5kcyBieSBhcHBlbmRpbmcgdGhlIGdpdmVuIHNlcXVlbmNlLiBTaW1pbGFyIHRvIGxpc3QuZXh0ZW5kKCkuIiIiCisgICAgaWYgbm90IGVsZW1fc2VxOgorICAgICAgcmV0dXJuCisKKyAgICBuZXdfdmFsdWVzID0gW10KKyAgICBmb3IgZWxlbSBpbiBlbGVtX3NlcToKKyAgICAgIHNlbGYuX3R5cGVfY2hlY2tlci5DaGVja1ZhbHVlKGVsZW0pCisgICAgICBuZXdfdmFsdWVzLmFwcGVuZChlbGVtKQorICAgIHNlbGYuX3ZhbHVlcy5leHRlbmQobmV3X3ZhbHVlcykKKyAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBkZWYgTWVyZ2VGcm9tKHNlbGYsIG90aGVyKToKKyAgICAiIiJBcHBlbmRzIHRoZSBjb250ZW50cyBvZiBhbm90aGVyIHJlcGVhdGVkIGZpZWxkIG9mIHRoZSBzYW1lIHR5cGUgdG8gdGhpcworICAgIG9uZS4gV2UgZG8gbm90IGNoZWNrIHRoZSB0eXBlcyBvZiB0aGUgaW5kaXZpZHVhbCBmaWVsZHMuCisgICAgIiIiCisgICAgc2VsZi5fdmFsdWVzLmV4dGVuZChvdGhlci5fdmFsdWVzKQorICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiByZW1vdmUoc2VsZiwgZWxlbSk6CisgICAgIiIiUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGxpc3QuIFNpbWlsYXIgdG8gbGlzdC5yZW1vdmUoKS4iIiIKKyAgICBzZWxmLl92YWx1ZXMucmVtb3ZlKGVsZW0pCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICIiIlNldHMgdGhlIGl0ZW0gb24gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4iIiIKKyAgICBzZWxmLl90eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkKKyAgICBzZWxmLl92YWx1ZXNba2V5XSA9IHZhbHVlCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBzdGFydCwgc3RvcCk6CisgICAgIiIiUmV0cmlldmVzIHRoZSBzdWJzZXQgb2YgaXRlbXMgZnJvbSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgaW5kaWNlcy4iIiIKKyAgICByZXR1cm4gc2VsZi5fdmFsdWVzW3N0YXJ0OnN0b3BdCisKKyAgZGVmIF9fc2V0c2xpY2VfXyhzZWxmLCBzdGFydCwgc3RvcCwgdmFsdWVzKToKKyAgICAiIiJTZXRzIHRoZSBzdWJzZXQgb2YgaXRlbXMgZnJvbSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgaW5kaWNlcy4iIiIKKyAgICBuZXdfdmFsdWVzID0gW10KKyAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgorICAgICAgc2VsZi5fdHlwZV9jaGVja2VyLkNoZWNrVmFsdWUodmFsdWUpCisgICAgICBuZXdfdmFsdWVzLmFwcGVuZCh2YWx1ZSkKKyAgICBzZWxmLl92YWx1ZXNbc3RhcnQ6c3RvcF0gPSBuZXdfdmFsdWVzCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgIiIiRGVsZXRlcyB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiIiIgorICAgIGRlbCBzZWxmLl92YWx1ZXNba2V5XQorICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgc3RhcnQsIHN0b3ApOgorICAgICIiIkRlbGV0ZXMgdGhlIHN1YnNldCBvZiBpdGVtcyBmcm9tIGJldHdlZW4gdGhlIHNwZWNpZmllZCBpbmRpY2VzLiIiIgorICAgIGRlbCBzZWxmLl92YWx1ZXNbc3RhcnQ6c3RvcF0KKyAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAiIiJDb21wYXJlcyB0aGUgY3VycmVudCBpbnN0YW5jZSB3aXRoIGFub3RoZXIgb25lLiIiIgorICAgIGlmIHNlbGYgaXMgb3RoZXI6CisgICAgICByZXR1cm4gVHJ1ZQorICAgICMgU3BlY2lhbCBjYXNlIGZvciB0aGUgc2FtZSB0eXBlIHdoaWNoIHNob3VsZCBiZSBjb21tb24gYW5kIGZhc3QuCisgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgcmV0dXJuIG90aGVyLl92YWx1ZXMgPT0gc2VsZi5fdmFsdWVzCisgICAgIyBXZSBhcmUgcHJlc3VtYWJseSBjb21wYXJpbmcgYWdhaW5zdCBzb21lIG90aGVyIHNlcXVlbmNlIHR5cGUuCisgICAgcmV0dXJuIG90aGVyID09IHNlbGYuX3ZhbHVlcworCisKK2NsYXNzIFJlcGVhdGVkQ29tcG9zaXRlRmllbGRDb250YWluZXIoQmFzZUNvbnRhaW5lcik6CisKKyAgIiIiU2ltcGxlLCBsaXN0LWxpa2UgY29udGFpbmVyIGZvciBob2xkaW5nIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMuIiIiCisKKyAgIyBEaXNhbGxvd3MgYXNzaWdubWVudCB0byBvdGhlciBhdHRyaWJ1dGVzLgorICBfX3Nsb3RzX18gPSBbJ19tZXNzYWdlX2Rlc2NyaXB0b3InXQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlX2xpc3RlbmVyLCBtZXNzYWdlX2Rlc2NyaXB0b3IpOgorICAgICIiIgorICAgIE5vdGUgdGhhdCB3ZSBwYXNzIGluIGEgZGVzY3JpcHRvciBpbnN0ZWFkIG9mIHRoZSBnZW5lcmF0ZWQgZGlyZWN0bHksCisgICAgc2luY2UgYXQgdGhlIHRpbWUgd2UgY29uc3RydWN0IGEgX1JlcGVhdGVkQ29tcG9zaXRlRmllbGRDb250YWluZXIgd2UKKyAgICBoYXZlbid0IHlldCBuZWNlc3NhcmlseSBpbml0aWFsaXplZCB0aGUgdHlwZSB0aGF0IHdpbGwgYmUgY29udGFpbmVkIGluIHRoZQorICAgIGNvbnRhaW5lci4KKworICAgIEFyZ3M6CisgICAgICBtZXNzYWdlX2xpc3RlbmVyOiBBIE1lc3NhZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgVGhlIFJlcGVhdGVkQ29tcG9zaXRlRmllbGRDb250YWluZXIgd2lsbCBjYWxsIHRoaXMgb2JqZWN0J3MKKyAgICAgICAgTW9kaWZpZWQoKSBtZXRob2Qgd2hlbiBpdCBpcyBtb2RpZmllZC4KKyAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvcjogQSBEZXNjcmlwdG9yIGluc3RhbmNlIGRlc2NyaWJpbmcgdGhlIHByb3RvY29sIHR5cGUKKyAgICAgICAgdGhhdCBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGlzIGNvbnRhaW5lci4gIFdlJ2xsIHVzZSB0aGUKKyAgICAgICAgX2NvbmNyZXRlX2NsYXNzIGZpZWxkIG9mIHRoaXMgZGVzY3JpcHRvciB3aGVuIHRoZSBjbGllbnQgY2FsbHMgYWRkKCkuCisgICAgIiIiCisgICAgc3VwZXIoUmVwZWF0ZWRDb21wb3NpdGVGaWVsZENvbnRhaW5lciwgc2VsZikuX19pbml0X18obWVzc2FnZV9saXN0ZW5lcikKKyAgICBzZWxmLl9tZXNzYWdlX2Rlc2NyaXB0b3IgPSBtZXNzYWdlX2Rlc2NyaXB0b3IKKworICBkZWYgYWRkKHNlbGYsICoqa3dhcmdzKToKKyAgICAiIiJBZGRzIGEgbmV3IGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQgcmV0dXJucyBpdC4gS2V5d29yZAorICAgIGFyZ3VtZW50cyBtYXkgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBlbGVtZW50LgorICAgICIiIgorICAgIG5ld19lbGVtZW50ID0gc2VsZi5fbWVzc2FnZV9kZXNjcmlwdG9yLl9jb25jcmV0ZV9jbGFzcygqKmt3YXJncykKKyAgICBuZXdfZWxlbWVudC5fU2V0TGlzdGVuZXIoc2VsZi5fbWVzc2FnZV9saXN0ZW5lcikKKyAgICBzZWxmLl92YWx1ZXMuYXBwZW5kKG5ld19lbGVtZW50KQorICAgIGlmIG5vdCBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLmRpcnR5OgorICAgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisgICAgcmV0dXJuIG5ld19lbGVtZW50CisKKyAgZGVmIGV4dGVuZChzZWxmLCBlbGVtX3NlcSk6CisgICAgIiIiRXh0ZW5kcyBieSBhcHBlbmRpbmcgdGhlIGdpdmVuIHNlcXVlbmNlIG9mIGVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUKKyAgICBhcyB0aGlzIG9uZSwgY29weWluZyBlYWNoIGluZGl2aWR1YWwgbWVzc2FnZS4KKyAgICAiIiIKKyAgICBtZXNzYWdlX2NsYXNzID0gc2VsZi5fbWVzc2FnZV9kZXNjcmlwdG9yLl9jb25jcmV0ZV9jbGFzcworICAgIGxpc3RlbmVyID0gc2VsZi5fbWVzc2FnZV9saXN0ZW5lcgorICAgIHZhbHVlcyA9IHNlbGYuX3ZhbHVlcworICAgIGZvciBtZXNzYWdlIGluIGVsZW1fc2VxOgorICAgICAgbmV3X2VsZW1lbnQgPSBtZXNzYWdlX2NsYXNzKCkKKyAgICAgIG5ld19lbGVtZW50Ll9TZXRMaXN0ZW5lcihsaXN0ZW5lcikKKyAgICAgIG5ld19lbGVtZW50Lk1lcmdlRnJvbShtZXNzYWdlKQorICAgICAgdmFsdWVzLmFwcGVuZChuZXdfZWxlbWVudCkKKyAgICBsaXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIE1lcmdlRnJvbShzZWxmLCBvdGhlcik6CisgICAgIiIiQXBwZW5kcyB0aGUgY29udGVudHMgb2YgYW5vdGhlciByZXBlYXRlZCBmaWVsZCBvZiB0aGUgc2FtZSB0eXBlIHRvIHRoaXMKKyAgICBvbmUsIGNvcHlpbmcgZWFjaCBpbmRpdmlkdWFsIG1lc3NhZ2UuCisgICAgIiIiCisgICAgc2VsZi5leHRlbmQob3RoZXIuX3ZhbHVlcykKKworICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIHN0YXJ0LCBzdG9wKToKKyAgICAiIiJSZXRyaWV2ZXMgdGhlIHN1YnNldCBvZiBpdGVtcyBmcm9tIGJldHdlZW4gdGhlIHNwZWNpZmllZCBpbmRpY2VzLiIiIgorICAgIHJldHVybiBzZWxmLl92YWx1ZXNbc3RhcnQ6c3RvcF0KKworICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAiIiJEZWxldGVzIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIiIiCisgICAgZGVsIHNlbGYuX3ZhbHVlc1trZXldCisgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCisKKyAgZGVmIF9fZGVsc2xpY2VfXyhzZWxmLCBzdGFydCwgc3RvcCk6CisgICAgIiIiRGVsZXRlcyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGZyb20gYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGluZGljZXMuIiIiCisgICAgZGVsIHNlbGYuX3ZhbHVlc1tzdGFydDpzdG9wXQorICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICIiIkNvbXBhcmVzIHRoZSBjdXJyZW50IGluc3RhbmNlIHdpdGggYW5vdGhlciBvbmUuIiIiCisgICAgaWYgc2VsZiBpcyBvdGhlcjoKKyAgICAgIHJldHVybiBUcnVlCisgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2FuIG9ubHkgY29tcGFyZSByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzIGFnYWluc3QgJworICAgICAgICAgICAgICAgICAgICAgICdvdGhlciByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzLicpCisgICAgcmV0dXJuIHNlbGYuX3ZhbHVlcyA9PSBvdGhlci5fdmFsdWVzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jcHBfbWVzc2FnZS5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NwcF9tZXNzYWdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNDI2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jcHBfbWVzc2FnZS5weQpAQCAtMCwwICsxLDYxNiBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB0byBjcmVhdGUgcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzIGZyb20KK0Rlc2NyaXB0b3Igb2JqZWN0cyBhdCBydW50aW1lIGJhY2tlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIEMrKyBBUEkuCisiIiIKKworX19hdXRob3JfXyA9ICdwZXRhckBnb29nbGUuY29tIChQZXRhciBQZXRyb3YpJworCitpbXBvcnQgb3BlcmF0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBfbmV0X3Byb3RvMl9fX3B5dGhvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKKworCitfTEFCRUxfUkVQRUFURUQgPSBfbmV0X3Byb3RvMl9fX3B5dGhvbi5MQUJFTF9SRVBFQVRFRAorX0xBQkVMX09QVElPTkFMID0gX25ldF9wcm90bzJfX19weXRob24uTEFCRUxfT1BUSU9OQUwKK19DUFBUWVBFX01FU1NBR0UgPSBfbmV0X3Byb3RvMl9fX3B5dGhvbi5DUFBUWVBFX01FU1NBR0UKK19UWVBFX01FU1NBR0UgPSBfbmV0X3Byb3RvMl9fX3B5dGhvbi5UWVBFX01FU1NBR0UKKworCitkZWYgR2V0RGVzY3JpcHRvclBvb2woKToKKyAgIiIiQ3JlYXRlcyBhIG5ldyBEZXNjcmlwdG9yUG9vbCBDKysgb2JqZWN0LiIiIgorICByZXR1cm4gX25ldF9wcm90bzJfX19weXRob24uTmV3Q0Rlc2NyaXB0b3JQb29sKCkKKworCitfcG9vbCA9IEdldERlc2NyaXB0b3JQb29sKCkKKworCitkZWYgR2V0RmllbGREZXNjcmlwdG9yKGZ1bGxfZmllbGRfbmFtZSk6CisgICIiIlNlYXJjaGVzIGZvciBhIGZpZWxkIGRlc2NyaXB0b3IgZ2l2ZW4gYSBmdWxsIGZpZWxkIG5hbWUuIiIiCisgIHJldHVybiBfcG9vbC5GaW5kRmllbGRCeU5hbWUoZnVsbF9maWVsZF9uYW1lKQorCisKK2RlZiBCdWlsZEZpbGUoY29udGVudCk6CisgICIiIlJlZ2lzdGVycyBhIG5ldyBwcm90byBmaWxlIGluIHRoZSB1bmRlcmx5aW5nIEMrKyBkZXNjcmlwdG9yIHBvb2wuIiIiCisgIF9uZXRfcHJvdG8yX19fcHl0aG9uLkJ1aWxkRmlsZShjb250ZW50KQorCisKK2RlZiBHZXRFeHRlbnNpb25EZXNjcmlwdG9yKGZ1bGxfZXh0ZW5zaW9uX25hbWUpOgorICAiIiJTZWFyY2hlcyBmb3IgZXh0ZW5zaW9uIGRlc2NyaXB0b3IgZ2l2ZW4gYSBmdWxsIGZpZWxkIG5hbWUuIiIiCisgIHJldHVybiBfcG9vbC5GaW5kRXh0ZW5zaW9uQnlOYW1lKGZ1bGxfZXh0ZW5zaW9uX25hbWUpCisKKworZGVmIE5ld0NNZXNzYWdlKGZ1bGxfbWVzc2FnZV9uYW1lKToKKyAgIiIiQ3JlYXRlcyBhIG5ldyBDKysgcHJvdG9jb2wgbWVzc2FnZSBieSBpdHMgbmFtZS4iIiIKKyAgcmV0dXJuIF9uZXRfcHJvdG8yX19fcHl0aG9uLk5ld0NNZXNzYWdlKGZ1bGxfbWVzc2FnZV9uYW1lKQorCisKK2RlZiBTY2FsYXJQcm9wZXJ0eShjZGVzY3JpcHRvcik6CisgICIiIlJldHVybnMgYSBzY2FsYXIgcHJvcGVydHkgZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yLiIiIgorCisgIGRlZiBHZXR0ZXIoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX2Ntc2cuR2V0U2NhbGFyKGNkZXNjcmlwdG9yKQorCisgIGRlZiBTZXR0ZXIoc2VsZiwgdmFsdWUpOgorICAgIHNlbGYuX2Ntc2cuU2V0U2NhbGFyKGNkZXNjcmlwdG9yLCB2YWx1ZSkKKworICByZXR1cm4gcHJvcGVydHkoR2V0dGVyLCBTZXR0ZXIpCisKKworZGVmIENvbXBvc2l0ZVByb3BlcnR5KGNkZXNjcmlwdG9yLCBtZXNzYWdlX3R5cGUpOgorICAiIiJSZXR1cm5zIGEgUHl0aG9uIHByb3BlcnR5IHRoZSBnaXZlbiBjb21wb3NpdGUgZmllbGQuIiIiCisKKyAgZGVmIEdldHRlcihzZWxmKToKKyAgICBzdWJfbWVzc2FnZSA9IHNlbGYuX2NvbXBvc2l0ZV9maWVsZHMuZ2V0KGNkZXNjcmlwdG9yLm5hbWUsIE5vbmUpCisgICAgaWYgc3ViX21lc3NhZ2UgaXMgTm9uZToKKyAgICAgIGNtZXNzYWdlID0gc2VsZi5fY21zZy5OZXdTdWJNZXNzYWdlKGNkZXNjcmlwdG9yKQorICAgICAgc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3R5cGUuX2NvbmNyZXRlX2NsYXNzKF9fY21lc3NhZ2U9Y21lc3NhZ2UpCisgICAgICBzZWxmLl9jb21wb3NpdGVfZmllbGRzW2NkZXNjcmlwdG9yLm5hbWVdID0gc3ViX21lc3NhZ2UKKyAgICByZXR1cm4gc3ViX21lc3NhZ2UKKworICByZXR1cm4gcHJvcGVydHkoR2V0dGVyKQorCisKK2NsYXNzIFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKG9iamVjdCk6CisgICIiIkNvbnRhaW5lciBmb3IgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcy4iIiIKKworICBfX3Nsb3RzX18gPSBbJ19tZXNzYWdlJywgJ19jZmllbGRfZGVzY3JpcHRvcicsICdfY21zZyddCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgY2ZpZWxkX2Rlc2NyaXB0b3IpOgorICAgIHNlbGYuX21lc3NhZ2UgPSBtc2cKKyAgICBzZWxmLl9jbXNnID0gbXNnLl9jbXNnCisgICAgc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IgPSBjZmllbGRfZGVzY3JpcHRvcgorCisgIGRlZiBhcHBlbmQoc2VsZiwgdmFsdWUpOgorICAgIHNlbGYuX2Ntc2cuQWRkUmVwZWF0ZWRTY2FsYXIoCisgICAgICAgIHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSkKKworICBkZWYgZXh0ZW5kKHNlbGYsIHNlcXVlbmNlKToKKyAgICBmb3IgZWxlbWVudCBpbiBzZXF1ZW5jZToKKyAgICAgIHNlbGYuYXBwZW5kKGVsZW1lbnQpCisKKyAgZGVmIGluc2VydChzZWxmLCBrZXksIHZhbHVlKToKKyAgICB2YWx1ZXMgPSBzZWxmW3NsaWNlKE5vbmUsIE5vbmUsIE5vbmUpXQorICAgIHZhbHVlcy5pbnNlcnQoa2V5LCB2YWx1ZSkKKyAgICBzZWxmLl9jbXNnLkFzc2lnblJlcGVhdGVkU2NhbGFyKHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZXMpCisKKyAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6CisgICAgdmFsdWVzID0gc2VsZltzbGljZShOb25lLCBOb25lLCBOb25lKV0KKyAgICB2YWx1ZXMucmVtb3ZlKHZhbHVlKQorICAgIHNlbGYuX2Ntc2cuQXNzaWduUmVwZWF0ZWRTY2FsYXIoc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlcykKKworICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgdmFsdWVzID0gc2VsZltzbGljZShOb25lLCBOb25lLCBOb25lKV0KKyAgICB2YWx1ZXNba2V5XSA9IHZhbHVlCisgICAgc2VsZi5fY21zZy5Bc3NpZ25SZXBlYXRlZFNjYWxhcihzZWxmLl9jZmllbGRfZGVzY3JpcHRvciwgdmFsdWVzKQorCisgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgIHJldHVybiBzZWxmLl9jbXNnLkdldFJlcGVhdGVkU2NhbGFyKHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCBrZXkpCisKKyAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgc2VsZi5fY21zZy5EZWxldGVSZXBlYXRlZEZpZWxkKHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCBrZXkpCisKKyAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgcmV0dXJuIGxlbihzZWxmW3NsaWNlKE5vbmUsIE5vbmUsIE5vbmUpXSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICBpZiBzZWxmIGlzIG90aGVyOgorICAgICAgcmV0dXJuIFRydWUKKyAgICBpZiBub3Qgb3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUob3RoZXIpOgorICAgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICAgICdDYW4gb25seSBjb21wYXJlIHJlcGVhdGVkIHNjYWxhciBmaWVsZHMgYWdhaW5zdCBzZXF1ZW5jZXMuJykKKyAgICAjIFdlIGFyZSBwcmVzdW1hYmx5IGNvbXBhcmluZyBhZ2FpbnN0IHNvbWUgb3RoZXIgc2VxdWVuY2UgdHlwZS4KKyAgICByZXR1cm4gb3RoZXIgPT0gc2VsZltzbGljZShOb25lLCBOb25lLCBOb25lKV0KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgcmFpc2UgVHlwZUVycm9yKCd1bmhhc2hhYmxlIG9iamVjdCcpCisKKyAgZGVmIHNvcnQoc2VsZiwgc29ydF9mdW5jdGlvbj1jbXApOgorICAgIHZhbHVlcyA9IHNlbGZbc2xpY2UoTm9uZSwgTm9uZSwgTm9uZSldCisgICAgdmFsdWVzLnNvcnQoc29ydF9mdW5jdGlvbikKKyAgICBzZWxmLl9jbXNnLkFzc2lnblJlcGVhdGVkU2NhbGFyKHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZXMpCisKKworZGVmIFJlcGVhdGVkU2NhbGFyUHJvcGVydHkoY2Rlc2NyaXB0b3IpOgorICAiIiJSZXR1cm5zIGEgUHl0aG9uIHByb3BlcnR5IHRoZSBnaXZlbiByZXBlYXRlZCBzY2FsYXIgZmllbGQuIiIiCisKKyAgZGVmIEdldHRlcihzZWxmKToKKyAgICBjb250YWluZXIgPSBzZWxmLl9jb21wb3NpdGVfZmllbGRzLmdldChjZGVzY3JpcHRvci5uYW1lLCBOb25lKQorICAgIGlmIGNvbnRhaW5lciBpcyBOb25lOgorICAgICAgY29udGFpbmVyID0gUmVwZWF0ZWRTY2FsYXJDb250YWluZXIoc2VsZiwgY2Rlc2NyaXB0b3IpCisgICAgICBzZWxmLl9jb21wb3NpdGVfZmllbGRzW2NkZXNjcmlwdG9yLm5hbWVdID0gY29udGFpbmVyCisgICAgcmV0dXJuIGNvbnRhaW5lcgorCisgIGRlZiBTZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKKyAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcignQXNzaWdubWVudCBub3QgYWxsb3dlZCB0byByZXBlYXRlZCBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJyIlcyIgaW4gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3QuJyAlIGNkZXNjcmlwdG9yLm5hbWUpCisKKyAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIGNkZXNjcmlwdG9yLm5hbWUKKyAgcmV0dXJuIHByb3BlcnR5KEdldHRlciwgU2V0dGVyLCBkb2M9ZG9jKQorCisKK2NsYXNzIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKG9iamVjdCk6CisgICIiIkNvbnRhaW5lciBmb3IgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4iIiIKKworICBfX3Nsb3RzX18gPSBbJ19tZXNzYWdlJywgJ19zdWJjbGFzcycsICdfY2ZpZWxkX2Rlc2NyaXB0b3InLCAnX2Ntc2cnXQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIGNmaWVsZF9kZXNjcmlwdG9yLCBzdWJjbGFzcyk6CisgICAgc2VsZi5fbWVzc2FnZSA9IG1zZworICAgIHNlbGYuX2Ntc2cgPSBtc2cuX2Ntc2cKKyAgICBzZWxmLl9zdWJjbGFzcyA9IHN1YmNsYXNzCisgICAgc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IgPSBjZmllbGRfZGVzY3JpcHRvcgorCisgIGRlZiBhZGQoc2VsZiwgKiprd2FyZ3MpOgorICAgIGNtZXNzYWdlID0gc2VsZi5fY21zZy5BZGRNZXNzYWdlKHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yKQorICAgIHJldHVybiBzZWxmLl9zdWJjbGFzcyhfX2NtZXNzYWdlPWNtZXNzYWdlLCBfX293bmVyPXNlbGYuX21lc3NhZ2UsICoqa3dhcmdzKQorCisgIGRlZiBleHRlbmQoc2VsZiwgZWxlbV9zZXEpOgorICAgICIiIkV4dGVuZHMgYnkgYXBwZW5kaW5nIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiBlbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlCisgICAgYXMgdGhpcyBvbmUsIGNvcHlpbmcgZWFjaCBpbmRpdmlkdWFsIG1lc3NhZ2UuCisgICAgIiIiCisgICAgZm9yIG1lc3NhZ2UgaW4gZWxlbV9zZXE6CisgICAgICBzZWxmLmFkZCgpLk1lcmdlRnJvbShtZXNzYWdlKQorCisgIGRlZiBNZXJnZUZyb20oc2VsZiwgb3RoZXIpOgorICAgIGZvciBtZXNzYWdlIGluIG90aGVyWzpdOgorICAgICAgc2VsZi5hZGQoKS5NZXJnZUZyb20obWVzc2FnZSkKKworICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICBjbWVzc2FnZXMgPSBzZWxmLl9jbXNnLkdldFJlcGVhdGVkTWVzc2FnZSgKKyAgICAgICAgc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IsIGtleSkKKyAgICBzdWJjbGFzcyA9IHNlbGYuX3N1YmNsYXNzCisgICAgaWYgbm90IGlzaW5zdGFuY2UoY21lc3NhZ2VzLCBsaXN0KToKKyAgICAgIHJldHVybiBzdWJjbGFzcyhfX2NtZXNzYWdlPWNtZXNzYWdlcywgX19vd25lcj1zZWxmLl9tZXNzYWdlKQorCisgICAgcmV0dXJuIFtzdWJjbGFzcyhfX2NtZXNzYWdlPW0sIF9fb3duZXI9c2VsZi5fbWVzc2FnZSkgZm9yIG0gaW4gY21lc3NhZ2VzXQorCisgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgIHNlbGYuX2Ntc2cuRGVsZXRlUmVwZWF0ZWRGaWVsZCgKKyAgICAgICAgc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IsIGtleSkKKworICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fY21zZy5GaWVsZExlbmd0aChzZWxmLl9jZmllbGRfZGVzY3JpcHRvcikKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAiIiJDb21wYXJlcyB0aGUgY3VycmVudCBpbnN0YW5jZSB3aXRoIGFub3RoZXIgb25lLiIiIgorICAgIGlmIHNlbGYgaXMgb3RoZXI6CisgICAgICByZXR1cm4gVHJ1ZQorICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CisgICAgICByYWlzZSBUeXBlRXJyb3IoJ0NhbiBvbmx5IGNvbXBhcmUgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcyBhZ2FpbnN0ICcKKyAgICAgICAgICAgICAgICAgICAgICAnb3RoZXIgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4nKQorICAgIG1lc3NhZ2VzID0gc2VsZltzbGljZShOb25lLCBOb25lLCBOb25lKV0KKyAgICBvdGhlcl9tZXNzYWdlcyA9IG90aGVyW3NsaWNlKE5vbmUsIE5vbmUsIE5vbmUpXQorICAgIHJldHVybiBtZXNzYWdlcyA9PSBvdGhlcl9tZXNzYWdlcworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICByYWlzZSBUeXBlRXJyb3IoJ3VuaGFzaGFibGUgb2JqZWN0JykKKworICBkZWYgc29ydChzZWxmLCBzb3J0X2Z1bmN0aW9uPWNtcCk6CisgICAgbWVzc2FnZXMgPSBbXQorICAgIGZvciBpbmRleCBpbiByYW5nZShsZW4oc2VsZikpOgorICAgICAgIyBtZXNzYWdlc1tpXVswXSBpcyB3aGVyZSB0aGUgaS10aCBlbGVtZW50IG9mIHRoZSBuZXcgYXJyYXkgaGFzIHRvIGNvbWUKKyAgICAgICMgZnJvbS4KKyAgICAgICMgbWVzc2FnZXNbaV1bMV0gaXMgd2hlcmUgdGhlIGktdGggZWxlbWVudCBvZiB0aGUgb2xkIGFycmF5IGhhcyB0byBnby4KKyAgICAgIG1lc3NhZ2VzLmFwcGVuZChbaW5kZXgsIDAsIHNlbGZbaW5kZXhdXSkKKyAgICBtZXNzYWdlcy5zb3J0KGxhbWJkYSB4LHk6IHNvcnRfZnVuY3Rpb24oeFsyXSwgeVsyXSkpCisKKyAgICAjIFJlbWVtYmVyIHdoaWNoIHBvc2l0aW9uIGVhY2ggZWxlbWVudHMgaGFzIHRvIG1vdmUgdG8uCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKG1lc3NhZ2VzKSk6CisgICAgICBtZXNzYWdlc1ttZXNzYWdlc1tpXVswXV1bMV0gPSBpCisKKyAgICAjIEFwcGx5IHRoZSB0cmFuc3Bvc2l0aW9uLgorICAgIGZvciBpIGluIHJhbmdlKGxlbihtZXNzYWdlcykpOgorICAgICAgZnJvbV9wb3NpdGlvbiA9IG1lc3NhZ2VzW2ldWzBdCisgICAgICBpZiBpID09IGZyb21fcG9zaXRpb246CisgICAgICAgIGNvbnRpbnVlCisgICAgICBzZWxmLl9jbXNnLlN3YXBSZXBlYXRlZEZpZWxkRWxlbWVudHMoCisgICAgICAgICAgc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IsIGksIGZyb21fcG9zaXRpb24pCisgICAgICBtZXNzYWdlc1ttZXNzYWdlc1tpXVsxXV1bMF0gPSBmcm9tX3Bvc2l0aW9uCisKKworZGVmIFJlcGVhdGVkQ29tcG9zaXRlUHJvcGVydHkoY2Rlc2NyaXB0b3IsIG1lc3NhZ2VfdHlwZSk6CisgICIiIlJldHVybnMgYSBQeXRob24gcHJvcGVydHkgZm9yIHRoZSBnaXZlbiByZXBlYXRlZCBjb21wb3NpdGUgZmllbGQuIiIiCisKKyAgZGVmIEdldHRlcihzZWxmKToKKyAgICBjb250YWluZXIgPSBzZWxmLl9jb21wb3NpdGVfZmllbGRzLmdldChjZGVzY3JpcHRvci5uYW1lLCBOb25lKQorICAgIGlmIGNvbnRhaW5lciBpcyBOb25lOgorICAgICAgY29udGFpbmVyID0gUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIoCisgICAgICAgICAgc2VsZiwgY2Rlc2NyaXB0b3IsIG1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MpCisgICAgICBzZWxmLl9jb21wb3NpdGVfZmllbGRzW2NkZXNjcmlwdG9yLm5hbWVdID0gY29udGFpbmVyCisgICAgcmV0dXJuIGNvbnRhaW5lcgorCisgIGRlZiBTZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKKyAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcignQXNzaWdubWVudCBub3QgYWxsb3dlZCB0byByZXBlYXRlZCBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJyIlcyIgaW4gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3QuJyAlIGNkZXNjcmlwdG9yLm5hbWUpCisKKyAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIGNkZXNjcmlwdG9yLm5hbWUKKyAgcmV0dXJuIHByb3BlcnR5KEdldHRlciwgU2V0dGVyLCBkb2M9ZG9jKQorCisKK2NsYXNzIEV4dGVuc2lvbkRpY3Qob2JqZWN0KToKKyAgIiIiRXh0ZW5zaW9uIGRpY3Rpb25hcnkgYWRkZWQgdG8gZWFjaCBwcm90b2NvbCBtZXNzYWdlLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2cpOgorICAgIHNlbGYuX21lc3NhZ2UgPSBtc2cKKyAgICBzZWxmLl9jbXNnID0gbXNnLl9jbXNnCisgICAgc2VsZi5fdmFsdWVzID0ge30KKworICBkZWYgX19zZXRpdGVtX18oc2VsZiwgZXh0ZW5zaW9uLCB2YWx1ZSk6CisgICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKKyAgICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb24sIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKToKKyAgICAgIHJhaXNlIEtleUVycm9yKCdCYWQgZXh0ZW5zaW9uICVyLicgJSAoZXh0ZW5zaW9uLCkpCisgICAgY2Rlc2NyaXB0b3IgPSBleHRlbnNpb24uX2NkZXNjcmlwdG9yCisgICAgaWYgKGNkZXNjcmlwdG9yLmxhYmVsICE9IF9MQUJFTF9PUFRJT05BTCBvcgorICAgICAgICBjZGVzY3JpcHRvci5jcHBfdHlwZSA9PSBfQ1BQVFlQRV9NRVNTQUdFKToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcignRXh0ZW5zaW9uICVyIGlzIHJlcGVhdGVkIGFuZC9vciBhIGNvbXBvc2l0ZSB0eXBlLicgJSAoCisgICAgICAgICAgZXh0ZW5zaW9uLmZ1bGxfbmFtZSwpKQorICAgIHNlbGYuX2Ntc2cuU2V0U2NhbGFyKGNkZXNjcmlwdG9yLCB2YWx1ZSkKKyAgICBzZWxmLl92YWx1ZXNbZXh0ZW5zaW9uXSA9IHZhbHVlCisKKyAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGV4dGVuc2lvbik6CisgICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKKyAgICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb24sIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKToKKyAgICAgIHJhaXNlIEtleUVycm9yKCdCYWQgZXh0ZW5zaW9uICVyLicgJSAoZXh0ZW5zaW9uLCkpCisKKyAgICBjZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5fY2Rlc2NyaXB0b3IKKyAgICBpZiAoY2Rlc2NyaXB0b3IubGFiZWwgIT0gX0xBQkVMX1JFUEVBVEVEIGFuZAorICAgICAgICBjZGVzY3JpcHRvci5jcHBfdHlwZSAhPSBfQ1BQVFlQRV9NRVNTQUdFKToKKyAgICAgIHJldHVybiBzZWxmLl9jbXNnLkdldFNjYWxhcihjZGVzY3JpcHRvcikKKworICAgIGV4dCA9IHNlbGYuX3ZhbHVlcy5nZXQoZXh0ZW5zaW9uLCBOb25lKQorICAgIGlmIGV4dCBpcyBub3QgTm9uZToKKyAgICAgIHJldHVybiBleHQKKworICAgIGV4dCA9IHNlbGYuX0NyZWF0ZU5ld0hhbmRsZShleHRlbnNpb24pCisgICAgc2VsZi5fdmFsdWVzW2V4dGVuc2lvbl0gPSBleHQKKyAgICByZXR1cm4gZXh0CisKKyAgZGVmIENsZWFyRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbik6CisgICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKKyAgICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb24sIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKToKKyAgICAgIHJhaXNlIEtleUVycm9yKCdCYWQgZXh0ZW5zaW9uICVyLicgJSAoZXh0ZW5zaW9uLCkpCisgICAgc2VsZi5fY21zZy5DbGVhckZpZWxkQnlEZXNjcmlwdG9yKGV4dGVuc2lvbi5fY2Rlc2NyaXB0b3IpCisgICAgaWYgZXh0ZW5zaW9uIGluIHNlbGYuX3ZhbHVlczoKKyAgICAgIGRlbCBzZWxmLl92YWx1ZXNbZXh0ZW5zaW9uXQorCisgIGRlZiBIYXNFeHRlbnNpb24oc2VsZiwgZXh0ZW5zaW9uKToKKyAgICBmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgorICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dGVuc2lvbiwgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IpOgorICAgICAgcmFpc2UgS2V5RXJyb3IoJ0JhZCBleHRlbnNpb24gJXIuJyAlIChleHRlbnNpb24sKSkKKyAgICByZXR1cm4gc2VsZi5fY21zZy5IYXNGaWVsZEJ5RGVzY3JpcHRvcihleHRlbnNpb24uX2NkZXNjcmlwdG9yKQorCisgIGRlZiBfRmluZEV4dGVuc2lvbkJ5TmFtZShzZWxmLCBuYW1lKToKKyAgICAiIiJUcmllcyB0byBmaW5kIGEga25vd24gZXh0ZW5zaW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IEV4dGVuc2lvbiBmdWxsIG5hbWUuCisKKyAgICBSZXR1cm5zOgorICAgICAgRXh0ZW5zaW9uIGZpZWxkIGRlc2NyaXB0b3IuCisgICAgIiIiCisgICAgcmV0dXJuIHNlbGYuX21lc3NhZ2UuX2V4dGVuc2lvbnNfYnlfbmFtZS5nZXQobmFtZSwgTm9uZSkKKworICBkZWYgX0NyZWF0ZU5ld0hhbmRsZShzZWxmLCBleHRlbnNpb24pOgorICAgIGNkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLl9jZGVzY3JpcHRvcgorICAgIGlmIChjZGVzY3JpcHRvci5sYWJlbCAhPSBfTEFCRUxfUkVQRUFURUQgYW5kCisgICAgICAgIGNkZXNjcmlwdG9yLmNwcF90eXBlID09IF9DUFBUWVBFX01FU1NBR0UpOgorICAgICAgY21lc3NhZ2UgPSBzZWxmLl9jbXNnLk5ld1N1Yk1lc3NhZ2UoY2Rlc2NyaXB0b3IpCisgICAgICByZXR1cm4gZXh0ZW5zaW9uLm1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoX19jbWVzc2FnZT1jbWVzc2FnZSkKKworICAgIGlmIGNkZXNjcmlwdG9yLmxhYmVsID09IF9MQUJFTF9SRVBFQVRFRDoKKyAgICAgIGlmIGNkZXNjcmlwdG9yLmNwcF90eXBlID09IF9DUFBUWVBFX01FU1NBR0U6CisgICAgICAgIHJldHVybiBSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcigKKyAgICAgICAgICAgIHNlbGYuX21lc3NhZ2UsIGNkZXNjcmlwdG9yLCBleHRlbnNpb24ubWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcykKKyAgICAgIGVsc2U6CisgICAgICAgIHJldHVybiBSZXBlYXRlZFNjYWxhckNvbnRhaW5lcihzZWxmLl9tZXNzYWdlLCBjZGVzY3JpcHRvcikKKyAgICAjIFRoaXMgc2hvdWxkbid0IGhhcHBlbiEKKyAgICBhc3NlcnQgRmFsc2UKKyAgICByZXR1cm4gTm9uZQorCisKK2RlZiBOZXdNZXNzYWdlKG1lc3NhZ2VfZGVzY3JpcHRvciwgZGljdGlvbmFyeSk6CisgICIiIkNyZWF0ZXMgYSBuZXcgcHJvdG9jb2wgbWVzc2FnZSAqY2xhc3MqLiIiIgorICBfQWRkQ2xhc3NBdHRyaWJ1dGVzRm9yTmVzdGVkRXh0ZW5zaW9ucyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGRpY3Rpb25hcnkpCisgIF9BZGRFbnVtVmFsdWVzKG1lc3NhZ2VfZGVzY3JpcHRvciwgZGljdGlvbmFyeSkKKyAgX0FkZERlc2NyaXB0b3JzKG1lc3NhZ2VfZGVzY3JpcHRvciwgZGljdGlvbmFyeSkKKworCitkZWYgSW5pdE1lc3NhZ2UobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJDb25zdHJ1Y3RzIGEgbmV3IG1lc3NhZ2UgaW5zdGFuY2UgKGNhbGxlZCBiZWZvcmUgaW5zdGFuY2UncyBfX2luaXRfXykuIiIiCisgIGNscy5fZXh0ZW5zaW9uc19ieV9uYW1lID0ge30KKyAgX0FkZEluaXRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCisgIF9BZGRNZXNzYWdlTWV0aG9kcyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZFByb3BlcnRpZXNGb3JFeHRlbnNpb25zKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorCisKK2RlZiBfQWRkRGVzY3JpcHRvcnMobWVzc2FnZV9kZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KToKKyAgIiIiU2V0cyB1cCBhIG5ldyBwcm90b2NvbCBtZXNzYWdlIGNsYXNzIGRpY3Rpb25hcnkuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlX2Rlc2NyaXB0b3I6IEEgRGVzY3JpcHRvciBpbnN0YW5jZSBkZXNjcmliaW5nIHRoaXMgbWVzc2FnZSB0eXBlLgorICAgIGRpY3Rpb25hcnk6IENsYXNzIGRpY3Rpb25hcnkgdG8gd2hpY2ggd2UnbGwgYWRkIGEgJ19fc2xvdHNfXycgZW50cnkuCisgICIiIgorICBkaWN0aW9uYXJ5WydfX2Rlc2NyaXB0b3JzJ10gPSB7fQorICBmb3IgZmllbGQgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkczoKKyAgICBkaWN0aW9uYXJ5WydfX2Rlc2NyaXB0b3JzJ11bZmllbGQubmFtZV0gPSBHZXRGaWVsZERlc2NyaXB0b3IoCisgICAgICAgIGZpZWxkLmZ1bGxfbmFtZSkKKworICBkaWN0aW9uYXJ5WydfX3Nsb3RzX18nXSA9IGxpc3QoZGljdGlvbmFyeVsnX19kZXNjcmlwdG9ycyddLml0ZXJrZXlzKCkpICsgWworICAgICAgJ19jbXNnJywgJ19vd25lcicsICdfY29tcG9zaXRlX2ZpZWxkcycsICdFeHRlbnNpb25zJ10KKworCitkZWYgX0FkZEVudW1WYWx1ZXMobWVzc2FnZV9kZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KToKKyAgIiIiU2V0cyBjbGFzcy1sZXZlbCBhdHRyaWJ1dGVzIGZvciBhbGwgZW51bSBmaWVsZHMgZGVmaW5lZCBpbiB0aGlzIG1lc3NhZ2UuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlX2Rlc2NyaXB0b3I6IERlc2NyaXB0b3Igb2JqZWN0IGZvciB0aGlzIG1lc3NhZ2UgdHlwZS4KKyAgICBkaWN0aW9uYXJ5OiBDbGFzcyBkaWN0aW9uYXJ5IHRoYXQgc2hvdWxkIGJlIHBvcHVsYXRlZC4KKyAgIiIiCisgIGZvciBlbnVtX3R5cGUgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLmVudW1fdHlwZXM6CisgICAgZm9yIGVudW1fdmFsdWUgaW4gZW51bV90eXBlLnZhbHVlczoKKyAgICAgIGRpY3Rpb25hcnlbZW51bV92YWx1ZS5uYW1lXSA9IGVudW1fdmFsdWUubnVtYmVyCisKKworZGVmIF9BZGRDbGFzc0F0dHJpYnV0ZXNGb3JOZXN0ZWRFeHRlbnNpb25zKG1lc3NhZ2VfZGVzY3JpcHRvciwgZGljdGlvbmFyeSk6CisgICIiIkFkZHMgY2xhc3MgYXR0cmlidXRlcyBmb3IgdGhlIG5lc3RlZCBleHRlbnNpb25zLiIiIgorICBleHRlbnNpb25fZGljdCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5leHRlbnNpb25zX2J5X25hbWUKKyAgZm9yIGV4dGVuc2lvbl9uYW1lLCBleHRlbnNpb25fZmllbGQgaW4gZXh0ZW5zaW9uX2RpY3QuaXRlcml0ZW1zKCk6CisgICAgYXNzZXJ0IGV4dGVuc2lvbl9uYW1lIG5vdCBpbiBkaWN0aW9uYXJ5CisgICAgZGljdGlvbmFyeVtleHRlbnNpb25fbmFtZV0gPSBleHRlbnNpb25fZmllbGQKKworCitkZWYgX0FkZEluaXRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJBZGRzIGFuIF9faW5pdF9fIG1ldGhvZCB0byBjbHMuIiIiCisKKyAgIyBDcmVhdGUgYW5kIGF0dGFjaCBtZXNzYWdlIGZpZWxkIHByb3BlcnRpZXMgdG8gdGhlIG1lc3NhZ2UgY2xhc3MuCisgICMgVGhpcyBjYW4gYmUgZG9uZSBqdXN0IG9uY2UgcGVyIG1lc3NhZ2UgY2xhc3MsIHNpbmNlIHByb3BlcnR5IHNldHRlcnMgYW5kCisgICMgZ2V0dGVycyBhcmUgcGFzc2VkIHRoZSBtZXNzYWdlIGluc3RhbmNlLgorICAjIFRoaXMgbWFrZXMgbWVzc2FnZSBpbnN0YW50aWF0aW9uIGV4dHJlbWVseSBmYXN0LCBhbmQgYXQgdGhlIHNhbWUgdGltZSBpdAorICAjIGRvZXNuJ3QgcmVxdWlyZSB0aGUgY3JlYXRpb24gb2YgcHJvcGVydHkgb2JqZWN0cyBmb3IgZWFjaCBtZXNzYWdlIGluc3RhbmNlLAorICAjIHdoaWNoIHNhdmVzIGEgbG90IG9mIG1lbW9yeS4KKyAgZm9yIGZpZWxkIGluIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHM6CisgICAgZmllbGRfY2Rlc2NyaXB0b3IgPSBjbHMuX19kZXNjcmlwdG9yc1tmaWVsZC5uYW1lXQorICAgIGlmIGZpZWxkLmxhYmVsID09IF9MQUJFTF9SRVBFQVRFRDoKKyAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IF9DUFBUWVBFX01FU1NBR0U6CisgICAgICAgIHZhbHVlID0gUmVwZWF0ZWRDb21wb3NpdGVQcm9wZXJ0eShmaWVsZF9jZGVzY3JpcHRvciwgZmllbGQubWVzc2FnZV90eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgdmFsdWUgPSBSZXBlYXRlZFNjYWxhclByb3BlcnR5KGZpZWxkX2NkZXNjcmlwdG9yKQorICAgIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gX0NQUFRZUEVfTUVTU0FHRToKKyAgICAgIHZhbHVlID0gQ29tcG9zaXRlUHJvcGVydHkoZmllbGRfY2Rlc2NyaXB0b3IsIGZpZWxkLm1lc3NhZ2VfdHlwZSkKKyAgICBlbHNlOgorICAgICAgdmFsdWUgPSBTY2FsYXJQcm9wZXJ0eShmaWVsZF9jZGVzY3JpcHRvcikKKyAgICBzZXRhdHRyKGNscywgZmllbGQubmFtZSwgdmFsdWUpCisKKyAgICAjIEF0dGFjaCBhIGNvbnN0YW50IHdpdGggdGhlIGZpZWxkIG51bWJlci4KKyAgICBjb25zdGFudF9uYW1lID0gZmllbGQubmFtZS51cHBlcigpICsgJ19GSUVMRF9OVU1CRVInCisgICAgc2V0YXR0cihjbHMsIGNvbnN0YW50X25hbWUsIGZpZWxkLm51bWJlcikKKworICBkZWYgSW5pdChzZWxmLCAqKmt3YXJncyk6CisgICAgIiIiTWVzc2FnZSBjb25zdHJ1Y3Rvci4iIiIKKyAgICBjbWVzc2FnZSA9IGt3YXJncy5wb3AoJ19fY21lc3NhZ2UnLCBOb25lKQorICAgIGlmIGNtZXNzYWdlIGlzIE5vbmU6CisgICAgICBzZWxmLl9jbXNnID0gTmV3Q01lc3NhZ2UobWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSkKKyAgICBlbHNlOgorICAgICAgc2VsZi5fY21zZyA9IGNtZXNzYWdlCisKKyAgICAjIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG93bmVyLCBhcyB0aGUgb3duZXIga2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlCisgICAgIyB1bmRlcmx5aW5nIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlLgorICAgIG93bmVyID0ga3dhcmdzLnBvcCgnX19vd25lcicsIE5vbmUpCisgICAgaWYgb3duZXIgaXMgbm90IE5vbmU6CisgICAgICBzZWxmLl9vd25lciA9IG93bmVyCisKKyAgICBzZWxmLkV4dGVuc2lvbnMgPSBFeHRlbnNpb25EaWN0KHNlbGYpCisgICAgc2VsZi5fY29tcG9zaXRlX2ZpZWxkcyA9IHt9CisKKyAgICBmb3IgZmllbGRfbmFtZSwgZmllbGRfdmFsdWUgaW4ga3dhcmdzLml0ZXJpdGVtcygpOgorICAgICAgZmllbGRfY2Rlc2NyaXB0b3IgPSBzZWxmLl9fZGVzY3JpcHRvcnMuZ2V0KGZpZWxkX25hbWUsIE5vbmUpCisgICAgICBpZiBmaWVsZF9jZGVzY3JpcHRvciBpcyBOb25lOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdQcm90b2NvbCBtZXNzYWdlIGhhcyBubyAiJXMiIGZpZWxkLicgJSBmaWVsZF9uYW1lKQorICAgICAgaWYgZmllbGRfY2Rlc2NyaXB0b3IubGFiZWwgPT0gX0xBQkVMX1JFUEVBVEVEOgorICAgICAgICBpZiBmaWVsZF9jZGVzY3JpcHRvci5jcHBfdHlwZSA9PSBfQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAgIGZvciB2YWwgaW4gZmllbGRfdmFsdWU6CisgICAgICAgICAgICBnZXRhdHRyKHNlbGYsIGZpZWxkX25hbWUpLmFkZCgpLk1lcmdlRnJvbSh2YWwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgZ2V0YXR0cihzZWxmLCBmaWVsZF9uYW1lKS5leHRlbmQoZmllbGRfdmFsdWUpCisgICAgICBlbGlmIGZpZWxkX2NkZXNjcmlwdG9yLmNwcF90eXBlID09IF9DUFBUWVBFX01FU1NBR0U6CisgICAgICAgIGdldGF0dHIoc2VsZiwgZmllbGRfbmFtZSkuTWVyZ2VGcm9tKGZpZWxkX3ZhbHVlKQorICAgICAgZWxzZToKKyAgICAgICAgc2V0YXR0cihzZWxmLCBmaWVsZF9uYW1lLCBmaWVsZF92YWx1ZSkKKworICBJbml0Ll9fbW9kdWxlX18gPSBOb25lCisgIEluaXQuX19kb2NfXyA9IE5vbmUKKyAgY2xzLl9faW5pdF9fID0gSW5pdAorCisKK2RlZiBfSXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpZWxkKToKKyAgIiIiQ2hlY2tzIGlmIGEgZmllbGQgaXMgYSBtZXNzYWdlIHNldCBleHRlbnNpb24uIiIiCisgIHJldHVybiAoZmllbGQuaXNfZXh0ZW5zaW9uIGFuZAorICAgICAgICAgIGZpZWxkLmNvbnRhaW5pbmdfdHlwZS5oYXNfb3B0aW9ucyBhbmQKKyAgICAgICAgICBmaWVsZC5jb250YWluaW5nX3R5cGUuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IGFuZAorICAgICAgICAgIGZpZWxkLnR5cGUgPT0gX1RZUEVfTUVTU0FHRSBhbmQKKyAgICAgICAgICBmaWVsZC5tZXNzYWdlX3R5cGUgPT0gZmllbGQuZXh0ZW5zaW9uX3Njb3BlIGFuZAorICAgICAgICAgIGZpZWxkLmxhYmVsID09IF9MQUJFTF9PUFRJT05BTCkKKworCitkZWYgX0FkZE1lc3NhZ2VNZXRob2RzKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiQWRkcyB0aGUgbWV0aG9kcyB0byBhIHByb3RvY29sIG1lc3NhZ2UgY2xhc3MuIiIiCisgIGlmIG1lc3NhZ2VfZGVzY3JpcHRvci5pc19leHRlbmRhYmxlOgorCisgICAgZGVmIENsZWFyRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbik6CisgICAgICBzZWxmLkV4dGVuc2lvbnMuQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQorCisgICAgZGVmIEhhc0V4dGVuc2lvbihzZWxmLCBleHRlbnNpb24pOgorICAgICAgcmV0dXJuIHNlbGYuRXh0ZW5zaW9ucy5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKQorCisgIGRlZiBIYXNGaWVsZChzZWxmLCBmaWVsZF9uYW1lKToKKyAgICByZXR1cm4gc2VsZi5fY21zZy5IYXNGaWVsZChmaWVsZF9uYW1lKQorCisgIGRlZiBDbGVhckZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgorICAgIGlmIGZpZWxkX25hbWUgaW4gc2VsZi5fY29tcG9zaXRlX2ZpZWxkczoKKyAgICAgIGRlbCBzZWxmLl9jb21wb3NpdGVfZmllbGRzW2ZpZWxkX25hbWVdCisgICAgc2VsZi5fY21zZy5DbGVhckZpZWxkKGZpZWxkX25hbWUpCisKKyAgZGVmIENsZWFyKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9jbXNnLkNsZWFyKCkKKworICBkZWYgSXNJbml0aWFsaXplZChzZWxmLCBlcnJvcnM9Tm9uZSk6CisgICAgaWYgc2VsZi5fY21zZy5Jc0luaXRpYWxpemVkKCk6CisgICAgICByZXR1cm4gVHJ1ZQorICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKKyAgICAgIGVycm9ycy5leHRlbmQoc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSk7CisgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIFNlcmlhbGl6ZVRvU3RyaW5nKHNlbGYpOgorICAgIGlmIG5vdCBzZWxmLklzSW5pdGlhbGl6ZWQoKToKKyAgICAgIHJhaXNlIG1lc3NhZ2UuRW5jb2RlRXJyb3IoCisgICAgICAgICAgJ01lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICcgKworICAgICAgICAgICcsJy5qb2luKHNlbGYuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpKQorICAgIHJldHVybiBzZWxmLl9jbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICBkZWYgU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9jbXNnLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCisKKyAgZGVmIFBhcnNlRnJvbVN0cmluZyhzZWxmLCBzZXJpYWxpemVkKToKKyAgICBzZWxmLkNsZWFyKCkKKyAgICBzZWxmLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorCisgIGRlZiBNZXJnZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6CisgICAgYnl0ZV9zaXplID0gc2VsZi5fY21zZy5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBpZiBieXRlX3NpemUgPCAwOgorICAgICAgcmFpc2UgbWVzc2FnZS5EZWNvZGVFcnJvcignVW5hYmxlIHRvIG1lcmdlIGZyb20gc3RyaW5nLicpCisgICAgcmV0dXJuIGJ5dGVfc2l6ZQorCisgIGRlZiBNZXJnZUZyb20oc2VsZiwgbXNnKToKKyAgICBpZiBub3QgaXNpbnN0YW5jZShtc2csIGNscyk6CisgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgIlBhcmFtZXRlciB0byBNZXJnZUZyb20oKSBtdXN0IGJlIGluc3RhbmNlIG9mIHNhbWUgY2xhc3MuIikKKyAgICBzZWxmLl9jbXNnLk1lcmdlRnJvbShtc2cuX2Ntc2cpCisKKyAgZGVmIENvcHlGcm9tKHNlbGYsIG1zZyk6CisgICAgc2VsZi5fY21zZy5Db3B5RnJvbShtc2cuX2Ntc2cpCisKKyAgZGVmIEJ5dGVTaXplKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9jbXNnLkJ5dGVTaXplKCkKKworICBkZWYgU2V0SW5QYXJlbnQoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX2Ntc2cuU2V0SW5QYXJlbnQoKQorCisgIGRlZiBMaXN0RmllbGRzKHNlbGYpOgorICAgIGFsbF9maWVsZHMgPSBbXQorICAgIGZpZWxkX2xpc3QgPSBzZWxmLl9jbXNnLkxpc3RGaWVsZHMoKQorICAgIGZpZWxkc19ieV9uYW1lID0gY2xzLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWUKKyAgICBmb3IgaXNfZXh0ZW5zaW9uLCBmaWVsZF9uYW1lIGluIGZpZWxkX2xpc3Q6CisgICAgICBpZiBpc19leHRlbnNpb246CisgICAgICAgIGV4dGVuc2lvbiA9IGNscy5fZXh0ZW5zaW9uc19ieV9uYW1lW2ZpZWxkX25hbWVdCisgICAgICAgIGFsbF9maWVsZHMuYXBwZW5kKChleHRlbnNpb24sIHNlbGYuRXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKKyAgICAgIGVsc2U6CisgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IgPSBmaWVsZHNfYnlfbmFtZVtmaWVsZF9uYW1lXQorICAgICAgICBhbGxfZmllbGRzLmFwcGVuZCgKKyAgICAgICAgICAgIChmaWVsZF9kZXNjcmlwdG9yLCBnZXRhdHRyKHNlbGYsIGZpZWxkX25hbWUpKSkKKyAgICBhbGxfZmllbGRzLnNvcnQoa2V5PWxhbWJkYSBpdGVtOiBpdGVtWzBdLm51bWJlcikKKyAgICByZXR1cm4gYWxsX2ZpZWxkcworCisgIGRlZiBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX2Ntc2cuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkKKworICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fY21zZy5EZWJ1Z1N0cmluZygpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgaWYgc2VsZiBpcyBvdGhlcjoKKyAgICAgIHJldHVybiBUcnVlCisgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBzZWxmLkxpc3RGaWVsZHMoKSA9PSBvdGhlci5MaXN0RmllbGRzKCkKKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgcmFpc2UgVHlwZUVycm9yKCd1bmhhc2hhYmxlIG9iamVjdCcpCisKKyAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgIHJldHVybiB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoc2VsZiwgYXNfdXRmOD1UcnVlKS5kZWNvZGUoJ3V0Zi04JykKKworICAjIEF0dGFjaCB0aGUgbG9jYWwgbWV0aG9kcyB0byB0aGUgbWVzc2FnZSBjbGFzcy4KKyAgZm9yIGtleSwgdmFsdWUgaW4gbG9jYWxzKCkuY29weSgpLml0ZXJpdGVtcygpOgorICAgIGlmIGtleSBub3QgaW4gKCdrZXknLCAndmFsdWUnLCAnX19idWlsdGluc19fJywgJ19fbmFtZV9fJywgJ19fZG9jX18nKToKKyAgICAgIHNldGF0dHIoY2xzLCBrZXksIHZhbHVlKQorCisgICMgU3RhdGljIG1ldGhvZHM6CisKKyAgZGVmIFJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbl9oYW5kbGUpOgorICAgIGV4dGVuc2lvbl9oYW5kbGUuY29udGFpbmluZ190eXBlID0gY2xzLkRFU0NSSVBUT1IKKyAgICBjbHMuX2V4dGVuc2lvbnNfYnlfbmFtZVtleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZV0gPSBleHRlbnNpb25faGFuZGxlCisKKyAgICBpZiBfSXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGV4dGVuc2lvbl9oYW5kbGUpOgorICAgICAgIyBNZXNzYWdlU2V0IGV4dGVuc2lvbi4gIEFsc28gcmVnaXN0ZXIgdW5kZXIgdHlwZSBuYW1lLgorICAgICAgY2xzLl9leHRlbnNpb25zX2J5X25hbWVbCisgICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZS5tZXNzYWdlX3R5cGUuZnVsbF9uYW1lXSA9IGV4dGVuc2lvbl9oYW5kbGUKKyAgY2xzLlJlZ2lzdGVyRXh0ZW5zaW9uID0gc3RhdGljbWV0aG9kKFJlZ2lzdGVyRXh0ZW5zaW9uKQorCisgIGRlZiBGcm9tU3RyaW5nKHN0cmluZyk6CisgICAgbXNnID0gY2xzKCkKKyAgICBtc2cuTWVyZ2VGcm9tU3RyaW5nKHN0cmluZykKKyAgICByZXR1cm4gbXNnCisgIGNscy5Gcm9tU3RyaW5nID0gc3RhdGljbWV0aG9kKEZyb21TdHJpbmcpCisKKworCitkZWYgX0FkZFByb3BlcnRpZXNGb3JFeHRlbnNpb25zKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiQWRkcyBwcm9wZXJ0aWVzIGZvciBhbGwgZmllbGRzIGluIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLiIiIgorICBleHRlbnNpb25fZGljdCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5leHRlbnNpb25zX2J5X25hbWUKKyAgZm9yIGV4dGVuc2lvbl9uYW1lLCBleHRlbnNpb25fZmllbGQgaW4gZXh0ZW5zaW9uX2RpY3QuaXRlcml0ZW1zKCk6CisgICAgY29uc3RhbnRfbmFtZSA9IGV4dGVuc2lvbl9uYW1lLnVwcGVyKCkgKyAnX0ZJRUxEX05VTUJFUicKKyAgICBzZXRhdHRyKGNscywgY29uc3RhbnRfbmFtZSwgZXh0ZW5zaW9uX2ZpZWxkLm51bWJlcikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2RlY29kZXIucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZWNvZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU1Zjc0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZWNvZGVyLnB5CkBAIC0wLDAgKzEsNzE0IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiQ29kZSBmb3IgZGVjb2RpbmcgcHJvdG9jb2wgYnVmZmVyIHByaW1pdGl2ZXMuCisKK1RoaXMgY29kZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gZW5jb2Rlci5weSAtLSByZWFkIHRoZSBkb2NzIGZvciB0aGF0IG1vZHVsZSBmaXJzdC4KKworQSAiZGVjb2RlciIgaXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBzaWduYXR1cmU6CisgIERlY29kZShidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KQorVGhlIGFyZ3VtZW50cyBhcmU6CisgIGJ1ZmZlcjogICAgIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZW5jb2RlZCBtZXNzYWdlLgorICBwb3M6ICAgICAgICBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLgorICBlbmQ6ICAgICAgICBUaGUgcG9zaXRpb24gaW4gdGhlIHN0cmluZyB3aGVyZSB0aGUgY3VycmVudCBtZXNzYWdlIGVuZHMuICBNYXkgYmUKKyAgICAgICAgICAgICAgbGVzcyB0aGFuIGxlbihidWZmZXIpIGlmIHdlJ3JlIHJlYWRpbmcgYSBzdWItbWVzc2FnZS4KKyAgbWVzc2FnZTogICAgVGhlIG1lc3NhZ2Ugb2JqZWN0IGludG8gd2hpY2ggd2UncmUgcGFyc2luZy4KKyAgZmllbGRfZGljdDogbWVzc2FnZS5fZmllbGRzIChhdm9pZHMgYSBoYXNodGFibGUgbG9va3VwKS4KK1RoZSBkZWNvZGVyIHJlYWRzIHRoZSBmaWVsZCBhbmQgc3RvcmVzIGl0IGludG8gZmllbGRfZGljdCwgcmV0dXJuaW5nIHRoZSBuZXcKK2J1ZmZlciBwb3NpdGlvbi4gIEEgZGVjb2RlciBmb3IgYSByZXBlYXRlZCBmaWVsZCBtYXkgcHJvYWN0aXZlbHkgZGVjb2RlIGFsbCBvZgordGhlIGVsZW1lbnRzIG9mIHRoYXQgZmllbGQsIGlmIHRoZXkgYXBwZWFyIGNvbnNlY3V0aXZlbHkuCisKK05vdGUgdGhhdCBkZWNvZGVycyBtYXkgdGhyb3cgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisgIEluZGV4RXJyb3I6ICBJbmRpY2F0ZXMgYSB0cnVuY2F0ZWQgbWVzc2FnZS4KKyAgc3RydWN0LmVycm9yOiAgVW5wYWNraW5nIG9mIGEgZml4ZWQtd2lkdGggZmllbGQgZmFpbGVkLgorICBtZXNzYWdlLkRlY29kZUVycm9yOiAgT3RoZXIgZXJyb3JzLgorCitEZWNvZGVycyBhcmUgZXhwZWN0ZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIGNhbGxlZCB3aXRoIHBvcyA+IGVuZC4KK1RoaXMgYWxsb3dzIGNhbGxlcnMgdG8gYmUgbGF4IGFib3V0IGJvdW5kcyBjaGVja2luZzogIGl0J3MgZmluZXRvIHJlYWQgcGFzdAorImVuZCIgYXMgbG9uZyBhcyB5b3UgYXJlIHN1cmUgdGhhdCBzb21lb25lIGVsc2Ugd2lsbCBub3RpY2UgYW5kIHRocm93IGFuCitleGNlcHRpb24gbGF0ZXIgb24uCisKK1NvbWV0aGluZyB1cCB0aGUgY2FsbCBzdGFjayBpcyBleHBlY3RlZCB0byBjYXRjaCBJbmRleEVycm9yIGFuZCBzdHJ1Y3QuZXJyb3IKK2FuZCBjb252ZXJ0IHRoZW0gdG8gbWVzc2FnZS5EZWNvZGVFcnJvci4KKworRGVjb2RlcnMgYXJlIGNvbnN0cnVjdGVkIHVzaW5nIGRlY29kZXIgY29uc3RydWN0b3JzIHdpdGggdGhlIHNpZ25hdHVyZToKKyAgTWFrZURlY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLCBrZXksIG5ld19kZWZhdWx0KQorVGhlIGFyZ3VtZW50cyBhcmU6CisgIGZpZWxkX251bWJlcjogIFRoZSBmaWVsZCBudW1iZXIgb2YgdGhlIGZpZWxkIHdlIHdhbnQgdG8gZGVjb2RlLgorICBpc19yZXBlYXRlZDogICBJcyB0aGUgZmllbGQgYSByZXBlYXRlZCBmaWVsZD8gKGJvb2wpCisgIGlzX3BhY2tlZDogICAgIElzIHRoZSBmaWVsZCBhIHBhY2tlZCBmaWVsZD8gKGJvb2wpCisgIGtleTogICAgICAgICAgIFRoZSBrZXkgdG8gdXNlIHdoZW4gbG9va2luZyB1cCB0aGUgZmllbGQgd2l0aGluIGZpZWxkX2RpY3QuCisgICAgICAgICAgICAgICAgIChUaGlzIGlzIGFjdHVhbGx5IHRoZSBGaWVsZERlc2NyaXB0b3IgYnV0IG5vdGhpbmcgaW4gdGhpcworICAgICAgICAgICAgICAgICBmaWxlIHNob3VsZCBkZXBlbmQgb24gdGhhdC4pCisgIG5ld19kZWZhdWx0OiAgIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBtZXNzYWdlIG9iamVjdCBhcyBhIHBhcmFtZXRlciBhbmQKKyAgICAgICAgICAgICAgICAgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICAgICAgICAgKFRoaXMgaXMgY2FsbGVkIGZvciByZXBlYXRlZCBmaWVsZHMgYW5kIHN1Yi1tZXNzYWdlcywgd2hlbiBhbgorICAgICAgICAgICAgICAgICBpbnN0YW5jZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LikKKworQXMgd2l0aCBlbmNvZGVycywgd2UgZGVmaW5lIGEgZGVjb2RlciBjb25zdHJ1Y3RvciBmb3IgZXZlcnkgdHlwZSBvZiBmaWVsZC4KK1RoZW4sIGZvciBldmVyeSBmaWVsZCBvZiBldmVyeSBtZXNzYWdlIGNsYXNzIHdlIGNvbnN0cnVjdCBhbiBhY3R1YWwgZGVjb2Rlci4KK1RoYXQgZGVjb2RlciBnb2VzIGludG8gYSBkaWN0IGluZGV4ZWQgYnkgdGFnLCBzbyB3aGVuIHdlIGRlY29kZSBhIG1lc3NhZ2UKK3dlIHJlcGVhdGVkbHkgcmVhZCBhIHRhZywgbG9vayB1cCB0aGUgY29ycmVzcG9uZGluZyBkZWNvZGVyLCBhbmQgaW52b2tlIGl0LgorIiIiCisKK19fYXV0aG9yX18gPSAna2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSknCisKK2ltcG9ydCBzdHJ1Y3QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbmNvZGVyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCisKKworIyBUaGlzIHdpbGwgb3ZlcmZsb3cgYW5kIHRodXMgYmVjb21lIElFRUUtNzU0ICJpbmZpbml0eSIuICBXZSB3b3VsZCB1c2UKKyMgImZsb2F0KCdpbmYnKSIgYnV0IGl0IGRvZXNuJ3Qgd29yayBvbiBXaW5kb3dzIHByZS1QeXRob24tMi42LgorX1BPU19JTkYgPSAxZTEwMDAwCitfTkVHX0lORiA9IC1fUE9TX0lORgorX05BTiA9IF9QT1NfSU5GICogMAorCisKKyMgVGhpcyBpcyBub3QgZm9yIG9wdGltaXphdGlvbiwgYnV0IHJhdGhlciB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBsb2NhbAorIyB2YXJpYWJsZXMgbmFtZWQgIm1lc3NhZ2UiLgorX0RlY29kZUVycm9yID0gbWVzc2FnZS5EZWNvZGVFcnJvcgorCisKK2RlZiBfVmFyaW50RGVjb2RlcihtYXNrKToKKyAgIiIiUmV0dXJuIGFuIGVuY29kZXIgZm9yIGEgYmFzaWMgdmFyaW50IHZhbHVlIChkb2VzIG5vdCBpbmNsdWRlIHRhZykuCisKKyAgRGVjb2RlZCB2YWx1ZXMgd2lsbCBiZSBiaXR3aXNlLWFuZGVkIHdpdGggdGhlIGdpdmVuIG1hc2sgYmVmb3JlIGJlaW5nCisgIHJldHVybmVkLCBlLmcuIHRvIGxpbWl0IHRoZW0gdG8gMzIgYml0cy4gIFRoZSByZXR1cm5lZCBkZWNvZGVyIGRvZXMgbm90CisgIHRha2UgdGhlIHVzdWFsICJlbmQiIHBhcmFtZXRlciAtLSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGRvIGJvdW5kcyBjaGVja2luZworICBhZnRlciB0aGUgZmFjdCAob2Z0ZW4gdGhlIGNhbGxlciBjYW4gZGVmZXIgc3VjaCBjaGVja2luZyB1bnRpbCBsYXRlcikuICBUaGUKKyAgZGVjb2RlciByZXR1cm5zIGEgKHZhbHVlLCBuZXdfcG9zKSBwYWlyLgorICAiIiIKKworICBsb2NhbF9vcmQgPSBvcmQKKyAgZGVmIERlY29kZVZhcmludChidWZmZXIsIHBvcyk6CisgICAgcmVzdWx0ID0gMAorICAgIHNoaWZ0ID0gMAorICAgIHdoaWxlIDE6CisgICAgICBiID0gbG9jYWxfb3JkKGJ1ZmZlcltwb3NdKQorICAgICAgcmVzdWx0IHw9ICgoYiAmIDB4N2YpIDw8IHNoaWZ0KQorICAgICAgcG9zICs9IDEKKyAgICAgIGlmIG5vdCAoYiAmIDB4ODApOgorICAgICAgICByZXN1bHQgJj0gbWFzaworICAgICAgICByZXR1cm4gKHJlc3VsdCwgcG9zKQorICAgICAgc2hpZnQgKz0gNworICAgICAgaWYgc2hpZnQgPj0gNjQ6CisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVG9vIG1hbnkgYnl0ZXMgd2hlbiBkZWNvZGluZyB2YXJpbnQuJykKKyAgcmV0dXJuIERlY29kZVZhcmludAorCisKK2RlZiBfU2lnbmVkVmFyaW50RGVjb2RlcihtYXNrKToKKyAgIiIiTGlrZSBfVmFyaW50RGVjb2RlcigpIGJ1dCBkZWNvZGVzIHNpZ25lZCB2YWx1ZXMuIiIiCisKKyAgbG9jYWxfb3JkID0gb3JkCisgIGRlZiBEZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpOgorICAgIHJlc3VsdCA9IDAKKyAgICBzaGlmdCA9IDAKKyAgICB3aGlsZSAxOgorICAgICAgYiA9IGxvY2FsX29yZChidWZmZXJbcG9zXSkKKyAgICAgIHJlc3VsdCB8PSAoKGIgJiAweDdmKSA8PCBzaGlmdCkKKyAgICAgIHBvcyArPSAxCisgICAgICBpZiBub3QgKGIgJiAweDgwKToKKyAgICAgICAgaWYgcmVzdWx0ID4gMHg3ZmZmZmZmZmZmZmZmZmZmOgorICAgICAgICAgIHJlc3VsdCAtPSAoMSA8PCA2NCkKKyAgICAgICAgICByZXN1bHQgfD0gfm1hc2sKKyAgICAgICAgZWxzZToKKyAgICAgICAgICByZXN1bHQgJj0gbWFzaworICAgICAgICByZXR1cm4gKHJlc3VsdCwgcG9zKQorICAgICAgc2hpZnQgKz0gNworICAgICAgaWYgc2hpZnQgPj0gNjQ6CisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVG9vIG1hbnkgYnl0ZXMgd2hlbiBkZWNvZGluZyB2YXJpbnQuJykKKyAgcmV0dXJuIERlY29kZVZhcmludAorCisKK19EZWNvZGVWYXJpbnQgPSBfVmFyaW50RGVjb2RlcigoMSA8PCA2NCkgLSAxKQorX0RlY29kZVNpZ25lZFZhcmludCA9IF9TaWduZWRWYXJpbnREZWNvZGVyKCgxIDw8IDY0KSAtIDEpCisKKyMgVXNlIHRoZXNlIHZlcnNpb25zIGZvciB2YWx1ZXMgd2hpY2ggbXVzdCBiZSBsaW1pdGVkIHRvIDMyIGJpdHMuCitfRGVjb2RlVmFyaW50MzIgPSBfVmFyaW50RGVjb2RlcigoMSA8PCAzMikgLSAxKQorX0RlY29kZVNpZ25lZFZhcmludDMyID0gX1NpZ25lZFZhcmludERlY29kZXIoKDEgPDwgMzIpIC0gMSkKKworCitkZWYgUmVhZFRhZyhidWZmZXIsIHBvcyk6CisgICIiIlJlYWQgYSB0YWcgZnJvbSB0aGUgYnVmZmVyLCBhbmQgcmV0dXJuIGEgKHRhZ19ieXRlcywgbmV3X3BvcykgdHVwbGUuCisKKyAgV2UgcmV0dXJuIHRoZSByYXcgYnl0ZXMgb2YgdGhlIHRhZyByYXRoZXIgdGhhbiBkZWNvZGluZyB0aGVtLiAgVGhlIHJhdworICBieXRlcyBjYW4gdGhlbiBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIHByb3BlciBkZWNvZGVyLiAgVGhpcyBlZmZlY3RpdmVseSBhbGxvd3MKKyAgdXMgdG8gdHJhZGUgc29tZSB3b3JrIHRoYXQgd291bGQgYmUgZG9uZSBpbiBwdXJlLXB5dGhvbiAoZGVjb2RpbmcgYSB2YXJpbnQpCisgIGZvciB3b3JrIHRoYXQgaXMgZG9uZSBpbiBDIChzZWFyY2hpbmcgZm9yIGEgYnl0ZSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlKS4KKyAgSW4gYSBsb3ctbGV2ZWwgbGFuZ3VhZ2UgaXQgd291bGQgYmUgbXVjaCBjaGVhcGVyIHRvIGRlY29kZSB0aGUgdmFyaW50IGFuZAorICB1c2UgdGhhdCwgYnV0IG5vdCBpbiBQeXRob24uCisgICIiIgorCisgIHN0YXJ0ID0gcG9zCisgIHdoaWxlIG9yZChidWZmZXJbcG9zXSkgJiAweDgwOgorICAgIHBvcyArPSAxCisgIHBvcyArPSAxCisgIHJldHVybiAoYnVmZmVyW3N0YXJ0OnBvc10sIHBvcykKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworZGVmIF9TaW1wbGVEZWNvZGVyKHdpcmVfdHlwZSwgZGVjb2RlX3ZhbHVlKToKKyAgIiIiUmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGEgZGVjb2RlciBmb3IgZmllbGRzIG9mIGEgcGFydGljdWxhciB0eXBlLgorCisgIEFyZ3M6CisgICAgICB3aXJlX3R5cGU6ICBUaGUgZmllbGQncyB3aXJlIHR5cGUuCisgICAgICBkZWNvZGVfdmFsdWU6ICBBIGZ1bmN0aW9uIHdoaWNoIGRlY29kZXMgYW4gaW5kaXZpZHVhbCB2YWx1ZSwgZS5nLgorICAgICAgICBfRGVjb2RlVmFyaW50KCkKKyAgIiIiCisKKyAgZGVmIFNwZWNpZmljRGVjb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsIGtleSwgbmV3X2RlZmF1bHQpOgorICAgIGlmIGlzX3BhY2tlZDoKKyAgICAgIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKKyAgICAgIGRlZiBEZWNvZGVQYWNrZWRGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCisgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKKyAgICAgICAgKGVuZHBvaW50LCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgICBlbmRwb2ludCArPSBwb3MKKyAgICAgICAgaWYgZW5kcG9pbnQgPiBlbmQ6CisgICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICAgICAgICB3aGlsZSBwb3MgPCBlbmRwb2ludDoKKyAgICAgICAgICAoZWxlbWVudCwgcG9zKSA9IGRlY29kZV92YWx1ZShidWZmZXIsIHBvcykKKyAgICAgICAgICB2YWx1ZS5hcHBlbmQoZWxlbWVudCkKKyAgICAgICAgaWYgcG9zID4gZW5kcG9pbnQ6CisgICAgICAgICAgZGVsIHZhbHVlWy0xXSAgICMgRGlzY2FyZCBjb3JydXB0IHZhbHVlLgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignUGFja2VkIGVsZW1lbnQgd2FzIHRydW5jYXRlZC4nKQorICAgICAgICByZXR1cm4gcG9zCisgICAgICByZXR1cm4gRGVjb2RlUGFja2VkRmllbGQKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKKyAgICAgIHRhZ19sZW4gPSBsZW4odGFnX2J5dGVzKQorICAgICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQorICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgKGVsZW1lbnQsIG5ld19wb3MpID0gZGVjb2RlX3ZhbHVlKGJ1ZmZlciwgcG9zKQorICAgICAgICAgIHZhbHVlLmFwcGVuZChlbGVtZW50KQorICAgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQKKyAgICAgICAgICAjIGZpZWxkLgorICAgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICAgICAgaWYgYnVmZmVyW25ld19wb3M6cG9zXSAhPSB0YWdfYnl0ZXMgb3IgbmV3X3BvcyA+PSBlbmQ6CisgICAgICAgICAgICAjIFByZWRpY3Rpb24gZmFpbGVkLiAgUmV0dXJuLgorICAgICAgICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKKyAgICAgICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICAgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICAgIHJldHVybiBEZWNvZGVSZXBlYXRlZEZpZWxkCisgICAgZWxzZToKKyAgICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgICAgKGZpZWxkX2RpY3Rba2V5XSwgcG9zKSA9IGRlY29kZV92YWx1ZShidWZmZXIsIHBvcykKKyAgICAgICAgaWYgcG9zID4gZW5kOgorICAgICAgICAgIGRlbCBmaWVsZF9kaWN0W2tleV0gICMgRGlzY2FyZCBjb3JydXB0IHZhbHVlLgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKyAgICAgICAgcmV0dXJuIHBvcworICAgICAgcmV0dXJuIERlY29kZUZpZWxkCisKKyAgcmV0dXJuIFNwZWNpZmljRGVjb2RlcgorCisKK2RlZiBfTW9kaWZpZWREZWNvZGVyKHdpcmVfdHlwZSwgZGVjb2RlX3ZhbHVlLCBtb2RpZnlfdmFsdWUpOgorICAiIiJMaWtlIFNpbXBsZURlY29kZXIgYnV0IGFkZGl0aW9uYWxseSBpbnZva2VzIG1vZGlmeV92YWx1ZSBvbiBldmVyeSB2YWx1ZQorICBiZWZvcmUgc3RvcmluZyBpdC4gIFVzdWFsbHkgbW9kaWZ5X3ZhbHVlIGlzIFppZ1phZ0RlY29kZS4KKyAgIiIiCisKKyAgIyBSZXVzaW5nIF9TaW1wbGVEZWNvZGVyIGlzIHNsaWdodGx5IHNsb3dlciB0aGFuIGNvcHlpbmcgYSBidW5jaCBvZiBjb2RlLCBidXQKKyAgIyBub3QgZW5vdWdoIHRvIG1ha2UgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlLgorCisgIGRlZiBJbm5lckRlY29kZShidWZmZXIsIHBvcyk6CisgICAgKHJlc3VsdCwgbmV3X3BvcykgPSBkZWNvZGVfdmFsdWUoYnVmZmVyLCBwb3MpCisgICAgcmV0dXJuIChtb2RpZnlfdmFsdWUocmVzdWx0KSwgbmV3X3BvcykKKyAgcmV0dXJuIF9TaW1wbGVEZWNvZGVyKHdpcmVfdHlwZSwgSW5uZXJEZWNvZGUpCisKKworZGVmIF9TdHJ1Y3RQYWNrRGVjb2Rlcih3aXJlX3R5cGUsIGZvcm1hdCk6CisgICIiIlJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhIGRlY29kZXIgZm9yIGEgZml4ZWQtd2lkdGggZmllbGQuCisKKyAgQXJnczoKKyAgICAgIHdpcmVfdHlwZTogIFRoZSBmaWVsZCdzIHdpcmUgdHlwZS4KKyAgICAgIGZvcm1hdDogIFRoZSBmb3JtYXQgc3RyaW5nIHRvIHBhc3MgdG8gc3RydWN0LnVucGFjaygpLgorICAiIiIKKworICB2YWx1ZV9zaXplID0gc3RydWN0LmNhbGNzaXplKGZvcm1hdCkKKyAgbG9jYWxfdW5wYWNrID0gc3RydWN0LnVucGFjaworCisgICMgUmV1c2luZyBfU2ltcGxlRGVjb2RlciBpcyBzbGlnaHRseSBzbG93ZXIgdGhhbiBjb3B5aW5nIGEgYnVuY2ggb2YgY29kZSwgYnV0CisgICMgbm90IGVub3VnaCB0byBtYWtlIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4KKworICAjIE5vdGUgdGhhdCB3ZSBleHBlY3Qgc29tZW9uZSB1cC1zdGFjayB0byBjYXRjaCBzdHJ1Y3QuZXJyb3IgYW5kIGNvbnZlcnQKKyAgIyBpdCB0byBfRGVjb2RlRXJyb3IgLS0gdGhpcyB3YXkgd2UgZG9uJ3QgaGF2ZSB0byBzZXQgdXAgZXhjZXB0aW9uLQorICAjIGhhbmRsaW5nIGJsb2NrcyBldmVyeSB0aW1lIHdlIHBhcnNlIG9uZSB2YWx1ZS4KKworICBkZWYgSW5uZXJEZWNvZGUoYnVmZmVyLCBwb3MpOgorICAgIG5ld19wb3MgPSBwb3MgKyB2YWx1ZV9zaXplCisgICAgcmVzdWx0ID0gbG9jYWxfdW5wYWNrKGZvcm1hdCwgYnVmZmVyW3BvczpuZXdfcG9zXSlbMF0KKyAgICByZXR1cm4gKHJlc3VsdCwgbmV3X3BvcykKKyAgcmV0dXJuIF9TaW1wbGVEZWNvZGVyKHdpcmVfdHlwZSwgSW5uZXJEZWNvZGUpCisKKworZGVmIF9GbG9hdERlY29kZXIoKToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgZmxvYXQgZmllbGQuCisKKyAgVGhpcyBjb2RlIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiBzdHJ1Y3QudW5wYWNrIGZvciBub24tZmluaXRlIDMyLWJpdAorICBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisgICIiIgorCisgIGxvY2FsX3VucGFjayA9IHN0cnVjdC51bnBhY2sKKworICBkZWYgSW5uZXJEZWNvZGUoYnVmZmVyLCBwb3MpOgorICAgICMgV2UgZXhwZWN0IGEgMzItYml0IHZhbHVlIGluIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci4gIEJpdCAxIGlzIHRoZSBzaWduCisgICAgIyBiaXQsIGJpdHMgMi05IHJlcHJlc2VudCB0aGUgZXhwb25lbnQsIGFuZCBiaXRzIDEwLTMyIGFyZSB0aGUgc2lnbmlmaWNhbmQuCisgICAgbmV3X3BvcyA9IHBvcyArIDQKKyAgICBmbG9hdF9ieXRlcyA9IGJ1ZmZlcltwb3M6bmV3X3Bvc10KKworICAgICMgSWYgdGhpcyB2YWx1ZSBoYXMgYWxsIGl0cyBleHBvbmVudCBiaXRzIHNldCwgdGhlbiBpdCdzIG5vbi1maW5pdGUuCisgICAgIyBJbiBQeXRob24gMi40LCBzdHJ1Y3QudW5wYWNrIHdpbGwgY29udmVydCBpdCB0byBhIGZpbml0ZSA2NC1iaXQgdmFsdWUuCisgICAgIyBUbyBhdm9pZCB0aGF0LCB3ZSBwYXJzZSBpdCBzcGVjaWFsbHkuCisgICAgaWYgKChmbG9hdF9ieXRlc1szXSBpbiAnXHg3Rlx4RkYnKQorICAgICAgICBhbmQgKGZsb2F0X2J5dGVzWzJdID49ICdceDgwJykpOgorICAgICAgIyBJZiBhdCBsZWFzdCBvbmUgc2lnbmlmaWNhbmQgYml0IGlzIHNldC4uLgorICAgICAgaWYgZmxvYXRfYnl0ZXNbMDozXSAhPSAnXHgwMFx4MDBceDgwJzoKKyAgICAgICAgcmV0dXJuIChfTkFOLCBuZXdfcG9zKQorICAgICAgIyBJZiBzaWduIGJpdCBpcyBzZXQuLi4KKyAgICAgIGlmIGZsb2F0X2J5dGVzWzNdID09ICdceEZGJzoKKyAgICAgICAgcmV0dXJuIChfTkVHX0lORiwgbmV3X3BvcykKKyAgICAgIHJldHVybiAoX1BPU19JTkYsIG5ld19wb3MpCisKKyAgICAjIE5vdGUgdGhhdCB3ZSBleHBlY3Qgc29tZW9uZSB1cC1zdGFjayB0byBjYXRjaCBzdHJ1Y3QuZXJyb3IgYW5kIGNvbnZlcnQKKyAgICAjIGl0IHRvIF9EZWNvZGVFcnJvciAtLSB0aGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHNldCB1cCBleGNlcHRpb24tCisgICAgIyBoYW5kbGluZyBibG9ja3MgZXZlcnkgdGltZSB3ZSBwYXJzZSBvbmUgdmFsdWUuCisgICAgcmVzdWx0ID0gbG9jYWxfdW5wYWNrKCc8ZicsIGZsb2F0X2J5dGVzKVswXQorICAgIHJldHVybiAocmVzdWx0LCBuZXdfcG9zKQorICByZXR1cm4gX1NpbXBsZURlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwgSW5uZXJEZWNvZGUpCisKKworZGVmIF9Eb3VibGVEZWNvZGVyKCk6CisgICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIGRvdWJsZSBmaWVsZC4KKworICBUaGlzIGNvZGUgd29ya3MgYXJvdW5kIGEgYnVnIGluIHN0cnVjdC51bnBhY2sgZm9yIG5vdC1hLW51bWJlci4KKyAgIiIiCisKKyAgbG9jYWxfdW5wYWNrID0gc3RydWN0LnVucGFjaworCisgIGRlZiBJbm5lckRlY29kZShidWZmZXIsIHBvcyk6CisgICAgIyBXZSBleHBlY3QgYSA2NC1iaXQgdmFsdWUgaW4gbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyLiAgQml0IDEgaXMgdGhlIHNpZ24KKyAgICAjIGJpdCwgYml0cyAyLTEyIHJlcHJlc2VudCB0aGUgZXhwb25lbnQsIGFuZCBiaXRzIDEzLTY0IGFyZSB0aGUgc2lnbmlmaWNhbmQuCisgICAgbmV3X3BvcyA9IHBvcyArIDgKKyAgICBkb3VibGVfYnl0ZXMgPSBidWZmZXJbcG9zOm5ld19wb3NdCisKKyAgICAjIElmIHRoaXMgdmFsdWUgaGFzIGFsbCBpdHMgZXhwb25lbnQgYml0cyBzZXQgYW5kIGF0IGxlYXN0IG9uZSBzaWduaWZpY2FuZAorICAgICMgYml0IHNldCwgaXQncyBub3QgYSBudW1iZXIuICBJbiBQeXRob24gMi40LCBzdHJ1Y3QudW5wYWNrIHdpbGwgdHJlYXQgaXQKKyAgICAjIGFzIGluZiBvciAtaW5mLiAgVG8gYXZvaWQgdGhhdCwgd2UgdHJlYXQgaXQgc3BlY2lhbGx5LgorICAgIGlmICgoZG91YmxlX2J5dGVzWzddIGluICdceDdGXHhGRicpCisgICAgICAgIGFuZCAoZG91YmxlX2J5dGVzWzZdID49ICdceEYwJykKKyAgICAgICAgYW5kIChkb3VibGVfYnl0ZXNbMDo3XSAhPSAnXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMCcpKToKKyAgICAgIHJldHVybiAoX05BTiwgbmV3X3BvcykKKworICAgICMgTm90ZSB0aGF0IHdlIGV4cGVjdCBzb21lb25lIHVwLXN0YWNrIHRvIGNhdGNoIHN0cnVjdC5lcnJvciBhbmQgY29udmVydAorICAgICMgaXQgdG8gX0RlY29kZUVycm9yIC0tIHRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gc2V0IHVwIGV4Y2VwdGlvbi0KKyAgICAjIGhhbmRsaW5nIGJsb2NrcyBldmVyeSB0aW1lIHdlIHBhcnNlIG9uZSB2YWx1ZS4KKyAgICByZXN1bHQgPSBsb2NhbF91bnBhY2soJzxkJywgZG91YmxlX2J5dGVzKVswXQorICAgIHJldHVybiAocmVzdWx0LCBuZXdfcG9zKQorICByZXR1cm4gX1NpbXBsZURlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwgSW5uZXJEZWNvZGUpCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0ludDMyRGVjb2RlciA9IEVudW1EZWNvZGVyID0gX1NpbXBsZURlY29kZXIoCisgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRGVjb2RlU2lnbmVkVmFyaW50MzIpCisKK0ludDY0RGVjb2RlciA9IF9TaW1wbGVEZWNvZGVyKAorICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVNpZ25lZFZhcmludCkKKworVUludDMyRGVjb2RlciA9IF9TaW1wbGVEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVZhcmludDMyKQorVUludDY0RGVjb2RlciA9IF9TaW1wbGVEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVZhcmludCkKKworU0ludDMyRGVjb2RlciA9IF9Nb2RpZmllZERlY29kZXIoCisgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRGVjb2RlVmFyaW50MzIsIHdpcmVfZm9ybWF0LlppZ1phZ0RlY29kZSkKK1NJbnQ2NERlY29kZXIgPSBfTW9kaWZpZWREZWNvZGVyKAorICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVZhcmludCwgd2lyZV9mb3JtYXQuWmlnWmFnRGVjb2RlKQorCisjIE5vdGUgdGhhdCBQeXRob24gY29udmVuaWVudGx5IGd1YXJhbnRlZXMgdGhhdCB3aGVuIHVzaW5nIHRoZSAnPCcgcHJlZml4IG9uCisjIGZvcm1hdHMsIHRoZXkgd2lsbCBhbHNvIGhhdmUgdGhlIHNhbWUgc2l6ZSBhY3Jvc3MgYWxsIHBsYXRmb3JtcyAoYXMgb3Bwb3NlZAorIyB0byB3aXRob3V0IHRoZSBwcmVmaXgsIHdoZXJlIHRoZWlyIHNpemVzIGRlcGVuZCBvbiB0aGUgQyBjb21waWxlcidzIGJhc2ljCisjIHR5cGUgc2l6ZXMpLgorRml4ZWQzMkRlY29kZXIgID0gX1N0cnVjdFBhY2tEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsICc8SScpCitGaXhlZDY0RGVjb2RlciAgPSBfU3RydWN0UGFja0RlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwgJzxRJykKK1NGaXhlZDMyRGVjb2RlciA9IF9TdHJ1Y3RQYWNrRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLCAnPGknKQorU0ZpeGVkNjREZWNvZGVyID0gX1N0cnVjdFBhY2tEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsICc8cScpCitGbG9hdERlY29kZXIgPSBfRmxvYXREZWNvZGVyKCkKK0RvdWJsZURlY29kZXIgPSBfRG91YmxlRGVjb2RlcigpCisKK0Jvb2xEZWNvZGVyID0gX01vZGlmaWVkRGVjb2RlcigKKyAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVWYXJpbnQsIGJvb2wpCisKKworZGVmIFN0cmluZ0RlY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLCBrZXksIG5ld19kZWZhdWx0KToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgc3RyaW5nIGZpZWxkLiIiIgorCisgIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKKyAgbG9jYWxfdW5pY29kZSA9IHVuaWNvZGUKKworICBhc3NlcnQgbm90IGlzX3BhY2tlZAorICBpZiBpc19yZXBlYXRlZDoKKyAgICB0YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgICAgdGFnX2xlbiA9IGxlbih0YWdfYnl0ZXMpCisgICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICB3aGlsZSAxOgorICAgICAgICAoc2l6ZSwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKKyAgICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKKyAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBzdHJpbmcuJykKKyAgICAgICAgdmFsdWUuYXBwZW5kKGxvY2FsX3VuaWNvZGUoYnVmZmVyW3BvczpuZXdfcG9zXSwgJ3V0Zi04JykpCisgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQuCisgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPT0gZW5kOgorICAgICAgICAgICMgUHJlZGljdGlvbiBmYWlsZWQuICBSZXR1cm4uCisgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKKyAgICAgIGlmIG5ld19wb3MgPiBlbmQ6CisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIHN0cmluZy4nKQorICAgICAgZmllbGRfZGljdFtrZXldID0gbG9jYWxfdW5pY29kZShidWZmZXJbcG9zOm5ld19wb3NdLCAndXRmLTgnKQorICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlRmllbGQKKworCitkZWYgQnl0ZXNEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCk6CisgICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIGJ5dGVzIGZpZWxkLiIiIgorCisgIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKKworICBhc3NlcnQgbm90IGlzX3BhY2tlZAorICBpZiBpc19yZXBlYXRlZDoKKyAgICB0YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgICAgdGFnX2xlbiA9IGxlbih0YWdfYnl0ZXMpCisgICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICB3aGlsZSAxOgorICAgICAgICAoc2l6ZSwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKKyAgICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKKyAgICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKKyAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBzdHJpbmcuJykKKyAgICAgICAgdmFsdWUuYXBwZW5kKGJ1ZmZlcltwb3M6bmV3X3Bvc10pCisgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQuCisgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPT0gZW5kOgorICAgICAgICAgICMgUHJlZGljdGlvbiBmYWlsZWQuICBSZXR1cm4uCisgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKKyAgICAgIGlmIG5ld19wb3MgPiBlbmQ6CisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIHN0cmluZy4nKQorICAgICAgZmllbGRfZGljdFtrZXldID0gYnVmZmVyW3BvczpuZXdfcG9zXQorICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlRmllbGQKKworCitkZWYgR3JvdXBEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCk6CisgICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIGdyb3VwIGZpZWxkLiIiIgorCisgIGVuZF90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKQorICBlbmRfdGFnX2xlbiA9IGxlbihlbmRfdGFnX2J5dGVzKQorCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApCisgICAgdGFnX2xlbiA9IGxlbih0YWdfYnl0ZXMpCisgICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICB3aGlsZSAxOgorICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQorICAgICAgICAjIFJlYWQgc3ViLW1lc3NhZ2UuCisgICAgICAgIHBvcyA9IHZhbHVlLmFkZCgpLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgcG9zLCBlbmQpCisgICAgICAgICMgUmVhZCBlbmQgdGFnLgorICAgICAgICBuZXdfcG9zID0gcG9zK2VuZF90YWdfbGVuCisgICAgICAgIGlmIGJ1ZmZlcltwb3M6bmV3X3Bvc10gIT0gZW5kX3RhZ19ieXRlcyBvciBuZXdfcG9zID4gZW5kOgorICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWlzc2luZyBncm91cCBlbmQgdGFnLicpCisgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQuCisgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCisgICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPT0gZW5kOgorICAgICAgICAgICMgUHJlZGljdGlvbiBmYWlsZWQuICBSZXR1cm4uCisgICAgICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKKyAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQorICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKKyAgICAgICMgUmVhZCBzdWItbWVzc2FnZS4KKyAgICAgIHBvcyA9IHZhbHVlLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgcG9zLCBlbmQpCisgICAgICAjIFJlYWQgZW5kIHRhZy4KKyAgICAgIG5ld19wb3MgPSBwb3MrZW5kX3RhZ19sZW4KKyAgICAgIGlmIGJ1ZmZlcltwb3M6bmV3X3Bvc10gIT0gZW5kX3RhZ19ieXRlcyBvciBuZXdfcG9zID4gZW5kOgorICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ01pc3NpbmcgZ3JvdXAgZW5kIHRhZy4nKQorICAgICAgcmV0dXJuIG5ld19wb3MKKyAgICByZXR1cm4gRGVjb2RlRmllbGQKKworCitkZWYgTWVzc2FnZURlY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLCBrZXksIG5ld19kZWZhdWx0KToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgbWVzc2FnZSBmaWVsZC4iIiIKKworICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50CisKKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQorICAgIHRhZ19sZW4gPSBsZW4odGFnX2J5dGVzKQorICAgIGRlZiBEZWNvZGVSZXBlYXRlZEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgorICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCisgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQorICAgICAgd2hpbGUgMToKKyAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCisgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKKyAgICAgICAgIyBSZWFkIGxlbmd0aC4KKyAgICAgICAgKHNpemUsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCisgICAgICAgIG5ld19wb3MgPSBwb3MgKyBzaXplCisgICAgICAgIGlmIG5ld19wb3MgPiBlbmQ6CisgICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICAgICAgICAjIFJlYWQgc3ViLW1lc3NhZ2UuCisgICAgICAgIGlmIHZhbHVlLmFkZCgpLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgcG9zLCBuZXdfcG9zKSAhPSBuZXdfcG9zOgorICAgICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdAorICAgICAgICAgICMgZW5jb3VudGVyZWQgYW4gZW5kLWdyb3VwIHRhZy4KKyAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kLWdyb3VwIHRhZy4nKQorICAgICAgICAjIFByZWRpY3QgdGhhdCB0aGUgbmV4dCB0YWcgaXMgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHJlcGVhdGVkIGZpZWxkLgorICAgICAgICBwb3MgPSBuZXdfcG9zICsgdGFnX2xlbgorICAgICAgICBpZiBidWZmZXJbbmV3X3Bvczpwb3NdICE9IHRhZ19ieXRlcyBvciBuZXdfcG9zID09IGVuZDoKKyAgICAgICAgICAjIFByZWRpY3Rpb24gZmFpbGVkLiAgUmV0dXJuLgorICAgICAgICAgIHJldHVybiBuZXdfcG9zCisgICAgcmV0dXJuIERlY29kZVJlcGVhdGVkRmllbGQKKyAgZWxzZToKKyAgICBkZWYgRGVjb2RlRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCisgICAgICAjIFJlYWQgbGVuZ3RoLgorICAgICAgKHNpemUsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCisgICAgICBuZXdfcG9zID0gcG9zICsgc2l6ZQorICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKKyAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICAgICAgIyBSZWFkIHN1Yi1tZXNzYWdlLgorICAgICAgaWYgdmFsdWUuX0ludGVybmFsUGFyc2UoYnVmZmVyLCBwb3MsIG5ld19wb3MpICE9IG5ld19wb3M6CisgICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdCBlbmNvdW50ZXJlZAorICAgICAgICAjIGFuIGVuZC1ncm91cCB0YWcuCisgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVW5leHBlY3RlZCBlbmQtZ3JvdXAgdGFnLicpCisgICAgICByZXR1cm4gbmV3X3BvcworICAgIHJldHVybiBEZWNvZGVGaWVsZAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTUVTU0FHRV9TRVRfSVRFTV9UQUcgPSBlbmNvZGVyLlRhZ0J5dGVzKDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKQorCitkZWYgTWVzc2FnZVNldEl0ZW1EZWNvZGVyKGV4dGVuc2lvbnNfYnlfbnVtYmVyKToKKyAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgTWVzc2FnZVNldCBpdGVtLgorCisgIFRoZSBwYXJhbWV0ZXIgaXMgdGhlIF9leHRlbnNpb25zX2J5X251bWJlciBtYXAgZm9yIHRoZSBtZXNzYWdlIGNsYXNzLgorCisgIFRoZSBtZXNzYWdlIHNldCBtZXNzYWdlIGxvb2tzIGxpa2UgdGhpczoKKyAgICBtZXNzYWdlIE1lc3NhZ2VTZXQgeworICAgICAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgeworICAgICAgICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKKyAgICAgICAgcmVxdWlyZWQgc3RyaW5nIG1lc3NhZ2UgPSAzOworICAgICAgfQorICAgIH0KKyAgIiIiCisKKyAgdHlwZV9pZF90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKDIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKKyAgbWVzc2FnZV90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKDMsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgIGl0ZW1fZW5kX3RhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoMSwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKQorCisgIGxvY2FsX1JlYWRUYWcgPSBSZWFkVGFnCisgIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKKyAgbG9jYWxfU2tpcEZpZWxkID0gU2tpcEZpZWxkCisKKyAgZGVmIERlY29kZUl0ZW0oYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6CisgICAgdHlwZV9pZCA9IC0xCisgICAgbWVzc2FnZV9zdGFydCA9IC0xCisgICAgbWVzc2FnZV9lbmQgPSAtMQorCisgICAgIyBUZWNobmljYWxseSwgdHlwZV9pZCBhbmQgbWVzc2FnZSBjYW4gYXBwZWFyIGluIGFueSBvcmRlciwgc28gd2UgbmVlZAorICAgICMgYSBsaXR0bGUgbG9vcCBoZXJlLgorICAgIHdoaWxlIDE6CisgICAgICAodGFnX2J5dGVzLCBwb3MpID0gbG9jYWxfUmVhZFRhZyhidWZmZXIsIHBvcykKKyAgICAgIGlmIHRhZ19ieXRlcyA9PSB0eXBlX2lkX3RhZ19ieXRlczoKKyAgICAgICAgKHR5cGVfaWQsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCisgICAgICBlbGlmIHRhZ19ieXRlcyA9PSBtZXNzYWdlX3RhZ19ieXRlczoKKyAgICAgICAgKHNpemUsIG1lc3NhZ2Vfc3RhcnQpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICAgICAgICBwb3MgPSBtZXNzYWdlX2VuZCA9IG1lc3NhZ2Vfc3RhcnQgKyBzaXplCisgICAgICBlbGlmIHRhZ19ieXRlcyA9PSBpdGVtX2VuZF90YWdfYnl0ZXM6CisgICAgICAgIGJyZWFrCisgICAgICBlbHNlOgorICAgICAgICBwb3MgPSBTa2lwRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgdGFnX2J5dGVzKQorICAgICAgICBpZiBwb3MgPT0gLTE6CisgICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdNaXNzaW5nIGdyb3VwIGVuZCB0YWcuJykKKworICAgIGlmIHBvcyA+IGVuZDoKKyAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKworICAgIGlmIHR5cGVfaWQgPT0gLTE6CisgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ01lc3NhZ2VTZXQgaXRlbSBtaXNzaW5nIHR5cGVfaWQuJykKKyAgICBpZiBtZXNzYWdlX3N0YXJ0ID09IC0xOgorICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdNZXNzYWdlU2V0IGl0ZW0gbWlzc2luZyBtZXNzYWdlLicpCisKKyAgICBleHRlbnNpb24gPSBleHRlbnNpb25zX2J5X251bWJlci5nZXQodHlwZV9pZCkKKyAgICBpZiBleHRlbnNpb24gaXMgbm90IE5vbmU6CisgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGV4dGVuc2lvbikKKyAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KAorICAgICAgICAgICAgZXh0ZW5zaW9uLCBleHRlbnNpb24ubWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcygpKQorICAgICAgaWYgdmFsdWUuX0ludGVybmFsUGFyc2UoYnVmZmVyLCBtZXNzYWdlX3N0YXJ0LG1lc3NhZ2VfZW5kKSAhPSBtZXNzYWdlX2VuZDoKKyAgICAgICAgIyBUaGUgb25seSByZWFzb24gX0ludGVybmFsUGFyc2Ugd291bGQgcmV0dXJuIGVhcmx5IGlzIGlmIGl0IGVuY291bnRlcmVkCisgICAgICAgICMgYW4gZW5kLWdyb3VwIHRhZy4KKyAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdVbmV4cGVjdGVkIGVuZC1ncm91cCB0YWcuJykKKworICAgIHJldHVybiBwb3MKKworICByZXR1cm4gRGVjb2RlSXRlbQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9wdGltaXphdGlvbiBpcyBub3QgYXMgaGVhdnkgaGVyZSBiZWNhdXNlIGNhbGxzIHRvIFNraXBGaWVsZCgpIGFyZSByYXJlLAorIyBleGNlcHQgZm9yIGhhbmRsaW5nIGVuZC1ncm91cCB0YWdzLgorCitkZWYgX1NraXBWYXJpbnQoYnVmZmVyLCBwb3MsIGVuZCk6CisgICIiIlNraXAgYSB2YXJpbnQgdmFsdWUuICBSZXR1cm5zIHRoZSBuZXcgcG9zaXRpb24uIiIiCisKKyAgd2hpbGUgb3JkKGJ1ZmZlcltwb3NdKSAmIDB4ODA6CisgICAgcG9zICs9IDEKKyAgcG9zICs9IDEKKyAgaWYgcG9zID4gZW5kOgorICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKyAgcmV0dXJuIHBvcworCitkZWYgX1NraXBGaXhlZDY0KGJ1ZmZlciwgcG9zLCBlbmQpOgorICAiIiJTa2lwIGEgZml4ZWQ2NCB2YWx1ZS4gIFJldHVybnMgdGhlIG5ldyBwb3NpdGlvbi4iIiIKKworICBwb3MgKz0gOAorICBpZiBwb3MgPiBlbmQ6CisgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICByZXR1cm4gcG9zCisKK2RlZiBfU2tpcExlbmd0aERlbGltaXRlZChidWZmZXIsIHBvcywgZW5kKToKKyAgIiIiU2tpcCBhIGxlbmd0aC1kZWxpbWl0ZWQgdmFsdWUuICBSZXR1cm5zIHRoZSBuZXcgcG9zaXRpb24uIiIiCisKKyAgKHNpemUsIHBvcykgPSBfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQorICBwb3MgKz0gc2l6ZQorICBpZiBwb3MgPiBlbmQ6CisgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQorICByZXR1cm4gcG9zCisKK2RlZiBfU2tpcEdyb3VwKGJ1ZmZlciwgcG9zLCBlbmQpOgorICAiIiJTa2lwIHN1Yi1ncm91cC4gIFJldHVybnMgdGhlIG5ldyBwb3NpdGlvbi4iIiIKKworICB3aGlsZSAxOgorICAgICh0YWdfYnl0ZXMsIHBvcykgPSBSZWFkVGFnKGJ1ZmZlciwgcG9zKQorICAgIG5ld19wb3MgPSBTa2lwRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgdGFnX2J5dGVzKQorICAgIGlmIG5ld19wb3MgPT0gLTE6CisgICAgICByZXR1cm4gcG9zCisgICAgcG9zID0gbmV3X3BvcworCitkZWYgX0VuZEdyb3VwKGJ1ZmZlciwgcG9zLCBlbmQpOgorICAiIiJTa2lwcGluZyBhbiBFTkRfR1JPVVAgdGFnIHJldHVybnMgLTEgdG8gdGVsbCB0aGUgcGFyZW50IGxvb3AgdG8gYnJlYWsuIiIiCisKKyAgcmV0dXJuIC0xCisKK2RlZiBfU2tpcEZpeGVkMzIoYnVmZmVyLCBwb3MsIGVuZCk6CisgICIiIlNraXAgYSBmaXhlZDMyIHZhbHVlLiAgUmV0dXJucyB0aGUgbmV3IHBvc2l0aW9uLiIiIgorCisgIHBvcyArPSA0CisgIGlmIHBvcyA+IGVuZDoKKyAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCisgIHJldHVybiBwb3MKKworZGVmIF9SYWlzZUludmFsaWRXaXJlVHlwZShidWZmZXIsIHBvcywgZW5kKToKKyAgIiIiU2tpcCBmdW5jdGlvbiBmb3IgdW5rbm93biB3aXJlIHR5cGVzLiAgUmFpc2VzIGFuIGV4Y2VwdGlvbi4iIiIKKworICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RhZyBoYWQgaW52YWxpZCB3aXJlIHR5cGUuJykKKworZGVmIF9GaWVsZFNraXBwZXIoKToKKyAgIiIiQ29uc3RydWN0cyB0aGUgU2tpcEZpZWxkIGZ1bmN0aW9uLiIiIgorCisgIFdJUkVUWVBFX1RPX1NLSVBQRVIgPSBbCisgICAgICBfU2tpcFZhcmludCwKKyAgICAgIF9Ta2lwRml4ZWQ2NCwKKyAgICAgIF9Ta2lwTGVuZ3RoRGVsaW1pdGVkLAorICAgICAgX1NraXBHcm91cCwKKyAgICAgIF9FbmRHcm91cCwKKyAgICAgIF9Ta2lwRml4ZWQzMiwKKyAgICAgIF9SYWlzZUludmFsaWRXaXJlVHlwZSwKKyAgICAgIF9SYWlzZUludmFsaWRXaXJlVHlwZSwKKyAgICAgIF0KKworICB3aXJldHlwZV9tYXNrID0gd2lyZV9mb3JtYXQuVEFHX1RZUEVfTUFTSworICBsb2NhbF9vcmQgPSBvcmQKKworICBkZWYgU2tpcEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIHRhZ19ieXRlcyk6CisgICAgIiIiU2tpcHMgYSBmaWVsZCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnLgorCisgICAgfHBvc3wgc2hvdWxkIHBvaW50IHRvIHRoZSBieXRlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0YWcuCisKKyAgICBSZXR1cm5zOgorICAgICAgICBUaGUgbmV3IHBvc2l0aW9uIChhZnRlciB0aGUgdGFnIHZhbHVlKSwgb3IgLTEgaWYgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAKKyAgICAgICAgdGFnIChpbiB3aGljaCBjYXNlIHRoZSBjYWxsaW5nIGxvb3Agc2hvdWxkIGJyZWFrKS4KKyAgICAiIiIKKworICAgICMgVGhlIHdpcmUgdHlwZSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IGJ5dGUgc2luY2UgdmFyaW50cyBhcmUgbGl0dGxlLWVuZGlhbi4KKyAgICB3aXJlX3R5cGUgPSBsb2NhbF9vcmQodGFnX2J5dGVzWzBdKSAmIHdpcmV0eXBlX21hc2sKKyAgICByZXR1cm4gV0lSRVRZUEVfVE9fU0tJUFBFUlt3aXJlX3R5cGVdKGJ1ZmZlciwgcG9zLCBlbmQpCisKKyAgcmV0dXJuIFNraXBGaWVsZAorCitTa2lwRmllbGQgPSBfRmllbGRTa2lwcGVyKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNWMyNzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl90ZXN0LnB5CkBAIC0wLDAgKzEsMzM0IEBACisjISAvdXNyL2Jpbi9weXRob24KKyMKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJVbml0dGVzdCBmb3IgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmRlc2NyaXB0b3IuIiIiCisKK19fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2Zvcm1hdAorCisKK1RFU1RfRU1QVFlfTUVTU0FHRV9ERVNDUklQVE9SX0FTQ0lJID0gIiIiCituYW1lOiAnVGVzdEVtcHR5TWVzc2FnZScKKyIiIgorCisKK2NsYXNzIERlc2NyaXB0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi5teV9maWxlID0gZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcigKKyAgICAgICAgbmFtZT0nc29tZS9maWxlbmFtZS9zb21lLnByb3RvJywKKyAgICAgICAgcGFja2FnZT0ncHJvdG9idWZfdW5pdHRlc3QnCisgICAgICAgICkKKyAgICBzZWxmLm15X2VudW0gPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAorICAgICAgICBuYW1lPSdGb3JlaWduRW51bScsCisgICAgICAgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW0nLAorICAgICAgICBmaWxlbmFtZT1Ob25lLAorICAgICAgICBmaWxlPXNlbGYubXlfZmlsZSwKKyAgICAgICAgdmFsdWVzPVsKKyAgICAgICAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IobmFtZT0nRk9SRUlHTl9GT08nLCBpbmRleD0wLCBudW1iZXI9NCksCisgICAgICAgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKG5hbWU9J0ZPUkVJR05fQkFSJywgaW5kZXg9MSwgbnVtYmVyPTUpLAorICAgICAgICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcihuYW1lPSdGT1JFSUdOX0JBWicsIGluZGV4PTIsIG51bWJlcj02KSwKKyAgICAgICAgXSkKKyAgICBzZWxmLm15X21lc3NhZ2UgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgICAgICAgIG5hbWU9J05lc3RlZE1lc3NhZ2UnLAorICAgICAgICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlJywKKyAgICAgICAgZmlsZW5hbWU9Tm9uZSwKKyAgICAgICAgZmlsZT1zZWxmLm15X2ZpbGUsCisgICAgICAgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgICBmaWVsZHM9WworICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAorICAgICAgICAgICAgbmFtZT0nYmInLAorICAgICAgICAgICAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5iYicsCisgICAgICAgICAgICBpbmRleD0wLCBudW1iZXI9MSwKKyAgICAgICAgICAgIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKKyAgICAgICAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCisgICAgICAgICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAorICAgICAgICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSksCisgICAgICAgIF0sCisgICAgICAgIG5lc3RlZF90eXBlcz1bXSwKKyAgICAgICAgZW51bV90eXBlcz1bCisgICAgICAgICAgc2VsZi5teV9lbnVtLAorICAgICAgICBdLAorICAgICAgICBleHRlbnNpb25zPVtdKQorICAgIHNlbGYubXlfbWV0aG9kID0gZGVzY3JpcHRvci5NZXRob2REZXNjcmlwdG9yKAorICAgICAgICBuYW1lPSdCYXInLAorICAgICAgICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RTZXJ2aWNlLkJhcicsCisgICAgICAgIGluZGV4PTAsCisgICAgICAgIGNvbnRhaW5pbmdfc2VydmljZT1Ob25lLAorICAgICAgICBpbnB1dF90eXBlPU5vbmUsCisgICAgICAgIG91dHB1dF90eXBlPU5vbmUpCisgICAgc2VsZi5teV9zZXJ2aWNlID0gZGVzY3JpcHRvci5TZXJ2aWNlRGVzY3JpcHRvcigKKyAgICAgICAgbmFtZT0nVGVzdFNlcnZpY2VXaXRoT3B0aW9ucycsCisgICAgICAgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2VXaXRoT3B0aW9ucycsCisgICAgICAgIGZpbGU9c2VsZi5teV9maWxlLAorICAgICAgICBpbmRleD0wLAorICAgICAgICBtZXRob2RzPVsKKyAgICAgICAgICAgIHNlbGYubXlfbWV0aG9kCisgICAgICAgIF0pCisKKyAgZGVmIHRlc3RFbnVtRml4dXBzKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9lbnVtLCBzZWxmLm15X2VudW0udmFsdWVzWzBdLnR5cGUpCisKKyAgZGVmIHRlc3RDb250YWluaW5nVHlwZUZpeHVwcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWVzc2FnZSwgc2VsZi5teV9tZXNzYWdlLmZpZWxkc1swXS5jb250YWluaW5nX3R5cGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X21lc3NhZ2UsIHNlbGYubXlfZW51bS5jb250YWluaW5nX3R5cGUpCisKKyAgZGVmIHRlc3RDb250YWluaW5nU2VydmljZUZpeHVwcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfc2VydmljZSwgc2VsZi5teV9tZXRob2QuY29udGFpbmluZ19zZXJ2aWNlKQorCisgIGRlZiB0ZXN0R2V0T3B0aW9ucyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZW51bS5HZXRPcHRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5FbnVtT3B0aW9ucygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9lbnVtLnZhbHVlc1swXS5HZXRPcHRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5FbnVtVmFsdWVPcHRpb25zKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X21lc3NhZ2UuR2V0T3B0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wYjIuTWVzc2FnZU9wdGlvbnMoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWVzc2FnZS5maWVsZHNbMF0uR2V0T3B0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wYjIuRmllbGRPcHRpb25zKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X21ldGhvZC5HZXRPcHRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5NZXRob2RPcHRpb25zKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X3NlcnZpY2UuR2V0T3B0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wYjIuU2VydmljZU9wdGlvbnMoKSkKKworICBkZWYgdGVzdEZpbGVEZXNjcmlwdG9yUmVmZXJlbmNlcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZW51bS5maWxlLCBzZWxmLm15X2ZpbGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X21lc3NhZ2UuZmlsZSwgc2VsZi5teV9maWxlKQorCisgIGRlZiB0ZXN0RmlsZURlc2NyaXB0b3Ioc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2ZpbGUubmFtZSwgJ3NvbWUvZmlsZW5hbWUvc29tZS5wcm90bycpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2ZpbGUucGFja2FnZSwgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKKworCitjbGFzcyBEZXNjcmlwdG9yQ29weVRvUHJvdG9UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgIiIiVGVzdHMgZm9yIENvcHlUbyBmdW5jdGlvbnMgb2YgRGVzY3JpcHRvci4iIiIKKworICBkZWYgX0Fzc2VydFByb3RvRXF1YWwoc2VsZiwgYWN0dWFsX3Byb3RvLCBleHBlY3RlZF9jbGFzcywgZXhwZWN0ZWRfYXNjaWkpOgorICAgIGV4cGVjdGVkX3Byb3RvID0gZXhwZWN0ZWRfY2xhc3MoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKGV4cGVjdGVkX2FzY2lpLCBleHBlY3RlZF9wcm90bykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGFjdHVhbF9wcm90bywgZXhwZWN0ZWRfcHJvdG8sCisgICAgICAgICdOb3QgZXF1YWwsXG5BY3R1YWw6XG4lc1xuRXhwZWN0ZWQ6XG4lc1xuJworICAgICAgICAlIChzdHIoYWN0dWFsX3Byb3RvKSwgc3RyKGV4cGVjdGVkX3Byb3RvKSkpCisKKyAgZGVmIF9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90byhzZWxmLCBkZXNjLCBleHBlY3RlZF9wcm90b19jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9wcm90b19hc2NpaSk6CisgICAgYWN0dWFsID0gZXhwZWN0ZWRfcHJvdG9fY2xhc3MoKQorICAgIGRlc2MuQ29weVRvUHJvdG8oYWN0dWFsKQorICAgIHNlbGYuX0Fzc2VydFByb3RvRXF1YWwoCisgICAgICAgIGFjdHVhbCwgZXhwZWN0ZWRfcHJvdG9fY2xhc3MsIGV4cGVjdGVkX3Byb3RvX2FzY2lpKQorCisgIGRlZiB0ZXN0Q29weVRvUHJvdG9fRW1wdHlNZXNzYWdlKHNlbGYpOgorICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZS5ERVNDUklQVE9SLAorICAgICAgICBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8sCisgICAgICAgIFRFU1RfRU1QVFlfTUVTU0FHRV9ERVNDUklQVE9SX0FTQ0lJKQorCisgIGRlZiB0ZXN0Q29weVRvUHJvdG9fTmVzdGVkTWVzc2FnZShzZWxmKToKKyAgICBURVNUX05FU1RFRF9NRVNTQUdFX0FTQ0lJID0gIiIiCisgICAgICBuYW1lOiAnTmVzdGVkTWVzc2FnZScKKyAgICAgIGZpZWxkOiA8CisgICAgICAgIG5hbWU6ICdiYicKKyAgICAgICAgbnVtYmVyOiAxCisgICAgICAgIGxhYmVsOiAxICAjIE9wdGlvbmFsCisgICAgICAgIHR5cGU6IDUgICMgVFlQRV9JTlQzMgorICAgICAgPgorICAgICAgIiIiCisKKyAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IsCisgICAgICAgIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bywKKyAgICAgICAgVEVTVF9ORVNURURfTUVTU0FHRV9BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX0ZvcmVpZ25OZXN0ZWRNZXNzYWdlKHNlbGYpOgorICAgIFRFU1RfRk9SRUlHTl9ORVNURURfQVNDSUkgPSAiIiIKKyAgICAgIG5hbWU6ICdUZXN0Rm9yZWlnbk5lc3RlZCcKKyAgICAgIGZpZWxkOiA8CisgICAgICAgIG5hbWU6ICdmb3JlaWduX25lc3RlZCcKKyAgICAgICAgbnVtYmVyOiAxCisgICAgICAgIGxhYmVsOiAxICAjIE9wdGlvbmFsCisgICAgICAgIHR5cGU6IDExICAjIFRZUEVfTUVTU0FHRQorICAgICAgICB0eXBlX25hbWU6ICcucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnCisgICAgICA+CisgICAgICAiIiIKKworICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEZvcmVpZ25OZXN0ZWQuREVTQ1JJUFRPUiwKKyAgICAgICAgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLAorICAgICAgICBURVNUX0ZPUkVJR05fTkVTVEVEX0FTQ0lJKQorCisgIGRlZiB0ZXN0Q29weVRvUHJvdG9fRm9yZWlnbkVudW0oc2VsZik6CisgICAgVEVTVF9GT1JFSUdOX0VOVU1fQVNDSUkgPSAiIiIKKyAgICAgIG5hbWU6ICdGb3JlaWduRW51bScKKyAgICAgIHZhbHVlOiA8CisgICAgICAgIG5hbWU6ICdGT1JFSUdOX0ZPTycKKyAgICAgICAgbnVtYmVyOiA0CisgICAgICA+CisgICAgICB2YWx1ZTogPAorICAgICAgICBuYW1lOiAnRk9SRUlHTl9CQVInCisgICAgICAgIG51bWJlcjogNQorICAgICAgPgorICAgICAgdmFsdWU6IDwKKyAgICAgICAgbmFtZTogJ0ZPUkVJR05fQkFaJworICAgICAgICBudW1iZXI6IDYKKyAgICAgID4KKyAgICAgICIiIgorCisgICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCisgICAgICAgIHVuaXR0ZXN0X3BiMi5fRk9SRUlHTkVOVU0sCisgICAgICAgIGRlc2NyaXB0b3JfcGIyLkVudW1EZXNjcmlwdG9yUHJvdG8sCisgICAgICAgIFRFU1RfRk9SRUlHTl9FTlVNX0FTQ0lJKQorCisgIGRlZiB0ZXN0Q29weVRvUHJvdG9fT3B0aW9ucyhzZWxmKToKKyAgICBURVNUX0RFUFJFQ0FURURfRklFTERTX0FTQ0lJID0gIiIiCisgICAgICBuYW1lOiAnVGVzdERlcHJlY2F0ZWRGaWVsZHMnCisgICAgICBmaWVsZDogPAorICAgICAgICBuYW1lOiAnZGVwcmVjYXRlZF9pbnQzMicKKyAgICAgICAgbnVtYmVyOiAxCisgICAgICAgIGxhYmVsOiAxICAjIE9wdGlvbmFsCisgICAgICAgIHR5cGU6IDUgICMgVFlQRV9JTlQzMgorICAgICAgICBvcHRpb25zOiA8CisgICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZQorICAgICAgICA+CisgICAgICA+CisgICAgICAiIiIKKworICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdERlcHJlY2F0ZWRGaWVsZHMuREVTQ1JJUFRPUiwKKyAgICAgICAgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLAorICAgICAgICBURVNUX0RFUFJFQ0FURURfRklFTERTX0FTQ0lJKQorCisgIGRlZiB0ZXN0Q29weVRvUHJvdG9fQWxsRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBURVNUX0VNUFRZX01FU1NBR0VfV0lUSF9FWFRFTlNJT05TX0FTQ0lJID0gIiIiCisgICAgICBuYW1lOiAnVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zJworICAgICAgZXh0ZW5zaW9uX3JhbmdlOiA8CisgICAgICAgIHN0YXJ0OiAxCisgICAgICAgIGVuZDogNTM2ODcwOTEyCisgICAgICA+CisgICAgICAiIiIKKworICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zLkRFU0NSSVBUT1IsCisgICAgICAgIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bywKKyAgICAgICAgVEVTVF9FTVBUWV9NRVNTQUdFX1dJVEhfRVhURU5TSU9OU19BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX1NldmVyYWxFeHRlbnNpb25zKHNlbGYpOgorICAgIFRFU1RfTUVTU0FHRV9XSVRIX1NFVkVSQUxfRVhURU5TSU9OU19BU0NJSSA9ICIiIgorICAgICAgbmFtZTogJ1Rlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcycKKyAgICAgIGV4dGVuc2lvbl9yYW5nZTogPAorICAgICAgICBzdGFydDogNDIKKyAgICAgICAgZW5kOiA0MworICAgICAgPgorICAgICAgZXh0ZW5zaW9uX3JhbmdlOiA8CisgICAgICAgIHN0YXJ0OiA0MTQzCisgICAgICAgIGVuZDogNDI0NAorICAgICAgPgorICAgICAgZXh0ZW5zaW9uX3JhbmdlOiA8CisgICAgICAgIHN0YXJ0OiA2NTUzNgorICAgICAgICBlbmQ6IDUzNjg3MDkxMgorICAgICAgPgorICAgICAgIiIiCisKKyAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5ERVNDUklQVE9SLAorICAgICAgICBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8sCisgICAgICAgIFRFU1RfTUVTU0FHRV9XSVRIX1NFVkVSQUxfRVhURU5TSU9OU19BU0NJSSkKKworICBkZWYgdGVzdENvcHlUb1Byb3RvX0ZpbGVEZXNjcmlwdG9yKHNlbGYpOgorICAgIFVOSVRURVNUX0lNUE9SVF9GSUxFX0RFU0NSSVBUT1JfQVNDSUkgPSAoIiIiCisgICAgICBuYW1lOiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90bycKKyAgICAgIHBhY2thZ2U6ICdwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQnCisgICAgICBtZXNzYWdlX3R5cGU6IDwKKyAgICAgICAgbmFtZTogJ0ltcG9ydE1lc3NhZ2UnCisgICAgICAgIGZpZWxkOiA8CisgICAgICAgICAgbmFtZTogJ2QnCisgICAgICAgICAgbnVtYmVyOiAxCisgICAgICAgICAgbGFiZWw6IDEgICMgT3B0aW9uYWwKKyAgICAgICAgICB0eXBlOiA1ICAjIFRZUEVfSU5UMzIKKyAgICAgICAgPgorICAgICAgPgorICAgICAgIiIiICsKKyAgICAgICIiImVudW1fdHlwZTogPAorICAgICAgICBuYW1lOiAnSW1wb3J0RW51bScKKyAgICAgICAgdmFsdWU6IDwKKyAgICAgICAgICBuYW1lOiAnSU1QT1JUX0ZPTycKKyAgICAgICAgICBudW1iZXI6IDcKKyAgICAgICAgPgorICAgICAgICB2YWx1ZTogPAorICAgICAgICAgIG5hbWU6ICdJTVBPUlRfQkFSJworICAgICAgICAgIG51bWJlcjogOAorICAgICAgICA+CisgICAgICAgIHZhbHVlOiA8CisgICAgICAgICAgbmFtZTogJ0lNUE9SVF9CQVonCisgICAgICAgICAgbnVtYmVyOiA5CisgICAgICAgID4KKyAgICAgID4KKyAgICAgIG9wdGlvbnM6IDwKKyAgICAgICAgamF2YV9wYWNrYWdlOiAnY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0JworICAgICAgICBvcHRpbWl6ZV9mb3I6IDEgICMgU1BFRUQKKyAgICAgID4KKyAgICAgICIiIikKKworICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9pbXBvcnRfcGIyLkRFU0NSSVBUT1IsCisgICAgICAgIGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8sCisgICAgICAgIFVOSVRURVNUX0lNUE9SVF9GSUxFX0RFU0NSSVBUT1JfQVNDSUkpCisKKyAgZGVmIHRlc3RDb3B5VG9Qcm90b19TZXJ2aWNlRGVzY3JpcHRvcihzZWxmKToKKyAgICBURVNUX1NFUlZJQ0VfQVNDSUkgPSAiIiIKKyAgICAgIG5hbWU6ICdUZXN0U2VydmljZScKKyAgICAgIG1ldGhvZDogPAorICAgICAgICBuYW1lOiAnRm9vJworICAgICAgICBpbnB1dF90eXBlOiAnLnByb3RvYnVmX3VuaXR0ZXN0LkZvb1JlcXVlc3QnCisgICAgICAgIG91dHB1dF90eXBlOiAnLnByb3RvYnVmX3VuaXR0ZXN0LkZvb1Jlc3BvbnNlJworICAgICAgPgorICAgICAgbWV0aG9kOiA8CisgICAgICAgIG5hbWU6ICdCYXInCisgICAgICAgIGlucHV0X3R5cGU6ICcucHJvdG9idWZfdW5pdHRlc3QuQmFyUmVxdWVzdCcKKyAgICAgICAgb3V0cHV0X3R5cGU6ICcucHJvdG9idWZfdW5pdHRlc3QuQmFyUmVzcG9uc2UnCisgICAgICA+CisgICAgICAiIiIKKworICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdFNlcnZpY2UuREVTQ1JJUFRPUiwKKyAgICAgICAgZGVzY3JpcHRvcl9wYjIuU2VydmljZURlc2NyaXB0b3JQcm90bywKKyAgICAgICAgVEVTVF9TRVJWSUNFX0FTQ0lJKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2Rlci5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VuY29kZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzc3OTc1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VuY29kZXIucHkKQEAgLTAsMCArMSw3NjkgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb2RlIGZvciBlbmNvZGluZyBwcm90b2NvbCBtZXNzYWdlIHByaW1pdGl2ZXMuCisKK0NvbnRhaW5zIHRoZSBsb2dpYyBmb3IgZW5jb2RpbmcgZXZlcnkgbG9naWNhbCBwcm90b2NvbCBmaWVsZCB0eXBlCitpbnRvIG9uZSBvZiB0aGUgNSBwaHlzaWNhbCB3aXJlIHR5cGVzLgorCitUaGlzIGNvZGUgaXMgZGVzaWduZWQgdG8gcHVzaCB0aGUgUHl0aG9uIGludGVycHJldGVyJ3MgcGVyZm9ybWFuY2UgdG8gdGhlCitsaW1pdHMuCisKK1RoZSBiYXNpYyBpZGVhIGlzIHRoYXQgYXQgc3RhcnR1cCB0aW1lLCBmb3IgZXZlcnkgZmllbGQgKGkuZS4gZXZlcnkKK0ZpZWxkRGVzY3JpcHRvcikgd2UgY29uc3RydWN0IHR3byBmdW5jdGlvbnM6ICBhICJzaXplciIgYW5kIGFuICJlbmNvZGVyIi4gIFRoZQorc2l6ZXIgdGFrZXMgYSB2YWx1ZSBvZiB0aGlzIGZpZWxkJ3MgdHlwZSBhbmQgY29tcHV0ZXMgaXRzIGJ5dGUgc2l6ZS4gIFRoZQorZW5jb2RlciB0YWtlcyBhIHdyaXRlciBmdW5jdGlvbiBhbmQgYSB2YWx1ZS4gIEl0IGVuY29kZXMgdGhlIHZhbHVlIGludG8gYnl0ZQorc3RyaW5ncyBhbmQgaW52b2tlcyB0aGUgd3JpdGVyIGZ1bmN0aW9uIHRvIHdyaXRlIHRob3NlIHN0cmluZ3MuICBUeXBpY2FsbHkgdGhlCit3cml0ZXIgZnVuY3Rpb24gaXMgdGhlIHdyaXRlKCkgbWV0aG9kIG9mIGEgY1N0cmluZ0lPLgorCitXZSB0cnkgdG8gZG8gYXMgbXVjaCB3b3JrIGFzIHBvc3NpYmxlIHdoZW4gY29uc3RydWN0aW5nIHRoZSB3cml0ZXIgYW5kIHRoZQorc2l6ZXIgcmF0aGVyIHRoYW4gd2hlbiBjYWxsaW5nIHRoZW0uICBJbiBwYXJ0aWN1bGFyOgorKiBXZSBjb3B5IGFueSBuZWVkZWQgZ2xvYmFsIGZ1bmN0aW9ucyB0byBsb2NhbCB2YXJpYWJsZXMsIHNvIHRoYXQgd2UgZG8gbm90IG5lZWQKKyAgdG8gZG8gY29zdGx5IGdsb2JhbCB0YWJsZSBsb29rdXBzIGF0IHJ1bnRpbWUuCisqIFNpbWlsYXJseSwgd2UgdHJ5IHRvIGRvIGFueSBhdHRyaWJ1dGUgbG9va3VwcyBhdCBzdGFydHVwIHRpbWUgaWYgcG9zc2libGUuCisqIEV2ZXJ5IGZpZWxkJ3MgdGFnIGlzIGVuY29kZWQgdG8gYnl0ZXMgYXQgc3RhcnR1cCwgc2luY2UgaXQgY2FuJ3QgY2hhbmdlIGF0CisgIHJ1bnRpbWUuCisqIFdoYXRldmVyIGNvbXBvbmVudCBvZiB0aGUgZmllbGQgc2l6ZSB3ZSBjYW4gY29tcHV0ZSBhdCBzdGFydHVwLCB3ZSBkby4KKyogV2UgKmF2b2lkKiBzaGFyaW5nIGNvZGUgaWYgZG9pbmcgc28gd291bGQgbWFrZSB0aGUgY29kZSBzbG93ZXIgYW5kIG5vdCBzaGFyaW5nCisgIGRvZXMgbm90IGJ1cmRlbiB1cyB0b28gbXVjaC4gIEZvciBleGFtcGxlLCBlbmNvZGVycyBmb3IgcmVwZWF0ZWQgZmllbGRzIGRvCisgIG5vdCBqdXN0IGNhbGwgdGhlIGVuY29kZXJzIGZvciBzaW5ndWxhciBmaWVsZHMgaW4gYSBsb29wIGJlY2F1c2UgdGhpcyB3b3VsZAorICBhZGQgYW4gZXh0cmEgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZCBmb3IgZXZlcnkgbG9vcCBpdGVyYXRpb247IGluc3RlYWQsIHdlCisgIG1hbnVhbGx5IGlubGluZSB0aGUgc2luZ2xlLXZhbHVlIGVuY29kZXIgaW50byB0aGUgbG9vcC4KKyogSWYgYSBQeXRob24gZnVuY3Rpb24gbGFja3MgYSByZXR1cm4gc3RhdGVtZW50LCBQeXRob24gYWN0dWFsbHkgZ2VuZXJhdGVzCisgIGluc3RydWN0aW9ucyB0byBwb3AgdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBzdGF0ZW1lbnQgb2ZmIHRoZSBzdGFjaywgcHVzaAorICBOb25lIG9udG8gdGhlIHN0YWNrLCBhbmQgdGhlbiByZXR1cm4gdGhhdC4gIElmIHdlIHJlYWxseSBkb24ndCBjYXJlIHdoYXQKKyAgdmFsdWUgaXMgcmV0dXJuZWQsIHRoZW4gd2UgY2FuIHNhdmUgdHdvIGluc3RydWN0aW9ucyBieSByZXR1cm5pbmcgdGhlCisgIHJlc3VsdCBvZiB0aGUgbGFzdCBzdGF0ZW1lbnQuICBJdCBsb29rcyBmdW5ueSBidXQgaXQgaGVscHMuCisqIFdlIGFzc3VtZSB0aGF0IHR5cGUgYW5kIGJvdW5kcyBjaGVja2luZyBoYXMgaGFwcGVuZWQgYXQgYSBoaWdoZXIgbGV2ZWwuCisiIiIKKworX19hdXRob3JfXyA9ICdrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKScKKworaW1wb3J0IHN0cnVjdAorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHdpcmVfZm9ybWF0CisKKworIyBUaGlzIHdpbGwgb3ZlcmZsb3cgYW5kIHRodXMgYmVjb21lIElFRUUtNzU0ICJpbmZpbml0eSIuICBXZSB3b3VsZCB1c2UKKyMgImZsb2F0KCdpbmYnKSIgYnV0IGl0IGRvZXNuJ3Qgd29yayBvbiBXaW5kb3dzIHByZS1QeXRob24tMi42LgorX1BPU19JTkYgPSAxZTEwMDAwCitfTkVHX0lORiA9IC1fUE9TX0lORgorCisKK2RlZiBfVmFyaW50U2l6ZSh2YWx1ZSk6CisgICIiIkNvbXB1dGUgdGhlIHNpemUgb2YgYSB2YXJpbnQgdmFsdWUuIiIiCisgIGlmIHZhbHVlIDw9IDB4N2Y6IHJldHVybiAxCisgIGlmIHZhbHVlIDw9IDB4M2ZmZjogcmV0dXJuIDIKKyAgaWYgdmFsdWUgPD0gMHgxZmZmZmY6IHJldHVybiAzCisgIGlmIHZhbHVlIDw9IDB4ZmZmZmZmZjogcmV0dXJuIDQKKyAgaWYgdmFsdWUgPD0gMHg3ZmZmZmZmZmY6IHJldHVybiA1CisgIGlmIHZhbHVlIDw9IDB4M2ZmZmZmZmZmZmY6IHJldHVybiA2CisgIGlmIHZhbHVlIDw9IDB4MWZmZmZmZmZmZmZmZjogcmV0dXJuIDcKKyAgaWYgdmFsdWUgPD0gMHhmZmZmZmZmZmZmZmZmZjogcmV0dXJuIDgKKyAgaWYgdmFsdWUgPD0gMHg3ZmZmZmZmZmZmZmZmZmZmOiByZXR1cm4gOQorICByZXR1cm4gMTAKKworCitkZWYgX1NpZ25lZFZhcmludFNpemUodmFsdWUpOgorICAiIiJDb21wdXRlIHRoZSBzaXplIG9mIGEgc2lnbmVkIHZhcmludCB2YWx1ZS4iIiIKKyAgaWYgdmFsdWUgPCAwOiByZXR1cm4gMTAKKyAgaWYgdmFsdWUgPD0gMHg3ZjogcmV0dXJuIDEKKyAgaWYgdmFsdWUgPD0gMHgzZmZmOiByZXR1cm4gMgorICBpZiB2YWx1ZSA8PSAweDFmZmZmZjogcmV0dXJuIDMKKyAgaWYgdmFsdWUgPD0gMHhmZmZmZmZmOiByZXR1cm4gNAorICBpZiB2YWx1ZSA8PSAweDdmZmZmZmZmZjogcmV0dXJuIDUKKyAgaWYgdmFsdWUgPD0gMHgzZmZmZmZmZmZmZjogcmV0dXJuIDYKKyAgaWYgdmFsdWUgPD0gMHgxZmZmZmZmZmZmZmZmOiByZXR1cm4gNworICBpZiB2YWx1ZSA8PSAweGZmZmZmZmZmZmZmZmZmOiByZXR1cm4gOAorICBpZiB2YWx1ZSA8PSAweDdmZmZmZmZmZmZmZmZmZmY6IHJldHVybiA5CisgIHJldHVybiAxMAorCisKK2RlZiBfVGFnU2l6ZShmaWVsZF9udW1iZXIpOgorICAiIiJSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGEgdGFnIHdpdGggdGhpcyBmaWVsZAorICBudW1iZXIuIiIiCisgICMgSnVzdCBwYXNzIGluIHR5cGUgMCwgc2luY2UgdGhlIHR5cGUgd29uJ3QgYWZmZWN0IHRoZSB0YWcrdHlwZSBzaXplLgorICByZXR1cm4gX1ZhcmludFNpemUod2lyZV9mb3JtYXQuUGFja1RhZyhmaWVsZF9udW1iZXIsIDApKQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW4gdGhpcyBzZWN0aW9uIHdlIGRlZmluZSBzb21lIGdlbmVyaWMgc2l6ZXJzLiAgRWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMKKyMgdGFrZXMgcGFyYW1ldGVycyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgZmllbGQgdHlwZSwgZS5nLiBpbnQzMiBvciBmaXhlZDY0LgorIyBJdCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gd2hpY2ggaW4gdHVybiB0YWtlcyBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIGEKKyMgcGFydGljdWxhciBmaWVsZCwgZS5nLiB0aGUgZmllbGQgbnVtYmVyIGFuZCB3aGV0aGVyIGl0IGlzIHJlcGVhdGVkIG9yIHBhY2tlZC4KKyMgTG9vayBhdCB0aGUgbmV4dCBzZWN0aW9uIHRvIHNlZSBob3cgdGhlc2UgYXJlIHVzZWQuCisKKworZGVmIF9TaW1wbGVTaXplcihjb21wdXRlX3ZhbHVlX3NpemUpOgorICAiIiJBIHNpemVyIHdoaWNoIHVzZXMgdGhlIGZ1bmN0aW9uIGNvbXB1dGVfdmFsdWVfc2l6ZSB0byBjb21wdXRlIHRoZSBzaXplIG9mCisgIGVhY2ggdmFsdWUuICBUeXBpY2FsbHkgY29tcHV0ZV92YWx1ZV9zaXplIGlzIF9WYXJpbnRTaXplLiIiIgorCisgIGRlZiBTcGVjaWZpY1NpemVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCisgICAgaWYgaXNfcGFja2VkOgorICAgICAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCisgICAgICBkZWYgUGFja2VkRmllbGRTaXplKHZhbHVlKToKKyAgICAgICAgcmVzdWx0ID0gMAorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICByZXN1bHQgKz0gY29tcHV0ZV92YWx1ZV9zaXplKGVsZW1lbnQpCisgICAgICAgIHJldHVybiByZXN1bHQgKyBsb2NhbF9WYXJpbnRTaXplKHJlc3VsdCkgKyB0YWdfc2l6ZQorICAgICAgcmV0dXJuIFBhY2tlZEZpZWxkU2l6ZQorICAgIGVsaWYgaXNfcmVwZWF0ZWQ6CisgICAgICBkZWYgUmVwZWF0ZWRGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXN1bHQgPSB0YWdfc2l6ZSAqIGxlbih2YWx1ZSkKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgcmVzdWx0ICs9IGNvbXB1dGVfdmFsdWVfc2l6ZShlbGVtZW50KQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKKyAgICBlbHNlOgorICAgICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICAgIHJldHVybiB0YWdfc2l6ZSArIGNvbXB1dGVfdmFsdWVfc2l6ZSh2YWx1ZSkKKyAgICAgIHJldHVybiBGaWVsZFNpemUKKworICByZXR1cm4gU3BlY2lmaWNTaXplcgorCisKK2RlZiBfTW9kaWZpZWRTaXplcihjb21wdXRlX3ZhbHVlX3NpemUsIG1vZGlmeV92YWx1ZSk6CisgICIiIkxpa2UgU2ltcGxlU2l6ZXIsIGJ1dCBtb2RpZnlfdmFsdWUgaXMgaW52b2tlZCBvbiBlYWNoIHZhbHVlIGJlZm9yZSBpdCBpcworICBwYXNzZWQgdG8gY29tcHV0ZV92YWx1ZV9zaXplLiAgbW9kaWZ5X3ZhbHVlIGlzIHR5cGljYWxseSBaaWdaYWdFbmNvZGUuIiIiCisKKyAgZGVmIFNwZWNpZmljU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKKyAgICBpZiBpc19wYWNrZWQ6CisgICAgICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKKyAgICAgIGRlZiBQYWNrZWRGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXN1bHQgPSAwCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHJlc3VsdCArPSBjb21wdXRlX3ZhbHVlX3NpemUobW9kaWZ5X3ZhbHVlKGVsZW1lbnQpKQorICAgICAgICByZXR1cm4gcmVzdWx0ICsgbG9jYWxfVmFyaW50U2l6ZShyZXN1bHQpICsgdGFnX3NpemUKKyAgICAgIHJldHVybiBQYWNrZWRGaWVsZFNpemUKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKKyAgICAgICAgcmVzdWx0ID0gdGFnX3NpemUgKiBsZW4odmFsdWUpCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHJlc3VsdCArPSBjb21wdXRlX3ZhbHVlX3NpemUobW9kaWZ5X3ZhbHVlKGVsZW1lbnQpKQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKKyAgICBlbHNlOgorICAgICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICAgIHJldHVybiB0YWdfc2l6ZSArIGNvbXB1dGVfdmFsdWVfc2l6ZShtb2RpZnlfdmFsdWUodmFsdWUpKQorICAgICAgcmV0dXJuIEZpZWxkU2l6ZQorCisgIHJldHVybiBTcGVjaWZpY1NpemVyCisKKworZGVmIF9GaXhlZFNpemVyKHZhbHVlX3NpemUpOgorICAiIiJMaWtlIF9TaW1wbGVTaXplciBleGNlcHQgZm9yIGEgZml4ZWQtc2l6ZSBmaWVsZC4gIFRoZSBpbnB1dCBpcyB0aGUgc2l6ZQorICBvZiBvbmUgdmFsdWUuIiIiCisKKyAgZGVmIFNwZWNpZmljU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKKyAgICBpZiBpc19wYWNrZWQ6CisgICAgICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKKyAgICAgIGRlZiBQYWNrZWRGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXN1bHQgPSBsZW4odmFsdWUpICogdmFsdWVfc2l6ZQorICAgICAgICByZXR1cm4gcmVzdWx0ICsgbG9jYWxfVmFyaW50U2l6ZShyZXN1bHQpICsgdGFnX3NpemUKKyAgICAgIHJldHVybiBQYWNrZWRGaWVsZFNpemUKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgZWxlbWVudF9zaXplID0gdmFsdWVfc2l6ZSArIHRhZ19zaXplCisgICAgICBkZWYgUmVwZWF0ZWRGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXR1cm4gbGVuKHZhbHVlKSAqIGVsZW1lbnRfc2l6ZQorICAgICAgcmV0dXJuIFJlcGVhdGVkRmllbGRTaXplCisgICAgZWxzZToKKyAgICAgIGZpZWxkX3NpemUgPSB2YWx1ZV9zaXplICsgdGFnX3NpemUKKyAgICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgorICAgICAgICByZXR1cm4gZmllbGRfc2l6ZQorICAgICAgcmV0dXJuIEZpZWxkU2l6ZQorCisgIHJldHVybiBTcGVjaWZpY1NpemVyCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBIZXJlIHdlIGRlY2xhcmUgYSBzaXplciBjb25zdHJ1Y3RvciBmb3IgZWFjaCBmaWVsZCB0eXBlLiAgRWFjaCAic2l6ZXIKKyMgY29uc3RydWN0b3IiIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyAoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKQorIyBhcyBwYXJhbWV0ZXJzIGFuZCByZXR1cm5zIGEgc2l6ZXIsIHdoaWNoIGluIHR1cm4gdGFrZXMgYSBmaWVsZCB2YWx1ZSBhcworIyBhIHBhcmFtZXRlciBhbmQgcmV0dXJucyBpdHMgZW5jb2RlZCBzaXplLgorCisKK0ludDMyU2l6ZXIgPSBJbnQ2NFNpemVyID0gRW51bVNpemVyID0gX1NpbXBsZVNpemVyKF9TaWduZWRWYXJpbnRTaXplKQorCitVSW50MzJTaXplciA9IFVJbnQ2NFNpemVyID0gX1NpbXBsZVNpemVyKF9WYXJpbnRTaXplKQorCitTSW50MzJTaXplciA9IFNJbnQ2NFNpemVyID0gX01vZGlmaWVkU2l6ZXIoCisgICAgX1NpZ25lZFZhcmludFNpemUsIHdpcmVfZm9ybWF0LlppZ1phZ0VuY29kZSkKKworRml4ZWQzMlNpemVyID0gU0ZpeGVkMzJTaXplciA9IEZsb2F0U2l6ZXIgID0gX0ZpeGVkU2l6ZXIoNCkKK0ZpeGVkNjRTaXplciA9IFNGaXhlZDY0U2l6ZXIgPSBEb3VibGVTaXplciA9IF9GaXhlZFNpemVyKDgpCisKK0Jvb2xTaXplciA9IF9GaXhlZFNpemVyKDEpCisKKworZGVmIFN0cmluZ1NpemVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICIiIlJldHVybnMgYSBzaXplciBmb3IgYSBzdHJpbmcgZmllbGQuIiIiCisKKyAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCisgIGxvY2FsX1ZhcmludFNpemUgPSBfVmFyaW50U2l6ZQorICBsb2NhbF9sZW4gPSBsZW4KKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKKyAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQorICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgIGwgPSBsb2NhbF9sZW4oZWxlbWVudC5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIHJlc3VsdCArPSBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAorICAgICAgcmV0dXJuIHJlc3VsdAorICAgIHJldHVybiBSZXBlYXRlZEZpZWxkU2l6ZQorICBlbHNlOgorICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgorICAgICAgbCA9IGxvY2FsX2xlbih2YWx1ZS5lbmNvZGUoJ3V0Zi04JykpCisgICAgICByZXR1cm4gdGFnX3NpemUgKyBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAorICAgIHJldHVybiBGaWVsZFNpemUKKworCitkZWYgQnl0ZXNTaXplcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAiIiJSZXR1cm5zIGEgc2l6ZXIgZm9yIGEgYnl0ZXMgZmllbGQuIiIiCisKKyAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCisgIGxvY2FsX1ZhcmludFNpemUgPSBfVmFyaW50U2l6ZQorICBsb2NhbF9sZW4gPSBsZW4KKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKKyAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQorICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgIGwgPSBsb2NhbF9sZW4oZWxlbWVudCkKKyAgICAgICAgcmVzdWx0ICs9IGxvY2FsX1ZhcmludFNpemUobCkgKyBsCisgICAgICByZXR1cm4gcmVzdWx0CisgICAgcmV0dXJuIFJlcGVhdGVkRmllbGRTaXplCisgIGVsc2U6CisgICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICBsID0gbG9jYWxfbGVuKHZhbHVlKQorICAgICAgcmV0dXJuIHRhZ19zaXplICsgbG9jYWxfVmFyaW50U2l6ZShsKSArIGwKKyAgICByZXR1cm4gRmllbGRTaXplCisKKworZGVmIEdyb3VwU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgIiIiUmV0dXJucyBhIHNpemVyIGZvciBhIGdyb3VwIGZpZWxkLiIiIgorCisgIHRhZ19zaXplID0gX1RhZ1NpemUoZmllbGRfbnVtYmVyKSAqIDIKKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKKyAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQorICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgIHJlc3VsdCArPSBlbGVtZW50LkJ5dGVTaXplKCkKKyAgICAgIHJldHVybiByZXN1bHQKKyAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKKyAgZWxzZToKKyAgICBkZWYgRmllbGRTaXplKHZhbHVlKToKKyAgICAgIHJldHVybiB0YWdfc2l6ZSArIHZhbHVlLkJ5dGVTaXplKCkKKyAgICByZXR1cm4gRmllbGRTaXplCisKKworZGVmIE1lc3NhZ2VTaXplcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAiIiJSZXR1cm5zIGEgc2l6ZXIgZm9yIGEgbWVzc2FnZSBmaWVsZC4iIiIKKworICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKKyAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIGRlZiBSZXBlYXRlZEZpZWxkU2l6ZSh2YWx1ZSk6CisgICAgICByZXN1bHQgPSB0YWdfc2l6ZSAqIGxlbih2YWx1ZSkKKyAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICBsID0gZWxlbWVudC5CeXRlU2l6ZSgpCisgICAgICAgIHJlc3VsdCArPSBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAorICAgICAgcmV0dXJuIHJlc3VsdAorICAgIHJldHVybiBSZXBlYXRlZEZpZWxkU2l6ZQorICBlbHNlOgorICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgorICAgICAgbCA9IHZhbHVlLkJ5dGVTaXplKCkKKyAgICAgIHJldHVybiB0YWdfc2l6ZSArIGxvY2FsX1ZhcmludFNpemUobCkgKyBsCisgICAgcmV0dXJuIEZpZWxkU2l6ZQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTWVzc2FnZVNldCBpcyBzcGVjaWFsLgorCisKK2RlZiBNZXNzYWdlU2V0SXRlbVNpemVyKGZpZWxkX251bWJlcik6CisgICIiIlJldHVybnMgYSBzaXplciBmb3IgZXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0LgorCisgIFRoZSBtZXNzYWdlIHNldCBtZXNzYWdlIGxvb2tzIGxpa2UgdGhpczoKKyAgICBtZXNzYWdlIE1lc3NhZ2VTZXQgeworICAgICAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgeworICAgICAgICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKKyAgICAgICAgcmVxdWlyZWQgc3RyaW5nIG1lc3NhZ2UgPSAzOworICAgICAgfQorICAgIH0KKyAgIiIiCisgIHN0YXRpY19zaXplID0gKF9UYWdTaXplKDEpICogMiArIF9UYWdTaXplKDIpICsgX1ZhcmludFNpemUoZmllbGRfbnVtYmVyKSArCisgICAgICAgICAgICAgICAgIF9UYWdTaXplKDMpKQorICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKKworICBkZWYgRmllbGRTaXplKHZhbHVlKToKKyAgICBsID0gdmFsdWUuQnl0ZVNpemUoKQorICAgIHJldHVybiBzdGF0aWNfc2l6ZSArIGxvY2FsX1ZhcmludFNpemUobCkgKyBsCisKKyAgcmV0dXJuIEZpZWxkU2l6ZQorCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRW5jb2RlcnMhCisKKworZGVmIF9WYXJpbnRFbmNvZGVyKCk6CisgICIiIlJldHVybiBhbiBlbmNvZGVyIGZvciBhIGJhc2ljIHZhcmludCB2YWx1ZSAoZG9lcyBub3QgaW5jbHVkZSB0YWcpLiIiIgorCisgIGxvY2FsX2NociA9IGNocgorICBkZWYgRW5jb2RlVmFyaW50KHdyaXRlLCB2YWx1ZSk6CisgICAgYml0cyA9IHZhbHVlICYgMHg3ZgorICAgIHZhbHVlID4+PSA3CisgICAgd2hpbGUgdmFsdWU6CisgICAgICB3cml0ZShsb2NhbF9jaHIoMHg4MHxiaXRzKSkKKyAgICAgIGJpdHMgPSB2YWx1ZSAmIDB4N2YKKyAgICAgIHZhbHVlID4+PSA3CisgICAgcmV0dXJuIHdyaXRlKGxvY2FsX2NocihiaXRzKSkKKworICByZXR1cm4gRW5jb2RlVmFyaW50CisKKworZGVmIF9TaWduZWRWYXJpbnRFbmNvZGVyKCk6CisgICIiIlJldHVybiBhbiBlbmNvZGVyIGZvciBhIGJhc2ljIHNpZ25lZCB2YXJpbnQgdmFsdWUgKGRvZXMgbm90IGluY2x1ZGUKKyAgdGFnKS4iIiIKKworICBsb2NhbF9jaHIgPSBjaHIKKyAgZGVmIEVuY29kZVNpZ25lZFZhcmludCh3cml0ZSwgdmFsdWUpOgorICAgIGlmIHZhbHVlIDwgMDoKKyAgICAgIHZhbHVlICs9ICgxIDw8IDY0KQorICAgIGJpdHMgPSB2YWx1ZSAmIDB4N2YKKyAgICB2YWx1ZSA+Pj0gNworICAgIHdoaWxlIHZhbHVlOgorICAgICAgd3JpdGUobG9jYWxfY2hyKDB4ODB8Yml0cykpCisgICAgICBiaXRzID0gdmFsdWUgJiAweDdmCisgICAgICB2YWx1ZSA+Pj0gNworICAgIHJldHVybiB3cml0ZShsb2NhbF9jaHIoYml0cykpCisKKyAgcmV0dXJuIEVuY29kZVNpZ25lZFZhcmludAorCisKK19FbmNvZGVWYXJpbnQgPSBfVmFyaW50RW5jb2RlcigpCitfRW5jb2RlU2lnbmVkVmFyaW50ID0gX1NpZ25lZFZhcmludEVuY29kZXIoKQorCisKK2RlZiBfVmFyaW50Qnl0ZXModmFsdWUpOgorICAiIiJFbmNvZGUgdGhlIGdpdmVuIGludGVnZXIgYXMgYSB2YXJpbnQgYW5kIHJldHVybiB0aGUgYnl0ZXMuICBUaGlzIGlzIG9ubHkKKyAgY2FsbGVkIGF0IHN0YXJ0dXAgdGltZSBzbyBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgZmFzdC4iIiIKKworICBwaWVjZXMgPSBbXQorICBfRW5jb2RlVmFyaW50KHBpZWNlcy5hcHBlbmQsIHZhbHVlKQorICByZXR1cm4gIiIuam9pbihwaWVjZXMpCisKKworZGVmIFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKToKKyAgIiIiRW5jb2RlIHRoZSBnaXZlbiB0YWcgYW5kIHJldHVybiB0aGUgYnl0ZXMuICBPbmx5IGNhbGxlZCBhdCBzdGFydHVwLiIiIgorCisgIHJldHVybiBfVmFyaW50Qnl0ZXMod2lyZV9mb3JtYXQuUGFja1RhZyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXMgd2l0aCBzaXplcnMgKHNlZSBhYm92ZSksIHdlIGhhdmUgYSBudW1iZXIgb2YgY29tbW9uIGVuY29kZXIKKyMgaW1wbGVtZW50YXRpb25zLgorCisKK2RlZiBfU2ltcGxlRW5jb2Rlcih3aXJlX3R5cGUsIGVuY29kZV92YWx1ZSwgY29tcHV0ZV92YWx1ZV9zaXplKToKKyAgIiIiUmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGFuIGVuY29kZXIgZm9yIGZpZWxkcyBvZiBhIHBhcnRpY3VsYXIgdHlwZS4KKworICBBcmdzOgorICAgICAgd2lyZV90eXBlOiAgVGhlIGZpZWxkJ3Mgd2lyZSB0eXBlLCBmb3IgZW5jb2RpbmcgdGFncy4KKyAgICAgIGVuY29kZV92YWx1ZTogIEEgZnVuY3Rpb24gd2hpY2ggZW5jb2RlcyBhbiBpbmRpdmlkdWFsIHZhbHVlLCBlLmcuCisgICAgICAgIF9FbmNvZGVWYXJpbnQoKS4KKyAgICAgIGNvbXB1dGVfdmFsdWVfc2l6ZTogIEEgZnVuY3Rpb24gd2hpY2ggY29tcHV0ZXMgdGhlIHNpemUgb2YgYW4gaW5kaXZpZHVhbAorICAgICAgICB2YWx1ZSwgZS5nLiBfVmFyaW50U2l6ZSgpLgorICAiIiIKKworICBkZWYgU3BlY2lmaWNFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICAgaWYgaXNfcGFja2VkOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQorICAgICAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAorICAgICAgZGVmIEVuY29kZVBhY2tlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgc2l6ZSA9IDAKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgc2l6ZSArPSBjb21wdXRlX3ZhbHVlX3NpemUoZWxlbWVudCkKKyAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBzaXplKQorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICBlbmNvZGVfdmFsdWUod3JpdGUsIGVsZW1lbnQpCisgICAgICByZXR1cm4gRW5jb2RlUGFja2VkRmllbGQKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCisgICAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgICAgZW5jb2RlX3ZhbHVlKHdyaXRlLCBlbGVtZW50KQorICAgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKKyAgICBlbHNlOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCisgICAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgICByZXR1cm4gZW5jb2RlX3ZhbHVlKHdyaXRlLCB2YWx1ZSkKKyAgICAgIHJldHVybiBFbmNvZGVGaWVsZAorCisgIHJldHVybiBTcGVjaWZpY0VuY29kZXIKKworCitkZWYgX01vZGlmaWVkRW5jb2Rlcih3aXJlX3R5cGUsIGVuY29kZV92YWx1ZSwgY29tcHV0ZV92YWx1ZV9zaXplLCBtb2RpZnlfdmFsdWUpOgorICAiIiJMaWtlIFNpbXBsZUVuY29kZXIgYnV0IGFkZGl0aW9uYWxseSBpbnZva2VzIG1vZGlmeV92YWx1ZSBvbiBldmVyeSB2YWx1ZQorICBiZWZvcmUgcGFzc2luZyBpdCB0byBlbmNvZGVfdmFsdWUuICBVc3VhbGx5IG1vZGlmeV92YWx1ZSBpcyBaaWdaYWdFbmNvZGUuIiIiCisKKyAgZGVmIFNwZWNpZmljRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAgIGlmIGlzX3BhY2tlZDoKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgICAgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKKyAgICAgIGRlZiBFbmNvZGVQYWNrZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgIHNpemUgPSAwCisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHNpemUgKz0gY29tcHV0ZV92YWx1ZV9zaXplKG1vZGlmeV92YWx1ZShlbGVtZW50KSkKKyAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBzaXplKQorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICBlbmNvZGVfdmFsdWUod3JpdGUsIG1vZGlmeV92YWx1ZShlbGVtZW50KSkKKyAgICAgIHJldHVybiBFbmNvZGVQYWNrZWRGaWVsZAorICAgIGVsaWYgaXNfcmVwZWF0ZWQ6CisgICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKKyAgICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgICBlbmNvZGVfdmFsdWUod3JpdGUsIG1vZGlmeV92YWx1ZShlbGVtZW50KSkKKyAgICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCisgICAgZWxzZToKKyAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQorICAgICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgcmV0dXJuIGVuY29kZV92YWx1ZSh3cml0ZSwgbW9kaWZ5X3ZhbHVlKHZhbHVlKSkKKyAgICAgIHJldHVybiBFbmNvZGVGaWVsZAorCisgIHJldHVybiBTcGVjaWZpY0VuY29kZXIKKworCitkZWYgX1N0cnVjdFBhY2tFbmNvZGVyKHdpcmVfdHlwZSwgZm9ybWF0KToKKyAgIiIiUmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGFuIGVuY29kZXIgZm9yIGEgZml4ZWQtd2lkdGggZmllbGQuCisKKyAgQXJnczoKKyAgICAgIHdpcmVfdHlwZTogIFRoZSBmaWVsZCdzIHdpcmUgdHlwZSwgZm9yIGVuY29kaW5nIHRhZ3MuCisgICAgICBmb3JtYXQ6ICBUaGUgZm9ybWF0IHN0cmluZyB0byBwYXNzIHRvIHN0cnVjdC5wYWNrKCkuCisgICIiIgorCisgIHZhbHVlX3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoZm9ybWF0KQorCisgIGRlZiBTcGVjaWZpY0VuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgICBsb2NhbF9zdHJ1Y3RfcGFjayA9IHN0cnVjdC5wYWNrCisgICAgaWYgaXNfcGFja2VkOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQorICAgICAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAorICAgICAgZGVmIEVuY29kZVBhY2tlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsZW4odmFsdWUpICogdmFsdWVfc2l6ZSkKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCBlbGVtZW50KSkKKyAgICAgIHJldHVybiBFbmNvZGVQYWNrZWRGaWVsZAorICAgIGVsaWYgaXNfcmVwZWF0ZWQ6CisgICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKKyAgICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgICB3cml0ZShsb2NhbF9zdHJ1Y3RfcGFjayhmb3JtYXQsIGVsZW1lbnQpKQorICAgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKKyAgICBlbHNlOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCisgICAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgICByZXR1cm4gd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCB2YWx1ZSkpCisgICAgICByZXR1cm4gRW5jb2RlRmllbGQKKworICByZXR1cm4gU3BlY2lmaWNFbmNvZGVyCisKKworZGVmIF9GbG9hdGluZ1BvaW50RW5jb2Rlcih3aXJlX3R5cGUsIGZvcm1hdCk6CisgICIiIlJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhbiBlbmNvZGVyIGZvciBmbG9hdCBmaWVsZHMuCisKKyAgVGhpcyBpcyBsaWtlIFN0cnVjdFBhY2tFbmNvZGVyLCBidXQgY2F0Y2hlcyBlcnJvcnMgdGhhdCBtYXkgYmUgZHVlIHRvCisgIHBhc3Npbmcgbm9uLWZpbml0ZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMgdG8gc3RydWN0LnBhY2ssIGFuZCBtYWtlcyBhCisgIHNlY29uZCBhdHRlbXB0IHRvIGVuY29kZSB0aG9zZSB2YWx1ZXMuCisKKyAgQXJnczoKKyAgICAgIHdpcmVfdHlwZTogIFRoZSBmaWVsZCdzIHdpcmUgdHlwZSwgZm9yIGVuY29kaW5nIHRhZ3MuCisgICAgICBmb3JtYXQ6ICBUaGUgZm9ybWF0IHN0cmluZyB0byBwYXNzIHRvIHN0cnVjdC5wYWNrKCkuCisgICIiIgorCisgIHZhbHVlX3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoZm9ybWF0KQorICBpZiB2YWx1ZV9zaXplID09IDQ6CisgICAgZGVmIEVuY29kZU5vbkZpbml0ZU9yUmFpc2Uod3JpdGUsIHZhbHVlKToKKyAgICAgICMgUmVtZW1iZXIgdGhhdCB0aGUgc2VyaWFsaXplZCBmb3JtIHVzZXMgbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyLgorICAgICAgaWYgdmFsdWUgPT0gX1BPU19JTkY6CisgICAgICAgIHdyaXRlKCdceDAwXHgwMFx4ODBceDdGJykKKyAgICAgIGVsaWYgdmFsdWUgPT0gX05FR19JTkY6CisgICAgICAgIHdyaXRlKCdceDAwXHgwMFx4ODBceEZGJykKKyAgICAgIGVsaWYgdmFsdWUgIT0gdmFsdWU6ICAgICAgICAgICAjIE5hTgorICAgICAgICB3cml0ZSgnXHgwMFx4MDBceEMwXHg3RicpCisgICAgICBlbHNlOgorICAgICAgICByYWlzZQorICBlbGlmIHZhbHVlX3NpemUgPT0gODoKKyAgICBkZWYgRW5jb2RlTm9uRmluaXRlT3JSYWlzZSh3cml0ZSwgdmFsdWUpOgorICAgICAgaWYgdmFsdWUgPT0gX1BPU19JTkY6CisgICAgICAgIHdyaXRlKCdceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEYwXHg3RicpCisgICAgICBlbGlmIHZhbHVlID09IF9ORUdfSU5GOgorICAgICAgICB3cml0ZSgnXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnKQorICAgICAgZWxpZiB2YWx1ZSAhPSB2YWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgIyBOYU4KKyAgICAgICAgd3JpdGUoJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjhceDdGJykKKyAgICAgIGVsc2U6CisgICAgICAgIHJhaXNlCisgIGVsc2U6CisgICAgcmFpc2UgVmFsdWVFcnJvcignQ2FuXCd0IGVuY29kZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMgdGhhdCBhcmUgJworICAgICAgICAgICAgICAgICAgICAgJyVkIGJ5dGVzIGxvbmcgKG9ubHkgNCBvciA4KScgJSB2YWx1ZV9zaXplKQorCisgIGRlZiBTcGVjaWZpY0VuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgICBsb2NhbF9zdHJ1Y3RfcGFjayA9IHN0cnVjdC5wYWNrCisgICAgaWYgaXNfcGFja2VkOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQorICAgICAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAorICAgICAgZGVmIEVuY29kZVBhY2tlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsZW4odmFsdWUpICogdmFsdWVfc2l6ZSkKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgICAgIyBUaGlzIHRyeS9leGNlcHQgYmxvY2sgaXMgZ29pbmcgdG8gYmUgZmFzdGVyIHRoYW4gYW55IGNvZGUgdGhhdAorICAgICAgICAgICMgd2UgY291bGQgd3JpdGUgdG8gY2hlY2sgd2hldGhlciBlbGVtZW50IGlzIGZpbml0ZS4KKyAgICAgICAgICB0cnk6CisgICAgICAgICAgICB3cml0ZShsb2NhbF9zdHJ1Y3RfcGFjayhmb3JtYXQsIGVsZW1lbnQpKQorICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvcjoKKyAgICAgICAgICAgIEVuY29kZU5vbkZpbml0ZU9yUmFpc2Uod3JpdGUsIGVsZW1lbnQpCisgICAgICByZXR1cm4gRW5jb2RlUGFja2VkRmllbGQKKyAgICBlbGlmIGlzX3JlcGVhdGVkOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCisgICAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCBlbGVtZW50KSkKKyAgICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6CisgICAgICAgICAgICBFbmNvZGVOb25GaW5pdGVPclJhaXNlKHdyaXRlLCBlbGVtZW50KQorICAgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKKyAgICBlbHNlOgorICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCisgICAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgICB0cnk6CisgICAgICAgICAgd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCB2YWx1ZSkpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvcjoKKyAgICAgICAgICBFbmNvZGVOb25GaW5pdGVPclJhaXNlKHdyaXRlLCB2YWx1ZSkKKyAgICAgIHJldHVybiBFbmNvZGVGaWVsZAorCisgIHJldHVybiBTcGVjaWZpY0VuY29kZXIKKworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEhlcmUgd2UgZGVjbGFyZSBhbiBlbmNvZGVyIGNvbnN0cnVjdG9yIGZvciBlYWNoIGZpZWxkIHR5cGUuICBUaGVzZSB3b3JrCisjIHZlcnkgc2ltaWxhcmx5IHRvIHNpemVyIGNvbnN0cnVjdG9ycywgZGVzY3JpYmVkIGVhcmxpZXIuCisKKworSW50MzJFbmNvZGVyID0gSW50NjRFbmNvZGVyID0gRW51bUVuY29kZXIgPSBfU2ltcGxlRW5jb2RlcigKKyAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9FbmNvZGVTaWduZWRWYXJpbnQsIF9TaWduZWRWYXJpbnRTaXplKQorCitVSW50MzJFbmNvZGVyID0gVUludDY0RW5jb2RlciA9IF9TaW1wbGVFbmNvZGVyKAorICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0VuY29kZVZhcmludCwgX1ZhcmludFNpemUpCisKK1NJbnQzMkVuY29kZXIgPSBTSW50NjRFbmNvZGVyID0gX01vZGlmaWVkRW5jb2RlcigKKyAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9FbmNvZGVWYXJpbnQsIF9WYXJpbnRTaXplLAorICAgIHdpcmVfZm9ybWF0LlppZ1phZ0VuY29kZSkKKworIyBOb3RlIHRoYXQgUHl0aG9uIGNvbnZlbmllbnRseSBndWFyYW50ZWVzIHRoYXQgd2hlbiB1c2luZyB0aGUgJzwnIHByZWZpeCBvbgorIyBmb3JtYXRzLCB0aGV5IHdpbGwgYWxzbyBoYXZlIHRoZSBzYW1lIHNpemUgYWNyb3NzIGFsbCBwbGF0Zm9ybXMgKGFzIG9wcG9zZWQKKyMgdG8gd2l0aG91dCB0aGUgcHJlZml4LCB3aGVyZSB0aGVpciBzaXplcyBkZXBlbmQgb24gdGhlIEMgY29tcGlsZXIncyBiYXNpYworIyB0eXBlIHNpemVzKS4KK0ZpeGVkMzJFbmNvZGVyICA9IF9TdHJ1Y3RQYWNrRW5jb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLCAnPEknKQorRml4ZWQ2NEVuY29kZXIgID0gX1N0cnVjdFBhY2tFbmNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsICc8UScpCitTRml4ZWQzMkVuY29kZXIgPSBfU3RydWN0UGFja0VuY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwgJzxpJykKK1NGaXhlZDY0RW5jb2RlciA9IF9TdHJ1Y3RQYWNrRW5jb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LCAnPHEnKQorRmxvYXRFbmNvZGVyICAgID0gX0Zsb2F0aW5nUG9pbnRFbmNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsICc8ZicpCitEb3VibGVFbmNvZGVyICAgPSBfRmxvYXRpbmdQb2ludEVuY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwgJzxkJykKKworCitkZWYgQm9vbEVuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgIiIiUmV0dXJucyBhbiBlbmNvZGVyIGZvciBhIGJvb2xlYW4gZmllbGQuIiIiCisKKyAgZmFsc2VfYnl0ZSA9IGNocigwKQorICB0cnVlX2J5dGUgPSBjaHIoMSkKKyAgaWYgaXNfcGFja2VkOgorICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50CisgICAgZGVmIEVuY29kZVBhY2tlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICB3cml0ZSh0YWdfYnl0ZXMpCisgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGxlbih2YWx1ZSkpCisgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgaWYgZWxlbWVudDoKKyAgICAgICAgICB3cml0ZSh0cnVlX2J5dGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgd3JpdGUoZmFsc2VfYnl0ZSkKKyAgICByZXR1cm4gRW5jb2RlUGFja2VkRmllbGQKKyAgZWxpZiBpc19yZXBlYXRlZDoKKyAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKKyAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6CisgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKKyAgICAgICAgaWYgZWxlbWVudDoKKyAgICAgICAgICB3cml0ZSh0cnVlX2J5dGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgd3JpdGUoZmFsc2VfYnl0ZSkKKyAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKQorICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgd3JpdGUodGFnX2J5dGVzKQorICAgICAgaWYgdmFsdWU6CisgICAgICAgIHJldHVybiB3cml0ZSh0cnVlX2J5dGUpCisgICAgICByZXR1cm4gd3JpdGUoZmFsc2VfYnl0ZSkKKyAgICByZXR1cm4gRW5jb2RlRmllbGQKKworCitkZWYgU3RyaW5nRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgorICAiIiJSZXR1cm5zIGFuIGVuY29kZXIgZm9yIGEgc3RyaW5nIGZpZWxkLiIiIgorCisgIHRhZyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKKyAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAorICBsb2NhbF9sZW4gPSBsZW4KKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICBlbmNvZGVkID0gZWxlbWVudC5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgd3JpdGUodGFnKQorICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGxvY2FsX2xlbihlbmNvZGVkKSkKKyAgICAgICAgd3JpdGUoZW5jb2RlZCkKKyAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgZW5jb2RlZCA9IHZhbHVlLmVuY29kZSgndXRmLTgnKQorICAgICAgd3JpdGUodGFnKQorICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsb2NhbF9sZW4oZW5jb2RlZCkpCisgICAgICByZXR1cm4gd3JpdGUoZW5jb2RlZCkKKyAgICByZXR1cm4gRW5jb2RlRmllbGQKKworCitkZWYgQnl0ZXNFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6CisgICIiIlJldHVybnMgYW4gZW5jb2RlciBmb3IgYSBieXRlcyBmaWVsZC4iIiIKKworICB0YWcgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCisgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKKyAgbG9jYWxfbGVuID0gbGVuCisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgd3JpdGUodGFnKQorICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGxvY2FsX2xlbihlbGVtZW50KSkKKyAgICAgICAgd3JpdGUoZWxlbWVudCkKKyAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAorICBlbHNlOgorICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgorICAgICAgd3JpdGUodGFnKQorICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsb2NhbF9sZW4odmFsdWUpKQorICAgICAgcmV0dXJuIHdyaXRlKHZhbHVlKQorICAgIHJldHVybiBFbmNvZGVGaWVsZAorCisKK2RlZiBHcm91cEVuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgIiIiUmV0dXJucyBhbiBlbmNvZGVyIGZvciBhIGdyb3VwIGZpZWxkLiIiIgorCisgIHN0YXJ0X3RhZyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApCisgIGVuZF90YWcgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkKKyAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKKyAgaWYgaXNfcmVwZWF0ZWQ6CisgICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgorICAgICAgICB3cml0ZShzdGFydF90YWcpCisgICAgICAgIGVsZW1lbnQuX0ludGVybmFsU2VyaWFsaXplKHdyaXRlKQorICAgICAgICB3cml0ZShlbmRfdGFnKQorICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCisgIGVsc2U6CisgICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICB3cml0ZShzdGFydF90YWcpCisgICAgICB2YWx1ZS5fSW50ZXJuYWxTZXJpYWxpemUod3JpdGUpCisgICAgICByZXR1cm4gd3JpdGUoZW5kX3RhZykKKyAgICByZXR1cm4gRW5jb2RlRmllbGQKKworCitkZWYgTWVzc2FnZUVuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKKyAgIiIiUmV0dXJucyBhbiBlbmNvZGVyIGZvciBhIG1lc3NhZ2UgZmllbGQuIiIiCisKKyAgdGFnID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQorICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50CisgIGFzc2VydCBub3QgaXNfcGFja2VkCisgIGlmIGlzX3JlcGVhdGVkOgorICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6CisgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgd3JpdGUodGFnKQorICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGVsZW1lbnQuQnl0ZVNpemUoKSkKKyAgICAgICAgZWxlbWVudC5fSW50ZXJuYWxTZXJpYWxpemUod3JpdGUpCisgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKKyAgZWxzZToKKyAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICAgIHdyaXRlKHRhZykKKyAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgdmFsdWUuQnl0ZVNpemUoKSkKKyAgICAgIHJldHVybiB2YWx1ZS5fSW50ZXJuYWxTZXJpYWxpemUod3JpdGUpCisgICAgcmV0dXJuIEVuY29kZUZpZWxkCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBcyBiZWZvcmUsIE1lc3NhZ2VTZXQgaXMgc3BlY2lhbC4KKworCitkZWYgTWVzc2FnZVNldEl0ZW1FbmNvZGVyKGZpZWxkX251bWJlcik6CisgICIiIkVuY29kZXIgZm9yIGV4dGVuc2lvbnMgb2YgTWVzc2FnZVNldC4KKworICBUaGUgbWVzc2FnZSBzZXQgbWVzc2FnZSBsb29rcyBsaWtlIHRoaXM6CisgICAgbWVzc2FnZSBNZXNzYWdlU2V0IHsKKyAgICAgIHJlcGVhdGVkIGdyb3VwIEl0ZW0gPSAxIHsKKyAgICAgICAgcmVxdWlyZWQgaW50MzIgdHlwZV9pZCA9IDI7CisgICAgICAgIHJlcXVpcmVkIHN0cmluZyBtZXNzYWdlID0gMzsKKyAgICAgIH0KKyAgICB9CisgICIiIgorICBzdGFydF9ieXRlcyA9ICIiLmpvaW4oWworICAgICAgVGFnQnl0ZXMoMSwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApLAorICAgICAgVGFnQnl0ZXMoMiwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSwKKyAgICAgIF9WYXJpbnRCeXRlcyhmaWVsZF9udW1iZXIpLAorICAgICAgVGFnQnl0ZXMoMywgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCldKQorICBlbmRfYnl0ZXMgPSBUYWdCeXRlcygxLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApCisgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKKworICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKKyAgICB3cml0ZShzdGFydF9ieXRlcykKKyAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIHZhbHVlLkJ5dGVTaXplKCkpCisgICAgdmFsdWUuX0ludGVybmFsU2VyaWFsaXplKHdyaXRlKQorICAgIHJldHVybiB3cml0ZShlbmRfYnl0ZXMpCisKKyAgcmV0dXJuIEVuY29kZUZpZWxkCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9nZW5lcmF0b3JfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2dlbmVyYXRvcl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIzZjdkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9nZW5lcmF0b3JfdGVzdC5weQpAQCAtMCwwICsxLDI0NCBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBUT0RPKHJvYmluc29uKTogRmxlc2ggdGhpcyBvdXQgY29uc2lkZXJhYmx5LiAgV2UgZm9jdXNlZCBvbiByZWZsZWN0aW9uX3Rlc3QucHkKKyMgZmlyc3QsIHNpbmNlIGl0J3MgdGVzdGluZyB0aGUgc3VidGxlciBjb2RlLCBhbmQgc2luY2UgaXQgcHJvdmlkZXMgZGVjZW50CisjIGluZGlyZWN0IHRlc3Rpbmcgb2YgdGhlIHByb3RvY29sIGNvbXBpbGVyIG91dHB1dC4KKworIiIiVW5pdHRlc3QgdGhhdCBkaXJlY3RseSB0ZXN0cyB0aGUgb3V0cHV0IG9mIHRoZSBwdXJlLVB5dGhvbiBwcm90b2NvbAorY29tcGlsZXIuICBTZWUgLy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl90ZXN0LnB5IGZvciBhIHRlc3Qgd2hpY2gKK2Z1cnRoZXIgZW5zdXJlcyB0aGF0IHdlIGNhbiB1c2UgUHl0aG9uIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0cyBhcyB3ZSBleHBlY3QuCisiIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfaW1wb3J0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X21zZXRfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlc19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzZXJ2aWNlCisKK01BWF9FWFRFTlNJT04gPSA1MzY4NzA5MTIKKworCitjbGFzcyBHZW5lcmF0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdE5lc3RlZE1lc3NhZ2VEZXNjcmlwdG9yKHNlbGYpOgorICAgIGZpZWxkX25hbWUgPSAnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnCisgICAgcHJvdG9fdHlwZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBwcm90b190eXBlLk5lc3RlZE1lc3NhZ2UuREVTQ1JJUFRPUiwKKyAgICAgICAgcHJvdG9fdHlwZS5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lW2ZpZWxkX25hbWVdLm1lc3NhZ2VfdHlwZSkKKworICBkZWYgdGVzdEVudW1zKHNlbGYpOgorICAgICMgV2UgdGVzdCBvbmx5IG1vZHVsZS1sZXZlbCBlbnVtcyBoZXJlLgorICAgICMgVE9ETyhyb2JpbnNvbik6IEV4YW1pbmUgZGVzY3JpcHRvcnMgZGlyZWN0bHkgdG8gY2hlY2sKKyAgICAjIGVudW0gZGVzY3JpcHRvciBvdXRwdXQuCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCB1bml0dGVzdF9wYjIuRk9SRUlHTl9GT08pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCB1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg2LCB1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVopCisKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8uRk9PKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90by5CQVIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHByb3RvLkJBWikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFaKQorCisgIGRlZiB0ZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoKQorCisgICAgIyBQeXRob24gcHJlLTIuNiBkb2VzIG5vdCBoYXZlIGlzaW5mKCkgb3IgaXNuYW4oKSBmdW5jdGlvbnMsIHNvIHdlIGhhdmUKKyAgICAjIHRvIHByb3ZpZGUgb3VyIG93bi4KKyAgICBkZWYgaXNuYW4odmFsKToKKyAgICAgICMgTmFOIGlzIG5ldmVyIGVxdWFsIHRvIGl0c2VsZi4KKyAgICAgIHJldHVybiB2YWwgIT0gdmFsCisgICAgZGVmIGlzaW5mKHZhbCk6CisgICAgICAjIEluZmluaXR5IHRpbWVzIHplcm8gZXF1YWxzIE5hTi4KKyAgICAgIHJldHVybiBub3QgaXNuYW4odmFsKSBhbmQgaXNuYW4odmFsICogMCkKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihtZXNzYWdlLmluZl9kb3VibGUpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLmluZl9kb3VibGUgPiAwKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihtZXNzYWdlLm5lZ19pbmZfZG91YmxlKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5uZWdfaW5mX2RvdWJsZSA8IDApCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKG1lc3NhZ2UubmFuX2RvdWJsZSkpCisKKyAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYobWVzc2FnZS5pbmZfZmxvYXQpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLmluZl9mbG9hdCA+IDApCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKG1lc3NhZ2UubmVnX2luZl9mbG9hdCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UubmVnX2luZl9mbG9hdCA8IDApCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKG1lc3NhZ2UubmFuX2Zsb2F0KSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCI/ID8gPz8gPz8gPz8/ID8/LyA/Py0iLCBtZXNzYWdlLmNwcF90cmlncmFwaCkKKworICBkZWYgdGVzdEhhc0RlZmF1bHRWYWx1ZXMoc2VsZik6CisgICAgZGVzYyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUgorCisgICAgZXhwZWN0ZWRfaGFzX2RlZmF1bHRfYnlfbmFtZSA9IHsKKyAgICAgICAgJ29wdGlvbmFsX2ludDMyJzogRmFsc2UsCisgICAgICAgICdyZXBlYXRlZF9pbnQzMic6IEZhbHNlLAorICAgICAgICAnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnOiBGYWxzZSwKKyAgICAgICAgJ2RlZmF1bHRfaW50MzInOiBUcnVlLAorICAgIH0KKworICAgIGhhc19kZWZhdWx0X2J5X25hbWUgPSBkaWN0KAorICAgICAgICBbKGYubmFtZSwgZi5oYXNfZGVmYXVsdF92YWx1ZSkKKyAgICAgICAgIGZvciBmIGluIGRlc2MuZmllbGRzCisgICAgICAgICBpZiBmLm5hbWUgaW4gZXhwZWN0ZWRfaGFzX2RlZmF1bHRfYnlfbmFtZV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9oYXNfZGVmYXVsdF9ieV9uYW1lLCBoYXNfZGVmYXVsdF9ieV9uYW1lKQorCisgIGRlZiB0ZXN0Q29udGFpbmluZ1R5cGVCZWhhdmlvckZvckV4dGVuc2lvbnMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLmNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucy5ERVNDUklQVE9SKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5zaW5nbGUuY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zLkRFU0NSSVBUT1IpCisKKyAgZGVmIHRlc3RFeHRlbnNpb25TY29wZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24uZXh0ZW5zaW9uX3Njb3BlLAorICAgICAgICAgICAgICAgICAgICAgTm9uZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuc2luZ2xlLmV4dGVuc2lvbl9zY29wZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuREVTQ1JJUFRPUikKKworICBkZWYgdGVzdElzRXh0ZW5zaW9uKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLmlzX2V4dGVuc2lvbikKKyAgICBzZWxmLmFzc2VydFRydWUodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5zaW5nbGUuaXNfZXh0ZW5zaW9uKQorCisgICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5ERVNDUklQVE9SCisgICAgbm9uX2V4dGVuc2lvbl9kZXNjcmlwdG9yID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWydhJ10KKyAgICBzZWxmLmFzc2VydFRydWUobm90IG5vbl9leHRlbnNpb25fZGVzY3JpcHRvci5pc19leHRlbnNpb24pCisKKyAgZGVmIHRlc3RPcHRpb25zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXQoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5ERVNDUklQVE9SLkdldE9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCkKKworICBkZWYgdGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5UZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zKCkKKyAgICBlbnVtX29wdGlvbnMgPSBwcm90by5ERVNDUklQVE9SLmVudW1fdHlwZXNfYnlfbmFtZVsnQW5FbnVtJ10uR2V0T3B0aW9ucygpCisgICAgc2VsZi5hc3NlcnRUcnVlKGVudW1fb3B0aW9ucyBpcyBub3QgTm9uZSkKKyAgICAjIFRPRE8oZ3BzKTogV2UgcmVhbGx5IHNob3VsZCB0ZXN0IGZvciB0aGUgcHJlc2Vuc2Ugb2YgdGhlIGVudW1fb3B0MQorICAgICMgZXh0ZW5zaW9uIGFuZCBmb3IgaXRzIHZhbHVlIHRvIGJlIHNldCB0byAtNzg5LgorCisgIGRlZiB0ZXN0TmVzdGVkVHlwZXMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNldCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IubmVzdGVkX3R5cGVzKSwKKyAgICAgICAgc2V0KFsKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwLkRFU0NSSVBUT1IsCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAuREVTQ1JJUFRPUiwKKyAgICAgICAgXSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZS5ERVNDUklQVE9SLm5lc3RlZF90eXBlcywgW10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IubmVzdGVkX3R5cGVzLCBbXSkKKworICBkZWYgdGVzdENvbnRhaW5pbmdUeXBlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UuREVTQ1JJUFRPUi5jb250YWluaW5nX3R5cGUgaXMgTm9uZSkKKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUi5jb250YWluaW5nX3R5cGUgaXMgTm9uZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuREVTQ1JJUFRPUi5jb250YWluaW5nX3R5cGUsCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuREVTQ1JJUFRPUi5jb250YWluaW5nX3R5cGUsCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAuREVTQ1JJUFRPUi5jb250YWluaW5nX3R5cGUsCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUikKKworICBkZWYgdGVzdENvbnRhaW5pbmdUeXBlSW5FbnVtRGVzY3JpcHRvcihzZWxmKToKKyAgICBzZWxmLmFzc2VydFRydWUodW5pdHRlc3RfcGIyLl9GT1JFSUdORU5VTS5jb250YWluaW5nX3R5cGUgaXMgTm9uZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5fVEVTVEFMTFRZUEVTX05FU1RFREVOVU0uY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SKQorCisgIGRlZiB0ZXN0UGFja2FnZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuZmlsZS5wYWNrYWdlLAorICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QnKQorICAgIGRlc2MgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuREVTQ1JJUFRPUgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVzYy5maWxlLnBhY2thZ2UsICdwcm90b2J1Zl91bml0dGVzdCcpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfaW1wb3J0X3BiMi5JbXBvcnRNZXNzYWdlLkRFU0NSSVBUT1IuZmlsZS5wYWNrYWdlLAorICAgICAgICAncHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0JykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5fRk9SRUlHTkVOVU0uZmlsZS5wYWNrYWdlLCAncHJvdG9idWZfdW5pdHRlc3QnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5fVEVTVEFMTFRZUEVTX05FU1RFREVOVU0uZmlsZS5wYWNrYWdlLAorICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X2ltcG9ydF9wYjIuX0lNUE9SVEVOVU0uZmlsZS5wYWNrYWdlLAorICAgICAgICAncHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0JykKKworICBkZWYgdGVzdEV4dGVuc2lvblJhbmdlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUi5leHRlbnNpb25fcmFuZ2VzLCBbXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMuREVTQ1JJUFRPUi5leHRlbnNpb25fcmFuZ2VzLAorICAgICAgICBbKDEsIE1BWF9FWFRFTlNJT04pXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB1bml0dGVzdF9wYjIuVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkRFU0NSSVBUT1IuZXh0ZW5zaW9uX3JhbmdlcywKKyAgICAgICAgWyg0MiwgNDMpLCAoNDE0MywgNDI0NCksICg2NTUzNiwgTUFYX0VYVEVOU0lPTildKQorCisgIGRlZiB0ZXN0RmlsZURlc2NyaXB0b3Ioc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuREVTQ1JJUFRPUi5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuREVTQ1JJUFRPUi5wYWNrYWdlLCAncHJvdG9idWZfdW5pdHRlc3QnKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UodW5pdHRlc3RfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYiBpcyBOb25lKQorCisgIGRlZiB0ZXN0Tm9HZW5lcmljU2VydmljZXMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIodW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlc19wYjIsICJUZXN0TWVzc2FnZSIpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyLCAiRk9PIikpCisgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIodW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlc19wYjIsICJ0ZXN0X2V4dGVuc2lvbiIpKQorCisgICAgIyBNYWtlIHN1cmUgdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlc19wYjIgaGFzIG5vIHNlcnZpY2VzIHN1YmNsYXNzaW5nCisgICAgIyBQcm90bzIgU2VydmljZSBjbGFzcy4KKyAgICBpZiBoYXNhdHRyKHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyLCAiVGVzdFNlcnZpY2UiKToKKyAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyh1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMi5UZXN0U2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLlNlcnZpY2UpKQorCisgIGRlZiB0ZXN0TWVzc2FnZVR5cGVzQnlOYW1lKHNlbGYpOgorICAgIGZpbGVfdHlwZSA9IHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgdW5pdHRlc3RfcGIyLl9URVNUQUxMVFlQRVMsCisgICAgICAgIGZpbGVfdHlwZS5tZXNzYWdlX3R5cGVzX2J5X25hbWVbdW5pdHRlc3RfcGIyLl9URVNUQUxMVFlQRVMubmFtZV0pCisKKyAgICAjIE5lc3RlZCBtZXNzYWdlcyBzaG91bGRuJ3QgYmUgaW5jbHVkZWQgaW4gdGhlIG1lc3NhZ2VfdHlwZXNfYnlfbmFtZQorICAgICMgZGljdGlvbmFyeSAobGlrZSBpbiB0aGUgQysrIEFQSSkuCisgICAgc2VsZi5hc3NlcnRGYWxzZSgKKyAgICAgICAgdW5pdHRlc3RfcGIyLl9URVNUQUxMVFlQRVNfTkVTVEVETUVTU0FHRS5uYW1lIGluCisgICAgICAgIGZpbGVfdHlwZS5tZXNzYWdlX3R5cGVzX2J5X25hbWUpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX2xpc3RlbmVyLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9saXN0ZW5lci5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDgwMjM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9saXN0ZW5lci5weQpAQCAtMCwwICsxLDc4IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiRGVmaW5lcyBhIGxpc3RlbmVyIGludGVyZmFjZSBmb3Igb2JzZXJ2aW5nIGNlcnRhaW4KK3N0YXRlIHRyYW5zaXRpb25zIG9uIE1lc3NhZ2Ugb2JqZWN0cy4KKworQWxzbyBkZWZpbmVzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCisKK2NsYXNzIE1lc3NhZ2VMaXN0ZW5lcihvYmplY3QpOgorCisgICIiIkxpc3RlbnMgZm9yIG1vZGlmaWNhdGlvbnMgbWFkZSB0byBhIG1lc3NhZ2UuICBNZWFudCB0byBiZSByZWdpc3RlcmVkIHZpYQorICBNZXNzYWdlLl9TZXRMaXN0ZW5lcigpLgorCisgIEF0dHJpYnV0ZXM6CisgICAgZGlydHk6ICBJZiBUcnVlLCB0aGVuIGNhbGxpbmcgTW9kaWZpZWQoKSB3b3VsZCBiZSBhIG5vLW9wLiAgVGhpcyBjYW4gYmUKKyAgICAgICAgICAgIHVzZWQgdG8gYXZvaWQgdGhlc2UgY2FsbHMgZW50aXJlbHkgaW4gdGhlIGNvbW1vbiBjYXNlLgorICAiIiIKKworICBkZWYgTW9kaWZpZWQoc2VsZik6CisgICAgIiIiQ2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIG1lc3NhZ2UgaXMgbW9kaWZpZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBwYXJlbnQKKyAgICBtZXNzYWdlIG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQuICBUaGlzIGN1cnJlbnRseSBtZWFucyBlaXRoZXI6CisgICAgKGEpIFRoZSBtZXNzYWdlIHdhcyBtb2RpZmllZCBmb3IgdGhlIGZpcnN0IHRpbWUsIHNvIHRoZSBwYXJlbnQgbWVzc2FnZQorICAgICAgICBzaG91bGQgaGVuY2Vmb3J0aCBtYXJrIHRoZSBtZXNzYWdlIGFzIHByZXNlbnQuCisgICAgKGIpIFRoZSBtZXNzYWdlJ3MgY2FjaGVkIGJ5dGUgc2l6ZSBiZWNhbWUgZGlydHkgLS0gaS5lLiB0aGUgbWVzc2FnZSB3YXMKKyAgICAgICAgbW9kaWZpZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFmdGVyIGEgcHJldmlvdXMgY2FsbCB0byBCeXRlU2l6ZSgpLgorICAgICAgICBUaGVyZWZvcmUgdGhlIHBhcmVudCBzaG91bGQgYWxzbyBtYXJrIGl0cyBieXRlIHNpemUgYXMgZGlydHkuCisgICAgTm90ZSB0aGF0IChhKSBpbXBsaWVzIChiKSwgc2luY2UgbmV3IG9iamVjdHMgc3RhcnQgb3V0IHdpdGggYSBjbGllbnQgY2FjaGVkCisgICAgc2l6ZSAoemVybykuICBIb3dldmVyLCB3ZSBkb2N1bWVudCAoYSkgZXhwbGljaXRseSBiZWNhdXNlIGl0IGlzIGltcG9ydGFudC4KKworICAgIE1vZGlmaWVkKCkgd2lsbCAqb25seSogYmUgY2FsbGVkIGluIHJlc3BvbnNlIHRvIG9uZSBvZiB0aGVzZSB0d28gZXZlbnRzIC0tCisgICAgbm90IGV2ZXJ5IHRpbWUgdGhlIHN1Yi1tZXNzYWdlIGlzIG1vZGlmaWVkLgorCisgICAgTm90ZSB0aGF0IGlmIHRoZSBsaXN0ZW5lcidzIHxkaXJ0eXwgYXR0cmlidXRlIGlzIHRydWUsIHRoZW4gY2FsbGluZworICAgIE1vZGlmaWVkIGF0IHRoZSBtb21lbnQgd291bGQgYmUgYSBuby1vcCwgc28gaXQgY2FuIGJlIHNraXBwZWQuICBQZXJmb3JtYW5jZS0KKyAgICBzZW5zaXRpdmUgY2FsbGVycyBzaG91bGQgY2hlY2sgdGhpcyBhdHRyaWJ1dGUgZGlyZWN0bHkgYmVmb3JlIGNhbGxpbmcgc2luY2UKKyAgICBpdCB3aWxsIGJlIHRydWUgbW9zdCBvZiB0aGUgdGltZS4KKyAgICAiIiIKKworICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBOdWxsTWVzc2FnZUxpc3RlbmVyKG9iamVjdCk6CisKKyAgIiIiTm8tb3AgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLiIiIgorCisgIGRlZiBNb2RpZmllZChzZWxmKToKKyAgICBwYXNzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjUxNzQzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfdGVzdC5weQpAQCAtMCwwICsxLDM0MyBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdHMgcHl0aG9uIHByb3RvY29sIGJ1ZmZlcnMgYWdhaW5zdCB0aGUgZ29sZGVuIG1lc3NhZ2UuCisKK05vdGUgdGhhdCB0aGUgZ29sZGVuIG1lc3NhZ2VzIGV4ZXJjaXNlIGV2ZXJ5IGtub3duIGZpZWxkIHR5cGUsIHRodXMgdGhpcwordGVzdCBlbmRzIHVwIGV4ZXJjaXNpbmcgYW5kIHZlcmlmeWluZyBuZWFybHkgYWxsIG9mIHRoZSBwYXJzaW5nIGFuZAorc2VyaWFsaXphdGlvbiBjb2RlIGluIHRoZSB3aG9sZSBsaWJyYXJ5LgorCitUT0RPKGtlbnRvbik6ICBNZXJnZSB3aXRoIHdpcmVfZm9ybWF0X3Rlc3Q/ICBJdCBkb2Vzbid0IG1ha2UgYSB3aG9sZSBsb3Qgb2YKK3NlbnNlIHRvIGNhbGwgdGhpcyBhIHRlc3Qgb2YgdGhlICJtZXNzYWdlIiBtb2R1bGUsIHdoaWNoIG9ubHkgZGVjbGFyZXMgYW4KK2Fic3RyYWN0IGludGVyZmFjZS4KKyIiIgorCitfX2F1dGhvcl9fID0gJ2dwc0Bnb29nbGUuY29tIChHcmVnb3J5IFAuIFNtaXRoKScKKworaW1wb3J0IGNvcHkKK2ltcG9ydCBtYXRoCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9pbXBvcnRfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdF91dGlsCisKKyMgUHl0aG9uIHByZS0yLjYgZG9lcyBub3QgaGF2ZSBpc2luZigpIG9yIGlzbmFuKCkgZnVuY3Rpb25zLCBzbyB3ZSBoYXZlCisjIHRvIHByb3ZpZGUgb3VyIG93bi4KK2RlZiBpc25hbih2YWwpOgorICAjIE5hTiBpcyBuZXZlciBlcXVhbCB0byBpdHNlbGYuCisgIHJldHVybiB2YWwgIT0gdmFsCitkZWYgaXNpbmYodmFsKToKKyAgIyBJbmZpbml0eSB0aW1lcyB6ZXJvIGVxdWFscyBOYU4uCisgIHJldHVybiBub3QgaXNuYW4odmFsKSBhbmQgaXNuYW4odmFsICogMCkKK2RlZiBJc1Bvc0luZih2YWwpOgorICByZXR1cm4gaXNpbmYodmFsKSBhbmQgKHZhbCA+IDApCitkZWYgSXNOZWdJbmYodmFsKToKKyAgcmV0dXJuIGlzaW5mKHZhbCkgYW5kICh2YWwgPCAwKQorCitjbGFzcyBNZXNzYWdlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RHb2xkZW5NZXNzYWdlKHNlbGYpOgorICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGUoJ2dvbGRlbl9tZXNzYWdlJykucmVhZCgpCisgICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCisgICAgdGVzdF91dGlsLkV4cGVjdEFsbEZpZWxkc1NldChzZWxmLCBnb2xkZW5fbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydFRydWUoZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKKyAgICBnb2xkZW5fY29weSA9IGNvcHkuZGVlcGNvcHkoZ29sZGVuX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRUcnVlKGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkgPT0gZ29sZGVuX2RhdGEpCisKKyAgZGVmIHRlc3RHb2xkZW5FeHRlbnNpb25zKHNlbGYpOgorICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGUoJ2dvbGRlbl9tZXNzYWdlJykucmVhZCgpCisgICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKKyAgICBhbGxfc2V0ID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhhbGxfc2V0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGFsbF9zZXQsIGdvbGRlbl9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpID09IGdvbGRlbl9kYXRhKQorICAgIGdvbGRlbl9jb3B5ID0gY29weS5kZWVwY29weShnb2xkZW5fbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydFRydWUoZ29sZGVuX2NvcHkuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKKworICBkZWYgdGVzdEdvbGRlblBhY2tlZE1lc3NhZ2Uoc2VsZik6CisgICAgZ29sZGVuX2RhdGEgPSB0ZXN0X3V0aWwuR29sZGVuRmlsZSgnZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZScpLnJlYWQoKQorICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQorICAgIGFsbF9zZXQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsUGFja2VkRmllbGRzKGFsbF9zZXQpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoYWxsX3NldCwgZ29sZGVuX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRUcnVlKGFsbF9zZXQuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKKyAgICBnb2xkZW5fY29weSA9IGNvcHkuZGVlcGNvcHkoZ29sZGVuX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRUcnVlKGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkgPT0gZ29sZGVuX2RhdGEpCisKKyAgZGVmIHRlc3RHb2xkZW5QYWNrZWRFeHRlbnNpb25zKHNlbGYpOgorICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGUoJ2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UnKS5yZWFkKCkKKyAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucygpCisgICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQorICAgIGFsbF9zZXQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxQYWNrZWRFeHRlbnNpb25zKGFsbF9zZXQpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoYWxsX3NldCwgZ29sZGVuX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRUcnVlKGFsbF9zZXQuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKKyAgICBnb2xkZW5fY29weSA9IGNvcHkuZGVlcGNvcHkoZ29sZGVuX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRUcnVlKGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkgPT0gZ29sZGVuX2RhdGEpCisKKyAgZGVmIHRlc3RQb3NpdGl2ZUluZmluaXR5KHNlbGYpOgorICAgIGdvbGRlbl9kYXRhID0gKCdceDVEXHgwMFx4MDBceDgwXHg3RicKKyAgICAgICAgICAgICAgICAgICAnXHg2MVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceDdGJworICAgICAgICAgICAgICAgICAgICdceENEXHgwMlx4MDBceDAwXHg4MFx4N0YnCisgICAgICAgICAgICAgICAgICAgJ1x4RDFceDAyXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4N0YnKQorICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc1Bvc0luZihnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9mbG9hdCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLnJlcGVhdGVkX2Zsb2F0WzBdKSkKKyAgICBzZWxmLmFzc2VydFRydWUoSXNQb3NJbmYoZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzBdKSkKKyAgICBzZWxmLmFzc2VydFRydWUoZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKKworICBkZWYgdGVzdE5lZ2F0aXZlSW5maW5pdHkoc2VsZik6CisgICAgZ29sZGVuX2RhdGEgPSAoJ1x4NURceDAwXHgwMFx4ODBceEZGJworICAgICAgICAgICAgICAgICAgICdceDYxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnCisgICAgICAgICAgICAgICAgICAgJ1x4Q0RceDAyXHgwMFx4MDBceDgwXHhGRicKKyAgICAgICAgICAgICAgICAgICAnXHhEMVx4MDJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEYwXHhGRicpCisgICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCisgICAgc2VsZi5hc3NlcnRUcnVlKElzTmVnSW5mKGdvbGRlbl9tZXNzYWdlLm9wdGlvbmFsX2Zsb2F0KSkKKyAgICBzZWxmLmFzc2VydFRydWUoSXNOZWdJbmYoZ29sZGVuX21lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKSkKKyAgICBzZWxmLmFzc2VydFRydWUoSXNOZWdJbmYoZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMF0pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ0luZihnb2xkZW5fbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMF0pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpID09IGdvbGRlbl9kYXRhKQorCisgIGRlZiB0ZXN0Tm90QU51bWJlcihzZWxmKToKKyAgICBnb2xkZW5fZGF0YSA9ICgnXHg1RFx4MDBceDAwXHhDMFx4N0YnCisgICAgICAgICAgICAgICAgICAgJ1x4NjFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEY4XHg3RicKKyAgICAgICAgICAgICAgICAgICAnXHhDRFx4MDJceDAwXHgwMFx4QzBceDdGJworICAgICAgICAgICAgICAgICAgICdceEQxXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjhceDdGJykKKyAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZ29sZGVuX21lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9kb3VibGUpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihnb2xkZW5fbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKGdvbGRlbl9tZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVswXSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkgPT0gZ29sZGVuX2RhdGEpCisKKyAgZGVmIHRlc3RQb3NpdGl2ZUluZmluaXR5UGFja2VkKHNlbGYpOgorICAgIGdvbGRlbl9kYXRhID0gKCdceEEyXHgwNlx4MDRceDAwXHgwMFx4ODBceDdGJworICAgICAgICAgICAgICAgICAgICdceEFBXHgwNlx4MDhceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEYwXHg3RicpCisgICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCisgICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLnBhY2tlZF9mbG9hdFswXSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLnBhY2tlZF9kb3VibGVbMF0pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpID09IGdvbGRlbl9kYXRhKQorCisgIGRlZiB0ZXN0TmVnYXRpdmVJbmZpbml0eVBhY2tlZChzZWxmKToKKyAgICBnb2xkZW5fZGF0YSA9ICgnXHhBMlx4MDZceDA0XHgwMFx4MDBceDgwXHhGRicKKyAgICAgICAgICAgICAgICAgICAnXHhBQVx4MDZceDA4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnKQorICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ0luZihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZmxvYXRbMF0pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ0luZihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZG91YmxlWzBdKSkKKyAgICBzZWxmLmFzc2VydFRydWUoZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKKworICBkZWYgdGVzdE5vdEFOdW1iZXJQYWNrZWQoc2VsZik6CisgICAgZ29sZGVuX2RhdGEgPSAoJ1x4QTJceDA2XHgwNFx4MDBceDAwXHhDMFx4N0YnCisgICAgICAgICAgICAgICAgICAgJ1x4QUFceDA2XHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjhceDdGJykKKyAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQorICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZ29sZGVuX21lc3NhZ2UucGFja2VkX2Zsb2F0WzBdKSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZ29sZGVuX21lc3NhZ2UucGFja2VkX2RvdWJsZVswXSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkgPT0gZ29sZGVuX2RhdGEpCisKKyAgZGVmIHRlc3RFeHRyZW1lRmxvYXRWYWx1ZXMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgIyBNb3N0IHBvc2l0aXZlIGV4cG9uZW50LCBubyBzaWduaWZpY2FuZCBiaXRzIHNldC4KKyAgICBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzID0gbWF0aC5wb3coMiwgMTI3KQorICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IGtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMpCisKKyAgICAjIE1vc3QgcG9zaXRpdmUgZXhwb25lbnQsIG9uZSBzaWduaWZpY2FuZCBiaXQgc2V0LgorICAgIGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQgPSAxLjUgKiBtYXRoLnBvdygyLCAxMjcpCisgICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0ga01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdCkKKworICAgICMgUmVwZWF0IGxhc3QgdHdvIGNhc2VzIHdpdGggdmFsdWVzIG9mIHNhbWUgbWFnbml0dWRlLCBidXQgbmVnYXRpdmUuCisgICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IC1rTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IC1rTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzKQorCisgICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IC1rTW9zdFBvc0V4cG9uZW50T25lU2lnQml0CisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IC1rTW9zdFBvc0V4cG9uZW50T25lU2lnQml0KQorCisgICAgIyBNb3N0IG5lZ2F0aXZlIGV4cG9uZW50LCBubyBzaWduaWZpY2FuZCBiaXRzIHNldC4KKyAgICBrTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzID0gbWF0aC5wb3coMiwgLTEyNykKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0ga01vc3ROZWdFeHBvbmVudE5vU2lnQml0cworICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9PSBrTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzKQorCisgICAgIyBNb3N0IG5lZ2F0aXZlIGV4cG9uZW50LCBvbmUgc2lnbmlmaWNhbmQgYml0IHNldC4KKyAgICBrTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0ID0gMS41ICogbWF0aC5wb3coMiwgLTEyNykKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0ga01vc3ROZWdFeHBvbmVudE9uZVNpZ0JpdAorICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9PSBrTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0KQorCisgICAgIyBSZXBlYXQgbGFzdCB0d28gY2FzZXMgd2l0aCB2YWx1ZXMgb2YgdGhlIHNhbWUgbWFnbml0dWRlLCBidXQgbmVnYXRpdmUuCisgICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IC1rTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IC1rTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzKQorCisgICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IC1rTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0CisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IC1rTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0KQorCisgIGRlZiB0ZXN0RXh0cmVtZUZsb2F0VmFsdWVzKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgICMgTW9zdCBwb3NpdGl2ZSBleHBvbmVudCwgbm8gc2lnbmlmaWNhbmQgYml0cyBzZXQuCisgICAga01vc3RQb3NFeHBvbmVudE5vU2lnQml0cyA9IG1hdGgucG93KDIsIDEwMjMpCisgICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzKQorCisgICAgIyBNb3N0IHBvc2l0aXZlIGV4cG9uZW50LCBvbmUgc2lnbmlmaWNhbmQgYml0IHNldC4KKyAgICBrTW9zdFBvc0V4cG9uZW50T25lU2lnQml0ID0gMS41ICogbWF0aC5wb3coMiwgMTAyMykKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQpCisKKyAgICAjIFJlcGVhdCBsYXN0IHR3byBjYXNlcyB3aXRoIHZhbHVlcyBvZiBzYW1lIG1hZ25pdHVkZSwgYnV0IG5lZ2F0aXZlLgorICAgIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID0gLWtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IC1rTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzKQorCisgICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSAta01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdAorICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPT0gLWtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQpCisKKyAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG5vIHNpZ25pZmljYW5kIGJpdHMgc2V0LgorICAgIGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMgPSBtYXRoLnBvdygyLCAtMTAyMykKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMpCisKKyAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG9uZSBzaWduaWZpY2FuZCBiaXQgc2V0LgorICAgIGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQgPSAxLjUgKiBtYXRoLnBvdygyLCAtMTAyMykKKyAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQpCisKKyAgICAjIFJlcGVhdCBsYXN0IHR3byBjYXNlcyB3aXRoIHZhbHVlcyBvZiB0aGUgc2FtZSBtYWduaXR1ZGUsIGJ1dCBuZWdhdGl2ZS4KKyAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IC1rTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzCisgICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSAta01vc3ROZWdFeHBvbmVudE5vU2lnQml0cykKKworICAgIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID0gLWtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQKKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IC1rTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0KQorCisgIGRlZiB0ZXN0U29ydGluZ1JlcGVhdGVkU2NhbGFyRmllbGRzRGVmYXVsdENvbXBhcmF0b3Ioc2VsZik6CisgICAgIiIiQ2hlY2sgc29tZSBkaWZmZXJlbnQgdHlwZXMgd2l0aCB0aGUgZGVmYXVsdCBjb21wYXJhdG9yLiIiIgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgICMgVE9ETyhtYXR0cCk6IHdvdWxkIHRlc3RpbmcgbW9yZSBzY2FsYXIgdHlwZXMgc3RyZW5ndGhlbiB0ZXN0PworICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgyKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuc29ydCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzBdLCAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9pbnQzMlsxXSwgMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMl0sIDMpCisKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZCgxLjEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMS4zKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDEuMikKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LnNvcnQoKQorICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSwgMS4xKQorICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9mbG9hdFsxXSwgMS4yKQorICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9mbG9hdFsyXSwgMS4zKQorCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdhJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2MnKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYicpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuc29ydCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSwgJ2EnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMV0sICdiJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzJdLCAnYycpCisKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzLmFwcGVuZCgnYScpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcy5hcHBlbmQoJ2MnKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMuYXBwZW5kKCdiJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzLnNvcnQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9ieXRlc1swXSwgJ2EnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9ieXRlc1sxXSwgJ2InKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9ieXRlc1syXSwgJ2MnKQorCisgIGRlZiB0ZXN0U29ydGluZ1JlcGVhdGVkU2NhbGFyRmllbGRzQ3VzdG9tQ29tcGFyYXRvcihzZWxmKToKKyAgICAiIiJDaGVjayBzb21lIGRpZmZlcmVudCB0eXBlcyB3aXRoIGN1c3RvbSBjb21wYXJhdG9yLiIiIgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0zKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0yKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0xKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuc29ydChsYW1iZGEgeCx5OiBjbXAoYWJzKHgpLCBhYnMoeSkpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9pbnQzMlswXSwgLTEpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzFdLCAtMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMl0sIC0zKQorCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdhYWEnKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYmInKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYycpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuc29ydChsYW1iZGEgeCx5OiBjbXAobGVuKHgpLCBsZW4oeSkpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMF0sICdjJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdLCAnYmInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMl0sICdhYWEnKQorCisgIGRlZiB0ZXN0U29ydGluZ1JlcGVhdGVkQ29tcG9zaXRlRmllbGRzQ3VzdG9tQ29tcGFyYXRvcihzZWxmKToKKyAgICAiIiJDaGVjayBwYXNzaW5nIGEgY3VzdG9tIGNvbXBhcmF0b3IgdG8gc29ydCBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4iIiIKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAzCisgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDIKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gNgorICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSA1CisgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDQKKyAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnNvcnQobGFtYmRhIHgseTogY21wKHguYmIsIHkuYmIpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYiwgMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0uYmIsIDIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzJdLmJiLCAzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVszXS5iYiwgNCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbNF0uYmIsIDUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzVdLmJiLCA2KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDk3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX2V4dGVuc2lvbnMucHJvdG8KQEAgLTAsMCArMSw1OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiByb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKQorCisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsOworCisKK21lc3NhZ2UgVG9wTGV2ZWxNZXNzYWdlIHsKKyAgb3B0aW9uYWwgRXh0ZW5kZWRNZXNzYWdlIHN1Ym1lc3NhZ2UgPSAxOworfQorCisKK21lc3NhZ2UgRXh0ZW5kZWRNZXNzYWdlIHsKKyAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKK30KKworCittZXNzYWdlIEZvcmVpZ25NZXNzYWdlIHsKKyAgb3B0aW9uYWwgaW50MzIgZm9yZWlnbl9tZXNzYWdlX2ludCA9IDE7Cit9CisKKworZXh0ZW5kIEV4dGVuZGVkTWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludF9leHRlbnNpb24gPSAxOworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBvcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbiA9IDI7CisKKyAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50X2V4dGVuc2lvbiA9IDM7CisgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlIHJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uID0gNDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfbWVzc2FnZXMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX21lc3NhZ2VzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDFiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX21lc3NhZ2VzLnByb3RvCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbikKKworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbDsKKworLy8gQSBtZXNzYWdlIHdoZXJlIHRhZyBudW1iZXJzIGFyZSBsaXN0ZWQgb3V0IG9mIG9yZGVyLCB0byBhbGxvdyB1cyB0byB0ZXN0IG91cgorLy8gY2Fub25pY2FsaXphdGlvbiBvZiBzZXJpYWxpemVkIG91dHB1dCwgd2hpY2ggc2hvdWxkIGFsd2F5cyBiZSBpbiB0YWcgb3JkZXIuCisvLyBXZSBhbHNvIG1peCBpbiBzb21lIGV4dGVuc2lvbnMgZm9yIGV4dHJhIGZ1bi4KK21lc3NhZ2UgT3V0T2ZPcmRlckZpZWxkcyB7CisgIG9wdGlvbmFsICAgc2ludDMyIG9wdGlvbmFsX3NpbnQzMiAgID0gIDU7CisgIGV4dGVuc2lvbnMgNCB0byA0OworICBvcHRpb25hbCAgIHVpbnQzMiBvcHRpb25hbF91aW50MzIgICA9ICAzOworICBleHRlbnNpb25zIDIgdG8gMjsKKyAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzIgICAgPSAgMTsKK307CisKKworZXh0ZW5kIE91dE9mT3JkZXJGaWVsZHMgeworICBvcHRpb25hbCAgIHVpbnQ2NCBvcHRpb25hbF91aW50NjQgICA9ICA0OworICBvcHRpb25hbCAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NCAgICA9ICAyOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcHl0aG9uX21lc3NhZ2UucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9weXRob25fbWVzc2FnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmZjYTkxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcHl0aG9uX21lc3NhZ2UucHkKQEAgLTAsMCArMSwxMDk4IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBUaGlzIGNvZGUgaXMgbWVhbnQgdG8gd29yayBvbiBQeXRob24gMi40IGFuZCBhYm92ZSBvbmx5LgorIworIyBUT0RPKHJvYmluc29uKTogSGVscGVycyBmb3IgdmVyYm9zZSwgY29tbW9uIGNoZWNrcyBsaWtlIHNlZWluZyBpZiBhCisjIGRlc2NyaXB0b3IncyBjcHBfdHlwZSBpcyBDUFBUWVBFX01FU1NBR0UuCisKKyIiIkNvbnRhaW5zIGEgbWV0YWNsYXNzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgdG8gY3JlYXRlCitwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgZnJvbSBEZXNjcmlwdG9yIG9iamVjdHMgYXQgcnVudGltZS4KKworUmVjYWxsIHRoYXQgYSBtZXRhY2xhc3MgaXMgdGhlICJ0eXBlIiBvZiBhIGNsYXNzLgorKEEgY2xhc3MgaXMgdG8gYSBtZXRhY2xhc3Mgd2hhdCBhbiBpbnN0YW5jZSBpcyB0byBhIGNsYXNzLikKKworSW4gdGhpcyBjYXNlLCB3ZSB1c2UgdGhlIEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUgbWV0YWNsYXNzCit0byBpbmplY3QgYWxsIHRoZSB1c2VmdWwgZnVuY3Rpb25hbGl0eSBpbnRvIHRoZSBjbGFzc2VzCitvdXRwdXQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyIGF0IGNvbXBpbGUtdGltZS4KKworVGhlIHVwc2hvdCBvZiBhbGwgdGhpcyBpcyB0aGF0IHRoZSByZWFsIGltcGxlbWVudGF0aW9uCitkZXRhaWxzIGZvciBBTEwgcHVyZS1QeXRob24gcHJvdG9jb2wgYnVmZmVycyBhcmUgKmhlcmUgaW4KK3RoaXMgZmlsZSouCisiIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKwordHJ5OgorICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB3ZWFrcmVmCisKKyMgV2UgdXNlICJhcyIgdG8gYXZvaWQgbmFtZSBjb2xsaXNpb25zIHdpdGggdmFyaWFibGVzLgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGNvbnRhaW5lcnMKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBkZWNvZGVyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZW5jb2RlcgorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IG1lc3NhZ2VfbGlzdGVuZXIgYXMgbWVzc2FnZV9saXN0ZW5lcl9tb2QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0eXBlX2NoZWNrZXJzCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yIGFzIGRlc2NyaXB0b3JfbW9kCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZSBhcyBtZXNzYWdlX21vZAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0CisKK19GaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yX21vZC5GaWVsZERlc2NyaXB0b3IKKworCitkZWYgTmV3TWVzc2FnZShkZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KToKKyAgX0FkZENsYXNzQXR0cmlidXRlc0Zvck5lc3RlZEV4dGVuc2lvbnMoZGVzY3JpcHRvciwgZGljdGlvbmFyeSkKKyAgX0FkZFNsb3RzKGRlc2NyaXB0b3IsIGRpY3Rpb25hcnkpCisKKworZGVmIEluaXRNZXNzYWdlKGRlc2NyaXB0b3IsIGNscyk6CisgIGNscy5fZGVjb2RlcnNfYnlfdGFnID0ge30KKyAgY2xzLl9leHRlbnNpb25zX2J5X25hbWUgPSB7fQorICBjbHMuX2V4dGVuc2lvbnNfYnlfbnVtYmVyID0ge30KKyAgaWYgKGRlc2NyaXB0b3IuaGFzX29wdGlvbnMgYW5kCisgICAgICBkZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCk6CisgICAgY2xzLl9kZWNvZGVyc19ieV90YWdbZGVjb2Rlci5NRVNTQUdFX1NFVF9JVEVNX1RBR10gPSAoCisgICAgICAgIGRlY29kZXIuTWVzc2FnZVNldEl0ZW1EZWNvZGVyKGNscy5fZXh0ZW5zaW9uc19ieV9udW1iZXIpKQorCisgICMgQXR0YWNoIHN0dWZmIHRvIGVhY2ggRmllbGREZXNjcmlwdG9yIGZvciBxdWljayBsb29rdXAgbGF0ZXIgb24uCisgIGZvciBmaWVsZCBpbiBkZXNjcmlwdG9yLmZpZWxkczoKKyAgICBfQXR0YWNoRmllbGRIZWxwZXJzKGNscywgZmllbGQpCisKKyAgX0FkZEVudW1WYWx1ZXMoZGVzY3JpcHRvciwgY2xzKQorICBfQWRkSW5pdE1ldGhvZChkZXNjcmlwdG9yLCBjbHMpCisgIF9BZGRQcm9wZXJ0aWVzRm9yRmllbGRzKGRlc2NyaXB0b3IsIGNscykKKyAgX0FkZFByb3BlcnRpZXNGb3JFeHRlbnNpb25zKGRlc2NyaXB0b3IsIGNscykKKyAgX0FkZFN0YXRpY01ldGhvZHMoY2xzKQorICBfQWRkTWVzc2FnZU1ldGhvZHMoZGVzY3JpcHRvciwgY2xzKQorICBfQWRkUHJpdmF0ZUhlbHBlck1ldGhvZHMoY2xzKQorCisKKyMgU3RhdGVsZXNzIGhlbHBlcnMgZm9yIEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUgYmVsb3cuCisjIE91dHNpZGUgY2xpZW50cyBzaG91bGQgbm90IGFjY2VzcyB0aGVzZSBkaXJlY3RseS4KKyMKKyMgSSBvcHRlZCBub3QgdG8gbWFrZSBhbnkgb2YgdGhlc2UgbWV0aG9kcyBvbiB0aGUgbWV0YWNsYXNzLCB0byBtYWtlIGl0IG1vcmUKKyMgY2xlYXIgdGhhdCBJJ20gbm90IHJlYWxseSB1c2luZyBhbnkgc3RhdGUgdGhlcmUgYW5kIHRvIGtlZXAgY2xpZW50cyBmcm9tCisjIHRoaW5raW5nIHRoYXQgdGhleSBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlc2UgY29uc3RydWN0aW9uIGhlbHBlcnMuCisKKworZGVmIF9Qcm9wZXJ0eU5hbWUocHJvdG9fZmllbGRfbmFtZSk6CisgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHB1YmxpYyBwcm9wZXJ0eSBhdHRyaWJ1dGUgd2hpY2gKKyAgY2xpZW50cyBjYW4gdXNlIHRvIGdldCBhbmQgKGluIHNvbWUgY2FzZXMpIHNldCB0aGUgdmFsdWUKKyAgb2YgYSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkLgorCisgIEFyZ3M6CisgICAgcHJvdG9fZmllbGRfbmFtZTogVGhlIHByb3RvY29sIG1lc3NhZ2UgZmllbGQgbmFtZSwgZXhhY3RseQorICAgICAgYXMgaXQgYXBwZWFycyAob3Igd291bGQgYXBwZWFyKSBpbiBhIC5wcm90byBmaWxlLgorICAiIiIKKyAgIyBUT0RPKHJvYmluc29uKTogRXNjYXBlIFB5dGhvbiBrZXl3b3JkcyAoZS5nLiwgeWllbGQpLCBhbmQgdGVzdCB0aGlzIHN1cHBvcnQuCisgICMgbm5vcndpdHogbWFrZXMgbXkgZGF5IGJ5IHdyaXRpbmc6CisgICMgIiIiCisgICMgRllJLiAgU2VlIHRoZSBrZXl3b3JkIG1vZHVsZSBpbiB0aGUgc3RkbGliLiBUaGlzIGNvdWxkIGJlIGFzIHNpbXBsZSBhczoKKyAgIworICAjIGlmIGtleXdvcmQuaXNrZXl3b3JkKHByb3RvX2ZpZWxkX25hbWUpOgorICAjICAgcmV0dXJuIHByb3RvX2ZpZWxkX25hbWUgKyAiXyIKKyAgIyByZXR1cm4gcHJvdG9fZmllbGRfbmFtZQorICAjICIiIgorICAjIEtlbnRvbiBzYXlzOiAgVGhlIGFib3ZlIGlzIGEgQkFEIElERUEuICBQZW9wbGUgcmVseSBvbiBiZWluZyBhYmxlIHRvIHVzZQorICAjICAgZ2V0YXR0cigpIGFuZCBzZXRhdHRyKCkgdG8gcmVmbGVjdGl2ZWx5IG1hbmlwdWxhdGUgZmllbGQgdmFsdWVzLiAgSWYgd2UKKyAgIyAgIHJlbmFtZSB0aGUgcHJvcGVydGllcywgdGhlbiBldmVyeSBzdWNoIHVzZXIgaGFzIHRvIGFsc28gbWFrZSBzdXJlIHRvIGFwcGx5CisgICMgICB0aGUgc2FtZSB0cmFuc2Zvcm1hdGlvbi4gIE5vdGUgdGhhdCBjdXJyZW50bHkgaWYgeW91IG5hbWUgYSBmaWVsZCAieWllbGQiLAorICAjICAgeW91IGNhbiBzdGlsbCBhY2Nlc3MgaXQganVzdCBmaW5lIHVzaW5nIGdldGF0dHIvc2V0YXR0ciAtLSBpdCdzIG5vdCBldmVuCisgICMgICB0aGF0IGN1bWJlcnNvbWUgdG8gZG8gc28uCisgICMgVE9ETyhrZW50b24pOiAgUmVtb3ZlIHRoaXMgbWV0aG9kIGVudGlyZWx5IGlmL3doZW4gZXZlcnlvbmUgYWdyZWVzIHdpdGggbXkKKyAgIyAgIHBvc2l0aW9uLgorICByZXR1cm4gcHJvdG9fZmllbGRfbmFtZQorCisKK2RlZiBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKG1lc3NhZ2UsIGV4dGVuc2lvbl9oYW5kbGUpOgorICAiIiJWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIGhhbmRsZSBpcyB2YWxpZC4iIiIKKworICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb25faGFuZGxlLCBfRmllbGREZXNjcmlwdG9yKToKKyAgICByYWlzZSBLZXlFcnJvcignSGFzRXh0ZW5zaW9uKCkgZXhwZWN0cyBhbiBleHRlbnNpb24gaGFuZGxlLCBnb3Q6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZSkKKworICBpZiBub3QgZXh0ZW5zaW9uX2hhbmRsZS5pc19leHRlbnNpb246CisgICAgcmFpc2UgS2V5RXJyb3IoJyIlcyIgaXMgbm90IGFuIGV4dGVuc2lvbi4nICUgZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUpCisKKyAgaWYgZXh0ZW5zaW9uX2hhbmRsZS5jb250YWluaW5nX3R5cGUgaXMgbm90IG1lc3NhZ2UuREVTQ1JJUFRPUjoKKyAgICByYWlzZSBLZXlFcnJvcignRXh0ZW5zaW9uICIlcyIgZXh0ZW5kcyBtZXNzYWdlIHR5cGUgIiVzIiwgYnV0IHRoaXMgJworICAgICAgICAgICAgICAgICAgICdtZXNzYWdlIGlzIG9mIHR5cGUgIiVzIi4nICUKKyAgICAgICAgICAgICAgICAgICAoZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUsCisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9oYW5kbGUuY29udGFpbmluZ190eXBlLmZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ERVNDUklQVE9SLmZ1bGxfbmFtZSkpCisKKworZGVmIF9BZGRTbG90cyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGRpY3Rpb25hcnkpOgorICAiIiJBZGRzIGEgX19zbG90c19fIGVudHJ5IHRvIGRpY3Rpb25hcnksIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB2YWxpZAorICBhdHRyaWJ1dGVzIGZvciB0aGlzIG1lc3NhZ2UgdHlwZS4KKworICBBcmdzOgorICAgIG1lc3NhZ2VfZGVzY3JpcHRvcjogQSBEZXNjcmlwdG9yIGluc3RhbmNlIGRlc2NyaWJpbmcgdGhpcyBtZXNzYWdlIHR5cGUuCisgICAgZGljdGlvbmFyeTogQ2xhc3MgZGljdGlvbmFyeSB0byB3aGljaCB3ZSdsbCBhZGQgYSAnX19zbG90c19fJyBlbnRyeS4KKyAgIiIiCisgIGRpY3Rpb25hcnlbJ19fc2xvdHNfXyddID0gWydfY2FjaGVkX2J5dGVfc2l6ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfZmllbGRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19pc19wcmVzZW50X2luX3BhcmVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfbGlzdGVuZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfX3dlYWtyZWZfXyddCisKKworZGVmIF9Jc01lc3NhZ2VTZXRFeHRlbnNpb24oZmllbGQpOgorICByZXR1cm4gKGZpZWxkLmlzX2V4dGVuc2lvbiBhbmQKKyAgICAgICAgICBmaWVsZC5jb250YWluaW5nX3R5cGUuaGFzX29wdGlvbnMgYW5kCisgICAgICAgICAgZmllbGQuY29udGFpbmluZ190eXBlLkdldE9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCBhbmQKKyAgICAgICAgICBmaWVsZC50eXBlID09IF9GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFIGFuZAorICAgICAgICAgIGZpZWxkLm1lc3NhZ2VfdHlwZSA9PSBmaWVsZC5leHRlbnNpb25fc2NvcGUgYW5kCisgICAgICAgICAgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9PUFRJT05BTCkKKworCitkZWYgX0F0dGFjaEZpZWxkSGVscGVycyhjbHMsIGZpZWxkX2Rlc2NyaXB0b3IpOgorICBpc19yZXBlYXRlZCA9IChmaWVsZF9kZXNjcmlwdG9yLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQpCisgIGlzX3BhY2tlZCA9IChmaWVsZF9kZXNjcmlwdG9yLmhhc19vcHRpb25zIGFuZAorICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkucGFja2VkKQorCisgIGlmIF9Jc01lc3NhZ2VTZXRFeHRlbnNpb24oZmllbGRfZGVzY3JpcHRvcik6CisgICAgZmllbGRfZW5jb2RlciA9IGVuY29kZXIuTWVzc2FnZVNldEl0ZW1FbmNvZGVyKGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyKQorICAgIHNpemVyID0gZW5jb2Rlci5NZXNzYWdlU2V0SXRlbVNpemVyKGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyKQorICBlbHNlOgorICAgIGZpZWxkX2VuY29kZXIgPSB0eXBlX2NoZWNrZXJzLlRZUEVfVE9fRU5DT0RFUltmaWVsZF9kZXNjcmlwdG9yLnR5cGVdKAorICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCkKKyAgICBzaXplciA9IHR5cGVfY2hlY2tlcnMuVFlQRV9UT19TSVpFUltmaWVsZF9kZXNjcmlwdG9yLnR5cGVdKAorICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCkKKworICBmaWVsZF9kZXNjcmlwdG9yLl9lbmNvZGVyID0gZmllbGRfZW5jb2RlcgorICBmaWVsZF9kZXNjcmlwdG9yLl9zaXplciA9IHNpemVyCisgIGZpZWxkX2Rlc2NyaXB0b3IuX2RlZmF1bHRfY29uc3RydWN0b3IgPSBfRGVmYXVsdFZhbHVlQ29uc3RydWN0b3JGb3JGaWVsZCgKKyAgICAgIGZpZWxkX2Rlc2NyaXB0b3IpCisKKyAgZGVmIEFkZERlY29kZXIod2lyZXR5cGUsIGlzX3BhY2tlZCk6CisgICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwgd2lyZXR5cGUpCisgICAgY2xzLl9kZWNvZGVyc19ieV90YWdbdGFnX2J5dGVzXSA9ICgKKyAgICAgICAgdHlwZV9jaGVja2Vycy5UWVBFX1RPX0RFQ09ERVJbZmllbGRfZGVzY3JpcHRvci50eXBlXSgKKyAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLAorICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvciwgZmllbGRfZGVzY3JpcHRvci5fZGVmYXVsdF9jb25zdHJ1Y3RvcikpCisKKyAgQWRkRGVjb2Rlcih0eXBlX2NoZWNrZXJzLkZJRUxEX1RZUEVfVE9fV0lSRV9UWVBFW2ZpZWxkX2Rlc2NyaXB0b3IudHlwZV0sCisgICAgICAgICAgICAgRmFsc2UpCisKKyAgaWYgaXNfcmVwZWF0ZWQgYW5kIHdpcmVfZm9ybWF0LklzVHlwZVBhY2thYmxlKGZpZWxkX2Rlc2NyaXB0b3IudHlwZSk6CisgICAgIyBUbyBzdXBwb3J0IHdpcmUgY29tcGF0aWJpbGl0eSBvZiBhZGRpbmcgcGFja2VkID0gdHJ1ZSwgYWRkIGEgZGVjb2RlciBmb3IKKyAgICAjIHBhY2tlZCB2YWx1ZXMgcmVnYXJkbGVzcyBvZiB0aGUgZmllbGQncyBvcHRpb25zLgorICAgIEFkZERlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgVHJ1ZSkKKworCitkZWYgX0FkZENsYXNzQXR0cmlidXRlc0Zvck5lc3RlZEV4dGVuc2lvbnMoZGVzY3JpcHRvciwgZGljdGlvbmFyeSk6CisgIGV4dGVuc2lvbl9kaWN0ID0gZGVzY3JpcHRvci5leHRlbnNpb25zX2J5X25hbWUKKyAgZm9yIGV4dGVuc2lvbl9uYW1lLCBleHRlbnNpb25fZmllbGQgaW4gZXh0ZW5zaW9uX2RpY3QuaXRlcml0ZW1zKCk6CisgICAgYXNzZXJ0IGV4dGVuc2lvbl9uYW1lIG5vdCBpbiBkaWN0aW9uYXJ5CisgICAgZGljdGlvbmFyeVtleHRlbnNpb25fbmFtZV0gPSBleHRlbnNpb25fZmllbGQKKworCitkZWYgX0FkZEVudW1WYWx1ZXMoZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiU2V0cyBjbGFzcy1sZXZlbCBhdHRyaWJ1dGVzIGZvciBhbGwgZW51bSBmaWVsZHMgZGVmaW5lZCBpbiB0aGlzIG1lc3NhZ2UuCisKKyAgQXJnczoKKyAgICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yIG9iamVjdCBmb3IgdGhpcyBtZXNzYWdlIHR5cGUuCisgICAgY2xzOiBDbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLgorICAiIiIKKyAgZm9yIGVudW1fdHlwZSBpbiBkZXNjcmlwdG9yLmVudW1fdHlwZXM6CisgICAgZm9yIGVudW1fdmFsdWUgaW4gZW51bV90eXBlLnZhbHVlczoKKyAgICAgIHNldGF0dHIoY2xzLCBlbnVtX3ZhbHVlLm5hbWUsIGVudW1fdmFsdWUubnVtYmVyKQorCisKK2RlZiBfRGVmYXVsdFZhbHVlQ29uc3RydWN0b3JGb3JGaWVsZChmaWVsZCk6CisgICIiIlJldHVybnMgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmaWVsZC4KKworICBBcmdzOgorICAgIGZpZWxkOiBGaWVsZERlc2NyaXB0b3Igb2JqZWN0IGZvciB0aGlzIGZpZWxkLgorCisgIFRoZSByZXR1cm5lZCBmdW5jdGlvbiBoYXMgb25lIGFyZ3VtZW50OgorICAgIG1lc3NhZ2U6IE1lc3NhZ2UgaW5zdGFuY2UgY29udGFpbmluZyB0aGlzIGZpZWxkLCBvciBhIHdlYWtyZWYgcHJveHkKKyAgICAgIG9mIHNhbWUuCisKKyAgVGhhdCBmdW5jdGlvbiBpbiB0dXJuIHJldHVybnMgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGZpZWxkLiAgVGhlIGRlZmF1bHQKKyAgICB2YWx1ZSBtYXkgcmVmZXIgYmFjayB0byB8bWVzc2FnZXwgdmlhIGEgd2VhayByZWZlcmVuY2UuCisgICIiIgorCisgIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgaWYgZmllbGQuZGVmYXVsdF92YWx1ZSAhPSBbXToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1JlcGVhdGVkIGZpZWxkIGRlZmF1bHQgdmFsdWUgbm90IGVtcHR5IGxpc3Q6ICVzJyAlICgKKyAgICAgICAgICBmaWVsZC5kZWZhdWx0X3ZhbHVlKSkKKyAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICMgV2UgY2FuJ3QgbG9vayBhdCBfY29uY3JldGVfY2xhc3MgeWV0IHNpbmNlIGl0IG1pZ2h0IG5vdCBoYXZlCisgICAgICAjIGJlZW4gc2V0LiAgKERlcGVuZHMgb24gb3JkZXIgaW4gd2hpY2ggd2UgaW5pdGlhbGl6ZSB0aGUgY2xhc3NlcykuCisgICAgICBtZXNzYWdlX3R5cGUgPSBmaWVsZC5tZXNzYWdlX3R5cGUKKyAgICAgIGRlZiBNYWtlUmVwZWF0ZWRNZXNzYWdlRGVmYXVsdChtZXNzYWdlKToKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcnMuUmVwZWF0ZWRDb21wb3NpdGVGaWVsZENvbnRhaW5lcigKKyAgICAgICAgICAgIG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbiwgZmllbGQubWVzc2FnZV90eXBlKQorICAgICAgcmV0dXJuIE1ha2VSZXBlYXRlZE1lc3NhZ2VEZWZhdWx0CisgICAgZWxzZToKKyAgICAgIHR5cGVfY2hlY2tlciA9IHR5cGVfY2hlY2tlcnMuR2V0VHlwZUNoZWNrZXIoZmllbGQuY3BwX3R5cGUsIGZpZWxkLnR5cGUpCisgICAgICBkZWYgTWFrZVJlcGVhdGVkU2NhbGFyRGVmYXVsdChtZXNzYWdlKToKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcnMuUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lcigKKyAgICAgICAgICAgIG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbiwgdHlwZV9jaGVja2VyKQorICAgICAgcmV0dXJuIE1ha2VSZXBlYXRlZFNjYWxhckRlZmF1bHQKKworICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAjIF9jb25jcmV0ZV9jbGFzcyBtYXkgbm90IHlldCBiZSBpbml0aWFsaXplZC4KKyAgICBtZXNzYWdlX3R5cGUgPSBmaWVsZC5tZXNzYWdlX3R5cGUKKyAgICBkZWYgTWFrZVN1Yk1lc3NhZ2VEZWZhdWx0KG1lc3NhZ2UpOgorICAgICAgcmVzdWx0ID0gbWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcygpCisgICAgICByZXN1bHQuX1NldExpc3RlbmVyKG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbikKKyAgICAgIHJldHVybiByZXN1bHQKKyAgICByZXR1cm4gTWFrZVN1Yk1lc3NhZ2VEZWZhdWx0CisKKyAgZGVmIE1ha2VTY2FsYXJEZWZhdWx0KG1lc3NhZ2UpOgorICAgIHJldHVybiBmaWVsZC5kZWZhdWx0X3ZhbHVlCisgIHJldHVybiBNYWtlU2NhbGFyRGVmYXVsdAorCisKK2RlZiBfQWRkSW5pdE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkFkZHMgYW4gX19pbml0X18gbWV0aG9kIHRvIGNscy4iIiIKKyAgZmllbGRzID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkcworICBkZWYgaW5pdChzZWxmLCAqKmt3YXJncyk6CisgICAgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZSA9IDAKKyAgICBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5ID0gbGVuKGt3YXJncykgPiAwCisgICAgc2VsZi5fZmllbGRzID0ge30KKyAgICBzZWxmLl9pc19wcmVzZW50X2luX3BhcmVudCA9IEZhbHNlCisgICAgc2VsZi5fbGlzdGVuZXIgPSBtZXNzYWdlX2xpc3RlbmVyX21vZC5OdWxsTWVzc2FnZUxpc3RlbmVyKCkKKyAgICBzZWxmLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4gPSBfTGlzdGVuZXIoc2VsZikKKyAgICBmb3IgZmllbGRfbmFtZSwgZmllbGRfdmFsdWUgaW4ga3dhcmdzLml0ZXJpdGVtcygpOgorICAgICAgZmllbGQgPSBfR2V0RmllbGRCeU5hbWUobWVzc2FnZV9kZXNjcmlwdG9yLCBmaWVsZF9uYW1lKQorICAgICAgaWYgZmllbGQgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcygpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lLCBmaWVsZF9uYW1lKSkKKyAgICAgIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICAgIGNvcHkgPSBmaWVsZC5fZGVmYXVsdF9jb25zdHJ1Y3RvcihzZWxmKQorICAgICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRTogICMgQ29tcG9zaXRlCisgICAgICAgICAgZm9yIHZhbCBpbiBmaWVsZF92YWx1ZToKKyAgICAgICAgICAgIGNvcHkuYWRkKCkuTWVyZ2VGcm9tKHZhbCkKKyAgICAgICAgZWxzZTogICMgU2NhbGFyCisgICAgICAgICAgY29weS5leHRlbmQoZmllbGRfdmFsdWUpCisgICAgICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSBjb3B5CisgICAgICBlbGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBjb3B5ID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKKyAgICAgICAgY29weS5NZXJnZUZyb20oZmllbGRfdmFsdWUpCisgICAgICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSBjb3B5CisgICAgICBlbHNlOgorICAgICAgICBzZXRhdHRyKHNlbGYsIGZpZWxkX25hbWUsIGZpZWxkX3ZhbHVlKQorCisgIGluaXQuX19tb2R1bGVfXyA9IE5vbmUKKyAgaW5pdC5fX2RvY19fID0gTm9uZQorICBjbHMuX19pbml0X18gPSBpbml0CisKKworZGVmIF9HZXRGaWVsZEJ5TmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IsIGZpZWxkX25hbWUpOgorICAiIiJSZXR1cm5zIGEgZmllbGQgZGVzY3JpcHRvciBieSBmaWVsZCBuYW1lLgorCisgIEFyZ3M6CisgICAgbWVzc2FnZV9kZXNjcmlwdG9yOiBBIERlc2NyaXB0b3IgZGVzY3JpYmluZyBhbGwgZmllbGRzIGluIG1lc3NhZ2UuCisgICAgZmllbGRfbmFtZTogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIHJldHJpZXZlLgorICBSZXR1cm5zOgorICAgIFRoZSBmaWVsZCBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmllbGQgbmFtZS4KKyAgIiIiCisgIHRyeToKKyAgICByZXR1cm4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lW2ZpZWxkX25hbWVdCisgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdQcm90b2NvbCBtZXNzYWdlIGhhcyBubyAiJXMiIGZpZWxkLicgJSBmaWVsZF9uYW1lKQorCisKK2RlZiBfQWRkUHJvcGVydGllc0ZvckZpZWxkcyhkZXNjcmlwdG9yLCBjbHMpOgorICAiIiJBZGRzIHByb3BlcnRpZXMgZm9yIGFsbCBmaWVsZHMgaW4gdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUuIiIiCisgIGZvciBmaWVsZCBpbiBkZXNjcmlwdG9yLmZpZWxkczoKKyAgICBfQWRkUHJvcGVydGllc0ZvckZpZWxkKGZpZWxkLCBjbHMpCisKKyAgaWYgZGVzY3JpcHRvci5pc19leHRlbmRhYmxlOgorICAgICMgX0V4dGVuc2lvbkRpY3QgaXMganVzdCBhbiBhZGFwdG9yIHdpdGggbm8gc3RhdGUgc28gd2UgYWxsb2NhdGUgYSBuZXcgb25lCisgICAgIyBldmVyeSB0aW1lIGl0IGlzIGFjY2Vzc2VkLgorICAgIGNscy5FeHRlbnNpb25zID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IF9FeHRlbnNpb25EaWN0KHNlbGYpKQorCisKK2RlZiBfQWRkUHJvcGVydGllc0ZvckZpZWxkKGZpZWxkLCBjbHMpOgorICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhIHByb3RvY29sIG1lc3NhZ2UgZmllbGQuCisgIENsaWVudHMgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGdldCBhbmQgKGluIHRoZSBjYXNlCisgIG9mIG5vbi1yZXBlYXRlZCBzY2FsYXIgZmllbGRzKSBkaXJlY3RseSBzZXQgdGhlIHZhbHVlCisgIG9mIGEgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4KKworICBBcmdzOgorICAgIGZpZWxkOiBBIEZpZWxkRGVzY3JpcHRvciBmb3IgdGhpcyBmaWVsZC4KKyAgICBjbHM6IFRoZSBjbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcuCisgICIiIgorICAjIENhdGNoIGl0IGlmIHdlIGFkZCBvdGhlciB0eXBlcyB0aGF0IHdlIHNob3VsZAorICAjIGhhbmRsZSBzcGVjaWFsbHkgaGVyZS4KKyAgYXNzZXJ0IF9GaWVsZERlc2NyaXB0b3IuTUFYX0NQUFRZUEUgPT0gMTAKKworICBjb25zdGFudF9uYW1lID0gZmllbGQubmFtZS51cHBlcigpICsgIl9GSUVMRF9OVU1CRVIiCisgIHNldGF0dHIoY2xzLCBjb25zdGFudF9uYW1lLCBmaWVsZC5udW1iZXIpCisKKyAgaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICBfQWRkUHJvcGVydGllc0ZvclJlcGVhdGVkRmllbGQoZmllbGQsIGNscykKKyAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICBfQWRkUHJvcGVydGllc0Zvck5vblJlcGVhdGVkQ29tcG9zaXRlRmllbGQoZmllbGQsIGNscykKKyAgZWxzZToKKyAgICBfQWRkUHJvcGVydGllc0Zvck5vblJlcGVhdGVkU2NhbGFyRmllbGQoZmllbGQsIGNscykKKworCitkZWYgX0FkZFByb3BlcnRpZXNGb3JSZXBlYXRlZEZpZWxkKGZpZWxkLCBjbHMpOgorICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhICJyZXBlYXRlZCIgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4gIENsaWVudHMKKyAgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLCB3aGljaCB3aWxsIGJlIGVpdGhlciBhCisgIF9SZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyIG9yIF9SZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyIChzZWUKKyAgYmVsb3cpLgorCisgIE5vdGUgdGhhdCB3aGVuIGNsaWVudHMgYWRkIHZhbHVlcyB0byB0aGVzZSBjb250YWluZXJzLCB3ZSBwZXJmb3JtCisgIHR5cGUtY2hlY2tpbmcgaW4gdGhlIGNhc2Ugb2YgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcywgYW5kIHdlIGFsc28gc2V0IGFueQorICBuZWNlc3NhcnkgImhhcyIgYml0cyBhcyBhIHNpZGUtZWZmZWN0LgorCisgIEFyZ3M6CisgICAgZmllbGQ6IEEgRmllbGREZXNjcmlwdG9yIGZvciB0aGlzIGZpZWxkLgorICAgIGNsczogVGhlIGNsYXNzIHdlJ3JlIGNvbnN0cnVjdGluZy4KKyAgIiIiCisgIHByb3RvX2ZpZWxkX25hbWUgPSBmaWVsZC5uYW1lCisgIHByb3BlcnR5X25hbWUgPSBfUHJvcGVydHlOYW1lKHByb3RvX2ZpZWxkX25hbWUpCisKKyAgZGVmIGdldHRlcihzZWxmKToKKyAgICBmaWVsZF92YWx1ZSA9IHNlbGYuX2ZpZWxkcy5nZXQoZmllbGQpCisgICAgaWYgZmllbGRfdmFsdWUgaXMgTm9uZToKKyAgICAgICMgQ29uc3RydWN0IGEgbmV3IG9iamVjdCB0byByZXByZXNlbnQgdGhpcyBmaWVsZC4KKyAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKKworICAgICAgIyBBdG9taWNhbGx5IGNoZWNrIGlmIGFub3RoZXIgdGhyZWFkIGhhcyBwcmVlbXB0ZWQgdXMgYW5kLCBpZiBub3QsIHN3YXAKKyAgICAgICMgaW4gdGhlIG5ldyBvYmplY3Qgd2UganVzdCBjcmVhdGVkLiAgSWYgc29tZW9uZSBoYXMgcHJlZW1wdGVkIHVzLCB3ZQorICAgICAgIyB0YWtlIHRoYXQgb2JqZWN0IGFuZCBkaXNjYXJkIG91cnMuCisgICAgICAjIFdBUk5JTkc6ICBXZSBhcmUgcmVseWluZyBvbiBzZXRkZWZhdWx0KCkgYmVpbmcgYXRvbWljLiAgVGhpcyBpcyB0cnVlCisgICAgICAjICAgaW4gQ1B5dGhvbiBidXQgd2UgaGF2ZW4ndCBpbnZlc3RpZ2F0ZWQgb3RoZXJzLiAgVGhpcyB3YXJuaW5nIGFwcGVhcnMKKyAgICAgICMgICBpbiBzZXZlcmFsIG90aGVyIGxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuCisgICAgICBmaWVsZF92YWx1ZSA9IHNlbGYuX2ZpZWxkcy5zZXRkZWZhdWx0KGZpZWxkLCBmaWVsZF92YWx1ZSkKKyAgICByZXR1cm4gZmllbGRfdmFsdWUKKyAgZ2V0dGVyLl9fbW9kdWxlX18gPSBOb25lCisgIGdldHRlci5fX2RvY19fID0gJ0dldHRlciBmb3IgJXMuJyAlIHByb3RvX2ZpZWxkX25hbWUKKworICAjIFdlIGRlZmluZSBhIHNldHRlciBqdXN0IHNvIHdlIGNhbiB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBhIG1vcmUKKyAgIyBoZWxwZnVsIGVycm9yIG1lc3NhZ2UuCisgIGRlZiBzZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKKyAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcignQXNzaWdubWVudCBub3QgYWxsb3dlZCB0byByZXBlYXRlZCBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJyIlcyIgaW4gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3QuJyAlIHByb3RvX2ZpZWxkX25hbWUpCisKKyAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIHByb3RvX2ZpZWxkX25hbWUKKyAgc2V0YXR0cihjbHMsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5KGdldHRlciwgc2V0dGVyLCBkb2M9ZG9jKSkKKworCitkZWYgX0FkZFByb3BlcnRpZXNGb3JOb25SZXBlYXRlZFNjYWxhckZpZWxkKGZpZWxkLCBjbHMpOgorICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhIG5vbnJlcGVhdGVkLCBzY2FsYXIgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4KKyAgQ2xpZW50cyBjYW4gdXNlIHRoaXMgcHJvcGVydHkgdG8gZ2V0IGFuZCBkaXJlY3RseSBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KKyAgTm90ZSB0aGF0IHdoZW4gdGhlIGNsaWVudCBzZXRzIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIGJ5IHVzaW5nIHRoaXMgcHJvcGVydHksCisgIGFsbCBuZWNlc3NhcnkgImhhcyIgYml0cyBhcmUgc2V0IGFzIGEgc2lkZS1lZmZlY3QsIGFuZCB3ZSBhbHNvIHBlcmZvcm0KKyAgdHlwZS1jaGVja2luZy4KKworICBBcmdzOgorICAgIGZpZWxkOiBBIEZpZWxkRGVzY3JpcHRvciBmb3IgdGhpcyBmaWVsZC4KKyAgICBjbHM6IFRoZSBjbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcuCisgICIiIgorICBwcm90b19maWVsZF9uYW1lID0gZmllbGQubmFtZQorICBwcm9wZXJ0eV9uYW1lID0gX1Byb3BlcnR5TmFtZShwcm90b19maWVsZF9uYW1lKQorICB0eXBlX2NoZWNrZXIgPSB0eXBlX2NoZWNrZXJzLkdldFR5cGVDaGVja2VyKGZpZWxkLmNwcF90eXBlLCBmaWVsZC50eXBlKQorICBkZWZhdWx0X3ZhbHVlID0gZmllbGQuZGVmYXVsdF92YWx1ZQorICB2YWxpZF92YWx1ZXMgPSBzZXQoKQorCisgIGRlZiBnZXR0ZXIoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX2ZpZWxkcy5nZXQoZmllbGQsIGRlZmF1bHRfdmFsdWUpCisgIGdldHRlci5fX21vZHVsZV9fID0gTm9uZQorICBnZXR0ZXIuX19kb2NfXyA9ICdHZXR0ZXIgZm9yICVzLicgJSBwcm90b19maWVsZF9uYW1lCisgIGRlZiBzZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKKyAgICB0eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZShuZXdfdmFsdWUpCisgICAgc2VsZi5fZmllbGRzW2ZpZWxkXSA9IG5ld192YWx1ZQorICAgICMgQ2hlY2sgX2NhY2hlZF9ieXRlX3NpemVfZGlydHkgaW5saW5lIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHNpbmNlIHNjYWxhcgorICAgICMgc2V0dGVycyBhcmUgY2FsbGVkIGZyZXF1ZW50bHkuCisgICAgaWYgbm90IHNlbGYuX2NhY2hlZF9ieXRlX3NpemVfZGlydHk6CisgICAgICBzZWxmLl9Nb2RpZmllZCgpCisKKyAgc2V0dGVyLl9fbW9kdWxlX18gPSBOb25lCisgIHNldHRlci5fX2RvY19fID0gJ1NldHRlciBmb3IgJXMuJyAlIHByb3RvX2ZpZWxkX25hbWUKKworICAjIEFkZCBhIHByb3BlcnR5IHRvIGVuY2Fwc3VsYXRlIHRoZSBnZXR0ZXIvc2V0dGVyLgorICBkb2MgPSAnTWFnaWMgYXR0cmlidXRlIGdlbmVyYXRlZCBmb3IgIiVzIiBwcm90byBmaWVsZC4nICUgcHJvdG9fZmllbGRfbmFtZQorICBzZXRhdHRyKGNscywgcHJvcGVydHlfbmFtZSwgcHJvcGVydHkoZ2V0dGVyLCBzZXR0ZXIsIGRvYz1kb2MpKQorCisKK2RlZiBfQWRkUHJvcGVydGllc0Zvck5vblJlcGVhdGVkQ29tcG9zaXRlRmllbGQoZmllbGQsIGNscyk6CisgICIiIkFkZHMgYSBwdWJsaWMgcHJvcGVydHkgZm9yIGEgbm9ucmVwZWF0ZWQsIGNvbXBvc2l0ZSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkLgorICBBIGNvbXBvc2l0ZSBmaWVsZCBpcyBhICJncm91cCIgb3IgIm1lc3NhZ2UiIGZpZWxkLgorCisgIENsaWVudHMgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLCBidXQgY2Fubm90CisgIGFzc2lnbiB0byB0aGUgcHJvcGVydHkgZGlyZWN0bHkuCisKKyAgQXJnczoKKyAgICBmaWVsZDogQSBGaWVsZERlc2NyaXB0b3IgZm9yIHRoaXMgZmllbGQuCisgICAgY2xzOiBUaGUgY2xhc3Mgd2UncmUgY29uc3RydWN0aW5nLgorICAiIiIKKyAgIyBUT0RPKHJvYmluc29uKTogUmVtb3ZlIGR1cGxpY2F0aW9uIHdpdGggc2ltaWxhciBtZXRob2QKKyAgIyBmb3Igbm9uLXJlcGVhdGVkIHNjYWxhcnMuCisgIHByb3RvX2ZpZWxkX25hbWUgPSBmaWVsZC5uYW1lCisgIHByb3BlcnR5X25hbWUgPSBfUHJvcGVydHlOYW1lKHByb3RvX2ZpZWxkX25hbWUpCisgIG1lc3NhZ2VfdHlwZSA9IGZpZWxkLm1lc3NhZ2VfdHlwZQorCisgIGRlZiBnZXR0ZXIoc2VsZik6CisgICAgZmllbGRfdmFsdWUgPSBzZWxmLl9maWVsZHMuZ2V0KGZpZWxkKQorICAgIGlmIGZpZWxkX3ZhbHVlIGlzIE5vbmU6CisgICAgICAjIENvbnN0cnVjdCBhIG5ldyBvYmplY3QgdG8gcmVwcmVzZW50IHRoaXMgZmllbGQuCisgICAgICBmaWVsZF92YWx1ZSA9IG1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoKQorICAgICAgZmllbGRfdmFsdWUuX1NldExpc3RlbmVyKHNlbGYuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbikKKworICAgICAgIyBBdG9taWNhbGx5IGNoZWNrIGlmIGFub3RoZXIgdGhyZWFkIGhhcyBwcmVlbXB0ZWQgdXMgYW5kLCBpZiBub3QsIHN3YXAKKyAgICAgICMgaW4gdGhlIG5ldyBvYmplY3Qgd2UganVzdCBjcmVhdGVkLiAgSWYgc29tZW9uZSBoYXMgcHJlZW1wdGVkIHVzLCB3ZQorICAgICAgIyB0YWtlIHRoYXQgb2JqZWN0IGFuZCBkaXNjYXJkIG91cnMuCisgICAgICAjIFdBUk5JTkc6ICBXZSBhcmUgcmVseWluZyBvbiBzZXRkZWZhdWx0KCkgYmVpbmcgYXRvbWljLiAgVGhpcyBpcyB0cnVlCisgICAgICAjICAgaW4gQ1B5dGhvbiBidXQgd2UgaGF2ZW4ndCBpbnZlc3RpZ2F0ZWQgb3RoZXJzLiAgVGhpcyB3YXJuaW5nIGFwcGVhcnMKKyAgICAgICMgICBpbiBzZXZlcmFsIG90aGVyIGxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuCisgICAgICBmaWVsZF92YWx1ZSA9IHNlbGYuX2ZpZWxkcy5zZXRkZWZhdWx0KGZpZWxkLCBmaWVsZF92YWx1ZSkKKyAgICByZXR1cm4gZmllbGRfdmFsdWUKKyAgZ2V0dGVyLl9fbW9kdWxlX18gPSBOb25lCisgIGdldHRlci5fX2RvY19fID0gJ0dldHRlciBmb3IgJXMuJyAlIHByb3RvX2ZpZWxkX25hbWUKKworICAjIFdlIGRlZmluZSBhIHNldHRlciBqdXN0IHNvIHdlIGNhbiB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBhIG1vcmUKKyAgIyBoZWxwZnVsIGVycm9yIG1lc3NhZ2UuCisgIGRlZiBzZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKKyAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcignQXNzaWdubWVudCBub3QgYWxsb3dlZCB0byBjb21wb3NpdGUgZmllbGQgJworICAgICAgICAgICAgICAgICAgICAgICAgICciJXMiIGluIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0LicgJSBwcm90b19maWVsZF9uYW1lKQorCisgICMgQWRkIGEgcHJvcGVydHkgdG8gZW5jYXBzdWxhdGUgdGhlIGdldHRlci4KKyAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIHByb3RvX2ZpZWxkX25hbWUKKyAgc2V0YXR0cihjbHMsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5KGdldHRlciwgc2V0dGVyLCBkb2M9ZG9jKSkKKworCitkZWYgX0FkZFByb3BlcnRpZXNGb3JFeHRlbnNpb25zKGRlc2NyaXB0b3IsIGNscyk6CisgICIiIkFkZHMgcHJvcGVydGllcyBmb3IgYWxsIGZpZWxkcyBpbiB0aGlzIHByb3RvY29sIG1lc3NhZ2UgdHlwZS4iIiIKKyAgZXh0ZW5zaW9uX2RpY3QgPSBkZXNjcmlwdG9yLmV4dGVuc2lvbnNfYnlfbmFtZQorICBmb3IgZXh0ZW5zaW9uX25hbWUsIGV4dGVuc2lvbl9maWVsZCBpbiBleHRlbnNpb25fZGljdC5pdGVyaXRlbXMoKToKKyAgICBjb25zdGFudF9uYW1lID0gZXh0ZW5zaW9uX25hbWUudXBwZXIoKSArICJfRklFTERfTlVNQkVSIgorICAgIHNldGF0dHIoY2xzLCBjb25zdGFudF9uYW1lLCBleHRlbnNpb25fZmllbGQubnVtYmVyKQorCisKK2RlZiBfQWRkU3RhdGljTWV0aG9kcyhjbHMpOgorICAjIFRPRE8ocm9iaW5zb24pOiBUaGlzIHByb2JhYmx5IG5lZWRzIHRvIGJlIHRocmVhZC1zYWZlKD8pCisgIGRlZiBSZWdpc3RlckV4dGVuc2lvbihleHRlbnNpb25faGFuZGxlKToKKyAgICBleHRlbnNpb25faGFuZGxlLmNvbnRhaW5pbmdfdHlwZSA9IGNscy5ERVNDUklQVE9SCisgICAgX0F0dGFjaEZpZWxkSGVscGVycyhjbHMsIGV4dGVuc2lvbl9oYW5kbGUpCisKKyAgICAjIFRyeSB0byBpbnNlcnQgb3VyIGV4dGVuc2lvbiwgZmFpbGluZyBpZiBhbiBleHRlbnNpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIKKyAgICAjIGFscmVhZHkgZXhpc3RzLgorICAgIGFjdHVhbF9oYW5kbGUgPSBjbHMuX2V4dGVuc2lvbnNfYnlfbnVtYmVyLnNldGRlZmF1bHQoCisgICAgICAgIGV4dGVuc2lvbl9oYW5kbGUubnVtYmVyLCBleHRlbnNpb25faGFuZGxlKQorICAgIGlmIGFjdHVhbF9oYW5kbGUgaXMgbm90IGV4dGVuc2lvbl9oYW5kbGU6CisgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKKyAgICAgICAgICAnRXh0ZW5zaW9ucyAiJXMiIGFuZCAiJXMiIGJvdGggdHJ5IHRvIGV4dGVuZCBtZXNzYWdlIHR5cGUgIiVzIiB3aXRoICcKKyAgICAgICAgICAnZmllbGQgbnVtYmVyICVkLicgJQorICAgICAgICAgIChleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZSwgYWN0dWFsX2hhbmRsZS5mdWxsX25hbWUsCisgICAgICAgICAgIGNscy5ERVNDUklQVE9SLmZ1bGxfbmFtZSwgZXh0ZW5zaW9uX2hhbmRsZS5udW1iZXIpKQorCisgICAgY2xzLl9leHRlbnNpb25zX2J5X25hbWVbZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWVdID0gZXh0ZW5zaW9uX2hhbmRsZQorCisgICAgaGFuZGxlID0gZXh0ZW5zaW9uX2hhbmRsZSAgIyBhdm9pZCBsaW5lIHdyYXBwaW5nCisgICAgaWYgX0lzTWVzc2FnZVNldEV4dGVuc2lvbihoYW5kbGUpOgorICAgICAgIyBNZXNzYWdlU2V0IGV4dGVuc2lvbi4gIEFsc28gcmVnaXN0ZXIgdW5kZXIgdHlwZSBuYW1lLgorICAgICAgY2xzLl9leHRlbnNpb25zX2J5X25hbWVbCisgICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZS5tZXNzYWdlX3R5cGUuZnVsbF9uYW1lXSA9IGV4dGVuc2lvbl9oYW5kbGUKKworICBjbHMuUmVnaXN0ZXJFeHRlbnNpb24gPSBzdGF0aWNtZXRob2QoUmVnaXN0ZXJFeHRlbnNpb24pCisKKyAgZGVmIEZyb21TdHJpbmcocyk6CisgICAgbWVzc2FnZSA9IGNscygpCisgICAgbWVzc2FnZS5NZXJnZUZyb21TdHJpbmcocykKKyAgICByZXR1cm4gbWVzc2FnZQorICBjbHMuRnJvbVN0cmluZyA9IHN0YXRpY21ldGhvZChGcm9tU3RyaW5nKQorCisKK2RlZiBfSXNQcmVzZW50KGl0ZW0pOgorICAiIiJHaXZlbiBhIChGaWVsZERlc2NyaXB0b3IsIHZhbHVlKSB0dXBsZSBmcm9tIF9maWVsZHMsIHJldHVybiB0cnVlIGlmIHRoZQorICB2YWx1ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QgcmV0dXJuZWQgYnkgTGlzdEZpZWxkcygpLiIiIgorCisgIGlmIGl0ZW1bMF0ubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICByZXR1cm4gYm9vbChpdGVtWzFdKQorICBlbGlmIGl0ZW1bMF0uY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgcmV0dXJuIGl0ZW1bMV0uX2lzX3ByZXNlbnRfaW5fcGFyZW50CisgIGVsc2U6CisgICAgcmV0dXJuIFRydWUKKworCitkZWYgX0FkZExpc3RGaWVsZHNNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorCisgIGRlZiBMaXN0RmllbGRzKHNlbGYpOgorICAgIGFsbF9maWVsZHMgPSBbaXRlbSBmb3IgaXRlbSBpbiBzZWxmLl9maWVsZHMuaXRlcml0ZW1zKCkgaWYgX0lzUHJlc2VudChpdGVtKV0KKyAgICBhbGxfZmllbGRzLnNvcnQoa2V5ID0gbGFtYmRhIGl0ZW06IGl0ZW1bMF0ubnVtYmVyKQorICAgIHJldHVybiBhbGxfZmllbGRzCisKKyAgY2xzLkxpc3RGaWVsZHMgPSBMaXN0RmllbGRzCisKKworZGVmIF9BZGRIYXNGaWVsZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisKKyAgc2luZ3VsYXJfZmllbGRzID0ge30KKyAgZm9yIGZpZWxkIGluIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHM6CisgICAgaWYgZmllbGQubGFiZWwgIT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgIHNpbmd1bGFyX2ZpZWxkc1tmaWVsZC5uYW1lXSA9IGZpZWxkCisKKyAgZGVmIEhhc0ZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgorICAgIHRyeToKKyAgICAgIGZpZWxkID0gc2luZ3VsYXJfZmllbGRzW2ZpZWxkX25hbWVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAnUHJvdG9jb2wgbWVzc2FnZSBoYXMgbm8gc2luZ3VsYXIgIiVzIiBmaWVsZC4nICUgZmllbGRfbmFtZSkKKworICAgIGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgdmFsdWUgPSBzZWxmLl9maWVsZHMuZ2V0KGZpZWxkKQorICAgICAgcmV0dXJuIHZhbHVlIGlzIG5vdCBOb25lIGFuZCB2YWx1ZS5faXNfcHJlc2VudF9pbl9wYXJlbnQKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIGZpZWxkIGluIHNlbGYuX2ZpZWxkcworICBjbHMuSGFzRmllbGQgPSBIYXNGaWVsZAorCisKK2RlZiBfQWRkQ2xlYXJGaWVsZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisgIGRlZiBDbGVhckZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgorICAgIHRyeToKKyAgICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lW2ZpZWxkX25hbWVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcignUHJvdG9jb2wgbWVzc2FnZSBoYXMgbm8gIiVzIiBmaWVsZC4nICUgZmllbGRfbmFtZSkKKworICAgIGlmIGZpZWxkIGluIHNlbGYuX2ZpZWxkczoKKyAgICAgICMgTm90ZTogIElmIHRoZSBmaWVsZCBpcyBhIHN1Yi1tZXNzYWdlLCBpdHMgbGlzdGVuZXIgd2lsbCBzdGlsbCBwb2ludAorICAgICAgIyAgIGF0IHVzLiAgVGhhdCdzIGZpbmUsIGJlY2F1c2UgdGhlIHdvcnN0IHRoYW4gY2FuIGhhcHBlbiBpcyB0aGF0IGl0CisgICAgICAjICAgd2lsbCBjYWxsIF9Nb2RpZmllZCgpIGFuZCBpbnZhbGlkYXRlIG91ciBieXRlIHNpemUuICBCaWcgZGVhbC4KKyAgICAgIGRlbCBzZWxmLl9maWVsZHNbZmllbGRdCisKKyAgICAjIEFsd2F5cyBjYWxsIF9Nb2RpZmllZCgpIC0tIGV2ZW4gaWYgbm90aGluZyB3YXMgY2hhbmdlZCwgdGhpcyBpcworICAgICMgYSBtdXRhdGluZyBtZXRob2QsIGFuZCB0aHVzIGNhbGxpbmcgaXQgc2hvdWxkIGNhdXNlIHRoZSBmaWVsZCB0byBiZWNvbWUKKyAgICAjIHByZXNlbnQgaW4gdGhlIHBhcmVudCBtZXNzYWdlLgorICAgIHNlbGYuX01vZGlmaWVkKCkKKworICBjbHMuQ2xlYXJGaWVsZCA9IENsZWFyRmllbGQKKworCitkZWYgX0FkZENsZWFyRXh0ZW5zaW9uTWV0aG9kKGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisgIGRlZiBDbGVhckV4dGVuc2lvbihzZWxmLCBleHRlbnNpb25faGFuZGxlKToKKyAgICBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpCisKKyAgICAjIFNpbWlsYXIgdG8gQ2xlYXJGaWVsZCgpLCBhYm92ZS4KKyAgICBpZiBleHRlbnNpb25faGFuZGxlIGluIHNlbGYuX2ZpZWxkczoKKyAgICAgIGRlbCBzZWxmLl9maWVsZHNbZXh0ZW5zaW9uX2hhbmRsZV0KKyAgICBzZWxmLl9Nb2RpZmllZCgpCisgIGNscy5DbGVhckV4dGVuc2lvbiA9IENsZWFyRXh0ZW5zaW9uCisKKworZGVmIF9BZGRDbGVhck1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisgIGRlZiBDbGVhcihzZWxmKToKKyAgICAjIENsZWFyIGZpZWxkcy4KKyAgICBzZWxmLl9maWVsZHMgPSB7fQorICAgIHNlbGYuX01vZGlmaWVkKCkKKyAgY2xzLkNsZWFyID0gQ2xlYXIKKworCitkZWYgX0FkZEhhc0V4dGVuc2lvbk1ldGhvZChjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorICBkZWYgSGFzRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpOgorICAgIF9WZXJpZnlFeHRlbnNpb25IYW5kbGUoc2VsZiwgZXh0ZW5zaW9uX2hhbmRsZSkKKyAgICBpZiBleHRlbnNpb25faGFuZGxlLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICByYWlzZSBLZXlFcnJvcignIiVzIiBpcyByZXBlYXRlZC4nICUgZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUpCisKKyAgICBpZiBleHRlbnNpb25faGFuZGxlLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgdmFsdWUgPSBzZWxmLl9maWVsZHMuZ2V0KGV4dGVuc2lvbl9oYW5kbGUpCisgICAgICByZXR1cm4gdmFsdWUgaXMgbm90IE5vbmUgYW5kIHZhbHVlLl9pc19wcmVzZW50X2luX3BhcmVudAorICAgIGVsc2U6CisgICAgICByZXR1cm4gZXh0ZW5zaW9uX2hhbmRsZSBpbiBzZWxmLl9maWVsZHMKKyAgY2xzLkhhc0V4dGVuc2lvbiA9IEhhc0V4dGVuc2lvbgorCisKK2RlZiBfQWRkRXF1YWxzTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgaWYgKG5vdCBpc2luc3RhbmNlKG90aGVyLCBtZXNzYWdlX21vZC5NZXNzYWdlKSBvcgorICAgICAgICBvdGhlci5ERVNDUklQVE9SICE9IHNlbGYuREVTQ1JJUFRPUik6CisgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIHNlbGYgaXMgb3RoZXI6CisgICAgICByZXR1cm4gVHJ1ZQorCisgICAgcmV0dXJuIHNlbGYuTGlzdEZpZWxkcygpID09IG90aGVyLkxpc3RGaWVsZHMoKQorCisgIGNscy5fX2VxX18gPSBfX2VxX18KKworCitkZWYgX0FkZFN0ck1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgIHJldHVybiB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoc2VsZikKKyAgY2xzLl9fc3RyX18gPSBfX3N0cl9fCisKKworZGVmIF9BZGRVbmljb2RlTWV0aG9kKHVudXNlZF9tZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisKKyAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgIHJldHVybiB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoc2VsZiwgYXNfdXRmOD1UcnVlKS5kZWNvZGUoJ3V0Zi04JykKKyAgY2xzLl9fdW5pY29kZV9fID0gX191bmljb2RlX18KKworCitkZWYgX0FkZFNldExpc3RlbmVyTWV0aG9kKGNscyk6CisgICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCisgIGRlZiBTZXRMaXN0ZW5lcihzZWxmLCBsaXN0ZW5lcik6CisgICAgaWYgbGlzdGVuZXIgaXMgTm9uZToKKyAgICAgIHNlbGYuX2xpc3RlbmVyID0gbWVzc2FnZV9saXN0ZW5lcl9tb2QuTnVsbE1lc3NhZ2VMaXN0ZW5lcigpCisgICAgZWxzZToKKyAgICAgIHNlbGYuX2xpc3RlbmVyID0gbGlzdGVuZXIKKyAgY2xzLl9TZXRMaXN0ZW5lciA9IFNldExpc3RlbmVyCisKKworZGVmIF9CeXRlc0Zvck5vblJlcGVhdGVkRWxlbWVudCh2YWx1ZSwgZmllbGRfbnVtYmVyLCBmaWVsZF90eXBlKToKKyAgIiIiUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBzZXJpYWxpemUgYSBub24tcmVwZWF0ZWQgZWxlbWVudC4KKyAgVGhlIHJldHVybmVkIGJ5dGUgY291bnQgaW5jbHVkZXMgc3BhY2UgZm9yIHRhZyBpbmZvcm1hdGlvbiBhbmQgYW55CisgIG90aGVyIGFkZGl0aW9uYWwgc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHNlcmlhbGl6aW5nIHZhbHVlLgorCisgIEFyZ3M6CisgICAgdmFsdWU6IFZhbHVlIHdlJ3JlIHNlcmlhbGl6aW5nLgorICAgIGZpZWxkX251bWJlcjogRmllbGQgbnVtYmVyIG9mIHRoaXMgdmFsdWUuICAoU2luY2UgdGhlIGZpZWxkIG51bWJlcgorICAgICAgaXMgc3RvcmVkIGFzIHBhcnQgb2YgYSB2YXJpbnQtZW5jb2RlZCB0YWcsIHRoaXMgaGFzIGFuIGltcGFjdAorICAgICAgb24gdGhlIHRvdGFsIGJ5dGVzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSB0aGUgdmFsdWUpLgorICAgIGZpZWxkX3R5cGU6IFRoZSB0eXBlIG9mIHRoZSBmaWVsZC4gIE9uZSBvZiB0aGUgVFlQRV8qIGNvbnN0YW50cworICAgICAgd2l0aGluIEZpZWxkRGVzY3JpcHRvci4KKyAgIiIiCisgIHRyeToKKyAgICBmbiA9IHR5cGVfY2hlY2tlcnMuVFlQRV9UT19CWVRFX1NJWkVfRk5bZmllbGRfdHlwZV0KKyAgICByZXR1cm4gZm4oZmllbGRfbnVtYmVyLCB2YWx1ZSkKKyAgZXhjZXB0IEtleUVycm9yOgorICAgIHJhaXNlIG1lc3NhZ2VfbW9kLkVuY29kZUVycm9yKCdVbnJlY29nbml6ZWQgZmllbGQgdHlwZTogJWQnICUgZmllbGRfdHlwZSkKKworCitkZWYgX0FkZEJ5dGVTaXplTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKKworICBkZWYgQnl0ZVNpemUoc2VsZik6CisgICAgaWYgbm90IHNlbGYuX2NhY2hlZF9ieXRlX3NpemVfZGlydHk6CisgICAgICByZXR1cm4gc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZQorCisgICAgc2l6ZSA9IDAKKyAgICBmb3IgZmllbGRfZGVzY3JpcHRvciwgZmllbGRfdmFsdWUgaW4gc2VsZi5MaXN0RmllbGRzKCk6CisgICAgICBzaXplICs9IGZpZWxkX2Rlc2NyaXB0b3IuX3NpemVyKGZpZWxkX3ZhbHVlKQorCisgICAgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZSA9IHNpemUKKyAgICBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5ID0gRmFsc2UKKyAgICBzZWxmLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4uZGlydHkgPSBGYWxzZQorICAgIHJldHVybiBzaXplCisKKyAgY2xzLkJ5dGVTaXplID0gQnl0ZVNpemUKKworCitkZWYgX0FkZFNlcmlhbGl6ZVRvU3RyaW5nTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKKworICBkZWYgU2VyaWFsaXplVG9TdHJpbmcoc2VsZik6CisgICAgIyBDaGVjayBpZiB0aGUgbWVzc2FnZSBoYXMgYWxsIG9mIGl0cyByZXF1aXJlZCBmaWVsZHMgc2V0LgorICAgIGVycm9ycyA9IFtdCisgICAgaWYgbm90IHNlbGYuSXNJbml0aWFsaXplZCgpOgorICAgICAgcmFpc2UgbWVzc2FnZV9tb2QuRW5jb2RlRXJyb3IoCisgICAgICAgICAgJ01lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICcgKworICAgICAgICAgICcsJy5qb2luKHNlbGYuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpKQorICAgIHJldHVybiBzZWxmLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCisgIGNscy5TZXJpYWxpemVUb1N0cmluZyA9IFNlcmlhbGl6ZVRvU3RyaW5nCisKKworZGVmIF9BZGRTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgorICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgorCisgIGRlZiBTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoc2VsZik6CisgICAgb3V0ID0gU3RyaW5nSU8oKQorICAgIHNlbGYuX0ludGVybmFsU2VyaWFsaXplKG91dC53cml0ZSkKKyAgICByZXR1cm4gb3V0LmdldHZhbHVlKCkKKyAgY2xzLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyA9IFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZworCisgIGRlZiBJbnRlcm5hbFNlcmlhbGl6ZShzZWxmLCB3cml0ZV9ieXRlcyk6CisgICAgZm9yIGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX3ZhbHVlIGluIHNlbGYuTGlzdEZpZWxkcygpOgorICAgICAgZmllbGRfZGVzY3JpcHRvci5fZW5jb2Rlcih3cml0ZV9ieXRlcywgZmllbGRfdmFsdWUpCisgIGNscy5fSW50ZXJuYWxTZXJpYWxpemUgPSBJbnRlcm5hbFNlcmlhbGl6ZQorCisKK2RlZiBfQWRkTWVyZ2VGcm9tU3RyaW5nTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKKyAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKKyAgZGVmIE1lcmdlRnJvbVN0cmluZyhzZWxmLCBzZXJpYWxpemVkKToKKyAgICBsZW5ndGggPSBsZW4oc2VyaWFsaXplZCkKKyAgICB0cnk6CisgICAgICBpZiBzZWxmLl9JbnRlcm5hbFBhcnNlKHNlcmlhbGl6ZWQsIDAsIGxlbmd0aCkgIT0gbGVuZ3RoOgorICAgICAgICAjIFRoZSBvbmx5IHJlYXNvbiBfSW50ZXJuYWxQYXJzZSB3b3VsZCByZXR1cm4gZWFybHkgaXMgaWYgaXQKKyAgICAgICAgIyBlbmNvdW50ZXJlZCBhbiBlbmQtZ3JvdXAgdGFnLgorICAgICAgICByYWlzZSBtZXNzYWdlX21vZC5EZWNvZGVFcnJvcignVW5leHBlY3RlZCBlbmQtZ3JvdXAgdGFnLicpCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICByYWlzZSBtZXNzYWdlX21vZC5EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKKyAgICBleGNlcHQgc3RydWN0LmVycm9yLCBlOgorICAgICAgcmFpc2UgbWVzc2FnZV9tb2QuRGVjb2RlRXJyb3IoZSkKKyAgICByZXR1cm4gbGVuZ3RoICAgIyBSZXR1cm4gdGhpcyBmb3IgbGVnYWN5IHJlYXNvbnMuCisgIGNscy5NZXJnZUZyb21TdHJpbmcgPSBNZXJnZUZyb21TdHJpbmcKKworICBsb2NhbF9SZWFkVGFnID0gZGVjb2Rlci5SZWFkVGFnCisgIGxvY2FsX1NraXBGaWVsZCA9IGRlY29kZXIuU2tpcEZpZWxkCisgIGRlY29kZXJzX2J5X3RhZyA9IGNscy5fZGVjb2RlcnNfYnlfdGFnCisKKyAgZGVmIEludGVybmFsUGFyc2Uoc2VsZiwgYnVmZmVyLCBwb3MsIGVuZCk6CisgICAgc2VsZi5fTW9kaWZpZWQoKQorICAgIGZpZWxkX2RpY3QgPSBzZWxmLl9maWVsZHMKKyAgICB3aGlsZSBwb3MgIT0gZW5kOgorICAgICAgKHRhZ19ieXRlcywgbmV3X3BvcykgPSBsb2NhbF9SZWFkVGFnKGJ1ZmZlciwgcG9zKQorICAgICAgZmllbGRfZGVjb2RlciA9IGRlY29kZXJzX2J5X3RhZy5nZXQodGFnX2J5dGVzKQorICAgICAgaWYgZmllbGRfZGVjb2RlciBpcyBOb25lOgorICAgICAgICBuZXdfcG9zID0gbG9jYWxfU2tpcEZpZWxkKGJ1ZmZlciwgbmV3X3BvcywgZW5kLCB0YWdfYnl0ZXMpCisgICAgICAgIGlmIG5ld19wb3MgPT0gLTE6CisgICAgICAgICAgcmV0dXJuIHBvcworICAgICAgICBwb3MgPSBuZXdfcG9zCisgICAgICBlbHNlOgorICAgICAgICBwb3MgPSBmaWVsZF9kZWNvZGVyKGJ1ZmZlciwgbmV3X3BvcywgZW5kLCBzZWxmLCBmaWVsZF9kaWN0KQorICAgIHJldHVybiBwb3MKKyAgY2xzLl9JbnRlcm5hbFBhcnNlID0gSW50ZXJuYWxQYXJzZQorCisKK2RlZiBfQWRkSXNJbml0aWFsaXplZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkFkZHMgdGhlIElzSW5pdGlhbGl6ZWQgYW5kIEZpbmRJbml0aWFsaXphdGlvbkVycm9yIG1ldGhvZHMgdG8gdGhlCisgIHByb3RvY29sIG1lc3NhZ2UgY2xhc3MuIiIiCisKKyAgcmVxdWlyZWRfZmllbGRzID0gW2ZpZWxkIGZvciBmaWVsZCBpbiBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmaWVsZC5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUVVJUkVEXQorCisgIGRlZiBJc0luaXRpYWxpemVkKHNlbGYsIGVycm9ycz1Ob25lKToKKyAgICAiIiJDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBvZiBhIG1lc3NhZ2UgYXJlIHNldC4KKworICAgIEFyZ3M6CisgICAgICBlcnJvcnM6ICBBIGxpc3Qgd2hpY2gsIGlmIHByb3ZpZGVkLCB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBmaWVsZAorICAgICAgICAgICAgICAgcGF0aHMgb2YgYWxsIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRydWUgaWZmIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBoYXMgYWxsIHJlcXVpcmVkIGZpZWxkcyBzZXQuCisgICAgIiIiCisKKyAgICAjIFBlcmZvcm1hbmNlIGlzIGNyaXRpY2FsIHNvIHdlIGF2b2lkIEhhc0ZpZWxkKCkgYW5kIExpc3RGaWVsZHMoKS4KKworICAgIGZvciBmaWVsZCBpbiByZXF1aXJlZF9maWVsZHM6CisgICAgICBpZiAoZmllbGQgbm90IGluIHNlbGYuX2ZpZWxkcyBvcgorICAgICAgICAgIChmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSBhbmQKKyAgICAgICAgICAgbm90IHNlbGYuX2ZpZWxkc1tmaWVsZF0uX2lzX3ByZXNlbnRfaW5fcGFyZW50KSk6CisgICAgICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKKyAgICAgICAgICBlcnJvcnMuZXh0ZW5kKHNlbGYuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBzZWxmLl9maWVsZHMuaXRlcml0ZW1zKCk6CisgICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgICAgIGlmIG5vdCBlbGVtZW50LklzSW5pdGlhbGl6ZWQoKToKKyAgICAgICAgICAgICAgaWYgZXJyb3JzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGVycm9ycy5leHRlbmQoc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsaWYgdmFsdWUuX2lzX3ByZXNlbnRfaW5fcGFyZW50IGFuZCBub3QgdmFsdWUuSXNJbml0aWFsaXplZCgpOgorICAgICAgICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVycm9ycy5leHRlbmQoc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSkKKyAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIHJldHVybiBUcnVlCisKKyAgY2xzLklzSW5pdGlhbGl6ZWQgPSBJc0luaXRpYWxpemVkCisKKyAgZGVmIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhzZWxmKToKKyAgICAiIiJGaW5kcyByZXF1aXJlZCBmaWVsZHMgd2hpY2ggYXJlIG5vdCBpbml0aWFsaXplZC4KKworICAgIFJldHVybnM6CisgICAgICBBIGxpc3Qgb2Ygc3RyaW5ncy4gIEVhY2ggc3RyaW5nIGlzIGEgcGF0aCB0byBhbiB1bmluaXRpYWxpemVkIGZpZWxkIGZyb20KKyAgICAgIHRoZSB0b3AtbGV2ZWwgbWVzc2FnZSwgZS5nLiAiZm9vLmJhcls1XS5iYXoiLgorICAgICIiIgorCisgICAgZXJyb3JzID0gW10gICMgc2ltcGxpZnkgdGhpbmdzCisKKyAgICBmb3IgZmllbGQgaW4gcmVxdWlyZWRfZmllbGRzOgorICAgICAgaWYgbm90IHNlbGYuSGFzRmllbGQoZmllbGQubmFtZSk6CisgICAgICAgIGVycm9ycy5hcHBlbmQoZmllbGQubmFtZSkKKworICAgIGZvciBmaWVsZCwgdmFsdWUgaW4gc2VsZi5MaXN0RmllbGRzKCk6CisgICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgorICAgICAgICAgIG5hbWUgPSAiKCVzKSIgJSBmaWVsZC5mdWxsX25hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBuYW1lID0gZmllbGQubmFtZQorCisgICAgICAgIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbih2YWx1ZSkpOgorICAgICAgICAgICAgZWxlbWVudCA9IHZhbHVlW2ldCisgICAgICAgICAgICBwcmVmaXggPSAiJXNbJWRdLiIgJSAobmFtZSwgaSkKKyAgICAgICAgICAgIHN1Yl9lcnJvcnMgPSBlbGVtZW50LkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygpCisgICAgICAgICAgICBlcnJvcnMgKz0gWyBwcmVmaXggKyBlcnJvciBmb3IgZXJyb3IgaW4gc3ViX2Vycm9ycyBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgcHJlZml4ID0gbmFtZSArICIuIgorICAgICAgICAgIHN1Yl9lcnJvcnMgPSB2YWx1ZS5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKQorICAgICAgICAgIGVycm9ycyArPSBbIHByZWZpeCArIGVycm9yIGZvciBlcnJvciBpbiBzdWJfZXJyb3JzIF0KKworICAgIHJldHVybiBlcnJvcnMKKworICBjbHMuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzID0gRmluZEluaXRpYWxpemF0aW9uRXJyb3JzCisKKworZGVmIF9BZGRNZXJnZUZyb21NZXRob2QoY2xzKToKKyAgTEFCRUxfUkVQRUFURUQgPSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVECisgIENQUFRZUEVfTUVTU0FHRSA9IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFCisKKyAgZGVmIE1lcmdlRnJvbShzZWxmLCBtc2cpOgorICAgIGlmIG5vdCBpc2luc3RhbmNlKG1zZywgY2xzKToKKyAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAiUGFyYW1ldGVyIHRvIE1lcmdlRnJvbSgpIG11c3QgYmUgaW5zdGFuY2Ugb2Ygc2FtZSBjbGFzcy4iKQorCisgICAgYXNzZXJ0IG1zZyBpcyBub3Qgc2VsZgorICAgIHNlbGYuX01vZGlmaWVkKCkKKworICAgIGZpZWxkcyA9IHNlbGYuX2ZpZWxkcworCisgICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBtc2cuX2ZpZWxkcy5pdGVyaXRlbXMoKToKKyAgICAgIGlmIGZpZWxkLmxhYmVsID09IExBQkVMX1JFUEVBVEVEOgorICAgICAgICBmaWVsZF92YWx1ZSA9IGZpZWxkcy5nZXQoZmllbGQpCisgICAgICAgIGlmIGZpZWxkX3ZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgIyBDb25zdHJ1Y3QgYSBuZXcgb2JqZWN0IHRvIHJlcHJlc2VudCB0aGlzIGZpZWxkLgorICAgICAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKKyAgICAgICAgICBmaWVsZHNbZmllbGRdID0gZmllbGRfdmFsdWUKKyAgICAgICAgZmllbGRfdmFsdWUuTWVyZ2VGcm9tKHZhbHVlKQorICAgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIGlmIHZhbHVlLl9pc19wcmVzZW50X2luX3BhcmVudDoKKyAgICAgICAgICBmaWVsZF92YWx1ZSA9IGZpZWxkcy5nZXQoZmllbGQpCisgICAgICAgICAgaWYgZmllbGRfdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICMgQ29uc3RydWN0IGEgbmV3IG9iamVjdCB0byByZXByZXNlbnQgdGhpcyBmaWVsZC4KKyAgICAgICAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKKyAgICAgICAgICAgIGZpZWxkc1tmaWVsZF0gPSBmaWVsZF92YWx1ZQorICAgICAgICAgIGZpZWxkX3ZhbHVlLk1lcmdlRnJvbSh2YWx1ZSkKKyAgICAgIGVsc2U6CisgICAgICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSB2YWx1ZQorICBjbHMuTWVyZ2VGcm9tID0gTWVyZ2VGcm9tCisKKworZGVmIF9BZGRNZXNzYWdlTWV0aG9kcyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6CisgICIiIkFkZHMgaW1wbGVtZW50YXRpb25zIG9mIGFsbCBNZXNzYWdlIG1ldGhvZHMgdG8gY2xzLiIiIgorICBfQWRkTGlzdEZpZWxkc01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZEhhc0ZpZWxkTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkQ2xlYXJGaWVsZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgaWYgbWVzc2FnZV9kZXNjcmlwdG9yLmlzX2V4dGVuZGFibGU6CisgICAgX0FkZENsZWFyRXh0ZW5zaW9uTWV0aG9kKGNscykKKyAgICBfQWRkSGFzRXh0ZW5zaW9uTWV0aG9kKGNscykKKyAgX0FkZENsZWFyTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkRXF1YWxzTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkU3RyTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkVW5pY29kZU1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKKyAgX0FkZFNldExpc3RlbmVyTWV0aG9kKGNscykKKyAgX0FkZEJ5dGVTaXplTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkU2VyaWFsaXplVG9TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCisgIF9BZGRTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCisgIF9BZGRNZXJnZUZyb21TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCisgIF9BZGRJc0luaXRpYWxpemVkTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQorICBfQWRkTWVyZ2VGcm9tTWV0aG9kKGNscykKKworCitkZWYgX0FkZFByaXZhdGVIZWxwZXJNZXRob2RzKGNscyk6CisgICIiIkFkZHMgaW1wbGVtZW50YXRpb24gb2YgcHJpdmF0ZSBoZWxwZXIgbWV0aG9kcyB0byBjbHMuIiIiCisKKyAgZGVmIE1vZGlmaWVkKHNlbGYpOgorICAgICIiIlNldHMgdGhlIF9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5IGJpdCB0byB0cnVlLAorICAgIGFuZCBwcm9wYWdhdGVzIHRoaXMgdG8gb3VyIGxpc3RlbmVyIGlmZiB0aGlzIHdhcyBhIHN0YXRlIGNoYW5nZS4KKyAgICAiIiIKKworICAgICMgTm90ZTogIFNvbWUgY2FsbGVycyBjaGVjayBfY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSBiZWZvcmUgY2FsbGluZworICAgICMgICBfTW9kaWZpZWQoKSBhcyBhbiBleHRyYSBvcHRpbWl6YXRpb24uICBTbywgaWYgdGhpcyBtZXRob2QgaXMgZXZlcgorICAgICMgICBjaGFuZ2VkIHN1Y2ggdGhhdCBpdCBkb2VzIHN0dWZmIGV2ZW4gd2hlbiBfY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSBpcworICAgICMgICBhbHJlYWR5IHRydWUsIHRoZSBjYWxsZXJzIG5lZWQgdG8gYmUgdXBkYXRlZC4KKyAgICBpZiBub3Qgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eToKKyAgICAgIHNlbGYuX2NhY2hlZF9ieXRlX3NpemVfZGlydHkgPSBUcnVlCisgICAgICBzZWxmLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4uZGlydHkgPSBUcnVlCisgICAgICBzZWxmLl9pc19wcmVzZW50X2luX3BhcmVudCA9IFRydWUKKyAgICAgIHNlbGYuX2xpc3RlbmVyLk1vZGlmaWVkKCkKKworICBjbHMuX01vZGlmaWVkID0gTW9kaWZpZWQKKyAgY2xzLlNldEluUGFyZW50ID0gTW9kaWZpZWQKKworCitjbGFzcyBfTGlzdGVuZXIob2JqZWN0KToKKworICAiIiJNZXNzYWdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhIHBhcmVudCBtZXNzYWdlIHJlZ2lzdGVycyB3aXRoIGl0cworICBjaGlsZCBtZXNzYWdlLgorCisgIEluIG9yZGVyIHRvIHN1cHBvcnQgc2VtYW50aWNzIGxpa2U6CisKKyAgICBmb28uYmFyLmJhei5xdXggPSAyMworICAgIGFzc2VydCBmb28uSGFzRmllbGQoJ2JhcicpCisKKyAgLi4uY2hpbGQgb2JqZWN0cyBtdXN0IGhhdmUgYmFjayByZWZlcmVuY2VzIHRvIHRoZWlyIHBhcmVudHMuCisgIFRoaXMgaGVscGVyIGNsYXNzIGlzIGF0IHRoZSBoZWFydCBvZiB0aGlzIHN1cHBvcnQuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnRfbWVzc2FnZSk6CisgICAgIiIiQXJnczoKKyAgICAgIHBhcmVudF9tZXNzYWdlOiBUaGUgbWVzc2FnZSB3aG9zZSBfTW9kaWZpZWQoKSBtZXRob2Qgd2Ugc2hvdWxkIGNhbGwgd2hlbgorICAgICAgICB3ZSByZWNlaXZlIE1vZGlmaWVkKCkgbWVzc2FnZXMuCisgICAgIiIiCisgICAgIyBUaGlzIGxpc3RlbmVyIGVzdGFibGlzaGVzIGEgYmFjayByZWZlcmVuY2UgZnJvbSBhIGNoaWxkIChjb250YWluZWQpIG9iamVjdAorICAgICMgdG8gaXRzIHBhcmVudCAoY29udGFpbmluZykgb2JqZWN0LiAgV2UgbWFrZSB0aGlzIGEgd2VhayByZWZlcmVuY2UgdG8gYXZvaWQKKyAgICAjIGNyZWF0aW5nIGN5Y2xpYyBnYXJiYWdlIHdoZW4gdGhlIGNsaWVudCBmaW5pc2hlcyB3aXRoIHRoZSAncGFyZW50JyBvYmplY3QKKyAgICAjIGluIHRoZSB0cmVlLgorICAgIGlmIGlzaW5zdGFuY2UocGFyZW50X21lc3NhZ2UsIHdlYWtyZWYuUHJveHlUeXBlKToKKyAgICAgIHNlbGYuX3BhcmVudF9tZXNzYWdlX3dlYWtyZWYgPSBwYXJlbnRfbWVzc2FnZQorICAgIGVsc2U6CisgICAgICBzZWxmLl9wYXJlbnRfbWVzc2FnZV93ZWFrcmVmID0gd2Vha3JlZi5wcm94eShwYXJlbnRfbWVzc2FnZSkKKworICAgICMgQXMgYW4gb3B0aW1pemF0aW9uLCB3ZSBhbHNvIGluZGljYXRlIGRpcmVjdGx5IG9uIHRoZSBsaXN0ZW5lciB3aGV0aGVyCisgICAgIyBvciBub3QgdGhlIHBhcmVudCBtZXNzYWdlIGlzIGRpcnR5LiAgVGhpcyB3YXkgd2UgY2FuIGF2b2lkIHRyYXZlcnNpbmcKKyAgICAjIHVwIHRoZSB0cmVlIGluIHRoZSBjb21tb24gY2FzZS4KKyAgICBzZWxmLmRpcnR5ID0gRmFsc2UKKworICBkZWYgTW9kaWZpZWQoc2VsZik6CisgICAgaWYgc2VsZi5kaXJ0eToKKyAgICAgIHJldHVybgorICAgIHRyeToKKyAgICAgICMgUHJvcGFnYXRlIHRoZSBzaWduYWwgdG8gb3VyIHBhcmVudHMgaWZmIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIHNldC4KKyAgICAgIHNlbGYuX3BhcmVudF9tZXNzYWdlX3dlYWtyZWYuX01vZGlmaWVkKCkKKyAgICBleGNlcHQgUmVmZXJlbmNlRXJyb3I6CisgICAgICAjIFdlIGNhbiBnZXQgaGVyZSBpZiBhIGNsaWVudCBoYXMga2VwdCBhIHJlZmVyZW5jZSB0byBhIGNoaWxkIG9iamVjdCwKKyAgICAgICMgYW5kIGlzIG5vdyBzZXR0aW5nIGEgZmllbGQgb24gaXQsIGJ1dCB0aGUgY2hpbGQncyBwYXJlbnQgaGFzIGJlZW4KKyAgICAgICMgZ2FyYmFnZS1jb2xsZWN0ZWQuICBUaGlzIGlzIG5vdCBhbiBlcnJvci4KKyAgICAgIHBhc3MKKworCisjIFRPRE8ocm9iaW5zb24pOiBNb3ZlIGVsc2V3aGVyZT8gIFRoaXMgZmlsZSBpcyBnZXR0aW5nIHByZXR0eSByaWRpY3Vsb3VzLi4uCisjIFRPRE8ocm9iaW5zb24pOiBVbmlmeSBlcnJvciBoYW5kbGluZyBvZiAidW5rbm93biBleHRlbnNpb24iIGNyYXAuCisjIFRPRE8ocm9iaW5zb24pOiBTdXBwb3J0IGl0ZXJpdGVtcygpLXN0eWxlIGl0ZXJhdGlvbiBvdmVyIGFsbAorIyBleHRlbnNpb25zIHdpdGggdGhlICJoYXMiIGJpdHMgdHVybmVkIG9uPworY2xhc3MgX0V4dGVuc2lvbkRpY3Qob2JqZWN0KToKKworICAiIiJEaWN0LWxpa2UgY29udGFpbmVyIGZvciBzdXBwb3J0aW5nIGFuIGluZGV4YWJsZSAiRXh0ZW5zaW9ucyIKKyAgZmllbGQgb24gcHJvdG8gaW5zdGFuY2VzLgorCisgIE5vdGUgdGhhdCBpbiBhbGwgY2FzZXMgd2UgZXhwZWN0IGV4dGVuc2lvbiBoYW5kbGVzIHRvIGJlCisgIEZpZWxkRGVzY3JpcHRvcnMuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBleHRlbmRlZF9tZXNzYWdlKToKKyAgICAiIiJleHRlbmRlZF9tZXNzYWdlOiBNZXNzYWdlIGluc3RhbmNlIGZvciB3aGljaCB3ZSBhcmUgdGhlIEV4dGVuc2lvbnMgZGljdC4KKyAgICAiIiIKKworICAgIHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UgPSBleHRlbmRlZF9tZXNzYWdlCisKKyAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpOgorICAgICIiIlJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGdpdmVuIGV4dGVuc2lvbiBoYW5kbGUuIiIiCisKKyAgICBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UsIGV4dGVuc2lvbl9oYW5kbGUpCisKKyAgICByZXN1bHQgPSBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9maWVsZHMuZ2V0KGV4dGVuc2lvbl9oYW5kbGUpCisgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgaWYgZXh0ZW5zaW9uX2hhbmRsZS5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgorICAgICAgcmVzdWx0ID0gZXh0ZW5zaW9uX2hhbmRsZS5fZGVmYXVsdF9jb25zdHJ1Y3RvcihzZWxmLl9leHRlbmRlZF9tZXNzYWdlKQorICAgIGVsaWYgZXh0ZW5zaW9uX2hhbmRsZS5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJlc3VsdCA9IGV4dGVuc2lvbl9oYW5kbGUubWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcygpCisgICAgICB0cnk6CisgICAgICAgIHJlc3VsdC5fU2V0TGlzdGVuZXIoc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fbGlzdGVuZXJfZm9yX2NoaWxkcmVuKQorICAgICAgZXhjZXB0IFJlZmVyZW5jZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICMgU2luZ3VsYXIgc2NhbGFyIC0tIGp1c3QgcmV0dXJuIHRoZSBkZWZhdWx0IHdpdGhvdXQgaW5zZXJ0aW5nIGludG8gdGhlCisgICAgICAjIGRpY3QuCisgICAgICByZXR1cm4gZXh0ZW5zaW9uX2hhbmRsZS5kZWZhdWx0X3ZhbHVlCisKKyAgICAjIEF0b21pY2FsbHkgY2hlY2sgaWYgYW5vdGhlciB0aHJlYWQgaGFzIHByZWVtcHRlZCB1cyBhbmQsIGlmIG5vdCwgc3dhcAorICAgICMgaW4gdGhlIG5ldyBvYmplY3Qgd2UganVzdCBjcmVhdGVkLiAgSWYgc29tZW9uZSBoYXMgcHJlZW1wdGVkIHVzLCB3ZQorICAgICMgdGFrZSB0aGF0IG9iamVjdCBhbmQgZGlzY2FyZCBvdXJzLgorICAgICMgV0FSTklORzogIFdlIGFyZSByZWx5aW5nIG9uIHNldGRlZmF1bHQoKSBiZWluZyBhdG9taWMuICBUaGlzIGlzIHRydWUKKyAgICAjICAgaW4gQ1B5dGhvbiBidXQgd2UgaGF2ZW4ndCBpbnZlc3RpZ2F0ZWQgb3RoZXJzLiAgVGhpcyB3YXJuaW5nIGFwcGVhcnMKKyAgICAjICAgaW4gc2V2ZXJhbCBvdGhlciBsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLgorICAgIHJlc3VsdCA9IHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuX2ZpZWxkcy5zZXRkZWZhdWx0KAorICAgICAgICBleHRlbnNpb25faGFuZGxlLCByZXN1bHQpCisKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgIHJldHVybiBGYWxzZQorCisgICAgbXlfZmllbGRzID0gc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5MaXN0RmllbGRzKCkKKyAgICBvdGhlcl9maWVsZHMgPSBvdGhlci5fZXh0ZW5kZWRfbWVzc2FnZS5MaXN0RmllbGRzKCkKKworICAgICMgR2V0IHJpZCBvZiBub24tZXh0ZW5zaW9uIGZpZWxkcy4KKyAgICBteV9maWVsZHMgICAgPSBbIGZpZWxkIGZvciBmaWVsZCBpbiBteV9maWVsZHMgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uIF0KKyAgICBvdGhlcl9maWVsZHMgPSBbIGZpZWxkIGZvciBmaWVsZCBpbiBvdGhlcl9maWVsZHMgaWYgZmllbGQuaXNfZXh0ZW5zaW9uIF0KKworICAgIHJldHVybiBteV9maWVsZHMgPT0gb3RoZXJfZmllbGRzCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHJhaXNlIFR5cGVFcnJvcigndW5oYXNoYWJsZSBvYmplY3QnKQorCisgICMgTm90ZSB0aGF0IHRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBub24tcmVwZWF0ZWQsIHNjYWxhciBleHRlbnNpb24KKyAgIyBmaWVsZHMuICBOb3RlIGFsc28gdGhhdCB3ZSBtYXkgaGF2ZSB0byBjYWxsIF9Nb2RpZmllZCgpIHdoZW4gd2UgZG8KKyAgIyBzdWNjZXNzZnVsbHkgc2V0IGEgZmllbGQgdGhpcyB3YXksIHRvIHNldCBhbnkgbmVjc3NhcnkgImhhcyIgYml0cyBpbiB0aGUKKyAgIyBhbmNlc3RvcnMgb2YgdGhlIGV4dGVuZGVkIG1lc3NhZ2UuCisgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBleHRlbnNpb25faGFuZGxlLCB2YWx1ZSk6CisgICAgIiIiSWYgZXh0ZW5zaW9uX2hhbmRsZSBzcGVjaWZpZXMgYSBub24tcmVwZWF0ZWQsIHNjYWxhciBleHRlbnNpb24KKyAgICBmaWVsZCwgc2V0cyB0aGUgdmFsdWUgb2YgdGhhdCBmaWVsZC4KKyAgICAiIiIKKworICAgIF9WZXJpZnlFeHRlbnNpb25IYW5kbGUoc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZSwgZXh0ZW5zaW9uX2hhbmRsZSkKKworICAgIGlmIChleHRlbnNpb25faGFuZGxlLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQgb3IKKyAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZS5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSk6CisgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgJ0Nhbm5vdCBhc3NpZ24gdG8gZXh0ZW5zaW9uICIlcyIgYmVjYXVzZSBpdCBpcyBhIHJlcGVhdGVkIG9yICcKKyAgICAgICAgICAnY29tcG9zaXRlIHR5cGUuJyAlIGV4dGVuc2lvbl9oYW5kbGUuZnVsbF9uYW1lKQorCisgICAgIyBJdCdzIHNsaWdodGx5IHdhc3RlZnVsIHRvIGxvb2t1cCB0aGUgdHlwZSBjaGVja2VyIGVhY2ggdGltZSwKKyAgICAjIGJ1dCB3ZSBleHBlY3QgdGhpcyB0byBiZSBhIHZhbmlzaGluZ2x5IHVuY29tbW9uIGNhc2UgYW55d2F5LgorICAgIHR5cGVfY2hlY2tlciA9IHR5cGVfY2hlY2tlcnMuR2V0VHlwZUNoZWNrZXIoCisgICAgICAgIGV4dGVuc2lvbl9oYW5kbGUuY3BwX3R5cGUsIGV4dGVuc2lvbl9oYW5kbGUudHlwZSkKKyAgICB0eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkKKyAgICBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9maWVsZHNbZXh0ZW5zaW9uX2hhbmRsZV0gPSB2YWx1ZQorICAgIHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuX01vZGlmaWVkKCkKKworICBkZWYgX0ZpbmRFeHRlbnNpb25CeU5hbWUoc2VsZiwgbmFtZSk6CisgICAgIiIiVHJpZXMgdG8gZmluZCBhIGtub3duIGV4dGVuc2lvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKworICAgIEFyZ3M6CisgICAgICBuYW1lOiBFeHRlbnNpb24gZnVsbCBuYW1lLgorCisgICAgUmV0dXJuczoKKyAgICAgIEV4dGVuc2lvbiBmaWVsZCBkZXNjcmlwdG9yLgorICAgICIiIgorICAgIHJldHVybiBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9leHRlbnNpb25zX2J5X25hbWUuZ2V0KG5hbWUsIE5vbmUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9yZWZsZWN0aW9uX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9yZWZsZWN0aW9uX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2I5ZDMzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3JlZmxlY3Rpb25fdGVzdC5weQpAQCAtMCwwICsxLDI0MjEgQEAKKyMhIC91c3IvYmluL3B5dGhvbgorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJVbml0dGVzdCBmb3IgcmVmbGVjdGlvbi5weSwgd2hpY2ggYWxzbyBpbmRpcmVjdGx5IHRlc3RzIHRoZSBvdXRwdXQgb2YgdGhlCitwdXJlLVB5dGhvbiBwcm90b2NvbCBjb21waWxlci4KKyIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBzdHJ1Y3QKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfaW1wb3J0X3BiMgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X21zZXRfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZQorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHJlZmxlY3Rpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBtb3JlX2V4dGVuc2lvbnNfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbW9yZV9tZXNzYWdlc19wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB3aXJlX2Zvcm1hdAorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfdXRpbAorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGRlY29kZXIKKworCitjbGFzcyBfTWluaURlY29kZXIob2JqZWN0KToKKyAgIiIiRGVjb2RlcyBhIHN0cmVhbSBvZiB2YWx1ZXMgZnJvbSBhIHN0cmluZy4KKworICBPbmNlIHVwb24gYSB0aW1lIHdlIGFjdHVhbGx5IGhhZCBhIGNsYXNzIGNhbGxlZCBkZWNvZGVyLkRlY29kZXIuICBUaGVuIHdlCisgIGdvdCByaWQgb2YgaXQgZHVyaW5nIGEgcmVkZXNpZ24gdGhhdCBtYWRlIGRlY29kaW5nIG11Y2gsIG11Y2ggZmFzdGVyIG92ZXJhbGwuCisgIEJ1dCBhIGNvdXBsZSB0ZXN0cyBpbiB0aGlzIGZpbGUgdXNlZCBpdCB0byBjaGVjayB0aGF0IHRoZSBzZXJpYWxpemVkIGZvcm0gb2YKKyAgYSBtZXNzYWdlIHdhcyBjb3JyZWN0LiAgU28sIHRoaXMgY2xhc3MgaW1wbGVtZW50cyBqdXN0IHRoZSBtZXRob2RzIHRoYXQgd2VyZQorICB1c2VkIGJ5IHNhaWQgdGVzdHMsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByZXdyaXRlIHRoZSB0ZXN0cy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGJ5dGVzKToKKyAgICBzZWxmLl9ieXRlcyA9IGJ5dGVzCisgICAgc2VsZi5fcG9zID0gMAorCisgIGRlZiBSZWFkVmFyaW50KHNlbGYpOgorICAgIHJlc3VsdCwgc2VsZi5fcG9zID0gZGVjb2Rlci5fRGVjb2RlVmFyaW50KHNlbGYuX2J5dGVzLCBzZWxmLl9wb3MpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIFJlYWRJbnQzMiA9IFJlYWRWYXJpbnQKKyAgUmVhZEludDY0ID0gUmVhZFZhcmludAorICBSZWFkVUludDMyID0gUmVhZFZhcmludAorICBSZWFkVUludDY0ID0gUmVhZFZhcmludAorCisgIGRlZiBSZWFkU0ludDY0KHNlbGYpOgorICAgIHJldHVybiB3aXJlX2Zvcm1hdC5aaWdaYWdEZWNvZGUoc2VsZi5SZWFkVmFyaW50KCkpCisKKyAgUmVhZFNJbnQzMiA9IFJlYWRTSW50NjQKKworICBkZWYgUmVhZEZpZWxkTnVtYmVyQW5kV2lyZVR5cGUoc2VsZik6CisgICAgcmV0dXJuIHdpcmVfZm9ybWF0LlVucGFja1RhZyhzZWxmLlJlYWRWYXJpbnQoKSkKKworICBkZWYgUmVhZEZsb2F0KHNlbGYpOgorICAgIHJlc3VsdCA9IHN0cnVjdC51bnBhY2soIjxmIiwgc2VsZi5fYnl0ZXNbc2VsZi5fcG9zOnNlbGYuX3Bvcys0XSlbMF0KKyAgICBzZWxmLl9wb3MgKz0gNAorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgUmVhZERvdWJsZShzZWxmKToKKyAgICByZXN1bHQgPSBzdHJ1Y3QudW5wYWNrKCI8ZCIsIHNlbGYuX2J5dGVzW3NlbGYuX3BvczpzZWxmLl9wb3MrOF0pWzBdCisgICAgc2VsZi5fcG9zICs9IDgKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIEVuZE9mU3RyZWFtKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9wb3MgPT0gbGVuKHNlbGYuX2J5dGVzKQorCisKK2NsYXNzIFJlZmxlY3Rpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgYXNzZXJ0TGlzdHNFcXVhbChzZWxmLCB2YWx1ZXMsIG90aGVycyk6CisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgbGVuKG90aGVycykpCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHZhbHVlcykpOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbaV0sIG90aGVyc1tpXSkKKworICBkZWYgdGVzdFNjYWxhckNvbnN0cnVjdG9yKHNlbGYpOgorICAgICMgQ29uc3RydWN0b3Igd2l0aCBvbmx5IHNjYWxhciB0eXBlcyBzaG91bGQgc3VjY2VlZC4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoCisgICAgICAgIG9wdGlvbmFsX2ludDMyPTI0LAorICAgICAgICBvcHRpb25hbF9kb3VibGU9NTQuMzIxLAorICAgICAgICBvcHRpb25hbF9zdHJpbmc9J29wdGlvbmFsX3N0cmluZycpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDI0LCBwcm90by5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDU0LjMyMSwgcHJvdG8ub3B0aW9uYWxfZG91YmxlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29wdGlvbmFsX3N0cmluZycsIHByb3RvLm9wdGlvbmFsX3N0cmluZykKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyQ29uc3RydWN0b3Ioc2VsZik6CisgICAgIyBDb25zdHJ1Y3RvciB3aXRoIG9ubHkgcmVwZWF0ZWQgc2NhbGFyIHR5cGVzIHNob3VsZCBzdWNjZWVkLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKKyAgICAgICAgcmVwZWF0ZWRfaW50MzI9WzEsIDIsIDMsIDRdLAorICAgICAgICByZXBlYXRlZF9kb3VibGU9WzEuMjMsIDU0LjMyMV0sCisgICAgICAgIHJlcGVhdGVkX2Jvb2w9W1RydWUsIEZhbHNlLCBGYWxzZV0sCisgICAgICAgIHJlcGVhdGVkX3N0cmluZz1bIm9wdGlvbmFsX3N0cmluZyJdKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoWzEsIDIsIDMsIDRdLCBsaXN0KHByb3RvLnJlcGVhdGVkX2ludDMyKSkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhbMS4yMywgNTQuMzIxXSwgbGlzdChwcm90by5yZXBlYXRlZF9kb3VibGUpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFtUcnVlLCBGYWxzZSwgRmFsc2VdLCBsaXN0KHByb3RvLnJlcGVhdGVkX2Jvb2wpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsib3B0aW9uYWxfc3RyaW5nIl0sIGxpc3QocHJvdG8ucmVwZWF0ZWRfc3RyaW5nKSkKKworICBkZWYgdGVzdFJlcGVhdGVkQ29tcG9zaXRlQ29uc3RydWN0b3Ioc2VsZik6CisgICAgIyBDb25zdHJ1Y3RvciB3aXRoIG9ubHkgcmVwZWF0ZWQgY29tcG9zaXRlIHR5cGVzIHNob3VsZCBzdWNjZWVkLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKKyAgICAgICAgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U9WworICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRk9PKSwKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBiYj11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBUildLAorICAgICAgICByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2U9WworICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9LTQzKSwKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTQ1MzI0KSwKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTEyKV0sCisgICAgICAgIHJlcGVhdGVkZ3JvdXA9WworICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKCksCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAoYT0xKSwKKyAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cChhPTIpXSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBbdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08pLAorICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKV0sCisgICAgICAgIGxpc3QocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBbdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9LTQzKSwKKyAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTQ1MzI0KSwKKyAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTEyKV0sCisgICAgICAgIGxpc3QocHJvdG8ucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgW3VuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCgpLAorICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKGE9MSksCisgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAoYT0yKV0sCisgICAgICAgIGxpc3QocHJvdG8ucmVwZWF0ZWRncm91cCkpCisKKyAgZGVmIHRlc3RNaXhlZENvbnN0cnVjdG9yKHNlbGYpOgorICAgICMgQ29uc3RydWN0b3Igd2l0aCBvbmx5IG1peGVkIHR5cGVzIHNob3VsZCBzdWNjZWVkLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKKyAgICAgICAgb3B0aW9uYWxfaW50MzI9MjQsCisgICAgICAgIG9wdGlvbmFsX3N0cmluZz0nb3B0aW9uYWxfc3RyaW5nJywKKyAgICAgICAgcmVwZWF0ZWRfZG91YmxlPVsxLjIzLCA1NC4zMjFdLAorICAgICAgICByZXBlYXRlZF9ib29sPVtUcnVlLCBGYWxzZSwgRmFsc2VdLAorICAgICAgICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZT1bCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08pLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKV0sCisgICAgICAgIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZT1bCisgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0tNDMpLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9NDUzMjQpLAorICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9MTIpXSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjQsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29wdGlvbmFsX3N0cmluZycsIHByb3RvLm9wdGlvbmFsX3N0cmluZykKKyAgICBzZWxmLmFzc2VydEVxdWFscyhbMS4yMywgNTQuMzIxXSwgbGlzdChwcm90by5yZXBlYXRlZF9kb3VibGUpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFtUcnVlLCBGYWxzZSwgRmFsc2VdLCBsaXN0KHByb3RvLnJlcGVhdGVkX2Jvb2wpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBbdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08pLAorICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAorICAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKV0sCisgICAgICAgIGxpc3QocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBbdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9LTQzKSwKKyAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTQ1MzI0KSwKKyAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTEyKV0sCisgICAgICAgIGxpc3QocHJvdG8ucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKSkKKworICBkZWYgdGVzdENvbnN0cnVjdG9yVHlwZUVycm9yKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBUeXBlRXJyb3IsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIG9wdGlvbmFsX2ludDMyPSJmb28iKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBUeXBlRXJyb3IsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIG9wdGlvbmFsX3N0cmluZz0xMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBUeXBlRXJyb3IsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlPTEyMzQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIFR5cGVFcnJvciwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgcmVwZWF0ZWRfaW50MzI9MTIzNCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCByZXBlYXRlZF9pbnQzMj1bImZvbyJdKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBUeXBlRXJyb3IsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIHJlcGVhdGVkX3N0cmluZz0xMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICBUeXBlRXJyb3IsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIHJlcGVhdGVkX3N0cmluZz1bMTIzNF0pCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIFR5cGVFcnJvciwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U9MTIzNCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZT1bMTIzNF0pCisKKyAgZGVmIHRlc3RDb25zdHJ1Y3RvckludmFsaWRhdGVzQ2FjaGVkQnl0ZVNpemUoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMob3B0aW9uYWxfaW50MzIgPSAxMikKKyAgICBzZWxmLmFzc2VydEVxdWFscygyLCBtZXNzYWdlLkJ5dGVTaXplKCkpCisKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKKyAgICAgICAgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygzLCBtZXNzYWdlLkJ5dGVTaXplKCkpCisKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcyhyZXBlYXRlZF9pbnQzMiA9IFsxMl0pCisgICAgc2VsZi5hc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5CeXRlU2l6ZSgpKQorCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoCisgICAgICAgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlID0gW3VuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgpXSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygzLCBtZXNzYWdlLkJ5dGVTaXplKCkpCisKKyAgZGVmIHRlc3RTaW1wbGVIYXNCaXRzKHNlbGYpOgorICAgICMgVGVzdCBhIHNjYWxhci4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ludDMyJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9pbnQzMikKKyAgICAjIEhhc0ZpZWxkKCkgc2hvdWxkbid0IGJlIHRydWUgaWYgYWxsIHdlJ3ZlIGRvbmUgaXMKKyAgICAjIHJlYWQgdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICAjIFNldHRpbmcgYSB2YWx1ZSBob3dldmVyICpzaG91bGQqIHNldCB0aGUgImhhcyIgYml0LgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBwcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCisgICAgIyBBbmQgY2xlYXJpbmcgdGhhdCB2YWx1ZSBzaG91bGQgdW5zZXQgdGhlICJoYXMiIGJpdC4KKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorCisgIGRlZiB0ZXN0SGFzQml0c1dpdGhTaW5nbHlOZXN0ZWRTY2FsYXIoc2VsZik6CisgICAgIyBIZWxwZXIgdXNlZCB0byB0ZXN0IGZvcmVpZ24gbWVzc2FnZXMgYW5kIGdyb3Vwcy4KKyAgICAjCisgICAgIyBjb21wb3NpdGVfZmllbGRfbmFtZSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSBub24tcmVwZWF0ZWQKKyAgICAjIGNvbXBvc2l0ZSAoaS5lLiwgZm9yZWlnbiBvciBncm91cCkgZmllbGQgaW4gVGVzdEFsbFR5cGVzLAorICAgICMgYW5kIHNjYWxhcl9maWVsZF9uYW1lIHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhbiBpbnRlZ2VyLXZhbHVlZAorICAgICMgc2NhbGFyIGZpZWxkIHdpdGhpbiB0aGF0IGNvbXBvc2l0ZS4KKyAgICAjCisgICAgIyBJIG5ldmVyIHRob3VnaHQgSSdkIG1pc3MgQysrIG1hY3JvcyBhbmQgdGVtcGxhdGVzIHNvIG11Y2guIDooCisgICAgIyBUaGlzIGhlbHBlciBpcyBzZW1hbnRpY2FsbHkganVzdDoKKyAgICAjCisgICAgIyAgIGFzc2VydCBwcm90by5jb21wb3NpdGVfZmllbGQuc2NhbGFyX2ZpZWxkID09IDAKKyAgICAjICAgYXNzZXJ0IG5vdCBwcm90by5jb21wb3NpdGVfZmllbGQuSGFzRmllbGQoJ3NjYWxhcl9maWVsZCcpCisgICAgIyAgIGFzc2VydCBub3QgcHJvdG8uSGFzRmllbGQoJ2NvbXBvc2l0ZV9maWVsZCcpCisgICAgIworICAgICMgICBwcm90by5jb21wb3NpdGVfZmllbGQuc2NhbGFyX2ZpZWxkID0gMTAKKyAgICAjICAgb2xkX2NvbXBvc2l0ZV9maWVsZCA9IHByb3RvLmNvbXBvc2l0ZV9maWVsZAorICAgICMKKyAgICAjICAgYXNzZXJ0IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5zY2FsYXJfZmllbGQgPT0gMTAKKyAgICAjICAgYXNzZXJ0IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5IYXNGaWVsZCgnc2NhbGFyX2ZpZWxkJykKKyAgICAjICAgYXNzZXJ0IHByb3RvLkhhc0ZpZWxkKCdjb21wb3NpdGVfZmllbGQnKQorICAgICMKKyAgICAjICAgcHJvdG8uQ2xlYXJGaWVsZCgnY29tcG9zaXRlX2ZpZWxkJykKKyAgICAjCisgICAgIyAgIGFzc2VydCBub3QgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKCdzY2FsYXJfZmllbGQnKQorICAgICMgICBhc3NlcnQgbm90IHByb3RvLkhhc0ZpZWxkKCdjb21wb3NpdGVfZmllbGQnKQorICAgICMgICBhc3NlcnQgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLnNjYWxhcl9maWVsZCA9PSAwCisgICAgIworICAgICMgICAjIE5vdyBlbnN1cmUgdGhhdCBDbGVhckZpZWxkKCdjb21wb3NpdGVfZmllbGQnKSBkaXNjb25uZWN0ZWQKKyAgICAjICAgIyB0aGUgb2xkIGZpZWxkIG9iamVjdCBmcm9tIHRoZSBvYmplY3QgdHJlZS4uLgorICAgICMgICBhc3NlcnQgb2xkX2NvbXBvc2l0ZV9maWVsZCBpcyBub3QgcHJvdG8uY29tcG9zaXRlX2ZpZWxkCisgICAgIyAgIG9sZF9jb21wb3NpdGVfZmllbGQuc2NhbGFyX2ZpZWxkID0gMjAKKyAgICAjICAgYXNzZXJ0IG5vdCBwcm90by5jb21wb3NpdGVfZmllbGQuSGFzRmllbGQoJ3NjYWxhcl9maWVsZCcpCisgICAgIyAgIGFzc2VydCBub3QgcHJvdG8uSGFzRmllbGQoJ2NvbXBvc2l0ZV9maWVsZCcpCisgICAgZGVmIFRlc3RDb21wb3NpdGVIYXNCaXRzKGNvbXBvc2l0ZV9maWVsZF9uYW1lLCBzY2FsYXJfZmllbGRfbmFtZSk6CisgICAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgICAgIyBGaXJzdCwgY2hlY2sgdGhhdCB3ZSBjYW4gZ2V0IHRoZSBzY2FsYXIgdmFsdWUsIGFuZCBzZWUgdGhhdCBpdCdzIHRoZQorICAgICAgIyBkZWZhdWx0ICgwKSwgYnV0IHRoYXQgcHJvdG8uSGFzRmllbGQoJ29tcG9zaXRlJykgYW5kCisgICAgICAjIHByb3RvLmNvbXBvc2l0ZS5IYXNGaWVsZCgnc2NhbGFyJykgd2lsbCBzdGlsbCByZXR1cm4gRmFsc2UuCisgICAgICBjb21wb3NpdGVfZmllbGQgPSBnZXRhdHRyKHByb3RvLCBjb21wb3NpdGVfZmllbGRfbmFtZSkKKyAgICAgIG9yaWdpbmFsX3NjYWxhcl92YWx1ZSA9IGdldGF0dHIoY29tcG9zaXRlX2ZpZWxkLCBzY2FsYXJfZmllbGRfbmFtZSkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgb3JpZ2luYWxfc2NhbGFyX3ZhbHVlKQorICAgICAgIyBBc3NlcnQgdGhhdCB0aGUgY29tcG9zaXRlIG9iamVjdCBkb2VzIG5vdCAiaGF2ZSIgdGhlIHNjYWxhci4KKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKHNjYWxhcl9maWVsZF9uYW1lKSkKKyAgICAgICMgQXNzZXJ0IHRoYXQgcHJvdG8gZG9lcyBub3QgImhhdmUiIHRoZSBjb21wb3NpdGUgZmllbGQuCisgICAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKGNvbXBvc2l0ZV9maWVsZF9uYW1lKSkKKworICAgICAgIyBOb3cgc2V0IHRoZSBzY2FsYXIgd2l0aGluIHRoZSBjb21wb3NpdGUgZmllbGQuICBFbnN1cmUgdGhhdCB0aGUgc2V0dGluZworICAgICAgIyBpcyByZWZsZWN0ZWQsIGFuZCB0aGF0IHByb3RvLkhhc0ZpZWxkKCdjb21wb3NpdGUnKSBhbmQKKyAgICAgICMgcHJvdG8uY29tcG9zaXRlLkhhc0ZpZWxkKCdzY2FsYXInKSBub3cgYm90aCByZXR1cm4gVHJ1ZS4KKyAgICAgIG5ld192YWwgPSAyMAorICAgICAgc2V0YXR0cihjb21wb3NpdGVfZmllbGQsIHNjYWxhcl9maWVsZF9uYW1lLCBuZXdfdmFsKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfdmFsLCBnZXRhdHRyKGNvbXBvc2l0ZV9maWVsZCwgc2NhbGFyX2ZpZWxkX25hbWUpKQorICAgICAgIyBIb2xkIG9uIHRvIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGNvbXBvc2l0ZV9maWVsZCBvYmplY3QuCisgICAgICBvbGRfY29tcG9zaXRlX2ZpZWxkID0gY29tcG9zaXRlX2ZpZWxkCisgICAgICAjIEFzc2VydCB0aGF0IHRoZSBoYXMgbWV0aG9kcyBub3cgcmV0dXJuIHRydWUuCisgICAgICBzZWxmLmFzc2VydFRydWUoY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKHNjYWxhcl9maWVsZF9uYW1lKSkKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZChjb21wb3NpdGVfZmllbGRfbmFtZSkpCisKKyAgICAgICMgTm93IGNhbGwgdGhlIGNsZWFyIG1ldGhvZC4uLgorICAgICAgcHJvdG8uQ2xlYXJGaWVsZChjb21wb3NpdGVfZmllbGRfbmFtZSkKKworICAgICAgIyAuLi5hbmQgZW5zdXJlIHRoYXQgdGhlICJoYXMiIGJpdHMgYXJlIGFsbCBiYWNrIHRvIEZhbHNlLi4uCisgICAgICBjb21wb3NpdGVfZmllbGQgPSBnZXRhdHRyKHByb3RvLCBjb21wb3NpdGVfZmllbGRfbmFtZSkKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKHNjYWxhcl9maWVsZF9uYW1lKSkKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoY29tcG9zaXRlX2ZpZWxkX25hbWUpKQorICAgICAgIyAuLi5hbmQgZW5zdXJlIHRoYXQgdGhlIHNjYWxhciBmaWVsZCBoYXMgcmV0dXJuZWQgdG8gaXRzIGRlZmF1bHQuCisgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGF0dHIoY29tcG9zaXRlX2ZpZWxkLCBzY2FsYXJfZmllbGRfbmFtZSkpCisKKyAgICAgICMgRmluYWxseSwgZW5zdXJlIHRoYXQgbW9kaWZpY2F0aW9ucyB0byB0aGUgb2xkIGNvbXBvc2l0ZSBmaWVsZCBvYmplY3QKKyAgICAgICMgZG9uJ3QgaGF2ZSBhbnkgZWZmZWN0IG9uIHRoZSBwYXJlbnQuIFBvc3NpYmxlIG9ubHkgd2l0aCB0aGUgcHVyZS1weXRob24KKyAgICAgICMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSS4KKyAgICAgICMKKyAgICAgICMgKE5PVEUgdGhhdCB3aGVuIHdlIGNsZWFyIHRoZSBjb21wb3NpdGUgZmllbGQgaW4gdGhlIHBhcmVudCwgd2UgYWN0dWFsbHkKKyAgICAgICMgZG9uJ3QgcmVjdXJzaXZlbHkgY2xlYXIgZG93biB0aGUgdHJlZS4gIEluc3RlYWQsIHdlIGp1c3QgZGlzY29ubmVjdCB0aGUKKyAgICAgICMgY2xlYXJlZCBjb21wb3NpdGUgZnJvbSB0aGUgdHJlZS4pCisgICAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgorICAgICAgICByZXR1cm4KKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvbGRfY29tcG9zaXRlX2ZpZWxkIGlzIG5vdCBjb21wb3NpdGVfZmllbGQpCisgICAgICBzZXRhdHRyKG9sZF9jb21wb3NpdGVfZmllbGQsIHNjYWxhcl9maWVsZF9uYW1lLCBuZXdfdmFsKQorICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb21wb3NpdGVfZmllbGQuSGFzRmllbGQoc2NhbGFyX2ZpZWxkX25hbWUpKQorICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZChjb21wb3NpdGVfZmllbGRfbmFtZSkpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGF0dHIoY29tcG9zaXRlX2ZpZWxkLCBzY2FsYXJfZmllbGRfbmFtZSkpCisKKyAgICAjIFRlc3Qgc2ltcGxlLCBzaW5nbGUtbGV2ZWwgbmVzdGluZyB3aGVuIHdlIHNldCBhIHNjYWxhci4KKyAgICBUZXN0Q29tcG9zaXRlSGFzQml0cygnb3B0aW9uYWxncm91cCcsICdhJykKKyAgICBUZXN0Q29tcG9zaXRlSGFzQml0cygnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnLCAnYmInKQorICAgIFRlc3RDb21wb3NpdGVIYXNCaXRzKCdvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UnLCAnYycpCisgICAgVGVzdENvbXBvc2l0ZUhhc0JpdHMoJ29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlJywgJ2QnKQorCisgIGRlZiB0ZXN0UmVmZXJlbmNlc1RvTmVzdGVkTWVzc2FnZShzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG5lc3RlZCA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCisgICAgZGVsIHByb3RvCisgICAgIyBBIHByZXZpb3VzIHZlcnNpb24gaGFkIGEgYnVnIHdoZXJlIHRoaXMgd291bGQgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4KKyAgICAjIGhpdHRpbmcgYSBub3ctZGVhZCB3ZWFrIHJlZmVyZW5jZS4KKyAgICBuZXN0ZWQuYmIgPSAyMworCisgIGRlZiB0ZXN0RGlzY29ubmVjdGluZ05lc3RlZE1lc3NhZ2VCZWZvcmVTZXR0aW5nRmllbGQoc2VsZik6CisgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJzoKKyAgICAgIHJldHVybgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbmVzdGVkID0gcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKKyAgICBwcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpICAjIFNob3VsZCBkaXNjb25uZWN0IGZyb20gcGFyZW50CisgICAgc2VsZi5hc3NlcnRUcnVlKG5lc3RlZCBpcyBub3QgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UpCisgICAgbmVzdGVkLmJiID0gMjMKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisKKyAgZGVmIHRlc3RIYXNCaXRzV2hlbk1vZGlmeWluZ1JlcGVhdGVkRmllbGRzKHNlbGYpOgorICAgICMgVGVzdCBuZXN0aW5nIHdoZW4gd2UgYWRkIGFuIGVsZW1lbnQgdG8gYSByZXBlYXRlZCBmaWVsZCBpbiBhIHN1Ym1lc3NhZ2UuCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzKCkKKyAgICBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5uZXN0ZWRtZXNzYWdlX3JlcGVhdGVkX2ludDMyLmFwcGVuZCg1KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIFs1XSwgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UubmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9pbnQzMikKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgICAjIERvIHRoZSBzYW1lIHRlc3QsIGJ1dCB3aXRoIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkIHdpdGhpbiB0aGUKKyAgICAjIHN1Ym1lc3NhZ2UuCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UubmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9mb3JlaWdubWVzc2FnZS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICBkZWYgdGVzdEhhc0JpdHNGb3JNYW55TGV2ZWxzT2ZOZXN0aW5nKHNlbGYpOgorICAgICMgVGVzdCBuZXN0aW5nIG1hbnkgbGV2ZWxzIGRlZXAuCisgICAgcmVjdXJzaXZlX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RNdXR1YWxSZWN1cnNpb25BKCkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHJlY3Vyc2l2ZV9wcm90by5IYXNGaWVsZCgnYmInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHJlY3Vyc2l2ZV9wcm90by5iYi5hLmJiLmEuYmIub3B0aW9uYWxfaW50MzIpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCByZWN1cnNpdmVfcHJvdG8uSGFzRmllbGQoJ2JiJykpCisgICAgcmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuYS5iYi5vcHRpb25hbF9pbnQzMiA9IDUKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHJlY3Vyc2l2ZV9wcm90by5iYi5hLmJiLmEuYmIub3B0aW9uYWxfaW50MzIpCisgICAgc2VsZi5hc3NlcnRUcnVlKHJlY3Vyc2l2ZV9wcm90by5IYXNGaWVsZCgnYmInKSkKKyAgICBzZWxmLmFzc2VydFRydWUocmVjdXJzaXZlX3Byb3RvLmJiLkhhc0ZpZWxkKCdhJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHJlY3Vyc2l2ZV9wcm90by5iYi5hLkhhc0ZpZWxkKCdiYicpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5IYXNGaWVsZCgnYScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5hLkhhc0ZpZWxkKCdiYicpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuYS5iYi5IYXNGaWVsZCgnYScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5hLmJiLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorCisgIGRlZiB0ZXN0U2luZ3VsYXJMaXN0RmllbGRzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfZml4ZWQzMiA9IDEKKyAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDUKKyAgICBwcm90by5vcHRpb25hbF9zdHJpbmcgPSAnZm9vJworICAgICMgQWNjZXNzIHN1Yi1tZXNzYWdlIGJ1dCBkb24ndCBzZXQgaXQgeWV0LgorICAgIG5lc3RlZF9tZXNzYWdlID0gcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgWyAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfaW50MzInICBdLCA1KSwKKyAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ZpeGVkMzInXSwgMSksCisgICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9zdHJpbmcnIF0sICdmb28nKSBdLAorICAgICAgcHJvdG8uTGlzdEZpZWxkcygpKQorCisgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgPSAxMjMKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgWyAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfaW50MzInICBdLCA1KSwKKyAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ZpeGVkMzInXSwgMSksCisgICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9zdHJpbmcnIF0sICdmb28nKSwKKyAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJyBdLAorICAgICAgICAgICAgIG5lc3RlZF9tZXNzYWdlKSBdLAorICAgICAgcHJvdG8uTGlzdEZpZWxkcygpKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRMaXN0RmllbGRzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ucmVwZWF0ZWRfZml4ZWQzMi5hcHBlbmQoMSkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMTEpCisgICAgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLmV4dGVuZChbJ2ZvbycsICdiYXInXSkKKyAgICBwcm90by5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKFtdKQorICAgIHByb3RvLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2JheicpCisgICAgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLmV4dGVuZChzdHIoeCkgZm9yIHggaW4geHJhbmdlKDIpKQorICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMjEKKyAgICBwcm90by5yZXBlYXRlZF9ib29sICAjIEFjY2VzcyBidXQgZG9uJ3Qgc2V0IGFueXRoaW5nOyBzaG91bGQgbm90IGJlIGxpc3RlZC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgWyAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfaW50MzInICBdLCAyMSksCisgICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydyZXBlYXRlZF9pbnQzMicgIF0sIFs1LCAxMV0pLAorICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsncmVwZWF0ZWRfZml4ZWQzMiddLCBbMV0pLAorICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsncmVwZWF0ZWRfc3RyaW5nJyBdLAorICAgICAgICAgIFsnZm9vJywgJ2JhcicsICdiYXonLCAnMCcsICcxJ10pIF0sCisgICAgICBwcm90by5MaXN0RmllbGRzKCkpCisKKyAgZGVmIHRlc3RTaW5ndWxhckxpc3RFeHRlbnNpb25zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl0gPSAxCisgICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICBdID0gNQorICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gXSA9ICdmb28nCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIFsgKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24gICwgNSksCisgICAgICAgICh1bml0dGVzdF9wYjIub3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24sIDEpLAorICAgICAgICAodW5pdHRlc3RfcGIyLm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gLCAnZm9vJykgXSwKKyAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKKworICBkZWYgdGVzdFJlcGVhdGVkTGlzdEV4dGVuc2lvbnMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMSkKKyAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gIF0uYXBwZW5kKDUpCisgICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICBdLmFwcGVuZCgxMSkKKyAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uIF0uYXBwZW5kKCdmb28nKQorICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gXS5hcHBlbmQoJ2JhcicpCisgICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiBdLmFwcGVuZCgnYmF6JykKKyAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24gIF0gPSAyMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICBbICh1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAsIDIxKSwKKyAgICAgICAgKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICwgWzUsIDExXSksCisgICAgICAgICh1bml0dGVzdF9wYjIucmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIFsxXSksCisgICAgICAgICh1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAsIFsnZm9vJywgJ2JhcicsICdiYXonXSkgXSwKKyAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKKworICBkZWYgdGVzdExpc3RGaWVsZHNBbmRFeHRlbnNpb25zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RGaWVsZE9yZGVyaW5ncygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMocHJvdG8pCisgICAgdW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9pbnQKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgWyAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnbXlfaW50JyAgIF0sIDEpLAorICAgICAgICAodW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9pbnQgICAgICAgICAgICAgICAsIDIzKSwKKyAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ215X3N0cmluZyddLCAnZm9vJyksCisgICAgICAgICh1bml0dGVzdF9wYjIubXlfZXh0ZW5zaW9uX3N0cmluZyAgICAgICAgICAgICwgJ2JhcicpLAorICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnbXlfZmxvYXQnIF0sIDEuMCkgXSwKKyAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKKworICBkZWYgdGVzdERlZmF1bHRWYWx1ZXMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfaW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF91aW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF91aW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9zaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9zaW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9maXhlZDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfZml4ZWQ2NCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX3NmaXhlZDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfc2ZpeGVkNjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLjAsIHByb3RvLm9wdGlvbmFsX2Zsb2F0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMC4wLCBwcm90by5vcHRpb25hbF9kb3VibGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgcHJvdG8ub3B0aW9uYWxfYm9vbCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBwcm90by5vcHRpb25hbF9zdHJpbmcpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgcHJvdG8ub3B0aW9uYWxfYnl0ZXMpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQxLCBwcm90by5kZWZhdWx0X2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIHByb3RvLmRlZmF1bHRfaW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0MywgcHJvdG8uZGVmYXVsdF91aW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0NCwgcHJvdG8uZGVmYXVsdF91aW50NjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtNDUsIHByb3RvLmRlZmF1bHRfc2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDYsIHByb3RvLmRlZmF1bHRfc2ludDY0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDcsIHByb3RvLmRlZmF1bHRfZml4ZWQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQ4LCBwcm90by5kZWZhdWx0X2ZpeGVkNjQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0OSwgcHJvdG8uZGVmYXVsdF9zZml4ZWQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKC01MCwgcHJvdG8uZGVmYXVsdF9zZml4ZWQ2NCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUxLjUsIHByb3RvLmRlZmF1bHRfZmxvYXQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1MmUzLCBwcm90by5kZWZhdWx0X2RvdWJsZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHByb3RvLmRlZmF1bHRfYm9vbCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdoZWxsbycsIHByb3RvLmRlZmF1bHRfc3RyaW5nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3dvcmxkJywgcHJvdG8uZGVmYXVsdF9ieXRlcykKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSLCBwcm90by5kZWZhdWx0X25lc3RlZF9lbnVtKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLCBwcm90by5kZWZhdWx0X2ZvcmVpZ25fZW51bSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X2ltcG9ydF9wYjIuSU1QT1JUX0JBUiwKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLmRlZmF1bHRfaW1wb3J0X2VudW0pCisKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdTEyMzQnLCBwcm90by51dGY4X3N0cmluZykKKworICBkZWYgdGVzdEhhc0ZpZWxkV2l0aFVua25vd25GaWVsZE5hbWUoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwcm90by5IYXNGaWVsZCwgJ25vbmV4aXN0ZW50X2ZpZWxkJykKKworICBkZWYgdGVzdENsZWFyRmllbGRXaXRoVW5rbm93bkZpZWxkTmFtZShzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHByb3RvLkNsZWFyRmllbGQsICdub25leGlzdGVudF9maWVsZCcpCisKKyAgZGVmIHRlc3REaXNhbGxvd2VkQXNzaWdubWVudHMoc2VsZik6CisgICAgIyBJdCdzIGlsbGVnYWwgdG8gYXNzaWduIHZhbHVlcyBkaXJlY3RseSB0byByZXBlYXRlZCBmaWVsZHMKKyAgICAjIG9yIHRvIG5vbnJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMuICBFbnN1cmUgdGhhdCB0aGlzIGZhaWxzLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgIyBSZXBlYXRlZCBmaWVsZHMuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAncmVwZWF0ZWRfaW50MzInLCAxMCkKKyAgICAjIExpc3RzIHNob3VsZG4ndCB3b3JrLCBlaXRoZXIuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAncmVwZWF0ZWRfaW50MzInLCBbMTBdKQorICAgICMgQ29tcG9zaXRlIGZpZWxkcy4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJywgMjMpCisgICAgIyBBc3NpZ25tZW50IHRvIGEgcmVwZWF0ZWQgbmVzdGVkIG1lc3NhZ2UgZmllbGQgd2l0aG91dCBzcGVjaWZ5aW5nCisgICAgIyB0aGUgaW5kZXggaW4gdGhlIGFycmF5IG9mIG5lc3RlZCBtZXNzYWdlcy4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgJ2JiJywgMzQpCisgICAgIyBBc3NpZ25tZW50IHRvIGFuIGF0dHJpYnV0ZSBvZiBhIHJlcGVhdGVkIGZpZWxkLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBwcm90by5yZXBlYXRlZF9mbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAnc29tZV9hdHRyaWJ1dGUnLCAzNCkKKyAgICAjIHByb3RvLm5vbmV4aXN0ZW50X2ZpZWxkID0gMjMgc2hvdWxkIGZhaWwgYXMgd2VsbC4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sICdub25leGlzdGVudF9maWVsZCcsIDIzKQorCisgIGRlZiB0ZXN0U2luZ2xlU2NhbGFyVHlwZVNhZmV0eShzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sICdvcHRpb25hbF9pbnQzMicsIDEuMSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAnb3B0aW9uYWxfaW50MzInLCAnZm9vJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAnb3B0aW9uYWxfc3RyaW5nJywgMTApCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2J5dGVzJywgMTApCisKKyAgZGVmIHRlc3RTaW5nbGVTY2FsYXJCb3VuZHNDaGVja2luZyhzZWxmKToKKyAgICBkZWYgVGVzdE1pbkFuZE1heEludGVnZXJzKGZpZWxkX25hbWUsIGV4cGVjdGVkX21pbiwgZXhwZWN0ZWRfbWF4KToKKyAgICAgIHBiID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgICBzZXRhdHRyKHBiLCBmaWVsZF9uYW1lLCBleHBlY3RlZF9taW4pCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX21pbiwgZ2V0YXR0cihwYiwgZmllbGRfbmFtZSkpCisgICAgICBzZXRhdHRyKHBiLCBmaWVsZF9uYW1lLCBleHBlY3RlZF9tYXgpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX21heCwgZ2V0YXR0cihwYiwgZmllbGRfbmFtZSkpCisgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBwYiwgZmllbGRfbmFtZSwgZXhwZWN0ZWRfbWluIC0gMSkKKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIHBiLCBmaWVsZF9uYW1lLCBleHBlY3RlZF9tYXggKyAxKQorCisgICAgVGVzdE1pbkFuZE1heEludGVnZXJzKCdvcHRpb25hbF9pbnQzMicsIC0oMSA8PCAzMSksICgxIDw8IDMxKSAtIDEpCisgICAgVGVzdE1pbkFuZE1heEludGVnZXJzKCdvcHRpb25hbF91aW50MzInLCAwLCAweGZmZmZmZmZmKQorICAgIFRlc3RNaW5BbmRNYXhJbnRlZ2Vycygnb3B0aW9uYWxfaW50NjQnLCAtKDEgPDwgNjMpLCAoMSA8PCA2MykgLSAxKQorICAgIFRlc3RNaW5BbmRNYXhJbnRlZ2Vycygnb3B0aW9uYWxfdWludDY0JywgMCwgMHhmZmZmZmZmZmZmZmZmZmZmKQorCisgICAgcGIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwYi5vcHRpb25hbF9uZXN0ZWRfZW51bSA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHBiLm9wdGlvbmFsX25lc3RlZF9lbnVtKQorCisgICAgIyBJbnZhbGlkIGVudW0gdmFsdWVzLgorICAgIHBiLm9wdGlvbmFsX25lc3RlZF9lbnVtID0gMAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcGIub3B0aW9uYWxfbmVzdGVkX2VudW0pCisKKyAgICBieXRlc19zaXplX2JlZm9yZSA9IHBiLkJ5dGVTaXplKCkKKworICAgIHBiLm9wdGlvbmFsX25lc3RlZF9lbnVtID0gNAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgcGIub3B0aW9uYWxfbmVzdGVkX2VudW0pCisKKyAgICBwYi5vcHRpb25hbF9uZXN0ZWRfZW51bSA9IDAKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHBiLm9wdGlvbmFsX25lc3RlZF9lbnVtKQorCisgICAgIyBNYWtlIHN1cmUgdGhhdCBzZXR0aW5nIHRoZSBzYW1lIGVudW0gZmllbGQgZG9lc24ndCBqdXN0IGFkZCB1bmtub3duCisgICAgIyBmaWVsZHMgKGJ1dCBvdmVyd3JpdGVzIHRoZW0pLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXNfc2l6ZV9iZWZvcmUsIHBiLkJ5dGVTaXplKCkpCisKKyAgICAjIElzIHRoZSBpbnZhbGlkIHZhbHVlIHByZXNlcnZlZCBhZnRlciBzZXJpYWxpemF0aW9uPworICAgIHNlcmlhbGl6ZWQgPSBwYi5TZXJpYWxpemVUb1N0cmluZygpCisgICAgcGIyID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcGIyLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcGIyLm9wdGlvbmFsX25lc3RlZF9lbnVtKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocGIsIHBiMikKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyVHlwZVNhZmV0eShzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kLCAxLjEpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQsICdmb28nKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLCAxMCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2J5dGVzLCAxMCkKKworICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMlswXSA9IDIzCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19zZXRpdGVtX18sIDUwMCwgMjMpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX3NldGl0ZW1fXywgMCwgJ2FiYycpCisKKyAgICAjIFJlcGVhdGVkIGVudW1zIHRlc3RzLgorICAgICNwcm90by5yZXBlYXRlZF9uZXN0ZWRfZW51bS5hcHBlbmQoMCkKKworICBkZWYgdGVzdFNpbmdsZVNjYWxhckdldHRlcnNBbmRTZXR0ZXJzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9pbnQzMikKKyAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLm9wdGlvbmFsX2ludDMyKQorCisgICAgcHJvdG8ub3B0aW9uYWxfdWludDY0ID0gMHhmZmZmZmZmZmZmZmYKKyAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmZmZmZmZmZmZmZmLCBwcm90by5vcHRpb25hbF91aW50NjQpCisgICAgcHJvdG8ub3B0aW9uYWxfdWludDY0ID0gMHhmZmZmZmZmZmZmZmZmZmZmCisgICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZmZmZmZmZmZmYsIHByb3RvLm9wdGlvbmFsX3VpbnQ2NCkKKyAgICAjIFRPRE8ocm9iaW5zb24pOiBUZXN0IGFsbCBvdGhlciBzY2FsYXIgZmllbGQgdHlwZXMuCisKKyAgZGVmIHRlc3RTaW5nbGVTY2FsYXJDbGVhckZpZWxkKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgIyBTaG91bGQgYmUgYWxsb3dlZCB0byBjbGVhciBzb21ldGhpbmcgdGhhdCdzIG5vdCB0aGVyZSAoYSBuby1vcCkuCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQorICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgICBwcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorICAgICMgVE9ETyhyb2JpbnNvbik6IFRlc3QgYWxsIG90aGVyIHNjYWxhciBmaWVsZCB0eXBlcy4KKworICBkZWYgdGVzdEVudW1zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5GT08pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvLkJBUikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgcHJvdG8uQkFaKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVopCisKKyAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhcnMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCg1KQorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMTUpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLnJlcGVhdGVkX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKHByb3RvLnJlcGVhdGVkX2ludDMyKSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDEwLCAxNV0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQorCisgICAgIyBUZXN0IHNpbmdsZSByZXRyaWV2YWwuCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBwcm90by5yZXBlYXRlZF9pbnQzMlswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDE1LCBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0pCisgICAgIyBUZXN0IG91dC1vZi1ib3VuZHMgaW5kaWNlcy4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX2dldGl0ZW1fXywgMTIzNCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX2dldGl0ZW1fXywgLTEyMzQpCisgICAgIyBUZXN0IGluY29ycmVjdCB0eXBlcyBwYXNzZWQgdG8gX19nZXRpdGVtX18uCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX2dldGl0ZW1fXywgJ2ZvbycpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX2dldGl0ZW1fXywgTm9uZSkKKworICAgICMgVGVzdCBzaW5nbGUgYXNzaWdubWVudC4KKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMlsxXSA9IDIwCisgICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMjAsIDE1XSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICAjIFRlc3QgaW5zZXJ0aW9uLgorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmluc2VydCgxLCAyNSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAyNSwgMjAsIDE1XSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICAjIFRlc3Qgc2xpY2UgcmV0cmlldmFsLgorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgzMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsyNSwgMjAsIDE1XSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMTo0XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAyNSwgMjAsIDE1LCAzMF0sIHByb3RvLnJlcGVhdGVkX2ludDMyWzpdKQorCisgICAgIyBUZXN0IHNsaWNlIGFzc2lnbm1lbnQgd2l0aCBhbiBpdGVyYXRvcgorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyWzE6NF0gPSAoaSBmb3IgaSBpbiB4cmFuZ2UoMykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMCwgMSwgMiwgMzBdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgICMgVGVzdCBzbGljZSBhc3NpZ25tZW50LgorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyWzE6NF0gPSBbMzUsIDQwLCA0NV0KKyAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAzNSwgNDAsIDQ1LCAzMF0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQorCisgICAgIyBUZXN0IHRoYXQgd2UgY2FuIHVzZSB0aGUgZmllbGQgYXMgYW4gaXRlcmF0b3IuCisgICAgcmVzdWx0ID0gW10KKyAgICBmb3IgaSBpbiBwcm90by5yZXBlYXRlZF9pbnQzMjoKKyAgICAgIHJlc3VsdC5hcHBlbmQoaSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAzNSwgNDAsIDQ1LCAzMF0sIHJlc3VsdCkKKworICAgICMgVGVzdCBzaW5nbGUgZGVsZXRpb24uCisgICAgZGVsIHByb3RvLnJlcGVhdGVkX2ludDMyWzJdCisgICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzUsIDQ1LCAzMF0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQorCisgICAgIyBUZXN0IHNsaWNlIGRlbGV0aW9uLgorICAgIGRlbCBwcm90by5yZXBlYXRlZF9pbnQzMlsyOl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAzNV0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQorCisgICAgIyBUZXN0IGV4dGVuZGluZy4KKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5leHRlbmQoWzMsIDEzXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAzNSwgMywgMTNdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgICMgVGVzdCBjbGVhcmluZy4KKyAgICBwcm90by5DbGVhckZpZWxkKCdyZXBlYXRlZF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5yZXBlYXRlZF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCisKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLnJlcGVhdGVkX2ludDMyWy0xXSkKKyAgICAjIFRlc3QgYXNzaWdubWVudCB0byBhIG5lZ2F0aXZlIGluZGV4LgorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyWy0xXSA9IDIKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvLnJlcGVhdGVkX2ludDMyWy0xXSkKKworICAgICMgVGVzdCBkZWxldGlvbiBhdCBuZWdhdGl2ZSBpbmRpY2VzLgorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyWzpdID0gWzAsIDEsIDIsIDNdCisgICAgZGVsIHByb3RvLnJlcGVhdGVkX2ludDMyWy0xXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzAsIDEsIDJdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICAgIGRlbCBwcm90by5yZXBlYXRlZF9pbnQzMlstMl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKFswLCAyXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX2RlbGl0ZW1fXywgLTMpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19kZWxpdGVtX18sIDMwMCkKKworICAgIGRlbCBwcm90by5yZXBlYXRlZF9pbnQzMlstMjotMV0KKyAgICBzZWxmLmFzc2VydEVxdWFsKFsyXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCisKKyAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMTAwOjEwMDAwXQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzJdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyc1JlbW92ZShzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5yZXBlYXRlZF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCisgICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEwKQorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCg1KQorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCg1KQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQorICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLnJlbW92ZSg1KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKHByb3RvLnJlcGVhdGVkX2ludDMyKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEwLCBwcm90by5yZXBlYXRlZF9pbnQzMlswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHByb3RvLnJlcGVhdGVkX2ludDMyWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMl0pCisKKyAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUoNSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBwcm90by5yZXBlYXRlZF9pbnQzMlsxXSkKKworICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLnJlbW92ZSgxMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBwcm90by5yZXBlYXRlZF9pbnQzMlswXSkKKworICAgICMgUmVtb3ZlIGEgbm9uLWV4aXN0ZW50IGVsZW1lbnQuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIucmVtb3ZlLCAxMjMpCisKKyAgZGVmIHRlc3RSZXBlYXRlZENvbXBvc2l0ZXMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKyAgICBtMCA9IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbTEgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKFttMCwgbTFdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtMCwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKSkKKworICAgICMgVGVzdCBvdXQtb2YtYm91bmRzIGluZGljZXMuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuX19nZXRpdGVtX18sCisgICAgICAgICAgICAgICAgICAgICAgMTIzNCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5fX2dldGl0ZW1fXywKKyAgICAgICAgICAgICAgICAgICAgICAtMTIzNCkKKworICAgICMgVGVzdCBpbmNvcnJlY3QgdHlwZXMgcGFzc2VkIHRvIF9fZ2V0aXRlbV9fLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuX19nZXRpdGVtX18sCisgICAgICAgICAgICAgICAgICAgICAgJ2ZvbycpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5fX2dldGl0ZW1fXywKKyAgICAgICAgICAgICAgICAgICAgICBOb25lKQorCisgICAgIyBUZXN0IHNsaWNlIHJldHJpZXZhbC4KKyAgICBtMiA9IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbTMgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIG00ID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoCisgICAgICAgIFttMSwgbTIsIG0zXSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMTo0XSkKKyAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoCisgICAgICAgIFttMCwgbTEsIG0yLCBtMywgbTRdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVs6XSkKKyAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoCisgICAgICAgIFttMCwgbTFdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVs6Ml0pCisgICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKAorICAgICAgICBbbTIsIG0zLCBtNF0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzI6XSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBtMCwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0pCisgICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKAorICAgICAgICBbbTBdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVs6MV0pCisKKyAgICAjIFRlc3QgdGhhdCB3ZSBjYW4gdXNlIHRoZSBmaWVsZCBhcyBhbiBpdGVyYXRvci4KKyAgICByZXN1bHQgPSBbXQorICAgIGZvciBpIGluIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlOgorICAgICAgcmVzdWx0LmFwcGVuZChpKQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbChbbTAsIG0xLCBtMiwgbTMsIG00XSwgcmVzdWx0KQorCisgICAgIyBUZXN0IHNpbmdsZSBkZWxldGlvbi4KKyAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMl0KKyAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoW20wLCBtMSwgbTMsIG00XSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisKKyAgICAjIFRlc3Qgc2xpY2UgZGVsZXRpb24uCisgICAgZGVsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzI6XQorICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbChbbTAsIG0xXSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisKKyAgICAjIFRlc3QgZXh0ZW5kaW5nLgorICAgIG4xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKGJiPTEpCisgICAgbjIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoYmI9MikKKyAgICBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5leHRlbmQoW24xLG4yXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChuMSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMl0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChuMiwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbM10pCisKKyAgICAjIFRlc3QgY2xlYXJpbmcuCisgICAgcHJvdG8uQ2xlYXJGaWVsZCgncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UnKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorCisgICAgIyBUZXN0IGNvbnN0cnVjdGluZyBhbiBlbGVtZW50IHdoaWxlIGFkZGluZyBpdC4KKyAgICBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoYmI9MjMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdLmJiKQorCisgIGRlZiB0ZXN0SGFuZFdyaXR0ZW5SZWZsZWN0aW9uKHNlbGYpOgorICAgICMgSGFuZCB3cml0dGVuIGV4dGVuc2lvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGJ5IHRoZSBwdXJlLVB5dGhvbgorICAgICMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSS4KKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgorICAgICAgcmV0dXJuCisKKyAgICBGaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcgorICAgIGZvb19maWVsZF9kZXNjcmlwdG9yID0gRmllbGREZXNjcmlwdG9yKAorICAgICAgICBuYW1lPSdmb29fZmllbGQnLCBmdWxsX25hbWU9J015UHJvdG8uZm9vX2ZpZWxkJywKKyAgICAgICAgaW5kZXg9MCwgbnVtYmVyPTEsIHR5cGU9RmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQsCisgICAgICAgIGNwcF90eXBlPUZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0lOVDY0LAorICAgICAgICBsYWJlbD1GaWVsZERlc2NyaXB0b3IuTEFCRUxfT1BUSU9OQUwsIGRlZmF1bHRfdmFsdWU9MCwKKyAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwKKyAgICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKKyAgICAgICAgb3B0aW9ucz1kZXNjcmlwdG9yX3BiMi5GaWVsZE9wdGlvbnMoKSkKKyAgICBteWRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCisgICAgICAgIG5hbWU9J015UHJvdG8nLCBmdWxsX25hbWU9J015UHJvdG8nLCBmaWxlbmFtZT0naWdub3JlZCcsCisgICAgICAgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLCBuZXN0ZWRfdHlwZXM9W10sIGVudW1fdHlwZXM9W10sCisgICAgICAgIGZpZWxkcz1bZm9vX2ZpZWxkX2Rlc2NyaXB0b3JdLCBleHRlbnNpb25zPVtdLAorICAgICAgICBvcHRpb25zPWRlc2NyaXB0b3JfcGIyLk1lc3NhZ2VPcHRpb25zKCkpCisgICAgY2xhc3MgTXlQcm90b0NsYXNzKG1lc3NhZ2UuTWVzc2FnZSk6CisgICAgICBERVNDUklQVE9SID0gbXlkZXNjcmlwdG9yCisgICAgICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCisgICAgbXlwcm90b19pbnN0YW5jZSA9IE15UHJvdG9DbGFzcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBteXByb3RvX2luc3RhbmNlLmZvb19maWVsZCkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IG15cHJvdG9faW5zdGFuY2UuSGFzRmllbGQoJ2Zvb19maWVsZCcpKQorICAgIG15cHJvdG9faW5zdGFuY2UuZm9vX2ZpZWxkID0gMjMKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBteXByb3RvX2luc3RhbmNlLmZvb19maWVsZCkKKyAgICBzZWxmLmFzc2VydFRydWUobXlwcm90b19pbnN0YW5jZS5IYXNGaWVsZCgnZm9vX2ZpZWxkJykpCisKKyAgZGVmIHRlc3RUb3BMZXZlbEV4dGVuc2lvbnNGb3JPcHRpb25hbFNjYWxhcihzZWxmKToKKyAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbgorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCisgICAgIyBBcyB3aXRoIG5vcm1hbCBzY2FsYXIgZmllbGRzLCBqdXN0IGRvaW5nIGEgcmVhZCBkb2Vzbid0IGFjdHVhbGx5IHNldCB0aGUKKyAgICAjICJoYXMiIGJpdC4KKyAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorICAgICMgQWN0dWFsbHkgc2V0IHRoZSB0aGluZy4KKyAgICBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0gPSAyMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKyAgICBzZWxmLmFzc2VydFRydWUoZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisgICAgIyBFbnN1cmUgdGhhdCBjbGVhcmluZyB3b3JrcyBhcyB3ZWxsLgorICAgIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorCisgIGRlZiB0ZXN0VG9wTGV2ZWxFeHRlbnNpb25zRm9yUmVwZWF0ZWRTY2FsYXIoc2VsZik6CisgICAgZXh0ZW5kZWVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIGV4dGVuc2lvbiA9IHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4oZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKKyAgICBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYXBwZW5kKCdmb28nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydmb28nXSwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQorICAgIHN0cmluZ19saXN0ID0gZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCisgICAgZXh0ZW5kZWVfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmluZ19saXN0IGlzIG5vdCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCisgICAgIyBTaG91bGRuJ3QgYmUgYWxsb3dlZCB0byBkbyBFeHRlbnNpb25zW2V4dGVuc2lvbl0gPSAnYScKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLCAnYScpCisKKyAgZGVmIHRlc3RUb3BMZXZlbEV4dGVuc2lvbnNGb3JPcHRpb25hbE1lc3NhZ2Uoc2VsZik6CisgICAgZXh0ZW5kZWVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIGV4dGVuc2lvbiA9IHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5jKQorICAgICMgQXMgd2l0aCBub3JtYWwgKG5vbi1leHRlbnNpb24pIGZpZWxkcywgbWVyZWx5IHJlYWRpbmcgZnJvbSB0aGUKKyAgICAjIHRoaW5nIHNob3VsZG4ndCBzZXQgdGhlICJoYXMiIGJpdC4KKyAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorICAgIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5jID0gMjMKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYykKKyAgICBzZWxmLmFzc2VydFRydWUoZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisgICAgIyBTYXZlIGEgcmVmZXJlbmNlIGhlcmUuCisgICAgZm9yZWlnbl9tZXNzYWdlID0gZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCisgICAgZXh0ZW5kZWVfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3JlaWduX21lc3NhZ2UgaXMgbm90IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKyAgICAjIFNldHRpbmcgYSBmaWVsZCBvbiBmb3JlaWduX21lc3NhZ2Ugbm93IHNob3VsZG4ndCBzZXQKKyAgICAjIGFueSAiaGFzIiBiaXRzIG9uIGV4dGVuZGVlX3Byb3RvLgorICAgIGZvcmVpZ25fbWVzc2FnZS5jID0gNDIKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBmb3JlaWduX21lc3NhZ2UuYykKKyAgICBzZWxmLmFzc2VydFRydWUoZm9yZWlnbl9tZXNzYWdlLkhhc0ZpZWxkKCdjJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKKyAgICAjIFNob3VsZG4ndCBiZSBhbGxvd2VkIHRvIGRvIEV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9ICdhJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sICdhJykKKworICBkZWYgdGVzdFRvcExldmVsRXh0ZW5zaW9uc0ZvclJlcGVhdGVkTWVzc2FnZShzZWxmKToKKyAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4oZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKKyAgICBncm91cCA9IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hZGQoKQorICAgIGdyb3VwLmEgPSAyMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXVswXS5hKQorICAgIGdyb3VwLmEgPSA0MgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXVswXS5hKQorICAgIGdyb3VwX2xpc3QgPSBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KKyAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4oZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKKyAgICBzZWxmLmFzc2VydFRydWUoZ3JvdXBfbGlzdCBpcyBub3QgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQorICAgICMgU2hvdWxkbid0IGJlIGFsbG93ZWQgdG8gZG8gRXh0ZW5zaW9uc1tleHRlbnNpb25dID0gJ2EnCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwgJ2EnKQorCisgIGRlZiB0ZXN0TmVzdGVkRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5zaW5nbGUKKworICAgICMgV2UganVzdCB0ZXN0IHRoZSBub24tcmVwZWF0ZWQgY2FzZS4KKyAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorICAgIHJlcXVpcmVkID0gZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCByZXF1aXJlZC5hKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCisgICAgcmVxdWlyZWQuYSA9IDIzCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmEpCisgICAgc2VsZi5hc3NlcnRUcnVlKGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorICAgIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKKyAgICBzZWxmLmFzc2VydFRydWUocmVxdWlyZWQgaXMgbm90IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQorCisgICMgSWYgbWVzc2FnZSBBIGRpcmVjdGx5IGNvbnRhaW5zIG1lc3NhZ2UgQiwgYW5kCisgICMgYS5IYXNGaWVsZCgnYicpIGlzIGN1cnJlbnRseSBGYWxzZSwgdGhlbiBtdXRhdGluZyBhbnkKKyAgIyBleHRlbnNpb24gaW4gQiBzaG91bGQgY2hhbmdlIGEuSGFzRmllbGQoJ2InKSB0byBUcnVlCisgICMgKGFuZCBzbyBvbiB1cCB0aGUgb2JqZWN0IHRyZWUpLgorICBkZWYgdGVzdEhhc0JpdHNGb3JBbmNlc3RvcnNPZkV4dGVuZGVkTWVzc2FnZShzZWxmKToKKyAgICAjIE9wdGlvbmFsIHNjYWxhciBleHRlbnNpb24uCisgICAgdG9wbGV2ZWwgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLlRvcExldmVsTWVzc2FnZSgpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX2ludF9leHRlbnNpb25dKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKyAgICB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfaW50X2V4dGVuc2lvbl0gPSAyMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9pbnRfZXh0ZW5zaW9uXSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKworICAgICMgUmVwZWF0ZWQgc2NhbGFyIGV4dGVuc2lvbi4KKyAgICB0b3BsZXZlbCA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuVG9wTGV2ZWxNZXNzYWdlKCkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX2ludF9leHRlbnNpb25dKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKKyAgICB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfaW50X2V4dGVuc2lvbl0uYXBwZW5kKDIzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzIzXSwgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX2ludF9leHRlbnNpb25dKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorCisgICAgIyBPcHRpb25hbCBtZXNzYWdlIGV4dGVuc2lvbi4KKyAgICB0b3BsZXZlbCA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuVG9wTGV2ZWxNZXNzYWdlKCkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb25dLmZvcmVpZ25fbWVzc2FnZV9pbnQpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorICAgIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKKyAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbl0uZm9yZWlnbl9tZXNzYWdlX2ludCA9IDIzCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX21lc3NhZ2VfZXh0ZW5zaW9uXS5mb3JlaWduX21lc3NhZ2VfaW50KQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorCisgICAgIyBSZXBlYXRlZCBtZXNzYWdlIGV4dGVuc2lvbi4KKyAgICB0b3BsZXZlbCA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuVG9wTGV2ZWxNZXNzYWdlKCkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4odG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWworICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorICAgIGZvcmVpZ24gPSB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JlaWduLCB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCisgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfbWVzc2FnZV9leHRlbnNpb25dWzBdKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQorCisgIGRlZiB0ZXN0RGlzY29ubmVjdGlvbkFmdGVyQ2xlYXJpbmdFbXB0eU1lc3NhZ2Uoc2VsZik6CisgICAgdG9wbGV2ZWwgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLlRvcExldmVsTWVzc2FnZSgpCisgICAgZXh0ZW5kZWVfcHJvdG8gPSB0b3BsZXZlbC5zdWJtZXNzYWdlCisgICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbgorICAgIGV4dGVuc2lvbl9wcm90byA9IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQorICAgIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKKyAgICBleHRlbnNpb25fcHJvdG8uZm9yZWlnbl9tZXNzYWdlX2ludCA9IDIzCisKKyAgICBzZWxmLmFzc2VydFRydWUoZXh0ZW5zaW9uX3Byb3RvIGlzIG5vdCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCisKKyAgZGVmIHRlc3RFeHRlbnNpb25GYWlsdXJlTW9kZXMoc2VsZik6CisgICAgZXh0ZW5kZWVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorCisgICAgIyBUcnkgbm9uLWV4dGVuc2lvbi1oYW5kbGUgYXJndW1lbnRzIHRvIEhhc0V4dGVuc2lvbiwKKyAgICAjIENsZWFyRXh0ZW5zaW9uKCksIGFuZCBFeHRlbnNpb25zW10uLi4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uLCAxMjM0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbiwgMTIzNCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucy5fX2dldGl0ZW1fXywgMTIzNCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucy5fX3NldGl0ZW1fXywgMTIzNCwgNSkKKworICAgICMgVHJ5IHNvbWV0aGluZyB0aGF0ICppcyogYW4gZXh0ZW5zaW9uIGhhbmRsZSwganVzdCBub3QgZm9yCisgICAgIyB0aGlzIG1lc3NhZ2UuLi4KKyAgICB1bmtub3duX2hhbmRsZSA9IG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfaW50X2V4dGVuc2lvbgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9oYW5kbGUpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgIHVua25vd25faGFuZGxlKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLl9fZ2V0aXRlbV9fLAorICAgICAgICAgICAgICAgICAgICAgIHVua25vd25faGFuZGxlKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLl9fc2V0aXRlbV9fLAorICAgICAgICAgICAgICAgICAgICAgIHVua25vd25faGFuZGxlLCA1KQorCisgICAgIyBUcnkgY2FsbCBIYXNFeHRlbnNpb24oKSB3aXRoIGEgdmFsaWQgaGFuZGxlLCBidXQgZm9yIGEKKyAgICAjICpyZXBlYXRlZCogZmllbGQuICAoSnVzdCBhcyB3aXRoIG5vbi1leHRlbnNpb24gcmVwZWF0ZWQKKyAgICAjIGZpZWxkcywgSGFzKigpIGlzbid0IHN1cHBvcnRlZCBmb3IgZXh0ZW5zaW9uIHJlcGVhdGVkIGZpZWxkcykuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbikKKworICBkZWYgdGVzdFN0YXRpY1BhcnNlRnJvbShzZWxmKToKKyAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHByb3RvMSkKKworICAgIHN0cmluZzEgPSBwcm90bzEuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRnJvbVN0cmluZyhzdHJpbmcxKQorCisgICAgIyBNZXNzYWdlcyBzaG91bGQgYmUgZXF1YWwuCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90bzIsIHByb3RvMSkKKworICBkZWYgdGVzdE1lcmdlRnJvbVNpbmd1bGFyRmllbGQoc2VsZik6CisgICAgIyBUZXN0IG1lcmdlIHdpdGgganVzdCBhIHNpbmd1bGFyIGZpZWxkLgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMS5vcHRpb25hbF9pbnQzMiA9IDEKKworICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgICMgVGhpcyBzaG91bGRuJ3QgZ2V0IG92ZXJ3cml0dGVuLgorICAgIHByb3RvMi5vcHRpb25hbF9zdHJpbmcgPSAndmFsdWUnCisKKyAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMi5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd2YWx1ZScsIHByb3RvMi5vcHRpb25hbF9zdHJpbmcpCisKKyAgZGVmIHRlc3RNZXJnZUZyb21SZXBlYXRlZEZpZWxkKHNlbGYpOgorICAgICMgVGVzdCBtZXJnZSB3aXRoIGp1c3QgYSByZXBlYXRlZCBmaWVsZC4KKyAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzEucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgcHJvdG8xLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgyKQorCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8yLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgwKQorICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90bzIucmVwZWF0ZWRfaW50MzJbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90bzIucmVwZWF0ZWRfaW50MzJbMV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90bzIucmVwZWF0ZWRfaW50MzJbMl0pCisKKyAgZGVmIHRlc3RNZXJnZUZyb21PcHRpb25hbEdyb3VwKHNlbGYpOgorICAgICMgVGVzdCBtZXJnZSB3aXRoIGFuIG9wdGlvbmFsIGdyb3VwLgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMS5vcHRpb25hbGdyb3VwLmEgPSAxMgorICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIsIHByb3RvMi5vcHRpb25hbGdyb3VwLmEpCisKKyAgZGVmIHRlc3RNZXJnZUZyb21SZXBlYXRlZE5lc3RlZE1lc3NhZ2Uoc2VsZik6CisgICAgIyBUZXN0IG1lcmdlIHdpdGggYSByZXBlYXRlZCBuZXN0ZWQgbWVzc2FnZS4KKyAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtID0gcHJvdG8xLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbS5iYiA9IDEyMworICAgIG0gPSBwcm90bzEucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBtLmJiID0gMzIxCisKKyAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtID0gcHJvdG8yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgbS5iYiA9IDk5OQorICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTk5LCBwcm90bzIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjMsIHByb3RvMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsxXS5iYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMyMSwgcHJvdG8yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzJdLmJiKQorCisgICAgcHJvdG8zID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8zLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLk1lcmdlRnJvbShwcm90bzIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg5OTksIHByb3RvMy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEyMywgcHJvdG8zLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzFdLmJiKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzIxLCBwcm90bzMucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMl0uYmIpCisKKyAgZGVmIHRlc3RNZXJnZUZyb21BbGxGaWVsZHMoc2VsZik6CisgICAgIyBXaXRoIGFsbCBmaWVsZHMgc2V0LgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMocHJvdG8xKQorICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQorCisgICAgIyBNZXNzYWdlcyBzaG91bGQgYmUgZXF1YWwuCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90bzIsIHByb3RvMSkKKworICAgICMgU2VyaWFsaXplZCBzdHJpbmcgc2hvdWxkIGJlIGVxdWFsIHRvby4KKyAgICBzdHJpbmcxID0gcHJvdG8xLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBzdHJpbmcyID0gcHJvdG8yLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZzEsIHN0cmluZzIpCisKKyAgZGVmIHRlc3RNZXJnZUZyb21FeHRlbnNpb25zU2luZ3VsYXIoc2VsZik6CisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBwcm90bzEuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSA9IDEKKworICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgMSwgcHJvdG8yLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0pCisKKyAgZGVmIHRlc3RNZXJnZUZyb21FeHRlbnNpb25zUmVwZWF0ZWQoc2VsZik6CisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBwcm90bzEuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMSkKKyAgICBwcm90bzEuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMikKKworICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgcHJvdG8yLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl0uYXBwZW5kKDApCisgICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgMywgbGVuKHByb3RvMi5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAwLCBwcm90bzIuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXVswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAxLCBwcm90bzIuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXVsxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAyLCBwcm90bzIuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXVsyXSkKKworICBkZWYgdGVzdE1lcmdlRnJvbUV4dGVuc2lvbnNOZXN0ZWRNZXNzYWdlKHNlbGYpOgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgZXh0MSA9IHByb3RvMS5FeHRlbnNpb25zWworICAgICAgICB1bml0dGVzdF9wYjIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXQorICAgIG0gPSBleHQxLmFkZCgpCisgICAgbS5iYiA9IDIyMgorICAgIG0gPSBleHQxLmFkZCgpCisgICAgbS5iYiA9IDMzMworCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBleHQyID0gcHJvdG8yLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dCisgICAgbSA9IGV4dDIuYWRkKCkKKyAgICBtLmJiID0gMTExCisKKyAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKKyAgICBleHQyID0gcHJvdG8yLkV4dGVuc2lvbnNbCisgICAgICAgIHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4oZXh0MikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMTEsIGV4dDJbMF0uYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyMjIsIGV4dDJbMV0uYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzMzMsIGV4dDJbMl0uYmIpCisKKyAgZGVmIHRlc3RNZXJnZUZyb21CdWcoc2VsZik6CisgICAgbWVzc2FnZTEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgIyBDYXVzZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB0byBiZSBpbnN0YW50aWF0ZWQgd2l0aGluIG1lc3NhZ2UxLCBldmVuCisgICAgIyB0aG91Z2ggaXQgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgInByZXNlbnQiLgorICAgIG1lc3NhZ2UxLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCisgICAgc2VsZi5hc3NlcnRGYWxzZShtZXNzYWdlMS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgICMgTWVyZ2UgaW50byBtZXNzYWdlMi4gIFRoaXMgc2hvdWxkIG5vdCBpbnN0YW50aWF0ZSB0aGUgZmllbGQgaXMgbWVzc2FnZTIuCisgICAgbWVzc2FnZTIuTWVyZ2VGcm9tKG1lc3NhZ2UxKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UobWVzc2FnZTIuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgZGVmIHRlc3RDb3B5RnJvbVNpbmd1bGFyRmllbGQoc2VsZik6CisgICAgIyBUZXN0IGNvcHkgd2l0aCBqdXN0IGEgc2luZ3VsYXIgZmllbGQuCisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8xLm9wdGlvbmFsX2ludDMyID0gMQorICAgIHByb3RvMS5vcHRpb25hbF9zdHJpbmcgPSAnaW1wb3J0YW50LXRleHQnCisKKyAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzIub3B0aW9uYWxfc3RyaW5nID0gJ3ZhbHVlJworCisgICAgcHJvdG8yLkNvcHlGcm9tKHByb3RvMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMi5vcHRpb25hbF9pbnQzMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdpbXBvcnRhbnQtdGV4dCcsIHByb3RvMi5vcHRpb25hbF9zdHJpbmcpCisKKyAgZGVmIHRlc3RDb3B5RnJvbVJlcGVhdGVkRmllbGQoc2VsZik6CisgICAgIyBUZXN0IGNvcHkgd2l0aCBhIHJlcGVhdGVkIGZpZWxkLgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKKyAgICBwcm90bzEucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDIpCisKKyAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzIucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDApCisgICAgcHJvdG8yLkNvcHlGcm9tKHByb3RvMSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLnJlcGVhdGVkX2ludDMyWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8yLnJlcGVhdGVkX2ludDMyWzFdKQorCisgIGRlZiB0ZXN0Q29weUZyb21BbGxGaWVsZHMoc2VsZik6CisgICAgIyBXaXRoIGFsbCBmaWVsZHMgc2V0LgorICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMocHJvdG8xKQorICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvMi5Db3B5RnJvbShwcm90bzEpCisKKyAgICAjIE1lc3NhZ2VzIHNob3VsZCBiZSBlcXVhbC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvMiwgcHJvdG8xKQorCisgICAgIyBTZXJpYWxpemVkIHN0cmluZyBzaG91bGQgYmUgZXF1YWwgdG9vLgorICAgIHN0cmluZzEgPSBwcm90bzEuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHN0cmluZzIgPSBwcm90bzIuU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nMSwgc3RyaW5nMikKKworICBkZWYgdGVzdENvcHlGcm9tU2VsZihzZWxmKToKKyAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90bzEucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgcHJvdG8xLm9wdGlvbmFsX2ludDMyID0gMgorICAgIHByb3RvMS5vcHRpb25hbF9zdHJpbmcgPSAnaW1wb3J0YW50LXRleHQnCisKKyAgICBwcm90bzEuQ29weUZyb20ocHJvdG8xKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8xLnJlcGVhdGVkX2ludDMyWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8xLm9wdGlvbmFsX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ltcG9ydGFudC10ZXh0JywgcHJvdG8xLm9wdGlvbmFsX3N0cmluZykKKworICBkZWYgdGVzdENvcHlGcm9tQmFkVHlwZShzZWxmKToKKyAgICAjIFRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24gaW4gdGhpcworICAgICMgY2FzZS4gSW4gdGhlb3J5IGl0IHNob3VsZC4KKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nOgorICAgICAgcmV0dXJuCisgICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvMS5Db3B5RnJvbSwgcHJvdG8yKQorCisgIGRlZiB0ZXN0Q2xlYXIoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHByb3RvKQorICAgICMgQ2xlYXIgdGhlIG1lc3NhZ2UuCisgICAgcHJvdG8uQ2xlYXIoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHByb3RvLkJ5dGVTaXplKCksIDApCisgICAgZW1wdHlfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhwcm90bywgZW1wdHlfcHJvdG8pCisKKyAgICAjIFRlc3QgaWYgZXh0ZW5zaW9ucyB3aGljaCB3ZXJlIHNldCBhcmUgY2xlYXJlZC4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMocHJvdG8pCisgICAgIyBDbGVhciB0aGUgbWVzc2FnZS4KKyAgICBwcm90by5DbGVhcigpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMocHJvdG8uQnl0ZVNpemUoKSwgMCkKKyAgICBlbXB0eV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMocHJvdG8sIGVtcHR5X3Byb3RvKQorCisgIGRlZiBhc3NlcnRJbml0aWFsaXplZChzZWxmLCBwcm90byk6CisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLklzSW5pdGlhbGl6ZWQoKSkKKyAgICAjIE5laXRoZXIgbWV0aG9kIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24uCisgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHByb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCisKKyAgZGVmIGFzc2VydE5vdEluaXRpYWxpemVkKHNlbGYsIHByb3RvKToKKyAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvLklzSW5pdGlhbGl6ZWQoKSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhtZXNzYWdlLkVuY29kZUVycm9yLCBwcm90by5TZXJpYWxpemVUb1N0cmluZykKKyAgICAjICJQYXJ0aWFsIiBzZXJpYWxpemF0aW9uIGRvZXNuJ3QgY2FyZSBpZiBtZXNzYWdlIGlzIHVuaW5pdGlhbGl6ZWQuCisgICAgcHJvdG8uU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKCkKKworICBkZWYgdGVzdElzSW5pdGlhbGl6ZWQoc2VsZik6CisgICAgIyBUcml2aWFsIGNhc2VzIC0gYWxsIG9wdGlvbmFsIGZpZWxkcyBhbmQgZXh0ZW5zaW9ucy4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCisKKyAgICAjIFRoZSBjYXNlIG9mIHVuaW5pdGlhbGl6ZWQgcmVxdWlyZWQgZmllbGRzLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZCgpCisgICAgc2VsZi5hc3NlcnROb3RJbml0aWFsaXplZChwcm90bykKKyAgICBwcm90by5hID0gcHJvdG8uYiA9IHByb3RvLmMgPSAyCisgICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKKworICAgICMgVGhlIGNhc2Ugb2YgdW5pbml0aWFsaXplZCBzdWJtZXNzYWdlLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZEZvcmVpZ24oKQorICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCisgICAgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5hID0gMQorICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8pCisgICAgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5iID0gMAorICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYyA9IDAKKyAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQorCisgICAgIyBVbmluaXRpYWxpemVkIHJlcGVhdGVkIHN1Ym1lc3NhZ2UuCisgICAgbWVzc2FnZTEgPSBwcm90by5yZXBlYXRlZF9tZXNzYWdlLmFkZCgpCisgICAgc2VsZi5hc3NlcnROb3RJbml0aWFsaXplZChwcm90bykKKyAgICBtZXNzYWdlMS5hID0gbWVzc2FnZTEuYiA9IG1lc3NhZ2UxLmMgPSAwCisgICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKKworICAgICMgVW5pbml0aWFsaXplZCByZXBlYXRlZCBncm91cCBpbiBhbiBleHRlbnNpb24uCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIGV4dGVuc2lvbiA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQubXVsdGkKKyAgICBtZXNzYWdlMSA9IHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hZGQoKQorICAgIG1lc3NhZ2UyID0gcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmFkZCgpCisgICAgc2VsZi5hc3NlcnROb3RJbml0aWFsaXplZChwcm90bykKKyAgICBtZXNzYWdlMS5hID0gMQorICAgIG1lc3NhZ2UxLmIgPSAxCisgICAgbWVzc2FnZTEuYyA9IDEKKyAgICBzZWxmLmFzc2VydE5vdEluaXRpYWxpemVkKHByb3RvKQorICAgIG1lc3NhZ2UyLmEgPSAyCisgICAgbWVzc2FnZTIuYiA9IDIKKyAgICBtZXNzYWdlMi5jID0gMgorICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCisKKyAgICAjIFVuaW5pdGlhbGl6ZWQgbm9ucmVwZWF0ZWQgbWVzc2FnZSBpbiBhbiBleHRlbnNpb24uCisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIGV4dGVuc2lvbiA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuc2luZ2xlCisgICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmEgPSAxCisgICAgc2VsZi5hc3NlcnROb3RJbml0aWFsaXplZChwcm90bykKKyAgICBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYiA9IDIKKyAgICBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYyA9IDMKKyAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQorCisgICAgIyBUcnkgcGFzc2luZyBhbiBlcnJvcnMgbGlzdC4KKyAgICBlcnJvcnMgPSBbXQorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZCgpCisgICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5Jc0luaXRpYWxpemVkKGVycm9ycykpCisgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJvcnMsIFsnYScsICdiJywgJ2MnXSkKKworICBkZWYgdGVzdFN0cmluZ1VURjhFbmNvZGluZyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgIyBBc3NpZ25tZW50IG9mIGEgdW5pY29kZSBvYmplY3QgdG8gYSBmaWVsZCBvZiB0eXBlICdieXRlcycgaXMgbm90IGFsbG93ZWQuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIsIHByb3RvLCAnb3B0aW9uYWxfYnl0ZXMnLCB1J3VuaWNvZGUgb2JqZWN0JykKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBvZiBweXRob24ncyAndW5pY29kZScgdHlwZS4KKyAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocHJvdG8ub3B0aW9uYWxfc3RyaW5nKSwgdW5pY29kZSkKKworICAgIHByb3RvLm9wdGlvbmFsX3N0cmluZyA9IHVuaWNvZGUoJ1Rlc3RpbmcnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8ub3B0aW9uYWxfc3RyaW5nLCBzdHIoJ1Rlc3RpbmcnKSkKKworICAgICMgQXNzaWduIGEgdmFsdWUgb2YgdHlwZSAnc3RyJyB3aGljaCBjYW4gYmUgZW5jb2RlZCBpbiBVVEYtOC4KKyAgICBwcm90by5vcHRpb25hbF9zdHJpbmcgPSBzdHIoJ1Rlc3RpbmcnKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8ub3B0aW9uYWxfc3RyaW5nLCB1bmljb2RlKCdUZXN0aW5nJykpCisKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nOgorICAgICAgIyBWYWx1ZXMgb2YgdHlwZSAnc3RyJyBhcmUgYWxzbyBhY2NlcHRlZCBhcyBsb25nIGFzIHRoZXkgY2FuIGJlCisgICAgICAjIGVuY29kZWQgaW4gVVRGLTguCisgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocHJvdG8ub3B0aW9uYWxfc3RyaW5nKSwgc3RyKQorCisgICAgIyBUcnkgdG8gYXNzaWduIGEgJ3N0cicgdmFsdWUgd2hpY2ggY29udGFpbnMgYnl0ZXMgdGhhdCBhcmVuJ3QgNy1iaXQgQVNDSUkuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX3N0cmluZycsIHN0cignYVx4ODBhJykpCisgICAgIyBBc3NpZ24gYSAnc3RyJyBvYmplY3Qgd2hpY2ggY29udGFpbnMgYSBVVEYtOCBlbmNvZGVkIHN0cmluZy4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIsIHByb3RvLCAnb3B0aW9uYWxfc3RyaW5nJywgJ9Ci0LXRgdGCJykKKyAgICAjIE5vIGV4Y2VwdGlvbiB0aHJvd24uCisgICAgcHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gJ2FiYycKKworICBkZWYgdGVzdFN0cmluZ1VURjhTZXJpYWxpemF0aW9uKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXQoKQorICAgIGV4dGVuc2lvbl9tZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yCisgICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uX21lc3NhZ2UubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCisKKyAgICB0ZXN0X3V0ZjggPSB1J9Ci0LXRgdGCJworICAgIHRlc3RfdXRmOF9ieXRlcyA9IHRlc3RfdXRmOC5lbmNvZGUoJ3V0Zi04JykKKworICAgICMgJ1Rlc3QnIGluIGFub3RoZXIgbGFuZ3VhZ2UsIHVzaW5nIFVURi04IGNoYXJzZXQuCisgICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLnN0ciA9IHRlc3RfdXRmOAorCisgICAgIyBTZXJpYWxpemUgdXNpbmcgdGhlIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQgKHRoaXMgaXMgc3BlY2lmaWVkIGluIHRoZQorICAgICMgLnByb3RvIGZpbGUpLgorICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgICAjIENoZWNrIGJ5dGUgc2l6ZS4KKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKKworICAgIHJhdyA9IHVuaXR0ZXN0X21zZXRfcGIyLlJhd01lc3NhZ2VTZXQoKQorICAgIHJhdy5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKworICAgIG1lc3NhZ2UyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKCkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKHJhdy5pdGVtKSkKKyAgICAjIENoZWNrIHRoYXQgdGhlIHR5cGVfaWQgaXMgdGhlIHNhbWUgYXMgdGhlIHRhZyBJRCBpbiB0aGUgLnByb3RvIGZpbGUuCisgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuaXRlbVswXS50eXBlX2lkLCAxNTQ3NzY5KQorCisgICAgIyBDaGVjayB0aGUgYWN0dWFsIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgcmF3Lml0ZW1bMF0ubWVzc2FnZS5lbmRzd2l0aCh0ZXN0X3V0ZjhfYnl0ZXMpKQorICAgIG1lc3NhZ2UyLk1lcmdlRnJvbVN0cmluZyhyYXcuaXRlbVswXS5tZXNzYWdlKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKG1lc3NhZ2UyLnN0ciksIHVuaWNvZGUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlMi5zdHIsIHRlc3RfdXRmOCkKKworICAgICMgVGhlIHB1cmUgUHl0aG9uIEFQSSB0aHJvd3MgYW4gZXhjZXB0aW9uIG9uIE1lcmdlRnJvbVN0cmluZygpLAorICAgICMgaWYgYW55IG9mIHRoZSBzdHJpbmcgZmllbGRzIG9mIHRoZSBtZXNzYWdlIGNhbid0IGJlIFVURi04IGRlY29kZWQuCisgICAgIyBUaGUgQysrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkgaGFzIG5vIHdheSB0byBjaGVjayB0aGF0IG9uCisgICAgIyBNZXJnZUZyb21TdHJpbmcgYW5kIHRodXMgaGFzIG5vIHdheSB0byB0aHJvdyB0aGUgZXhjZXB0aW9uLgorICAgICMKKyAgICAjIFRoZSBwdXJlIFB5dGhvbiBBUEkgYWx3YXlzIHJldHVybnMgb2JqZWN0cyBvZiB0eXBlICd1bmljb2RlJyAoVVRGLTgKKyAgICAjIGVuY29kZWQpLCBvciAnc3RyJyAoaW4gNyBiaXQgQVNDSUkpLgorICAgIGJ5dGVzID0gcmF3Lml0ZW1bMF0ubWVzc2FnZS5yZXBsYWNlKAorICAgICAgICB0ZXN0X3V0ZjhfYnl0ZXMsIGxlbih0ZXN0X3V0ZjhfYnl0ZXMpICogJ1x4ZmYnKQorCisgICAgdW5pY29kZV9kZWNvZGVfZmFpbGVkID0gRmFsc2UKKyAgICB0cnk6CisgICAgICBtZXNzYWdlMi5NZXJnZUZyb21TdHJpbmcoYnl0ZXMpCisgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvciwgZToKKyAgICAgIHVuaWNvZGVfZGVjb2RlX2ZhaWxlZCA9IFRydWUKKyAgICBzdHJpbmdfZmllbGQgPSBtZXNzYWdlMi5zdHIKKyAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZV9kZWNvZGVfZmFpbGVkIG9yIHR5cGUoc3RyaW5nX2ZpZWxkKSA9PSBzdHIpCisKKyAgZGVmIHRlc3RFbXB0eU5lc3RlZE1lc3NhZ2Uoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5NZXJnZUZyb20oCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuQ29weUZyb20oCisgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuTWVyZ2VGcm9tU3RyaW5nKCcnKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKCcnKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKworICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90bzIuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisKKyAgZGVmIHRlc3RTZXRJblBhcmVudChzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsZ3JvdXAnKSkKKyAgICBwcm90by5vcHRpb25hbGdyb3VwLlNldEluUGFyZW50KCkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsZ3JvdXAnKSkKKworCisjICBTaW5jZSB3ZSBoYWQgc28gbWFueSB0ZXN0cyBmb3IgcHJvdG9jb2wgYnVmZmVyIGVxdWFsaXR5LCB3ZSBicm9rZSB0aGVzZSBvdXQKKyMgIGludG8gc2VwYXJhdGUgVGVzdENhc2UgY2xhc3Nlcy4KKworCitjbGFzcyBUZXN0QWxsVHlwZXNFcXVhbGl0eVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLmZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5zZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICBkZWYgdGVzdE5vdEhhc2hhYmxlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgc2VsZi5maXJzdF9wcm90bykKKworICBkZWYgdGVzdFNlbGZFcXVhbGl0eShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuZmlyc3RfcHJvdG8pCisKKyAgZGVmIHRlc3RFbXB0eVByb3Rvc0VxdWFsKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisKKworY2xhc3MgRnVsbFByb3Rvc0VxdWFsaXR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgIiIiRXF1YWxpdHkgdGVzdHMgdXNpbmcgY29tcGxldGVseS1mdWxsIHByb3RvcyBhcyBhIHN0YXJ0aW5nIHBvaW50LiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLmZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5zZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHNlbGYuZmlyc3RfcHJvdG8pCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vdEhhc2hhYmxlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgc2VsZi5maXJzdF9wcm90bykKKworICBkZWYgdGVzdE5vbmVOb3RFcXVhbChzZWxmKToKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIE5vbmUpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChOb25lLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vdEVxdWFsVG9PdGhlck1lc3NhZ2Uoc2VsZik6CisgICAgdGhpcmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKCkKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHRoaXJkX3Byb3RvKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodGhpcmRfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0QWxsRmllbGRzRmlsbGVkRXF1YWxpdHkoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vblJlcGVhdGVkU2NhbGFyKHNlbGYpOgorICAgICMgTm9ucmVwZWF0ZWQgc2NhbGFyIGZpZWxkIGNoYW5nZSBzaG91bGQgY2F1c2UgaW5lcXVhbGl0eS4KKyAgICBzZWxmLmZpcnN0X3Byb3RvLm9wdGlvbmFsX2ludDMyICs9IDEKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorICAgICMgLi4uYXMgc2hvdWxkIGNsZWFyaW5nIGEgZmllbGQuCisgICAgc2VsZi5maXJzdF9wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vblJlcGVhdGVkQ29tcG9zaXRlKHNlbGYpOgorICAgICMgQ2hhbmdlIGEgbm9ucmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgKz0gMQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisgICAgc2VsZi5maXJzdF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiAtPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICAjIENsZWFyIGEgZmllbGQgaW4gdGhlIG5lc3RlZCBtZXNzYWdlLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuQ2xlYXJGaWVsZCgnYmInKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisgICAgc2VsZi5maXJzdF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9ICgKKyAgICAgICAgc2VsZi5zZWNvbmRfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICAjIFJlbW92ZSB0aGUgbmVzdGVkIG1lc3NhZ2UgZW50aXJlbHkuCisgICAgc2VsZi5maXJzdF9wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyKHNlbGYpOgorICAgICMgQ2hhbmdlIGEgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICBzZWxmLmZpcnN0X3Byb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX2ludDMyJykKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGUoc2VsZik6CisgICAgIyBDaGFuZ2UgdmFsdWUgd2l0aGluIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIgKz0gMQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisgICAgc2VsZi5maXJzdF9wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYiAtPSAxCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICAjIEFkZCBhIHZhbHVlIHRvIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQorICAgIHNlbGYuc2Vjb25kX3Byb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKworICBkZWYgdGVzdE5vblJlcGVhdGVkU2NhbGFySGFzQml0cyhzZWxmKToKKyAgICAjIEVuc3VyZSB0aGF0IHdlIHRlc3QgImhhcyIgYml0cyBhcyB3ZWxsIGFzIHZhbHVlIGZvcgorICAgICMgbm9ucmVwZWF0ZWQgc2NhbGFyIGZpZWxkLgorICAgIHNlbGYuZmlyc3RfcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQorICAgIHNlbGYuc2Vjb25kX3Byb3RvLm9wdGlvbmFsX2ludDMyID0gMAorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisKKyAgZGVmIHRlc3ROb25SZXBlYXRlZENvbXBvc2l0ZUhhc0JpdHMoc2VsZik6CisgICAgIyBFbnN1cmUgdGhhdCB3ZSB0ZXN0ICJoYXMiIGJpdHMgYXMgd2VsbCBhcyB2YWx1ZSBmb3IKKyAgICAjIG5vbnJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4KKyAgICBzZWxmLmZpcnN0X3Byb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKKyAgICBzZWxmLnNlY29uZF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5DbGVhckZpZWxkKCdiYicpCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKKyAgICBzZWxmLmZpcnN0X3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMAorICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuQ2xlYXJGaWVsZCgnYmInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCisKKworY2xhc3MgRXh0ZW5zaW9uRXF1YWxpdHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdEV4dGVuc2lvbkVxdWFsaXR5KHNlbGYpOgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhmaXJzdF9wcm90bykKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisgICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMoc2Vjb25kX3Byb3RvKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICAgICMgRW5zdXJlIHRoYXQgd2UgY2hlY2sgdmFsdWUgZXF1YWxpdHkuCisgICAgZmlyc3RfcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSArPSAxCisgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorICAgIGZpcnN0X3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0gLT0gMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICAgICMgRW5zdXJlIHRoYXQgd2UgYWxzbyBsb29rIGF0ICJoYXMiIGJpdHMuCisgICAgZmlyc3RfcHJvdG8uQ2xlYXJFeHRlbnNpb24odW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikKKyAgICBzZWNvbmRfcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSA9IDAKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisgICAgZmlyc3RfcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSA9IDAKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisKKyAgICAjIEVuc3VyZSB0aGF0IGRpZmZlcmVuY2VzIGluIGNhY2hlZCB2YWx1ZXMKKyAgICAjIGRvbid0IG1hdHRlciBpZiAiaGFzIiBiaXRzIGFyZSBib3RoIGZhbHNlLgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIDAsIGZpcnN0X3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorCisKK2NsYXNzIE11dHVhbFJlY3Vyc2lvbkVxdWFsaXR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RFcXVhbGl0eVdpdGhNdXR1YWxSZWN1cnNpb24oc2VsZik6CisgICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdE11dHVhbFJlY3Vyc2lvbkEoKQorICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0TXV0dWFsUmVjdXJzaW9uQSgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorICAgIGZpcnN0X3Byb3RvLmJiLmEuYmIub3B0aW9uYWxfaW50MzIgPSAyMworICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKyAgICBzZWNvbmRfcHJvdG8uYmIuYS5iYi5vcHRpb25hbF9pbnQzMiA9IDIzCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorCisKK2NsYXNzIEJ5dGVTaXplVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYucHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBzZWxmLmV4dGVuZGVkX3Byb3RvID0gbW9yZV9leHRlbnNpb25zX3BiMi5FeHRlbmRlZE1lc3NhZ2UoKQorICAgIHNlbGYucGFja2VkX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgc2VsZi5wYWNrZWRfZXh0ZW5kZWRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQorCisgIGRlZiBTaXplKHNlbGYpOgorICAgIHJldHVybiBzZWxmLnByb3RvLkJ5dGVTaXplKCkKKworICBkZWYgdGVzdEVtcHR5TWVzc2FnZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdFNpemVkT25Ld2FyZ3Moc2VsZik6CisgICAgIyBVc2UgYSBzZXBhcmF0ZSBtZXNzYWdlIHRvIGVuc3VyZSB0ZXN0aW5nIHJpZ2h0IGFmdGVyIGNyZWF0aW9uLgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5CeXRlU2l6ZSgpKQorICAgIHByb3RvX2t3YXJncyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMob3B0aW9uYWxfaW50NjQgPSAxKQorICAgICMgT25lIGJ5dGUgZm9yIHRoZSB0YWcsIG9uZSB0byBlbmNvZGUgdmFyaW50IDEuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90b19rd2FyZ3MuQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdFZhcmludHMoc2VsZik6CisgICAgZGVmIFRlc3QoaSwgZXhwZWN0ZWRfdmFyaW50X3NpemUpOgorICAgICAgc2VsZi5wcm90by5DbGVhcigpCisgICAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ludDY0ID0gaQorICAgICAgIyBBZGQgb25lIHRvIHRoZSB2YXJpbnQgc2l6ZSBmb3IgdGhlIHRhZyBpbmZvCisgICAgICAjIGZvciB0YWcgMS4KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFyaW50X3NpemUgKyAxLCBzZWxmLlNpemUoKSkKKyAgICBUZXN0KDAsIDEpCisgICAgVGVzdCgxLCAxKQorICAgIGZvciBpLCBudW1fYnl0ZXMgaW4gemlwKHJhbmdlKDcsIDYzLCA3KSwgcmFuZ2UoMSwgMTAwMDApKToKKyAgICAgIFRlc3QoKDEgPDwgaSkgLSAxLCBudW1fYnl0ZXMpCisgICAgVGVzdCgtMSwgMTApCisgICAgVGVzdCgtMiwgMTApCisgICAgVGVzdCgtKDEgPDwgNjMpLCAxMCkKKworICBkZWYgdGVzdFN0cmluZ3Moc2VsZik6CisgICAgc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcgPSAnJworICAgICMgTmVlZCBvbmUgYnl0ZSBmb3IgdGFnIGluZm8gKHRhZyAjMTQpLCBhbmQgb25lIGJ5dGUgZm9yIGxlbmd0aC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYuU2l6ZSgpKQorCisgICAgc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcgPSAnYWJjJworICAgICMgTmVlZCBvbmUgYnl0ZSBmb3IgdGFnIGluZm8gKHRhZyAjMTQpLCBhbmQgb25lIGJ5dGUgZm9yIGxlbmd0aC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyBsZW4oc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcpLCBzZWxmLlNpemUoKSkKKworICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gJ3gnICogMTI4CisgICAgIyBOZWVkIG9uZSBieXRlIGZvciB0YWcgaW5mbyAodGFnICMxNCksIGFuZCBUV08gYnl0ZXMgZm9yIGxlbmd0aC4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDMgKyBsZW4oc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcpLCBzZWxmLlNpemUoKSkKKworICBkZWYgdGVzdE90aGVyTnVtZXJpY3Moc2VsZik6CisgICAgc2VsZi5wcm90by5vcHRpb25hbF9maXhlZDMyID0gMTIzNAorICAgICMgT25lIGJ5dGUgZm9yIHRhZyBhbmQgNCBieXRlcyBmb3IgZml4ZWQzMi4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHNlbGYuU2l6ZSgpKQorICAgIHNlbGYucHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKworICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfZml4ZWQ2NCA9IDEyMzQKKyAgICAjIE9uZSBieXRlIGZvciB0YWcgYW5kIDggYnl0ZXMgZm9yIGZpeGVkNjQuCisgICAgc2VsZi5hc3NlcnRFcXVhbCg5LCBzZWxmLlNpemUoKSkKKyAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2Zsb2F0ID0gMS4yMzQKKyAgICAjIE9uZSBieXRlIGZvciB0YWcgYW5kIDQgYnl0ZXMgZm9yIGZsb2F0LgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgc2VsZi5TaXplKCkpCisgICAgc2VsZi5wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgc2VsZi5wcm90by5vcHRpb25hbF9kb3VibGUgPSAxLjIzNAorICAgICMgT25lIGJ5dGUgZm9yIHRhZyBhbmQgOCBieXRlcyBmb3IgZmxvYXQuCisgICAgc2VsZi5hc3NlcnRFcXVhbCg5LCBzZWxmLlNpemUoKSkKKyAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX3NpbnQzMiA9IDY0CisgICAgIyBPbmUgYnl0ZSBmb3IgdGFnIGFuZCAyIGJ5dGVzIGZvciB6aWctemFnLWVuY29kZWQgNjQuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLlNpemUoKSkKKyAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisKKyAgZGVmIHRlc3RDb21wb3NpdGVzKHNlbGYpOgorICAgICMgMyBieXRlcy4KKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gKDEgPDwgMTQpCisgICAgIyBQbHVzIG9uZSBieXRlIGZvciBiYiB0YWcuCisgICAgIyBQbHVzIDEgYnl0ZSBmb3Igb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Ugc2VyaWFsaXplZCBzaXplLgorICAgICMgUGx1cyB0d28gYnl0ZXMgZm9yIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHRhZy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDMgKyAxICsgMSArIDIsIHNlbGYuU2l6ZSgpKQorCisgIGRlZiB0ZXN0R3JvdXBzKHNlbGYpOgorICAgICMgNCBieXRlcy4KKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsZ3JvdXAuYSA9ICgxIDw8IDIxKQorICAgICMgUGx1cyB0d28gYnl0ZXMgZm9yIHxhfCB0YWcuCisgICAgIyBQbHVzIDIgKiB0d28gYnl0ZXMgZm9yIFNUQVJUX0dST1VQIGFuZCBFTkRfR1JPVVAgdGFncy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDQgKyAyICsgMioyLCBzZWxmLlNpemUoKSkKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFycyhzZWxmKToKKyAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkgICMgMSBieXRlLgorICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEyOCkgICMgMiBieXRlcy4KKyAgICAjIEFsc28gbmVlZCAyIGJ5dGVzIGZvciBlYWNoIGVudHJ5IGZvciB0YWcuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxICsgMiArIDIqMiwgc2VsZi5TaXplKCkpCisKKyAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhcnNFeHRlbmQoc2VsZik6CisgICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5leHRlbmQoWzEwLCAxMjhdKSAgIyAzIGJ5dGVzLgorICAgICMgQWxzbyBuZWVkIDIgYnl0ZXMgZm9yIGVhY2ggZW50cnkgZm9yIHRhZy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDEgKyAyICsgMioyLCBzZWxmLlNpemUoKSkKKworICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyc1JlbW92ZShzZWxmKToKKyAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkgICMgMSBieXRlLgorICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEyOCkgICMgMiBieXRlcy4KKyAgICAjIEFsc28gbmVlZCAyIGJ5dGVzIGZvciBlYWNoIGVudHJ5IGZvciB0YWcuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxICsgMiArIDIqMiwgc2VsZi5TaXplKCkpCisgICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUoMTI4KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSArIDIsIHNlbGYuU2l6ZSgpKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVzKHNlbGYpOgorICAgICMgRW1wdHkgbWVzc2FnZS4gIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aC4KKyAgICBmb3JlaWduX21lc3NhZ2VfMCA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICAjIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aCBwbHVzIDEgYnl0ZSBiYiB0YWcgMSBieXRlIGludC4KKyAgICBmb3JlaWduX21lc3NhZ2VfMSA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKKyAgICBmb3JlaWduX21lc3NhZ2VfMS5iYiA9IDcKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAxICsgMiArIDEgKyAxICsgMSwgc2VsZi5TaXplKCkpCisKKyAgZGVmIHRlc3RSZXBlYXRlZENvbXBvc2l0ZXNEZWxldGUoc2VsZik6CisgICAgIyBFbXB0eSBtZXNzYWdlLiAgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoLgorICAgIGZvcmVpZ25fbWVzc2FnZV8wID0gc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgorICAgIGZvcmVpZ25fbWVzc2FnZV8xID0gc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIGZvcmVpZ25fbWVzc2FnZV8xLmJiID0gOQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDEgKyAyICsgMSArIDEgKyAxLCBzZWxmLlNpemUoKSkKKworICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgorICAgIGRlbCBzZWxmLnByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgMSArIDEgKyAxLCBzZWxmLlNpemUoKSkKKworICAgICMgTm93IGFkZCBhIG5ldyBtZXNzYWdlLgorICAgIGZvcmVpZ25fbWVzc2FnZV8yID0gc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIGZvcmVpZ25fbWVzc2FnZV8yLmJiID0gMTIKKworICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgorICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDEgKyAxICsgMSArIDIgKyAxICsgMSArIDEsIHNlbGYuU2l6ZSgpKQorCisgICAgIyAyIGJ5dGVzIHRhZyBwbHVzIDEgYnl0ZSBsZW5ndGggcGx1cyAxIGJ5dGUgYmIgdGFnIDEgYnl0ZSBpbnQuCisgICAgZGVsIHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0KKyAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAxICsgMSArIDEsIHNlbGYuU2l6ZSgpKQorCisgICAgZGVsIHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuU2l6ZSgpKQorCisgIGRlZiB0ZXN0UmVwZWF0ZWRHcm91cHMoc2VsZik6CisgICAgIyAyLWJ5dGUgU1RBUlRfR1JPVVAgcGx1cyAyLWJ5dGUgRU5EX0dST1VQLgorICAgIGdyb3VwXzAgPSBzZWxmLnByb3RvLnJlcGVhdGVkZ3JvdXAuYWRkKCkKKyAgICAjIDItYnl0ZSBTVEFSVF9HUk9VUCBwbHVzIDItYnl0ZSB8YXwgdGFnICsgMS1ieXRlIHxhfAorICAgICMgcGx1cyAyLWJ5dGUgRU5EX0dST1VQLgorICAgIGdyb3VwXzEgPSBzZWxmLnByb3RvLnJlcGVhdGVkZ3JvdXAuYWRkKCkKKyAgICBncm91cF8xLmEgPSAgNworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDIgKyAyICsgMiArIDEgKyAyLCBzZWxmLlNpemUoKSkKKworICBkZWYgdGVzdEV4dGVuc2lvbnMoc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAjIEZpZWxkICMxLCAxIGJ5dGUuCisgICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dID0gMjMKKyAgICAjIDEgYnl0ZSBmb3IgdGFnLCAxIGJ5dGUgZm9yIHZhbHVlLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8uQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdENhY2hlSW52YWxpZGF0aW9uRm9yTm9ucmVwZWF0ZWRTY2FsYXIoc2VsZik6CisgICAgIyBUZXN0IG5vbi1leHRlbnNpb24uCisgICAgc2VsZi5wcm90by5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ludDMyID0gMTI4CisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisKKyAgICAjIFRlc3Qgd2l0aGluIGV4dGVuc2lvbi4KKyAgICBleHRlbnNpb24gPSBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX2ludF9leHRlbnNpb24KKyAgICBzZWxmLmV4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLmV4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9IDEyOAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorCisgIGRlZiB0ZXN0Q2FjaGVJbnZhbGlkYXRpb25Gb3JSZXBlYXRlZFNjYWxhcihzZWxmKToKKyAgICAjIFRlc3Qgbm9uLWV4dGVuc2lvbi4KKyAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMlsxXSA9IDEyOAorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYucHJvdG8uQ2xlYXJGaWVsZCgncmVwZWF0ZWRfaW50MzInKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorCisgICAgIyBUZXN0IHdpdGhpbiBleHRlbnNpb24uCisgICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9pbnRfZXh0ZW5zaW9uCisgICAgcmVwZWF0ZWQgPSBzZWxmLmV4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQorICAgIHJlcGVhdGVkLmFwcGVuZCgxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIHJlcGVhdGVkLmFwcGVuZCgxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIHJlcGVhdGVkWzFdID0gMTI4CisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5leHRlbmRlZF9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisKKyAgZGVmIHRlc3RDYWNoZUludmFsaWRhdGlvbkZvck5vbnJlcGVhdGVkTWVzc2FnZShzZWxmKToKKyAgICAjIFRlc3Qgbm9uLWV4dGVuc2lvbi4KKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jID0gMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMgPSAxMjgKKyAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5DbGVhckZpZWxkKCdjJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLnByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisKKyAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nOgorICAgICAgIyBUaGlzIGlzIG9ubHkgcG9zc2libGUgaW4gcHVyZS1QeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSS4KKyAgICAgIGNoaWxkID0gc2VsZi5wcm90by5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UKKyAgICAgIHNlbGYucHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlJykKKyAgICAgIGNoaWxkLmMgPSAxMjgKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQorCisgICAgIyBUZXN0IHdpdGhpbiBleHRlbnNpb24uCisgICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbgorICAgIGNoaWxkID0gc2VsZi5leHRlbmRlZF9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBjaGlsZC5mb3JlaWduX21lc3NhZ2VfaW50ID0gMQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIGNoaWxkLmZvcmVpZ25fbWVzc2FnZV9pbnQgPSAxMjgKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLmV4dGVuZGVkX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKworICBkZWYgdGVzdENhY2hlSW52YWxpZGF0aW9uRm9yUmVwZWF0ZWRNZXNzYWdlKHNlbGYpOgorICAgICMgVGVzdCBub24tZXh0ZW5zaW9uLgorICAgIGNoaWxkMCA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlLmFkZCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5wcm90by5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UuYWRkKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBjaGlsZDAuYyA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDgsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKKyAgICBzZWxmLnByb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZScpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCisKKyAgICAjIFRlc3Qgd2l0aGluIGV4dGVuc2lvbi4KKyAgICBleHRlbnNpb24gPSBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uCisgICAgY2hpbGRfbGlzdCA9IHNlbGYuZXh0ZW5kZWRfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCisgICAgY2hpbGQwID0gY2hpbGRfbGlzdC5hZGQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorICAgIGNoaWxkX2xpc3QuYWRkKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBjaGlsZDAuZm9yZWlnbl9tZXNzYWdlX2ludCA9IDEKKyAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKKyAgICBjaGlsZDAuQ2xlYXJGaWVsZCgnZm9yZWlnbl9tZXNzYWdlX2ludCcpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisgICAgc2VsZi5leHRlbmRlZF9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisKKyAgZGVmIHRlc3RQYWNrZWRSZXBlYXRlZFNjYWxhcnMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnBhY2tlZF9wcm90by5CeXRlU2l6ZSgpKQorCisgICAgc2VsZi5wYWNrZWRfcHJvdG8ucGFja2VkX2ludDMyLmFwcGVuZCgxMCkgICAjIDEgYnl0ZS4KKyAgICBzZWxmLnBhY2tlZF9wcm90by5wYWNrZWRfaW50MzIuYXBwZW5kKDEyOCkgICMgMiBieXRlcy4KKyAgICAjIFRoZSB0YWcgaXMgMiBieXRlcyAodGhlIGZpZWxkIG51bWJlciBpcyA5MCksIGFuZCB0aGUgdmFyaW50CisgICAgIyBzdG9yaW5nIHRoZSBsZW5ndGggaXMgMSBieXRlLgorICAgIGludF9zaXplID0gMSArIDIgKyAzCisgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRfc2l6ZSwgc2VsZi5wYWNrZWRfcHJvdG8uQnl0ZVNpemUoKSkKKworICAgIHNlbGYucGFja2VkX3Byb3RvLnBhY2tlZF9kb3VibGUuYXBwZW5kKDQuMikgICAjIDggYnl0ZXMKKyAgICBzZWxmLnBhY2tlZF9wcm90by5wYWNrZWRfZG91YmxlLmFwcGVuZCgzLjI1KSAgIyA4IGJ5dGVzCisgICAgIyAyIG1vcmUgdGFnIGJ5dGVzLCAxIG1vcmUgbGVuZ3RoIGJ5dGUuCisgICAgZG91YmxlX3NpemUgPSA4ICsgOCArIDMKKyAgICBzZWxmLmFzc2VydEVxdWFsKGludF9zaXplK2RvdWJsZV9zaXplLCBzZWxmLnBhY2tlZF9wcm90by5CeXRlU2l6ZSgpKQorCisgICAgc2VsZi5wYWNrZWRfcHJvdG8uQ2xlYXJGaWVsZCgncGFja2VkX2ludDMyJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKGRvdWJsZV9zaXplLCBzZWxmLnBhY2tlZF9wcm90by5CeXRlU2l6ZSgpKQorCisgIGRlZiB0ZXN0UGFja2VkRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYucGFja2VkX2V4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCisgICAgZXh0ZW5zaW9uID0gc2VsZi5wYWNrZWRfZXh0ZW5kZWRfcHJvdG8uRXh0ZW5zaW9uc1sKKyAgICAgICAgdW5pdHRlc3RfcGIyLnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl0KKyAgICBleHRlbnNpb24uZXh0ZW5kKFsxLCAyLCAzLCA0XSkgICAjIDE2IGJ5dGVzCisgICAgIyBUYWcgaXMgMyBieXRlcy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKDE5LCBzZWxmLnBhY2tlZF9leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQorCisKKyMgSXNzdWVzIHRvIGJlIHN1cmUgdG8gY292ZXIgaW5jbHVkZToKKyMgICAqIEhhbmRsaW5nIG9mIHVucmVjb2duaXplZCB0YWdzICgidW5pbnRlcnByZXRlZF9ieXRlcyIpLgorIyAgICogSGFuZGxpbmcgb2YgTWVzc2FnZVNldHMuCisjICAgKiBDb25zaXN0ZW50IG9yZGVyaW5nIG9mIHRhZ3MgaW4gdGhlIHdpcmUgZm9ybWF0LAorIyAgICAgaW5jbHVkaW5nIG9yZGVyaW5nIGJldHdlZW4gZXh0ZW5zaW9ucyBhbmQgbm9uLWV4dGVuc2lvbgorIyAgICAgZmllbGRzLgorIyAgICogQ29uc2lzdGVudCBzZXJpYWxpemF0aW9uIG9mIG5lZ2F0aXZlIG51bWJlcnMsIGVzcGVjaWFsbHkKKyMgICAgIG5lZ2F0aXZlIGludDMycy4KKyMgICAqIEhhbmRsaW5nIG9mIGVtcHR5IHN1Ym1lc3NhZ2VzICh3aXRoIGFuZCB3aXRob3V0ICJoYXMiCisjICAgICBiaXRzIHNldCkuCisKK2NsYXNzIFNlcmlhbGl6YXRpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdFNlcmlhbGl6ZUVtdHB5TWVzc2FnZShzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCisgICAgc2Vjb25kX3Byb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICBkZWYgdGVzdFNlcmlhbGl6ZUFsbEZpZWxkcyhzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMoZmlyc3RfcHJvdG8pCisgICAgc2VyaWFsaXplZCA9IGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKKyAgICBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0U2VyaWFsaXplQWxsRXh0ZW5zaW9ucyhzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhmaXJzdF9wcm90bykKKyAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCisKKyAgZGVmIHRlc3RTZXJpYWxpemVOZWdhdGl2ZVZhbHVlcyhzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorCisgICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfaW50MzIgPSAtMQorICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX2ludDY0ID0gLSgyIDw8IDQwKQorICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX3NpbnQzMiA9IC0zCisgICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfc2ludDY0ID0gLSg0IDw8IDQwKQorICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX3NmaXhlZDMyID0gLTUKKyAgICBmaXJzdF9wcm90by5vcHRpb25hbF9zZml4ZWQ2NCA9IC0oNiA8PCA0MCkKKworICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRnJvbVN0cmluZygKKyAgICAgICAgZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICBkZWYgdGVzdFBhcnNlVHJ1bmNhdGVkKHNlbGYpOgorICAgICMgVGhpcyB0ZXN0IGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJLgorICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ3B5dGhvbic6CisgICAgICByZXR1cm4KKworICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhmaXJzdF9wcm90bykKKyAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgZm9yIHRydW5jYXRpb25fcG9pbnQgaW4geHJhbmdlKGxlbihzZXJpYWxpemVkKSArIDEpOgorICAgICAgdHJ5OgorICAgICAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICAgICAgdW5rbm93bl9maWVsZHMgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCisgICAgICAgIHBvcyA9IHNlY29uZF9wcm90by5fSW50ZXJuYWxQYXJzZShzZXJpYWxpemVkLCAwLCB0cnVuY2F0aW9uX3BvaW50KQorICAgICAgICAjIElmIHdlIGRpZG4ndCByYWlzZSBhbiBlcnJvciB0aGVuIHdlIHJlYWQgZXhhY3RseSB0aGUgYW1vdW50IGV4cGVjdGVkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRydW5jYXRpb25fcG9pbnQsIHBvcykKKworICAgICAgICAjIFBhcnNpbmcgdG8gdW5rbm93biBmaWVsZHMgc2hvdWxkIG5vdCB0aHJvdyBpZiBwYXJzaW5nIHRvIGtub3duIGZpZWxkcworICAgICAgICAjIGRpZCBub3QuCisgICAgICAgIHRyeToKKyAgICAgICAgICBwb3MyID0gdW5rbm93bl9maWVsZHMuX0ludGVybmFsUGFyc2Uoc2VyaWFsaXplZCwgMCwgdHJ1bmNhdGlvbl9wb2ludCkKKyAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRydW5jYXRpb25fcG9pbnQsIHBvczIpCisgICAgICAgIGV4Y2VwdCBtZXNzYWdlLkRlY29kZUVycm9yOgorICAgICAgICAgIHNlbGYuZmFpbCgnUGFyc2luZyB1bmtub3duIGZpZWxkcyBmYWlsZWQgd2hlbiBwYXJzaW5nIGtub3duIGZpZWxkcyAnCisgICAgICAgICAgICAgICAgICAgICdkaWQgbm90LicpCisgICAgICBleGNlcHQgbWVzc2FnZS5EZWNvZGVFcnJvcjoKKyAgICAgICAgIyBQYXJzaW5nIHVua25vd24gZmllbGRzIHNob3VsZCBhbHNvIGZhaWwuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1lc3NhZ2UuRGVjb2RlRXJyb3IsIHVua25vd25fZmllbGRzLl9JbnRlcm5hbFBhcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkLCAwLCB0cnVuY2F0aW9uX3BvaW50KQorCisgIGRlZiB0ZXN0Q2Fub25pY2FsU2VyaWFsaXphdGlvbk9yZGVyKHNlbGYpOgorICAgIHByb3RvID0gbW9yZV9tZXNzYWdlc19wYjIuT3V0T2ZPcmRlckZpZWxkcygpCisgICAgIyBUaGVzZSBhcmUgYWxzbyB0aGVpciB0YWcgbnVtYmVycy4gIEV2ZW4gdGhvdWdoIHdlJ3JlIHNldHRpbmcgdGhlc2UgaW4KKyAgICAjIHJldmVyc2UtdGFnIG9yZGVyIEFORCB0aGV5J3JlIGxpc3RlZCBpbiByZXZlcnNlIHRhZy1vcmRlciBpbiB0aGUgLnByb3RvCisgICAgIyBmaWxlLCB0aGV5IHNob3VsZCBub25ldGhlbGVzcyBiZSBzZXJpYWxpemVkIGluIHRhZyBvcmRlci4KKyAgICBwcm90by5vcHRpb25hbF9zaW50MzIgPSA1CisgICAgcHJvdG8uRXh0ZW5zaW9uc1ttb3JlX21lc3NhZ2VzX3BiMi5vcHRpb25hbF91aW50NjRdID0gNAorICAgIHByb3RvLm9wdGlvbmFsX3VpbnQzMiA9IDMKKyAgICBwcm90by5FeHRlbnNpb25zW21vcmVfbWVzc2FnZXNfcGIyLm9wdGlvbmFsX2ludDY0XSA9IDIKKyAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDEKKyAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQorICAgIGQgPSBfTWluaURlY29kZXIoc2VyaWFsaXplZCkKKyAgICBSZWFkVGFnID0gZC5SZWFkRmllbGROdW1iZXJBbmRXaXJlVHlwZQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCksIFJlYWRUYWcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoMiwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSwgUmVhZFRhZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgZC5SZWFkSW50NjQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCgzLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBkLlJlYWRVSW50MzIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCg0LCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBkLlJlYWRVSW50NjQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCg1LCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBkLlJlYWRTSW50MzIoKSkKKworICBkZWYgdGVzdENhbm9uaWNhbFNlcmlhbGl6YXRpb25PcmRlclNhbWVBc0NwcChzZWxmKToKKyAgICAjIENvcHkgb2YgdGhlIHNhbWUgdGVzdCB3ZSB1c2UgZm9yIEMrKy4KKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0RmllbGRPcmRlcmluZ3MoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKHByb3RvKQorICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgdGVzdF91dGlsLkV4cGVjdEFsbEZpZWxkc0FuZEV4dGVuc2lvbnNJbk9yZGVyKHNlcmlhbGl6ZWQpCisKKyAgZGVmIHRlc3RNZXJnZUZyb21TdHJpbmdXaGVuRmllbGRzQWxyZWFkeVNldChzZWxmKToKKyAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIGZpcnN0X3Byb3RvLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2Zvb2JhcicpCisgICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfaW50MzIgPSAyMworICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gNDIKKyAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2Vjb25kX3Byb3RvLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2JheicpCisgICAgc2Vjb25kX3Byb3RvLm9wdGlvbmFsX2ludDMyID0gMTAwCisgICAgc2Vjb25kX3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gOTk5CisKKyAgICBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgIyBFbnN1cmUgdGhhdCB3ZSBhcHBlbmQgdG8gcmVwZWF0ZWQgZmllbGRzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydiYXonLCAnZm9vYmFyJ10sIGxpc3Qoc2Vjb25kX3Byb3RvLnJlcGVhdGVkX3N0cmluZykpCisgICAgIyBFbnN1cmUgdGhhdCB3ZSBvdmVyd3JpdGUgbm9ucmVwZWF0ZCBzY2FsYXJzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIHNlY29uZF9wcm90by5vcHRpb25hbF9pbnQzMikKKyAgICAjIEVuc3VyZSB0aGF0IHdlIHJlY3Vyc2l2ZWx5IGNhbGwgTWVyZ2VGcm9tU3RyaW5nKCkgb24KKyAgICAjIHN1Ym1lc3NhZ2VzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIHNlY29uZF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKKworICBkZWYgdGVzdE1lc3NhZ2VTZXRXaXJlRm9ybWF0KHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXQoKQorICAgIGV4dGVuc2lvbl9tZXNzYWdlMSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMQorICAgIGV4dGVuc2lvbl9tZXNzYWdlMiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMgorICAgIGV4dGVuc2lvbjEgPSBleHRlbnNpb25fbWVzc2FnZTEubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCisgICAgZXh0ZW5zaW9uMiA9IGV4dGVuc2lvbl9tZXNzYWdlMi5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbjFdLmkgPSAxMjMKKyAgICBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbjJdLnN0ciA9ICdmb28nCisKKyAgICAjIFNlcmlhbGl6ZSB1c2luZyB0aGUgTWVzc2FnZVNldCB3aXJlIGZvcm1hdCAodGhpcyBpcyBzcGVjaWZpZWQgaW4gdGhlCisgICAgIyAucHJvdG8gZmlsZSkuCisgICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgIHJhdyA9IHVuaXR0ZXN0X21zZXRfcGIyLlJhd01lc3NhZ2VTZXQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICByYXcuREVTQ1JJUFRPUi5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpCisgICAgcmF3Lk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHJhdy5pdGVtKSkKKworICAgIG1lc3NhZ2UxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xKCkKKyAgICBtZXNzYWdlMS5NZXJnZUZyb21TdHJpbmcocmF3Lml0ZW1bMF0ubWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEyMywgbWVzc2FnZTEuaSkKKworICAgIG1lc3NhZ2UyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKCkKKyAgICBtZXNzYWdlMi5NZXJnZUZyb21TdHJpbmcocmF3Lml0ZW1bMV0ubWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28nLCBtZXNzYWdlMi5zdHIpCisKKyAgICAjIERlc2VyaWFsaXplIHVzaW5nIHRoZSBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0LgorICAgIHByb3RvMiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0KCkKKyAgICBwcm90bzIuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjMsIHByb3RvMi5FeHRlbnNpb25zW2V4dGVuc2lvbjFdLmkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnZm9vJywgcHJvdG8yLkV4dGVuc2lvbnNbZXh0ZW5zaW9uMl0uc3RyKQorCisgICAgIyBDaGVjayBieXRlIHNpemUuCisgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90bzIuQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQorCisgIGRlZiB0ZXN0TWVzc2FnZVNldFdpcmVGb3JtYXRVbmtub3duRXh0ZW5zaW9uKHNlbGYpOgorICAgICMgQ3JlYXRlIGEgbWVzc2FnZSB1c2luZyB0aGUgbWVzc2FnZSBzZXQgd2lyZSBmb3JtYXQgd2l0aCBhbiB1bmtub3duCisgICAgIyBtZXNzYWdlLgorICAgIHJhdyA9IHVuaXR0ZXN0X21zZXRfcGIyLlJhd01lc3NhZ2VTZXQoKQorCisgICAgIyBBZGQgYW4gaXRlbS4KKyAgICBpdGVtID0gcmF3Lml0ZW0uYWRkKCkKKyAgICBpdGVtLnR5cGVfaWQgPSAxNTQ1MDA4CisgICAgZXh0ZW5zaW9uX21lc3NhZ2UxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xCisgICAgbWVzc2FnZTEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEoKQorICAgIG1lc3NhZ2UxLmkgPSAxMjM0NQorICAgIGl0ZW0ubWVzc2FnZSA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgICMgQWRkIGEgc2Vjb25kLCB1bmtub3duIGV4dGVuc2lvbi4KKyAgICBpdGVtID0gcmF3Lml0ZW0uYWRkKCkKKyAgICBpdGVtLnR5cGVfaWQgPSAxNTQ1MDA5CisgICAgZXh0ZW5zaW9uX21lc3NhZ2UxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xCisgICAgbWVzc2FnZTEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEoKQorICAgIG1lc3NhZ2UxLmkgPSAxMjM0NgorICAgIGl0ZW0ubWVzc2FnZSA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgICMgQWRkIGFub3RoZXIgdW5rbm93biBleHRlbnNpb24uCisgICAgaXRlbSA9IHJhdy5pdGVtLmFkZCgpCisgICAgaXRlbS50eXBlX2lkID0gMTU0NTAxMAorICAgIG1lc3NhZ2UxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKCkKKyAgICBtZXNzYWdlMS5zdHIgPSAnZm9vJworICAgIGl0ZW0ubWVzc2FnZSA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgIHNlcmlhbGl6ZWQgPSByYXcuU2VyaWFsaXplVG9TdHJpbmcoKQorCisgICAgIyBQYXJzZSBtZXNzYWdlIHVzaW5nIHRoZSBtZXNzYWdlIHNldCB3aXJlIGZvcm1hdC4KKyAgICBwcm90byA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0KCkKKyAgICBwcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgbWVzc2FnZSBwYXJzZWQgd2VsbC4KKyAgICBleHRlbnNpb25fbWVzc2FnZTEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEKKyAgICBleHRlbnNpb24xID0gZXh0ZW5zaW9uX21lc3NhZ2UxLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEyMzQ1LCBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbjFdLmkpCisKKyAgZGVmIHRlc3RVbmtub3duRmllbGRzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bykKKworICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgICAjIFRoZSBlbXB0eSBtZXNzYWdlIHNob3VsZCBiZSBwYXJzYWJsZSB3aXRoIGFsbCBvZiB0aGUgZmllbGRzCisgICAgIyB1bmtub3duLgorICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlKCkKKworICAgICMgUGFyc2luZyB0aGlzIG1lc3NhZ2Ugc2hvdWxkIHN1Y2NlZWQuCisgICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorCisgICAgIyBOb3cgdGVzdCB3aXRoIGEgaW50NjQgZmllbGQgc2V0LgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgcHJvdG8ub3B0aW9uYWxfaW50NjQgPSAweDBmZmZmZmZmZmZmZmZmZmYKKyAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQorICAgICMgVGhlIGVtcHR5IG1lc3NhZ2Ugc2hvdWxkIGJlIHBhcnNhYmxlIHdpdGggYWxsIG9mIHRoZSBmaWVsZHMKKyAgICAjIHVua25vd24uCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQorICAgICMgUGFyc2luZyB0aGlzIG1lc3NhZ2Ugc2hvdWxkIHN1Y2NlZWQuCisgICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorCisgIGRlZiBfQ2hlY2tSYWlzZXMoc2VsZiwgZXhjX2NsYXNzLCBjYWxsYWJsZV9vYmosIGV4Y2VwdGlvbik6CisgICAgIiIiVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSBleGNwZXRpb24gdHlwZSBhbmQgbWVzc2FnZSBhcmUgYXMgZXhwZWN0ZWQuIiIiCisgICAgdHJ5OgorICAgICAgY2FsbGFibGVfb2JqKCkKKyAgICBleGNlcHQgZXhjX2NsYXNzLCBleDoKKyAgICAgICMgQ2hlY2sgaWYgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGlzIHRoZSByaWdodCBvbmUuCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Y2VwdGlvbiwgc3RyKGV4KSkKKyAgICAgIHJldHVybgorICAgIGVsc2U6CisgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24oJyVzIG5vdCByYWlzZWQnICUgc3RyKGV4Y19jbGFzcykpCisKKyAgZGVmIHRlc3RTZXJpYWxpemVVbmluaXRpYWxpemVkKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZCgpCisgICAgc2VsZi5fQ2hlY2tSYWlzZXMoCisgICAgICAgIG1lc3NhZ2UuRW5jb2RlRXJyb3IsCisgICAgICAgIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nLAorICAgICAgICAnTWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSxiLGMnKQorICAgICMgU2hvdWxkbid0IHJhaXNlIGV4Y2VwdGlvbnMuCisgICAgcGFydGlhbCA9IHByb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCisKKyAgICBwcm90by5hID0gMQorICAgIHNlbGYuX0NoZWNrUmFpc2VzKAorICAgICAgICBtZXNzYWdlLkVuY29kZUVycm9yLAorICAgICAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZywKKyAgICAgICAgJ01lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGIsYycpCisgICAgIyBTaG91bGRuJ3QgcmFpc2UgZXhjZXB0aW9ucy4KKyAgICBwYXJ0aWFsID0gcHJvdG8uU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKCkKKworICAgIHByb3RvLmIgPSAyCisgICAgc2VsZi5fQ2hlY2tSYWlzZXMoCisgICAgICAgIG1lc3NhZ2UuRW5jb2RlRXJyb3IsCisgICAgICAgIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nLAorICAgICAgICAnTWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYycpCisgICAgIyBTaG91bGRuJ3QgcmFpc2UgZXhjZXB0aW9ucy4KKyAgICBwYXJ0aWFsID0gcHJvdG8uU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKCkKKworICAgIHByb3RvLmMgPSAzCisgICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICAjIFNob3VsZG4ndCByYWlzZSBleGNlcHRpb25zLgorICAgIHBhcnRpYWwgPSBwcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoKQorCisgICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZCgpCisgICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLmEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90bzIuYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHByb3RvMi5jKQorICAgIHByb3RvMi5QYXJzZUZyb21TdHJpbmcocGFydGlhbCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMi5hKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8yLmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBwcm90bzIuYykKKworICBkZWYgdGVzdFNlcmlhbGl6ZVVuaW5pdGlhbGl6ZWRTdWJNZXNzYWdlKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZEZvcmVpZ24oKQorCisgICAgIyBTdWItbWVzc2FnZSBkb2Vzbid0IGV4aXN0IHlldCwgc28gdGhpcyBzdWNjZWVkcy4KKyAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlLmEgPSAxCisgICAgc2VsZi5fQ2hlY2tSYWlzZXMoCisgICAgICAgIG1lc3NhZ2UuRW5jb2RlRXJyb3IsCisgICAgICAgIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nLAorICAgICAgICAnTWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogJworICAgICAgICAnb3B0aW9uYWxfbWVzc2FnZS5iLG9wdGlvbmFsX21lc3NhZ2UuYycpCisKKyAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlLmIgPSAyCisgICAgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5jID0gMworICAgIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKworICAgIHByb3RvLnJlcGVhdGVkX21lc3NhZ2UuYWRkKCkuYSA9IDEKKyAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlLmFkZCgpLmIgPSAyCisgICAgc2VsZi5fQ2hlY2tSYWlzZXMoCisgICAgICAgIG1lc3NhZ2UuRW5jb2RlRXJyb3IsCisgICAgICAgIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nLAorICAgICAgICAnTWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogJworICAgICAgICAncmVwZWF0ZWRfbWVzc2FnZVswXS5iLHJlcGVhdGVkX21lc3NhZ2VbMF0uYywnCisgICAgICAgICdyZXBlYXRlZF9tZXNzYWdlWzFdLmEscmVwZWF0ZWRfbWVzc2FnZVsxXS5jJykKKworICAgIHByb3RvLnJlcGVhdGVkX21lc3NhZ2VbMF0uYiA9IDIKKyAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlWzBdLmMgPSAzCisgICAgcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZVsxXS5hID0gMQorICAgIHByb3RvLnJlcGVhdGVkX21lc3NhZ2VbMV0uYyA9IDMKKyAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgZGVmIHRlc3RTZXJpYWxpemVBbGxQYWNrZWRGaWVsZHMoc2VsZik6CisgICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsUGFja2VkRmllbGRzKGZpcnN0X3Byb3RvKQorICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCisgICAgYnl0ZXNfcmVhZCA9IHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF9wcm90by5CeXRlU2l6ZSgpLCBieXRlc19yZWFkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKKworICBkZWYgdGVzdFNlcmlhbGl6ZUFsbFBhY2tlZEV4dGVuc2lvbnMoc2VsZik6CisgICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQorICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucygpCisgICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEV4dGVuc2lvbnMoZmlyc3RfcHJvdG8pCisgICAgc2VyaWFsaXplZCA9IGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBieXRlc19yZWFkID0gc2Vjb25kX3Byb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vjb25kX3Byb3RvLkJ5dGVTaXplKCksIGJ5dGVzX3JlYWQpCisgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQorCisgIGRlZiB0ZXN0TWVyZ2VQYWNrZWRGcm9tU3RyaW5nV2hlblNvbWVGaWVsZHNBbHJlYWR5U2V0KHNlbGYpOgorICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgZmlyc3RfcHJvdG8ucGFja2VkX2ludDMyLmV4dGVuZChbMSwgMl0pCisgICAgZmlyc3RfcHJvdG8ucGFja2VkX2RvdWJsZS5hcHBlbmQoMy4wKQorICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCisKKyAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICBzZWNvbmRfcHJvdG8ucGFja2VkX2ludDMyLmFwcGVuZCgzKQorICAgIHNlY29uZF9wcm90by5wYWNrZWRfZG91YmxlLmV4dGVuZChbMS4wLCAyLjBdKQorICAgIHNlY29uZF9wcm90by5wYWNrZWRfc2ludDMyLmFwcGVuZCg0KQorCisgICAgc2Vjb25kX3Byb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzMsIDEsIDJdLCBzZWNvbmRfcHJvdG8ucGFja2VkX2ludDMyKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEuMCwgMi4wLCAzLjBdLCBzZWNvbmRfcHJvdG8ucGFja2VkX2RvdWJsZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFs0XSwgc2Vjb25kX3Byb3RvLnBhY2tlZF9zaW50MzIpCisKKyAgZGVmIHRlc3RQYWNrZWRGaWVsZHNXaXJlRm9ybWF0KHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgcHJvdG8ucGFja2VkX2ludDMyLmV4dGVuZChbMSwgMiwgMTUwLCAzXSkgICMgMSArIDEgKyAyICsgMSBieXRlcworICAgIHByb3RvLnBhY2tlZF9kb3VibGUuZXh0ZW5kKFsxLjAsIDEwMDAuMF0pICAjIDggKyA4IGJ5dGVzCisgICAgcHJvdG8ucGFja2VkX2Zsb2F0LmFwcGVuZCgyLjApICAgICAgICAgICAgICMgNCBieXRlcywgd2lsbCBiZSBiZWZvcmUgZG91YmxlCisgICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKKyAgICBkID0gX01pbmlEZWNvZGVyKHNlcmlhbGl6ZWQpCisgICAgUmVhZFRhZyA9IGQuUmVhZEZpZWxkTnVtYmVyQW5kV2lyZVR5cGUKKyAgICBzZWxmLmFzc2VydEVxdWFsKCg5MCwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCksIFJlYWRUYWcoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDErMSsxKzIsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBkLlJlYWRJbnQzMigpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgZC5SZWFkSW50MzIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDE1MCwgZC5SZWFkSW50MzIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoMTAwLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSwgUmVhZFRhZygpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgZC5SZWFkSW50MzIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIuMCwgZC5SZWFkRmxvYXQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCgxMDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpLCBSZWFkVGFnKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg4KzgsIGQuUmVhZEludDMyKCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLjAsIGQuUmVhZERvdWJsZSgpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwMC4wLCBkLlJlYWREb3VibGUoKSkKKyAgICBzZWxmLmFzc2VydFRydWUoZC5FbmRPZlN0cmVhbSgpKQorCisgIGRlZiB0ZXN0UGFyc2VQYWNrZWRGcm9tVW5wYWNrZWQoc2VsZik6CisgICAgdW5wYWNrZWQgPSB1bml0dGVzdF9wYjIuVGVzdFVucGFja2VkVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxVbnBhY2tlZEZpZWxkcyh1bnBhY2tlZCkKKyAgICBwYWNrZWQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICBwYWNrZWQuTWVyZ2VGcm9tU3RyaW5nKHVucGFja2VkLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgZXhwZWN0ZWQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsUGFja2VkRmllbGRzKGV4cGVjdGVkKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIHBhY2tlZCkKKworICBkZWYgdGVzdFBhcnNlVW5wYWNrZWRGcm9tUGFja2VkKHNlbGYpOgorICAgIHBhY2tlZCA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxQYWNrZWRGaWVsZHMocGFja2VkKQorICAgIHVucGFja2VkID0gdW5pdHRlc3RfcGIyLlRlc3RVbnBhY2tlZFR5cGVzKCkKKyAgICB1bnBhY2tlZC5NZXJnZUZyb21TdHJpbmcocGFja2VkLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCisgICAgZXhwZWN0ZWQgPSB1bml0dGVzdF9wYjIuVGVzdFVucGFja2VkVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxVbnBhY2tlZEZpZWxkcyhleHBlY3RlZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCB1bnBhY2tlZCkKKworICBkZWYgdGVzdEZpZWxkTnVtYmVycyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkJCX0ZJRUxEX05VTUJFUiwgMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT1BUSU9OQUxfSU5UMzJfRklFTERfTlVNQkVSLCAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5PUFRJT05BTEdST1VQX0ZJRUxEX05VTUJFUiwgMTYpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT1BUSU9OQUxfTkVTVEVEX01FU1NBR0VfRklFTERfTlVNQkVSLCAxOCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5PUFRJT05BTF9ORVNURURfRU5VTV9GSUVMRF9OVU1CRVIsIDIxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SRVBFQVRFRF9JTlQzMl9GSUVMRF9OVU1CRVIsIDMxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SRVBFQVRFREdST1VQX0ZJRUxEX05VTUJFUiwgNDYpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUkVQRUFURURfTkVTVEVEX01FU1NBR0VfRklFTERfTlVNQkVSLCA0OCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SRVBFQVRFRF9ORVNURURfRU5VTV9GSUVMRF9OVU1CRVIsIDUxKQorCisgIGRlZiB0ZXN0RXh0ZW5zaW9uRmllbGROdW1iZXJzKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5zaW5nbGUubnVtYmVyLCAxMDAwKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5TSU5HTEVfRklFTERfTlVNQkVSLCAxMDAwKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5tdWx0aS5udW1iZXIsIDEwMDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLk1VTFRJX0ZJRUxEX05VTUJFUiwgMTAwMSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24ubnVtYmVyLCAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLk9QVElPTkFMX0lOVDMyX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIub3B0aW9uYWxncm91cF9leHRlbnNpb24ubnVtYmVyLCAxNikKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5PUFRJT05BTEdST1VQX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE2KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbi5udW1iZXIsIDE4KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICB1bml0dGVzdF9wYjIuT1BUSU9OQUxfTkVTVEVEX01FU1NBR0VfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgMTgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIub3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLm51bWJlciwgMjEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuT1BUSU9OQUxfTkVTVEVEX0VOVU1fRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwKKyAgICAgIDIxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbi5udW1iZXIsIDMxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlJFUEVBVEVEX0lOVDMyX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDMxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uLm51bWJlciwgNDYpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuUkVQRUFURURHUk9VUF9FWFRFTlNJT05fRklFTERfTlVNQkVSLCA0NikKKyAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24ubnVtYmVyLCA0OCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgdW5pdHRlc3RfcGIyLlJFUEVBVEVEX05FU1RFRF9NRVNTQUdFX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDQ4KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbi5udW1iZXIsIDUxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlJFUEVBVEVEX05FU1RFRF9FTlVNX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsCisgICAgICA1MSkKKworICBkZWYgdGVzdEluaXRLd2FyZ3Moc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKAorICAgICAgICBvcHRpb25hbF9pbnQzMj0xLAorICAgICAgICBvcHRpb25hbF9zdHJpbmc9J2ZvbycsCisgICAgICAgIG9wdGlvbmFsX2Jvb2w9VHJ1ZSwKKyAgICAgICAgb3B0aW9uYWxfYnl0ZXM9J2JhcicsCisgICAgICAgIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZShiYj0xKSwKKyAgICAgICAgb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlPXVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTEpLAorICAgICAgICBvcHRpb25hbF9uZXN0ZWRfZW51bT11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTywKKyAgICAgICAgb3B0aW9uYWxfZm9yZWlnbl9lbnVtPXVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTywKKyAgICAgICAgcmVwZWF0ZWRfaW50MzI9WzEsIDIsIDNdKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5Jc0luaXRpYWxpemVkKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9ib29sJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9ieXRlcycpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX2VudW0nKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fZW51bScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfaW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnZm9vJywgcHJvdG8ub3B0aW9uYWxfc3RyaW5nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgcHJvdG8ub3B0aW9uYWxfYm9vbCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdiYXInLCBwcm90by5vcHRpb25hbF9ieXRlcykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTywKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9lbnVtKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkZPUkVJR05fRk9PLCBwcm90by5vcHRpb25hbF9mb3JlaWduX2VudW0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChbMSwgMiwgM10sIHByb3RvLnJlcGVhdGVkX2ludDMyKQorCisgIGRlZiB0ZXN0SW5pdEFyZ3NVbmtub3duRmllbGROYW1lKHNlbGYpOgorICAgIGRlZiBJbml0YWxpemVFbXB0eU1lc3NhZ2VXaXRoRXh0cmFLZXl3b3JkQXJnKCk6CisgICAgICB1bnVzZWRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSh1bmtub3duPSd1bmtub3duJykKKyAgICBzZWxmLl9DaGVja1JhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIEluaXRhbGl6ZUVtcHR5TWVzc2FnZVdpdGhFeHRyYUtleXdvcmRBcmcsCisgICAgICAgICAgICAgICAgICAgICAgJ1Byb3RvY29sIG1lc3NhZ2UgaGFzIG5vICJ1bmtub3duIiBmaWVsZC4nKQorCisgIGRlZiB0ZXN0SW5pdFJlcXVpcmVkS3dhcmdzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZChhPTEsIGI9MSwgYz0xKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5Jc0luaXRpYWxpemVkKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdhJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdiJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdjJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZCgnZHVtbXkyJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5hKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8uYikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLmMpCisKKyAgZGVmIHRlc3RJbml0UmVxdWlyZWRGb3JlaWduS3dhcmdzKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZEZvcmVpZ24oCisgICAgICAgIG9wdGlvbmFsX21lc3NhZ2U9dW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZChhPTEsIGI9MSwgYz0xKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSXNJbml0aWFsaXplZCgpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbWVzc2FnZScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5vcHRpb25hbF9tZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5IYXNGaWVsZCgnYScpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5vcHRpb25hbF9tZXNzYWdlLkhhc0ZpZWxkKCdiJykpCisgICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuSGFzRmllbGQoJ2MnKSkKKyAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuSGFzRmllbGQoJ2R1bW15MicpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZChhPTEsIGI9MSwgYz0xKSwKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5vcHRpb25hbF9tZXNzYWdlLmEpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5vcHRpb25hbF9tZXNzYWdlLmIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5vcHRpb25hbF9tZXNzYWdlLmMpCisKKyAgZGVmIHRlc3RJbml0UmVwZWF0ZWRLd2FyZ3Moc2VsZik6CisgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKHJlcGVhdGVkX2ludDMyPVsxLCAyLCAzXSkKKyAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSXNJbml0aWFsaXplZCgpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90by5yZXBlYXRlZF9pbnQzMlsxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHByb3RvLnJlcGVhdGVkX2ludDMyWzJdKQorCisKK2NsYXNzIE9wdGlvbnNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdE1lc3NhZ2VPcHRpb25zKHNlbGYpOgorICAgIHByb3RvID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLkRFU0NSSVBUT1IuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQorICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvLkRFU0NSSVBUT1IuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQorCisgIGRlZiB0ZXN0UGFja2VkT3B0aW9ucyhzZWxmKToKKyAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMQorICAgIHByb3RvLm9wdGlvbmFsX2RvdWJsZSA9IDMuMAorICAgIGZvciBmaWVsZF9kZXNjcmlwdG9yLCBfIGluIHByb3RvLkxpc3RGaWVsZHMoKToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGZpZWxkX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLnBhY2tlZCkKKworICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCisgICAgcHJvdG8ucGFja2VkX2ludDMyLmFwcGVuZCgxKQorICAgIHByb3RvLnBhY2tlZF9kb3VibGUuYXBwZW5kKDMuMCkKKyAgICBmb3IgZmllbGRfZGVzY3JpcHRvciwgXyBpbiBwcm90by5MaXN0RmllbGRzKCk6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGZpZWxkX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLnBhY2tlZCkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmbGVjdGlvbi5fRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVELAorICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLmxhYmVsKQorCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9zZXJ2aWNlX3JlZmxlY3Rpb25fdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3NlcnZpY2VfcmVmbGVjdGlvbl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUwNGY4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9zZXJ2aWNlX3JlZmxlY3Rpb25fdGVzdC5weQpAQCAtMCwwICsxLDEzNiBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdHMgZm9yIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5zZXJ2aWNlX3JlZmxlY3Rpb24uIiIiCisKK19fYXV0aG9yX18gPSAncGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KScKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc2VydmljZV9yZWZsZWN0aW9uCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc2VydmljZQorCisKK2NsYXNzIEZvb1VuaXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdFNlcnZpY2Uoc2VsZik6CisgICAgY2xhc3MgTW9ja1JwY0NoYW5uZWwoc2VydmljZS5ScGNDaGFubmVsKToKKyAgICAgIGRlZiBDYWxsTWV0aG9kKHNlbGYsIG1ldGhvZCwgY29udHJvbGxlciwgcmVxdWVzdCwgcmVzcG9uc2UsIGNhbGxiYWNrKToKKyAgICAgICAgc2VsZi5tZXRob2QgPSBtZXRob2QKKyAgICAgICAgc2VsZi5jb250cm9sbGVyID0gY29udHJvbGxlcgorICAgICAgICBzZWxmLnJlcXVlc3QgPSByZXF1ZXN0CisgICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKQorCisgICAgY2xhc3MgTW9ja1JwY0NvbnRyb2xsZXIoc2VydmljZS5ScGNDb250cm9sbGVyKToKKyAgICAgIGRlZiBTZXRGYWlsZWQoc2VsZiwgbXNnKToKKyAgICAgICAgc2VsZi5mYWlsdXJlX21lc3NhZ2UgPSBtc2cKKworICAgIHNlbGYuY2FsbGJhY2tfcmVzcG9uc2UgPSBOb25lCisKKyAgICBjbGFzcyBNeVNlcnZpY2UodW5pdHRlc3RfcGIyLlRlc3RTZXJ2aWNlKToKKyAgICAgIHBhc3MKKworICAgIHNlbGYuY2FsbGJhY2tfcmVzcG9uc2UgPSBOb25lCisKKyAgICBkZWYgTXlDYWxsYmFjayhyZXNwb25zZSk6CisgICAgICBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlID0gcmVzcG9uc2UKKworICAgIHJwY19jb250cm9sbGVyID0gTW9ja1JwY0NvbnRyb2xsZXIoKQorICAgIGNoYW5uZWwgPSBNb2NrUnBjQ2hhbm5lbCgpCisgICAgc3J2YyA9IE15U2VydmljZSgpCisgICAgc3J2Yy5Gb28ocnBjX2NvbnRyb2xsZXIsIHVuaXR0ZXN0X3BiMi5Gb29SZXF1ZXN0KCksIE15Q2FsbGJhY2spCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnTWV0aG9kIEZvbyBub3QgaW1wbGVtZW50ZWQuJywKKyAgICAgICAgICAgICAgICAgICAgIHJwY19jb250cm9sbGVyLmZhaWx1cmVfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuY2FsbGJhY2tfcmVzcG9uc2UpCisKKyAgICBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UgPSBOb25lCisKKyAgICBzZXJ2aWNlX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9wYjIuVGVzdFNlcnZpY2UuR2V0RGVzY3JpcHRvcigpCisgICAgc3J2Yy5DYWxsTWV0aG9kKHNlcnZpY2VfZGVzY3JpcHRvci5tZXRob2RzWzFdLCBycGNfY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkJhclJlcXVlc3QoKSwgTXlDYWxsYmFjaykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdNZXRob2QgQmFyIG5vdCBpbXBsZW1lbnRlZC4nLAorICAgICAgICAgICAgICAgICAgICAgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5jYWxsYmFja19yZXNwb25zZSkKKyAgICAKKyAgICBjbGFzcyBNeVNlcnZpY2VJbXBsKHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZSk6CisgICAgICBkZWYgRm9vKHNlbGYsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBkb25lKToKKyAgICAgICAgc2VsZi5mb29fY2FsbGVkID0gVHJ1ZQorICAgICAgZGVmIEJhcihzZWxmLCBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgZG9uZSk6CisgICAgICAgIHNlbGYuYmFyX2NhbGxlZCA9IFRydWUKKworICAgIHNydmMgPSBNeVNlcnZpY2VJbXBsKCkKKyAgICBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UgPSBOb25lCisgICAgc3J2Yy5Gb28ocnBjX2NvbnRyb2xsZXIsIHVuaXR0ZXN0X3BiMi5Gb29SZXF1ZXN0KCksIE15Q2FsbGJhY2spCisgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBzcnZjLmZvb19jYWxsZWQpCisKKyAgICBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UgPSBOb25lCisgICAgc3J2Yy5DYWxsTWV0aG9kKHNlcnZpY2VfZGVzY3JpcHRvci5tZXRob2RzWzFdLCBycGNfY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkJhclJlcXVlc3QoKSwgTXlDYWxsYmFjaykKKyAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHJwY19jb250cm9sbGVyLmZhaWx1cmVfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHNydmMuYmFyX2NhbGxlZCkKKworICBkZWYgdGVzdFNlcnZpY2VTdHViKHNlbGYpOgorICAgIGNsYXNzIE1vY2tScGNDaGFubmVsKHNlcnZpY2UuUnBjQ2hhbm5lbCk6CisgICAgICBkZWYgQ2FsbE1ldGhvZChzZWxmLCBtZXRob2QsIGNvbnRyb2xsZXIsIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICByZXNwb25zZV9jbGFzcywgY2FsbGJhY2spOgorICAgICAgICBzZWxmLm1ldGhvZCA9IG1ldGhvZAorICAgICAgICBzZWxmLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyCisgICAgICAgIHNlbGYucmVxdWVzdCA9IHJlcXVlc3QKKyAgICAgICAgY2FsbGJhY2socmVzcG9uc2VfY2xhc3MoKSkKKworICAgIHNlbGYuY2FsbGJhY2tfcmVzcG9uc2UgPSBOb25lCisKKyAgICBkZWYgTXlDYWxsYmFjayhyZXNwb25zZSk6CisgICAgICBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlID0gcmVzcG9uc2UKKworICAgIGNoYW5uZWwgPSBNb2NrUnBjQ2hhbm5lbCgpCisgICAgc3R1YiA9IHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZV9TdHViKGNoYW5uZWwpCisgICAgcnBjX2NvbnRyb2xsZXIgPSAnY29udHJvbGxlcicKKyAgICByZXF1ZXN0ID0gJ3JlcXVlc3QnCisKKyAgICAjIEdldERlc2NyaXB0b3Igbm93IHN0YXRpYywgc3RpbGwgd29ya3MgYXMgaW5zdGFuY2UgbWV0aG9kIGZvciBjb21wYXRhYmlsaXR5CisgICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdFNlcnZpY2VfU3R1Yi5HZXREZXNjcmlwdG9yKCksCisgICAgICAgICAgICAgICAgICAgICBzdHViLkdldERlc2NyaXB0b3IoKSkKKworICAgICMgSW52b2tlIG1ldGhvZC4KKyAgICBzdHViLkZvbyhycGNfY29udHJvbGxlciwgcmVxdWVzdCwgTXlDYWxsYmFjaykKKworICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYuY2FsbGJhY2tfcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvb1Jlc3BvbnNlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHJlcXVlc3QsIGNoYW5uZWwucmVxdWVzdCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHJwY19jb250cm9sbGVyLCBjaGFubmVsLmNvbnRyb2xsZXIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChzdHViLkdldERlc2NyaXB0b3IoKS5tZXRob2RzWzBdLCBjaGFubmVsLm1ldGhvZCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfdXRpbC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZGYxNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF91dGlsLnB5CkBAIC0wLDAgKzEsNjM1IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVXRpbGl0aWVzIGZvciBQeXRob24gcHJvdG8yIHRlc3RzLgorCitUaGlzIGlzIGludGVudGlvbmFsbHkgbW9kZWxlZCBvbiBDKysgY29kZSBpbgorLy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLiouCisiIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworaW1wb3J0IG9zLnBhdGgKKworZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKKworCitkZWYgU2V0QWxsRmllbGRzKG1lc3NhZ2UpOgorICAiIiJTZXRzIGV2ZXJ5IGZpZWxkIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgorCisgIEFyZ3M6CisgICAgbWVzc2FnZTogQSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzIGluc3RhbmNlLgorICAiIiIKKworICAjCisgICMgT3B0aW9uYWwgZmllbGRzLgorICAjCisKKyAgbWVzc2FnZS5vcHRpb25hbF9pbnQzMiAgICA9IDEwMQorICBtZXNzYWdlLm9wdGlvbmFsX2ludDY0ICAgID0gMTAyCisgIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyICAgPSAxMDMKKyAgbWVzc2FnZS5vcHRpb25hbF91aW50NjQgICA9IDEwNAorICBtZXNzYWdlLm9wdGlvbmFsX3NpbnQzMiAgID0gMTA1CisgIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDY0ICAgPSAxMDYKKyAgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyICA9IDEwNworICBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQgID0gMTA4CisgIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIgPSAxMDkKKyAgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQ2NCA9IDExMAorICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ICAgID0gMTExCisgIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlICAgPSAxMTIKKyAgbWVzc2FnZS5vcHRpb25hbF9ib29sICAgICA9IFRydWUKKyAgIyBUT0RPKHJvYmluc29uKTogRmlybWx5IHNwZWMgb3V0IGFuZCB0ZXN0IGhvdworICAjIHByb3RvcyBpbnRlcmFjdCB3aXRoIHVuaWNvZGUuICBPbmUgc3BlY2lmaWMgZXhhbXBsZToKKyAgIyB3aGF0IGhhcHBlbnMgaWYgd2UgY2hhbmdlIHRoZSBsaXRlcmFsIGJlbG93IHRvCisgICMgdScxMTUnPyAgV2hhdCAqc2hvdWxkKiBoYXBwZW4/ICBTdGlsbCBzb21lIGRpc2N1c3Npb24KKyAgIyB0byBmaW5pc2ggd2l0aCBLZW50b24gYWJvdXQgYnl0ZXMgdnMuIHN0cmluZ3MKKyAgIyBhbmQgZm9yY2luZyBldmVyeXRoaW5nIHRvIGJlIHV0ZjguIDotLworICBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyAgID0gJzExNScKKyAgbWVzc2FnZS5vcHRpb25hbF9ieXRlcyAgICA9ICcxMTYnCisKKyAgbWVzc2FnZS5vcHRpb25hbGdyb3VwLmEgPSAxMTcKKyAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDExOAorICBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jID0gMTE5CisgIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UuZCA9IDEyMAorCisgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWgorICBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSA9IHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWgorICBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtID0gdW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFaCisKKyAgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmdfcGllY2UgPSAnMTI0JworICBtZXNzYWdlLm9wdGlvbmFsX2NvcmQgPSAnMTI1JworCisgICMKKyAgIyBSZXBlYXRlZCBmaWVsZHMuCisgICMKKworICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgyMDEpCisgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKDIwMikKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIuYXBwZW5kKDIwMykKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDIwNCkKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIuYXBwZW5kKDIwNSkKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQuYXBwZW5kKDIwNikKKyAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyLmFwcGVuZCgyMDcpCisgIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NC5hcHBlbmQoMjA4KQorICBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyLmFwcGVuZCgyMDkpCisgIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQuYXBwZW5kKDIxMCkKKyAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMjExKQorICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMjEyKQorICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wuYXBwZW5kKFRydWUpCisgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnMjE1JykKKyAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcy5hcHBlbmQoJzIxNicpCisKKyAgbWVzc2FnZS5yZXBlYXRlZGdyb3VwLmFkZCgpLmEgPSAyMTcKKyAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDIxOAorICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZS5hZGQoKS5jID0gMjE5CisgIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UuYWRkKCkuZCA9IDIyMAorCisgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0uYXBwZW5kKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKQorICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bS5hcHBlbmQodW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSKQorICBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtLmFwcGVuZCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9CQVIpCisKKyAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2UuYXBwZW5kKCcyMjQnKQorICBtZXNzYWdlLnJlcGVhdGVkX2NvcmQuYXBwZW5kKCcyMjUnKQorCisgICMgQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgorICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgzMDEpCisgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKDMwMikKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIuYXBwZW5kKDMwMykKKyAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDMwNCkKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIuYXBwZW5kKDMwNSkKKyAgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQuYXBwZW5kKDMwNikKKyAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyLmFwcGVuZCgzMDcpCisgIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NC5hcHBlbmQoMzA4KQorICBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyLmFwcGVuZCgzMDkpCisgIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQuYXBwZW5kKDMxMCkKKyAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMzExKQorICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMzEyKQorICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wuYXBwZW5kKEZhbHNlKQorICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJzMxNScpCisgIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMuYXBwZW5kKCczMTYnKQorCisgIG1lc3NhZ2UucmVwZWF0ZWRncm91cC5hZGQoKS5hID0gMzE3CisgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAzMTgKKyAgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UuYWRkKCkuYyA9IDMxOQorICBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlLmFkZCgpLmQgPSAzMjAKKworICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtLmFwcGVuZCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWikKKyAgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0uYXBwZW5kKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWikKKyAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bS5hcHBlbmQodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFaKQorCisgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlLmFwcGVuZCgnMzI0JykKKyAgbWVzc2FnZS5yZXBlYXRlZF9jb3JkLmFwcGVuZCgnMzI1JykKKworICAjCisgICMgRmllbGRzIHRoYXQgaGF2ZSBkZWZhdWx0cy4KKyAgIworCisgIG1lc3NhZ2UuZGVmYXVsdF9pbnQzMiA9IDQwMQorICBtZXNzYWdlLmRlZmF1bHRfaW50NjQgPSA0MDIKKyAgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMiA9IDQwMworICBtZXNzYWdlLmRlZmF1bHRfdWludDY0ID0gNDA0CisgIG1lc3NhZ2UuZGVmYXVsdF9zaW50MzIgPSA0MDUKKyAgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCA9IDQwNgorICBtZXNzYWdlLmRlZmF1bHRfZml4ZWQzMiA9IDQwNworICBtZXNzYWdlLmRlZmF1bHRfZml4ZWQ2NCA9IDQwOAorICBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIgPSA0MDkKKyAgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0ID0gNDEwCisgIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCA9IDQxMQorICBtZXNzYWdlLmRlZmF1bHRfZG91YmxlID0gNDEyCisgIG1lc3NhZ2UuZGVmYXVsdF9ib29sID0gRmFsc2UKKyAgbWVzc2FnZS5kZWZhdWx0X3N0cmluZyA9ICc0MTUnCisgIG1lc3NhZ2UuZGVmYXVsdF9ieXRlcyA9ICc0MTYnCisKKyAgbWVzc2FnZS5kZWZhdWx0X25lc3RlZF9lbnVtID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08KKyAgbWVzc2FnZS5kZWZhdWx0X2ZvcmVpZ25fZW51bSA9IHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTworICBtZXNzYWdlLmRlZmF1bHRfaW1wb3J0X2VudW0gPSB1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9GT08KKworICBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nX3BpZWNlID0gJzQyNCcKKyAgbWVzc2FnZS5kZWZhdWx0X2NvcmQgPSAnNDI1JworCisKK2RlZiBTZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UpOgorICAiIiJTZXRzIGV2ZXJ5IGV4dGVuc2lvbiBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KKworICBBcmdzOgorICAgIG1lc3NhZ2U6IEEgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zIGluc3RhbmNlLgorICAiIiIKKworICBleHRlbnNpb25zID0gbWVzc2FnZS5FeHRlbnNpb25zCisgIHBiMiA9IHVuaXR0ZXN0X3BiMgorICBpbXBvcnRfcGIyID0gdW5pdHRlc3RfaW1wb3J0X3BiMgorCisgICMKKyAgIyBPcHRpb25hbCBmaWVsZHMuCisgICMKKworICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dID0gMTAxCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl0gPSAxMDIKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbl0gPSAxMDMKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl0gPSAxMDQKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl0gPSAxMDUKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbl0gPSAxMDYKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25dID0gMTA3CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uXSA9IDEwOAorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb25dID0gMTA5CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl0gPSAxMTAKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uXSA9IDExMQorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uXSA9IDExMgorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9ib29sX2V4dGVuc2lvbl0gPSBUcnVlCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25dID0gJzExNScKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uXSA9ICcxMTYnCisKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxncm91cF9leHRlbnNpb25dLmEgPSAxMTcKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXS5iYiA9IDExOAorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXS5jID0gMTE5CisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0uZCA9IDEyMAorCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl0gPSBwYjIuVGVzdEFsbFR5cGVzLkJBWgorICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25dID0gcGIyLlRlc3RBbGxUeXBlcy5CQVoKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl0gPSBwYjIuRk9SRUlHTl9CQVoKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXSA9IGltcG9ydF9wYjIuSU1QT1JUX0JBWgorCisgIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb25dID0gJzEyNCcKKyAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfY29yZF9leHRlbnNpb25dID0gJzEyNScKKworICAjCisgICMgUmVwZWF0ZWQgZmllbGRzLgorICAjCisKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjAxKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDIpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyMDMpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDQpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyMDUpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDYpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjA3KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl0uYXBwZW5kKDIwOCkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjA5KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMTApCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl0uYXBwZW5kKDIxMSkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl0uYXBwZW5kKDIxMikKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dLmFwcGVuZChUcnVlKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uXS5hcHBlbmQoJzIxNScpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl0uYXBwZW5kKCcyMTYnKQorCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uXS5hZGQoKS5hID0gMjE3CisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0uYWRkKCkuYmIgPSAyMTgKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl0uYWRkKCkuYyA9IDIxOQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmQgPSAyMjAKKworICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25dLmFwcGVuZChwYjIuVGVzdEFsbFR5cGVzLkJBUikKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl0uYXBwZW5kKHBiMi5GT1JFSUdOX0JBUikKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXS5hcHBlbmQoaW1wb3J0X3BiMi5JTVBPUlRfQkFSKQorCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb25dLmFwcGVuZCgnMjI0JykKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfY29yZF9leHRlbnNpb25dLmFwcGVuZCgnMjI1JykKKworICAjIEFwcGVuZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzAxKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMDIpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgzMDMpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMDQpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgzMDUpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMDYpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzA3KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl0uYXBwZW5kKDMwOCkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzA5KQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMTApCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl0uYXBwZW5kKDMxMSkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl0uYXBwZW5kKDMxMikKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dLmFwcGVuZChGYWxzZSkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl0uYXBwZW5kKCczMTUnKQorICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9ieXRlc19leHRlbnNpb25dLmFwcGVuZCgnMzE2JykKKworICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl0uYWRkKCkuYSA9IDMxNworICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmJiID0gMzE4CisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmMgPSAzMTkKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKS5kID0gMzIwCisKKyAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXS5hcHBlbmQocGIyLlRlc3RBbGxUeXBlcy5CQVopCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dLmFwcGVuZChwYjIuRk9SRUlHTl9CQVopCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl0uYXBwZW5kKGltcG9ydF9wYjIuSU1QT1JUX0JBWikKKworICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXS5hcHBlbmQoJzMyNCcpCisgIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uXS5hcHBlbmQoJzMyNScpCisKKyAgIworICAjIEZpZWxkcyB3aXRoIGRlZmF1bHRzLgorICAjCisKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9pbnQzMl9leHRlbnNpb25dID0gNDAxCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uXSA9IDQwMgorICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3VpbnQzMl9leHRlbnNpb25dID0gNDAzCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbl0gPSA0MDQKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uXSA9IDQwNQorICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25dID0gNDA2CisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb25dID0gNDA3CisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25dID0gNDA4CisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uXSA9IDQwOQorICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl0gPSA0MTAKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9mbG9hdF9leHRlbnNpb25dID0gNDExCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl0gPSA0MTIKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9ib29sX2V4dGVuc2lvbl0gPSBGYWxzZQorICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3N0cmluZ19leHRlbnNpb25dID0gJzQxNScKKyAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9ieXRlc19leHRlbnNpb25dID0gJzQxNicKKworICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl0gPSBwYjIuVGVzdEFsbFR5cGVzLkZPTworICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25dID0gcGIyLkZPUkVJR05fRk9PCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXSA9IGltcG9ydF9wYjIuSU1QT1JUX0ZPTworCisgIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl0gPSAnNDI0JworICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2NvcmRfZXh0ZW5zaW9uXSA9ICc0MjUnCisKKworZGVmIFNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMobWVzc2FnZSk6CisgICIiIlNldHMgZXZlcnkgZmllbGQgYW5kIGV4dGVuc2lvbiBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KKworICBBcmdzOgorICAgIG1lc3NhZ2U6IEEgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UuCisgICIiIgorICBtZXNzYWdlLm15X2ludCA9IDEKKyAgbWVzc2FnZS5teV9zdHJpbmcgPSAnZm9vJworICBtZXNzYWdlLm15X2Zsb2F0ID0gMS4wCisgIG1lc3NhZ2UuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIubXlfZXh0ZW5zaW9uX2ludF0gPSAyMworICBtZXNzYWdlLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9zdHJpbmddID0gJ2JhcicKKworCitkZWYgRXhwZWN0QWxsRmllbGRzQW5kRXh0ZW5zaW9uc0luT3JkZXIoc2VyaWFsaXplZCk6CisgICIiIkVuc3VyZXMgdGhhdCBzZXJpYWxpemVkIGlzIHRoZSBzZXJpYWxpemF0aW9uIHdlIGV4cGVjdCBmb3IgYSBtZXNzYWdlCisgIGZpbGxlZCB3aXRoIFNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMoKS4gIChTcGVjaWZpY2FsbHksIGVuc3VyZXMgdGhhdCB0aGUKKyAgc2VyaWFsaXphdGlvbiBpcyBpbiBjYW5vbmljYWwsIHRhZy1udW1iZXIgb3JkZXIpLgorICAiIiIKKyAgbXlfZXh0ZW5zaW9uX2ludCA9IHVuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25faW50CisgIG15X2V4dGVuc2lvbl9zdHJpbmcgPSB1bml0dGVzdF9wYjIubXlfZXh0ZW5zaW9uX3N0cmluZworICBleHBlY3RlZF9zdHJpbmdzID0gW10KKyAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0RmllbGRPcmRlcmluZ3MoKQorICBtZXNzYWdlLm15X2ludCA9IDEgICMgRmllbGQgMS4KKyAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICBtZXNzYWdlLkNsZWFyKCkKKyAgbWVzc2FnZS5FeHRlbnNpb25zW215X2V4dGVuc2lvbl9pbnRdID0gMjMgICMgRmllbGQgNS4KKyAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICBtZXNzYWdlLkNsZWFyKCkKKyAgbWVzc2FnZS5teV9zdHJpbmcgPSAnZm9vJyAgIyBGaWVsZCAxMS4KKyAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICBtZXNzYWdlLkNsZWFyKCkKKyAgbWVzc2FnZS5FeHRlbnNpb25zW215X2V4dGVuc2lvbl9zdHJpbmddID0gJ2JhcicgICMgRmllbGQgNTAuCisgIGV4cGVjdGVkX3N0cmluZ3MuYXBwZW5kKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKKyAgbWVzc2FnZS5DbGVhcigpCisgIG1lc3NhZ2UubXlfZmxvYXQgPSAxLjAKKyAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQorICBtZXNzYWdlLkNsZWFyKCkKKyAgZXhwZWN0ZWQgPSAnJy5qb2luKGV4cGVjdGVkX3N0cmluZ3MpCisKKyAgaWYgZXhwZWN0ZWQgIT0gc2VyaWFsaXplZDoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdFeHBlY3RlZCAlciwgZm91bmQgJXInICUgKGV4cGVjdGVkLCBzZXJpYWxpemVkKSkKKworCitkZWYgRXhwZWN0QWxsRmllbGRzU2V0KHRlc3RfY2FzZSwgbWVzc2FnZSk6CisgICIiIkNoZWNrIGFsbCBmaWVsZHMgZm9yIGNvcnJlY3QgdmFsdWVzIGhhdmUgYWZ0ZXIgU2V0KkZpZWxkcygpIGlzIGNhbGxlZC4iIiIKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50NjQnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfdWludDMyJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX3VpbnQ2NCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zaW50MzInKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc2ludDY0JykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ZpeGVkMzInKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfZml4ZWQ2NCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zZml4ZWQzMicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zZml4ZWQ2NCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9mbG9hdCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9kb3VibGUnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYm9vbCcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zdHJpbmcnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYnl0ZXMnKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbGdyb3VwJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9pbXBvcnRfbWVzc2FnZScpKQorCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxncm91cC5IYXNGaWVsZCgnYScpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkhhc0ZpZWxkKCdiYicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5IYXNGaWVsZCgnYycpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlLkhhc0ZpZWxkKCdkJykpCisKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX2VudW0nKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfZm9yZWlnbl9lbnVtJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ltcG9ydF9lbnVtJykpCisKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nX3BpZWNlJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2NvcmQnKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAxLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAyLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAzLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMikKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEwNCwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMDUsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDMyKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTA2LCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQ2NCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEwNywgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTA4LCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMDksIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkNjQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTEsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTIsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoVHJ1ZSwgbWVzc2FnZS5vcHRpb25hbF9ib29sKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzExNScsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzExNicsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMpCisKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDExNywgbWVzc2FnZS5vcHRpb25hbGdyb3VwLmEpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTgsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTksIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMjAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UuZCkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVosCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX2VudW0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9CQVosCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtKQorCisgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9zaW50MzIpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0KSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMikpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9mbG9hdCkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9kb3VibGUpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMpKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZGdyb3VwKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSkpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0pKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0pKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2UpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfY29yZCkpCisKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMlswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NFswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwMywgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDQsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0WzBdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjA1LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMlswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwNiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRbMF0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDcsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMlswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwOCwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0WzBdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjA5LCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyWzBdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjEwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0WzBdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjExLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0WzBdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjEyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKFRydWUsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbFswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKCcyMTUnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKCcyMTYnLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzWzBdKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cFswXS5hKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdLmJiKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZVswXS5jKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlWzBdLmQpCisKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bVswXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtWzBdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bVswXSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzAxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzAyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0WzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzAzLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMlsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMwNCwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDUsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzA2LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NFsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMwNywgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzA4LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDksIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzJbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjRbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTEsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMV0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTIsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoRmFsc2UsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbFsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKCczMTUnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1sxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKCczMTYnLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzWzFdKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cFsxXS5hKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzFdLmJiKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZVsxXS5jKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlWzFdLmQpCisKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFaLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bVsxXSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtWzFdKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFaLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bVsxXSkKKworICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9pbnQzMicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X2ludDY0JykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfdWludDMyJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfdWludDY0JykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfc2ludDMyJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfc2ludDY0JykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZml4ZWQzMicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X2ZpeGVkNjQnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9zZml4ZWQzMicpKQorICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X3NmaXhlZDY0JykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZmxvYXQnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9kb3VibGUnKSkKKyAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9ib29sJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfc3RyaW5nJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfYnl0ZXMnKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X25lc3RlZF9lbnVtJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZm9yZWlnbl9lbnVtJykpCisgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfaW1wb3J0X2VudW0nKSkKKworICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDAxLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MDIsIG1lc3NhZ2UuZGVmYXVsdF9pbnQ2NCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwMywgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMikKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNCwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNSwgbWVzc2FnZS5kZWZhdWx0X3NpbnQzMikKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNiwgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNywgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MDgsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0KQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDA5LCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MTAsIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQ2NCkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQxMSwgbWVzc2FnZS5kZWZhdWx0X2Zsb2F0KQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDEyLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoRmFsc2UsIG1lc3NhZ2UuZGVmYXVsdF9ib29sKQorICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzQxNScsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcpCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgnNDE2JywgbWVzc2FnZS5kZWZhdWx0X2J5dGVzKQorCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmYXVsdF9uZXN0ZWRfZW51bSkKKyAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0pCisgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9GT08sCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRlZmF1bHRfaW1wb3J0X2VudW0pCisKK2RlZiBHb2xkZW5GaWxlKGZpbGVuYW1lKToKKyAgIiIiRmluZHMgdGhlIGdpdmVuIGdvbGRlbiBmaWxlIGFuZCByZXR1cm5zIGEgZmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LiIiIgorCisgICMgU2VhcmNoIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSBsb29raW5nIGZvciB0aGUgQysrIHByb3RvYnVmIHNvdXJjZSBjb2RlLgorICBwYXRoID0gJy4nCisgIHdoaWxlIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwYXRoLCAnc3JjL2dvb2dsZS9wcm90b2J1ZicpKToKKyAgICAgICMgRm91bmQgaXQuICBMb2FkIHRoZSBnb2xkZW4gZmlsZSBmcm9tIHRoZSB0ZXN0ZGF0YSBkaXJlY3RvcnkuCisgICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEnLCBmaWxlbmFtZSkKKyAgICAgIHJldHVybiBvcGVuKGZ1bGxfcGF0aCwgJ3JiJykKKyAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICcuLicpCisKKyAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICdDb3VsZCBub3QgZmluZCBnb2xkZW4gZmlsZXMuICBUaGlzIHRlc3QgbXVzdCBiZSBydW4gZnJvbSB3aXRoaW4gdGhlICcKKyAgICAncHJvdG9idWYgc291cmNlIHBhY2thZ2Ugc28gdGhhdCBpdCBjYW4gcmVhZCB0ZXN0IGRhdGEgZmlsZXMgZnJvbSB0aGUgJworICAgICdDKysgc291cmNlIHRyZWUuJykKKworCitkZWYgU2V0QWxsUGFja2VkRmllbGRzKG1lc3NhZ2UpOgorICAiIiJTZXRzIGV2ZXJ5IGZpZWxkIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgorCisgIEFyZ3M6CisgICAgbWVzc2FnZTogQSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzIGluc3RhbmNlLgorICAiIiIKKyAgbWVzc2FnZS5wYWNrZWRfaW50MzIuZXh0ZW5kKFs2MDEsIDcwMV0pCisgIG1lc3NhZ2UucGFja2VkX2ludDY0LmV4dGVuZChbNjAyLCA3MDJdKQorICBtZXNzYWdlLnBhY2tlZF91aW50MzIuZXh0ZW5kKFs2MDMsIDcwM10pCisgIG1lc3NhZ2UucGFja2VkX3VpbnQ2NC5leHRlbmQoWzYwNCwgNzA0XSkKKyAgbWVzc2FnZS5wYWNrZWRfc2ludDMyLmV4dGVuZChbNjA1LCA3MDVdKQorICBtZXNzYWdlLnBhY2tlZF9zaW50NjQuZXh0ZW5kKFs2MDYsIDcwNl0pCisgIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIuZXh0ZW5kKFs2MDcsIDcwN10pCisgIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQuZXh0ZW5kKFs2MDgsIDcwOF0pCisgIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyLmV4dGVuZChbNjA5LCA3MDldKQorICBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NC5leHRlbmQoWzYxMCwgNzEwXSkKKyAgbWVzc2FnZS5wYWNrZWRfZmxvYXQuZXh0ZW5kKFs2MTEuMCwgNzExLjBdKQorICBtZXNzYWdlLnBhY2tlZF9kb3VibGUuZXh0ZW5kKFs2MTIuMCwgNzEyLjBdKQorICBtZXNzYWdlLnBhY2tlZF9ib29sLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQorICBtZXNzYWdlLnBhY2tlZF9lbnVtLmV4dGVuZChbdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaXSkKKworCitkZWYgU2V0QWxsUGFja2VkRXh0ZW5zaW9ucyhtZXNzYWdlKToKKyAgIiIiU2V0cyBldmVyeSBleHRlbnNpb24gaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucyBpbnN0YW5jZS4KKyAgIiIiCisgIGV4dGVuc2lvbnMgPSBtZXNzYWdlLkV4dGVuc2lvbnMKKyAgcGIyID0gdW5pdHRlc3RfcGIyCisKKyAgZXh0ZW5zaW9uc1twYjIucGFja2VkX2ludDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDEsIDcwMV0pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9pbnQ2NF9leHRlbnNpb25dLmV4dGVuZChbNjAyLCA3MDJdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfdWludDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDMsIDcwM10pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uXS5leHRlbmQoWzYwNCwgNzA0XSkKKyAgZXh0ZW5zaW9uc1twYjIucGFja2VkX3NpbnQzMl9leHRlbnNpb25dLmV4dGVuZChbNjA1LCA3MDVdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfc2ludDY0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDYsIDcwNl0pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDcsIDcwN10pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDgsIDcwOF0pCisgIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25dLmV4dGVuZChbNjA5LCA3MDldKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uXS5leHRlbmQoWzYxMCwgNzEwXSkKKyAgZXh0ZW5zaW9uc1twYjIucGFja2VkX2Zsb2F0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MTEuMCwgNzExLjBdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfZG91YmxlX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MTIuMCwgNzEyLjBdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfYm9vbF9leHRlbnNpb25dLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQorICBleHRlbnNpb25zW3BiMi5wYWNrZWRfZW51bV9leHRlbnNpb25dLmV4dGVuZChbdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaXSkKKworCitkZWYgU2V0QWxsVW5wYWNrZWRGaWVsZHMobWVzc2FnZSk6CisgICIiIlNldHMgZXZlcnkgZmllbGQgaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisKKyAgQXJnczoKKyAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0VW5wYWNrZWRUeXBlcyBpbnN0YW5jZS4KKyAgIiIiCisgIG1lc3NhZ2UudW5wYWNrZWRfaW50MzIuZXh0ZW5kKFs2MDEsIDcwMV0pCisgIG1lc3NhZ2UudW5wYWNrZWRfaW50NjQuZXh0ZW5kKFs2MDIsIDcwMl0pCisgIG1lc3NhZ2UudW5wYWNrZWRfdWludDMyLmV4dGVuZChbNjAzLCA3MDNdKQorICBtZXNzYWdlLnVucGFja2VkX3VpbnQ2NC5leHRlbmQoWzYwNCwgNzA0XSkKKyAgbWVzc2FnZS51bnBhY2tlZF9zaW50MzIuZXh0ZW5kKFs2MDUsIDcwNV0pCisgIG1lc3NhZ2UudW5wYWNrZWRfc2ludDY0LmV4dGVuZChbNjA2LCA3MDZdKQorICBtZXNzYWdlLnVucGFja2VkX2ZpeGVkMzIuZXh0ZW5kKFs2MDcsIDcwN10pCisgIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQ2NC5leHRlbmQoWzYwOCwgNzA4XSkKKyAgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQzMi5leHRlbmQoWzYwOSwgNzA5XSkKKyAgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQ2NC5leHRlbmQoWzYxMCwgNzEwXSkKKyAgbWVzc2FnZS51bnBhY2tlZF9mbG9hdC5leHRlbmQoWzYxMS4wLCA3MTEuMF0pCisgIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlLmV4dGVuZChbNjEyLjAsIDcxMi4wXSkKKyAgbWVzc2FnZS51bnBhY2tlZF9ib29sLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQorICBtZXNzYWdlLnVucGFja2VkX2VudW0uZXh0ZW5kKFt1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWl0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXh0X2Zvcm1hdF90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGV4dF9mb3JtYXRfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43M2Q5N2QxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGV4dF9mb3JtYXRfdGVzdC5weQpAQCAtMCwwICsxLDU3MSBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdCBmb3IgZ29vZ2xlLnByb3RvYnVmLnRleHRfZm9ybWF0LiIiIgorCitfX2F1dGhvcl9fID0gJ2tlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpJworCitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IHJlCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0Citmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdF91dGlsCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCitmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfbXNldF9wYjIKKworCitjbGFzcyBUZXh0Rm9ybWF0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgIGRlZiBSZWFkR29sZGVuKHNlbGYsIGdvbGRlbl9maWxlbmFtZSk6CisgICAgZiA9IHRlc3RfdXRpbC5Hb2xkZW5GaWxlKGdvbGRlbl9maWxlbmFtZSkKKyAgICBnb2xkZW5fbGluZXMgPSBmLnJlYWRsaW5lcygpCisgICAgZi5jbG9zZSgpCisgICAgcmV0dXJuIGdvbGRlbl9saW5lcworCisgIGRlZiBDb21wYXJlVG9Hb2xkZW5GaWxlKHNlbGYsIHRleHQsIGdvbGRlbl9maWxlbmFtZSk6CisgICAgZ29sZGVuX2xpbmVzID0gc2VsZi5SZWFkR29sZGVuKGdvbGRlbl9maWxlbmFtZSkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlbkxpbmVzKHRleHQsIGdvbGRlbl9saW5lcykKKworICBkZWYgQ29tcGFyZVRvR29sZGVuVGV4dChzZWxmLCB0ZXh0LCBnb2xkZW5fdGV4dCk6CisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5MaW5lcyh0ZXh0LCBnb2xkZW5fdGV4dC5zcGxpdGxpbmVzKDEpKQorCisgIGRlZiBDb21wYXJlVG9Hb2xkZW5MaW5lcyhzZWxmLCB0ZXh0LCBnb2xkZW5fbGluZXMpOgorICAgIGFjdHVhbF9saW5lcyA9IHRleHQuc3BsaXRsaW5lcygxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2xpbmVzLCBhY3R1YWxfbGluZXMsCisgICAgICAiVGV4dCBkb2Vzbid0IG1hdGNoIGdvbGRlbi4gIERpZmY6XG4iICsKKyAgICAgICcnLmpvaW4oZGlmZmxpYi5uZGlmZihnb2xkZW5fbGluZXMsIGFjdHVhbF9saW5lcykpKQorCisgIGRlZiB0ZXN0UHJpbnRBbGxGaWVsZHMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMobWVzc2FnZSkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlbkZpbGUoCisgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSksCisgICAgICAndGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQnKQorCisgIGRlZiB0ZXN0UHJpbnRBbGxFeHRlbnNpb25zKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UpCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5GaWxlKAorICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcyh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSkpLAorICAgICAgJ3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQnKQorCisgIGRlZiB0ZXN0UHJpbnRNZXNzYWdlU2V0KHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQxXS5pID0gMjMKKyAgICBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0Ml0uc3RyID0gJ2ZvbycKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQodGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpLAorICAgICAgJ21lc3NhZ2Vfc2V0IHtcbicKKyAgICAgICcgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFdIHtcbicKKyAgICAgICcgICAgaTogMjNcbicKKyAgICAgICcgIH1cbicKKyAgICAgICcgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJdIHtcbicKKyAgICAgICcgICAgc3RyOiBcImZvb1wiXG4nCisgICAgICAnICB9XG4nCisgICAgICAnfVxuJykKKworICBkZWYgdGVzdFByaW50RXhvdGljKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDY0LmFwcGVuZCgtOTIyMzM3MjAzNjg1NDc3NTgwOCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NC5hcHBlbmQoMTg0NDY3NDQwNzM3MDk1NTE2MTUpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEyMy40NTYpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjNlMjIpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjNlLTE4KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnXDAwMFwwMDFcYVxiXGZcblxyXHRcdlxcXCciJykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQodSdcdTAwZmNcdWE3MWYnKQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgIHNlbGYuUmVtb3ZlUmVkdW5kYW50WmVyb3ModGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpKSwKKyAgICAgICdyZXBlYXRlZF9pbnQ2NDogLTkyMjMzNzIwMzY4NTQ3NzU4MDhcbicKKyAgICAgICdyZXBlYXRlZF91aW50NjQ6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1XG4nCisgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxMjMuNDU2XG4nCisgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzZSsyMlxuJworICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMS4yM2UtMThcbicKKyAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICcKKyAgICAgICAgJyJcXDAwMFxcMDAxXFwwMDdcXDAxMFxcMDE0XFxuXFxyXFx0XFwwMTNcXFxcXFxcJ1xcIiJcbicKKyAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJcXDMwM1xcMjc0XFwzNTJcXDIzNFxcMjM3IlxuJykKKworICBkZWYgdGVzdFByaW50TmVzdGVkTWVzc2FnZUFzT25lTGluZShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbXNnID0gbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQorICAgIG1zZy5iYiA9IDQyOworICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUpLAorICAgICAgICAncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeyBiYjogNDIgfScpCisKKyAgZGVmIHRlc3RQcmludFJlcGVhdGVkRmllbGRzQXNPbmVMaW5lKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMykKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoIkdvb2dsZSIpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCJadXJpY2giKQorICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUpLAorICAgICAgICAncmVwZWF0ZWRfaW50MzI6IDEgcmVwZWF0ZWRfaW50MzI6IDEgcmVwZWF0ZWRfaW50MzI6IDMgJworICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiR29vZ2xlIiByZXBlYXRlZF9zdHJpbmc6ICJadXJpY2giJykKKworICBkZWYgdGVzdFByaW50TmVzdGVkTmV3TGluZUluU3RyaW5nQXNPbmVMaW5lKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyA9ICJhXG5uZXdcbmxpbmUiCisgICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSksCisgICAgICAgICdvcHRpb25hbF9zdHJpbmc6ICJhXFxubmV3XFxubGluZSInKQorCisgIGRlZiB0ZXN0UHJpbnRNZXNzYWdlU2V0QXNPbmVMaW5lKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQxXS5pID0gMjMKKyAgICBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0Ml0uc3RyID0gJ2ZvbycKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlKSwKKyAgICAgICAgJ21lc3NhZ2Vfc2V0IHsnCisgICAgICAgICcgW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV0geycKKyAgICAgICAgJyBpOiAyMycKKyAgICAgICAgJyB9JworICAgICAgICAnIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJdIHsnCisgICAgICAgICcgc3RyOiBcImZvb1wiJworICAgICAgICAnIH0nCisgICAgICAgICcgfScpCisKKyAgZGVmIHRlc3RQcmludEV4b3RpY0FzT25lTGluZShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NC5hcHBlbmQoLTkyMjMzNzIwMzY4NTQ3NzU4MDgpCisgICAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxMjMuNDU2KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZTIyKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZS0xOCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ1wwMDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnIicpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKHUnXHUwMGZjXHVhNzFmJykKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCisgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKAorICAgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlKSksCisgICAgICAncmVwZWF0ZWRfaW50NjQ6IC05MjIzMzcyMDM2ODU0Nzc1ODA4JworICAgICAgJyByZXBlYXRlZF91aW50NjQ6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1JworICAgICAgJyByZXBlYXRlZF9kb3VibGU6IDEyMy40NTYnCisgICAgICAnIHJlcGVhdGVkX2RvdWJsZTogMS4yM2UrMjInCisgICAgICAnIHJlcGVhdGVkX2RvdWJsZTogMS4yM2UtMTgnCisgICAgICAnIHJlcGVhdGVkX3N0cmluZzogJworICAgICAgJyJcXDAwMFxcMDAxXFwwMDdcXDAxMFxcMDE0XFxuXFxyXFx0XFwwMTNcXFxcXFxcJ1xcIiInCisgICAgICAnIHJlcGVhdGVkX3N0cmluZzogIlxcMzAzXFwyNzRcXDM1MlxcMjM0XFwyMzciJykKKworICBkZWYgdGVzdFJvdW5kVHJpcEV4b3RpY0FzT25lTGluZShzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NC5hcHBlbmQoLTkyMjMzNzIwMzY4NTQ3NzU4MDgpCisgICAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxMjMuNDU2KQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZTIyKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZS0xOCkKKyAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ1wwMDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnIicpCisgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKHUnXHUwMGZjXHVhNzFmJykKKworICAgICMgVGVzdCBhc191dGY4ID0gRmFsc2UuCisgICAgd2lyZV90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAorICAgICAgICBtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlLCBhc191dGY4PUZhbHNlKQorICAgIHBhcnNlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dF9mb3JtYXQuTWVyZ2Uod2lyZV90ZXh0LCBwYXJzZWRfbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKKworICAgICMgVGVzdCBhc191dGY4ID0gVHJ1ZS4KKyAgICB3aXJlX3RleHQgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoCisgICAgICAgIG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUsIGFzX3V0Zjg9VHJ1ZSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKHdpcmVfdGV4dCwgcGFyc2VkX21lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RQcmludFJhd1V0ZjhTdHJpbmcoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCh1J1x1MDBmY1x1YTcxZicpCisgICAgdGV4dCA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBhc191dGY4ID0gVHJ1ZSkKKyAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQodGV4dCwgJ3JlcGVhdGVkX3N0cmluZzogIlwzMDNcMjc0XDM1MlwyMzRcMjM3IlxuJykKKyAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVzc2FnZVRvU3RyaW5nKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoKQorICAgIG1lc3NhZ2UuYyA9IDEyMworICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2M6IDEyM1xuJywgc3RyKG1lc3NhZ2UpKQorCisgIGRlZiBSZW1vdmVSZWR1bmRhbnRaZXJvcyhzZWxmLCB0ZXh0KToKKyAgICAjIFNvbWUgcGxhdGZvcm1zIHByaW50IDFlKzUgYXMgMWUrMDA1LiAgVGhpcyBpcyBmaW5lLCBidXQgd2UgbmVlZCB0byByZW1vdmUKKyAgICAjIHRoZXNlIHplcm9zIGluIG9yZGVyIHRvIG1hdGNoIHRoZSBnb2xkZW4gZmlsZS4KKyAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCdlKzAnLCdlKycpLnJlcGxhY2UoJ2UrMCcsJ2UrJykgXAorICAgICAgICAgICAgICAgLnJlcGxhY2UoJ2UtMCcsJ2UtJykucmVwbGFjZSgnZS0wJywnZS0nKQorICAgICMgRmxvYXRpbmcgcG9pbnQgZmllbGRzIGFyZSBwcmludGVkIHdpdGggLjAgc3VmZml4IGV2ZW4gaWYgdGhleSBhcmUKKyAgICAjIGFjdHVhbHkgaW50ZWdlciBudW1iZXJzLgorICAgIHRleHQgPSByZS5jb21waWxlKCdcLjAkJywgcmUuTVVMVElMSU5FKS5zdWIoJycsIHRleHQpCisgICAgcmV0dXJuIHRleHQKKworICBkZWYgdGVzdE1lcmdlR29sZGVuKHNlbGYpOgorICAgIGdvbGRlbl90ZXh0ID0gJ1xuJy5qb2luKHNlbGYuUmVhZEdvbGRlbigndGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQnKSkKKyAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKGdvbGRlbl90ZXh0LCBwYXJzZWRfbWVzc2FnZSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbHMobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RNZXJnZUdvbGRlbkV4dGVuc2lvbnMoc2VsZik6CisgICAgZ29sZGVuX3RleHQgPSAnXG4nLmpvaW4oc2VsZi5SZWFkR29sZGVuKAorICAgICAgICAndGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCcpKQorICAgIHBhcnNlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZShnb2xkZW5fdGV4dCwgcGFyc2VkX21lc3NhZ2UpCisKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVyZ2VBbGxGaWVsZHMoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMobWVzc2FnZSkKKyAgICBhc2NpaV90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpCisKKyAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKGFzY2lpX3RleHQsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisgICAgdGVzdF91dGlsLkV4cGVjdEFsbEZpZWxkc1NldChzZWxmLCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVyZ2VBbGxFeHRlbnNpb25zKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHRlc3RfdXRpbC5TZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UpCisgICAgYXNjaWlfdGV4dCA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKQorCisgICAgcGFyc2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKGFzY2lpX3RleHQsIHBhcnNlZF9tZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCisKKyAgZGVmIHRlc3RNZXJnZU1lc3NhZ2VTZXQoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAoJ3JlcGVhdGVkX3VpbnQ2NDogMVxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX3VpbnQ2NDogMlxuJykKKyAgICB0ZXh0X2Zvcm1hdC5NZXJnZSh0ZXh0LCBtZXNzYWdlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFsxXSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCisgICAgdGV4dCA9ICgnbWVzc2FnZV9zZXQge1xuJworICAgICAgICAgICAgJyAgW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV0ge1xuJworICAgICAgICAgICAgJyAgICBpOiAyM1xuJworICAgICAgICAgICAgJyAgfVxuJworICAgICAgICAgICAgJyAgW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMl0ge1xuJworICAgICAgICAgICAgJyAgICBzdHI6IFwiZm9vXCJcbicKKyAgICAgICAgICAgICcgIH1cbicKKyAgICAgICAgICAgICd9XG4nKQorICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCisgICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KKyAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIzLCBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0MV0uaSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygnZm9vJywgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDJdLnN0cikKKworICBkZWYgdGVzdE1lcmdlRXhvdGljKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gKCdyZXBlYXRlZF9pbnQ2NDogLTkyMjMzNzIwMzY4NTQ3NzU4MDhcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF91aW50NjQ6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1XG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxMjMuNDU2XG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzZSsyMlxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMS4yM2UtMThcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6IFxuJworICAgICAgICAgICAgJyJcXDAwMFxcMDAxXFwwMDdcXDAxMFxcMDE0XFxuXFxyXFx0XFwwMTNcXFxcXFxcJ1xcIiJcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJmb28iIFwnY29yZ2VcJyAiZ3JhdWx0IlxuJworICAgICAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzogIlxcMzAzXFwyNzRcXDM1MlxcMjM0XFwyMzciXG4nCisgICAgICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiXFx4YzNcXHhiYyJcbicKKyAgICAgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJceGMzXHhiYyJcbicpCisgICAgdGV4dF9mb3JtYXQuTWVyZ2UodGV4dCwgbWVzc2FnZSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxODQ0Njc0NDA3MzcwOTU1MTYxNSwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjMuNDU2LCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVswXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEuMjNlMjIsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMS4yM2UtMTgsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICdcMDAwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJyInLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdmb29jb3JnZWdyYXVsdCcsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdTAwZmNcdWE3MWYnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1syXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHUwMGZjJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbM10pCisKKyAgZGVmIHRlc3RNZXJnZUVtcHR5VGV4dChzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9ICcnCisgICAgdGV4dF9mb3JtYXQuTWVyZ2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydEVxdWFscyh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCksIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RNZXJnZUludmFsaWRVdGY4KHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ3JlcGVhdGVkX3N0cmluZzogIlxceGMzXFx4YzMiJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVyZ2VTaW5nbGVXb3JkKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ2ZvbycKKyAgICBzZWxmLmFzc2VydFJhaXNlc1dpdGhNZXNzYWdlKAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAoJzE6MSA6IE1lc3NhZ2UgdHlwZSAicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiBoYXMgbm8gZmllbGQgbmFtZWQgJworICAgICAgICAgJyJmb28iLicpLAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXJnZSwgdGV4dCwgbWVzc2FnZSkKKworICBkZWYgdGVzdE1lcmdlVW5rbm93bkZpZWxkKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ3Vua25vd25fZmllbGQ6IDhcbicKKyAgICBzZWxmLmFzc2VydFJhaXNlc1dpdGhNZXNzYWdlKAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAoJzE6MSA6IE1lc3NhZ2UgdHlwZSAicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiBoYXMgbm8gZmllbGQgbmFtZWQgJworICAgICAgICAgJyJ1bmtub3duX2ZpZWxkIi4nKSwKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVyZ2UsIHRleHQsIG1lc3NhZ2UpCisKKyAgZGVmIHRlc3RNZXJnZUJhZEV4dGVuc2lvbihzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKKyAgICB0ZXh0ID0gJ1t1bmtub3duX2V4dGVuc2lvbl06IDhcbicKKyAgICBzZWxmLmFzc2VydFJhaXNlc1dpdGhNZXNzYWdlKAorICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAorICAgICAgICAnMToyIDogRXh0ZW5zaW9uICJ1bmtub3duX2V4dGVuc2lvbiIgbm90IHJlZ2lzdGVyZWQuJywKKyAgICAgICAgdGV4dF9mb3JtYXQuTWVyZ2UsIHRleHQsIG1lc3NhZ2UpCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzV2l0aE1lc3NhZ2UoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCisgICAgICAgICgnMToyIDogTWVzc2FnZSB0eXBlICJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiIGRvZXMgbm90IGhhdmUgJworICAgICAgICAgJ2V4dGVuc2lvbnMuJyksCisgICAgICAgIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVyZ2VHcm91cE5vdENsb3NlZChzZWxmKToKKyAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCisgICAgdGV4dCA9ICdSZXBlYXRlZEdyb3VwOiA8JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzV2l0aE1lc3NhZ2UoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsICcxOjE2IDogRXhwZWN0ZWQgIj4iLicsCisgICAgICAgIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQorCisgICAgdGV4dCA9ICdSZXBlYXRlZEdyb3VwOiB7JworICAgIHNlbGYuYXNzZXJ0UmFpc2VzV2l0aE1lc3NhZ2UoCisgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsICcxOjE2IDogRXhwZWN0ZWQgIn0iLicsCisgICAgICAgIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiB0ZXN0TWVyZ2VFbXB0eUdyb3VwKHNlbGYpOgorICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ09wdGlvbmFsR3JvdXA6IHt9JworICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCisgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsZ3JvdXAnKSkKKworICAgIG1lc3NhZ2UuQ2xlYXIoKQorCisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAnT3B0aW9uYWxHcm91cDogPD4nCisgICAgdGV4dF9mb3JtYXQuTWVyZ2UodGV4dCwgbWVzc2FnZSkKKyAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxncm91cCcpKQorCisgIGRlZiB0ZXN0TWVyZ2VCYWRFbnVtVmFsdWUoc2VsZik6CisgICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQorICAgIHRleHQgPSAnb3B0aW9uYWxfbmVzdGVkX2VudW06IEJBUlInCisgICAgc2VsZi5hc3NlcnRSYWlzZXNXaXRoTWVzc2FnZSgKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgKCcxOjIzIDogRW51bSB0eXBlICJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bSIgJworICAgICAgICAgJ2hhcyBubyB2YWx1ZSBuYW1lZCBCQVJSLicpLAorICAgICAgICB0ZXh0X2Zvcm1hdC5NZXJnZSwgdGV4dCwgbWVzc2FnZSkKKworICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKKyAgICB0ZXh0ID0gJ29wdGlvbmFsX25lc3RlZF9lbnVtOiAxMDAnCisgICAgc2VsZi5hc3NlcnRSYWlzZXNXaXRoTWVzc2FnZSgKKyAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKKyAgICAgICAgKCcxOjIzIDogRW51bSB0eXBlICJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bSIgJworICAgICAgICAgJ2hhcyBubyB2YWx1ZSB3aXRoIG51bWJlciAxMDAuJyksCisgICAgICAgIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQorCisgIGRlZiBhc3NlcnRSYWlzZXNXaXRoTWVzc2FnZShzZWxmLCBlX2NsYXNzLCBlLCBmdW5jLCAqYXJncywgKiprd2FyZ3MpOgorICAgICIiIlNhbWUgYXMgYXNzZXJ0UmFpc2VzLCBidXQgYWxzbyBjb21wYXJlcyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuIiIiCisgICAgaWYgaGFzYXR0cihlX2NsYXNzLCAnX19uYW1lX18nKToKKyAgICAgIGV4Y19uYW1lID0gZV9jbGFzcy5fX25hbWVfXworICAgIGVsc2U6CisgICAgICBleGNfbmFtZSA9IHN0cihlX2NsYXNzKQorCisgICAgdHJ5OgorICAgICAgZnVuYygqYXJncywgKiprd2FyZ3MpCisgICAgZXhjZXB0IGVfY2xhc3MsIGV4cHI6CisgICAgICBpZiBzdHIoZXhwcikgIT0gZToKKyAgICAgICAgbXNnID0gJyVzIHJhaXNlZCwgYnV0IHdpdGggd3JvbmcgbWVzc2FnZTogIiVzIiBpbnN0ZWFkIG9mICIlcyInCisgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbihtc2cgJSAoZXhjX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKGV4cHIpLmVuY29kZSgnc3RyaW5nX2VzY2FwZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZW5jb2RlKCdzdHJpbmdfZXNjYXBlJykpKQorICAgICAgcmV0dXJuCisgICAgZWxzZToKKyAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbignJXMgbm90IHJhaXNlZCcgJSBleGNfbmFtZSkKKworCitjbGFzcyBUb2tlbml6ZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdFNpbXBsZVRva2VuQ2FzZXMoc2VsZik6CisgICAgdGV4dCA9ICgnaWRlbnRpZmllcjE6InN0cmluZzEiXG4gICAgIFxuXG4nCisgICAgICAgICAgICAnaWRlbnRpZmllcjIgOiBcbiBcbjEyMyAgXG4gIGlkZW50aWZpZXIzIDpcJ3N0cmluZ1wnXG4nCisgICAgICAgICAgICAnaWRlbnRpZmlFUl80IDogMS4xZSsyIElENTotMC4yMyBJRDY6XCdhYWFhXFxcJ2JiYmJcJ1xuJworICAgICAgICAgICAgJ0lENyA6ICJhYVxcImJiIlxuXG5cblxuIElEODoge0E6aW5mIEI6LWluZiBDOnRydWUgRDpmYWxzZX1cbicKKyAgICAgICAgICAgICdJRDk6IDIyIElEMTA6IC0xMTExMTExMTExMTExMTExMTEgSUQxMTogLTIyXG4nCisgICAgICAgICAgICAnSUQxMjogMjIyMjIyMjIyMjIyMjIyMjIyMiAnCisgICAgICAgICAgICAnZmFsc2VfYm9vbDogIDAgdHJ1ZV9CT09MOnQgXG4gdHJ1ZV9ib29sMTogIDEgZmFsc2VfQk9PTDE6ZiAnICkKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5fVG9rZW5pemVyKHRleHQpCisgICAgbWV0aG9kcyA9IFsodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnaWRlbnRpZmllcjEnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZVN0cmluZywgJ3N0cmluZzEnKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdpZGVudGlmaWVyMicpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSW50MzIsIDEyMyksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnaWRlbnRpZmllcjMnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZVN0cmluZywgJ3N0cmluZycpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2lkZW50aWZpRVJfNCcpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIDEuMWUrMiksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQ1JyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVGbG9hdCwgLTAuMjMpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lENicpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lU3RyaW5nLCAnYWFhYVwnYmJiYicpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lENycpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lU3RyaW5nLCAnYWFcImJiJyksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQ4JyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAneycsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnQScpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIHRleHRfZm9ybWF0Ll9JTkZJTklUWSksCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnQicpLAorICAgICAgICAgICAgICAgJzonLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIC10ZXh0X2Zvcm1hdC5fSU5GSU5JVFkpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0MnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUJvb2wsIFRydWUpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0QnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUJvb2wsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICd9JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDknKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZVVpbnQzMiwgMjIpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lEMTAnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUludDY0LCAtMTExMTExMTExMTExMTExMTExKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDExJyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJbnQzMiwgLTIyKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDEyJyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVVaW50NjQsIDIyMjIyMjIyMjIyMjIyMjIyMjIpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2ZhbHNlX2Jvb2wnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUJvb2wsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICd0cnVlX0JPT0wnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUJvb2wsIFRydWUpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ3RydWVfYm9vbDEnKSwKKyAgICAgICAgICAgICAgICc6JywKKyAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUJvb2wsIFRydWUpLAorICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2ZhbHNlX0JPT0wxJyksCisgICAgICAgICAgICAgICAnOicsCisgICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVCb29sLCBGYWxzZSldCisKKyAgICBpID0gMAorICAgIHdoaWxlIG5vdCB0b2tlbml6ZXIuQXRFbmQoKToKKyAgICAgIG0gPSBtZXRob2RzW2ldCisgICAgICBpZiB0eXBlKG0pID09IHN0cjoKKyAgICAgICAgdG9rZW4gPSB0b2tlbml6ZXIudG9rZW4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0b2tlbiwgbSkKKyAgICAgICAgdG9rZW5pemVyLk5leHRUb2tlbigpCisgICAgICBlbHNlOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMV0sIG1bMF0oKSkKKyAgICAgIGkgKz0gMQorCisgIGRlZiB0ZXN0Q29uc3VtZUludGVnZXJzKHNlbGYpOgorICAgICMgVGhpcyB0ZXN0IG9ubHkgdGVzdHMgdGhlIGZhaWx1cmVzIGluIHRoZSBpbnRlZ2VyIHBhcnNpbmcgbWV0aG9kcyBhcyB3ZWxsCisgICAgIyBhcyB0aGUgJzAnIHNwZWNpYWwgY2FzZXMuCisgICAgaW50NjRfbWF4ID0gKDEgPDwgNjMpIC0gMQorICAgIHVpbnQzMl9tYXggPSAoMSA8PCAzMikgLSAxCisgICAgdGV4dCA9ICctMSAlZCAlZCcgJSAodWludDMyX21heCArIDEsIGludDY0X21heCArIDEpCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lVWludDMyKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lVWludDY0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIHRva2VuaXplci5Db25zdW1lSW50MzIoKSkKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lVWludDMyKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lSW50MzIpCisgICAgc2VsZi5hc3NlcnRFcXVhbCh1aW50MzJfbWF4ICsgMSwgdG9rZW5pemVyLkNvbnN1bWVJbnQ2NCgpKQorCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVJbnQ2NCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGludDY0X21heCArIDEsIHRva2VuaXplci5Db25zdW1lVWludDY0KCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKHRva2VuaXplci5BdEVuZCgpKQorCisgICAgdGV4dCA9ICctMCAtMCAwIDAnCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdG9rZW5pemVyLkNvbnN1bWVVaW50MzIoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHRva2VuaXplci5Db25zdW1lVWludDY0KCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQzMigpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdG9rZW5pemVyLkNvbnN1bWVVaW50NjQoKSkKKyAgICBzZWxmLmFzc2VydFRydWUodG9rZW5pemVyLkF0RW5kKCkpCisKKyAgZGVmIHRlc3RDb25zdW1lQnl0ZVN0cmluZyhzZWxmKToKKyAgICB0ZXh0ID0gJyJzdHJpbmcxXCcnCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lQnl0ZVN0cmluZykKKworICAgIHRleHQgPSAnc3RyaW5nMSInCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lQnl0ZVN0cmluZykKKworICAgIHRleHQgPSAnXG4iXFx4dCInCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lQnl0ZVN0cmluZykKKworICAgIHRleHQgPSAnXG4iXFwiJworICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0Ll9Ub2tlbml6ZXIodGV4dCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCisKKyAgICB0ZXh0ID0gJ1xuIlxceCInCisgICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0KQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lQnl0ZVN0cmluZykKKworICBkZWYgdGVzdENvbnN1bWVCb29sKHNlbGYpOgorICAgIHRleHQgPSAnbm90LWEtYm9vbCcKKyAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5fVG9rZW5pemVyKHRleHQpCisgICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVCb29sKQorCisgIGRlZiB0ZXN0SW5mTmFuKHNlbGYpOgorICAgICMgTWFrZSBzdXJlIG91ciBpbmZpbml0eSBhbmQgTmFOIGRlZmluaXRpb25zIGFyZSBzb3VuZC4KKyAgICBzZWxmLmFzc2VydEVxdWFscyhmbG9hdCwgdHlwZSh0ZXh0X2Zvcm1hdC5fSU5GSU5JVFkpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGZsb2F0LCB0eXBlKHRleHRfZm9ybWF0Ll9OQU4pKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXh0X2Zvcm1hdC5fTkFOICE9IHRleHRfZm9ybWF0Ll9OQU4pCisKKyAgICBpbmZfdGltZXNfemVybyA9IHRleHRfZm9ybWF0Ll9JTkZJTklUWSAqIDAKKyAgICBzZWxmLmFzc2VydFRydWUoaW5mX3RpbWVzX3plcm8gIT0gaW5mX3RpbWVzX3plcm8pCisgICAgc2VsZi5hc3NlcnRUcnVlKHRleHRfZm9ybWF0Ll9JTkZJTklUWSA+IDApCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90eXBlX2NoZWNrZXJzLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdHlwZV9jaGVja2Vycy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjNjZDRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdHlwZV9jaGVja2Vycy5weQpAQCAtMCwwICsxLDI4NiBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIlByb3ZpZGVzIHR5cGUgY2hlY2tpbmcgcm91dGluZXMuCisKK1RoaXMgbW9kdWxlIGRlZmluZXMgdHlwZSBjaGVja2luZyB1dGlsaXRpZXMgaW4gdGhlIGZvcm1zIG9mIGRpY3Rpb25hcmllczoKKworVkFMVUVfQ0hFQ0tFUlM6IEEgZGljdGlvbmFyeSBvZiBmaWVsZCB0eXBlcyBhbmQgYSB2YWx1ZSB2YWxpZGF0aW9uIG9iamVjdC4KK1RZUEVfVE9fQllURV9TSVpFX0ZOOiBBIGRpY3Rpb25hcnkgd2l0aCBmaWVsZCB0eXBlcyBhbmQgYSBzaXplIGNvbXB1dGluZworICBmdW5jdGlvbi4KK1RZUEVfVE9fU0VSSUFMSVpFX01FVEhPRDogQSBkaWN0aW9uYXJ5IHdpdGggZmllbGQgdHlwZXMgYW5kIHNlcmlhbGl6YXRpb24KKyAgZnVuY3Rpb24uCitGSUVMRF9UWVBFX1RPX1dJUkVfVFlQRTogQSBkaWN0aW9uYXJ5IHdpdGggZmllbGQgdHlwZWQgYW5kIHRoZWlyCisgIGNvcmVzcG9uZGluZyB3aXJlIHR5cGVzLgorVFlQRV9UT19ERVNFUklBTElaRV9NRVRIT0Q6IEEgZGljdGlvbmFyeSB3aXRoIGZpZWxkIHR5cGVzIGFuZCBkZXNlcmlhbGl6YXRpb24KKyAgZnVuY3Rpb24uCisiIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGRlY29kZXIKK2Zyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbmNvZGVyCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCisKK19GaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcgorCisKK2RlZiBHZXRUeXBlQ2hlY2tlcihjcHBfdHlwZSwgZmllbGRfdHlwZSk6CisgICIiIlJldHVybnMgYSB0eXBlIGNoZWNrZXIgZm9yIGEgbWVzc2FnZSBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLgorCisgIEFyZ3M6CisgICAgY3BwX3R5cGU6IEMrKyB0eXBlIG9mIHRoZSBmaWVsZCAoc2VlIGRlc2NyaXB0b3IucHkpLgorICAgIGZpZWxkX3R5cGU6IFByb3RvY29sIG1lc3NhZ2UgZmllbGQgdHlwZSAoc2VlIGRlc2NyaXB0b3IucHkpLgorCisgIFJldHVybnM6CisgICAgQW4gaW5zdGFuY2Ugb2YgVHlwZUNoZWNrZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSB0eXBlcworICAgIG9mIHZhbHVlcyBhc3NpZ25lZCB0byBhIGZpZWxkIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgIiIiCisgIGlmIChjcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfU1RSSU5HIGFuZAorICAgICAgZmllbGRfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HKToKKyAgICByZXR1cm4gVW5pY29kZVZhbHVlQ2hlY2tlcigpCisgIHJldHVybiBfVkFMVUVfQ0hFQ0tFUlNbY3BwX3R5cGVdCisKKworIyBOb25lIG9mIHRoZSB0eXBlY2hlY2tlcnMgYmVsb3cgbWFrZSBhbnkgYXR0ZW1wdCB0byBndWFyZCBhZ2FpbnN0IHBlb3BsZQorIyBzdWJjbGFzc2luZyBidWlsdGluIHR5cGVzIGFuZCBkb2luZyB3ZWlyZCB0aGluZ3MuICBXZSdyZSBub3QgdHJ5aW5nIHRvCisjIHByb3RlY3QgYWdhaW5zdCBtYWxpY2lvdXMgY2xpZW50cyBoZXJlLCBqdXN0IHBlb3BsZSBhY2NpZGVudGFsbHkgc2hvb3RpbmcKKyMgdGhlbXNlbHZlcyBpbiB0aGUgZm9vdCBpbiBvYnZpb3VzIHdheXMuCisKK2NsYXNzIFR5cGVDaGVja2VyKG9iamVjdCk6CisKKyAgIiIiVHlwZSBjaGVja2VyIHVzZWQgdG8gY2F0Y2ggdHlwZSBlcnJvcnMgYXMgZWFybHkgYXMgcG9zc2libGUKKyAgd2hlbiB0aGUgY2xpZW50IGlzIHNldHRpbmcgc2NhbGFyIGZpZWxkcyBpbiBwcm90b2NvbCBtZXNzYWdlcy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsICphY2NlcHRhYmxlX3R5cGVzKToKKyAgICBzZWxmLl9hY2NlcHRhYmxlX3R5cGVzID0gYWNjZXB0YWJsZV90eXBlcworCisgIGRlZiBDaGVja1ZhbHVlKHNlbGYsIHByb3Bvc2VkX3ZhbHVlKToKKyAgICBpZiBub3QgaXNpbnN0YW5jZShwcm9wb3NlZF92YWx1ZSwgc2VsZi5fYWNjZXB0YWJsZV90eXBlcyk6CisgICAgICBtZXNzYWdlID0gKCclLjEwMjRyIGhhcyB0eXBlICVzLCBidXQgZXhwZWN0ZWQgb25lIG9mOiAlcycgJQorICAgICAgICAgICAgICAgICAocHJvcG9zZWRfdmFsdWUsIHR5cGUocHJvcG9zZWRfdmFsdWUpLCBzZWxmLl9hY2NlcHRhYmxlX3R5cGVzKSkKKyAgICAgIHJhaXNlIFR5cGVFcnJvcihtZXNzYWdlKQorCisKKyMgSW50VmFsdWVDaGVja2VyIGFuZCBpdHMgc3ViY2xhc3NlcyBwZXJmb3JtIGludGVnZXIgdHlwZS1jaGVja3MKKyMgYW5kIGJvdW5kcy1jaGVja3MuCitjbGFzcyBJbnRWYWx1ZUNoZWNrZXIob2JqZWN0KToKKworICAiIiJDaGVja2VyIHVzZWQgZm9yIGludGVnZXIgZmllbGRzLiAgUGVyZm9ybXMgdHlwZS1jaGVjayBhbmQgcmFuZ2UgY2hlY2suIiIiCisKKyAgZGVmIENoZWNrVmFsdWUoc2VsZiwgcHJvcG9zZWRfdmFsdWUpOgorICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb3Bvc2VkX3ZhbHVlLCAoaW50LCBsb25nKSk6CisgICAgICBtZXNzYWdlID0gKCclLjEwMjRyIGhhcyB0eXBlICVzLCBidXQgZXhwZWN0ZWQgb25lIG9mOiAlcycgJQorICAgICAgICAgICAgICAgICAocHJvcG9zZWRfdmFsdWUsIHR5cGUocHJvcG9zZWRfdmFsdWUpLCAoaW50LCBsb25nKSkpCisgICAgICByYWlzZSBUeXBlRXJyb3IobWVzc2FnZSkKKyAgICBpZiBub3Qgc2VsZi5fTUlOIDw9IHByb3Bvc2VkX3ZhbHVlIDw9IHNlbGYuX01BWDoKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1ZhbHVlIG91dCBvZiByYW5nZTogJWQnICUgcHJvcG9zZWRfdmFsdWUpCisKKworY2xhc3MgVW5pY29kZVZhbHVlQ2hlY2tlcihvYmplY3QpOgorCisgICIiIkNoZWNrZXIgdXNlZCBmb3Igc3RyaW5nIGZpZWxkcy4iIiIKKworICBkZWYgQ2hlY2tWYWx1ZShzZWxmLCBwcm9wb3NlZF92YWx1ZSk6CisgICAgaWYgbm90IGlzaW5zdGFuY2UocHJvcG9zZWRfdmFsdWUsIChzdHIsIHVuaWNvZGUpKToKKyAgICAgIG1lc3NhZ2UgPSAoJyUuMTAyNHIgaGFzIHR5cGUgJXMsIGJ1dCBleHBlY3RlZCBvbmUgb2Y6ICVzJyAlCisgICAgICAgICAgICAgICAgIChwcm9wb3NlZF92YWx1ZSwgdHlwZShwcm9wb3NlZF92YWx1ZSksIChzdHIsIHVuaWNvZGUpKSkKKyAgICAgIHJhaXNlIFR5cGVFcnJvcihtZXNzYWdlKQorCisgICAgIyBJZiB0aGUgdmFsdWUgaXMgb2YgdHlwZSAnc3RyJyBtYWtlIHN1cmUgdGhhdCBpdCBpcyBpbiA3LWJpdCBBU0NJSQorICAgICMgZW5jb2RpbmcuCisgICAgaWYgaXNpbnN0YW5jZShwcm9wb3NlZF92YWx1ZSwgc3RyKToKKyAgICAgIHRyeToKKyAgICAgICAgdW5pY29kZShwcm9wb3NlZF92YWx1ZSwgJ2FzY2lpJykKKyAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyUuMTAyNHIgaGFzIHR5cGUgc3RyLCBidXQgaXNuXCd0IGluIDctYml0IEFTQ0lJICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZW5jb2RpbmcuIE5vbi1BU0NJSSBzdHJpbmdzIG11c3QgYmUgY29udmVydGVkIHRvICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAndW5pY29kZSBvYmplY3RzIGJlZm9yZSBiZWluZyBhZGRlZC4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9zZWRfdmFsdWUpKQorCisKK2NsYXNzIEludDMyVmFsdWVDaGVja2VyKEludFZhbHVlQ2hlY2tlcik6CisgICMgV2UncmUgc3VyZSB0byB1c2UgaW50cyBpbnN0ZWFkIG9mIGxvbmdzIGhlcmUgc2luY2UgY29tcGFyaXNvbiBtYXkgYmUgbW9yZQorICAjIGVmZmljaWVudC4KKyAgX01JTiA9IC0yMTQ3NDgzNjQ4CisgIF9NQVggPSAyMTQ3NDgzNjQ3CisKKworY2xhc3MgVWludDMyVmFsdWVDaGVja2VyKEludFZhbHVlQ2hlY2tlcik6CisgIF9NSU4gPSAwCisgIF9NQVggPSAoMSA8PCAzMikgLSAxCisKKworY2xhc3MgSW50NjRWYWx1ZUNoZWNrZXIoSW50VmFsdWVDaGVja2VyKToKKyAgX01JTiA9IC0oMSA8PCA2MykKKyAgX01BWCA9ICgxIDw8IDYzKSAtIDEKKworCitjbGFzcyBVaW50NjRWYWx1ZUNoZWNrZXIoSW50VmFsdWVDaGVja2VyKToKKyAgX01JTiA9IDAKKyAgX01BWCA9ICgxIDw8IDY0KSAtIDEKKworCisjIFR5cGUtY2hlY2tlcnMgZm9yIGFsbCBzY2FsYXIgQ1BQVFlQRXMuCitfVkFMVUVfQ0hFQ0tFUlMgPSB7CisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0lOVDMyOiBJbnQzMlZhbHVlQ2hlY2tlcigpLAorICAgIF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9JTlQ2NDogSW50NjRWYWx1ZUNoZWNrZXIoKSwKKyAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfVUlOVDMyOiBVaW50MzJWYWx1ZUNoZWNrZXIoKSwKKyAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfVUlOVDY0OiBVaW50NjRWYWx1ZUNoZWNrZXIoKSwKKyAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRE9VQkxFOiBUeXBlQ2hlY2tlcigKKyAgICAgICAgZmxvYXQsIGludCwgbG9uZyksCisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0ZMT0FUOiBUeXBlQ2hlY2tlcigKKyAgICAgICAgZmxvYXQsIGludCwgbG9uZyksCisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0JPT0w6IFR5cGVDaGVja2VyKGJvb2wsIGludCksCisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0VOVU06IEludDMyVmFsdWVDaGVja2VyKCksCisgICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1NUUklORzogVHlwZUNoZWNrZXIoc3RyKSwKKyAgICB9CisKKworIyBNYXAgZnJvbSBmaWVsZCB0eXBlIHRvIGEgZnVuY3Rpb24gRiwgc3VjaCB0aGF0IEYoZmllbGRfbnVtLCB2YWx1ZSkKKyMgZ2l2ZXMgdGhlIHRvdGFsIGJ5dGUgc2l6ZSBmb3IgYSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gIFRoaXMKKyMgYnl0ZSBzaXplIGluY2x1ZGVzIHRhZyBpbmZvcm1hdGlvbiBhbmQgYW55IG90aGVyIGFkZGl0aW9uYWwgc3BhY2UKKyMgYXNzb2NpYXRlZCB3aXRoIHNlcmlhbGl6aW5nICJ2YWx1ZSIuCitUWVBFX1RPX0JZVEVfU0laRV9GTiA9IHsKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFOiB3aXJlX2Zvcm1hdC5Eb3VibGVCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRkxPQVQ6IHdpcmVfZm9ybWF0LkZsb2F0Qnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0OiB3aXJlX2Zvcm1hdC5JbnQ2NEJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQ6IHdpcmVfZm9ybWF0LlVJbnQ2NEJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQzMjogd2lyZV9mb3JtYXQuSW50MzJCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NDogd2lyZV9mb3JtYXQuRml4ZWQ2NEJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDMyOiB3aXJlX2Zvcm1hdC5GaXhlZDMyQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6IHdpcmVfZm9ybWF0LkJvb2xCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HOiB3aXJlX2Zvcm1hdC5TdHJpbmdCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6IHdpcmVfZm9ybWF0Lkdyb3VwQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0U6IHdpcmVfZm9ybWF0Lk1lc3NhZ2VCeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6IHdpcmVfZm9ybWF0LkJ5dGVzQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMjogd2lyZV9mb3JtYXQuVUludDMyQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU06IHdpcmVfZm9ybWF0LkVudW1CeXRlU2l6ZSwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVEMzI6IHdpcmVfZm9ybWF0LlNGaXhlZDMyQnl0ZVNpemUsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDY0OiB3aXJlX2Zvcm1hdC5TRml4ZWQ2NEJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UMzI6IHdpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQ6IHdpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplCisgICAgfQorCisKKyMgTWFwcyBmcm9tIGZpZWxkIHR5cGVzIHRvIGVuY29kZXIgY29uc3RydWN0b3JzLgorVFlQRV9UT19FTkNPREVSID0geworICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9ET1VCTEU6IGVuY29kZXIuRG91YmxlRW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRkxPQVQ6IGVuY29kZXIuRmxvYXRFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQ2NDogZW5jb2Rlci5JbnQ2NEVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQ2NDogZW5jb2Rlci5VSW50NjRFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQzMjogZW5jb2Rlci5JbnQzMkVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVENjQ6IGVuY29kZXIuRml4ZWQ2NEVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVEMzI6IGVuY29kZXIuRml4ZWQzMkVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6IGVuY29kZXIuQm9vbEVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzogZW5jb2Rlci5TdHJpbmdFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUDogZW5jb2Rlci5Hcm91cEVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0U6IGVuY29kZXIuTWVzc2FnZUVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOiBlbmNvZGVyLkJ5dGVzRW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDMyOiBlbmNvZGVyLlVJbnQzMkVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU06IGVuY29kZXIuRW51bUVuY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDMyOiBlbmNvZGVyLlNGaXhlZDMyRW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVENjQ6IGVuY29kZXIuU0ZpeGVkNjRFbmNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UMzI6IGVuY29kZXIuU0ludDMyRW5jb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDY0OiBlbmNvZGVyLlNJbnQ2NEVuY29kZXIsCisgICAgfQorCisKKyMgTWFwcyBmcm9tIGZpZWxkIHR5cGVzIHRvIHNpemVyIGNvbnN0cnVjdG9ycy4KK1RZUEVfVE9fU0laRVIgPSB7CisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0RPVUJMRTogZW5jb2Rlci5Eb3VibGVTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRkxPQVQ6IGVuY29kZXIuRmxvYXRTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQ6IGVuY29kZXIuSW50NjRTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0OiBlbmNvZGVyLlVJbnQ2NFNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQzMjogZW5jb2Rlci5JbnQzMlNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDY0OiBlbmNvZGVyLkZpeGVkNjRTaXplciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQzMjogZW5jb2Rlci5GaXhlZDMyU2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6IGVuY29kZXIuQm9vbFNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6IGVuY29kZXIuU3RyaW5nU2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOiBlbmNvZGVyLkdyb3VwU2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0U6IGVuY29kZXIuTWVzc2FnZVNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUzogZW5jb2Rlci5CeXRlc1NpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UMzI6IGVuY29kZXIuVUludDMyU2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU06IGVuY29kZXIuRW51bVNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQzMjogZW5jb2Rlci5TRml4ZWQzMlNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NDogZW5jb2Rlci5TRml4ZWQ2NFNpemVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UMzI6IGVuY29kZXIuU0ludDMyU2l6ZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQ2NDogZW5jb2Rlci5TSW50NjRTaXplciwKKyAgICB9CisKKworIyBNYXBzIGZyb20gZmllbGQgdHlwZSB0byBhIGRlY29kZXIgY29uc3RydWN0b3IuCitUWVBFX1RPX0RFQ09ERVIgPSB7CisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0RPVUJMRTogZGVjb2Rlci5Eb3VibGVEZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVDogZGVjb2Rlci5GbG9hdERlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0OiBkZWNvZGVyLkludDY0RGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0OiBkZWNvZGVyLlVJbnQ2NERlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyOiBkZWNvZGVyLkludDMyRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NDogZGVjb2Rlci5GaXhlZDY0RGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQzMjogZGVjb2Rlci5GaXhlZDMyRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDogZGVjb2Rlci5Cb29sRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HOiBkZWNvZGVyLlN0cmluZ0RlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOiBkZWNvZGVyLkdyb3VwRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRTogZGVjb2Rlci5NZXNzYWdlRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6IGRlY29kZXIuQnl0ZXNEZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UMzI6IGRlY29kZXIuVUludDMyRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTTogZGVjb2Rlci5FbnVtRGVjb2RlciwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVEMzI6IGRlY29kZXIuU0ZpeGVkMzJEZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NDogZGVjb2Rlci5TRml4ZWQ2NERlY29kZXIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMjogZGVjb2Rlci5TSW50MzJEZWNvZGVyLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQ6IGRlY29kZXIuU0ludDY0RGVjb2RlciwKKyAgICB9CisKKyMgTWFwcyBmcm9tIGZpZWxkIHR5cGUgdG8gZXhwZWN0ZWQgd2lyZXR5cGUuCitGSUVMRF9UWVBFX1RPX1dJUkVfVFlQRSA9IHsKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQ6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0OiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVENjQ6IHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVEMzI6IHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HOgorICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQLAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFOgorICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6CisgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UMzI6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTTogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQzMjogd2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwKKyAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVENjQ6IHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsCisgICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMjogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAorICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQ6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKKyAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93aXJlX2Zvcm1hdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dpcmVfZm9ybWF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5NDFmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93aXJlX2Zvcm1hdC5weQpAQCAtMCwwICsxLDI2OCBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkNvbnN0YW50cyBhbmQgc3RhdGljIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHByb3RvY29sIGJ1ZmZlciB3aXJlIGZvcm1hdC4iIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworaW1wb3J0IHN0cnVjdAorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCisKKworVEFHX1RZUEVfQklUUyA9IDMgICMgTnVtYmVyIG9mIGJpdHMgdXNlZCB0byBob2xkIHR5cGUgaW5mbyBpbiBhIHByb3RvIHRhZy4KK1RBR19UWVBFX01BU0sgPSAoMSA8PCBUQUdfVFlQRV9CSVRTKSAtIDEgICMgMHg3CisKKyMgVGhlc2UgbnVtYmVycyBpZGVudGlmeSB0aGUgd2lyZSB0eXBlIG9mIGEgcHJvdG9jb2wgYnVmZmVyIHZhbHVlLgorIyBXZSB1c2UgdGhlIGxlYXN0LXNpZ25pZmljYW50IFRBR19UWVBFX0JJVFMgYml0cyBvZiB0aGUgdmFyaW50LWVuY29kZWQKKyMgdGFnLWFuZC10eXBlIHRvIHN0b3JlIG9uZSBvZiB0aGVzZSBXSVJFVFlQRV8qIGNvbnN0YW50cy4KKyMgVGhlc2UgdmFsdWVzIG11c3QgbWF0Y2ggV2lyZVR5cGUgZW51bSBpbiBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaC4KK1dJUkVUWVBFX1ZBUklOVCA9IDAKK1dJUkVUWVBFX0ZJWEVENjQgPSAxCitXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEID0gMgorV0lSRVRZUEVfU1RBUlRfR1JPVVAgPSAzCitXSVJFVFlQRV9FTkRfR1JPVVAgPSA0CitXSVJFVFlQRV9GSVhFRDMyID0gNQorX1dJUkVUWVBFX01BWCA9IDUKKworCisjIEJvdW5kcyBmb3IgdmFyaW91cyBpbnRlZ2VyIHR5cGVzLgorSU5UMzJfTUFYID0gaW50KCgxIDw8IDMxKSAtIDEpCitJTlQzMl9NSU4gPSBpbnQoLSgxIDw8IDMxKSkKK1VJTlQzMl9NQVggPSAoMSA8PCAzMikgLSAxCisKK0lOVDY0X01BWCA9ICgxIDw8IDYzKSAtIDEKK0lOVDY0X01JTiA9IC0oMSA8PCA2MykKK1VJTlQ2NF9NQVggPSAoMSA8PCA2NCkgLSAxCisKKyMgInN0cnVjdCIgZm9ybWF0IHN0cmluZ3MgdGhhdCB3aWxsIGVuY29kZS9kZWNvZGUgdGhlIHNwZWNpZmllZCBmb3JtYXRzLgorRk9STUFUX1VJTlQzMl9MSVRUTEVfRU5ESUFOID0gJzxJJworRk9STUFUX1VJTlQ2NF9MSVRUTEVfRU5ESUFOID0gJzxRJworRk9STUFUX0ZMT0FUX0xJVFRMRV9FTkRJQU4gPSAnPGYnCitGT1JNQVRfRE9VQkxFX0xJVFRMRV9FTkRJQU4gPSAnPGQnCisKKworIyBXZSdsbCBoYXZlIHRvIHByb3ZpZGUgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBvZiBBcHBlbmRMaXR0bGVFbmRpYW4qKCkgb24KKyMgYW55IGFyY2hpdGVjdHVyZXMgd2hlcmUgdGhlc2UgY2hlY2tzIGZhaWwuCitpZiBzdHJ1Y3QuY2FsY3NpemUoRk9STUFUX1VJTlQzMl9MSVRUTEVfRU5ESUFOKSAhPSA0OgorICByYWlzZSBBc3NlcnRpb25FcnJvcignRm9ybWF0ICJJIiBpcyBub3QgYSAzMi1iaXQgbnVtYmVyLicpCitpZiBzdHJ1Y3QuY2FsY3NpemUoRk9STUFUX1VJTlQ2NF9MSVRUTEVfRU5ESUFOKSAhPSA4OgorICByYWlzZSBBc3NlcnRpb25FcnJvcignRm9ybWF0ICJRIiBpcyBub3QgYSA2NC1iaXQgbnVtYmVyLicpCisKKworZGVmIFBhY2tUYWcoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpOgorICAiIiJSZXR1cm5zIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHRoYXQgZW5jb2RlcyB0aGUgZmllbGQgbnVtYmVyIGFuZAorICB3aXJlIHR5cGUgaW5mb3JtYXRpb24gaW4gc3RhbmRhcmQgcHJvdG9jb2wgbWVzc2FnZSB3aXJlIGZvcm1hdC4KKworICBBcmdzOgorICAgIGZpZWxkX251bWJlcjogRXhwZWN0ZWQgdG8gYmUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgWzEsIDEgPDwgMjkpCisgICAgd2lyZV90eXBlOiBPbmUgb2YgdGhlIFdJUkVUWVBFXyogY29uc3RhbnRzLgorICAiIiIKKyAgaWYgbm90IDAgPD0gd2lyZV90eXBlIDw9IF9XSVJFVFlQRV9NQVg6CisgICAgcmFpc2UgbWVzc2FnZS5FbmNvZGVFcnJvcignVW5rbm93biB3aXJlIHR5cGU6ICVkJyAlIHdpcmVfdHlwZSkKKyAgcmV0dXJuIChmaWVsZF9udW1iZXIgPDwgVEFHX1RZUEVfQklUUykgfCB3aXJlX3R5cGUKKworCitkZWYgVW5wYWNrVGFnKHRhZyk6CisgICIiIlRoZSBpbnZlcnNlIG9mIFBhY2tUYWcoKS4gIEdpdmVuIGFuIHVuc2lnbmVkIDMyLWJpdCBudW1iZXIsCisgIHJldHVybnMgYSAoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpIHR1cGxlLgorICAiIiIKKyAgcmV0dXJuICh0YWcgPj4gVEFHX1RZUEVfQklUUyksICh0YWcgJiBUQUdfVFlQRV9NQVNLKQorCisKK2RlZiBaaWdaYWdFbmNvZGUodmFsdWUpOgorICAiIiJaaWdaYWcgVHJhbnNmb3JtOiAgRW5jb2RlcyBzaWduZWQgaW50ZWdlcnMgc28gdGhhdCB0aGV5IGNhbiBiZQorICBlZmZlY3RpdmVseSB1c2VkIHdpdGggdmFyaW50IGVuY29kaW5nLiAgU2VlIHdpcmVfZm9ybWF0LmggZm9yCisgIG1vcmUgZGV0YWlscy4KKyAgIiIiCisgIGlmIHZhbHVlID49IDA6CisgICAgcmV0dXJuIHZhbHVlIDw8IDEKKyAgcmV0dXJuICh2YWx1ZSA8PCAxKSBeICh+MCkKKworCitkZWYgWmlnWmFnRGVjb2RlKHZhbHVlKToKKyAgIiIiSW52ZXJzZSBvZiBaaWdaYWdFbmNvZGUoKS4iIiIKKyAgaWYgbm90IHZhbHVlICYgMHgxOgorICAgIHJldHVybiB2YWx1ZSA+PiAxCisgIHJldHVybiAodmFsdWUgPj4gMSkgXiAofjApCisKKworCisjIFRoZSAqQnl0ZVNpemUoKSBmdW5jdGlvbnMgYmVsb3cgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8KKyMgc2VyaWFsaXplICJmaWVsZCBudW1iZXIgKyB0eXBlIiBpbmZvcm1hdGlvbiBhbmQgdGhlbiBzZXJpYWxpemUgdGhlIHZhbHVlLgorCisKK2RlZiBJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgaW50MzIpOgorICByZXR1cm4gSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGludDMyKQorCisKK2RlZiBJbnQzMkJ5dGVTaXplTm9UYWcoaW50MzIpOgorICByZXR1cm4gX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcoMHhmZmZmZmZmZmZmZmZmZmZmICYgaW50MzIpCisKKworZGVmIEludDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBpbnQ2NCk6CisgICMgSGF2ZSB0byBjb252ZXJ0IHRvIHVpbnQgYmVmb3JlIGNhbGxpbmcgVUludDY0Qnl0ZVNpemUoKS4KKyAgcmV0dXJuIFVJbnQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgMHhmZmZmZmZmZmZmZmZmZmZmICYgaW50NjQpCisKKworZGVmIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgdWludDMyKToKKyAgcmV0dXJuIFVJbnQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgdWludDMyKQorCisKK2RlZiBVSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHVpbnQ2NCk6CisgIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcodWludDY0KQorCisKK2RlZiBTSW50MzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGludDMyKToKKyAgcmV0dXJuIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgWmlnWmFnRW5jb2RlKGludDMyKSkKKworCitkZWYgU0ludDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBpbnQ2NCk6CisgIHJldHVybiBVSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIFppZ1phZ0VuY29kZShpbnQ2NCkpCisKKworZGVmIEZpeGVkMzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGZpeGVkMzIpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKKworCitkZWYgRml4ZWQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgZml4ZWQ2NCk6CisgIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgOAorCisKK2RlZiBTRml4ZWQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgc2ZpeGVkMzIpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKKworCitkZWYgU0ZpeGVkNjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHNmaXhlZDY0KToKKyAgcmV0dXJuIFRhZ0J5dGVTaXplKGZpZWxkX251bWJlcikgKyA4CisKKworZGVmIEZsb2F0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBmbHQpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKKworCitkZWYgRG91YmxlQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBkb3VibGUpOgorICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDgKKworCitkZWYgQm9vbEJ5dGVTaXplKGZpZWxkX251bWJlciwgYik6CisgIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgMQorCisKK2RlZiBFbnVtQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBlbnVtKToKKyAgcmV0dXJuIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgZW51bSkKKworCitkZWYgU3RyaW5nQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBzdHJpbmcpOgorICByZXR1cm4gQnl0ZXNCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHN0cmluZy5lbmNvZGUoJ3V0Zi04JykpCisKKworZGVmIEJ5dGVzQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBiKToKKyAgcmV0dXJuIChUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpCisgICAgICAgICAgKyBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhsZW4oYikpCisgICAgICAgICAgKyBsZW4oYikpCisKKworZGVmIEdyb3VwQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtZXNzYWdlKToKKyAgcmV0dXJuICgyICogVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSAgIyBTVEFSVCBhbmQgRU5EIGdyb3VwLgorICAgICAgICAgICsgbWVzc2FnZS5CeXRlU2l6ZSgpKQorCisKK2RlZiBNZXNzYWdlQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtZXNzYWdlKToKKyAgcmV0dXJuIChUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpCisgICAgICAgICAgKyBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhtZXNzYWdlLkJ5dGVTaXplKCkpCisgICAgICAgICAgKyBtZXNzYWdlLkJ5dGVTaXplKCkpCisKKworZGVmIE1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtc2cpOgorICAjIEZpcnN0IGNvbXB1dGUgdGhlIHNpemVzIG9mIHRoZSB0YWdzLgorICAjIFRoZXJlIGFyZSAyIHRhZ3MgZm9yIHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBvZiB0aGUgcmVwZWF0ZWQgZ3JvdXAsIHRoYXQKKyAgIyBpcyBmaWVsZCBudW1iZXIgMSwgb25lIHdpdGggZmllbGQgbnVtYmVyIDIgKHR5cGVfaWQpIGFuZCBvbmUgd2l0aCBmaWVsZAorICAjIG51bWJlciAzIChtZXNzYWdlKS4KKyAgdG90YWxfc2l6ZSA9ICgyICogVGFnQnl0ZVNpemUoMSkgKyBUYWdCeXRlU2l6ZSgyKSArIFRhZ0J5dGVTaXplKDMpKQorCisgICMgQWRkIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIHR5cGVfaWQuCisgIHRvdGFsX3NpemUgKz0gX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcoZmllbGRfbnVtYmVyKQorCisgIG1lc3NhZ2Vfc2l6ZSA9IG1zZy5CeXRlU2l6ZSgpCisKKyAgIyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGZvciBlbmNvZGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlLgorICB0b3RhbF9zaXplICs9IF9WYXJVSW50NjRCeXRlU2l6ZU5vVGFnKG1lc3NhZ2Vfc2l6ZSkKKworICAjIFRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgorICB0b3RhbF9zaXplICs9IG1lc3NhZ2Vfc2l6ZQorICByZXR1cm4gdG90YWxfc2l6ZQorCisKK2RlZiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpOgorICAiIiJSZXR1cm5zIHRoZSBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYSB0YWcgd2l0aCB0aGlzIGZpZWxkIG51bWJlci4iIiIKKyAgIyBKdXN0IHBhc3MgaW4gdHlwZSAwLCBzaW5jZSB0aGUgdHlwZSB3b24ndCBhZmZlY3QgdGhlIHRhZyt0eXBlIHNpemUuCisgIHJldHVybiBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhQYWNrVGFnKGZpZWxkX251bWJlciwgMCkpCisKKworIyBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlICpCeXRlU2l6ZSgpIGZ1bmN0aW9ucyBhYm92ZS4KKworZGVmIF9WYXJVSW50NjRCeXRlU2l6ZU5vVGFnKHVpbnQ2NCk6CisgICIiIlJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYSBzaW5nbGUgdmFyaW50CisgIHVzaW5nIGJvdW5kYXJ5IHZhbHVlIGNvbXBhcmlzb25zLiAodW5yb2xsZWQgbG9vcCBvcHRpbWl6YXRpb24gLVdQaWVyY2UpCisgIHVpbnQ2NCBtdXN0IGJlIHVuc2lnbmVkLgorICAiIiIKKyAgaWYgdWludDY0IDw9IDB4N2Y6IHJldHVybiAxCisgIGlmIHVpbnQ2NCA8PSAweDNmZmY6IHJldHVybiAyCisgIGlmIHVpbnQ2NCA8PSAweDFmZmZmZjogcmV0dXJuIDMKKyAgaWYgdWludDY0IDw9IDB4ZmZmZmZmZjogcmV0dXJuIDQKKyAgaWYgdWludDY0IDw9IDB4N2ZmZmZmZmZmOiByZXR1cm4gNQorICBpZiB1aW50NjQgPD0gMHgzZmZmZmZmZmZmZjogcmV0dXJuIDYKKyAgaWYgdWludDY0IDw9IDB4MWZmZmZmZmZmZmZmZjogcmV0dXJuIDcKKyAgaWYgdWludDY0IDw9IDB4ZmZmZmZmZmZmZmZmZmY6IHJldHVybiA4CisgIGlmIHVpbnQ2NCA8PSAweDdmZmZmZmZmZmZmZmZmZmY6IHJldHVybiA5CisgIGlmIHVpbnQ2NCA+IFVJTlQ2NF9NQVg6CisgICAgcmFpc2UgbWVzc2FnZS5FbmNvZGVFcnJvcignVmFsdWUgb3V0IG9mIHJhbmdlOiAlZCcgJSB1aW50NjQpCisgIHJldHVybiAxMAorCisKK05PTl9QQUNLQUJMRV9UWVBFUyA9ICgKKyAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkcsCisgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVAsCisgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRSwKKyAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUworKQorCisKK2RlZiBJc1R5cGVQYWNrYWJsZShmaWVsZF90eXBlKToKKyAgIiIiUmV0dXJuIHRydWUgaWZmIHBhY2thYmxlID0gdHJ1ZSBpcyB2YWxpZCBmb3IgZmllbGRzIG9mIHRoaXMgdHlwZS4KKworICBBcmdzOgorICAgIGZpZWxkX3R5cGU6IGEgRmllbGREZXNjcmlwdG9yOjpUeXBlIHZhbHVlLgorCisgIFJldHVybnM6CisgICAgVHJ1ZSBpZmYgZmllbGRzIG9mIHRoaXMgdHlwZSBhcmUgcGFja2FibGUuCisgICIiIgorICByZXR1cm4gZmllbGRfdHlwZSBub3QgaW4gTk9OX1BBQ0tBQkxFX1RZUEVTCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93aXJlX2Zvcm1hdF90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXRfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NjAwNzc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXRfdGVzdC5weQpAQCAtMCwwICsxLDI1MyBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVGVzdCBmb3IgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLndpcmVfZm9ybWF0LiIiIgorCitfX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCitmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKKworCitjbGFzcyBXaXJlRm9ybWF0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RQYWNrVGFnKHNlbGYpOgorICAgIGZpZWxkX251bWJlciA9IDB4YWJjCisgICAgdGFnX3R5cGUgPSAyCisgICAgc2VsZi5hc3NlcnRFcXVhbCgoZmllbGRfbnVtYmVyIDw8IDMpIHwgdGFnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5QYWNrVGFnKGZpZWxkX251bWJlciwgdGFnX3R5cGUpKQorICAgIFBhY2tUYWcgPSB3aXJlX2Zvcm1hdC5QYWNrVGFnCisgICAgIyBOdW1iZXIgdG9vIGhpZ2guCisgICAgc2VsZi5hc3NlcnRSYWlzZXMobWVzc2FnZS5FbmNvZGVFcnJvciwgUGFja1RhZywgZmllbGRfbnVtYmVyLCA2KQorICAgICMgTnVtYmVyIHRvbyBsb3cuCisgICAgc2VsZi5hc3NlcnRSYWlzZXMobWVzc2FnZS5FbmNvZGVFcnJvciwgUGFja1RhZywgZmllbGRfbnVtYmVyLCAtMSkKKworICBkZWYgdGVzdFVucGFja1RhZyhzZWxmKToKKyAgICAjIFRlc3QgZmllbGQgbnVtYmVycyB0aGF0IHdpbGwgcmVxdWlyZSB2YXJpb3VzIHZhcmludCBzaXplcy4KKyAgICBmb3IgZXhwZWN0ZWRfZmllbGRfbnVtYmVyIGluICgxLCAxNSwgMTYsIDIwNDcsIDIwNDgpOgorICAgICAgZm9yIGV4cGVjdGVkX3dpcmVfdHlwZSBpbiByYW5nZSg2KTogICMgSGlnaGVzdC1udW1iZXJlZCB3aXJldHlwZSBpcyA1LgorICAgICAgICBmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSA9IHdpcmVfZm9ybWF0LlVucGFja1RhZygKKyAgICAgICAgICAgIHdpcmVfZm9ybWF0LlBhY2tUYWcoZXhwZWN0ZWRfZmllbGRfbnVtYmVyLCBleHBlY3RlZF93aXJlX3R5cGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2ZpZWxkX251bWJlciwgZmllbGRfbnVtYmVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3dpcmVfdHlwZSwgd2lyZV90eXBlKQorCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aXJlX2Zvcm1hdC5VbnBhY2tUYWcsIE5vbmUpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aXJlX2Zvcm1hdC5VbnBhY2tUYWcsICdhYmMnKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2lyZV9mb3JtYXQuVW5wYWNrVGFnLCAwLjApCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aXJlX2Zvcm1hdC5VbnBhY2tUYWcsIG9iamVjdCgpKQorCisgIGRlZiB0ZXN0WmlnWmFnRW5jb2RlKHNlbGYpOgorICAgIFogPSB3aXJlX2Zvcm1hdC5aaWdaYWdFbmNvZGUKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIFooMCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBaKC0xKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIFooMSkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBaKC0yKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIFooMikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZlLCBaKDB4N2ZmZmZmZmYpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHhmZmZmZmZmZiwgWigtMHg4MDAwMDAwMCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZmZmZmZmZmZmUsIFooMHg3ZmZmZmZmZmZmZmZmZmZmKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmZmZmZmZmZmZmZmZmZmZiwgWigtMHg4MDAwMDAwMDAwMDAwMDAwKSkKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgWiwgTm9uZSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosICdhYmNkJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIDAuMCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIG9iamVjdCgpKQorCisgIGRlZiB0ZXN0WmlnWmFnRGVjb2RlKHNlbGYpOgorICAgIFogPSB3aXJlX2Zvcm1hdC5aaWdaYWdEZWNvZGUKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIFooMCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgWigxKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIFooMikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgtMiwgWigzKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDIsIFooNCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgweDdmZmZmZmZmLCBaKDB4ZmZmZmZmZmUpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTB4ODAwMDAwMDAsIFooMHhmZmZmZmZmZikpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgweDdmZmZmZmZmZmZmZmZmZmYsIFooMHhmZmZmZmZmZmZmZmZmZmZlKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKC0weDgwMDAwMDAwMDAwMDAwMDAsIFooMHhmZmZmZmZmZmZmZmZmZmZmKSkKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgWiwgTm9uZSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosICdhYmNkJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIDAuMCkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIG9iamVjdCgpKQorCisgIGRlZiBOdW1lcmljQnl0ZVNpemVUZXN0SGVscGVyKHNlbGYsIGJ5dGVfc2l6ZV9mbiwgdmFsdWUsIGV4cGVjdGVkX3ZhbHVlX3NpemUpOgorICAgICMgVXNlIGZpZWxkIG51bWJlcnMgdGhhdCBjYXVzZSB2YXJpb3VzIGJ5dGUgc2l6ZXMgZm9yIHRoZSB0YWcgaW5mb3JtYXRpb24uCisgICAgZm9yIGZpZWxkX251bWJlciwgdGFnX2J5dGVzIGluICgoMTUsIDEpLCAoMTYsIDIpLCAoMjA0NywgMiksICgyMDQ4LCAzKSk6CisgICAgICBleHBlY3RlZF9zaXplID0gZXhwZWN0ZWRfdmFsdWVfc2l6ZSArIHRhZ19ieXRlcworICAgICAgYWN0dWFsX3NpemUgPSBieXRlX3NpemVfZm4oZmllbGRfbnVtYmVyLCB2YWx1ZSkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfc2l6ZSwgYWN0dWFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICdieXRlX3NpemVfZm46ICVzLCBmaWVsZF9udW1iZXI6ICVkLCB2YWx1ZTogJXJcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ0V4cGVjdGVkOiAlZCwgQWN0dWFsOiAlZCclICgKKyAgICAgICAgICBieXRlX3NpemVfZm4sIGZpZWxkX251bWJlciwgdmFsdWUsIGV4cGVjdGVkX3NpemUsIGFjdHVhbF9zaXplKSkKKworICBkZWYgdGVzdEJ5dGVTaXplRnVuY3Rpb25zKHNlbGYpOgorICAgICMgVGVzdCBhbGwgbnVtZXJpYyAqQnl0ZVNpemUoKSBmdW5jdGlvbnMuCisgICAgTlVNRVJJQ19BUkdTID0gWworICAgICAgICAjIEludDMyQnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LkludDMyQnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuSW50MzJCeXRlU2l6ZSwgMTI3LCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkludDMyQnl0ZVNpemUsIDEyOCwgMl0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQzMkJ5dGVTaXplLCAtMSwgMTBdLAorICAgICAgICAjIEludDY0Qnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LkludDY0Qnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuSW50NjRCeXRlU2l6ZSwgMTI3LCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkludDY0Qnl0ZVNpemUsIDEyOCwgMl0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQ2NEJ5dGVTaXplLCAtMSwgMTBdLAorICAgICAgICAjIFVJbnQzMkJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50MzJCeXRlU2l6ZSwgMCwgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50MzJCeXRlU2l6ZSwgMTI3LCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQzMkJ5dGVTaXplLCAxMjgsIDJdLAorICAgICAgICBbd2lyZV9mb3JtYXQuVUludDMyQnl0ZVNpemUsIHdpcmVfZm9ybWF0LlVJTlQzMl9NQVgsIDVdLAorICAgICAgICAjIFVJbnQ2NEJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50NjRCeXRlU2l6ZSwgMCwgMV0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50NjRCeXRlU2l6ZSwgMTI3LCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQ2NEJ5dGVTaXplLCAxMjgsIDJdLAorICAgICAgICBbd2lyZV9mb3JtYXQuVUludDY0Qnl0ZVNpemUsIHdpcmVfZm9ybWF0LlVJTlQ2NF9NQVgsIDEwXSwKKyAgICAgICAgIyBTSW50MzJCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsIC0xLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCAxLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCAtNjMsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsIDYzLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCAtNjQsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsIDY0LCAyXSwKKyAgICAgICAgIyBTSW50NjRCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUsIC0xLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCAxLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCAtNjMsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUsIDYzLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCAtNjQsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUsIDY0LCAyXSwKKyAgICAgICAgIyBGaXhlZDMyQnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LkZpeGVkMzJCeXRlU2l6ZSwgMCwgNF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5GaXhlZDMyQnl0ZVNpemUsIHdpcmVfZm9ybWF0LlVJTlQzMl9NQVgsIDRdLAorICAgICAgICAjIEZpeGVkNjRCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuRml4ZWQ2NEJ5dGVTaXplLCAwLCA4XSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkZpeGVkNjRCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuVUlOVDY0X01BWCwgOF0sCisgICAgICAgICMgU0ZpeGVkMzJCeXRlU2l6ZSgpLgorICAgICAgICBbd2lyZV9mb3JtYXQuU0ZpeGVkMzJCeXRlU2l6ZSwgMCwgNF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TRml4ZWQzMkJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5JTlQzMl9NSU4sIDRdLAorICAgICAgICBbd2lyZV9mb3JtYXQuU0ZpeGVkMzJCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuSU5UMzJfTUFYLCA0XSwKKyAgICAgICAgIyBTRml4ZWQ2NEJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TRml4ZWQ2NEJ5dGVTaXplLCAwLCA4XSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LlNGaXhlZDY0Qnl0ZVNpemUsIHdpcmVfZm9ybWF0LklOVDY0X01JTiwgOF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5TRml4ZWQ2NEJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5JTlQ2NF9NQVgsIDhdLAorICAgICAgICAjIEZsb2F0Qnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LkZsb2F0Qnl0ZVNpemUsIDAuMCwgNF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5GbG9hdEJ5dGVTaXplLCAxMDAwMDAwMDAwLjAsIDRdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRmxvYXRCeXRlU2l6ZSwgLTEwMDAwMDAwMDAuMCwgNF0sCisgICAgICAgICMgRG91YmxlQnl0ZVNpemUoKS4KKyAgICAgICAgW3dpcmVfZm9ybWF0LkRvdWJsZUJ5dGVTaXplLCAwLjAsIDhdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRG91YmxlQnl0ZVNpemUsIDEwMDAwMDAwMDAuMCwgOF0sCisgICAgICAgIFt3aXJlX2Zvcm1hdC5Eb3VibGVCeXRlU2l6ZSwgLTEwMDAwMDAwMDAuMCwgOF0sCisgICAgICAgICMgQm9vbEJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5Cb29sQnl0ZVNpemUsIEZhbHNlLCAxXSwKKyAgICAgICAgW3dpcmVfZm9ybWF0LkJvb2xCeXRlU2l6ZSwgVHJ1ZSwgMV0sCisgICAgICAgICMgRW51bUJ5dGVTaXplKCkuCisgICAgICAgIFt3aXJlX2Zvcm1hdC5FbnVtQnl0ZVNpemUsIDAsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRW51bUJ5dGVTaXplLCAxMjcsIDFdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRW51bUJ5dGVTaXplLCAxMjgsIDJdLAorICAgICAgICBbd2lyZV9mb3JtYXQuRW51bUJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5VSU5UMzJfTUFYLCA1XSwKKyAgICAgICAgXQorICAgIGZvciBhcmdzIGluIE5VTUVSSUNfQVJHUzoKKyAgICAgIHNlbGYuTnVtZXJpY0J5dGVTaXplVGVzdEhlbHBlcigqYXJncykKKworICAgICMgVGVzdCBzdHJpbmdzIGFuZCBieXRlcy4KKyAgICBmb3IgYnl0ZV9zaXplX2ZuIGluICh3aXJlX2Zvcm1hdC5TdHJpbmdCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuQnl0ZXNCeXRlU2l6ZSk6CisgICAgICAjIDEgYnl0ZSBmb3IgdGFnLCAxIGJ5dGUgZm9yIGxlbmd0aCwgMyBieXRlcyBmb3IgY29udGVudHMuCisgICAgICBzZWxmLmFzc2VydEVxdWFsKDUsIGJ5dGVfc2l6ZV9mbigxMCwgJ2FiYycpKQorICAgICAgIyAyIGJ5dGVzIGZvciB0YWcsIDEgYnl0ZSBmb3IgbGVuZ3RoLCAzIGJ5dGVzIGZvciBjb250ZW50cy4KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNiwgYnl0ZV9zaXplX2ZuKDE2LCAnYWJjJykpCisgICAgICAjIDIgYnl0ZXMgZm9yIHRhZywgMiBieXRlcyBmb3IgbGVuZ3RoLCAxMjggYnl0ZXMgZm9yIGNvbnRlbnRzLgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMzIsIGJ5dGVfc2l6ZV9mbigxNiwgJ2EnICogMTI4KSkKKworICAgICMgVGVzdCBVVEYtOCBzdHJpbmcgYnl0ZSBzaXplIGNhbGN1bGF0aW9uLgorICAgICMgMSBieXRlIGZvciB0YWcsIDEgYnl0ZSBmb3IgbGVuZ3RoLCA4IGJ5dGVzIGZvciBjb250ZW50LgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAsIHdpcmVfZm9ybWF0LlN0cmluZ0J5dGVTaXplKAorICAgICAgICA1LCB1bmljb2RlKCdceGQwXHhhMlx4ZDBceGI1XHhkMVx4ODFceGQxXHg4MicsICd1dGYtOCcpKSkKKworICAgIGNsYXNzIE1vY2tNZXNzYWdlKG9iamVjdCk6CisgICAgICBkZWYgX19pbml0X18oc2VsZiwgYnl0ZV9zaXplKToKKyAgICAgICAgc2VsZi5ieXRlX3NpemUgPSBieXRlX3NpemUKKyAgICAgIGRlZiBCeXRlU2l6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYnl0ZV9zaXplCisKKyAgICBtZXNzYWdlX2J5dGVfc2l6ZSA9IDEwCisgICAgbW9ja19tZXNzYWdlID0gTW9ja01lc3NhZ2UoYnl0ZV9zaXplPW1lc3NhZ2VfYnl0ZV9zaXplKQorICAgICMgVGVzdCBncm91cHMuCisgICAgIyAoMiAqIDEpIGJ5dGVzIGZvciBiZWdpbiBhbmQgZW5kIHRhZ3MsIHBsdXMgbWVzc2FnZV9ieXRlX3NpemUuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgbWVzc2FnZV9ieXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5Hcm91cEJ5dGVTaXplKDEsIG1vY2tfbWVzc2FnZSkpCisgICAgIyAoMiAqIDIpIGJ5dGVzIGZvciBiZWdpbiBhbmQgZW5kIHRhZ3MsIHBsdXMgbWVzc2FnZV9ieXRlX3NpemUuCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0ICsgbWVzc2FnZV9ieXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5Hcm91cEJ5dGVTaXplKDE2LCBtb2NrX21lc3NhZ2UpKQorCisgICAgIyBUZXN0IG1lc3NhZ2VzLgorICAgICMgMSBieXRlIGZvciB0YWcsIHBsdXMgMSBieXRlIGZvciBsZW5ndGgsIHBsdXMgY29udGVudHMuCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgbW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VCeXRlU2l6ZSgxLCBtb2NrX21lc3NhZ2UpKQorICAgICMgMiBieXRlcyBmb3IgdGFnLCBwbHVzIDEgYnl0ZSBmb3IgbGVuZ3RoLCBwbHVzIGNvbnRlbnRzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMyArIG1vY2tfbWVzc2FnZS5ieXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5NZXNzYWdlQnl0ZVNpemUoMTYsIG1vY2tfbWVzc2FnZSkpCisgICAgIyAyIGJ5dGVzIGZvciB0YWcsIHBsdXMgMiBieXRlcyBmb3IgbGVuZ3RoLCBwbHVzIGNvbnRlbnRzLgorICAgIG1vY2tfbWVzc2FnZS5ieXRlX3NpemUgPSAxMjgKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQgKyBtb2NrX21lc3NhZ2UuYnl0ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuTWVzc2FnZUJ5dGVTaXplKDE2LCBtb2NrX21lc3NhZ2UpKQorCisKKyAgICAjIFRlc3QgbWVzc2FnZSBzZXQgaXRlbSBieXRlIHNpemUuCisgICAgIyA0IGJ5dGVzIGZvciB0YWdzLCBwbHVzIDEgYnl0ZSBmb3IgbGVuZ3RoLCBwbHVzIDEgYnl0ZSBmb3IgdHlwZV9pZCwKKyAgICAjIHBsdXMgY29udGVudHMuCisgICAgbW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSA9IDEwCisgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21lc3NhZ2UuYnl0ZV9zaXplICsgNiwKKyAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoMSwgbW9ja19tZXNzYWdlKSkKKworICAgICMgNCBieXRlcyBmb3IgdGFncywgcGx1cyAyIGJ5dGVzIGZvciBsZW5ndGgsIHBsdXMgMSBieXRlIGZvciB0eXBlX2lkLAorICAgICMgcGx1cyBjb250ZW50cy4KKyAgICBtb2NrX21lc3NhZ2UuYnl0ZV9zaXplID0gMTI4CisgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21lc3NhZ2UuYnl0ZV9zaXplICsgNywKKyAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoMSwgbW9ja19tZXNzYWdlKSkKKworICAgICMgNCBieXRlcyBmb3IgdGFncywgcGx1cyAyIGJ5dGVzIGZvciBsZW5ndGgsIHBsdXMgMiBieXRlIGZvciB0eXBlX2lkLAorICAgICMgcGx1cyBjb250ZW50cy4KKyAgICBzZWxmLmFzc2VydEVxdWFsKG1vY2tfbWVzc2FnZS5ieXRlX3NpemUgKyA4LAorICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuTWVzc2FnZVNldEl0ZW1CeXRlU2l6ZSgxMjgsIG1vY2tfbWVzc2FnZSkpCisKKyAgICAjIFRvby1sb25nIHZhcmludC4KKyAgICBzZWxmLmFzc2VydFJhaXNlcyhtZXNzYWdlLkVuY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LlVJbnQ2NEJ5dGVTaXplLCAxLCAxIDw8IDEyOCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmMTlmODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLnB5CkBAIC0wLDAgKzEsMjY4IEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBUT0RPKHJvYmluc29uKTogV2Ugc2hvdWxkIGp1c3QgbWFrZSB0aGVzZSBtZXRob2RzIGFsbCAicHVyZS12aXJ0dWFsIiBhbmQgbW92ZQorIyBhbGwgaW1wbGVtZW50YXRpb24gb3V0LCBpbnRvIHJlZmxlY3Rpb24ucHkgZm9yIG5vdy4KKworCisiIiJDb250YWlucyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBwcm90b2NvbCBtZXNzYWdlcy4iIiIKKworX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKKworCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOiBwYXNzCitjbGFzcyBEZWNvZGVFcnJvcihFcnJvcik6IHBhc3MKK2NsYXNzIEVuY29kZUVycm9yKEVycm9yKTogcGFzcworCisKK2NsYXNzIE1lc3NhZ2Uob2JqZWN0KToKKworICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBwcm90b2NvbCBtZXNzYWdlcy4KKworICBQcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgYXJlIGFsbW9zdCBhbHdheXMgZ2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbAorICBjb21waWxlci4gIFRoZXNlIGdlbmVyYXRlZCB0eXBlcyBzdWJjbGFzcyBNZXNzYWdlIGFuZCBpbXBsZW1lbnQgdGhlIG1ldGhvZHMKKyAgc2hvd24gYmVsb3cuCisKKyAgVE9ETyhyb2JpbnNvbik6IExpbmsgdG8gYW4gSFRNTCBkb2N1bWVudCBoZXJlLgorCisgIFRPRE8ocm9iaW5zb24pOiBEb2N1bWVudCB0aGF0IGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHdpbGwgYWxzbworICBoYXZlIGFuIEV4dGVuc2lvbnMgYXR0cmlidXRlIHdpdGggX19nZXRpdGVtX18gYW5kIF9fc2V0aXRlbV9fLgorICBBZ2Fpbiwgbm90IHN1cmUgaG93IHRvIGJlc3QgY29udmV5IHRoaXMuCisKKyAgVE9ETyhyb2JpbnNvbik6IERvY3VtZW50IHRoYXQgdGhlIGNsYXNzIG11c3QgYWxzbyBoYXZlIGEgc3RhdGljCisgICAgUmVnaXN0ZXJFeHRlbnNpb24oZXh0ZW5zaW9uX2ZpZWxkKSBtZXRob2QuCisgICAgTm90IHN1cmUgaG93IHRvIGJlc3QgZXhwcmVzcyBhdCB0aGlzIHBvaW50LgorICAiIiIKKworICAjIFRPRE8ocm9iaW5zb24pOiBEb2N1bWVudCB0aGVzZSBmaWVsZHMgYW5kIG1ldGhvZHMuCisKKyAgX19zbG90c19fID0gW10KKworICBERVNDUklQVE9SID0gTm9uZQorCisgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbz1Ob25lKToKKyAgICBjbG9uZSA9IHR5cGUoc2VsZikoKQorICAgIGNsb25lLk1lcmdlRnJvbShzZWxmKQorICAgIHJldHVybiBjbG9uZQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXJfbXNnKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcl9tc2cpOgorICAgICMgQ2FuJ3QganVzdCBzYXkgc2VsZiAhPSBvdGhlcl9tc2csIHNpbmNlIHRoYXQgd291bGQgaW5maW5pdGVseSByZWN1cnNlLiA6KQorICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcl9tc2cKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgcmFpc2UgVHlwZUVycm9yKCd1bmhhc2hhYmxlIG9iamVjdCcpCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIE1lcmdlRnJvbShzZWxmLCBvdGhlcl9tc2cpOgorICAgICIiIk1lcmdlcyB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGludG8gY3VycmVudCBtZXNzYWdlLgorCisgICAgVGhpcyBtZXRob2QgbWVyZ2VzIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaW50byB0aGUgY3VycmVudAorICAgIG1lc3NhZ2UuIFNpbmd1bGFyIGZpZWxkcyB0aGF0IGFyZSBzZXQgaW4gdGhlIHNwZWNpZmllZCBtZXNzYWdlIG92ZXJ3cml0ZQorICAgIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiB0aGUgY3VycmVudCBtZXNzYWdlLiBSZXBlYXRlZCBmaWVsZHMgYXJlCisgICAgYXBwZW5kZWQuIFNpbmd1bGFyIHN1Yi1tZXNzYWdlcyBhbmQgZ3JvdXBzIGFyZSByZWN1cnNpdmVseSBtZXJnZWQuCisKKyAgICBBcmdzOgorICAgICAgb3RoZXJfbXNnOiBNZXNzYWdlIHRvIG1lcmdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIENvcHlGcm9tKHNlbGYsIG90aGVyX21zZyk6CisgICAgIiIiQ29waWVzIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpbnRvIHRoZSBjdXJyZW50IG1lc3NhZ2UuCisKKyAgICBUaGUgbWV0aG9kIGNsZWFycyB0aGUgY3VycmVudCBtZXNzYWdlIGFuZCB0aGVuIG1lcmdlcyB0aGUgc3BlY2lmaWVkCisgICAgbWVzc2FnZSB1c2luZyBNZXJnZUZyb20uCisKKyAgICBBcmdzOgorICAgICAgb3RoZXJfbXNnOiBNZXNzYWdlIHRvIGNvcHkgaW50byB0aGUgY3VycmVudCBvbmUuCisgICAgIiIiCisgICAgaWYgc2VsZiBpcyBvdGhlcl9tc2c6CisgICAgICByZXR1cm4KKyAgICBzZWxmLkNsZWFyKCkKKyAgICBzZWxmLk1lcmdlRnJvbShvdGhlcl9tc2cpCisKKyAgZGVmIENsZWFyKHNlbGYpOgorICAgICIiIkNsZWFycyBhbGwgZGF0YSB0aGF0IHdhcyBzZXQgaW4gdGhlIG1lc3NhZ2UuIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBTZXRJblBhcmVudChzZWxmKToKKyAgICAiIiJNYXJrIHRoaXMgYXMgcHJlc2VudCBpbiB0aGUgcGFyZW50LgorCisgICAgVGhpcyBub3JtYWxseSBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3UgYXNzaWduIGEgZmllbGQgb2YgYQorICAgIHN1Yi1tZXNzYWdlLCBidXQgc29tZXRpbWVzIHlvdSB3YW50IHRvIG1ha2UgdGhlIHN1Yi1tZXNzYWdlCisgICAgcHJlc2VudCB3aGlsZSBrZWVwaW5nIGl0IGVtcHR5LiAgSWYgeW91IGZpbmQgeW91cnNlbGYgdXNpbmcgdGhpcywKKyAgICB5b3UgbWF5IHdhbnQgdG8gcmVjb25zaWRlciB5b3VyIGRlc2lnbi4iIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIElzSW5pdGlhbGl6ZWQoc2VsZik6CisgICAgIiIiQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIGlzIGluaXRpYWxpemVkLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBtZXRob2QgcmV0dXJucyBUcnVlIGlmIHRoZSBtZXNzYWdlIGlzIGluaXRpYWxpemVkIChpLmUuIGFsbCBvZiBpdHMKKyAgICAgIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KS4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgIyBUT0RPKHJvYmluc29uKTogTWVyZ2VGcm9tU3RyaW5nKCkgc2hvdWxkIHByb2JhYmx5IHJldHVybiBOb25lIGFuZCBiZQorICAjIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIGEgaGVscGVyIHRoYXQgcmV0dXJucyB0aGUgIyBvZiBieXRlcyByZWFkLiAgT3VyCisgICMgZGVzZXJpYWxpemF0aW9uIHJvdXRpbmVzIHdvdWxkIHVzZSB0aGUgaGVscGVyIHdoZW4gcmVjdXJzaXZlbHkKKyAgIyBkZXNlcmlhbGl6aW5nLCBidXQgdGhlIGVuZCB1c2VyIHdvdWxkIGFsbW9zdCBhbHdheXMganVzdCB3YW50IHRoZSBuby1yZXR1cm4KKyAgIyBNZXJnZUZyb21TdHJpbmcoKS4KKworICBkZWYgTWVyZ2VGcm9tU3RyaW5nKHNlbGYsIHNlcmlhbGl6ZWQpOgorICAgICIiIk1lcmdlcyBzZXJpYWxpemVkIHByb3RvY29sIGJ1ZmZlciBkYXRhIGludG8gdGhpcyBtZXNzYWdlLgorCisgICAgV2hlbiB3ZSBmaW5kIGEgZmllbGQgaW4gfHNlcmlhbGl6ZWR8IHRoYXQgaXMgYWxyZWFkeSBwcmVzZW50CisgICAgaW4gdGhpcyBtZXNzYWdlOgorICAgICAgLSBJZiBpdCdzIGEgInJlcGVhdGVkIiBmaWVsZCwgd2UgYXBwZW5kIHRvIHRoZSBlbmQgb2Ygb3VyIGxpc3QuCisgICAgICAtIEVsc2UsIGlmIGl0J3MgYSBzY2FsYXIsIHdlIG92ZXJ3cml0ZSBvdXIgZmllbGQuCisgICAgICAtIEVsc2UsIChpdCdzIGEgbm9ucmVwZWF0ZWQgY29tcG9zaXRlKSwgd2UgcmVjdXJzaXZlbHkgbWVyZ2UKKyAgICAgICAgaW50byB0aGUgZXhpc3RpbmcgY29tcG9zaXRlLgorCisgICAgVE9ETyhyb2JpbnNvbik6IERvY3VtZW50IGhhbmRsaW5nIG9mIHVua25vd24gZmllbGRzLgorCisgICAgQXJnczoKKyAgICAgIHNlcmlhbGl6ZWQ6IEFueSBvYmplY3QgdGhhdCBhbGxvd3MgdXMgdG8gY2FsbCBidWZmZXIoc2VyaWFsaXplZCkKKyAgICAgICAgdG8gYWNjZXNzIGEgc3RyaW5nIG9mIGJ5dGVzIHVzaW5nIHRoZSBidWZmZXIgaW50ZXJmYWNlLgorCisgICAgVE9ETyhyb2JpbnNvbik6IFdoZW4gd2Ugc3dpdGNoIHRvIGEgaGVscGVyLCB0aGlzIHdpbGwgcmV0dXJuIE5vbmUuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gfHNlcmlhbGl6ZWR8LgorICAgICAgRm9yIG5vbi1ncm91cCBtZXNzYWdlcywgdGhpcyB3aWxsIGFsd2F5cyBiZSBsZW4oc2VyaWFsaXplZCksCisgICAgICBidXQgZm9yIG1lc3NhZ2VzIHdoaWNoIGFyZSBhY3R1YWxseSBncm91cHMsIHRoaXMgd2lsbAorICAgICAgZ2VuZXJhbGx5IGJlIGxlc3MgdGhhbiBsZW4oc2VyaWFsaXplZCksIHNpbmNlIHdlIG11c3QKKyAgICAgIHN0b3Agd2hlbiB3ZSByZWFjaCBhbiBFTkRfR1JPVVAgdGFnLiAgTm90ZSB0aGF0IGlmCisgICAgICB3ZSAqZG8qIHN0b3AgYmVjYXVzZSBvZiBhbiBFTkRfR1JPVVAgdGFnLCB0aGUgbnVtYmVyCisgICAgICBvZiBieXRlcyByZXR1cm5lZCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBieXRlcworICAgICAgZm9yIHRoZSBFTkRfR1JPVVAgdGFnIGluZm9ybWF0aW9uLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgUGFyc2VGcm9tU3RyaW5nKHNlbGYsIHNlcmlhbGl6ZWQpOgorICAgICIiIkxpa2UgTWVyZ2VGcm9tU3RyaW5nKCksIGV4Y2VwdCB3ZSBjbGVhciB0aGUgb2JqZWN0IGZpcnN0LiIiIgorICAgIHNlbGYuQ2xlYXIoKQorICAgIHNlbGYuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCisKKyAgZGVmIFNlcmlhbGl6ZVRvU3RyaW5nKHNlbGYpOgorICAgICIiIlNlcmlhbGl6ZXMgdGhlIHByb3RvY29sIG1lc3NhZ2UgdG8gYSBiaW5hcnkgc3RyaW5nLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgYmluYXJ5IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBpZiBhbGwgb2YgdGhlIHJlcXVpcmVkCisgICAgICBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UgYXJlIHNldCAoaS5lLiB0aGUgbWVzc2FnZSBpcyBpbml0aWFsaXplZCkuCisKKyAgICBSYWlzZXM6CisgICAgICBtZXNzYWdlLkVuY29kZUVycm9yIGlmIHRoZSBtZXNzYWdlIGlzbid0IGluaXRpYWxpemVkLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKHNlbGYpOgorICAgICIiIlNlcmlhbGl6ZXMgdGhlIHByb3RvY29sIG1lc3NhZ2UgdG8gYSBiaW5hcnkgc3RyaW5nLgorCisgICAgVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byBTZXJpYWxpemVUb1N0cmluZyBidXQgZG9lc24ndCBjaGVjayBpZiB0aGUKKyAgICBtZXNzYWdlIGlzIGluaXRpYWxpemVkLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXJ0aWFsIG1lc3NhZ2UuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICMgVE9ETyhyb2JpbnNvbik6IERlY2lkZSB3aGV0aGVyIHdlIGxpa2UgdGhlc2UgYmV0dGVyCisgICMgdGhhbiBhdXRvLWdlbmVyYXRlZCBoYXNfZm9vKCkgYW5kIGNsZWFyX2ZvbygpIG1ldGhvZHMKKyAgIyBvbiB0aGUgaW5zdGFuY2VzIHRoZW1zZWx2ZXMuICBUaGlzIHdheSBpcyBsZXNzIGNvbnNpc3RlbnQKKyAgIyB3aXRoIEMrKywgYnV0IGl0IG1ha2VzIHJlZmxlY3Rpb24tdHlwZSBhY2Nlc3MgZWFzaWVyIGFuZAorICAjIHJlZHVjZXMgdGhlIG51bWJlciBvZiBtYWdpY2FsbHkgYXV0b2dlbmVyYXRlZCB0aGluZ3MuCisgICMKKyAgIyBUT0RPKHJvYmluc29uKTogQmUgc3VyZSB0byBkb2N1bWVudCAoYW5kIHRlc3QpIGV4YWN0bHkKKyAgIyB3aGljaCBmaWVsZCBuYW1lcyBhcmUgYWNjZXB0ZWQgaGVyZS4gIEFyZSB3ZSBjYXNlLXNlbnNpdGl2ZT8KKyAgIyBXaGF0IGRvIHdlIGRvIHdpdGggZmllbGRzIHRoYXQgc2hhcmUgbmFtZXMgd2l0aCBQeXRob24ga2V5d29yZHMKKyAgIyBsaWtlICdsYW1iZGEnIGFuZCAneWllbGQnPworICAjCisgICMgbm5vcndpdHogc2F5czoKKyAgIyAiIiIKKyAgIyBUeXBpY2FsbHkgKGluIHB5dGhvbiksIGFuIHVuZGVyc2NvcmUgaXMgYXBwZW5kZWQgdG8gbmFtZXMgdGhhdCBhcmUKKyAgIyBrZXl3b3Jkcy4gU28gdGhleSB3b3VsZCBiZWNvbWUgbGFtYmRhXyBvciB5aWVsZF8uCisgICMgIiIiCisgIGRlZiBMaXN0RmllbGRzKHNlbGYpOgorICAgICIiIlJldHVybnMgYSBsaXN0IG9mIChGaWVsZERlc2NyaXB0b3IsIHZhbHVlKSB0dXBsZXMgZm9yIGFsbAorICAgIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSB3aGljaCBhcmUgbm90IGVtcHR5LiAgQSBzaW5ndWxhciBmaWVsZCBpcyBub24tZW1wdHkKKyAgICBpZiBIYXNGaWVsZCgpIHdvdWxkIHJldHVybiB0cnVlLCBhbmQgYSByZXBlYXRlZCBmaWVsZCBpcyBub24tZW1wdHkgaWYKKyAgICBpdCBjb250YWlucyBhdCBsZWFzdCBvbmUgZWxlbWVudC4gIFRoZSBmaWVsZHMgYXJlIG9yZGVyZWQgYnkgZmllbGQKKyAgICBudW1iZXIiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIEhhc0ZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgorICAgICIiIkNoZWNrcyBpZiBhIGNlcnRhaW4gZmllbGQgaXMgc2V0IGZvciB0aGUgbWVzc2FnZS4gTm90ZSBpZiB0aGUKKyAgICBmaWVsZF9uYW1lIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBtZXNzYWdlIGRlc2NyaXB0b3IsIFZhbHVlRXJyb3Igd2lsbCBiZQorICAgIHJhaXNlZC4iIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIENsZWFyRmllbGQoc2VsZiwgZmllbGRfbmFtZSk6CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBIYXNFeHRlbnNpb24oc2VsZiwgZXh0ZW5zaW9uX2hhbmRsZSk6CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBDbGVhckV4dGVuc2lvbihzZWxmLCBleHRlbnNpb25faGFuZGxlKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIEJ5dGVTaXplKHNlbGYpOgorICAgICIiIlJldHVybnMgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiB0aGlzIG1lc3NhZ2UuCisgICAgUmVjdXJzaXZlbHkgY2FsbHMgQnl0ZVNpemUoKSBvbiBhbGwgY29udGFpbmVkIG1lc3NhZ2VzLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgX1NldExpc3RlbmVyKHNlbGYsIG1lc3NhZ2VfbGlzdGVuZXIpOgorICAgICIiIkludGVybmFsIG1ldGhvZCB1c2VkIGJ5IHRoZSBwcm90b2NvbCBtZXNzYWdlIGltcGxlbWVudGF0aW9uLgorICAgIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHkuCisKKyAgICBTZXRzIGEgbGlzdGVuZXIgdGhhdCB0aGlzIG1lc3NhZ2Ugd2lsbCBjYWxsIG9uIGNlcnRhaW4gc3RhdGUgdHJhbnNpdGlvbnMuCisKKyAgICBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byByZWdpc3RlciBiYWNrLWVkZ2VzIGZyb20gY2hpbGRyZW4gdG8KKyAgICBwYXJlbnRzIGF0IHJ1bnRpbWUsIGZvciB0aGUgcHVycG9zZSBvZiBzZXR0aW5nICJoYXMiIGJpdHMgYW5kCisgICAgYnl0ZS1zaXplLWRpcnR5IGJpdHMgaW4gdGhlIHBhcmVudCBhbmQgYW5jZXN0b3Igb2JqZWN0cyB3aGVuZXZlciBhIGNoaWxkIG9yCisgICAgZGVzY2VuZGFudCBvYmplY3QgaXMgbW9kaWZpZWQuCisKKyAgICBJZiB0aGUgY2xpZW50IHdhbnRzIHRvIGRpc2Nvbm5lY3QgdGhpcyBNZXNzYWdlIGZyb20gdGhlIG9iamVjdCB0cmVlLCBzaGUKKyAgICBleHBsaWNpdGx5IHNldHMgY2FsbGJhY2sgdG8gTm9uZS4KKworICAgIElmIG1lc3NhZ2VfbGlzdGVuZXIgaXMgTm9uZSwgdW5yZWdpc3RlcnMgYW55IGV4aXN0aW5nIGxpc3RlbmVyLiAgT3RoZXJ3aXNlLAorICAgIG1lc3NhZ2VfbGlzdGVuZXIgbXVzdCBpbXBsZW1lbnQgdGhlIE1lc3NhZ2VMaXN0ZW5lciBpbnRlcmZhY2UgaW4KKyAgICBpbnRlcm5hbC9tZXNzYWdlX2xpc3RlbmVyLnB5LCBhbmQgd2UgZGlzY2FyZCBhbnkgbGlzdGVuZXIgcmVnaXN0ZXJlZAorICAgIHZpYSBhIHByZXZpb3VzIF9TZXRMaXN0ZW5lcigpIGNhbGwuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uLXByb3RvMi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbi1wcm90bzIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxZDdlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbi1wcm90bzIuY2MKQEAgLTAsMCArMSwxNjYwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHBldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdikKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fcHJvdG9idWYuaD4KKworLyogSXMgNjRiaXQgKi8KKyNkZWZpbmUgSVNfNjRCSVQgKFNJWkVPRl9MT05HID09IDgpCisKKyNkZWZpbmUgRklFTERfQkVMT05HU19UT19NRVNTQUdFKGZpZWxkX2Rlc2NyaXB0b3IsIG1lc3NhZ2UpIFwKKyAgICAoKG1lc3NhZ2UpLT5HZXREZXNjcmlwdG9yKCkgPT0gKGZpZWxkX2Rlc2NyaXB0b3IpLT5jb250YWluaW5nX3R5cGUoKSkKKworI2RlZmluZSBGSUVMRF9JU19SRVBFQVRFRChmaWVsZF9kZXNjcmlwdG9yKSAgICAgICAgICAgICAgICAgXAorICAgICgoZmllbGRfZGVzY3JpcHRvciktPmxhYmVsKCkgPT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCkKKworI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKGFyZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMiB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUNoZWNrQW5kR2V0SW50ZWdlcihhcmcsICZ2YWx1ZSwga2ludDMybWluX3B5LCBraW50MzJtYXhfcHkpKSB7IFwKKyAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9JTlQ2NChhcmcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50NjQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFDaGVja0FuZEdldEludGVnZXIoYXJnLCAmdmFsdWUsIGtpbnQ2NG1pbl9weSwga2ludDY0bWF4X3B5KSkgeyBcCisgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIEdPT0dMRV9DSEVDS19HRVRfVUlOVDMyKGFyZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMiB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghQ2hlY2tBbmRHZXRJbnRlZ2VyKGFyZywgJnZhbHVlLCBrUHl0aG9uWmVybywga3VpbnQzMm1heF9weSkpIHsgXAorICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX1VJTlQ2NChhcmcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUNoZWNrQW5kR2V0SW50ZWdlcihhcmcsICZ2YWx1ZSwga1B5dGhvblplcm8sIGt1aW50NjRtYXhfcHkpKSB7IFwKKyAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9GTE9BVChhcmcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmxvYXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFDaGVja0FuZEdldEZsb2F0KGFyZywgJnZhbHVlKSkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9ET1VCTEUoYXJnLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFDaGVja0FuZEdldERvdWJsZShhcmcsICZ2YWx1ZSkpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIEdPT0dMRV9DSEVDS19HRVRfQk9PTChhcmcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghQ2hlY2tBbmRHZXRCb29sKGFyZywgJnZhbHVlKSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBDKHN0cikgY29uc3RfY2FzdDxjaGFyKj4oc3RyKQorCisvLyAtLS0gR2xvYmFsczoKKworLy8gQ29uc3RhbnRzIHVzZWQgZm9yIGludGVnZXIgdHlwZSByYW5nZSBjaGVja2luZy4KK3N0YXRpYyBQeU9iamVjdCoga1B5dGhvblplcm87CitzdGF0aWMgUHlPYmplY3QqIGtpbnQzMm1pbl9weTsKK3N0YXRpYyBQeU9iamVjdCoga2ludDMybWF4X3B5Oworc3RhdGljIFB5T2JqZWN0KiBrdWludDMybWF4X3B5Oworc3RhdGljIFB5T2JqZWN0KiBraW50NjRtaW5fcHk7CitzdGF0aWMgUHlPYmplY3QqIGtpbnQ2NG1heF9weTsKK3N0YXRpYyBQeU9iamVjdCoga3VpbnQ2NG1heF9weTsKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKKy8vIC0tLSBTdXBwb3J0IFJvdXRpbmVzOgorCitzdGF0aWMgdm9pZCBBZGRDb25zdGFudHMoUHlPYmplY3QqIG1vZHVsZSkgeworICBzdHJ1Y3QgTmFtZVZhbHVlIHsKKyAgICBjaGFyKiBuYW1lOworICAgIGludDMyIHZhbHVlOworICB9IGNvbnN0YW50c1tdID0geworICAgIC8vIExhYmVsczoKKyAgICB7IkxBQkVMX09QVElPTkFMIiwgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTH0sCisgICAgeyJMQUJFTF9SRVFVSVJFRCIsIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVRVUlSRUR9LAorICAgIHsiTEFCRUxfUkVQRUFURUQiLCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEfSwKKyAgICAvLyBDUFAgdHlwZXM6CisgICAgeyJDUFBUWVBFX01FU1NBR0UiLCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRX0sCisgICAgLy8gRmllbGQgVHlwZXM6CisgICAgeyJUWVBFX01FU1NBR0UiLCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRX0sCisgICAgLy8gRW5kLgorICAgIHtOVUxMLCAwfQorICB9OworCisgIGZvciAoTmFtZVZhbHVlKiBjb25zdGFudCA9IGNvbnN0YW50czsKKyAgICAgICBjb25zdGFudC0+bmFtZSAhPSBOVUxMOyBjb25zdGFudCsrKSB7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCBjb25zdGFudC0+bmFtZSwgY29uc3RhbnQtPnZhbHVlKTsKKyAgfQorfQorCisvLyAtLS0gQ01lc3NhZ2UgQ3VzdG9tIFR5cGU6CisKKy8vIC0tLS0tLSBUeXBlIEZvcndhcmQgRGVjbGFyYXRpb246CisKK3N0cnVjdCBDTWVzc2FnZTsKK3N0cnVjdCBDTWVzc2FnZV9UeXBlOworCitzdGF0aWMgdm9pZCBDTWVzc2FnZURlYWxsb2MoQ01lc3NhZ2UqIHNlbGYpOworc3RhdGljIGludCBDTWVzc2FnZUluaXQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlU3RyKENNZXNzYWdlKiBzZWxmKTsKKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9BZGRNZXNzYWdlKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0FkZFJlcGVhdGVkU2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0Fzc2lnblJlcGVhdGVkU2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0J5dGVTaXplKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0NsZWFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0NsZWFyRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQ2xlYXJGaWVsZEJ5RGVzY3JpcHRvcigKKyAgICBDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9Db3B5RnJvbShDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9EZWJ1Z1N0cmluZyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9EZWxldGVSZXBlYXRlZEZpZWxkKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0VxdWFscyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9GaWVsZExlbmd0aChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoQ01lc3NhZ2UqIHNlbGYpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9HZXRSZXBlYXRlZE1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfR2V0UmVwZWF0ZWRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfR2V0U2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0hhc0ZpZWxkKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0hhc0ZpZWxkQnlEZXNjcmlwdG9yKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0lzSW5pdGlhbGl6ZWQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfTGlzdEZpZWxkcyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9NZXJnZUZyb20oQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfTWVyZ2VGcm9tU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX011dGFibGVNZXNzYWdlKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX05ld1N1Yk1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfU2V0U2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygKKyAgICBDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9TZXJpYWxpemVUb1N0cmluZyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9TZXRJblBhcmVudChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9Td2FwUmVwZWF0ZWRGaWVsZEVsZW1lbnRzKAorICAgIENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CisKKy8vIC0tLS0tLSBPYmplY3QgRGVmaW5pdGlvbjoKKwordHlwZWRlZiBzdHJ1Y3QgQ01lc3NhZ2UgeworICBQeU9iamVjdF9IRUFECisKKyAgc3RydWN0IENNZXNzYWdlKiBwYXJlbnQ7ICAvLyBOVUxMIGlmIHdhc24ndCBjcmVhdGVkIGZyb20gYW5vdGhlciBtZXNzYWdlLgorICBDRmllbGREZXNjcmlwdG9yKiBwYXJlbnRfZmllbGQ7CisgIGNvbnN0IGNoYXIqIGZ1bGxfbmFtZTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZTsKKyAgYm9vbCBmcmVlX21lc3NhZ2U7CisgIGJvb2wgcmVhZF9vbmx5OworfSBDTWVzc2FnZTsKKworLy8gLS0tLS0tIE1ldGhvZCBUYWJsZToKKworI2RlZmluZSBDTUVUSE9EKG5hbWUsIGFyZ3MsIGRvYykgICBcCisgIHsgQygjbmFtZSksIChQeUNGdW5jdGlvbilDTWVzc2FnZV8jI25hbWUsIGFyZ3MsIEMoZG9jKSB9CitzdGF0aWMgUHlNZXRob2REZWYgQ01lc3NhZ2VNZXRob2RzW10gPSB7CisgIENNRVRIT0QoQWRkTWVzc2FnZSwgTUVUSF9PLAorICAgICAgICAgICJBZGRzIGEgbmV3IG1lc3NhZ2UgdG8gYSByZXBlYXRlZCBjb21wb3NpdGUgZmllbGQuIiksCisgIENNRVRIT0QoQWRkUmVwZWF0ZWRTY2FsYXIsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAiQWRkcyBhIHNjYWxhciB0byBhIHJlcGVhdGVkIHNjYWxhciBmaWVsZC4iKSwKKyAgQ01FVEhPRChBc3NpZ25SZXBlYXRlZFNjYWxhciwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICJDbGVhcnMgYW5kIHNldHMgdGhlIHZhbHVlcyBvZiBhIHJlcGVhdGVkIHNjYWxhciBmaWVsZC4iKSwKKyAgQ01FVEhPRChCeXRlU2l6ZSwgTUVUSF9OT0FSR1MsCisgICAgICAgICAgIlJldHVybnMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgaW4gYnl0ZXMuIiksCisgIENNRVRIT0QoQ2xlYXIsIE1FVEhfTk9BUkdTLAorICAgICAgICAgICJDbGVhcnMgYSBwcm90b2NvbCBtZXNzYWdlLiIpLAorICBDTUVUSE9EKENsZWFyRmllbGQsIE1FVEhfTywKKyAgICAgICAgICAiQ2xlYXJzIGEgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBieSBuYW1lLiIpLAorICBDTUVUSE9EKENsZWFyRmllbGRCeURlc2NyaXB0b3IsIE1FVEhfTywKKyAgICAgICAgICAiQ2xlYXJzIGEgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBieSBkZXNjcmlwdG9yLiIpLAorICBDTUVUSE9EKENvcHlGcm9tLCBNRVRIX08sCisgICAgICAgICAgIkNvcGllcyBhIHByb3RvY29sIG1lc3NhZ2UgaW50byB0aGUgY3VycmVudCBtZXNzYWdlLiIpLAorICBDTUVUSE9EKERlYnVnU3RyaW5nLCBNRVRIX05PQVJHUywKKyAgICAgICAgICAiUmV0dXJucyB0aGUgZGVidWcgc3RyaW5nIG9mIGEgcHJvdG9jb2wgbWVzc2FnZS4iKSwKKyAgQ01FVEhPRChEZWxldGVSZXBlYXRlZEZpZWxkLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgIkRlbGV0ZXMgYSBzbGljZSBvZiB2YWx1ZXMgZnJvbSBhIHJlcGVhdGVkIGZpZWxkLiIpLAorICBDTUVUSE9EKEVxdWFscywgTUVUSF9PLAorICAgICAgICAgICJDaGVja3MgaWYgdHdvIHByb3RvY29sIG1lc3NhZ2VzIGFyZSBlcXVhbCAoYnkgaWRlbnRpdHkpLiIpLAorICBDTUVUSE9EKEZpZWxkTGVuZ3RoLCBNRVRIX08sCisgICAgICAgICAgIlJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlcGVhdGVkIGZpZWxkLiIpLAorICBDTUVUSE9EKEZpbmRJbml0aWFsaXphdGlvbkVycm9ycywgTUVUSF9OT0FSR1MsCisgICAgICAgICAgIlJldHVybnMgdGhlIGluaXRpYWxpemF0aW9uIGVycm9ycyBvZiBhIG1lc3NhZ2UuIiksCisgIENNRVRIT0QoR2V0UmVwZWF0ZWRNZXNzYWdlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgIlJldHVybnMgYSBtZXNzYWdlIGZyb20gYSByZXBlYXRlZCBjb21wb3NpdGUgZmllbGQuIiksCisgIENNRVRIT0QoR2V0UmVwZWF0ZWRTY2FsYXIsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAiUmV0dXJucyBhIHNjYWxhciB2YWx1ZSBmcm9tIGEgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkLiIpLAorICBDTUVUSE9EKEdldFNjYWxhciwgTUVUSF9PLAorICAgICAgICAgICJSZXR1cm5zIHRoZSBzY2FsYXIgdmFsdWUgb2YgYSBmaWVsZC4iKSwKKyAgQ01FVEhPRChIYXNGaWVsZCwgTUVUSF9PLAorICAgICAgICAgICJDaGVja3MgaWYgYSBtZXNzYWdlIGZpZWxkIGlzIHNldC4iKSwKKyAgQ01FVEhPRChIYXNGaWVsZEJ5RGVzY3JpcHRvciwgTUVUSF9PLAorICAgICAgICAgICJDaGVja3MgaWYgYSBtZXNzYWdlIGZpZWxkIGlzIHNldCBieSBnaXZlbiBpdHMgZGVzY3JpcHRvciIpLAorICBDTUVUSE9EKElzSW5pdGlhbGl6ZWQsIE1FVEhfTk9BUkdTLAorICAgICAgICAgICJDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBvZiBhIHByb3RvY29sIG1lc3NhZ2UgYXJlIHNldC4iKSwKKyAgQ01FVEhPRChMaXN0RmllbGRzLCBNRVRIX05PQVJHUywKKyAgICAgICAgICAiTGlzdHMgYWxsIHNldCBmaWVsZHMgb2YgYSBtZXNzYWdlLiIpLAorICBDTUVUSE9EKE1lcmdlRnJvbSwgTUVUSF9PLAorICAgICAgICAgICJNZXJnZXMgYSBwcm90b2NvbCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4iKSwKKyAgQ01FVEhPRChNZXJnZUZyb21TdHJpbmcsIE1FVEhfTywKKyAgICAgICAgICAiTWVyZ2VzIGEgc2VyaWFsaXplZCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4iKSwKKyAgQ01FVEhPRChNdXRhYmxlTWVzc2FnZSwgTUVUSF9PLAorICAgICAgICAgICJSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIGEgbmVzdGVkIHByb3RvY29sIG1lc3NhZ2UuIiksCisgIENNRVRIT0QoTmV3U3ViTWVzc2FnZSwgTUVUSF9PLAorICAgICAgICAgICJDcmVhdGVzIGFuZCByZXR1cm5zIGEgcHl0aG9uIG1lc3NhZ2UgZ2l2ZW4gdGhlIGRlc2NyaXB0b3Igb2YgYSAiCisgICAgICAgICAgImNvbXBvc2l0ZSBmaWVsZCBvZiB0aGUgY3VycmVudCBtZXNzYWdlLiIpLAorICBDTUVUSE9EKFNldFNjYWxhciwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICJTZXRzIHRoZSB2YWx1ZSBvZiBhIHNpbmd1bGFyIHNjYWxhciBmaWVsZC4iKSwKKyAgQ01FVEhPRChTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAiU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIHN0cmluZywgZXZlbiBpZiBpdCBpc24ndCBpbml0aWFsaXplZC4iKSwKKyAgQ01FVEhPRChTZXJpYWxpemVUb1N0cmluZywgTUVUSF9OT0FSR1MsCisgICAgICAgICAgIlNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSBzdHJpbmcsIG9ubHkgZm9yIGluaXRpYWxpemVkIG1lc3NhZ2VzLiIpLAorICBDTUVUSE9EKFNldEluUGFyZW50LCBNRVRIX05PQVJHUywKKyAgICAgICAgICAiU2V0cyB0aGUgaGFzIGJpdCBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gaXRzIHBhcmVudCBtZXNzYWdlLiIpLAorICBDTUVUSE9EKFN3YXBSZXBlYXRlZEZpZWxkRWxlbWVudHMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAiU3dhcHMgdGhlIGVsZW1lbnRzIGluIHR3byBwb3NpdGlvbnMgaW4gYSByZXBlYXRlZCBmaWVsZC4iKSwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisjdW5kZWYgQ01FVEhPRAorCitzdGF0aWMgUHlNZW1iZXJEZWYgQ01lc3NhZ2VNZW1iZXJzW10gPSB7CisgIHsgQygiZnVsbF9uYW1lIiksIFRfU1RSSU5HLCBvZmZzZXRvZihDTWVzc2FnZSwgZnVsbF9uYW1lKSwgMCwgIkZ1bGwgbmFtZSIgfSwKKyAgeyBOVUxMIH0KK307CisKKy8vIC0tLS0tLSBUeXBlIERlZmluaXRpb246CisKKy8vIFRoZSBkZWZpbml0aW9uIGZvciB0aGUgdHlwZSBvYmplY3QgdGhhdCBjYXB0dXJlcyB0aGUgdHlwZSBvZiBDTWVzc2FnZQorLy8gaW4gUHl0aG9uLgorUHlUeXBlT2JqZWN0IENNZXNzYWdlX1R5cGUgPSB7CisgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgIDAsCisgIEMoImdvb2dsZTMubmV0Lmdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuIgorICAgICJfbmV0X3Byb3RvMl9fX3B5dGhvbi4iCisgICAgIkNNZXNzYWdlIiksICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9uYW1lCisgIHNpemVvZihDTWVzc2FnZSksICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYmFzaWNzaXplCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlbXNpemUKKyAgKGRlc3RydWN0b3IpQ01lc3NhZ2VEZWFsbG9jLCAgICAgICAgIC8vICB0cF9kZWFsbG9jCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcHJpbnQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9yZXByCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbnVtYmVyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfc2VxdWVuY2UKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19tYXBwaW5nCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaGFzaAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NhbGwKKyAgKHJlcHJmdW5jKUNNZXNzYWdlU3RyLCAgICAgICAgICAgICAgIC8vICB0cF9zdHIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRybworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHJvCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfYnVmZmVyCisgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAvLyAgdHBfZmxhZ3MKKyAgQygiQSBQcm90b2NvbE1lc3NhZ2UiKSwgICAgICAgICAgICAgIC8vICB0cF9kb2MKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF90cmF2ZXJzZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NsZWFyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmljaGNvbXBhcmUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF93ZWFrbGlzdG9mZnNldAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAorICBDTWVzc2FnZU1ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX21ldGhvZHMKKyAgQ01lc3NhZ2VNZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9tZW1iZXJzCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0c2V0CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYmFzZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3QKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9zZXQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0b2Zmc2V0CisgIChpbml0cHJvYylDTWVzc2FnZUluaXQsICAgICAgICAgICAgICAvLyAgdHBfaW5pdAorICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgLy8gIHRwX2FsbG9jCisgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAvLyAgdHBfbmV3CisgIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZnJlZQorfTsKKworLy8gLS0tLS0tIEhlbHBlciBGdW5jdGlvbnM6CisKK3N0YXRpYyB2b2lkIEZvcm1hdFR5cGVFcnJvcihQeU9iamVjdCogYXJnLCBjaGFyKiBleHBlY3RlZF90eXBlcykgeworICBQeU9iamVjdCogcyA9IFB5T2JqZWN0X1N0cihQeU9iamVjdF9UeXBlKGFyZykpOworICBQeU9iamVjdCogcmVwciA9IFB5T2JqZWN0X1JlcHIoUHlPYmplY3RfVHlwZShhcmcpKTsKKyAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICIlLjEwMHMgaGFzIHR5cGUgJS4xMDBzLCBidXQgZXhwZWN0ZWQgb25lIG9mOiAlcyIsCisgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocmVwciksCisgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocyksCisgICAgICAgICAgICAgICBleHBlY3RlZF90eXBlcyk7CisgIFB5X0RFQ1JFRihzKTsKKyAgUHlfREVDUkVGKHJlcHIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0YXRpYyBib29sIENoZWNrQW5kR2V0SW50ZWdlcigKKyAgICBQeU9iamVjdCogYXJnLCBUKiB2YWx1ZSwgUHlPYmplY3QqIG1pbiwgUHlPYmplY3QqIG1heCkgeworICBib29sIGlzX2xvbmcgPSBQeUxvbmdfQ2hlY2soYXJnKTsKKyAgaWYgKCFQeUludF9DaGVjayhhcmcpICYmICFpc19sb25nKSB7CisgICAgRm9ybWF0VHlwZUVycm9yKGFyZywgImludCwgbG9uZyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChQeU9iamVjdF9Db21wYXJlKG1pbiwgYXJnKSA+IDAgfHwgUHlPYmplY3RfQ29tcGFyZShtYXgsIGFyZykgPCAwKSB7CisgICAgUHlPYmplY3QqIHMgPSBQeU9iamVjdF9TdHIoYXJnKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgIlZhbHVlIG91dCBvZiByYW5nZTogJXMiLAorICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocykpOworICAgIFB5X0RFQ1JFRihzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGlzX2xvbmcpIHsKKyAgICBpZiAobWluID09IGtQeXRob25aZXJvKSB7CisgICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxUPihQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKGFyZykpOworICAgIH0gZWxzZSB7CisgICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxUPihQeUxvbmdfQXNMb25nTG9uZyhhcmcpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8VD4oUHlJbnRfQXNMb25nKGFyZykpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBDaGVja0FuZEdldERvdWJsZShQeU9iamVjdCogYXJnLCBkb3VibGUqIHZhbHVlKSB7CisgIGlmICghUHlJbnRfQ2hlY2soYXJnKSAmJiAhUHlMb25nX0NoZWNrKGFyZykgJiYKKyAgICAgICFQeUZsb2F0X0NoZWNrKGFyZykpIHsKKyAgICBGb3JtYXRUeXBlRXJyb3IoYXJnLCAiaW50LCBsb25nLCBmbG9hdCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAqdmFsdWUgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBDaGVja0FuZEdldEZsb2F0KFB5T2JqZWN0KiBhcmcsIGZsb2F0KiB2YWx1ZSkgeworICBkb3VibGUgZG91YmxlX3ZhbHVlOworICBpZiAoIUNoZWNrQW5kR2V0RG91YmxlKGFyZywgJmRvdWJsZV92YWx1ZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRvdWJsZV92YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBDaGVja0FuZEdldEJvb2woUHlPYmplY3QqIGFyZywgYm9vbCogdmFsdWUpIHsKKyAgaWYgKCFQeUludF9DaGVjayhhcmcpICYmICFQeUJvb2xfQ2hlY2soYXJnKSAmJiAhUHlMb25nX0NoZWNrKGFyZykpIHsKKyAgICBGb3JtYXRUeXBlRXJyb3IoYXJnLCAiaW50LCBsb25nLCBib29sIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGJvb2w+KFB5SW50X0FzTG9uZyhhcmcpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2dvb2dsZTo6cHJvdG9idWY6OkR5bmFtaWNNZXNzYWdlRmFjdG9yeSogZ2xvYmFsX21lc3NhZ2VfZmFjdG9yeSA9IE5VTEw7CitzdGF0aWMgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogQ3JlYXRlTWVzc2FnZShjb25zdCBjaGFyKiBtZXNzYWdlX3R5cGUpIHsKKyAgc3RyaW5nIG1lc3NhZ2VfbmFtZShtZXNzYWdlX3R5cGUpOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0KKyAgICAgIEdldERlc2NyaXB0b3JQb29sKCktPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShtZXNzYWdlX25hbWUpOworICBpZiAoZGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIGdsb2JhbF9tZXNzYWdlX2ZhY3RvcnktPkdldFByb3RvdHlwZShkZXNjcmlwdG9yKTsKK30KKworc3RhdGljIGJvb2wgQ2hlY2tBbmRTZXRTdHJpbmcoCisgICAgUHlPYmplY3QqIGFyZywgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSwKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICBib29sIGFwcGVuZCwKKyAgICBpbnQgaW5kZXgpIHsKKyAgR09PR0xFX0RDSEVDSyhkZXNjcmlwdG9yLT50eXBlKCkgPT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyB8fAorICAgICAgICAgZGVzY3JpcHRvci0+dHlwZSgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyk7CisgIGlmIChkZXNjcmlwdG9yLT50eXBlKCkgPT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgIGlmICghUHlTdHJpbmdfQ2hlY2soYXJnKSAmJiAhUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKKyAgICAgIEZvcm1hdFR5cGVFcnJvcihhcmcsICJzdHIsIHVuaWNvZGUiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgICAgUHlPYmplY3QqIHVuaWNvZGUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoYXJnLCAiYXNjaWkiLCBOVUxMKTsKKyAgICAgIGlmICh1bmljb2RlID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QqIHJlcHIgPSBQeU9iamVjdF9SZXByKGFyZyk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiVzIGhhcyB0eXBlIHN0ciwgYnV0IGlzbid0IGluIDctYml0IEFTQ0lJICIKKyAgICAgICAgICAgICAgICAgICAgICJlbmNvZGluZy4gTm9uLUFTQ0lJIHN0cmluZ3MgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgInVuaWNvZGUgb2JqZWN0cyBiZWZvcmUgYmVpbmcgYWRkZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhyZXByKSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXByKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgIEZvcm1hdFR5cGVFcnJvcihhcmcsICJzdHIiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBQeU9iamVjdCogZW5jb2RlZF9zdHJpbmcgPSBOVUxMOworICBpZiAoZGVzY3JpcHRvci0+dHlwZSgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgICAgZW5jb2RlZF9zdHJpbmcgPSBQeVN0cmluZ19Bc0VuY29kZWRPYmplY3QoYXJnLCAidXRmLTgiLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgZW5jb2RlZF9zdHJpbmcgPSBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0KGFyZywgInV0Zi04IiwgTlVMTCk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIEluIHRoaXMgY2FzZSBmaWVsZCB0eXBlIGlzICJieXRlcyIuCisgICAgZW5jb2RlZF9zdHJpbmcgPSBhcmc7CisgICAgUHlfSU5DUkVGKGVuY29kZWRfc3RyaW5nKTsKKyAgfQorCisgIGlmIChlbmNvZGVkX3N0cmluZyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY2hhciogdmFsdWU7CisgIFB5X3NzaXplX3QgdmFsdWVfbGVuOworICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGVuY29kZWRfc3RyaW5nLCAmdmFsdWUsICZ2YWx1ZV9sZW4pIDwgMCkgeworICAgIFB5X0RFQ1JFRihlbmNvZGVkX3N0cmluZyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RyaW5nIHZhbHVlX3N0cmluZyh2YWx1ZSwgdmFsdWVfbGVuKTsKKyAgaWYgKGFwcGVuZCkgeworICAgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBkZXNjcmlwdG9yLCB2YWx1ZV9zdHJpbmcpOworICB9IGVsc2UgaWYgKGluZGV4IDwgMCkgeworICAgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBkZXNjcmlwdG9yLCB2YWx1ZV9zdHJpbmcpOworICB9IGVsc2UgeworICAgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIGRlc2NyaXB0b3IsIGluZGV4LCB2YWx1ZV9zdHJpbmcpOworICB9CisgIFB5X0RFQ1JFRihlbmNvZGVkX3N0cmluZyk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgUHlPYmplY3QqIFRvU3RyaW5nT2JqZWN0KAorICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgc3RyaW5nIHZhbHVlKSB7CisgIGlmIChkZXNjcmlwdG9yLT50eXBlKCkgIT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWx1ZS5jX3N0cigpLCB2YWx1ZS5sZW5ndGgoKSk7CisgIH0KKworICBQeU9iamVjdCogcmVzdWx0ID0gUHlVbmljb2RlX0RlY29kZVVURjgodmFsdWUuY19zdHIoKSwgdmFsdWUubGVuZ3RoKCksIE5VTEwpOworICAvLyBJZiB0aGUgc3RyaW5nIGNhbid0IGJlIGRlY29kZWQgaW4gVVRGLTgsIGp1c3QgcmV0dXJuIGEgc3RyaW5nIG9iamVjdCB0aGF0CisgIC8vIGNvbnRhaW5zIHRoZSByYXcgYnl0ZXMuIFRoaXMgY2FuJ3QgaGFwcGVuIGlmIHRoZSB2YWx1ZSB3YXMgYXNzaWduZWQgdXNpbmcKKyAgLy8gdGhlIG1lbWJlcnMgb2YgdGhlIFB5dGhvbiBtZXNzYWdlIG9iamVjdCwgYnV0IGNhbiBoYXBwZW4gaWYgdGhlIHZhbHVlcyB3ZXJlCisgIC8vIHBhcnNlZCBmcm9tIHRoZSB3aXJlIChiaW5hcnkpLgorICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICBQeUVycl9DbGVhcigpOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHZhbHVlLmNfc3RyKCksIHZhbHVlLmxlbmd0aCgpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBBc3N1cmVXcml0YWJsZShDTWVzc2FnZSogc2VsZikgeworICBpZiAoc2VsZiA9PSBOVUxMIHx8CisgICAgICBzZWxmLT5wYXJlbnQgPT0gTlVMTCB8fAorICAgICAgc2VsZi0+cGFyZW50X2ZpZWxkID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIXNlbGYtPnJlYWRfb25seSkgeworICAgIHJldHVybjsKKyAgfQorCisgIEFzc3VyZVdyaXRhYmxlKHNlbGYtPnBhcmVudCk7CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPnBhcmVudC0+bWVzc2FnZTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgc2VsZi0+bWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkLT5kZXNjcmlwdG9yLCBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5KTsKKyAgc2VsZi0+cmVhZF9vbmx5ID0gZmFsc2U7CisgIHNlbGYtPnBhcmVudCA9IE5VTEw7CisgIHNlbGYtPnBhcmVudF9maWVsZCA9IE5VTEw7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogSW50ZXJuYWxHZXRTY2FsYXIoCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSwKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpIHsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBpZiAoIUZJRUxEX0JFTE9OR1NfVE9fTUVTU0FHRShmaWVsZF9kZXNjcmlwdG9yLCBtZXNzYWdlKSkgeworICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgUHlFeGNfS2V5RXJyb3IsICJGaWVsZCBkb2VzIG5vdCBiZWxvbmcgdG8gbWVzc2FnZSEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFB5T2JqZWN0KiByZXN1bHQgPSBOVUxMOworICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogeworICAgICAgaW50MzIgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRJbnQzMigqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgIGludDY0IHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0SW50NjQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworI2lmIElTXzY0QklUCisgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CisjZWxzZQorICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKKyAgICAgIHVpbnQzMiB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFVJbnQzMigqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisjaWYgSVNfNjRCSVQKKyAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKKyNlbHNlCisgICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogeworICAgICAgdWludDY0IHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0VUludDY0KCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyNpZiBJU182NEJJVAorICAgICAgaWYgKHZhbHVlIDw9IHN0YXRpY19jYXN0PHVpbnQ2ND4oa2ludDY0bWF4KSkgeworICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhzdGF0aWNfY2FzdDx1aW50NjQ+KHZhbHVlKSk7CisgICAgICB9CisjZWxzZQorICAgICAgaWYgKHZhbHVlIDw9IHN0YXRpY19jYXN0PHVpbnQzMj4oa2ludDMybWF4KSkgeworICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlKSk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UgeyAgLy8gTk9MSU5UCisgICAgICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgIGZsb2F0IHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0RmxvYXQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKKyAgICAgIGRvdWJsZSB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldERvdWJsZSgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgICAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6IHsKKyAgICAgIGJvb2wgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRCb29sKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICAgIHJlc3VsdCA9IFB5Qm9vbF9Gcm9tTG9uZyh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICBzdHJpbmcgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRTdHJpbmcoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgICAgcmVzdWx0ID0gVG9TdHJpbmdPYmplY3QoZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06IHsKKyAgICAgIGlmICghbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcikpIHsKKyAgICAgICAgLy8gTG9vayBmb3IgdGhlIHZhbHVlIGluIHRoZSB1bmtub3duIGZpZWxkcy4KKyAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkX3NldCA9CisgICAgICAgICAgICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRfc2V0LT5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICAgICAgICBpZiAodW5rbm93bl9maWVsZF9zZXQtPmZpZWxkKGkpLm51bWJlcigpID09CisgICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPm51bWJlcigpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyh1bmtub3duX2ZpZWxkX3NldC0+ZmllbGQoaSkudmFyaW50KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KKyAgICAgICAgICAgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0RW51bSgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgICAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKGVudW1fdmFsdWUtPm51bWJlcigpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLCAiR2V0dGluZyBhIHZhbHVlIGZyb20gYSBmaWVsZCBvZiB1bmtub3duIHR5cGUgJWQiLAorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5T2JqZWN0KiBJbnRlcm5hbFNldFNjYWxhcigKKyAgICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCisgICAgUHlPYmplY3QqIGFyZykgeworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIGlmICghRklFTERfQkVMT05HU19UT19NRVNTQUdFKGZpZWxkX2Rlc2NyaXB0b3IsIG1lc3NhZ2UpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICBQeUV4Y19LZXlFcnJvciwgIkZpZWxkIGRvZXMgbm90IGJlbG9uZyB0byBtZXNzYWdlISIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgc3dpdGNoIChmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UMzIoYXJnLCB2YWx1ZSk7CisgICAgICByZWZsZWN0aW9uLT5TZXRJbnQzMihtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UNjQoYXJnLCB2YWx1ZSk7CisgICAgICByZWZsZWN0aW9uLT5TZXRJbnQ2NChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX1VJTlQzMihhcmcsIHZhbHVlKTsKKyAgICAgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX1VJTlQ2NChhcmcsIHZhbHVlKTsKKyAgICAgIHJlZmxlY3Rpb24tPlNldFVJbnQ2NChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfRkxPQVQoYXJnLCB2YWx1ZSk7CisgICAgICByZWZsZWN0aW9uLT5TZXRGbG9hdChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0RPVUJMRShhcmcsIHZhbHVlKTsKKyAgICAgIHJlZmxlY3Rpb24tPlNldERvdWJsZShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9CT09MKGFyZywgdmFsdWUpOworICAgICAgcmVmbGVjdGlvbi0+U2V0Qm9vbChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICBpZiAoIUNoZWNrQW5kU2V0U3RyaW5nKAorICAgICAgICAgIGFyZywgbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgcmVmbGVjdGlvbiwgZmFsc2UsIC0xKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKGFyZywgdmFsdWUpOworICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciA9CisgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+ZW51bV90eXBlKCk7CisgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KKyAgICAgICAgICBlbnVtX2Rlc2NyaXB0b3ItPkZpbmRWYWx1ZUJ5TnVtYmVyKHZhbHVlKTsKKyAgICAgIGlmIChlbnVtX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgcmVmbGVjdGlvbi0+U2V0RW51bShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBlbnVtX3ZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJvb2wgYWRkZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gQWRkIHRoZSB2YWx1ZSB0byB0aGUgdW5rbm93biBmaWVsZHMuCisgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZF9zZXQgPQorICAgICAgICAgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkX3NldC0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgICAgICAgaWYgKHVua25vd25fZmllbGRfc2V0LT5maWVsZChpKS5udW1iZXIoKSA9PQorICAgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5udW1iZXIoKSkgeworICAgICAgICAgICAgdW5rbm93bl9maWVsZF9zZXQtPm11dGFibGVfZmllbGQoaSktPnNldF92YXJpbnQodmFsdWUpOworICAgICAgICAgICAgYWRkZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhZGRlZCkgeworICAgICAgICAgIHVua25vd25fZmllbGRfc2V0LT5BZGRWYXJpbnQoZmllbGRfZGVzY3JpcHRvci0+bnVtYmVyKCksIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZWZsZWN0aW9uLT5DbGVhckZpZWxkKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsICJTZXR0aW5nIHZhbHVlIHRvIGEgZmllbGQgb2YgdW5rbm93biB0eXBlICVkIiwKKyAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKKyAgfQorCisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIEludGVybmFsQWRkUmVwZWF0ZWRTY2FsYXIoCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAorICAgIFB5T2JqZWN0KiBhcmcpIHsKKworICBpZiAoIUZJRUxEX0JFTE9OR1NfVE9fTUVTU0FHRShmaWVsZF9kZXNjcmlwdG9yLCBtZXNzYWdlKSkgeworICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgUHlFeGNfS2V5RXJyb3IsICJGaWVsZCBkb2VzIG5vdCBiZWxvbmcgdG8gbWVzc2FnZSEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHN3aXRjaCAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKGFyZywgdmFsdWUpOworICAgICAgcmVmbGVjdGlvbi0+QWRkSW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDY0KGFyZywgdmFsdWUpOworICAgICAgcmVmbGVjdGlvbi0+QWRkSW50NjQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9VSU5UMzIoYXJnLCB2YWx1ZSk7CisgICAgICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9VSU5UNjQoYXJnLCB2YWx1ZSk7CisgICAgICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0ZMT0FUKGFyZywgdmFsdWUpOworICAgICAgcmVmbGVjdGlvbi0+QWRkRmxvYXQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogeworICAgICAgR09PR0xFX0NIRUNLX0dFVF9ET1VCTEUoYXJnLCB2YWx1ZSk7CisgICAgICByZWZsZWN0aW9uLT5BZGREb3VibGUobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6IHsKKyAgICAgIEdPT0dMRV9DSEVDS19HRVRfQk9PTChhcmcsIHZhbHVlKTsKKyAgICAgIHJlZmxlY3Rpb24tPkFkZEJvb2wobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgaWYgKCFDaGVja0FuZFNldFN0cmluZygKKyAgICAgICAgICBhcmcsIG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHJlZmxlY3Rpb24sIHRydWUsIC0xKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOiB7CisgICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKGFyZywgdmFsdWUpOworICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciA9CisgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+ZW51bV90eXBlKCk7CisgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KKyAgICAgICAgICBlbnVtX2Rlc2NyaXB0b3ItPkZpbmRWYWx1ZUJ5TnVtYmVyKHZhbHVlKTsKKyAgICAgIGlmIChlbnVtX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBlbnVtX3ZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFB5T2JqZWN0KiBzID0gUHlPYmplY3RfU3RyKGFyZyk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiVW5rbm93biBlbnVtIHZhbHVlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocykpOworICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsICJBZGRpbmcgdmFsdWUgdG8gYSBmaWVsZCBvZiB1bmtub3duIHR5cGUgJWQiLAorICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOworICB9CisKKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogSW50ZXJuYWxHZXRSZXBlYXRlZFNjYWxhcigKKyAgICBDTWVzc2FnZSogY21lc3NhZ2UsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKKyAgICBpbnQgaW5kZXgpIHsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IGNtZXNzYWdlLT5tZXNzYWdlOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIGludCBmaWVsZF9zaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgaWYgKGluZGV4IDwgMCkgeworICAgIGluZGV4ID0gZmllbGRfc2l6ZSArIGluZGV4OworICB9CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZmllbGRfc2l6ZSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAibGlzdCBhc3NpZ25tZW50IGluZGV4ICglZCkgb3V0IG9mIHJhbmdlIiwgaW5kZXgpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7CisgIHN3aXRjaCAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7CisgICAgICBpbnQzMiB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoCisgICAgICAgICAgKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKKyAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDogeworICAgICAgaW50NjQgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0KAorICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKKyAgICAgIHVpbnQzMiB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKAorICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6IHsKKyAgICAgIHVpbnQ2NCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KAorICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBmbG9hdCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRmxvYXQoCisgICAgICAgICAgKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKKyAgICAgIHJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7CisgICAgICBkb3VibGUgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZERvdWJsZSgKKyAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOiB7CisgICAgICBib29sIHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sKAorICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICByZXN1bHQgPSBQeUJvb2xfRnJvbUxvbmcodmFsdWUgPyAxIDogMCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogeworICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9CisgICAgICAgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRSZXBlYXRlZEVudW0oCisgICAgICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhlbnVtX3ZhbHVlLT5udW1iZXIoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICBzdHJpbmcgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZygKKyAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOworICAgICAgcmVzdWx0ID0gVG9TdHJpbmdPYmplY3QoZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6IHsKKyAgICAgIENNZXNzYWdlKiBweV9jbXNnID0gUHlPYmplY3RfTmV3KENNZXNzYWdlLCAmQ01lc3NhZ2VfVHlwZSk7CisgICAgICBpZiAocHlfY21zZyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgbXNnID0gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICBweV9jbXNnLT5wYXJlbnQgPSBjbWVzc2FnZTsKKyAgICAgIHB5X2Ntc2ctPmZ1bGxfbmFtZSA9IGZpZWxkX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLmNfc3RyKCk7CisgICAgICBweV9jbXNnLT5tZXNzYWdlID0gY29uc3RfY2FzdDxnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKj4oJm1zZyk7CisgICAgICBweV9jbXNnLT5mcmVlX21lc3NhZ2UgPSBmYWxzZTsKKyAgICAgIHB5X2Ntc2ctPnJlYWRfb25seSA9IGZhbHNlOworICAgICAgcmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHB5X2Ntc2cpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgIkdldHRpbmcgdmFsdWUgZnJvbSBhIHJlcGVhdGVkIGZpZWxkIG9mIHVua25vd24gdHlwZSAlZCIsCisgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgUHlPYmplY3QqIEludGVybmFsR2V0UmVwZWF0ZWRTY2FsYXJTbGljZSgKKyAgICBDTWVzc2FnZSogY21lc3NhZ2UsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKKyAgICBQeU9iamVjdCogc2xpY2UpIHsKKyAgUHlfc3NpemVfdCBmcm9tOworICBQeV9zc2l6ZV90IHRvOworICBQeV9zc2l6ZV90IHN0ZXA7CisgIFB5X3NzaXplX3QgbGVuZ3RoOworICBib29sIHJldHVybl9saXN0ID0gZmFsc2U7CisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBjbWVzc2FnZS0+bWVzc2FnZTsKKworICBpZiAoUHlJbnRfQ2hlY2soc2xpY2UpKSB7CisgICAgZnJvbSA9IHRvID0gUHlJbnRfQXNMb25nKHNsaWNlKTsKKyAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2soc2xpY2UpKSB7CisgICAgZnJvbSA9IHRvID0gUHlMb25nX0FzTG9uZyhzbGljZSk7CisgIH0gZWxzZSBpZiAoUHlTbGljZV9DaGVjayhzbGljZSkpIHsKKyAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICAgIGxlbmd0aCA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgICAgUHlTbGljZV9HZXRJbmRpY2VzKAorICAgICAgICByZWludGVycHJldF9jYXN0PFB5U2xpY2VPYmplY3QqPihzbGljZSksIGxlbmd0aCwgJmZyb20sICZ0bywgJnN0ZXApOworICAgIHJldHVybl9saXN0ID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmICghcmV0dXJuX2xpc3QpIHsKKyAgICByZXR1cm4gSW50ZXJuYWxHZXRSZXBlYXRlZFNjYWxhcihjbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgZnJvbSk7CisgIH0KKworICBQeU9iamVjdCogbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChmcm9tIDw9IHRvKSB7CisgICAgaWYgKHN0ZXAgPCAwKSByZXR1cm4gbGlzdDsKKyAgICBmb3IgKFB5X3NzaXplX3QgaW5kZXggPSBmcm9tOyBpbmRleCA8IHRvOyBpbmRleCArPSBzdGVwKSB7CisgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgYnJlYWs7CisgICAgICBQeU9iamVjdCogcyA9IEludGVybmFsR2V0UmVwZWF0ZWRTY2FsYXIoCisgICAgICAgICAgY21lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKKyAgICAgIFB5TGlzdF9BcHBlbmQobGlzdCwgcyk7CisgICAgICBQeV9ERUNSRUYocyk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChzdGVwID4gMCkgcmV0dXJuIGxpc3Q7CisgICAgZm9yIChQeV9zc2l6ZV90IGluZGV4ID0gZnJvbTsgaW5kZXggPiB0bzsgaW5kZXggKz0gc3RlcCkgeworICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIGJyZWFrOworICAgICAgUHlPYmplY3QqIHMgPSBJbnRlcm5hbEdldFJlcGVhdGVkU2NhbGFyKAorICAgICAgICAgIGNtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7CisgICAgICBQeUxpc3RfQXBwZW5kKGxpc3QsIHMpOworICAgICAgUHlfREVDUkVGKHMpOworICAgIH0KKyAgfQorICByZXR1cm4gbGlzdDsKK30KKworLy8gLS0tLS0tIEMgQ29uc3RydWN0b3IvRGVzdHJ1Y3RvcjoKKworc3RhdGljIGludCBDTWVzc2FnZUluaXQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykgeworICBzZWxmLT5tZXNzYWdlID0gTlVMTDsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIENNZXNzYWdlRGVhbGxvYyhDTWVzc2FnZSogc2VsZikgeworICBpZiAoc2VsZi0+ZnJlZV9tZXNzYWdlKSB7CisgICAgaWYgKHNlbGYtPnJlYWRfb25seSkgeworICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSk7CisgICAgfQorICAgIGRlbGV0ZSBzZWxmLT5tZXNzYWdlOworICB9CisgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKK30KKworLy8gLS0tLS0tIE1ldGhvZHM6CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQ2xlYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworICBzZWxmLT5tZXNzYWdlLT5DbGVhcigpOworICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9Jc0luaXRpYWxpemVkKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHNlbGYtPm1lc3NhZ2UtPklzSW5pdGlhbGl6ZWQoKSA/IDEgOiAwKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9IYXNGaWVsZChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBjaGFyKiBmaWVsZF9uYW1lOworICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJmZpZWxkX25hbWUsIE5VTEwpIDwgMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9CisgICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoZmllbGRfbmFtZSk7CisgIGlmIChmaWVsZF9kZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gZmllbGQgJXMuIiwgZmllbGRfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBib29sIGhhc19maWVsZCA9CisgICAgICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhoYXNfZmllbGQgPyAxIDogMCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfSGFzRmllbGRCeURlc2NyaXB0b3IoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3IgPSBOVUxMOworICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhyZWludGVycHJldF9jYXN0PFB5T2JqZWN0ICo+KGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZDRmllbGREZXNjcmlwdG9yX1R5cGUpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk11c3QgYmUgYSBmaWVsZCBkZXNjcmlwdG9yIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY2ZpZWxkX2Rlc2NyaXB0b3IgPSByZWludGVycHJldF9jYXN0PENGaWVsZERlc2NyaXB0b3IqPihhcmcpOworCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQorICAgICAgY2ZpZWxkX2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3I7CisKKyAgaWYgKCFGSUVMRF9CRUxPTkdTX1RPX01FU1NBR0UoZmllbGRfZGVzY3JpcHRvciwgbWVzc2FnZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJGaWVsZCBkb2VzIG5vdCBiZWxvbmcgdG8gbWVzc2FnZSEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChGSUVMRF9JU19SRVBFQVRFRChmaWVsZF9kZXNjcmlwdG9yKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkZpZWxkIGlzIHJlcGVhdGVkLiBBIHNpbmd1bGFyIG1ldGhvZCBpcyByZXF1aXJlZC4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGJvb2wgaGFzX2ZpZWxkID0KKyAgICAgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGhhc19maWVsZCA/IDEgOiAwKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9DbGVhckZpZWxkQnlEZXNjcmlwdG9yKAorICAgIENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIENGaWVsZERlc2NyaXB0b3IqIGNmaWVsZF9kZXNjcmlwdG9yID0gTlVMTDsKKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCAqPihhcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNdXN0IGJlIGEgZmllbGQgZGVzY3JpcHRvciIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGNmaWVsZF9kZXNjcmlwdG9yID0gcmVpbnRlcnByZXRfY2FzdDxDRmllbGREZXNjcmlwdG9yKj4oYXJnKTsKKworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0KKyAgICAgIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yOworCisgIGlmICghRklFTERfQkVMT05HU19UT19NRVNTQUdFKGZpZWxkX2Rlc2NyaXB0b3IsIG1lc3NhZ2UpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiRmllbGQgZG9lcyBub3QgYmVsb25nIHRvIG1lc3NhZ2UhIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkNsZWFyRmllbGQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7CisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0NsZWFyRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgY2hhciogZmllbGRfbmFtZTsKKyAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZmaWVsZF9uYW1lLCBOVUxMKSA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQorICAgICAgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGZpZWxkX25hbWUpOworICBpZiAoZmllbGRfZGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJVbmtub3duIGZpZWxkICVzLiIsIGZpZWxkX25hbWUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5DbGVhckZpZWxkKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9HZXRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2Rlc2NyaXB0b3IgPSBOVUxMOworICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhyZWludGVycHJldF9jYXN0PFB5T2JqZWN0ICo+KGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZDRmllbGREZXNjcmlwdG9yX1R5cGUpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk11c3QgYmUgYSBmaWVsZCBkZXNjcmlwdG9yIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY2Rlc2NyaXB0b3IgPSByZWludGVycHJldF9jYXN0PENGaWVsZERlc2NyaXB0b3IqPihhcmcpOworCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICByZXR1cm4gSW50ZXJuYWxHZXRTY2FsYXIobWVzc2FnZSwgY2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3IpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0dldFJlcGVhdGVkU2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBDRmllbGREZXNjcmlwdG9yKiBjZmllbGRfZGVzY3JpcHRvcjsKKyAgUHlPYmplY3QqIHNsaWNlOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgQygiTyFPOkdldFJlcGVhdGVkU2NhbGFyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZzbGljZSkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBJbnRlcm5hbEdldFJlcGVhdGVkU2NhbGFyU2xpY2UoCisgICAgICBzZWxmLCBjZmllbGRfZGVzY3JpcHRvci0+ZGVzY3JpcHRvciwgc2xpY2UpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0Fzc2lnblJlcGVhdGVkU2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBDRmllbGREZXNjcmlwdG9yKiBjZmllbGRfZGVzY3JpcHRvcjsKKyAgUHlPYmplY3QqIHNsaWNlOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgQygiTyFPOkFzc2lnblJlcGVhdGVkU2NhbGFyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZzbGljZSkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5DbGVhckZpZWxkKG1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yKTsKKworICBQeU9iamVjdCogaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2xpY2UpOworICBQeU9iamVjdCogbmV4dDsKKyAgd2hpbGUgKChuZXh0ID0gUHlJdGVyX05leHQoaXRlcikpICE9IE5VTEwpIHsKKyAgICBpZiAoSW50ZXJuYWxBZGRSZXBlYXRlZFNjYWxhcigKKyAgICAgICAgICAgIG1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLCBuZXh0KSA9PSBOVUxMKSB7CisgICAgICBQeV9ERUNSRUYobmV4dCk7CisgICAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKG5leHQpOworICB9CisgIFB5X0RFQ1JFRihpdGVyKTsKKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfRGVsZXRlUmVwZWF0ZWRGaWVsZChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7CisgIFB5T2JqZWN0KiBzbGljZTsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEMoIk8hTzpEZWxldGVSZXBlYXRlZEZpZWxkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZzbGljZSkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBBc3N1cmVXcml0YWJsZShzZWxmKTsKKworICBQeV9zc2l6ZV90IGxlbmd0aCwgZnJvbSwgdG8sIHN0ZXAsIHNsaWNlX2xlbmd0aDsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9CisgICAgICBjZmllbGRfZGVzY3JpcHRvci0+ZGVzY3JpcHRvcjsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgaW50IG1pbiwgbWF4OworICBsZW5ndGggPSByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOworCisgIGlmIChQeUludF9DaGVjayhzbGljZSkgfHwgUHlMb25nX0NoZWNrKHNsaWNlKSkgeworICAgIGZyb20gPSB0byA9IFB5TG9uZ19Bc0xvbmcoc2xpY2UpOworICAgIGlmIChmcm9tIDwgMCkgeworICAgICAgZnJvbSA9IHRvID0gbGVuZ3RoICsgZnJvbTsKKyAgICB9CisgICAgc3RlcCA9IDE7CisgICAgbWluID0gbWF4ID0gZnJvbTsKKworICAgIC8vIFJhbmdlIGNoZWNrLgorICAgIGlmIChmcm9tIDwgMCB8fCBmcm9tID49IGxlbmd0aCkgeworICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsICJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0gZWxzZSBpZiAoUHlTbGljZV9DaGVjayhzbGljZSkpIHsKKyAgICBmcm9tID0gdG8gPSBzdGVwID0gc2xpY2VfbGVuZ3RoID0gMDsKKyAgICBQeVNsaWNlX0dldEluZGljZXNFeCgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeVNsaWNlT2JqZWN0Kj4oc2xpY2UpLAorICAgICAgICBsZW5ndGgsICZmcm9tLCAmdG8sICZzdGVwLCAmc2xpY2VfbGVuZ3RoKTsKKyAgICBpZiAoZnJvbSA8IHRvKSB7CisgICAgICBtaW4gPSBmcm9tOworICAgICAgbWF4ID0gdG8gLSAxOworICAgIH0gZWxzZSB7CisgICAgICBtaW4gPSB0byArIDE7CisgICAgICBtYXggPSBmcm9tOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFB5X3NzaXplX3QgaSA9IGZyb207CisgIHN0ZDo6dmVjdG9yPGJvb2w+IHRvX2RlbGV0ZShsZW5ndGgsIGZhbHNlKTsKKyAgd2hpbGUgKGkgPj0gbWluICYmIGkgPD0gbWF4KSB7CisgICAgdG9fZGVsZXRlW2ldID0gdHJ1ZTsKKyAgICBpICs9IHN0ZXA7CisgIH0KKworICB0byA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIGlmICghdG9fZGVsZXRlW2ldKSB7CisgICAgICBpZiAoaSAhPSB0bykgeworICAgICAgICByZWZsZWN0aW9uLT5Td2FwRWxlbWVudHMobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaSwgdG8pOworICAgICAgfQorICAgICAgKyt0bzsKKyAgICB9CisgIH0KKworICB3aGlsZSAoaSA+IHRvKSB7CisgICAgcmVmbGVjdGlvbi0+UmVtb3ZlTGFzdChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKKyAgICAtLWk7CisgIH0KKworICBQeV9SRVRVUk5fTk9ORTsKK30KKworCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NldFNjYWxhcihDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7CisgIFB5T2JqZWN0KiBhcmc7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBDKCJPIU86U2V0U2NhbGFyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZhcmcpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQXNzdXJlV3JpdGFibGUoc2VsZik7CisKKyAgcmV0dXJuIEludGVybmFsU2V0U2NhbGFyKHNlbGYtPm1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLCBhcmcpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0FkZFJlcGVhdGVkU2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBDRmllbGREZXNjcmlwdG9yKiBjZmllbGRfZGVzY3JpcHRvcjsKKyAgUHlPYmplY3QqIHZhbHVlOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgQygiTyFPOkFkZFJlcGVhdGVkU2NhbGFyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZ2YWx1ZSkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBBc3N1cmVXcml0YWJsZShzZWxmKTsKKworICByZXR1cm4gSW50ZXJuYWxBZGRSZXBlYXRlZFNjYWxhcigKKyAgICAgIHNlbGYtPm1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfRmllbGRMZW5ndGgoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7CisgIGludCBsZW5ndGggPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkZpZWxkU2l6ZSgKKyAgICAgICptZXNzYWdlLCBjZmllbGRfZGVzY3JpcHRvci0+ZGVzY3JpcHRvcik7CisgIHJldHVybiBQeUludF9Gcm9tTG9uZyhsZW5ndGgpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0RlYnVnU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzZWxmLT5tZXNzYWdlLT5EZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NlcmlhbGl6ZVRvU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBpbnQgc2l6ZSA9IHNlbGYtPm1lc3NhZ2UtPkJ5dGVTaXplKCk7CisgIGlmIChzaXplIDw9IDApIHsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgIH0KKyAgUHlPYmplY3QqIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpOworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjaGFyKiBidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgc2VsZi0+bWVzc2FnZS0+U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihidWZmZXIpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoCisgICAgQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIHN0cmluZyBjb250ZW50czsKKyAgc2VsZi0+bWVzc2FnZS0+U2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKCZjb250ZW50cyk7CisgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjb250ZW50cy5jX3N0cigpLCBjb250ZW50cy5zaXplKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlU3RyKENNZXNzYWdlKiBzZWxmKSB7CisgIGNoYXIgc3RyWzEwMjRdOworICBzdHJbc2l6ZW9mKHN0cikgLSAxXSA9IDA7CisgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0cikgLSAxLCAiQ01lc3NhZ2U6IDwlcD4iLCBzZWxmLT5tZXNzYWdlKTsKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9NZXJnZUZyb20oQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ01lc3NhZ2UqIG90aGVyX21lc3NhZ2U7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwgJkNNZXNzYWdlX1R5cGUpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk11c3QgYmUgYSBtZXNzYWdlIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBvdGhlcl9tZXNzYWdlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGFyZyk7CisgIGlmIChvdGhlcl9tZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkgIT0KKyAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJUcmllZCB0byBtZXJnZSBmcm9tIGEgbWVzc2FnZSB3aXRoIGEgZGlmZmVyZW50IHR5cGUuICIKKyAgICAgICAgICAgICAgICAgInRvOiAlcywgZnJvbTogJXMiLAorICAgICAgICAgICAgICAgICBzZWxmLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIG90aGVyX21lc3NhZ2UtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQXNzdXJlV3JpdGFibGUoc2VsZik7CisKKyAgc2VsZi0+bWVzc2FnZS0+TWVyZ2VGcm9tKCpvdGhlcl9tZXNzYWdlLT5tZXNzYWdlKTsKKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQ29weUZyb20oQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ01lc3NhZ2UqIG90aGVyX21lc3NhZ2U7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwgJkNNZXNzYWdlX1R5cGUpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk11c3QgYmUgYSBtZXNzYWdlIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBvdGhlcl9tZXNzYWdlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGFyZyk7CisgIGlmIChvdGhlcl9tZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkgIT0KKyAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJUcmllZCB0byBjb3B5IGZyb20gYSBtZXNzYWdlIHdpdGggYSBkaWZmZXJlbnQgdHlwZS4gIgorICAgICAgICAgICAgICAgICAidG86ICVzLCBmcm9tOiAlcyIsCisgICAgICAgICAgICAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgb3RoZXJfbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworCisgIHNlbGYtPm1lc3NhZ2UtPkNvcHlGcm9tKCpvdGhlcl9tZXNzYWdlLT5tZXNzYWdlKTsKKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfTWVyZ2VGcm9tU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIGNvbnN0IHZvaWQqIGRhdGE7CisgIFB5X3NzaXplX3QgZGF0YV9sZW5ndGg7CisgIGlmIChQeU9iamVjdF9Bc1JlYWRCdWZmZXIoYXJnLCAmZGF0YSwgJmRhdGFfbGVuZ3RoKSA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworICBnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhKSwgZGF0YV9sZW5ndGgpOworICBib29sIHN1Y2Nlc3MgPSBzZWxmLT5tZXNzYWdlLT5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmlucHV0KTsKKyAgaWYgKHN1Y2Nlc3MpIHsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+bWVzc2FnZS0+Qnl0ZVNpemUoKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKC0xKTsKKyAgfQorfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0J5dGVTaXplKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHNlbGYtPm1lc3NhZ2UtPkJ5dGVTaXplKCkpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NldEluUGFyZW50KENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBBc3N1cmVXcml0YWJsZShzZWxmKTsKKyAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfU3dhcFJlcGVhdGVkRmllbGRFbGVtZW50cygKKyAgICBDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7CisgIGludCBpbmRleDEsIGluZGV4MjsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEMoIk8haWk6U3dhcFJlcGVhdGVkRmllbGRFbGVtZW50cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSwgJmNmaWVsZF9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4MSwgJmluZGV4MikpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIHJlZmxlY3Rpb24tPlN3YXBFbGVtZW50cygKKyAgICAgIG1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLCBpbmRleDEsIGluZGV4Mik7CisgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0FkZE1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7CisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworCisgIENNZXNzYWdlKiBweV9jbXNnID0gUHlPYmplY3RfTmV3KENNZXNzYWdlLCAmQ01lc3NhZ2VfVHlwZSk7CisgIGlmIChweV9jbXNnID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBzdWJfbWVzc2FnZSA9CisgICAgICByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yKTsKKworICBweV9jbXNnLT5wYXJlbnQgPSBOVUxMOworICBweV9jbXNnLT5mdWxsX25hbWUgPSBzdWJfbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpOworICBweV9jbXNnLT5tZXNzYWdlID0gc3ViX21lc3NhZ2U7CisgIHB5X2Ntc2ctPmZyZWVfbWVzc2FnZSA9IGZhbHNlOworICBweV9jbXNnLT5yZWFkX29ubHkgPSBmYWxzZTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihweV9jbXNnKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9HZXRSZXBlYXRlZE1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7CisgIENGaWVsZERlc2NyaXB0b3IqIGNmaWVsZF9kZXNjcmlwdG9yOworICBQeU9iamVjdCogc2xpY2U7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBDKCJPIU86R2V0UmVwZWF0ZWRNZXNzYWdlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZzbGljZSkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBJbnRlcm5hbEdldFJlcGVhdGVkU2NhbGFyU2xpY2UoCisgICAgICBzZWxmLCBjZmllbGRfZGVzY3JpcHRvci0+ZGVzY3JpcHRvciwgc2xpY2UpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX05ld1N1Yk1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7CisKKyAgQ01lc3NhZ2UqIHB5X2Ntc2cgPSBQeU9iamVjdF9OZXcoQ01lc3NhZ2UsICZDTWVzc2FnZV9UeXBlKTsKKyAgaWYgKHB5X2Ntc2cgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0KKyAgICAgIHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoKm1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5KTsKKworICBweV9jbXNnLT5mdWxsX25hbWUgPSBzdWJfbWVzc2FnZS5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCk7CisgIHB5X2Ntc2ctPnBhcmVudCA9IHNlbGY7CisgIHB5X2Ntc2ctPnBhcmVudF9maWVsZCA9IGNmaWVsZF9kZXNjcmlwdG9yOworICBweV9jbXNnLT5tZXNzYWdlID0gY29uc3RfY2FzdDxnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKj4oJnN1Yl9tZXNzYWdlKTsKKyAgcHlfY21zZy0+ZnJlZV9tZXNzYWdlID0gZmFsc2U7CisgIHB5X2Ntc2ctPnJlYWRfb25seSA9IHRydWU7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4ocHlfY21zZyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfTXV0YWJsZU1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7CisgIEFzc3VyZVdyaXRhYmxlKHNlbGYpOworCisgIENNZXNzYWdlKiBweV9jbXNnID0gUHlPYmplY3RfTmV3KENNZXNzYWdlLCAmQ01lc3NhZ2VfVHlwZSk7CisgIGlmIChweV9jbXNnID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtdXRhYmxlX21lc3NhZ2UgPQorICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgY2ZpZWxkX2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5KTsKKworICBweV9jbXNnLT5mdWxsX25hbWUgPSBtdXRhYmxlX21lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKTsKKyAgcHlfY21zZy0+bWVzc2FnZSA9IG11dGFibGVfbWVzc2FnZTsKKyAgcHlfY21zZy0+ZnJlZV9tZXNzYWdlID0gZmFsc2U7CisgIHB5X2Ntc2ctPnJlYWRfb25seSA9IGZhbHNlOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHB5X2Ntc2cpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0VxdWFscyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgeworICBDTWVzc2FnZSogb3RoZXJfbWVzc2FnZTsKKyAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCAqPihhcmcpLCAmQ01lc3NhZ2VfVHlwZSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIG1lc3NhZ2UiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBvdGhlcl9tZXNzYWdlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGFyZyk7CisKKyAgaWYgKG90aGVyX21lc3NhZ2UtPm1lc3NhZ2UgPT0gc2VsZi0+bWVzc2FnZSkgeworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CisgIH0KKworICBpZiAob3RoZXJfbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpICE9CisgICAgICBzZWxmLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkpIHsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICB9CisKKyAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9MaXN0RmllbGRzKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgeworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgdmVjdG9yPGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJmZpZWxkcyk7CisKKyAgUHlPYmplY3QqIGxpc3QgPSBQeUxpc3RfTmV3KGZpZWxkcy5zaXplKCkpOworICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgIGJvb2wgaXNfZXh0ZW5zaW9uID0gZmllbGRzW2ldLT5pc19leHRlbnNpb24oKTsKKyAgICBQeU9iamVjdCogdCA9IFB5VHVwbGVfTmV3KDIpOworICAgIGlmICh0ID09IE5VTEwpIHsKKyAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5T2JqZWN0KiBpc19leHRlbnNpb25fb2JqZWN0ID0gUHlCb29sX0Zyb21Mb25nKGlzX2V4dGVuc2lvbiA/IDEgOiAwKTsKKworICAgIFB5T2JqZWN0KiBmaWVsZF9uYW1lOworICAgIGNvbnN0IHN0cmluZyogczsKKyAgICBpZiAoaXNfZXh0ZW5zaW9uKSB7CisgICAgICBzID0gJmZpZWxkc1tpXS0+ZnVsbF9uYW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHMgPSAmZmllbGRzW2ldLT5uYW1lKCk7CisgICAgfQorICAgIGZpZWxkX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLT5jX3N0cigpLCBzLT5sZW5ndGgoKSk7CisgICAgaWYgKGZpZWxkX25hbWUgPT0gTlVMTCkgeworICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgUHlfREVDUkVGKHQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlUdXBsZV9TRVRfSVRFTSh0LCAwLCBpc19leHRlbnNpb25fb2JqZWN0KTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHQsIDEsIGZpZWxkX25hbWUpOworICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCB0KTsKKyAgfQorCisgIHJldHVybiBsaXN0OworfQorCitzdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0ZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhDTWVzc2FnZSogc2VsZikgeworICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKKyAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOworICBtZXNzYWdlLT5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoJmVycm9ycyk7CisKKyAgUHlPYmplY3QqIGVycm9yX2xpc3QgPSBQeUxpc3RfTmV3KGVycm9ycy5zaXplKCkpOworICBpZiAoZXJyb3JfbGlzdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBlcnJvcnMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yID0gZXJyb3JzW2ldOworICAgIFB5T2JqZWN0KiBlcnJvcl9zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgZXJyb3IuY19zdHIoKSwgZXJyb3IubGVuZ3RoKCkpOworICAgIGlmIChlcnJvcl9zdHJpbmcgPT0gTlVMTCkgeworICAgICAgUHlfREVDUkVGKGVycm9yX2xpc3QpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5TGlzdF9TRVRfSVRFTShlcnJvcl9saXN0LCBpLCBlcnJvcl9zdHJpbmcpOworICB9CisgIHJldHVybiBlcnJvcl9saXN0OworfQorCisvLyAtLS0tLS0gUHl0aG9uIENvbnN0cnVjdG9yOgorCitQeU9iamVjdCogUHl0aG9uX05ld0NNZXNzYWdlKFB5T2JqZWN0KiBpZ25vcmVkLCBQeU9iamVjdCogYXJnKSB7CisgIGNvbnN0IGNoYXIqIG1lc3NhZ2VfdHlwZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGFyZyk7CisgIGlmIChtZXNzYWdlX3R5cGUgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IENyZWF0ZU1lc3NhZ2UobWVzc2FnZV90eXBlKTsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJDb3VsZG4ndCBjcmVhdGUgbWVzc2FnZSBvZiB0eXBlICVzISIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBDTWVzc2FnZSogcHlfY21zZyA9IFB5T2JqZWN0X05ldyhDTWVzc2FnZSwgJkNNZXNzYWdlX1R5cGUpOworICBpZiAocHlfY21zZyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcHlfY21zZy0+bWVzc2FnZSA9IG1lc3NhZ2UtPk5ldygpOworICBweV9jbXNnLT5mcmVlX21lc3NhZ2UgPSB0cnVlOworICBweV9jbXNnLT5mdWxsX25hbWUgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCk7CisgIHB5X2Ntc2ctPnJlYWRfb25seSA9IGZhbHNlOworICBweV9jbXNnLT5wYXJlbnQgPSBOVUxMOworICBweV9jbXNnLT5wYXJlbnRfZmllbGQgPSBOVUxMOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHB5X2Ntc2cpOworfQorCisvLyAtLS0gTW9kdWxlIEZ1bmN0aW9ucyAoZXhwb3NlZCB0byBQeXRob24pOgorCitQeU1ldGhvZERlZiBtZXRob2RzW10gPSB7CisgIHsgQygiTmV3Q01lc3NhZ2UiKSwgKFB5Q0Z1bmN0aW9uKVB5dGhvbl9OZXdDTWVzc2FnZSwKKyAgICBNRVRIX08sCisgICAgQygiQ3JlYXRlcyBhIG5ldyBDKysgcHJvdG9jb2wgbWVzc2FnZSwgZ2l2ZW4gaXRzIGZ1bGwgbmFtZS4iKSB9LAorICB7IEMoIk5ld0NEZXNjcmlwdG9yUG9vbCIpLCAoUHlDRnVuY3Rpb24pUHl0aG9uX05ld0NEZXNjcmlwdG9yUG9vbCwKKyAgICBNRVRIX05PQVJHUywKKyAgICBDKCJDcmVhdGVzIGEgbmV3IEMrKyBkZXNjcmlwdG9yIHBvb2wuIikgfSwKKyAgeyBDKCJCdWlsZEZpbGUiKSwgKFB5Q0Z1bmN0aW9uKVB5dGhvbl9CdWlsZEZpbGUsCisgICAgTUVUSF9PLAorICAgIEMoIlJlZ2lzdGVycyBhIG5ldyBwcm90b2NvbCBidWZmZXIgZmlsZSBpbiB0aGUgZ2xvYmFsIEMrKyBkZXNjcmlwdG9yICIKKyAgICAgICJwb29sLiIpIH0sCisgIHtOVUxMfQorfTsKKworLy8gLS0tIEV4cG9zaW5nIHRoZSBDIHByb3RvIGxpdmluZyBpbnNpZGUgUHl0aG9uIHByb3RvIHRvIEMgY29kZToKKworZXh0ZXJuIGNvbnN0IE1lc3NhZ2UqICgqR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZyk7CitleHRlcm4gTWVzc2FnZSogKCpNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZyk7CisKK3N0YXRpYyBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBHZXRDUHJvdG9JbnNpZGVQeVByb3RvSW1wbChQeU9iamVjdCogbXNnKSB7CisgIFB5T2JqZWN0KiBjX21zZ19vYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1zZywgIl9jbXNnIik7CisgIGlmIChjX21zZ19vYmogPT0gTlVMTCkgeworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgUHlfREVDUkVGKGNfbXNnX29iaik7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGNfbXNnX29iaiwgJkNNZXNzYWdlX1R5cGUpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ01lc3NhZ2UqIGNfbXNnID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGNfbXNnX29iaik7CisgIHJldHVybiBjX21zZy0+bWVzc2FnZTsKK30KKworc3RhdGljIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvSW1wbChQeU9iamVjdCogbXNnKSB7CisgIFB5T2JqZWN0KiBjX21zZ19vYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1zZywgIl9jbXNnIik7CisgIGlmIChjX21zZ19vYmogPT0gTlVMTCkgeworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgUHlfREVDUkVGKGNfbXNnX29iaik7CisgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGNfbXNnX29iaiwgJkNNZXNzYWdlX1R5cGUpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ01lc3NhZ2UqIGNfbXNnID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGNfbXNnX29iaik7CisgIEFzc3VyZVdyaXRhYmxlKGNfbXNnKTsKKyAgcmV0dXJuIGNfbXNnLT5tZXNzYWdlOworfQorCisvLyAtLS0gTW9kdWxlIEluaXQgRnVuY3Rpb246CisKK3N0YXRpYyBjb25zdCBjaGFyIG1vZHVsZV9kb2NzdHJpbmdbXSA9CisicHl0aG9uLXByb3RvMiBpcyBhIG1vZHVsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGVuaGFuY2UgcHJvdG8yIFB5dGhvbiBBUElcbiIKKyJwZXJmb3JtYW5jZS5cbiIKKyJcbiIKKyJJdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHByb3RvY29sIGJ1ZmZlcnMgQysrIHJlZmxlY3Rpb24gQVBJIHRoYXRcbiIKKyJpbXBsZW1lbnRzIHRoZSBiYXNpYyBwcm90b2NvbCBidWZmZXIgZnVuY3Rpb25zLiI7CisKK2V4dGVybiAiQyIgeworICB2b2lkIGluaXRfbmV0X3Byb3RvMl9fX3B5dGhvbigpIHsKKyAgICAvLyBJbml0aWFsaXplIGNvbnN0YW50cy4KKyAgICBrUHl0aG9uWmVybyA9IFB5SW50X0Zyb21Mb25nKDApOworICAgIGtpbnQzMm1pbl9weSA9IFB5SW50X0Zyb21Mb25nKGtpbnQzMm1pbik7CisgICAga2ludDMybWF4X3B5ID0gUHlJbnRfRnJvbUxvbmcoa2ludDMybWF4KTsKKyAgICBrdWludDMybWF4X3B5ID0gUHlMb25nX0Zyb21Mb25nTG9uZyhrdWludDMybWF4KTsKKyAgICBraW50NjRtaW5fcHkgPSBQeUxvbmdfRnJvbUxvbmdMb25nKGtpbnQ2NG1pbik7CisgICAga2ludDY0bWF4X3B5ID0gUHlMb25nX0Zyb21Mb25nTG9uZyhraW50NjRtYXgpOworICAgIGt1aW50NjRtYXhfcHkgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoa3VpbnQ2NG1heCk7CisKKyAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5ID0gbmV3IER5bmFtaWNNZXNzYWdlRmFjdG9yeShHZXREZXNjcmlwdG9yUG9vbCgpKTsKKyAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5LT5TZXREZWxlZ2F0ZVRvR2VuZXJhdGVkRmFjdG9yeSh0cnVlKTsKKworICAgIC8vIEV4cG9ydCBvdXIgZnVuY3Rpb25zIHRvIFB5dGhvbi4KKyAgICBQeU9iamVjdCAqbTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoQygiX25ldF9wcm90bzJfX19weXRob24iKSwgbWV0aG9kcywgQyhtb2R1bGVfZG9jc3RyaW5nKSk7CisgICAgaWYgKG0gPT0gTlVMTCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFkZENvbnN0YW50cyhtKTsKKworICAgIENNZXNzYWdlX1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ01lc3NhZ2VfVHlwZSkgPCAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJbml0RGVzY3JpcHRvcigpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gT3ZlcnJpZGUge0dldCxNdXRhYmxlfUNQcm90b0luc2lkZVB5UHJvdG8uCisgICAgR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1B0ciA9IEdldENQcm90b0luc2lkZVB5UHJvdG9JbXBsOworICAgIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvUHRyID0gTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG9JbXBsOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX2Rlc2NyaXB0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjg3YmFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX2Rlc2NyaXB0b3IuY2MKQEAgLTAsMCArMSwzMzQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KQorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorCisjZGVmaW5lIEMoc3RyKSBjb25zdF9jYXN0PGNoYXIqPihzdHIpCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBweXRob24geworCitzdGF0aWMgdm9pZCBDRmllbGREZXNjcmlwdG9yRGVhbGxvYyhDRmllbGREZXNjcmlwdG9yKiBzZWxmKTsKKworc3RhdGljIGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sKiBnX2Rlc2NyaXB0b3JfcG9vbCA9IE5VTEw7CisKK3N0YXRpYyBQeU9iamVjdCogQ0ZpZWxkRGVzY3JpcHRvcl9HZXRGdWxsTmFtZSgKKyAgICBDRmllbGREZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7CisgIFB5X1hJTkNSRUYoc2VsZi0+ZnVsbF9uYW1lKTsKKyAgcmV0dXJuIHNlbGYtPmZ1bGxfbmFtZTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDRmllbGREZXNjcmlwdG9yX0dldE5hbWUoCisgICAgQ0ZpZWxkRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBQeV9YSU5DUkVGKHNlbGYtPm5hbWUpOworICByZXR1cm4gc2VsZi0+bmFtZTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDRmllbGREZXNjcmlwdG9yX0dldENwcFR5cGUoCisgICAgQ0ZpZWxkRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBQeV9YSU5DUkVGKHNlbGYtPmNwcF90eXBlKTsKKyAgcmV0dXJuIHNlbGYtPmNwcF90eXBlOworfQorCitzdGF0aWMgUHlPYmplY3QqIENGaWVsZERlc2NyaXB0b3JfR2V0TGFiZWwoCisgICAgQ0ZpZWxkRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBQeV9YSU5DUkVGKHNlbGYtPmxhYmVsKTsKKyAgcmV0dXJuIHNlbGYtPmxhYmVsOworfQorCitzdGF0aWMgUHlPYmplY3QqIENGaWVsZERlc2NyaXB0b3JfR2V0SUQoCisgICAgQ0ZpZWxkRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgeworICBQeV9YSU5DUkVGKHNlbGYtPmlkKTsKKyAgcmV0dXJuIHNlbGYtPmlkOworfQorCisKK3N0YXRpYyBQeUdldFNldERlZiBDRmllbGREZXNjcmlwdG9yR2V0dGVyc1tdID0geworICB7IEMoImZ1bGxfbmFtZSIpLAorICAgIChnZXR0ZXIpQ0ZpZWxkRGVzY3JpcHRvcl9HZXRGdWxsTmFtZSwgTlVMTCwgIkZ1bGwgbmFtZSIsIE5VTEx9LAorICB7IEMoIm5hbWUiKSwKKyAgICAoZ2V0dGVyKUNGaWVsZERlc2NyaXB0b3JfR2V0TmFtZSwgTlVMTCwgImxhc3QgbmFtZSIsIE5VTEx9LAorICB7IEMoImNwcF90eXBlIiksCisgICAgKGdldHRlcilDRmllbGREZXNjcmlwdG9yX0dldENwcFR5cGUsIE5VTEwsICJDKysgVHlwZSIsIE5VTEx9LAorICB7IEMoImxhYmVsIiksCisgICAgKGdldHRlcilDRmllbGREZXNjcmlwdG9yX0dldExhYmVsLCBOVUxMLCAiTGFiZWwiLCBOVUxMfSwKKyAgeyBDKCJpZCIpLAorICAgIChnZXR0ZXIpQ0ZpZWxkRGVzY3JpcHRvcl9HZXRJRCwgTlVMTCwgIklEIiwgTlVMTH0sCisgIHtOVUxMfQorfTsKKworUHlUeXBlT2JqZWN0IENGaWVsZERlc2NyaXB0b3JfVHlwZSA9IHsKKyAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgMCwKKyAgQygiZ29vZ2xlMy5uZXQuZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC4iCisgICAgIl9uZXRfcHJvdG8yX19fcHl0aG9uLiIKKyAgICAiQ0ZpZWxkRGVzY3JpcHRvciIpLCAgICAgICAgICAgICAgICAvLyB0cF9uYW1lCisgIHNpemVvZihDRmllbGREZXNjcmlwdG9yKSwgICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKKyAgKGRlc3RydWN0b3IpQ0ZpZWxkRGVzY3JpcHRvckRlYWxsb2MsICAvLyB0cF9kZWFsbG9jCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcHJpbnQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yZXByCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19tYXBwaW5nCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCisgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgLy8gdHBfZmxhZ3MKKyAgQygiQSBGaWVsZCBEZXNjcmlwdG9yIiksICAgICAgICAgICAgICAvLyB0cF9kb2MKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF90cmF2ZXJzZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21ldGhvZHMKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCisgIENGaWVsZERlc2NyaXB0b3JHZXR0ZXJzLCAgICAgICAgICAgICAgLy8gdHBfZ2V0c2V0CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3QKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9nZXQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9zZXQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0b2Zmc2V0CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaW5pdAorICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgIC8vIHRwX2FsbG9jCisgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgLy8gdHBfbmV3CisgIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZnJlZQorfTsKKworc3RhdGljIHZvaWQgQ0ZpZWxkRGVzY3JpcHRvckRlYWxsb2MoQ0ZpZWxkRGVzY3JpcHRvciogc2VsZikgeworICBQeV9ERUNSRUYoc2VsZi0+ZnVsbF9uYW1lKTsKKyAgUHlfREVDUkVGKHNlbGYtPm5hbWUpOworICBQeV9ERUNSRUYoc2VsZi0+Y3BwX3R5cGUpOworICBQeV9ERUNSRUYoc2VsZi0+bGFiZWwpOworICBQeV9ERUNSRUYoc2VsZi0+aWQpOworICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSk7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgUHlPYmplY3RfSEVBRAorCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sKiBwb29sOworfSBDRGVzY3JpcHRvclBvb2w7CisKK3N0YXRpYyB2b2lkIENEZXNjcmlwdG9yUG9vbERlYWxsb2MoQ0Rlc2NyaXB0b3JQb29sKiBzZWxmKTsKKworc3RhdGljIFB5T2JqZWN0KiBDRGVzY3JpcHRvclBvb2xfTmV3Q0Rlc2NyaXB0b3IoCisgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yKSB7CisgIENGaWVsZERlc2NyaXB0b3IqIGNmaWVsZF9kZXNjcmlwdG9yID0gUHlPYmplY3RfTmV3KAorICAgICAgQ0ZpZWxkRGVzY3JpcHRvciwgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSk7CisgIGlmIChjZmllbGRfZGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY2ZpZWxkX2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3IgPSBmaWVsZF9kZXNjcmlwdG9yOworCisgIGNmaWVsZF9kZXNjcmlwdG9yLT5mdWxsX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKAorICAgICAgZmllbGRfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7CisgIGNmaWVsZF9kZXNjcmlwdG9yLT5uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygKKyAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPm5hbWUoKS5jX3N0cigpKTsKKyAgY2ZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlID0gUHlMb25nX0Zyb21Mb25nKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOworICBjZmllbGRfZGVzY3JpcHRvci0+bGFiZWwgPSBQeUxvbmdfRnJvbUxvbmcoZmllbGRfZGVzY3JpcHRvci0+bGFiZWwoKSk7CisgIGNmaWVsZF9kZXNjcmlwdG9yLT5pZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cihjZmllbGRfZGVzY3JpcHRvcik7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oY2ZpZWxkX2Rlc2NyaXB0b3IpOworfQorCitzdGF0aWMgUHlPYmplY3QqIENEZXNjcmlwdG9yUG9vbF9GaW5kRmllbGRCeU5hbWUoCisgICAgQ0Rlc2NyaXB0b3JQb29sKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7CisgIGNvbnN0IGNoYXIqIGZ1bGxfZmllbGRfbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGFyZyk7CisgIGlmIChmdWxsX2ZpZWxkX25hbWUgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0gTlVMTDsKKworICBmaWVsZF9kZXNjcmlwdG9yID0gc2VsZi0+cG9vbC0+RmluZEZpZWxkQnlOYW1lKGZ1bGxfZmllbGRfbmFtZSk7CisgIGlmIChmaWVsZF9kZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiQ291bGRuJ3QgZmluZCBmaWVsZCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICBmdWxsX2ZpZWxkX25hbWUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIENEZXNjcmlwdG9yUG9vbF9OZXdDRGVzY3JpcHRvcihmaWVsZF9kZXNjcmlwdG9yKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBDRGVzY3JpcHRvclBvb2xfRmluZEV4dGVuc2lvbkJ5TmFtZSgKKyAgICBDRGVzY3JpcHRvclBvb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKKyAgY29uc3QgY2hhciogZnVsbF9maWVsZF9uYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoYXJnKTsKKyAgaWYgKGZ1bGxfZmllbGRfbmFtZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQorICAgICAgc2VsZi0+cG9vbC0+RmluZEV4dGVuc2lvbkJ5TmFtZShmdWxsX2ZpZWxkX25hbWUpOworICBpZiAoZmllbGRfZGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIkNvdWxkbid0IGZpbmQgZmllbGQgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgZnVsbF9maWVsZF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBDRGVzY3JpcHRvclBvb2xfTmV3Q0Rlc2NyaXB0b3IoZmllbGRfZGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBDRGVzY3JpcHRvclBvb2xNZXRob2RzW10gPSB7CisgIHsgQygiRmluZEZpZWxkQnlOYW1lIiksCisgICAgKFB5Q0Z1bmN0aW9uKUNEZXNjcmlwdG9yUG9vbF9GaW5kRmllbGRCeU5hbWUsCisgICAgTUVUSF9PLAorICAgIEMoIlNlYXJjaGVzIGZvciBhIGZpZWxkIGRlc2NyaXB0b3IgYnkgZnVsbCBuYW1lLiIpIH0sCisgIHsgQygiRmluZEV4dGVuc2lvbkJ5TmFtZSIpLAorICAgIChQeUNGdW5jdGlvbilDRGVzY3JpcHRvclBvb2xfRmluZEV4dGVuc2lvbkJ5TmFtZSwKKyAgICBNRVRIX08sCisgICAgQygiU2VhcmNoZXMgZm9yIGV4dGVuc2lvbiBkZXNjcmlwdG9yIGJ5IGZ1bGwgbmFtZS4iKSB9LAorICB7TlVMTH0KK307CisKK1B5VHlwZU9iamVjdCBDRGVzY3JpcHRvclBvb2xfVHlwZSA9IHsKKyAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgMCwKKyAgQygiZ29vZ2xlMy5uZXQuZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC4iCisgICAgIl9uZXRfcHJvdG8yX19fcHl0aG9uLiIKKyAgICAiQ0ZpZWxkRGVzY3JpcHRvciIpLCAgICAgICAgICAgICAgIC8vIHRwX25hbWUKKyAgc2l6ZW9mKENEZXNjcmlwdG9yUG9vbCksICAgICAgICAgICAgIC8vIHRwX2Jhc2ljc2l6ZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKKyAgKGRlc3RydWN0b3IpQ0Rlc2NyaXB0b3JQb29sRGVhbGxvYywgIC8vIHRwX2RlYWxsb2MKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3ByaW50CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRyCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yZXByCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19udW1iZXIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19tYXBwaW5nCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9oYXNoCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHJvCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCisgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAvLyB0cF9mbGFncworICBDKCJBIERlc2NyaXB0b3IgUG9vbCIpLCAgICAgICAgICAgICAgLy8gdHBfZG9jCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF90cmF2ZXJzZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2xlYXIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JpY2hjb21wYXJlCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcgorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKKyAgQ0Rlc2NyaXB0b3JQb29sTWV0aG9kcywgICAgICAgICAgICAgIC8vIHRwX21ldGhvZHMKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21lbWJlcnMKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldHNldAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzZQorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGljdAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3JfZ2V0CisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9zZXQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3RvZmZzZXQKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2luaXQKKyAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgIC8vIHRwX2FsbG9jCisgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAvLyB0cF9uZXcKKyAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2ZyZWUKK307CisKK3N0YXRpYyB2b2lkIENEZXNjcmlwdG9yUG9vbERlYWxsb2MoQ0Rlc2NyaXB0b3JQb29sKiBzZWxmKSB7CisgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKK30KKworZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2wqIEdldERlc2NyaXB0b3JQb29sKCkgeworICBpZiAoZ19kZXNjcmlwdG9yX3Bvb2wgPT0gTlVMTCkgeworICAgIGdfZGVzY3JpcHRvcl9wb29sID0gbmV3IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sKAorICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSk7CisgIH0KKyAgcmV0dXJuIGdfZGVzY3JpcHRvcl9wb29sOworfQorCitQeU9iamVjdCogUHl0aG9uX05ld0NEZXNjcmlwdG9yUG9vbChQeU9iamVjdCogaWdub3JlZCwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgQ0Rlc2NyaXB0b3JQb29sKiBjZGVzY3JpcHRvcl9wb29sID0gUHlPYmplY3RfTmV3KAorICAgICAgQ0Rlc2NyaXB0b3JQb29sLCAmQ0Rlc2NyaXB0b3JQb29sX1R5cGUpOworICBpZiAoY2Rlc2NyaXB0b3JfcG9vbCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY2Rlc2NyaXB0b3JfcG9vbC0+cG9vbCA9IEdldERlc2NyaXB0b3JQb29sKCk7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oY2Rlc2NyaXB0b3JfcG9vbCk7Cit9CisKK1B5T2JqZWN0KiBQeXRob25fQnVpbGRGaWxlKFB5T2JqZWN0KiBpZ25vcmVkLCBQeU9iamVjdCogYXJnKSB7CisgIGNoYXIqIG1lc3NhZ2VfdHlwZTsKKyAgUHlfc3NpemVfdCBtZXNzYWdlX2xlbjsKKworICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJm1lc3NhZ2VfdHlwZSwgJm1lc3NhZ2VfbGVuKSA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgaWYgKCFmaWxlX3Byb3RvLlBhcnNlRnJvbUFycmF5KG1lc3NhZ2VfdHlwZSwgbWVzc2FnZV9sZW4pKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNvdWxkbid0IHBhcnNlIGZpbGUgY29udGVudCEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIElmIHRoaXMgZmlsZSBpcyBhbHJlYWR5IGluIHRoZSBnZW5lcmF0ZWQgcG9vbCwgZG9uJ3QgYWRkIGl0IGFnYWluLgorICBpZiAoZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCktPkZpbmRGaWxlQnlOYW1lKAorICAgICAgZmlsZV9wcm90by5uYW1lKCkpICE9IE5VTEwpIHsKKyAgICBQeV9SRVRVUk5fTk9ORTsKKyAgfQorCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gR2V0RGVzY3JpcHRvclBvb2woKS0+QnVpbGRGaWxlKAorICAgICAgZmlsZV9wcm90byk7CisgIGlmIChkZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgYnVpbGQgcHJvdG8gZmlsZSBpbnRvIGRlc2NyaXB0b3IgcG9vbCEiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFB5X1JFVFVSTl9OT05FOworfQorCitib29sIEluaXREZXNjcmlwdG9yKCkgeworICBDRmllbGREZXNjcmlwdG9yX1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgIGlmIChQeVR5cGVfUmVhZHkoJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkgPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBDRGVzY3JpcHRvclBvb2xfVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgaWYgKFB5VHlwZV9SZWFkeSgmQ0Rlc2NyaXB0b3JQb29sX1R5cGUpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9kZXNjcmlwdG9yLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzI2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsODcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KQorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fREVTQ1JJUFRPUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9ERVNDUklQVE9SX0hfXworCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSA8c3RydWN0bWVtYmVyLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwICYmICFkZWZpbmVkKFBZX1NTSVpFX1RfTUlOKQordHlwZWRlZiBpbnQgUHlfc3NpemVfdDsKKyNkZWZpbmUgUFlfU1NJWkVfVF9NQVggSU5UX01BWAorI2RlZmluZSBQWV9TU0laRV9UX01JTiBJTlRfTUlOCisjZW5kaWYKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHB5dGhvbiB7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgUHlPYmplY3RfSEVBRAorCisgIC8vIFRoZSBwcm90bzIgZGVzY3JpcHRvciB0aGF0IHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcjsKKworICAvLyBGdWxsIG5hbWUgb2YgdGhlIGZpZWxkIChQeVN0cmluZykuCisgIFB5T2JqZWN0KiBmdWxsX25hbWU7CisKKyAgLy8gTmFtZSBvZiB0aGUgZmllbGQgKFB5U3RyaW5nKS4KKyAgUHlPYmplY3QqIG5hbWU7CisKKyAgLy8gQysrIHR5cGUgb2YgdGhlIGZpZWxkIChQeUxvbmcpLgorICBQeU9iamVjdCogY3BwX3R5cGU7CisKKyAgLy8gTmFtZSBvZiB0aGUgZmllbGQgKFB5TG9uZykuCisgIFB5T2JqZWN0KiBsYWJlbDsKKworICAvLyBJZGVudGl0eSBvZiB0aGUgZGVzY3JpcHRvciAoUHlMb25nIHVzZWQgYXMgYSBwb2luZXIpLgorICBQeU9iamVjdCogaWQ7Cit9IENGaWVsZERlc2NyaXB0b3I7CisKK2V4dGVybiBQeVR5cGVPYmplY3QgQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlOworCitleHRlcm4gUHlUeXBlT2JqZWN0IENEZXNjcmlwdG9yUG9vbF9UeXBlOworCisKK1B5T2JqZWN0KiBQeXRob25fTmV3Q0Rlc2NyaXB0b3JQb29sKFB5T2JqZWN0KiBpZ25vcmVkLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogUHl0aG9uX0J1aWxkRmlsZShQeU9iamVjdCogaWdub3JlZCwgUHlPYmplY3QqIGFyZ3MpOworYm9vbCBJbml0RGVzY3JpcHRvcigpOworZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2wqIEdldERlc2NyaXB0b3JQb29sKCk7CisKK30gIC8vIG5hbWVzcGFjZSBweXRob24KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fREVTQ1JJUFRPUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFhYjVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmNjCkBAIC0wLDAgKzEsNjMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcXJjemFrQGdvb2dsZS5jb20gKE1hcmNpbiBLb3dhbGN6eWspCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBweXRob24geworCitzdGF0aWMgY29uc3QgTWVzc2FnZSogR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1N0dWIoUHlPYmplY3QqIG1zZykgeworICByZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBNZXNzYWdlKiBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1N0dWIoUHlPYmplY3QqIG1zZykgeworICByZXR1cm4gTlVMTDsKK30KKworLy8gVGhpcyBpcyBpbml0aWFsaXplZCB3aXRoIGEgZGVmYXVsdCwgc3R1YiBpbXBsZW1lbnRhdGlvbi4KKy8vIElmIHB5dGhvbi1nb29nbGUucHJvdG9idWYuY2MgaXMgbG9hZGVkLCB0aGUgZnVuY3Rpb24gcG9pbnRlciBpcyBvdmVycmlkZGVuCisvLyB3aXRoIGEgZnVsbCBpbXBsZW1lbnRhdGlvbi4KK2NvbnN0IE1lc3NhZ2UqICgqR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZykgPQorICAgIEdldENQcm90b0luc2lkZVB5UHJvdG9TdHViOworTWVzc2FnZSogKCpNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZykgPQorICAgIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvU3R1YjsKKworY29uc3QgTWVzc2FnZSogR2V0Q1Byb3RvSW5zaWRlUHlQcm90byhQeU9iamVjdCogbXNnKSB7CisgIHJldHVybiBHZXRDUHJvdG9JbnNpZGVQeVByb3RvUHRyKG1zZyk7Cit9CitNZXNzYWdlKiBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90byhQeU9iamVjdCogbXNnKSB7CisgIHJldHVybiBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1B0cihtc2cpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMGIxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcXJjemFrQGdvb2dsZS5jb20gKE1hcmNpbiBLb3dhbGN6eWspCisvLworLy8gVGhpcyBtb2R1bGUgZXhwb3NlcyB0aGUgQyBwcm90byBpbnNpZGUgdGhlIGdpdmVuIFB5dGhvbiBwcm90bywgaW4KKy8vIGNhc2UgdGhlIFB5dGhvbiBwcm90byBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgQyBwcm90by4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX1BZVEhPTl9QUk9UT0JVRl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9QWVRIT05fUFJPVE9CVUZfSF9fCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBNZXNzYWdlOworCituYW1lc3BhY2UgcHl0aG9uIHsKKworLy8gUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBDIHByb3RvIGluc2lkZSB0aGUgZ2l2ZW4gUHl0aG9uIHByb3RvLAorLy8gb3IgTlVMTCB3aGVuIHRoaXMgaXMgbm90IGEgUHl0aG9uIHByb3RvIGltcGxlbWVudGVkIHdpdGggYSBDIHByb3RvLgorY29uc3QgTWVzc2FnZSogR2V0Q1Byb3RvSW5zaWRlUHlQcm90byhQeU9iamVjdCogbXNnKTsKK01lc3NhZ2UqIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvKFB5T2JqZWN0KiBtc2cpOworCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX1BZVEhPTl9QUk9UT0JVRl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24ucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzNzNjODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLnB5CkBAIC0wLDAgKzEsMTQyIEBACisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBUaGlzIGNvZGUgaXMgbWVhbnQgdG8gd29yayBvbiBQeXRob24gMi40IGFuZCBhYm92ZSBvbmx5LgorCisiIiJDb250YWlucyBhIG1ldGFjbGFzcyBhbmQgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIHRvIGNyZWF0ZQorcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzIGZyb20gRGVzY3JpcHRvciBvYmplY3RzIGF0IHJ1bnRpbWUuCisKK1JlY2FsbCB0aGF0IGEgbWV0YWNsYXNzIGlzIHRoZSAidHlwZSIgb2YgYSBjbGFzcy4KKyhBIGNsYXNzIGlzIHRvIGEgbWV0YWNsYXNzIHdoYXQgYW4gaW5zdGFuY2UgaXMgdG8gYSBjbGFzcy4pCisKK0luIHRoaXMgY2FzZSwgd2UgdXNlIHRoZSBHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlIG1ldGFjbGFzcwordG8gaW5qZWN0IGFsbCB0aGUgdXNlZnVsIGZ1bmN0aW9uYWxpdHkgaW50byB0aGUgY2xhc3Nlcworb3V0cHV0IGJ5IHRoZSBwcm90b2NvbCBjb21waWxlciBhdCBjb21waWxlLXRpbWUuCisKK1RoZSB1cHNob3Qgb2YgYWxsIHRoaXMgaXMgdGhhdCB0aGUgcmVhbCBpbXBsZW1lbnRhdGlvbgorZGV0YWlscyBmb3IgQUxMIHB1cmUtUHl0aG9uIHByb3RvY29sIGJ1ZmZlcnMgYXJlICpoZXJlIGluCit0aGlzIGZpbGUqLgorIiIiCisKK19fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCisKKworZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgorZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IgYXMgZGVzY3JpcHRvcl9tb2QKK19GaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yX21vZC5GaWVsZERlc2NyaXB0b3IKKworCitpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnOgorICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgY3BwX21lc3NhZ2UKKyAgX05ld01lc3NhZ2UgPSBjcHBfbWVzc2FnZS5OZXdNZXNzYWdlCisgIF9Jbml0TWVzc2FnZSA9IGNwcF9tZXNzYWdlLkluaXRNZXNzYWdlCitlbHNlOgorICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgcHl0aG9uX21lc3NhZ2UKKyAgX05ld01lc3NhZ2UgPSBweXRob25fbWVzc2FnZS5OZXdNZXNzYWdlCisgIF9Jbml0TWVzc2FnZSA9IHB5dGhvbl9tZXNzYWdlLkluaXRNZXNzYWdlCisKKworY2xhc3MgR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSh0eXBlKToKKworICAiIiJNZXRhY2xhc3MgZm9yIHByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBjcmVhdGVkIGF0IHJ1bnRpbWUgZnJvbSBEZXNjcmlwdG9ycy4KKworICBXZSBhZGQgaW1wbGVtZW50YXRpb25zIGZvciBhbGwgbWV0aG9kcyBkZXNjcmliZWQgaW4gdGhlIE1lc3NhZ2UgY2xhc3MuICBXZQorICBhbHNvIGNyZWF0ZSBwcm9wZXJ0aWVzIHRvIGFsbG93IGdldHRpbmcvc2V0dGluZyBhbGwgZmllbGRzIGluIHRoZSBwcm90b2NvbAorICBtZXNzYWdlLiAgRmluYWxseSwgd2UgY3JlYXRlIHNsb3RzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSBhY2NpZGVudGFsbHkKKyAgInNldHRpbmciIG5vbmV4aXN0ZW50IGZpZWxkcyBpbiB0aGUgcHJvdG9jb2wgbWVzc2FnZSwgd2hpY2ggdGhlbiB3b3VsZG4ndCBnZXQKKyAgc2VyaWFsaXplZCAvIGRlc2VyaWFsaXplZCBwcm9wZXJseS4KKworICBUaGUgcHJvdG9jb2wgY29tcGlsZXIgY3VycmVudGx5IHVzZXMgdGhpcyBtZXRhY2xhc3MgdG8gY3JlYXRlIHByb3RvY29sCisgIG1lc3NhZ2UgY2xhc3NlcyBhdCBydW50aW1lLiAgQ2xpZW50cyBjYW4gYWxzbyBtYW51YWxseSBjcmVhdGUgdGhlaXIgb3duCisgIGNsYXNzZXMgYXQgcnVudGltZSwgYXMgaW4gdGhpcyBleGFtcGxlOgorCisgIG15ZGVzY3JpcHRvciA9IERlc2NyaXB0b3IoLi4uLi4pCisgIGNsYXNzIE15UHJvdG9DbGFzcyhNZXNzYWdlKToKKyAgICBfX21ldGFjbGFzc19fID0gR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQorICAgIERFU0NSSVBUT1IgPSBteWRlc2NyaXB0b3IKKyAgbXlwcm90b19pbnN0YW5jZSA9IE15UHJvdG9DbGFzcygpCisgIG15cHJvdG8uZm9vX2ZpZWxkID0gMjMKKyAgLi4uCisgICIiIgorCisgICMgTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHByb3RvY29sLWNvbXBpbGVyIGNvZGUgaW4KKyAgIyBwcm90bzIvY29tcGlsZXIvaW50ZXJuYWwvZ2VuZXJhdG9yLiouCisgIF9ERVNDUklQVE9SX0tFWSA9ICdERVNDUklQVE9SJworCisgIGRlZiBfX25ld19fKGNscywgbmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpOgorICAgICIiIkN1c3RvbSBhbGxvY2F0aW9uIGZvciBydW50aW1lLWdlbmVyYXRlZCBjbGFzcyB0eXBlcy4KKworICAgIFdlIG92ZXJyaWRlIF9fbmV3X18gYmVjYXVzZSB0aGlzIGlzIGFwcGFyZW50bHkgdGhlIG9ubHkgcGxhY2UKKyAgICB3aGVyZSB3ZSBjYW4gbWVhbmluZ2Z1bGx5IHNldCBfX3Nsb3RzX18gb24gdGhlIGNsYXNzIHdlJ3JlIGNyZWF0aW5nKD8pLgorICAgIChUaGUgaW50ZXJwbGF5IGJldHdlZW4gbWV0YWNsYXNzZXMgYW5kIHNsb3RzIGlzIG5vdCB2ZXJ5IHdlbGwtZG9jdW1lbnRlZCkuCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogTmFtZSBvZiB0aGUgY2xhc3MgKGlnbm9yZWQsIGJ1dCByZXF1aXJlZCBieSB0aGUKKyAgICAgICAgbWV0YWNsYXNzIHByb3RvY29sKS4KKyAgICAgIGJhc2VzOiBCYXNlIGNsYXNzZXMgb2YgdGhlIGNsYXNzIHdlJ3JlIGNvbnN0cnVjdGluZy4KKyAgICAgICAgKFNob3VsZCBiZSBtZXNzYWdlLk1lc3NhZ2UpLiAgV2UgaWdub3JlIHRoaXMgZmllbGQsIGJ1dAorICAgICAgICBpdCdzIHJlcXVpcmVkIGJ5IHRoZSBtZXRhY2xhc3MgcHJvdG9jb2wKKyAgICAgIGRpY3Rpb25hcnk6IFRoZSBjbGFzcyBkaWN0aW9uYXJ5IG9mIHRoZSBjbGFzcyB3ZSdyZQorICAgICAgICBjb25zdHJ1Y3RpbmcuICBkaWN0aW9uYXJ5W19ERVNDUklQVE9SX0tFWV0gbXVzdCBjb250YWluCisgICAgICAgIGEgRGVzY3JpcHRvciBvYmplY3QgZGVzY3JpYmluZyB0aGlzIHByb3RvY29sIG1lc3NhZ2UKKyAgICAgICAgdHlwZS4KKworICAgIFJldHVybnM6CisgICAgICBOZXdseS1hbGxvY2F0ZWQgY2xhc3MuCisgICAgIiIiCisgICAgZGVzY3JpcHRvciA9IGRpY3Rpb25hcnlbR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZS5fREVTQ1JJUFRPUl9LRVldCisgICAgX05ld01lc3NhZ2UoZGVzY3JpcHRvciwgZGljdGlvbmFyeSkKKyAgICBzdXBlcmNsYXNzID0gc3VwZXIoR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSwgY2xzKQorCisgICAgbmV3X2NsYXNzID0gc3VwZXJjbGFzcy5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpCisgICAgc2V0YXR0cihkZXNjcmlwdG9yLCAnX2NvbmNyZXRlX2NsYXNzJywgbmV3X2NsYXNzKQorICAgIHJldHVybiBuZXdfY2xhc3MKKworICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSk6CisgICAgIiIiSGVyZSB3ZSBwZXJmb3JtIHRoZSBtYWpvcml0eSBvZiBvdXIgd29yayBvbiB0aGUgY2xhc3MuCisgICAgV2UgYWRkIGVudW0gZ2V0dGVycywgYW4gX19pbml0X18gbWV0aG9kLCBpbXBsZW1lbnRhdGlvbnMKKyAgICBvZiBhbGwgTWVzc2FnZSBtZXRob2RzLCBhbmQgcHJvcGVydGllcyBmb3IgYWxsIGZpZWxkcworICAgIGluIHRoZSBwcm90b2NvbCB0eXBlLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IE5hbWUgb2YgdGhlIGNsYXNzIChpZ25vcmVkLCBidXQgcmVxdWlyZWQgYnkgdGhlCisgICAgICAgIG1ldGFjbGFzcyBwcm90b2NvbCkuCisgICAgICBiYXNlczogQmFzZSBjbGFzc2VzIG9mIHRoZSBjbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcuCisgICAgICAgIChTaG91bGQgYmUgbWVzc2FnZS5NZXNzYWdlKS4gIFdlIGlnbm9yZSB0aGlzIGZpZWxkLCBidXQKKyAgICAgICAgaXQncyByZXF1aXJlZCBieSB0aGUgbWV0YWNsYXNzIHByb3RvY29sCisgICAgICBkaWN0aW9uYXJ5OiBUaGUgY2xhc3MgZGljdGlvbmFyeSBvZiB0aGUgY2xhc3Mgd2UncmUKKyAgICAgICAgY29uc3RydWN0aW5nLiAgZGljdGlvbmFyeVtfREVTQ1JJUFRPUl9LRVldIG11c3QgY29udGFpbgorICAgICAgICBhIERlc2NyaXB0b3Igb2JqZWN0IGRlc2NyaWJpbmcgdGhpcyBwcm90b2NvbCBtZXNzYWdlCisgICAgICAgIHR5cGUuCisgICAgIiIiCisgICAgZGVzY3JpcHRvciA9IGRpY3Rpb25hcnlbR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZS5fREVTQ1JJUFRPUl9LRVldCisgICAgX0luaXRNZXNzYWdlKGRlc2NyaXB0b3IsIGNscykKKyAgICBzdXBlcmNsYXNzID0gc3VwZXIoR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSwgY2xzKQorICAgIHN1cGVyY2xhc3MuX19pbml0X18obmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xODBiNzBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZS5weQpAQCAtMCwwICsxLDIyNiBAQAorIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiIkRFUFJFQ0FURUQ6ICBEZWNsYXJlcyB0aGUgUlBDIHNlcnZpY2UgaW50ZXJmYWNlcy4KKworVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGFic3RyYWN0IGludGVyZmFjZXMgdW5kZXJseWluZyBwcm90bzIgUlBDCitzZXJ2aWNlcy4gIFRoZXNlIGFyZSBpbnRlbmRlZCB0byBiZSBpbmRlcGVuZGVudCBvZiBhbnkgcGFydGljdWxhciBSUEMKK2ltcGxlbWVudGF0aW9uLCBzbyB0aGF0IHByb3RvMiBzZXJ2aWNlcyBjYW4gYmUgdXNlZCBvbiB0b3Agb2YgYSB2YXJpZXR5CitvZiBpbXBsZW1lbnRhdGlvbnMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMi4zLjAsIFJQQyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkCitub3QgdHJ5IHRvIGJ1aWxkIG9uIHRoZXNlLCBidXQgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBjb2RlIGdlbmVyYXRvciBwbHVnaW5zCit3aGljaCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIFJQQyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgd2F5Cit0aGUgZ2VuZXJhdGVkIGNvZGUgY2FuIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UKK2FuZCBjYW4gYXZvaWQgdW5uZWNlc3NhcnkgbGF5ZXJzIG9mIGluZGlyZWN0aW9uLgorIiIiCisKK19fYXV0aG9yX18gPSAncGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KScKKworCitjbGFzcyBScGNFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgIiIiRXhjZXB0aW9uIHJhaXNlZCBvbiBmYWlsZWQgYmxvY2tpbmcgUlBDIG1ldGhvZCBjYWxsLiIiIgorICBwYXNzCisKKworY2xhc3MgU2VydmljZShvYmplY3QpOgorCisgICIiIkFic3RyYWN0IGJhc2UgaW50ZXJmYWNlIGZvciBwcm90b2NvbC1idWZmZXItYmFzZWQgUlBDIHNlcnZpY2VzLgorCisgIFNlcnZpY2VzIHRoZW1zZWx2ZXMgYXJlIGFic3RyYWN0IGNsYXNzZXMgKGltcGxlbWVudGVkIGVpdGhlciBieSBzZXJ2ZXJzIG9yIGFzCisgIHN0dWJzKSwgYnV0IHRoZXkgc3ViY2xhc3MgdGhpcyBiYXNlIGludGVyZmFjZS4gVGhlIG1ldGhvZHMgb2YgdGhpcworICBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgbWV0aG9kcyBvZiB0aGUgc2VydmljZSB3aXRob3V0IGtub3dpbmcKKyAgaXRzIGV4YWN0IHR5cGUgYXQgY29tcGlsZSB0aW1lIChhbmFsb2dvdXMgdG8gdGhlIE1lc3NhZ2UgaW50ZXJmYWNlKS4KKyAgIiIiCisKKyAgZGVmIEdldERlc2NyaXB0b3IoKToKKyAgICAiIiJSZXRyaWV2ZXMgdGhpcyBzZXJ2aWNlJ3MgZGVzY3JpcHRvci4iIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIENhbGxNZXRob2Qoc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IsIHJwY19jb250cm9sbGVyLAorICAgICAgICAgICAgICAgICByZXF1ZXN0LCBkb25lKToKKyAgICAiIiJDYWxscyBhIG1ldGhvZCBvZiB0aGUgc2VydmljZSBzcGVjaWZpZWQgYnkgbWV0aG9kX2Rlc2NyaXB0b3IuCisKKyAgICBJZiAiZG9uZSIgaXMgTm9uZSB0aGVuIHRoZSBjYWxsIGlzIGJsb2NraW5nIGFuZCB0aGUgcmVzcG9uc2UKKyAgICBtZXNzYWdlIHdpbGwgYmUgcmV0dXJuZWQgZGlyZWN0bHkuICBPdGhlcndpc2UgdGhlIGNhbGwgaXMgYXN5bmNocm9ub3VzCisgICAgYW5kICJkb25lIiB3aWxsIGxhdGVyIGJlIGNhbGxlZCB3aXRoIHRoZSByZXNwb25zZSB2YWx1ZS4KKworICAgIEluIHRoZSBibG9ja2luZyBjYXNlLCBScGNFeGNlcHRpb24gd2lsbCBiZSByYWlzZWQgb24gZXJyb3IuCisKKyAgICBQcmVjb25kaXRpb25zOgorICAgICogbWV0aG9kX2Rlc2NyaXB0b3Iuc2VydmljZSA9PSBHZXREZXNjcmlwdG9yCisgICAgKiByZXF1ZXN0IGlzIG9mIHRoZSBleGFjdCBzYW1lIGNsYXNzZXMgYXMgcmV0dXJuZWQgYnkKKyAgICAgIEdldFJlcXVlc3RDbGFzcyhtZXRob2QpLgorICAgICogQWZ0ZXIgdGhlIGNhbGwgaGFzIHN0YXJ0ZWQsIHRoZSByZXF1ZXN0IG11c3Qgbm90IGJlIG1vZGlmaWVkLgorICAgICogInJwY19jb250cm9sbGVyIiBpcyBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGUgUlBDIGltcGxlbWVudGF0aW9uIGJlaW5nCisgICAgICB1c2VkIGJ5IHRoaXMgU2VydmljZS4gIEZvciBzdHVicywgdGhlICJjb3JyZWN0IHR5cGUiIGRlcGVuZHMgb24gdGhlCisgICAgICBScGNDaGFubmVsIHdoaWNoIHRoZSBzdHViIGlzIHVzaW5nLgorCisgICAgUG9zdGNvbmRpdGlvbnM6CisgICAgKiAiZG9uZSIgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbWV0aG9kIGlzIGNvbXBsZXRlLiAgVGhpcyBtYXkgYmUKKyAgICAgIGJlZm9yZSBDYWxsTWV0aG9kKCkgcmV0dXJucyBvciBpdCBtYXkgYmUgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgorICAgICogSWYgdGhlIFJQQyBmYWlsZWQsIHRoZSByZXNwb25zZSB2YWx1ZSBwYXNzZWQgdG8gImRvbmUiIHdpbGwgYmUgTm9uZS4KKyAgICAgIEZ1cnRoZXIgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZSBjYW4gYmUgZm91bmQgYnkgcXVlcnlpbmcgdGhlCisgICAgICBScGNDb250cm9sbGVyLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgR2V0UmVxdWVzdENsYXNzKHNlbGYsIG1ldGhvZF9kZXNjcmlwdG9yKToKKyAgICAiIiJSZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KKworICAgIENhbGxNZXRob2QoKSByZXF1aXJlcyB0aGF0IHRoZSByZXF1ZXN0IGlzIG9mIGEgcGFydGljdWxhciBzdWJjbGFzcyBvZgorICAgIE1lc3NhZ2UuIEdldFJlcXVlc3RDbGFzcygpIGdldHMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhpcyByZXF1aXJlZAorICAgIHR5cGUuCisKKyAgICBFeGFtcGxlOgorICAgICAgbWV0aG9kID0gc2VydmljZS5HZXREZXNjcmlwdG9yKCkuRmluZE1ldGhvZEJ5TmFtZSgiRm9vIikKKyAgICAgIHJlcXVlc3QgPSBzdHViLkdldFJlcXVlc3RDbGFzcyhtZXRob2QpKCkKKyAgICAgIHJlcXVlc3QuUGFyc2VGcm9tU3RyaW5nKGlucHV0KQorICAgICAgc2VydmljZS5DYWxsTWV0aG9kKG1ldGhvZCwgcmVxdWVzdCwgY2FsbGJhY2spCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgIGRlZiBHZXRSZXNwb25zZUNsYXNzKHNlbGYsIG1ldGhvZF9kZXNjcmlwdG9yKToKKyAgICAiIiJSZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBmb3IgdGhlIHNwZWNpZmllZCBtZXRob2QuCisKKyAgICBUaGlzIG1ldGhvZCBpc24ndCByZWFsbHkgbmVlZGVkLCBhcyB0aGUgUnBjQ2hhbm5lbCdzIENhbGxNZXRob2QgY29uc3RydWN0cworICAgIHRoZSByZXNwb25zZSBwcm90b2NvbCBtZXNzYWdlLiBJdCdzIHByb3ZpZGVkIGFueXdheSBpbiBjYXNlIGl0IGlzIHVzZWZ1bAorICAgIGZvciB0aGUgY2FsbGVyIHRvIGtub3cgdGhlIHJlc3BvbnNlIHR5cGUgaW4gYWR2YW5jZS4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworY2xhc3MgUnBjQ29udHJvbGxlcihvYmplY3QpOgorCisgICIiIkFuIFJwY0NvbnRyb2xsZXIgbWVkaWF0ZXMgYSBzaW5nbGUgbWV0aG9kIGNhbGwuCisKKyAgVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGUgY29udHJvbGxlciBpcyB0byBwcm92aWRlIGEgd2F5IHRvIG1hbmlwdWxhdGUKKyAgc2V0dGluZ3Mgc3BlY2lmaWMgdG8gdGhlIFJQQyBpbXBsZW1lbnRhdGlvbiBhbmQgdG8gZmluZCBvdXQgYWJvdXQgUlBDLWxldmVsCisgIGVycm9ycy4gVGhlIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIFJwY0NvbnRyb2xsZXIgaW50ZXJmYWNlIGFyZSBpbnRlbmRlZAorICB0byBiZSBhICJsZWFzdCBjb21tb24gZGVub21pbmF0b3IiIHNldCBvZiBmZWF0dXJlcyB3aGljaCB3ZSBleHBlY3QgYWxsCisgIGltcGxlbWVudGF0aW9ucyB0byBzdXBwb3J0LiAgU3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG1heSBwcm92aWRlIG1vcmUKKyAgYWR2YW5jZWQgZmVhdHVyZXMgKGUuZy4gZGVhZGxpbmUgcHJvcGFnYXRpb24pLgorICAiIiIKKworICAjIENsaWVudC1zaWRlIG1ldGhvZHMgYmVsb3cKKworICBkZWYgUmVzZXQoc2VsZik6CisgICAgIiIiUmVzZXRzIHRoZSBScGNDb250cm9sbGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLgorCisgICAgQWZ0ZXIgdGhlIFJwY0NvbnRyb2xsZXIgaGFzIGJlZW4gcmVzZXQsIGl0IG1heSBiZSByZXVzZWQgaW4KKyAgICBhIG5ldyBjYWxsLiBNdXN0IG5vdCBiZSBjYWxsZWQgd2hpbGUgYW4gUlBDIGlzIGluIHByb2dyZXNzLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgRmFpbGVkKHNlbGYpOgorICAgICIiIlJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbCBmYWlsZWQuCisKKyAgICBBZnRlciBhIGNhbGwgaGFzIGZpbmlzaGVkLCByZXR1cm5zIHRydWUgaWYgdGhlIGNhbGwgZmFpbGVkLiAgVGhlIHBvc3NpYmxlCisgICAgcmVhc29ucyBmb3IgZmFpbHVyZSBkZXBlbmQgb24gdGhlIFJQQyBpbXBsZW1lbnRhdGlvbi4gIEZhaWxlZCgpIG11c3Qgbm90CisgICAgYmUgY2FsbGVkIGJlZm9yZSBhIGNhbGwgaGFzIGZpbmlzaGVkLiAgSWYgRmFpbGVkKCkgcmV0dXJucyB0cnVlLCB0aGUKKyAgICBjb250ZW50cyBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBhcmUgdW5kZWZpbmVkLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgRXJyb3JUZXh0KHNlbGYpOgorICAgICIiIklmIEZhaWxlZCBpcyB0cnVlLCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLiIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgU3RhcnRDYW5jZWwoc2VsZik6CisgICAgIiIiSW5pdGlhdGUgY2FuY2VsbGF0aW9uLgorCisgICAgQWR2aXNlcyB0aGUgUlBDIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgZGVzaXJlcyB0aGF0IHRoZSBSUEMgY2FsbCBiZQorICAgIGNhbmNlbGVkLiAgVGhlIFJQQyBzeXN0ZW0gbWF5IGNhbmNlbCBpdCBpbW1lZGlhdGVseSwgbWF5IHdhaXQgYXdoaWxlIGFuZAorICAgIHRoZW4gY2FuY2VsIGl0LCBvciBtYXkgbm90IGV2ZW4gY2FuY2VsIHRoZSBjYWxsIGF0IGFsbC4gIElmIHRoZSBjYWxsIGlzCisgICAgY2FuY2VsZWQsIHRoZSAiZG9uZSIgY2FsbGJhY2sgd2lsbCBzdGlsbCBiZSBjYWxsZWQgYW5kIHRoZSBScGNDb250cm9sbGVyCisgICAgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsIGZhaWxlZCBhdCB0aGF0IHRpbWUuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICMgU2VydmVyLXNpZGUgbWV0aG9kcyBiZWxvdworCisgIGRlZiBTZXRGYWlsZWQoc2VsZiwgcmVhc29uKToKKyAgICAiIiJTZXRzIGEgZmFpbHVyZSByZWFzb24uCisKKyAgICBDYXVzZXMgRmFpbGVkKCkgdG8gcmV0dXJuIHRydWUgb24gdGhlIGNsaWVudCBzaWRlLiAgInJlYXNvbiIgd2lsbCBiZQorICAgIGluY29ycG9yYXRlZCBpbnRvIHRoZSBtZXNzYWdlIHJldHVybmVkIGJ5IEVycm9yVGV4dCgpLiAgSWYgeW91IGZpbmQKKyAgICB5b3UgbmVlZCB0byByZXR1cm4gbWFjaGluZS1yZWFkYWJsZSBpbmZvcm1hdGlvbiBhYm91dCBmYWlsdXJlcywgeW91CisgICAgc2hvdWxkIGluY29ycG9yYXRlIGl0IGludG8geW91ciByZXNwb25zZSBwcm90b2NvbCBidWZmZXIgYW5kIHNob3VsZAorICAgIE5PVCBjYWxsIFNldEZhaWxlZCgpLgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgSXNDYW5jZWxlZChzZWxmKToKKyAgICAiIiJDaGVja3MgaWYgdGhlIGNsaWVudCBjYW5jZWxsZWQgdGhlIFJQQy4KKworICAgIElmIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgY2FuY2VsZWQgdGhlIFJQQywgc28gdGhlIHNlcnZlciBtYXkKKyAgICBhcyB3ZWxsIGdpdmUgdXAgb24gcmVwbHlpbmcgdG8gaXQuICBUaGUgc2VydmVyIHNob3VsZCBzdGlsbCBjYWxsIHRoZQorICAgIGZpbmFsICJkb25lIiBjYWxsYmFjay4KKyAgICAiIiIKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIE5vdGlmeU9uQ2FuY2VsKHNlbGYsIGNhbGxiYWNrKToKKyAgICAiIiJTZXRzIGEgY2FsbGJhY2sgdG8gaW52b2tlIG9uIGNhbmNlbC4KKworICAgIEFza3MgdGhhdCB0aGUgZ2l2ZW4gY2FsbGJhY2sgYmUgY2FsbGVkIHdoZW4gdGhlIFJQQyBpcyBjYW5jZWxlZC4gIFRoZQorICAgIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuICBJZiB0aGUgUlBDIGNvbXBsZXRlcyB3aXRob3V0CisgICAgYmVpbmcgY2FuY2VsZWQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhZnRlciBjb21wbGV0aW9uLiAgSWYgdGhlIFJQQworICAgIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsZWQgd2hlbiBOb3RpZnlPbkNhbmNlbCgpIGlzIGNhbGxlZCwgdGhlIGNhbGxiYWNrCisgICAgd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkuCisKKyAgICBOb3RpZnlPbkNhbmNlbCgpIG11c3QgYmUgY2FsbGVkIG5vIG1vcmUgdGhhbiBvbmNlIHBlciByZXF1ZXN0LgorICAgICIiIgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBScGNDaGFubmVsKG9iamVjdCk6CisKKyAgIiIiQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhbiBSUEMgY2hhbm5lbC4KKworICBBbiBScGNDaGFubmVsIHJlcHJlc2VudHMgYSBjb21tdW5pY2F0aW9uIGxpbmUgdG8gYSBzZXJ2aWNlIHdoaWNoIGNhbiBiZSB1c2VkCisgIHRvIGNhbGwgdGhhdCBzZXJ2aWNlJ3MgbWV0aG9kcy4gIFRoZSBzZXJ2aWNlIG1heSBiZSBydW5uaW5nIG9uIGFub3RoZXIKKyAgbWFjaGluZS4gTm9ybWFsbHksIHlvdSBzaG91bGQgbm90IHVzZSBhbiBScGNDaGFubmVsIGRpcmVjdGx5LCBidXQgaW5zdGVhZAorICBjb25zdHJ1Y3QgYSBzdHViIHtAbGluayBTZXJ2aWNlfSB3cmFwcGluZyBpdC4gIEV4YW1wbGU6CisKKyAgRXhhbXBsZToKKyAgICBScGNDaGFubmVsIGNoYW5uZWwgPSBycGNJbXBsLkNoYW5uZWwoInJlbW90ZWhvc3QuZXhhbXBsZS5jb206MTIzNCIpCisgICAgUnBjQ29udHJvbGxlciBjb250cm9sbGVyID0gcnBjSW1wbC5Db250cm9sbGVyKCkKKyAgICBNeVNlcnZpY2Ugc2VydmljZSA9IE15U2VydmljZV9TdHViKGNoYW5uZWwpCisgICAgc2VydmljZS5NeU1ldGhvZChjb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjaykKKyAgIiIiCisKKyAgZGVmIENhbGxNZXRob2Qoc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IsIHJwY19jb250cm9sbGVyLAorICAgICAgICAgICAgICAgICByZXF1ZXN0LCByZXNwb25zZV9jbGFzcywgZG9uZSk6CisgICAgIiIiQ2FsbHMgdGhlIG1ldGhvZCBpZGVudGlmaWVkIGJ5IHRoZSBkZXNjcmlwdG9yLgorCisgICAgQ2FsbCB0aGUgZ2l2ZW4gbWV0aG9kIG9mIHRoZSByZW1vdGUgc2VydmljZS4gIFRoZSBzaWduYXR1cmUgb2YgdGhpcworICAgIHByb2NlZHVyZSBsb29rcyB0aGUgc2FtZSBhcyBTZXJ2aWNlLkNhbGxNZXRob2QoKSwgYnV0IHRoZSByZXF1aXJlbWVudHMKKyAgICBhcmUgbGVzcyBzdHJpY3QgaW4gb25lIGltcG9ydGFudCB3YXk6ICB0aGUgcmVxdWVzdCBvYmplY3QgZG9lc24ndCBoYXZlIHRvCisgICAgYmUgb2YgYW55IHNwZWNpZmljIGNsYXNzIGFzIGxvbmcgYXMgaXRzIGRlc2NyaXB0b3IgaXMgbWV0aG9kLmlucHV0X3R5cGUuCisgICAgIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZV9yZWZsZWN0aW9uLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZV9yZWZsZWN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg1MWU4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlX3JlZmxlY3Rpb24ucHkKQEAgLTAsMCArMSwyODQgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb250YWlucyBtZXRhY2xhc3NlcyB1c2VkIHRvIGNyZWF0ZSBwcm90b2NvbCBzZXJ2aWNlIGFuZCBzZXJ2aWNlIHN0dWIKK2NsYXNzZXMgZnJvbSBTZXJ2aWNlRGVzY3JpcHRvciBvYmplY3RzIGF0IHJ1bnRpbWUuCisKK1RoZSBHZW5lcmF0ZWRTZXJ2aWNlVHlwZSBhbmQgR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlIG1ldGFjbGFzc2VzIGFyZSB1c2VkIHRvCitpbmplY3QgYWxsIHVzZWZ1bCBmdW5jdGlvbmFsaXR5IGludG8gdGhlIGNsYXNzZXMgb3V0cHV0IGJ5IHRoZSBwcm90b2NvbAorY29tcGlsZXIgYXQgY29tcGlsZS10aW1lLgorIiIiCisKK19fYXV0aG9yX18gPSAncGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KScKKworCitjbGFzcyBHZW5lcmF0ZWRTZXJ2aWNlVHlwZSh0eXBlKToKKworICAiIiJNZXRhY2xhc3MgZm9yIHNlcnZpY2UgY2xhc3NlcyBjcmVhdGVkIGF0IHJ1bnRpbWUgZnJvbSBTZXJ2aWNlRGVzY3JpcHRvcnMuCisKKyAgSW1wbGVtZW50YXRpb25zIGZvciBhbGwgbWV0aG9kcyBkZXNjcmliZWQgaW4gdGhlIFNlcnZpY2UgY2xhc3MgYXJlIGFkZGVkIGhlcmUKKyAgYnkgdGhpcyBjbGFzcy4gV2UgYWxzbyBjcmVhdGUgcHJvcGVydGllcyB0byBhbGxvdyBnZXR0aW5nL3NldHRpbmcgYWxsIGZpZWxkcworICBpbiB0aGUgcHJvdG9jb2wgbWVzc2FnZS4KKworICBUaGUgcHJvdG9jb2wgY29tcGlsZXIgY3VycmVudGx5IHVzZXMgdGhpcyBtZXRhY2xhc3MgdG8gY3JlYXRlIHByb3RvY29sIHNlcnZpY2UKKyAgY2xhc3NlcyBhdCBydW50aW1lLiBDbGllbnRzIGNhbiBhbHNvIG1hbnVhbGx5IGNyZWF0ZSB0aGVpciBvd24gY2xhc3NlcyBhdAorICBydW50aW1lLCBhcyBpbiB0aGlzIGV4YW1wbGU6CisKKyAgbXlkZXNjcmlwdG9yID0gU2VydmljZURlc2NyaXB0b3IoLi4uLi4pCisgIGNsYXNzIE15UHJvdG9TZXJ2aWNlKHNlcnZpY2UuU2VydmljZSk6CisgICAgX19tZXRhY2xhc3NfXyA9IEdlbmVyYXRlZFNlcnZpY2VUeXBlCisgICAgREVTQ1JJUFRPUiA9IG15ZGVzY3JpcHRvcgorICBteXNlcnZpY2VfaW5zdGFuY2UgPSBNeVByb3RvU2VydmljZSgpCisgIC4uLgorICAiIiIKKworICBfREVTQ1JJUFRPUl9LRVkgPSAnREVTQ1JJUFRPUicKKworICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSk6CisgICAgIiIiQ3JlYXRlcyBhIG1lc3NhZ2Ugc2VydmljZSBjbGFzcy4KKworICAgIEFyZ3M6CisgICAgICBuYW1lOiBOYW1lIG9mIHRoZSBjbGFzcyAoaWdub3JlZCwgYnV0IHJlcXVpcmVkIGJ5IHRoZSBtZXRhY2xhc3MKKyAgICAgICAgcHJvdG9jb2wpLgorICAgICAgYmFzZXM6IEJhc2UgY2xhc3NlcyBvZiB0aGUgY2xhc3MgYmVpbmcgY29uc3RydWN0ZWQuCisgICAgICBkaWN0aW9uYXJ5OiBUaGUgY2xhc3MgZGljdGlvbmFyeSBvZiB0aGUgY2xhc3MgYmVpbmcgY29uc3RydWN0ZWQuCisgICAgICAgIGRpY3Rpb25hcnlbX0RFU0NSSVBUT1JfS0VZXSBtdXN0IGNvbnRhaW4gYSBTZXJ2aWNlRGVzY3JpcHRvciBvYmplY3QKKyAgICAgICAgZGVzY3JpYmluZyB0aGlzIHByb3RvY29sIHNlcnZpY2UgdHlwZS4KKyAgICAiIiIKKyAgICAjIERvbid0IGRvIGFueXRoaW5nIGlmIHRoaXMgY2xhc3MgZG9lc24ndCBoYXZlIGEgZGVzY3JpcHRvci4gVGhpcyBoYXBwZW5zCisgICAgIyB3aGVuIGEgc2VydmljZSBjbGFzcyBpcyBzdWJjbGFzc2VkLgorICAgIGlmIEdlbmVyYXRlZFNlcnZpY2VUeXBlLl9ERVNDUklQVE9SX0tFWSBub3QgaW4gZGljdGlvbmFyeToKKyAgICAgIHJldHVybgorICAgIGRlc2NyaXB0b3IgPSBkaWN0aW9uYXJ5W0dlbmVyYXRlZFNlcnZpY2VUeXBlLl9ERVNDUklQVE9SX0tFWV0KKyAgICBzZXJ2aWNlX2J1aWxkZXIgPSBfU2VydmljZUJ1aWxkZXIoZGVzY3JpcHRvcikKKyAgICBzZXJ2aWNlX2J1aWxkZXIuQnVpbGRTZXJ2aWNlKGNscykKKworCitjbGFzcyBHZW5lcmF0ZWRTZXJ2aWNlU3R1YlR5cGUoR2VuZXJhdGVkU2VydmljZVR5cGUpOgorCisgICIiIk1ldGFjbGFzcyBmb3Igc2VydmljZSBzdHVicyBjcmVhdGVkIGF0IHJ1bnRpbWUgZnJvbSBTZXJ2aWNlRGVzY3JpcHRvcnMuCisKKyAgVGhpcyBjbGFzcyBoYXMgc2ltaWxhciByZXNwb25zaWJpbGl0aWVzIGFzIEdlbmVyYXRlZFNlcnZpY2VUeXBlLCBleGNlcHQgdGhhdAorICBpdCBjcmVhdGVzIHRoZSBzZXJ2aWNlIHN0dWIgY2xhc3Nlcy4KKyAgIiIiCisKKyAgX0RFU0NSSVBUT1JfS0VZID0gJ0RFU0NSSVBUT1InCisKKyAgZGVmIF9faW5pdF9fKGNscywgbmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpOgorICAgICIiIkNyZWF0ZXMgYSBtZXNzYWdlIHNlcnZpY2Ugc3R1YiBjbGFzcy4KKworICAgIEFyZ3M6CisgICAgICBuYW1lOiBOYW1lIG9mIHRoZSBjbGFzcyAoaWdub3JlZCwgaGVyZSkuCisgICAgICBiYXNlczogQmFzZSBjbGFzc2VzIG9mIHRoZSBjbGFzcyBiZWluZyBjb25zdHJ1Y3RlZC4KKyAgICAgIGRpY3Rpb25hcnk6IFRoZSBjbGFzcyBkaWN0aW9uYXJ5IG9mIHRoZSBjbGFzcyBiZWluZyBjb25zdHJ1Y3RlZC4KKyAgICAgICAgZGljdGlvbmFyeVtfREVTQ1JJUFRPUl9LRVldIG11c3QgY29udGFpbiBhIFNlcnZpY2VEZXNjcmlwdG9yIG9iamVjdAorICAgICAgICBkZXNjcmliaW5nIHRoaXMgcHJvdG9jb2wgc2VydmljZSB0eXBlLgorICAgICIiIgorICAgIHN1cGVyKEdlbmVyYXRlZFNlcnZpY2VTdHViVHlwZSwgY2xzKS5fX2luaXRfXyhuYW1lLCBiYXNlcywgZGljdGlvbmFyeSkKKyAgICAjIERvbid0IGRvIGFueXRoaW5nIGlmIHRoaXMgY2xhc3MgZG9lc24ndCBoYXZlIGEgZGVzY3JpcHRvci4gVGhpcyBoYXBwZW5zCisgICAgIyB3aGVuIGEgc2VydmljZSBzdHViIGlzIHN1YmNsYXNzZWQuCisgICAgaWYgR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlLl9ERVNDUklQVE9SX0tFWSBub3QgaW4gZGljdGlvbmFyeToKKyAgICAgIHJldHVybgorICAgIGRlc2NyaXB0b3IgPSBkaWN0aW9uYXJ5W0dlbmVyYXRlZFNlcnZpY2VTdHViVHlwZS5fREVTQ1JJUFRPUl9LRVldCisgICAgc2VydmljZV9zdHViX2J1aWxkZXIgPSBfU2VydmljZVN0dWJCdWlsZGVyKGRlc2NyaXB0b3IpCisgICAgc2VydmljZV9zdHViX2J1aWxkZXIuQnVpbGRTZXJ2aWNlU3R1YihjbHMpCisKKworY2xhc3MgX1NlcnZpY2VCdWlsZGVyKG9iamVjdCk6CisKKyAgIiIiVGhpcyBjbGFzcyBjb25zdHJ1Y3RzIGEgcHJvdG9jb2wgc2VydmljZSBjbGFzcyB1c2luZyBhIHNlcnZpY2UgZGVzY3JpcHRvci4KKworICBHaXZlbiBhIHNlcnZpY2UgZGVzY3JpcHRvciwgdGhpcyBjbGFzcyBjb25zdHJ1Y3RzIGEgY2xhc3MgdGhhdCByZXByZXNlbnRzCisgIHRoZSBzcGVjaWZpZWQgc2VydmljZSBkZXNjcmlwdG9yLiBPbmUgc2VydmljZSBidWlsZGVyIGluc3RhbmNlIGNvbnN0cnVjdHMKKyAgZXhhY3RseSBvbmUgc2VydmljZSBjbGFzcy4gVGhhdCBtZWFucyBhbGwgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3Mgc2hhcmUgdGhlCisgIHNhbWUgYnVpbGRlci4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZpY2VfZGVzY3JpcHRvcik6CisgICAgIiIiSW5pdGlhbGl6ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UgY2xhc3MgYnVpbGRlci4KKworICAgIEFyZ3M6CisgICAgICBzZXJ2aWNlX2Rlc2NyaXB0b3I6IFNlcnZpY2VEZXNjcmlwdG9yIHRvIHVzZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUKKyAgICAgICAgc2VydmljZSBjbGFzcy4KKyAgICAiIiIKKyAgICBzZWxmLmRlc2NyaXB0b3IgPSBzZXJ2aWNlX2Rlc2NyaXB0b3IKKworICBkZWYgQnVpbGRTZXJ2aWNlKHNlbGYsIGNscyk6CisgICAgIiIiQ29uc3RydWN0cyB0aGUgc2VydmljZSBjbGFzcy4KKworICAgIEFyZ3M6CisgICAgICBjbHM6IFRoZSBjbGFzcyB0aGF0IHdpbGwgYmUgY29uc3RydWN0ZWQuCisgICAgIiIiCisKKyAgICAjIENhbGxNZXRob2QgbmVlZHMgdG8gb3BlcmF0ZSB3aXRoIGFuIGluc3RhbmNlIG9mIHRoZSBTZXJ2aWNlIGNsYXNzLiBUaGlzCisgICAgIyBpbnRlcm5hbCB3cmFwcGVyIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGJlIGFibGUgdG8gcGFzcyB0aGUgc2VydmljZQorICAgICMgaW5zdGFuY2UgdG8gdGhlIG1ldGhvZCB0aGF0IGRvZXMgdGhlIHJlYWwgQ2FsbE1ldGhvZCB3b3JrLgorICAgIGRlZiBfV3JhcENhbGxNZXRob2Qoc3J2YywgbWV0aG9kX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spOgorICAgICAgcmV0dXJuIHNlbGYuX0NhbGxNZXRob2Qoc3J2YywgbWV0aG9kX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjaykKKyAgICBzZWxmLmNscyA9IGNscworICAgIGNscy5DYWxsTWV0aG9kID0gX1dyYXBDYWxsTWV0aG9kCisgICAgY2xzLkdldERlc2NyaXB0b3IgPSBzdGF0aWNtZXRob2QobGFtYmRhOiBzZWxmLmRlc2NyaXB0b3IpCisgICAgY2xzLkdldERlc2NyaXB0b3IuX19kb2NfXyA9ICJSZXR1cm5zIHRoZSBzZXJ2aWNlIGRlc2NyaXB0b3IuIgorICAgIGNscy5HZXRSZXF1ZXN0Q2xhc3MgPSBzZWxmLl9HZXRSZXF1ZXN0Q2xhc3MKKyAgICBjbHMuR2V0UmVzcG9uc2VDbGFzcyA9IHNlbGYuX0dldFJlc3BvbnNlQ2xhc3MKKyAgICBmb3IgbWV0aG9kIGluIHNlbGYuZGVzY3JpcHRvci5tZXRob2RzOgorICAgICAgc2V0YXR0cihjbHMsIG1ldGhvZC5uYW1lLCBzZWxmLl9HZW5lcmF0ZU5vbkltcGxlbWVudGVkTWV0aG9kKG1ldGhvZCkpCisKKyAgZGVmIF9DYWxsTWV0aG9kKHNlbGYsIHNydmMsIG1ldGhvZF9kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKToKKyAgICAiIiJDYWxscyB0aGUgbWV0aG9kIGRlc2NyaWJlZCBieSBhIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yLgorCisgICAgQXJnczoKKyAgICAgIHNydmM6IEluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIGZvciB3aGljaCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICBtZXRob2RfZGVzY3JpcHRvcjogRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudCB0aGUgbWV0aG9kIHRvIGNhbGwuCisgICAgICBycGNfY29udHJvbGxlcjogUlBDIGNvbnRyb2xsZXIgdG8gdXNlIGZvciB0aGlzIG1ldGhvZCdzIGV4ZWN1dGlvbi4KKyAgICAgIHJlcXVlc3Q6IFJlcXVlc3QgcHJvdG9jb2wgbWVzc2FnZS4KKyAgICAgIGNhbGxiYWNrOiBBIGNhbGxiYWNrIHRvIGludm9rZSBhZnRlciB0aGUgbWV0aG9kIGhhcyBjb21wbGV0ZWQuCisgICAgIiIiCisgICAgaWYgbWV0aG9kX2Rlc2NyaXB0b3IuY29udGFpbmluZ19zZXJ2aWNlICE9IHNlbGYuZGVzY3JpcHRvcjoKKyAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAnQ2FsbE1ldGhvZCgpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuJykKKyAgICBtZXRob2QgPSBnZXRhdHRyKHNydmMsIG1ldGhvZF9kZXNjcmlwdG9yLm5hbWUpCisgICAgcmV0dXJuIG1ldGhvZChycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spCisKKyAgZGVmIF9HZXRSZXF1ZXN0Q2xhc3Moc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IpOgorICAgICIiIlJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSByZXF1ZXN0IHByb3RvY29sIG1lc3NhZ2UuCisKKyAgICBBcmdzOgorICAgICAgbWV0aG9kX2Rlc2NyaXB0b3I6IERlc2NyaXB0b3Igb2YgdGhlIG1ldGhvZCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZQorICAgICAgICByZXF1ZXN0IHByb3RvY29sIG1lc3NhZ2UgY2xhc3MuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIGlucHV0IHByb3RvY29sIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZAorICAgICAgbWV0aG9kLgorICAgICIiIgorICAgIGlmIG1ldGhvZF9kZXNjcmlwdG9yLmNvbnRhaW5pbmdfc2VydmljZSAhPSBzZWxmLmRlc2NyaXB0b3I6CisgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgJ0dldFJlcXVlc3RDbGFzcygpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuJykKKyAgICByZXR1cm4gbWV0aG9kX2Rlc2NyaXB0b3IuaW5wdXRfdHlwZS5fY29uY3JldGVfY2xhc3MKKworICBkZWYgX0dldFJlc3BvbnNlQ2xhc3Moc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IpOgorICAgICIiIlJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSByZXNwb25zZSBwcm90b2NvbCBtZXNzYWdlLgorCisgICAgQXJnczoKKyAgICAgIG1ldGhvZF9kZXNjcmlwdG9yOiBEZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUKKyAgICAgICAgcmVzcG9uc2UgcHJvdG9jb2wgbWVzc2FnZSBjbGFzcy4KKworICAgIFJldHVybnM6CisgICAgICBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgb3V0cHV0IHByb3RvY29sIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZAorICAgICAgbWV0aG9kLgorICAgICIiIgorICAgIGlmIG1ldGhvZF9kZXNjcmlwdG9yLmNvbnRhaW5pbmdfc2VydmljZSAhPSBzZWxmLmRlc2NyaXB0b3I6CisgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgJ0dldFJlc3BvbnNlQ2xhc3MoKSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvciBmb3Igd3Jvbmcgc2VydmljZSB0eXBlLicpCisgICAgcmV0dXJuIG1ldGhvZF9kZXNjcmlwdG9yLm91dHB1dF90eXBlLl9jb25jcmV0ZV9jbGFzcworCisgIGRlZiBfR2VuZXJhdGVOb25JbXBsZW1lbnRlZE1ldGhvZChzZWxmLCBtZXRob2QpOgorICAgICIiIkdlbmVyYXRlcyBhbmQgcmV0dXJucyBhIG1ldGhvZCB0aGF0IGNhbiBiZSBzZXQgZm9yIGEgc2VydmljZSBtZXRob2RzLgorCisgICAgQXJnczoKKyAgICAgIG1ldGhvZDogRGVzY3JpcHRvciBvZiB0aGUgc2VydmljZSBtZXRob2QgZm9yIHdoaWNoIGEgbWV0aG9kIGlzIHRvIGJlCisgICAgICAgIGdlbmVyYXRlZC4KKworICAgIFJldHVybnM6CisgICAgICBBIG1ldGhvZCB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VydmljZSBjbGFzcy4KKyAgICAiIiIKKyAgICByZXR1cm4gbGFtYmRhIGluc3QsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjazogKAorICAgICAgICBzZWxmLl9Ob25JbXBsZW1lbnRlZE1ldGhvZChtZXRob2QubmFtZSwgcnBjX2NvbnRyb2xsZXIsIGNhbGxiYWNrKSkKKworICBkZWYgX05vbkltcGxlbWVudGVkTWV0aG9kKHNlbGYsIG1ldGhvZF9uYW1lLCBycGNfY29udHJvbGxlciwgY2FsbGJhY2spOgorICAgICIiIlRoZSBib2R5IG9mIGFsbCBtZXRob2RzIGluIHRoZSBnZW5lcmF0ZWQgc2VydmljZSBjbGFzcy4KKworICAgIEFyZ3M6CisgICAgICBtZXRob2RfbmFtZTogTmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGV4ZWN1dGVkLgorICAgICAgcnBjX2NvbnRyb2xsZXI6IFJQQyBjb250cm9sbGVyIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIG1ldGhvZC4KKyAgICAgIGNhbGxiYWNrOiBBIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBtZXRob2QgZmluaXNoZXMuCisgICAgIiIiCisgICAgcnBjX2NvbnRyb2xsZXIuU2V0RmFpbGVkKCdNZXRob2QgJXMgbm90IGltcGxlbWVudGVkLicgJSBtZXRob2RfbmFtZSkKKyAgICBjYWxsYmFjayhOb25lKQorCisKK2NsYXNzIF9TZXJ2aWNlU3R1YkJ1aWxkZXIob2JqZWN0KToKKworICAiIiJDb25zdHJ1Y3RzIGEgcHJvdG9jb2wgc2VydmljZSBzdHViIGNsYXNzIHVzaW5nIGEgc2VydmljZSBkZXNjcmlwdG9yLgorCisgIEdpdmVuIGEgc2VydmljZSBkZXNjcmlwdG9yLCB0aGlzIGNsYXNzIGNvbnN0cnVjdHMgYSBzdWl0YWJsZSBzdHViIGNsYXNzLgorICBBIHN0dWIgaXMganVzdCBhIHR5cGUtc2FmZSB3cmFwcGVyIGFyb3VuZCBhbiBScGNDaGFubmVsIHdoaWNoIGVtdWxhdGVzIGEKKyAgbG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCisKKyAgT25lIHNlcnZpY2Ugc3R1YiBidWlsZGVyIGluc3RhbmNlIGNvbnN0cnVjdHMgZXhhY3RseSBvbmUgY2xhc3MuIEl0IG1lYW5zIGFsbAorICBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBzaGFyZSB0aGUgc2FtZSBzZXJ2aWNlIHN0dWIgYnVpbGRlci4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZpY2VfZGVzY3JpcHRvcik6CisgICAgIiIiSW5pdGlhbGl6ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2Ugc3R1YiBjbGFzcyBidWlsZGVyLgorCisgICAgQXJnczoKKyAgICAgIHNlcnZpY2VfZGVzY3JpcHRvcjogU2VydmljZURlc2NyaXB0b3IgdG8gdXNlIHdoZW4gY29uc3RydWN0aW5nIHRoZQorICAgICAgICBzdHViIGNsYXNzLgorICAgICIiIgorICAgIHNlbGYuZGVzY3JpcHRvciA9IHNlcnZpY2VfZGVzY3JpcHRvcgorCisgIGRlZiBCdWlsZFNlcnZpY2VTdHViKHNlbGYsIGNscyk6CisgICAgIiIiQ29uc3RydWN0cyB0aGUgc3R1YiBjbGFzcy4KKworICAgIEFyZ3M6CisgICAgICBjbHM6IFRoZSBjbGFzcyB0aGF0IHdpbGwgYmUgY29uc3RydWN0ZWQuCisgICAgIiIiCisKKyAgICBkZWYgX1NlcnZpY2VTdHViSW5pdChzdHViLCBycGNfY2hhbm5lbCk6CisgICAgICBzdHViLnJwY19jaGFubmVsID0gcnBjX2NoYW5uZWwKKyAgICBzZWxmLmNscyA9IGNscworICAgIGNscy5fX2luaXRfXyA9IF9TZXJ2aWNlU3R1YkluaXQKKyAgICBmb3IgbWV0aG9kIGluIHNlbGYuZGVzY3JpcHRvci5tZXRob2RzOgorICAgICAgc2V0YXR0cihjbHMsIG1ldGhvZC5uYW1lLCBzZWxmLl9HZW5lcmF0ZVN0dWJNZXRob2QobWV0aG9kKSkKKworICBkZWYgX0dlbmVyYXRlU3R1Yk1ldGhvZChzZWxmLCBtZXRob2QpOgorICAgIHJldHVybiAobGFtYmRhIGluc3QsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjaz1Ob25lOgorICAgICAgICBzZWxmLl9TdHViTWV0aG9kKGluc3QsIG1ldGhvZCwgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKSkKKworICBkZWYgX1N0dWJNZXRob2Qoc2VsZiwgc3R1YiwgbWV0aG9kX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spOgorICAgICIiIlRoZSBib2R5IG9mIGFsbCBzZXJ2aWNlIG1ldGhvZHMgaW4gdGhlIGdlbmVyYXRlZCBzdHViIGNsYXNzLgorCisgICAgQXJnczoKKyAgICAgIHN0dWI6IFN0dWIgaW5zdGFuY2UuCisgICAgICBtZXRob2RfZGVzY3JpcHRvcjogRGVzY3JpcHRvciBvZiB0aGUgaW52b2tlZCBtZXRob2QuCisgICAgICBycGNfY29udHJvbGxlcjogUnBjIGNvbnRyb2xsZXIgdG8gZXhlY3V0ZSB0aGUgbWV0aG9kLgorICAgICAgcmVxdWVzdDogUmVxdWVzdCBwcm90b2NvbCBtZXNzYWdlLgorICAgICAgY2FsbGJhY2s6IEEgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIHRoZSBtZXRob2QgZmluaXNoZXMuCisgICAgUmV0dXJuczoKKyAgICAgIFJlc3BvbnNlIG1lc3NhZ2UgKGluIGNhc2Ugb2YgYmxvY2tpbmcgY2FsbCkuCisgICAgIiIiCisgICAgcmV0dXJuIHN0dWIucnBjX2NoYW5uZWwuQ2FsbE1ldGhvZCgKKyAgICAgICAgbWV0aG9kX2Rlc2NyaXB0b3IsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LAorICAgICAgICBtZXRob2RfZGVzY3JpcHRvci5vdXRwdXRfdHlwZS5fY29uY3JldGVfY2xhc3MsIGNhbGxiYWNrKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jM2ExY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQucHkKQEAgLTAsMCArMSw2OTEgQEAKKyMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb250YWlucyByb3V0aW5lcyBmb3IgcHJpbnRpbmcgcHJvdG9jb2wgbWVzc2FnZXMgaW4gdGV4dCBmb3JtYXQuIiIiCisKK19fYXV0aG9yX18gPSAna2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSknCisKK2ltcG9ydCBjU3RyaW5nSU8KK2ltcG9ydCByZQorCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHR5cGVfY2hlY2tlcnMKK2Zyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCisKK19fYWxsX18gPSBbICdNZXNzYWdlVG9TdHJpbmcnLCAnUHJpbnRNZXNzYWdlJywgJ1ByaW50RmllbGQnLAorICAgICAgICAgICAgJ1ByaW50RmllbGRWYWx1ZScsICdNZXJnZScgXQorCisKKyMgSW5maW5pdHkgYW5kIE5hTiBhcmUgbm90IGV4cGxpY2l0bHkgc3VwcG9ydGVkIGJ5IFB5dGhvbiBwcmUtMi42LCBhbmQKKyMgZmxvYXQoJ2luZicpIGRvZXMgbm90IHdvcmsgb24gV2luZG93cyAocHJlLTIuNikuCitfSU5GSU5JVFkgPSAxZTEwMDAwICAgICMgb3ZlcmZsb3dzLCB0aHVzIHdpbGwgYWN0dWFsbHkgYmUgaW5maW5pdHkuCitfTkFOID0gX0lORklOSVRZICogMAorCisKK2NsYXNzIFBhcnNlRXJyb3IoRXhjZXB0aW9uKToKKyAgIiIiVGhyb3duIGluIGNhc2Ugb2YgQVNDSUkgcGFyc2luZyBlcnJvci4iIiIKKworCitkZWYgTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIGFzX3V0Zjg9RmFsc2UsIGFzX29uZV9saW5lPUZhbHNlKToKKyAgb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgUHJpbnRNZXNzYWdlKG1lc3NhZ2UsIG91dCwgYXNfdXRmOD1hc191dGY4LCBhc19vbmVfbGluZT1hc19vbmVfbGluZSkKKyAgcmVzdWx0ID0gb3V0LmdldHZhbHVlKCkKKyAgb3V0LmNsb3NlKCkKKyAgaWYgYXNfb25lX2xpbmU6CisgICAgcmV0dXJuIHJlc3VsdC5yc3RyaXAoKQorICByZXR1cm4gcmVzdWx0CisKKworZGVmIFByaW50TWVzc2FnZShtZXNzYWdlLCBvdXQsIGluZGVudD0wLCBhc191dGY4PUZhbHNlLCBhc19vbmVfbGluZT1GYWxzZSk6CisgIGZvciBmaWVsZCwgdmFsdWUgaW4gbWVzc2FnZS5MaXN0RmllbGRzKCk6CisgICAgaWYgZmllbGQubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6CisgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKKyAgICAgICAgUHJpbnRGaWVsZChmaWVsZCwgZWxlbWVudCwgb3V0LCBpbmRlbnQsIGFzX3V0ZjgsIGFzX29uZV9saW5lKQorICAgIGVsc2U6CisgICAgICBQcmludEZpZWxkKGZpZWxkLCB2YWx1ZSwgb3V0LCBpbmRlbnQsIGFzX3V0ZjgsIGFzX29uZV9saW5lKQorCisKK2RlZiBQcmludEZpZWxkKGZpZWxkLCB2YWx1ZSwgb3V0LCBpbmRlbnQ9MCwgYXNfdXRmOD1GYWxzZSwgYXNfb25lX2xpbmU9RmFsc2UpOgorICAiIiJQcmludCBhIHNpbmdsZSBmaWVsZCBuYW1lL3ZhbHVlIHBhaXIuICBGb3IgcmVwZWF0ZWQgZmllbGRzLCB0aGUgdmFsdWUKKyAgc2hvdWxkIGJlIGEgc2luZ2xlIGVsZW1lbnQuIiIiCisKKyAgb3V0LndyaXRlKCcgJyAqIGluZGVudCk7CisgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKKyAgICBvdXQud3JpdGUoJ1snKQorICAgIGlmIChmaWVsZC5jb250YWluaW5nX3R5cGUuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IGFuZAorICAgICAgICBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRSBhbmQKKyAgICAgICAgZmllbGQubWVzc2FnZV90eXBlID09IGZpZWxkLmV4dGVuc2lvbl9zY29wZSBhbmQKKyAgICAgICAgZmllbGQubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfT1BUSU9OQUwpOgorICAgICAgb3V0LndyaXRlKGZpZWxkLm1lc3NhZ2VfdHlwZS5mdWxsX25hbWUpCisgICAgZWxzZToKKyAgICAgIG91dC53cml0ZShmaWVsZC5mdWxsX25hbWUpCisgICAgb3V0LndyaXRlKCddJykKKyAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6CisgICAgIyBGb3IgZ3JvdXBzLCB1c2UgdGhlIGNhcGl0YWxpemVkIG5hbWUuCisgICAgb3V0LndyaXRlKGZpZWxkLm1lc3NhZ2VfdHlwZS5uYW1lKQorICBlbHNlOgorICAgIG91dC53cml0ZShmaWVsZC5uYW1lKQorCisgIGlmIGZpZWxkLmNwcF90eXBlICE9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKKyAgICAjIFRoZSBjb2xvbiBpcyBvcHRpb25hbCBpbiB0aGlzIGNhc2UsIGJ1dCBvdXIgY3Jvc3MtbGFuZ3VhZ2UgZ29sZGVuIGZpbGVzCisgICAgIyBkb24ndCBpbmNsdWRlIGl0LgorICAgIG91dC53cml0ZSgnOiAnKQorCisgIFByaW50RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUsIG91dCwgaW5kZW50LCBhc191dGY4LCBhc19vbmVfbGluZSkKKyAgaWYgYXNfb25lX2xpbmU6CisgICAgb3V0LndyaXRlKCcgJykKKyAgZWxzZToKKyAgICBvdXQud3JpdGUoJ1xuJykKKworCitkZWYgUHJpbnRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgb3V0LCBpbmRlbnQ9MCwKKyAgICAgICAgICAgICAgICAgICAgYXNfdXRmOD1GYWxzZSwgYXNfb25lX2xpbmU9RmFsc2UpOgorICAiIiJQcmludCBhIHNpbmdsZSBmaWVsZCB2YWx1ZSAobm90IGluY2x1ZGluZyBuYW1lKS4gIEZvciByZXBlYXRlZCBmaWVsZHMsCisgIHRoZSB2YWx1ZSBzaG91bGQgYmUgYSBzaW5nbGUgZWxlbWVudC4iIiIKKworICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6CisgICAgaWYgYXNfb25lX2xpbmU6CisgICAgICBvdXQud3JpdGUoJyB7ICcpCisgICAgICBQcmludE1lc3NhZ2UodmFsdWUsIG91dCwgaW5kZW50LCBhc191dGY4LCBhc19vbmVfbGluZSkKKyAgICAgIG91dC53cml0ZSgnfScpCisgICAgZWxzZToKKyAgICAgIG91dC53cml0ZSgnIHtcbicpCisgICAgICBQcmludE1lc3NhZ2UodmFsdWUsIG91dCwgaW5kZW50ICsgMiwgYXNfdXRmOCwgYXNfb25lX2xpbmUpCisgICAgICBvdXQud3JpdGUoJyAnICogaW5kZW50ICsgJ30nKQorICBlbGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRU5VTToKKyAgICBvdXQud3JpdGUoZmllbGQuZW51bV90eXBlLnZhbHVlc19ieV9udW1iZXJbdmFsdWVdLm5hbWUpCisgIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9TVFJJTkc6CisgICAgb3V0LndyaXRlKCdcIicpCisgICAgaWYgdHlwZSh2YWx1ZSkgaXMgdW5pY29kZToKKyAgICAgIG91dC53cml0ZShfQ0VzY2FwZSh2YWx1ZS5lbmNvZGUoJ3V0Zi04JyksIGFzX3V0ZjgpKQorICAgIGVsc2U6CisgICAgICBvdXQud3JpdGUoX0NFc2NhcGUodmFsdWUsIGFzX3V0ZjgpKQorICAgIG91dC53cml0ZSgnXCInKQorICBlbGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfQk9PTDoKKyAgICBpZiB2YWx1ZToKKyAgICAgIG91dC53cml0ZSgidHJ1ZSIpCisgICAgZWxzZToKKyAgICAgIG91dC53cml0ZSgiZmFsc2UiKQorICBlbHNlOgorICAgIG91dC53cml0ZShzdHIodmFsdWUpKQorCisKK2RlZiBNZXJnZSh0ZXh0LCBtZXNzYWdlKToKKyAgIiIiTWVyZ2VzIGFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIGEgcHJvdG9jb2wgbWVzc2FnZSBpbnRvIGEgbWVzc2FnZS4KKworICBBcmdzOgorICAgIHRleHQ6IE1lc3NhZ2UgQVNDSUkgcmVwcmVzZW50YXRpb24uCisgICAgbWVzc2FnZTogQSBwcm90b2NvbCBidWZmZXIgbWVzc2FnZSB0byBtZXJnZSBpbnRvLgorCisgIFJhaXNlczoKKyAgICBQYXJzZUVycm9yOiBPbiBBU0NJSSBwYXJzaW5nIHByb2JsZW1zLgorICAiIiIKKyAgdG9rZW5pemVyID0gX1Rva2VuaXplcih0ZXh0KQorICB3aGlsZSBub3QgdG9rZW5pemVyLkF0RW5kKCk6CisgICAgX01lcmdlRmllbGQodG9rZW5pemVyLCBtZXNzYWdlKQorCisKK2RlZiBfTWVyZ2VGaWVsZCh0b2tlbml6ZXIsIG1lc3NhZ2UpOgorICAiIiJNZXJnZXMgYSBzaW5nbGUgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBpbnRvIGEgbWVzc2FnZS4KKworICBBcmdzOgorICAgIHRva2VuaXplcjogQSB0b2tlbml6ZXIgdG8gcGFyc2UgdGhlIGZpZWxkIG5hbWUgYW5kIHZhbHVlcy4KKyAgICBtZXNzYWdlOiBBIHByb3RvY29sIG1lc3NhZ2UgdG8gcmVjb3JkIHRoZSBkYXRhLgorCisgIFJhaXNlczoKKyAgICBQYXJzZUVycm9yOiBJbiBjYXNlIG9mIEFTQ0lJIHBhcnNpbmcgcHJvYmxlbXMuCisgICIiIgorICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSBtZXNzYWdlLkRFU0NSSVBUT1IKKyAgaWYgdG9rZW5pemVyLlRyeUNvbnN1bWUoJ1snKToKKyAgICBuYW1lID0gW3Rva2VuaXplci5Db25zdW1lSWRlbnRpZmllcigpXQorICAgIHdoaWxlIHRva2VuaXplci5UcnlDb25zdW1lKCcuJyk6CisgICAgICBuYW1lLmFwcGVuZCh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKSkKKyAgICBuYW1lID0gJy4nLmpvaW4obmFtZSkKKworICAgIGlmIG5vdCBtZXNzYWdlX2Rlc2NyaXB0b3IuaXNfZXh0ZW5kYWJsZToKKyAgICAgIHJhaXNlIHRva2VuaXplci5QYXJzZUVycm9yUHJldmlvdXNUb2tlbigKKyAgICAgICAgICAnTWVzc2FnZSB0eXBlICIlcyIgZG9lcyBub3QgaGF2ZSBleHRlbnNpb25zLicgJQorICAgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUpCisgICAgZmllbGQgPSBtZXNzYWdlLkV4dGVuc2lvbnMuX0ZpbmRFeHRlbnNpb25CeU5hbWUobmFtZSkKKyAgICBpZiBub3QgZmllbGQ6CisgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oCisgICAgICAgICAgJ0V4dGVuc2lvbiAiJXMiIG5vdCByZWdpc3RlcmVkLicgJSBuYW1lKQorICAgIGVsaWYgbWVzc2FnZV9kZXNjcmlwdG9yICE9IGZpZWxkLmNvbnRhaW5pbmdfdHlwZToKKyAgICAgIHJhaXNlIHRva2VuaXplci5QYXJzZUVycm9yUHJldmlvdXNUb2tlbigKKyAgICAgICAgICAnRXh0ZW5zaW9uICIlcyIgZG9lcyBub3QgZXh0ZW5kIG1lc3NhZ2UgdHlwZSAiJXMiLicgJSAoCisgICAgICAgICAgICAgIG5hbWUsIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUpKQorICAgIHRva2VuaXplci5Db25zdW1lKCddJykKKyAgZWxzZToKKyAgICBuYW1lID0gdG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCkKKyAgICBmaWVsZCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZS5nZXQobmFtZSwgTm9uZSkKKworICAgICMgR3JvdXAgbmFtZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGNhcGl0YWxpemVkIGFzIHRoZXkgYXBwZWFyIGluIHRoZQorICAgICMgLnByb3RvIGZpbGUsIHdoaWNoIGFjdHVhbGx5IG1hdGNoZXMgdGhlaXIgdHlwZSBuYW1lcywgbm90IHRoZWlyIGZpZWxkCisgICAgIyBuYW1lcy4KKyAgICBpZiBub3QgZmllbGQ6CisgICAgICBmaWVsZCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZS5nZXQobmFtZS5sb3dlcigpLCBOb25lKQorICAgICAgaWYgZmllbGQgYW5kIGZpZWxkLnR5cGUgIT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUDoKKyAgICAgICAgZmllbGQgPSBOb25lCisKKyAgICBpZiAoZmllbGQgYW5kIGZpZWxkLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUCBhbmQKKyAgICAgICAgZmllbGQubWVzc2FnZV90eXBlLm5hbWUgIT0gbmFtZSk6CisgICAgICBmaWVsZCA9IE5vbmUKKworICAgIGlmIG5vdCBmaWVsZDoKKyAgICAgIHJhaXNlIHRva2VuaXplci5QYXJzZUVycm9yUHJldmlvdXNUb2tlbigKKyAgICAgICAgICAnTWVzc2FnZSB0eXBlICIlcyIgaGFzIG5vIGZpZWxkIG5hbWVkICIlcyIuJyAlICgKKyAgICAgICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSwgbmFtZSkpCisKKyAgaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgorICAgIHRva2VuaXplci5UcnlDb25zdW1lKCc6JykKKworICAgIGlmIHRva2VuaXplci5UcnlDb25zdW1lKCc8Jyk6CisgICAgICBlbmRfdG9rZW4gPSAnPicKKyAgICBlbHNlOgorICAgICAgdG9rZW5pemVyLkNvbnN1bWUoJ3snKQorICAgICAgZW5kX3Rva2VuID0gJ30nCisKKyAgICBpZiBmaWVsZC5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKKyAgICAgICAgc3ViX21lc3NhZ2UgPSBtZXNzYWdlLkV4dGVuc2lvbnNbZmllbGRdLmFkZCgpCisgICAgICBlbHNlOgorICAgICAgICBzdWJfbWVzc2FnZSA9IGdldGF0dHIobWVzc2FnZSwgZmllbGQubmFtZSkuYWRkKCkKKyAgICBlbHNlOgorICAgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgorICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0KKyAgICAgIGVsc2U6CisgICAgICAgIHN1Yl9tZXNzYWdlID0gZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKQorICAgICAgc3ViX21lc3NhZ2UuU2V0SW5QYXJlbnQoKQorCisgICAgd2hpbGUgbm90IHRva2VuaXplci5UcnlDb25zdW1lKGVuZF90b2tlbik6CisgICAgICBpZiB0b2tlbml6ZXIuQXRFbmQoKToKKyAgICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKCdFeHBlY3RlZCAiJXMiLicgJSAoZW5kX3Rva2VuKSkKKyAgICAgIF9NZXJnZUZpZWxkKHRva2VuaXplciwgc3ViX21lc3NhZ2UpCisgIGVsc2U6CisgICAgX01lcmdlU2NhbGFyRmllbGQodG9rZW5pemVyLCBtZXNzYWdlLCBmaWVsZCkKKworCitkZWYgX01lcmdlU2NhbGFyRmllbGQodG9rZW5pemVyLCBtZXNzYWdlLCBmaWVsZCk6CisgICIiIk1lcmdlcyBhIHNpbmdsZSBwcm90b2NvbCBtZXNzYWdlIHNjYWxhciBmaWVsZCBpbnRvIGEgbWVzc2FnZS4KKworICBBcmdzOgorICAgIHRva2VuaXplcjogQSB0b2tlbml6ZXIgdG8gcGFyc2UgdGhlIGZpZWxkIHZhbHVlLgorICAgIG1lc3NhZ2U6IEEgcHJvdG9jb2wgbWVzc2FnZSB0byByZWNvcmQgdGhlIGRhdGEuCisgICAgZmllbGQ6IFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCB0byBiZSBtZXJnZWQuCisKKyAgUmFpc2VzOgorICAgIFBhcnNlRXJyb3I6IEluIGNhc2Ugb2YgQVNDSUkgcGFyc2luZyBwcm9ibGVtcy4KKyAgICBSdW50aW1lRXJyb3I6IE9uIHJ1bnRpbWUgZXJyb3JzLgorICAiIiIKKyAgdG9rZW5pemVyLkNvbnN1bWUoJzonKQorICB2YWx1ZSA9IE5vbmUKKworICBpZiBmaWVsZC50eXBlIGluIChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQzMik6CisgICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZUludDMyKCkKKyAgZWxpZiBmaWVsZC50eXBlIGluIChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0LAorICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDY0LAorICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVENjQpOgorICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVJbnQ2NCgpCisgIGVsaWYgZmllbGQudHlwZSBpbiAoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDMyKToKKyAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lVWludDMyKCkKKyAgZWxpZiBmaWVsZC50eXBlIGluIChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVENjQpOgorICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVVaW50NjQoKQorICBlbGlmIGZpZWxkLnR5cGUgaW4gKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRkxPQVQsCisgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9ET1VCTEUpOgorICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVGbG9hdCgpCisgIGVsaWYgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JPT0w6CisgICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZUJvb2woKQorICBlbGlmIGZpZWxkLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6CisgICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZVN0cmluZygpCisgIGVsaWYgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOgorICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVCeXRlU3RyaW5nKCkKKyAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTToKKyAgICAjIEVudW0gY2FuIGJlIHNwZWNpZmllZCBieSBhIG51bWJlciAodGhlIGVudW0gdmFsdWUpLCBvciBieQorICAgICMgYSBzdHJpbmcgbGl0ZXJhbCAodGhlIGVudW0gbmFtZSkuCisgICAgZW51bV9kZXNjcmlwdG9yID0gZmllbGQuZW51bV90eXBlCisgICAgaWYgdG9rZW5pemVyLkxvb2tpbmdBdEludGVnZXIoKToKKyAgICAgIG51bWJlciA9IHRva2VuaXplci5Db25zdW1lSW50MzIoKQorICAgICAgZW51bV92YWx1ZSA9IGVudW1fZGVzY3JpcHRvci52YWx1ZXNfYnlfbnVtYmVyLmdldChudW1iZXIsIE5vbmUpCisgICAgICBpZiBlbnVtX3ZhbHVlIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIHRva2VuaXplci5QYXJzZUVycm9yUHJldmlvdXNUb2tlbigKKyAgICAgICAgICAgICdFbnVtIHR5cGUgIiVzIiBoYXMgbm8gdmFsdWUgd2l0aCBudW1iZXIgJWQuJyAlICgKKyAgICAgICAgICAgICAgICBlbnVtX2Rlc2NyaXB0b3IuZnVsbF9uYW1lLCBudW1iZXIpKQorICAgIGVsc2U6CisgICAgICBpZGVudGlmaWVyID0gdG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCkKKyAgICAgIGVudW1fdmFsdWUgPSBlbnVtX2Rlc2NyaXB0b3IudmFsdWVzX2J5X25hbWUuZ2V0KGlkZW50aWZpZXIsIE5vbmUpCisgICAgICBpZiBlbnVtX3ZhbHVlIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIHRva2VuaXplci5QYXJzZUVycm9yUHJldmlvdXNUb2tlbigKKyAgICAgICAgICAgICdFbnVtIHR5cGUgIiVzIiBoYXMgbm8gdmFsdWUgbmFtZWQgJXMuJyAlICgKKyAgICAgICAgICAgICAgICBlbnVtX2Rlc2NyaXB0b3IuZnVsbF9uYW1lLCBpZGVudGlmaWVyKSkKKyAgICB2YWx1ZSA9IGVudW1fdmFsdWUubnVtYmVyCisgIGVsc2U6CisgICAgcmFpc2UgUnVudGltZUVycm9yKCdVbmtub3duIGZpZWxkIHR5cGUgJWQnICUgZmllbGQudHlwZSkKKworICBpZiBmaWVsZC5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKKyAgICBpZiBmaWVsZC5pc19leHRlbnNpb246CisgICAgICBtZXNzYWdlLkV4dGVuc2lvbnNbZmllbGRdLmFwcGVuZCh2YWx1ZSkKKyAgICBlbHNlOgorICAgICAgZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKS5hcHBlbmQodmFsdWUpCisgIGVsc2U6CisgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgorICAgICAgbWVzc2FnZS5FeHRlbnNpb25zW2ZpZWxkXSA9IHZhbHVlCisgICAgZWxzZToKKyAgICAgIHNldGF0dHIobWVzc2FnZSwgZmllbGQubmFtZSwgdmFsdWUpCisKKworY2xhc3MgX1Rva2VuaXplcihvYmplY3QpOgorICAiIiJQcm90b2NvbCBidWZmZXIgQVNDSUkgcmVwcmVzZW50YXRpb24gdG9rZW5pemVyLgorCisgIFRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgbG93ZXIgbGV2ZWwgc3RyaW5nIHBhcnNpbmcgYnkgc3BsaXR0aW5nIGl0IGludG8KKyAgbWVhbmluZ2Z1bCB0b2tlbnMuCisKKyAgSXQgd2FzIGRpcmVjdGx5IHBvcnRlZCBmcm9tIHRoZSBKYXZhIHByb3RvY29sIGJ1ZmZlciBBUEkuCisgICIiIgorCisgIF9XSElURVNQQUNFID0gcmUuY29tcGlsZSgnKFxcc3woIy4qJCkpKycsIHJlLk1VTFRJTElORSkKKyAgX1RPS0VOID0gcmUuY29tcGlsZSgKKyAgICAgICdbYS16QS1aX11bMC05YS16QS1aXystXSp8JyAgICAgICAgICAgIyBhbiBpZGVudGlmaWVyCisgICAgICAnWzAtOSstXVswLTlhLXpBLVpfListXSp8JyAgICAgICAgICAgICMgYSBudW1iZXIKKyAgICAgICdcIihbXlwiXG5cXFxcXXxcXFxcLikqKFwifFxcXFw/JCl8JyAgIyBhIGRvdWJsZS1xdW90ZWQgc3RyaW5nCisgICAgICAnXCcoW15cJ1xuXFxcXF18XFxcXC4pKihcJ3xcXFxcPyQpJykgICMgYSBzaW5nbGUtcXVvdGVkIHN0cmluZworICBfSURFTlRJRklFUiA9IHJlLmNvbXBpbGUoJ1x3KycpCisgIF9JTlRFR0VSX0NIRUNLRVJTID0gW3R5cGVfY2hlY2tlcnMuVWludDMyVmFsdWVDaGVja2VyKCksCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfY2hlY2tlcnMuSW50MzJWYWx1ZUNoZWNrZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9jaGVja2Vycy5VaW50NjRWYWx1ZUNoZWNrZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9jaGVja2Vycy5JbnQ2NFZhbHVlQ2hlY2tlcigpXQorICBfRkxPQVRfSU5GSU5JVFkgPSByZS5jb21waWxlKCctP2luZihpbml0eSk/Zj8nLCByZS5JR05PUkVDQVNFKQorICBfRkxPQVRfTkFOID0gcmUuY29tcGlsZSgibmFuZj8iLCByZS5JR05PUkVDQVNFKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0X21lc3NhZ2UpOgorICAgIHNlbGYuX3RleHRfbWVzc2FnZSA9IHRleHRfbWVzc2FnZQorCisgICAgc2VsZi5fcG9zaXRpb24gPSAwCisgICAgc2VsZi5fbGluZSA9IC0xCisgICAgc2VsZi5fY29sdW1uID0gMAorICAgIHNlbGYuX3Rva2VuX3N0YXJ0ID0gTm9uZQorICAgIHNlbGYudG9rZW4gPSAnJworICAgIHNlbGYuX2xpbmVzID0gZGVxdWUodGV4dF9tZXNzYWdlLnNwbGl0KCdcbicpKQorICAgIHNlbGYuX2N1cnJlbnRfbGluZSA9ICcnCisgICAgc2VsZi5fcHJldmlvdXNfbGluZSA9IDAKKyAgICBzZWxmLl9wcmV2aW91c19jb2x1bW4gPSAwCisgICAgc2VsZi5fU2tpcFdoaXRlc3BhY2UoKQorICAgIHNlbGYuTmV4dFRva2VuKCkKKworICBkZWYgQXRFbmQoc2VsZik6CisgICAgIiIiQ2hlY2tzIHRoZSBlbmQgb2YgdGhlIHRleHQgd2FzIHJlYWNoZWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgVHJ1ZSBpZmYgdGhlIGVuZCB3YXMgcmVhY2hlZC4KKyAgICAiIiIKKyAgICByZXR1cm4gc2VsZi50b2tlbiA9PSAnJworCisgIGRlZiBfUG9wTGluZShzZWxmKToKKyAgICB3aGlsZSBsZW4oc2VsZi5fY3VycmVudF9saW5lKSA8PSBzZWxmLl9jb2x1bW46CisgICAgICBpZiBub3Qgc2VsZi5fbGluZXM6CisgICAgICAgIHNlbGYuX2N1cnJlbnRfbGluZSA9ICcnCisgICAgICAgIHJldHVybgorICAgICAgc2VsZi5fbGluZSArPSAxCisgICAgICBzZWxmLl9jb2x1bW4gPSAwCisgICAgICBzZWxmLl9jdXJyZW50X2xpbmUgPSBzZWxmLl9saW5lcy5wb3BsZWZ0KCkKKworICBkZWYgX1NraXBXaGl0ZXNwYWNlKHNlbGYpOgorICAgIHdoaWxlIFRydWU6CisgICAgICBzZWxmLl9Qb3BMaW5lKCkKKyAgICAgIG1hdGNoID0gc2VsZi5fV0hJVEVTUEFDRS5tYXRjaChzZWxmLl9jdXJyZW50X2xpbmUsIHNlbGYuX2NvbHVtbikKKyAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGxlbmd0aCA9IGxlbihtYXRjaC5ncm91cCgwKSkKKyAgICAgIHNlbGYuX2NvbHVtbiArPSBsZW5ndGgKKworICBkZWYgVHJ5Q29uc3VtZShzZWxmLCB0b2tlbik6CisgICAgIiIiVHJpZXMgdG8gY29uc3VtZSBhIGdpdmVuIHBpZWNlIG9mIHRleHQuCisKKyAgICBBcmdzOgorICAgICAgdG9rZW46IFRleHQgdG8gY29uc3VtZS4KKworICAgIFJldHVybnM6CisgICAgICBUcnVlIGlmZiB0aGUgdGV4dCB3YXMgY29uc3VtZWQuCisgICAgIiIiCisgICAgaWYgc2VsZi50b2tlbiA9PSB0b2tlbjoKKyAgICAgIHNlbGYuTmV4dFRva2VuKCkKKyAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIENvbnN1bWUoc2VsZiwgdG9rZW4pOgorICAgICIiIkNvbnN1bWVzIGEgcGllY2Ugb2YgdGV4dC4KKworICAgIEFyZ3M6CisgICAgICB0b2tlbjogVGV4dCB0byBjb25zdW1lLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgdGhlIHRleHQgY291bGRuJ3QgYmUgY29uc3VtZWQuCisgICAgIiIiCisgICAgaWYgbm90IHNlbGYuVHJ5Q29uc3VtZSh0b2tlbik6CisgICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKCdFeHBlY3RlZCAiJXMiLicgJSB0b2tlbikKKworICBkZWYgTG9va2luZ0F0SW50ZWdlcihzZWxmKToKKyAgICAiIiJDaGVja3MgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYW4gaW50ZWdlci4KKworICAgIFJldHVybnM6CisgICAgICBUcnVlIGlmZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhbiBpbnRlZ2VyLgorICAgICIiIgorICAgIGlmIG5vdCBzZWxmLnRva2VuOgorICAgICAgcmV0dXJuIEZhbHNlCisgICAgYyA9IHNlbGYudG9rZW5bMF0KKyAgICByZXR1cm4gKGMgPj0gJzAnIGFuZCBjIDw9ICc5Jykgb3IgYyA9PSAnLScgb3IgYyA9PSAnKycKKworICBkZWYgQ29uc3VtZUlkZW50aWZpZXIoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBpZGVudGlmaWVyLgorCisgICAgUmV0dXJuczoKKyAgICAgIElkZW50aWZpZXIgc3RyaW5nLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgYW4gaWRlbnRpZmllciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICByZXN1bHQgPSBzZWxmLnRva2VuCisgICAgaWYgbm90IHNlbGYuX0lERU5USUZJRVIubWF0Y2gocmVzdWx0KToKKyAgICAgIHJhaXNlIHNlbGYuX1BhcnNlRXJyb3IoJ0V4cGVjdGVkIGlkZW50aWZpZXIuJykKKyAgICBzZWxmLk5leHRUb2tlbigpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBDb25zdW1lSW50MzIoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgYSBzaWduZWQgMzJiaXQgaW50ZWdlciBudW1iZXIuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGludGVnZXIgcGFyc2VkLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgYSBzaWduZWQgMzJiaXQgaW50ZWdlciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICByZXN1bHQgPSBzZWxmLl9QYXJzZUludGVnZXIoc2VsZi50b2tlbiwgaXNfc2lnbmVkPVRydWUsIGlzX2xvbmc9RmFsc2UpCisgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICByYWlzZSBzZWxmLl9JbnRlZ2VyUGFyc2VFcnJvcihlKQorICAgIHNlbGYuTmV4dFRva2VuKCkKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIENvbnN1bWVVaW50MzIoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgYW4gdW5zaWduZWQgMzJiaXQgaW50ZWdlciBudW1iZXIuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGludGVnZXIgcGFyc2VkLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgYW4gdW5zaWduZWQgMzJiaXQgaW50ZWdlciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICByZXN1bHQgPSBzZWxmLl9QYXJzZUludGVnZXIoc2VsZi50b2tlbiwgaXNfc2lnbmVkPUZhbHNlLCBpc19sb25nPUZhbHNlKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgcmFpc2Ugc2VsZi5fSW50ZWdlclBhcnNlRXJyb3IoZSkKKyAgICBzZWxmLk5leHRUb2tlbigpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBDb25zdW1lSW50NjQoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgYSBzaWduZWQgNjRiaXQgaW50ZWdlciBudW1iZXIuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGludGVnZXIgcGFyc2VkLgorCisgICAgUmFpc2VzOgorICAgICAgUGFyc2VFcnJvcjogSWYgYSBzaWduZWQgNjRiaXQgaW50ZWdlciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICByZXN1bHQgPSBzZWxmLl9QYXJzZUludGVnZXIoc2VsZi50b2tlbiwgaXNfc2lnbmVkPVRydWUsIGlzX2xvbmc9VHJ1ZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgIHJhaXNlIHNlbGYuX0ludGVnZXJQYXJzZUVycm9yKGUpCisgICAgc2VsZi5OZXh0VG9rZW4oKQorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgQ29uc3VtZVVpbnQ2NChzZWxmKToKKyAgICAiIiJDb25zdW1lcyBhbiB1bnNpZ25lZCA2NGJpdCBpbnRlZ2VyIG51bWJlci4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgaW50ZWdlciBwYXJzZWQuCisKKyAgICBSYWlzZXM6CisgICAgICBQYXJzZUVycm9yOiBJZiBhbiB1bnNpZ25lZCA2NGJpdCBpbnRlZ2VyIGNvdWxkbid0IGJlIGNvbnN1bWVkLgorICAgICIiIgorICAgIHRyeToKKyAgICAgIHJlc3VsdCA9IHNlbGYuX1BhcnNlSW50ZWdlcihzZWxmLnRva2VuLCBpc19zaWduZWQ9RmFsc2UsIGlzX2xvbmc9VHJ1ZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgIHJhaXNlIHNlbGYuX0ludGVnZXJQYXJzZUVycm9yKGUpCisgICAgc2VsZi5OZXh0VG9rZW4oKQorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgQ29uc3VtZUZsb2F0KHNlbGYpOgorICAgICIiIkNvbnN1bWVzIGFuIGZsb2F0aW5nIHBvaW50IG51bWJlci4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgbnVtYmVyIHBhcnNlZC4KKworICAgIFJhaXNlczoKKyAgICAgIFBhcnNlRXJyb3I6IElmIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGNvdWxkbid0IGJlIGNvbnN1bWVkLgorICAgICIiIgorICAgIHRleHQgPSBzZWxmLnRva2VuCisgICAgaWYgc2VsZi5fRkxPQVRfSU5GSU5JVFkubWF0Y2godGV4dCk6CisgICAgICBzZWxmLk5leHRUb2tlbigpCisgICAgICBpZiB0ZXh0LnN0YXJ0c3dpdGgoJy0nKToKKyAgICAgICAgcmV0dXJuIC1fSU5GSU5JVFkKKyAgICAgIHJldHVybiBfSU5GSU5JVFkKKworICAgIGlmIHNlbGYuX0ZMT0FUX05BTi5tYXRjaCh0ZXh0KToKKyAgICAgIHNlbGYuTmV4dFRva2VuKCkKKyAgICAgIHJldHVybiBfTkFOCisKKyAgICB0cnk6CisgICAgICByZXN1bHQgPSBmbG9hdCh0ZXh0KQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgcmFpc2Ugc2VsZi5fRmxvYXRQYXJzZUVycm9yKGUpCisgICAgc2VsZi5OZXh0VG9rZW4oKQorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgQ29uc3VtZUJvb2woc2VsZik6CisgICAgIiIiQ29uc3VtZXMgYSBib29sZWFuIHZhbHVlLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBib29sIHBhcnNlZC4KKworICAgIFJhaXNlczoKKyAgICAgIFBhcnNlRXJyb3I6IElmIGEgYm9vbGVhbiB2YWx1ZSBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICBpZiBzZWxmLnRva2VuIGluICgndHJ1ZScsICd0JywgJzEnKToKKyAgICAgIHNlbGYuTmV4dFRva2VuKCkKKyAgICAgIHJldHVybiBUcnVlCisgICAgZWxpZiBzZWxmLnRva2VuIGluICgnZmFsc2UnLCAnZicsICcwJyk6CisgICAgICBzZWxmLk5leHRUb2tlbigpCisgICAgICByZXR1cm4gRmFsc2UKKyAgICBlbHNlOgorICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcignRXhwZWN0ZWQgInRydWUiIG9yICJmYWxzZSIuJykKKworICBkZWYgQ29uc3VtZVN0cmluZyhzZWxmKToKKyAgICAiIiJDb25zdW1lcyBhIHN0cmluZyB2YWx1ZS4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgc3RyaW5nIHBhcnNlZC4KKworICAgIFJhaXNlczoKKyAgICAgIFBhcnNlRXJyb3I6IElmIGEgc3RyaW5nIHZhbHVlIGNvdWxkbid0IGJlIGNvbnN1bWVkLgorICAgICIiIgorICAgIGJ5dGVzID0gc2VsZi5Db25zdW1lQnl0ZVN0cmluZygpCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHVuaWNvZGUoYnl0ZXMsICd1dGYtOCcpCisgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvciwgZToKKyAgICAgIHJhaXNlIHNlbGYuX1N0cmluZ1BhcnNlRXJyb3IoZSkKKworICBkZWYgQ29uc3VtZUJ5dGVTdHJpbmcoc2VsZik6CisgICAgIiIiQ29uc3VtZXMgYSBieXRlIGFycmF5IHZhbHVlLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBhcnJheSBwYXJzZWQgKGFzIGEgc3RyaW5nKS4KKworICAgIFJhaXNlczoKKyAgICAgIFBhcnNlRXJyb3I6IElmIGEgYnl0ZSBhcnJheSB2YWx1ZSBjb3VsZG4ndCBiZSBjb25zdW1lZC4KKyAgICAiIiIKKyAgICBsaXN0ID0gW3NlbGYuX0NvbnN1bWVTaW5nbGVCeXRlU3RyaW5nKCldCisgICAgd2hpbGUgbGVuKHNlbGYudG9rZW4pID4gMCBhbmQgc2VsZi50b2tlblswXSBpbiAoJ1wnJywgJyInKToKKyAgICAgIGxpc3QuYXBwZW5kKHNlbGYuX0NvbnN1bWVTaW5nbGVCeXRlU3RyaW5nKCkpCisgICAgcmV0dXJuICIiLmpvaW4obGlzdCkKKworICBkZWYgX0NvbnN1bWVTaW5nbGVCeXRlU3RyaW5nKHNlbGYpOgorICAgICIiIkNvbnN1bWUgb25lIHRva2VuIG9mIGEgc3RyaW5nIGxpdGVyYWwuCisKKyAgICBTdHJpbmcgbGl0ZXJhbHMgKHdoZXRoZXIgYnl0ZXMgb3IgdGV4dCkgY2FuIGNvbWUgaW4gbXVsdGlwbGUgYWRqYWNlbnQKKyAgICB0b2tlbnMgd2hpY2ggYXJlIGF1dG9tYXRpY2FsbHkgY29uY2F0ZW5hdGVkLCBsaWtlIGluIEMgb3IgUHl0aG9uLiAgVGhpcworICAgIG1ldGhvZCBvbmx5IGNvbnN1bWVzIG9uZSB0b2tlbi4KKyAgICAiIiIKKyAgICB0ZXh0ID0gc2VsZi50b2tlbgorICAgIGlmIGxlbih0ZXh0KSA8IDEgb3IgdGV4dFswXSBub3QgaW4gKCdcJycsICciJyk6CisgICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKCdFeHB0ZWN0ZWQgc3RyaW5nLicpCisKKyAgICBpZiBsZW4odGV4dCkgPCAyIG9yIHRleHRbLTFdICE9IHRleHRbMF06CisgICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKCdTdHJpbmcgbWlzc2luZyBlbmRpbmcgcXVvdGUuJykKKworICAgIHRyeToKKyAgICAgIHJlc3VsdCA9IF9DVW5lc2NhcGUodGV4dFsxOi0xXSkKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgIHJhaXNlIHNlbGYuX1BhcnNlRXJyb3Ioc3RyKGUpKQorICAgIHNlbGYuTmV4dFRva2VuKCkKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIF9QYXJzZUludGVnZXIoc2VsZiwgdGV4dCwgaXNfc2lnbmVkPUZhbHNlLCBpc19sb25nPUZhbHNlKToKKyAgICAiIiJQYXJzZXMgYW4gaW50ZWdlci4KKworICAgIEFyZ3M6CisgICAgICB0ZXh0OiBUaGUgdGV4dCB0byBwYXJzZS4KKyAgICAgIGlzX3NpZ25lZDogVHJ1ZSBpZiBhIHNpZ25lZCBpbnRlZ2VyIG11c3QgYmUgcGFyc2VkLgorICAgICAgaXNfbG9uZzogVHJ1ZSBpZiBhIGxvbmcgaW50ZWdlciBtdXN0IGJlIHBhcnNlZC4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgaW50ZWdlciB2YWx1ZS4KKworICAgIFJhaXNlczoKKyAgICAgIFZhbHVlRXJyb3I6IFRocm93biBJZmYgdGhlIHRleHQgaXMgbm90IGEgdmFsaWQgaW50ZWdlci4KKyAgICAiIiIKKyAgICBwb3MgPSAwCisgICAgaWYgdGV4dC5zdGFydHN3aXRoKCctJyk6CisgICAgICBwb3MgKz0gMQorCisgICAgYmFzZSA9IDEwCisgICAgaWYgdGV4dC5zdGFydHN3aXRoKCcweCcsIHBvcykgb3IgdGV4dC5zdGFydHN3aXRoKCcwWCcsIHBvcyk6CisgICAgICBiYXNlID0gMTYKKyAgICBlbGlmIHRleHQuc3RhcnRzd2l0aCgnMCcsIHBvcyk6CisgICAgICBiYXNlID0gOAorCisgICAgIyBEbyB0aGUgYWN0dWFsIHBhcnNpbmcuIEV4Y2VwdGlvbiBoYW5kbGluZyBpcyBwcm9wYWdhdGVkIHRvIGNhbGxlci4KKyAgICByZXN1bHQgPSBpbnQodGV4dCwgYmFzZSkKKworICAgICMgQ2hlY2sgaWYgdGhlIGludGVnZXIgaXMgc2FuZS4gRXhjZXB0aW9ucyBoYW5kbGVkIGJ5IGNhbGxlcnMuCisgICAgY2hlY2tlciA9IHNlbGYuX0lOVEVHRVJfQ0hFQ0tFUlNbMiAqIGludChpc19sb25nKSArIGludChpc19zaWduZWQpXQorICAgIGNoZWNrZXIuQ2hlY2tWYWx1ZShyZXN1bHQpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBQYXJzZUVycm9yUHJldmlvdXNUb2tlbihzZWxmLCBtZXNzYWdlKToKKyAgICAiIiJDcmVhdGVzIGFuZCAqcmV0dXJucyogYSBQYXJzZUVycm9yIGZvciB0aGUgcHJldmlvdXNseSByZWFkIHRva2VuLgorCisgICAgQXJnczoKKyAgICAgIG1lc3NhZ2U6IEEgbWVzc2FnZSB0byBzZXQgZm9yIHRoZSBleGNlcHRpb24uCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBQYXJzZUVycm9yIGluc3RhbmNlLgorICAgICIiIgorICAgIHJldHVybiBQYXJzZUVycm9yKCclZDolZCA6ICVzJyAlICgKKyAgICAgICAgc2VsZi5fcHJldmlvdXNfbGluZSArIDEsIHNlbGYuX3ByZXZpb3VzX2NvbHVtbiArIDEsIG1lc3NhZ2UpKQorCisgIGRlZiBfUGFyc2VFcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAiIiJDcmVhdGVzIGFuZCAqcmV0dXJucyogYSBQYXJzZUVycm9yIGZvciB0aGUgY3VycmVudCB0b2tlbi4iIiIKKyAgICByZXR1cm4gUGFyc2VFcnJvcignJWQ6JWQgOiAlcycgJSAoCisgICAgICAgIHNlbGYuX2xpbmUgKyAxLCBzZWxmLl9jb2x1bW4gLSBsZW4oc2VsZi50b2tlbikgKyAxLCBtZXNzYWdlKSkKKworICBkZWYgX0ludGVnZXJQYXJzZUVycm9yKHNlbGYsIGUpOgorICAgIHJldHVybiBzZWxmLl9QYXJzZUVycm9yKCdDb3VsZG5cJ3QgcGFyc2UgaW50ZWdlcjogJyArIHN0cihlKSkKKworICBkZWYgX0Zsb2F0UGFyc2VFcnJvcihzZWxmLCBlKToKKyAgICByZXR1cm4gc2VsZi5fUGFyc2VFcnJvcignQ291bGRuXCd0IHBhcnNlIG51bWJlcjogJyArIHN0cihlKSkKKworICBkZWYgX1N0cmluZ1BhcnNlRXJyb3Ioc2VsZiwgZSk6CisgICAgcmV0dXJuIHNlbGYuX1BhcnNlRXJyb3IoJ0NvdWxkblwndCBwYXJzZSBzdHJpbmc6ICcgKyBzdHIoZSkpCisKKyAgZGVmIE5leHRUb2tlbihzZWxmKToKKyAgICAiIiJSZWFkcyB0aGUgbmV4dCBtZWFuaW5nZnVsIHRva2VuLiIiIgorICAgIHNlbGYuX3ByZXZpb3VzX2xpbmUgPSBzZWxmLl9saW5lCisgICAgc2VsZi5fcHJldmlvdXNfY29sdW1uID0gc2VsZi5fY29sdW1uCisKKyAgICBzZWxmLl9jb2x1bW4gKz0gbGVuKHNlbGYudG9rZW4pCisgICAgc2VsZi5fU2tpcFdoaXRlc3BhY2UoKQorCisgICAgaWYgbm90IHNlbGYuX2xpbmVzIGFuZCBsZW4oc2VsZi5fY3VycmVudF9saW5lKSA8PSBzZWxmLl9jb2x1bW46CisgICAgICBzZWxmLnRva2VuID0gJycKKyAgICAgIHJldHVybgorCisgICAgbWF0Y2ggPSBzZWxmLl9UT0tFTi5tYXRjaChzZWxmLl9jdXJyZW50X2xpbmUsIHNlbGYuX2NvbHVtbikKKyAgICBpZiBtYXRjaDoKKyAgICAgIHRva2VuID0gbWF0Y2guZ3JvdXAoMCkKKyAgICAgIHNlbGYudG9rZW4gPSB0b2tlbgorICAgIGVsc2U6CisgICAgICBzZWxmLnRva2VuID0gc2VsZi5fY3VycmVudF9saW5lW3NlbGYuX2NvbHVtbl0KKworCisjIHRleHQuZW5jb2RlKCdzdHJpbmdfZXNjYXBlJykgZG9lcyBub3Qgc2VlbSB0byBzYXRpc2Z5IG91ciBuZWVkcyBhcyBpdAorIyBlbmNvZGVzIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgdXNpbmcgdHdvLWRpZ2l0IGhleCBlc2NhcGVzIHdoZXJlYXMgb3VyCisjIEMrKyB1bmVzY2FwaW5nIGZ1bmN0aW9uIGFsbG93cyBoZXggZXNjYXBlcyB0byBiZSBhbnkgbGVuZ3RoLiAgU28sCisjICJcMDAxMSIuZW5jb2RlKCdzdHJpbmdfZXNjYXBlJykgZW5kcyB1cCBiZWluZyAiXFx4MDExIiwgd2hpY2ggd2lsbCBiZQorIyBkZWNvZGVkIGluIEMrKyBhcyBhIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nIHdpdGggY2hhciBjb2RlIDB4MTEuCitkZWYgX0NFc2NhcGUodGV4dCwgYXNfdXRmOCk6CisgIGRlZiBlc2NhcGUoYyk6CisgICAgbyA9IG9yZChjKQorICAgIGlmIG8gPT0gMTA6IHJldHVybiByIlxuIiAgICMgb3B0aW9uYWwgZXNjYXBlCisgICAgaWYgbyA9PSAxMzogcmV0dXJuIHIiXHIiICAgIyBvcHRpb25hbCBlc2NhcGUKKyAgICBpZiBvID09ICA5OiByZXR1cm4gciJcdCIgICAjIG9wdGlvbmFsIGVzY2FwZQorICAgIGlmIG8gPT0gMzk6IHJldHVybiByIlwnIiAgICMgb3B0aW9uYWwgZXNjYXBlCisKKyAgICBpZiBvID09IDM0OiByZXR1cm4gcidcIicgICAjIG5lY2Vzc2FyeSBlc2NhcGUKKyAgICBpZiBvID09IDkyOiByZXR1cm4gciJcXCIgICAjIG5lY2Vzc2FyeSBlc2NhcGUKKworICAgICMgbmVjZXNzYXJ5IGVzY2FwZXMKKyAgICBpZiBub3QgYXNfdXRmOCBhbmQgKG8gPj0gMTI3IG9yIG8gPCAzMik6IHJldHVybiAiXFwlMDNvIiAlIG8KKyAgICByZXR1cm4gYworICByZXR1cm4gIiIuam9pbihbZXNjYXBlKGMpIGZvciBjIGluIHRleHRdKQorCisKK19DVU5FU0NBUEVfSEVYID0gcmUuY29tcGlsZSgnXFxcXHgoWzAtOWEtZkEtRl17Mn18WzAtOWEtZkEtRl0pJykKKworCitkZWYgX0NVbmVzY2FwZSh0ZXh0KToKKyAgZGVmIFJlcGxhY2VIZXgobSk6CisgICAgcmV0dXJuIGNocihpbnQobS5ncm91cCgwKVsyOl0sIDE2KSkKKyAgIyBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlICdzdHJpbmdfZXNjYXBlJyBlbmNvZGluZyBkb2Vzbid0CisgICMgYWxsb3cgc2luZ2xlLWRpZ2l0IGhleCBlc2NhcGVzIChsaWtlICdceGYnKS4KKyAgcmVzdWx0ID0gX0NVTkVTQ0FQRV9IRVguc3ViKFJlcGxhY2VIZXgsIHRleHQpCisgIHJldHVybiByZXN1bHQuZGVjb2RlKCdzdHJpbmdfZXNjYXBlJykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vbW94LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9tb3gucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2U4MGJhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vbW94LnB5CkBAIC0wLDAgKzEsMTQwMSBAQAorIyEvdXNyL2Jpbi9weXRob24yLjQKKyMKKyMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBmaWxlIGlzIHVzZWQgZm9yIHRlc3RpbmcuICBUaGUgb3JpZ2luYWwgaXMgYXQ6CisjICAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3B5bW94LworCisiIiJNb3gsIGFuIG9iamVjdC1tb2NraW5nIGZyYW1ld29yayBmb3IgUHl0aG9uLgorCitNb3ggd29ya3MgaW4gdGhlIHJlY29yZC1yZXBsYXktdmVyaWZ5IHBhcmFkaWdtLiAgV2hlbiB5b3UgZmlyc3QgY3JlYXRlCithIG1vY2sgb2JqZWN0LCBpdCBpcyBpbiByZWNvcmQgbW9kZS4gIFlvdSB0aGVuIHByb2dyYW1tYXRpY2FsbHkgc2V0Cit0aGUgZXhwZWN0ZWQgYmVoYXZpb3Igb2YgdGhlIG1vY2sgb2JqZWN0ICh3aGF0IG1ldGhvZHMgYXJlIHRvIGJlCitjYWxsZWQgb24gaXQsIHdpdGggd2hhdCBwYXJhbWV0ZXJzLCB3aGF0IHRoZXkgc2hvdWxkIHJldHVybiwgYW5kIGluCit3aGF0IG9yZGVyKS4KKworT25jZSB5b3UgaGF2ZSBzZXQgdXAgdGhlIGV4cGVjdGVkIG1vY2sgYmVoYXZpb3IsIHlvdSBwdXQgaXQgaW4gcmVwbGF5Cittb2RlLiAgTm93IHRoZSBtb2NrIHJlc3BvbmRzIHRvIG1ldGhvZCBjYWxscyBqdXN0IGFzIHlvdSB0b2xkIGl0IHRvLgorSWYgYW4gdW5leHBlY3RlZCBtZXRob2QgKG9yIGFuIGV4cGVjdGVkIG1ldGhvZCB3aXRoIHVuZXhwZWN0ZWQKK3BhcmFtZXRlcnMpIGlzIGNhbGxlZCwgdGhlbiBhbiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuCisKK09uY2UgeW91IGFyZSBkb25lIGludGVyYWN0aW5nIHdpdGggdGhlIG1vY2ssIHlvdSBuZWVkIHRvIHZlcmlmeSB0aGF0CithbGwgdGhlIGV4cGVjdGVkIGludGVyYWN0aW9ucyBvY2N1cmVkLiAgKE1heWJlIHlvdXIgY29kZSBleGl0ZWQKK3ByZW1hdHVyZWx5IHdpdGhvdXQgY2FsbGluZyBzb21lIGNsZWFudXAgbWV0aG9kISkgIFRoZSB2ZXJpZnkgcGhhc2UKK2Vuc3VyZXMgdGhhdCBldmVyeSBleHBlY3RlZCBtZXRob2Qgd2FzIGNhbGxlZDsgb3RoZXJ3aXNlLCBhbiBleGNlcHRpb24KK3dpbGwgYmUgcmFpc2VkLgorCitTdWdnZXN0ZWQgdXNhZ2UgLyB3b3JrZmxvdzoKKworICAjIENyZWF0ZSBNb3ggZmFjdG9yeQorICBteV9tb3ggPSBNb3goKQorCisgICMgQ3JlYXRlIGEgbW9jayBkYXRhIGFjY2VzcyBvYmplY3QKKyAgbW9ja19kYW8gPSBteV9tb3guQ3JlYXRlTW9jayhEQU9DbGFzcykKKworICAjIFNldCB1cCBleHBlY3RlZCBiZWhhdmlvcgorICBtb2NrX2Rhby5SZXRyaWV2ZVBlcnNvbldpdGhJZGVudGlmaWVyKCcxJykuQW5kUmV0dXJuKHBlcnNvbikKKyAgbW9ja19kYW8uRGVsZXRlUGVyc29uKHBlcnNvbikKKworICAjIFB1dCBtb2NrcyBpbiByZXBsYXkgbW9kZQorICBteV9tb3guUmVwbGF5QWxsKCkKKworICAjIEluamVjdCBtb2NrIG9iamVjdCBhbmQgcnVuIHRlc3QKKyAgY29udHJvbGxlci5TZXREYW8obW9ja19kYW8pCisgIGNvbnRyb2xsZXIuRGVsZXRlUGVyc29uQnlJZCgnMScpCisKKyAgIyBWZXJpZnkgYWxsIG1ldGhvZHMgd2VyZSBjYWxsZWQgYXMgZXhwZWN0ZWQKKyAgbXlfbW94LlZlcmlmeUFsbCgpCisiIiIKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2ltcG9ydCByZQoraW1wb3J0IHR5cGVzCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IHN0dWJvdXQKKworY2xhc3MgRXJyb3IoQXNzZXJ0aW9uRXJyb3IpOgorICAiIiJCYXNlIGV4Y2VwdGlvbiBmb3IgdGhpcyBtb2R1bGUuIiIiCisKKyAgcGFzcworCisKK2NsYXNzIEV4cGVjdGVkTWV0aG9kQ2FsbHNFcnJvcihFcnJvcik6CisgICIiIlJhaXNlZCB3aGVuIFZlcmlmeSgpIGlzIGNhbGxlZCBiZWZvcmUgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWRfbWV0aG9kcyk6CisgICAgIiIiSW5pdCBleGNlcHRpb24uCisKKyAgICBBcmdzOgorICAgICAgIyBleHBlY3RlZF9tZXRob2RzOiBBIHNlcXVlbmNlIG9mIE1vY2tNZXRob2Qgb2JqZWN0cyB0aGF0IHNob3VsZCBoYXZlIGJlZW4KKyAgICAgICMgICBjYWxsZWQuCisgICAgICBleHBlY3RlZF9tZXRob2RzOiBbTW9ja01ldGhvZF0KKworICAgIFJhaXNlczoKKyAgICAgIFZhbHVlRXJyb3I6IGlmIGV4cGVjdGVkX21ldGhvZHMgY29udGFpbnMgbm8gbWV0aG9kcy4KKyAgICAiIiIKKworICAgIGlmIG5vdCBleHBlY3RlZF9tZXRob2RzOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZXhwZWN0ZWQgbWV0aG9kIikKKyAgICBFcnJvci5fX2luaXRfXyhzZWxmKQorICAgIHNlbGYuX2V4cGVjdGVkX21ldGhvZHMgPSBleHBlY3RlZF9tZXRob2RzCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgY2FsbHMgPSAiXG4iLmpvaW4oWyIlM2QuICAlcyIgJSAoaSwgbSkKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIGksIG0gaW4gZW51bWVyYXRlKHNlbGYuX2V4cGVjdGVkX21ldGhvZHMpXSkKKyAgICByZXR1cm4gIlZlcmlmeTogRXhwZWN0ZWQgbWV0aG9kcyBuZXZlciBjYWxsZWQ6XG4lcyIgJSAoY2FsbHMsKQorCisKK2NsYXNzIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IoRXJyb3IpOgorICAiIiJSYWlzZWQgd2hlbiBhbiB1bmV4cGVjdGVkIG1ldGhvZCBpcyBjYWxsZWQuCisKKyAgVGhpcyBjYW4gb2NjdXIgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHdpdGggaW5jb3JyZWN0IHBhcmFtZXRlcnMsIG9yIG91dCBvZiB0aGUKKyAgc3BlY2lmaWVkIG9yZGVyLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgdW5leHBlY3RlZF9tZXRob2QsIGV4cGVjdGVkKToKKyAgICAiIiJJbml0IGV4Y2VwdGlvbi4KKworICAgIEFyZ3M6CisgICAgICAjIHVuZXhwZWN0ZWRfbWV0aG9kOiBNb2NrTWV0aG9kIHRoYXQgd2FzIGNhbGxlZCBidXQgd2FzIG5vdCBhdCB0aGUgaGVhZCBvZgorICAgICAgIyAgIHRoZSBleHBlY3RlZF9tZXRob2QgcXVldWUuCisgICAgICAjIGV4cGVjdGVkOiBNb2NrTWV0aG9kIG9yIFVub3JkZXJlZEdyb3VwIHRoZSBtZXRob2Qgc2hvdWxkIGhhdmUKKyAgICAgICMgICBiZWVuIGluLgorICAgICAgdW5leHBlY3RlZF9tZXRob2Q6IE1vY2tNZXRob2QKKyAgICAgIGV4cGVjdGVkOiBNb2NrTWV0aG9kIG9yIFVub3JkZXJlZEdyb3VwCisgICAgIiIiCisKKyAgICBFcnJvci5fX2luaXRfXyhzZWxmKQorICAgIHNlbGYuX3VuZXhwZWN0ZWRfbWV0aG9kID0gdW5leHBlY3RlZF9tZXRob2QKKyAgICBzZWxmLl9leHBlY3RlZCA9IGV4cGVjdGVkCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgcmV0dXJuICJVbmV4cGVjdGVkIG1ldGhvZCBjYWxsOiAlcy4gIEV4cGVjdGluZzogJXMiICUgXAorICAgICAgKHNlbGYuX3VuZXhwZWN0ZWRfbWV0aG9kLCBzZWxmLl9leHBlY3RlZCkKKworCitjbGFzcyBVbmtub3duTWV0aG9kQ2FsbEVycm9yKEVycm9yKToKKyAgIiIiUmFpc2VkIGlmIGFuIHVua25vd24gbWV0aG9kIGlzIHJlcXVlc3RlZCBvZiB0aGUgbW9jayBvYmplY3QuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHVua25vd25fbWV0aG9kX25hbWUpOgorICAgICIiIkluaXQgZXhjZXB0aW9uLgorCisgICAgQXJnczoKKyAgICAgICMgdW5rbm93bl9tZXRob2RfbmFtZTogTWV0aG9kIGNhbGwgdGhhdCBpcyBub3QgcGFydCBvZiB0aGUgbW9ja2VkIGNsYXNzJ3MKKyAgICAgICMgICBwdWJsaWMgaW50ZXJmYWNlLgorICAgICAgdW5rbm93bl9tZXRob2RfbmFtZTogc3RyCisgICAgIiIiCisKKyAgICBFcnJvci5fX2luaXRfXyhzZWxmKQorICAgIHNlbGYuX3Vua25vd25fbWV0aG9kX25hbWUgPSB1bmtub3duX21ldGhvZF9uYW1lCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgcmV0dXJuICJNZXRob2QgY2FsbGVkIGlzIG5vdCBhIG1lbWJlciBvZiB0aGUgb2JqZWN0OiAlcyIgJSBcCisgICAgICBzZWxmLl91bmtub3duX21ldGhvZF9uYW1lCisKKworY2xhc3MgTW94KG9iamVjdCk6CisgICIiIk1veDogYSBmYWN0b3J5IGZvciBjcmVhdGluZyBtb2NrIG9iamVjdHMuIiIiCisKKyAgIyBBIGxpc3Qgb2YgdHlwZXMgdGhhdCBzaG91bGQgYmUgc3R1YmJlZCBvdXQgd2l0aCBNb2NrT2JqZWN0cyAoYXMKKyAgIyBvcHBvc2VkIHRvIE1vY2tBbnl0aGluZ3MpLgorICBfVVNFX01PQ0tfT0JKRUNUID0gW3R5cGVzLkNsYXNzVHlwZSwgdHlwZXMuSW5zdGFuY2VUeXBlLCB0eXBlcy5Nb2R1bGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVzLk9iamVjdFR5cGUsIHR5cGVzLlR5cGVUeXBlXQorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAiIiJJbml0aWFsaXplIGEgbmV3IE1veC4iIiIKKworICAgIHNlbGYuX21vY2tfb2JqZWN0cyA9IFtdCisgICAgc2VsZi5zdHVicyA9IHN0dWJvdXQuU3R1Yk91dEZvclRlc3RpbmcoKQorCisgIGRlZiBDcmVhdGVNb2NrKHNlbGYsIGNsYXNzX3RvX21vY2spOgorICAgICIiIkNyZWF0ZSBhIG5ldyBtb2NrIG9iamVjdC4KKworICAgIEFyZ3M6CisgICAgICAjIGNsYXNzX3RvX21vY2s6IHRoZSBjbGFzcyB0byBiZSBtb2NrZWQKKyAgICAgIGNsYXNzX3RvX21vY2s6IGNsYXNzCisKKyAgICBSZXR1cm5zOgorICAgICAgTW9ja09iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBjbGFzc190b19tb2NrIHdvdWxkIGJlLgorICAgICIiIgorCisgICAgbmV3X21vY2sgPSBNb2NrT2JqZWN0KGNsYXNzX3RvX21vY2spCisgICAgc2VsZi5fbW9ja19vYmplY3RzLmFwcGVuZChuZXdfbW9jaykKKyAgICByZXR1cm4gbmV3X21vY2sKKworICBkZWYgQ3JlYXRlTW9ja0FueXRoaW5nKHNlbGYpOgorICAgICIiIkNyZWF0ZSBhIG1vY2sgdGhhdCB3aWxsIGFjY2VwdCBhbnkgbWV0aG9kIGNhbGxzLgorCisgICAgVGhpcyBkb2VzIG5vdCBlbmZvcmNlIGFuIGludGVyZmFjZS4KKyAgICAiIiIKKworICAgIG5ld19tb2NrID0gTW9ja0FueXRoaW5nKCkKKyAgICBzZWxmLl9tb2NrX29iamVjdHMuYXBwZW5kKG5ld19tb2NrKQorICAgIHJldHVybiBuZXdfbW9jaworCisgIGRlZiBSZXBsYXlBbGwoc2VsZik6CisgICAgIiIiU2V0IGFsbCBtb2NrIG9iamVjdHMgdG8gcmVwbGF5IG1vZGUuIiIiCisKKyAgICBmb3IgbW9ja19vYmogaW4gc2VsZi5fbW9ja19vYmplY3RzOgorICAgICAgbW9ja19vYmouX1JlcGxheSgpCisKKworICBkZWYgVmVyaWZ5QWxsKHNlbGYpOgorICAgICIiIkNhbGwgdmVyaWZ5IG9uIGFsbCBtb2NrIG9iamVjdHMgY3JlYXRlZC4iIiIKKworICAgIGZvciBtb2NrX29iaiBpbiBzZWxmLl9tb2NrX29iamVjdHM6CisgICAgICBtb2NrX29iai5fVmVyaWZ5KCkKKworICBkZWYgUmVzZXRBbGwoc2VsZik6CisgICAgIiIiQ2FsbCByZXNldCBvbiBhbGwgbW9jayBvYmplY3RzLiAgVGhpcyBkb2VzIG5vdCB1bnNldCBzdHVicy4iIiIKKworICAgIGZvciBtb2NrX29iaiBpbiBzZWxmLl9tb2NrX29iamVjdHM6CisgICAgICBtb2NrX29iai5fUmVzZXQoKQorCisgIGRlZiBTdHViT3V0V2l0aE1vY2soc2VsZiwgb2JqLCBhdHRyX25hbWUsIHVzZV9tb2NrX2FueXRoaW5nPUZhbHNlKToKKyAgICAiIiJSZXBsYWNlIGEgbWV0aG9kLCBhdHRyaWJ1dGUsIGV0Yy4gd2l0aCBhIE1vY2suCisKKyAgICBUaGlzIHdpbGwgcmVwbGFjZSBhIGNsYXNzIG9yIG1vZHVsZSB3aXRoIGEgTW9ja09iamVjdCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZQorICAgIChtZXRob2QsIGZ1bmN0aW9uLCBldGMpIHdpdGggYSBNb2NrQW55dGhpbmcuICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHRvCisgICAgYWx3YXlzIHVzZSBhIE1vY2tBbnl0aGluZyBieSBzZXR0aW5nIHVzZV9tb2NrX2FueXRoaW5nIHRvIFRydWUuCisKKyAgICBBcmdzOgorICAgICAgb2JqOiBBIFB5dGhvbiBvYmplY3QgKGNsYXNzLCBtb2R1bGUsIGluc3RhbmNlLCBjYWxsYWJsZSkuCisgICAgICBhdHRyX25hbWU6IHN0ci4gIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gcmVwbGFjZSB3aXRoIGEgbW9jay4KKyAgICAgIHVzZV9tb2NrX2FueXRoaW5nOiBib29sLiBUcnVlIGlmIGEgTW9ja0FueXRoaW5nIHNob3VsZCBiZSB1c2VkIHJlZ2FyZGxlc3MKKyAgICAgICAgb2YgdGhlIHR5cGUgb2YgYXR0cmlidXRlLgorICAgICIiIgorCisgICAgYXR0cl90b19yZXBsYWNlID0gZ2V0YXR0cihvYmosIGF0dHJfbmFtZSkKKyAgICBpZiB0eXBlKGF0dHJfdG9fcmVwbGFjZSkgaW4gc2VsZi5fVVNFX01PQ0tfT0JKRUNUIGFuZCBub3QgdXNlX21vY2tfYW55dGhpbmc6CisgICAgICBzdHViID0gc2VsZi5DcmVhdGVNb2NrKGF0dHJfdG9fcmVwbGFjZSkKKyAgICBlbHNlOgorICAgICAgc3R1YiA9IHNlbGYuQ3JlYXRlTW9ja0FueXRoaW5nKCkKKworICAgIHNlbGYuc3R1YnMuU2V0KG9iaiwgYXR0cl9uYW1lLCBzdHViKQorCisgIGRlZiBVbnNldFN0dWJzKHNlbGYpOgorICAgICIiIlJlc3RvcmUgc3R1YnMgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuIiIiCisKKyAgICBzZWxmLnN0dWJzLlVuc2V0QWxsKCkKKworZGVmIFJlcGxheSgqYXJncyk6CisgICIiIlB1dCBtb2NrcyBpbnRvIFJlcGxheSBtb2RlLgorCisgIEFyZ3M6CisgICAgIyBhcmdzIGlzIGFueSBudW1iZXIgb2YgbW9ja3MgdG8gcHV0IGludG8gcmVwbGF5IG1vZGUuCisgICIiIgorCisgIGZvciBtb2NrIGluIGFyZ3M6CisgICAgbW9jay5fUmVwbGF5KCkKKworCitkZWYgVmVyaWZ5KCphcmdzKToKKyAgIiIiVmVyaWZ5IG1vY2tzLgorCisgIEFyZ3M6CisgICAgIyBhcmdzIGlzIGFueSBudW1iZXIgb2YgbW9ja3MgdG8gYmUgdmVyaWZpZWQuCisgICIiIgorCisgIGZvciBtb2NrIGluIGFyZ3M6CisgICAgbW9jay5fVmVyaWZ5KCkKKworCitkZWYgUmVzZXQoKmFyZ3MpOgorICAiIiJSZXNldCBtb2Nrcy4KKworICBBcmdzOgorICAgICMgYXJncyBpcyBhbnkgbnVtYmVyIG9mIG1vY2tzIHRvIGJlIHJlc2V0LgorICAiIiIKKworICBmb3IgbW9jayBpbiBhcmdzOgorICAgIG1vY2suX1Jlc2V0KCkKKworCitjbGFzcyBNb2NrQW55dGhpbmc6CisgICIiIkEgbW9jayB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vY2sgYW55dGhpbmcuCisKKyAgVGhpcyBpcyBoZWxwZnVsIGZvciBtb2NraW5nIGNsYXNzZXMgdGhhdCBkbyBub3QgcHJvdmlkZSBhIHB1YmxpYyBpbnRlcmZhY2UuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAiIiIgIiIiCisgICAgc2VsZi5fUmVzZXQoKQorCisgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBtZXRob2RfbmFtZSk6CisgICAgIiIiSW50ZXJjZXB0IG1ldGhvZCBjYWxscyBvbiB0aGlzIG9iamVjdC4KKworICAgICBBIG5ldyBNb2NrTWV0aG9kIGlzIHJldHVybmVkIHRoYXQgaXMgYXdhcmUgb2YgdGhlIE1vY2tBbnl0aGluZydzCisgICAgIHN0YXRlIChyZWNvcmQgb3IgcmVwbGF5KS4gIFRoZSBjYWxsIHdpbGwgYmUgcmVjb3JkZWQgb3IgcmVwbGF5ZWQKKyAgICAgYnkgdGhlIE1vY2tNZXRob2QncyBfX2NhbGxfXy4KKworICAgIEFyZ3M6CisgICAgICAjIG1ldGhvZCBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGNhbGxlZC4KKyAgICAgIG1ldGhvZF9uYW1lOiBzdHIKKworICAgIFJldHVybnM6CisgICAgICBBIG5ldyBNb2NrTWV0aG9kIGF3YXJlIG9mIE1vY2tBbnl0aGluZydzIHN0YXRlIChyZWNvcmQgb3IgcmVwbGF5KS4KKyAgICAiIiIKKworICAgIHJldHVybiBzZWxmLl9DcmVhdGVNb2NrTWV0aG9kKG1ldGhvZF9uYW1lKQorCisgIGRlZiBfQ3JlYXRlTW9ja01ldGhvZChzZWxmLCBtZXRob2RfbmFtZSk6CisgICAgIiIiQ3JlYXRlIGEgbmV3IG1vY2sgbWV0aG9kIGNhbGwgYW5kIHJldHVybiBpdC4KKworICAgIEFyZ3M6CisgICAgICAjIG1ldGhvZCBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGNhbGxlZC4KKyAgICAgIG1ldGhvZF9uYW1lOiBzdHIKKworICAgIFJldHVybnM6CisgICAgICBBIG5ldyBNb2NrTWV0aG9kIGF3YXJlIG9mIE1vY2tBbnl0aGluZydzIHN0YXRlIChyZWNvcmQgb3IgcmVwbGF5KS4KKyAgICAiIiIKKworICAgIHJldHVybiBNb2NrTWV0aG9kKG1ldGhvZF9uYW1lLCBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZXBsYXlfbW9kZSkKKworICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgIiIiUmV0dXJuIDEgZm9yIG5vbnplcm8gc28gdGhlIG1vY2sgY2FuIGJlIHVzZWQgYXMgYSBjb25kaXRpb25hbC4iIiIKKworICAgIHJldHVybiAxCisKKyAgZGVmIF9fZXFfXyhzZWxmLCByaHMpOgorICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIHRvIGNvbXBhcmUgb2JqZWN0cy4iIiIKKworICAgIHJldHVybiAoaXNpbnN0YW5jZShyaHMsIE1vY2tBbnl0aGluZykgYW5kCisgICAgICAgICAgICBzZWxmLl9yZXBsYXlfbW9kZSA9PSByaHMuX3JlcGxheV9tb2RlIGFuZAorICAgICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUgPT0gcmhzLl9leHBlY3RlZF9jYWxsc19xdWV1ZSkKKworICBkZWYgX19uZV9fKHNlbGYsIHJocyk6CisgICAgIiIiUHJvdmlkZSBjdXN0b20gbG9naWMgdG8gY29tcGFyZSBvYmplY3RzLiIiIgorCisgICAgcmV0dXJuIG5vdCBzZWxmID09IHJocworCisgIGRlZiBfUmVwbGF5KHNlbGYpOgorICAgICIiIlN0YXJ0IHJlcGxheWluZyBleHBlY3RlZCBtZXRob2QgY2FsbHMuIiIiCisKKyAgICBzZWxmLl9yZXBsYXlfbW9kZSA9IFRydWUKKworICBkZWYgX1ZlcmlmeShzZWxmKToKKyAgICAiIiJWZXJpZnkgdGhhdCBhbGwgb2YgdGhlIGV4cGVjdGVkIGNhbGxzIGhhdmUgYmVlbiBtYWRlLgorCisgICAgUmFpc2VzOgorICAgICAgRXhwZWN0ZWRNZXRob2RDYWxsc0Vycm9yOiBpZiB0aGVyZSBhcmUgc3RpbGwgbW9yZSBtZXRob2QgY2FsbHMgaW4gdGhlCisgICAgICAgIGV4cGVjdGVkIHF1ZXVlLgorICAgICIiIgorCisgICAgIyBJZiB0aGUgbGlzdCBvZiBleHBlY3RlZCBjYWxscyBpcyBub3QgZW1wdHksIHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgIGlmIHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlOgorICAgICAgIyBUaGUgbGFzdCBNdWx0aXBsZVRpbWVzR3JvdXAgaXMgbm90IHBvcHBlZCBmcm9tIHRoZSBxdWV1ZS4KKyAgICAgIGlmIChsZW4oc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUpID09IDEgYW5kCisgICAgICAgICAgaXNpbnN0YW5jZShzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZVswXSwgTXVsdGlwbGVUaW1lc0dyb3VwKSBhbmQKKyAgICAgICAgICBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZVswXS5Jc1NhdGlzZmllZCgpKToKKyAgICAgICAgcGFzcworICAgICAgZWxzZToKKyAgICAgICAgcmFpc2UgRXhwZWN0ZWRNZXRob2RDYWxsc0Vycm9yKHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlKQorCisgIGRlZiBfUmVzZXQoc2VsZik6CisgICAgIiIiUmVzZXQgdGhlIHN0YXRlIG9mIHRoaXMgbW9jayB0byByZWNvcmQgbW9kZSB3aXRoIGFuIGVtcHR5IHF1ZXVlLiIiIgorCisgICAgIyBNYWludGFpbiBhIGxpc3Qgb2YgbWV0aG9kIGNhbGxzIHdlIGFyZSBleHBlY3RpbmcKKyAgICBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSA9IGRlcXVlKCkKKworICAgICMgTWFrZSBzdXJlIHdlIGFyZSBpbiBzZXR1cCBtb2RlLCBub3QgcmVwbGF5IG1vZGUKKyAgICBzZWxmLl9yZXBsYXlfbW9kZSA9IEZhbHNlCisKKworY2xhc3MgTW9ja09iamVjdChNb2NrQW55dGhpbmcsIG9iamVjdCk6CisgICIiIkEgbW9jayBvYmplY3QgdGhhdCBzaW11bGF0ZXMgdGhlIHB1YmxpYy9wcm90ZWN0ZWQgaW50ZXJmYWNlIG9mIGEgY2xhc3MuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGNsYXNzX3RvX21vY2spOgorICAgICIiIkluaXRpYWxpemUgYSBtb2NrIG9iamVjdC4KKworICAgIFRoaXMgZGV0ZXJtaW5lcyB0aGUgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvZiB0aGUgY2xhc3MgYW5kIHN0b3JlcyB0aGVtLgorCisgICAgQXJnczoKKyAgICAgICMgY2xhc3NfdG9fbW9jazogY2xhc3MgdG8gYmUgbW9ja2VkCisgICAgICBjbGFzc190b19tb2NrOiBjbGFzcworICAgICIiIgorCisgICAgIyBUaGlzIGlzIHVzZWQgdG8gaGFjayBhcm91bmQgdGhlIG1peGluL2luaGVyaXRhbmNlIG9mIE1vY2tBbnl0aGluZywgd2hpY2gKKyAgICAjIGlzIG5vdCBhIHByb3BlciBvYmplY3QgKGl0IGNhbiBiZSBhbnl0aGluZy4gOi0pCisgICAgTW9ja0FueXRoaW5nLl9fZGljdF9fWydfX2luaXRfXyddKHNlbGYpCisKKyAgICAjIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBwdWJsaWMgYW5kIHNwZWNpYWwgbWV0aG9kcyB3ZSBzaG91bGQgbW9jay4KKyAgICBzZWxmLl9rbm93bl9tZXRob2RzID0gc2V0KCkKKyAgICBzZWxmLl9rbm93bl92YXJzID0gc2V0KCkKKyAgICBzZWxmLl9jbGFzc190b19tb2NrID0gY2xhc3NfdG9fbW9jaworICAgIGZvciBtZXRob2QgaW4gZGlyKGNsYXNzX3RvX21vY2spOgorICAgICAgaWYgY2FsbGFibGUoZ2V0YXR0cihjbGFzc190b19tb2NrLCBtZXRob2QpKToKKyAgICAgICAgc2VsZi5fa25vd25fbWV0aG9kcy5hZGQobWV0aG9kKQorICAgICAgZWxzZToKKyAgICAgICAgc2VsZi5fa25vd25fdmFycy5hZGQobWV0aG9kKQorCisgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAiIiJJbnRlcmNlcHQgYXR0cmlidXRlIHJlcXVlc3Qgb24gdGhpcyBvYmplY3QuCisKKyAgICBJZiB0aGUgYXR0cmlidXRlIGlzIGEgcHVibGljIGNsYXNzIHZhcmlhYmxlLCBpdCB3aWxsIGJlIHJldHVybmVkIGFuZCBub3QKKyAgICByZWNvcmRlZCBhcyBhIGNhbGwuCisKKyAgICBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBhIHZhcmlhYmxlLCBpdCBpcyBoYW5kbGVkIGxpa2UgYSBtZXRob2QKKyAgICBjYWxsLiBUaGUgbWV0aG9kIG5hbWUgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBzZXQgb2YgbW9ja2FibGUKKyAgICBtZXRob2RzLCBhbmQgYSBuZXcgTW9ja01ldGhvZCBpcyByZXR1cm5lZCB0aGF0IGlzIGF3YXJlIG9mIHRoZQorICAgIE1vY2tPYmplY3QncyBzdGF0ZSAocmVjb3JkIG9yIHJlcGxheSkuICBUaGUgY2FsbCB3aWxsIGJlIHJlY29yZGVkCisgICAgb3IgcmVwbGF5ZWQgYnkgdGhlIE1vY2tNZXRob2QncyBfX2NhbGxfXy4KKworICAgIEFyZ3M6CisgICAgICAjIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYmVpbmcgcmVxdWVzdGVkLgorICAgICAgbmFtZTogc3RyCisKKyAgICBSZXR1cm5zOgorICAgICAgRWl0aGVyIGEgY2xhc3MgdmFyaWFibGUgb3IgYSBuZXcgTW9ja01ldGhvZCB0aGF0IGlzIGF3YXJlIG9mIHRoZSBzdGF0ZQorICAgICAgb2YgdGhlIG1vY2sgKHJlY29yZCBvciByZXBsYXkpLgorCisgICAgUmFpc2VzOgorICAgICAgVW5rbm93bk1ldGhvZENhbGxFcnJvciBpZiB0aGUgTW9ja09iamVjdCBkb2VzIG5vdCBtb2NrIHRoZSByZXF1ZXN0ZWQKKyAgICAgICAgICBtZXRob2QuCisgICAgIiIiCisKKyAgICBpZiBuYW1lIGluIHNlbGYuX2tub3duX3ZhcnM6CisgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9jbGFzc190b19tb2NrLCBuYW1lKQorCisgICAgaWYgbmFtZSBpbiBzZWxmLl9rbm93bl9tZXRob2RzOgorICAgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZU1vY2tNZXRob2QobmFtZSkKKworICAgIHJhaXNlIFVua25vd25NZXRob2RDYWxsRXJyb3IobmFtZSkKKworICBkZWYgX19lcV9fKHNlbGYsIHJocyk6CisgICAgIiIiUHJvdmlkZSBjdXN0b20gbG9naWMgdG8gY29tcGFyZSBvYmplY3RzLiIiIgorCisgICAgcmV0dXJuIChpc2luc3RhbmNlKHJocywgTW9ja09iamVjdCkgYW5kCisgICAgICAgICAgICBzZWxmLl9jbGFzc190b19tb2NrID09IHJocy5fY2xhc3NfdG9fbW9jayBhbmQKKyAgICAgICAgICAgIHNlbGYuX3JlcGxheV9tb2RlID09IHJocy5fcmVwbGF5X21vZGUgYW5kCisgICAgICAgICAgICBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSA9PSByaHMuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlKQorCisgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAiIiJQcm92aWRlIGN1c3RvbSBsb2dpYyBmb3IgbW9ja2luZyBjbGFzc2VzIHRoYXQgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQuCisKKyAgICBBcmdzOgorICAgICAga2V5OiBLZXkgdG8gc2V0IHRoZSB2YWx1ZSBmb3IuCisgICAgICB2YWx1ZTogVmFsdWUgdG8gc2V0LgorCisgICAgUmV0dXJuczoKKyAgICAgIEV4cGVjdGVkIHJldHVybiB2YWx1ZSBpbiByZXBsYXkgbW9kZS4gIEEgTW9ja01ldGhvZCBvYmplY3QgZm9yIHRoZQorICAgICAgX19zZXRpdGVtX18gbWV0aG9kIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgaWYgbm90IGluIHJlcGxheSBtb2RlLgorCisgICAgUmFpc2VzOgorICAgICAgVHlwZUVycm9yIGlmIHRoZSB1bmRlcmx5aW5nIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50LgorICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciBpZiB0aGUgb2JqZWN0IGRvZXMgbm90IGV4cGVjdCB0aGUgY2FsbCB0bworICAgICAgICBfX3NldGl0ZW1fXy4KKworICAgICIiIgorICAgIHNldGl0ZW0gPSBzZWxmLl9jbGFzc190b19tb2NrLl9fZGljdF9fLmdldCgnX19zZXRpdGVtX18nLCBOb25lKQorCisgICAgIyBWZXJpZnkgdGhlIGNsYXNzIHN1cHBvcnRzIGl0ZW0gYXNzaWdubWVudC4KKyAgICBpZiBzZXRpdGVtIGlzIE5vbmU6CisgICAgICByYWlzZSBUeXBlRXJyb3IoJ29iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudCcpCisKKyAgICAjIElmIHdlIGFyZSBpbiByZXBsYXkgbW9kZSB0aGVuIHNpbXBseSBjYWxsIHRoZSBtb2NrIF9fc2V0aXRlbV9fIG1ldGhvZC4KKyAgICBpZiBzZWxmLl9yZXBsYXlfbW9kZToKKyAgICAgIHJldHVybiBNb2NrTWV0aG9kKCdfX3NldGl0ZW1fXycsIHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVwbGF5X21vZGUpKGtleSwgdmFsdWUpCisKKworICAgICMgT3RoZXJ3aXNlLCBjcmVhdGUgYSBtb2NrIG1ldGhvZCBfX3NldGl0ZW1fXy4KKyAgICByZXR1cm4gc2VsZi5fQ3JlYXRlTW9ja01ldGhvZCgnX19zZXRpdGVtX18nKShrZXksIHZhbHVlKQorCisgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIGZvciBtb2NraW5nIGNsYXNzZXMgdGhhdCBhcmUgc3Vic2NyaXB0YWJsZS4KKworICAgIEFyZ3M6CisgICAgICBrZXk6IEtleSB0byByZXR1cm4gdGhlIHZhbHVlIGZvci4KKworICAgIFJldHVybnM6CisgICAgICBFeHBlY3RlZCByZXR1cm4gdmFsdWUgaW4gcmVwbGF5IG1vZGUuICBBIE1vY2tNZXRob2Qgb2JqZWN0IGZvciB0aGUKKyAgICAgIF9fZ2V0aXRlbV9fIG1ldGhvZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGlmIG5vdCBpbiByZXBsYXkgbW9kZS4KKworICAgIFJhaXNlczoKKyAgICAgIFR5cGVFcnJvciBpZiB0aGUgdW5kZXJseWluZyBjbGFzcyBpcyBub3Qgc3Vic2NyaXB0YWJsZS4KKyAgICAgIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IgaWYgdGhlIG9iamVjdCBkb2VzIG5vdCBleHBlY3QgdGhlIGNhbGwgdG8KKyAgICAgICAgX19zZXRpdGVtX18uCisKKyAgICAiIiIKKyAgICBnZXRpdGVtID0gc2VsZi5fY2xhc3NfdG9fbW9jay5fX2RpY3RfXy5nZXQoJ19fZ2V0aXRlbV9fJywgTm9uZSkKKworICAgICMgVmVyaWZ5IHRoZSBjbGFzcyBzdXBwb3J0cyBpdGVtIGFzc2lnbm1lbnQuCisgICAgaWYgZ2V0aXRlbSBpcyBOb25lOgorICAgICAgcmFpc2UgVHlwZUVycm9yKCd1bnN1YnNjcmlwdGFibGUgb2JqZWN0JykKKworICAgICMgSWYgd2UgYXJlIGluIHJlcGxheSBtb2RlIHRoZW4gc2ltcGx5IGNhbGwgdGhlIG1vY2sgX19nZXRpdGVtX18gbWV0aG9kLgorICAgIGlmIHNlbGYuX3JlcGxheV9tb2RlOgorICAgICAgcmV0dXJuIE1vY2tNZXRob2QoJ19fZ2V0aXRlbV9fJywgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZXBsYXlfbW9kZSkoa2V5KQorCisKKyAgICAjIE90aGVyd2lzZSwgY3JlYXRlIGEgbW9jayBtZXRob2QgX19nZXRpdGVtX18uCisgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZU1vY2tNZXRob2QoJ19fZ2V0aXRlbV9fJykoa2V5KQorCisgIGRlZiBfX2NhbGxfXyhzZWxmLCAqcGFyYW1zLCAqKm5hbWVkX3BhcmFtcyk6CisgICAgIiIiUHJvdmlkZSBjdXN0b20gbG9naWMgZm9yIG1vY2tpbmcgY2xhc3NlcyB0aGF0IGFyZSBjYWxsYWJsZS4iIiIKKworICAgICMgVmVyaWZ5IHRoZSBjbGFzcyB3ZSBhcmUgbW9ja2luZyBpcyBjYWxsYWJsZQorICAgIGNhbGxhYmxlID0gc2VsZi5fY2xhc3NfdG9fbW9jay5fX2RpY3RfXy5nZXQoJ19fY2FsbF9fJywgTm9uZSkKKyAgICBpZiBjYWxsYWJsZSBpcyBOb25lOgorICAgICAgcmFpc2UgVHlwZUVycm9yKCdOb3QgY2FsbGFibGUnKQorCisgICAgIyBCZWNhdXNlIHRoZSBjYWxsIGlzIGhhcHBlbmluZyBkaXJlY3RseSBvbiB0aGlzIG9iamVjdCBpbnN0ZWFkIG9mIGEgbWV0aG9kLAorICAgICMgdGhlIGNhbGwgb24gdGhlIG1vY2sgbWV0aG9kIGlzIG1hZGUgcmlnaHQgaGVyZQorICAgIG1vY2tfbWV0aG9kID0gc2VsZi5fQ3JlYXRlTW9ja01ldGhvZCgnX19jYWxsX18nKQorICAgIHJldHVybiBtb2NrX21ldGhvZCgqcGFyYW1zLCAqKm5hbWVkX3BhcmFtcykKKworICBAcHJvcGVydHkKKyAgZGVmIF9fY2xhc3NfXyhzZWxmKToKKyAgICAiIiJSZXR1cm4gdGhlIGNsYXNzIHRoYXQgaXMgYmVpbmcgbW9ja2VkLiIiIgorCisgICAgcmV0dXJuIHNlbGYuX2NsYXNzX3RvX21vY2sKKworCitjbGFzcyBNb2NrTWV0aG9kKG9iamVjdCk6CisgICIiIkNhbGxhYmxlIG1vY2sgbWV0aG9kLgorCisgIEEgTW9ja01ldGhvZCBzaG91bGQgYWN0IGV4YWN0bHkgbGlrZSB0aGUgbWV0aG9kIGl0IG1vY2tzLCBhY2NlcHRpbmcgcGFyYW1ldGVycworICBhbmQgcmV0dXJuaW5nIGEgdmFsdWUsIG9yIHRocm93aW5nIGFuIGV4Y2VwdGlvbiAoYXMgc3BlY2lmaWVkKS4gIFdoZW4gdGhpcworICBtZXRob2QgaXMgY2FsbGVkLCBpdCBjYW4gb3B0aW9uYWxseSB2ZXJpZnkgd2hldGhlciB0aGUgY2FsbGVkIG1ldGhvZCAobmFtZSBhbmQKKyAgc2lnbmF0dXJlKSBtYXRjaGVzIHRoZSBleHBlY3RlZCBtZXRob2QuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2RfbmFtZSwgY2FsbF9xdWV1ZSwgcmVwbGF5X21vZGUpOgorICAgICIiIkNvbnN0cnVjdCBhIG5ldyBtb2NrIG1ldGhvZC4KKworICAgIEFyZ3M6CisgICAgICAjIG1ldGhvZF9uYW1lOiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCisgICAgICAjIGNhbGxfcXVldWU6IGRlcXVlIG9mIGNhbGxzLCB2ZXJpZnkgdGhpcyBjYWxsIGFnYWluc3QgdGhlIGhlYWQsIG9yIGFkZAorICAgICAgIyAgICAgdGhpcyBjYWxsIHRvIHRoZSBxdWV1ZS4KKyAgICAgICMgcmVwbGF5X21vZGU6IEZhbHNlIGlmIHdlIGFyZSByZWNvcmRpbmcsIFRydWUgaWYgd2UgYXJlIHZlcmlmeWluZyBjYWxscworICAgICAgIyAgICAgYWdhaW5zdCB0aGUgY2FsbCBxdWV1ZS4KKyAgICAgIG1ldGhvZF9uYW1lOiBzdHIKKyAgICAgIGNhbGxfcXVldWU6IGxpc3Qgb3IgZGVxdWUKKyAgICAgIHJlcGxheV9tb2RlOiBib29sCisgICAgIiIiCisKKyAgICBzZWxmLl9uYW1lID0gbWV0aG9kX25hbWUKKyAgICBzZWxmLl9jYWxsX3F1ZXVlID0gY2FsbF9xdWV1ZQorICAgIGlmIG5vdCBpc2luc3RhbmNlKGNhbGxfcXVldWUsIGRlcXVlKToKKyAgICAgIHNlbGYuX2NhbGxfcXVldWUgPSBkZXF1ZShzZWxmLl9jYWxsX3F1ZXVlKQorICAgIHNlbGYuX3JlcGxheV9tb2RlID0gcmVwbGF5X21vZGUKKworICAgIHNlbGYuX3BhcmFtcyA9IE5vbmUKKyAgICBzZWxmLl9uYW1lZF9wYXJhbXMgPSBOb25lCisgICAgc2VsZi5fcmV0dXJuX3ZhbHVlID0gTm9uZQorICAgIHNlbGYuX2V4Y2VwdGlvbiA9IE5vbmUKKyAgICBzZWxmLl9zaWRlX2VmZmVjdHMgPSBOb25lCisKKyAgZGVmIF9fY2FsbF9fKHNlbGYsICpwYXJhbXMsICoqbmFtZWRfcGFyYW1zKToKKyAgICAiIiJMb2cgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgcmV0dXJuIHZhbHVlLgorCisgICAgSWYgdGhlIE1vY2soQW55dGhpbmcvT2JqZWN0KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWxsIGlzIGluIHJlY29yZCBtb2RlLAorICAgIHRoaXMgTW9ja01ldGhvZCB3aWxsIGJlIHB1c2hlZCBvbnRvIHRoZSBleHBlY3RlZCBjYWxsIHF1ZXVlLiAgSWYgdGhlIG1vY2sKKyAgICBpcyBpbiByZXBsYXkgbW9kZSwgdGhpcyB3aWxsIHBvcCBhIE1vY2tNZXRob2Qgb2ZmIHRoZSB0b3Agb2YgdGhlIHF1ZXVlIGFuZAorICAgIHZlcmlmeSB0aGlzIGNhbGwgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkIGNhbGwuCisKKyAgICBSYWlzZXM6CisgICAgICBVbmV4cGVjdGVkTWV0aG9kQ2FsbCBpZiB0aGlzIGNhbGwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggYW4gZXhwZWN0ZWQgbWV0aG9kCisgICAgICAgIGNhbGwgYW5kIGl0IGRvZXMgbm90LgorICAgICIiIgorCisgICAgc2VsZi5fcGFyYW1zID0gcGFyYW1zCisgICAgc2VsZi5fbmFtZWRfcGFyYW1zID0gbmFtZWRfcGFyYW1zCisKKyAgICBpZiBub3Qgc2VsZi5fcmVwbGF5X21vZGU6CisgICAgICBzZWxmLl9jYWxsX3F1ZXVlLmFwcGVuZChzZWxmKQorICAgICAgcmV0dXJuIHNlbGYKKworICAgIGV4cGVjdGVkX21ldGhvZCA9IHNlbGYuX1ZlcmlmeU1ldGhvZENhbGwoKQorCisgICAgaWYgZXhwZWN0ZWRfbWV0aG9kLl9zaWRlX2VmZmVjdHM6CisgICAgICBleHBlY3RlZF9tZXRob2QuX3NpZGVfZWZmZWN0cygqcGFyYW1zLCAqKm5hbWVkX3BhcmFtcykKKworICAgIGlmIGV4cGVjdGVkX21ldGhvZC5fZXhjZXB0aW9uOgorICAgICAgcmFpc2UgZXhwZWN0ZWRfbWV0aG9kLl9leGNlcHRpb24KKworICAgIHJldHVybiBleHBlY3RlZF9tZXRob2QuX3JldHVybl92YWx1ZQorCisgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAiIiJSYWlzZSBhbiBBdHRyaWJ1dGVFcnJvciB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlLiIiIgorCisgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoJ01vY2tNZXRob2QgaGFzIG5vIGF0dHJpYnV0ZSAiJXMiLiAnCisgICAgICAgICdEaWQgeW91IHJlbWVtYmVyIHRvIHB1dCB5b3VyIG1vY2tzIGluIHJlcGxheSBtb2RlPycgJSBuYW1lKQorCisgIGRlZiBfUG9wTmV4dE1ldGhvZChzZWxmKToKKyAgICAiIiJQb3AgdGhlIG5leHQgbWV0aG9kIGZyb20gb3VyIGNhbGwgcXVldWUuIiIiCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHNlbGYuX2NhbGxfcXVldWUucG9wbGVmdCgpCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICByYWlzZSBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yKHNlbGYsIE5vbmUpCisKKyAgZGVmIF9WZXJpZnlNZXRob2RDYWxsKHNlbGYpOgorICAgICIiIlZlcmlmeSB0aGUgY2FsbGVkIG1ldGhvZCBpcyBleHBlY3RlZC4KKworICAgIFRoaXMgY2FuIGJlIGFuIG9yZGVyZWQgbWV0aG9kLCBvciBwYXJ0IG9mIGFuIHVub3JkZXJlZCBzZXQuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIGV4cGVjdGVkIG1vY2sgbWV0aG9kLgorCisgICAgUmFpc2VzOgorICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGwgaWYgdGhlIG1ldGhvZCBjYWxsZWQgd2FzIG5vdCBleHBlY3RlZC4KKyAgICAiIiIKKworICAgIGV4cGVjdGVkID0gc2VsZi5fUG9wTmV4dE1ldGhvZCgpCisKKyAgICAjIExvb3AgaGVyZSwgYmVjYXVzZSB3ZSBtaWdodCBoYXZlIGEgTWV0aG9kR3JvdXAgZm9sbG93ZWQgYnkgYW5vdGhlcgorICAgICMgZ3JvdXAuCisgICAgd2hpbGUgaXNpbnN0YW5jZShleHBlY3RlZCwgTWV0aG9kR3JvdXApOgorICAgICAgZXhwZWN0ZWQsIG1ldGhvZCA9IGV4cGVjdGVkLk1ldGhvZENhbGxlZChzZWxmKQorICAgICAgaWYgbWV0aG9kIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gbWV0aG9kCisKKyAgICAjIFRoaXMgaXMgYSBtb2NrIG1ldGhvZCwgc28ganVzdCBjaGVjayBlcXVhbGl0eS4KKyAgICBpZiBleHBlY3RlZCAhPSBzZWxmOgorICAgICAgcmFpc2UgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvcihzZWxmLCBleHBlY3RlZCkKKworICAgIHJldHVybiBleHBlY3RlZAorCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgIHBhcmFtcyA9ICcsICcuam9pbigKKyAgICAgICAgW3JlcHIocCkgZm9yIHAgaW4gc2VsZi5fcGFyYW1zIG9yIFtdXSArCisgICAgICAgIFsnJXM9JXInICUgeCBmb3IgeCBpbiBzb3J0ZWQoKHNlbGYuX25hbWVkX3BhcmFtcyBvciB7fSkuaXRlbXMoKSldKQorICAgIGRlc2MgPSAiJXMoJXMpIC0+ICVyIiAlIChzZWxmLl9uYW1lLCBwYXJhbXMsIHNlbGYuX3JldHVybl92YWx1ZSkKKyAgICByZXR1cm4gZGVzYworCisgIGRlZiBfX2VxX18oc2VsZiwgcmhzKToKKyAgICAiIiJUZXN0IHdoZXRoZXIgdGhpcyBNb2NrTWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYW5vdGhlciBNb2NrTWV0aG9kLgorCisgICAgQXJnczoKKyAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0CisgICAgICByaHM6IE1vY2tNZXRob2QKKyAgICAiIiIKKworICAgIHJldHVybiAoaXNpbnN0YW5jZShyaHMsIE1vY2tNZXRob2QpIGFuZAorICAgICAgICAgICAgc2VsZi5fbmFtZSA9PSByaHMuX25hbWUgYW5kCisgICAgICAgICAgICBzZWxmLl9wYXJhbXMgPT0gcmhzLl9wYXJhbXMgYW5kCisgICAgICAgICAgICBzZWxmLl9uYW1lZF9wYXJhbXMgPT0gcmhzLl9uYW1lZF9wYXJhbXMpCisKKyAgZGVmIF9fbmVfXyhzZWxmLCByaHMpOgorICAgICIiIlRlc3Qgd2hldGhlciB0aGlzIE1vY2tNZXRob2QgaXMgbm90IGVxdWl2YWxlbnQgdG8gYW5vdGhlciBNb2NrTWV0aG9kLgorCisgICAgQXJnczoKKyAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0CisgICAgICByaHM6IE1vY2tNZXRob2QKKyAgICAiIiIKKworICAgIHJldHVybiBub3Qgc2VsZiA9PSByaHMKKworICBkZWYgR2V0UG9zc2libGVHcm91cChzZWxmKToKKyAgICAiIiJSZXR1cm5zIGEgcG9zc2libGUgZ3JvdXAgZnJvbSB0aGUgZW5kIG9mIHRoZSBjYWxsIHF1ZXVlIG9yIE5vbmUgaWYgbm8KKyAgICBvdGhlciBtZXRob2RzIGFyZSBvbiB0aGUgc3RhY2suCisgICAgIiIiCisKKyAgICAjIFJlbW92ZSB0aGlzIG1ldGhvZCBmcm9tIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSBzbyB3ZSBjYW4gYWRkIGl0IHRvIGEgZ3JvdXAuCisgICAgdGhpc19tZXRob2QgPSBzZWxmLl9jYWxsX3F1ZXVlLnBvcCgpCisgICAgYXNzZXJ0IHRoaXNfbWV0aG9kID09IHNlbGYKKworICAgICMgRGV0ZXJtaW5lIGlmIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSBpcyBhIGdyb3VwLCBvciBqdXN0IGEgcmVndWxhciBvcmRlcmVkCisgICAgIyBtb2NrIG1ldGhvZC4KKyAgICBncm91cCA9IE5vbmUKKyAgICB0cnk6CisgICAgICBncm91cCA9IHNlbGYuX2NhbGxfcXVldWVbLTFdCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICBwYXNzCisKKyAgICByZXR1cm4gZ3JvdXAKKworICBkZWYgX0NoZWNrQW5kQ3JlYXRlTmV3R3JvdXAoc2VsZiwgZ3JvdXBfbmFtZSwgZ3JvdXBfY2xhc3MpOgorICAgICIiIkNoZWNrcyBpZiB0aGUgbGFzdCBtZXRob2QgKGEgcG9zc2libGUgZ3JvdXApIGlzIGFuIGluc3RhbmNlIG9mIG91cgorICAgIGdyb3VwX2NsYXNzLiBBZGRzIHRoZSBjdXJyZW50IG1ldGhvZCB0byB0aGlzIGdyb3VwIG9yIGNyZWF0ZXMgYSBuZXcgb25lLgorCisgICAgQXJnczoKKworICAgICAgZ3JvdXBfbmFtZTogdGhlIG5hbWUgb2YgdGhlIGdyb3VwLgorICAgICAgZ3JvdXBfY2xhc3M6IHRoZSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZSBvZiB0aGlzIG5ldyBncm91cAorICAgICIiIgorICAgIGdyb3VwID0gc2VsZi5HZXRQb3NzaWJsZUdyb3VwKCkKKworICAgICMgSWYgdGhpcyBpcyBhIGdyb3VwLCBhbmQgaXQgaXMgdGhlIGNvcnJlY3QgZ3JvdXAsIGFkZCB0aGUgbWV0aG9kLgorICAgIGlmIGlzaW5zdGFuY2UoZ3JvdXAsIGdyb3VwX2NsYXNzKSBhbmQgZ3JvdXAuZ3JvdXBfbmFtZSgpID09IGdyb3VwX25hbWU6CisgICAgICBncm91cC5BZGRNZXRob2Qoc2VsZikKKyAgICAgIHJldHVybiBzZWxmCisKKyAgICAjIENyZWF0ZSBhIG5ldyBncm91cCBhbmQgYWRkIHRoZSBtZXRob2QuCisgICAgbmV3X2dyb3VwID0gZ3JvdXBfY2xhc3MoZ3JvdXBfbmFtZSkKKyAgICBuZXdfZ3JvdXAuQWRkTWV0aG9kKHNlbGYpCisgICAgc2VsZi5fY2FsbF9xdWV1ZS5hcHBlbmQobmV3X2dyb3VwKQorICAgIHJldHVybiBzZWxmCisKKyAgZGVmIEluQW55T3JkZXIoc2VsZiwgZ3JvdXBfbmFtZT0iZGVmYXVsdCIpOgorICAgICIiIk1vdmUgdGhpcyBtZXRob2QgaW50byBhIGdyb3VwIG9mIHVub3JkZXJlZCBjYWxscy4KKworICAgIEEgZ3JvdXAgb2YgdW5vcmRlcmVkIGNhbGxzIG11c3QgYmUgZGVmaW5lZCB0b2dldGhlciwgYW5kIG11c3QgYmUgZXhlY3V0ZWQKKyAgICBpbiBmdWxsIGJlZm9yZSB0aGUgbmV4dCBleHBlY3RlZCBtZXRob2QgY2FuIGJlIGNhbGxlZC4gIFRoZXJlIGNhbiBiZQorICAgIG11bHRpcGxlIGdyb3VwcyB0aGF0IGFyZSBleHBlY3RlZCBzZXJpYWxseSwgaWYgdGhleSBhcmUgZ2l2ZW4KKyAgICBkaWZmZXJlbnQgZ3JvdXAgbmFtZXMuICBUaGUgc2FtZSBncm91cCBuYW1lIGNhbiBiZSByZXVzZWQgaWYgdGhlcmUgaXMgYQorICAgIHN0YW5kYXJkIG1ldGhvZCBjYWxsLCBvciBhIGdyb3VwIHdpdGggYSBkaWZmZXJlbnQgbmFtZSwgc3BsaWNlZCBiZXR3ZWVuCisgICAgdXNhZ2VzLgorCisgICAgQXJnczoKKyAgICAgIGdyb3VwX25hbWU6IHRoZSBuYW1lIG9mIHRoZSB1bm9yZGVyZWQgZ3JvdXAuCisKKyAgICBSZXR1cm5zOgorICAgICAgc2VsZgorICAgICIiIgorICAgIHJldHVybiBzZWxmLl9DaGVja0FuZENyZWF0ZU5ld0dyb3VwKGdyb3VwX25hbWUsIFVub3JkZXJlZEdyb3VwKQorCisgIGRlZiBNdWx0aXBsZVRpbWVzKHNlbGYsIGdyb3VwX25hbWU9ImRlZmF1bHQiKToKKyAgICAiIiJNb3ZlIHRoaXMgbWV0aG9kIGludG8gZ3JvdXAgb2YgY2FsbHMgd2hpY2ggbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKworICAgIEEgZ3JvdXAgb2YgcmVwZWF0aW5nIGNhbGxzIG11c3QgYmUgZGVmaW5lZCB0b2dldGhlciwgYW5kIG11c3QgYmUgZXhlY3V0ZWQgaW4KKyAgICBmdWxsIGJlZm9yZSB0aGUgbmV4dCBleHBlY3RlZCBtZWh0b2QgY2FuIGJlIGNhbGxlZC4KKworICAgIEFyZ3M6CisgICAgICBncm91cF9uYW1lOiB0aGUgbmFtZSBvZiB0aGUgdW5vcmRlcmVkIGdyb3VwLgorCisgICAgUmV0dXJuczoKKyAgICAgIHNlbGYKKyAgICAiIiIKKyAgICByZXR1cm4gc2VsZi5fQ2hlY2tBbmRDcmVhdGVOZXdHcm91cChncm91cF9uYW1lLCBNdWx0aXBsZVRpbWVzR3JvdXApCisKKyAgZGVmIEFuZFJldHVybihzZWxmLCByZXR1cm5fdmFsdWUpOgorICAgICIiIlNldCB0aGUgdmFsdWUgdG8gcmV0dXJuIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorCisgICAgQXJnczoKKyAgICAgICMgcmV0dXJuX3ZhbHVlIGNhbiBiZSBhbnl0aGluZy4KKyAgICAiIiIKKworICAgIHNlbGYuX3JldHVybl92YWx1ZSA9IHJldHVybl92YWx1ZQorICAgIHJldHVybiByZXR1cm5fdmFsdWUKKworICBkZWYgQW5kUmFpc2Uoc2VsZiwgZXhjZXB0aW9uKToKKyAgICAiIiJTZXQgdGhlIGV4Y2VwdGlvbiB0byByYWlzZSB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKworICAgIEFyZ3M6CisgICAgICAjIGV4Y2VwdGlvbjogdGhlIGV4Y2VwdGlvbiB0byByYWlzZSB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgIGV4Y2VwdGlvbjogRXhjZXB0aW9uCisgICAgIiIiCisKKyAgICBzZWxmLl9leGNlcHRpb24gPSBleGNlcHRpb24KKworICBkZWYgV2l0aFNpZGVFZmZlY3RzKHNlbGYsIHNpZGVfZWZmZWN0cyk6CisgICAgIiIiU2V0IHRoZSBzaWRlIGVmZmVjdHMgdGhhdCBhcmUgc2ltdWxhdGVkIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorCisgICAgQXJnczoKKyAgICAgIHNpZGVfZWZmZWN0czogQSBjYWxsYWJsZSB3aGljaCBtb2RpZmllcyB0aGUgcGFyYW1ldGVycyBvciBvdGhlciByZWxldmFudAorICAgICAgICBzdGF0ZSB3aGljaCBhIGdpdmVuIHRlc3QgY2FzZSBkZXBlbmRzIG9uLgorCisgICAgUmV0dXJuczoKKyAgICAgIFNlbGYgZm9yIGNoYWluaW5nIHdpdGggQW5kUmV0dXJuIGFuZCBBbmRSYWlzZS4KKyAgICAiIiIKKyAgICBzZWxmLl9zaWRlX2VmZmVjdHMgPSBzaWRlX2VmZmVjdHMKKyAgICByZXR1cm4gc2VsZgorCitjbGFzcyBDb21wYXJhdG9yOgorICAiIiJCYXNlIGNsYXNzIGZvciBhbGwgTW94IGNvbXBhcmF0b3JzLgorCisgIEEgQ29tcGFyYXRvciBjYW4gYmUgdXNlZCBhcyBhIHBhcmFtZXRlciB0byBhIG1vY2tlZCBtZXRob2Qgd2hlbiB0aGUgZXhhY3QKKyAgdmFsdWUgaXMgbm90IGtub3duLiAgRm9yIGV4YW1wbGUsIHRoZSBjb2RlIHlvdSBhcmUgdGVzdGluZyBtaWdodCBidWlsZCB1cCBhCisgIGxvbmcgU1FMIHN0cmluZyB0aGF0IGlzIHBhc3NlZCB0byB5b3VyIG1vY2sgREFPLiBZb3UncmUgb25seSBpbnRlcmVzdGVkIHRoYXQKKyAgdGhlIElOIGNsYXVzZSBjb250YWlucyB0aGUgcHJvcGVyIHByaW1hcnkga2V5cywgc28geW91IGNhbiBzZXQgeW91ciBtb2NrCisgIHVwIGFzIGZvbGxvd3M6CisKKyAgbW9ja19kYW8uUnVuUXVlcnkoU3RyQ29udGFpbnMoJ0lOICgxLCAyLCA0LCA1KScpKS5BbmRSZXR1cm4obW9ja19yZXN1bHQpCisKKyAgTm93IHdoYXRldmVyIHF1ZXJ5IGlzIHBhc3NlZCBpbiBtdXN0IGNvbnRhaW4gdGhlIHN0cmluZyAnSU4gKDEsIDIsIDQsIDUpJy4KKworICBBIENvbXBhcmF0b3IgbWF5IHJlcGxhY2Ugb25lIG9yIG1vcmUgcGFyYW1ldGVycywgZm9yIGV4YW1wbGU6CisgICMgcmV0dXJuIGF0IG1vc3QgMTAgcm93cworICBtb2NrX2Rhby5SdW5RdWVyeShTdHJDb250YWlucygnU0VMRUNUJyksIDEwKQorCisgIG9yCisKKyAgIyBSZXR1cm4gc29tZSBub24tZGV0ZXJtaW5pc3RpYyBudW1iZXIgb2Ygcm93cworICBtb2NrX2Rhby5SdW5RdWVyeShTdHJDb250YWlucygnU0VMRUNUJyksIElzQShpbnQpKQorICAiIiIKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiU3BlY2lhbCBlcXVhbHMgbWV0aG9kIHRoYXQgYWxsIGNvbXBhcmF0b3JzIG11c3QgaW1wbGVtZW50LgorCisgICAgQXJnczoKKyAgICAgIHJoczogYW55IHB5dGhvbiBvYmplY3QKKyAgICAiIiIKKworICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICdtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLicKKworICBkZWYgX19lcV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIHNlbGYuZXF1YWxzKHJocykKKworICBkZWYgX19uZV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIG5vdCBzZWxmLmVxdWFscyhyaHMpCisKKworY2xhc3MgSXNBKENvbXBhcmF0b3IpOgorICAiIiJUaGlzIGNsYXNzIHdyYXBzIGEgYmFzaWMgUHl0aG9uIHR5cGUgb3IgY2xhc3MuICBJdCBpcyB1c2VkIHRvIHZlcmlmeQorICB0aGF0IGEgcGFyYW1ldGVyIGlzIG9mIHRoZSBnaXZlbiB0eXBlIG9yIGNsYXNzLgorCisgIEV4YW1wbGU6CisgIG1vY2tfZGFvLkNvbm5lY3QoSXNBKERiQ29ubmVjdEluZm8pKQorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgY2xhc3NfbmFtZSk6CisgICAgIiIiSW5pdGlhbGl6ZSBJc0EKKworICAgIEFyZ3M6CisgICAgICBjbGFzc19uYW1lOiBiYXNpYyBweXRob24gdHlwZSBvciBhIGNsYXNzCisgICAgIiIiCisKKyAgICBzZWxmLl9jbGFzc19uYW1lID0gY2xhc3NfbmFtZQorCisgIGRlZiBlcXVhbHMoc2VsZiwgcmhzKToKKyAgICAiIiJDaGVjayB0byBzZWUgaWYgdGhlIFJIUyBpcyBhbiBpbnN0YW5jZSBvZiBjbGFzc19uYW1lLgorCisgICAgQXJnczoKKyAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0CisgICAgICByaHM6IG9iamVjdAorCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgIHJldHVybiBpc2luc3RhbmNlKHJocywgc2VsZi5fY2xhc3NfbmFtZSkKKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgIyBDaGVjayByYXcgdHlwZXMgaWYgdGhlcmUgd2FzIGEgdHlwZSBlcnJvci4gIFRoaXMgaXMgaGVscGZ1bCBmb3IKKyAgICAgICMgdGhpbmdzIGxpa2UgY1N0cmluZ0lPLlN0cmluZ0lPLgorICAgICAgcmV0dXJuIHR5cGUocmhzKSA9PSB0eXBlKHNlbGYuX2NsYXNzX25hbWUpCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiBzdHIoc2VsZi5fY2xhc3NfbmFtZSkKKworY2xhc3MgSXNBbG1vc3QoQ29tcGFyYXRvcik6CisgICIiIkNvbXBhcmlzb24gY2xhc3MgdXNlZCB0byBjaGVjayB3aGV0aGVyIGEgcGFyYW1ldGVyIGlzIG5lYXJseSBlcXVhbAorICB0byBhIGdpdmVuIHZhbHVlLiAgR2VuZXJhbGx5IHVzZWZ1bCBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KKworICBFeGFtcGxlIG1vY2tfZGFvLlNldFRpbWVvdXQoKElzQWxtb3N0KDMuOSkpKQorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZmxvYXRfdmFsdWUsIHBsYWNlcz03KToKKyAgICAiIiJJbml0aWFsaXplIElzQWxtb3N0LgorCisgICAgQXJnczoKKyAgICAgIGZsb2F0X3ZhbHVlOiBUaGUgdmFsdWUgZm9yIG1ha2luZyB0aGUgY29tcGFyaXNvbi4KKyAgICAgIHBsYWNlczogVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0by4KKyAgICAiIiIKKworICAgIHNlbGYuX2Zsb2F0X3ZhbHVlID0gZmxvYXRfdmFsdWUKKyAgICBzZWxmLl9wbGFjZXMgPSBwbGFjZXMKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiQ2hlY2sgdG8gc2VlIGlmIFJIUyBpcyBhbG1vc3QgZXF1YWwgdG8gZmxvYXRfdmFsdWUKKworICAgIEFyZ3M6CisgICAgICByaHM6IHRoZSB2YWx1ZSB0byBjb21wYXJlIHRvIGZsb2F0X3ZhbHVlCisKKyAgICBSZXR1cm5zOgorICAgICAgYm9vbAorICAgICIiIgorCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHJvdW5kKHJocy1zZWxmLl9mbG9hdF92YWx1ZSwgc2VsZi5fcGxhY2VzKSA9PSAwCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICMgVGhpcyBpcyBwcm9iYWJseSBiZWNhdXNlIGVpdGhlciBmbG9hdF92YWx1ZSBvciByaHMgaXMgbm90IGEgbnVtYmVyLgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIHJldHVybiBzdHIoc2VsZi5fZmxvYXRfdmFsdWUpCisKK2NsYXNzIFN0ckNvbnRhaW5zKENvbXBhcmF0b3IpOgorICAiIiJDb21wYXJpc29uIGNsYXNzIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhIHN1YnN0cmluZyBleGlzdHMgaW4gYQorICBzdHJpbmcgcGFyYW1ldGVyLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGluIG1vY2tpbmcgYSBkYXRhYmFzZSB3aXRoIFNRTAorICBwYXNzZWQgaW4gYXMgYSBzdHJpbmcgcGFyYW1ldGVyLCBmb3IgZXhhbXBsZS4KKworICBFeGFtcGxlOgorICBtb2NrX2Rhby5SdW5RdWVyeShTdHJDb250YWlucygnSU4gKDEsIDIsIDQsIDUpJykpLkFuZFJldHVybihtb2NrX3Jlc3VsdCkKKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHNlYXJjaF9zdHJpbmcpOgorICAgICIiIkluaXRpYWxpemUuCisKKyAgICBBcmdzOgorICAgICAgIyBzZWFyY2hfc3RyaW5nOiB0aGUgc3RyaW5nIHlvdSBhcmUgc2VhcmNoaW5nIGZvcgorICAgICAgc2VhcmNoX3N0cmluZzogc3RyCisgICAgIiIiCisKKyAgICBzZWxmLl9zZWFyY2hfc3RyaW5nID0gc2VhcmNoX3N0cmluZworCisgIGRlZiBlcXVhbHMoc2VsZiwgcmhzKToKKyAgICAiIiJDaGVjayB0byBzZWUgaWYgdGhlIHNlYXJjaF9zdHJpbmcgaXMgY29udGFpbmVkIGluIHRoZSByaHMgc3RyaW5nLgorCisgICAgQXJnczoKKyAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0CisgICAgICByaHM6IG9iamVjdAorCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgIHJldHVybiByaHMuZmluZChzZWxmLl9zZWFyY2hfc3RyaW5nKSA+IC0xCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgIHJldHVybiBGYWxzZQorCisgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICByZXR1cm4gJzxzdHIgY29udGFpbmluZyBcJyVzXCc+JyAlIHNlbGYuX3NlYXJjaF9zdHJpbmcKKworCitjbGFzcyBSZWdleChDb21wYXJhdG9yKToKKyAgIiIiQ2hlY2tzIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24uCisKKyAgVGhpcyB1c2VzIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHRvIGRldGVybWluZSBlcXVhbGl0eS4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdHRlcm4sIGZsYWdzPTApOgorICAgICIiIkluaXRpYWxpemUuCisKKyAgICBBcmdzOgorICAgICAgIyBwYXR0ZXJuIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvcgorICAgICAgcGF0dGVybjogc3RyCisgICAgICAjIGZsYWdzIHBhc3NlZCB0byByZS5jb21waWxlIGZ1bmN0aW9uIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQKKyAgICAgIGZsYWdzOiBpbnQKKyAgICAiIiIKKworICAgIHNlbGYucmVnZXggPSByZS5jb21waWxlKHBhdHRlcm4sIGZsYWdzPWZsYWdzKQorCisgIGRlZiBlcXVhbHMoc2VsZiwgcmhzKToKKyAgICAiIiJDaGVjayB0byBzZWUgaWYgcmhzIG1hdGNoZXMgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisKKyAgICBSZXR1cm5zOgorICAgICAgYm9vbAorICAgICIiIgorCisgICAgcmV0dXJuIHNlbGYucmVnZXguc2VhcmNoKHJocykgaXMgbm90IE5vbmUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcyA9ICc8cmVndWxhciBleHByZXNzaW9uIFwnJXNcJycgJSBzZWxmLnJlZ2V4LnBhdHRlcm4KKyAgICBpZiBzZWxmLnJlZ2V4LmZsYWdzOgorICAgICAgcyArPSAnLCBmbGFncz0lZCcgJSBzZWxmLnJlZ2V4LmZsYWdzCisgICAgcyArPSAnPicKKyAgICByZXR1cm4gcworCisKK2NsYXNzIEluKENvbXBhcmF0b3IpOgorICAiIiJDaGVja3Mgd2hldGhlciBhbiBpdGVtIChvciBrZXkpIGlzIGluIGEgbGlzdCAob3IgZGljdCkgcGFyYW1ldGVyLgorCisgIEV4YW1wbGU6CisgIG1vY2tfZGFvLkdldFVzZXJzSW5mbyhJbignZXhwZWN0ZWRVc2VyTmFtZScpKS5BbmRSZXR1cm4obW9ja19yZXN1bHQpCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXkpOgorICAgICIiIkluaXRpYWxpemUuCisKKyAgICBBcmdzOgorICAgICAgIyBrZXkgaXMgYW55IHRoaW5nIHRoYXQgY291bGQgYmUgaW4gYSBsaXN0IG9yIGEga2V5IGluIGEgZGljdAorICAgICIiIgorCisgICAgc2VsZi5fa2V5ID0ga2V5CisKKyAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgorICAgICIiIkNoZWNrIHRvIHNlZSB3aGV0aGVyIGtleSBpcyBpbiByaHMuCisKKyAgICBBcmdzOgorICAgICAgcmhzOiBkaWN0CisKKyAgICBSZXR1cm5zOgorICAgICAgYm9vbAorICAgICIiIgorCisgICAgcmV0dXJuIHNlbGYuX2tleSBpbiByaHMKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8c2VxdWVuY2Ugb3IgbWFwIGNvbnRhaW5pbmcgXCclc1wnPicgJSBzZWxmLl9rZXkKKworCitjbGFzcyBDb250YWluc0tleVZhbHVlKENvbXBhcmF0b3IpOgorICAiIiJDaGVja3Mgd2hldGhlciBhIGtleS92YWx1ZSBwYWlyIGlzIGluIGEgZGljdCBwYXJhbWV0ZXIuCisKKyAgRXhhbXBsZToKKyAgbW9ja19kYW8uVXBkYXRlVXNlcnMoQ29udGFpbnNLZXlWYWx1ZSgnc3RldmVwbScsIHN0ZXZlcG1fdXNlcl9pbmZvKSkKKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICIiIkluaXRpYWxpemUuCisKKyAgICBBcmdzOgorICAgICAgIyBrZXk6IGEga2V5IGluIGEgZGljdAorICAgICAgIyB2YWx1ZTogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUKKyAgICAiIiIKKworICAgIHNlbGYuX2tleSA9IGtleQorICAgIHNlbGYuX3ZhbHVlID0gdmFsdWUKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4ga2V5L3ZhbHVlIHBhaXIgaXMgaW4gdGhlIHJocyBkaWN0LgorCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgIHJldHVybiByaHNbc2VsZi5fa2V5XSA9PSBzZWxmLl92YWx1ZQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICByZXR1cm4gRmFsc2UKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8bWFwIGNvbnRhaW5pbmcgdGhlIGVudHJ5IFwnJXM6ICVzXCc+JyAlIChzZWxmLl9rZXksIHNlbGYuX3ZhbHVlKQorCisKK2NsYXNzIFNhbWVFbGVtZW50c0FzKENvbXBhcmF0b3IpOgorICAiIiJDaGVja3Mgd2hldGhlciBpdGVyYWJsZXMgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cyAoaWdub3Jpbmcgb3JkZXIpLgorCisgIEV4YW1wbGU6CisgIG1vY2tfZGFvLlByb2Nlc3NVc2VycyhTYW1lRWxlbWVudHNBcygnc3RldmVwbScsICdzYWxvbWFraScpKQorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWRfc2VxKToKKyAgICAiIiJJbml0aWFsaXplLgorCisgICAgQXJnczoKKyAgICAgIGV4cGVjdGVkX3NlcTogYSBzZXF1ZW5jZQorICAgICIiIgorCisgICAgc2VsZi5fZXhwZWN0ZWRfc2VxID0gZXhwZWN0ZWRfc2VxCisKKyAgZGVmIGVxdWFscyhzZWxmLCBhY3R1YWxfc2VxKToKKyAgICAiIiJDaGVjayB0byBzZWUgd2hldGhlciBhY3R1YWxfc2VxIGhhcyBzYW1lIGVsZW1lbnRzIGFzIGV4cGVjdGVkX3NlcS4KKworICAgIEFyZ3M6CisgICAgICBhY3R1YWxfc2VxOiBzZXF1ZW5jZQorCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgIGV4cGVjdGVkID0gZGljdChbKGVsZW1lbnQsIE5vbmUpIGZvciBlbGVtZW50IGluIHNlbGYuX2V4cGVjdGVkX3NlcV0pCisgICAgICBhY3R1YWwgPSBkaWN0KFsoZWxlbWVudCwgTm9uZSkgZm9yIGVsZW1lbnQgaW4gYWN0dWFsX3NlcV0pCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICMgRmFsbCBiYWNrIHRvIHNsb3dlciBsaXN0LWNvbXBhcmUgaWYgYW55IG9mIHRoZSBvYmplY3RzIGFyZSB1bmhhc2hhYmxlLgorICAgICAgZXhwZWN0ZWQgPSBsaXN0KHNlbGYuX2V4cGVjdGVkX3NlcSkKKyAgICAgIGFjdHVhbCA9IGxpc3QoYWN0dWFsX3NlcSkKKyAgICAgIGV4cGVjdGVkLnNvcnQoKQorICAgICAgYWN0dWFsLnNvcnQoKQorICAgIHJldHVybiBleHBlY3RlZCA9PSBhY3R1YWwKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8c2VxdWVuY2Ugd2l0aCBzYW1lIGVsZW1lbnRzIGFzIFwnJXNcJz4nICUgc2VsZi5fZXhwZWN0ZWRfc2VxCisKKworY2xhc3MgQW5kKENvbXBhcmF0b3IpOgorICAiIiJFdmFsdWF0ZXMgb25lIG9yIG1vcmUgQ29tcGFyYXRvcnMgb24gUkhTIGFuZCByZXR1cm5zIGFuIEFORCBvZiB0aGUgcmVzdWx0cy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAiIiJJbml0aWFsaXplLgorCisgICAgQXJnczoKKyAgICAgICphcmdzOiBPbmUgb3IgbW9yZSBDb21wYXJhdG9yCisgICAgIiIiCisKKyAgICBzZWxmLl9jb21wYXJhdG9ycyA9IGFyZ3MKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiQ2hlY2tzIHdoZXRoZXIgYWxsIENvbXBhcmF0b3JzIGFyZSBlcXVhbCB0byByaHMuCisKKyAgICBBcmdzOgorICAgICAgIyByaHM6IGNhbiBiZSBhbnl0aGluZworCisgICAgUmV0dXJuczoKKyAgICAgIGJvb2wKKyAgICAiIiIKKworICAgIGZvciBjb21wYXJhdG9yIGluIHNlbGYuX2NvbXBhcmF0b3JzOgorICAgICAgaWYgbm90IGNvbXBhcmF0b3IuZXF1YWxzKHJocyk6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgcmV0dXJuIFRydWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8QU5EICVzPicgJSBzdHIoc2VsZi5fY29tcGFyYXRvcnMpCisKKworY2xhc3MgT3IoQ29tcGFyYXRvcik6CisgICIiIkV2YWx1YXRlcyBvbmUgb3IgbW9yZSBDb21wYXJhdG9ycyBvbiBSSFMgYW5kIHJldHVybnMgYW4gT1Igb2YgdGhlIHJlc3VsdHMuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgIiIiSW5pdGlhbGl6ZS4KKworICAgIEFyZ3M6CisgICAgICAqYXJnczogT25lIG9yIG1vcmUgTW94IGNvbXBhcmF0b3JzCisgICAgIiIiCisKKyAgICBzZWxmLl9jb21wYXJhdG9ycyA9IGFyZ3MKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiQ2hlY2tzIHdoZXRoZXIgYW55IENvbXBhcmF0b3IgaXMgZXF1YWwgdG8gcmhzLgorCisgICAgQXJnczoKKyAgICAgICMgcmhzOiBjYW4gYmUgYW55dGhpbmcKKworICAgIFJldHVybnM6CisgICAgICBib29sCisgICAgIiIiCisKKyAgICBmb3IgY29tcGFyYXRvciBpbiBzZWxmLl9jb21wYXJhdG9yczoKKyAgICAgIGlmIGNvbXBhcmF0b3IuZXF1YWxzKHJocyk6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICByZXR1cm4gRmFsc2UKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8T1IgJXM+JyAlIHN0cihzZWxmLl9jb21wYXJhdG9ycykKKworCitjbGFzcyBGdW5jKENvbXBhcmF0b3IpOgorICAiIiJDYWxsIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgdmVyaWZ5IHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIGNvcnJlY3QuCisKKyAgWW91IG1heSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcmZvcm0gbW9yZSBhZHZhbmNlZCBvcGVyYXRpb25zIG9uIHRoZSBwYXJhbWV0ZXIKKyAgaW4gb3JkZXIgdG8gdmFsaWRhdGUgaXQuICBZb3UgY2FuIHVzZSB0aGlzIHRvIGhhdmUgYSBjYWxsYWJsZSB2YWxpZGF0ZSBhbnkKKyAgcGFyYW1ldGVyLiBUaGUgY2FsbGFibGUgc2hvdWxkIHJldHVybiBlaXRoZXIgVHJ1ZSBvciBGYWxzZS4KKworCisgIEV4YW1wbGU6CisKKyAgZGVmIG15UGFyYW1WYWxpZGF0b3IocGFyYW0pOgorICAgICMgQWR2YW5jZWQgbG9naWMgaGVyZQorICAgIHJldHVybiBUcnVlCisKKyAgbW9ja19kYW8uRG9Tb21ldGhpbmcoRnVuYyhteVBhcmFtVmFsaWRhdG9yKSwgdHJ1ZSkKKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMpOgorICAgICIiIkluaXRpYWxpemUuCisKKyAgICBBcmdzOgorICAgICAgZnVuYzogY2FsbGFibGUgdGhhdCB0YWtlcyBvbmUgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgYm9vbAorICAgICIiIgorCisgICAgc2VsZi5fZnVuYyA9IGZ1bmMKKworICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6CisgICAgIiIiVGVzdCB3aGV0aGVyIHJocyBwYXNzZXMgdGhlIGZ1bmN0aW9uIHRlc3QuCisKKyAgICByaHMgaXMgcGFzc2VkIGludG8gZnVuYy4KKworICAgIEFyZ3M6CisgICAgICByaHM6IGFueSBweXRob24gb2JqZWN0CisKKyAgICBSZXR1cm5zOgorICAgICAgdGhlIHJlc3VsdCBvZiBmdW5jKHJocykKKyAgICAiIiIKKworICAgIHJldHVybiBzZWxmLl9mdW5jKHJocykKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuIHN0cihzZWxmLl9mdW5jKQorCisKK2NsYXNzIElnbm9yZUFyZyhDb21wYXJhdG9yKToKKyAgIiIiSWdub3JlIGFuIGFyZ3VtZW50LgorCisgIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiB3ZSBkb24ndCBjYXJlIGFib3V0IGFuIGFyZ3VtZW50IG9mIGEgbWV0aG9kIGNhbGwuCisKKyAgRXhhbXBsZToKKyAgIyBDaGVjayBpZiBDYXN0TWFnaWMgaXMgY2FsbGVkIHdpdGggMyBhcyBmaXJzdCBhcmcgYW5kICdkaXNhcHBlYXInIGFzIHRoaXJkLgorICBteW1vY2suQ2FzdE1hZ2ljKDMsIElnbm9yZUFyZygpLCAnZGlzYXBwZWFyJykKKyAgIiIiCisKKyAgZGVmIGVxdWFscyhzZWxmLCB1bnVzZWRfcmhzKToKKyAgICAiIiJJZ25vcmVzIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBUcnVlLgorCisgICAgQXJnczoKKyAgICAgIHVudXNlZF9yaHM6IGFueSBweXRob24gb2JqZWN0CisKKyAgICBSZXR1cm5zOgorICAgICAgYWx3YXlzIHJldHVybnMgVHJ1ZQorICAgICIiIgorCisgICAgcmV0dXJuIFRydWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgcmV0dXJuICc8SWdub3JlQXJnPicKKworCitjbGFzcyBNZXRob2RHcm91cChvYmplY3QpOgorICAiIiJCYXNlIGNsYXNzIGNvbnRhaW5pbmcgY29tbW9uIGJlaGF2aW91ciBmb3IgTWV0aG9kR3JvdXBzLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBncm91cF9uYW1lKToKKyAgICBzZWxmLl9ncm91cF9uYW1lID0gZ3JvdXBfbmFtZQorCisgIGRlZiBncm91cF9uYW1lKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9ncm91cF9uYW1lCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgcmV0dXJuICc8JXMgIiVzIj4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLl9ncm91cF9uYW1lKQorCisgIGRlZiBBZGRNZXRob2Qoc2VsZiwgbW9ja19tZXRob2QpOgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICBkZWYgTWV0aG9kQ2FsbGVkKHNlbGYsIG1vY2tfbWV0aG9kKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgZGVmIElzU2F0aXNmaWVkKHNlbGYpOgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworY2xhc3MgVW5vcmRlcmVkR3JvdXAoTWV0aG9kR3JvdXApOgorICAiIiJVbm9yZGVyZWRHcm91cCBob2xkcyBhIHNldCBvZiBtZXRob2QgY2FsbHMgdGhhdCBtYXkgb2NjdXIgaW4gYW55IG9yZGVyLgorCisgIFRoaXMgY29uc3RydWN0IGlzIGhlbHBmdWwgZm9yIG5vbi1kZXRlcm1pbmlzdGljIGV2ZW50cywgc3VjaCBhcyBpdGVyYXRpbmcKKyAgb3ZlciB0aGUga2V5cyBvZiBhIGRpY3QuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBncm91cF9uYW1lKToKKyAgICBzdXBlcihVbm9yZGVyZWRHcm91cCwgc2VsZikuX19pbml0X18oZ3JvdXBfbmFtZSkKKyAgICBzZWxmLl9tZXRob2RzID0gW10KKworICBkZWYgQWRkTWV0aG9kKHNlbGYsIG1vY2tfbWV0aG9kKToKKyAgICAiIiJBZGQgYSBtZXRob2QgdG8gdGhpcyBncm91cC4KKworICAgIEFyZ3M6CisgICAgICBtb2NrX21ldGhvZDogQSBtb2NrIG1ldGhvZCB0byBiZSBhZGRlZCB0byB0aGlzIGdyb3VwLgorICAgICIiIgorCisgICAgc2VsZi5fbWV0aG9kcy5hcHBlbmQobW9ja19tZXRob2QpCisKKyAgZGVmIE1ldGhvZENhbGxlZChzZWxmLCBtb2NrX21ldGhvZCk6CisgICAgIiIiUmVtb3ZlIGEgbWV0aG9kIGNhbGwgZnJvbSB0aGUgZ3JvdXAuCisKKyAgICBJZiB0aGUgbWV0aG9kIGlzIG5vdCBpbiB0aGUgc2V0LCBhbiBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yIHdpbGwgYmUKKyAgICByYWlzZWQuCisKKyAgICBBcmdzOgorICAgICAgbW9ja19tZXRob2Q6IGEgbW9jayBtZXRob2QgdGhhdCBzaG91bGQgYmUgZXF1YWwgdG8gYSBtZXRob2QgaW4gdGhlIGdyb3VwLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBtb2NrIG1ldGhvZCBmcm9tIHRoZSBncm91cAorCisgICAgUmFpc2VzOgorICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciBpZiB0aGUgbW9ja19tZXRob2Qgd2FzIG5vdCBpbiB0aGUgZ3JvdXAuCisgICAgIiIiCisKKyAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBleGlzdHMsIGFuZCBpZiBzbywgcmVtb3ZlIGl0IGZyb20gdGhlIHNldAorICAgICMgYW5kIHJldHVybiBpdC4KKyAgICBmb3IgbWV0aG9kIGluIHNlbGYuX21ldGhvZHM6CisgICAgICBpZiBtZXRob2QgPT0gbW9ja19tZXRob2Q6CisgICAgICAgICMgUmVtb3ZlIHRoZSBjYWxsZWQgbW9ja19tZXRob2QgaW5zdGVhZCBvZiB0aGUgbWV0aG9kIGluIHRoZSBncm91cC4KKyAgICAgICAgIyBUaGUgY2FsbGVkIG1ldGhvZCB3aWxsIG1hdGNoIGFueSBjb21wYXJhdG9ycyB3aGVuIGVxdWFsaXR5IGlzIGNoZWNrZWQKKyAgICAgICAgIyBkdXJpbmcgcmVtb3ZhbC4gIFRoZSBtZXRob2QgaW4gdGhlIGdyb3VwIGNvdWxkIHBhc3MgYSBjb21wYXJhdG9yIHRvCisgICAgICAgICMgYW5vdGhlciBjb21wYXJhdG9yIGR1cmluZyB0aGUgZXF1YWxpdHkgY2hlY2suCisgICAgICAgIHNlbGYuX21ldGhvZHMucmVtb3ZlKG1vY2tfbWV0aG9kKQorCisgICAgICAgICMgSWYgdGhpcyBncm91cCBpcyBub3QgZW1wdHksIHB1dCBpdCBiYWNrIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KKyAgICAgICAgaWYgbm90IHNlbGYuSXNTYXRpc2ZpZWQoKToKKyAgICAgICAgICBtb2NrX21ldGhvZC5fY2FsbF9xdWV1ZS5hcHBlbmRsZWZ0KHNlbGYpCisKKyAgICAgICAgcmV0dXJuIHNlbGYsIG1ldGhvZAorCisgICAgcmFpc2UgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvcihtb2NrX21ldGhvZCwgc2VsZikKKworICBkZWYgSXNTYXRpc2ZpZWQoc2VsZik6CisgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlcmUgYXJlIG5vdCBhbnkgbWV0aG9kcyBpbiB0aGlzIGdyb3VwLiIiIgorCisgICAgcmV0dXJuIGxlbihzZWxmLl9tZXRob2RzKSA9PSAwCisKKworY2xhc3MgTXVsdGlwbGVUaW1lc0dyb3VwKE1ldGhvZEdyb3VwKToKKyAgIiIiTXVsdGlwbGVUaW1lc0dyb3VwIGhvbGRzIG1ldGhvZHMgdGhhdCBtYXkgYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMuCisKKyAgTm90ZTogRWFjaCBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4KKworICBUaGlzIGlzIGhlbHBmdWwsIGlmIHlvdSBkb24ndCBrbm93IG9yIGNhcmUgaG93IG1hbnkgdGltZXMgYSBtZXRob2QgaXMgY2FsbGVkLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZ3JvdXBfbmFtZSk6CisgICAgc3VwZXIoTXVsdGlwbGVUaW1lc0dyb3VwLCBzZWxmKS5fX2luaXRfXyhncm91cF9uYW1lKQorICAgIHNlbGYuX21ldGhvZHMgPSBzZXQoKQorICAgIHNlbGYuX21ldGhvZHNfY2FsbGVkID0gc2V0KCkKKworICBkZWYgQWRkTWV0aG9kKHNlbGYsIG1vY2tfbWV0aG9kKToKKyAgICAiIiJBZGQgYSBtZXRob2QgdG8gdGhpcyBncm91cC4KKworICAgIEFyZ3M6CisgICAgICBtb2NrX21ldGhvZDogQSBtb2NrIG1ldGhvZCB0byBiZSBhZGRlZCB0byB0aGlzIGdyb3VwLgorICAgICIiIgorCisgICAgc2VsZi5fbWV0aG9kcy5hZGQobW9ja19tZXRob2QpCisKKyAgZGVmIE1ldGhvZENhbGxlZChzZWxmLCBtb2NrX21ldGhvZCk6CisgICAgIiIiUmVtb3ZlIGEgbWV0aG9kIGNhbGwgZnJvbSB0aGUgZ3JvdXAuCisKKyAgICBJZiB0aGUgbWV0aG9kIGlzIG5vdCBpbiB0aGUgc2V0LCBhbiBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yIHdpbGwgYmUKKyAgICByYWlzZWQuCisKKyAgICBBcmdzOgorICAgICAgbW9ja19tZXRob2Q6IGEgbW9jayBtZXRob2QgdGhhdCBzaG91bGQgYmUgZXF1YWwgdG8gYSBtZXRob2QgaW4gdGhlIGdyb3VwLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBtb2NrIG1ldGhvZCBmcm9tIHRoZSBncm91cAorCisgICAgUmFpc2VzOgorICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciBpZiB0aGUgbW9ja19tZXRob2Qgd2FzIG5vdCBpbiB0aGUgZ3JvdXAuCisgICAgIiIiCisKKyAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBleGlzdHMsIGFuZCBpZiBzbyBhZGQgaXQgdG8gdGhlIHNldCBvZgorICAgICMgY2FsbGVkIG1ldGhvZHMuCisKKyAgICBmb3IgbWV0aG9kIGluIHNlbGYuX21ldGhvZHM6CisgICAgICBpZiBtZXRob2QgPT0gbW9ja19tZXRob2Q6CisgICAgICAgIHNlbGYuX21ldGhvZHNfY2FsbGVkLmFkZChtb2NrX21ldGhvZCkKKyAgICAgICAgIyBBbHdheXMgcHV0IHRoaXMgZ3JvdXAgYmFjayBvbiB0b3Agb2YgdGhlIHF1ZXVlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cKKyAgICAgICAgIyB3aGVuIHdlIGFyZSBkb25lLgorICAgICAgICBtb2NrX21ldGhvZC5fY2FsbF9xdWV1ZS5hcHBlbmRsZWZ0KHNlbGYpCisgICAgICAgIHJldHVybiBzZWxmLCBtZXRob2QKKworICAgIGlmIHNlbGYuSXNTYXRpc2ZpZWQoKToKKyAgICAgIG5leHRfbWV0aG9kID0gbW9ja19tZXRob2QuX1BvcE5leHRNZXRob2QoKTsKKyAgICAgIHJldHVybiBuZXh0X21ldGhvZCwgTm9uZQorICAgIGVsc2U6CisgICAgICByYWlzZSBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yKG1vY2tfbWV0aG9kLCBzZWxmKQorCisgIGRlZiBJc1NhdGlzZmllZChzZWxmKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBhbGwgbWV0aG9kcyBpbiB0aGlzIGdyb3VwIGFyZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4iIiIKKyAgICAjIE5PVEUocHN5Y2hvKTogV2UgY2FuJ3QgdXNlIHRoZSBzaW1wbGUgc2V0IGRpZmZlcmVuY2UgaGVyZSBiZWNhdXNlIHdlIHdhbnQKKyAgICAjIHRvIG1hdGNoIGRpZmZlcmVudCBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIGUuZy4gSXNBKHN0cikKKyAgICAjIGFuZCBzb21lIHN0cmluZy4gVGhpcyBzb2x1dGlvbiBpcyBPKG5eMikgYnV0IG4gc2hvdWxkIGJlIHNtYWxsLgorICAgIHRtcCA9IHNlbGYuX21ldGhvZHMuY29weSgpCisgICAgZm9yIGNhbGxlZCBpbiBzZWxmLl9tZXRob2RzX2NhbGxlZDoKKyAgICAgIGZvciBleHBlY3RlZCBpbiB0bXA6CisgICAgICAgIGlmIGNhbGxlZCA9PSBleHBlY3RlZDoKKyAgICAgICAgICB0bXAucmVtb3ZlKGV4cGVjdGVkKQorICAgICAgICAgIGlmIG5vdCB0bXA6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgIGJyZWFrCisgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgTW94TWV0YVRlc3RCYXNlKHR5cGUpOgorICAiIiJNZXRhY2xhc3MgdG8gYWRkIG1veCBjbGVhbnVwIGFuZCB2ZXJpZmljYXRpb24gdG8gZXZlcnkgdGVzdC4KKworICBBcyB0aGUgbW94IHVuaXQgdGVzdGluZyBjbGFzcyBpcyBiZWluZyBjb25zdHJ1Y3RlZCAoTW94VGVzdEJhc2Ugb3IgYQorICBzdWJjbGFzcyksIHRoaXMgbWV0YWNsYXNzIHdpbGwgbW9kaWZ5IGFsbCB0ZXN0IGZ1bmN0aW9ucyB0byBjYWxsIHRoZQorICBDbGVhblVwTW94IG1ldGhvZCBvZiB0aGUgdGVzdCBjbGFzcyBhZnRlciB0aGV5IGZpbmlzaC4gVGhpcyBtZWFucyB0aGF0CisgIHVuc3R1YmJpbmcgYW5kIHZlcmlmeWluZyB3aWxsIGhhcHBlbiBmb3IgZXZlcnkgdGVzdCB3aXRoIG5vIGFkZGl0aW9uYWwgY29kZSwKKyAgYW5kIGFueSBmYWlsdXJlcyB3aWxsIHJlc3VsdCBpbiB0ZXN0IGZhaWx1cmVzIGFzIG9wcG9zZWQgdG8gZXJyb3JzLgorICAiIiIKKworICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZCk6CisgICAgdHlwZS5fX2luaXRfXyhjbHMsIG5hbWUsIGJhc2VzLCBkKQorCisgICAgIyBhbHNvIGdldCBhbGwgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgYmFzZSBjbGFzc2VzIHRvIGFjY291bnQKKyAgICAjIGZvciBhIGNhc2Ugd2hlbiB0ZXN0IGNsYXNzIGlzIG5vdCB0aGUgaW1tZWRpYXRlIGNoaWxkIG9mIE1veFRlc3RCYXNlCisgICAgZm9yIGJhc2UgaW4gYmFzZXM6CisgICAgICBmb3IgYXR0cl9uYW1lIGluIGRpcihiYXNlKToKKyAgICAgICAgZFthdHRyX25hbWVdID0gZ2V0YXR0cihiYXNlLCBhdHRyX25hbWUpCisKKyAgICBmb3IgZnVuY19uYW1lLCBmdW5jIGluIGQuaXRlbXMoKToKKyAgICAgIGlmIGZ1bmNfbmFtZS5zdGFydHN3aXRoKCd0ZXN0JykgYW5kIGNhbGxhYmxlKGZ1bmMpOgorICAgICAgICBzZXRhdHRyKGNscywgZnVuY19uYW1lLCBNb3hNZXRhVGVzdEJhc2UuQ2xlYW5VcFRlc3QoY2xzLCBmdW5jKSkKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBDbGVhblVwVGVzdChjbHMsIGZ1bmMpOgorICAgICIiIkFkZHMgTW94IGNsZWFudXAgY29kZSB0byBhbnkgTW94VGVzdEJhc2UgbWV0aG9kLgorCisgICAgQWx3YXlzIHVuc2V0cyBzdHVicyBhZnRlciBhIHRlc3QuIFdpbGwgdmVyaWZ5IGFsbCBtb2NrcyBmb3IgdGVzdHMgdGhhdAorICAgIG90aGVyd2lzZSBwYXNzLgorCisgICAgQXJnczoKKyAgICAgIGNsczogTW94VGVzdEJhc2Ugb3Igc3ViY2xhc3M7IHRoZSBjbGFzcyB3aG9zZSB0ZXN0IG1ldGhvZCB3ZSBhcmUgYWx0ZXJpbmcuCisgICAgICBmdW5jOiBtZXRob2Q7IHRoZSBtZXRob2Qgb2YgdGhlIE1veFRlc3RCYXNlIHRlc3QgY2xhc3Mgd2Ugd2lzaCB0byBhbHRlci4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgbW9kaWZpZWQgbWV0aG9kLgorICAgICIiIgorICAgIGRlZiBuZXdfbWV0aG9kKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICBtb3hfb2JqID0gZ2V0YXR0cihzZWxmLCAnbW94JywgTm9uZSkKKyAgICAgIGNsZWFudXBfbW94ID0gRmFsc2UKKyAgICAgIGlmIG1veF9vYmogYW5kIGlzaW5zdGFuY2UobW94X29iaiwgTW94KToKKyAgICAgICAgY2xlYW51cF9tb3ggPSBUcnVlCisgICAgICB0cnk6CisgICAgICAgIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgZmluYWxseToKKyAgICAgICAgaWYgY2xlYW51cF9tb3g6CisgICAgICAgICAgbW94X29iai5VbnNldFN0dWJzKCkKKyAgICAgIGlmIGNsZWFudXBfbW94OgorICAgICAgICBtb3hfb2JqLlZlcmlmeUFsbCgpCisgICAgbmV3X21ldGhvZC5fX25hbWVfXyA9IGZ1bmMuX19uYW1lX18KKyAgICBuZXdfbWV0aG9kLl9fZG9jX18gPSBmdW5jLl9fZG9jX18KKyAgICBuZXdfbWV0aG9kLl9fbW9kdWxlX18gPSBmdW5jLl9fbW9kdWxlX18KKyAgICByZXR1cm4gbmV3X21ldGhvZAorCisKK2NsYXNzIE1veFRlc3RCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgIiIiQ29udmVuaWVuY2UgdGVzdCBjbGFzcyB0byBtYWtlIHN0dWJiaW5nIGVhc2llci4KKworICBTZXRzIHVwIGEgIm1veCIgYXR0cmlidXRlIHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIE1veCAtIGFueSBtb3ggdGVzdHMgd2lsbAorICB3YW50IHRoaXMuIEFsc28gYXV0b21hdGljYWxseSB1bnNldHMgYW55IHN0dWJzIGFuZCB2ZXJpZmllcyB0aGF0IGFsbCBtb2NrCisgIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdGVzdCwgZWxpbWluYXRpbmcgYm9pbGVycGxhdGUKKyAgY29kZS4KKyAgIiIiCisKKyAgX19tZXRhY2xhc3NfXyA9IE1veE1ldGFUZXN0QmFzZQorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLm1veCA9IE1veCgpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL3NldHVwLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZDk3MTRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9zZXR1cC5weQpAQCAtMCwwICsxLDE1MiBAQAorIyEgL3Vzci9iaW4vcHl0aG9uCisjCisjIFNlZSBSRUFETUUgZm9yIHVzYWdlIGluc3RydWN0aW9ucy4KKworIyBXZSBtdXN0IHVzZSBzZXR1cHRvb2xzLCBub3QgZGlzdHV0aWxzLCBiZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHRoZQorIyBuYW1lc3BhY2VfcGFja2FnZXMgb3B0aW9uIGZvciB0aGUgImdvb2dsZSIgcGFja2FnZS4KK2Zyb20gZXpfc2V0dXAgaW1wb3J0IHVzZV9zZXR1cHRvb2xzCit1c2Vfc2V0dXB0b29scygpCisKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZQoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworCittYWludGFpbmVyX2VtYWlsID0gInByb3RvYnVmQGdvb2dsZWdyb3Vwcy5jb20iCisKKyMgRmluZCB0aGUgUHJvdG9jb2wgQ29tcGlsZXIuCitpZiBvcy5wYXRoLmV4aXN0cygiLi4vc3JjL3Byb3RvYyIpOgorICBwcm90b2MgPSAiLi4vc3JjL3Byb3RvYyIKK2VsaWYgb3MucGF0aC5leGlzdHMoIi4uL3NyYy9wcm90b2MuZXhlIik6CisgIHByb3RvYyA9ICIuLi9zcmMvcHJvdG9jLmV4ZSIKK2VsaWYgb3MucGF0aC5leGlzdHMoIi4uL3ZzcHJvamVjdHMvRGVidWcvcHJvdG9jLmV4ZSIpOgorICBwcm90b2MgPSAiLi4vdnNwcm9qZWN0cy9EZWJ1Zy9wcm90b2MuZXhlIgorZWxpZiBvcy5wYXRoLmV4aXN0cygiLi4vdnNwcm9qZWN0cy9SZWxlYXNlL3Byb3RvYy5leGUiKToKKyAgcHJvdG9jID0gIi4uL3ZzcHJvamVjdHMvUmVsZWFzZS9wcm90b2MuZXhlIgorZWxzZToKKyAgcHJvdG9jID0gZmluZF9leGVjdXRhYmxlKCJwcm90b2MiKQorCitkZWYgZ2VuZXJhdGVfcHJvdG8oc291cmNlKToKKyAgIiIiSW52b2tlcyB0aGUgUHJvdG9jb2wgQ29tcGlsZXIgdG8gZ2VuZXJhdGUgYSBfcGIyLnB5IGZyb20gdGhlIGdpdmVuCisgIC5wcm90byBmaWxlLiAgRG9lcyBub3RoaW5nIGlmIHRoZSBvdXRwdXQgYWxyZWFkeSBleGlzdHMgYW5kIGlzIG5ld2VyIHRoYW4KKyAgdGhlIGlucHV0LiIiIgorCisgIG91dHB1dCA9IHNvdXJjZS5yZXBsYWNlKCIucHJvdG8iLCAiX3BiMi5weSIpLnJlcGxhY2UoIi4uL3NyYy8iLCAiIikKKworICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlKToKKyAgICBwcmludCAiQ2FuJ3QgZmluZCByZXF1aXJlZCBmaWxlOiAiICsgc291cmNlCisgICAgc3lzLmV4aXQoLTEpCisKKyAgaWYgKG5vdCBvcy5wYXRoLmV4aXN0cyhvdXRwdXQpIG9yCisgICAgICAob3MucGF0aC5leGlzdHMoc291cmNlKSBhbmQKKyAgICAgICBvcy5wYXRoLmdldG10aW1lKHNvdXJjZSkgPiBvcy5wYXRoLmdldG10aW1lKG91dHB1dCkpKToKKyAgICBwcmludCAiR2VuZXJhdGluZyAlcy4uLiIgJSBvdXRwdXQKKworICAgIGlmIHByb3RvYyA9PSBOb25lOgorICAgICAgc3lzLnN0ZGVyci53cml0ZSgKKyAgICAgICAgICAicHJvdG9jIGlzIG5vdCBpbnN0YWxsZWQgbm9yIGZvdW5kIGluIC4uL3NyYy4gIFBsZWFzZSBjb21waWxlIGl0ICIKKyAgICAgICAgICAib3IgaW5zdGFsbCB0aGUgYmluYXJ5IHBhY2thZ2UuXG4iKQorICAgICAgc3lzLmV4aXQoLTEpCisKKyAgICBwcm90b2NfY29tbWFuZCA9IFsgcHJvdG9jLCAiLUkuLi9zcmMiLCAiLUkuIiwgIi0tcHl0aG9uX291dD0uIiwgc291cmNlIF0KKyAgICBpZiBzdWJwcm9jZXNzLmNhbGwocHJvdG9jX2NvbW1hbmQpICE9IDA6CisgICAgICBzeXMuZXhpdCgtMSkKKworZGVmIE1ha2VUZXN0U3VpdGUoKToKKyAgIyBUaGlzIGlzIGFwcGFyZW50bHkgbmVlZGVkIG9uIHNvbWUgc3lzdGVtcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdGVzdHMKKyAgIyB3b3JrIGV2ZW4gaWYgYSBwcmV2aW91cyB2ZXJzaW9uIGlzIGFscmVhZHkgaW5zdGFsbGVkLgorICBpZiAnZ29vZ2xlJyBpbiBzeXMubW9kdWxlczoKKyAgICBkZWwgc3lzLm1vZHVsZXNbJ2dvb2dsZSddCisKKyAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iKQorICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byIpCisgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byIpCisgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8iKQorICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvIikKKyAgZ2VuZXJhdGVfcHJvdG8oImdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX2V4dGVuc2lvbnMucHJvdG8iKQorICBnZW5lcmF0ZV9wcm90bygiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfbWVzc2FnZXMucHJvdG8iKQorCisgIGltcG9ydCB1bml0dGVzdAorICBpbXBvcnQgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmdlbmVyYXRvcl90ZXN0ICAgICBhcyBnZW5lcmF0b3JfdGVzdAorICBpbXBvcnQgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmRlc2NyaXB0b3JfdGVzdCAgICBhcyBkZXNjcmlwdG9yX3Rlc3QKKyAgaW1wb3J0IGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5yZWZsZWN0aW9uX3Rlc3QgICAgYXMgcmVmbGVjdGlvbl90ZXN0CisgIGltcG9ydCBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuc2VydmljZV9yZWZsZWN0aW9uX3Rlc3QgXAorICAgIGFzIHNlcnZpY2VfcmVmbGVjdGlvbl90ZXN0CisgIGltcG9ydCBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwudGV4dF9mb3JtYXRfdGVzdCAgIGFzIHRleHRfZm9ybWF0X3Rlc3QKKyAgaW1wb3J0IGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC53aXJlX2Zvcm1hdF90ZXN0ICAgYXMgd2lyZV9mb3JtYXRfdGVzdAorCisgIGxvYWRlciA9IHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyCisgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgZm9yIHRlc3QgaW4gWyBnZW5lcmF0b3JfdGVzdCwKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3Rlc3QsCisgICAgICAgICAgICAgICAgcmVmbGVjdGlvbl90ZXN0LAorICAgICAgICAgICAgICAgIHNlcnZpY2VfcmVmbGVjdGlvbl90ZXN0LAorICAgICAgICAgICAgICAgIHRleHRfZm9ybWF0X3Rlc3QsCisgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXRfdGVzdCBdOgorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUodGVzdCkpCisKKyAgcmV0dXJuIHN1aXRlCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICMgVE9ETyhrZW50b24pOiAgSW50ZWdyYXRlIHRoaXMgaW50byBzZXR1cHRvb2xzIHNvbWVob3c/CisgIGlmIGxlbihzeXMuYXJndikgPj0gMiBhbmQgc3lzLmFyZ3ZbMV0gPT0gImNsZWFuIjoKKyAgICAjIERlbGV0ZSBnZW5lcmF0ZWQgX3BiMi5weSBmaWxlcyBhbmQgLnB5YyBmaWxlcyBpbiB0aGUgY29kZSB0cmVlLgorICAgIGZvciAoZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcykgaW4gb3Mud2FsaygiLiIpOgorICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZmlsZW5hbWUpCisgICAgICAgIGlmIGZpbGVwYXRoLmVuZHN3aXRoKCJfcGIyLnB5Iikgb3IgZmlsZXBhdGguZW5kc3dpdGgoIi5weWMiKSBvciBcCisgICAgICAgICAgZmlsZXBhdGguZW5kc3dpdGgoIi5zbyIpIG9yIGZpbGVwYXRoLmVuZHN3aXRoKCIubyIpOgorICAgICAgICAgIG9zLnJlbW92ZShmaWxlcGF0aCkKKyAgZWxzZToKKyAgICAjIEdlbmVyYXRlIG5lY2Vzc2FyeSAucHJvdG8gZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgICMgVE9ETyhrZW50b24pOiAgTWF5YmUgd2Ugc2hvdWxkIGhvb2sgdGhpcyBpbnRvIGEgZGlzdHV0aWxzIGNvbW1hbmQ/CisgICAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpCisgICAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvIikKKworICBleHRfbW9kdWxlX2xpc3QgPSBbXQorCisgICMgQysrIGltcGxlbWVudGF0aW9uIGV4dGVuc2lvbgorICBpZiBvcy5nZXRlbnYoIlBST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OIiwgInB5dGhvbiIpID09ICJjcHAiOgorICAgIHByaW50ICJVc2luZyBFWFBFUklNRU5UQUwgQysrIEltcGxtZW5ldGF0aW9uLiIKKyAgICBleHRfbW9kdWxlX2xpc3QuYXBwZW5kKEV4dGVuc2lvbigKKyAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5fbmV0X3Byb3RvMl9fX3B5dGhvbiIsCisgICAgICAgIFsgImdvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5jYyIsCisgICAgICAgICAgImdvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fcHJvdG9idWYuY2MiLAorICAgICAgICAgICJnb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uLXByb3RvMi5jYyIgXSwKKyAgICAgICAgaW5jbHVkZV9kaXJzID0gWyAiLiIgXSwKKyAgICAgICAgbGlicmFyaWVzID0gWyAicHJvdG9idWYiIF0pKQorCisgIHNldHVwKG5hbWUgPSAncHJvdG9idWYnLAorICAgICAgICB2ZXJzaW9uID0gJzIuNC4yLXByZScsCisgICAgICAgIHBhY2thZ2VzID0gWyAnZ29vZ2xlJyBdLAorICAgICAgICBuYW1lc3BhY2VfcGFja2FnZXMgPSBbICdnb29nbGUnIF0sCisgICAgICAgIHRlc3Rfc3VpdGUgPSAnc2V0dXAuTWFrZVRlc3RTdWl0ZScsCisgICAgICAgICMgTXVzdCBsaXN0IG1vZHVsZXMgZXhwbGljaXRseSBzbyB0aGF0IHdlIGRvbid0IGluc3RhbGwgdGVzdHMuCisgICAgICAgIHB5X21vZHVsZXMgPSBbCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5hcGlfaW1wbGVtZW50YXRpb24nLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuY29udGFpbmVycycsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5jcHBfbWVzc2FnZScsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5kZWNvZGVyJywKKyAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmVuY29kZXInLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwubWVzc2FnZV9saXN0ZW5lcicsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5weXRob25fbWVzc2FnZScsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC50eXBlX2NoZWNrZXJzJywKKyAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLndpcmVfZm9ybWF0JywKKyAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3InLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYuY29tcGlsZXIucGx1Z2luX3BiMicsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5tZXNzYWdlJywKKyAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnJlZmxlY3Rpb24nLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYuc2VydmljZScsCisgICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5zZXJ2aWNlX3JlZmxlY3Rpb24nLAorICAgICAgICAgICdnb29nbGUucHJvdG9idWYudGV4dF9mb3JtYXQnIF0sCisgICAgICAgIGV4dF9tb2R1bGVzID0gZXh0X21vZHVsZV9saXN0LAorICAgICAgICB1cmwgPSAnaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLycsCisgICAgICAgIG1haW50YWluZXIgPSBtYWludGFpbmVyX2VtYWlsLAorICAgICAgICBtYWludGFpbmVyX2VtYWlsID0gJ3Byb3RvYnVmQGdvb2dsZWdyb3Vwcy5jb20nLAorICAgICAgICBsaWNlbnNlID0gJ05ldyBCU0QgTGljZW5zZScsCisgICAgICAgIGRlc2NyaXB0aW9uID0gJ1Byb3RvY29sIEJ1ZmZlcnMnLAorICAgICAgICBsb25nX2Rlc2NyaXB0aW9uID0KKyAgICAgICAgICAiUHJvdG9jb2wgQnVmZmVycyBhcmUgR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQuIiwKKyAgICAgICAgKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9zdHVib3V0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9zdHVib3V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlZTRmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL3N0dWJvdXQucHkKQEAgLTAsMCArMSwxNDAgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMi40CisjCisjIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgZmlsZSBpcyB1c2VkIGZvciB0ZXN0aW5nLiAgVGhlIG9yaWdpbmFsIGlzIGF0OgorIyAgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9weW1veC8KKworY2xhc3MgU3R1Yk91dEZvclRlc3Rpbmc6CisgICIiIlNhbXBsZSBVc2FnZToKKyAgICAgWW91IHdhbnQgb3MucGF0aC5leGlzdHMoKSB0byBhbHdheXMgcmV0dXJuIHRydWUgZHVyaW5nIHRlc3RpbmcuCisKKyAgICAgc3R1YnMgPSBTdHViT3V0Rm9yVGVzdGluZygpCisgICAgIHN0dWJzLlNldChvcy5wYXRoLCAnZXhpc3RzJywgbGFtYmRhIHg6IDEpCisgICAgICAgLi4uCisgICAgIHN0dWJzLlVuc2V0QWxsKCkKKworICAgICBUaGUgYWJvdmUgY2hhbmdlcyBvcy5wYXRoLmV4aXN0cyBpbnRvIGEgbGFtYmRhIHRoYXQgcmV0dXJucyAxLiAgT25jZQorICAgICB0aGUgLi4uIHBhcnQgb2YgdGhlIGNvZGUgZmluaXNoZXMsIHRoZSBVbnNldEFsbCgpIGxvb2tzIHVwIHRoZSBvbGQgdmFsdWUKKyAgICAgb2Ygb3MucGF0aC5leGlzdHMgYW5kIHJlc3RvcmVzIGl0LgorCisgICIiIgorICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc2VsZi5jYWNoZSA9IFtdCisgICAgc2VsZi5zdHVicyA9IFtdCisKKyAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgc2VsZi5TbWFydFVuc2V0QWxsKCkKKyAgICBzZWxmLlVuc2V0QWxsKCkKKworICBkZWYgU21hcnRTZXQoc2VsZiwgb2JqLCBhdHRyX25hbWUsIG5ld19hdHRyKToKKyAgICAiIiJSZXBsYWNlIG9iai5hdHRyX25hbWUgd2l0aCBuZXdfYXR0ci4gVGhpcyBtZXRob2QgaXMgc21hcnQgYW5kIHdvcmtzCisgICAgICAgYXQgdGhlIG1vZHVsZSwgY2xhc3MsIGFuZCBpbnN0YW5jZSBsZXZlbCB3aGlsZSBwcmVzZXJ2aW5nIHByb3BlcgorICAgICAgIGluaGVyaXRhbmNlLiBJdCB3aWxsIG5vdCBzdHViIG91dCBDIHR5cGVzIGhvd2V2ZXIgdW5sZXNzIHRoYXQgaGFzIGJlZW4KKyAgICAgICBleHBsaWNpdGx5IGFsbG93ZWQgYnkgdGhlIHR5cGUuCisKKyAgICAgICBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgY2FzZSB3aGVyZSBhdHRyX25hbWUgaXMgYSBzdGF0aWNtZXRob2Qgb3IgYQorICAgICAgIGNsYXNzbWV0aG9kIG9mIG9iai4KKworICAgICAgIE5vdGVzOgorICAgICAgLSBJZiBvYmogaXMgYW4gaW5zdGFuY2UsIHRoZW4gaXQgaXMgaXRzIGNsYXNzIHRoYXQgd2lsbCBhY3R1YWxseSBiZQorICAgICAgICBzdHViYmVkLiBOb3RlIHRoYXQgdGhlIG1ldGhvZCBTZXQoKSBkb2VzIG5vdCBkbyB0aGF0OiBpZiBvYmogaXMKKyAgICAgICAgYW4gaW5zdGFuY2UsIGl0IChhbmQgbm90IGl0cyBjbGFzcykgd2lsbCBiZSBzdHViYmVkLgorICAgICAgLSBUaGUgc3R1YmJpbmcgaXMgdXNpbmcgdGhlIGJ1aWx0aW4gZ2V0YXR0ciBhbmQgc2V0YXR0ci4gU28sIHRoZSBfX2dldF9fCisgICAgICAgIGFuZCBfX3NldF9fIHdpbGwgYmUgY2FsbGVkIHdoZW4gc3R1YmJpbmcgKFRPRE86IEEgYmV0dGVyIGlkZWEgd291bGQKKyAgICAgICAgcHJvYmFibHkgYmUgdG8gbWFuaXB1bGF0ZSBvYmouX19kaWN0X18gaW5zdGVhZCBvZiBnZXRhdHRyKCkgYW5kCisgICAgICAgIHNldGF0dHIoKSkuCisKKyAgICAgICBSYWlzZXMgQXR0cmlidXRlRXJyb3IgaWYgdGhlIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZm91bmQuCisgICAgIiIiCisgICAgaWYgKGluc3BlY3QuaXNtb2R1bGUob2JqKSBvcgorICAgICAgICAobm90IGluc3BlY3QuaXNjbGFzcyhvYmopIGFuZCBvYmouX19kaWN0X18uaGFzX2tleShhdHRyX25hbWUpKSk6CisgICAgICBvcmlnX29iaiA9IG9iagorICAgICAgb3JpZ19hdHRyID0gZ2V0YXR0cihvYmosIGF0dHJfbmFtZSkKKworICAgIGVsc2U6CisgICAgICBpZiBub3QgaW5zcGVjdC5pc2NsYXNzKG9iaik6CisgICAgICAgIG1ybyA9IGxpc3QoaW5zcGVjdC5nZXRtcm8ob2JqLl9fY2xhc3NfXykpCisgICAgICBlbHNlOgorICAgICAgICBtcm8gPSBsaXN0KGluc3BlY3QuZ2V0bXJvKG9iaikpCisKKyAgICAgIG1yby5yZXZlcnNlKCkKKworICAgICAgb3JpZ19hdHRyID0gTm9uZQorCisgICAgICBmb3IgY2xzIGluIG1ybzoKKyAgICAgICAgdHJ5OgorICAgICAgICAgIG9yaWdfb2JqID0gY2xzCisgICAgICAgICAgb3JpZ19hdHRyID0gZ2V0YXR0cihvYmosIGF0dHJfbmFtZSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgIGNvbnRpbnVlCisKKyAgICBpZiBvcmlnX2F0dHIgaXMgTm9uZToKKyAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJBdHRyaWJ1dGUgbm90IGZvdW5kLiIpCisKKyAgICAjIENhbGxpbmcgZ2V0YXR0cigpIG9uIGEgc3RhdGljbWV0aG9kIHRyYW5zZm9ybXMgaXQgdG8gYSAnbm9ybWFsJyBmdW5jdGlvbi4KKyAgICAjIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgd2UgcHV0IGl0IGJhY2sgYXMgYSBzdGF0aWNtZXRob2QuCisgICAgb2xkX2F0dHJpYnV0ZSA9IG9iai5fX2RpY3RfXy5nZXQoYXR0cl9uYW1lKQorICAgIGlmIG9sZF9hdHRyaWJ1dGUgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2Uob2xkX2F0dHJpYnV0ZSwgc3RhdGljbWV0aG9kKToKKyAgICAgIG9yaWdfYXR0ciA9IHN0YXRpY21ldGhvZChvcmlnX2F0dHIpCisKKyAgICBzZWxmLnN0dWJzLmFwcGVuZCgob3JpZ19vYmosIGF0dHJfbmFtZSwgb3JpZ19hdHRyKSkKKyAgICBzZXRhdHRyKG9yaWdfb2JqLCBhdHRyX25hbWUsIG5ld19hdHRyKQorCisgIGRlZiBTbWFydFVuc2V0QWxsKHNlbGYpOgorICAgICIiIlJldmVyc2VzIGFsbCB0aGUgU21hcnRTZXQoKSBjYWxscywgcmVzdG9yaW5nIHRoaW5ncyB0byB0aGVpciBvcmlnaW5hbAorICAgIGRlZmluaXRpb24uICBJdHMgb2theSB0byBjYWxsIFNtYXJ0VW5zZXRBbGwoKSByZXBlYXRlZGx5LCBhcyBsYXRlciBjYWxscworICAgIGhhdmUgbm8gZWZmZWN0IGlmIG5vIFNtYXJ0U2V0KCkgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuCisKKyAgICAiIiIKKyAgICBzZWxmLnN0dWJzLnJldmVyc2UoKQorCisgICAgZm9yIGFyZ3MgaW4gc2VsZi5zdHViczoKKyAgICAgIHNldGF0dHIoKmFyZ3MpCisKKyAgICBzZWxmLnN0dWJzID0gW10KKworICBkZWYgU2V0KHNlbGYsIHBhcmVudCwgY2hpbGRfbmFtZSwgbmV3X2NoaWxkKToKKyAgICAiIiJSZXBsYWNlIGNoaWxkX25hbWUncyBvbGQgZGVmaW5pdGlvbiB3aXRoIG5ld19jaGlsZCwgaW4gdGhlIGNvbnRleHQKKyAgICBvZiB0aGUgZ2l2ZW4gcGFyZW50LiAgVGhlIHBhcmVudCBjb3VsZCBiZSBhIG1vZHVsZSB3aGVuIHRoZSBjaGlsZCBpcyBhCisgICAgZnVuY3Rpb24gYXQgbW9kdWxlIHNjb3BlLiAgT3IgdGhlIHBhcmVudCBjb3VsZCBiZSBhIGNsYXNzIHdoZW4gYSBjbGFzcycKKyAgICBtZXRob2QgaXMgYmVpbmcgcmVwbGFjZWQuICBUaGUgbmFtZWQgY2hpbGQgaXMgc2V0IHRvIG5ld19jaGlsZCwgd2hpbGUKKyAgICB0aGUgcHJpb3IgZGVmaW5pdGlvbiBpcyBzYXZlZCBhd2F5IGZvciBsYXRlciwgd2hlbiBVbnNldEFsbCgpIGlzIGNhbGxlZC4KKworICAgIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHRoZSBjYXNlIHdoZXJlIGNoaWxkX25hbWUgaXMgYSBzdGF0aWNtZXRob2Qgb3IgYQorICAgIGNsYXNzbWV0aG9kIG9mIHBhcmVudC4KKyAgICAiIiIKKyAgICBvbGRfY2hpbGQgPSBnZXRhdHRyKHBhcmVudCwgY2hpbGRfbmFtZSkKKworICAgIG9sZF9hdHRyaWJ1dGUgPSBwYXJlbnQuX19kaWN0X18uZ2V0KGNoaWxkX25hbWUpCisgICAgaWYgb2xkX2F0dHJpYnV0ZSBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShvbGRfYXR0cmlidXRlLCBzdGF0aWNtZXRob2QpOgorICAgICAgb2xkX2NoaWxkID0gc3RhdGljbWV0aG9kKG9sZF9jaGlsZCkKKworICAgIHNlbGYuY2FjaGUuYXBwZW5kKChwYXJlbnQsIG9sZF9jaGlsZCwgY2hpbGRfbmFtZSkpCisgICAgc2V0YXR0cihwYXJlbnQsIGNoaWxkX25hbWUsIG5ld19jaGlsZCkKKworICBkZWYgVW5zZXRBbGwoc2VsZik6CisgICAgIiIiUmV2ZXJzZXMgYWxsIHRoZSBTZXQoKSBjYWxscywgcmVzdG9yaW5nIHRoaW5ncyB0byB0aGVpciBvcmlnaW5hbAorICAgIGRlZmluaXRpb24uICBJdHMgb2theSB0byBjYWxsIFVuc2V0QWxsKCkgcmVwZWF0ZWRseSwgYXMgbGF0ZXIgY2FsbHMgaGF2ZQorICAgIG5vIGVmZmVjdCBpZiBubyBTZXQoKSBjYWxscyBoYXZlIGJlZW4gbWFkZS4KKworICAgICIiIgorICAgICMgVW5kbyBjYWxscyB0byBTZXQoKSBpbiByZXZlcnNlIG9yZGVyLCBpbiBjYXNlIFNldCgpIHdhcyBjYWxsZWQgb24gdGhlCisgICAgIyBzYW1lIGFyZ3VtZW50cyByZXBlYXRlZGx5ICh3YW50IHRoZSBvcmlnaW5hbCBjYWxsIHRvIGJlIGxhc3Qgb25lIHVuZG9uZSkKKyAgICBzZWxmLmNhY2hlLnJldmVyc2UoKQorCisgICAgZm9yIChwYXJlbnQsIG9sZF9jaGlsZCwgY2hpbGRfbmFtZSkgaW4gc2VsZi5jYWNoZToKKyAgICAgIHNldGF0dHIocGFyZW50LCBjaGlsZF9uYW1lLCBvbGRfY2hpbGQpCisgICAgc2VsZi5jYWNoZSA9IFtdCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjllN2FmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM3MSBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKK2lmIEhBVkVfWkxJQgorR1pDSEVDS1BST0dSQU1TID0gemNnemlwIHpjZ3VuemlwCitHWkhFQURFUlMgPSBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaAorR1pURVNUUyA9IGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaAorZWxzZQorR1pDSEVDS1BST0dSQU1TID0KK0daSEVBREVSUyA9CitHWlRFU1RTID0KK2VuZGlmCisKK2lmIEdDQworIyBUaGVzZSBhcmUgZ29vZCB3YXJuaW5ncyB0byB0dXJuIG9uIGJ5IGRlZmF1bHQKK05PX09QVF9DWFhGTEFHUyA9ICQoUFRIUkVBRF9DRkxBR1MpIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV292ZXJsb2FkZWQtdmlydHVhbCAtV25vLXNpZ24tY29tcGFyZQorZWxzZQorTk9fT1BUX0NYWEZMQUdTID0gJChQVEhSRUFEX0NGTEFHUykKK2VuZGlmCisKK0FNX0NYWEZMQUdTID0gJChOT19PUFRfQ1hYRkxBR1MpICQoUFJPVE9CVUZfT1BUX0ZMQUcpCisKK0FNX0xERkxBR1MgPSAkKFBUSFJFQURfQ0ZMQUdTKQorCisjIElmIEkgc2F5ICJkaXN0X2luY2x1ZGVfREFUQSIsIGF1dG9tYWtlIGNvbXBsYWlucyB0aGF0ICQoaW5jbHVkZWRpcikgaXMgbm90CisjIGEgImxlZ2l0aW1hdGUiIGRpcmVjdG9yeSBmb3IgREFUQS4gIFNjcmV3IHlvdSwgYXV0b21ha2UuCitwcm90b2RpciA9ICQoaW5jbHVkZWRpcikKK25vYmFzZV9kaXN0X3Byb3RvX0RBVEEgPSBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90bworCisjIE5vdCBzdXJlIHdoeSB0aGVzZSBkb24ndCBnZXQgY2xlYW5lZCBhdXRvbWF0aWNhbGx5LgorY2xlYW4tbG9jYWw6CisJcm0gLWYgKi5sb1QKKworQ0xFQU5GSUxFUyA9ICQocHJvdG9jX291dHB1dHMpIHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbiBcCisgICAgICAgICAgICAgdGVzdHppcC5qYXIgdGVzdHppcC5saXN0IHRlc3R6aXAucHJvdG8gdGVzdHppcC56aXAKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSAgIFwKKyAgTWFrZWZpbGUuaW4KKworbm9iYXNlX2luY2x1ZGVfSEVBREVSUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm1fZ2NjLmggICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19tYWNvc3guaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19taXBzX2djYy5oICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmggICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5oICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc2VydmljZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaCAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAkKEdaSEVBREVSUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaCAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaAorCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJwcm90b2J1Zi1saXRlLmxhIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYQorCitsaWJwcm90b2J1Zl9saXRlX2xhX0xJQkFERCA9ICQoUFRIUkVBRF9MSUJTKQorbGlicHJvdG9idWZfbGl0ZV9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyA3OjA6MCAtZXhwb3J0LWR5bmFtaWMgLW5vLXVuZGVmaW5lZAorbGlicHJvdG9idWZfbGl0ZV9sYV9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmNjICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX2lubC5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MKKworbGlicHJvdG9idWZfbGFfTElCQUREID0gJChQVEhSRUFEX0xJQlMpCitsaWJwcm90b2J1Zl9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyA3OjA6MCAtZXhwb3J0LWR5bmFtaWMgLW5vLXVuZGVmaW5lZAorbGlicHJvdG9idWZfbGFfU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAkKGxpYnByb3RvYnVmX2xpdGVfbGFfU09VUkNFUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF9oZWF2eS5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc2VydmljZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjCisKK2xpYnByb3RvY19sYV9MSUJBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEKK2xpYnByb3RvY19sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyA3OjA6MCAtZXhwb3J0LWR5bmFtaWMgLW5vLXVuZGVmaW5lZAorbGlicHJvdG9jX2xhX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYyAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmNjICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuaCAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuaCAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5jYyAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5oICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuY2MKKworYmluX1BST0dSQU1TID0gcHJvdG9jCitwcm90b2NfTERBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEgbGlicHJvdG9jLmxhCitwcm90b2NfU09VUkNFUyA9IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjCisKKyMgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcHJvdG9jX2lucHV0cyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnByb3RvICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8gICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8gICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8gICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90byAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bworCitFWFRSQV9ESVNUID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICQocHJvdG9jX2lucHV0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNvbGFyaXMvbGlic3RkYysrLmxhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dCAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0ICBcCisgIGdvb2dsZS9wcm90b2J1Zi9wYWNrYWdlX2luZm8uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby9wYWNrYWdlX2luZm8uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYWNrYWdlX2luZm8uaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfb3V0cHV0X3VuaXR0ZXN0LnNoICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvCisKK3Byb3RvY19saXRlX291dHB1dHMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnBiLmgKKworcHJvdG9jX291dHB1dHMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAkKHByb3RvY19saXRlX291dHB1dHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5oICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5oCisKK0JVSUxUX1NPVVJDRVMgPSAkKHByb3RvY19vdXRwdXRzKQorCitpZiBVU0VfRVhURVJOQUxfUFJPVE9DCisKK3VuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbjogJChwcm90b2NfaW5wdXRzKQorCSQoUFJPVE9DKSAtSSQoc3JjZGlyKSAtLWNwcF9vdXQ9LiAkXgorCXRvdWNoIHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbgorCitlbHNlCisKKyMgV2UgaGF2ZSB0byBjZCB0byAkKHNyY2RpcikgYmVmb3JlIGV4ZWN1dGluZyBwcm90b2MgYmVjYXVzZSAkKHByb3RvY19pbnB1dHMpIGlzCisjIHJlbGF0aXZlIHRvIHNyY2Rpciwgd2hpY2ggbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2hlbgorIyBidWlsZGluZyBvdXQtb2YtdHJlZS4KK3VuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbjogcHJvdG9jJChFWEVFWFQpICQocHJvdG9jX2lucHV0cykKKwlvbGRwd2Q9YHB3ZGAgJiYgKCBjZCAkKHNyY2RpcikgJiYgJCRvbGRwd2QvcHJvdG9jJChFWEVFWFQpIC1JLiAtLWNwcF9vdXQ9JCRvbGRwd2QgJChwcm90b2NfaW5wdXRzKSApCisJdG91Y2ggdW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuCisKK2VuZGlmCisKKyQocHJvdG9jX291dHB1dHMpOiB1bml0dGVzdF9wcm90b19taWRkbGVtYW4KKworQ09NTU9OX1RFU1RfU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmgKKworY2hlY2tfUFJPR1JBTVMgPSBwcm90b2MgcHJvdG9idWYtdGVzdCBwcm90b2J1Zi1sYXp5LWRlc2NyaXB0b3ItdGVzdCBcCisgICAgICAgICAgICAgICAgIHByb3RvYnVmLWxpdGUtdGVzdCB0ZXN0X3BsdWdpbiAkKEdaQ0hFQ0tQUk9HUkFNUykKK3Byb3RvYnVmX3Rlc3RfTERBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEgbGlicHJvdG9jLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvZ3Rlc3QvbGliL2xpYmd0ZXN0LmxhICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvZ3Rlc3QvbGliL2xpYmd0ZXN0X21haW4ubGEKK3Byb3RvYnVmX3Rlc3RfQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvZ3Rlc3QvaW5jbHVkZSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtSSQodG9wX2J1aWxkZGlyKS9ndGVzdC9pbmNsdWRlCisjIERpc2FibGUgb3B0aW1pemF0aW9uIGZvciB0ZXN0cyB1bmxlc3MgdGhlIHVzZXIgZXhwbGljaXRseSBhc2tlZCBmb3IgaXQsCisjIHNpbmNlIHRlc3RfdXRpbC5jYyB0YWtlcyBmb3JldmVyIHRvIGNvbXBpbGUgd2l0aCBvcHRpbWl6YXRpb24gKHdpdGggR0NDKS4KKyMgU2VlIGNvbmZpZ3VyZS5hYyBmb3IgbW9yZSBpbmZvLgorcHJvdG9idWZfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQorcHJvdG9idWZfdGVzdF9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYyAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYyAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9ib290c3RyYXBfdW5pdHRlc3QuY2MgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wbHVnaW5fdW5pdHRlc3QuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MgICAgXAorICAkKENPTU1PTl9URVNUX1NPVVJDRVMpCitub2Rpc3RfcHJvdG9idWZfdGVzdF9TT1VSQ0VTID0gJChwcm90b2Nfb3V0cHV0cykKKworIyBSdW4gY3BwX3VuaXR0ZXN0IGFnYWluIHdpdGggUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUyBkZWZpbmVkLgorcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfTERBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEgXAorICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3QubGEgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3RfbWFpbi5sYQorcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvZ3Rlc3QvaW5jbHVkZSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1JJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2luY2x1ZGUgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCitwcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQorcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgXAorICAkKENPTU1PTl9URVNUX1NPVVJDRVMpCitub2Rpc3RfcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfU09VUkNFUyA9ICQocHJvdG9jX291dHB1dHMpCisKKyMgQnVpbGQgbGl0ZV91bml0dGVzdCBzZXBhcmF0ZWx5LCBzaW5jZSBpdCBkb2Vzbid0IHVzZSBndGVzdC4KK3Byb3RvYnVmX2xpdGVfdGVzdF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi1saXRlLmxhCitwcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MgPSAkKE5PX09QVF9DWFhGTEFHUykKK3Byb3RvYnVmX2xpdGVfdGVzdF9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmgKK25vZGlzdF9wcm90b2J1Zl9saXRlX3Rlc3RfU09VUkNFUyA9ICQocHJvdG9jX2xpdGVfb3V0cHV0cykKKworIyBUZXN0IHBsdWdpbiBiaW5hcnkuCit0ZXN0X3BsdWdpbl9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYSBsaWJwcm90b2MubGEgXAorICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvZ3Rlc3QvbGliL2xpYmd0ZXN0LmxhCit0ZXN0X3BsdWdpbl9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS9ndGVzdC9pbmNsdWRlICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAtSSQodG9wX2J1aWxkZGlyKS9ndGVzdC9pbmNsdWRlCit0ZXN0X3BsdWdpbl9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYworCitpZiBIQVZFX1pMSUIKK3pjZ3ppcF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYQoremNnemlwX1NPVVJDRVMgPSBnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MKKworemNndW56aXBfTERBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEKK3pjZ3VuemlwX1NPVVJDRVMgPSBnb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYworZW5kaWYKKworVEVTVFMgPSBwcm90b2J1Zi10ZXN0IHByb3RvYnVmLWxhenktZGVzY3JpcHRvci10ZXN0IHByb3RvYnVmLWxpdGUtdGVzdCBcCisgICAgICAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfb3V0cHV0X3VuaXR0ZXN0LnNoICQoR1pURVNUUykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL1NFQlMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9TRUJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzNjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9TRUJTCkBAIC0wLDAgKzEsMjQwIEBACisjICoqRVhQRVJJTUVOVEFMKioKKyMKKyMgU2VlIGh0dHA6Ly9zZWJzLmdvb2dsZWNvZGUuY29tCisjCisjIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGJ1aWxkIGRlZmluaXRpb24gZmlsZSB1c2luZyB0aGUgU0VCUyBidWlsZCBzeXN0ZW0uCisjIEkgKEtlbnRvbiBWYXJkYSwgbWFpbnRhaW5lciBvZiBQcm90b2NvbCBCdWZmZXJzKSBoYXBwZW4gdG8gYmUgdGhlIGF1dGhvciBvZgorIyBTRUJTLCB0aG91Z2ggU0VCUyBpcyBub3QgYSBHb29nbGUgcHJvamVjdC4gIEknbSBzdGlja2luZyB0aGlzIGZpbGUgaW4KKyMgcHJvdG9idWYncyBTVk4gYmVjYXVzZSB0aGF0J3MgdGhlIGVhc2llc3QgcGxhY2UgZm9yIG1lIHRvIHB1dCBpdCwgYW5kIGl0CisjIHNob3VsZG4ndCBoYXJtIGFueW9uZS4gIFRoaXMgZmlsZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgQ3VycmVudGx5LCB0byB1c2UgdGhpcyBmaWxlLCB5b3UgbXVzdCBnZW5lcmF0ZSBjb25maWcuaCBhbmQgcHV0IGl0IGF0IHRoZQorIyB0b3AgbGV2ZWwgb2YgdGhlIHNvdXJjZSB0cmVlLgorCitfY3BwID0gc2Vicy5pbXBvcnRfKCIvL3NlYnMvY3BwLnNlYnMiKQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFB1YmxpYyB0YXJnZXRzCisKK3Byb3RvYnVmX2xpdGUgPSBfY3BwLkxpYnJhcnkoCisgIG5hbWUgPSAicHJvdG9idWYtbGl0ZSIsCisgIHNyY3MgPSBbICJzdHVicy9jb21tb24uY2MiLAorICAgICAgICAgICAic3R1YnMvb25jZS5jYyIsCisgICAgICAgICAgICJzdHVicy9oYXNoLmNjIiwKKyAgICAgICAgICAgInN0dWJzL2hhc2guaCIsCisgICAgICAgICAgICJzdHVicy9tYXAtdXRpbC5oIiwKKyAgICAgICAgICAgInN0dWJzL3N0bF91dGlsLWlubC5oIiwKKyAgICAgICAgICAgImV4dGVuc2lvbl9zZXQuY2MiLAorICAgICAgICAgICAiZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYyIsCisgICAgICAgICAgICJtZXNzYWdlX2xpdGUuY2MiLAorICAgICAgICAgICAicmVwZWF0ZWRfZmllbGQuY2MiLAorICAgICAgICAgICAid2lyZV9mb3JtYXRfbGl0ZS5jYyIsCisgICAgICAgICAgICJpby9jb2RlZF9zdHJlYW0uY2MiLAorICAgICAgICAgICAiaW8vemVyb19jb3B5X3N0cmVhbS5jYyIsCisgICAgICAgICAgICJpby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5jYyIgXSwKKyAgZGVwcyA9IFsgX2NwcC5TeXN0ZW1MaWJyYXJ5KG5hbWUgPSAicHRocmVhZCIpIF0pCisKK3Byb3RvYnVmID0gX2NwcC5MaWJyYXJ5KAorICBuYW1lID0gInByb3RvYnVmIiwKKyAgc3JjcyA9IFsgInN0dWJzL3N0cnV0aWwuY2MiLAorICAgICAgICAgICAic3R1YnMvc3RydXRpbC5oIiwKKyAgICAgICAgICAgInN0dWJzL3N1YnN0aXR1dGUuY2MiLAorICAgICAgICAgICAic3R1YnMvc3Vic3RpdHV0ZS5oIiwKKyAgICAgICAgICAgInN0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYyIsCisgICAgICAgICAgICJkZXNjcmlwdG9yLmNjIiwKKyAgICAgICAgICAgImRlc2NyaXB0b3IucGIuY2MiLAorICAgICAgICAgICAiZGVzY3JpcHRvcl9kYXRhYmFzZS5jYyIsCisgICAgICAgICAgICJkeW5hbWljX21lc3NhZ2UuY2MiLAorICAgICAgICAgICAiZXh0ZW5zaW9uX3NldF9oZWF2eS5jYyIsCisgICAgICAgICAgICJnZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjIiwKKyAgICAgICAgICAgIm1lc3NhZ2UuY2MiLAorICAgICAgICAgICAicmVmbGVjdGlvbl9vcHMuY2MiLAorICAgICAgICAgICAic2VydmljZS5jYyIsCisgICAgICAgICAgICJ0ZXh0X2Zvcm1hdC5jYyIsCisgICAgICAgICAgICJ1bmtub3duX2ZpZWxkX3NldC5jYyIsCisgICAgICAgICAgICJ3aXJlX2Zvcm1hdC5jYyIsCisgICAgICAgICAgICJpby9nemlwX3N0cmVhbS5jYyIsCisgICAgICAgICAgICJpby9wcmludGVyLmNjIiwKKyAgICAgICAgICAgImlvL3Rva2VuaXplci5jYyIsCisgICAgICAgICAgICJpby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MiLAorICAgICAgICAgICAiY29tcGlsZXIvaW1wb3J0ZXIuY2MiLAorICAgICAgICAgICAiY29tcGlsZXIvcGFyc2VyLmNjIiBdLAorICBkZXBzID0gWyBwcm90b2J1Zl9saXRlLAorICAgICAgICAgICBfY3BwLlN5c3RlbUxpYnJhcnkobmFtZSA9ICJ6IikgXSkKKworbGlicHJvdG9jID0gX2NwcC5MaWJyYXJ5KAorICBuYW1lID0gInByb3RvYyIsCisgIHNyY3MgPSBbICJjb21waWxlci9jb2RlX2dlbmVyYXRvci5jYyIsCisgICAgICAgICAgICJjb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2NwcC9jcHBfZW51bS5jYyIsCisgICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX2VudW0uaCIsCisgICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuY2MiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmgiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaCIsCisgICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2NwcC9jcHBfZmllbGQuaCIsCisgICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX2ZpbGUuY2MiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9maWxlLmgiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuY2MiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5jYyIsCisgICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaCIsCisgICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuY2MiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmgiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaCIsCisgICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmgiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MiLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuaCIsCisgICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfZW51bS5jYyIsCisgICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfZW51bS5oIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmgiLAorICAgICAgICAgICAiY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5jYyIsCisgICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmgiLAorICAgICAgICAgICAiY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9maWxlLmNjIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9maWxlLmgiLAorICAgICAgICAgICAiY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYyIsCisgICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYyIsCisgICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmNjIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmgiLAorICAgICAgICAgICAiY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MiLAorICAgICAgICAgICAiY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuaCIsCisgICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaCIsCisgICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfc2VydmljZS5jYyIsCisgICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfc2VydmljZS5oIiwKKyAgICAgICAgICAgImNvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjIiBdLAorICBkZXBzID0gWyBwcm90b2J1ZiBdKQorCitwcm90b2MgPSBfY3BwLkJpbmFyeSgKKyAgbmFtZSA9ICJwcm90b2MiLAorICBzcmNzID0gWyAiY29tcGlsZXIvbWFpbi5jYyIgXSwKKyAgZGVwcyA9IFsgbGlicHJvdG9jIF0pCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUHJvdG9idWZMaWJyYXJ5IHJ1bGUgY2xhc3MKKworY2xhc3MgUHJvdG9idWZMaWJyYXJ5KHNlYnMuUnVsZSk6CisgIGFyZ3VtZW50X3NwZWMgPSBzZWJzLkFyZ3VtZW50U3BlYyhzcmNzID0gW3NlYnMuQXJ0aWZhY3RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IChbc2Vicy5SdWxlXSwgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl0ZSA9IChib29sLCBGYWxzZSkpCisKKyAgZGVmIF9leHBhbmQoc2VsZiwgYXJncyk6CisgICAgZm9yIGRlcCBpbiBhcmdzLmRlcHM6CisgICAgICBpZiBub3QgaXNpbnN0YW5jZShkZXAsIFByb3RvYnVmTGlicmFyeSk6CisgICAgICAgIHJhaXNlIHNlYnMuRGVmaW5pdGlvbkVycm9yKAorICAgICAgICAgICJEZXBlbmRlbmN5IG9mIFByb3RvYnVmTGlicmFyeSBpcyBub3QgYSBQcm90b2J1ZkxpYnJhcnk6ICVzIiAlIGRlcCkKKworICAgIHByb3RvYy5leHBhbmRfb25jZSgpCisKKyAgICAjIFdlIG11c3QgYnVpbGQgcHJvdG9jIGZvciB0aGUgaG9zdCBjb25maWd1cmF0aW9uIHRvIGFsbG93IGNyb3NzLWNvbXBpbGluZy4KKyAgICBob3N0X3Byb3RvYyA9IHNlbGYuY29udGV4dC5jb25maWd1cmVkX2FydGlmYWN0KHByb3RvYy5iaW5hcnksICJob3N0IikKKworICAgIHByb3RvY19hY3Rpb24gPSBzZWxmLmNvbnRleHQuYWN0aW9uKHNlbGYsICJwcm90b2J1ZiIpCisgICAgcHJvdG9jX2FyZ3MgPSBbaG9zdF9wcm90b2MsICItSXNyYyIsICItSXRtcCIsICItSWluY2x1ZGUiLCItLWNwcF9vdXQ9dG1wIl0KKworICAgIGNwcF9zcmNzID0gW10KKyAgICBmb3Igc3JjIGluIGFyZ3Muc3JjczoKKyAgICAgIHByb3RvY19hcmdzLmFwcGVuZChzcmMpCisKKyAgICAgICMgV2UgY2Fubm90IGJ1aWxkIC5wcm90byBmaWxlcyBmcm9tIG90aGVyIHBhY2thZ2VzIGJlY2F1c2UgdGhlIC5wYi5jYworICAgICAgIyBhbmQgLnBiLmggZmlsZXMgd291bGQgYmUgd3JpdHRlbiB0byB0aGF0IHBhY2thZ2UsIGFuZCB3ZSBhcmVuJ3QgYWxsb3dlZAorICAgICAgIyB0byB3cml0ZSB0byBvdGhlciBwYWNrYWdlcy4KKyAgICAgIGlmIHNlbGYuY29udGV4dC5sb2NhbF9maWxlbmFtZShzcmMpIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIHNlYnMuRGVmaW5pdGlvbkVycm9yKAorICAgICAgICAgICJTb3VyY2UgZmlsZSBpcyBub3QgaW4gdGhpcyBwYWNrYWdlOiAlcyIgJSBzcmMpCisKKyAgICAgIGNjX2FydGlmYWN0ID0gc2VsZi5jb250ZXh0LmRlcml2ZWRfYXJ0aWZhY3Qoc3JjLCAiLnBiLmNjIiwgcHJvdG9jX2FjdGlvbikKKyAgICAgIGhlYWRlcl9hcnRpZmFjdCA9IHNlbGYuY29udGV4dC5kZXJpdmVkX2FydGlmYWN0KAorICAgICAgICAgIHNyYywgIi5wYi5oIiwgcHJvdG9jX2FjdGlvbikKKworICAgICAgY3BwX3NyY3MuYXBwZW5kKGNjX2FydGlmYWN0KQorICAgICAgY3BwX3NyY3MuYXBwZW5kKGhlYWRlcl9hcnRpZmFjdCkKKworICAgIHByb3RvY19hY3Rpb24uc2V0X2NvbW1hbmQoCisgICAgICBzZWJzLlN1YnByb2Nlc3NDb21tYW5kKHByb3RvY19hY3Rpb24sIHByb3RvY19hcmdzLCBpbXBsaWNpdCA9IGNwcF9zcmNzKSkKKworICAgIGRlcHMgPSBsaXN0KGFyZ3MuZGVwcykKKyAgICBpZiBhcmdzLmxpdGU6CisgICAgICBkZXBzLmFwcGVuZChwcm90b2J1Zl9saXRlKQorICAgIGVsc2U6CisgICAgICBkZXBzLmFwcGVuZChwcm90b2J1ZikKKworICAgIHNlbGYuX19jcHBfbGlicmFyeSA9IF9jcHAuTGlicmFyeShzcmNzID0gY3BwX3NyY3MsIGRlcHMgPSBkZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gc2VsZi5jb250ZXh0KQorICAgIHNlbGYuX19jcHBfbGlicmFyeS5sYWJlbCA9IHNlbGYubGFiZWwKKyAgICBzZWxmLm91dHB1dHMgPSBbXQorCisgIGRlZiBhc19jcHBfbGlicmFyeShzZWxmKToKKyAgICBzZWxmLmV4cGFuZF9vbmNlKCkKKyAgICByZXR1cm4gc2VsZi5fX2NwcF9saWJyYXJ5CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgVGVzdHMKKworX2xpdGVfdGVzdF9wcm90b3MgPSBQcm90b2J1ZkxpYnJhcnkoCisgIHNyY3MgPSBbICJ1bml0dGVzdF9saXRlLnByb3RvIiwKKyAgICAgICAgICAgInVuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvIiBdLAorICBsaXRlID0gVHJ1ZSkKK190ZXN0X3Byb3RvcyA9IFByb3RvYnVmTGlicmFyeSgKKyAgc3JjcyA9IFsgInVuaXR0ZXN0LnByb3RvIiwKKyAgICAgICAgICAgInVuaXR0ZXN0X2VtcHR5LnByb3RvIiwKKyAgICAgICAgICAgInVuaXR0ZXN0X2ltcG9ydC5wcm90byIsCisgICAgICAgICAgICJ1bml0dGVzdF9tc2V0LnByb3RvIiwKKyAgICAgICAgICAgInVuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byIsCisgICAgICAgICAgICJ1bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8iLAorICAgICAgICAgICAidW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8iLAorICAgICAgICAgICAidW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8iLAorICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byIgXSwKKyAgZGVwcyA9IFsgX2xpdGVfdGVzdF9wcm90b3MgXSkKKworX3Rlc3RfdXRpbCA9IF9jcHAuTGlicmFyeSgKKyAgbmFtZSA9ICJ0ZXN0X3V0aWwiLAorICBzcmNzID0gWyAidGVzdF91dGlsLmNjIiwKKyAgICAgICAgICAgInRlc3RfdXRpbC5oIiwKKyAgICAgICAgICAgInRlc3RpbmcvZ29vZ2xldGVzdC5jYyIsCisgICAgICAgICAgICJ0ZXN0aW5nL2dvb2dsZXRlc3QuaCIsCisgICAgICAgICAgICJ0ZXN0aW5nL2ZpbGUuY2MiLAorICAgICAgICAgICAidGVzdGluZy9maWxlLmgiIF0sCisgIGRlcHMgPSBbIHByb3RvYnVmLCBfdGVzdF9wcm90b3MsIF9jcHAuU3lzdGVtTGlicmFyeShuYW1lID0gImd0ZXN0IildICkKKworcHJvdG9idWZfbGl0ZV90ZXN0ID0gX2NwcC5UZXN0KAorICBzcmNzID0gWyAibGl0ZV91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJ0ZXN0X3V0aWxfbGl0ZS5jYyIsCisgICAgICAgICAgICJ0ZXN0X3V0aWxfbGl0ZS5oIiBdLAorICBkZXBzID0gWyBfbGl0ZV90ZXN0X3Byb3RvcyBdKQorCitwcm90b2J1Zl90ZXN0ID0gX2NwcC5UZXN0KAorICBzcmNzID0gWyAic3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjIiwKKyAgICAgICAgICAgInN0dWJzL29uY2VfdW5pdHRlc3QuY2MiLAorICAgICAgICAgICAic3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJzdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MiLAorICAgICAgICAgICAiZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJkZXNjcmlwdG9yX3VuaXR0ZXN0LmNjIiwKKyAgICAgICAgICAgImR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJleHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjIiwKKyAgICAgICAgICAgImdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MiLAorICAgICAgICAgICAibWVzc2FnZV91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJyZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyIsCisgICAgICAgICAgICJyZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJ0ZXh0X2Zvcm1hdF91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJ1bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJ3aXJlX2Zvcm1hdF91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJpby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MiLAorICAgICAgICAgICAiaW8vcHJpbnRlcl91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJpby90b2tlbml6ZXJfdW5pdHRlc3QuY2MiLAorICAgICAgICAgICAiaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJjb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjIiwKKyAgICAgICAgICAgImNvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjIiwKKyAgICAgICAgICAgImNvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5jYyIsCisgICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjIiBdLAorICBkZXBzID0gWyBwcm90b2J1ZiwgbGlicHJvdG9jLCBfdGVzdF91dGlsLAorICAgICAgICAgICBfY3BwLlN5c3RlbUxpYnJhcnkobmFtZSA9ICJndGVzdF9tYWluIikgXSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1YzIzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsODAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworQ29kZUdlbmVyYXRvcjo6fkNvZGVHZW5lcmF0b3IoKSB7fQorR2VuZXJhdG9yQ29udGV4dDo6fkdlbmVyYXRvckNvbnRleHQoKSB7fQorCitpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIEdlbmVyYXRvckNvbnRleHQ6Ok9wZW5Gb3JJbnNlcnQoCisgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQpIHsKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRoaXMgR2VuZXJhdG9yQ29udGV4dCBkb2VzIG5vdCBzdXBwb3J0IGluc2VydGlvbi4iOworICByZXR1cm4gTlVMTDsgIC8vIG1ha2UgY29tcGlsZXIgaGFwcHkKK30KKwordm9pZCBHZW5lcmF0b3JDb250ZXh0OjpMaXN0UGFyc2VkRmlsZXMoCisgICAgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4qIG91dHB1dCkgeworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGhpcyBHZW5lcmF0b3JDb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgTGlzdFBhcnNlZEZpbGVzIjsKK30KKworLy8gUGFyc2VzIGEgc2V0IG9mIGNvbW1hLWRlbGltaXRlZCBuYW1lL3ZhbHVlIHBhaXJzLgordm9pZCBQYXJzZUdlbmVyYXRvclBhcmFtZXRlcihjb25zdCBzdHJpbmcmIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPiA+KiBvdXRwdXQpIHsKKyAgdmVjdG9yPHN0cmluZz4gcGFydHM7CisgIFNwbGl0U3RyaW5nVXNpbmcodGV4dCwgIiwiLCAmcGFydHMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpOyBpKyspIHsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBlcXVhbHNfcG9zID0gcGFydHNbaV0uZmluZF9maXJzdF9vZignPScpOworICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+IHZhbHVlOworICAgIGlmIChlcXVhbHNfcG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgdmFsdWUuZmlyc3QgPSBwYXJ0c1tpXTsKKyAgICAgIHZhbHVlLnNlY29uZCA9ICIiOworICAgIH0gZWxzZSB7CisgICAgICB2YWx1ZS5maXJzdCA9IHBhcnRzW2ldLnN1YnN0cigwLCBlcXVhbHNfcG9zKTsKKyAgICAgIHZhbHVlLnNlY29uZCA9IHBhcnRzW2ldLnN1YnN0cihlcXVhbHNfcG9zICsgMSk7CisgICAgfQorICAgIG91dHB1dC0+cHVzaF9iYWNrKHZhbHVlKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyZjY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIERlZmluZXMgdGhlIGFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBlYWNoIG9mIHRoZSBsYW5ndWFnZS1zcGVjaWZpYworLy8gY29kZSBnZW5lcmF0b3JzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DT0RFX0dFTkVSQVRPUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NPREVfR0VORVJBVE9SX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgaW8geyBjbGFzcyBaZXJvQ29weU91dHB1dFN0cmVhbTsgfQorY2xhc3MgRmlsZURlc2NyaXB0b3I7CisKK25hbWVzcGFjZSBjb21waWxlciB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgQ29kZUdlbmVyYXRvcjsKK2NsYXNzIEdlbmVyYXRvckNvbnRleHQ7CisKKy8vIFRoZSBhYnN0cmFjdCBpbnRlcmZhY2UgdG8gYSBjbGFzcyB3aGljaCBnZW5lcmF0ZXMgY29kZSBpbXBsZW1lbnRpbmcgYQorLy8gcGFydGljdWxhciBwcm90byBmaWxlIGluIGEgcGFydGljdWxhciBsYW5ndWFnZS4gIEEgbnVtYmVyIG9mIHRoZXNlIG1heQorLy8gYmUgcmVnaXN0ZXJlZCB3aXRoIENvbW1hbmRMaW5lSW50ZXJmYWNlIHRvIHN1cHBvcnQgdmFyaW91cyBsYW5ndWFnZXMuCitjbGFzcyBMSUJQUk9UT0NfRVhQT1JUIENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgaW5saW5lIENvZGVHZW5lcmF0b3IoKSB7fQorICB2aXJ0dWFsIH5Db2RlR2VuZXJhdG9yKCk7CisKKyAgLy8gR2VuZXJhdGVzIGNvZGUgZm9yIHRoZSBnaXZlbiBwcm90byBmaWxlLCBnZW5lcmF0aW5nIG9uZSBvciBtb3JlIGZpbGVzIGluCisgIC8vIHRoZSBnaXZlbiBvdXRwdXQgZGlyZWN0b3J5LgorICAvLworICAvLyBBIHBhcmFtZXRlciB0byBiZSBwYXNzZWQgdG8gdGhlIGdlbmVyYXRvciBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZQorICAvLyBjb21tYW5kIGxpbmUuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgSmF2YSBhbmQgc2ltaWxhciBsYW5ndWFnZXMKKyAgLy8gdG8gc3BlY2lmeSB3aGljaCBzcGVjaWZpYyBjbGFzcyBmcm9tIHRoZSBwcm90byBmaWxlIGlzIHRvIGJlIGdlbmVyYXRlZCwKKyAgLy8gdGhvdWdoIGl0IGNvdWxkIGhhdmUgb3RoZXIgdXNlcyBhcyB3ZWxsLiAgSXQgaXMgZW1wdHkgaWYgbm8gcGFyYW1ldGVyIHdhcworICAvLyBnaXZlbi4KKyAgLy8KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuICBPdGhlcndpc2UsIHNldHMgKmVycm9yIHRvIGEgZGVzY3JpcHRpb24gb2YKKyAgLy8gdGhlIHByb2JsZW0gKGUuZy4gImludmFsaWQgcGFyYW1ldGVyIikgYW5kIHJldHVybnMgZmFsc2UuCisgIHZpcnR1YWwgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdCA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29kZUdlbmVyYXRvcik7Cit9OworCisvLyBDb2RlR2VuZXJhdG9ycyBnZW5lcmF0ZSBvbmUgb3IgbW9yZSBmaWxlcyBpbiBhIGdpdmVuIGRpcmVjdG9yeS4gIFRoaXMKKy8vIGFic3RyYWN0IGludGVyZmFjZSByZXByZXNlbnRzIHRoZSBkaXJlY3RvcnkgdG8gd2hpY2ggdGhlIENvZGVHZW5lcmF0b3IgaXMKKy8vIHRvIHdyaXRlIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgR2VuZXJhdG9yCisvLyBydW5zLgorY2xhc3MgTElCUFJPVE9DX0VYUE9SVCBHZW5lcmF0b3JDb250ZXh0IHsKKyBwdWJsaWM6CisgIGlubGluZSBHZW5lcmF0b3JDb250ZXh0KCkge30KKyAgdmlydHVhbCB+R2VuZXJhdG9yQ29udGV4dCgpOworCisgIC8vIE9wZW5zIHRoZSBnaXZlbiBmaWxlLCB0cnVuY2F0aW5nIGl0IGlmIGl0IGV4aXN0cywgYW5kIHJldHVybnMgYQorICAvLyBaZXJvQ29weU91dHB1dFN0cmVhbSB0aGF0IHdyaXRlcyB0byB0aGUgZmlsZS4gIFRoZSBjYWxsZXIgdGFrZXMgb3duZXJzaGlwCisgIC8vIG9mIHRoZSByZXR1cm5lZCBvYmplY3QuICBUaGlzIG1ldGhvZCBuZXZlciBmYWlscyAoYSBkdW1teSBzdHJlYW0gd2lsbCBiZQorICAvLyByZXR1cm5lZCBpbnN0ZWFkKS4KKyAgLy8KKyAgLy8gVGhlIGZpbGVuYW1lIGdpdmVuIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisgIC8vIEUuZy4gdGhlIEMrKyBnZW5lcmF0b3IsIHdoZW4gZ2VuZXJhdGluZyBjb2RlIGZvciAiZm9vL2Jhci5wcm90byIsIHdpbGwKKyAgLy8gZ2VuZXJhdGUgdGhlIGZpbGVzICJmb28vYmFyLnBiLmgiIGFuZCAiZm9vL2Jhci5wYi5jYyI7IG5vdGUgdGhhdAorICAvLyAiZm9vLyIgaXMgaW5jbHVkZWQgaW4gdGhlc2UgZmlsZW5hbWVzLiAgVGhlIGZpbGVuYW1lIGlzIG5vdCBhbGxvd2VkIHRvCisgIC8vIGNvbnRhaW4gIi4iIG9yICIuLiIgY29tcG9uZW50cy4KKyAgdmlydHVhbCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgPSAwOworCisgIC8vIENyZWF0ZXMgYSBaZXJvQ29weU91dHB1dFN0cmVhbSB3aGljaCB3aWxsIGluc2VydCBjb2RlIGludG8gdGhlIGdpdmVuIGZpbGUKKyAgLy8gYXQgdGhlIGdpdmVuIGluc2VydGlvbiBwb2ludC4gIFNlZSBwbHVnaW4ucHJvdG8gKHBsdWdpbi5wYi5oKSBmb3IgbW9yZQorICAvLyBpbmZvcm1hdGlvbiBvbiBpbnNlcnRpb24gcG9pbnRzLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgLy8gYXNzZXJ0LWZhaWxzIC0tIGl0IGV4aXN0cyBvbmx5IGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4KKyAgLy8KKyAgLy8gV0FSTklORzogIFRoaXMgZmVhdHVyZSBpcyBjdXJyZW50bHkgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgdmlydHVhbCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW5Gb3JJbnNlcnQoCisgICAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCk7CisKKyAgLy8gUmV0dXJucyBhIHZlY3RvciBvZiBGaWxlRGVzY3JpcHRvcnMgZm9yIGFsbCB0aGUgZmlsZXMgYmVpbmcgY29tcGlsZWQKKyAgLy8gaW4gdGhpcyBydW4uICBVc2VmdWwgZm9yIGxhbmd1YWdlcywgc3VjaCBhcyBHbywgdGhhdCB0cmVhdCBmaWxlcworICAvLyBkaWZmZXJlbnRseSB3aGVuIGNvbXBpbGVkIGFzIGEgc2V0IHJhdGhlciB0aGFuIGluZGl2aWR1YWxseS4KKyAgdmlydHVhbCB2b2lkIExpc3RQYXJzZWRGaWxlcyh2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiogb3V0cHV0KTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHZW5lcmF0b3JDb250ZXh0KTsKK307CisKKy8vIFRoZSB0eXBlIEdlbmVyYXRvckNvbnRleHQgd2FzIG9uY2UgY2FsbGVkIE91dHB1dERpcmVjdG9yeS4gVGhpcyB0eXBlZGVmCisvLyBwcm92aWRlcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgordHlwZWRlZiBHZW5lcmF0b3JDb250ZXh0IE91dHB1dERpcmVjdG9yeTsKKworLy8gU2V2ZXJhbCBjb2RlIGdlbmVyYXRvcnMgdHJlYXQgdGhlIHBhcmFtZXRlciBhcmd1bWVudCBhcyBob2xkaW5nIGEKKy8vIGxpc3Qgb2Ygb3B0aW9ucyBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgVGhpcyBoZWxwZXIgZnVuY3Rpb24gcGFyc2VzCisvLyBhIHNldCBvZiBjb21tYS1kZWxpbWl0ZWQgbmFtZS92YWx1ZSBwYWlyczogZS5nLiwKKy8vICAgImZvbz1iYXIsYmF6LHF1eD1jb3JnZSIKKy8vIHBhcnNlcyB0byB0aGUgcGFpcnM6CisvLyAgICgiZm9vIiwgImJhciIpLCAoImJheiIsICIiKSwgKCJxdXgiLCAiY29yZ2UiKQorZXh0ZXJuIHZvaWQgUGFyc2VHZW5lcmF0b3JQYXJhbWV0ZXIoY29uc3Qgc3RyaW5nJiwKKyAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPiA+Kik7CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NPREVfR0VORVJBVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViZTliNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSwxMzU3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8ZGlyZWN0Lmg+CisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworI2lmIGRlZmluZWQoX1dJTjMyKQorI2RlZmluZSBta2RpcihuYW1lLCBtb2RlKSBta2RpcihuYW1lKQorI2lmbmRlZiBXX09LCisjZGVmaW5lIFdfT0sgMDIgIC8vIG5vdCBkZWZpbmVkIGJ5IE1TVkMgZm9yIHdoYXRldmVyIHJlYXNvbgorI2VuZGlmCisjaWZuZGVmIEZfT0sKKyNkZWZpbmUgRl9PSyAwMCAgLy8gbm90IGRlZmluZWQgYnkgTVNWQyBmb3Igd2hhdGV2ZXIgcmVhc29uCisjZW5kaWYKKyNpZm5kZWYgU1RESU5fRklMRU5PCisjZGVmaW5lIFNURElOX0ZJTEVOTyAwCisjZW5kaWYKKyNpZm5kZWYgU1RET1VUX0ZJTEVOTworI2RlZmluZSBTVERPVVRfRklMRU5PIDEKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT19CSU5BUlkKKyNpZmRlZiBfT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgX09fQklOQVJZCisjZWxzZQorI2RlZmluZSBPX0JJTkFSWSAwICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IG5lZWQgaXQuCisjZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2UgeworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorc3RhdGljIGNvbnN0IGNoYXIqIGtQYXRoU2VwYXJhdG9yID0gIjsiOworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyKiBrUGF0aFNlcGFyYXRvciA9ICI6IjsKKyNlbmRpZgorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgbG9va3MgbGlrZSBhIFdpbmRvd3Mtc3R5bGUgYWJzb2x1dGUgcGF0aCwgc3RhcnRpbmcKKy8vIHdpdGggYSBkcml2ZSBsZXR0ZXIuICBFeGFtcGxlOiAgIkM6XGZvbyIuICBUT0RPKGtlbnRvbik6ICBTaGFyZSB0aGlzIHdpdGgKKy8vIGNvcHkgaW4gaW1wb3J0ZXIuY2M/CitzdGF0aWMgYm9vbCBJc1dpbmRvd3NBYnNvbHV0ZVBhdGgoY29uc3Qgc3RyaW5nJiB0ZXh0KSB7CisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyAgcmV0dXJuIHRleHQuc2l6ZSgpID49IDMgJiYgdGV4dFsxXSA9PSAnOicgJiYKKyAgICAgICAgIGlzYWxwaGEodGV4dFswXSkgJiYKKyAgICAgICAgICh0ZXh0WzJdID09ICcvJyB8fCB0ZXh0WzJdID09ICdcXCcpICYmCisgICAgICAgICB0ZXh0LmZpbmRfbGFzdF9vZignOicpID09IDE7CisjZWxzZQorICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwordm9pZCBTZXRGZFRvVGV4dE1vZGUoaW50IGZkKSB7CisjaWZkZWYgX1dJTjMyCisgIGlmIChfc2V0bW9kZShmZCwgX09fVEVYVCkgPT0gLTEpIHsKKyAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIEkgdGhpbmsuCisgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiX3NldG1vZGUoIiA8PCBmZCA8PCAiLCBfT19URVhUKTogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgIH0KKyNlbmRpZgorICAvLyAoVGV4dCBhbmQgYmluYXJ5IGFyZSB0aGUgc2FtZSBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuKQorfQorCit2b2lkIFNldEZkVG9CaW5hcnlNb2RlKGludCBmZCkgeworI2lmZGVmIF9XSU4zMgorICBpZiAoX3NldG1vZGUoZmQsIF9PX0JJTkFSWSkgPT0gLTEpIHsKKyAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIEkgdGhpbmsuCisgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiX3NldG1vZGUoIiA8PCBmZCA8PCAiLCBfT19CSU5BUlkpOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKKyAgfQorI2VuZGlmCisgIC8vIChUZXh0IGFuZCBiaW5hcnkgYXJlIHRoZSBzYW1lIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4pCit9CisKK3ZvaWQgQWRkVHJhaWxpbmdTbGFzaChzdHJpbmcqIHBhdGgpIHsKKyAgaWYgKCFwYXRoLT5lbXB0eSgpICYmIHBhdGgtPmF0KHBhdGgtPnNpemUoKSAtIDEpICE9ICcvJykgeworICAgIHBhdGgtPnB1c2hfYmFjaygnLycpOworICB9Cit9CisKK2Jvb2wgVmVyaWZ5RGlyZWN0b3J5RXhpc3RzKGNvbnN0IHN0cmluZyYgcGF0aCkgeworICBpZiAocGF0aC5lbXB0eSgpKSByZXR1cm4gdHJ1ZTsKKworICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgV19PSykgPT0gLTEpIHsKKyAgICBjZXJyIDw8IHBhdGggPDwgIjogIiA8PCBzdHJlcnJvcihlcnJubykgPDwgZW5kbDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKworLy8gVHJ5IHRvIGNyZWF0ZSB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZ2l2ZW4gZmlsZSwgY3JlYXRpbmcgdGhlIHBhcmVudCdzCisvLyBwYXJlbnQgaWYgbmVjZXNzYXJ5LCBhbmQgc28gb24uICBUaGUgZnVsbCBmaWxlIG5hbWUgaXMgYWN0dWFsbHkKKy8vIChwcmVmaXggKyBmaWxlbmFtZSksIGJ1dCB3ZSBhc3N1bWUgfHByZWZpeHwgYWxyZWFkeSBleGlzdHMgYW5kIG9ubHkgY3JlYXRlCisvLyBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gfGZpbGVuYW1lfC4KK2Jvb2wgVHJ5Q3JlYXRlUGFyZW50RGlyZWN0b3J5KGNvbnN0IHN0cmluZyYgcHJlZml4LCBjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgIC8vIFJlY3Vyc2l2ZWx5IGNyZWF0ZSBwYXJlbnQgZGlyZWN0b3JpZXMgdG8gdGhlIG91dHB1dCBmaWxlLgorICB2ZWN0b3I8c3RyaW5nPiBwYXJ0czsKKyAgU3BsaXRTdHJpbmdVc2luZyhmaWxlbmFtZSwgIi8iLCAmcGFydHMpOworICBzdHJpbmcgcGF0aF9zb19mYXIgPSBwcmVmaXg7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpIC0gMTsgaSsrKSB7CisgICAgcGF0aF9zb19mYXIgKz0gcGFydHNbaV07CisgICAgaWYgKG1rZGlyKHBhdGhfc29fZmFyLmNfc3RyKCksIDA3NzcpICE9IDApIHsKKyAgICAgIGlmIChlcnJubyAhPSBFRVhJU1QpIHsKKyAgICAgICAgY2VyciA8PCBmaWxlbmFtZSA8PCAiOiB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgPDwgcGF0aF9zb19mYXIgPDwgIjogIiA8PCBzdHJlcnJvcihlcnJubykgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBwYXRoX3NvX2ZhciArPSAnLyc7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIEEgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgdGhhdCBwcmludHMgZXJyb3JzIHRvIHN0ZGVyci4KK2NsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFcnJvclByaW50ZXIgOiBwdWJsaWMgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGlvOjpFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBFcnJvclByaW50ZXIoRXJyb3JGb3JtYXQgZm9ybWF0LCBEaXNrU291cmNlVHJlZSAqdHJlZSA9IE5VTEwpCisgICAgOiBmb3JtYXRfKGZvcm1hdCksIHRyZWVfKHRyZWUpIHt9CisgIH5FcnJvclByaW50ZXIoKSB7fQorCisgIC8vIGltcGxlbWVudHMgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisKKyAgICAvLyBQcmludCBmdWxsIHBhdGggd2hlbiBydW5uaW5nIHVuZGVyIE1TVlMKKyAgICBzdHJpbmcgZGZpbGU7CisgICAgaWYgKGZvcm1hdF8gPT0gQ29tbWFuZExpbmVJbnRlcmZhY2U6OkVSUk9SX0ZPUk1BVF9NU1ZTICYmCisgICAgICAgIHRyZWVfICE9IE5VTEwgJiYKKyAgICAgICAgdHJlZV8tPlZpcnR1YWxGaWxlVG9EaXNrRmlsZShmaWxlbmFtZSwgJmRmaWxlKSkgeworICAgICAgY2VyciA8PCBkZmlsZTsKKyAgICB9IGVsc2UgeworICAgICAgY2VyciA8PCBmaWxlbmFtZTsKKyAgICB9CisKKyAgICAvLyBVc2VycyB0eXBpY2FsbHkgZXhwZWN0IDEtYmFzZWQgbGluZS9jb2x1bW4gbnVtYmVycywgc28gd2UgYWRkIDEKKyAgICAvLyB0byBlYWNoIGhlcmUuCisgICAgaWYgKGxpbmUgIT0gLTEpIHsKKyAgICAgIC8vIEFsbG93IGZvciBib3RoIEdDQy0gYW5kIFZpc3VhbC1TdHVkaW8tY29tcGF0aWJsZSBvdXRwdXQuCisgICAgICBzd2l0Y2ggKGZvcm1hdF8pIHsKKyAgICAgICAgY2FzZSBDb21tYW5kTGluZUludGVyZmFjZTo6RVJST1JfRk9STUFUX0dDQzoKKyAgICAgICAgICBjZXJyIDw8ICI6IiA8PCAobGluZSArIDEpIDw8ICI6IiA8PCAoY29sdW1uICsgMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkVSUk9SX0ZPUk1BVF9NU1ZTOgorICAgICAgICAgIGNlcnIgPDwgIigiIDw8IChsaW5lICsgMSkgPDwgIikgOiBlcnJvciBpbiBjb2x1bW49IiA8PCAoY29sdW1uICsgMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgY2VyciA8PCAiOiAiIDw8IG1lc3NhZ2UgPDwgZW5kbDsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgaW86OkVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIEFkZEVycm9yKCJpbnB1dCIsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IEVycm9yRm9ybWF0IGZvcm1hdF87CisgIERpc2tTb3VyY2VUcmVlICp0cmVlXzsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQSBHZW5lcmF0b3JDb250ZXh0IGltcGxlbWVudGF0aW9uIHRoYXQgYnVmZmVycyBmaWxlcyBpbiBtZW1vcnksIHRoZW4gZHVtcHMKKy8vIHRoZW0gYWxsIHRvIGRpc2sgb24gZGVtYW5kLgorY2xhc3MgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRvckNvbnRleHRJbXBsIDogcHVibGljIEdlbmVyYXRvckNvbnRleHQgeworIHB1YmxpYzoKKyAgR2VuZXJhdG9yQ29udGV4dEltcGwoY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIHBhcnNlZF9maWxlcyk7CisgIH5HZW5lcmF0b3JDb250ZXh0SW1wbCgpOworCisgIC8vIFdyaXRlIGFsbCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHRvIGRpc2sgYXQgdGhlIGdpdmVuIG91dHB1dCBsb2NhdGlvbiwKKyAgLy8gd2hpY2ggbXVzdCBlbmQgaW4gYSAnLycuCisgIGJvb2wgV3JpdGVBbGxUb0Rpc2soY29uc3Qgc3RyaW5nJiBwcmVmaXgpOworCisgIC8vIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeSB0byBhIFpJUC1mb3JtYXQgYXJjaGl2ZSB3aXRoIHRoZQorICAvLyBnaXZlbiBuYW1lLgorICBib29sIFdyaXRlQWxsVG9aaXAoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisKKyAgLy8gQWRkIGEgYm9pbGVycGxhdGUgTUVUQS1JTkYvTUFOSUZFU1QuTUYgZmlsZSBhcyByZXF1aXJlZCBieSB0aGUgSmF2YSBKQVIKKyAgLy8gZm9ybWF0LCB1bmxlc3Mgb25lIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbi4KKyAgdm9pZCBBZGRKYXJNYW5pZmVzdCgpOworCisgIC8vIGltcGxlbWVudHMgR2VuZXJhdG9yQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3BlbkZvckluc2VydCgKKyAgICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9uX3BvaW50KTsKKyAgdm9pZCBMaXN0UGFyc2VkRmlsZXModmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4qIG91dHB1dCkgeworICAgICpvdXRwdXQgPSBwYXJzZWRfZmlsZXNfOworICB9CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgTWVtb3J5T3V0cHV0U3RyZWFtOworCisgIC8vIG1hcCBpbnN0ZWFkIG9mIGhhc2hfbWFwIHNvIHRoYXQgZmlsZXMgYXJlIHdyaXR0ZW4gaW4gb3JkZXIgKGdvb2Qgd2hlbgorICAvLyB3cml0aW5nIHppcHMpLgorICBtYXA8c3RyaW5nLCBzdHJpbmcqPiBmaWxlc187CisgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXNfOworICBib29sIGhhZF9lcnJvcl87Cit9OworCitjbGFzcyBDb21tYW5kTGluZUludGVyZmFjZTo6TWVtb3J5T3V0cHV0U3RyZWFtCisgICAgOiBwdWJsaWMgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIE1lbW9yeU91dHB1dFN0cmVhbShHZW5lcmF0b3JDb250ZXh0SW1wbCogZGlyZWN0b3J5LCBjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKKyAgTWVtb3J5T3V0cHV0U3RyZWFtKEdlbmVyYXRvckNvbnRleHRJbXBsKiBkaXJlY3RvcnksIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCk7CisgIHZpcnR1YWwgfk1lbW9yeU91dHB1dFN0cmVhbSgpOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZpcnR1YWwgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsgcmV0dXJuIGlubmVyXy0+TmV4dChkYXRhLCBzaXplKTsgfQorICB2aXJ0dWFsIHZvaWQgQmFja1VwKGludCBjb3VudCkgICAgICAgICAgICB7ICAgICAgICBpbm5lcl8tPkJhY2tVcChjb3VudCk7ICAgIH0KKyAgdmlydHVhbCBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdCAgICAgICAgICAgeyByZXR1cm4gaW5uZXJfLT5CeXRlQ291bnQoKTsgICAgICB9CisKKyBwcml2YXRlOgorICAvLyBXaGVyZSB0byBpbnNlcnQgdGhlIHN0cmluZyB3aGVuIGl0J3MgZG9uZS4KKyAgR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeV87CisgIHN0cmluZyBmaWxlbmFtZV87CisgIHN0cmluZyBpbnNlcnRpb25fcG9pbnRfOworCisgIC8vIFRoZSBzdHJpbmcgd2UncmUgYnVpbGRpbmcuCisgIHN0cmluZyBkYXRhXzsKKworICAvLyBTdHJpbmdPdXRwdXRTdHJlYW0gd3JpdGluZyB0byBkYXRhXy4KKyAgc2NvcGVkX3B0cjxpbzo6U3RyaW5nT3V0cHV0U3RyZWFtPiBpbm5lcl87Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6R2VuZXJhdG9yQ29udGV4dEltcGwoCisgICAgY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIHBhcnNlZF9maWxlcykKKyAgICA6IHBhcnNlZF9maWxlc18ocGFyc2VkX2ZpbGVzKSwKKyAgICAgIGhhZF9lcnJvcl8oZmFsc2UpIHsKK30KKworQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRvckNvbnRleHRJbXBsOjp+R2VuZXJhdG9yQ29udGV4dEltcGwoKSB7CisgIFNUTERlbGV0ZVZhbHVlcygmZmlsZXNfKTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6OldyaXRlQWxsVG9EaXNrKAorICAgIGNvbnN0IHN0cmluZyYgcHJlZml4KSB7CisgIGlmIChoYWRfZXJyb3JfKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFWZXJpZnlEaXJlY3RvcnlFeGlzdHMocHJlZml4KSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZvciAobWFwPHN0cmluZywgc3RyaW5nKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBmaWxlc18uYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IGZpbGVzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgY29uc3Qgc3RyaW5nJiByZWxhdGl2ZV9maWxlbmFtZSA9IGl0ZXItPmZpcnN0OworICAgIGNvbnN0IGNoYXIqIGRhdGEgPSBpdGVyLT5zZWNvbmQtPmRhdGEoKTsKKyAgICBpbnQgc2l6ZSA9IGl0ZXItPnNlY29uZC0+c2l6ZSgpOworCisgICAgaWYgKCFUcnlDcmVhdGVQYXJlbnREaXJlY3RvcnkocHJlZml4LCByZWxhdGl2ZV9maWxlbmFtZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RyaW5nIGZpbGVuYW1lID0gcHJlZml4ICsgcmVsYXRpdmVfZmlsZW5hbWU7CisKKyAgICAvLyBDcmVhdGUgdGhlIG91dHB1dCBmaWxlLgorICAgIGludCBmaWxlX2Rlc2NyaXB0b3I7CisgICAgZG8geworICAgICAgZmlsZV9kZXNjcmlwdG9yID0KKyAgICAgICAgb3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksIDA2NjYpOworICAgIH0gd2hpbGUgKGZpbGVfZGVzY3JpcHRvciA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgaWYgKGZpbGVfZGVzY3JpcHRvciA8IDApIHsKKyAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgY2VyciA8PCBmaWxlbmFtZSA8PCAiOiAiIDw8IHN0cmVycm9yKGVycm9yKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgZmlsZS4KKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgIGludCB3cml0ZV9yZXN1bHQ7CisgICAgICBkbyB7CisgICAgICAgIHdyaXRlX3Jlc3VsdCA9IHdyaXRlKGZpbGVfZGVzY3JpcHRvciwgZGF0YSwgc2l6ZSk7CisgICAgICB9IHdoaWxlICh3cml0ZV9yZXN1bHQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICAgICAgaWYgKHdyaXRlX3Jlc3VsdCA8PSAwKSB7CisgICAgICAgIC8vIFdyaXRlIGVycm9yLgorCisgICAgICAgIC8vIEZJWE1FKGtlbnRvbik6ICBBY2NvcmRpbmcgdG8gdGhlIG1hbiBwYWdlLCBpZiB3cml0ZSgpIHJldHVybnMgemVybywKKyAgICAgICAgLy8gICB0aGVyZSB3YXMgbm8gZXJyb3I7IHdyaXRlKCkgc2ltcGx5IGRpZCBub3Qgd3JpdGUgYW55dGhpbmcuICBJdCdzCisgICAgICAgIC8vICAgdW5jbGVhciB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhpcyBtaWdodCBoYXBwZW4sIGJ1dCBwcmVzdW1hYmx5CisgICAgICAgIC8vICAgZXJybm8gd29uJ3QgYmUgc2V0IGluIHRoaXMgY2FzZS4gIEkgYW0gY29uZnVzZWQgYXMgdG8gaG93IHN1Y2ggYW4KKyAgICAgICAgLy8gICBldmVudCBzaG91bGQgYmUgaGFuZGxlZC4gIEZvciBub3cgSSdtIHRyZWF0aW5nIGl0IGFzIGFuIGVycm9yLAorICAgICAgICAvLyAgIHNpbmNlIHJldHJ5aW5nIHNlZW1zIGxpa2UgaXQgY291bGQgbGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLiAgSQorICAgICAgICAvLyAgIHN1c3BlY3QgdGhpcyBuZXZlciBhY3R1YWxseSBoYXBwZW5zIGFueXdheS4KKworICAgICAgICBpZiAod3JpdGVfcmVzdWx0IDwgMCkgeworICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgIGNlcnIgPDwgZmlsZW5hbWUgPDwgIjogd3JpdGU6ICIgPDwgc3RyZXJyb3IoZXJyb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNlcnIgPDwgZmlsZW5hbWUgPDwgIjogd3JpdGUoKSByZXR1cm5lZCB6ZXJvPyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGRhdGEgKz0gd3JpdGVfcmVzdWx0OworICAgICAgc2l6ZSAtPSB3cml0ZV9yZXN1bHQ7CisgICAgfQorCisgICAgaWYgKGNsb3NlKGZpbGVfZGVzY3JpcHRvcikgIT0gMCkgeworICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICBjZXJyIDw8IGZpbGVuYW1lIDw8ICI6IGNsb3NlOiAiIDw8IHN0cmVycm9yKGVycm9yKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6OldyaXRlQWxsVG9aaXAoCisgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICBpZiAoaGFkX2Vycm9yXykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUuCisgIGludCBmaWxlX2Rlc2NyaXB0b3I7CisgIGRvIHsKKyAgICBmaWxlX2Rlc2NyaXB0b3IgPQorICAgICAgb3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksIDA2NjYpOworICB9IHdoaWxlIChmaWxlX2Rlc2NyaXB0b3IgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAoZmlsZV9kZXNjcmlwdG9yIDwgMCkgeworICAgIGludCBlcnJvciA9IGVycm5vOworICAgIGNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihlcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQ3JlYXRlIHRoZSBaaXBXcml0ZXIKKyAgaW86OkZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtKGZpbGVfZGVzY3JpcHRvcik7CisgIFppcFdyaXRlciB6aXBfd3JpdGVyKCZzdHJlYW0pOworCisgIGZvciAobWFwPHN0cmluZywgc3RyaW5nKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBmaWxlc18uYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IGZpbGVzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgemlwX3dyaXRlci5Xcml0ZShpdGVyLT5maXJzdCwgKml0ZXItPnNlY29uZCk7CisgIH0KKworICB6aXBfd3JpdGVyLldyaXRlRGlyZWN0b3J5KCk7CisKKyAgaWYgKHN0cmVhbS5HZXRFcnJubygpICE9IDApIHsKKyAgICBjZXJyIDw8IGZpbGVuYW1lIDw8ICI6ICIgPDwgc3RyZXJyb3Ioc3RyZWFtLkdldEVycm5vKCkpIDw8IGVuZGw7CisgIH0KKworICBpZiAoIXN0cmVhbS5DbG9zZSgpKSB7CisgICAgY2VyciA8PCBmaWxlbmFtZSA8PCAiOiAiIDw8IHN0cmVycm9yKHN0cmVhbS5HZXRFcnJubygpKSA8PCBlbmRsOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRvckNvbnRleHRJbXBsOjpBZGRKYXJNYW5pZmVzdCgpIHsKKyAgc3RyaW5nKiogbWFwX3Nsb3QgPSAmZmlsZXNfWyJNRVRBLUlORi9NQU5JRkVTVC5NRiJdOworICBpZiAoKm1hcF9zbG90ID09IE5VTEwpIHsKKyAgICAqbWFwX3Nsb3QgPSBuZXcgc3RyaW5nKAorICAgICAgICAiTWFuaWZlc3QtVmVyc2lvbjogMS4wXG4iCisgICAgICAgICJDcmVhdGVkLUJ5OiAxLjYuMCAocHJvdG9jKVxuIgorICAgICAgICAiXG4iKTsKKyAgfQorfQorCitpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6T3BlbigKKyAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHJldHVybiBuZXcgTWVtb3J5T3V0cHV0U3RyZWFtKHRoaXMsIGZpbGVuYW1lKTsKK30KKworaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKgorQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRvckNvbnRleHRJbXBsOjpPcGVuRm9ySW5zZXJ0KAorICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9uX3BvaW50KSB7CisgIHJldHVybiBuZXcgTWVtb3J5T3V0cHV0U3RyZWFtKHRoaXMsIGZpbGVuYW1lLCBpbnNlcnRpb25fcG9pbnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpNZW1vcnlPdXRwdXRTdHJlYW06Ok1lbW9yeU91dHB1dFN0cmVhbSgKKyAgICBHZW5lcmF0b3JDb250ZXh0SW1wbCogZGlyZWN0b3J5LCBjb25zdCBzdHJpbmcmIGZpbGVuYW1lKQorICAgIDogZGlyZWN0b3J5XyhkaXJlY3RvcnkpLAorICAgICAgZmlsZW5hbWVfKGZpbGVuYW1lKSwKKyAgICAgIGlubmVyXyhuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbSgmZGF0YV8pKSB7Cit9CisKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpNZW1vcnlPdXRwdXRTdHJlYW06Ok1lbW9yeU91dHB1dFN0cmVhbSgKKyAgICBHZW5lcmF0b3JDb250ZXh0SW1wbCogZGlyZWN0b3J5LCBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9uX3BvaW50KQorICAgIDogZGlyZWN0b3J5XyhkaXJlY3RvcnkpLAorICAgICAgZmlsZW5hbWVfKGZpbGVuYW1lKSwKKyAgICAgIGluc2VydGlvbl9wb2ludF8oaW5zZXJ0aW9uX3BvaW50KSwKKyAgICAgIGlubmVyXyhuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbSgmZGF0YV8pKSB7Cit9CisKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpNZW1vcnlPdXRwdXRTdHJlYW06On5NZW1vcnlPdXRwdXRTdHJlYW0oKSB7CisgIC8vIE1ha2Ugc3VyZSBhbGwgZGF0YSBoYXMgYmVlbiB3cml0dGVuLgorICBpbm5lcl8ucmVzZXQoKTsKKworICAvLyBJbnNlcnQgaW50byB0aGUgZGlyZWN0b3J5LgorICBzdHJpbmcqKiBtYXBfc2xvdCA9ICZkaXJlY3RvcnlfLT5maWxlc19bZmlsZW5hbWVfXTsKKworICBpZiAoaW5zZXJ0aW9uX3BvaW50Xy5lbXB0eSgpKSB7CisgICAgLy8gVGhpcyB3YXMganVzdCBhIHJlZ3VsYXIgT3BlbigpLgorICAgIGlmICgqbWFwX3Nsb3QgIT0gTlVMTCkgeworICAgICAgY2VyciA8PCBmaWxlbmFtZV8gPDwgIjogVHJpZWQgdG8gd3JpdGUgdGhlIHNhbWUgZmlsZSB0d2ljZS4iIDw8IGVuZGw7CisgICAgICBkaXJlY3RvcnlfLT5oYWRfZXJyb3JfID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAqbWFwX3Nsb3QgPSBuZXcgc3RyaW5nOworICAgICgqbWFwX3Nsb3QpLT5zd2FwKGRhdGFfKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGlzIHdhcyBhbiBPcGVuRm9ySW5zZXJ0KCkuCisKKyAgICAvLyBJZiB0aGUgZGF0YSBkb2Vucyd0IGVuZCB3aXRoIGEgY2xlYW4gbGluZSBicmVhaywgYWRkIG9uZS4KKyAgICBpZiAoIWRhdGFfLmVtcHR5KCkgJiYgZGF0YV9bZGF0YV8uc2l6ZSgpIC0gMV0gIT0gJ1xuJykgeworICAgICAgZGF0YV8ucHVzaF9iYWNrKCdcbicpOworICAgIH0KKworICAgIC8vIEZpbmQgdGhlIGZpbGUgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBpbnRvLgorICAgIGlmICgqbWFwX3Nsb3QgPT0gTlVMTCkgeworICAgICAgY2VyciA8PCBmaWxlbmFtZV8gPDwgIjogVHJpZWQgdG8gaW5zZXJ0IGludG8gZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QuIgorICAgICAgICAgICA8PCBlbmRsOworICAgICAgZGlyZWN0b3J5Xy0+aGFkX2Vycm9yXyA9IHRydWU7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHN0cmluZyogdGFyZ2V0ID0gKm1hcF9zbG90OworCisgICAgLy8gRmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50LgorICAgIHN0cmluZyBtYWdpY19zdHJpbmcgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAiQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KCQwKSIsIGluc2VydGlvbl9wb2ludF8pOworICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IHRhcmdldC0+ZmluZChtYWdpY19zdHJpbmcpOworCisgICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGNlcnIgPDwgZmlsZW5hbWVfIDw8ICI6IGluc2VydGlvbiBwb2ludCBcIiIgPDwgaW5zZXJ0aW9uX3BvaW50XworICAgICAgICAgICA8PCAiXCIgbm90IGZvdW5kLiIgPDwgZW5kbDsKKyAgICAgIGRpcmVjdG9yeV8tPmhhZF9lcnJvcl8gPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNlZWsgYmFja3dhcmRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUsIHdoaWNoIGlzIHdoZXJlIHdlIHdpbGwKKyAgICAvLyBpbnNlcnQgdGhlIGRhdGEuICBOb3RlIHRoYXQgdGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBwdXNoaW5nIHRoZSBpbnNlcnRpb24KKyAgICAvLyBwb2ludCBkb3duLCBzbyB0aGUgZGF0YSBpcyBpbnNlcnRlZCBiZWZvcmUgaXQuICBUaGlzIGlzIGludGVudGlvbmFsCisgICAgLy8gYmVjYXVzZSBpdCBtZWFucyB0aGF0IG11bHRpcGxlIGluc2VydGlvbnMgYXQgdGhlIHNhbWUgcG9pbnQgd2lsbCBlbmQKKyAgICAvLyB1cCBpbiB0aGUgZXhwZWN0ZWQgb3JkZXIgaW4gdGhlIGZpbmFsIG91dHB1dC4KKyAgICBwb3MgPSB0YXJnZXQtPmZpbmRfbGFzdF9vZignXG4nLCBwb3MpOworICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBJbnNlcnRpb24gcG9pbnQgaXMgb24gdGhlIGZpcnN0IGxpbmUuCisgICAgICBwb3MgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAvLyBBZHZhbmNlIHRvIGNoYXJhY3RlciBhZnRlciAnXG4nLgorICAgICAgKytwb3M7CisgICAgfQorCisgICAgLy8gRXh0cmFjdCBpbmRlbnQuCisgICAgc3RyaW5nIGluZGVudF8oKnRhcmdldCwgcG9zLCB0YXJnZXQtPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiLCBwb3MpIC0gcG9zKTsKKworICAgIGlmIChpbmRlbnRfLmVtcHR5KCkpIHsKKyAgICAgIC8vIE5vIGluZGVudC4gIFRoaXMgbWFrZXMgdGhpbmdzIGVhc2llci4KKyAgICAgIHRhcmdldC0+aW5zZXJ0KHBvcywgZGF0YV8pOworICAgIH0gZWxzZSB7CisgICAgICAvLyBDYWxjdWxhdGUgaG93IG11Y2ggc3BhY2Ugd2UgbmVlZC4KKyAgICAgIGludCBpbmRlbnRfc2l6ZSA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFfLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChkYXRhX1tpXSA9PSAnXG4nKSBpbmRlbnRfc2l6ZSArPSBpbmRlbnRfLnNpemUoKTsKKyAgICAgIH0KKworICAgICAgLy8gTWFrZSBhIGhvbGUgZm9yIGl0LgorICAgICAgdGFyZ2V0LT5pbnNlcnQocG9zLCBkYXRhXy5zaXplKCkgKyBpbmRlbnRfc2l6ZSwgJ1wwJyk7CisKKyAgICAgIC8vIE5vdyBjb3B5IGluIHRoZSBkYXRhLgorICAgICAgc3RyaW5nOjpzaXplX3R5cGUgZGF0YV9wb3MgPSAwOworICAgICAgY2hhciogdGFyZ2V0X3B0ciA9IHN0cmluZ19hc19hcnJheSh0YXJnZXQpICsgcG9zOworICAgICAgd2hpbGUgKGRhdGFfcG9zIDwgZGF0YV8uc2l6ZSgpKSB7CisgICAgICAgIC8vIENvcHkgaW5kZW50LgorICAgICAgICBtZW1jcHkodGFyZ2V0X3B0ciwgaW5kZW50Xy5kYXRhKCksIGluZGVudF8uc2l6ZSgpKTsKKyAgICAgICAgdGFyZ2V0X3B0ciArPSBpbmRlbnRfLnNpemUoKTsKKworICAgICAgICAvLyBDb3B5IGxpbmUgZnJvbSBkYXRhXy4KKyAgICAgICAgLy8gV2UgYWxyZWFkeSBndWFyYW50ZWVkIHRoYXQgZGF0YV8gZW5kcyB3aXRoIGEgbmV3bGluZSAoYWJvdmUpLCBzbyB0aGlzCisgICAgICAgIC8vIHNlYXJjaCBjYW4ndCBmYWlsLgorICAgICAgICBzdHJpbmc6OnNpemVfdHlwZSBsaW5lX2xlbmd0aCA9CisgICAgICAgICAgICBkYXRhXy5maW5kX2ZpcnN0X29mKCdcbicsIGRhdGFfcG9zKSArIDEgLSBkYXRhX3BvczsKKyAgICAgICAgbWVtY3B5KHRhcmdldF9wdHIsIGRhdGFfLmRhdGEoKSArIGRhdGFfcG9zLCBsaW5lX2xlbmd0aCk7CisgICAgICAgIHRhcmdldF9wdHIgKz0gbGluZV9sZW5ndGg7CisgICAgICAgIGRhdGFfcG9zICs9IGxpbmVfbGVuZ3RoOworICAgICAgfQorCisgICAgICBHT09HTEVfQ0hFQ0tfRVEodGFyZ2V0X3B0ciwKKyAgICAgICAgICBzdHJpbmdfYXNfYXJyYXkodGFyZ2V0KSArIHBvcyArIGRhdGFfLnNpemUoKSArIGluZGVudF9zaXplKTsKKyAgICB9CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb21tYW5kTGluZUludGVyZmFjZTo6Q29tbWFuZExpbmVJbnRlcmZhY2UoKQorICA6IG1vZGVfKE1PREVfQ09NUElMRSksCisgICAgZXJyb3JfZm9ybWF0XyhFUlJPUl9GT1JNQVRfR0NDKSwKKyAgICBpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XyhmYWxzZSksCisgICAgZGlzYWxsb3dfc2VydmljZXNfKGZhbHNlKSwKKyAgICBpbnB1dHNfYXJlX3Byb3RvX3BhdGhfcmVsYXRpdmVfKGZhbHNlKSB7fQorQ29tbWFuZExpbmVJbnRlcmZhY2U6On5Db21tYW5kTGluZUludGVyZmFjZSgpIHt9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OlJlZ2lzdGVyR2VuZXJhdG9yKGNvbnN0IHN0cmluZyYgZmxhZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBoZWxwX3RleHQpIHsKKyAgR2VuZXJhdG9ySW5mbyBpbmZvOworICBpbmZvLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKKyAgaW5mby5oZWxwX3RleHQgPSBoZWxwX3RleHQ7CisgIGdlbmVyYXRvcnNfW2ZsYWdfbmFtZV0gPSBpbmZvOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpBbGxvd1BsdWdpbnMoY29uc3Qgc3RyaW5nJiBleGVfbmFtZV9wcmVmaXgpIHsKKyAgcGx1Z2luX3ByZWZpeF8gPSBleGVfbmFtZV9wcmVmaXg7Cit9CisKK2ludCBDb21tYW5kTGluZUludGVyZmFjZTo6UnVuKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pIHsKKyAgQ2xlYXIoKTsKKyAgaWYgKCFQYXJzZUFyZ3VtZW50cyhhcmdjLCBhcmd2KSkgcmV0dXJuIDE7CisKKyAgLy8gU2V0IHVwIHRoZSBzb3VyY2UgdHJlZS4KKyAgRGlza1NvdXJjZVRyZWUgc291cmNlX3RyZWU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG9fcGF0aF8uc2l6ZSgpOyBpKyspIHsKKyAgICBzb3VyY2VfdHJlZS5NYXBQYXRoKHByb3RvX3BhdGhfW2ldLmZpcnN0LCBwcm90b19wYXRoX1tpXS5zZWNvbmQpOworICB9CisKKyAgLy8gTWFwIGlucHV0IGZpbGVzIHRvIHZpcnR1YWwgcGF0aHMgaWYgbmVjZXNzYXJ5LgorICBpZiAoIWlucHV0c19hcmVfcHJvdG9fcGF0aF9yZWxhdGl2ZV8pIHsKKyAgICBpZiAoIU1ha2VJbnB1dHNCZVByb3RvUGF0aFJlbGF0aXZlKCZzb3VyY2VfdHJlZSkpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIC8vIEFsbG9jYXRlIHRoZSBJbXBvcnRlci4KKyAgRXJyb3JQcmludGVyIGVycm9yX2NvbGxlY3RvcihlcnJvcl9mb3JtYXRfLCAmc291cmNlX3RyZWUpOworICBJbXBvcnRlciBpbXBvcnRlcigmc291cmNlX3RyZWUsICZlcnJvcl9jb2xsZWN0b3IpOworCisgIHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHBhcnNlZF9maWxlczsKKworICAvLyBQYXJzZSBlYWNoIGZpbGUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRfZmlsZXNfLnNpemUoKTsgaSsrKSB7CisgICAgLy8gSW1wb3J0IHRoZSBmaWxlLgorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBwYXJzZWRfZmlsZSA9IGltcG9ydGVyLkltcG9ydChpbnB1dF9maWxlc19baV0pOworICAgIGlmIChwYXJzZWRfZmlsZSA9PSBOVUxMKSByZXR1cm4gMTsKKyAgICBwYXJzZWRfZmlsZXMucHVzaF9iYWNrKHBhcnNlZF9maWxlKTsKKworICAgIC8vIEVuZm9yY2UgLS1kaXNhbGxvd19zZXJ2aWNlcy4KKyAgICBpZiAoZGlzYWxsb3dfc2VydmljZXNfICYmIHBhcnNlZF9maWxlLT5zZXJ2aWNlX2NvdW50KCkgPiAwKSB7CisgICAgICBjZXJyIDw8IHBhcnNlZF9maWxlLT5uYW1lKCkgPDwgIjogVGhpcyBmaWxlIGNvbnRhaW5zIHNlcnZpY2VzLCBidXQgIgorICAgICAgICAgICAgICAiLS1kaXNhbGxvd19zZXJ2aWNlcyB3YXMgdXNlZC4iIDw8IGVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICAvLyBXZSBjb25zdHJ1Y3QgYSBzZXBhcmF0ZSBHZW5lcmF0b3JDb250ZXh0IGZvciBlYWNoIG91dHB1dCBsb2NhdGlvbi4gIE5vdGUKKyAgLy8gdGhhdCB0d28gY29kZSBnZW5lcmF0b3JzIG1heSBvdXRwdXQgdG8gdGhlIHNhbWUgbG9jYXRpb24sIGluIHdoaWNoIGNhc2UKKyAgLy8gdGhleSBzaG91bGQgc2hhcmUgYSBzaW5nbGUgR2VuZXJhdG9yQ29udGV4dCBzbyB0aGF0IE9wZW5Gb3JJbnNlcnQoKSB3b3Jrcy4KKyAgdHlwZWRlZiBoYXNoX21hcDxzdHJpbmcsIEdlbmVyYXRvckNvbnRleHRJbXBsKj4gR2VuZXJhdG9yQ29udGV4dE1hcDsKKyAgR2VuZXJhdG9yQ29udGV4dE1hcCBvdXRwdXRfZGlyZWN0b3JpZXM7CisKKyAgLy8gR2VuZXJhdGUgb3V0cHV0LgorICBpZiAobW9kZV8gPT0gTU9ERV9DT01QSUxFKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRfZGlyZWN0aXZlc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgIHN0cmluZyBvdXRwdXRfbG9jYXRpb24gPSBvdXRwdXRfZGlyZWN0aXZlc19baV0ub3V0cHV0X2xvY2F0aW9uOworICAgICAgaWYgKCFIYXNTdWZmaXhTdHJpbmcob3V0cHV0X2xvY2F0aW9uLCAiLnppcCIpICYmCisgICAgICAgICAgIUhhc1N1ZmZpeFN0cmluZyhvdXRwdXRfbG9jYXRpb24sICIuamFyIikpIHsKKyAgICAgICAgQWRkVHJhaWxpbmdTbGFzaCgmb3V0cHV0X2xvY2F0aW9uKTsKKyAgICAgIH0KKyAgICAgIEdlbmVyYXRvckNvbnRleHRJbXBsKiogbWFwX3Nsb3QgPSAmb3V0cHV0X2RpcmVjdG9yaWVzW291dHB1dF9sb2NhdGlvbl07CisKKyAgICAgIGlmICgqbWFwX3Nsb3QgPT0gTlVMTCkgeworICAgICAgICAvLyBGaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gdGhpcyBvdXRwdXQgbG9jYXRpb24uCisgICAgICAgICptYXBfc2xvdCA9IG5ldyBHZW5lcmF0b3JDb250ZXh0SW1wbChwYXJzZWRfZmlsZXMpOworICAgICAgfQorCisgICAgICBpZiAoIUdlbmVyYXRlT3V0cHV0KHBhcnNlZF9maWxlcywgb3V0cHV0X2RpcmVjdGl2ZXNfW2ldLCAqbWFwX3Nsb3QpKSB7CisgICAgICAgIFNUTERlbGV0ZVZhbHVlcygmb3V0cHV0X2RpcmVjdG9yaWVzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gV3JpdGUgYWxsIG91dHB1dCB0byBkaXNrLgorICBmb3IgKEdlbmVyYXRvckNvbnRleHRNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBvdXRwdXRfZGlyZWN0b3JpZXMuYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IG91dHB1dF9kaXJlY3Rvcmllcy5lbmQoKTsgKytpdGVyKSB7CisgICAgY29uc3Qgc3RyaW5nJiBsb2NhdGlvbiA9IGl0ZXItPmZpcnN0OworICAgIEdlbmVyYXRvckNvbnRleHRJbXBsKiBkaXJlY3RvcnkgPSBpdGVyLT5zZWNvbmQ7CisgICAgaWYgKEhhc1N1ZmZpeFN0cmluZyhsb2NhdGlvbiwgIi8iKSkgeworICAgICAgaWYgKCFkaXJlY3RvcnktPldyaXRlQWxsVG9EaXNrKGxvY2F0aW9uKSkgeworICAgICAgICBTVExEZWxldGVWYWx1ZXMoJm91dHB1dF9kaXJlY3Rvcmllcyk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoSGFzU3VmZml4U3RyaW5nKGxvY2F0aW9uLCAiLmphciIpKSB7CisgICAgICAgIGRpcmVjdG9yeS0+QWRkSmFyTWFuaWZlc3QoKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFkaXJlY3RvcnktPldyaXRlQWxsVG9aaXAobG9jYXRpb24pKSB7CisgICAgICAgIFNUTERlbGV0ZVZhbHVlcygmb3V0cHV0X2RpcmVjdG9yaWVzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgU1RMRGVsZXRlVmFsdWVzKCZvdXRwdXRfZGlyZWN0b3JpZXMpOworCisgIGlmICghZGVzY3JpcHRvcl9zZXRfbmFtZV8uZW1wdHkoKSkgeworICAgIGlmICghV3JpdGVEZXNjcmlwdG9yU2V0KHBhcnNlZF9maWxlcykpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIGlmIChtb2RlXyA9PSBNT0RFX0VOQ09ERSB8fCBtb2RlXyA9PSBNT0RFX0RFQ09ERSkgeworICAgIGlmIChjb2RlY190eXBlXy5lbXB0eSgpKSB7CisgICAgICAvLyBIQUNLOiAgRGVmaW5lIGFuIEVtcHR5TWVzc2FnZSB0eXBlIHRvIHVzZSBmb3IgZGVjb2RpbmcuCisgICAgICBEZXNjcmlwdG9yUG9vbCBwb29sOworICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgICAgZmlsZS5zZXRfbmFtZSgiZW1wdHlfbWVzc2FnZS5wcm90byIpOworICAgICAgZmlsZS5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJFbXB0eU1lc3NhZ2UiKTsKKyAgICAgIEdPT0dMRV9DSEVDSyhwb29sLkJ1aWxkRmlsZShmaWxlKSAhPSBOVUxMKTsKKyAgICAgIGNvZGVjX3R5cGVfID0gIkVtcHR5TWVzc2FnZSI7CisgICAgICBpZiAoIUVuY29kZU9yRGVjb2RlKCZwb29sKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFFbmNvZGVPckRlY29kZShpbXBvcnRlci5wb29sKCkpKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpDbGVhcigpIHsKKyAgLy8gQ2xlYXIgYWxsIG1lbWJlcnMgdGhhdCBhcmUgc2V0IGJ5IFJ1bigpLiAgTm90ZSB0aGF0IHdlIG11c3Qgbm90IGNsZWFyCisgIC8vIG1lbWJlcnMgd2hpY2ggYXJlIHNldCBieSBvdGhlciBtZXRob2RzIGJlZm9yZSBSdW4oKSBpcyBjYWxsZWQuCisgIGV4ZWN1dGFibGVfbmFtZV8uY2xlYXIoKTsKKyAgcHJvdG9fcGF0aF8uY2xlYXIoKTsKKyAgaW5wdXRfZmlsZXNfLmNsZWFyKCk7CisgIG91dHB1dF9kaXJlY3RpdmVzXy5jbGVhcigpOworICBjb2RlY190eXBlXy5jbGVhcigpOworICBkZXNjcmlwdG9yX3NldF9uYW1lXy5jbGVhcigpOworCisgIG1vZGVfID0gTU9ERV9DT01QSUxFOworICBpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XyA9IGZhbHNlOworICBkaXNhbGxvd19zZXJ2aWNlc18gPSBmYWxzZTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6TWFrZUlucHV0c0JlUHJvdG9QYXRoUmVsYXRpdmUoCisgICAgRGlza1NvdXJjZVRyZWUqIHNvdXJjZV90cmVlKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRfZmlsZXNfLnNpemUoKTsgaSsrKSB7CisgICAgc3RyaW5nIHZpcnR1YWxfZmlsZSwgc2hhZG93aW5nX2Rpc2tfZmlsZTsKKyAgICBzd2l0Y2ggKHNvdXJjZV90cmVlLT5EaXNrRmlsZVRvVmlydHVhbEZpbGUoCisgICAgICAgIGlucHV0X2ZpbGVzX1tpXSwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKSB7CisgICAgICBjYXNlIERpc2tTb3VyY2VUcmVlOjpTVUNDRVNTOgorICAgICAgICBpbnB1dF9maWxlc19baV0gPSB2aXJ0dWFsX2ZpbGU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBEaXNrU291cmNlVHJlZTo6U0hBRE9XRUQ6CisgICAgICAgIGNlcnIgPDwgaW5wdXRfZmlsZXNfW2ldIDw8ICI6IElucHV0IGlzIHNoYWRvd2VkIGluIHRoZSAtLXByb3RvX3BhdGggIgorICAgICAgICAgICAgICAgICJieSBcIiIgPDwgc2hhZG93aW5nX2Rpc2tfZmlsZSA8PCAiXCIuICBFaXRoZXIgdXNlIHRoZSBsYXR0ZXIgIgorICAgICAgICAgICAgICAgICJmaWxlIGFzIHlvdXIgaW5wdXQgb3IgcmVvcmRlciB0aGUgLS1wcm90b19wYXRoIHNvIHRoYXQgdGhlICIKKyAgICAgICAgICAgICAgICAiZm9ybWVyIGZpbGUncyBsb2NhdGlvbiBjb21lcyBmaXJzdC4iIDw8IGVuZGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNhc2UgRGlza1NvdXJjZVRyZWU6OkNBTk5PVF9PUEVOOgorICAgICAgICBjZXJyIDw8IGlucHV0X2ZpbGVzX1tpXSA8PCAiOiAiIDw8IHN0cmVycm9yKGVycm5vKSA8PCBlbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBjYXNlIERpc2tTb3VyY2VUcmVlOjpOT19NQVBQSU5HOgorICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMgYXQgYWxsLgorICAgICAgICBpZiAoYWNjZXNzKGlucHV0X2ZpbGVzX1tpXS5jX3N0cigpLCBGX09LKSA8IDApIHsKKyAgICAgICAgICAvLyBGaWxlIGRvZXMgbm90IGV2ZW4gZXhpc3QuCisgICAgICAgICAgY2VyciA8PCBpbnB1dF9maWxlc19baV0gPDwgIjogIiA8PCBzdHJlcnJvcihFTk9FTlQpIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2VyciA8PCBpbnB1dF9maWxlc19baV0gPDwgIjogRmlsZSBkb2VzIG5vdCByZXNpZGUgd2l0aGluIGFueSBwYXRoICIKKyAgICAgICAgICAgICAgICAgICJzcGVjaWZpZWQgdXNpbmcgLS1wcm90b19wYXRoIChvciAtSSkuICBZb3UgbXVzdCBzcGVjaWZ5IGEgIgorICAgICAgICAgICAgICAgICAgIi0tcHJvdG9fcGF0aCB3aGljaCBlbmNvbXBhc3NlcyB0aGlzIGZpbGUuICBOb3RlIHRoYXQgdGhlICIKKyAgICAgICAgICAgICAgICAgICJwcm90b19wYXRoIG11c3QgYmUgYW4gZXhhY3QgcHJlZml4IG9mIHRoZSAucHJvdG8gZmlsZSAiCisgICAgICAgICAgICAgICAgICAibmFtZXMgLS0gcHJvdG9jIGlzIHRvbyBkdW1iIHRvIGZpZ3VyZSBvdXQgd2hlbiB0d28gcGF0aHMgIgorICAgICAgICAgICAgICAgICAgIihlLmcuIGFic29sdXRlIGFuZCByZWxhdGl2ZSkgYXJlIGVxdWl2YWxlbnQgKGl0J3MgaGFyZGVyICIKKyAgICAgICAgICAgICAgICAgICJ0aGFuIHlvdSB0aGluaykuIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6UGFyc2VBcmd1bWVudHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSkgeworICBleGVjdXRhYmxlX25hbWVfID0gYXJndlswXTsKKworICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGFyZ3VtZW50cyBhbmQgcGFyc2UgdGhlbS4KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBzdHJpbmcgbmFtZSwgdmFsdWU7CisKKyAgICBpZiAoUGFyc2VBcmd1bWVudChhcmd2W2ldLCAmbmFtZSwgJnZhbHVlKSkgeworICAgICAgLy8gUmV0dXJuZWQgdHJ1ZSA9PiBVc2UgdGhlIG5leHQgYXJndW1lbnQgYXMgdGhlIGZsYWcgdmFsdWUuCisgICAgICBpZiAoaSArIDEgPT0gYXJnYyB8fCBhcmd2W2krMV1bMF0gPT0gJy0nKSB7CisgICAgICAgIGNlcnIgPDwgIk1pc3NpbmcgdmFsdWUgZm9yIGZsYWc6ICIgPDwgbmFtZSA8PCBlbmRsOworICAgICAgICBpZiAobmFtZSA9PSAiLS1kZWNvZGUiKSB7CisgICAgICAgICAgY2VyciA8PCAiVG8gZGVjb2RlIGFuIHVua25vd24gbWVzc2FnZSwgdXNlIC0tZGVjb2RlX3Jhdy4iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKytpOworICAgICAgICB2YWx1ZSA9IGFyZ3ZbaV07CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFJbnRlcnByZXRBcmd1bWVudChuYW1lLCB2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIElmIG5vIC0tcHJvdG9fcGF0aCB3YXMgZ2l2ZW4sIHVzZSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKyAgaWYgKHByb3RvX3BhdGhfLmVtcHR5KCkpIHsKKyAgICBwcm90b19wYXRoXy5wdXNoX2JhY2sobWFrZV9wYWlyPHN0cmluZywgc3RyaW5nPigiIiwgIi4iKSk7CisgIH0KKworICAvLyBDaGVjayBzb21lIGVycnJvciBjYXNlcy4KKyAgYm9vbCBkZWNvZGluZ19yYXcgPSAobW9kZV8gPT0gTU9ERV9ERUNPREUpICYmIGNvZGVjX3R5cGVfLmVtcHR5KCk7CisgIGlmIChkZWNvZGluZ19yYXcgJiYgIWlucHV0X2ZpbGVzXy5lbXB0eSgpKSB7CisgICAgY2VyciA8PCAiV2hlbiB1c2luZyAtLWRlY29kZV9yYXcsIG5vIGlucHV0IGZpbGVzIHNob3VsZCBiZSBnaXZlbi4iIDw8IGVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgaWYgKCFkZWNvZGluZ19yYXcgJiYgaW5wdXRfZmlsZXNfLmVtcHR5KCkpIHsKKyAgICBjZXJyIDw8ICJNaXNzaW5nIGlucHV0IGZpbGUuIiA8PCBlbmRsOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAobW9kZV8gPT0gTU9ERV9DT01QSUxFICYmIG91dHB1dF9kaXJlY3RpdmVzXy5lbXB0eSgpICYmCisgICAgICBkZXNjcmlwdG9yX3NldF9uYW1lXy5lbXB0eSgpKSB7CisgICAgY2VyciA8PCAiTWlzc2luZyBvdXRwdXQgZGlyZWN0aXZlcy4iIDw8IGVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XyAmJiBkZXNjcmlwdG9yX3NldF9uYW1lXy5lbXB0eSgpKSB7CisgICAgY2VyciA8PCAiLS1pbmNsdWRlX2ltcG9ydHMgb25seSBtYWtlcyBzZW5zZSB3aGVuIGNvbWJpbmVkIHdpdGggIgorICAgICAgICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfb3V0LiIgPDwgZW5kbDsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpQYXJzZUFyZ3VtZW50KGNvbnN0IGNoYXIqIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBuYW1lLCBzdHJpbmcqIHZhbHVlKSB7CisgIGJvb2wgcGFyc2VkX3ZhbHVlID0gZmFsc2U7CisKKyAgaWYgKGFyZ1swXSAhPSAnLScpIHsKKyAgICAvLyBOb3QgYSBmbGFnLgorICAgIG5hbWUtPmNsZWFyKCk7CisgICAgcGFyc2VkX3ZhbHVlID0gdHJ1ZTsKKyAgICAqdmFsdWUgPSBhcmc7CisgIH0gZWxzZSBpZiAoYXJnWzFdID09ICctJykgeworICAgIC8vIFR3byBkYXNoZXM6ICBNdWx0aS1jaGFyYWN0ZXIgbmFtZSwgd2l0aCAnPScgc2VwYXJhdGluZyBuYW1lIGFuZAorICAgIC8vICAgdmFsdWUuCisgICAgY29uc3QgY2hhciogZXF1YWxzX3BvcyA9IHN0cmNocihhcmcsICc9Jyk7CisgICAgaWYgKGVxdWFsc19wb3MgIT0gTlVMTCkgeworICAgICAgKm5hbWUgPSBzdHJpbmcoYXJnLCBlcXVhbHNfcG9zIC0gYXJnKTsKKyAgICAgICp2YWx1ZSA9IGVxdWFsc19wb3MgKyAxOworICAgICAgcGFyc2VkX3ZhbHVlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgKm5hbWUgPSBhcmc7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIE9uZSBkYXNoOiAgT25lLWNoYXJhY3RlciBuYW1lLCBhbGwgc3Vic2VxdWVudCBjaGFyYWN0ZXJzIGFyZSB0aGUKKyAgICAvLyAgIHZhbHVlLgorICAgIGlmIChhcmdbMV0gPT0gJ1wwJykgeworICAgICAgLy8gYXJnIGlzIGp1c3QgIi0iLiAgV2UgdHJlYXQgdGhpcyBhcyBhbiBpbnB1dCBmaWxlLCBleGNlcHQgdGhhdCBhdAorICAgICAgLy8gcHJlc2VudCB0aGlzIHdpbGwganVzdCBsZWFkIHRvIGEgImZpbGUgbm90IGZvdW5kIiBlcnJvci4KKyAgICAgIG5hbWUtPmNsZWFyKCk7CisgICAgICAqdmFsdWUgPSBhcmc7CisgICAgICBwYXJzZWRfdmFsdWUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAqbmFtZSA9IHN0cmluZyhhcmcsIDIpOworICAgICAgKnZhbHVlID0gYXJnICsgMjsKKyAgICAgIHBhcnNlZF92YWx1ZSA9ICF2YWx1ZS0+ZW1wdHkoKTsKKyAgICB9CisgIH0KKworICAvLyBOZWVkIHRvIHJldHVybiB0cnVlIGlmZiB0aGUgbmV4dCBhcmcgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGlzCisgIC8vIG9uZSwgZmFsc2Ugb3RoZXJ3aXNlLgorCisgIGlmIChwYXJzZWRfdmFsdWUpIHsKKyAgICAvLyBXZSBhbHJlYWR5IHBhcnNlZCBhIHZhbHVlIGZvciB0aGlzIGZsYWcuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCpuYW1lID09ICItaCIgfHwgKm5hbWUgPT0gIi0taGVscCIgfHwKKyAgICAgICpuYW1lID09ICItLWRpc2FsbG93X3NlcnZpY2VzIiB8fAorICAgICAgKm5hbWUgPT0gIi0taW5jbHVkZV9pbXBvcnRzIiB8fAorICAgICAgKm5hbWUgPT0gIi0tdmVyc2lvbiIgfHwKKyAgICAgICpuYW1lID09ICItLWRlY29kZV9yYXciKSB7CisgICAgLy8gSEFDSzogIFRoZXNlIGFyZSB0aGUgb25seSBmbGFncyB0aGF0IGRvbid0IHRha2UgYSB2YWx1ZS4KKyAgICAvLyAgIFRoZXkgcHJvYmFibHkgc2hvdWxkIG5vdCBiZSBoYXJkLWNvZGVkIGxpa2UgdGhpcyBidXQgZm9yIG5vdyBpdCdzCisgICAgLy8gICBub3Qgd29ydGggZG9pbmcgYmV0dGVyLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE5leHQgYXJndW1lbnQgaXMgdGhlIGZsYWcgdmFsdWUuCisgIHJldHVybiB0cnVlOworfQorCitib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpJbnRlcnByZXRBcmd1bWVudChjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAvLyBOb3QgYSBmbGFnLiAgSnVzdCBhIGZpbGVuYW1lLgorICAgIGlmICh2YWx1ZS5lbXB0eSgpKSB7CisgICAgICBjZXJyIDw8ICJZb3Ugc2VlbSB0byBoYXZlIHBhc3NlZCBhbiBlbXB0eSBzdHJpbmcgYXMgb25lIG9mIHRoZSAiCisgICAgICAgICAgICAgICJhcmd1bWVudHMgdG8gIiA8PCBleGVjdXRhYmxlX25hbWVfIDw8ICIuICBUaGlzIGlzIGFjdHVhbGx5ICIKKyAgICAgICAgICAgICAgInNvcnQgb2YgaGFyZCB0byBkby4gIENvbmdyYXRzLiAgVW5mb3J0dW5hdGVseSBpdCBpcyBub3QgdmFsaWQgIgorICAgICAgICAgICAgICAiaW5wdXQgc28gdGhlIHByb2dyYW0gaXMgZ29pbmcgdG8gZGllIG5vdy4iIDw8IGVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW5wdXRfZmlsZXNfLnB1c2hfYmFjayh2YWx1ZSk7CisKKyAgfSBlbHNlIGlmIChuYW1lID09ICItSSIgfHwgbmFtZSA9PSAiLS1wcm90b19wYXRoIikgeworICAgIC8vIEphdmEncyAtY2xhc3NwYXRoIChhbmQgc29tZSBvdGhlciBsYW5ndWFnZXMpIGRlbGltaXRzIHBhdGggY29tcG9uZW50cworICAgIC8vIHdpdGggY29sb25zLiAgTGV0J3MgYWNjZXB0IHRoYXQgc3ludGF4IHRvbyBqdXN0IHRvIG1ha2UgdGhpbmdzIG1vcmUKKyAgICAvLyBpbnR1aXRpdmUuCisgICAgdmVjdG9yPHN0cmluZz4gcGFydHM7CisgICAgU3BsaXRTdHJpbmdVc2luZyh2YWx1ZSwga1BhdGhTZXBhcmF0b3IsICZwYXJ0cyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKTsgaSsrKSB7CisgICAgICBzdHJpbmcgdmlydHVhbF9wYXRoOworICAgICAgc3RyaW5nIGRpc2tfcGF0aDsKKworICAgICAgc3RyaW5nOjpzaXplX3R5cGUgZXF1YWxzX3BvcyA9IHBhcnRzW2ldLmZpbmRfZmlyc3Rfb2YoJz0nKTsKKyAgICAgIGlmIChlcXVhbHNfcG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgICB2aXJ0dWFsX3BhdGggPSAiIjsKKyAgICAgICAgZGlza19wYXRoID0gcGFydHNbaV07CisgICAgICB9IGVsc2UgeworICAgICAgICB2aXJ0dWFsX3BhdGggPSBwYXJ0c1tpXS5zdWJzdHIoMCwgZXF1YWxzX3Bvcyk7CisgICAgICAgIGRpc2tfcGF0aCA9IHBhcnRzW2ldLnN1YnN0cihlcXVhbHNfcG9zICsgMSk7CisgICAgICB9CisKKyAgICAgIGlmIChkaXNrX3BhdGguZW1wdHkoKSkgeworICAgICAgICBjZXJyIDw8ICItLXByb3RvX3BhdGggcGFzc2VkIGVtcHR5IGRpcmVjdG9yeSBuYW1lLiAgKFVzZSBcIi5cIiBmb3IgIgorICAgICAgICAgICAgICAgICJjdXJyZW50IGRpcmVjdG9yeS4pIiA8PCBlbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIC8vIE1ha2Ugc3VyZSBkaXNrIHBhdGggZXhpc3RzLCB3YXJuIG90aGVyd2lzZS4KKyAgICAgIGlmIChhY2Nlc3MoZGlza19wYXRoLmNfc3RyKCksIEZfT0spIDwgMCkgeworICAgICAgICBjZXJyIDw8IGRpc2tfcGF0aCA8PCAiOiB3YXJuaW5nOiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBwcm90b19wYXRoXy5wdXNoX2JhY2sobWFrZV9wYWlyKHZpcnR1YWxfcGF0aCwgZGlza19wYXRoKSk7CisgICAgfQorCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLW8iIHx8IG5hbWUgPT0gIi0tZGVzY3JpcHRvcl9zZXRfb3V0IikgeworICAgIGlmICghZGVzY3JpcHRvcl9zZXRfbmFtZV8uZW1wdHkoKSkgeworICAgICAgY2VyciA8PCBuYW1lIDw8ICIgbWF5IG9ubHkgYmUgcGFzc2VkIG9uY2UuIiA8PCBlbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmFsdWUuZW1wdHkoKSkgeworICAgICAgY2VyciA8PCBuYW1lIDw8ICIgcmVxdWlyZXMgYSBub24tZW1wdHkgdmFsdWUuIiA8PCBlbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobW9kZV8gIT0gTU9ERV9DT01QSUxFKSB7CisgICAgICBjZXJyIDw8ICJDYW5ub3QgdXNlIC0tZW5jb2RlIG9yIC0tZGVjb2RlIGFuZCBnZW5lcmF0ZSBkZXNjcmlwdG9ycyBhdCB0aGUgIgorICAgICAgICAgICAgICAic2FtZSB0aW1lLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGVzY3JpcHRvcl9zZXRfbmFtZV8gPSB2YWx1ZTsKKworICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0taW5jbHVkZV9pbXBvcnRzIikgeworICAgIGlmIChpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XykgeworICAgICAgY2VyciA8PCBuYW1lIDw8ICIgbWF5IG9ubHkgYmUgcGFzc2VkIG9uY2UuIiA8PCBlbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XyA9IHRydWU7CisKKyAgfSBlbHNlIGlmIChuYW1lID09ICItaCIgfHwgbmFtZSA9PSAiLS1oZWxwIikgeworICAgIFByaW50SGVscFRleHQoKTsKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBFeGl0IHdpdGhvdXQgcnVubmluZyBjb21waWxlci4KKworICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0tdmVyc2lvbiIpIHsKKyAgICBpZiAoIXZlcnNpb25faW5mb18uZW1wdHkoKSkgeworICAgICAgY291dCA8PCB2ZXJzaW9uX2luZm9fIDw8IGVuZGw7CisgICAgfQorICAgIGNvdXQgPDwgImxpYnByb3RvYyAiCisgICAgICAgICA8PCBwcm90b2J1Zjo6aW50ZXJuYWw6OlZlcnNpb25TdHJpbmcoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04pCisgICAgICAgICA8PCBlbmRsOworICAgIHJldHVybiBmYWxzZTsgIC8vIEV4aXQgd2l0aG91dCBydW5uaW5nIGNvbXBpbGVyLgorCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1kaXNhbGxvd19zZXJ2aWNlcyIpIHsKKyAgICBkaXNhbGxvd19zZXJ2aWNlc18gPSB0cnVlOworCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1lbmNvZGUiIHx8IG5hbWUgPT0gIi0tZGVjb2RlIiB8fAorICAgICAgICAgICAgIG5hbWUgPT0gIi0tZGVjb2RlX3JhdyIpIHsKKyAgICBpZiAobW9kZV8gIT0gTU9ERV9DT01QSUxFKSB7CisgICAgICBjZXJyIDw8ICJPbmx5IG9uZSBvZiAtLWVuY29kZSBhbmQgLS1kZWNvZGUgY2FuIGJlIHNwZWNpZmllZC4iIDw8IGVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghb3V0cHV0X2RpcmVjdGl2ZXNfLmVtcHR5KCkgfHwgIWRlc2NyaXB0b3Jfc2V0X25hbWVfLmVtcHR5KCkpIHsKKyAgICAgIGNlcnIgPDwgIkNhbm5vdCB1c2UgIiA8PCBuYW1lCisgICAgICAgICAgIDw8ICIgYW5kIGdlbmVyYXRlIGNvZGUgb3IgZGVzY3JpcHRvcnMgYXQgdGhlIHNhbWUgdGltZS4iIDw8IGVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbW9kZV8gPSAobmFtZSA9PSAiLS1lbmNvZGUiKSA/IE1PREVfRU5DT0RFIDogTU9ERV9ERUNPREU7CisKKyAgICBpZiAodmFsdWUuZW1wdHkoKSAmJiBuYW1lICE9ICItLWRlY29kZV9yYXciKSB7CisgICAgICBjZXJyIDw8ICJUeXBlIG5hbWUgZm9yICIgPDwgbmFtZSA8PCAiIGNhbm5vdCBiZSBibGFuay4iIDw8IGVuZGw7CisgICAgICBpZiAobmFtZSA9PSAiLS1kZWNvZGUiKSB7CisgICAgICAgIGNlcnIgPDwgIlRvIGRlY29kZSBhbiB1bmtub3duIG1lc3NhZ2UsIHVzZSAtLWRlY29kZV9yYXcuIiA8PCBlbmRsOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoIXZhbHVlLmVtcHR5KCkgJiYgbmFtZSA9PSAiLS1kZWNvZGVfcmF3IikgeworICAgICAgY2VyciA8PCAiLS1kZWNvZGVfcmF3IGRvZXMgbm90IHRha2UgYSBwYXJhbWV0ZXIuIiA8PCBlbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvZGVjX3R5cGVfID0gdmFsdWU7CisKKyAgfSBlbHNlIGlmIChuYW1lID09ICItLWVycm9yX2Zvcm1hdCIpIHsKKyAgICBpZiAodmFsdWUgPT0gImdjYyIpIHsKKyAgICAgIGVycm9yX2Zvcm1hdF8gPSBFUlJPUl9GT1JNQVRfR0NDOworICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIm1zdnMiKSB7CisgICAgICBlcnJvcl9mb3JtYXRfID0gRVJST1JfRk9STUFUX01TVlM7CisgICAgfSBlbHNlIHsKKyAgICAgIGNlcnIgPDwgIlVua25vd24gZXJyb3IgZm9ybWF0OiAiIDw8IHZhbHVlIDw8IGVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1wbHVnaW4iKSB7CisgICAgaWYgKHBsdWdpbl9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICAgIGNlcnIgPDwgIlRoaXMgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBwbHVnaW5zLiIgPDwgZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdHJpbmcgbmFtZTsKKyAgICBzdHJpbmcgcGF0aDsKKworICAgIHN0cmluZzo6c2l6ZV90eXBlIGVxdWFsc19wb3MgPSB2YWx1ZS5maW5kX2ZpcnN0X29mKCc9Jyk7CisgICAgaWYgKGVxdWFsc19wb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBVc2UgdGhlIGJhc2VuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2hfcG9zID0gdmFsdWUuZmluZF9sYXN0X29mKCcvJyk7CisgICAgICBpZiAoc2xhc2hfcG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgICBuYW1lID0gdmFsdWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gdmFsdWUuc3Vic3RyKHNsYXNoX3BvcyArIDEpOworICAgICAgfQorICAgICAgcGF0aCA9IHZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICBuYW1lID0gdmFsdWUuc3Vic3RyKDAsIGVxdWFsc19wb3MpOworICAgICAgcGF0aCA9IHZhbHVlLnN1YnN0cihlcXVhbHNfcG9zICsgMSk7CisgICAgfQorCisgICAgcGx1Z2luc19bbmFtZV0gPSBwYXRoOworCisgIH0gZWxzZSB7CisgICAgLy8gU29tZSBvdGhlciBmbGFnLiAgTG9vayBpdCB1cCBpbiB0aGUgZ2VuZXJhdG9ycyBsaXN0LgorICAgIGNvbnN0IEdlbmVyYXRvckluZm8qIGdlbmVyYXRvcl9pbmZvID0gRmluZE9yTnVsbChnZW5lcmF0b3JzXywgbmFtZSk7CisgICAgaWYgKGdlbmVyYXRvcl9pbmZvID09IE5VTEwgJiYKKyAgICAgICAgKHBsdWdpbl9wcmVmaXhfLmVtcHR5KCkgfHwgIUhhc1N1ZmZpeFN0cmluZyhuYW1lLCAiX291dCIpKSkgeworICAgICAgY2VyciA8PCAiVW5rbm93biBmbGFnOiAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJdCdzIGFuIG91dHB1dCBmbGFnLiAgQWRkIGl0IHRvIHRoZSBvdXRwdXQgZGlyZWN0aXZlcy4KKyAgICBpZiAobW9kZV8gIT0gTU9ERV9DT01QSUxFKSB7CisgICAgICBjZXJyIDw8ICJDYW5ub3QgdXNlIC0tZW5jb2RlIG9yIC0tZGVjb2RlIGFuZCBnZW5lcmF0ZSBjb2RlIGF0IHRoZSAiCisgICAgICAgICAgICAgICJzYW1lIHRpbWUuIiA8PCBlbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIE91dHB1dERpcmVjdGl2ZSBkaXJlY3RpdmU7CisgICAgZGlyZWN0aXZlLm5hbWUgPSBuYW1lOworICAgIGlmIChnZW5lcmF0b3JfaW5mbyA9PSBOVUxMKSB7CisgICAgICBkaXJlY3RpdmUuZ2VuZXJhdG9yID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgZGlyZWN0aXZlLmdlbmVyYXRvciA9IGdlbmVyYXRvcl9pbmZvLT5nZW5lcmF0b3I7CisgICAgfQorCisgICAgLy8gU3BsaXQgdmFsdWUgYXQgJzonIHRvIHNlcGFyYXRlIHRoZSBnZW5lcmF0b3IgcGFyYW1ldGVyIGZyb20gdGhlCisgICAgLy8gZmlsZW5hbWUuICBIb3dldmVyLCBhdm9pZCBkb2luZyB0aGlzIGlmIHRoZSBjb2xvbiBpcyBwYXJ0IG9mIGEgdmFsaWQKKyAgICAvLyBXaW5kb3dzLXN0eWxlIGFic29sdXRlIHBhdGguCisgICAgc3RyaW5nOjpzaXplX3R5cGUgY29sb25fcG9zID0gdmFsdWUuZmluZF9maXJzdF9vZignOicpOworICAgIGlmIChjb2xvbl9wb3MgPT0gc3RyaW5nOjpucG9zIHx8IElzV2luZG93c0Fic29sdXRlUGF0aCh2YWx1ZSkpIHsKKyAgICAgIGRpcmVjdGl2ZS5vdXRwdXRfbG9jYXRpb24gPSB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgZGlyZWN0aXZlLnBhcmFtZXRlciA9IHZhbHVlLnN1YnN0cigwLCBjb2xvbl9wb3MpOworICAgICAgZGlyZWN0aXZlLm91dHB1dF9sb2NhdGlvbiA9IHZhbHVlLnN1YnN0cihjb2xvbl9wb3MgKyAxKTsKKyAgICB9CisKKyAgICBvdXRwdXRfZGlyZWN0aXZlc18ucHVzaF9iYWNrKGRpcmVjdGl2ZSk7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6UHJpbnRIZWxwVGV4dCgpIHsKKyAgLy8gU29ycnkgZm9yIGluZGVudGF0aW9uIGhlcmU7IGxpbmUgd3JhcHBpbmcgd291bGQgYmUgdWdsaWVyLgorICBjZXJyIDw8CisiVXNhZ2U6ICIgPDwgZXhlY3V0YWJsZV9uYW1lXyA8PCAiIFtPUFRJT05dIFBST1RPX0ZJTEVTXG4iCisiUGFyc2UgUFJPVE9fRklMRVMgYW5kIGdlbmVyYXRlIG91dHB1dCBiYXNlZCBvbiB0aGUgb3B0aW9ucyBnaXZlbjpcbiIKKyIgIC1JUEFUSCwgLS1wcm90b19wYXRoPVBBVEggICBTcGVjaWZ5IHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gc2VhcmNoIGZvclxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydHMuICBNYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzO1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIHdpbGwgYmUgc2VhcmNoZWQgaW4gb3JkZXIuICBJZiBub3RcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiwgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgdXNlZC5cbiIKKyIgIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICBTaG93IHZlcnNpb24gaW5mbyBhbmQgZXhpdC5cbiIKKyIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgICBTaG93IHRoaXMgdGV4dCBhbmQgZXhpdC5cbiIKKyIgIC0tZW5jb2RlPU1FU1NBR0VfVFlQRSAgICAgICBSZWFkIGEgdGV4dC1mb3JtYXQgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlIGl0IGluIGJpbmFyeVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0YW5kYXJkIG91dHB1dC4gIFRoZSBtZXNzYWdlIHR5cGUgbXVzdFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGRlZmluZWQgaW4gUFJPVE9fRklMRVMgb3IgdGhlaXIgaW1wb3J0cy5cbiIKKyIgIC0tZGVjb2RlPU1FU1NBR0VfVFlQRSAgICAgICBSZWFkIGEgYmluYXJ5IG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgZnJvbVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZSBpdCBpbiB0ZXh0IGZvcm1hdFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0YW5kYXJkIG91dHB1dC4gIFRoZSBtZXNzYWdlIHR5cGUgbXVzdFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGRlZmluZWQgaW4gUFJPVE9fRklMRVMgb3IgdGhlaXIgaW1wb3J0cy5cbiIKKyIgIC0tZGVjb2RlX3JhdyAgICAgICAgICAgICAgICBSZWFkIGFuIGFyYml0cmFyeSBwcm90b2NvbCBtZXNzYWdlIGZyb21cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGUgdGhlIHJhdyB0YWcvdmFsdWVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlycyBpbiB0ZXh0IGZvcm1hdCB0byBzdGFuZGFyZCBvdXRwdXQuICBOb1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RPX0ZJTEVTIHNob3VsZCBiZSBnaXZlbiB3aGVuIHVzaW5nIHRoaXNcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLlxuIgorIiAgLW9GSUxFLCAgICAgICAgICAgICAgICAgICAgIFdyaXRlcyBhIEZpbGVEZXNjcmlwdG9yU2V0IChhIHByb3RvY29sIGJ1ZmZlcixcbiIKKyIgICAgLS1kZXNjcmlwdG9yX3NldF9vdXQ9RklMRSBkZWZpbmVkIGluIGRlc2NyaXB0b3IucHJvdG8pIGNvbnRhaW5pbmcgYWxsIG9mXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IGZpbGVzIHRvIEZJTEUuXG4iCisiICAtLWluY2x1ZGVfaW1wb3J0cyAgICAgICAgICAgV2hlbiB1c2luZyAtLWRlc2NyaXB0b3Jfc2V0X291dCwgYWxzbyBpbmNsdWRlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGRlcGVuZGVuY2llcyBvZiB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LCBzbyB0aGF0IHRoZSBzZXQgaXMgc2VsZi1jb250YWluZWQuXG4iCisiICAtLWVycm9yX2Zvcm1hdD1GT1JNQVQgICAgICAgU2V0IHRoZSBmb3JtYXQgaW4gd2hpY2ggdG8gcHJpbnQgZXJyb3JzLlxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVCBtYXkgYmUgJ2djYycgKHRoZSBkZWZhdWx0KSBvciAnbXN2cydcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gZm9ybWF0KS4iIDw8IGVuZGw7CisgIGlmICghcGx1Z2luX3ByZWZpeF8uZW1wdHkoKSkgeworICAgIGNlcnIgPDwKKyIgIC0tcGx1Z2luPUVYRUNVVEFCTEUgICAgICAgICBTcGVjaWZpZXMgYSBwbHVnaW4gZXhlY3V0YWJsZSB0byB1c2UuXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsbHksIHByb3RvYyBzZWFyY2hlcyB0aGUgUEFUSCBmb3JcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5zLCBidXQgeW91IG1heSBzcGVjaWZ5IGFkZGl0aW9uYWxcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlcyBub3QgaW4gdGhlIHBhdGggdXNpbmcgdGhpcyBmbGFnLlxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgRVhFQ1VUQUJMRSBtYXkgYmUgb2YgdGhlIGZvcm1cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FPVBBVEgsIGluIHdoaWNoIGNhc2UgdGhlIGdpdmVuIHBsdWdpbiBuYW1lXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbWFwcGVkIHRvIHRoZSBnaXZlbiBleGVjdXRhYmxlIGV2ZW4gaWZcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXhlY3V0YWJsZSdzIG93biBuYW1lIGRpZmZlcnMuIiA8PCBlbmRsOworICB9CisKKyAgZm9yIChHZW5lcmF0b3JNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBnZW5lcmF0b3JzXy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gZ2VuZXJhdG9yc18uZW5kKCk7ICsraXRlcikgeworICAgIC8vIEZJWE1FKGtlbnRvbik6ICBJZiB0aGUgdGV4dCBpcyBsb25nIGVub3VnaCBpdCB3aWxsIHdyYXAsIHdoaWNoIGlzIHVnbHksCisgICAgLy8gICBidXQgZml4aW5nIHRoaXMgbmljZWx5IChlLmcuIHNwbGl0dGluZyBvbiBzcGFjZXMpIGlzIHByb2JhYmx5IG1vcmUKKyAgICAvLyAgIHRyb3VibGUgdGhhbiBpdCdzIHdvcnRoLgorICAgIGNlcnIgPDwgIiAgIiA8PCBpdGVyLT5maXJzdCA8PCAiPU9VVF9ESVIgIgorICAgICAgICAgPDwgc3RyaW5nKDE5IC0gaXRlci0+Zmlyc3Quc2l6ZSgpLCAnICcpICAvLyBTcGFjZXMgZm9yIGFsaWdubWVudC4KKyAgICAgICAgIDw8IGl0ZXItPnNlY29uZC5oZWxwX3RleHQgPDwgZW5kbDsKKyAgfQorfQorCitib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0ZU91dHB1dCgKKyAgICBjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzLAorICAgIGNvbnN0IE91dHB1dERpcmVjdGl2ZSYgb3V0cHV0X2RpcmVjdGl2ZSwKKyAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCkgeworICAvLyBDYWxsIHRoZSBnZW5lcmF0b3IuCisgIHN0cmluZyBlcnJvcjsKKyAgaWYgKG91dHB1dF9kaXJlY3RpdmUuZ2VuZXJhdG9yID09IE5VTEwpIHsKKyAgICAvLyBUaGlzIGlzIGEgcGx1Z2luLgorICAgIEdPT0dMRV9DSEVDSyhIYXNQcmVmaXhTdHJpbmcob3V0cHV0X2RpcmVjdGl2ZS5uYW1lLCAiLS0iKSAmJgorICAgICAgICAgIEhhc1N1ZmZpeFN0cmluZyhvdXRwdXRfZGlyZWN0aXZlLm5hbWUsICJfb3V0IikpCisgICAgICAgIDw8ICJCYWQgbmFtZSBmb3IgcGx1Z2luIGdlbmVyYXRvcjogIiA8PCBvdXRwdXRfZGlyZWN0aXZlLm5hbWU7CisKKyAgICAvLyBTdHJpcCB0aGUgIi0tIiBhbmQgIl9vdXQiIGFuZCBhZGQgdGhlIHBsdWdpbiBwcmVmaXguCisgICAgc3RyaW5nIHBsdWdpbl9uYW1lID0gcGx1Z2luX3ByZWZpeF8gKyAiZ2VuLSIgKworICAgICAgICBvdXRwdXRfZGlyZWN0aXZlLm5hbWUuc3Vic3RyKDIsIG91dHB1dF9kaXJlY3RpdmUubmFtZS5zaXplKCkgLSA2KTsKKworICAgIGlmICghR2VuZXJhdGVQbHVnaW5PdXRwdXQocGFyc2VkX2ZpbGVzLCBwbHVnaW5fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXJlY3RpdmUucGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yX2NvbnRleHQsICZlcnJvcikpIHsKKyAgICAgIGNlcnIgPDwgb3V0cHV0X2RpcmVjdGl2ZS5uYW1lIDw8ICI6ICIgPDwgZXJyb3IgPDwgZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gUmVndWxhciBnZW5lcmF0b3IuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGlmICghb3V0cHV0X2RpcmVjdGl2ZS5nZW5lcmF0b3ItPkdlbmVyYXRlKAorICAgICAgICAgIHBhcnNlZF9maWxlc1tpXSwgb3V0cHV0X2RpcmVjdGl2ZS5wYXJhbWV0ZXIsCisgICAgICAgICAgZ2VuZXJhdG9yX2NvbnRleHQsICZlcnJvcikpIHsKKyAgICAgICAgLy8gR2VuZXJhdG9yIHJldHVybmVkIGFuIGVycm9yLgorICAgICAgICBjZXJyIDw8IG91dHB1dF9kaXJlY3RpdmUubmFtZSA8PCAiOiAiIDw8IHBhcnNlZF9maWxlc1tpXS0+bmFtZSgpIDw8ICI6ICIKKyAgICAgICAgICAgICA8PCBlcnJvciA8PCBlbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRlUGx1Z2luT3V0cHV0KAorICAgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMsCisgICAgY29uc3Qgc3RyaW5nJiBwbHVnaW5fbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICBzdHJpbmcqIGVycm9yKSB7CisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0IHJlcXVlc3Q7CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZSByZXNwb25zZTsKKworICAvLyBCdWlsZCB0aGUgcmVxdWVzdC4KKyAgaWYgKCFwYXJhbWV0ZXIuZW1wdHkoKSkgeworICAgIHJlcXVlc3Quc2V0X3BhcmFtZXRlcihwYXJhbWV0ZXIpOworICB9CisKKyAgc2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gYWxyZWFkeV9zZWVuOworICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZF9maWxlcy5zaXplKCk7IGkrKykgeworICAgIHJlcXVlc3QuYWRkX2ZpbGVfdG9fZ2VuZXJhdGUocGFyc2VkX2ZpbGVzW2ldLT5uYW1lKCkpOworICAgIEdldFRyYW5zaXRpdmVEZXBlbmRlbmNpZXMocGFyc2VkX2ZpbGVzW2ldLCAmYWxyZWFkeV9zZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5tdXRhYmxlX3Byb3RvX2ZpbGUoKSk7CisgIH0KKworICAvLyBJbnZva2UgdGhlIHBsdWdpbi4KKyAgU3VicHJvY2VzcyBzdWJwcm9jZXNzOworCisgIGlmIChwbHVnaW5zXy5jb3VudChwbHVnaW5fbmFtZSkgPiAwKSB7CisgICAgc3VicHJvY2Vzcy5TdGFydChwbHVnaW5zX1twbHVnaW5fbmFtZV0sIFN1YnByb2Nlc3M6OkVYQUNUX05BTUUpOworICB9IGVsc2UgeworICAgIHN1YnByb2Nlc3MuU3RhcnQocGx1Z2luX25hbWUsIFN1YnByb2Nlc3M6OlNFQVJDSF9QQVRIKTsKKyAgfQorCisgIHN0cmluZyBjb21tdW5pY2F0ZV9lcnJvcjsKKyAgaWYgKCFzdWJwcm9jZXNzLkNvbW11bmljYXRlKHJlcXVlc3QsICZyZXNwb25zZSwgJmNvbW11bmljYXRlX2Vycm9yKSkgeworICAgICplcnJvciA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoIiQwOiAkMSIsIHBsdWdpbl9uYW1lLCBjb21tdW5pY2F0ZV9lcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gV3JpdGUgdGhlIGZpbGVzLiAgV2UgZG8gdGhpcyBldmVuIGlmIHRoZXJlIHdhcyBhIGdlbmVyYXRvciBlcnJvciBpbiBvcmRlcgorICAvLyB0byBtYXRjaCB0aGUgYmVoYXZpb3Igb2YgYSBjb21waWxlZC1pbiBnZW5lcmF0b3IuCisgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBjdXJyZW50X291dHB1dDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNwb25zZS5maWxlX3NpemUoKTsgaSsrKSB7CisgICAgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpGaWxlJiBvdXRwdXRfZmlsZSA9IHJlc3BvbnNlLmZpbGUoaSk7CisKKyAgICBpZiAoIW91dHB1dF9maWxlLmluc2VydGlvbl9wb2ludCgpLmVtcHR5KCkpIHsKKyAgICAgIC8vIE9wZW4gYSBmaWxlIGZvciBpbnNlcnQuCisgICAgICAvLyBXZSByZXNldCBjdXJyZW50X291dHB1dCB0byBOVUxMIGZpcnN0IHNvIHRoYXQgdGhlIG9sZCBmaWxlIGlzIGNsb3NlZAorICAgICAgLy8gYmVmb3JlIHRoZSBuZXcgb25lIGlzIG9wZW5lZC4KKyAgICAgIGN1cnJlbnRfb3V0cHV0LnJlc2V0KCk7CisgICAgICBjdXJyZW50X291dHB1dC5yZXNldChnZW5lcmF0b3JfY29udGV4dC0+T3BlbkZvckluc2VydCgKKyAgICAgICAgICBvdXRwdXRfZmlsZS5uYW1lKCksIG91dHB1dF9maWxlLmluc2VydGlvbl9wb2ludCgpKSk7CisgICAgfSBlbHNlIGlmICghb3V0cHV0X2ZpbGUubmFtZSgpLmVtcHR5KCkpIHsKKyAgICAgIC8vIFN0YXJ0aW5nIGEgbmV3IGZpbGUuICBPcGVuIGl0LgorICAgICAgLy8gV2UgcmVzZXQgY3VycmVudF9vdXRwdXQgdG8gTlVMTCBmaXJzdCBzbyB0aGF0IHRoZSBvbGQgZmlsZSBpcyBjbG9zZWQKKyAgICAgIC8vIGJlZm9yZSB0aGUgbmV3IG9uZSBpcyBvcGVuZWQuCisgICAgICBjdXJyZW50X291dHB1dC5yZXNldCgpOworICAgICAgY3VycmVudF9vdXRwdXQucmVzZXQoZ2VuZXJhdG9yX2NvbnRleHQtPk9wZW4ob3V0cHV0X2ZpbGUubmFtZSgpKSk7CisgICAgfSBlbHNlIGlmIChjdXJyZW50X291dHB1dCA9PSBOVUxMKSB7CisgICAgICAqZXJyb3IgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAiJDA6IEZpcnN0IGZpbGUgY2h1bmsgcmV0dXJuZWQgYnkgcGx1Z2luIGRpZCBub3Qgc3BlY2lmeSBhIGZpbGUgbmFtZS4iLAorICAgICAgICBwbHVnaW5fbmFtZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVXNlIENvZGVkT3V0cHV0U3RyZWFtIGZvciBjb252ZW5pZW5jZTsgb3RoZXJ3aXNlIHdlJ2QgbmVlZCB0byBwcm92aWRlCisgICAgLy8gb3VyIG93biBidWZmZXItY29weWluZyBsb29wLgorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSB3cml0ZXIoY3VycmVudF9vdXRwdXQuZ2V0KCkpOworICAgIHdyaXRlci5Xcml0ZVN0cmluZyhvdXRwdXRfZmlsZS5jb250ZW50KCkpOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIGVycm9ycy4KKyAgaWYgKCFyZXNwb25zZS5lcnJvcigpLmVtcHR5KCkpIHsKKyAgICAvLyBHZW5lcmF0b3IgcmV0dXJuZWQgYW4gZXJyb3IuCisgICAgKmVycm9yID0gcmVzcG9uc2UuZXJyb3IoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6RW5jb2RlT3JEZWNvZGUoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpIHsKKyAgLy8gTG9vayB1cCB0aGUgdHlwZS4KKyAgY29uc3QgRGVzY3JpcHRvciogdHlwZSA9IHBvb2wtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShjb2RlY190eXBlXyk7CisgIGlmICh0eXBlID09IE5VTEwpIHsKKyAgICBjZXJyIDw8ICJUeXBlIG5vdCBkZWZpbmVkOiAiIDw8IGNvZGVjX3R5cGVfIDw8IGVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGR5bmFtaWNfZmFjdG9yeShwb29sKTsKKyAgc2NvcGVkX3B0cjxNZXNzYWdlPiBtZXNzYWdlKGR5bmFtaWNfZmFjdG9yeS5HZXRQcm90b3R5cGUodHlwZSktPk5ldygpKTsKKworICBpZiAobW9kZV8gPT0gTU9ERV9FTkNPREUpIHsKKyAgICBTZXRGZFRvVGV4dE1vZGUoU1RESU5fRklMRU5PKTsKKyAgICBTZXRGZFRvQmluYXJ5TW9kZShTVERPVVRfRklMRU5PKTsKKyAgfSBlbHNlIHsKKyAgICBTZXRGZFRvQmluYXJ5TW9kZShTVERJTl9GSUxFTk8pOworICAgIFNldEZkVG9UZXh0TW9kZShTVERPVVRfRklMRU5PKTsKKyAgfQorCisgIGlvOjpGaWxlSW5wdXRTdHJlYW0gaW4oU1RESU5fRklMRU5PKTsKKyAgaW86OkZpbGVPdXRwdXRTdHJlYW0gb3V0KFNURE9VVF9GSUxFTk8pOworCisgIGlmIChtb2RlXyA9PSBNT0RFX0VOQ09ERSkgeworICAgIC8vIElucHV0IGlzIHRleHQuCisgICAgRXJyb3JQcmludGVyIGVycm9yX2NvbGxlY3RvcihlcnJvcl9mb3JtYXRfKTsKKyAgICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICAgIHBhcnNlci5SZWNvcmRFcnJvcnNUbygmZXJyb3JfY29sbGVjdG9yKTsKKyAgICBwYXJzZXIuQWxsb3dQYXJ0aWFsTWVzc2FnZSh0cnVlKTsKKworICAgIGlmICghcGFyc2VyLlBhcnNlKCZpbiwgbWVzc2FnZS5nZXQoKSkpIHsKKyAgICAgIGNlcnIgPDwgIkZhaWxlZCB0byBwYXJzZSBpbnB1dC4iIDw8IGVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIElucHV0IGlzIGJpbmFyeS4KKyAgICBpZiAoIW1lc3NhZ2UtPlBhcnNlUGFydGlhbEZyb21aZXJvQ29weVN0cmVhbSgmaW4pKSB7CisgICAgICBjZXJyIDw8ICJGYWlsZWQgdG8gcGFyc2UgaW5wdXQuIiA8PCBlbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGlmICghbWVzc2FnZS0+SXNJbml0aWFsaXplZCgpKSB7CisgICAgY2VyciA8PCAid2FybmluZzogIElucHV0IG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICAiCisgICAgICAgICA8PCBtZXNzYWdlLT5Jbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkgPDwgZW5kbDsKKyAgfQorCisgIGlmIChtb2RlXyA9PSBNT0RFX0VOQ09ERSkgeworICAgIC8vIE91dHB1dCBpcyBiaW5hcnkuCisgICAgaWYgKCFtZXNzYWdlLT5TZXJpYWxpemVQYXJ0aWFsVG9aZXJvQ29weVN0cmVhbSgmb3V0KSkgeworICAgICAgY2VyciA8PCAib3V0cHV0OiBJL08gZXJyb3IuIiA8PCBlbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBPdXRwdXQgaXMgdGV4dC4KKyAgICBpZiAoIVRleHRGb3JtYXQ6OlByaW50KCptZXNzYWdlLCAmb3V0KSkgeworICAgICAgY2VyciA8PCAib3V0cHV0OiBJL08gZXJyb3IuIiA8PCBlbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpXcml0ZURlc2NyaXB0b3JTZXQoCisgICAgY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gcGFyc2VkX2ZpbGVzKSB7CisgIEZpbGVEZXNjcmlwdG9yU2V0IGZpbGVfc2V0OworCisgIGlmIChpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XykgeworICAgIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IGFscmVhZHlfc2VlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZF9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgR2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcygKKyAgICAgICAgICBwYXJzZWRfZmlsZXNbaV0sICZhbHJlYWR5X3NlZW4sIGZpbGVfc2V0Lm11dGFibGVfZmlsZSgpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIHBhcnNlZF9maWxlc1tpXS0+Q29weVRvKGZpbGVfc2V0LmFkZF9maWxlKCkpOworICAgIH0KKyAgfQorCisgIGludCBmZDsKKyAgZG8geworICAgIGZkID0gb3BlbihkZXNjcmlwdG9yX3NldF9uYW1lXy5jX3N0cigpLAorICAgICAgICAgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksIDA2NjYpOworICB9IHdoaWxlIChmZCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgIGlmIChmZCA8IDApIHsKKyAgICBwZXJyb3IoZGVzY3JpcHRvcl9zZXRfbmFtZV8uY19zdHIoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW86OkZpbGVPdXRwdXRTdHJlYW0gb3V0KGZkKTsKKyAgaWYgKCFmaWxlX3NldC5TZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKCZvdXQpKSB7CisgICAgY2VyciA8PCBkZXNjcmlwdG9yX3NldF9uYW1lXyA8PCAiOiAiIDw8IHN0cmVycm9yKG91dC5HZXRFcnJubygpKSA8PCBlbmRsOworICAgIG91dC5DbG9zZSgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIW91dC5DbG9zZSgpKSB7CisgICAgY2VyciA8PCBkZXNjcmlwdG9yX3NldF9uYW1lXyA8PCAiOiAiIDw8IHN0cmVycm9yKG91dC5HZXRFcnJubygpKSA8PCBlbmRsOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZXRUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBhbHJlYWR5X3NlZW4sCisgICAgUmVwZWF0ZWRQdHJGaWVsZDxGaWxlRGVzY3JpcHRvclByb3RvPiogb3V0cHV0KSB7CisgIGlmICghYWxyZWFkeV9zZWVuLT5pbnNlcnQoZmlsZSkuc2Vjb25kKSB7CisgICAgLy8gQWxyZWFkeSBzYXcgdGhpcyBmaWxlLiAgU2tpcC4KKyAgICByZXR1cm47CisgIH0KKworICAvLyBBZGQgYWxsIGRlcGVuZGVuY2llcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIEdldFRyYW5zaXRpdmVEZXBlbmRlbmNpZXMoZmlsZS0+ZGVwZW5kZW5jeShpKSwgYWxyZWFkeV9zZWVuLCBvdXRwdXQpOworICB9CisKKyAgLy8gQWRkIHRoaXMgZmlsZS4KKyAgZmlsZS0+Q29weVRvKG91dHB1dC0+QWRkKCkpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1MDdkOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDMxOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gSW1wbGVtZW50cyB0aGUgUHJvdG9jb2wgQ29tcGlsZXIgZnJvbnQtZW5kIHN1Y2ggdGhhdCBpdCBtYXkgYmUgcmV1c2VkIGJ5CisvLyBjdXN0b20gY29tcGlsZXJzIHdyaXR0ZW4gdG8gc3VwcG9ydCBvdGhlciBsYW5ndWFnZXMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NPTU1BTkRfTElORV9JTlRFUkZBQ0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DT01NQU5EX0xJTkVfSU5URVJGQUNFX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIEZpbGVEZXNjcmlwdG9yOyAgICAgICAgLy8gZGVzY3JpcHRvci5oCitjbGFzcyBEZXNjcmlwdG9yUG9vbDsgICAgICAgIC8vIGRlc2NyaXB0b3IuaAorY2xhc3MgRmlsZURlc2NyaXB0b3JQcm90bzsgICAvLyBkZXNjcmlwdG9yLnBiLmgKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFJlcGVhdGVkUHRyRmllbGQ7ICAvLyByZXBlYXRlZF9maWVsZC5oCisKK25hbWVzcGFjZSBjb21waWxlciB7CisKK2NsYXNzIENvZGVHZW5lcmF0b3I7ICAgICAgICAvLyBjb2RlX2dlbmVyYXRvci5oCitjbGFzcyBHZW5lcmF0b3JDb250ZXh0OyAgICAgIC8vIGNvZGVfZ2VuZXJhdG9yLmgKK2NsYXNzIERpc2tTb3VyY2VUcmVlOyAgICAgICAvLyBpbXBvcnRlci5oCisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgY29tbWFuZC1saW5lIGludGVyZmFjZSB0byB0aGUgcHJvdG9jb2wgY29tcGlsZXIuCisvLyBJdCBpcyBkZXNpZ25lZCB0byBtYWtlIGl0IHZlcnkgZWFzeSB0byBjcmVhdGUgYSBjdXN0b20gcHJvdG9jb2wgY29tcGlsZXIKKy8vIHN1cHBvcnRpbmcgdGhlIGxhbmd1YWdlcyBvZiB5b3VyIGNob2ljZS4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCisvLyBjcmVhdGUgYSBjdXN0b20gcHJvdG9jb2wgY29tcGlsZXIgYmluYXJ5IHdoaWNoIGluY2x1ZGVzIGJvdGggdGhlIHJlZ3VsYXIKKy8vIEMrKyBzdXBwb3J0IHBsdXMgc3VwcG9ydCBmb3IgeW91ciBvd24gY3VzdG9tIG91dHB1dCAiRm9vIiwgeW91IHdvdWxkCisvLyB3cml0ZSBhIGNsYXNzICJGb29HZW5lcmF0b3IiIHdoaWNoIGltcGxlbWVudHMgdGhlIENvZGVHZW5lcmF0b3IgaW50ZXJmYWNlLAorLy8gdGhlbiB3cml0ZSBhIG1haW4oKSBwcm9jZWR1cmUgbGlrZSB0aGlzOgorLy8KKy8vICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworLy8gICAgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb21tYW5kTGluZUludGVyZmFjZSBjbGk7CisvLworLy8gICAgIC8vIFN1cHBvcnQgZ2VuZXJhdGlvbiBvZiBDKysgc291cmNlIGFuZCBoZWFkZXJzLgorLy8gICAgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpjcHA6OkNwcEdlbmVyYXRvciBjcHBfZ2VuZXJhdG9yOworLy8gICAgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1jcHBfb3V0IiwgJmNwcF9nZW5lcmF0b3IsCisvLyAgICAgICAiR2VuZXJhdGUgQysrIHNvdXJjZSBhbmQgaGVhZGVyLiIpOworLy8KKy8vICAgICAvLyBTdXBwb3J0IGdlbmVyYXRpb24gb2YgRm9vIGNvZGUuCisvLyAgICAgRm9vR2VuZXJhdG9yIGZvb19nZW5lcmF0b3I7CisvLyAgICAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWZvb19vdXQiLCAmZm9vX2dlbmVyYXRvciwKKy8vICAgICAgICJHZW5lcmF0ZSBGb28gZmlsZS4iKTsKKy8vCisvLyAgICAgcmV0dXJuIGNsaS5SdW4oYXJnYywgYXJndik7CisvLyAgIH0KKy8vCisvLyBUaGUgY29tcGlsZXIgaXMgaW52b2tlZCB3aXRoIHN5bnRheCBsaWtlOgorLy8gICBwcm90b2MgLS1jcHBfb3V0PW91dGRpciAtLWZvb19vdXQ9b3V0ZGlyIC0tcHJvdG9fcGF0aD1zcmMgc3JjL2Zvby5wcm90bworLy8KKy8vIEZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQtbGluZSBzeW50YXgsIGludm9rZSBpdCB3aXRoIC0taGVscC4KK2NsYXNzIExJQlBST1RPQ19FWFBPUlQgQ29tbWFuZExpbmVJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgQ29tbWFuZExpbmVJbnRlcmZhY2UoKTsKKyAgfkNvbW1hbmRMaW5lSW50ZXJmYWNlKCk7CisKKyAgLy8gUmVnaXN0ZXIgYSBjb2RlIGdlbmVyYXRvciBmb3IgYSBsYW5ndWFnZS4KKyAgLy8KKyAgLy8gUGFyYW1ldGVyczoKKyAgLy8gKiBmbGFnX25hbWU6IFRoZSBjb21tYW5kLWxpbmUgZmxhZyB1c2VkIHRvIHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUgb2YKKyAgLy8gICB0aGlzIHR5cGUuICBUaGUgbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSAnLScuICBJZiB0aGUgbmFtZSBpcyBsb25nZXIKKyAgLy8gICB0aGFuIG9uZSBsZXR0ZXIsIGl0IG11c3Qgc3RhcnQgd2l0aCB0d28gJy0ncy4KKyAgLy8gKiBnZW5lcmF0b3I6IFRoZSBDb2RlR2VuZXJhdG9yIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHRvIGdlbmVyYXRlIGZpbGVzCisgIC8vICAgb2YgdGhpcyB0eXBlLgorICAvLyAqIGhlbHBfdGV4dDogVGV4dCBkZXNjcmliaW5nIHRoaXMgZmxhZyBpbiB0aGUgLS1oZWxwIG91dHB1dC4KKyAgLy8KKyAgLy8gU29tZSBnZW5lcmF0b3JzIGFjY2VwdCBleHRyYSBwYXJhbWV0ZXJzLiAgWW91IGNhbiBzcGVjaWZ5IHRoaXMgcGFyYW1ldGVyCisgIC8vIG9uIHRoZSBjb21tYW5kLWxpbmUgYnkgcGxhY2luZyBpdCBiZWZvcmUgdGhlIG91dHB1dCBkaXJlY3RvcnksIHNlcGFyYXRlZAorICAvLyBieSBhIGNvbG9uOgorICAvLyAgIHByb3RvYyAtLWZvb19vdXQ9ZW5hYmxlX2JhcjpvdXRkaXIKKyAgLy8gVGhlIHRleHQgYmVmb3JlIHRoZSBjb2xvbiBpcyBwYXNzZWQgdG8gQ29kZUdlbmVyYXRvcjo6R2VuZXJhdGUoKSBhcyB0aGUKKyAgLy8gInBhcmFtZXRlciIuCisgIHZvaWQgUmVnaXN0ZXJHZW5lcmF0b3IoY29uc3Qgc3RyaW5nJiBmbGFnX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaGVscF90ZXh0KTsKKworICAvLyBFbmFibGVzICJwbHVnaW5zIi4gIEluIHRoaXMgbW9kZSwgaWYgYSBjb21tYW5kLWxpbmUgZmxhZyBlbmRzIHdpdGggIl9vdXQiCisgIC8vIGJ1dCBkb2VzIG5vdCBtYXRjaCBhbnkgcmVnaXN0ZXJlZCBnZW5lcmF0b3IsIHRoZSBjb21waWxlciB3aWxsIGF0dGVtcHQgdG8KKyAgLy8gZmluZCBhICJwbHVnaW4iIHRvIGltcGxlbWVudCB0aGUgZ2VuZXJhdG9yLiAgUGx1Z2lucyBhcmUganVzdCBleGVjdXRhYmxlcy4KKyAgLy8gVGhleSBzaG91bGQgbGl2ZSBzb21ld2hlcmUgaW4gdGhlIFBBVEguCisgIC8vCisgIC8vIFRoZSBjb21waWxlciBkZXRlcm1pbmVzIHRoZSBleGVjdXRhYmxlIG5hbWUgdG8gc2VhcmNoIGZvciBieSBjb25jYXRlbmF0aW5nCisgIC8vIGV4ZV9uYW1lX3ByZWZpeCB3aXRoIHRoZSB1bnJlY29nbml6ZWQgZmxhZyBuYW1lLCByZW1vdmluZyAiX291dCIuICBTbywgZm9yCisgIC8vIGV4YW1wbGUsIGlmIGV4ZV9uYW1lX3ByZWZpeCBpcyAicHJvdG9jLSIgYW5kIHlvdSBwYXNzIHRoZSBmbGFnIC0tZm9vX291dCwKKyAgLy8gdGhlIGNvbXBpbGVyIHdpbGwgdHJ5IHRvIHJ1biB0aGUgcHJvZ3JhbSAicHJvdG9jLWZvbyIuCisgIC8vCisgIC8vIFRoZSBwbHVnaW4gcHJvZ3JhbSBzaG91bGQgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgdXNhZ2U6CisgIC8vICAgcGx1Z2luIFstLW91dD1PVVRESVJdIFstLXBhcmFtZXRlcj1QQVJBTUVURVJdIFBST1RPX0ZJTEVTIDwgREVTQ1JJUFRPUlMKKyAgLy8gLS1vdXQgaW5kaWNhdGVzIHRoZSBvdXRwdXQgZGlyZWN0b3J5IChhcyBwYXNzZWQgdG8gdGhlIC0tZm9vX291dAorICAvLyBwYXJhbWV0ZXIpOyBpZiBvbWl0dGVkLCB0aGUgY3VycmVudCBkaXJlY3Rvcnkgc2hvdWxkIGJlIHVzZWQuICAtLXBhcmFtZXRlcgorICAvLyBnaXZlcyB0aGUgZ2VuZXJhdG9yIHBhcmFtZXRlciwgaWYgYW55IHdhcyBwcm92aWRlZC4gIFRoZSBQUk9UT19GSUxFUyBsaXN0CisgIC8vIHRoZSAucHJvdG8gZmlsZXMgd2hpY2ggd2VyZSBnaXZlbiBvbiB0aGUgY29tcGlsZXIgY29tbWFuZC1saW5lOyB0aGVzZSBhcmUKKyAgLy8gdGhlIGZpbGVzIGZvciB3aGljaCB0aGUgcGx1Z2luIGlzIGV4cGVjdGVkIHRvIGdlbmVyYXRlIG91dHB1dCBjb2RlLgorICAvLyBGaW5hbGx5LCBERVNDUklQVE9SUyBpcyBhbiBlbmNvZGVkIEZpbGVEZXNjcmlwdG9yU2V0IChhcyBkZWZpbmVkIGluCisgIC8vIGRlc2NyaXB0b3IucHJvdG8pLiAgVGhpcyBpcyBwaXBlZCB0byB0aGUgcGx1Z2luJ3Mgc3RkaW4uICBUaGUgc2V0IHdpbGwKKyAgLy8gaW5jbHVkZSBkZXNjcmlwdG9ycyBmb3IgYWxsIHRoZSBmaWxlcyBsaXN0ZWQgaW4gUFJPVE9fRklMRVMgYXMgd2VsbCBhcworICAvLyBhbGwgZmlsZXMgdGhhdCB0aGV5IGltcG9ydC4gIFRoZSBwbHVnaW4gTVVTVCBOT1QgYXR0ZW1wdCB0byByZWFkIHRoZQorICAvLyBQUk9UT19GSUxFUyBkaXJlY3RseSAtLSBpdCBtdXN0IHVzZSB0aGUgRmlsZURlc2NyaXB0b3JTZXQuCisgIC8vCisgIC8vIFRoZSBwbHVnaW4gc2hvdWxkIGdlbmVyYXRlIHdoYXRldmVyIGZpbGVzIGFyZSBuZWNlc3NhcnksIGFzIGNvZGUgZ2VuZXJhdG9ycworICAvLyBub3JtYWxseSBkby4gIEl0IHNob3VsZCB3cml0ZSB0aGUgbmFtZXMgb2YgYWxsIGZpbGVzIGl0IGdlbmVyYXRlcyB0bworICAvLyBzdGRvdXQuICBUaGUgbmFtZXMgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBOT1QgYWJzb2x1dGUKKyAgLy8gbmFtZXMgb3IgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgSWYgYW55IGVycm9ycyBvY2N1ciwgZXJyb3IKKyAgLy8gbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gc3RkZXJyLiAgSWYgYW4gZXJyb3IgaXMgZmF0YWwsIHRoZSBwbHVnaW4KKyAgLy8gc2hvdWxkIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZS4KKyAgdm9pZCBBbGxvd1BsdWdpbnMoY29uc3Qgc3RyaW5nJiBleGVfbmFtZV9wcmVmaXgpOworCisgIC8vIFJ1biB0aGUgUHJvdG9jb2wgQ29tcGlsZXIgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC1saW5lIHBhcmFtZXRlcnMuCisgIC8vIFJldHVybnMgdGhlIGVycm9yIGNvZGUgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIGJ5IG1haW4oKS4KKyAgLy8KKyAgLy8gSXQgbWF5IG5vdCBiZSBzYWZlIHRvIGNhbGwgUnVuKCkgaW4gYSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudCBiZWNhdXNlCisgIC8vIGl0IGNhbGxzIHN0cmVycm9yKCkuICBJJ20gbm90IHN1cmUgd2h5IHlvdSdkIHdhbnQgdG8gZG8gdGhpcyBhbnl3YXkuCisgIGludCBSdW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSk7CisKKyAgLy8gQ2FsbCBTZXRJbnB1dHNBcmVDd2RSZWxhdGl2ZSh0cnVlKSBpZiB0aGUgaW5wdXQgZmlsZXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKKyAgLy8gbGluZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHByb3RvIGltcG9ydCBwYXRoIHNwZWNpZmllZAorICAvLyB1c2luZyAtLXByb3RvX3BhdGggb3IgLUkgZmxhZ3MuICBPdGhlcndpc2UsIGlucHV0IGZpbGUgbmFtZXMgd2lsbCBiZQorICAvLyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAob3IgYXMgYWJzb2x1dGUKKyAgLy8gcGF0aHMgaWYgdGhleSBzdGFydCB3aXRoICcvJyksIHRob3VnaCB0aGV5IG11c3Qgc3RpbGwgcmVzaWRlIGluc2lkZQorICAvLyBhIGRpcmVjdG9yeSBnaXZlbiBieSAtLXByb3RvX3BhdGggb3IgdGhlIGNvbXBpbGVyIHdpbGwgZmFpbC4gIFRoZSBsYXR0ZXIKKyAgLy8gbW9kZSBpcyBnZW5lcmFsbHkgbW9yZSBpbnR1aXRpdmUgYW5kIGVhc2llciB0byB1c2UsIGVzcGVjaWFsbHkgZS5nLiB3aGVuCisgIC8vIGRlZmluaW5nIGltcGxpY2l0IHJ1bGVzIGluIE1ha2VmaWxlcy4KKyAgdm9pZCBTZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZShib29sIGVuYWJsZSkgeworICAgIGlucHV0c19hcmVfcHJvdG9fcGF0aF9yZWxhdGl2ZV8gPSBlbmFibGU7CisgIH0KKworICAvLyBQcm92aWRlcyBzb21lIHRleHQgd2hpY2ggd2lsbCBiZSBwcmludGVkIHdoZW4gdGhlIC0tdmVyc2lvbiBmbGFnIGlzCisgIC8vIHVzZWQuICBUaGUgdmVyc2lvbiBvZiBsaWJwcm90b2Mgd2lsbCBhbHNvIGJlIHByaW50ZWQgb24gdGhlIG5leHQgbGluZQorICAvLyBhZnRlciB0aGlzIHRleHQuCisgIHZvaWQgU2V0VmVyc2lvbkluZm8oY29uc3Qgc3RyaW5nJiB0ZXh0KSB7CisgICAgdmVyc2lvbl9pbmZvXyA9IHRleHQ7CisgIH0KKworCisgcHJpdmF0ZToKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBjbGFzcyBFcnJvclByaW50ZXI7CisgIGNsYXNzIEdlbmVyYXRvckNvbnRleHRJbXBsOworICBjbGFzcyBNZW1vcnlPdXRwdXRTdHJlYW07CisKKyAgLy8gQ2xlYXIgc3RhdGUgZnJvbSBwcmV2aW91cyBSdW4oKS4KKyAgdm9pZCBDbGVhcigpOworCisgIC8vIFJlbWFwcyBlYWNoIGZpbGUgaW4gaW5wdXRfZmlsZXNfIHNvIHRoYXQgaXQgaXMgcmVsYXRpdmUgdG8gb25lIG9mIHRoZQorICAvLyBkaXJlY3RvcmllcyBpbiBwcm90b19wYXRoXy4gIFJldHVybnMgZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuICBUaGlzCisgIC8vIGlzIG9ubHkgdXNlZCBpZiBpbnB1dHNfYXJlX3Byb3RvX3BhdGhfcmVsYXRpdmVfIGlzIGZhbHNlLgorICBib29sIE1ha2VJbnB1dHNCZVByb3RvUGF0aFJlbGF0aXZlKAorICAgIERpc2tTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSk7CisKKyAgLy8gUGFyc2UgYWxsIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCisgIGJvb2wgUGFyc2VBcmd1bWVudHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSk7CisKKyAgLy8gUGFyc2VzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50IGludG8gYSBuYW1lL3ZhbHVlIHBhaXIuICBSZXR1cm5zCisgIC8vIHRydWUgaWYgdGhlIG5leHQgYXJndW1lbnQgaW4gdGhlIGFyZ3Ygc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHZhbHVlLAorICAvLyBmYWxzZSBvdGhlcndpc2UuCisgIC8vCisgIC8vIEV4bWFwbGVzOgorICAvLyAgICItSXNyYy9wcm90b3MiIC0+CisgIC8vICAgICBuYW1lID0gIi1JIiwgdmFsdWUgPSAic3JjL3Byb3RvcyIKKyAgLy8gICAiLS1jcHBfb3V0PXNyYy9mb28ucGIyLmNjIiAtPgorICAvLyAgICAgbmFtZSA9ICItLWNwcF9vdXQiLCB2YWx1ZSA9ICJzcmMvZm9vLnBiMi5jYyIKKyAgLy8gICAiZm9vLnByb3RvIiAtPgorICAvLyAgICAgbmFtZSA9ICIiLCB2YWx1ZSA9ICJmb28ucHJvdG8iCisgIGJvb2wgUGFyc2VBcmd1bWVudChjb25zdCBjaGFyKiBhcmcsIHN0cmluZyogbmFtZSwgc3RyaW5nKiB2YWx1ZSk7CisKKyAgLy8gSW50ZXJwcmV0cyBhcmd1bWVudHMgcGFyc2VkIHdpdGggUGFyc2VBcmd1bWVudC4KKyAgYm9vbCBJbnRlcnByZXRBcmd1bWVudChjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgdmFsdWUpOworCisgIC8vIFByaW50IHRoZSAtLWhlbHAgdGV4dCB0byBzdGRlcnIuCisgIHZvaWQgUHJpbnRIZWxwVGV4dCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSBnaXZlbiBvdXRwdXQgZmlsZSBmcm9tIHRoZSBnaXZlbiBpbnB1dC4KKyAgc3RydWN0IE91dHB1dERpcmVjdGl2ZTsgIC8vIHNlZSBiZWxvdworICBib29sIEdlbmVyYXRlT3V0cHV0KGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3V0cHV0RGlyZWN0aXZlJiBvdXRwdXRfZGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0KTsKKyAgYm9vbCBHZW5lcmF0ZVBsdWdpbk91dHB1dChjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGx1Z2luX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcik7CisKKyAgLy8gSW1wbGVtZW50cyAtLWVuY29kZSBhbmQgLS1kZWNvZGUuCisgIGJvb2wgRW5jb2RlT3JEZWNvZGUoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpOworCisgIC8vIEltcGxlbWVudHMgdGhlIC0tZGVzY3JpcHRvcl9zZXRfb3V0IG9wdGlvbi4KKyAgYm9vbCBXcml0ZURlc2NyaXB0b3JTZXQoY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gcGFyc2VkX2ZpbGVzKTsKKworICAvLyBHZXQgYWxsIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIG9mIHRoZSBnaXZlbiBmaWxlIChpbmNsdWRpbmcgdGhlIGZpbGUKKyAgLy8gaXRzZWxmKSwgYWRkaW5nIHRoZW0gdG8gdGhlIGdpdmVuIGxpc3Qgb2YgRmlsZURlc2NyaXB0b3JQcm90b3MuICBUaGUKKyAgLy8gcHJvdG9zIHdpbGwgYmUgb3JkZXJlZCBzdWNoIHRoYXQgZXZlcnkgZmlsZSBpcyBsaXN0ZWQgYmVmb3JlIGFueSBmaWxlIHRoYXQKKyAgLy8gZGVwZW5kcyBvbiBpdCwgc28gdGhhdCB5b3UgY2FuIGNhbGwgRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZSgpIG9uIHRoZW0KKyAgLy8gaW4gb3JkZXIuICBBbnkgZmlsZXMgaW4gKmFscmVhZHlfc2VlbiB3aWxsIG5vdCBiZSBhZGRlZCwgYW5kIGVhY2ggZmlsZQorICAvLyBhZGRlZCB3aWxsIGJlIGluc2VydGVkIGludG8gKmFscmVhZHlfc2Vlbi4KKyAgc3RhdGljIHZvaWQgR2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcygKKyAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgc2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4qIGFscmVhZHlfc2VlbiwKKyAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RmlsZURlc2NyaXB0b3JQcm90bz4qIG91dHB1dCk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBUaGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBhcyBpbnZva2VkIChpLmUuIGFyZ3ZbMF0pLgorICBzdHJpbmcgZXhlY3V0YWJsZV9uYW1lXzsKKworICAvLyBWZXJzaW9uIGluZm8gc2V0IHdpdGggU2V0VmVyc2lvbkluZm8oKS4KKyAgc3RyaW5nIHZlcnNpb25faW5mb187CisKKyAgLy8gTWFwIGZyb20gZmxhZyBuYW1lcyB0byByZWdpc3RlcmVkIGdlbmVyYXRvcnMuCisgIHN0cnVjdCBHZW5lcmF0b3JJbmZvIHsKKyAgICBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3I7CisgICAgc3RyaW5nIGhlbHBfdGV4dDsKKyAgfTsKKyAgdHlwZWRlZiBtYXA8c3RyaW5nLCBHZW5lcmF0b3JJbmZvPiBHZW5lcmF0b3JNYXA7CisgIEdlbmVyYXRvck1hcCBnZW5lcmF0b3JzXzsKKworICAvLyBTZWUgQWxsb3dQbHVnaW5zKCkuICBJZiB0aGlzIGlzIGVtcHR5LCBwbHVnaW5zIGFyZW4ndCBhbGxvd2VkLgorICBzdHJpbmcgcGx1Z2luX3ByZWZpeF87CisKKyAgLy8gTWFwcyBzcGVjaWZpYyBwbHVnaW4gbmFtZXMgdG8gZmlsZXMuICBXaGVuIGV4ZWN1dGluZyBhIHBsdWdpbiwgdGhpcyBtYXAKKyAgLy8gaXMgc2VhcmNoZWQgZmlyc3QgdG8gZmluZCB0aGUgcGx1Z2luIGV4ZWN1dGFibGUuICBJZiBub3QgZm91bmQgaGVyZSwgdGhlCisgIC8vIFBBVEggKG9yIG90aGVyIE9TLXNwZWNpZmljIHNlYXJjaCBzdHJhdGVneSkgaXMgc2VhcmNoZWQuCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGx1Z2luc187CisKKyAgLy8gU3R1ZmYgcGFyc2VkIGZyb20gY29tbWFuZCBsaW5lLgorICBlbnVtIE1vZGUgeworICAgIE1PREVfQ09NUElMRSwgIC8vIE5vcm1hbCBtb2RlOiAgcGFyc2UgLnByb3RvIGZpbGVzIGFuZCBjb21waWxlIHRoZW0uCisgICAgTU9ERV9FTkNPREUsICAgLy8gLS1lbmNvZGU6ICByZWFkIHRleHQgZnJvbSBzdGRpbiwgd3JpdGUgYmluYXJ5IHRvIHN0ZG91dC4KKyAgICBNT0RFX0RFQ09ERSAgICAvLyAtLWRlY29kZTogIHJlYWQgYmluYXJ5IGZyb20gc3RkaW4sIHdyaXRlIHRleHQgdG8gc3Rkb3V0LgorICB9OworCisgIE1vZGUgbW9kZV87CisKKyAgZW51bSBFcnJvckZvcm1hdCB7CisgICAgRVJST1JfRk9STUFUX0dDQywgICAvLyBHQ0MgZXJyb3Igb3V0cHV0IGZvcm1hdCAoZGVmYXVsdCkuCisgICAgRVJST1JfRk9STUFUX01TVlMgICAvLyBWaXN1YWwgU3R1ZGlvIG91dHB1dCAoLS1lcnJvcl9mb3JtYXQ9bXN2cykuCisgIH07CisKKyAgRXJyb3JGb3JtYXQgZXJyb3JfZm9ybWF0XzsKKworICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiBwcm90b19wYXRoXzsgIC8vIFNlYXJjaCBwYXRoIGZvciBwcm90byBmaWxlcy4KKyAgdmVjdG9yPHN0cmluZz4gaW5wdXRfZmlsZXNfOyAgICAgICAgICAgICAgICAvLyBOYW1lcyBvZiB0aGUgaW5wdXQgcHJvdG8gZmlsZXMuCisKKyAgLy8gb3V0cHV0X2RpcmVjdGl2ZXNfIGxpc3RzIGFsbCB0aGUgZmlsZXMgd2UgYXJlIHN1cHBvc2VkIHRvIG91dHB1dCBhbmQgd2hhdAorICAvLyBnZW5lcmF0b3IgdG8gdXNlIGZvciBlYWNoLgorICBzdHJ1Y3QgT3V0cHV0RGlyZWN0aXZlIHsKKyAgICBzdHJpbmcgbmFtZTsgICAgICAgICAgICAgICAgLy8gRS5nLiAiLS1mb29fb3V0IgorICAgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvcjsgICAvLyBOVUxMIGZvciBwbHVnaW5zCisgICAgc3RyaW5nIHBhcmFtZXRlcjsKKyAgICBzdHJpbmcgb3V0cHV0X2xvY2F0aW9uOworICB9OworICB2ZWN0b3I8T3V0cHV0RGlyZWN0aXZlPiBvdXRwdXRfZGlyZWN0aXZlc187CisKKyAgLy8gV2hlbiB1c2luZyAtLWVuY29kZSBvciAtLWRlY29kZSwgdGhpcyBuYW1lcyB0aGUgdHlwZSB3ZSBhcmUgZW5jb2Rpbmcgb3IKKyAgLy8gZGVjb2RpbmcuICAoRW1wdHkgc3RyaW5nIGluZGljYXRlcyAtLWRlY29kZV9yYXcuKQorICBzdHJpbmcgY29kZWNfdHlwZV87CisKKyAgLy8gSWYgLS1kZXNjcmlwdG9yX3NldF9vdXQgd2FzIGdpdmVuLCB0aGlzIGlzIHRoZSBmaWxlbmFtZSB0byB3aGljaCB0aGUKKyAgLy8gRmlsZURlc2NyaXB0b3JTZXQgc2hvdWxkIGJlIHdyaXR0ZW4uICBPdGhlcndpc2UsIGVtcHR5LgorICBzdHJpbmcgZGVzY3JpcHRvcl9zZXRfbmFtZV87CisKKyAgLy8gVHJ1ZSBpZiAtLWluY2x1ZGVfaW1wb3J0cyB3YXMgZ2l2ZW4sIG1lYW5pbmcgdGhhdCB3ZSBzaG91bGQKKyAgLy8gd3JpdGUgYWxsIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIHRvIHRoZSBEZXNjcmlwdG9yU2V0LiAgT3RoZXJ3aXNlLCBvbmx5CisgIC8vIHRoZSAucHJvdG8gZmlsZXMgbGlzdGVkIG9uIHRoZSBjb21tYW5kLWxpbmUgYXJlIGFkZGVkLgorICBib29sIGltcG9ydHNfaW5fZGVzY3JpcHRvcl9zZXRfOworCisgIC8vIFdhcyB0aGUgLS1kaXNhbGxvd19zZXJ2aWNlcyBmbGFnIHVzZWQ/CisgIGJvb2wgZGlzYWxsb3dfc2VydmljZXNfOworCisgIC8vIFNlZSBTZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZSgpLgorICBib29sIGlucHV0c19hcmVfcHJvdG9fcGF0aF9yZWxhdGl2ZV87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvbW1hbmRMaW5lSW50ZXJmYWNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NPTU1BTkRfTElORV9JTlRFUkZBQ0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWIzYTFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE0NTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworI2lmIGRlZmluZWQoX1dJTjMyKQorI2lmbmRlZiBTVERJTl9GSUxFTk8KKyNkZWZpbmUgU1RESU5fRklMRU5PIDAKKyNlbmRpZgorI2lmbmRlZiBTVERPVVRfRklMRU5PCisjZGVmaW5lIFNURE9VVF9GSUxFTk8gMQorI2VuZGlmCisjaWZuZGVmIEZfT0sKKyNkZWZpbmUgRl9PSyAwMCAgLy8gbm90IGRlZmluZWQgYnkgTVNWQyBmb3Igd2hhdGV2ZXIgcmVhc29uCisjZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2UgeworCitjbGFzcyBDb21tYW5kTGluZUludGVyZmFjZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7CisKKyAgLy8gUnVucyB0aGUgQ29tbWFuZExpbmVJbnRlcmZhY2Ugd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZCBsaW5lLiAgVGhlCisgIC8vIGNvbW1hbmQgaXMgYXV0b21hdGljYWxseSBzcGxpdCBvbiBzcGFjZXMsIGFuZCB0aGUgc3RyaW5nICIkdG1wZGlyIgorICAvLyBpcyByZXBsYWNlZCB3aXRoIFRlc3RUZW1wRGlyKCkuCisgIHZvaWQgUnVuKGNvbnN0IHN0cmluZyYgY29tbWFuZCk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gTWV0aG9kcyB0byBzZXQgdXAgdGhlIHRlc3QgKGNhbGxlZCBiZWZvcmUgUnVuKCkpLgorCisgIGNsYXNzIE51bGxDb2RlR2VuZXJhdG9yOworCisgIC8vIE5vcm1hbGx5IHBsdWdpbnMgYXJlIGFsbG93ZWQgZm9yIGFsbCB0ZXN0cy4gIENhbGwgdGhpcyB0byBleHBsaWNpdGx5CisgIC8vIGRpc2FibGUgdGhlbS4KKyAgdm9pZCBEaXNhbGxvd1BsdWdpbnMoKSB7IGRpc2FsbG93X3BsdWdpbnNfID0gdHJ1ZTsgfQorCisgIC8vIENyZWF0ZSBhIHRlbXAgZmlsZSB3aXRoaW4gdGVtcF9kaXJlY3RvcnlfIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgIC8vIFRoZSBjb250YWluaW5nIGRpcmVjdG9yeSBpcyBhbHNvIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5LgorICB2b2lkIENyZWF0ZVRlbXBGaWxlKGNvbnN0IHN0cmluZyYgbmFtZSwgY29uc3Qgc3RyaW5nJiBjb250ZW50cyk7CisKKyAgLy8gQ3JlYXRlIGEgc3ViZGlyZWN0b3J5IHdpdGhpbiB0ZW1wX2RpcmVjdG9yeV8uCisgIHZvaWQgQ3JlYXRlVGVtcERpcihjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIHZvaWQgU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUoYm9vbCBlbmFibGUpIHsKKyAgICBjbGlfLlNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKGVuYWJsZSk7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBNZXRob2RzIHRvIGNoZWNrIHRoZSB0ZXN0IHJlc3VsdHMgKGNhbGxlZCBhZnRlciBSdW4oKSkuCisKKyAgLy8gQ2hlY2tzIHRoYXQgbm8gdGV4dCB3YXMgd3JpdHRlbiB0byBzdGRlcnIgZHVyaW5nIFJ1bigpLCBhbmQgUnVuKCkKKyAgLy8gcmV0dXJuZWQgMC4KKyAgdm9pZCBFeHBlY3ROb0Vycm9ycygpOworCisgIC8vIENoZWNrcyB0aGF0IFJ1bigpIHJldHVybmVkIG5vbi16ZXJvIGFuZCB0aGUgc3RkZXJyIG91dHB1dCBpcyBleGFjdGx5CisgIC8vIHRoZSB0ZXh0IGdpdmVuLiAgZXhwZWN0ZWRfdGVzdCBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvICIkdG1wZGlyIiwKKyAgLy8gd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBwYXRoLgorICB2b2lkIEV4cGVjdEVycm9yVGV4dChjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3RleHQpOworCisgIC8vIENoZWNrcyB0aGF0IFJ1bigpIHJldHVybmVkIG5vbi16ZXJvIGFuZCB0aGUgc3RkZXJyIGNvbnRhaW5zIHRoZSBnaXZlbgorICAvLyBzdWJzdHJpbmcuCisgIHZvaWQgRXhwZWN0RXJyb3JTdWJzdHJpbmcoY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpOworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBFeHBlY3RFcnJvclN1YnN0cmluZyhleHBlY3RlZF9zdWJzdHJpbmcpIHdvdWxkIHBhc3MsIGJ1dAorICAvLyBkb2VzIG5vdCBmYWlsIG90aGVyd2lzZS4KKyAgYm9vbCBIYXNBbHRlcm5hdGVFcnJvclN1YnN0cmluZyhjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3N1YnN0cmluZyk7CisKKyAgLy8gQ2hlY2tzIHRoYXQgTW9ja0NvZGVHZW5lcmF0b3I6OkdlbmVyYXRlKCkgd2FzIGNhbGxlZCBpbiB0aGUgZ2l2ZW4KKyAgLy8gY29udGV4dCAob3IgdGhlIGdlbmVyYXRvciBpbiB0ZXN0X3BsdWdpbi5jYywgd2hpY2ggcHJvZHVjZXMgdGhlIHNhbWUKKyAgLy8gb3V0cHV0KS4gIFRoYXQgaXMsIHRoaXMgdGVzdHMgaWYgdGhlIGdlbmVyYXRvciB3aXRoIHRoZSBnaXZlbiBuYW1lCisgIC8vIHdhcyBjYWxsZWQgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVyIGFuZCBwcm90byBmaWxlIGFuZCBwcm9kdWNlZCB0aGUKKyAgLy8gZ2l2ZW4gb3V0cHV0IGZpbGUuICBUaGlzIGlzIGNoZWNrZWQgYnkgcmVhZGluZyB0aGUgb3V0cHV0IGZpbGUgYW5kCisgIC8vIGNoZWNraW5nIHRoYXQgaXQgY29udGFpbnMgdGhlIGNvbnRlbnQgdGhhdCBNb2NrQ29kZUdlbmVyYXRvciB3b3VsZAorICAvLyBnZW5lcmF0ZSBnaXZlbiB0aGVzZSBpbnB1dHMuICBtZXNzYWdlX25hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGZpcnN0CisgIC8vIG1lc3NhZ2UgdGhhdCBhcHBlYXJlZCBpbiB0aGUgcHJvdG8gZmlsZTsgdGhpcyBpcyBqdXN0IHRvIG1ha2UgZXh0cmEKKyAgLy8gc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGZpbGUgd2FzIHBhcnNlZC4KKyAgdm9pZCBFeHBlY3RHZW5lcmF0ZWQoY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHJvdG9fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlX25hbWUpOworICB2b2lkIEV4cGVjdEdlbmVyYXRlZChjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwcm90b19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvdXRwdXRfZGlyZWN0b3J5KTsKKyAgdm9pZCBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBhbGxfcHJvdG9fbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHJvdG9fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlX25hbWUpOworICB2b2lkIEV4cGVjdEdlbmVyYXRlZFdpdGhJbnNlcnRpb25zKGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHJvdG9fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2VfbmFtZSk7CisKKyAgdm9pZCBFeHBlY3ROdWxsQ29kZUdlbmVyYXRvckNhbGxlZChjb25zdCBzdHJpbmcmIHBhcmFtZXRlcik7CisKKyAgdm9pZCBSZWFkRGVzY3JpcHRvclNldChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yU2V0KiBkZXNjcmlwdG9yX3NldCk7CisKKyBwcml2YXRlOgorICAvLyBUaGUgb2JqZWN0IHdlIGFyZSB0ZXN0aW5nLgorICBDb21tYW5kTGluZUludGVyZmFjZSBjbGlfOworCisgIC8vIFdhcyBEaXNhbGxvd1BsdWdpbnMoKSBjYWxsZWQ/CisgIGJvb2wgZGlzYWxsb3dfcGx1Z2luc187CisKKyAgLy8gV2UgY3JlYXRlIGEgZGlyZWN0b3J5IHdpdGhpbiBUZXN0VGVtcERpcigpIGluIG9yZGVyIHRvIGFkZCBleHRyYQorICAvLyBwcm90ZWN0aW9uIGFnYWluc3QgYWNjaWRlbnRhbGx5IGRlbGV0aW5nIHVzZXIgZmlsZXMgKHNpbmNlIHdlIHJlY3Vyc2l2ZWx5CisgIC8vIGRlbGV0ZSB0aGlzIGRpcmVjdG9yeSBkdXJpbmcgdGhlIHRlc3QpLiAgVGhpcyBpcyB0aGUgZnVsbCBwYXRoIG9mIHRoYXQKKyAgLy8gZGlyZWN0b3J5LgorICBzdHJpbmcgdGVtcF9kaXJlY3RvcnlfOworCisgIC8vIFRoZSByZXN1bHQgb2YgUnVuKCkuCisgIGludCByZXR1cm5fY29kZV87CisKKyAgLy8gVGhlIGNhcHR1cmVkIHN0ZGVyciBvdXRwdXQuCisgIHN0cmluZyBlcnJvcl90ZXh0XzsKKworICAvLyBQb2ludGVycyB3aGljaCBuZWVkIHRvIGJlIGRlbGV0ZWQgbGF0ZXIuCisgIHZlY3RvcjxDb2RlR2VuZXJhdG9yKj4gbW9ja19nZW5lcmF0b3JzX3RvX2RlbGV0ZV87CisKKyAgTnVsbENvZGVHZW5lcmF0b3IqIG51bGxfZ2VuZXJhdG9yXzsKK307CisKK2NsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6TnVsbENvZGVHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7CisgcHVibGljOgorICBOdWxsQ29kZUdlbmVyYXRvcigpIDogY2FsbGVkXyhmYWxzZSkge30KKyAgfk51bGxDb2RlR2VuZXJhdG9yKCkge30KKworICBtdXRhYmxlIGJvb2wgY2FsbGVkXzsKKyAgbXV0YWJsZSBzdHJpbmcgcGFyYW1ldGVyXzsKKworICAvLyBpbXBsZW1lbnRzIENvZGVHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIEdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3QgeworICAgIGNhbGxlZF8gPSB0cnVlOworICAgIHBhcmFtZXRlcl8gPSBwYXJhbWV0ZXI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OlNldFVwKCkgeworICAvLyBNb3N0IG9mIHRoZXNlIHRlc3RzIHdlcmUgd3JpdHRlbiBiZWZvcmUgdGhpcyBvcHRpb24gd2FzIGFkZGVkLCBzbyB3ZQorICAvLyBydW4gd2l0aCB0aGUgb3B0aW9uIG9uICh3aGljaCB1c2VkIHRvIGJlIHRoZSBvbmx5IHdheSkgZXhjZXB0IGluIGNlcnRhaW4KKyAgLy8gdGVzdHMgd2hlcmUgd2UgdHVybiBpdCBvZmYuCisgIGNsaV8uU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUodHJ1ZSk7CisKKyAgdGVtcF9kaXJlY3RvcnlfID0gVGVzdFRlbXBEaXIoKSArICIvcHJvdG8yX2NsaV90ZXN0X3RlbXAiOworCisgIC8vIElmIHRoZSB0ZW1wIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgaXQgbXVzdCBiZSBsZWZ0IG92ZXIgZnJvbSBhCisgIC8vIHByZXZpb3VzIHJ1bi4gIERlbGV0ZSBpdC4KKyAgaWYgKEZpbGU6OkV4aXN0cyh0ZW1wX2RpcmVjdG9yeV8pKSB7CisgICAgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkodGVtcF9kaXJlY3RvcnlfLCBOVUxMLCBOVUxMKTsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgdGVtcCBkaXJlY3RvcnkuCisgIEdPT0dMRV9DSEVDSyhGaWxlOjpDcmVhdGVEaXIodGVtcF9kaXJlY3RvcnlfLmNfc3RyKCksIERFRkFVTFRfRklMRV9NT0RFKSk7CisKKyAgLy8gUmVnaXN0ZXIgZ2VuZXJhdG9ycy4KKyAgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yID0gbmV3IE1vY2tDb2RlR2VuZXJhdG9yKCJ0ZXN0X2dlbmVyYXRvciIpOworICBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlXy5wdXNoX2JhY2soZ2VuZXJhdG9yKTsKKyAgY2xpXy5SZWdpc3RlckdlbmVyYXRvcigiLS10ZXN0X291dCIsIGdlbmVyYXRvciwgIlRlc3Qgb3V0cHV0LiIpOworICBjbGlfLlJlZ2lzdGVyR2VuZXJhdG9yKCItdCIsIGdlbmVyYXRvciwgIlRlc3Qgb3V0cHV0LiIpOworCisgIGdlbmVyYXRvciA9IG5ldyBNb2NrQ29kZUdlbmVyYXRvcigiYWx0X2dlbmVyYXRvciIpOworICBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlXy5wdXNoX2JhY2soZ2VuZXJhdG9yKTsKKyAgY2xpXy5SZWdpc3RlckdlbmVyYXRvcigiLS1hbHRfb3V0IiwgZ2VuZXJhdG9yLCAiQWx0IG91dHB1dC4iKTsKKworICBnZW5lcmF0b3IgPSBudWxsX2dlbmVyYXRvcl8gPSBuZXcgTnVsbENvZGVHZW5lcmF0b3IoKTsKKyAgbW9ja19nZW5lcmF0b3JzX3RvX2RlbGV0ZV8ucHVzaF9iYWNrKGdlbmVyYXRvcik7CisgIGNsaV8uUmVnaXN0ZXJHZW5lcmF0b3IoIi0tbnVsbF9vdXQiLCBnZW5lcmF0b3IsICJOdWxsIG91dHB1dC4iKTsKKworICBkaXNhbGxvd19wbHVnaW5zXyA9IGZhbHNlOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6VGVhckRvd24oKSB7CisgIC8vIERlbGV0ZSB0aGUgdGVtcCBkaXJlY3RvcnkuCisgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KHRlbXBfZGlyZWN0b3J5XywgTlVMTCwgTlVMTCk7CisKKyAgLy8gRGVsZXRlIGFsbCB0aGUgTW9ja0NvZGVHZW5lcmF0b3JzLgorICBmb3IgKGludCBpID0gMDsgaSA8IG1vY2tfZ2VuZXJhdG9yc190b19kZWxldGVfLnNpemUoKTsgaSsrKSB7CisgICAgZGVsZXRlIG1vY2tfZ2VuZXJhdG9yc190b19kZWxldGVfW2ldOworICB9CisgIG1vY2tfZ2VuZXJhdG9yc190b19kZWxldGVfLmNsZWFyKCk7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpSdW4oY29uc3Qgc3RyaW5nJiBjb21tYW5kKSB7CisgIHZlY3RvcjxzdHJpbmc+IGFyZ3M7CisgIFNwbGl0U3RyaW5nVXNpbmcoY29tbWFuZCwgIiAiLCAmYXJncyk7CisKKyAgaWYgKCFkaXNhbGxvd19wbHVnaW5zXykgeworICAgIGNsaV8uQWxsb3dQbHVnaW5zKCJwcmVmaXgtIik7CisgICAgY29uc3QgY2hhciogcG9zc2libGVfcGF0aHNbXSA9IHsKKyAgICAgIC8vIFdoZW4gYnVpbGRpbmcgd2l0aCBzaGFyZWQgbGlicmFyaWVzLCBsaWJ0b29sIGhpZGVzIHRoZSByZWFsIGV4ZWN1dGFibGUKKyAgICAgIC8vIGluIC5saWJzIGFuZCBwdXRzIGEgZmFrZSB3cmFwcGVyIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgICAgIC8vIFVuZm9ydHVuYXRlbHksIGR1ZSB0byBhbiBhcHBhcmVudCBidWcgb24gQ3lnd2luL01pbkdXLCBpZiBvbmUgcHJvZ3JhbQorICAgICAgLy8gd3JhcHBlZCBpbiB0aGlzIHdheSAoZS5nLiBwcm90b2J1Zi10ZXN0cy5leGUpIHRyaWVzIHRvIGV4ZWN1dGUgYW5vdGhlcgorICAgICAgLy8gcHJvZ3JhbSB3cmFwcGVkIGluIHRoaXMgd2F5IChlLmcuIHRlc3RfcGx1Z2luLmV4ZSksIHRoZSBsYXR0ZXIgZmFpbHMKKyAgICAgIC8vIHdpdGggZXJyb3IgY29kZSAxMjcgYW5kIG5vIGV4cGxhbmF0aW9uIG1lc3NhZ2UuICBQcmVzdW1hYmx5IHRoZSBwcm9ibGVtCisgICAgICAvLyBpcyB0aGF0IHRoZSB3cmFwcGVyIGZvciBwcm90b2J1Zi10ZXN0cy5leGUgc2V0IHNvbWUgZW52aXJvbm1lbnQKKyAgICAgIC8vIHZhcmlhYmxlcyB0aGF0IGNvbmZ1c2UgdGhlIHdyYXBwZXIgZm9yIHRlc3RfcGx1Z2luLmV4ZS4gIEx1Y2tpbHksIGl0CisgICAgICAvLyB0dXJucyBvdXQgdGhhdCBpZiB3ZSBzaW1wbHkgaW52b2tlIHRoZSB3cmFwcGVkIHRlc3RfcGx1Z2luLmV4ZQorICAgICAgLy8gZGlyZWN0bHksIGl0IHdvcmtzIC0tIEkgZ3Vlc3MgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQgYnkgdGhlCisgICAgICAvLyBwcm90b2J1Zi10ZXN0cy5leGUgd3JhcHBlciBoYXBwZW4gdG8gYmUgY29ycmVjdCBmb3IgaXQgdG9vLiAgU28gd2UgZG8KKyAgICAgIC8vIHRoYXQuCisgICAgICAiLmxpYnMvdGVzdF9wbHVnaW4uZXhlIiwgIC8vIFdpbjMyIHcvYXV0b3Rvb2wgKEN5Z3dpbiAvIE1pbkdXKQorICAgICAgInRlc3RfcGx1Z2luLmV4ZSIsICAgICAgICAvLyBPdGhlciBXaW4zMiAoTVNWQykKKyAgICAgICJ0ZXN0X3BsdWdpbiIsICAgICAgICAgICAgLy8gVW5peAorICAgIH07CisKKyAgICBzdHJpbmcgcGx1Z2luX3BhdGg7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUocG9zc2libGVfcGF0aHMpOyBpKyspIHsKKyAgICAgIGlmIChhY2Nlc3MocG9zc2libGVfcGF0aHNbaV0sIEZfT0spID09IDApIHsKKyAgICAgICAgcGx1Z2luX3BhdGggPSBwb3NzaWJsZV9wYXRoc1tpXTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHBsdWdpbl9wYXRoLmVtcHR5KCkpIHsKKyAgICAgIEdPT0dMRV9MT0coRVJST1IpCisgICAgICAgICAgPDwgIlBsdWdpbiBleGVjdXRhYmxlIG5vdCBmb3VuZC4gIFBsdWdpbiB0ZXN0cyBhcmUgbGlrZWx5IHRvIGZhaWwuIjsKKyAgICB9IGVsc2UgeworICAgICAgYXJncy5wdXNoX2JhY2soIi0tcGx1Z2luPXByZWZpeC1nZW4tcGx1Zz0iICsgcGx1Z2luX3BhdGgpOworICAgIH0KKyAgfQorCisgIHNjb3BlZF9hcnJheTxjb25zdCBjaGFyKj4gYXJndihuZXcgY29uc3QgY2hhcipbYXJncy5zaXplKCldKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICBhcmdzW2ldID0gU3RyaW5nUmVwbGFjZShhcmdzW2ldLCAiJHRtcGRpciIsIHRlbXBfZGlyZWN0b3J5XywgdHJ1ZSk7CisgICAgYXJndltpXSA9IGFyZ3NbaV0uY19zdHIoKTsKKyAgfQorCisgIENhcHR1cmVUZXN0U3RkZXJyKCk7CisKKyAgcmV0dXJuX2NvZGVfID0gY2xpXy5SdW4oYXJncy5zaXplKCksIGFyZ3YuZ2V0KCkpOworCisgIGVycm9yX3RleHRfID0gR2V0Q2FwdHVyZWRUZXN0U3RkZXJyKCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkNyZWF0ZVRlbXBGaWxlKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIGNvbnRlbnRzKSB7CisgIC8vIENyZWF0ZSBwYXJlbnQgZGlyZWN0b3J5LCBpZiBuZWNlc3NhcnkuCisgIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNoX3BvcyA9IG5hbWUuZmluZF9sYXN0X29mKCcvJyk7CisgIGlmIChzbGFzaF9wb3MgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3RyaW5nIGRpciA9IG5hbWUuc3Vic3RyKDAsIHNsYXNoX3Bvcyk7CisgICAgRmlsZTo6UmVjdXJzaXZlbHlDcmVhdGVEaXIodGVtcF9kaXJlY3RvcnlfICsgIi8iICsgZGlyLCAwNzc3KTsKKyAgfQorCisgIC8vIFdyaXRlIGZpbGUuCisgIHN0cmluZyBmdWxsX25hbWUgPSB0ZW1wX2RpcmVjdG9yeV8gKyAiLyIgKyBuYW1lOworICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKGNvbnRlbnRzLCBmdWxsX25hbWUpOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6Q3JlYXRlVGVtcERpcihjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgRmlsZTo6UmVjdXJzaXZlbHlDcmVhdGVEaXIodGVtcF9kaXJlY3RvcnlfICsgIi8iICsgbmFtZSwgMDc3Nyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdE5vRXJyb3JzKCkgeworICBFWFBFQ1RfRVEoMCwgcmV0dXJuX2NvZGVfKTsKKyAgRVhQRUNUX0VRKCIiLCBlcnJvcl90ZXh0Xyk7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpFeHBlY3RFcnJvclRleHQoY29uc3Qgc3RyaW5nJiBleHBlY3RlZF90ZXh0KSB7CisgIEVYUEVDVF9ORSgwLCByZXR1cm5fY29kZV8pOworICBFWFBFQ1RfRVEoU3RyaW5nUmVwbGFjZShleHBlY3RlZF90ZXh0LCAiJHRtcGRpciIsIHRlbXBfZGlyZWN0b3J5XywgdHJ1ZSksCisgICAgICAgICAgICBlcnJvcl90ZXh0Xyk7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpFeHBlY3RFcnJvclN1YnN0cmluZygKKyAgICBjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3N1YnN0cmluZykgeworICBFWFBFQ1RfTkUoMCwgcmV0dXJuX2NvZGVfKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywgZXhwZWN0ZWRfc3Vic3RyaW5nLCBlcnJvcl90ZXh0Xyk7Cit9CisKK2Jvb2wgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpIYXNBbHRlcm5hdGVFcnJvclN1YnN0cmluZygKKyAgICBjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3N1YnN0cmluZykgeworICBFWFBFQ1RfTkUoMCwgcmV0dXJuX2NvZGVfKTsKKyAgcmV0dXJuIGVycm9yX3RleHRfLmZpbmQoZXhwZWN0ZWRfc3Vic3RyaW5nKSAhPSBzdHJpbmc6Om5wb3M7Cit9CisKK3ZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpFeHBlY3RHZW5lcmF0ZWQoCisgICAgY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICBjb25zdCBzdHJpbmcmIHByb3RvX25hbWUsCisgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlX25hbWUpIHsKKyAgTW9ja0NvZGVHZW5lcmF0b3I6OkV4cGVjdEdlbmVyYXRlZCgKKyAgICAgIGdlbmVyYXRvcl9uYW1lLCBwYXJhbWV0ZXIsICIiLCBwcm90b19uYW1lLCBtZXNzYWdlX25hbWUsIHByb3RvX25hbWUsCisgICAgICB0ZW1wX2RpcmVjdG9yeV8pOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0R2VuZXJhdGVkKAorICAgIGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgY29uc3Qgc3RyaW5nJiBwcm90b19uYW1lLAorICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZV9uYW1lLAorICAgIGNvbnN0IHN0cmluZyYgb3V0cHV0X2RpcmVjdG9yeSkgeworICBNb2NrQ29kZUdlbmVyYXRvcjo6RXhwZWN0R2VuZXJhdGVkKAorICAgICAgZ2VuZXJhdG9yX25hbWUsIHBhcmFtZXRlciwgIiIsIHByb3RvX25hbWUsIG1lc3NhZ2VfbmFtZSwgcHJvdG9fbmFtZSwKKyAgICAgIHRlbXBfZGlyZWN0b3J5XyArICIvIiArIG91dHB1dF9kaXJlY3RvcnkpOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKAorICAgIGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgY29uc3Qgc3RyaW5nJiBhbGxfcHJvdG9fbmFtZXMsCisgICAgY29uc3Qgc3RyaW5nJiBwcm90b19uYW1lLAorICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZV9uYW1lKSB7CisgIE1vY2tDb2RlR2VuZXJhdG9yOjpFeHBlY3RHZW5lcmF0ZWQoCisgICAgICBnZW5lcmF0b3JfbmFtZSwgIiIsICIiLCBwcm90b19uYW1lLCBtZXNzYWdlX25hbWUsCisgICAgICBhbGxfcHJvdG9fbmFtZXMsCisgICAgICB0ZW1wX2RpcmVjdG9yeV8pOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0R2VuZXJhdGVkV2l0aEluc2VydGlvbnMoCisgICAgY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICBjb25zdCBzdHJpbmcmIGluc2VydGlvbnMsCisgICAgY29uc3Qgc3RyaW5nJiBwcm90b19uYW1lLAorICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZV9uYW1lKSB7CisgIE1vY2tDb2RlR2VuZXJhdG9yOjpFeHBlY3RHZW5lcmF0ZWQoCisgICAgICBnZW5lcmF0b3JfbmFtZSwgcGFyYW1ldGVyLCBpbnNlcnRpb25zLCBwcm90b19uYW1lLCBtZXNzYWdlX25hbWUsCisgICAgICBwcm90b19uYW1lLCB0ZW1wX2RpcmVjdG9yeV8pOworfQorCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0TnVsbENvZGVHZW5lcmF0b3JDYWxsZWQoCisgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIpIHsKKyAgRVhQRUNUX1RSVUUobnVsbF9nZW5lcmF0b3JfLT5jYWxsZWRfKTsKKyAgRVhQRUNUX0VRKHBhcmFtZXRlciwgbnVsbF9nZW5lcmF0b3JfLT5wYXJhbWV0ZXJfKTsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OlJlYWREZXNjcmlwdG9yU2V0KAorICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIEZpbGVEZXNjcmlwdG9yU2V0KiBkZXNjcmlwdG9yX3NldCkgeworICBzdHJpbmcgcGF0aCA9IHRlbXBfZGlyZWN0b3J5XyArICIvIiArIGZpbGVuYW1lOworICBzdHJpbmcgZmlsZV9jb250ZW50czsKKyAgaWYgKCFGaWxlOjpSZWFkRmlsZVRvU3RyaW5nKHBhdGgsICZmaWxlX2NvbnRlbnRzKSkgeworICAgIEZBSUwoKSA8PCAiRmlsZSBub3QgZm91bmQ6ICIgPDwgcGF0aDsKKyAgfQorICBpZiAoIWRlc2NyaXB0b3Jfc2V0LT5QYXJzZUZyb21TdHJpbmcoZmlsZV9jb250ZW50cykpIHsKKyAgICBGQUlMKCkgPDwgIkNvdWxkIG5vdCBwYXJzZSBmaWxlIGNvbnRlbnRzOiAiIDw8IHBhdGg7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBCYXNpY091dHB1dCkgeworICAvLyBUZXN0IHRoYXQgdGhlIGNvbW1vbiBjYXNlIHdvcmtzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQmFzaWNQbHVnaW4pIHsKKyAgLy8gVGVzdCB0aGF0IGJhc2ljIHBsdWdpbnMgd29yay4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfcGx1Z2luIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvckFuZFBsdWdpbikgeworICAvLyBJbnZva2UgYSBnZW5lcmF0b3IgYW5kIGEgcGx1Z2luIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAtLXBsdWdfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X3BsdWdpbiIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBNdWx0aXBsZUlucHV0cykgeworICAvLyBUZXN0IHBhcnNpbmcgbXVsdGlwbGUgaW5wdXQgZmlsZXMuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgQmFyIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAtLXBsdWdfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byBiYXIucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfZ2VuZXJhdG9yIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8iLCAiQmFyIik7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9wbHVnaW4iLCAiZm9vLnByb3RvLGJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vLnByb3RvIiwgIkZvbyIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhci5wcm90byIsICJCYXIiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTXVsdGlwbGVJbnB1dHNXaXRoSW1wb3J0KSB7CisgIC8vIFRlc3QgcGFyc2luZyBtdWx0aXBsZSBpbnB1dCBmaWxlcyB3aXRoIGFuIGltcG9ydCBvZiBhIHNlcGFyYXRlIGZpbGUuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcImJhei5wcm90b1wiO1xuIgorICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgIiAgb3B0aW9uYWwgQmF6IGEgPSAxO1xuIgorICAgICJ9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhei5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgQmF6IHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAtLXBsdWdfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byBiYXIucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfZ2VuZXJhdG9yIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby5wcm90byIsICJGb28iKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8iLCAiQmFyIik7CisgIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9wbHVnaW4iLCAiZm9vLnByb3RvLGJhci5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vLnByb3RvIiwgIkZvbyIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byxiYXIucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhci5wcm90byIsICJCYXIiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQ3JlYXRlRGlyZWN0b3J5KSB7CisgIC8vIFRlc3QgdGhhdCB3aGVuIHdlIG91dHB1dCB0byBhIHN1Yi1kaXJlY3RvcnksIGl0IGlzIGNyZWF0ZWQuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci9iYXovZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworICBDcmVhdGVUZW1wRGlyKCJvdXQiKTsKKyAgQ3JlYXRlVGVtcERpcigicGx1Z291dCIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyL291dCAtLXBsdWdfb3V0PSR0bXBkaXIvcGx1Z291dCAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyL2Jhei9mb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJiYXIvYmF6L2Zvby5wcm90byIsICJGb28iLCAib3V0Iik7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9wbHVnaW4iLCAiIiwgImJhci9iYXovZm9vLnByb3RvIiwgIkZvbyIsICJwbHVnb3V0Iik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBhcmFtZXRlcnMpIHsKKyAgLy8gVGVzdCB0aGF0IGdlbmVyYXRvciBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0bHkgcGFyc2VkIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD1UZXN0UGFyYW1ldGVyOiR0bXBkaXIgIgorICAgICAgIi0tcGx1Z19vdXQ9VGVzdFBsdWdpblBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIlRlc3RQYXJhbWV0ZXIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfcGx1Z2luIiwgIlRlc3RQbHVnaW5QYXJhbWV0ZXIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBJbnNlcnQpIHsKKyAgLy8gVGVzdCBydW5uaW5nIGEgZ2VuZXJhdG9yIHRoYXQgaW5zZXJ0cyBjb2RlIGludG8gYW5vdGhlcidzIG91dHB1dC4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgIgorICAgICAgIi0tdGVzdF9vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXBsdWdfb3V0PVRlc3RQbHVnaW5QYXJhbWV0ZXI6JHRtcGRpciAiCisgICAgICAiLS10ZXN0X291dD1pbnNlcnQ9dGVzdF9nZW5lcmF0b3IsdGVzdF9wbHVnaW46JHRtcGRpciAiCisgICAgICAiLS1wbHVnX291dD1pbnNlcnQ9dGVzdF9nZW5lcmF0b3IsdGVzdF9wbHVnaW46JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkV2l0aEluc2VydGlvbnMoCisgICAgICAidGVzdF9nZW5lcmF0b3IiLCAiVGVzdFBhcmFtZXRlciIsICJ0ZXN0X2dlbmVyYXRvcix0ZXN0X3BsdWdpbiIsCisgICAgICAiZm9vLnByb3RvIiwgIkZvbyIpOworICBFeHBlY3RHZW5lcmF0ZWRXaXRoSW5zZXJ0aW9ucygKKyAgICAgICJ0ZXN0X3BsdWdpbiIsICJUZXN0UGx1Z2luUGFyYW1ldGVyIiwgInRlc3RfZ2VuZXJhdG9yLHRlc3RfcGx1Z2luIiwKKyAgICAgICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV2luZG93c091dHB1dFBhdGgpIHsKKyAgLy8gVGVzdCB0aGF0IHRoZSBvdXRwdXQgcGF0aCBjYW4gYmUgYSBXaW5kb3dzLXN0eWxlIHBhdGguCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tbnVsbF9vdXQ9QzpcXCAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0TnVsbENvZGVHZW5lcmF0b3JDYWxsZWQoIiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXaW5kb3dzT3V0cHV0UGF0aEFuZFBhcmFtZXRlcikgeworICAvLyBUZXN0IHRoYXQgd2UgY2FuIGhhdmUgYSB3aW5kb3dzLXN0eWxlIG91dHB1dCBwYXRoIGFuZCBhIHBhcmFtZXRlci4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1udWxsX291dD1iYXI6QzpcXCAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0TnVsbENvZGVHZW5lcmF0b3JDYWxsZWQoImJhciIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBUcmFpbGluZ0JhY2tzbGFzaCkgeworICAvLyBUZXN0IHRoYXQgdGhlIGRpcmVjdG9yaWVzIGNhbiBlbmQgaW4gYmFja3NsYXNoZXMuICBTb21lIHVzZXJzIGNsYWltIHRoaXMKKyAgLy8gZG9lc24ndCB3b3JrIG9uIHRoZWlyIHN5c3RlbS4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyXFwgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyXFwgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCisjZW5kaWYgIC8vIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFBhdGhMb29rdXApIHsKKyAgLy8gVGVzdCB0aGF0IHNwZWNpZnlpbmcgbXVsdGlwbGUgZGlyZWN0b3JpZXMgaW4gdGhlIHByb3RvIHNlYXJjaCBwYXRoIHdvcmtzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJiL2Jhci5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgQmFyIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImEvZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAiICBvcHRpb25hbCBCYXIgYSA9IDE7XG4iCisgICAgIn1cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYi9mb28ucHJvdG8iLCAidGhpcyBzaG91bGQgbm90IGJlIHBhcnNlZFxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2EgLS1wcm90b19wYXRoPSR0bXBkaXIvYiBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIENvbG9uRGVsaW1pdGVkUGF0aCkgeworICAvLyBTYW1lIGFzIFBhdGhMb29rdXAsIGJ1dCB3ZSBwcm92aWRlIHRoZSBwcm90b19wYXRoIGluIGEgc2luZ2xlIGZsYWcuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImIvYmFyLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBCYXIge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYS9mb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICIgIG9wdGlvbmFsIEJhciBhID0gMTtcbiIKKyAgICAifVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiL2Zvby5wcm90byIsICJ0aGlzIHNob3VsZCBub3QgYmUgcGFyc2VkXG4iKTsKKworI3VuZGVmIFBBVEhfU0VQQVJBVE9SCisjaWYgZGVmaW5lZChfV0lOMzIpCisjZGVmaW5lIFBBVEhfU0VQQVJBVE9SICI7IgorI2Vsc2UKKyNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgIjoiCisjZW5kaWYKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIvYSJQQVRIX1NFUEFSQVRPUiIkdG1wZGlyL2IgZm9vLnByb3RvIik7CisKKyN1bmRlZiBQQVRIX1NFUEFSQVRPUgorCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTm9uUm9vdE1hcHBpbmcpIHsKKyAgLy8gVGVzdCBzZXR0aW5nIHVwIGEgc2VhcmNoIHBhdGggbWFwcGluZyBhIGRpcmVjdG9yeSB0byBhIG5vbi1yb290IGxvY2F0aW9uLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD1iYXI9JHRtcGRpciBiYXIvZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiYmFyL2Zvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTXVsdGlwbGVHZW5lcmF0b3JzKSB7CisgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBnZW5lcmF0b3JzIGFuZCB1c2UgYm90aCBpbiBvbmUgaW52b2NhdGlvbiwKKyAgLy8gZWFjaCB3aXRoIGEgZGlmZmVyZW50IG91dHB1dCBkaXJlY3RvcnkuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgLy8gQ3JlYXRlIHRoZSAiYSIgYW5kICJiIiBzdWItZGlyZWN0b3JpZXMuCisgIENyZWF0ZVRlbXBEaXIoImEiKTsKKyAgQ3JlYXRlVGVtcERpcigiYiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgIgorICAgICAgIi0tdGVzdF9vdXQ9JHRtcGRpci9hICIKKyAgICAgICItLWFsdF9vdXQ9JHRtcGRpci9iICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIiwgImEiKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJhbHRfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIiwgImIiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgRGlzYWxsb3dTZXJ2aWNlc05vU2VydmljZXMpIHsKKyAgLy8gVGVzdCB0aGF0IC0tZGlzYWxsb3dfc2VydmljZXMgZG9lc24ndCBjYXVzZSBhIHByb2JsZW0gd2hlbiB0aGVyZSBhcmUgbm8KKyAgLy8gc2VydmljZXMuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGlzYWxsb3dfc2VydmljZXMgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIERpc2FsbG93U2VydmljZXNIYXNTZXJ2aWNlKSB7CisgIC8vIFRlc3QgdGhhdCAtLWRpc2FsbG93X3NlcnZpY2VzIHByb2R1Y2VzIGFuIGVycm9yIHdoZW4gdGhlcmUgYXJlIHNlcnZpY2VzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIgorICAgICJzZXJ2aWNlIEJhciB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWRpc2FsbG93X3NlcnZpY2VzIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoImZvby5wcm90bzogVGhpcyBmaWxlIGNvbnRhaW5zIHNlcnZpY2VzIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEFsbG93U2VydmljZXNIYXNTZXJ2aWNlKSB7CisgIC8vIFRlc3QgdGhhdCBzZXJ2aWNlcyB3b3JrIGZpbmUgYXMgbG9uZyBhcyAtLWRpc2FsbG93X3NlcnZpY2VzIGlzIG5vdCB1c2VkLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIgorICAgICJzZXJ2aWNlIEJhciB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQ3dkUmVsYXRpdmVJbnB1dHMpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGNhbiBhY2NlcHQgd29ya2luZy1kaXJlY3RvcnktcmVsYXRpdmUgaW5wdXQgZmlsZXMuCisKKyAgU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUoZmFsc2UpOworCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyICR0bXBkaXIvZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZURlc2NyaXB0b3JTZXQpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCisgICAgIn1cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kZXNjcmlwdG9yX3NldF9vdXQ9JHRtcGRpci9kZXNjcmlwdG9yX3NldCAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKworICBGaWxlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldDsKKyAgUmVhZERlc2NyaXB0b3JTZXQoImRlc2NyaXB0b3Jfc2V0IiwgJmRlc2NyaXB0b3Jfc2V0KTsKKyAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgIEFTU0VSVF9FUSgxLCBkZXNjcmlwdG9yX3NldC5maWxlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZVRyYW5zaXRpdmVEZXNjcmlwdG9yU2V0KSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJpbXBvcnQgXCJmb28ucHJvdG9cIjtcbiIKKyAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICIgIG9wdGlvbmFsIEZvbyBmb28gPSAxO1xuIgorICAgICJ9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVzY3JpcHRvcl9zZXRfb3V0PSR0bXBkaXIvZGVzY3JpcHRvcl9zZXQgIgorICAgICAgIi0taW5jbHVkZV9pbXBvcnRzIC0tcHJvdG9fcGF0aD0kdG1wZGlyIGJhci5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisKKyAgRmlsZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQ7CisgIFJlYWREZXNjcmlwdG9yU2V0KCJkZXNjcmlwdG9yX3NldCIsICZkZXNjcmlwdG9yX3NldCk7CisgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICBBU1NFUlRfRVEoMiwgZGVzY3JpcHRvcl9zZXQuZmlsZV9zaXplKCkpOworICBpZiAoZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkgPT0gImJhci5wcm90byIpIHsKKyAgICBzdGQ6OnN3YXAoZGVzY3JpcHRvcl9zZXQubXV0YWJsZV9maWxlKCktPm11dGFibGVfZGF0YSgpWzBdLAorICAgICAgICAgICAgICBkZXNjcmlwdG9yX3NldC5tdXRhYmxlX2ZpbGUoKS0+bXV0YWJsZV9kYXRhKClbMV0pOworICB9CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMSkubmFtZSgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZUVycm9ycykgeworICAvLyBUZXN0IHRoYXQgcGFyc2UgZXJyb3JzIGFyZSByZXBvcnRlZC4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiYmFkc3ludGF4XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICJmb28ucHJvdG86MjoxOiBFeHBlY3RlZCB0b3AtbGV2ZWwgc3RhdGVtZW50IChlLmcuIFwibWVzc2FnZVwiKS5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZUVycm9yc011bHRpcGxlRmlsZXMpIHsKKyAgLy8gVGVzdCB0aGF0IHBhcnNlIGVycm9ycyBhcmUgcmVwb3J0ZWQgZnJvbSBtdWx0aXBsZSBmaWxlcy4KKworICAvLyBXZSBzZXQgdXAgZmlsZXMgc3VjaCB0aGF0IGZvby5wcm90byBhY3R1YWxseSBkZXBlbmRzIG9uIGJhci5wcm90byBpbgorICAvLyB0d28gd2F5czogIERpcmVjdGx5IGFuZCB0aHJvdWdoIGJhei5wcm90by4gIGJhci5wcm90bydzIGVycm9ycyBzaG91bGQKKyAgLy8gb25seSBiZSByZXBvcnRlZCBvbmNlLgorICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiYmFkc3ludGF4XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhei5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcImJhci5wcm90b1wiO1xuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAiaW1wb3J0IFwiYmF6LnByb3RvXCI7XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICJiYXIucHJvdG86MjoxOiBFeHBlY3RlZCB0b3AtbGV2ZWwgc3RhdGVtZW50IChlLmcuIFwibWVzc2FnZVwiKS5cbiIKKyAgICAiYmF6LnByb3RvOiBJbXBvcnQgXCJiYXIucHJvdG9cIiB3YXMgbm90IGZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iCisgICAgImZvby5wcm90bzogSW1wb3J0IFwiYmFyLnByb3RvXCIgd2FzIG5vdCBmb3VuZCBvciBoYWQgZXJyb3JzLlxuIgorICAgICJmb28ucHJvdG86IEltcG9ydCBcImJhei5wcm90b1wiIHdhcyBub3QgZm91bmQgb3IgaGFkIGVycm9ycy5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBJbnB1dE5vdEZvdW5kRXJyb3IpIHsKKyAgLy8gVGVzdCB3aGF0IGhhcHBlbnMgaWYgdGhlIGlucHV0IGZpbGUgaXMgbm90IGZvdW5kLgorCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgImZvby5wcm90bzogRmlsZSBub3QgZm91bmQuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQ3dkUmVsYXRpdmVJbnB1dE5vdEZvdW5kRXJyb3IpIHsKKyAgLy8gVGVzdCB3aGF0IGhhcHBlbnMgd2hlbiBhIHdvcmtpbmctZGlyZWN0b3J5LXJlbGF0aXZlIGlucHV0IGZpbGUgaXMgbm90CisgIC8vIGZvdW5kLgorCisgIFNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKGZhbHNlKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgJHRtcGRpci9mb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgIiR0bXBkaXIvZm9vLnByb3RvOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQ3dkUmVsYXRpdmVJbnB1dE5vdE1hcHBlZEVycm9yKSB7CisgIC8vIFRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gYSB3b3JraW5nLWRpcmVjdG9yeS1yZWxhdGl2ZSBpbnB1dCBmaWxlIGlzIG5vdAorICAvLyBtYXBwZWQgdG8gYSB2aXJ0dWFsIHBhdGguCisKKyAgU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUoZmFsc2UpOworCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgLy8gQ3JlYXRlIGEgZGlyZWN0b3J5IGNhbGxlZCAiYmFyIiBzbyB0aGF0IHdlIGNhbiBwb2ludCAtLXByb3RvX3BhdGggYXQgaXQuCisgIENyZWF0ZVRlbXBGaWxlKCJiYXIvZHVtbXkiLCAiIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2JhciAkdG1wZGlyL2Zvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAiJHRtcGRpci9mb28ucHJvdG86IEZpbGUgZG9lcyBub3QgcmVzaWRlIHdpdGhpbiBhbnkgcGF0aCAiCisgICAgICAic3BlY2lmaWVkIHVzaW5nIC0tcHJvdG9fcGF0aCAob3IgLUkpLiAgWW91IG11c3Qgc3BlY2lmeSBhICIKKyAgICAgICItLXByb3RvX3BhdGggd2hpY2ggZW5jb21wYXNzZXMgdGhpcyBmaWxlLiAgTm90ZSB0aGF0IHRoZSAiCisgICAgICAicHJvdG9fcGF0aCBtdXN0IGJlIGFuIGV4YWN0IHByZWZpeCBvZiB0aGUgLnByb3RvIGZpbGUgIgorICAgICAgIm5hbWVzIC0tIHByb3RvYyBpcyB0b28gZHVtYiB0byBmaWd1cmUgb3V0IHdoZW4gdHdvIHBhdGhzICIKKyAgICAgICIoZS5nLiBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUpIGFyZSBlcXVpdmFsZW50IChpdCdzIGhhcmRlciAiCisgICAgICAidGhhbiB5b3UgdGhpbmspLlxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEN3ZFJlbGF0aXZlSW5wdXROb3RGb3VuZEFuZE5vdE1hcHBlZEVycm9yKSB7CisgIC8vIENoZWNrIHdoYXQgaGFwcGVucyBpZiB0aGUgaW5wdXQgZmlsZSBpcyBub3QgZm91bmQgKmFuZCogaXMgbm90IG1hcHBlZAorICAvLyBpbiB0aGUgcHJvdG9fcGF0aC4KKworICBTZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZShmYWxzZSk7CisKKyAgLy8gQ3JlYXRlIGEgZGlyZWN0b3J5IGNhbGxlZCAiYmFyIiBzbyB0aGF0IHdlIGNhbiBwb2ludCAtLXByb3RvX3BhdGggYXQgaXQuCisgIENyZWF0ZVRlbXBGaWxlKCJiYXIvZHVtbXkiLCAiIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2JhciAkdG1wZGlyL2Zvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAiJHRtcGRpci9mb28ucHJvdG86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBDd2RSZWxhdGl2ZUlucHV0U2hhZG93ZWRFcnJvcikgeworICAvLyBUZXN0IHdoYXQgaGFwcGVucyB3aGVuIGEgd29ya2luZy1kaXJlY3RvcnktcmVsYXRpdmUgaW5wdXQgZmlsZSBpcyBzaGFkb3dlZAorICAvLyBieSBhbm90aGVyIGZpbGUgaW4gdGhlIHZpcnR1YWwgcGF0aC4KKworICBTZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZShmYWxzZSk7CisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby9mb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIvZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBCYXIge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpci9mb28gLS1wcm90b19wYXRoPSR0bXBkaXIvYmFyICIKKyAgICAgICIkdG1wZGlyL2Jhci9mb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgIiR0bXBkaXIvYmFyL2Zvby5wcm90bzogSW5wdXQgaXMgc2hhZG93ZWQgaW4gdGhlIC0tcHJvdG9fcGF0aCAiCisgICAgImJ5IFwiJHRtcGRpci9mb28vZm9vLnByb3RvXCIuICBFaXRoZXIgdXNlIHRoZSBsYXR0ZXIgIgorICAgICJmaWxlIGFzIHlvdXIgaW5wdXQgb3IgcmVvcmRlciB0aGUgLS1wcm90b19wYXRoIHNvIHRoYXQgdGhlICIKKyAgICAiZm9ybWVyIGZpbGUncyBsb2NhdGlvbiBjb21lcyBmaXJzdC5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQcm90b1BhdGhOb3RGb3VuZEVycm9yKSB7CisgIC8vIFRlc3Qgd2hhdCBoYXBwZW5zIGlmIHRoZSBpbnB1dCBmaWxlIGlzIG5vdCBmb3VuZC4KKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIvZm9vIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAiJHRtcGRpci9mb286IHdhcm5pbmc6IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC5cbiIKKyAgICAiZm9vLnByb3RvOiBGaWxlIG5vdCBmb3VuZC5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBNaXNzaW5nSW5wdXRFcnJvcikgeworICAvLyBUZXN0IHRoYXQgd2UgZ2V0IGFuIGVycm9yIGlmIG5vIGlucHV0cyBhcmUgZ2l2ZW4uCisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KCJNaXNzaW5nIGlucHV0IGZpbGUuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTWlzc2luZ091dHB1dEVycm9yKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoIk1pc3Npbmcgb3V0cHV0IGRpcmVjdGl2ZXMuXG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgT3V0cHV0V3JpdGVFcnJvcikgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIHN0cmluZyBvdXRwdXRfZmlsZSA9CisgICAgICBNb2NrQ29kZUdlbmVyYXRvcjo6R2V0T3V0cHV0RmlsZU5hbWUoInRlc3RfZ2VuZXJhdG9yIiwgImZvby5wcm90byIpOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeSBibG9ja2luZyBvdXIgb3V0cHV0IGxvY2F0aW9uLgorICBDcmVhdGVUZW1wRGlyKG91dHB1dF9maWxlKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgLy8gTW9ja0NvZGVHZW5lcmF0b3Igbm8gbG9uZ2VyIGRldGVjdHMgYW4gZXJyb3IgYmVjYXVzZSB3ZSBhY3R1YWxseSB3cml0ZSB0bworICAvLyBhbiBpbi1tZW1vcnkgbG9jYXRpb24gZmlyc3QsIHRoZW4gZHVtcCB0byBkaXNrIGF0IHRoZSBlbmQuICBUaGlzIGlzIG5vCisgIC8vIGJpZyBkZWFsLgorICAvLyAgIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJNb2NrQ29kZUdlbmVyYXRvciBkZXRlY3RlZCB3cml0ZSBlcnJvci4iKTsKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorICAvLyBXaW5kb3dzIHdpdGggTVNWQ1JULmRsbCBwcm9kdWNlcyBFUEVSTSBpbnN0ZWFkIG9mIEVJU0RJUi4KKyAgaWYgKEhhc0FsdGVybmF0ZUVycm9yU3Vic3RyaW5nKG91dHB1dF9maWxlICsgIjogUGVybWlzc2lvbiBkZW5pZWQiKSkgeworICAgIHJldHVybjsKKyAgfQorI2VuZGlmCisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcob3V0cHV0X2ZpbGUgKyAiOiBJcyBhIGRpcmVjdG9yeSIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQbHVnaW5PdXRwdXRXcml0ZUVycm9yKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgc3RyaW5nIG91dHB1dF9maWxlID0KKyAgICAgIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlTmFtZSgidGVzdF9wbHVnaW4iLCAiZm9vLnByb3RvIik7CisKKyAgLy8gQ3JlYXRlIGEgZGlyZWN0b3J5IGJsb2NraW5nIG91ciBvdXRwdXQgbG9jYXRpb24uCisgIENyZWF0ZVRlbXBEaXIob3V0cHV0X2ZpbGUpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorICAvLyBXaW5kb3dzIHdpdGggTVNWQ1JULmRsbCBwcm9kdWNlcyBFUEVSTSBpbnN0ZWFkIG9mIEVJU0RJUi4KKyAgaWYgKEhhc0FsdGVybmF0ZUVycm9yU3Vic3RyaW5nKG91dHB1dF9maWxlICsgIjogUGVybWlzc2lvbiBkZW5pZWQiKSkgeworICAgIHJldHVybjsKKyAgfQorI2VuZGlmCisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcob3V0cHV0X2ZpbGUgKyAiOiBJcyBhIGRpcmVjdG9yeSIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBPdXRwdXREaXJlY3RvcnlOb3RGb3VuZEVycm9yKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIvbm9zdWNoZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygibm9zdWNoZGlyLzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQbHVnaW5PdXRwdXREaXJlY3RvcnlOb3RGb3VuZEVycm9yKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXBsdWdfb3V0PSR0bXBkaXIvbm9zdWNoZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygibm9zdWNoZGlyLzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBPdXRwdXREaXJlY3RvcnlJc0ZpbGVFcnJvcikgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyL2Zvby5wcm90byAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyAgLy8gV2luZG93cyB3aXRoIE1TVkNSVC5kbGwgcHJvZHVjZXMgRUlOVkFMIGluc3RlYWQgb2YgRU5PVERJUi4KKyAgaWYgKEhhc0FsdGVybmF0ZUVycm9yU3Vic3RyaW5nKCJmb28ucHJvdG8vOiBJbnZhbGlkIGFyZ3VtZW50IikpIHsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJmb28ucHJvdG8vOiBOb3QgYSBkaXJlY3RvcnkiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgR2VuZXJhdG9yRXJyb3IpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgTW9ja0NvZGVHZW5lcmF0b3JfRXJyb3Ige31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygKKyAgICAgICItLXRlc3Rfb3V0OiBmb28ucHJvdG86IFNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfRXJyb3IuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBsdWdpbkVycm9yKSB7CisgIC8vIFRlc3QgYSBnZW5lcmF0b3IgcGx1Z2luIHRoYXQgcmV0dXJucyBhbiBlcnJvci4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9FcnJvciB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXBsdWdfb3V0PVRlc3RQYXJhbWV0ZXI6JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoCisgICAgICAiLS1wbHVnX291dDogZm9vLnByb3RvOiBTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0Vycm9yLiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHZW5lcmF0b3JQbHVnaW5GYWlsKSB7CisgIC8vIFRlc3QgYSBnZW5lcmF0b3IgcGx1Z2luIHRoYXQgZXhpdHMgd2l0aCBhbiBlcnJvciBjb2RlLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIE1vY2tDb2RlR2VuZXJhdG9yX0V4aXQge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD1UZXN0UGFyYW1ldGVyOiR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0V4aXQuIik7CisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKAorICAgICAgIi0tcGx1Z19vdXQ6IHByZWZpeC1nZW4tcGx1ZzogUGx1Z2luIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDEyMy4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgR2VuZXJhdG9yUGx1Z2luQ3Jhc2gpIHsKKyAgLy8gVGVzdCBhIGdlbmVyYXRvciBwbHVnaW4gdGhhdCBjcmFzaGVzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIE1vY2tDb2RlR2VuZXJhdG9yX0Fib3J0IHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9BYm9ydC4iKTsKKworI2lmZGVmIF9XSU4zMgorICAvLyBXaW5kb3dzIGRvZXNuJ3QgaGF2ZSBzaWduYWxzLiAgSXQgbG9va3MgbGlrZSBhYm9ydCgpaW5nIGNhdXNlcyB0aGUgcHJvY2VzcworICAvLyB0byBleGl0IHdpdGggc3RhdHVzIGNvZGUgMywgYnV0IGxldCdzIG5vdCBkZXBlbmQgb24gdGhlIGV4YWN0IG51bWJlciBoZXJlLgorICBFeHBlY3RFcnJvclN1YnN0cmluZygKKyAgICAgICItLXBsdWdfb3V0OiBwcmVmaXgtZ2VuLXBsdWc6IFBsdWdpbiBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSIpOworI2Vsc2UKKyAgLy8gRG9uJ3QgZGVwZW5kIG9uIHRoZSBleGFjdCBzaWduYWwgbnVtYmVyLgorICBFeHBlY3RFcnJvclN1YnN0cmluZygKKyAgICAgICItLXBsdWdfb3V0OiBwcmVmaXgtZ2VuLXBsdWc6IFBsdWdpbiBraWxsZWQgYnkgc2lnbmFsIik7CisjZW5kaWYKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgR2VuZXJhdG9yUGx1Z2luTm90Rm91bmQpIHsKKyAgLy8gVGVzdCB3aGF0IGhhcHBlbnMgaWYgdGhlIHBsdWdpbiBpc24ndCBmb3VuZC4KKworICBDcmVhdGVUZW1wRmlsZSgiZXJyb3IucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWJhZHBsdWdfb3V0PVRlc3RQYXJhbWV0ZXI6JHRtcGRpciAiCisgICAgICAiLS1wbHVnaW49cHJlZml4LWdlbi1iYWRwbHVnPW5vX3N1Y2hfZmlsZSAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZXJyb3IucHJvdG8iKTsKKworI2lmZGVmIF9XSU4zMgorICBFeHBlY3RFcnJvclN1YnN0cmluZygiLS1iYWRwbHVnX291dDogcHJlZml4LWdlbi1iYWRwbHVnOiAiICsKKyAgICAgIFN1YnByb2Nlc3M6OldpbjMyRXJyb3JNZXNzYWdlKEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKSk7CisjZWxzZQorICAvLyBFcnJvciB3cml0dGVuIHRvIHN0ZG91dCBieSBjaGlsZCBwcm9jZXNzIGFmdGVyIGV4ZWMoKSBmYWlscy4KKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoCisgICAgICAibm9fc3VjaF9maWxlOiBwcm9ncmFtIG5vdCBmb3VuZCBvciBpcyBub3QgZXhlY3V0YWJsZSIpOworCisgIC8vIEVycm9yIHdyaXR0ZW4gYnkgcGFyZW50IHByb2Nlc3Mgd2hlbiBjaGlsZCBmYWlscy4KKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoCisgICAgICAiLS1iYWRwbHVnX291dDogcHJlZml4LWdlbi1iYWRwbHVnOiBQbHVnaW4gZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgMS4iKTsKKyNlbmRpZgorfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHZW5lcmF0b3JQbHVnaW5Ob3RBbGxvd2VkKSB7CisgIC8vIFRlc3Qgd2hhdCBoYXBwZW5zIGlmIHBsdWdpbnMgYXJlbid0IGFsbG93ZWQuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImVycm9yLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIERpc2FsbG93UGx1Z2lucygpOworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBlcnJvci5wcm90byIpOworCisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJVbmtub3duIGZsYWc6IC0tcGx1Z19vdXQiKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgSGVscFRleHQpIHsKKyAgUnVuKCJ0ZXN0X2V4ZWNfbmFtZSAtLWhlbHAiKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygiVXNhZ2U6IHRlc3RfZXhlY19uYW1lICIpOworICBFeHBlY3RFcnJvclN1YnN0cmluZygiLS10ZXN0X291dD1PVVRfRElSIik7CisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJUZXN0IG91dHB1dC4iKTsKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoIi0tYWx0X291dD1PVVRfRElSIik7CisgIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJBbHQgb3V0cHV0LiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHY2NGb3JtYXRFcnJvcnMpIHsKKyAgLy8gVGVzdCAtLWVycm9yX2Zvcm1hdD1nY2MgKHdoaWNoIGlzIHRoZSBkZWZhdWx0LCBidXQgd2Ugd2FudCB0byB2ZXJpZnkKKyAgLy8gdGhhdCBpdCBjYW4gYmUgc2V0IGV4cGxpY2l0bHkpLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJiYWRzeW50YXhcbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciAtLWVycm9yX2Zvcm1hdD1nY2MgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KAorICAgICJmb28ucHJvdG86MjoxOiBFeHBlY3RlZCB0b3AtbGV2ZWwgc3RhdGVtZW50IChlLmcuIFwibWVzc2FnZVwiKS5cbiIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBNc3ZzRm9ybWF0RXJyb3JzKSB7CisgIC8vIFRlc3QgLS1lcnJvcl9mb3JtYXQ9bXN2cworCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJiYWRzeW50YXhcbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciAtLWVycm9yX2Zvcm1hdD1tc3ZzIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAiJHRtcGRpci9mb28ucHJvdG8oMikgOiBlcnJvciBpbiBjb2x1bW49MTogRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAiCisgICAgICAiKGUuZy4gXCJtZXNzYWdlXCIpLlxuIik7Cit9CisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEludmFsaWRFcnJvckZvcm1hdCkgeworICAvLyBUZXN0IC0tZXJyb3JfZm9ybWF0PW1zdnMKKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiYmFkc3ludGF4XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgLS1lcnJvcl9mb3JtYXQ9aW52YWxpZCBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclRleHQoCisgICAgIlVua25vd24gZXJyb3IgZm9ybWF0OiBpbnZhbGlkXG4iKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmxhZyBwYXJzaW5nIHRlc3RzCisKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFBhcnNlU2luZ2xlQ2hhcmFjdGVyRmxhZykgeworICAvLyBUZXN0IHRoYXQgYSBzaW5nbGUtY2hhcmFjdGVyIGZsYWcgd29ya3MuCisKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC10JHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZVNwYWNlRGVsaW1pdGVkVmFsdWUpIHsKKyAgLy8gVGVzdCB0aGF0IHNlcGFyYXRpbmcgdGhlIGZsYWcgdmFsdWUgd2l0aCBhIHNwYWNlIHdvcmtzLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0ICR0bXBkaXIgIgorICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisgIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGFyc2VTaW5nbGVDaGFyYWN0ZXJTcGFjZURlbGltaXRlZFZhbHVlKSB7CisgIC8vIFRlc3QgdGhhdCBzZXBhcmF0aW5nIHRoZSBmbGFnIHZhbHVlIHdpdGggYSBzcGFjZSB3b3JrcyBmb3IKKyAgLy8gc2luZ2xlLWNoYXJhY3RlciBmbGFncy4KKworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLXQgJHRtcGRpciAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBNaXNzaW5nVmFsdWVFcnJvcikgeworICAvLyBUZXN0IHRoYXQgd2UgZ2V0IGFuIGVycm9yIGlmIGEgZmxhZyBpcyBtaXNzaW5nIGl0cyB2YWx1ZS4KKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQgLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JUZXh0KCJNaXNzaW5nIHZhbHVlIGZvciBmbGFnOiAtLXRlc3Rfb3V0XG4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTWlzc2luZ1ZhbHVlQXRFbmRFcnJvcikgeworICAvLyBUZXN0IHRoYXQgd2UgZ2V0IGFuIGVycm9yIGlmIHRoZSBsYXN0IGFyZ3VtZW50IGlzIGEgZmxhZyByZXF1aXJpbmcgYQorICAvLyB2YWx1ZS4KKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQiKTsKKworICBFeHBlY3RFcnJvclRleHQoIk1pc3NpbmcgdmFsdWUgZm9yIGZsYWc6IC0tdGVzdF9vdXRcbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRlc3QgZm9yIC0tZW5jb2RlIGFuZCAtLWRlY29kZS4gIE5vdGUgdGhhdCBpdCB3b3VsZCBiZSBlYXNpZXIgdG8gZG8gdGhpcworLy8gdGVzdCBhcyBhIHNoZWxsIHNjcmlwdCwgYnV0IHdlJ2QgbGlrZSB0byBiZSBhYmxlIHRvIHJ1biB0aGUgdGVzdCBvbgorLy8gcGxhdGZvcm1zIHRoYXQgZG9uJ3QgaGF2ZSBhIEJvdXJuZS1jb21wYXRpYmxlIHNoZWxsIGF2YWlsYWJsZSAoZXNwZWNpYWxseQorLy8gV2luZG93cy9NU1ZDKS4KK2NsYXNzIEVuY29kZURlY29kZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZHVwZWRfc3RkaW5fID0gZHVwKFNURElOX0ZJTEVOTyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgZHVwMihkdXBlZF9zdGRpbl8sIFNURElOX0ZJTEVOTyk7CisgICAgY2xvc2UoZHVwZWRfc3RkaW5fKTsKKyAgfQorCisgIHZvaWQgUmVkaXJlY3RTdGRpbkZyb21UZXh0KGNvbnN0IHN0cmluZyYgaW5wdXQpIHsKKyAgICBzdHJpbmcgZmlsZW5hbWUgPSBUZXN0VGVtcERpcigpICsgIi90ZXN0X3N0ZGluIjsKKyAgICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKGlucHV0LCBmaWxlbmFtZSk7CisgICAgR09PR0xFX0NIRUNLKFJlZGlyZWN0U3RkaW5Gcm9tRmlsZShmaWxlbmFtZSkpOworICB9CisKKyAgYm9vbCBSZWRpcmVjdFN0ZGluRnJvbUZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICAgIGludCBmZCA9IG9wZW4oZmlsZW5hbWUuY19zdHIoKSwgT19SRE9OTFkpOworICAgIGlmIChmZCA8IDApIHJldHVybiBmYWxzZTsKKyAgICBkdXAyKGZkLCBTVERJTl9GSUxFTk8pOworICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFJlbW92ZSAnXHInIGNoYXJhY3RlcnMgZnJvbSB0ZXh0LgorICBzdHJpbmcgU3RyaXBDUihjb25zdCBzdHJpbmcmIHRleHQpIHsKKyAgICBzdHJpbmcgcmVzdWx0OworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0LnNpemUoKTsgaSsrKSB7CisgICAgICBpZiAodGV4dFtpXSAhPSAnXHInKSB7CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2sodGV4dFtpXSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGVudW0gVHlwZSB7IFRFWFQsIEJJTkFSWSB9OworICBlbnVtIFJldHVybkNvZGUgeyBTVUNDRVNTLCBFUlJPUiB9OworCisgIGJvb2wgUnVuKGNvbnN0IHN0cmluZyYgY29tbWFuZCkgeworICAgIHZlY3RvcjxzdHJpbmc+IGFyZ3M7CisgICAgYXJncy5wdXNoX2JhY2soInByb3RvYyIpOworICAgIFNwbGl0U3RyaW5nVXNpbmcoY29tbWFuZCwgIiAiLCAmYXJncyk7CisgICAgYXJncy5wdXNoX2JhY2soIi0tcHJvdG9fcGF0aD0iICsgVGVzdFNvdXJjZURpcigpKTsKKworICAgIHNjb3BlZF9hcnJheTxjb25zdCBjaGFyKj4gYXJndihuZXcgY29uc3QgY2hhcipbYXJncy5zaXplKCldKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgIGFyZ3ZbaV0gPSBhcmdzW2ldLmNfc3RyKCk7CisgICAgfQorCisgICAgQ29tbWFuZExpbmVJbnRlcmZhY2UgY2xpOworICAgIGNsaS5TZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZSh0cnVlKTsKKworICAgIENhcHR1cmVUZXN0U3Rkb3V0KCk7CisgICAgQ2FwdHVyZVRlc3RTdGRlcnIoKTsKKworICAgIGludCByZXN1bHQgPSBjbGkuUnVuKGFyZ3Muc2l6ZSgpLCBhcmd2LmdldCgpKTsKKworICAgIGNhcHR1cmVkX3N0ZG91dF8gPSBHZXRDYXB0dXJlZFRlc3RTdGRvdXQoKTsKKyAgICBjYXB0dXJlZF9zdGRlcnJfID0gR2V0Q2FwdHVyZWRUZXN0U3RkZXJyKCk7CisKKyAgICByZXR1cm4gcmVzdWx0ID09IDA7CisgIH0KKworICB2b2lkIEV4cGVjdFN0ZG91dE1hdGNoZXNCaW5hcnlGaWxlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfb3V0cHV0OworICAgIEFTU0VSVF9UUlVFKEZpbGU6OlJlYWRGaWxlVG9TdHJpbmcoZmlsZW5hbWUsICZleHBlY3RlZF9vdXRwdXQpKTsKKworICAgIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHByaW50IHJhdyBiaW5hcnkgZGF0YSB0bworICAgIC8vIHN0ZG91dCBvbiBmYWlsdXJlLgorICAgIEVYUEVDVF9UUlVFKGNhcHR1cmVkX3N0ZG91dF8gPT0gZXhwZWN0ZWRfb3V0cHV0KTsKKyAgfQorCisgIHZvaWQgRXhwZWN0U3Rkb3V0TWF0Y2hlc1RleHRGaWxlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfb3V0cHV0OworICAgIEFTU0VSVF9UUlVFKEZpbGU6OlJlYWRGaWxlVG9TdHJpbmcoZmlsZW5hbWUsICZleHBlY3RlZF9vdXRwdXQpKTsKKworICAgIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KGV4cGVjdGVkX291dHB1dCk7CisgIH0KKworICB2b2lkIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfdGV4dCkgeworICAgIEVYUEVDVF9FUShTdHJpcENSKGV4cGVjdGVkX3RleHQpLCBTdHJpcENSKGNhcHR1cmVkX3N0ZG91dF8pKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoY29uc3Qgc3RyaW5nJiBleHBlY3RlZF90ZXh0KSB7CisgICAgRVhQRUNUX0VRKFN0cmlwQ1IoZXhwZWN0ZWRfdGV4dCksIFN0cmlwQ1IoY2FwdHVyZWRfc3RkZXJyXykpOworICB9CisKKyBwcml2YXRlOgorICBpbnQgZHVwZWRfc3RkaW5fOworICBzdHJpbmcgY2FwdHVyZWRfc3Rkb3V0XzsKKyAgc3RyaW5nIGNhcHR1cmVkX3N0ZGVycl87Cit9OworCitURVNUX0YoRW5jb2RlRGVjb2RlVGVzdCwgRW5jb2RlKSB7CisgIFJlZGlyZWN0U3RkaW5Gcm9tRmlsZShUZXN0U291cmNlRGlyKCkgKworICAgICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0Iik7CisgIEVYUEVDVF9UUlVFKFJ1bigiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvICIKKyAgICAgICAgICAgICAgICAgICItLWVuY29kZT1wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiKSk7CisgIEV4cGVjdFN0ZG91dE1hdGNoZXNCaW5hcnlGaWxlKFRlc3RTb3VyY2VEaXIoKSArCisgICAgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UiKTsKKyAgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoIiIpOworfQorCitURVNUX0YoRW5jb2RlRGVjb2RlVGVzdCwgRGVjb2RlKSB7CisgIFJlZGlyZWN0U3RkaW5Gcm9tRmlsZShUZXN0U291cmNlRGlyKCkgKworICAgICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlIik7CisgIEVYUEVDVF9UUlVFKFJ1bigiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvICIKKyAgICAgICAgICAgICAgICAgICItLWRlY29kZT1wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiKSk7CisgIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0RmlsZShUZXN0U291cmNlRGlyKCkgKworICAgICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0Iik7CisgIEV4cGVjdFN0ZGVyck1hdGNoZXNUZXh0KCIiKTsKK30KKworVEVTVF9GKEVuY29kZURlY29kZVRlc3QsIFBhcnRpYWwpIHsKKyAgUmVkaXJlY3RTdGRpbkZyb21UZXh0KCIiKTsKKyAgRVhQRUNUX1RSVUUoUnVuKCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8gIgorICAgICAgICAgICAgICAgICAgIi0tZW5jb2RlPXByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZCIpKTsKKyAgRXhwZWN0U3Rkb3V0TWF0Y2hlc1RleHQoIiIpOworICBFeHBlY3RTdGRlcnJNYXRjaGVzVGV4dCgKKyAgICAid2FybmluZzogIElucHV0IG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICBhLCBiLCBjXG4iKTsKK30KKworVEVTVF9GKEVuY29kZURlY29kZVRlc3QsIERlY29kZVJhdykgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2ludDMyKDEyMyk7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygiZm9vIik7CisgIHN0cmluZyBkYXRhOworICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKworICBSZWRpcmVjdFN0ZGluRnJvbVRleHQoZGF0YSk7CisgIEVYUEVDVF9UUlVFKFJ1bigiLS1kZWNvZGVfcmF3IikpOworICBFeHBlY3RTdGRvdXRNYXRjaGVzVGV4dCgiMTogMTIzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIxNDogXCJmb29cIlxuIik7CisgIEV4cGVjdFN0ZGVyck1hdGNoZXNUZXh0KCIiKTsKK30KKworVEVTVF9GKEVuY29kZURlY29kZVRlc3QsIFVua25vd25UeXBlKSB7CisgIEVYUEVDVF9GQUxTRShSdW4oImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byAiCisgICAgICAgICAgICAgICAgICAgIi0tZW5jb2RlPU5vU3VjaFR5cGUiKSk7CisgIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KCIiKTsKKyAgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoIlR5cGUgbm90IGRlZmluZWQ6IE5vU3VjaFR5cGVcbiIpOworfQorCitURVNUX0YoRW5jb2RlRGVjb2RlVGVzdCwgUHJvdG9QYXJzZUVycm9yKSB7CisgIEVYUEVDVF9GQUxTRShSdW4oImdvb2dsZS9wcm90b2J1Zi9ub19zdWNoX2ZpbGUucHJvdG8gIgorICAgICAgICAgICAgICAgICAgICItLWVuY29kZT1Ob1N1Y2hUeXBlIikpOworICBFeHBlY3RTdGRvdXRNYXRjaGVzVGV4dCgiIik7CisgIEV4cGVjdFN0ZGVyck1hdGNoZXNUZXh0KAorICAgICJnb29nbGUvcHJvdG9idWYvbm9fc3VjaF9maWxlLnByb3RvOiBGaWxlIG5vdCBmb3VuZC5cbiIpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZmE1MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDE1OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyB0ZXN0IGluc3VyZXMgdGhhdCBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi57aCxjY30gbWF0Y2ggZXhhY3RseQorLy8gd2hhdCB3b3VsZCBiZSBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyLiAgVGhlc2UgZmlsZXMgYXJlIG5vdAorLy8gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYXQgYnVpbGQgdGltZSBiZWNhdXNlIHRoZXkgYXJlIGNvbXBpbGVkIGludG8gdGhlCisvLyBwcm90b2NvbCBjb21waWxlciBpdHNlbGYuICBTbywgaWYgdGhleSB3ZXJlIGF1dG8tZ2VuZXJhdGVkLCB5b3UnZCBoYXZlIGEKKy8vIGNoaWNrZW4tYW5kLWVnZyBwcm9ibGVtLgorLy8KKy8vIElmIHRoaXMgdGVzdCBmYWlscywgcnVuIHRoZSBzY3JpcHQKKy8vICJnZW5lcmF0ZV9kZXNjcmlwdG9yX3Byb3RvLnNoIiBhbmQgYWRkCisvLyBkZXNjcmlwdG9yLnBiLntoLGNjfSB0byB5b3VyIGNoYW5nZWxpc3QuCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vY2tFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorICB+TW9ja0Vycm9yQ29sbGVjdG9yKCkge30KKworICBzdHJpbmcgdGV4dF87CisKKyAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiQyOiAkM1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworICB9Cit9OworCitjbGFzcyBNb2NrR2VuZXJhdG9yQ29udGV4dCA6IHB1YmxpYyBHZW5lcmF0b3JDb250ZXh0IHsKKyBwdWJsaWM6CisgIE1vY2tHZW5lcmF0b3JDb250ZXh0KCkge30KKyAgfk1vY2tHZW5lcmF0b3JDb250ZXh0KCkgeworICAgIFNUTERlbGV0ZVZhbHVlcygmZmlsZXNfKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0RmlsZU1hdGNoZXMoY29uc3Qgc3RyaW5nJiB2aXJ0dWFsX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGh5c2ljYWxfZmlsZW5hbWUpIHsKKyAgICBzdHJpbmcqIGV4cGVjdGVkX2NvbnRlbnRzID0gRmluZFB0ck9yTnVsbChmaWxlc18sIHZpcnR1YWxfZmlsZW5hbWUpOworICAgIEFTU0VSVF9UUlVFKGV4cGVjdGVkX2NvbnRlbnRzICE9IE5VTEwpCisgICAgICA8PCAiR2VuZXJhdG9yIGZhaWxlZCB0byBnZW5lcmF0ZSBmaWxlOiAiIDw8IHZpcnR1YWxfZmlsZW5hbWU7CisKKyAgICBzdHJpbmcgYWN0dWFsX2NvbnRlbnRzOworICAgIEZpbGU6OlJlYWRGaWxlVG9TdHJpbmdPckRpZSgKKyAgICAgIFRlc3RTb3VyY2VEaXIoKSArICIvIiArIHBoeXNpY2FsX2ZpbGVuYW1lLAorICAgICAgJmFjdHVhbF9jb250ZW50cyk7CisgICAgRVhQRUNUX1RSVUUoYWN0dWFsX2NvbnRlbnRzID09ICpleHBlY3RlZF9jb250ZW50cykKKyAgICAgIDw8IHBoeXNpY2FsX2ZpbGVuYW1lIDw8ICIgbmVlZHMgdG8gYmUgcmVnZW5lcmF0ZWQuICBQbGVhc2UgcnVuICIKKyAgICAgICAgICJnZW5lcmF0ZV9kZXNjcmlwdG9yX3Byb3RvLnNoIGFuZCBhZGQgdGhpcyBmaWxlICIKKyAgICAgICAgICJ0byB5b3VyIENMLiI7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIEdlbmVyYXRvckNvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB2aXJ0dWFsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3Blbihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgICAgc3RyaW5nKiogbWFwX3Nsb3QgPSAmZmlsZXNfW2ZpbGVuYW1lXTsKKyAgICBpZiAoKm1hcF9zbG90ICE9IE5VTEwpIGRlbGV0ZSAqbWFwX3Nsb3Q7CisgICAgKm1hcF9zbG90ID0gbmV3IHN0cmluZzsKKworICAgIHJldHVybiBuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbSgqbWFwX3Nsb3QpOworICB9CisKKyBwcml2YXRlOgorICBtYXA8c3RyaW5nLCBzdHJpbmcqPiBmaWxlc187Cit9OworCitURVNUKEJvb3RzdHJhcFRlc3QsIEdlbmVyYXRlZERlc2NyaXB0b3JNYXRjaGVzKSB7CisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERpc2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlOworICBzb3VyY2VfdHJlZS5NYXBQYXRoKCIiLCBUZXN0U291cmNlRGlyKCkpOworICBJbXBvcnRlciBpbXBvcnRlcigmc291cmNlX3RyZWUsICZlcnJvcl9jb2xsZWN0b3IpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogcHJvdG9fZmlsZSA9CisgICAgaW1wb3J0ZXIuSW1wb3J0KCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogcGx1Z2luX3Byb3RvX2ZpbGUgPQorICAgIGltcG9ydGVyLkltcG9ydCgiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90byIpOworICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7CisgIEFTU0VSVF9UUlVFKHByb3RvX2ZpbGUgIT0gTlVMTCk7CisgIEFTU0VSVF9UUlVFKHBsdWdpbl9wcm90b19maWxlICE9IE5VTEwpOworCisgIENwcEdlbmVyYXRvciBnZW5lcmF0b3I7CisgIE1vY2tHZW5lcmF0b3JDb250ZXh0IGNvbnRleHQ7CisgIHN0cmluZyBlcnJvcjsKKyAgc3RyaW5nIHBhcmFtZXRlcjsKKyAgcGFyYW1ldGVyID0gImRsbGV4cG9ydF9kZWNsPUxJQlBST1RPQlVGX0VYUE9SVCI7CisgIEFTU0VSVF9UUlVFKGdlbmVyYXRvci5HZW5lcmF0ZShwcm90b19maWxlLCBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dCwgJmVycm9yKSk7CisgIHBhcmFtZXRlciA9ICJkbGxleHBvcnRfZGVjbD1MSUJQUk9UT0NfRVhQT1JUIjsKKyAgQVNTRVJUX1RSVUUoZ2VuZXJhdG9yLkdlbmVyYXRlKHBsdWdpbl9wcm90b19maWxlLCBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dCwgJmVycm9yKSk7CisKKyAgY29udGV4dC5FeHBlY3RGaWxlTWF0Y2hlcygiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmgiKTsKKyAgY29udGV4dC5FeHBlY3RGaWxlTWF0Y2hlcygiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYyIpOworICBjb250ZXh0LkV4cGVjdEZpbGVNYXRjaGVzKCJnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmgiKTsKKyAgY29udGV4dC5FeHBlY3RGaWxlTWF0Y2hlcygiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5jYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuY2MiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZkMmI3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5jYwpAQCAtMCwwICsxLDI1OCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworRW51bUdlbmVyYXRvcjo6RW51bUdlbmVyYXRvcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBkbGxleHBvcnRfZGVjbCkKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKKyAgICBjbGFzc25hbWVfKENsYXNzTmFtZShkZXNjcmlwdG9yLCBmYWxzZSkpLAorICAgIGRsbGV4cG9ydF9kZWNsXyhkbGxleHBvcnRfZGVjbCkgeworfQorCitFbnVtR2VuZXJhdG9yOjp+RW51bUdlbmVyYXRvcigpIHt9CisKK3ZvaWQgRW51bUdlbmVyYXRvcjo6R2VuZXJhdGVEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgdmFyc1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOworICB2YXJzWyJzaG9ydF9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOworCisgIHByaW50ZXItPlByaW50KHZhcnMsICJlbnVtICRjbGFzc25hbWUkIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBtaW5fdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoMCk7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIG1heF92YWx1ZSA9IGRlc2NyaXB0b3JfLT52YWx1ZSgwKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICB2YXJzWyJuYW1lIl0gPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm5hbWUoKTsKKyAgICB2YXJzWyJudW1iZXIiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPnZhbHVlKGkpLT5udW1iZXIoKSk7CisgICAgdmFyc1sicHJlZml4Il0gPSAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpID09IE5VTEwpID8KKyAgICAgICIiIDogY2xhc3NuYW1lXyArICJfIjsKKworICAgIGlmIChpID4gMCkgcHJpbnRlci0+UHJpbnQoIixcbiIpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsICIkcHJlZml4JCRuYW1lJCA9ICRudW1iZXIkIik7CisKKyAgICBpZiAoZGVzY3JpcHRvcl8tPnZhbHVlKGkpLT5udW1iZXIoKSA8IG1pbl92YWx1ZS0+bnVtYmVyKCkpIHsKKyAgICAgIG1pbl92YWx1ZSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bnVtYmVyKCkgPiBtYXhfdmFsdWUtPm51bWJlcigpKSB7CisgICAgICBtYXhfdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSk7CisgICAgfQorICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgiXG59O1xuIik7CisKKyAgdmFyc1sibWluX25hbWUiXSA9IG1pbl92YWx1ZS0+bmFtZSgpOworICB2YXJzWyJtYXhfbmFtZSJdID0gbWF4X3ZhbHVlLT5uYW1lKCk7CisKKyAgaWYgKGRsbGV4cG9ydF9kZWNsXy5lbXB0eSgpKSB7CisgICAgdmFyc1siZGxsZXhwb3J0Il0gPSAiIjsKKyAgfSBlbHNlIHsKKyAgICB2YXJzWyJkbGxleHBvcnQiXSA9IGRsbGV4cG9ydF9kZWNsXyArICIgIjsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgIiRkbGxleHBvcnQkYm9vbCAkY2xhc3NuYW1lJF9Jc1ZhbGlkKGludCB2YWx1ZSk7XG4iCisgICAgImNvbnN0ICRjbGFzc25hbWUkICRwcmVmaXgkJHNob3J0X25hbWUkX01JTiA9ICRwcmVmaXgkJG1pbl9uYW1lJDtcbiIKKyAgICAiY29uc3QgJGNsYXNzbmFtZSQgJHByZWZpeCQkc2hvcnRfbmFtZSRfTUFYID0gJHByZWZpeCQkbWF4X25hbWUkO1xuIgorICAgICJjb25zdCBpbnQgJHByZWZpeCQkc2hvcnRfbmFtZSRfQVJSQVlTSVpFID0gJHByZWZpeCQkc2hvcnRfbmFtZSRfTUFYICsgMTtcbiIKKyAgICAiXG4iKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgIiRkbGxleHBvcnQkY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogJGNsYXNzbmFtZSRfZGVzY3JpcHRvcigpO1xuIik7CisgICAgLy8gVGhlIF9OYW1lIGFuZCBfUGFyc2UgbWV0aG9kcworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmICRjbGFzc25hbWUkX05hbWUoJGNsYXNzbmFtZSQgdmFsdWUpIHtcbiIKKyAgICAgICIgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKFxuIgorICAgICAgIiAgICAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yKCksIHZhbHVlKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgImlubGluZSBib29sICRjbGFzc25hbWUkX1BhcnNlKFxuIgorICAgICAgIiAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLCAkY2xhc3NuYW1lJCogdmFsdWUpIHtcbiIKKyAgICAgICIgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTwkY2xhc3NuYW1lJD4oXG4iCisgICAgICAiICAgICRjbGFzc25hbWUkX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpO1xuIgorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgRW51bUdlbmVyYXRvcjo6CitHZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInRlbXBsYXRlIDw+XG4iCisgICAgICAiaW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgJGNsYXNzbmFtZSQ+KCkge1xuIgorICAgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkX2Rlc2NyaXB0b3IoKTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXywgdHJ1ZSkpOworICB9Cit9CisKK3ZvaWQgRW51bUdlbmVyYXRvcjo6R2VuZXJhdGVTeW1ib2xJbXBvcnRzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgdmFyc1sibmVzdGVkX25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgIHZhcnNbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lXzsKKyAgcHJpbnRlci0+UHJpbnQodmFycywgInR5cGVkZWYgJGNsYXNzbmFtZSQgJG5lc3RlZF9uYW1lJDtcbiIpOworCisgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGorKykgeworICAgIHZhcnNbInRhZyJdID0gZGVzY3JpcHRvcl8tPnZhbHVlKGopLT5uYW1lKCk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJzdGF0aWMgY29uc3QgJG5lc3RlZF9uYW1lJCAkdGFnJCA9ICRjbGFzc25hbWUkXyR0YWckO1xuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICJzdGF0aWMgaW5saW5lIGJvb2wgJG5lc3RlZF9uYW1lJF9Jc1ZhbGlkKGludCB2YWx1ZSkge1xuIgorICAgICIgIHJldHVybiAkY2xhc3NuYW1lJF9Jc1ZhbGlkKHZhbHVlKTtcbiIKKyAgICAifVxuIgorICAgICJzdGF0aWMgY29uc3QgJG5lc3RlZF9uYW1lJCAkbmVzdGVkX25hbWUkX01JTiA9XG4iCisgICAgIiAgJGNsYXNzbmFtZSRfJG5lc3RlZF9uYW1lJF9NSU47XG4iCisgICAgInN0YXRpYyBjb25zdCAkbmVzdGVkX25hbWUkICRuZXN0ZWRfbmFtZSRfTUFYID1cbiIKKyAgICAiICAkY2xhc3NuYW1lJF8kbmVzdGVkX25hbWUkX01BWDtcbiIKKyAgICAic3RhdGljIGNvbnN0IGludCAkbmVzdGVkX25hbWUkX0FSUkFZU0laRSA9XG4iCisgICAgIiAgJGNsYXNzbmFtZSRfJG5lc3RlZF9uYW1lJF9BUlJBWVNJWkU7XG4iKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgInN0YXRpYyBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvcipcbiIKKyAgICAgICIkbmVzdGVkX25hbWUkX2Rlc2NyaXB0b3IoKSB7XG4iCisgICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcigpO1xuIgorICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAic3RhdGljIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkbmVzdGVkX25hbWUkX05hbWUoJG5lc3RlZF9uYW1lJCB2YWx1ZSkge1xuIgorICAgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkX05hbWUodmFsdWUpO1xuIgorICAgICAgIn1cbiIpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAic3RhdGljIGlubGluZSBib29sICRuZXN0ZWRfbmFtZSRfUGFyc2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSxcbiIKKyAgICAgICIgICAgJG5lc3RlZF9uYW1lJCogdmFsdWUpIHtcbiIKKyAgICAgICIgIHJldHVybiAkY2xhc3NuYW1lJF9QYXJzZShuYW1lLCB2YWx1ZSk7XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXplcigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgaW50IGluZGV4KSB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgdmFyc1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOworICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpbmRleCk7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXyA9IGZpbGUtPmVudW1fdHlwZSgkaW5kZXgkKTtcbiIpOworICB9IGVsc2UgeworICAgIHZhcnNbInBhcmVudCJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSwgZmFsc2UpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl8gPSAkcGFyZW50JF9kZXNjcmlwdG9yXy0+ZW51bV90eXBlKCRpbmRleCQpO1xuIik7CisgIH0KK30KKwordm9pZCBFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZU1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJjbGFzc25hbWUiXSA9IGNsYXNzbmFtZV87CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yKCkge1xuIgorICAgICAgIiAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7XG4iCisgICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl87XG4iCisgICAgICAifVxuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICJib29sICRjbGFzc25hbWUkX0lzVmFsaWQoaW50IHZhbHVlKSB7XG4iCisgICAgIiAgc3dpdGNoKHZhbHVlKSB7XG4iKTsKKworICAvLyBNdWx0aXBsZSB2YWx1ZXMgbWF5IGhhdmUgdGhlIHNhbWUgbnVtYmVyLiAgTWFrZSBzdXJlIHdlIG9ubHkgY292ZXIKKyAgLy8gZWFjaCBudW1iZXIgb25jZSBieSBmaXJzdCBjb25zdHJ1Y3RpbmcgYSBzZXQgY29udGFpbmluZyBhbGwgdmFsaWQKKyAgLy8gbnVtYmVycywgdGhlbiBwcmludGluZyBhIGNhc2Ugc3RhdGVtZW50IGZvciBlYWNoIGVsZW1lbnQuCisKKyAgc2V0PGludD4gbnVtYmVyczsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaisrKSB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoaik7CisgICAgbnVtYmVycy5pbnNlcnQodmFsdWUtPm51bWJlcigpKTsKKyAgfQorCisgIGZvciAoc2V0PGludD46Oml0ZXJhdG9yIGl0ZXIgPSBudW1iZXJzLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBudW1iZXJzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgICAgY2FzZSAkbnVtYmVyJDpcbiIsCisgICAgICAibnVtYmVyIiwgU2ltcGxlSXRvYSgqaXRlcikpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAiICAgICAgcmV0dXJuIHRydWU7XG4iCisgICAgIiAgICBkZWZhdWx0OlxuIgorICAgICIgICAgICByZXR1cm4gZmFsc2U7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iCisgICAgIlxuIik7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSAhPSBOVUxMKSB7CisgICAgLy8gV2UgbmVlZCB0byAiZGVmaW5lIiB0aGUgc3RhdGljIGNvbnN0YW50cyB3aGljaCB3ZXJlIGRlY2xhcmVkIGluIHRoZQorICAgIC8vIGhlYWRlciwgdG8gZ2l2ZSB0aGUgbGlua2VyIGEgcGxhY2UgdG8gcHV0IHRoZW0uICBPciBhdCBsZWFzdCB0aGUgQysrCisgICAgLy8gc3RhbmRhcmQgc2F5cyB3ZSBoYXZlIHRvLiAgTVNWQyBhY3R1YWxseSBpbnNpc3RzIHRoYSB3ZSBkbyBfbm90XyBkZWZpbmUKKyAgICAvLyB0aGVtIGFnYWluIGluIHRoZSAuY2MgZmlsZS4KKyAgICBwcmludGVyLT5QcmludCgiI2lmbmRlZiBfTVNDX1ZFUlxuIik7CisKKyAgICB2YXJzWyJwYXJlbnQiXSA9IENsYXNzTmFtZShkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCksIGZhbHNlKTsKKyAgICB2YXJzWyJuZXN0ZWRfbmFtZSJdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIHZhcnNbInZhbHVlIl0gPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm5hbWUoKTsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICJjb25zdCAkY2xhc3NuYW1lJCAkcGFyZW50JDo6JHZhbHVlJDtcbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgImNvbnN0ICRjbGFzc25hbWUkICRwYXJlbnQkOjokbmVzdGVkX25hbWUkX01JTjtcbiIKKyAgICAgICJjb25zdCAkY2xhc3NuYW1lJCAkcGFyZW50JDo6JG5lc3RlZF9uYW1lJF9NQVg7XG4iCisgICAgICAiY29uc3QgaW50ICRwYXJlbnQkOjokbmVzdGVkX25hbWUkX0FSUkFZU0laRTtcbiIpOworCisgICAgcHJpbnRlci0+UHJpbnQoIiNlbmRpZiAgLy8gX01TQ19WRVJcbiIpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Zjc3MjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uaApAQCAtMCwwICsxLDk5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0VOVU1fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRU5VTV9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBpbyB7CisgICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCisgIH0KK30KKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworY2xhc3MgRW51bUdlbmVyYXRvciB7CisgcHVibGljOgorICAvLyBTZWUgZ2VuZXJhdG9yLmNjIGZvciB0aGUgbWVhbmluZyBvZiBkbGxleHBvcnRfZGVjbC4KKyAgZXhwbGljaXQgRW51bUdlbmVyYXRvcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRsbGV4cG9ydF9kZWNsKTsKKyAgfkVudW1HZW5lcmF0b3IoKTsKKworICAvLyBIZWFkZXIgc3R1ZmYuCisKKyAgLy8gR2VuZXJhdGUgaGVhZGVyIGNvZGUgZGVmaW5pbmcgdGhlIGVudW0uICBUaGlzIGNvZGUgc2hvdWxkIGJlIHBsYWNlZAorICAvLyB3aXRoaW4gdGhlIGVudW0ncyBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0IE5PVCB3aXRoaW4gYW55IGNsYXNzLCBldmVuIGZvcgorICAvLyBuZXN0ZWQgZW51bXMuCisgIHZvaWQgR2VuZXJhdGVEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBzcGVjaWFsaXphdGlvbiBvZiBHZXRFbnVtRGVzY3JpcHRvcjxNeUVudW0+KCkuCisgIC8vIFByZWNvbmRpdGlvbjogaW4gOjpnb29nbGU6OnByb3RvYnVmIG5hbWVzcGFjZS4KKyAgdm9pZCBHZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBGb3IgZW51bXMgbmVzdGVkIHdpdGhpbiBhIG1lc3NhZ2UsIGdlbmVyYXRlIGNvZGUgdG8gaW1wb3J0IGFsbCB0aGUgZW51bSdzCisgIC8vIHN5bWJvbHMgKGUuZy4gdGhlIGVudW0gdHlwZSBuYW1lLCBhbGwgaXRzIHZhbHVlcywgZXRjLikgaW50byB0aGUgY2xhc3MncworICAvLyBuYW1lc3BhY2UuICBUaGlzIHNob3VsZCBiZSBwbGFjZWQgaW5zaWRlIHRoZSBjbGFzcyBkZWZpbml0aW9uIGluIHRoZQorICAvLyBoZWFkZXIuCisgIHZvaWQgR2VuZXJhdGVTeW1ib2xJbXBvcnRzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBTb3VyY2UgZmlsZSBzdHVmZi4KKworICAvLyBHZW5lcmF0ZSBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGdsb2JhbCB2YXJpYWJsZSBzdG9yaW5nIHRoZSBlbnVtJ3MKKyAgLy8gZGVzY3JpcHRvci4KKyAgdm9pZCBHZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlciwgaW50IGluZGV4KTsKKworICAvLyBHZW5lcmF0ZSBub24taW5saW5lIG1ldGhvZHMgcmVsYXRlZCB0byB0aGUgZW51bSwgc3VjaCBhcyBJc1ZhbGlkVmFsdWUoKS4KKyAgLy8gR29lcyBpbiB0aGUgLmNjIGZpbGUuCisgIHZvaWQgR2VuZXJhdGVNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworIHByaXZhdGU6CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RyaW5nIGNsYXNzbmFtZV87CisgIHN0cmluZyBkbGxleHBvcnRfZGVjbF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1HZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0VOVU1fSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2OWY0MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYwpAQCAtMCwwICsxLDM2MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgU2V0RW51bVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKSB7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcyk7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlZmF1bHRfdmFsdWUgPSBkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX2VudW0oKTsKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPSBDbGFzc05hbWUoZGVzY3JpcHRvci0+ZW51bV90eXBlKCksIHRydWUpOworICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IFNpbXBsZUl0b2EoZGVmYXVsdF92YWx1ZS0+bnVtYmVyKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitFbnVtRmllbGRHZW5lcmF0b3I6OgorRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7CisgIFNldEVudW1WYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18pOworfQorCitFbnVtRmllbGRHZW5lcmF0b3I6On5FbnVtRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJpbnQgJG5hbWUkXztcbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSAkdHlwZSQgJG5hbWUkKCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgdm9pZCBzZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgIiAgcmV0dXJuIHN0YXRpY19jYXN0PCAkdHlwZSQgPigkbmFtZSRfKTtcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAiICBHT09HTEVfRENIRUNLKCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSk7XG4iCisgICAgIiAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzZXRfJG5hbWUkKGZyb20uJG5hbWUkKCkpO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzdGQ6OnN3YXAoJG5hbWUkXywgb3RoZXItPiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGRlZmF1bHQkO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW50IHZhbHVlO1xuIgorICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPFxuIgorICAgICIgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KFxuIgorICAgICIgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTtcbiIKKyAgICAiaWYgKCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSkge1xuIgorICAgICIgIHNldF8kbmFtZSQoc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KHZhbHVlKSk7XG4iKTsKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIn0gZWxzZSB7XG4iCisgICAgICAiICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgkbnVtYmVyJCwgdmFsdWUpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oXG4iCisgICAgIiAgJG51bWJlciQsIHRoaXMtPiRuYW1lJCgpLCBvdXRwdXQpO1xuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheShcbiIKKyAgICAiICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKCksIHRhcmdldCk7XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgK1xuIgorICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT4kbmFtZSQoKSk7XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBTZXRFbnVtVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKK30KKworUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6On5SZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8aW50PiAkbmFtZSRfO1xuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpICYmIEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIm11dGFibGUgaW50IF8kbmFtZSRfY2FjaGVkX2J5dGVfc2l6ZV87XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lICR0eXBlJCAkbmFtZSQoaW50IGluZGV4KSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIHNldF8kbmFtZSQoaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIHZvaWQgYWRkXyRuYW1lJCgkdHlwZSQgdmFsdWUpJGRlcHJlY2F0aW9uJDtcbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPGludD4mICRuYW1lJCgpIGNvbnN0JGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDxpbnQ+KiBtdXRhYmxlXyRuYW1lJCgpJGRlcHJlY2F0aW9uJDtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoaW50IGluZGV4KSBjb25zdCB7XG4iCisgICAgIiAgcmV0dXJuIHN0YXRpY19jYXN0PCAkdHlwZSQgPigkbmFtZSRfLkdldChpbmRleCkpO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgIiAgR09PR0xFX0RDSEVDSygkdHlwZSRfSXNWYWxpZCh2YWx1ZSkpO1xuIgorICAgICIgICRuYW1lJF8uU2V0KGluZGV4LCB2YWx1ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgIiAgR09PR0xFX0RDSEVDSygkdHlwZSRfSXNWYWxpZCh2YWx1ZSkpO1xuIgorICAgICIgICRuYW1lJF8uQWRkKHZhbHVlKTtcbiIKKyAgICAifVxuIik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8aW50PiZcbiIKKyAgICAiJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPGludD4qXG4iCisgICAgIiRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAiICByZXR1cm4gJiRuYW1lJF87XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLkNsZWFyKCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLk1lcmdlRnJvbShmcm9tLiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uU3dhcCgmb3RoZXItPiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gTm90IG5lZWRlZCBmb3IgcmVwZWF0ZWQgZmllbGRzLgorfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gRG9uJ3QgdXNlIFJlYWRSZXBlYXRlZFByaW1pdGl2ZSBoZXJlIHNvIHRoYXQgdGhlIGVudW0gY2FuIGJlIHZhbGlkYXRlZC4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW50IHZhbHVlO1xuIgorICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPFxuIgorICAgICIgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KFxuIgorICAgICIgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTtcbiIKKyAgICAiaWYgKCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSkge1xuIgorICAgICIgIGFkZF8kbmFtZSQoc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KHZhbHVlKSk7XG4iKTsKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIn0gZWxzZSB7XG4iCisgICAgICAiICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgkbnVtYmVyJCwgdmFsdWUpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoIWRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICAvLyBXZSB1c2UgYSBub24taW5saW5lZCBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzIGNhc2UsIHNpbmNlIHRoaXMgcGF0aCB3aWxsCisgICAgLy8gcmFyZWx5IGJlIGV4ZWN1dGVkLgorICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZEVudW1Ob0lubGluZShcbiIKKyAgICAgICIgICAgICAgaW5wdXQsXG4iCisgICAgICAiICAgICAgICYkdHlwZSRfSXNWYWxpZCxcbiIKKyAgICAgICIgICAgICAgdGhpcy0+bXV0YWJsZV8kbmFtZSQoKSkpKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgbGVuZ3RoO1xuIgorICAgICAgIkRPXyhpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKTtcbiIKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9ICIKKyAgICAgICAgICAiaW5wdXQtPlB1c2hMaW1pdChsZW5ndGgpO1xuIgorICAgICAgIndoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7XG4iCisgICAgICAiICBpbnQgdmFsdWU7XG4iCisgICAgICAiICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPFxuIgorICAgICAgIiAgICAgICAgIGludCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oXG4iCisgICAgICAiICAgICAgIGlucHV0LCAmdmFsdWUpKSk7XG4iCisgICAgICAiICBpZiAoJHR5cGUkX0lzVmFsaWQodmFsdWUpKSB7XG4iCisgICAgICAiICAgIGFkZF8kbmFtZSQoc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KHZhbHVlKSk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIgorICAgICAgImlucHV0LT5Qb3BMaW1pdChsaW1pdCk7XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgLy8gV3JpdGUgdGhlIHRhZyBhbmQgdGhlIHNpemUuCisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAodGhpcy0+JG5hbWUkX3NpemUoKSA+IDApIHtcbiIKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZyhcbiIKKyAgICAgICIgICAgJG51bWJlciQsXG4iCisgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELFxuIgorICAgICAgIiAgICBvdXRwdXQpO1xuIgorICAgICAgIiAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKF8kbmFtZSRfY2FjaGVkX2J5dGVfc2l6ZV8pO1xuIgorICAgICAgIn1cbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIpOworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtTm9UYWcoXG4iCisgICAgICAiICAgIHRoaXMtPiRuYW1lJChpKSwgb3V0cHV0KTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKFxuIgorICAgICAgIiAgICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKGkpLCBvdXRwdXQpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIC8vIFdyaXRlIHRoZSB0YWcgYW5kIHRoZSBzaXplLgorICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKHRoaXMtPiRuYW1lJF9zaXplKCkgPiAwKSB7XG4iCisgICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KFxuIgorICAgICAgIiAgICAkbnVtYmVyJCxcbiIKKyAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsXG4iCisgICAgICAiICAgIHRhcmdldCk7XG4iCisgICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoIgorICAgICAgIiAgICBfJG5hbWUkX2NhY2hlZF9ieXRlX3NpemVfLCB0YXJnZXQpO1xuIgorICAgICAgIn1cbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIpOworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtTm9UYWdUb0FycmF5KFxuIgorICAgICAgIiAgICB0aGlzLT4kbmFtZSQoaSksIHRhcmdldCk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoXG4iCisgICAgICAiICAgICRudW1iZXIkLCB0aGlzLT4kbmFtZSQoaSksIHRhcmdldCk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ7XG4iCisgICAgIiAgaW50IGRhdGFfc2l6ZSA9IDA7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAgICIgIGRhdGFfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUoXG4iCisgICAgICAiICAgIHRoaXMtPiRuYW1lJChpKSk7XG4iCisgICAgICAifVxuIik7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmIChkYXRhX3NpemUgPiAwKSB7XG4iCisgICAgICAiICB0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgK1xuIgorICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKGRhdGFfc2l6ZSk7XG4iCisgICAgICAifVxuIgorICAgICAgIl8kbmFtZSRfY2FjaGVkX2J5dGVfc2l6ZV8gPSBkYXRhX3NpemU7XG4iCisgICAgICAidG90YWxfc2l6ZSArPSBkYXRhX3NpemU7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCAqIHRoaXMtPiRuYW1lJF9zaXplKCkgKyBkYXRhX3NpemU7XG4iKTsKKyAgfQorICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5MzQzMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oCkBAIC0wLDAgKzEsMTAzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0VOVU1fRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRU5VTV9GSUVMRF9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIH5FbnVtRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1GaWVsZEdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB+UmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbVdpdGhQYWNraW5nKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0VOVU1fRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OGE3MDc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MKQEAgLTAsMCArMSwyMTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCituYW1lc3BhY2UgeworCisvLyBSZXR1cm5zIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWVzc2FnZSB0aGF0IHRoaXMgZmllbGQKKy8vIGV4dGVuZHMuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiB0aGUgR29vZ2xlLWludGVybmFsIGNvZGUgdG8gaGFuZGxlIHNvbWUKKy8vIGxlZ2FjeSBjYXNlcy4KK3N0cmluZyBFeHRlbmRlZUNsYXNzTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUgPSBkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKTsKKyAgcmV0dXJuIENsYXNzTmFtZShleHRlbmRlZSwgdHJ1ZSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworRXh0ZW5zaW9uR2VuZXJhdG9yOjpFeHRlbnNpb25HZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBkbGxleHBvcnRfZGVjbCkKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKKyAgICBkbGxleHBvcnRfZGVjbF8oZGxsZXhwb3J0X2RlY2wpIHsKKyAgLy8gQ29uc3RydWN0IHR5cGVfdHJhaXRzXy4KKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19yZXBlYXRlZCgpKSB7CisgICAgdHlwZV90cmFpdHNfID0gIlJlcGVhdGVkIjsKKyAgfQorCisgIHN3aXRjaCAoZGVzY3JpcHRvcl8tPmNwcF90eXBlKCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZCgiRW51bVR5cGVUcmFpdHM8ICIpOworICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZChDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgpLCB0cnVlKSk7CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKCIsICIpOworICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZChDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgpLCB0cnVlKSk7CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKCJfSXNWYWxpZD4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoIlN0cmluZ1R5cGVUcmFpdHMiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKCJNZXNzYWdlVHlwZVRyYWl0czwgIik7CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKENsYXNzTmFtZShkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCksIHRydWUpKTsKKyAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoIiA+Iik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZCgiUHJpbWl0aXZlVHlwZVRyYWl0czwgIik7CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKFByaW1pdGl2ZVR5cGVOYW1lKGRlc2NyaXB0b3JfLT5jcHBfdHlwZSgpKSk7CisgICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKCIgPiIpOworICAgICAgYnJlYWs7CisgIH0KK30KKworRXh0ZW5zaW9uR2VuZXJhdG9yOjp+RXh0ZW5zaW9uR2VuZXJhdG9yKCkge30KKwordm9pZCBFeHRlbnNpb25HZW5lcmF0b3I6OkdlbmVyYXRlRGVjbGFyYXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJleHRlbmRlZSIgICAgIF0gPSBFeHRlbmRlZUNsYXNzTmFtZShkZXNjcmlwdG9yXyk7CisgIHZhcnNbIm51bWJlciIgICAgICAgXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPm51bWJlcigpKTsKKyAgdmFyc1sidHlwZV90cmFpdHMiICBdID0gdHlwZV90cmFpdHNfOworICB2YXJzWyJuYW1lIiAgICAgICAgIF0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOworICB2YXJzWyJmaWVsZF90eXBlIiAgIF0gPSBTaW1wbGVJdG9hKHN0YXRpY19jYXN0PGludD4oZGVzY3JpcHRvcl8tPnR5cGUoKSkpOworICB2YXJzWyJwYWNrZWQiICAgICAgIF0gPSBkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpID8gInRydWUiIDogImZhbHNlIjsKKyAgdmFyc1siY29uc3RhbnRfbmFtZSJdID0gRmllbGRDb25zdGFudE5hbWUoZGVzY3JpcHRvcl8pOworCisgIC8vIElmIHRoaXMgaXMgYSBjbGFzcyBtZW1iZXIsIGl0IG5lZWRzIHRvIGJlIGRlY2xhcmVkICJzdGF0aWMiLiAgT3RoZXJ3aXNlLAorICAvLyBpdCBuZWVkcyB0byBiZSAiZXh0ZXJuIi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgaXQgYWxzbyBuZWVkcyB0aGUgRExMCisgIC8vIGV4cG9ydC9pbXBvcnQgc3BlY2lmaWVyLgorICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9zY29wZSgpID09IE5VTEwpIHsKKyAgICB2YXJzWyJxdWFsaWZpZXIiXSA9ICJleHRlcm4iOworICAgIGlmICghZGxsZXhwb3J0X2RlY2xfLmVtcHR5KCkpIHsKKyAgICAgIHZhcnNbInF1YWxpZmllciJdID0gZGxsZXhwb3J0X2RlY2xfICsgIiAiICsgdmFyc1sicXVhbGlmaWVyIl07CisgICAgfQorICB9IGVsc2UgeworICAgIHZhcnNbInF1YWxpZmllciJdID0gInN0YXRpYyI7CisgIH0KKworICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICJzdGF0aWMgY29uc3QgaW50ICRjb25zdGFudF9uYW1lJCA9ICRudW1iZXIkO1xuIgorICAgICIkcXVhbGlmaWVyJCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAkZXh0ZW5kZWUkLFxuIgorICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6JHR5cGVfdHJhaXRzJCwgJGZpZWxkX3R5cGUkLCAkcGFja2VkJCA+XG4iCisgICAgIiAgJG5hbWUkO1xuIgorICAgICk7CisKK30KKwordm9pZCBFeHRlbnNpb25HZW5lcmF0b3I6OkdlbmVyYXRlRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBJZiB0aGlzIGlzIGEgY2xhc3MgbWVtYmVyLCBpdCBuZWVkcyB0byBiZSBkZWNsYXJlZCBpbiBpdHMgY2xhc3Mgc2NvcGUuCisgIHN0cmluZyBzY29wZSA9IChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gTlVMTCkgPyAiIiA6CisgICAgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSwgZmFsc2UpICsgIjo6IjsKKyAgc3RyaW5nIG5hbWUgPSBzY29wZSArIGRlc2NyaXB0b3JfLT5uYW1lKCk7CisKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJleHRlbmRlZSIgICAgIF0gPSBFeHRlbmRlZUNsYXNzTmFtZShkZXNjcmlwdG9yXyk7CisgIHZhcnNbInR5cGVfdHJhaXRzIiAgXSA9IHR5cGVfdHJhaXRzXzsKKyAgdmFyc1sibmFtZSIgICAgICAgICBdID0gbmFtZTsKKyAgdmFyc1siY29uc3RhbnRfbmFtZSJdID0gRmllbGRDb25zdGFudE5hbWUoZGVzY3JpcHRvcl8pOworICB2YXJzWyJkZWZhdWx0IiAgICAgIF0gPSBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcl8pOworICB2YXJzWyJmaWVsZF90eXBlIiAgIF0gPSBTaW1wbGVJdG9hKHN0YXRpY19jYXN0PGludD4oZGVzY3JpcHRvcl8tPnR5cGUoKSkpOworICB2YXJzWyJwYWNrZWQiICAgICAgIF0gPSBkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpID8gInRydWUiIDogImZhbHNlIjsKKyAgdmFyc1sic2NvcGUiICAgICAgICBdID0gc2NvcGU7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcpIHsKKyAgICAvLyBXZSBuZWVkIHRvIGRlY2xhcmUgYSBnbG9iYWwgc3RyaW5nIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAvLyBXZSBjYW5ub3QgZGVjbGFyZSBpdCBhdCBjbGFzcyBzY29wZSBiZWNhdXNlIHRoYXQgd291bGQgcmVxdWlyZSBleHBvc2luZworICAgIC8vIGl0IGluIHRoZSBoZWFkZXIgd2hpY2ggd291bGQgYmUgYW5ub3lpbmcgZm9yIG90aGVyIHJlYXNvbnMuICBTbyB3ZQorICAgIC8vIHJlcGxhY2UgOjogd2l0aCBfIGluIHRoZSBuYW1lIGFuZCBkZWNsYXJlIGl0IGFzIGEgZ2xvYmFsLgorICAgIHN0cmluZyBnbG9iYWxfbmFtZSA9IFN0cmluZ1JlcGxhY2UobmFtZSwgIjo6IiwgIl8iLCB0cnVlKTsKKyAgICB2YXJzWyJnbG9iYWxfbmFtZSJdID0gZ2xvYmFsX25hbWU7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJjb25zdCA6OnN0ZDo6c3RyaW5nICRnbG9iYWxfbmFtZSRfZGVmYXVsdCgkZGVmYXVsdCQpO1xuIik7CisKKyAgICAvLyBVcGRhdGUgdGhlIGRlZmF1bHQgdG8gcmVmZXIgdG8gdGhlIHN0cmluZyBnbG9iYWwuCisgICAgdmFyc1siZGVmYXVsdCJdID0gZ2xvYmFsX25hbWUgKyAiX2RlZmF1bHQiOworICB9CisKKyAgLy8gTGlrZXdpc2UsIGNsYXNzIG1lbWJlcnMgbmVlZCB0byBkZWNsYXJlIHRoZSBmaWVsZCBjb25zdGFudCB2YXJpYWJsZS4KKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSAhPSBOVUxMKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIjaWZuZGVmIF9NU0NfVkVSXG4iCisgICAgICAiY29uc3QgaW50ICRzY29wZSQkY29uc3RhbnRfbmFtZSQ7XG4iCisgICAgICAiI2VuZGlmXG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICRleHRlbmRlZSQsXG4iCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjokdHlwZV90cmFpdHMkLCAkZmllbGRfdHlwZSQsICRwYWNrZWQkID5cbiIKKyAgICAiICAkbmFtZSQoJGNvbnN0YW50X25hbWUkLCAkZGVmYXVsdCQpO1xuIik7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZVJlZ2lzdHJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbImV4dGVuZGVlIiAgIF0gPSBFeHRlbmRlZUNsYXNzTmFtZShkZXNjcmlwdG9yXyk7CisgIHZhcnNbIm51bWJlciIgICAgIF0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5udW1iZXIoKSk7CisgIHZhcnNbImZpZWxkX3R5cGUiIF0gPSBTaW1wbGVJdG9hKHN0YXRpY19jYXN0PGludD4oZGVzY3JpcHRvcl8tPnR5cGUoKSkpOworICB2YXJzWyJpc19yZXBlYXRlZCJdID0gZGVzY3JpcHRvcl8tPmlzX3JlcGVhdGVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOworICB2YXJzWyJpc19wYWNrZWQiICBdID0gKGRlc2NyaXB0b3JfLT5pc19yZXBlYXRlZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gInRydWUiIDogImZhbHNlIjsKKworICBzd2l0Y2ggKGRlc2NyaXB0b3JfLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQ6OlJlZ2lzdGVyRW51bUV4dGVuc2lvbihcbiIKKyAgICAgICAgIiAgJiRleHRlbmRlZSQ6OmRlZmF1bHRfaW5zdGFuY2UoKSxcbiIKKyAgICAgICAgIiAgJG51bWJlciQsICRmaWVsZF90eXBlJCwgJGlzX3JlcGVhdGVkJCwgJGlzX3BhY2tlZCQsXG4iKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICAmJHR5cGUkX0lzVmFsaWQpO1xuIiwKKyAgICAgICAgInR5cGUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgpLCB0cnVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldDo6UmVnaXN0ZXJNZXNzYWdlRXh0ZW5zaW9uKFxuIgorICAgICAgICAiICAmJGV4dGVuZGVlJDo6ZGVmYXVsdF9pbnN0YW5jZSgpLFxuIgorICAgICAgICAiICAkbnVtYmVyJCwgJGZpZWxkX3R5cGUkLCAkaXNfcmVwZWF0ZWQkLCAkaXNfcGFja2VkJCxcbiIpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgICYkdHlwZSQ6OmRlZmF1bHRfaW5zdGFuY2UoKSk7XG4iLAorICAgICAgICAidHlwZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCksIHRydWUpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0OjpSZWdpc3RlckV4dGVuc2lvbihcbiIKKyAgICAgICAgIiAgJiRleHRlbmRlZSQ6OmRlZmF1bHRfaW5zdGFuY2UoKSxcbiIKKyAgICAgICAgIiAgJG51bWJlciQsICRmaWVsZF90eXBlJCwgJGlzX3JlcGVhdGVkJCwgJGlzX3BhY2tlZCQpO1xuIik7CisgICAgICBicmVhazsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2OGIwOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmgKQEAgLTAsMCArMSw4NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9FWFRFTlNJT05fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRVhURU5TSU9OX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBjbGFzcyBGaWVsZERlc2NyaXB0b3I7ICAgICAgIC8vIGRlc2NyaXB0b3IuaAorICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICB9Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKKy8vIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBleHRlbnNpb24sIHdoaWNoIG1heSBiZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHNvbWUKKy8vIG1lc3NhZ2Ugb3IgbWF5IGJlIGF0IGZpbGUgc2NvcGUuICBUaGlzIGlzIG11Y2ggc2ltcGxlciB0aGFuIEZpZWxkR2VuZXJhdG9yCisvLyBzaW5jZSBleHRlbnNpb25zIGFyZSBqdXN0IHNpbXBsZSBpZGVudGlmaWVycyB3aXRoIGludGVyZXN0aW5nIHR5cGVzLgorY2xhc3MgRXh0ZW5zaW9uR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIC8vIFNlZSBnZW5lcmF0b3IuY2MgZm9yIHRoZSBtZWFuaW5nIG9mIGRsbGV4cG9ydF9kZWNsLgorICBleHBsaWNpdCBFeHRlbnNpb25HZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBkbGxleHBvcnRfZGVjbCk7CisgIH5FeHRlbnNpb25HZW5lcmF0b3IoKTsKKworICAvLyBIZWFkZXIgc3R1ZmYuCisgIHZvaWQgR2VuZXJhdGVEZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gU291cmNlIGZpbGUgc3R1ZmYuCisgIHZvaWQgR2VuZXJhdGVEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBjb2RlIHRvIHJlZ2lzdGVyIHRoZSBleHRlbnNpb24uCisgIHZvaWQgR2VuZXJhdGVSZWdpc3RyYXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RyaW5nIHR5cGVfdHJhaXRzXzsKKyAgc3RyaW5nIGRsbGV4cG9ydF9kZWNsXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRXh0ZW5zaW9uR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9NRVNTQUdFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzY2FjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuY2MKQEAgLTAsMCArMSwxMzkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7CisKK3ZvaWQgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gPSBGaWVsZE5hbWUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsiaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+aW5kZXgoKSk7CisgICgqdmFyaWFibGVzKVsibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgKCp2YXJpYWJsZXMpWyJjbGFzc25hbWUiXSA9IENsYXNzTmFtZShGaWVsZFNjb3BlKGRlc2NyaXB0b3IpLCBmYWxzZSk7CisgICgqdmFyaWFibGVzKVsiZGVjbGFyZWRfdHlwZSJdID0gRGVjbGFyZWRUeXBlTWV0aG9kTmFtZShkZXNjcmlwdG9yLT50eXBlKCkpOworCisgICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFNpbXBsZUl0b2EoCisgICAgV2lyZUZvcm1hdDo6VGFnU2l6ZShkZXNjcmlwdG9yLT5udW1iZXIoKSwgZGVzY3JpcHRvci0+dHlwZSgpKSk7CisgICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9IGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKKyAgICAgID8gIiBQUk9UT0JVRl9ERVBSRUNBVEVEIiA6ICIiOworCit9CisKK0ZpZWxkR2VuZXJhdG9yOjp+RmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIEZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBSZWFjaGluZyBoZXJlIGluZGljYXRlcyBhIGJ1Zy4gQ2FzZXMgYXJlOgorICAvLyAgIC0gVGhpcyBGaWVsZEdlbmVyYXRvciBzaG91bGQgc3VwcG9ydCBwYWNraW5nLCBidXQgdGhpcyBtZXRob2Qgc2hvdWxkIGJlCisgIC8vICAgICBvdmVycmlkZGVuLgorICAvLyAgIC0gVGhpcyBGaWVsZEdlbmVyYXRvciBkb2Vzbid0IHN1cHBvcnQgcGFja2luZywgYW5kIHRoaXMgbWV0aG9kIHNob3VsZAorICAvLyAgICAgbmV2ZXIgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZygpICIKKyAgICAgICAgICAgICA8PCAiY2FsbGVkIG9uIGZpZWxkIGdlbmVyYXRvciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgcGFja2luZy4iOworCit9CisKK0ZpZWxkR2VuZXJhdG9yTWFwOjpGaWVsZEdlbmVyYXRvck1hcChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgIGZpZWxkX2dlbmVyYXRvcnNfKAorICAgICAgbmV3IHNjb3BlZF9wdHI8RmllbGRHZW5lcmF0b3I+W2Rlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCldKSB7CisgIC8vIENvbnN0cnVjdCBhbGwgdGhlIEZpZWxkR2VuZXJhdG9ycy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZF9nZW5lcmF0b3JzX1tpXS5yZXNldChNYWtlR2VuZXJhdG9yKGRlc2NyaXB0b3ItPmZpZWxkKGkpKSk7CisgIH0KK30KKworRmllbGRHZW5lcmF0b3IqIEZpZWxkR2VuZXJhdG9yTWFwOjpNYWtlR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihmaWVsZCk7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogIC8vIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IgaGFuZGxlcyB1bmtub3duIGN0eXBlcy4KKyAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihmaWVsZCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoZmllbGQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihmaWVsZCk7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogIC8vIFN0cmluZ0ZpZWxkR2VuZXJhdG9yIGhhbmRsZXMgdW5rbm93biBjdHlwZXMuCisgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRmllbGRHZW5lcmF0b3IoZmllbGQpOworICAgICAgICB9CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICByZXR1cm4gbmV3IEVudW1GaWVsZEdlbmVyYXRvcihmaWVsZCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGZpZWxkKTsKKyAgICB9CisgIH0KK30KKworRmllbGRHZW5lcmF0b3JNYXA6On5GaWVsZEdlbmVyYXRvck1hcCgpIHt9CisKK2NvbnN0IEZpZWxkR2VuZXJhdG9yJiBGaWVsZEdlbmVyYXRvck1hcDo6Z2V0KAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSwgZGVzY3JpcHRvcl8pOworICByZXR1cm4gKmZpZWxkX2dlbmVyYXRvcnNfW2ZpZWxkLT5pbmRleCgpXTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMDNhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgbmFtZXNwYWNlIGlvIHsKKyAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKKyAgfQorfQorCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCisvLyBIZWxwZXIgZnVuY3Rpb246IHNldCB2YXJpYWJsZXMgaW4gdGhlIG1hcCB0aGF0IGFyZSB0aGUgc2FtZSBmb3IgYWxsCisvLyBmaWVsZCBjb2RlIGdlbmVyYXRvcnMuCisvLyBbJ25hbWUnLCAnaW5kZXgnLCAnbnVtYmVyJywgJ2NsYXNzbmFtZScsICdkZWNsYXJlZF90eXBlJywgJ3RhZ19zaXplJywKKy8vICdkZXByZWNhdGlvbiddLgordm9pZCBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcyk7CisKK2NsYXNzIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEZpZWxkR2VuZXJhdG9yKCkge30KKyAgdmlydHVhbCB+RmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBHZW5lcmF0ZSBsaW5lcyBvZiBjb2RlIGRlY2xhcmluZyBtZW1iZXJzIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSBjbGFzcworICAvLyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoaXMgZmllbGQuICBUaGVzZSBhcmUgcGxhY2VkIGluc2lkZSB0aGUgbWVzc2FnZQorICAvLyBjbGFzcy4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBwcm90b3R5cGVzIGZvciBhbGwgb2YgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoaXMKKyAgLy8gZmllbGQuICBUaGVzZSBhcmUgcGxhY2VkIGluc2lkZSB0aGUgY2xhc3MgZGVmaW5pdGlvbi4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBpbmxpbmUgZGVmaW5pdGlvbnMgb2YgYWNjZXNzb3IgZnVuY3Rpb25zIGZvciB0aGlzIGZpZWxkLgorICAvLyBUaGVzZSBhcmUgcGxhY2VkIGluc2lkZSB0aGUgaGVhZGVyIGFmdGVyIGFsbCBjbGFzcyBkZWZpbml0aW9ucy4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworCisgIC8vIEdlbmVyYXRlIGRlZmluaXRpb25zIG9mIGFjY2Vzc29ycyB0aGF0IGFyZW4ndCBpbmxpbmVkLiAgVGhlc2UgYXJlCisgIC8vIHBsYWNlZCBzb21ld2hlcmUgaW4gdGhlIC5jYyBmaWxlLgorICAvLyBNb3N0IGZpZWxkIHR5cGVzIGRvbid0IG5lZWQgdGhpcywgc28gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZW1wdHkuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU5vbklubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9CisKKyAgLy8gR2VuZXJhdGUgbGluZXMgb2YgY29kZSAoc3RhdGVtZW50cywgbm90IGRlY2xhcmF0aW9ucykgd2hpY2ggY2xlYXIgdGhlCisgIC8vIGZpZWxkLiAgVGhpcyBpcyB1c2VkIHRvIGRlZmluZSB0aGUgY2xlYXJfJG5hbWUkKCkgbWV0aG9kIGFzIHdlbGwgYXMKKyAgLy8gdGhlIENsZWFyKCkgbWV0aG9kIGZvciB0aGUgd2hvbGUgbWVzc2FnZS4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgLy8gR2VuZXJhdGUgbGluZXMgb2YgY29kZSAoc3RhdGVtZW50cywgbm90IGRlY2xhcmF0aW9ucykgd2hpY2ggbWVyZ2VzIHRoZQorICAvLyBjb250ZW50cyBvZiB0aGUgZmllbGQgZnJvbSB0aGUgY3VycmVudCBtZXNzYWdlIHRvIHRoZSB0YXJnZXQgbWVzc2FnZSwKKyAgLy8gd2hpY2ggaXMgc3RvcmVkIGluIHRoZSBnZW5lcmF0ZWQgY29kZSB2YXJpYWJsZSAiZnJvbSIuCisgIC8vIFRoaXMgaXMgdXNlZCB0byBmaWxsIGluIHRoZSBNZXJnZUZyb20gbWV0aG9kIGZvciB0aGUgd2hvbGUgbWVzc2FnZS4KKyAgLy8gRGV0YWlscyBvZiB0aGlzIHVzYWdlIGNhbiBiZSBmb3VuZCBpbiBtZXNzYWdlLmNjIHVuZGVyIHRoZQorICAvLyBHZW5lcmF0ZU1lcmdlRnJvbSBtZXRob2QuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgLy8gR2VuZXJhdGUgbGluZXMgb2YgY29kZSAoc3RhdGVtZW50cywgbm90IGRlY2xhcmF0aW9ucykgd2hpY2ggc3dhcHMKKyAgLy8gdGhpcyBmaWVsZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgb2YgYW5vdGhlciBtZXNzYWdlLCB3aGljaAorICAvLyBpcyBzdG9yZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIHZhcmlhYmxlICJvdGhlciIuIFRoaXMgaXMgdXNlZCB0bworICAvLyBkZWZpbmUgdGhlIFN3YXAgbWV0aG9kLiBEZXRhaWxzIG9mIHVzYWdlIGNhbiBiZSBmb3VuZCBpbgorICAvLyBtZXNzYWdlLmNjIHVuZGVyIHRoZSBHZW5lcmF0ZVN3YXAgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBpbml0aWFsaXphdGlvbiBjb2RlIGZvciBwcml2YXRlIG1lbWJlcnMgZGVjbGFyZWQgYnkKKyAgLy8gR2VuZXJhdGVQcml2YXRlTWVtYmVycygpLiBUaGVzZSBnbyBpbnRvIHRoZSBtZXNzYWdlIGNsYXNzJ3MgU2hhcmVkQ3RvcigpCisgIC8vIG1ldGhvZCwgaW52b2tlZCBieSBlYWNoIG9mIHRoZSBnZW5lcmF0ZWQgY29uc3RydWN0b3JzLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBhbnkgY29kZSB0aGF0IG5lZWRzIHRvIGdvIGluIHRoZSBjbGFzcydzIFNoYXJlZER0b3IoKSBtZXRob2QsCisgIC8vIGludm9rZWQgYnkgdGhlIGRlc3RydWN0b3IuCisgIC8vIE1vc3QgZmllbGQgdHlwZXMgZG9uJ3QgbmVlZCB0aGlzLCBzbyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9CisKKyAgLy8gR2VuZXJhdGUgbGluZXMgdG8gZGVjb2RlIHRoaXMgZmllbGQsIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGluc2lkZSB0aGUKKyAgLy8gbWVzc2FnZSdzIE1lcmdlRnJvbUNvZGVkU3RyZWFtKCkgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworCisgIC8vIEdlbmVyYXRlIGxpbmVzIHRvIGRlY29kZSB0aGlzIGZpZWxkIGZyb20gYSBwYWNrZWQgdmFsdWUsIHdoaWNoIHdpbGwgYmUKKyAgLy8gcGxhY2VkIGluc2lkZSB0aGUgbWVzc2FnZSdzIE1lcmdlRnJvbUNvZGVkU3RyZWFtKCkgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbVdpdGhQYWNraW5nKGlvOjpQcmludGVyKiBwcmludGVyKQorICAgICAgY29uc3Q7CisKKyAgLy8gR2VuZXJhdGUgbGluZXMgdG8gc2VyaWFsaXplIHRoaXMgZmllbGQsIHdoaWNoIGFyZSBwbGFjZWQgd2l0aGluIHRoZQorICAvLyBtZXNzYWdlJ3MgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBsaW5lcyB0byBzZXJpYWxpemUgdGhpcyBmaWVsZCBkaXJlY3RseSB0byB0aGUgYXJyYXkgInRhcmdldCIsCisgIC8vIHdoaWNoIGFyZSBwbGFjZWQgd2l0aGluIHRoZSBtZXNzYWdlJ3MgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgpCisgIC8vIG1ldGhvZC4gVGhpcyBtdXN0IGFsc28gYWR2YW5jZSAidGFyZ2V0IiBwYXN0IHRoZSB3cml0dGVuIGJ5dGVzLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKworICAvLyBHZW5lcmF0ZSBsaW5lcyB0byBjb21wdXRlIHRoZSBzZXJpYWxpemVkIHNpemUgb2YgdGhpcyBmaWVsZCwgd2hpY2gKKyAgLy8gYXJlIHBsYWNlZCBpbiB0aGUgbWVzc2FnZSdzIEJ5dGVTaXplKCkgbWV0aG9kLgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkR2VuZXJhdG9yKTsKK307CisKKy8vIENvbnZlbmllbmNlIGNsYXNzIHdoaWNoIGNvbnN0cnVjdHMgRmllbGRHZW5lcmF0b3JzIGZvciBhIERlc2NyaXB0b3IuCitjbGFzcyBGaWVsZEdlbmVyYXRvck1hcCB7CisgcHVibGljOgorICBleHBsaWNpdCBGaWVsZEdlbmVyYXRvck1hcChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgfkZpZWxkR2VuZXJhdG9yTWFwKCk7CisKKyAgY29uc3QgRmllbGRHZW5lcmF0b3ImIGdldChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxGaWVsZEdlbmVyYXRvcj4gPiBmaWVsZF9nZW5lcmF0b3JzXzsKKworICBzdGF0aWMgRmllbGRHZW5lcmF0b3IqIE1ha2VHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkR2VuZXJhdG9yTWFwKTsKK307CisKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0ZJRUxEX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNmQ0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuY2MKQEAgLTAsMCArMSw2MzEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRmlsZUdlbmVyYXRvcjo6RmlsZUdlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBkbGxleHBvcnRfZGVjbCkKKyAgOiBmaWxlXyhmaWxlKSwKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfKAorICAgICAgbmV3IHNjb3BlZF9wdHI8TWVzc2FnZUdlbmVyYXRvcj5bZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCldKSwKKyAgICBlbnVtX2dlbmVyYXRvcnNfKAorICAgICAgbmV3IHNjb3BlZF9wdHI8RW51bUdlbmVyYXRvcj5bZmlsZS0+ZW51bV90eXBlX2NvdW50KCldKSwKKyAgICBzZXJ2aWNlX2dlbmVyYXRvcnNfKAorICAgICAgbmV3IHNjb3BlZF9wdHI8U2VydmljZUdlbmVyYXRvcj5bZmlsZS0+c2VydmljZV9jb3VudCgpXSksCisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfKAorICAgICAgbmV3IHNjb3BlZF9wdHI8RXh0ZW5zaW9uR2VuZXJhdG9yPltmaWxlLT5leHRlbnNpb25fY291bnQoKV0pLAorICAgIGRsbGV4cG9ydF9kZWNsXyhkbGxleHBvcnRfZGVjbCkgeworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0ucmVzZXQoCisgICAgICBuZXcgTWVzc2FnZUdlbmVyYXRvcihmaWxlLT5tZXNzYWdlX3R5cGUoaSksIGRsbGV4cG9ydF9kZWNsKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAorICAgICAgbmV3IEVudW1HZW5lcmF0b3IoZmlsZS0+ZW51bV90eXBlKGkpLCBkbGxleHBvcnRfZGVjbCkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgeworICAgIHNlcnZpY2VfZ2VuZXJhdG9yc19baV0ucmVzZXQoCisgICAgICBuZXcgU2VydmljZUdlbmVyYXRvcihmaWxlLT5zZXJ2aWNlKGkpLCBkbGxleHBvcnRfZGVjbCkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAorICAgICAgbmV3IEV4dGVuc2lvbkdlbmVyYXRvcihmaWxlLT5leHRlbnNpb24oaSksIGRsbGV4cG9ydF9kZWNsKSk7CisgIH0KKworICBTcGxpdFN0cmluZ1VzaW5nKGZpbGVfLT5wYWNrYWdlKCksICIuIiwgJnBhY2thZ2VfcGFydHNfKTsKK30KKworRmlsZUdlbmVyYXRvcjo6fkZpbGVHZW5lcmF0b3IoKSB7fQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHN0cmluZyBmaWxlbmFtZV9pZGVudGlmaWVyID0gRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVfLT5uYW1lKCkpOworCisgIC8vIEdlbmVyYXRlIHRvcCBvZiBoZWFkZXIuCisgIHByaW50ZXItPlByaW50KAorICAgICIvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIVxuIgorICAgICIvLyBzb3VyY2U6ICRmaWxlbmFtZSRcbiIKKyAgICAiXG4iCisgICAgIiNpZm5kZWYgUFJPVE9CVUZfJGZpbGVuYW1lX2lkZW50aWZpZXIkX19JTkNMVURFRFxuIgorICAgICIjZGVmaW5lIFBST1RPQlVGXyRmaWxlbmFtZV9pZGVudGlmaWVyJF9fSU5DTFVERURcbiIKKyAgICAiXG4iCisgICAgIiNpbmNsdWRlIDxzdHJpbmc+XG4iCisgICAgIlxuIiwKKyAgICAiZmlsZW5hbWUiLCBmaWxlXy0+bmFtZSgpLAorICAgICJmaWxlbmFtZV9pZGVudGlmaWVyIiwgZmlsZW5hbWVfaWRlbnRpZmllcik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+XG4iCisgICAgIlxuIik7CisKKyAgLy8gVmVyaWZ5IHRoZSBwcm90b2J1ZiBsaWJyYXJ5IGhlYWRlciB2ZXJzaW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jCisgIC8vIHZlcnNpb24gYmVmb3JlIGdvaW5nIGFueSBmdXJ0aGVyLgorICBwcmludGVyLT5QcmludCgKKyAgICAiI2lmIEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDwgJG1pbl9oZWFkZXJfdmVyc2lvbiRcbiIKKyAgICAiI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXNcbiIKKyAgICAiI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuICBQbGVhc2UgdXBkYXRlXG4iCisgICAgIiNlcnJvciB5b3VyIGhlYWRlcnMuXG4iCisgICAgIiNlbmRpZlxuIgorICAgICIjaWYgJHByb3RvY192ZXJzaW9uJCA8IEdPT0dMRV9QUk9UT0JVRl9NSU5fUFJPVE9DX1ZFUlNJT05cbiIKKyAgICAiI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzXG4iCisgICAgIiNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlXG4iCisgICAgIiNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuXG4iCisgICAgIiNlbmRpZlxuIgorICAgICJcbiIsCisgICAgIm1pbl9oZWFkZXJfdmVyc2lvbiIsCisgICAgICBTaW1wbGVJdG9hKHByb3RvYnVmOjppbnRlcm5hbDo6a01pbkhlYWRlclZlcnNpb25Gb3JQcm90b2MpLAorICAgICJwcm90b2NfdmVyc2lvbiIsIFNpbXBsZUl0b2EoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04pKTsKKworICAvLyBPSywgaXQncyBub3cgc2FmZSB0byAjaW5jbHVkZSBvdGhlciBmaWxlcy4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPlxuIgorICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+XG4iCisgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPlxuIik7CisKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZmlsZV8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPlxuIik7CisgIH0KKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+XG4iKTsKKyAgfQorCisgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmg+XG4iKTsKKyAgfQorCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIjaW5jbHVkZSBcIiRkZXBlbmRlbmN5JC5wYi5oXCJcbiIsCisgICAgICAiZGVwZW5kZW5jeSIsIFN0cmlwUHJvdG8oZmlsZV8tPmRlcGVuZGVuY3koaSktPm5hbWUoKSkpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcylcbiIpOworCisgIC8vIE9wZW4gbmFtZXNwYWNlLgorICBHZW5lcmF0ZU5hbWVzcGFjZU9wZW5lcnMocHJpbnRlcik7CisKKyAgLy8gRm9yd2FyZC1kZWNsYXJlIHRoZSBBZGREZXNjcmlwdG9ycywgQXNzaWduRGVzY3JpcHRvcnMsIGFuZCBTaHV0ZG93bkZpbGUKKyAgLy8gZnVuY3Rpb25zLCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZW0gdG8gYmUgZnJpZW5kcyBvZiBlYWNoIGNsYXNzLgorICBwcmludGVyLT5QcmludCgKKyAgICAiXG4iCisgICAgIi8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCAtLSBkbyBub3QgY2FsbCB0aGVzZS5cbiIKKyAgICAidm9pZCAkZGxsZXhwb3J0X2RlY2wkICRhZGRkZXNjcmlwdG9yc25hbWUkKCk7XG4iLAorICAgICJhZGRkZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSksCisgICAgImRsbGV4cG9ydF9kZWNsIiwgZGxsZXhwb3J0X2RlY2xfKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgcHV0IGRsbGV4cG9ydF9kZWNsIG9uIHRoZXNlIGJlY2F1c2UgdGhleSBhcmUgb25seQorICAgIC8vIGNhbGxlZCBieSB0aGUgLnBiLmNjIGZpbGUgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZC4KKyAgICAidm9pZCAkYXNzaWduZGVzY3JpcHRvcnNuYW1lJCgpO1xuIgorICAgICJ2b2lkICRzaHV0ZG93bmZpbGVuYW1lJCgpO1xuIgorICAgICJcbiIsCisgICAgImFzc2lnbmRlc2NyaXB0b3JzbmFtZSIsIEdsb2JhbEFzc2lnbkRlc2NyaXB0b3JzTmFtZShmaWxlXy0+bmFtZSgpKSwKKyAgICAic2h1dGRvd25maWxlbmFtZSIsIEdsb2JhbFNodXRkb3duRmlsZU5hbWUoZmlsZV8tPm5hbWUoKSkpOworCisgIC8vIEdlbmVyYXRlIGZvcndhcmQgZGVjbGFyYXRpb25zIG9mIGNsYXNzZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbihwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIC8vIEdlbmVyYXRlIGVudW0gZGVmaW5pdGlvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUVudW1EZWZpbml0aW9ucyhwcmludGVyKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWZpbml0aW9uKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoa1RoaWNrU2VwYXJhdG9yKTsKKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgLy8gR2VuZXJhdGUgY2xhc3MgZGVmaW5pdGlvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoaSA+IDApIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgICAgcHJpbnRlci0+UHJpbnQoa1RoaW5TZXBhcmF0b3IpOworICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgfQorICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlQ2xhc3NEZWZpbml0aW9uKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7CisgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8pKSB7CisgICAgLy8gR2VuZXJhdGUgc2VydmljZSBkZWZpbml0aW9ucy4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgeworICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgICAgICBwcmludGVyLT5QcmludChrVGhpblNlcGFyYXRvcik7CisgICAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgICAgfQorICAgICAgc2VydmljZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWNsYXJhdGlvbnMocHJpbnRlcik7CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgcHJpbnRlci0+UHJpbnQoa1RoaWNrU2VwYXJhdG9yKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIC8vIERlY2xhcmUgZXh0ZW5zaW9uIGlkZW50aWZpZXJzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlY2xhcmF0aW9uKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7CisgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIC8vIEdlbmVyYXRlIGNsYXNzIGlubGluZSBtZXRob2RzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICBwcmludGVyLT5QcmludChrVGhpblNlcGFyYXRvcik7CisgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICB9CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVJbmxpbmVNZXRob2RzKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKVxuIik7CisKKyAgLy8gQ2xvc2UgdXAgbmFtZXNwYWNlLgorICBHZW5lcmF0ZU5hbWVzcGFjZUNsb3NlcnMocHJpbnRlcik7CisKKyAgLy8gRW1pdCBHZXRFbnVtRGVzY3JpcHRvciBzcGVjaWFsaXphdGlvbnMgaW50byBnb29nbGU6OnByb3RvYnVmIG5hbWVzcGFjZToKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfKSkgeworICAgIC8vIFRoZSBTV0lHIGNvbmRpdGlvbmFsIGlzIHRvIGF2b2lkIGEgbnVsbC1wb2ludGVyIGRlcmVmZXJlbmNlCisgICAgLy8gKGJ1ZyAxOTg0OTY0KSBpbiBzd2lnLTEuMy4yMSByZXN1bHRpbmcgZnJvbSB0aGUgZm9sbG93aW5nIHN5bnRheDoKKyAgICAvLyAgIG5hbWVzcGFjZSBYIHsgdm9pZCBZPFo6Olc+KCk7IH0KKyAgICAvLyB3aGljaCBhcHBlYXJzIGluIEdldEVudW1EZXNjcmlwdG9yKCkgc3BlY2lhbGl6YXRpb25zLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiXG4iCisgICAgICAgICIjaWZuZGVmIFNXSUdcbiIKKyAgICAgICAgIm5hbWVzcGFjZSBnb29nbGUge1xubmFtZXNwYWNlIHByb3RvYnVmIHtcbiIKKyAgICAgICAgIlxuIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVHZXRFbnVtRGVzY3JpcHRvclNwZWNpYWxpemF0aW9ucyhwcmludGVyKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVHZXRFbnVtRGVzY3JpcHRvclNwZWNpYWxpemF0aW9ucyhwcmludGVyKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJcbiIKKyAgICAgICAgIn0gIC8vIG5hbWVzcGFjZSBnb29nbGVcbn0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZlxuIgorICAgICAgICAiI2VuZGlmICAvLyBTV0lHXG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSlcbiIKKyAgICAiXG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiI2VuZGlmICAvLyBQUk9UT0JVRl8kZmlsZW5hbWVfaWRlbnRpZmllciRfX0lOQ0xVREVEXG4iLAorICAgICJmaWxlbmFtZV9pZGVudGlmaWVyIiwgZmlsZW5hbWVfaWRlbnRpZmllcik7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVTb3VyY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhXG4iCisgICAgIlxuIgorCisgICAgLy8gVGhlIGdlbmVyYXRlZCBjb2RlIGNhbGxzIGFjY2Vzc29ycyB0aGF0IG1pZ2h0IGJlIGRlcHJlY2F0ZWQuIFdlIGRvbid0CisgICAgLy8gd2FudCB0aGUgY29tcGlsZXIgdG8gd2FybiBpbiBnZW5lcmF0ZWQgY29kZS4KKyAgICAiI2RlZmluZSBJTlRFUk5BTF9TVVBQUkVTU19QUk9UT0JVRl9GSUVMRF9ERVBSRUNBVElPTlxuIgorICAgICIjaW5jbHVkZSBcIiRiYXNlbmFtZSQucGIuaFwiXG4iCisgICAgIlxuIgorICAgICIjaW5jbHVkZSA8YWxnb3JpdGhtPlxuIiAgICAvLyBmb3Igc3dhcCgpCisgICAgIlxuIgorICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaD5cbiIKKyAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD5cbiIKKyAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPlxuIiwKKyAgICAiYmFzZW5hbWUiLCBTdHJpcFByb3RvKGZpbGVfLT5uYW1lKCkpKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+XG4iCisgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPlxuIgorICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD5cbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcylcbiIpOworCisgIEdlbmVyYXRlTmFtZXNwYWNlT3BlbmVycyhwcmludGVyKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXG4iCisgICAgICAibmFtZXNwYWNlIHtcbiIKKyAgICAgICJcbiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVzY3JpcHRvckRlY2xhcmF0aW9ucyhwcmludGVyKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiAkbmFtZSRfZGVzY3JpcHRvcl8gPSBOVUxMO1xuIiwKKyAgICAgICAgIm5hbWUiLCBDbGFzc05hbWUoZmlsZV8tPmVudW1fdHlwZShpKSwgZmFsc2UpKTsKKyAgICB9CisKKyAgICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGVfKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3IqICRuYW1lJF9kZXNjcmlwdG9yXyA9IE5VTEw7XG4iLAorICAgICAgICAgICJuYW1lIiwgZmlsZV8tPnNlcnZpY2UoaSktPm5hbWUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXG4iCisgICAgICAifSAgLy8gbmFtZXNwYWNlXG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIERlZmluZSBvdXIgZXh0ZXJuYWxseS12aXNpYmxlIEJ1aWxkRGVzY3JpcHRvcnMoKSBmdW5jdGlvbi4gIChGb3IgdGhlIGxpdGUKKyAgLy8gbGlicmFyeSwgYWxsIHRoaXMgZG9lcyBpcyBpbml0aWFsaXplIGRlZmF1bHQgaW5zdGFuY2VzLikKKyAgR2VuZXJhdGVCdWlsZERlc2NyaXB0b3JzKHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGVudW1zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVNZXRob2RzKHByaW50ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xhc3Nlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVDbGFzc01ldGhvZHMocHJpbnRlcik7CisgIH0KKworICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGVfKSkgeworICAgIC8vIEdlbmVyYXRlIHNlcnZpY2VzLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgICBpZiAoaSA9PSAwKSBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICAgIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7CisgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICAgIHNlcnZpY2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlSW1wbGVtZW50YXRpb24ocHJpbnRlcik7CisgICAgfQorICB9CisKKyAgLy8gRGVmaW5lIGV4dGVuc2lvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmaW5pdGlvbihwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSlcbiIpOworCisgIEdlbmVyYXRlTmFtZXNwYWNlQ2xvc2VycyhwcmludGVyKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiXG4iCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpXG4iKTsKK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkRGVzY3JpcHRvcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gQWRkRGVzY3JpcHRvcnMoKSBpcyBhIGZpbGUtbGV2ZWwgcHJvY2VkdXJlIHdoaWNoIGFkZHMgdGhlIGVuY29kZWQKKyAgLy8gRmlsZURlc2NyaXB0b3JQcm90byBmb3IgdGhpcyAucHJvdG8gZmlsZSB0byB0aGUgZ2xvYmFsIERlc2NyaXB0b3JQb29sIGZvcgorICAvLyBnZW5lcmF0ZWQgZmlsZXMgKERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKS4gSXQgZWl0aGVyIHJ1bnMgYXQKKyAgLy8gc3RhdGljIGluaXRpYWxpemF0aW9uIHRpbWUgKGJ5IGRlZmF1bHQpIG9yIHdoZW4gZGVmYXVsdF9pbnN0YW5jZSgpIGlzCisgIC8vIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgKGluIExJVEVfUlVOVElNRSBtb2RlIHdpdGgKKyAgLy8gR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUiBmbGFnIGVuYWJsZWQpLiBUaGlzIHByb2NlZHVyZSBhbHNvCisgIC8vIGNvbnN0cnVjdHMgZGVmYXVsdCBpbnN0YW5jZXMgYW5kIHJlZ2lzdGVycyBleHRlbnNpb25zLgorICAvLworICAvLyBJdHMgc2libGluZywgQXNzaWduRGVzY3JpcHRvcnMoKSwgYWN0dWFsbHkgcHVsbHMgdGhlIGNvbXBpbGVkCisgIC8vIEZpbGVEZXNjcmlwdG9yIGZyb20gdGhlIERlc2NyaXB0b3JQb29sIGFuZCB1c2VzIGl0IHRvIHBvcHVsYXRlIGFsbCBvZgorICAvLyB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBzdG9yZSBwb2ludGVycyB0byB0aGUgZGVzY3JpcHRvciBvYmplY3RzLgorICAvLyBJdCBhbHNvIGNvbnN0cnVjdHMgdGhlIHJlZmxlY3Rpb24gb2JqZWN0cy4gIEl0IGlzIGNhbGxlZCB0aGUgZmlyc3QgdGltZQorICAvLyBhbnlvbmUgY2FsbHMgZGVzY3JpcHRvcigpIG9yIEdldFJlZmxlY3Rpb24oKSBvbiBvbmUgb2YgdGhlIHR5cGVzIGRlZmluZWQKKyAgLy8gaW4gdGhlIGZpbGUuCisKKyAgLy8gSW4gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FIG1vZGUsIHdlIGRvbid0IGdlbmVyYXRlIEFzc2lnbkRlc2NyaXB0b3JzKCkKKyAgLy8gYW5kIHdlIG9ubHkgdXNlIEFkZERlc2NyaXB0b3JzKCkgdG8gYWxsb2NhdGUgZGVmYXVsdCBpbnN0YW5jZXMuCisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJcbiIKKyAgICAgICJ2b2lkICRhc3NpZ25kZXNjcmlwdG9yc25hbWUkKCkge1xuIiwKKyAgICAgICJhc3NpZ25kZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBc3NpZ25EZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSkpOworICAgIHByaW50ZXItPkluZGVudCgpOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSBmaWxlIGhhcyBmb3VuZCBpdHMgd2F5IGludG8gdGhlIHBvb2wuICBJZiBhIGRlc2NyaXB0b3IKKyAgICAvLyBpcyByZXF1ZXN0ZWQgKmR1cmluZyogc3RhdGljIGluaXQgdGhlbiBBZGREZXNjcmlwdG9ycygpIG1heSBub3QgaGF2ZQorICAgIC8vIGJlZW4gY2FsbGVkIHlldCwgc28gd2UgY2FsbCBpdCBtYW51YWxseS4gIE5vdGUgdGhhdCBpdCdzIGZpbmUgaWYKKyAgICAvLyBBZGREZXNjcmlwdG9ycygpIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIkYWRkZGVzY3JpcHRvcnNuYW1lJCgpO1xuIiwKKyAgICAgICJhZGRkZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSkpOworCisgICAgLy8gR2V0IHRoZSBmaWxlJ3MgZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3IqIGZpbGUgPVxuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS0+RmluZEZpbGVCeU5hbWUoXG4iCisgICAgICAiICAgIFwiJGZpbGVuYW1lJFwiKTtcbiIKKyAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIEdPT0dMRV9DSEVDSyBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBhIHdhcm5pbmcgYWJvdXQgImZpbGUiCisgICAgICAvLyBiZWluZyB1bnVzZWQgd2hlbiBjb21waWxpbmcgYW4gZW1wdHkgLnByb3RvIGZpbGUuCisgICAgICAiR09PR0xFX0NIRUNLKGZpbGUgIT0gTlVMTCk7XG4iLAorICAgICAgImZpbGVuYW1lIiwgZmlsZV8tPm5hbWUoKSk7CisKKyAgICAvLyBHbyB0aHJvdWdoIGFsbCB0aGUgc3R1ZmYgZGVmaW5lZCBpbiB0aGlzIGZpbGUgYW5kIGdlbmVyYXRlZCBjb2RlIHRvCisgICAgLy8gYXNzaWduIHRoZSBnbG9iYWwgZGVzY3JpcHRvciBwb2ludGVycyBiYXNlZCBvbiB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKHByaW50ZXIsIGkpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXplcihwcmludGVyLCBpKTsKKyAgICB9CisgICAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXykpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgICAgIHNlcnZpY2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKHByaW50ZXIsIGkpOworICAgICAgfQorICAgIH0KKworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk6ICBUaGUgZmlyc3QgdGltZSBpdCBpcyBjYWxsZWQsIGNhbGxzCisgICAgLy8gQXNzaWduRGVzY3JpcHRvcnMoKS4gIEFsbCBsYXRlciB0aW1lcywgd2FpdHMgZm9yIHRoZSBmaXJzdCBjYWxsIHRvCisgICAgLy8gY29tcGxldGUgYW5kIHRoZW4gcmV0dXJucy4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJuYW1lc3BhY2Uge1xuIgorICAgICAgIlxuIgorICAgICAgIkdPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UocHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNfb25jZV8pO1xuIgorICAgICAgImlubGluZSB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpIHtcbiIKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJnByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzX29uY2VfLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgJiRhc3NpZ25kZXNjcmlwdG9yc25hbWUkKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImFzc2lnbmRlc2NyaXB0b3JzbmFtZSIsIEdsb2JhbEFzc2lnbkRlc2NyaXB0b3JzTmFtZShmaWxlXy0+bmFtZSgpKSk7CisKKyAgICAvLyBwcm90b2J1Zl9SZWdpc3RlclR5cGVzKCk6ICBDYWxscworICAgIC8vIE1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkVHlwZSgpIGZvciBlYWNoIG1lc3NhZ2UgdHlwZS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ2b2lkIHByb3RvYnVmX1JlZ2lzdGVyVHlwZXMoY29uc3QgOjpzdGQ6OnN0cmluZyYpIHtcbiIKKyAgICAgICIgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpO1xuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZVR5cGVSZWdpc3RyYXRpb25zKHByaW50ZXIpOworICAgIH0KKworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAifSAgLy8gbmFtZXNwYWNlXG4iKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gU2h1dGRvd25GaWxlKCk6ICBEZWxldGVzIGRlc2NyaXB0b3JzLCBkZWZhdWx0IGluc3RhbmNlcywgZXRjLiBvbiBzaHV0ZG93bi4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICJ2b2lkICRzaHV0ZG93bmZpbGVuYW1lJCgpIHtcbiIsCisgICAgInNodXRkb3duZmlsZW5hbWUiLCBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGZpbGVfLT5uYW1lKCkpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlU2h1dGRvd25Db2RlKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAifVxuXG4iKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIE5vdyBnZW5lcmF0ZSB0aGUgQWRkRGVzY3JpcHRvcnMoKSBmdW5jdGlvbi4KKyAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAorICAgIGZpbGVfLCBwcmludGVyLAorICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCBhbnkgc3BlY2lhbCBzeW5jaHJvbml6YXRpb24gaW4gdGhlIGZvbGxvd2luZyBjb2RlCisgICAgLy8gYmVjYXVzZSBpdCBpcyBjYWxsZWQgYXQgc3RhdGljIGluaXQgdGltZSBiZWZvcmUgYW55IHRocmVhZHMgZXhpc3QuCisgICAgInZvaWQgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKSB7XG4iCisgICAgIiAgc3RhdGljIGJvb2wgYWxyZWFkeV9oZXJlID0gZmFsc2U7XG4iCisgICAgIiAgaWYgKGFscmVhZHlfaGVyZSkgcmV0dXJuO1xuIgorICAgICIgIGFscmVhZHlfaGVyZSA9IHRydWU7XG4iCisgICAgIiAgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OO1xuIiwKKyAgICAvLyBXaXRob3V0LgorICAgICJ2b2lkICRhZGRkZXNjcmlwdG9yc25hbWUkX2ltcGwoKSB7XG4iCisgICAgIiAgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OO1xuIiwKKyAgICAvLyBWYXJzLgorICAgICJhZGRkZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSkpOworCisgIHByaW50ZXItPkluZGVudCgpOworCisgIC8vIENhbGwgdGhlIEFkZERlc2NyaXB0b3JzKCkgbWV0aG9kcyBmb3IgYWxsIG9mIG91ciBkZXBlbmRlbmNpZXMsIHRvIG1ha2UKKyAgLy8gc3VyZSB0aGV5IGdldCBhZGRlZCBmaXJzdC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVwZW5kZW5jeSA9IGZpbGVfLT5kZXBlbmRlbmN5KGkpOworICAgIC8vIFByaW50IHRoZSBuYW1lc3BhY2UgcHJlZml4IGZvciB0aGUgZGVwZW5kZW5jeS4KKyAgICB2ZWN0b3I8c3RyaW5nPiBkZXBlbmRlbmN5X3BhY2thZ2VfcGFydHM7CisgICAgU3BsaXRTdHJpbmdVc2luZyhkZXBlbmRlbmN5LT5wYWNrYWdlKCksICIuIiwgJmRlcGVuZGVuY3lfcGFja2FnZV9wYXJ0cyk7CisgICAgcHJpbnRlci0+UHJpbnQoIjo6Iik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5X3BhY2thZ2VfcGFydHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIHByaW50ZXItPlByaW50KCIkbmFtZSQ6OiIsCisgICAgICAgICAgICAgICAgICAgICAibmFtZSIsIGRlcGVuZGVuY3lfcGFja2FnZV9wYXJ0c1tpXSk7CisgICAgfQorICAgIC8vIENhbGwgaXRzIEFkZERlc2NyaXB0b3JzIGZ1bmN0aW9uLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiRuYW1lJCgpO1xuIiwKKyAgICAgICJuYW1lIiwgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGRlcGVuZGVuY3ktPm5hbWUoKSkpOworICB9CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfKSkgeworICAgIC8vIEVtYmVkIHRoZSBkZXNjcmlwdG9yLiAgV2Ugc2ltcGx5IHNlcmlhbGl6ZSB0aGUgZW50aXJlIEZpbGVEZXNjcmlwdG9yUHJvdG8KKyAgICAvLyBhbmQgZW1iZWQgaXQgYXMgYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggaXMgcGFyc2VkIGFuZCBidWlsdCBpbnRvIHJlYWwKKyAgICAvLyBkZXNjcmlwdG9ycyBhdCBpbml0aWFsaXphdGlvbiB0aW1lLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgICBmaWxlXy0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgICBzdHJpbmcgZmlsZV9kYXRhOworICAgIGZpbGVfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJmZpbGVfZGF0YSk7CisKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoIik7CisKKyAgICAvLyBPbmx5IHdyaXRlIDQwIGJ5dGVzIHBlciBsaW5lLgorICAgIHN0YXRpYyBjb25zdCBpbnQga0J5dGVzUGVyTGluZSA9IDQwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9kYXRhLnNpemUoKTsgaSArPSBrQnl0ZXNQZXJMaW5lKSB7CisgICAgICBwcmludGVyLT5QcmludCgiXG4gIFwiJGRhdGEkXCIiLAorICAgICAgICAiZGF0YSIsIEVzY2FwZVRyaWdyYXBocyhDRXNjYXBlKGZpbGVfZGF0YS5zdWJzdHIoaSwga0J5dGVzUGVyTGluZSkpKSk7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiwgJHNpemUkKTtcbiIsCisgICAgICAic2l6ZSIsIFNpbXBsZUl0b2EoZmlsZV9kYXRhLnNpemUoKSkpOworCisgICAgLy8gQ2FsbCBNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZEZpbGUoKS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkRmlsZShcbiIKKyAgICAgICIgIFwiJGZpbGVuYW1lJFwiLCAmcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyk7XG4iLAorICAgICAgImZpbGVuYW1lIiwgZmlsZV8tPm5hbWUoKSk7CisgIH0KKworICAvLyBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkZWZhdWx0IGluc3RhbmNlcy4gIFRoaXMgY2FuJ3QgYmUgZG9uZSBsYXppbHkKKyAgLy8gc2luY2UgZGVmYXVsdCBpbnN0YW5jZXMgYXJlIHJldHVybmVkIGJ5IHNpbXBsZSBhY2Nlc3NvcnMgYW5kIGFyZSB1c2VkIHdpdGgKKyAgLy8gZXh0ZW5zaW9ucy4gIFNwZWFraW5nIG9mIHdoaWNoLCB3ZSBhbHNvIHJlZ2lzdGVyIGV4dGVuc2lvbnMgYXQgdGhpcyB0aW1lLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IocHJpbnRlcik7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVSZWdpc3RyYXRpb24ocHJpbnRlcik7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmYXVsdEluc3RhbmNlSW5pdGlhbGl6ZXIocHJpbnRlcik7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6T25TaHV0ZG93bigmJHNodXRkb3duZmlsZW5hbWUkKTtcbiIsCisgICAgInNodXRkb3duZmlsZW5hbWUiLCBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGZpbGVfLT5uYW1lKCkpKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJ9XG4iCisgICAgIlxuIik7CisKKyAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAorICAgIGZpbGVfLCBwcmludGVyLAorICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KKyAgICAiLy8gRm9yY2UgQWRkRGVzY3JpcHRvcnMoKSB0byBiZSBjYWxsZWQgYXQgc3RhdGljIGluaXRpYWxpemF0aW9uIHRpbWUuXG4iCisgICAgInN0cnVjdCBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfJGZpbGVuYW1lJCB7XG4iCisgICAgIiAgU3RhdGljRGVzY3JpcHRvckluaXRpYWxpemVyXyRmaWxlbmFtZSQoKSB7XG4iCisgICAgIiAgICAkYWRkZGVzY3JpcHRvcnNuYW1lJCgpO1xuIgorICAgICIgIH1cbiIKKyAgICAifSBzdGF0aWNfZGVzY3JpcHRvcl9pbml0aWFsaXplcl8kZmlsZW5hbWUkXztcbiIsCisgICAgLy8gV2l0aG91dC4KKyAgICAiR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRSgkYWRkZGVzY3JpcHRvcnNuYW1lJF9vbmNlXyk7XG4iCisgICAgInZvaWQgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKSB7XG4iCisgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgmJGFkZGRlc2NyaXB0b3JzbmFtZSRfb25jZV8sXG4iCisgICAgIiAgICAgICAgICAgICAgICAgJiRhZGRkZXNjcmlwdG9yc25hbWUkX2ltcGwpO1xuIgorICAgICJ9XG4iLAorICAgIC8vIFZhcnMuCisgICAgImFkZGRlc2NyaXB0b3JzbmFtZSIsIEdsb2JhbEFkZERlc2NyaXB0b3JzTmFtZShmaWxlXy0+bmFtZSgpKSwKKyAgICAiZmlsZW5hbWUiLCBGaWxlbmFtZUlkZW50aWZpZXIoZmlsZV8tPm5hbWUoKSkpOworfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlTmFtZXNwYWNlT3BlbmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAocGFja2FnZV9wYXJ0c18uc2l6ZSgpID4gMCkgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlX3BhcnRzXy5zaXplKCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJuYW1lc3BhY2UgJHBhcnQkIHtcbiIsCisgICAgICAgICAgICAgICAgICAgInBhcnQiLCBwYWNrYWdlX3BhcnRzX1tpXSk7CisgIH0KK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZU5hbWVzcGFjZUNsb3NlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKHBhY2thZ2VfcGFydHNfLnNpemUoKSA+IDApIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIGZvciAoaW50IGkgPSBwYWNrYWdlX3BhcnRzXy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgIHByaW50ZXItPlByaW50KCJ9ICAvLyBuYW1lc3BhY2UgJHBhcnQkXG4iLAorICAgICAgICAgICAgICAgICAgICJwYXJ0IiwgcGFja2FnZV9wYXJ0c19baV0pOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZTAxMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuaApAQCAtMCwwICsxLDk4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0ZJTEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRklMRV9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgY2xhc3MgRmlsZURlc2NyaXB0b3I7ICAgICAgICAvLyBkZXNjcmlwdG9yLmgKKyAgbmFtZXNwYWNlIGlvIHsKKyAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKKyAgfQorfQorCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBFbnVtR2VuZXJhdG9yOyAgICAgICAgICAgLy8gZW51bS5oCitjbGFzcyBNZXNzYWdlR2VuZXJhdG9yOyAgICAgICAgLy8gbWVzc2FnZS5oCitjbGFzcyBTZXJ2aWNlR2VuZXJhdG9yOyAgICAgICAgLy8gc2VydmljZS5oCitjbGFzcyBFeHRlbnNpb25HZW5lcmF0b3I7ICAgICAgLy8gZXh0ZW5zaW9uLmgKKworY2xhc3MgRmlsZUdlbmVyYXRvciB7CisgcHVibGljOgorICAvLyBTZWUgZ2VuZXJhdG9yLmNjIGZvciB0aGUgbWVhbmluZyBvZiBkbGxleHBvcnRfZGVjbC4KKyAgZXhwbGljaXQgRmlsZUdlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRsbGV4cG9ydF9kZWNsKTsKKyAgfkZpbGVHZW5lcmF0b3IoKTsKKworICB2b2lkIEdlbmVyYXRlSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVNvdXJjZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICAvLyBHZW5lcmF0ZSB0aGUgQnVpbGREZXNjcmlwdG9ycygpIHByb2NlZHVyZSwgd2hpY2ggYnVpbGRzIGFsbCBkZXNjcmlwdG9ycworICAvLyBmb3IgdHlwZXMgZGVmaW5lZCBpbiB0aGUgZmlsZS4KKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkRGVzY3JpcHRvcnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIHZvaWQgR2VuZXJhdGVOYW1lc3BhY2VPcGVuZXJzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZU5hbWVzcGFjZUNsb3NlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsKKworICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxNZXNzYWdlR2VuZXJhdG9yPiA+IG1lc3NhZ2VfZ2VuZXJhdG9yc187CisgIHNjb3BlZF9hcnJheTxzY29wZWRfcHRyPEVudW1HZW5lcmF0b3I+ID4gZW51bV9nZW5lcmF0b3JzXzsKKyAgc2NvcGVkX2FycmF5PHNjb3BlZF9wdHI8U2VydmljZUdlbmVyYXRvcj4gPiBzZXJ2aWNlX2dlbmVyYXRvcnNfOworICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxFeHRlbnNpb25HZW5lcmF0b3I+ID4gZXh0ZW5zaW9uX2dlbmVyYXRvcnNfOworCisgIC8vIEUuZy4gaWYgdGhlIHBhY2thZ2UgaXMgZm9vLmJhciwgcGFja2FnZV9wYXJ0c18gaXMgeyJmb28iLCAiYmFyIn0uCisgIHZlY3RvcjxzdHJpbmc+IHBhY2thZ2VfcGFydHNfOworCisgIHN0cmluZyBkbGxleHBvcnRfZGVjbF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0ZJTEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODRlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEyMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitDcHBHZW5lcmF0b3I6OkNwcEdlbmVyYXRvcigpIHt9CitDcHBHZW5lcmF0b3I6On5DcHBHZW5lcmF0b3IoKSB7fQorCitib29sIENwcEdlbmVyYXRvcjo6R2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3QgeworICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiBvcHRpb25zOworICBQYXJzZUdlbmVyYXRvclBhcmFtZXRlcihwYXJhbWV0ZXIsICZvcHRpb25zKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBwYXJzZSBnZW5lcmF0b3Igb3B0aW9ucworCisgIC8vIFRPRE8oa2VudG9uKTogIElmIHdlIGV2ZXIgaGF2ZSBtb3JlIG9wdGlvbnMsIHdlIG1heSB3YW50IHRvIGNyZWF0ZSBhCisgIC8vICAgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlbSB3aGljaCB3ZSBjYW4gcGFzcyBkb3duIHRvIGFsbCB0aGUKKyAgLy8gICBnZW5lcmF0b3IgY2xhc3Nlcy4gIEN1cnJlbnRseSB3ZSBwYXNzIGRsbGV4cG9ydF9kZWNsIGRvd24gdG8gYWxsIG9mCisgIC8vICAgdGhlbSB2aWEgdGhlIGNvbnN0cnVjdG9ycywgYnV0IHdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0byBhZGQgYW5vdGhlcgorICAvLyAgIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBmb3IgZXZlcnkgb3B0aW9uLgorCisgIC8vIElmIHRoZSBkbGxleHBvcnRfZGVjbCBvcHRpb24gaXMgcGFzc2VkIHRvIHRoZSBjb21waWxlciwgd2UgbmVlZCB0byB3cml0ZQorICAvLyBpdCBpbiBmcm9udCBvZiBldmVyeSBzeW1ib2wgdGhhdCBzaG91bGQgYmUgZXhwb3J0ZWQgaWYgdGhpcyAucHJvdG8gaXMKKyAgLy8gY29tcGlsZWQgaW50byBhIFdpbmRvd3MgRExMLiAgRS5nLiwgaWYgdGhlIHVzZXIgaW52b2tlcyB0aGUgcHJvdG9jb2wKKyAgLy8gY29tcGlsZXIgYXM6CisgIC8vICAgcHJvdG9jIC0tY3BwX291dD1kbGxleHBvcnRfZGVjbD1GT09fRVhQT1JUOm91dGRpciBmb28ucHJvdG8KKyAgLy8gdGhlbiB3ZSdsbCBkZWZpbmUgY2xhc3NlcyBsaWtlIHRoaXM6CisgIC8vICAgY2xhc3MgRk9PX0VYUE9SVCBGb28geworICAvLyAgICAgLi4uCisgIC8vICAgfQorICAvLyBGT09fRVhQT1JUIGlzIGEgbWFjcm8gd2hpY2ggc2hvdWxkIGV4cGFuZCB0byBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgb3IKKyAgLy8gX19kZWNsc3BlYyhkbGxpbXBvcnQpIGRlcGVuZGluZyBvbiB3aGF0IGlzIGJlaW5nIGNvbXBpbGVkLgorICBzdHJpbmcgZGxsZXhwb3J0X2RlY2w7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImRsbGV4cG9ydF9kZWNsIikgeworICAgICAgZGxsZXhwb3J0X2RlY2wgPSBvcHRpb25zW2ldLnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgKmVycm9yID0gIlVua25vd24gZ2VuZXJhdG9yIG9wdGlvbjogIiArIG9wdGlvbnNbaV0uZmlyc3Q7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgIHN0cmluZyBiYXNlbmFtZSA9IFN0cmlwUHJvdG8oZmlsZS0+bmFtZSgpKTsKKyAgYmFzZW5hbWUuYXBwZW5kKCIucGIiKTsKKworICBGaWxlR2VuZXJhdG9yIGZpbGVfZ2VuZXJhdG9yKGZpbGUsIGRsbGV4cG9ydF9kZWNsKTsKKworICAvLyBHZW5lcmF0ZSBoZWFkZXIuCisgIHsKKyAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgZ2VuZXJhdG9yX2NvbnRleHQtPk9wZW4oYmFzZW5hbWUgKyAiLmgiKSk7CisgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgICAgZmlsZV9nZW5lcmF0b3IuR2VuZXJhdGVIZWFkZXIoJnByaW50ZXIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2MgZmlsZS4KKyAgeworICAgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbihiYXNlbmFtZSArICIuY2MiKSk7CisgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgICAgZmlsZV9nZW5lcmF0b3IuR2VuZXJhdGVTb3VyY2UoJnByaW50ZXIpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBlODRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDcyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBHZW5lcmF0ZXMgQysrIGNvZGUgZm9yIGEgZ2l2ZW4gLnByb3RvIGZpbGUuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9HRU5FUkFUT1JfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfR0VORVJBVE9SX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKKy8vIENvZGVHZW5lcmF0b3IgaW1wbGVtZW50YXRpb24gd2hpY2ggZ2VuZXJhdGVzIGEgQysrIHNvdXJjZSBmaWxlIGFuZAorLy8gaGVhZGVyLiAgSWYgeW91IGNyZWF0ZSB5b3VyIG93biBwcm90b2NvbCBjb21waWxlciBiaW5hcnkgYW5kIHlvdSB3YW50CisvLyBpdCB0byBzdXBwb3J0IEMrKyBvdXRwdXQsIHlvdSBjYW4gZG8gc28gYnkgcmVnaXN0ZXJpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcworLy8gQ29kZUdlbmVyYXRvciB3aXRoIHRoZSBDb21tYW5kTGluZUludGVyZmFjZSBpbiB5b3VyIG1haW4oKSBmdW5jdGlvbi4KK2NsYXNzIExJQlBST1RPQ19FWFBPUlQgQ3BwR2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgQ3BwR2VuZXJhdG9yKCk7CisgIH5DcHBHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIENvZGVHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIEdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAorICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENwcEdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfR0VORVJBVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Yjg2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuY2MKQEAgLTAsMCArMSw0MDcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCituYW1lc3BhY2UgeworCitzdHJpbmcgRG90c1RvVW5kZXJzY29yZXMoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHJldHVybiBTdHJpbmdSZXBsYWNlKG5hbWUsICIuIiwgIl8iLCB0cnVlKTsKK30KKworc3RyaW5nIERvdHNUb0NvbG9ucyhjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIFN0cmluZ1JlcGxhY2UobmFtZSwgIi4iLCAiOjoiLCB0cnVlKTsKK30KKworY29uc3QgY2hhciogY29uc3Qga0tleXdvcmRMaXN0W10gPSB7CisgICJhbmQiLCAiYW5kX2VxIiwgImFzbSIsICJhdXRvIiwgImJpdGFuZCIsICJiaXRvciIsICJib29sIiwgImJyZWFrIiwgImNhc2UiLAorICAiY2F0Y2giLCAiY2hhciIsICJjbGFzcyIsICJjb21wbCIsICJjb25zdCIsICJjb25zdF9jYXN0IiwgImNvbnRpbnVlIiwKKyAgImRlZmF1bHQiLCAiZGVsZXRlIiwgImRvIiwgImRvdWJsZSIsICJkeW5hbWljX2Nhc3QiLCAiZWxzZSIsICJlbnVtIiwKKyAgImV4cGxpY2l0IiwgImV4dGVybiIsICJmYWxzZSIsICJmbG9hdCIsICJmb3IiLCAiZnJpZW5kIiwgImdvdG8iLCAiaWYiLAorICAiaW5saW5lIiwgImludCIsICJsb25nIiwgIm11dGFibGUiLCAibmFtZXNwYWNlIiwgIm5ldyIsICJub3QiLCAibm90X2VxIiwKKyAgIm9wZXJhdG9yIiwgIm9yIiwgIm9yX2VxIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsICJyZWdpc3RlciIsCisgICJyZWludGVycHJldF9jYXN0IiwgInJldHVybiIsICJzaG9ydCIsICJzaWduZWQiLCAic2l6ZW9mIiwgInN0YXRpYyIsCisgICJzdGF0aWNfY2FzdCIsICJzdHJ1Y3QiLCAic3dpdGNoIiwgInRlbXBsYXRlIiwgInRoaXMiLCAidGhyb3ciLCAidHJ1ZSIsICJ0cnkiLAorICAidHlwZWRlZiIsICJ0eXBlaWQiLCAidHlwZW5hbWUiLCAidW5pb24iLCAidW5zaWduZWQiLCAidXNpbmciLCAidmlydHVhbCIsCisgICJ2b2lkIiwgInZvbGF0aWxlIiwgIndjaGFyX3QiLCAid2hpbGUiLCAieG9yIiwgInhvcl9lcSIKK307CisKK2hhc2hfc2V0PHN0cmluZz4gTWFrZUtleXdvcmRzTWFwKCkgeworICBoYXNoX3NldDxzdHJpbmc+IHJlc3VsdDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKGtLZXl3b3JkTGlzdCk7IGkrKykgeworICAgIHJlc3VsdC5pbnNlcnQoa0tleXdvcmRMaXN0W2ldKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitoYXNoX3NldDxzdHJpbmc+IGtLZXl3b3JkcyA9IE1ha2VLZXl3b3Jkc01hcCgpOworCitzdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBzdHJpbmcmIGlucHV0LCBib29sIGNhcF9uZXh0X2xldHRlcikgeworICBzdHJpbmcgcmVzdWx0OworICAvLyBOb3RlOiAgSSBkaXN0cnVzdCBjdHlwZS5oIGR1ZSB0byBsb2NhbGVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgaSsrKSB7CisgICAgaWYgKCdhJyA8PSBpbnB1dFtpXSAmJiBpbnB1dFtpXSA8PSAneicpIHsKKyAgICAgIGlmIChjYXBfbmV4dF9sZXR0ZXIpIHsKKyAgICAgICAgcmVzdWx0ICs9IGlucHV0W2ldICsgKCdBJyAtICdhJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV07CisgICAgICB9CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKCdBJyA8PSBpbnB1dFtpXSAmJiBpbnB1dFtpXSA8PSAnWicpIHsKKyAgICAgIC8vIENhcGl0YWwgbGV0dGVycyBhcmUgbGVmdCBhcy1pcy4KKyAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoJzAnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICc5JykgeworICAgICAgcmVzdWx0ICs9IGlucHV0W2ldOworICAgICAgY2FwX25leHRfbGV0dGVyID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgY2FwX25leHRfbGV0dGVyID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBkZXNjcmlwdG9yIGhhcyBhbiBleHRlbnNpb24uIFRoaXMgaW5jbHVkZXMgaXRzCisvLyBuZXN0ZWQgdHlwZXMuCitib29sIEhhc0V4dGVuc2lvbihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIGlmIChkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKSA+IDApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGlmIChIYXNFeHRlbnNpb24oZGVzY3JpcHRvci0+bmVzdGVkX3R5cGUoaSkpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworY29uc3QgY2hhciBrVGhpY2tTZXBhcmF0b3JbXSA9CisgICIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworY29uc3QgY2hhciBrVGhpblNlcGFyYXRvcltdID0KKyAgIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisKK3N0cmluZyBDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgYm9vbCBxdWFsaWZpZWQpIHsKKworICAvLyBGaW5kICJvdXRlciIsIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSB0b3AtbGV2ZWwgbWVzc2FnZSBpbiB3aGljaAorICAvLyAiZGVzY3JpcHRvciIgaXMgZW1iZWRkZWQuCisgIGNvbnN0IERlc2NyaXB0b3IqIG91dGVyID0gZGVzY3JpcHRvcjsKKyAgd2hpbGUgKG91dGVyLT5jb250YWluaW5nX3R5cGUoKSAhPSBOVUxMKSBvdXRlciA9IG91dGVyLT5jb250YWluaW5nX3R5cGUoKTsKKworICBjb25zdCBzdHJpbmcmIG91dGVyX25hbWUgPSBvdXRlci0+ZnVsbF9uYW1lKCk7CisgIHN0cmluZyBpbm5lcl9uYW1lID0gZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuc3Vic3RyKG91dGVyX25hbWUuc2l6ZSgpKTsKKworICBpZiAocXVhbGlmaWVkKSB7CisgICAgcmV0dXJuICI6OiIgKyBEb3RzVG9Db2xvbnMob3V0ZXJfbmFtZSkgKyBEb3RzVG9VbmRlcnNjb3Jlcyhpbm5lcl9uYW1lKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gb3V0ZXItPm5hbWUoKSArIERvdHNUb1VuZGVyc2NvcmVzKGlubmVyX25hbWUpOworICB9Cit9CisKK3N0cmluZyBDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciwgYm9vbCBxdWFsaWZpZWQpIHsKKyAgaWYgKGVudW1fZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgeworICAgIGlmIChxdWFsaWZpZWQpIHsKKyAgICAgIHJldHVybiBEb3RzVG9Db2xvbnMoZW51bV9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBlbnVtX2Rlc2NyaXB0b3ItPm5hbWUoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHJlc3VsdCA9IENsYXNzTmFtZShlbnVtX2Rlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpLCBxdWFsaWZpZWQpOworICAgIHJlc3VsdCArPSAnXyc7CisgICAgcmVzdWx0ICs9IGVudW1fZGVzY3JpcHRvci0+bmFtZSgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworCitzdHJpbmcgU3VwZXJDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvci0+ZmlsZSgpKSA/CisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIiA6ICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlIjsKK30KKworc3RyaW5nIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHN0cmluZyByZXN1bHQgPSBmaWVsZC0+bmFtZSgpOworICBMb3dlclN0cmluZygmcmVzdWx0KTsKKyAgaWYgKGtLZXl3b3Jkcy5jb3VudChyZXN1bHQpID4gMCkgeworICAgIHJlc3VsdC5hcHBlbmQoIl8iKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgRmllbGRDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yICpmaWVsZCkgeworICBzdHJpbmcgZmllbGRfbmFtZSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSk7CisgIHN0cmluZyByZXN1bHQgPSAiayIgKyBmaWVsZF9uYW1lICsgIkZpZWxkTnVtYmVyIjsKKworICBpZiAoIWZpZWxkLT5pc19leHRlbnNpb24oKSAmJgorICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoCisgICAgICAgIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKSAhPSBmaWVsZCkgeworICAgIC8vIFRoaXMgZmllbGQncyBjYW1lbGNhc2UgbmFtZSBpcyBub3QgdW5pcXVlLiAgQXMgYSBoYWNrLCBhZGQgdGhlIGZpZWxkCisgICAgLy8gbnVtYmVyIHRvIHRoZSBjb25zdGFudCBuYW1lLiAgVGhpcyBtYWtlcyB0aGUgY29uc3RhbnQgcmF0aGVyIHVzZWxlc3MsCisgICAgLy8gYnV0IHdoYXQgY2FuIHdlIGRvPworICAgIHJlc3VsdCArPSAiXyIgKyBTaW1wbGVJdG9hKGZpZWxkLT5udW1iZXIoKSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgRmllbGRNZXNzYWdlVHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAvLyBOb3RlOiAgVGhlIEdvb2dsZS1pbnRlcm5hbCB2ZXJzaW9uIG9mIFByb3RvY29sIEJ1ZmZlcnMgdXNlcyB0aGlzIGZ1bmN0aW9uCisgIC8vICAgYXMgYSBob29rIHBvaW50IGZvciBoYWNrcyB0byBzdXBwb3J0IGxlZ2FjeSBjb2RlLgorICByZXR1cm4gQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgdHJ1ZSk7Cit9CisKK3N0cmluZyBTdHJpcFByb3RvKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgaWYgKEhhc1N1ZmZpeFN0cmluZyhmaWxlbmFtZSwgIi5wcm90b2RldmVsIikpIHsKKyAgICByZXR1cm4gU3RyaXBTdWZmaXhTdHJpbmcoZmlsZW5hbWUsICIucHJvdG9kZXZlbCIpOworICB9IGVsc2UgeworICAgIHJldHVybiBTdHJpcFN1ZmZpeFN0cmluZyhmaWxlbmFtZSwgIi5wcm90byIpOworICB9Cit9CisKK2NvbnN0IGNoYXIqIFByaW1pdGl2ZVR5cGVOYW1lKEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyICA6IHJldHVybiAiOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQgIDogcmV0dXJuICI6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzIgOiByZXR1cm4gIjo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQgOiByZXR1cm4gIjo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEUgOiByZXR1cm4gImRvdWJsZSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQgIDogcmV0dXJuICJmbG9hdCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTCAgIDogcmV0dXJuICJib29sIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNICAgOiByZXR1cm4gImludCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HIDogcmV0dXJuICI6OnN0ZDo6c3RyaW5nIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiByZXR1cm4gTlVMTDsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gQ3BwVHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyKiBEZWNsYXJlZFR5cGVNZXRob2ROYW1lKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyICAgOiByZXR1cm4gIkludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NCAgIDogcmV0dXJuICJJbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyICA6IHJldHVybiAiVUludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQgIDogcmV0dXJuICJVSW50NjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMiAgOiByZXR1cm4gIlNJbnQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0ICA6IHJldHVybiAiU0ludDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyIDogcmV0dXJuICJGaXhlZDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0IDogcmV0dXJuICJGaXhlZDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjogcmV0dXJuICJTRml4ZWQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6IHJldHVybiAiU0ZpeGVkNjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUICAgOiByZXR1cm4gIkZsb2F0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEUgIDogcmV0dXJuICJEb3VibGUiOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTCAgICA6IHJldHVybiAiQm9vbCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAiRW51bSI7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgIDogcmV0dXJuICJTdHJpbmciOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTICAgOiByZXR1cm4gIkJ5dGVzIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCAgIDogcmV0dXJuICJHcm91cCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSA6IHJldHVybiAiTWVzc2FnZSI7CisKKyAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KKyAgfQorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuICIiOworfQorCitzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50MzIoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDMyKCkpICsgInUiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuICJHT09HTEVfTE9OR0xPTkcoIiArIFNpbXBsZUl0b2EoZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50NjQoKSkgKyAiKSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuICJHT09HTEVfVUxPTkdMT05HKCIgKyBTaW1wbGVJdG9hKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKSsgIikiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogeworICAgICAgZG91YmxlIHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZG91YmxlKCk7CisgICAgICBpZiAodmFsdWUgPT0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgeworICAgICAgICByZXR1cm4gIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkluZmluaXR5KCkiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgeworICAgICAgICByZXR1cm4gIi06Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbmZpbml0eSgpIjsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYU4oKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU2ltcGxlRHRvYSh2YWx1ZSk7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgeworICAgICAgICBmbG9hdCB2YWx1ZSA9IGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0KCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpIHsKKyAgICAgICAgICByZXR1cm4gInN0YXRpY19jYXN0PGZsb2F0Pig6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbmZpbml0eSgpKSI7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gLW51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSkgeworICAgICAgICAgIHJldHVybiAic3RhdGljX2Nhc3Q8ZmxvYXQ+KC06Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbmZpbml0eSgpKSI7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gdmFsdWUpIHsKKyAgICAgICAgICByZXR1cm4gInN0YXRpY19jYXN0PGZsb2F0Pig6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYU4oKSkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0cmluZyBmbG9hdF92YWx1ZSA9IFNpbXBsZUZ0b2EodmFsdWUpOworICAgICAgICAgIC8vIElmIGZsb2F0aW5nIHBvaW50IHZhbHVlIGNvbnRhaW5zIGEgcGVyaW9kICguKSBvciBhbiBleHBvbmVudAorICAgICAgICAgIC8vIChlaXRoZXIgRSBvciBlKSwgdGhlbiBhcHBlbmQgc3VmZml4ICdmJyB0byBtYWtlIGl0IGEgZmxvYXQKKyAgICAgICAgICAvLyBsaXRlcmFsLgorICAgICAgICAgIGlmIChmbG9hdF92YWx1ZS5maW5kX2ZpcnN0X29mKCIuZUUiKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGZsb2F0X3ZhbHVlLnB1c2hfYmFjaygnZicpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gZmxvYXRfdmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2Jvb2woKSA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgIC8vIExhenk6ICBHZW5lcmF0ZSBhIHN0YXRpY19jYXN0IGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIGhlbHBlciBmdW5jdGlvbgorICAgICAgLy8gICB0aGF0IGNvbnN0cnVjdHMgdGhlIGZ1bGwgbmFtZSBvZiBhbiBlbnVtIHZhbHVlLgorICAgICAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgInN0YXRpY19jYXN0PCAkMCA+KCQxKSIsCisgICAgICAgICAgQ2xhc3NOYW1lKGZpZWxkLT5lbnVtX3R5cGUoKSwgdHJ1ZSksCisgICAgICAgICAgZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSk7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJcIiIgKyBFc2NhcGVUcmlncmFwaHMoQ0VzY2FwZShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkpICsKKyAgICAgICAgICAgICAiXCIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gRmllbGRNZXNzYWdlVHlwZU5hbWUoZmllbGQpICsgIjo6ZGVmYXVsdF9pbnN0YW5jZSgpIjsKKyAgfQorICAvLyBDYW4ndCBhY3R1YWxseSBnZXQgaGVyZTsgbWFrZSBjb21waWxlciBoYXBweS4gIChXZSBjb3VsZCBhZGQgYSBkZWZhdWx0CisgIC8vIGNhc2UgYWJvdmUgYnV0IHRoZW4gd2Ugd291bGRuJ3QgZ2V0IHRoZSBuaWNlIGNvbXBpbGVyIHdhcm5pbmcgd2hlbiBhCisgIC8vIG5ldyB0eXBlIGlzIGFkZGVkLikKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiAiIjsKK30KKworLy8gQ29udmVydCBhIGZpbGUgbmFtZSBpbnRvIGEgdmFsaWQgaWRlbnRpZmllci4KK3N0cmluZyBGaWxlbmFtZUlkZW50aWZpZXIoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICBzdHJpbmcgcmVzdWx0OworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKGFzY2lpX2lzYWxudW0oZmlsZW5hbWVbaV0pKSB7CisgICAgICByZXN1bHQucHVzaF9iYWNrKGZpbGVuYW1lW2ldKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTm90IGFscGhhbnVtZXJpYy4gIFRvIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBuYW1lIGNvbmZsaWN0cyB3ZQorICAgICAgLy8gdXNlIHRoZSBoZXggY29kZSBmb3IgdGhlIGNoYXJhY3Rlci4KKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ18nKTsKKyAgICAgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgICAgIHJlc3VsdC5hcHBlbmQoRmFzdEhleFRvQnVmZmVyKHN0YXRpY19jYXN0PHVpbnQ4PihmaWxlbmFtZVtpXSksIGJ1ZmZlcikpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIEFkZERlc2NyaXB0b3JzKCkgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gZmlsZS4KK3N0cmluZyBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gInByb3RvYnVmX0FkZERlc2NfIiArIEZpbGVuYW1lSWRlbnRpZmllcihmaWxlbmFtZSk7Cit9CisKKy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgQXNzaWduRGVzY3JpcHRvcnMoKSBmdW5jdGlvbiBmb3IgYSBnaXZlbiBmaWxlLgorc3RyaW5nIEdsb2JhbEFzc2lnbkRlc2NyaXB0b3JzTmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHJldHVybiAicHJvdG9idWZfQXNzaWduRGVzY18iICsgRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVuYW1lKTsKK30KKworLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBTaHV0ZG93bkZpbGUoKSBmdW5jdGlvbiBmb3IgYSBnaXZlbiBmaWxlLgorc3RyaW5nIEdsb2JhbFNodXRkb3duRmlsZU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gInByb3RvYnVmX1NodXRkb3duRmlsZV8iICsgRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVuYW1lKTsKK30KKworLy8gRXNjYXBlIEMrKyB0cmlncmFwaHMgYnkgZXNjYXBpbmcgcXVlc3Rpb24gbWFya3MgdG8gXD8KK3N0cmluZyBFc2NhcGVUcmlncmFwaHMoY29uc3Qgc3RyaW5nJiB0b19lc2NhcGUpIHsKKyAgcmV0dXJuIFN0cmluZ1JlcGxhY2UodG9fZXNjYXBlLCAiPyIsICJcXD8iLCB0cnVlKTsKK30KKworYm9vbCBTdGF0aWNJbml0aWFsaXplcnNGb3JjZWQoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGUpIHx8IGZpbGUtPmV4dGVuc2lvbl9jb3VudCgpID4gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGlmIChIYXNFeHRlbnNpb24oZmlsZS0+bWVzc2FnZV90eXBlKGkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgIGNvbnN0IGNoYXIqIHdpdGhfc3RhdGljX2luaXQsIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQsCisgICAgY29uc3QgY2hhciogdmFyMSwgY29uc3Qgc3RyaW5nJiB2YWwxLAorICAgIGNvbnN0IGNoYXIqIHZhcjIsIGNvbnN0IHN0cmluZyYgdmFsMikgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIGlmICh2YXIxKSB7CisgICAgdmFyc1t2YXIxXSA9IHZhbDE7CisgIH0KKyAgaWYgKHZhcjIpIHsKKyAgICB2YXJzW3ZhcjJdID0gdmFsMjsKKyAgfQorICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgICB2YXJzLCBmaWxlLCBwcmludGVyLCB3aXRoX3N0YXRpY19pbml0LCB3aXRob3V0X3N0YXRpY19pbml0KTsKK30KKwordm9pZCBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFycywgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IGNoYXIqIHdpdGhfc3RhdGljX2luaXQsCisgICAgY29uc3QgY2hhciogd2l0aG91dF9zdGF0aWNfaW5pdCkgeworICBpZiAoU3RhdGljSW5pdGlhbGl6ZXJzRm9yY2VkKGZpbGUpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywgd2l0aF9zdGF0aWNfaW5pdCk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywgKHN0cmluZygKKyAgICAgICIjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUlxuIikgKworICAgICAgd2l0aG91dF9zdGF0aWNfaW5pdCArCisgICAgICAiI2Vsc2VcbiIgKworICAgICAgd2l0aF9zdGF0aWNfaW5pdCArCisgICAgICAiI2VuZGlmXG4iKS5jX3N0cigpKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTBmYmVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmgKQEAgLTAsMCArMSwxODIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfSEVMUEVSU19IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9IRUxQRVJTX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIGlvIHsKK2NsYXNzIFByaW50ZXI7Cit9CisKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworLy8gQ29tbW9ubHktdXNlZCBzZXBhcmF0b3IgY29tbWVudHMuICBUaGljayBpcyBhIGxpbmUgb2YgJz0nLCB0aGluIGlzIGEgbGluZQorLy8gb2YgJy0nLgorZXh0ZXJuIGNvbnN0IGNoYXIga1RoaWNrU2VwYXJhdG9yW107CitleHRlcm4gY29uc3QgY2hhciBrVGhpblNlcGFyYXRvcltdOworCisvLyBSZXR1cm5zIHRoZSBub24tbmVzdGVkIHR5cGUgbmFtZSBmb3IgdGhlIGdpdmVuIHR5cGUuICBJZiAicXVhbGlmaWVkIiBpcworLy8gdHJ1ZSwgcHJlZml4IHRoZSB0eXBlIHdpdGggdGhlIGZ1bGwgbmFtZXNwYWNlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYWQ6CisvLyAgIHBhY2thZ2UgZm9vLmJhcjsKKy8vICAgbWVzc2FnZSBCYXogeyBtZXNzYWdlIFF1eCB7fSB9CisvLyBUaGVuIHRoZSBxdWFsaWZpZWQgQ2xhc3NOYW1lIGZvciBRdXggd291bGQgYmU6CisvLyAgIDo6Zm9vOjpiYXI6OkJhel9RdXgKKy8vIFdoaWxlIHRoZSBub24tcXVhbGlmaWVkIHZlcnNpb24gd291bGQgYmU6CisvLyAgIEJhel9RdXgKK3N0cmluZyBDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgYm9vbCBxdWFsaWZpZWQpOworc3RyaW5nIENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yLCBib29sIHF1YWxpZmllZCk7CisKK3N0cmluZyBTdXBlckNsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworLy8gR2V0IHRoZSAodW5xdWFsaWZpZWQpIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBmaWVsZCBpbiBDKysgY29kZS4KKy8vIFRoZSBuYW1lIGlzIGNvZXJjZWQgdG8gbG93ZXItY2FzZSB0byBlbXVsYXRlIHByb3RvMSBiZWhhdmlvci4gIFBlb3BsZQorLy8gc2hvdWxkIGJlIHVzaW5nIGxvd2VyY2FzZS13aXRoLXVuZGVyc2NvcmVzIHN0eWxlIGZvciBwcm90byBmaWVsZCBuYW1lcworLy8gYW55d2F5LCBzbyBub3JtYWxseSB0aGlzIGp1c3QgcmV0dXJucyBmaWVsZC0+bmFtZSgpLgorc3RyaW5nIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gR2V0IHRoZSB1bnF1YWxpZmllZCBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEgZmllbGQncyBmaWVsZAorLy8gbnVtYmVyIGNvbnN0YW50Lgorc3RyaW5nIEZpZWxkQ29uc3RhbnROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciAqZmllbGQpOworCisvLyBSZXR1cm5zIHRoZSBzY29wZSB3aGVyZSB0aGUgZmllbGQgd2FzIGRlZmluZWQgKGZvciBleHRlbnNpb25zLCB0aGlzIGlzCisvLyBkaWZmZXJlbnQgZnJvbSB0aGUgbWVzc2FnZSB0eXBlIHRvIHdoaWNoIHRoZSBmaWVsZCBhcHBsaWVzKS4KK2lubGluZSBjb25zdCBEZXNjcmlwdG9yKiBGaWVsZFNjb3BlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIGZpZWxkLT5pc19leHRlbnNpb24oKSA/CisgICAgZmllbGQtPmV4dGVuc2lvbl9zY29wZSgpIDogZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpOworfQorCisvLyBSZXR1cm5zIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lIGZpZWxkLT5tZXNzYWdlX3R5cGUoKS4gIFVzdWFsbHkgdGhpcworLy8gaXMganVzdCBDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCB0cnVlKTsKK3N0cmluZyBGaWVsZE1lc3NhZ2VUeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworLy8gU3RyaXBzICIucHJvdG8iIG9yICIucHJvdG9kZXZlbCIgZnJvbSB0aGUgZW5kIG9mIGEgZmlsZW5hbWUuCitzdHJpbmcgU3RyaXBQcm90byhjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKKworLy8gR2V0IHRoZSBDKysgdHlwZSBuYW1lIGZvciBhIHByaW1pdGl2ZSB0eXBlIChlLmcuICJkb3VibGUiLCAiOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiIsIGV0Yy4pLgorLy8gTm90ZTogIG5vbi1idWlsdC1pbiB0eXBlIG5hbWVzIHdpbGwgYmUgcXVhbGlmaWVkLCBtZWFuaW5nIHRoZXkgd2lsbCBzdGFydAorLy8gd2l0aCBhIDo6LiAgSWYgeW91IGFyZSB1c2luZyB0aGUgdHlwZSBhcyBhIHRlbXBsYXRlIHBhcmFtZXRlciwgeW91IHdpbGwKKy8vIG5lZWQgdG8gaW5zdXJlIHRoZXJlIGlzIGEgc3BhY2UgYmV0d2VlbiB0aGUgPCBhbmQgdGhlIDo6LCBiZWNhdXNlIHRoZQorLy8gcmlkaWN1bG91cyBDKysgc3RhbmRhcmQgZGVmaW5lcyAiPDoiIHRvIGJlIGEgc3lub255bSBmb3IgIlsiLgorY29uc3QgY2hhciogUHJpbWl0aXZlVHlwZU5hbWUoRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIHR5cGUpOworCisvLyBHZXQgdGhlIGRlY2xhcmVkIHR5cGUgbmFtZSBpbiBDYW1lbENhc2UgZm9ybWF0LCBhcyBpcyB1c2VkIGUuZy4gZm9yIHRoZQorLy8gbWV0aG9kcyBvZiBXaXJlRm9ybWF0LiAgRm9yIGV4YW1wbGUsIFRZUEVfSU5UMzIgYmVjb21lcyAiSW50MzIiLgorY29uc3QgY2hhciogRGVjbGFyZWRUeXBlTWV0aG9kTmFtZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSk7CisKKy8vIEdldCBjb2RlIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBmaWVsZCdzIGRlZmF1bHQgdmFsdWUuCitzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisvLyBDb252ZXJ0IGEgZmlsZSBuYW1lIGludG8gYSB2YWxpZCBpZGVudGlmaWVyLgorc3RyaW5nIEZpbGVuYW1lSWRlbnRpZmllcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKKworLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBBZGREZXNjcmlwdG9ycygpIGZ1bmN0aW9uIGZvciBhIGdpdmVuIGZpbGUuCitzdHJpbmcgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOworCisvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIEFzc2lnbkRlc2NyaXB0b3JzKCkgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gZmlsZS4KK3N0cmluZyBHbG9iYWxBc3NpZ25EZXNjcmlwdG9yc05hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisKKy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgU2h1dGRvd25GaWxlKCkgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gZmlsZS4KK3N0cmluZyBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOworCisvLyBFc2NhcGUgQysrIHRyaWdyYXBocyBieSBlc2NhcGluZyBxdWVzdGlvbiBtYXJrcyB0byBcPworc3RyaW5nIEVzY2FwZVRyaWdyYXBocyhjb25zdCBzdHJpbmcmIHRvX2VzY2FwZSk7CisKKy8vIERvIG1lc3NhZ2UgY2xhc3NlcyBpbiB0aGlzIGZpbGUga2VlcCB0cmFjayBvZiB1bmtub3duIGZpZWxkcz8KK2lubGluZSBib29sIEhhc1Vua25vd25GaWVsZHMoY29uc3QgRmlsZURlc2NyaXB0b3IgKmZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FIHx8CisgICAgICAgICBmaWxlLT5vcHRpb25zKCkucmV0YWluX3Vua25vd25fZmllbGRzKCk7Cit9CisKKy8vIERvZXMgdGhpcyBmaWxlIGhhdmUgZ2VuZXJhdGVkIHBhcnNpbmcsIHNlcmlhbGl6YXRpb24sIGFuZCBvdGhlcgorLy8gc3RhbmRhcmQgbWV0aG9kcyBmb3Igd2hpY2ggcmVmbGVjdGlvbi1iYXNlZCBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbnMgZXhpc3Q/CitpbmxpbmUgYm9vbCBIYXNHZW5lcmF0ZWRNZXRob2RzKGNvbnN0IEZpbGVEZXNjcmlwdG9yICpmaWxlKSB7CisgIHJldHVybiBmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0gRmlsZU9wdGlvbnM6OkNPREVfU0laRTsKK30KKworLy8gRG8gbWVzc2FnZSBjbGFzc2VzIGluIHRoaXMgZmlsZSBoYXZlIGRlc2NyaXB0b3IgYW5kIHJlZmVsY3Rpb24gbWV0aG9kcz8KK2lubGluZSBib29sIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGNvbnN0IEZpbGVEZXNjcmlwdG9yICpmaWxlKSB7CisgIHJldHVybiBmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKK30KKworLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGdlbmVyaWMgc2VydmljZXMgZm9yIHRoaXMgZmlsZT8KK2lubGluZSBib29sIEhhc0dlbmVyaWNTZXJ2aWNlcyhjb25zdCBGaWxlRGVzY3JpcHRvciAqZmlsZSkgeworICByZXR1cm4gZmlsZS0+c2VydmljZV9jb3VudCgpID4gMCAmJgorICAgICAgICAgZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUUgJiYKKyAgICAgICAgIGZpbGUtPm9wdGlvbnMoKS5jY19nZW5lcmljX3NlcnZpY2VzKCk7Cit9CisKKy8vIFNob3VsZCBzdHJpbmcgZmllbGRzIGluIHRoaXMgZmlsZSB2ZXJpZnkgdGhhdCB0aGVpciBjb250ZW50cyBhcmUgVVRGLTg/CitpbmxpbmUgYm9vbCBIYXNVdGY4VmVyaWZpY2F0aW9uKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHJldHVybiBmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKK30KKworLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGEgc2VwYXJhdGUsIHN1cGVyLW9wdGltaXplZCBjb2RlIHBhdGggZm9yIHNlcmlhbGl6aW5nIHRvCisvLyBmbGF0IGFycmF5cz8gIFdlIGRvbid0IGRvIHRoaXMgaW4gTGl0ZSBtb2RlIGJlY2F1c2Ugd2UnZCByYXRoZXIgcmVkdWNlIGNvZGUKKy8vIHNpemUuCitpbmxpbmUgYm9vbCBIYXNGYXN0QXJyYXlTZXJpYWxpemF0aW9uKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHJldHVybiBmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgPT0gRmlsZU9wdGlvbnM6OlNQRUVEOworfQorCisvLyBSZXR1cm5zIHdoZXRoZXIgd2UgaGF2ZSB0byBnZW5lcmF0ZSBjb2RlIHdpdGggc3RhdGljIGluaXRpYWxpemVycy4KK2Jvb2wgU3RhdGljSW5pdGlhbGl6ZXJzRm9yY2VkKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworLy8gUHJpbnRzICd3aXRoX3N0YXRpY19pbml0JyBpZiBzdGF0aWMgaW5pdGlhbGl6ZXJzIGhhdmUgdG8gYmUgdXNlZCBmb3IgdGhlCisvLyBwcm92aWRlZCBmaWxlLiBPdGhlcndpc2UgZW1pdHMgYm90aCAnd2l0aF9zdGF0aWNfaW5pdCcgYW5kCisvLyAnd2l0aG91dF9zdGF0aWNfaW5pdCcgdXNpbmcgI2lmZGVmLgordm9pZCBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgIGNvbnN0IGNoYXIqIHdpdGhfc3RhdGljX2luaXQsIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQsCisgICAgY29uc3QgY2hhciogdmFyMSA9IE5VTEwsIGNvbnN0IHN0cmluZyYgdmFsMSA9ICIiLAorICAgIGNvbnN0IGNoYXIqIHZhcjIgPSBOVUxMLCBjb25zdCBzdHJpbmcmIHZhbDIgPSAiIik7CisKK3ZvaWQgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAorICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcnMsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBjaGFyKiB3aXRoX3N0YXRpY19pbml0LAorICAgIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQpOworCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfSEVMUEVSU19IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjQ4NzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmNjCkBAIC0wLDAgKzEsMTk5MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Cit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgUHJpbnRGaWVsZENvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgLy8gUHJpbnQgdGhlIGZpZWxkJ3MgcHJvdG8tc3ludGF4IGRlZmluaXRpb24gYXMgYSBjb21tZW50LiAgV2UgZG9uJ3Qgd2FudCB0bworICAvLyBwcmludCBncm91cCBib2RpZXMgc28gd2UgY3V0IG9mZiBhZnRlciB0aGUgZmlyc3QgbGluZS4KKyAgc3RyaW5nIGRlZiA9IGZpZWxkLT5EZWJ1Z1N0cmluZygpOworICBwcmludGVyLT5QcmludCgiLy8gJGRlZiRcbiIsCisgICAgImRlZiIsIGRlZi5zdWJzdHIoMCwgZGVmLmZpbmRfZmlyc3Rfb2YoJ1xuJykpKTsKK30KKworc3RydWN0IEZpZWxkT3JkZXJpbmdCeU51bWJlciB7CisgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYikgY29uc3QgeworICAgIHJldHVybiBhLT5udW1iZXIoKSA8IGItPm51bWJlcigpOworICB9Cit9OworCitjb25zdCBjaGFyKiBrV2lyZVR5cGVOYW1lc1tdID0geworICAiVkFSSU5UIiwKKyAgIkZJWEVENjQiLAorICAiTEVOR1RIX0RFTElNSVRFRCIsCisgICJTVEFSVF9HUk9VUCIsCisgICJFTkRfR1JPVVAiLAorICAiRklYRUQzMiIsCit9OworCisvLyBTb3J0IHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIERlc2NyaXB0b3IgYnkgbnVtYmVyIGludG8gYSBuZXdbXSdkIGFycmF5CisvLyBhbmQgcmV0dXJuIGl0LgorY29uc3QgRmllbGREZXNjcmlwdG9yKiogU29ydEZpZWxkc0J5TnVtYmVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogZmllbGRzID0KKyAgICBuZXcgY29uc3QgRmllbGREZXNjcmlwdG9yKltkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZHNbaV0gPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKKyAgfQorICBzb3J0KGZpZWxkcywgZmllbGRzICsgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKSwKKyAgICAgICBGaWVsZE9yZGVyaW5nQnlOdW1iZXIoKSk7CisgIHJldHVybiBmaWVsZHM7Cit9CisKKy8vIEZ1bmN0b3IgZm9yIHNvcnRpbmcgZXh0ZW5zaW9uIHJhbmdlcyBieSB0aGVpciAic3RhcnQiIGZpZWxkIG51bWJlci4KK3N0cnVjdCBFeHRlbnNpb25SYW5nZVNvcnRlciB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByaWdodCkgY29uc3QgeworICAgIHJldHVybiBsZWZ0LT5zdGFydCA8IHJpZ2h0LT5zdGFydDsKKyAgfQorfTsKKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzYWdlIHR5cGUgaGFzIGFueSByZXF1aXJlZCBmaWVsZHMuICBJZiBpdCBkb2Vzbid0LAorLy8gd2UgY2FuIG9wdGltaXplIG91dCBjYWxscyB0byBpdHMgSXNJbml0aWFsaXplZCgpIG1ldGhvZC4KKy8vCisvLyBhbHJlYWR5X3NlZW4gaXMgdXNlZCB0byBhdm9pZCBjaGVja2luZyB0aGUgc2FtZSB0eXBlIG11bHRpcGxlIHRpbWVzCisvLyAoYW5kIGFsc28gdG8gcHJvdGVjdCBhZ2FpbnN0IHJlY3Vyc2lvbikuCitzdGF0aWMgYm9vbCBIYXNSZXF1aXJlZEZpZWxkcygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlLAorICAgIGhhc2hfc2V0PGNvbnN0IERlc2NyaXB0b3IqPiogYWxyZWFkeV9zZWVuKSB7CisgIGlmIChhbHJlYWR5X3NlZW4tPmNvdW50KHR5cGUpID4gMCkgeworICAgIC8vIFNpbmNlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgcmVxdWlyZWQgZmllbGQgY2F1c2VzIHRoZSB3aG9sZQorICAgIC8vIGZ1bmN0aW9uIHRvIHJldHVybiB0cnVlLCB3ZSBjYW4gYXNzdW1lIHRoYXQgaWYgdGhlIHR5cGUgaXMgYWxyZWFkeQorICAgIC8vIGluIHRoZSBjYWNoZSBpdCBkaWRuJ3QgaGF2ZSBhbnkgcmVxdWlyZWQgZmllbGRzLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBhbHJlYWR5X3NlZW4tPmluc2VydCh0eXBlKTsKKworICAvLyBJZiB0aGUgdHlwZSBoYXMgZXh0ZW5zaW9ucywgYW4gZXh0ZW5zaW9uIHdpdGggbWVzc2FnZSB0eXBlIGNvdWxkIGNvbnRhaW4KKyAgLy8gcmVxdWlyZWQgZmllbGRzLCBzbyB3ZSBoYXZlIHRvIGJlIGNvbnNlcnZhdGl2ZSBhbmQgYXNzdW1lIHN1Y2ggYW4KKyAgLy8gZXh0ZW5zaW9uIGV4aXN0cy4KKyAgaWYgKHR5cGUtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgcmV0dXJuIHRydWU7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gdHlwZS0+ZmllbGQoaSk7CisgICAgaWYgKGZpZWxkLT5pc19yZXF1aXJlZCgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBpZiAoSGFzUmVxdWlyZWRGaWVsZHMoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBhbHJlYWR5X3NlZW4pKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgSGFzUmVxdWlyZWRGaWVsZHMoY29uc3QgRGVzY3JpcHRvciogdHlwZSkgeworICBoYXNoX3NldDxjb25zdCBEZXNjcmlwdG9yKj4gYWxyZWFkeV9zZWVuOworICByZXR1cm4gSGFzUmVxdWlyZWRGaWVsZHModHlwZSwgJmFscmVhZHlfc2Vlbik7Cit9CisKKy8vIFRoaXMgcmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgY29tcGlsZXIncyBhbGlnbm1lbnQgZm9yIHRoZSBmaWVsZC4gIFRoaXMKKy8vIGNhbid0IGd1YXJhbnRlZSB0byBiZSBjb3JyZWN0IGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBjb2RlIGNvdWxkIGJlIGNvbXBpbGVkIG9uCisvLyBkaWZmZXJlbnQgc3lzdGVtcyB3aXRoIGRpZmZlcmVudCBhbGlnbm1lbnQgcnVsZXMuICBUaGUgZXN0aW1hdGVzIGJlbG93IGFzc3VtZQorLy8gNjQtYml0IHBvaW50ZXJzLgoraW50IEVzdGltYXRlQWxpZ25tZW50U2l6ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGlmIChmaWVsZCA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSByZXR1cm4gODsKKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIDQ7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIDg7CisgIH0KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiAtMTsgIC8vIE1ha2UgY29tcGlsZXIgaGFwcHkuCit9CisKKy8vIEZpZWxkR3JvdXAgaXMganVzdCBhIGhlbHBlciBmb3IgT3B0aW1pemVQYWRkaW5nIGJlbG93LiAgSXQgaG9sZHMgYSB2ZWN0b3Igb2YKKy8vIGZpZWxkcyB0aGF0IGFyZSBncm91cGVkIHRvZ2V0aGVyIGJlY2F1c2UgdGhleSBoYXZlIGNvbXBhdGlibGUgYWxpZ25tZW50LCBhbmQKKy8vIGEgcHJlZmVycmVkIGxvY2F0aW9uIGluIHRoZSBmaW5hbCBmaWVsZCBvcmRlcmluZy4KK2NsYXNzIEZpZWxkR3JvdXAgeworIHB1YmxpYzoKKyAgRmllbGRHcm91cCgpCisgICAgICA6IHByZWZlcnJlZF9sb2NhdGlvbl8oMCkge30KKworICAvLyBBIGdyb3VwIHdpdGggYSBzaW5nbGUgZmllbGQuCisgIEZpZWxkR3JvdXAoZmxvYXQgcHJlZmVycmVkX2xvY2F0aW9uLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKQorICAgICAgOiBwcmVmZXJyZWRfbG9jYXRpb25fKHByZWZlcnJlZF9sb2NhdGlvbiksCisgICAgICAgIGZpZWxkc18oMSwgZmllbGQpIHt9CisKKyAgLy8gQXBwZW5kIHRoZSBmaWVsZHMgaW4gJ290aGVyJyB0byB0aGlzIGdyb3VwLgorICB2b2lkIEFwcGVuZChjb25zdCBGaWVsZEdyb3VwJiBvdGhlcikgeworICAgIGlmIChvdGhlci5maWVsZHNfLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gUHJlZmVycmVkIGxvY2F0aW9uIGlzIHRoZSBhdmVyYWdlIGFtb25nIGFsbCB0aGUgZmllbGRzLCBzbyB3ZSB3ZWlnaHQgYnkKKyAgICAvLyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBvbiBlYWNoIEZpZWxkR3JvdXAgb2JqZWN0LgorICAgIHByZWZlcnJlZF9sb2NhdGlvbl8gPQorICAgICAgICAocHJlZmVycmVkX2xvY2F0aW9uXyAqIGZpZWxkc18uc2l6ZSgpICsKKyAgICAgICAgIChvdGhlci5wcmVmZXJyZWRfbG9jYXRpb25fICogb3RoZXIuZmllbGRzXy5zaXplKCkpKSAvCisgICAgICAgIChmaWVsZHNfLnNpemUoKSArIG90aGVyLmZpZWxkc18uc2l6ZSgpKTsKKyAgICBmaWVsZHNfLmluc2VydChmaWVsZHNfLmVuZCgpLCBvdGhlci5maWVsZHNfLmJlZ2luKCksIG90aGVyLmZpZWxkc18uZW5kKCkpOworICB9CisKKyAgdm9pZCBTZXRQcmVmZXJyZWRMb2NhdGlvbihmbG9hdCBsb2NhdGlvbikgeyBwcmVmZXJyZWRfbG9jYXRpb25fID0gbG9jYXRpb247IH0KKyAgY29uc3QgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBmaWVsZHMoKSBjb25zdCB7IHJldHVybiBmaWVsZHNfOyB9CisKKyAgLy8gRmllbGRHcm91cCBvYmplY3RzIHNvcnQgYnkgdGhlaXIgcHJlZmVycmVkIGxvY2F0aW9uLgorICBib29sIG9wZXJhdG9yPChjb25zdCBGaWVsZEdyb3VwJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiBwcmVmZXJyZWRfbG9jYXRpb25fIDwgb3RoZXIucHJlZmVycmVkX2xvY2F0aW9uXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gInByZWZlcnJlZF9sb2NhdGlvbl8iIGlzIGFuIGVzdGltYXRlIG9mIHdoZXJlIHRoaXMgZ3JvdXAgc2hvdWxkIGdvIGluIHRoZQorICAvLyBmaW5hbCBsaXN0IG9mIGZpZWxkcy4gIFdlIGNvbXB1dGUgdGhpcyBieSB0YWtpbmcgdGhlIGF2ZXJhZ2UgaW5kZXggb2YgZWFjaAorICAvLyBmaWVsZCBpbiB0aGlzIGdyb3VwIGluIHRoZSBvcmlnaW5hbCBvcmRlcmluZyBvZiBmaWVsZHMuICBUaGlzIGlzIHZlcnkKKyAgLy8gYXBwcm94aW1hdGUsIGJ1dCBzaG91bGQgcHV0IHRoaXMgZ3JvdXAgY2xvc2UgdG8gd2hlcmUgaXRzIG1lbWJlciBmaWVsZHMKKyAgLy8gb3JpZ2luYWxseSB3ZW50LgorICBmbG9hdCBwcmVmZXJyZWRfbG9jYXRpb25fOworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzXzsKKyAgLy8gV2UgcmVseSBvbiB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0gc28gdGhpcyB0eXBlIGNhbiBiZQorICAvLyB1c2VkIGluIGEgdmVjdG9yLgorfTsKKworLy8gUmVvcmRlciAnZmllbGRzJyBzbyB0aGF0IGlmIHRoZSBmaWVsZHMgYXJlIG91dHB1dCBpbnRvIGEgYysrIGNsYXNzIGluIHRoZSBuZXcKKy8vIG9yZGVyLCB0aGUgYWxpZ25tZW50IHBhZGRpbmcgaXMgbWluaW1pemVkLiAgV2UgdHJ5IHRvIGRvIHRoaXMgd2hpbGUga2VlcGluZworLy8gZWFjaCBmaWVsZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byBpdHMgb3JpZ2luYWwgcG9zaXRpb24gc28gdGhhdCB3ZSBkb24ndAorLy8gcmVkdWNlIGNhY2hlIGxvY2FsaXR5IG11Y2ggZm9yIGZ1bmN0aW9uIHRoYXQgYWNjZXNzIGVhY2ggZmllbGQgaW4gb3JkZXIuCit2b2lkIE9wdGltaXplUGFkZGluZyh2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIGZpZWxkcykgeworICAvLyBGaXJzdCBkaXZpZGUgZmllbGRzIGludG8gdGhvc2UgdGhhdCBhbGlnbiB0byAxIGJ5dGUsIDQgYnl0ZXMgb3IgOCBieXRlcy4KKyAgdmVjdG9yPEZpZWxkR3JvdXA+IGFsaWduZWRfdG9fMSwgYWxpZ25lZF90b180LCBhbGlnbmVkX3RvXzg7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLT5zaXplKCk7ICsraSkgeworICAgIHN3aXRjaCAoRXN0aW1hdGVBbGlnbm1lbnRTaXplKCgqZmllbGRzKVtpXSkpIHsKKyAgICAgIGNhc2UgMTogYWxpZ25lZF90b18xLnB1c2hfYmFjayhGaWVsZEdyb3VwKGksICgqZmllbGRzKVtpXSkpOyBicmVhazsKKyAgICAgIGNhc2UgNDogYWxpZ25lZF90b180LnB1c2hfYmFjayhGaWVsZEdyb3VwKGksICgqZmllbGRzKVtpXSkpOyBicmVhazsKKyAgICAgIGNhc2UgODogYWxpZ25lZF90b184LnB1c2hfYmFjayhGaWVsZEdyb3VwKGksICgqZmllbGRzKVtpXSkpOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmtub3duIGFsaWdubWVudCBzaXplLiI7CisgICAgfQorICB9CisKKyAgLy8gTm93IGdyb3VwIGZpZWxkcyBhbGlnbmVkIHRvIDEgYnl0ZSBpbnRvIHNldHMgb2YgNCwgYW5kIHRyZWF0IHRob3NlIGxpa2UgYQorICAvLyBzaW5nbGUgZmllbGQgYWxpZ25lZCB0byA0IGJ5dGVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWduZWRfdG9fMS5zaXplKCk7IGkgKz0gNCkgeworICAgIEZpZWxkR3JvdXAgZmllbGRfZ3JvdXA7CisgICAgZm9yIChpbnQgaiA9IGk7IGogPCBhbGlnbmVkX3RvXzEuc2l6ZSgpICYmIGogPCBpICsgNDsgKytqKSB7CisgICAgICBmaWVsZF9ncm91cC5BcHBlbmQoYWxpZ25lZF90b18xW2pdKTsKKyAgICB9CisgICAgYWxpZ25lZF90b180LnB1c2hfYmFjayhmaWVsZF9ncm91cCk7CisgIH0KKyAgLy8gU29ydCBieSBwcmVmZXJyZWQgbG9jYXRpb24gdG8ga2VlcCBmaWVsZHMgYXMgY2xvc2UgdG8gdGhlaXIgb3JpZ2luYWwKKyAgLy8gbG9jYXRpb24gYXMgcG9zc2libGUuCisgIHNvcnQoYWxpZ25lZF90b180LmJlZ2luKCksIGFsaWduZWRfdG9fNC5lbmQoKSk7CisKKyAgLy8gTm93IGdyb3VwIGZpZWxkcyBhbGlnbmVkIHRvIDQgYnl0ZXMgKG9yIHRoZSA0LWZpZWxkIGdyb3VwcyBjcmVhdGVkIGFib3ZlKQorICAvLyBpbnRvIHBhaXJzLCBhbmQgdHJlYXQgdGhvc2UgbGlrZSBhIHNpbmdsZSBmaWVsZCBhbGlnbmVkIHRvIDggYnl0ZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxpZ25lZF90b180LnNpemUoKTsgaSArPSAyKSB7CisgICAgRmllbGRHcm91cCBmaWVsZF9ncm91cDsKKyAgICBmb3IgKGludCBqID0gaTsgaiA8IGFsaWduZWRfdG9fNC5zaXplKCkgJiYgaiA8IGkgKyAyOyArK2opIHsKKyAgICAgIGZpZWxkX2dyb3VwLkFwcGVuZChhbGlnbmVkX3RvXzRbal0pOworICAgIH0KKyAgICBpZiAoaSA9PSBhbGlnbmVkX3RvXzQuc2l6ZSgpIC0gMSkgeworICAgICAgLy8gTW92ZSBpbmNvbXBsZXRlIDQtYnl0ZSBibG9jayB0byB0aGUgZW5kLgorICAgICAgZmllbGRfZ3JvdXAuU2V0UHJlZmVycmVkTG9jYXRpb24oZmllbGRzLT5zaXplKCkgKyAxKTsKKyAgICB9CisgICAgYWxpZ25lZF90b184LnB1c2hfYmFjayhmaWVsZF9ncm91cCk7CisgIH0KKyAgLy8gU29ydCBieSBwcmVmZXJyZWQgbG9jYXRpb24gdG8ga2VlcCBmaWVsZHMgYXMgY2xvc2UgdG8gdGhlaXIgb3JpZ2luYWwKKyAgLy8gbG9jYXRpb24gYXMgcG9zc2libGUuCisgIHNvcnQoYWxpZ25lZF90b184LmJlZ2luKCksIGFsaWduZWRfdG9fOC5lbmQoKSk7CisKKyAgLy8gTm93IHB1bGwgb3V0IGFsbCB0aGUgRmllbGREZXNjcmlwdG9ycyBpbiBvcmRlci4KKyAgZmllbGRzLT5jbGVhcigpOworICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWduZWRfdG9fOC5zaXplKCk7ICsraSkgeworICAgIGZpZWxkcy0+aW5zZXJ0KGZpZWxkcy0+ZW5kKCksCisgICAgICAgICAgICAgICAgICAgYWxpZ25lZF90b184W2ldLmZpZWxkcygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgYWxpZ25lZF90b184W2ldLmZpZWxkcygpLmVuZCgpKTsKKyAgfQorfQorCit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTWVzc2FnZUdlbmVyYXRvcjo6TWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRsbGV4cG9ydF9kZWNsKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAorICAgIGNsYXNzbmFtZV8oQ2xhc3NOYW1lKGRlc2NyaXB0b3IsIGZhbHNlKSksCisgICAgZGxsZXhwb3J0X2RlY2xfKGRsbGV4cG9ydF9kZWNsKSwKKyAgICBmaWVsZF9nZW5lcmF0b3JzXyhkZXNjcmlwdG9yKSwKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc18obmV3IHNjb3BlZF9wdHI8TWVzc2FnZUdlbmVyYXRvcj5bCisgICAgICBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpXSksCisgICAgZW51bV9nZW5lcmF0b3JzXyhuZXcgc2NvcGVkX3B0cjxFbnVtR2VuZXJhdG9yPlsKKyAgICAgIGRlc2NyaXB0b3ItPmVudW1fdHlwZV9jb3VudCgpXSksCisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfKG5ldyBzY29wZWRfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj5bCisgICAgICBkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKV0pIHsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS5yZXNldCgKKyAgICAgIG5ldyBNZXNzYWdlR2VuZXJhdG9yKGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlKGkpLCBkbGxleHBvcnRfZGVjbCkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS5yZXNldCgKKyAgICAgIG5ldyBFbnVtR2VuZXJhdG9yKGRlc2NyaXB0b3ItPmVudW1fdHlwZShpKSwgZGxsZXhwb3J0X2RlY2wpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS5yZXNldCgKKyAgICAgIG5ldyBFeHRlbnNpb25HZW5lcmF0b3IoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uKGkpLCBkbGxleHBvcnRfZGVjbCkpOworICB9Cit9CisKK01lc3NhZ2VHZW5lcmF0b3I6On5NZXNzYWdlR2VuZXJhdG9yKCkge30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlRm9yd2FyZERlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KCJjbGFzcyAkY2xhc3NuYW1lJDtcbiIsCisgICAgICAgICAgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRm9yd2FyZERlY2xhcmF0aW9uKHByaW50ZXIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZUVudW1EZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRW51bURlZmluaXRpb25zKHByaW50ZXIpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmaW5pdGlvbihwcmludGVyKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVHZXRFbnVtRGVzY3JpcHRvclNwZWNpYWxpemF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMocHJpbnRlcik7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMocHJpbnRlcik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlRmllbGRBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworCisgICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGZpZWxkLCAmdmFycyk7CisgICAgdmFyc1siY29uc3RhbnRfbmFtZSJdID0gRmllbGRDb25zdGFudE5hbWUoZmllbGQpOworCisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLCAiaW5saW5lIGludCAkbmFtZSRfc2l6ZSgpIGNvbnN0JGRlcHJlY2F0aW9uJDtcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLCAiaW5saW5lIGJvb2wgaGFzXyRuYW1lJCgpIGNvbnN0JGRlcHJlY2F0aW9uJDtcbiIpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KHZhcnMsICJpbmxpbmUgdm9pZCBjbGVhcl8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLCAic3RhdGljIGNvbnN0IGludCAkY29uc3RhbnRfbmFtZSQgPSAkbnVtYmVyJDtcbiIpOworCisgICAgLy8gR2VuZXJhdGUgdHlwZS1zcGVjaWZpYyBhY2Nlc3NvciBkZWNsYXJhdGlvbnMuCisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKHByaW50ZXIpOworCisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIC8vIEdlbmVyYXRlIGFjY2Vzc29ycyBmb3IgZXh0ZW5zaW9ucy4gIFdlIGp1c3QgY2FsbCBhIG1hY3JvIGxvY2F0ZWQgaW4KKyAgICAvLyBleHRlbnNpb25fc2V0Lmggc2luY2UgdGhlIGFjY2Vzc29ycyBhYm91dCA4MCBsaW5lcyBvZiBzdGF0aWMgY29kZS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUygkY2xhc3NuYW1lJClcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlRmllbGRBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KCIvLyAkY2xhc3NuYW1lJFxuXG4iLCAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKworICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGZpZWxkKTsKKworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhmaWVsZCwgJnZhcnMpOworCisgICAgLy8gR2VuZXJhdGUgaGFzXyRuYW1lJCgpIG9yICRuYW1lJF9zaXplKCkuCisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAiaW5saW5lIGludCAkY2xhc3NuYW1lJDo6JG5hbWUkX3NpemUoKSBjb25zdCB7XG4iCisgICAgICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTaW5ndWxhciBmaWVsZC4KKyAgICAgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgICAgIHZhcnNbImhhc19hcnJheV9pbmRleCJdID0gU2ltcGxlSXRvYShmaWVsZC0+aW5kZXgoKSAvIDMyKTsKKyAgICAgIHZhcnNbImhhc19tYXNrIl0gPSBGYXN0SGV4MzJUb0J1ZmZlcigxdSA8PCAoZmllbGQtPmluZGV4KCkgJSAzMiksIGJ1ZmZlcik7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAiaW5saW5lIGJvb2wgJGNsYXNzbmFtZSQ6Omhhc18kbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAgICIgIHJldHVybiAoX2hhc19iaXRzX1skaGFzX2FycmF5X2luZGV4JF0gJiAweCRoYXNfbWFzayR1KSAhPSAwO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF9oYXNfJG5hbWUkKCkge1xuIgorICAgICAgICAiICBfaGFzX2JpdHNfWyRoYXNfYXJyYXlfaW5kZXgkXSB8PSAweCRoYXNfbWFzayR1O1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmNsZWFyX2hhc18kbmFtZSQoKSB7XG4iCisgICAgICAgICIgIF9oYXNfYml0c19bJGhhc19hcnJheV9pbmRleCRdICY9IH4weCRoYXNfbWFzayR1O1xuIgorICAgICAgICAifVxuIgorICAgICAgICApOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIGNsZWFyXyRuYW1lJCgpCisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6Y2xlYXJfJG5hbWUkKCkge1xuIik7CisKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQ2xlYXJpbmdDb2RlKHByaW50ZXIpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAiICBjbGVhcl9oYXNfJG5hbWUkKCk7XG4iKTsKKyAgICB9CisKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7CisKKyAgICAvLyBHZW5lcmF0ZSB0eXBlLXNwZWNpZmljIGFjY2Vzc29ycy4KKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyKTsKKworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZUNsYXNzRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlQ2xhc3NEZWZpbml0aW9uKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgIHByaW50ZXItPlByaW50KGtUaGluU2VwYXJhdG9yKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgdmFyc1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOworICB2YXJzWyJmaWVsZF9jb3VudCJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSk7CisgIGlmIChkbGxleHBvcnRfZGVjbF8uZW1wdHkoKSkgeworICAgIHZhcnNbImRsbGV4cG9ydCJdID0gIiI7CisgIH0gZWxzZSB7CisgICAgdmFyc1siZGxsZXhwb3J0Il0gPSBkbGxleHBvcnRfZGVjbF8gKyAiICI7CisgIH0KKyAgdmFyc1sic3VwZXJjbGFzcyJdID0gU3VwZXJDbGFzc05hbWUoZGVzY3JpcHRvcl8pOworCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgImNsYXNzICRkbGxleHBvcnQkJGNsYXNzbmFtZSQgOiBwdWJsaWMgJHN1cGVyY2xhc3MkIHtcbiIKKyAgICAiIHB1YmxpYzpcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICIkY2xhc3NuYW1lJCgpO1xuIgorICAgICJ2aXJ0dWFsIH4kY2xhc3NuYW1lJCgpO1xuIgorICAgICJcbiIKKyAgICAiJGNsYXNzbmFtZSQoY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pO1xuIgorICAgICJcbiIKKyAgICAiaW5saW5lICRjbGFzc25hbWUkJiBvcGVyYXRvcj0oY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pIHtcbiIKKyAgICAiICBDb3B5RnJvbShmcm9tKTtcbiIKKyAgICAiICByZXR1cm4gKnRoaXM7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iKTsKKworICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgImlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7XG4iCisgICAgICAiICByZXR1cm4gX3Vua25vd25fZmllbGRzXztcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkge1xuIgorICAgICAgIiAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIpOworICB9CisKKyAgLy8gT25seSBnZW5lcmF0ZSB0aGlzIG1lbWJlciBpZiBpdCdzIG5vdCBkaXNhYmxlZC4KKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpICYmCisgICAgICAhZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgInN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAic3RhdGljIGNvbnN0ICRjbGFzc25hbWUkJiBkZWZhdWx0X2luc3RhbmNlKCk7XG4iCisgICAgIlxuIik7CisKKyAgaWYgKCFTdGF0aWNJbml0aWFsaXplcnNGb3JjZWQoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgIiNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSXG4iCisgICAgICAiLy8gUmV0dXJucyB0aGUgaW50ZXJuYWwgZGVmYXVsdCBpbnN0YW5jZSBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uIGNhblxuIgorICAgICAgIi8vIHJldHVybiBOVUxMIHRodXMgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHRoZSB1c2VyLiBUaGlzIGlzIGludGVuZGVkXG4iCisgICAgICAiLy8gZm9yIFByb3RvYnVmIGludGVybmFsIGNvZGUuIFBsZWFzZSB1c2UgZGVmYXVsdF9pbnN0YW5jZSgpIGRlY2xhcmVkXG4iCisgICAgICAiLy8gYWJvdmUgaW5zdGVhZC5cbiIKKyAgICAgICJzdGF0aWMgaW5saW5lIGNvbnN0ICRjbGFzc25hbWUkKiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkge1xuIgorICAgICAgIiAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2VfO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIjZW5kaWZcbiIKKyAgICAgICJcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAidm9pZCBTd2FwKCRjbGFzc25hbWUkKiBvdGhlcik7XG4iCisgICAgIlxuIgorICAgICIvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICJcbiIKKyAgICAiJGNsYXNzbmFtZSQqIE5ldygpIGNvbnN0O1xuIik7CisKKyAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICJ2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7XG4iCisgICAgICAgICJ2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICJ2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlJiBmcm9tKTtcbiIpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAidm9pZCBDb3B5RnJvbShjb25zdCAkY2xhc3NuYW1lJCYgZnJvbSk7XG4iCisgICAgICAidm9pZCBNZXJnZUZyb20oY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pO1xuIgorICAgICAgInZvaWQgQ2xlYXIoKTtcbiIKKyAgICAgICJib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDtcbiIKKyAgICAgICJcbiIKKyAgICAgICJpbnQgQnl0ZVNpemUoKSBjb25zdDtcbiIKKyAgICAgICJib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShcbiIKKyAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpO1xuIgorICAgICAgInZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKFxuIgorICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDtcbiIpOworICAgIGlmIChIYXNGYXN0QXJyYXlTZXJpYWxpemF0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDtcbiIpOworICAgIH0KKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgImludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfVxuIgorICAgICJwcml2YXRlOlxuIgorICAgICJ2b2lkIFNoYXJlZEN0b3IoKTtcbiIKKyAgICAidm9pZCBTaGFyZWREdG9yKCk7XG4iCisgICAgInZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7XG4iCisgICAgInB1YmxpYzpcbiIKKyAgICAiXG4iKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7XG4iCisgICAgICAiXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6OnN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgY29uc3Q7XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICIvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICJcbiIpOworCisgIC8vIEltcG9ydCBhbGwgbmVzdGVkIG1lc3NhZ2UgY2xhc3NlcyBpbnRvIHRoaXMgY2xhc3MncyBzY29wZSB3aXRoIHR5cGVkZWZzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBuZXN0ZWRfdHlwZSA9IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKTsKKyAgICBwcmludGVyLT5QcmludCgidHlwZWRlZiAkbmVzdGVkX2Z1bGxfbmFtZSQgJG5lc3RlZF9uYW1lJDtcbiIsCisgICAgICAgICAgICAgICAgICAgIm5lc3RlZF9uYW1lIiwgbmVzdGVkX3R5cGUtPm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAibmVzdGVkX2Z1bGxfbmFtZSIsIENsYXNzTmFtZShuZXN0ZWRfdHlwZSwgZmFsc2UpKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIC8vIEltcG9ydCBhbGwgbmVzdGVkIGVudW1zIGFuZCB0aGVpciB2YWx1ZXMgaW50byB0aGlzIGNsYXNzJ3Mgc2NvcGUgd2l0aAorICAvLyB0eXBlZGVmcyBhbmQgY29uc3RhbnRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVTeW1ib2xJbXBvcnRzKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisgICAgIlxuIik7CisKKyAgLy8gR2VuZXJhdGUgYWNjZXNzb3IgbWV0aG9kcyBmb3IgYWxsIGZpZWxkcy4KKyAgR2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVjbGFyYXRpb25zKHByaW50ZXIpOworCisgIC8vIERlY2xhcmUgZXh0ZW5zaW9uIGlkZW50aWZpZXJzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlY2xhcmF0aW9uKHByaW50ZXIpOworICB9CisKKworICBwcmludGVyLT5QcmludCgKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOiRmdWxsX25hbWUkKVxuIiwKKyAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKworICAvLyBHZW5lcmF0ZSBwcml2YXRlIG1lbWJlcnMuCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIiBwcml2YXRlOlxuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGlmICghZGVzY3JpcHRvcl8tPmZpZWxkKGkpLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImlubGluZSB2b2lkIHNldF9oYXNfJG5hbWUkKCk7XG4iLAorICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShkZXNjcmlwdG9yXy0+ZmllbGQoaSkpKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaW5saW5lIHZvaWQgY2xlYXJfaGFzXyRuYW1lJCgpO1xuIiwKKyAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSk7CisgICAgfQorICB9CisgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIC8vIFRvIG1pbmltaXplIHBhZGRpbmcsIGRhdGEgbWVtYmVycyBhcmUgZGl2aWRlZCBpbnRvIHRocmVlIHNlY3Rpb25zOgorICAvLyAoMSkgbWVtYmVycyBhc3N1bWVkIHRvIGFsaWduIHRvIDggYnl0ZXMKKyAgLy8gKDIpIG1lbWJlcnMgY29ycmVzcG9uZGluZyB0byBtZXNzYWdlIGZpZWxkcywgcmUtb3JkZXJlZCB0byBvcHRpbWl6ZQorICAvLyAgICAgYWxpZ25tZW50LgorICAvLyAoMykgbWVtYmVycyBhc3N1bWVkIHRvIGFsaWduIHRvIDQgYnl0ZXMuCisKKyAgLy8gTWVtYmVycyBhc3N1bWVkIHRvIGFsaWduIHRvIDggYnl0ZXM6CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfO1xuIgorICAgICAgIlxuIik7CisgIH0KKworICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIEZpZWxkIG1lbWJlcnM6CisKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRzLnB1c2hfYmFjayhkZXNjcmlwdG9yXy0+ZmllbGQoaSkpOworICB9CisgIE9wdGltaXplUGFkZGluZygmZmllbGRzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGRzW2ldKS5HZW5lcmF0ZVByaXZhdGVNZW1iZXJzKHByaW50ZXIpOworICB9CisKKyAgLy8gTWVtYmVycyBhc3N1bWVkIHRvIGFsaWduIHRvIDQgYnl0ZXM6CisKKyAgLy8gVE9ETyhrZW50b24pOiAgTWFrZSBfY2FjaGVkX3NpemVfIGFuIGF0b21pYzxpbnQ+IHdoZW4gQysrIHN1cHBvcnRzIGl0LgorICBwcmludGVyLT5QcmludCgKKyAgICAgICJcbiIKKyAgICAgICJtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfO1xuIik7CisKKyAgLy8gR2VuZXJhdGUgX2hhc19iaXRzXy4KKyAgaWYgKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpID4gMCkgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soJGZpZWxkX2NvdW50JCArIDMxKSAvIDMyXTtcbiIKKyAgICAgICJcbiIpOworICB9IGVsc2UgeworICAgIC8vIFplcm8tc2l6ZSBhcnJheXMgYXJlbid0IHRlY2huaWNhbGx5IGFsbG93ZWQsIGFuZCBNU1ZDIGluIHBhcnRpY3VsYXIKKyAgICAvLyBkb2Vzbid0IGxpa2UgdGhlbS4gIFdlIHN0aWxsIG5lZWQgdG8gZGVjbGFyZSB0aGVzZSBhcnJheXMgdG8gbWFrZQorICAgIC8vIG90aGVyIGNvZGUgY29tcGlsZS4gIFNpbmNlIHRoaXMgaXMgYW4gdW5jb21tb24gY2FzZSwgd2UnbGwganVzdCBkZWNsYXJlCisgICAgLy8gdGhlbSB3aXRoIHNpemUgMSBhbmQgd2FzdGUgc29tZSBzcGFjZS4gIE9oIHdlbGwuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTtcbiIKKyAgICAgICJcbiIpOworICB9CisKKyAgLy8gRGVjbGFyZSBBZGREZXNjcmlwdG9ycygpLCBCdWlsZERlc2NyaXB0b3JzKCksIGFuZCBTaHV0ZG93bkZpbGUoKSBhcworICAvLyBmcmllbmRzIHNvIHRoYXQgdGhleSBjYW4gYWNjZXNzIHByaXZhdGUgc3RhdGljIHZhcmlhYmxlcyBsaWtlCisgIC8vIGRlZmF1bHRfaW5zdGFuY2VfIGFuZCByZWZsZWN0aW9uXy4KKyAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAorICAgIGRlc2NyaXB0b3JfLT5maWxlKCksIHByaW50ZXIsCisgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICAgICJmcmllbmQgdm9pZCAkZGxsZXhwb3J0X2RlY2wkICRhZGRkZXNjcmlwdG9yc25hbWUkKCk7XG4iLAorICAgIC8vIFdpdGhvdXQuCisgICAgImZyaWVuZCB2b2lkICRkbGxleHBvcnRfZGVjbCQgJGFkZGRlc2NyaXB0b3JzbmFtZSRfaW1wbCgpO1xuIiwKKyAgICAvLyBWYXJzLgorICAgICJkbGxleHBvcnRfZGVjbCIsIGRsbGV4cG9ydF9kZWNsXywKKyAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwKKyAgICBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKS0+bmFtZSgpKSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImZyaWVuZCB2b2lkICRhc3NpZ25kZXNjcmlwdG9yc25hbWUkKCk7XG4iCisgICAgImZyaWVuZCB2b2lkICRzaHV0ZG93bmZpbGVuYW1lJCgpO1xuIgorICAgICJcbiIsCisgICAgImFzc2lnbmRlc2NyaXB0b3JzbmFtZSIsCisgICAgICBHbG9iYWxBc3NpZ25EZXNjcmlwdG9yc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKS0+bmFtZSgpKSwKKyAgICAic2h1dGRvd25maWxlbmFtZSIsIEdsb2JhbFNodXRkb3duRmlsZU5hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKS0+bmFtZSgpKSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7XG4iCisgICAgInN0YXRpYyAkY2xhc3NuYW1lJCogZGVmYXVsdF9pbnN0YW5jZV87XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KHZhcnMsICJ9OyIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVJbmxpbmVNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVJbmxpbmVNZXRob2RzKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KGtUaGluU2VwYXJhdG9yKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIEdlbmVyYXRlRmllbGRBY2Nlc3NvckRlZmluaXRpb25zKHByaW50ZXIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVEZXNjcmlwdG9yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqICRuYW1lJF9kZXNjcmlwdG9yXyA9IE5VTEw7XG4iCisgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKlxuIgorICAgICIgICRuYW1lJF9yZWZsZWN0aW9uXyA9IE5VTEw7XG4iLAorICAgICJuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlc2NyaXB0b3JEZWNsYXJhdGlvbnMocHJpbnRlcik7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogJG5hbWUkX2Rlc2NyaXB0b3JfID0gTlVMTDtcbiIsCisgICAgICAibmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKGkpLCBmYWxzZSkpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlciwgaW50IGluZGV4KSB7CisgIC8vIFRPRE8oa2VudG9uKTogIFBhc3NpbmcgdGhlIGluZGV4IHRvIHRoaXMgbWV0aG9kIGlzIHJlZHVuZGFudDsganVzdCB1c2UKKyAgLy8gICBkZXNjcmlwdG9yXy0+aW5kZXgoKSBpbnN0ZWFkLgorICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lXzsKKyAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaW5kZXgpOworCisgIC8vIE9idGFpbiB0aGUgZGVzY3JpcHRvciBmcm9tIHRoZSBwYXJlbnQncyBkZXNjcmlwdG9yLgorICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpID09IE5VTEwpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgIiRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKCRpbmRleCQpO1xuIik7CisgIH0gZWxzZSB7CisgICAgdmFyc1sicGFyZW50Il0gPSBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpLCBmYWxzZSk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXyA9ICIKKyAgICAgICAgIiRwYXJlbnQkX2Rlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZSgkaW5kZXgkKTtcbiIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIG9mZnNldHMuCisgIEdlbmVyYXRlT2Zmc2V0cyhwcmludGVyKTsKKworICAvLyBDb25zdHJ1Y3QgdGhlIHJlZmxlY3Rpb24gb2JqZWN0LgorICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICIkY2xhc3NuYW1lJF9yZWZsZWN0aW9uXyA9XG4iCisgICAgIiAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKFxuIgorICAgICIgICAgJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl8sXG4iCisgICAgIiAgICAkY2xhc3NuYW1lJDo6ZGVmYXVsdF9pbnN0YW5jZV8sXG4iCisgICAgIiAgICAkY2xhc3NuYW1lJF9vZmZzZXRzXyxcbiIKKyAgICAiICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoJGNsYXNzbmFtZSQsIF9oYXNfYml0c19bMF0pLFxuIgorICAgICIgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVCgiCisgICAgICAiJGNsYXNzbmFtZSQsIF91bmtub3duX2ZpZWxkc18pLFxuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVCgiCisgICAgICAgICIkY2xhc3NuYW1lJCwgX2V4dGVuc2lvbnNfKSxcbiIpOworICB9IGVsc2UgeworICAgIC8vIE5vIGV4dGVuc2lvbnMuCisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIgICAgLTEsXG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSxcbiIKKyAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksXG4iCisgICAgIiAgICBzaXplb2YoJGNsYXNzbmFtZSQpKTtcbiIpOworCisgIC8vIEhhbmRsZSBuZXN0ZWQgdHlwZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIocHJpbnRlciwgaSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIocHJpbnRlciwgaSk7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlVHlwZVJlZ2lzdHJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gUmVnaXN0ZXIgdGhpcyBtZXNzYWdlIHR5cGUgd2l0aCB0aGUgbWVzc2FnZSBmYWN0b3J5LgorICBwcmludGVyLT5QcmludCgKKyAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoXG4iCisgICAgIiAgJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl8sICYkY2xhc3NuYW1lJDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTtcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworCisgIC8vIEhhbmRsZSBuZXN0ZWQgdHlwZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVUeXBlUmVnaXN0cmF0aW9ucyhwcmludGVyKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gQ29uc3RydWN0IHRoZSBkZWZhdWx0IGluc3RhbmNlLiAgV2UgY2FuJ3QgY2FsbCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB5ZXQKKyAgLy8gYmVjYXVzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBhbGwgZGVmYXVsdCBpbnN0YW5jZXMgdGhhdCB0aGlzIG9uZSBtaWdodAorICAvLyBkZXBlbmQgb24gYXJlIGNvbnN0cnVjdGVkIGZpcnN0LgorICBwcmludGVyLT5QcmludCgKKyAgICAiJGNsYXNzbmFtZSQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3ICRjbGFzc25hbWUkKCk7XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKworICAvLyBIYW5kbGUgbmVzdGVkIHR5cGVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmYXVsdEluc3RhbmNlQWxsb2NhdG9yKHByaW50ZXIpOworICB9CisKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlRGVmYXVsdEluc3RhbmNlSW5pdGlhbGl6ZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiRjbGFzc25hbWUkOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKworICAvLyBSZWdpc3RlciBleHRlbnNpb25zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZVJlZ2lzdHJhdGlvbihwcmludGVyKTsKKyAgfQorCisgIC8vIEhhbmRsZSBuZXN0ZWQgdHlwZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VJbml0aWFsaXplcihwcmludGVyKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVTaHV0ZG93bkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImRlbGV0ZSAkY2xhc3NuYW1lJDo6ZGVmYXVsdF9pbnN0YW5jZV87XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJkZWxldGUgJGNsYXNzbmFtZSRfcmVmbGVjdGlvbl87XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICB9CisKKyAgLy8gSGFuZGxlIG5lc3RlZCB0eXBlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZVNodXRkb3duQ29kZShwcmludGVyKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVDbGFzc01ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlTWV0aG9kcyhwcmludGVyKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVDbGFzc01ldGhvZHMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgcHJpbnRlci0+UHJpbnQoa1RoaW5TZXBhcmF0b3IpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgbm9uLWlubGluZSBmaWVsZCBkZWZpbml0aW9ucy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKKyAgICAgICAgICAgICAgICAgICAgIC5HZW5lcmF0ZU5vbklubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMocHJpbnRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBmaWVsZCBudW1iZXIgY29uc3RhbnRzLgorICBwcmludGVyLT5QcmludCgiI2lmbmRlZiBfTVNDX1ZFUlxuIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciAqZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiY29uc3QgaW50ICRjbGFzc25hbWUkOjokY29uc3RhbnRfbmFtZSQ7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShGaWVsZFNjb3BlKGZpZWxkKSwgZmFsc2UpLAorICAgICAgImNvbnN0YW50X25hbWUiLCBGaWVsZENvbnN0YW50TmFtZShmaWVsZCkpOworICB9CisgIHByaW50ZXItPlByaW50KAorICAgICIjZW5kaWYgIC8vICFfTVNDX1ZFUlxuIgorICAgICJcbiIpOworCisgIC8vIERlZmluZSBleHRlbnNpb24gaWRlbnRpZmllcnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmaW5pdGlvbihwcmludGVyKTsKKyAgfQorCisgIEdlbmVyYXRlU3RydWN0b3JzKHByaW50ZXIpOworICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICBpZiAoSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIEdlbmVyYXRlQ2xlYXIocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgICBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgICAgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgICBpZiAoSGFzRmFzdEFycmF5U2VyaWFsaXphdGlvbihkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgICAgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHByaW50ZXIpOworICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgfQorCisgICAgR2VuZXJhdGVCeXRlU2l6ZShwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICAgIEdlbmVyYXRlTWVyZ2VGcm9tKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgICAgR2VuZXJhdGVDb3B5RnJvbShwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICAgIEdlbmVyYXRlSXNJbml0aWFsaXplZChwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCisgIEdlbmVyYXRlU3dhcChwcmludGVyKTsKKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSAkY2xhc3NuYW1lJDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7XG4iCisgICAgICAiICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTtcbiIKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7XG4iCisgICAgICAiICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl87XG4iCisgICAgICAiICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gJGNsYXNzbmFtZSRfcmVmbGVjdGlvbl87XG4iCisgICAgICAiICByZXR1cm4gbWV0YWRhdGE7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6OnN0ZDo6c3RyaW5nICRjbGFzc25hbWUkOjpHZXRUeXBlTmFtZSgpIGNvbnN0IHtcbiIKKyAgICAgICIgIHJldHVybiBcIiR0eXBlX25hbWUkXCI7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLAorICAgICAgInR5cGVfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7CisgIH0KKworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVPZmZzZXRzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJzdGF0aWMgY29uc3QgaW50ICRjbGFzc25hbWUkX29mZnNldHNfWyRmaWVsZF9jb3VudCRdID0ge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKKyAgICAiZmllbGRfY291bnQiLCBTaW1wbGVJdG9hKG1heCgxLCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSkpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKCRjbGFzc25hbWUkLCAkbmFtZSRfKSxcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKKyAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9O1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZVNoYXJlZENvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAidm9pZCAkY2xhc3NuYW1lJDo6U2hhcmVkQ3RvcigpIHtcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiX2NhY2hlZF9zaXplXyA9IDA7XG4iKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAgICAgICAgICAgICAgLkdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIjo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVTaGFyZWREZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAidm9pZCAkY2xhc3NuYW1lJDo6U2hhcmVkRHRvcigpIHtcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgLy8gV3JpdGUgdGhlIGRlc3RydWN0b3JzIGZvciBlYWNoIGZpZWxkLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAgICAgICAgICAgICAgLkdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUocHJpbnRlcik7CisgIH0KKworICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKKyAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgImlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7XG4iLAorICAgIC8vIFdpdGhvdXQuCisgICAgImlmICh0aGlzICE9ICZkZWZhdWx0X2luc3RhbmNlKCkpIHtcbiIpOworCisgIC8vIFdlIG5lZWQgdG8gZGVsZXRlIGFsbCBlbWJlZGRlZCBtZXNzYWdlcy4KKyAgLy8gVE9ETyhrZW50b24pOiAgSWYgd2UgbWFrZSB1bnNldCBtZXNzYWdlcyBwb2ludCBhdCBkZWZhdWx0IGluc3RhbmNlcworICAvLyAgIGluc3RlYWQgb2YgTlVMTCwgdGhlbiBpdCB3b3VsZCBtYWtlIHNlbnNlIHRvIG1vdmUgdGhpcyBjb2RlIGludG8KKyAgLy8gICBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUoKS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgICAgZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIHByaW50ZXItPlByaW50KCIgIGRlbGV0ZSAkbmFtZSRfO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgfQorICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAiICB9XG4iCisgICAgIn1cbiIKKyAgICAiXG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlU3RydWN0b3JzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHN0cmluZyBzdXBlcmNsYXNzID0gU3VwZXJDbGFzc05hbWUoZGVzY3JpcHRvcl8pOworCisgIC8vIEdlbmVyYXRlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICBwcmludGVyLT5QcmludCgKKyAgICAiJGNsYXNzbmFtZSQ6OiRjbGFzc25hbWUkKClcbiIKKyAgICAiICA6ICRzdXBlcmNsYXNzJCgpIHtcbiIKKyAgICAiICBTaGFyZWRDdG9yKCk7XG4iCisgICAgIn1cbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCisgICAgInN1cGVyY2xhc3MiLCBzdXBlcmNsYXNzKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiXG4iCisgICAgInZvaWQgJGNsYXNzbmFtZSQ6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHtcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworCisgIC8vIFRoZSBkZWZhdWx0IGluc3RhbmNlIG5lZWRzIGFsbCBvZiBpdHMgZW1iZWRkZWQgbWVzc2FnZSBwb2ludGVycworICAvLyBjcm9zcy1saW5rZWQgdG8gb3RoZXIgZGVmYXVsdCBpbnN0YW5jZXMuICBXZSBjYW4ndCBkbyB0aGlzIGluaXRpYWxpemF0aW9uCisgIC8vIGluIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIHNvbWUgb3RoZXIgZGVmYXVsdCBpbnN0YW5jZXMgbWF5IG5vdCBoYXZlIGJlZW4KKyAgLy8gY29uc3RydWN0ZWQgeWV0IGF0IHRoYXQgdGltZS4KKyAgLy8gVE9ETyhrZW50b24pOiAgTWF5YmUgYWxsIG1lc3NhZ2UgZmllbGRzIChldmVuIGZvciBub24tZGVmYXVsdCBtZXNzYWdlcykKKyAgLy8gICBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gcG9pbnQgYXQgZGVmYXVsdCBpbnN0YW5jZXMgcmF0aGVyIHRoYW4gTlVMTD8KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgICAgZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKKyAgICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKKyAgICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICAgICAgICAiICAkbmFtZSRfID0gY29uc3RfY2FzdDwgJHR5cGUkKj4oJiR0eXBlJDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTtcbiIsCisgICAgICAgIC8vIFdpdGhvdXQuCisgICAgICAgICIgICRuYW1lJF8gPSBjb25zdF9jYXN0PCAkdHlwZSQqPihcbiIKKyAgICAgICAgIiAgICAgICR0eXBlJDo6aW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpKTtcbiIsCisgICAgICAgIC8vIFZhcnMuCisgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSwKKyAgICAgICAgInR5cGUiLCBGaWVsZE1lc3NhZ2VUeXBlTmFtZShmaWVsZCkpOworICAgIH0KKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICAifVxuIgorICAgICJcbiIpOworCisgIC8vIEdlbmVyYXRlIHRoZSBjb3B5IGNvbnN0cnVjdG9yLgorICBwcmludGVyLT5QcmludCgKKyAgICAiJGNsYXNzbmFtZSQ6OiRjbGFzc25hbWUkKGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKVxuIgorICAgICIgIDogJHN1cGVyY2xhc3MkKCkge1xuIgorICAgICIgIFNoYXJlZEN0b3IoKTtcbiIKKyAgICAiICBNZXJnZUZyb20oZnJvbSk7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLAorICAgICJzdXBlcmNsYXNzIiwgc3VwZXJjbGFzcyk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNoYXJlZCBjb25zdHJ1Y3RvciBjb2RlLgorICBHZW5lcmF0ZVNoYXJlZENvbnN0cnVjdG9yQ29kZShwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgZGVzdHJ1Y3Rvci4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiRjbGFzc25hbWUkOjp+JGNsYXNzbmFtZSQoKSB7XG4iCisgICAgIiAgU2hhcmVkRHRvcigpO1xuIgorICAgICJ9XG4iCisgICAgIlxuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNoYXJlZCBkZXN0cnVjdG9yIGNvZGUuCisgIEdlbmVyYXRlU2hhcmVkRGVzdHJ1Y3RvckNvZGUocHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgU2V0Q2FjaGVkU2l6ZS4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInZvaWQgJGNsYXNzbmFtZSQ6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHtcbiIKKyAgICAiICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpO1xuIgorICAgICIgIF9jYWNoZWRfc2l6ZV8gPSBzaXplO1xuIgorICAgICIgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpO1xuIgorICAgICJ9XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKworICAvLyBPbmx5IGdlbmVyYXRlIHRoaXMgbWVtYmVyIGlmIGl0J3Mgbm90IGRpc2FibGVkLgorICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKKyAgICAgICFkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogJGNsYXNzbmFtZSQ6OmRlc2NyaXB0b3IoKSB7XG4iCisgICAgICAiICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTtcbiIKKyAgICAgICIgIHJldHVybiAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXztcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCisgICAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwKKyAgICAgIEdsb2JhbEFkZERlc2NyaXB0b3JzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpLT5uYW1lKCkpKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJjb25zdCAkY2xhc3NuYW1lJCYgJGNsYXNzbmFtZSQ6OmRlZmF1bHRfaW5zdGFuY2UoKSB7XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKworICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKKyAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgIiAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpICRhZGRkZXNjcmlwdG9yc25hbWUkKCk7XG4iLAorICAgIC8vIFdpdGhvdXQuCisgICAgIiAgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKTtcbiIsCisgICAgLy8gVmFycy4KKyAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwKKyAgICBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKS0+bmFtZSgpKSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXztcbiIKKyAgICAifVxuIgorICAgICJcbiIKKyAgICAiJGNsYXNzbmFtZSQqICRjbGFzc25hbWUkOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7XG4iCisgICAgIlxuIgorICAgICIkY2xhc3NuYW1lJCogJGNsYXNzbmFtZSQ6Ok5ldygpIGNvbnN0IHtcbiIKKyAgICAiICByZXR1cm4gbmV3ICRjbGFzc25hbWUkO1xuIgorICAgICJ9XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLAorICAgICJhZGRkZXNjcmlwdG9yc25hbWUiLAorICAgIEdsb2JhbEFkZERlc2NyaXB0b3JzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpLT5uYW1lKCkpKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ2xlYXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoInZvaWQgJGNsYXNzbmFtZSQ6OkNsZWFyKCkge1xuIiwKKyAgICAgICAgICAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBpbnQgbGFzdF9pbmRleCA9IC0xOworCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIl9leHRlbnNpb25zXy5DbGVhcigpO1xuIik7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworCisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgLy8gV2UgY2FuIHVzZSB0aGUgZmFjdCB0aGF0IF9oYXNfYml0c18gaXMgYSBnaWFudCBiaXRmaWVsZCB0byBvdXIKKyAgICAgIC8vIGFkdmFudGFnZTogIFdlIGNhbiBjaGVjayB1cCB0byAzMiBiaXRzIGF0IGEgdGltZSBmb3IgZXF1YWxpdHkgdG8KKyAgICAgIC8vIHplcm8sIGFuZCBza2lwIHRoZSB3aG9sZSByYW5nZSBpZiBzby4gIFRoaXMgY2FuIGltcHJvdmUgdGhlIHNwZWVkCisgICAgICAvLyBvZiBDbGVhcigpIGZvciBtZXNzYWdlcyB3aGljaCBjb250YWluIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YKKyAgICAgIC8vIG9wdGlvbmFsIGZpZWxkcyBvZiB3aGljaCBvbmx5IGEgZmV3IGFyZSB1c2VkIGF0IGEgdGltZS4gIEhlcmUsCisgICAgICAvLyB3ZSd2ZSBjaG9zZW4gdG8gY2hlY2sgOCBiaXRzIGF0IGEgdGltZSByYXRoZXIgdGhhbiAzMi4KKyAgICAgIGlmIChpIC8gOCAhPSBsYXN0X2luZGV4IC8gOCB8fCBsYXN0X2luZGV4IDwgMCkgeworICAgICAgICBpZiAobGFzdF9pbmRleCA+PSAwKSB7CisgICAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaWYgKF9oYXNfYml0c19bJGluZGV4JCAvIDMyXSAmICgweGZmdSA8PCAoJGluZGV4JCAlIDMyKSkpIHtcbiIsCisgICAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShmaWVsZC0+aW5kZXgoKSkpOworICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIH0KKyAgICAgIGxhc3RfaW5kZXggPSBpOworCisgICAgICAvLyBJdCdzIGZhc3RlciB0byBqdXN0IG92ZXJ3cml0ZSBwcmltaXRpdmUgdHlwZXMsIGJ1dCB3ZSBzaG91bGQKKyAgICAgIC8vIG9ubHkgY2xlYXIgc3RyaW5ncyBhbmQgbWVzc2FnZXMgaWYgdGhleSB3ZXJlIHNldC4KKyAgICAgIC8vIFRPRE8oa2VudG9uKTogIExldCB0aGUgQ3BwRmllbGRHZW5lcmF0b3IgZGVjaWRlIHRoaXMgc29tZWhvdy4KKyAgICAgIGJvb2wgc2hvdWxkX2NoZWNrX2JpdCA9CisgICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFIHx8CisgICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc7CisKKyAgICAgIGlmIChzaG91bGRfY2hlY2tfYml0KSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iLAorICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgfQorCisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQ2xlYXJpbmdDb2RlKHByaW50ZXIpOworCisgICAgICBpZiAoc2hvdWxkX2NoZWNrX2JpdCkgeworICAgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAobGFzdF9pbmRleCA+PSAwKSB7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgfQorCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBkb24ndCB1c2UgX2hhc19iaXRzXyBzbyB3ZSBjbGVhciB0aGVtIGluIGEgc2VwYXJhdGUKKyAgLy8gcGFzcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUNsZWFyaW5nQ29kZShwcmludGVyKTsKKyAgICB9CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTtcbiIpOworCisgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAibXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpO1xuIik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlU3dhcChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBHZW5lcmF0ZSB0aGUgU3dhcCBtZW1iZXIgZnVuY3Rpb24uCisgIHByaW50ZXItPlByaW50KCJ2b2lkICRjbGFzc25hbWUkOjpTd2FwKCRjbGFzc25hbWUkKiBvdGhlcikge1xuIiwKKyAgICAgICAgICAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoImlmIChvdGhlciAhPSB0aGlzKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlU3dhcHBpbmdDb2RlKHByaW50ZXIpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsgMzEpIC8gMzI7ICsraSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoInN0ZDo6c3dhcChfaGFzX2JpdHNfWyRpJF0sIG90aGVyLT5faGFzX2JpdHNfWyRpJF0pO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICJpIiwgU2ltcGxlSXRvYShpKSk7CisgICAgfQorCisgICAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTtcbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgic3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTtcbiIpOworICAgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgICBwcmludGVyLT5QcmludCgiX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pO1xuIik7CisgICAgfQorICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KCJHZXRSZWZsZWN0aW9uKCktPlN3YXAodGhpcywgb3RoZXIpOyIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnZUZyb20oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgLy8gR2VuZXJhdGUgdGhlIGdlbmVyYWxpemVkIE1lcmdlRnJvbSAoYWthIHRoYXQgd2hpY2ggdGFrZXMgaW4gdGhlIE1lc3NhZ2UKKyAgICAvLyBiYXNlIGNsYXNzIGFzIGEgcGFyYW1ldGVyKS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7XG4iCisgICAgICAiICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpO1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgIC8vIENhc3QgdGhlIG1lc3NhZ2UgdG8gdGhlIHByb3BlciB0eXBlLiBJZiB3ZSBmaW5kIHRoYXQgdGhlIG1lc3NhZ2UgaXMKKyAgICAvLyAqbm90KiBvZiB0aGUgcHJvcGVyIHR5cGUsIHdlIGNhbiBzdGlsbCBjYWxsIE1lcmdlIHZpYSB0aGUgcmVmbGVjdGlvbgorICAgIC8vIHN5c3RlbSwgYXMgdGhlIEdPT0dMRV9DSEVDSyBhYm92ZSBlbnN1cmVkIHRoYXQgd2UgaGF2ZSB0aGUgc2FtZSBkZXNjcmlwdG9yCisgICAgLy8gZm9yIGVhY2ggbWVzc2FnZS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJjb25zdCAkY2xhc3NuYW1lJCogc291cmNlID1cbiIKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgJGNsYXNzbmFtZSQqPihcbiIKKyAgICAgICIgICAgJmZyb20pO1xuIgorICAgICAgImlmIChzb3VyY2UgPT0gTlVMTCkge1xuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7XG4iCisgICAgICAifSBlbHNlIHtcbiIKKyAgICAgICIgIE1lcmdlRnJvbSgqc291cmNlKTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworCisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOworICB9IGVsc2UgeworICAgIC8vIEdlbmVyYXRlIENoZWNrVHlwZUFuZE1lcmdlRnJvbSgpLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OkNoZWNrVHlwZUFuZE1lcmdlRnJvbShcbiIKKyAgICAgICIgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSkge1xuIgorICAgICAgIiAgTWVyZ2VGcm9tKCo6Omdvb2dsZTo6cHJvdG9idWY6OmRvd25fY2FzdDxjb25zdCAkY2xhc3NuYW1lJCo+KCZmcm9tKSk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBjbGFzcy1zcGVjaWZpYyBNZXJnZUZyb20sIHdoaWNoIGF2b2lkcyB0aGUgR09PR0xFX0NIRUNLIGFuZCBjYXN0LgorICBwcmludGVyLT5QcmludCgKKyAgICAidm9pZCAkY2xhc3NuYW1lJDo6TWVyZ2VGcm9tKGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKSB7XG4iCisgICAgIiAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTtcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICAvLyBNZXJnZSBSZXBlYXRlZCBmaWVsZHMuIFRoZXNlIGZpZWxkcyBkbyBub3QgcmVxdWlyZSBhCisgIC8vIGNoZWNrIGFzIHdlIGNhbiBzaW1wbHkgaXRlcmF0ZSBvdmVyIHRoZW0uCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisKKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVNZXJnaW5nQ29kZShwcmludGVyKTsKKyAgICB9CisgIH0KKworICAvLyBNZXJnZSBPcHRpb25hbCBhbmQgUmVxdWlyZWQgZmllbGRzIChhZnRlciBhIF9oYXNfYml0IGNoZWNrKS4KKyAgaW50IGxhc3RfaW5kZXggPSAtMTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworCisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgLy8gU2VlIGFib3ZlIGluIEdlbmVyYXRlQ2xlYXIgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoaXMuCisgICAgICBpZiAoaSAvIDggIT0gbGFzdF9pbmRleCAvIDggfHwgbGFzdF9pbmRleCA8IDApIHsKKyAgICAgICAgaWYgKGxhc3RfaW5kZXggPj0gMCkgeworICAgICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgICAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImlmIChmcm9tLl9oYXNfYml0c19bJGluZGV4JCAvIDMyXSAmICgweGZmdSA8PCAoJGluZGV4JCAlIDMyKSkpIHtcbiIsCisgICAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShmaWVsZC0+aW5kZXgoKSkpOworICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIH0KKworICAgICAgbGFzdF9pbmRleCA9IGk7CisKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaWYgKGZyb20uaGFzXyRuYW1lJCgpKSB7XG4iLAorICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVNZXJnaW5nQ29kZShwcmludGVyKTsKKworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgIH0KKyAgfQorCisgIGlmIChsYXN0X2luZGV4ID49IDApIHsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICB9CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgiX2V4dGVuc2lvbnNfLk1lcmdlRnJvbShmcm9tLl9leHRlbnNpb25zXyk7XG4iKTsKKyAgfQorCisgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAibXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZUNvcHlGcm9tKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIC8vIEdlbmVyYXRlIHRoZSBnZW5lcmFsaXplZCBDb3B5RnJvbSAoYWthIHRoYXQgd2hpY2ggdGFrZXMgaW4gdGhlIE1lc3NhZ2UKKyAgICAvLyBiYXNlIGNsYXNzIGFzIGEgcGFyYW1ldGVyKS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuO1xuIgorICAgICAgIkNsZWFyKCk7XG4iCisgICAgICAiTWVyZ2VGcm9tKGZyb20pO1xuIik7CisKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgY2xhc3Mtc3BlY2lmaWMgQ29weUZyb20uCisgIHByaW50ZXItPlByaW50KAorICAgICJ2b2lkICRjbGFzc25hbWUkOjpDb3B5RnJvbShjb25zdCAkY2xhc3NuYW1lJCYgZnJvbSkge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuO1xuIgorICAgICJDbGVhcigpO1xuIgorICAgICJNZXJnZUZyb20oZnJvbSk7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgIC8vIFNwZWNpYWwtY2FzZSBNZXNzYWdlU2V0LgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgImJvb2wgJGNsYXNzbmFtZSQ6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShcbiIKKyAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBwcmludGVyLAorICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICAgICAgIiAgcmV0dXJuIF9leHRlbnNpb25zXy5QYXJzZU1lc3NhZ2VTZXQoaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKTtcbiIsCisgICAgICAvLyBXaXRob3V0LgorICAgICAgIiAgcmV0dXJuIF9leHRlbnNpb25zXy5QYXJzZU1lc3NhZ2VTZXQoaW5wdXQsICZkZWZhdWx0X2luc3RhbmNlKCksXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpO1xuIiwKKyAgICAgIC8vIFZhcnMuCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9XG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiYm9vbCAkY2xhc3NuYW1lJDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKFxuIgorICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHtcbiIKKyAgICAiI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZVxuIgorICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZztcbiIKKyAgICAiICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHtcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworCisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgPiAwKSB7CisgICAgLy8gV2UgZG9uJ3QgZXZlbiB3YW50IHRvIHByaW50IHRoZSBzd2l0Y2goKSBpZiB3ZSBoYXZlIG5vIGZpZWxkcyBiZWNhdXNlCisgICAgLy8gTVNWQyBkaXNsaWtlcyBzd2l0Y2goKSBzdGF0ZW1lbnRzIHRoYXQgY29udGFpbiBvbmx5IGEgZGVmYXVsdCB2YWx1ZS4KKworICAgIC8vIE5vdGU6ICBJZiB3ZSBqdXN0IHN3aXRjaGVkIG9uIHRoZSB0YWcgcmF0aGVyIHRoYW4gdGhlIGZpZWxkIG51bWJlciwgd2UKKyAgICAvLyBjb3VsZCBhdm9pZCB0aGUgbmVlZCBmb3IgdGhlIGlmKCkgdG8gY2hlY2sgdGhlIHdpcmUgdHlwZSBhdCB0aGUgYmVnaW5uaW5nCisgICAgLy8gb2YgZWFjaCBjYXNlLiAgSG93ZXZlciwgdGhpcyBpcyBhY3R1YWxseSBhIGJpdCBzbG93ZXIgaW4gcHJhY3RpY2UgYXMgaXQKKyAgICAvLyBjcmVhdGVzIGEganVtcCB0YWJsZSB0aGF0IGlzIDh4IGxhcmdlciBhbmQgc3BhcnNlciwgYW5kIG1lYW53aGlsZSB0aGUKKyAgICAvLyBpZigpcyBhcmUgaGlnaGx5IHByZWRpY3RhYmxlLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgInN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHtcbiIpOworCisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICBzY29wZWRfYXJyYXk8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3JkZXJlZF9maWVsZHMoCisgICAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG9yZGVyZWRfZmllbGRzW2ldOworCisgICAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7CisKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiY2FzZSAkbnVtYmVyJDoge1xuIiwKKyAgICAgICAgIm51bWJlciIsIFNpbXBsZUl0b2EoZmllbGQtPm51bWJlcigpKSk7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9yJiBmaWVsZF9nZW5lcmF0b3IgPSBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpOworCisgICAgICAvLyBFbWl0IGNvZGUgdG8gcGFyc2UgdGhlIGNvbW1vbiwgZXhwZWN0ZWQgY2FzZS4KKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09XG4iCisgICAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFXyR3aXJldHlwZSQpIHtcbiIsCisgICAgICAgICJ3aXJldHlwZSIsIGtXaXJlVHlwZU5hbWVzW1dpcmVGb3JtYXQ6OldpcmVUeXBlRm9yRmllbGQoZmllbGQpXSk7CisKKyAgICAgIGlmIChpID4gMCB8fCAoZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgIWZpZWxkLT5vcHRpb25zKCkucGFja2VkKCkpKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIgcGFyc2VfJG5hbWUkOlxuIiwKKyAgICAgICAgICAibmFtZSIsIGZpZWxkLT5uYW1lKCkpOworICAgICAgfQorCisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIGlmIChmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgICAgIGZpZWxkX2dlbmVyYXRvci5HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcocHJpbnRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWVsZF9nZW5lcmF0b3IuR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShwcmludGVyKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKworICAgICAgLy8gRW1pdCBjb2RlIHRvIHBhcnNlIHVuZXhwZWN0ZWRseSBwYWNrZWQgb3IgdW5wYWNrZWQgdmFsdWVzLgorICAgICAgaWYgKGZpZWxkLT5pc19wYWNrYWJsZSgpICYmIGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIn0gZWxzZSBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZylcbiIKKyAgICAgICAgICAiICAgICAgICAgICA9PSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6XG4iCisgICAgICAgICAgIiAgICAgICAgICAgICAgV0lSRVRZUEVfJHdpcmV0eXBlJCkge1xuIiwKKyAgICAgICAgICAid2lyZXR5cGUiLAorICAgICAgICAgIGtXaXJlVHlwZU5hbWVzW1dpcmVGb3JtYXQ6OldpcmVUeXBlRm9yRmllbGRUeXBlKGZpZWxkLT50eXBlKCkpXSk7CisgICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgICBmaWVsZF9nZW5lcmF0b3IuR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShwcmludGVyKTsKKyAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgfSBlbHNlIGlmIChmaWVsZC0+aXNfcGFja2FibGUoKSAmJiAhZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAifSBlbHNlIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKVxuIgorICAgICAgICAgICIgICAgICAgICAgID09IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKKyAgICAgICAgICAiICAgICAgICAgICAgICBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7XG4iKTsKKyAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICAgIGZpZWxkX2dlbmVyYXRvci5HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcocHJpbnRlcik7CisgICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgIH0KKworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ9IGVsc2Uge1xuIgorICAgICAgICAiICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkO1xuIgorICAgICAgICAifVxuIik7CisKKyAgICAgIC8vIHN3aXRjaCgpIGlzIHNsb3cgc2luY2UgaXQgY2FuJ3QgYmUgcHJlZGljdGVkIHdlbGwuICBJbnNlcnQgc29tZSBpZigpcworICAgICAgLy8gaGVyZSB0aGF0IGF0dGVtcHQgdG8gcHJlZGljdCB0aGUgbmV4dCB0YWcuCisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgIWZpZWxkLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICAgICAgLy8gRXhwZWN0IHJlcGVhdHMgb2YgdGhpcyBmaWVsZC4KKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImlmIChpbnB1dC0+RXhwZWN0VGFnKCR0YWckKSkgZ290byBwYXJzZV8kbmFtZSQ7XG4iLAorICAgICAgICAgICJ0YWciLCBTaW1wbGVJdG9hKFdpcmVGb3JtYXQ6Ok1ha2VUYWcoZmllbGQpKSwKKyAgICAgICAgICAibmFtZSIsIGZpZWxkLT5uYW1lKCkpOworICAgICAgfQorCisgICAgICBpZiAoaSArIDEgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSkgeworICAgICAgICAvLyBFeHBlY3QgdGhlIG5leHQgZmllbGQgaW4gb3JkZXIuCisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbmV4dF9maWVsZCA9IG9yZGVyZWRfZmllbGRzW2kgKyAxXTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImlmIChpbnB1dC0+RXhwZWN0VGFnKCRuZXh0X3RhZyQpKSBnb3RvIHBhcnNlXyRuZXh0X25hbWUkO1xuIiwKKyAgICAgICAgICAibmV4dF90YWciLCBTaW1wbGVJdG9hKFdpcmVGb3JtYXQ6Ok1ha2VUYWcobmV4dF9maWVsZCkpLAorICAgICAgICAgICJuZXh0X25hbWUiLCBuZXh0X2ZpZWxkLT5uYW1lKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRXhwZWN0IEVPRi4KKyAgICAgICAgLy8gVE9ETyhrZW50b24pOiAgRXhwZWN0IGdyb3VwIGVuZC10YWc/CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlO1xuIik7CisgICAgICB9CisKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiYnJlYWs7XG4iKTsKKworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiZGVmYXVsdDoge1xuIgorICAgICAgImhhbmRsZV91bmludGVycHJldGVkOlxuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgIH0KKworICAvLyBJcyB0aGlzIGFuIGVuZC1ncm91cCB0YWc/ICBJZiBzbywgdGhpcyBtdXN0IGJlIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UuCisgIHByaW50ZXItPlByaW50KAorICAgICJpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT1cbiIKKyAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHtcbiIKKyAgICAiICByZXR1cm4gdHJ1ZTtcbiIKKyAgICAifVxuIik7CisKKyAgLy8gSGFuZGxlIGV4dGVuc2lvbiByYW5nZXMuCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiaWYgKCIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZSA9CisgICAgICAgIGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2UoaSk7CisgICAgICBpZiAoaSA+IDApIHByaW50ZXItPlByaW50KCIgfHxcbiAgICAiKTsKKworICAgICAgdWludDMyIHN0YXJ0X3RhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICByYW5nZS0+c3RhcnQsIHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZT4oMCkpOworICAgICAgdWludDMyIGVuZF90YWcgPSBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKKyAgICAgICAgcmFuZ2UtPmVuZCwgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OldpcmVUeXBlPigwKSk7CisKKyAgICAgIGlmIChyYW5nZS0+ZW5kID4gRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIoJHN0YXJ0JHUgPD0gdGFnKSIsCisgICAgICAgICAgInN0YXJ0IiwgU2ltcGxlSXRvYShzdGFydF90YWcpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIoJHN0YXJ0JHUgPD0gdGFnICYmIHRhZyA8ICRlbmQkdSkiLAorICAgICAgICAgICJzdGFydCIsIFNpbXBsZUl0b2Eoc3RhcnRfdGFnKSwKKyAgICAgICAgICAiZW5kIiwgU2ltcGxlSXRvYShlbmRfdGFnKSk7CisgICAgICB9CisgICAgfQorICAgIHByaW50ZXItPlByaW50KCIpIHtcbiIpOworICAgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgICAgIGRlc2NyaXB0b3JfLT5maWxlKCksIHByaW50ZXIsCisgICAgICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KKyAgICAgICAgIiAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLFxuIgorICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7XG4iLAorICAgICAgICAvLyBXaXRob3V0LgorICAgICAgICAiICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgJmRlZmF1bHRfaW5zdGFuY2UoKSxcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKKyAgICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKKyAgICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICAgICAgICAiICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sIE5VTEwpKTtcbiIsCisgICAgICAgIC8vIFdpdGhvdXQuCisgICAgICAgICIgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCAmZGVmYXVsdF9pbnN0YW5jZSgpLCBOVUxMKSk7XG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICBjb250aW51ZTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorCisgIC8vIFdlIHJlYWxseSBkb24ndCByZWNvZ25pemUgdGhpcyB0YWcuICBTa2lwIGl0LgorICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgTlVMTCkpO1xuIik7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoImJyZWFrO1xuIik7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsgICAgLy8gZGVmYXVsdDoKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOyAgICAvLyBzd2l0Y2gKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAiICB9XG4iICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlCisgICAgIiAgcmV0dXJuIHRydWU7XG4iCisgICAgIiN1bmRlZiBET19cbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZCgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgYm9vbCB0b19hcnJheSkgeworICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7CisKKyAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgImlmIChoYXNfJG5hbWUkKCkpIHtcbiIsCisgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgIHByaW50ZXItPkluZGVudCgpOworICB9CisKKyAgaWYgKHRvX2FycmF5KSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICAgIHByaW50ZXIpOworICB9IGVsc2UgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMocHJpbnRlcik7CisgIH0KKworICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgiXG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZU9uZUV4dGVuc2lvblJhbmdlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UsCisgICAgYm9vbCB0b19hcnJheSkgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbInN0YXJ0Il0gPSBTaW1wbGVJdG9hKHJhbmdlLT5zdGFydCk7CisgIHZhcnNbImVuZCJdID0gU2ltcGxlSXRvYShyYW5nZS0+ZW5kKTsKKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAiLy8gRXh0ZW5zaW9uIHJhbmdlIFskc3RhcnQkLCAkZW5kJClcbiIpOworICBpZiAodG9fYXJyYXkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgInRhcmdldCA9IF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KFxuIgorICAgICAgIiAgICAkc3RhcnQkLCAkZW5kJCwgdGFyZ2V0KTtcblxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKFxuIgorICAgICAgIiAgICAkc3RhcnQkLCAkZW5kJCwgb3V0cHV0KTtcblxuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAvLyBTcGVjaWFsLWNhc2UgTWVzc2FnZVNldC4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoXG4iCisgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHtcbiIKKyAgICAgICIgIF9leHRlbnNpb25zXy5TZXJpYWxpemVNZXNzYWdlU2V0V2l0aENhY2hlZFNpemVzKG91dHB1dCk7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICAgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoXG4iCisgICAgICAgICIgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpO1xuIik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgIn1cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJ2b2lkICRjbGFzc25hbWUkOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoXG4iCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNCb2R5KHByaW50ZXIsIGZhbHNlKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgLy8gU3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogJGNsYXNzbmFtZSQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoXG4iCisgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3Qge1xuIgorICAgICAgIiAgdGFyZ2V0ID1cbiIKKyAgICAgICIgICAgICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgICAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6XG4iCisgICAgICAgICIgICAgICAgICAgICAgU2VyaWFsaXplVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1RvQXJyYXkoXG4iCisgICAgICAgICIgICAgICAgICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpO1xuIik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiAgcmV0dXJuIHRhcmdldDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogJGNsYXNzbmFtZSQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoXG4iCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHtcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc0JvZHkocHJpbnRlciwgdHJ1ZSk7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAiICByZXR1cm4gdGFyZ2V0O1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzQm9keShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB0b19hcnJheSkgeworICBzY29wZWRfYXJyYXk8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3JkZXJlZF9maWVsZHMoCisgICAgU29ydEZpZWxkc0J5TnVtYmVyKGRlc2NyaXB0b3JfKSk7CisKKyAgdmVjdG9yPGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKj4gc29ydGVkX2V4dGVuc2lvbnM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyArK2kpIHsKKyAgICBzb3J0ZWRfZXh0ZW5zaW9ucy5wdXNoX2JhY2soZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZShpKSk7CisgIH0KKyAgc29ydChzb3J0ZWRfZXh0ZW5zaW9ucy5iZWdpbigpLCBzb3J0ZWRfZXh0ZW5zaW9ucy5lbmQoKSwKKyAgICAgICBFeHRlbnNpb25SYW5nZVNvcnRlcigpKTsKKworICAvLyBNZXJnZSB0aGUgZmllbGRzIGFuZCB0aGUgZXh0ZW5zaW9uIHJhbmdlcywgYm90aCBzb3J0ZWQgYnkgZmllbGQgbnVtYmVyLgorICBpbnQgaSwgajsKKyAgZm9yIChpID0gMCwgaiA9IDA7CisgICAgICAgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpIHx8IGogPCBzb3J0ZWRfZXh0ZW5zaW9ucy5zaXplKCk7CisgICAgICAgKSB7CisgICAgaWYgKGkgPT0gZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkpIHsKKyAgICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UocHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkX2V4dGVuc2lvbnNbaisrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fYXJyYXkpOworICAgIH0gZWxzZSBpZiAoaiA9PSBzb3J0ZWRfZXh0ZW5zaW9ucy5zaXplKCkpIHsKKyAgICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQocHJpbnRlciwgb3JkZXJlZF9maWVsZHNbaSsrXSwgdG9fYXJyYXkpOworICAgIH0gZWxzZSBpZiAob3JkZXJlZF9maWVsZHNbaV0tPm51bWJlcigpIDwgc29ydGVkX2V4dGVuc2lvbnNbal0tPnN0YXJ0KSB7CisgICAgICBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUZpZWxkKHByaW50ZXIsIG9yZGVyZWRfZmllbGRzW2krK10sIHRvX2FycmF5KTsKKyAgICB9IGVsc2UgeworICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZShwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRfZXh0ZW5zaW9uc1tqKytdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19hcnJheSk7CisgICAgfQorICB9CisKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCgiaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHtcbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGlmICh0b19hcnJheSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ0YXJnZXQgPSAiCisgICAgICAgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KFxuIgorICAgICAgICAiICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcyhcbiIKKyAgICAgICAgIiAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpO1xuIik7CisgICAgfQorICAgIHByaW50ZXItPk91dGRlbnQoKTsKKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAvLyBTcGVjaWFsLWNhc2UgTWVzc2FnZVNldC4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJpbnQgJGNsYXNzbmFtZSQ6OkJ5dGVTaXplKCkgY29uc3Qge1xuIgorICAgICAgIiAgaW50IHRvdGFsX3NpemUgPSBfZXh0ZW5zaW9uc18uTWVzc2FnZVNldEJ5dGVTaXplKCk7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICAgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6XG4iCisgICAgICAgICIgICAgICBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUodW5rbm93bl9maWVsZHMoKSk7XG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpO1xuIgorICAgICAgIiAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7XG4iCisgICAgICAiICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTtcbiIKKyAgICAgICIgIHJldHVybiB0b3RhbF9zaXplO1xuIgorICAgICAgIn1cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJpbnQgJGNsYXNzbmFtZSQ6OkJ5dGVTaXplKCkgY29uc3Qge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAiaW50IHRvdGFsX3NpemUgPSAwO1xuIgorICAgICJcbiIpOworCisgIGludCBsYXN0X2luZGV4ID0gLTE7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIC8vIFNlZSBhYm92ZSBpbiBHZW5lcmF0ZUNsZWFyIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzLgorICAgICAgLy8gVE9ETyhrZW50b24pOiAgU2hhcmUgY29kZT8gIFVuY2xlYXIgaG93IHRvIGRvIHNvIHdpdGhvdXQKKyAgICAgIC8vICAgb3Zlci1lbmdpbmVlcmluZy4KKyAgICAgIGlmICgoaSAvIDgpICE9IChsYXN0X2luZGV4IC8gOCkgfHwKKyAgICAgICAgICBsYXN0X2luZGV4IDwgMCkgeworICAgICAgICBpZiAobGFzdF9pbmRleCA+PSAwKSB7CisgICAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaWYgKF9oYXNfYml0c19bJGluZGV4JCAvIDMyXSAmICgweGZmdSA8PCAoJGluZGV4JCAlIDMyKSkpIHtcbiIsCisgICAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShmaWVsZC0+aW5kZXgoKSkpOworICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIH0KKyAgICAgIGxhc3RfaW5kZXggPSBpOworCisgICAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7CisKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaWYgKGhhc18kbmFtZSQoKSkge1xuIiwKKyAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworCisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQnl0ZVNpemUocHJpbnRlcik7CisKKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAifVxuIgorICAgICAgICAiXG4iKTsKKyAgICB9CisgIH0KKworICBpZiAobGFzdF9pbmRleCA+PSAwKSB7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgfQorCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBkb24ndCB1c2UgX2hhc19iaXRzXyBzbyB3ZSBjb3VudCB0aGVtIGluIGEgc2VwYXJhdGUKKyAgLy8gcGFzcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUJ5dGVTaXplKHByaW50ZXIpOworICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgfQorICB9CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ0b3RhbF9zaXplICs9IF9leHRlbnNpb25zXy5CeXRlU2l6ZSgpO1xuIgorICAgICAgIlxuIik7CisgIH0KKworICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KCJpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkge1xuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAidG90YWxfc2l6ZSArPVxuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZShcbiIKKyAgICAgICIgICAgdW5rbm93bl9maWVsZHMoKSk7XG4iKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICB9CisKKyAgLy8gV2UgdXBkYXRlIF9jYWNoZWRfc2l6ZV8gZXZlbiB0aG91Z2ggdGhpcyBpcyBhIGNvbnN0IG1ldGhvZC4gIEluIHRoZW9yeSwKKyAgLy8gdGhpcyBpcyBub3QgdGhyZWFkLWNvbXBhdGlibGUsIGJlY2F1c2UgY29uY3VycmVudCB3cml0ZXMgaGF2ZSB1bmRlZmluZWQKKyAgLy8gcmVzdWx0cy4gIEluIHByYWN0aWNlLCBzaW5jZSBhbnkgY29uY3VycmVudCB3cml0ZXMgd2lsbCBiZSB3cml0aW5nIHRoZQorICAvLyBleGFjdCBzYW1lIHZhbHVlLCBpdCB3b3JrcyBvbiBhbGwgY29tbW9uIHByb2Nlc3NvcnMuICBJbiBhIGZ1dHVyZSB2ZXJzaW9uCisgIC8vIG9mIEMrKywgX2NhY2hlZF9zaXplXyBzaG91bGQgYmUgbWFkZSBpbnRvIGFuIGF0b21pYzxpbnQ+LgorICBwcmludGVyLT5QcmludCgKKyAgICAiR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTtcbiIKKyAgICAiX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7XG4iCisgICAgIkdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpO1xuIgorICAgICJyZXR1cm4gdG90YWxfc2l6ZTtcbiIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVJc0luaXRpYWxpemVkKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJib29sICRjbGFzc25hbWUkOjpJc0luaXRpYWxpemVkKCkgY29uc3Qge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgYXJlIHNldC4gIFdlIGNhbiBkbyB0aGlzCisgIC8vIG1vc3QgZWZmaWNpZW50bHkgYnkgY2hlY2tpbmcgMzIgImhhcyBiaXRzIiBhdCBhIHRpbWUuCisgIGludCBoYXNfYml0c19hcnJheV9zaXplID0gKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsgMzEpIC8gMzI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFzX2JpdHNfYXJyYXlfc2l6ZTsgaSsrKSB7CisgICAgdWludDMyIG1hc2sgPSAwOworICAgIGZvciAoaW50IGJpdCA9IDA7IGJpdCA8IDMyOyBiaXQrKykgeworICAgICAgaW50IGluZGV4ID0gaSAqIDMyICsgYml0OworICAgICAgaWYgKGluZGV4ID49IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpKSBicmVhazsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaW5kZXgpOworCisgICAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKKyAgICAgICAgbWFzayB8PSAxIDw8IGJpdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWFzayAhPSAwKSB7CisgICAgICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImlmICgoX2hhc19iaXRzX1skaSRdICYgMHgkbWFzayQpICE9IDB4JG1hc2skKSByZXR1cm4gZmFsc2U7XG4iLAorICAgICAgICAiaSIsIFNpbXBsZUl0b2EoaSksCisgICAgICAgICJtYXNrIiwgRmFzdEhleDMyVG9CdWZmZXIobWFzaywgYnVmZmVyKSk7CisgICAgfQorICB9CisKKyAgLy8gTm93IGNoZWNrIHRoYXQgYWxsIGVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBpbml0aWFsaXplZC4KKyAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCisgICAgICAgIEhhc1JlcXVpcmVkRmllbGRzKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAgICAgICAiICBpZiAoIXRoaXMtPiRuYW1lJChpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImlmIChoYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICAgICAiICBpZiAoIXRoaXMtPiRuYW1lJCgpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJcbiIKKyAgICAgICJpZiAoIV9leHRlbnNpb25zXy5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsiKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgcmV0dXJuIHRydWU7XG4iCisgICAgIn1cbiIpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Nzc4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaApAQCAtMCwwICsxLDE3MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9NRVNTQUdFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgbmFtZXNwYWNlIGlvIHsKKyAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKKyAgfQorfQorCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBFbnVtR2VuZXJhdG9yOyAgICAgICAgICAgLy8gZW51bS5oCitjbGFzcyBFeHRlbnNpb25HZW5lcmF0b3I7ICAgICAgLy8gZXh0ZW5zaW9uLmgKKworY2xhc3MgTWVzc2FnZUdlbmVyYXRvciB7CisgcHVibGljOgorICAvLyBTZWUgZ2VuZXJhdG9yLmNjIGZvciB0aGUgbWVhbmluZyBvZiBkbGxleHBvcnRfZGVjbC4KKyAgZXhwbGljaXQgTWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGxsZXhwb3J0X2RlY2wpOworICB+TWVzc2FnZUdlbmVyYXRvcigpOworCisgIC8vIEhlYWRlciBzdHVmZi4KKworICAvLyBHZW5lcmF0ZSBmb3dhcmQgZGVjbGFyYXRpb25zIGZvciB0aGlzIGNsYXNzIGFuZCBhbGwgaXRzIG5lc3RlZCB0eXBlcy4KKyAgdm9pZCBHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgZGVmaW5pdGlvbnMgb2YgYWxsIG5lc3RlZCBlbnVtcyAobXVzdCBjb21lIGJlZm9yZSBjbGFzcworICAvLyBkZWZpbml0aW9ucyBiZWNhdXNlIHRob3NlIGNsYXNzZXMgdXNlIHRoZSBlbnVtcyBkZWZpbml0aW9ucykuCisgIHZvaWQgR2VuZXJhdGVFbnVtRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHNwZWNpYWxpemF0aW9ucyBvZiBHZXRFbnVtRGVzY3JpcHRvcjxNeUVudW0+KCkuCisgIC8vIFByZWNvbmRpdGlvbjogaW4gOjpnb29nbGU6OnByb3RvYnVmIG5hbWVzcGFjZS4KKyAgdm9pZCBHZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBkZWZpbml0aW9ucyBmb3IgdGhpcyBjbGFzcyBhbmQgYWxsIGl0cyBuZXN0ZWQgdHlwZXMuCisgIHZvaWQgR2VuZXJhdGVDbGFzc0RlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGRlZmluaXRpb25zIG9mIGlubGluZSBtZXRob2RzIChwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyCisgIC8vIGZpbGUpLgorICB2b2lkIEdlbmVyYXRlSW5saW5lTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gU291cmNlIGZpbGUgc3R1ZmYuCisKKyAgLy8gR2VuZXJhdGUgY29kZSB3aGljaCBkZWNsYXJlcyBhbGwgdGhlIGdsb2JhbCBkZXNjcmlwdG9yIHBvaW50ZXJzIHdoaWNoCisgIC8vIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYnkgdGhlIG1ldGhvZHMgYmVsb3cuCisgIHZvaWQgR2VuZXJhdGVEZXNjcmlwdG9yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGdsb2JhbCB2YXJpYWJsZSBzdG9yaW5nIHRoZSBtZXNzYWdlJ3MKKyAgLy8gZGVzY3JpcHRvci4KKyAgdm9pZCBHZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlciwgaW50IGluZGV4KTsKKworICAvLyBHZW5lcmF0ZSBjb2RlIHRoYXQgY2FsbHMgTWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKCkKKyAgLy8gZm9yIGFsbCB0eXBlcy4KKyAgdm9pZCBHZW5lcmF0ZVR5cGVSZWdpc3RyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZXMgY29kZSB0aGF0IGFsbG9jYXRlcyB0aGUgbWVzc2FnZSdzIGRlZmF1bHQgaW5zdGFuY2UuCisgIHZvaWQgR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlcyBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIG1lc3NhZ2UncyBkZWZhdWx0IGluc3RhbmNlLiAgVGhpcworICAvLyBpcyBzZXBhcmF0ZSBmcm9tIGFsbG9jYXRpbmcgYmVjYXVzZSBhbGwgZGVmYXVsdCBpbnN0YW5jZXMgbXVzdCBiZQorICAvLyBhbGxvY2F0ZWQgYmVmb3JlIGFueSBjYW4gYmUgaW5pdGlhbGl6ZWQuCisgIHZvaWQgR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGVzIGNvZGUgdGhhdCBzaG91bGQgYmUgcnVuIHdoZW4gU2h1dGRvd25Qcm90b2J1ZkxpYnJhcnkoKSBpcyBjYWxsZWQsCisgIC8vIHRvIGRlbGV0ZSBhbGwgZHluYW1pY2FsbHktYWxsb2NhdGVkIG9iamVjdHMuCisgIHZvaWQgR2VuZXJhdGVTaHV0ZG93bkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGFsbCBub24taW5saW5lIG1ldGhvZHMgZm9yIHRoaXMgY2xhc3MuCisgIHZvaWQgR2VuZXJhdGVDbGFzc01ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgcHJpdmF0ZToKKyAgLy8gR2VuZXJhdGUgZGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBvZiBhY2Nlc3NvcnMgZm9yIGZpZWxkcy4KKyAgdm9pZCBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlRmllbGRBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgZmllbGQgb2Zmc2V0cyBhcnJheS4KKyAgdm9pZCBHZW5lcmF0ZU9mZnNldHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3Rvci4KKyAgdm9pZCBHZW5lcmF0ZVN0cnVjdG9ycyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gVGhlIGNvbXBpbGVyIHR5cGljYWxseSBnZW5lcmF0ZXMgbXVsdGlwbGUgY29waWVzIG9mIGVhY2ggY29uc3RydWN0b3IgYW5kCisgIC8vIGRlc3RydWN0b3I6IGh0dHA6Ly9nY2MuZ251Lm9yZy9idWdzLmh0bWwjbm9uYnVnc19jeHgKKyAgLy8gUGxhY2luZyBjb21tb24gY29kZSBpbiBhIHNlcGFyYXRlIG1ldGhvZCByZWR1Y2VzIHRoZSBnZW5lcmF0ZWQgY29kZSBzaXplLgorICAvLworICAvLyBHZW5lcmF0ZSB0aGUgc2hhcmVkIGNvbnN0cnVjdG9yIGNvZGUuCisgIHZvaWQgR2VuZXJhdGVTaGFyZWRDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworICAvLyBHZW5lcmF0ZSB0aGUgc2hhcmVkIGRlc3RydWN0b3IgY29kZS4KKyAgdm9pZCBHZW5lcmF0ZVNoYXJlZERlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBzdGFuZGFyZCBNZXNzYWdlIG1ldGhvZHMuCisgIHZvaWQgR2VuZXJhdGVDbGVhcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNCb2R5KGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRvX2FycmF5KTsKKyAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVDb3B5RnJvbShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVTd2FwKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEhlbHBlcnMgZm9yIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkuCisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVuYm91bmRlZCk7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZSgKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UsCisgICAgICBib29sIHVuYm91bmRlZCk7CisKKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgc3RyaW5nIGNsYXNzbmFtZV87CisgIHN0cmluZyBkbGxleHBvcnRfZGVjbF87CisgIEZpZWxkR2VuZXJhdG9yTWFwIGZpZWxkX2dlbmVyYXRvcnNfOworICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxNZXNzYWdlR2VuZXJhdG9yPiA+IG5lc3RlZF9nZW5lcmF0b3JzXzsKKyAgc2NvcGVkX2FycmF5PHNjb3BlZF9wdHI8RW51bUdlbmVyYXRvcj4gPiBlbnVtX2dlbmVyYXRvcnNfOworICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxFeHRlbnNpb25HZW5lcmF0b3I+ID4gZXh0ZW5zaW9uX2dlbmVyYXRvcnNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXNzYWdlR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9NRVNTQUdFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNzg1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuY2MKQEAgLTAsMCArMSwyODUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworbmFtZXNwYWNlIHsKKwordm9pZCBTZXRNZXNzYWdlVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgdmFyaWFibGVzKTsKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPSBGaWVsZE1lc3NhZ2VUeXBlTmFtZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJzdHJlYW1fd3JpdGVyIl0gPSAoKnZhcmlhYmxlcylbImRlY2xhcmVkX3R5cGUiXSArCisgICAgICAoSGFzRmFzdEFycmF5U2VyaWFsaXphdGlvbihkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKS0+ZmlsZSgpKSA/CisgICAgICAgIk1heWJlVG9BcnJheSIgOgorICAgICAgICIiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK01lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBTZXRNZXNzYWdlVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKK30KKworTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjp+TWVzc2FnZUZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJHR5cGUkKiAkbmFtZSRfO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0ICR0eXBlJCYgJG5hbWUkKCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgJHR5cGUkKiBtdXRhYmxlXyRuYW1lJCgpJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lICR0eXBlJCogcmVsZWFzZV8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSBjb25zdCAkdHlwZSQmICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iKTsKKworICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgdmFyaWFibGVzXywgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKKyAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgIiAgcmV0dXJuICRuYW1lJF8gIT0gTlVMTCA/ICokbmFtZSRfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT4kbmFtZSRfO1xuIiwKKyAgICAvLyBXaXRob3V0LgorICAgICIgIHJldHVybiAkbmFtZSRfICE9IE5VTEwgPyAqJG5hbWUkXyA6ICpkZWZhdWx0X2luc3RhbmNlKCkuJG5hbWUkXztcbiIpOworCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIn1cbiIKKyAgICAiaW5saW5lICR0eXBlJCogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICIgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgIiAgaWYgKCRuYW1lJF8gPT0gTlVMTCkgJG5hbWUkXyA9IG5ldyAkdHlwZSQ7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lICR0eXBlJCogJGNsYXNzbmFtZSQ6OnJlbGVhc2VfJG5hbWUkKCkge1xuIgorICAgICIgIGNsZWFyX2hhc18kbmFtZSQoKTtcbiIKKyAgICAiICAkdHlwZSQqIHRlbXAgPSAkbmFtZSRfO1xuIgorICAgICIgICRuYW1lJF8gPSBOVUxMO1xuIgorICAgICIgIHJldHVybiB0ZW1wO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCRuYW1lJF8gIT0gTlVMTCkgJG5hbWUkXy0+JHR5cGUkOjpDbGVhcigpO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAibXV0YWJsZV8kbmFtZSQoKS0+JHR5cGUkOjpNZXJnZUZyb20oZnJvbS4kbmFtZSQoKSk7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInN0ZDo6c3dhcCgkbmFtZSRfLCBvdGhlci0+JG5hbWUkXyk7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSBOVUxMO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoXG4iCisgICAgICAiICAgICBpbnB1dCwgbXV0YWJsZV8kbmFtZSQoKSkpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRHcm91cE5vVmlydHVhbChcbiIKKyAgICAgICIgICAgICAkbnVtYmVyJCwgaW5wdXQsIG11dGFibGVfJG5hbWUkKCkpKTtcbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZSRzdHJlYW1fd3JpdGVyJChcbiIKKyAgICAiICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKCksIG91dHB1dCk7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKKyAgICAiICBXcml0ZSRkZWNsYXJlZF90eXBlJE5vVmlydHVhbFRvQXJyYXkoXG4iCisgICAgIiAgICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKCksIHRhcmdldCk7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgK1xuIgorICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjokZGVjbGFyZWRfdHlwZSRTaXplTm9WaXJ0dWFsKFxuIgorICAgICIgICAgdGhpcy0+JG5hbWUkKCkpO1xuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKKyAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7Cit9CisKK1JlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPiAkbmFtZSRfO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgY29uc3QgJHR5cGUkJiAkbmFtZSQoaW50IGluZGV4KSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSAkdHlwZSQqIG11dGFibGVfJG5hbWUkKGludCBpbmRleCkkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgJHR5cGUkKiBhZGRfJG5hbWUkKCkkZGVwcmVjYXRpb24kO1xuIik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8ICR0eXBlJCA+JlxuIgorICAgICIgICAgJG5hbWUkKCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPipcbiIKKyAgICAiICAgIG11dGFibGVfJG5hbWUkKCkkZGVwcmVjYXRpb24kO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSBjb25zdCAkdHlwZSQmICRjbGFzc25hbWUkOjokbmFtZSQoaW50IGluZGV4KSBjb25zdCB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uR2V0KGluZGV4KTtcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgJHR5cGUkKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uTXV0YWJsZShpbmRleCk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lICR0eXBlJCogJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uQWRkKCk7XG4iCisgICAgIn1cbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPiZcbiIKKyAgICAiJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPipcbiIKKyAgICAiJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAmJG5hbWUkXztcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uQ2xlYXIoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uTWVyZ2VGcm9tKGZyb20uJG5hbWUkXyk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5Td2FwKCZvdGhlci0+JG5hbWUkXyk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBOb3QgbmVlZGVkIGZvciByZXBlYXRlZCBmaWVsZHMuCit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbChcbiIKKyAgICAgICIgICAgICBpbnB1dCwgYWRkXyRuYW1lJCgpKSk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwTm9WaXJ0dWFsKFxuIgorICAgICAgIiAgICAgICRudW1iZXIkLCBpbnB1dCwgYWRkXyRuYW1lJCgpKSk7XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+JG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iCisgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJHN0cmVhbV93cml0ZXIkKFxuIgorICAgICIgICAgJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgb3V0cHV0KTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+JG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iCisgICAgIiAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgorICAgICIgICAgV3JpdGUkZGVjbGFyZWRfdHlwZSROb1ZpcnR1YWxUb0FycmF5KFxuIgorICAgICIgICAgICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKGkpLCB0YXJnZXQpO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCAqIHRoaXMtPiRuYW1lJF9zaXplKCk7XG4iCisgICAgImZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+JG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iCisgICAgIiAgdG90YWxfc2l6ZSArPVxuIgorICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiRkZWNsYXJlZF90eXBlJFNpemVOb1ZpcnR1YWwoXG4iCisgICAgIiAgICAgIHRoaXMtPiRuYW1lJChpKSk7XG4iCisgICAgIn1cbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTE0NzI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfTUVTU0FHRV9GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9NRVNTQUdFX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK2NsYXNzIE1lc3NhZ2VGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgfk1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUZpZWxkR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIH5SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcGx1Z2luX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNGFhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDEyMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFRPRE8oa2VudG9uKTogIFNoYXJlIGNvZGUgd2l0aCB0aGUgdmVyc2lvbnMgb2YgdGhpcyB0ZXN0IGluIG90aGVyIGxhbmd1YWdlcz8KKy8vICAgSXQgc2VlbWVkIGxpa2UgcGFyYW1ldGVyaXppbmcgaXQgd291bGQgYWRkIG1vcmUgY29tcGxleGl0eSB0aGFuIGl0IGlzCisvLyAgIHdvcnRoLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKK25hbWVzcGFjZSB7CisKK2NsYXNzIFRlc3RHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7CisgcHVibGljOgorICBUZXN0R2VuZXJhdG9yKCkge30KKyAgflRlc3RHZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIGNvbnN0IHsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJpbmNsdWRlcyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgIm5hbWVzcGFjZV9zY29wZSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImdsb2JhbF9zY29wZSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImNsYXNzX3Njb3BlOmZvby5CYXIiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJjbGFzc19zY29wZTpmb28uQmFyLkJheiIsIGNvbnRleHQpOworCisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmNjIiwgImluY2x1ZGVzIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmNjIiwgIm5hbWVzcGFjZV9zY29wZSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5jYyIsICJnbG9iYWxfc2NvcGUiLCBjb250ZXh0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZvaWQgVHJ5SW5zZXJ0KGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9uX3BvaW50LAorICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0KSBjb25zdCB7CisgICAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgIGNvbnRleHQtPk9wZW5Gb3JJbnNlcnQoZmlsZW5hbWUsIGluc2VydGlvbl9wb2ludCkpOworICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOworICAgIHByaW50ZXIuUHJpbnQoIi8vIGluc2VydGVkICRuYW1lJFxuIiwgIm5hbWUiLCBpbnNlcnRpb25fcG9pbnQpOworICB9Cit9OworCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBhbGwgdGhlIGV4cGVjdGVkIGluc2VydGlvbiBwb2ludHMgZXhpc3QuICBJdCBkb2VzCisvLyBub3QgdmVyaWZ5IHRoYXQgdGhleSBhcmUgY29ycmVjdGx5LXBsYWNlZDsgdGhhdCB3b3VsZCByZXF1aXJlIGFjdHVhbGx5CisvLyBjb21waWxpbmcgdGhlIG91dHB1dCB3aGljaCBpcyBhIGJpdCBtb3JlIHRoYW4gSSBjYXJlIHRvIGRvIGZvciB0aGlzIHRlc3QuCitURVNUKENwcFBsdWdpblRlc3QsIFBsdWdpblRlc3QpIHsKKyAgRmlsZTo6V3JpdGVTdHJpbmdUb0ZpbGVPckRpZSgKKyAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgInBhY2thZ2UgZm9vO1xuIgorICAgICAgIm1lc3NhZ2UgQmFyIHtcbiIKKyAgICAgICIgIG1lc3NhZ2UgQmF6IHt9XG4iCisgICAgICAifVxuIiwKKyAgICAgIFRlc3RUZW1wRGlyKCkgKyAiL3Rlc3QucHJvdG8iKTsKKworICBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29tbWFuZExpbmVJbnRlcmZhY2UgY2xpOworICBjbGkuU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUodHJ1ZSk7CisKKyAgQ3BwR2VuZXJhdG9yIGNwcF9nZW5lcmF0b3I7CisgIFRlc3RHZW5lcmF0b3IgdGVzdF9nZW5lcmF0b3I7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1jcHBfb3V0IiwgJmNwcF9nZW5lcmF0b3IsICIiKTsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLXRlc3Rfb3V0IiwgJnRlc3RfZ2VuZXJhdG9yLCAiIik7CisKKyAgc3RyaW5nIHByb3RvX3BhdGggPSAiLUkiICsgVGVzdFRlbXBEaXIoKTsKKyAgc3RyaW5nIGNwcF9vdXQgPSAiLS1jcHBfb3V0PSIgKyBUZXN0VGVtcERpcigpOworICBzdHJpbmcgdGVzdF9vdXQgPSAiLS10ZXN0X291dD0iICsgVGVzdFRlbXBEaXIoKTsKKworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgInByb3RvYyIsCisgICAgcHJvdG9fcGF0aC5jX3N0cigpLAorICAgIGNwcF9vdXQuY19zdHIoKSwKKyAgICB0ZXN0X291dC5jX3N0cigpLAorICAgICJ0ZXN0LnByb3RvIgorICB9OworCisgIEVYUEVDVF9FUSgwLCBjbGkuUnVuKDUsIGFyZ3YpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3ByaW1pdGl2ZV9maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZThkZjBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MKQEAgLTAsMCArMSwzODIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKK25hbWVzcGFjZSB7CisKKy8vIEZvciBlbmNvZGluZ3Mgd2l0aCBmaXhlZCBzaXplcywgcmV0dXJucyB0aGF0IHNpemUgaW4gYnl0ZXMuICBPdGhlcndpc2UKKy8vIHJldHVybnMgLTEuCitpbnQgRml4ZWRTaXplKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyICAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQgICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzIgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NCAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzIgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtGaXhlZDMyU2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0IDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRml4ZWQ2NFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a1NGaXhlZDMyU2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprU0ZpeGVkNjRTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUICAgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtGbG9hdFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFICA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0RvdWJsZVNpemU7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MICAgIDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprQm9vbFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAtMTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMgICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCAgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgOiByZXR1cm4gLTE7CisKKyAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KKyAgfQorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIC0xOworfQorCit2b2lkIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgdmFyaWFibGVzKTsKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPSBQcmltaXRpdmVUeXBlTmFtZShkZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsidGFnIl0gPSBTaW1wbGVJdG9hKGludGVybmFsOjpXaXJlRm9ybWF0OjpNYWtlVGFnKGRlc2NyaXB0b3IpKTsKKyAgaW50IGZpeGVkX3NpemUgPSBGaXhlZFNpemUoZGVzY3JpcHRvci0+dHlwZSgpKTsKKyAgaWYgKGZpeGVkX3NpemUgIT0gLTEpIHsKKyAgICAoKnZhcmlhYmxlcylbImZpeGVkX3NpemUiXSA9IFNpbXBsZUl0b2EoZml4ZWRfc2l6ZSk7CisgIH0KKyAgKCp2YXJpYWJsZXMpWyJ3aXJlX2Zvcm1hdF9maWVsZF90eXBlIl0gPQorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoiICsgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9OYW1lKAorICAgICAgICAgIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGU+KGRlc2NyaXB0b3ItPnR5cGUoKSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18pOworfQorCitQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6flByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkdHlwZSQgJG5hbWUkXztcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lICR0eXBlJCAkbmFtZSQoKSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIHNldF8kbmFtZSQoJHR5cGUkIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lICR0eXBlJCAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICIgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInNldF8kbmFtZSQoZnJvbS4kbmFtZSQoKSk7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAic3RkOjpzd2FwKCRuYW1lJF8sIG90aGVyLT4kbmFtZSRfKTtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGRlZmF1bHQkO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPFxuIgorICAgICIgICAgICAgICAkdHlwZSQsICR3aXJlX2Zvcm1hdF9maWVsZF90eXBlJD4oXG4iCisgICAgIiAgICAgICBpbnB1dCwgJiRuYW1lJF8pKSk7XG4iCisgICAgInNldF9oYXNfJG5hbWUkKCk7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGUkZGVjbGFyZWRfdHlwZSQoIgorICAgICAgIiRudW1iZXIkLCB0aGlzLT4kbmFtZSQoKSwgb3V0cHV0KTtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGUkZGVjbGFyZWRfdHlwZSRUb0FycmF5KCIKKyAgICAgICIkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKCksIHRhcmdldCk7XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGludCBmaXhlZF9zaXplID0gRml4ZWRTaXplKGRlc2NyaXB0b3JfLT50eXBlKCkpOworICBpZiAoZml4ZWRfc2l6ZSA9PSAtMSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAidG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICtcbiIKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjokZGVjbGFyZWRfdHlwZSRTaXplKFxuIgorICAgICAgIiAgICB0aGlzLT4kbmFtZSQoKSk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCArICRmaXhlZF9zaXplJDtcbiIpOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7CisgIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7CisKKyAgaWYgKGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHZhcmlhYmxlc19bInBhY2tlZF9yZWFkZXIiXSA9ICJSZWFkUGFja2VkUHJpbWl0aXZlIjsKKyAgICB2YXJpYWJsZXNfWyJyZXBlYXRlZF9yZWFkZXIiXSA9ICJSZWFkUmVwZWF0ZWRQcmltaXRpdmVOb0lubGluZSI7CisgIH0gZWxzZSB7CisgICAgdmFyaWFibGVzX1sicGFja2VkX3JlYWRlciJdID0gIlJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZSI7CisgICAgdmFyaWFibGVzX1sicmVwZWF0ZWRfcmVhZGVyIl0gPSAiUmVhZFJlcGVhdGVkUHJpbWl0aXZlIjsKKyAgfQorfQorCitSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4gJG5hbWUkXztcbiIpOworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSAmJiBIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJtdXRhYmxlIGludCBfJG5hbWUkX2NhY2hlZF9ieXRlX3NpemVfO1xuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lICR0eXBlJCAkbmFtZSQoaW50IGluZGV4KSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIHNldF8kbmFtZSQoaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIHZvaWQgYWRkXyRuYW1lJCgkdHlwZSQgdmFsdWUpJGRlcHJlY2F0aW9uJDtcbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCAkdHlwZSQgPiZcbiIKKyAgICAiICAgICRuYW1lJCgpIGNvbnN0JGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4qXG4iCisgICAgIiAgICBtdXRhYmxlXyRuYW1lJCgpJGRlcHJlY2F0aW9uJDtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSAkdHlwZSQgJGNsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5HZXQoaW5kZXgpO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgIiAgJG5hbWUkXy5TZXQoaW5kZXgsIHZhbHVlKTtcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAiICAkbmFtZSRfLkFkZCh2YWx1ZSk7XG4iCisgICAgIn1cbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCAkdHlwZSQgPiZcbiIKKyAgICAiJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCAkdHlwZSQgPipcbiIKKyAgICAiJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAmJG5hbWUkXztcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5DbGVhcigpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLk1lcmdlRnJvbShmcm9tLiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5Td2FwKCZvdGhlci0+JG5hbWUkXyk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIE5vdCBuZWVkZWQgZm9yIHJlcGVhdGVkIGZpZWxkcy4KK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JHJlcGVhdGVkX3JlYWRlciQ8XG4iCisgICAgIiAgICAgICAgICR0eXBlJCwgJHdpcmVfZm9ybWF0X2ZpZWxkX3R5cGUkPihcbiIKKyAgICAiICAgICAgICR0YWdfc2l6ZSQsICR0YWckLCBpbnB1dCwgdGhpcy0+bXV0YWJsZV8kbmFtZSQoKSkpKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbVdpdGhQYWNraW5nKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIkRPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiRwYWNrZWRfcmVhZGVyJDxcbiIKKyAgICAiICAgICAgICAgJHR5cGUkLCAkd2lyZV9mb3JtYXRfZmllbGRfdHlwZSQ+KFxuIgorICAgICIgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfJG5hbWUkKCkpKSk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgLy8gV3JpdGUgdGhlIHRhZyBhbmQgdGhlIHNpemUuCisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAodGhpcy0+JG5hbWUkX3NpemUoKSA+IDApIHtcbiIKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZygiCisgICAgICAgICAgIiRudW1iZXIkLCAiCisgICAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCAiCisgICAgICAgICAgIm91dHB1dCk7XG4iCisgICAgICAiICBvdXRwdXQtPldyaXRlVmFyaW50MzIoXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXyk7XG4iCisgICAgICAifVxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZSRkZWNsYXJlZF90eXBlJE5vVGFnKFxuIgorICAgICAgIiAgICB0aGlzLT4kbmFtZSQoaSksIG91dHB1dCk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJGRlY2xhcmVkX3R5cGUkKFxuIgorICAgICAgIiAgICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKGkpLCBvdXRwdXQpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgLy8gV3JpdGUgdGhlIHRhZyBhbmQgdGhlIHNpemUuCisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAodGhpcy0+JG5hbWUkX3NpemUoKSA+IDApIHtcbiIKKyAgICAgICIgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoXG4iCisgICAgICAiICAgICRudW1iZXIkLFxuIgorICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCxcbiIKKyAgICAgICIgICAgdGFyZ2V0KTtcbiIKKyAgICAgICIgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheShcbiIKKyAgICAgICIgICAgXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXywgdGFyZ2V0KTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+JG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgorICAgICAgIiAgICBXcml0ZSRkZWNsYXJlZF90eXBlJE5vVGFnVG9BcnJheSh0aGlzLT4kbmFtZSQoaSksIHRhcmdldCk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgorICAgICAgIiAgICBXcml0ZSRkZWNsYXJlZF90eXBlJFRvQXJyYXkoJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgdGFyZ2V0KTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAie1xuIgorICAgICIgIGludCBkYXRhX3NpemUgPSAwO1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBpbnQgZml4ZWRfc2l6ZSA9IEZpeGVkU2l6ZShkZXNjcmlwdG9yXy0+dHlwZSgpKTsKKyAgaWYgKGZpeGVkX3NpemUgPT0gLTEpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+JG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iCisgICAgICAiICBkYXRhX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgorICAgICAgIiAgICAkZGVjbGFyZWRfdHlwZSRTaXplKHRoaXMtPiRuYW1lJChpKSk7XG4iCisgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJkYXRhX3NpemUgPSAkZml4ZWRfc2l6ZSQgKiB0aGlzLT4kbmFtZSRfc2l6ZSgpO1xuIik7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKGRhdGFfc2l6ZSA+IDApIHtcbiIKKyAgICAgICIgIHRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCArXG4iCisgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoZGF0YV9zaXplKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXyA9IGRhdGFfc2l6ZTtcbiIKKyAgICAgICJ0b3RhbF9zaXplICs9IGRhdGFfc2l6ZTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAidG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICogdGhpcy0+JG5hbWUkX3NpemUoKSArIGRhdGFfc2l6ZTtcbiIpOworICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjZDc0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfUFJJTUlUSVZFX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1BSSU1JVElWRV9GSUVMRF9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB+UHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB+UmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9QUklNSVRJVkVfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4MjU2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5jYwpAQCAtMCwwICsxLDMzNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitTZXJ2aWNlR2VuZXJhdG9yOjpTZXJ2aWNlR2VuZXJhdG9yKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRsbGV4cG9ydF9kZWNsKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKKyAgdmFyc19bImNsYXNzbmFtZSJdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKKyAgdmFyc19bImZ1bGxfbmFtZSJdID0gZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpOworICBpZiAoZGxsZXhwb3J0X2RlY2wuZW1wdHkoKSkgeworICAgIHZhcnNfWyJkbGxleHBvcnQiXSA9ICIiOworICB9IGVsc2UgeworICAgIHZhcnNfWyJkbGxleHBvcnQiXSA9IGRsbGV4cG9ydF9kZWNsICsgIiAiOworICB9Cit9CisKK1NlcnZpY2VHZW5lcmF0b3I6On5TZXJ2aWNlR2VuZXJhdG9yKCkge30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZURlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBGb3J3YXJkLWRlY2xhcmUgdGhlIHN0dWIgdHlwZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgImNsYXNzICRjbGFzc25hbWUkX1N0dWI7XG4iCisgICAgIlxuIik7CisKKyAgR2VuZXJhdGVJbnRlcmZhY2UocHJpbnRlcik7CisgIEdlbmVyYXRlU3R1YkRlZmluaXRpb24ocHJpbnRlcik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgImNsYXNzICRkbGxleHBvcnQkJGNsYXNzbmFtZSQgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlIHtcbiIKKyAgICAiIHByb3RlY3RlZDpcbiIKKyAgICAiICAvLyBUaGlzIGNsYXNzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGFuIGFic3RyYWN0IGludGVyZmFjZS5cbiIKKyAgICAiICBpbmxpbmUgJGNsYXNzbmFtZSQoKSB7fTtcbiIKKyAgICAiIHB1YmxpYzpcbiIKKyAgICAiICB2aXJ0dWFsIH4kY2xhc3NuYW1lJCgpO1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIHByaW50ZXItPlByaW50KHZhcnNfLAorICAgICJcbiIKKyAgICAidHlwZWRlZiAkY2xhc3NuYW1lJF9TdHViIFN0dWI7XG4iCisgICAgIlxuIgorICAgICJzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcigpO1xuIgorICAgICJcbiIpOworCisgIEdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlcyhWSVJUVUFMLCBwcmludGVyKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiXG4iCisgICAgIi8vIGltcGxlbWVudHMgU2VydmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisgICAgIlxuIgorICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yKiBHZXREZXNjcmlwdG9yKCk7XG4iCisgICAgInZvaWQgQ2FsbE1ldGhvZChjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCxcbiIKKyAgICAiICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ29udHJvbGxlciogY29udHJvbGxlcixcbiIKKyAgICAiICAgICAgICAgICAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogcmVxdWVzdCxcbiIKKyAgICAiICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogcmVzcG9uc2UsXG4iCisgICAgIiAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkNsb3N1cmUqIGRvbmUpO1xuIgorICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIEdldFJlcXVlc3RQcm90b3R5cGUoXG4iCisgICAgIiAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpIGNvbnN0O1xuIgorICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIEdldFJlc3BvbnNlUHJvdG90eXBlKFxuIgorICAgICIgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSBjb25zdDtcbiIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgIlxuIgorICAgICIgcHJpdmF0ZTpcbiIKKyAgICAiICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoJGNsYXNzbmFtZSQpO1xuIgorICAgICJ9O1xuIgorICAgICJcbiIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlU3R1YkRlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgImNsYXNzICRkbGxleHBvcnQkJGNsYXNzbmFtZSRfU3R1YiA6IHB1YmxpYyAkY2xhc3NuYW1lJCB7XG4iCisgICAgIiBwdWJsaWM6XG4iKTsKKworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCh2YXJzXywKKyAgICAiJGNsYXNzbmFtZSRfU3R1Yig6Omdvb2dsZTo6cHJvdG9idWY6OlJwY0NoYW5uZWwqIGNoYW5uZWwpO1xuIgorICAgICIkY2xhc3NuYW1lJF9TdHViKDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ2hhbm5lbCogY2hhbm5lbCxcbiIKKyAgICAiICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2U6OkNoYW5uZWxPd25lcnNoaXAgb3duZXJzaGlwKTtcbiIKKyAgICAifiRjbGFzc25hbWUkX1N0dWIoKTtcbiIKKyAgICAiXG4iCisgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJwY0NoYW5uZWwqIGNoYW5uZWwoKSB7IHJldHVybiBjaGFubmVsXzsgfVxuIgorICAgICJcbiIKKyAgICAiLy8gaW1wbGVtZW50cyAkY2xhc3NuYW1lJCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICAiXG4iKTsKKworICBHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZXMoTk9OX1ZJUlRVQUwsIHByaW50ZXIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgIiBwcml2YXRlOlxuIgorICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ2hhbm5lbCogY2hhbm5lbF87XG4iCisgICAgIiAgYm9vbCBvd25zX2NoYW5uZWxfO1xuIgorICAgICIgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUygkY2xhc3NuYW1lJF9TdHViKTtcbiIKKyAgICAifTtcbiIKKyAgICAiXG4iKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZXMoCisgICAgVmlydHVhbE9yTm9uIHZpcnR1YWxfb3Jfbm9uLCBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHN1Yl92YXJzOworICAgIHN1Yl92YXJzWyJuYW1lIl0gPSBtZXRob2QtPm5hbWUoKTsKKyAgICBzdWJfdmFyc1siaW5wdXRfdHlwZSJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+aW5wdXRfdHlwZSgpLCB0cnVlKTsKKyAgICBzdWJfdmFyc1sib3V0cHV0X3R5cGUiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCksIHRydWUpOworICAgIHN1Yl92YXJzWyJ2aXJ0dWFsIl0gPSB2aXJ0dWFsX29yX25vbiA9PSBWSVJUVUFMID8gInZpcnR1YWwgIiA6ICIiOworCisgICAgcHJpbnRlci0+UHJpbnQoc3ViX3ZhcnMsCisgICAgICAiJHZpcnR1YWwkdm9pZCAkbmFtZSQoOjpnb29nbGU6OnByb3RvYnVmOjpScGNDb250cm9sbGVyKiBjb250cm9sbGVyLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRpbnB1dF90eXBlJCogcmVxdWVzdCxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0X3R5cGUkKiByZXNwb25zZSxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkNsb3N1cmUqIGRvbmUpO1xuIik7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBpbnQgaW5kZXgpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJjbGFzc25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGluZGV4KTsKKworICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICIkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXyA9IGZpbGUtPnNlcnZpY2UoJGluZGV4JCk7XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlSW1wbGVtZW50YXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgIiRjbGFzc25hbWUkOjp+JGNsYXNzbmFtZSQoKSB7fVxuIgorICAgICJcbiIKKyAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvciogJGNsYXNzbmFtZSQ6OmRlc2NyaXB0b3IoKSB7XG4iCisgICAgIiAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7XG4iCisgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfO1xuIgorICAgICJ9XG4iCisgICAgIlxuIgorICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yKiAkY2xhc3NuYW1lJDo6R2V0RGVzY3JpcHRvcigpIHtcbiIKKyAgICAiICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTtcbiIKKyAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl87XG4iCisgICAgIn1cbiIKKyAgICAiXG4iKTsKKworICAvLyBHZW5lcmF0ZSBtZXRob2RzIG9mIHRoZSBpbnRlcmZhY2UuCisgIEdlbmVyYXRlTm90SW1wbGVtZW50ZWRNZXRob2RzKHByaW50ZXIpOworICBHZW5lcmF0ZUNhbGxNZXRob2QocHJpbnRlcik7CisgIEdlbmVyYXRlR2V0UHJvdG90eXBlKFJFUVVFU1QsIHByaW50ZXIpOworICBHZW5lcmF0ZUdldFByb3RvdHlwZShSRVNQT05TRSwgcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgc3R1YiBpbXBsZW1lbnRhdGlvbi4KKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgIiRjbGFzc25hbWUkX1N0dWI6OiRjbGFzc25hbWUkX1N0dWIoOjpnb29nbGU6OnByb3RvYnVmOjpScGNDaGFubmVsKiBjaGFubmVsKVxuIgorICAgICIgIDogY2hhbm5lbF8oY2hhbm5lbCksIG93bnNfY2hhbm5lbF8oZmFsc2UpIHt9XG4iCisgICAgIiRjbGFzc25hbWUkX1N0dWI6OiRjbGFzc25hbWUkX1N0dWIoXG4iCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OlJwY0NoYW5uZWwqIGNoYW5uZWwsXG4iCisgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2U6OkNoYW5uZWxPd25lcnNoaXAgb3duZXJzaGlwKVxuIgorICAgICIgIDogY2hhbm5lbF8oY2hhbm5lbCksXG4iCisgICAgIiAgICBvd25zX2NoYW5uZWxfKG93bmVyc2hpcCA9PSA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2U6OlNUVUJfT1dOU19DSEFOTkVMKSB7fVxuIgorICAgICIkY2xhc3NuYW1lJF9TdHViOjp+JGNsYXNzbmFtZSRfU3R1YigpIHtcbiIKKyAgICAiICBpZiAob3duc19jaGFubmVsXykgZGVsZXRlIGNoYW5uZWxfO1xuIgorICAgICJ9XG4iCisgICAgIlxuIik7CisKKyAgR2VuZXJhdGVTdHViTWV0aG9kcyhwcmludGVyKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU5vdEltcGxlbWVudGVkTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHN1Yl92YXJzOworICAgIHN1Yl92YXJzWyJjbGFzc25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgICAgc3ViX3ZhcnNbIm5hbWUiXSA9IG1ldGhvZC0+bmFtZSgpOworICAgIHN1Yl92YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKKyAgICBzdWJfdmFyc1siaW5wdXRfdHlwZSJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+aW5wdXRfdHlwZSgpLCB0cnVlKTsKKyAgICBzdWJfdmFyc1sib3V0cHV0X3R5cGUiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCksIHRydWUpOworCisgICAgcHJpbnRlci0+UHJpbnQoc3ViX3ZhcnMsCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6JG5hbWUkKDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ29udHJvbGxlciogY29udHJvbGxlcixcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJGlucHV0X3R5cGUkKixcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dF90eXBlJCosXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6Q2xvc3VyZSogZG9uZSkge1xuIgorICAgICAgIiAgY29udHJvbGxlci0+U2V0RmFpbGVkKFwiTWV0aG9kICRuYW1lJCgpIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4iCisgICAgICAiICBkb25lLT5SdW4oKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKyAgfQorfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlQ2FsbE1ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCh2YXJzXywKKyAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q2FsbE1ldGhvZChjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCxcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OlJwY0NvbnRyb2xsZXIqIGNvbnRyb2xsZXIsXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiByZXF1ZXN0LFxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogcmVzcG9uc2UsXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpDbG9zdXJlKiBkb25lKSB7XG4iCisgICAgIiAgR09PR0xFX0RDSEVDS19FUShtZXRob2QtPnNlcnZpY2UoKSwgJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl8pO1xuIgorICAgICIgIHN3aXRjaChtZXRob2QtPmluZGV4KCkpIHtcbiIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gc3ViX3ZhcnM7CisgICAgc3ViX3ZhcnNbIm5hbWUiXSA9IG1ldGhvZC0+bmFtZSgpOworICAgIHN1Yl92YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKKyAgICBzdWJfdmFyc1siaW5wdXRfdHlwZSJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+aW5wdXRfdHlwZSgpLCB0cnVlKTsKKyAgICBzdWJfdmFyc1sib3V0cHV0X3R5cGUiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCksIHRydWUpOworCisgICAgLy8gTm90ZTogIGRvd25fY2FzdCBkb2VzIG5vdCB3b3JrIGhlcmUgYmVjYXVzZSBpdCBvbmx5IHdvcmtzIG9uIHBvaW50ZXJzLAorICAgIC8vICAgbm90IHJlZmVyZW5jZXMuCisgICAgcHJpbnRlci0+UHJpbnQoc3ViX3ZhcnMsCisgICAgICAiICAgIGNhc2UgJGluZGV4JDpcbiIKKyAgICAgICIgICAgICAkbmFtZSQoY29udHJvbGxlcixcbiIKKyAgICAgICIgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpkb3duX2Nhc3Q8Y29uc3QgJGlucHV0X3R5cGUkKj4ocmVxdWVzdCksXG4iCisgICAgICAiICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6ZG93bl9jYXN0PCAkb3V0cHV0X3R5cGUkKj4ocmVzcG9uc2UpLFxuIgorICAgICAgIiAgICAgICAgICAgICBkb25lKTtcbiIKKyAgICAgICIgICAgICBicmVhaztcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgIiAgICBkZWZhdWx0OlxuIgorICAgICIgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCBcIkJhZCBtZXRob2QgaW5kZXg7IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi5cIjtcbiIKKyAgICAiICAgICAgYnJlYWs7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iCisgICAgIlxuIik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVHZXRQcm90b3R5cGUoUmVxdWVzdE9yUmVzcG9uc2Ugd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmICh3aGljaCA9PSBSRVFVRVNUKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyc18sCisgICAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiAkY2xhc3NuYW1lJDo6R2V0UmVxdWVzdFByb3RvdHlwZShcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcnNfLAorICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgJGNsYXNzbmFtZSQ6OkdldFJlc3BvbnNlUHJvdG90eXBlKFxuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCh2YXJzXywKKyAgICAiICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSBjb25zdCB7XG4iCisgICAgIiAgR09PR0xFX0RDSEVDS19FUShtZXRob2QtPnNlcnZpY2UoKSwgZGVzY3JpcHRvcigpKTtcbiIKKyAgICAiICBzd2l0Y2gobWV0aG9kLT5pbmRleCgpKSB7XG4iKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlID0KKyAgICAgICh3aGljaCA9PSBSRVFVRVNUKSA/IG1ldGhvZC0+aW5wdXRfdHlwZSgpIDogbWV0aG9kLT5vdXRwdXRfdHlwZSgpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBzdWJfdmFyczsKKyAgICBzdWJfdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaSk7CisgICAgc3ViX3ZhcnNbInR5cGUiXSA9IENsYXNzTmFtZSh0eXBlLCB0cnVlKTsKKworICAgIHByaW50ZXItPlByaW50KHN1Yl92YXJzLAorICAgICAgIiAgICBjYXNlICRpbmRleCQ6XG4iCisgICAgICAiICAgICAgcmV0dXJuICR0eXBlJDo6ZGVmYXVsdF9pbnN0YW5jZSgpO1xuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCh2YXJzXywKKyAgICAiICAgIGRlZmF1bHQ6XG4iCisgICAgIiAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8IFwiQmFkIG1ldGhvZCBpbmRleDsgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLlwiO1xuIgorICAgICIgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSo+KE5VTEwpO1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIgorICAgICJcbiIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlU3R1Yk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBzdWJfdmFyczsKKyAgICBzdWJfdmFyc1siY2xhc3NuYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOworICAgIHN1Yl92YXJzWyJuYW1lIl0gPSBtZXRob2QtPm5hbWUoKTsKKyAgICBzdWJfdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaSk7CisgICAgc3ViX3ZhcnNbImlucHV0X3R5cGUiXSA9IENsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSwgdHJ1ZSk7CisgICAgc3ViX3ZhcnNbIm91dHB1dF90eXBlIl0gPSBDbGFzc05hbWUobWV0aG9kLT5vdXRwdXRfdHlwZSgpLCB0cnVlKTsKKworICAgIHByaW50ZXItPlByaW50KHN1Yl92YXJzLAorICAgICAgInZvaWQgJGNsYXNzbmFtZSRfU3R1Yjo6JG5hbWUkKDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ29udHJvbGxlciogY29udHJvbGxlcixcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkaW5wdXRfdHlwZSQqIHJlcXVlc3QsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dF90eXBlJCogcmVzcG9uc2UsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpDbG9zdXJlKiBkb25lKSB7XG4iCisgICAgICAiICBjaGFubmVsXy0+Q2FsbE1ldGhvZChkZXNjcmlwdG9yKCktPm1ldGhvZCgkaW5kZXgkKSxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHJlcXVlc3QsIHJlc3BvbnNlLCBkb25lKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGU5ZGQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmgKQEAgLTAsMCArMSwxMTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfU0VSVklDRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9TRVJWSUNFX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICB9Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK2NsYXNzIFNlcnZpY2VHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgLy8gU2VlIGdlbmVyYXRvci5jYyBmb3IgdGhlIG1lYW5pbmcgb2YgZGxsZXhwb3J0X2RlY2wuCisgIGV4cGxpY2l0IFNlcnZpY2VHZW5lcmF0b3IoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBkbGxleHBvcnRfZGVjbCk7CisgIH5TZXJ2aWNlR2VuZXJhdG9yKCk7CisKKyAgLy8gSGVhZGVyIHN0dWZmLgorCisgIC8vIEdlbmVyYXRlIHRoZSBjbGFzcyBkZWZpbml0aW9ucyBmb3IgdGhlIHNlcnZpY2UncyBpbnRlcmZhY2UgYW5kIHRoZQorICAvLyBzdHViIGltcGxlbWVudGF0aW9uLgorICB2b2lkIEdlbmVyYXRlRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBTb3VyY2UgZmlsZSBzdHVmZi4KKworICAvLyBHZW5lcmF0ZSBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGdsb2JhbCB2YXJpYWJsZSBzdG9yaW5nIHRoZSBzZXJ2aWNlJ3MKKyAgLy8gZGVzY3JpcHRvci4KKyAgdm9pZCBHZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlciwgaW50IGluZGV4KTsKKworICAvLyBHZW5lcmF0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgZXZlcnl0aGluZyBkZWNsYXJlZCBieSBHZW5lcmF0ZURlY2xhcmF0aW9ucygpLgorICB2b2lkIEdlbmVyYXRlSW1wbGVtZW50YXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgcHJpdmF0ZToKKyAgZW51bSBSZXF1ZXN0T3JSZXNwb25zZSB7IFJFUVVFU1QsIFJFU1BPTlNFIH07CisgIGVudW0gVmlydHVhbE9yTm9uIHsgVklSVFVBTCwgTk9OX1ZJUlRVQUwgfTsKKworICAvLyBIZWFkZXIgc3R1ZmYuCisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZpY2UgYWJzdHJhY3QgaW50ZXJmYWNlLgorICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgc3R1YiBjbGFzcyBkZWZpbml0aW9uLgorICB2b2lkIEdlbmVyYXRlU3R1YkRlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIFByaW50cyBzaWduYXR1cmVzIGZvciBhbGwgbWV0aG9kcyBpbiB0aGUKKyAgdm9pZCBHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZXMoVmlydHVhbE9yTm9uIHZpcnR1YWxfb3Jfbm9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gU291cmNlIGZpbGUgc3R1ZmYuCisKKyAgLy8gR2VuZXJhdGUgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZHMsIHdoaWNoCisgIC8vIHByb2R1Y2UgYSAibm90IGltcGxlbWVudGVkIiBlcnJvci4KKyAgdm9pZCBHZW5lcmF0ZU5vdEltcGxlbWVudGVkTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgdGhlIENhbGxNZXRob2QoKSBtZXRob2Qgb2YgdGhlIHNlcnZpY2UuCisgIHZvaWQgR2VuZXJhdGVDYWxsTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgR2V0e1JlcXVlc3QsUmVzcG9uc2V9UHJvdG90eXBlKCkgbWV0aG9kcy4KKyAgdm9pZCBHZW5lcmF0ZUdldFByb3RvdHlwZShSZXF1ZXN0T3JSZXNwb25zZSB3aGljaCwgaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIHRoZSBzdHViJ3MgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZHMuCisgIHZvaWQgR2VuZXJhdGVTdHViTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXJ2aWNlR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9TRVJWSUNFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2VjMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MKQEAgLTAsMCArMSw0NTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgU2V0U3RyaW5nVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgeworICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCB2YXJpYWJsZXMpOworICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IERlZmF1bHRWYWx1ZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X3ZhcmlhYmxlIl0gPSBkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkKKyAgICAgID8gIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyIKKyAgICAgIDogIl9kZWZhdWx0XyIgKyBGaWVsZE5hbWUoZGVzY3JpcHRvcikgKyAiXyI7CisgICgqdmFyaWFibGVzKVsicG9pbnRlcl90eXBlIl0gPQorICAgICAgZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyA/ICJ2b2lkIiA6ICJjaGFyIjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKKyAgU2V0U3RyaW5nVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKK30KKworU3RyaW5nRmllbGRHZW5lcmF0b3I6On5TdHJpbmdGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiOjpzdGQ6OnN0cmluZyogJG5hbWUkXztcbiIpOworICBpZiAoIWRlc2NyaXB0b3JfLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAic3RhdGljIGNvbnN0IDo6c3RkOjpzdHJpbmcgJGRlZmF1bHRfdmFyaWFibGUkO1xuIik7CisgIH0KK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIElmIHdlJ3JlIHVzaW5nIFN0cmluZ0ZpZWxkR2VuZXJhdG9yIGZvciBhIGZpZWxkIHdpdGggYSBjdHlwZSwgaXQncworICAvLyBiZWNhdXNlIHRoYXQgY3R5cGUgaXNuJ3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGlzCisgIC8vIHRydWUgb2YgY3R5cGU9Q09SRCBhbmQgY3R5cGU9U1RSSU5HX1BJRUNFIGluIHRoZSBvcGVuIHNvdXJjZSByZWxlYXNlLgorICAvLyBXZSBhcmVuJ3QgcmVsZWFzaW5nIENvcmQgYmVjYXVzZSBpdCBoYXMgdG9vIG1hbnkgR29vZ2xlLXNwZWNpZmljCisgIC8vIGRlcGVuZGVuY2llcyBhbmQgd2UgYXJlbid0IHJlbGVhc2luZyBTdHJpbmdQaWVjZSBiZWNhdXNlIGl0J3MgaGFyZGx5CisgIC8vIHVzZWZ1bCBvdXRzaWRlIG9mIEdvb2dsZSBhbmQgYmVjYXVzZSBpdCB3b3VsZCBnZXQgY29uZnVzaW5nIHRvIGhhdmUKKyAgLy8gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBTdHJpbmdQaWVjZSBjbGFzcyBpbiBkaWZmZXJlbnQgbGlicmFyaWVzIChQQ1JFCisgIC8vIGFscmVhZHkgaW5jbHVkZXMgaXQgZm9yIHRoZWlyIEMrKyBiaW5kaW5ncywgd2hpY2ggY2FtZSBmcm9tIEdvb2dsZSkuCisgIC8vCisgIC8vIEluIGFueSBjYXNlLCB3ZSBtYWtlIGFsbCB0aGUgYWNjZXNzb3JzIHByaXZhdGUgd2hpbGUgc3RpbGwgYWN0dWFsbHkKKyAgLy8gdXNpbmcgYSBzdHJpbmcgdG8gcmVwcmVzZW50IHRoZSBmaWVsZCBpbnRlcm5hbGx5LiAgVGhpcyB3YXksIHdlIGNhbgorICAvLyBndWFyYW50ZWUgdGhhdCBpZiB3ZSBkbyBldmVyIGltcGxlbWVudCB0aGUgY3R5cGUsIGl0IHdvbid0IGJyZWFrIGFueQorICAvLyBleGlzdGluZyB1c2VycyB3aG8gbWlnaHQgYmUgLS0gZm9yIHdoYXRldmVyIHJlYXNvbiAtLSBhbHJlYWR5IHVzaW5nIC5wcm90bworICAvLyBmaWxlcyB0aGF0IGFwcGxpZWQgdGhlIGN0eXBlLiAgVGhlIGZpZWxkIGNhbiBzdGlsbCBiZSBhY2Nlc3NlZCB2aWEgdGhlCisgIC8vIHJlZmxlY3Rpb24gaW50ZXJmYWNlIHNpbmNlIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZSBpcyBpbmRlcGVuZGVudCBvZgorICAvLyB0aGUgc3RyaW5nJ3MgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbi4KKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkuY3R5cGUoKSAhPSBGaWVsZE9wdGlvbnM6OlNUUklORykgeworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgcHJpdmF0ZTpcbiIKKyAgICAgICIgIC8vIEhpZGRlbiBkdWUgdG8gdW5rbm93biBjdHlwZSBvcHRpb24uXG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkbmFtZSQoKSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIHNldF8kbmFtZSQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIHZvaWQgc2V0XyRuYW1lJChjb25zdCBjaGFyKiB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgdm9pZCBzZXRfJG5hbWUkKGNvbnN0ICRwb2ludGVyX3R5cGUkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIgorICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfJG5hbWUkKCkkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5jdHlwZSgpICE9IEZpZWxkT3B0aW9uczo6U1RSSU5HKSB7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCIgcHVibGljOlxuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgIH0KK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgIiAgcmV0dXJuICokbmFtZSRfO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7XG4iCisgICAgIiAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAiICBpZiAoJG5hbWUkXyA9PSAmJGRlZmF1bHRfdmFyaWFibGUkKSB7XG4iCisgICAgIiAgICAkbmFtZSRfID0gbmV3IDo6c3RkOjpzdHJpbmc7XG4iCisgICAgIiAgfVxuIgorICAgICIgICRuYW1lJF8tPmFzc2lnbih2YWx1ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoY29uc3QgY2hhciogdmFsdWUpIHtcbiIKKyAgICAiICBzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICIgIGlmICgkbmFtZSRfID09ICYkZGVmYXVsdF92YXJpYWJsZSQpIHtcbiIKKyAgICAiICAgICRuYW1lJF8gPSBuZXcgOjpzdGQ6OnN0cmluZztcbiIKKyAgICAiICB9XG4iCisgICAgIiAgJG5hbWUkXy0+YXNzaWduKHZhbHVlKTtcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgIgorICAgICJ2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0ICRwb2ludGVyX3R5cGUkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHtcbiIKKyAgICAiICBzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICIgIGlmICgkbmFtZSRfID09ICYkZGVmYXVsdF92YXJpYWJsZSQpIHtcbiIKKyAgICAiICAgICRuYW1lJF8gPSBuZXcgOjpzdGQ6OnN0cmluZztcbiIKKyAgICAiICB9XG4iCisgICAgIiAgJG5hbWUkXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAiICBzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICIgIGlmICgkbmFtZSRfID09ICYkZGVmYXVsdF92YXJpYWJsZSQpIHtcbiIpOworICBpZiAoZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiICAgICRuYW1lJF8gPSBuZXcgOjpzdGQ6OnN0cmluZztcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiICAgICRuYW1lJF8gPSBuZXcgOjpzdGQ6OnN0cmluZygkZGVmYXVsdF92YXJpYWJsZSQpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiICB9XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjpyZWxlYXNlXyRuYW1lJCgpIHtcbiIKKyAgICAiICBjbGVhcl9oYXNfJG5hbWUkKCk7XG4iCisgICAgIiAgaWYgKCRuYW1lJF8gPT0gJiRkZWZhdWx0X3ZhcmlhYmxlJCkge1xuIgorICAgICIgICAgcmV0dXJuIE5VTEw7XG4iCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSAkbmFtZSRfO1xuIgorICAgICIgICAgJG5hbWUkXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKKyAgICAiICAgIHJldHVybiB0ZW1wO1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVOb25JbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmICghZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiY29uc3QgOjpzdGQ6OnN0cmluZyAkY2xhc3NuYW1lJDo6JGRlZmF1bHRfdmFyaWFibGUkKCRkZWZhdWx0JCk7XG4iKTsKKyAgfQorfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAoJG5hbWUkXyAhPSAmJGRlZmF1bHRfdmFyaWFibGUkKSB7XG4iCisgICAgICAiICAkbmFtZSRfLT5jbGVhcigpO1xuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKCRuYW1lJF8gIT0gJiRkZWZhdWx0X3ZhcmlhYmxlJCkge1xuIgorICAgICAgIiAgJG5hbWUkXy0+YXNzaWduKCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzZXRfJG5hbWUkKGZyb20uJG5hbWUkKCkpO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInN0ZDo6c3dhcCgkbmFtZSRfLCBvdGhlci0+JG5hbWUkXyk7XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkbmFtZSRfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCYkZGVmYXVsdF92YXJpYWJsZSQpO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJG5hbWUkXyAhPSAmJGRlZmF1bHRfdmFyaWFibGUkKSB7XG4iCisgICAgIiAgZGVsZXRlICRuYW1lJF87XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkJGRlY2xhcmVkX3R5cGUkKFxuIgorICAgICIgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV8kbmFtZSQoKSkpO1xuIik7CisgIGlmIChIYXNVdGY4VmVyaWZpY2F0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpICYmCisgICAgICBkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoXG4iCisgICAgICAiICB0aGlzLT4kbmFtZSQoKS5kYXRhKCksIHRoaXMtPiRuYW1lJCgpLmxlbmd0aCgpLFxuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpO1xuIik7CisgIH0KK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoSGFzVXRmOFZlcmlmaWNhdGlvbihkZXNjcmlwdG9yXy0+ZmlsZSgpKSAmJgorICAgICAgZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKFxuIgorICAgICAgIiAgdGhpcy0+JG5hbWUkKCkuZGF0YSgpLCB0aGlzLT4kbmFtZSQoKS5sZW5ndGgoKSxcbiIKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGUkZGVjbGFyZWRfdHlwZSQoXG4iCisgICAgIiAgJG51bWJlciQsIHRoaXMtPiRuYW1lJCgpLCBvdXRwdXQpO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChIYXNVdGY4VmVyaWZpY2F0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpICYmCisgICAgICBkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoXG4iCisgICAgICAiICB0aGlzLT4kbmFtZSQoKS5kYXRhKCksIHRoaXMtPiRuYW1lJCgpLmxlbmd0aCgpLFxuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInRhcmdldCA9XG4iCisgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJGRlY2xhcmVkX3R5cGUkVG9BcnJheShcbiIKKyAgICAiICAgICRudW1iZXIkLCB0aGlzLT4kbmFtZSQoKSwgdGFyZ2V0KTtcbiIpOworfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAidG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICtcbiIKKyAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JGRlY2xhcmVkX3R5cGUkU2l6ZShcbiIKKyAgICAiICAgIHRoaXMtPiRuYW1lJCgpKTtcbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBTZXRTdHJpbmdWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4gJG5hbWUkXztcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBTZWUgY29tbWVudCBhYm92ZSBhYm91dCB1bmtub3duIGN0eXBlcy4KKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkuY3R5cGUoKSAhPSBGaWVsZE9wdGlvbnM6OlNUUklORykgeworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgcHJpdmF0ZTpcbiIKKyAgICAgICIgIC8vIEhpZGRlbiBkdWUgdG8gdW5rbm93biBjdHlwZSBvcHRpb24uXG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkbmFtZSQoaW50IGluZGV4KSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlXyRuYW1lJChpbnQgaW5kZXgpJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIHZvaWQgc2V0XyRuYW1lJChpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIHNldF8kbmFtZSQoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgIgorICAgICJ2b2lkIHNldF8kbmFtZSQoaW50IGluZGV4LCBjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsIHNpemVfdCBzaXplKSIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSA6OnN0ZDo6c3RyaW5nKiBhZGRfJG5hbWUkKCkkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgdm9pZCBhZGRfJG5hbWUkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iCisgICAgImlubGluZSB2b2lkIGFkZF8kbmFtZSQoY29uc3QgY2hhciogdmFsdWUpJGRlcHJlY2F0aW9uJDtcbiIKKyAgICAiaW5saW5lIHZvaWQgYWRkXyRuYW1lJChjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsIHNpemVfdCBzaXplKSIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiQ7XG4iKTsKKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYgJG5hbWUkKCkgY29uc3QiCisgICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kO1xuIgorICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiogbXV0YWJsZV8kbmFtZSQoKSIKKyAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiQ7XG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5jdHlwZSgpICE9IEZpZWxkT3B0aW9uczo6U1RSSU5HKSB7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCIgcHVibGljOlxuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5HZXQoaW5kZXgpO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSA6OnN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uTXV0YWJsZShpbmRleCk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkge1xuIgorICAgICIgICRuYW1lJF8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkge1xuIgorICAgICIgICRuYW1lJF8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIHZvaWQgIgorICAgICIkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJCIKKyAgICAiKGludCBpbmRleCwgY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkge1xuIgorICAgICIgICRuYW1lJF8uTXV0YWJsZShpbmRleCktPmFzc2lnbihcbiIKKyAgICAiICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLkFkZCgpO1xuIgorICAgICJ9XG4iCisgICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7XG4iCisgICAgIiAgJG5hbWUkXy5BZGQoKS0+YXNzaWduKHZhbHVlKTtcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJChjb25zdCBjaGFyKiB2YWx1ZSkge1xuIgorICAgICIgICRuYW1lJF8uQWRkKCktPmFzc2lnbih2YWx1ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiaW5saW5lIHZvaWQgIgorICAgICIkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJChjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsIHNpemVfdCBzaXplKSB7XG4iCisgICAgIiAgJG5hbWUkXy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7XG4iCisgICAgIn1cbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiZcbiIKKyAgICAiJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAifVxuIgorICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPipcbiIKKyAgICAiJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAmJG5hbWUkXztcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5DbGVhcigpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLk1lcmdlRnJvbShmcm9tLiRuYW1lJF8pO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5Td2FwKCZvdGhlci0+JG5hbWUkXyk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIE5vdCBuZWVkZWQgZm9yIHJlcGVhdGVkIGZpZWxkcy4KK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkJGRlY2xhcmVkX3R5cGUkKFxuIgorICAgICIgICAgICBpbnB1dCwgdGhpcy0+YWRkXyRuYW1lJCgpKSk7XG4iKTsKKyAgaWYgKEhhc1V0ZjhWZXJpZmljYXRpb24oZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKKyAgICAgIGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZyhcbiIKKyAgICAgICIgIHRoaXMtPiRuYW1lJCh0aGlzLT4kbmFtZSRfc2l6ZSgpIC0gMSkuZGF0YSgpLFxuIgorICAgICAgIiAgdGhpcy0+JG5hbWUkKHRoaXMtPiRuYW1lJF9zaXplKCkgLSAxKS5sZW5ndGgoKSxcbiIKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTtcbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7CisgIGlmIChIYXNVdGY4VmVyaWZpY2F0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpICYmCisgICAgICBkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoXG4iCisgICAgICAiICB0aGlzLT4kbmFtZSQoaSkuZGF0YSgpLCB0aGlzLT4kbmFtZSQoaSkubGVuZ3RoKCksXG4iCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGUkZGVjbGFyZWRfdHlwZSQoXG4iCisgICAgIiAgICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKGkpLCBvdXRwdXQpO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7CisgIGlmIChIYXNVdGY4VmVyaWZpY2F0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpICYmCisgICAgICBkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZyhcbiIKKyAgICAgICIgICAgdGhpcy0+JG5hbWUkKGkpLmRhdGEoKSwgdGhpcy0+JG5hbWUkKGkpLmxlbmd0aCgpLFxuIgorICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6XG4iCisgICAgIiAgICBXcml0ZSRkZWNsYXJlZF90eXBlJFRvQXJyYXkoJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgdGFyZ2V0KTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCAqIHRoaXMtPiRuYW1lJF9zaXplKCk7XG4iCisgICAgImZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+JG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iCisgICAgIiAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JGRlY2xhcmVkX3R5cGUkU2l6ZShcbiIKKyAgICAiICAgIHRoaXMtPiRuYW1lJChpKSk7XG4iCisgICAgIn1cbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0NTEwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfU1RSSU5HX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1NUUklOR19GSUVMRF9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBjcHAgeworCitjbGFzcyBTdHJpbmdGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBTdHJpbmdGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB+U3RyaW5nRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVOb25JbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZURlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RyaW5nRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIH5SZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKCk7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjcHAKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9TVFJJTkdfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGQ4MzBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bwpAQCAtMCwwICsxLDExMyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIHRlc3RzIHRoYXQgdmFyaW91cyBpZGVudGlmaWVycyB3b3JrIGFzIGZpZWxkIGFuZCB0eXBlIG5hbWVzIGV2ZW4KKy8vIHRob3VnaCB0aGUgc2FtZSBpZGVudGlmaWVycyBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBDKysgY29kZSBnZW5lcmF0b3IuCisKKworLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgorLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKK29wdGlvbiBjY19nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAgIC8vIGF1dG8tYWRkZWQKKworLy8gV2UgZG9uJ3QgcHV0IHRoaXMgaW4gYSBwYWNrYWdlIHdpdGhpbiBwcm90bzIgYmVjYXVzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorLy8gdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgZG9lc24ndCBkZXBlbmQgb24gYmVpbmcgaW4gdGhlIHByb3RvMiBuYW1lc3BhY2UuCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCisvLyBUZXN0IHRoYXQgZmllbGRzIGNhbiBoYXZlIG5hbWVzIGxpa2UgImlucHV0IiBhbmQgImkiIHdoaWNoIGFyZSBhbHNvIHVzZWQKKy8vIGludGVybmFsbHkgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIGZvciBsb2NhbCB2YXJpYWJsZXMuCittZXNzYWdlIFRlc3RDb25mbGljdGluZ1N5bWJvbE5hbWVzIHsKKyAgbWVzc2FnZSBCdWlsZERlc2NyaXB0b3JzIHt9CisgIG1lc3NhZ2UgVHlwZVRyYWl0cyB7fQorCisgIG9wdGlvbmFsIGludDMyIGlucHV0ID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgb3V0cHV0ID0gMjsKKyAgb3B0aW9uYWwgc3RyaW5nIGxlbmd0aCA9IDM7CisgIHJlcGVhdGVkIGludDMyIGkgPSA0OworICByZXBlYXRlZCBzdHJpbmcgbmV3X2VsZW1lbnQgPSA1IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICBvcHRpb25hbCBpbnQzMiB0b3RhbF9zaXplID0gNjsKKyAgb3B0aW9uYWwgaW50MzIgdGFnID0gNzsKKworICBlbnVtIFRlc3RFbnVtIHsgRk9PID0gMTsgfQorICBtZXNzYWdlIERhdGExIHsgcmVwZWF0ZWQgaW50MzIgZGF0YSA9IDE7IH0KKyAgbWVzc2FnZSBEYXRhMiB7IHJlcGVhdGVkIFRlc3RFbnVtIGRhdGEgPSAxOyB9CisgIG1lc3NhZ2UgRGF0YTMgeyByZXBlYXRlZCBzdHJpbmcgZGF0YSA9IDE7IH0KKyAgbWVzc2FnZSBEYXRhNCB7IHJlcGVhdGVkIERhdGE0IGRhdGEgPSAxOyB9CisgIG1lc3NhZ2UgRGF0YTUgeyByZXBlYXRlZCBzdHJpbmcgZGF0YSA9IDEgW2N0eXBlPVNUUklOR19QSUVDRV07IH0KKyAgbWVzc2FnZSBEYXRhNiB7IHJlcGVhdGVkIHN0cmluZyBkYXRhID0gMSBbY3R5cGU9Q09SRF07IH0KKworICBvcHRpb25hbCBpbnQzMiBzb3VyY2UgPSA4OworICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDk7CisgIG9wdGlvbmFsIGludDMyIGZpbGUgPSAxMDsKKyAgb3B0aW9uYWwgaW50MzIgZnJvbSA9IDExOworICBvcHRpb25hbCBpbnQzMiBoYW5kbGVfdW5pbnRlcnByZXRlZCA9IDEyOworICByZXBlYXRlZCBpbnQzMiBpbmRleCA9IDEzOworICBvcHRpb25hbCBpbnQzMiBjb250cm9sbGVyID0gMTQ7CisgIG9wdGlvbmFsIGludDMyIGFscmVhZHlfaGVyZSA9IDE1OworCisgIG9wdGlvbmFsIHVpbnQzMiB1aW50MzIgPSAxNjsKKyAgb3B0aW9uYWwgdWludDY0IHVpbnQ2NCA9IDE3OworICBvcHRpb25hbCBzdHJpbmcgc3RyaW5nID0gMTg7CisgIG9wdGlvbmFsIGludDMyIG1lbXNldCA9IDE5OworICBvcHRpb25hbCBpbnQzMiBpbnQzMiA9IDIwOworICBvcHRpb25hbCBpbnQ2NCBpbnQ2NCA9IDIxOworCisgIG9wdGlvbmFsIHVpbnQzMiBjYWNoZWRfc2l6ZSA9IDIyOworICBvcHRpb25hbCB1aW50MzIgZXh0ZW5zaW9ucyA9IDIzOworICBvcHRpb25hbCB1aW50MzIgYml0ID0gMjQ7CisgIG9wdGlvbmFsIHVpbnQzMiBiaXRzID0gMjU7CisgIG9wdGlvbmFsIHVpbnQzMiBvZmZzZXRzID0gMjY7CisgIG9wdGlvbmFsIHVpbnQzMiByZWZsZWN0aW9uID0gMjc7CisKKyAgbWVzc2FnZSBDb3JkIHt9CisgIG9wdGlvbmFsIHN0cmluZyBzb21lX2NvcmQgPSAyOCBbY3R5cGU9Q09SRF07CisKKyAgbWVzc2FnZSBTdHJpbmdQaWVjZSB7fQorICBvcHRpb25hbCBzdHJpbmcgc29tZV9zdHJpbmdfcGllY2UgPSAyOSBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKKworICAvLyBTb21lIGtleXdvcmRzLgorICBvcHRpb25hbCB1aW50MzIgaW50ID0gMzA7CisgIG9wdGlvbmFsIHVpbnQzMiBmcmllbmQgPSAzMTsKKworICAvLyBUaGUgZ2VuZXJhdG9yIHVzZWQgdG8gI2RlZmluZSBhIG1hY3JvIGNhbGxlZCAiRE8iIGluc2lkZSB0aGUgLmNjIGZpbGUuCisgIG1lc3NhZ2UgRE8ge30KKyAgb3B0aW9uYWwgRE8gZG8gPSAzMjsKKworICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIER1bW15TWVzc2FnZSB7fQorCitzZXJ2aWNlIFRlc3RDb25mbGljdGluZ01ldGhvZE5hbWVzIHsKKyAgcnBjIENsb3N1cmUoRHVtbXlNZXNzYWdlKSByZXR1cm5zIChEdW1teU1lc3NhZ2UpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxYTdjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMjgxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUbyB0ZXN0IHRoZSBjb2RlIGdlbmVyYXRvciwgd2UgYWN0dWFsbHkgdXNlIGl0IHRvIGdlbmVyYXRlIGNvZGUgZm9yCisvLyBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8sIHRoZW4gdGVzdCB0aGF0LiAgVGhpcyBtZWFucyB0aGF0IHdlCisvLyBhcmUgYWN0dWFsbHkgdGVzdGluZyB0aGUgcGFyc2VyIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgc3lzdGVtIGF0IHRoZSBzYW1lCisvLyB0aW1lLCBhbmQgdGhhdCBwcm9ibGVtcyBpbiB0aGUgZ2VuZXJhdG9yIG1heSBzaG93IHVwIGFzIGNvbXBpbGUtdGltZSBlcnJvcnMKKy8vIHJhdGhlciB0aGFuIHVuaXR0ZXN0IGZhaWx1cmVzLCB3aGljaCBtYXkgYmUgc3VycHJpc2luZy4gIEhvd2V2ZXIsIHRlc3RpbmcKKy8vIHRoZSBvdXRwdXQgb2YgdGhlIEMrKyBnZW5lcmF0b3IgZGlyZWN0bHkgd291bGQgYmUgdmVyeSBoYXJkLiAgV2UgY2FuJ3QgdmVyeQorLy8gd2VsbCBqdXN0IGNoZWNrIGl0IGFnYWluc3QgZ29sZGVuIGZpbGVzIHNpbmNlIHRob3NlIGZpbGVzIHdvdWxkIGhhdmUgdG8gYmUKKy8vIHVwZGF0ZWQgZm9yIGFueSBzbWFsbCBjaGFuZ2U7IHN1Y2ggYSB0ZXN0IHdvdWxkIGJlIHZlcnkgYnJpdHRsZSBhbmQgcHJvYmFibHkKKy8vIG5vdCB2ZXJ5IGhlbHBmdWwuICBXaGF0IHdlIHJlYWxseSB3YW50IHRvIHRlc3QgaXMgdGhhdCB0aGUgY29kZSBjb21waWxlcworLy8gY29ycmVjdGx5IGFuZCBwcm9kdWNlcyB0aGUgaW50ZXJmYWNlcyB3ZSBleHBlY3QsIHdoaWNoIGlzIHdoeSB0aGlzIHRlc3QKKy8vIGlzIHdyaXR0ZW4gdGhpcyB3YXkuCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgY3BwIHsKKworLy8gQ2FuJ3QgdXNlIGFuIGFub255bW91cyBuYW1lc3BhY2UgaGVyZSBkdWUgdG8gYnJva2VubmVzcyBvZiBUcnU2NCBjb21waWxlci4KK25hbWVzcGFjZSBjcHBfdW5pdHRlc3QgeworCisKK2NsYXNzIE1vY2tFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorICB+TW9ja0Vycm9yQ29sbGVjdG9yKCkge30KKworICBzdHJpbmcgdGV4dF87CisKKyAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiQyOiAkM1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOworICB9Cit9OworCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworLy8gVGVzdCB0aGF0IGdlbmVyYXRlZCBjb2RlIGhhcyBwcm9wZXIgZGVzY3JpcHRvcnM6CisvLyBQYXJzZSBhIGRlc2NyaXB0b3IgZGlyZWN0bHkgKHVzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpJbXBvcnRlcikgYW5kCisvLyBjb21wYXJlIGl0IHRvIHRoZSBvbmUgdGhhdCB3YXMgcHJvZHVjZWQgYnkgZ2VuZXJhdGVkIGNvZGUuCitURVNUKEdlbmVyYXRlZERlc2NyaXB0b3JUZXN0LCBJZGVudGljYWxEZXNjcmlwdG9ycykgeworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZ2VuZXJhdGVkX2Rlc2NyaXB0b3IgPQorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworCisgIC8vIFNldCB1cCB0aGUgSW1wb3J0ZXIuCisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERpc2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlOworICBzb3VyY2VfdHJlZS5NYXBQYXRoKCIiLCBUZXN0U291cmNlRGlyKCkpOworICBJbXBvcnRlciBpbXBvcnRlcigmc291cmNlX3RyZWUsICZlcnJvcl9jb2xsZWN0b3IpOworCisgIC8vIEltcG9ydCAocGFyc2UpIHVuaXR0ZXN0LnByb3RvLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogcGFyc2VkX2Rlc2NyaXB0b3IgPQorICAgIGltcG9ydGVyLkltcG9ydCgiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIik7CisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKKyAgQVNTRVJUX1RSVUUocGFyc2VkX2Rlc2NyaXB0b3IgIT0gTlVMTCk7CisKKyAgLy8gVGVzdCB0aGF0IGRlc2NyaXB0b3JzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5IGJ5IGNvbnZlcnRpbmcgdGhlbSB0bworICAvLyBGaWxlRGVzY3JpcHRvclByb3RvcyBhbmQgY29tcGFyaW5nLgorICBGaWxlRGVzY3JpcHRvclByb3RvIGdlbmVyYXRlZF9kZWNzcmlwdG9yX3Byb3RvLCBwYXJzZWRfZGVzY3JpcHRvcl9wcm90bzsKKyAgZ2VuZXJhdGVkX2Rlc2NyaXB0b3ItPkNvcHlUbygmZ2VuZXJhdGVkX2RlY3NyaXB0b3JfcHJvdG8pOworICBwYXJzZWRfZGVzY3JpcHRvci0+Q29weVRvKCZwYXJzZWRfZGVzY3JpcHRvcl9wcm90byk7CisKKyAgRVhQRUNUX0VRKHBhcnNlZF9kZXNjcmlwdG9yX3Byb3RvLkRlYnVnU3RyaW5nKCksCisgICAgICAgICAgICBnZW5lcmF0ZWRfZGVjc3JpcHRvcl9wcm90by5EZWJ1Z1N0cmluZygpKTsKK30KKworI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIERlZmF1bHRzKSB7CisgIC8vIENoZWNrIHRoYXQgYWxsIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBpbml0aWFsIG1lc3NhZ2UuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7CisKKyAgLy8gTWVzc2FnZXMgc2hvdWxkIHJldHVybiBwb2ludGVycyB0byBkZWZhdWx0IGluc3RhbmNlcyB1bnRpbCBmaXJzdCB1c2UuCisgIC8vIChUaGlzIGlzIG5vdCBjaGVja2VkIGJ5IEV4cGVjdENsZWFyKCkgc2luY2UgaXQgaXMgbm90IGFjdHVhbGx5IHRydWUgYWZ0ZXIKKyAgLy8gdGhlIGZpZWxkcyBoYXZlIGJlZW4gc2V0IGFuZCB0aGVuIGNsZWFyZWQuKQorICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok9wdGlvbmFsR3JvdXA6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsZ3JvdXAoKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgRmxvYXRpbmdQb2ludERlZmF1bHRzKSB7CisgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMmIGV4dHJlbWVfZGVmYXVsdCA9CisgICAgICB1bml0dGVzdDo6VGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzOjpkZWZhdWx0X2luc3RhbmNlKCk7CisKKyAgRVhQRUNUX0VRKDAuMGYsIGV4dHJlbWVfZGVmYXVsdC56ZXJvX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoMS4wZiwgZXh0cmVtZV9kZWZhdWx0Lm9uZV9mbG9hdCgpKTsKKyAgRVhQRUNUX0VRKDEuNWYsIGV4dHJlbWVfZGVmYXVsdC5zbWFsbF9mbG9hdCgpKTsKKyAgRVhQRUNUX0VRKC0xLjBmLCBleHRyZW1lX2RlZmF1bHQubmVnYXRpdmVfb25lX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoLTEuNWYsIGV4dHJlbWVfZGVmYXVsdC5uZWdhdGl2ZV9mbG9hdCgpKTsKKyAgRVhQRUNUX0VRKDIuMGU4ZiwgZXh0cmVtZV9kZWZhdWx0LmxhcmdlX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoLThlLTI4ZiwgZXh0cmVtZV9kZWZhdWx0LnNtYWxsX25lZ2F0aXZlX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEobnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSwKKyAgICAgICAgICAgIGV4dHJlbWVfZGVmYXVsdC5pbmZfZG91YmxlKCkpOworICBFWFBFQ1RfRVEoLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCksCisgICAgICAgICAgICBleHRyZW1lX2RlZmF1bHQubmVnX2luZl9kb3VibGUoKSk7CisgIEVYUEVDVF9UUlVFKGV4dHJlbWVfZGVmYXVsdC5uYW5fZG91YmxlKCkgIT0gZXh0cmVtZV9kZWZhdWx0Lm5hbl9kb3VibGUoKSk7CisgIEVYUEVDVF9FUShudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCksCisgICAgICAgICAgICBleHRyZW1lX2RlZmF1bHQuaW5mX2Zsb2F0KCkpOworICBFWFBFQ1RfRVEoLW51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSwKKyAgICAgICAgICAgIGV4dHJlbWVfZGVmYXVsdC5uZWdfaW5mX2Zsb2F0KCkpOworICBFWFBFQ1RfVFJVRShleHRyZW1lX2RlZmF1bHQubmFuX2Zsb2F0KCkgIT0gZXh0cmVtZV9kZWZhdWx0Lm5hbl9mbG9hdCgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgVHJpZ3JhcGgpIHsKKyAgY29uc3QgdW5pdHRlc3Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyYgZXh0cmVtZV9kZWZhdWx0ID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKworICBFWFBFQ1RfRVEoIj8gPyA/PyA/PyA/Pz8gP1w/LyA/XD8tIiwgZXh0cmVtZV9kZWZhdWx0LmNwcF90cmlncmFwaCgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgQWNjZXNzb3JzKSB7CisgIC8vIFNldCBldmVyeSBmaWVsZCB0byBhIHVuaXF1ZSB2YWx1ZSB0aGVuIGdvIGJhY2sgYW5kIGNoZWNrIGFsbCB0aG9zZQorICAvLyB2YWx1ZXMuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6TW9kaWZ5UmVwZWF0ZWRGaWVsZHMoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZChtZXNzYWdlKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgTXV0YWJsZVN0cmluZ0RlZmF1bHQpIHsKKyAgLy8gbXV0YWJsZV9mb28oKSBmb3IgYSBzdHJpbmcgc2hvdWxkIHJldHVybiBhIHN0cmluZyBpbml0aWFsaXplZCB0byBpdHMKKyAgLy8gZGVmYXVsdCB2YWx1ZS4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIEVYUEVDVF9FUSgiaGVsbG8iLCAqbWVzc2FnZS5tdXRhYmxlX2RlZmF1bHRfc3RyaW5nKCkpOworCisgIC8vIE5vdGUgdGhhdCB0aGUgZmlyc3QgdGltZSB3ZSBjYWxsIG11dGFibGVfZm9vKCksIHdlIGdldCBhIG5ld2x5LWFsbG9jYXRlZAorICAvLyBzdHJpbmcsIGJ1dCBpZiB3ZSBjbGVhciBpdCBhbmQgY2FsbCBpdCBhZ2Fpbiwgd2UgZ2V0IHRoZSBzYW1lIG9iamVjdCBhZ2Fpbi4KKyAgLy8gV2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGl0IGhhcyBpdHMgZGVmYXVsdCB2YWx1ZSBpbiBib3RoIGNhc2VzLgorICBtZXNzYWdlLnNldF9kZWZhdWx0X3N0cmluZygiYmxhaCIpOworICBtZXNzYWdlLkNsZWFyKCk7CisKKyAgRVhQRUNUX0VRKCJoZWxsbyIsICptZXNzYWdlLm11dGFibGVfZGVmYXVsdF9zdHJpbmcoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFJlbGVhc2VTdHJpbmcpIHsKKyAgLy8gQ2hlY2sgdGhhdCByZWxlYXNlX2ZvbygpIHN0YXJ0cyBvdXQgTlVMTCwgYW5kIGdpdmVzIHVzIGEgdmFsdWUKKyAgLy8gdGhhdCB3ZSBjYW4gZGVsZXRlIGFmdGVyIGl0J3MgYmVlbiBzZXQuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBFWFBFQ1RfRVEoTlVMTCwgbWVzc2FnZS5yZWxlYXNlX2RlZmF1bHRfc3RyaW5nKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiaGVsbG8iLCBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nKCkpOworCisgIG1lc3NhZ2Uuc2V0X2RlZmF1bHRfc3RyaW5nKCJibGFoIik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nKCkpOworICBzdHJpbmcqIHN0ciA9IG1lc3NhZ2UucmVsZWFzZV9kZWZhdWx0X3N0cmluZygpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7CisgIEFTU0VSVF9UUlVFKHN0ciAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKCJibGFoIiwgKnN0cik7CisgIGRlbGV0ZSBzdHI7CisKKyAgRVhQRUNUX0VRKE5VTEwsIG1lc3NhZ2UucmVsZWFzZV9kZWZhdWx0X3N0cmluZygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgbWVzc2FnZS5kZWZhdWx0X3N0cmluZygpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUmVsZWFzZU1lc3NhZ2UpIHsKKyAgLy8gQ2hlY2sgdGhhdCByZWxlYXNlX2ZvbygpIHN0YXJ0cyBvdXQgTlVMTCwgYW5kIGdpdmVzIHVzIGEgdmFsdWUKKyAgLy8gdGhhdCB3ZSBjYW4gZGVsZXRlIGFmdGVyIGl0J3MgYmVlbiBzZXQuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBFWFBFQ1RfRVEoTlVMTCwgbWVzc2FnZS5yZWxlYXNlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxKTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogbmVzdCA9CisgICAgICBtZXNzYWdlLnJlbGVhc2Vfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBBU1NFUlRfVFJVRShuZXN0ICE9IE5VTEwpOworICBFWFBFQ1RfRVEoMSwgbmVzdC0+YmIoKSk7CisgIGRlbGV0ZSBuZXN0OworCisgIEVYUEVDVF9FUShOVUxMLCBtZXNzYWdlLnJlbGVhc2Vfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgQ2xlYXIpIHsKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlLCBjbGVhciB0aGUgbWVzc2FnZSwgdGhlbiBjaGVjayB0aGF0CisgIC8vIGl0IGlzIGNsZWFyZWQuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7CisKKyAgLy8gVW5saWtlIHdpdGggdGhlIGRlZmF1bHRzIHRlc3QsIHdlIGRvIE5PVCBleHBlY3QgdGhhdCByZXF1ZXN0aW5nIGVtYmVkZGVkCisgIC8vIG1lc3NhZ2VzIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZS4gIEluc3RlYWQsIHRoZXkKKyAgLy8gc2hvdWxkIHJldHVybiB0aGUgb2JqZWN0cyB0aGF0IHdlcmUgY3JlYXRlZCB3aGVuIG11dGFibGVfYmxhaCgpIHdhcworICAvLyBjYWxsZWQuCisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6T3B0aW9uYWxHcm91cDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxncm91cCgpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBFbWJlZGRlZE51bGxzSW5CeXRlc0NoYXJTdGFyKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBjb25zdCBjaGFyKiB2YWx1ZSA9ICJcMGxhbGFsYVwwXDAiOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9ieXRlcyh2YWx1ZSwgOSk7CisgIEFTU0VSVF9FUSg5LCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzKCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lbWNtcCh2YWx1ZSwgbWVzc2FnZS5vcHRpb25hbF9ieXRlcygpLmRhdGEoKSwgOSkpOworCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2J5dGVzKHZhbHVlLCA5KTsKKyAgQVNTRVJUX0VRKDksIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMoMCkuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lbWNtcCh2YWx1ZSwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcygwKS5kYXRhKCksIDkpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgQ2xlYXJPbmVGaWVsZCkgeworICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUsIHRoZW4gY2xlYXIgb25lIHZhbHVlIGFuZCBpbnN1cmUgdGhhdAorICAvLyBvbmx5IHRoYXQgb25lIHZhbHVlIGlzIGNsZWFyZWQuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKyAgaW50NjQgb3JpZ2luYWxfdmFsdWUgPSBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KCk7CisKKyAgLy8gQ2xlYXIgdGhlIGZpZWxkIGFuZCBtYWtlIHN1cmUgaXQgc2hvd3MgdXAgYXMgY2xlYXJlZC4KKyAgbWVzc2FnZS5jbGVhcl9vcHRpb25hbF9pbnQ2NCgpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50NjQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KCkpOworCisgIC8vIE90aGVyIGFkamFjZW50IGZpZWxkcyBzaG91bGQgbm90IGJlIGNsZWFyZWQuCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF91aW50MzIoKSk7CisKKyAgLy8gTWFrZSBzdXJlIGlmIHdlIHNldCBpdCBhZ2FpbiwgdGhlbiBhbGwgZmllbGRzIGFyZSBzZXQuCisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2ludDY0KG9yaWdpbmFsX3ZhbHVlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU3RyaW5nQ2hhclN0YXJMZW5ndGgpIHsKKyAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIHVzZSBhIGNoYXIqLGxlbmd0aCB0byBzZXQgb25lIG9mIHRoZSBzdHJpbmcgZmllbGRzLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygiYWJjZGVmIiwgMyk7CisgIEVYUEVDVF9FUSgiYWJjIiwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcoKSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIHVzZSBhIGNoYXIqLGxlbmd0aCB0byBhZGQgdG8gYSByZXBlYXRlZCBzdHJpbmcgZmllbGQuCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiYWJjZGVmIiwgMyk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoImFiYyIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDApKTsKKworICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gdXNlIGEgY2hhciosbGVuZ3RoIHRvIHNldCBhIHJlcGVhdGVkIHN0cmluZyBmaWVsZC4KKyAgbWVzc2FnZS5zZXRfcmVwZWF0ZWRfc3RyaW5nKDAsICJ3eHl6IiwgMik7CisgIEVYUEVDVF9FUSgid3giLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygwKSk7Cit9CisKKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgQ29weUZyb20pIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworCisgIC8vIENvcHlpbmcgZnJvbSBzZWxmIHNob3VsZCBiZSBhIG5vLW9wLgorICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMik7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFN3YXBXaXRoRW1wdHkpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UyKTsKKyAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UxKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU3dhcFdpdGhTZWxmKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgIG1lc3NhZ2UuU3dhcCgmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFN3YXBXaXRoT3RoZXIpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX2ludDMyKDEyMyk7CisgIG1lc3NhZ2UxLnNldF9vcHRpb25hbF9zdHJpbmcoImFiYyIpOworICBtZXNzYWdlMS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxKTsKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIG1lc3NhZ2UxLmFkZF9yZXBlYXRlZF9pbnQzMigxKTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX2ludDMyKDIpOworICBtZXNzYWdlMS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJhIik7CisgIG1lc3NhZ2UxLmFkZF9yZXBlYXRlZF9zdHJpbmcoImIiKTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig3KTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig4KTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIG1lc3NhZ2UxLmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIpOworCisgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9pbnQzMig0NTYpOworICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfc3RyaW5nKCJkZWYiKTsKKyAgbWVzc2FnZTIubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMik7CisgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9uZXN0ZWRfZW51bSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIpOworICBtZXNzYWdlMi5hZGRfcmVwZWF0ZWRfaW50MzIoMyk7CisgIG1lc3NhZ2UyLmFkZF9yZXBlYXRlZF9zdHJpbmcoImMiKTsKKyAgbWVzc2FnZTIuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig5KTsKKyAgbWVzc2FnZTIuYWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWik7CisKKyAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOworCisgIEVYUEVDVF9FUSg0NTYsIG1lc3NhZ2UxLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoImRlZiIsIG1lc3NhZ2UxLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UxLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuYmIoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UxLm9wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZTEucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMsIG1lc3NhZ2UxLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UxLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoImMiLCBtZXNzYWdlMS5yZXBlYXRlZF9zdHJpbmcoMCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZTEucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDksIG1lc3NhZ2UxLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZTEucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZTEucmVwZWF0ZWRfbmVzdGVkX2VudW0oMCkpOworCisgIEVYUEVDVF9FUSgxMjMsIG1lc3NhZ2UyLm9wdGlvbmFsX2ludDMyKCkpOworICBFWFBFQ1RfRVEoImFiYyIsIG1lc3NhZ2UyLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UyLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuYmIoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UyLm9wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZTIucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UyLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UyLnJlcGVhdGVkX2ludDMyKDEpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UyLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoImEiLCBtZXNzYWdlMi5yZXBlYXRlZF9zdHJpbmcoMCkpOworICBFWFBFQ1RfRVEoImIiLCBtZXNzYWdlMi5yZXBlYXRlZF9zdHJpbmcoMSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZTIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDcsIG1lc3NhZ2UyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOworICBFWFBFQ1RfRVEoOCwgbWVzc2FnZTIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMSkuYmIoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlMi5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PLCBtZXNzYWdlMi5yZXBlYXRlZF9uZXN0ZWRfZW51bSgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UyLnJlcGVhdGVkX25lc3RlZF9lbnVtKDEpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKKworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UyKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIENvcHlBc3NpZ25tZW50T3BlcmF0b3IpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMTsKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7CisgIG1lc3NhZ2UyID0gbWVzc2FnZTE7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHNlbGYtYXNzaWdubWVudCBkb2VzIHNvbWV0aGluZyBzYW5lLgorICBtZXNzYWdlMi5vcGVyYXRvcj0obWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgVXBjYXN0Q29weUZyb20pIHsKKyAgLy8gVGVzdCB0aGUgQ29weUZyb20gbWV0aG9kIHRoYXQgdGFrZXMgaW4gdGhlIGdlbmVyaWMgY29uc3QgTWVzc2FnZSYKKyAgLy8gcGFyYW1ldGVyLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7CisKKyAgY29uc3QgTWVzc2FnZSogc291cmNlID0gaW1wbGljaXRfY2FzdDxjb25zdCBNZXNzYWdlKj4oJm1lc3NhZ2UxKTsKKyAgbWVzc2FnZTIuQ29weUZyb20oKnNvdXJjZSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7Cit9CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBEeW5hbWljTWVzc2FnZUNvcHlGcm9tKSB7CisgIC8vIFRlc3QgY29weWluZyBmcm9tIGEgRHluYW1pY01lc3NhZ2UsIHdoaWNoIG11c3QgZmFsbCBiYWNrIHRvIHVzaW5nCisgIC8vIHJlZmxlY3Rpb24uCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7CisKKyAgLy8gQ29uc3RydWN0IGEgbmV3IHZlcnNpb24gb2YgdGhlIGR5bmFtaWMgbWVzc2FnZSB2aWEgdGhlIGZhY3RvcnkuCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBzY29wZWRfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UxOworICBtZXNzYWdlMS5yZXNldChmYWN0b3J5LkdldFByb3RvdHlwZSgKKyAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSktPk5ldygpKTsKKworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKKyAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UxLmdldCgpKTsKKworICBtZXNzYWdlMi5Db3B5RnJvbSgqbWVzc2FnZTEpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIE5vbkVtcHR5TWVyZ2VGcm9tKSB7CisgIC8vIFRlc3QgbWVyZ2luZyB3aXRoIGEgbm9uLWVtcHR5IG1lc3NhZ2UuIENvZGUgaXMgYSBtb2RpZmllZCBmb3JtCisgIC8vIG9mIHRoYXQgZm91bmQgaW4gZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7CisKKyAgLy8gVGhpcyBmaWVsZCB3aWxsIHRlc3QgbWVyZ2luZyBpbnRvIGFuIGVtcHR5IHNwb3QuCisgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9pbnQzMihtZXNzYWdlMS5vcHRpb25hbF9pbnQzMigpKTsKKyAgbWVzc2FnZTEuY2xlYXJfb3B0aW9uYWxfaW50MzIoKTsKKworICAvLyBUaGlzIHRlc3RzIG92ZXJ3cml0aW5nLgorICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfc3RyaW5nKG1lc3NhZ2UxLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX3N0cmluZygic29tZXRoaW5nIGVsc2UiKTsKKworICAvLyBUaGlzIHRlc3RzIGNvbmNhdGVuYXRpbmcuCisgIG1lc3NhZ2UyLmFkZF9yZXBlYXRlZF9pbnQzMihtZXNzYWdlMS5yZXBlYXRlZF9pbnQzMigxKSk7CisgIGludDMyIGkgPSBtZXNzYWdlMS5yZXBlYXRlZF9pbnQzMigwKTsKKyAgbWVzc2FnZTEuY2xlYXJfcmVwZWF0ZWRfaW50MzIoKTsKKyAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX2ludDMyKGkpOworCisgIG1lc3NhZ2UxLk1lcmdlRnJvbShtZXNzYWdlMik7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMSk7Cit9CisKKyNpZmRlZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBNZXJnZUZyb21TZWxmKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgRVhQRUNUX0RFQVRIKG1lc3NhZ2UuTWVyZ2VGcm9tKG1lc3NhZ2UpLCAiJmZyb20iKTsKKyAgRVhQRUNUX0RFQVRIKG1lc3NhZ2UuTWVyZ2VGcm9tKGltcGxpY2l0X2Nhc3Q8Y29uc3QgTWVzc2FnZSY+KG1lc3NhZ2UpKSwKKyAgICAgICAgICAgICAgICImZnJvbSIpOworfQorCisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKy8vIFRlc3QgdGhlIGdlbmVyYXRlZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KCksCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBTZXJpYWxpemF0aW9uVG9BcnJheSkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgc3RyaW5nIGRhdGE7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKKyAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOworICBkYXRhLnJlc2l6ZShzaXplKTsKKyAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmZGF0YSkpOworICB1aW50OCogZW5kID0gbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7CisgIEVYUEVDVF9FUShzaXplLCBlbmQgLSBzdGFydCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworCit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFBhY2tlZEZpZWxkc1NlcmlhbGl6YXRpb25Ub0FycmF5KSB7CisgIHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMgcGFja2VkX21lc3NhZ2UxLCBwYWNrZWRfbWVzc2FnZTI7CisgIHN0cmluZyBwYWNrZWRfZGF0YTsKKyAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmcGFja2VkX21lc3NhZ2UxKTsKKyAgaW50IHBhY2tlZF9zaXplID0gcGFja2VkX21lc3NhZ2UxLkJ5dGVTaXplKCk7CisgIHBhY2tlZF9kYXRhLnJlc2l6ZShwYWNrZWRfc2l6ZSk7CisgIHVpbnQ4KiBzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzdHJpbmdfYXNfYXJyYXkoJnBhY2tlZF9kYXRhKSk7CisgIHVpbnQ4KiBlbmQgPSBwYWNrZWRfbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7CisgIEVYUEVDVF9FUShwYWNrZWRfc2l6ZSwgZW5kIC0gc3RhcnQpOworICBFWFBFQ1RfVFJVRShwYWNrZWRfbWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKHBhY2tlZF9kYXRhKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXQocGFja2VkX21lc3NhZ2UyKTsKK30KKworLy8gVGVzdCB0aGUgZ2VuZXJhdGVkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpIGJ5IGZvcmNpbmcgdGhlIGJ1ZmZlciB0byB3cml0ZQorLy8gb25lIGJ5dGUgYXQgYSB0aW1lLgorVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7CisgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKKyAgc3RyaW5nIGRhdGE7CisgIGRhdGEucmVzaXplKHNpemUpOworICB7CisgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSwgc2l6ZSwgMSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgICAgbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICBFWFBFQ1RfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7CisgIH0KKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUGFja2VkRmllbGRzU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7CisgIHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBUZXN0VXRpbDo6U2V0UGFja2VkRmllbGRzKCZtZXNzYWdlMSk7CisgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKKyAgc3RyaW5nIGRhdGE7CisgIGRhdGEucmVzaXplKHNpemUpOworICB7CisgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSwgc2l6ZSwgMSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgICAgbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICBFWFBFQ1RfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7CisgIH0KKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7Cit9CisKKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUmVxdWlyZWQpIHsKKyAgLy8gVGVzdCB0aGF0IElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIGZhbHNlIGlmIHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4KKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIG1lc3NhZ2Uuc2V0X2EoMSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIG1lc3NhZ2Uuc2V0X2IoMik7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIG1lc3NhZ2Uuc2V0X2MoMyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUmVxdWlyZWRGb3JlaWduKSB7CisgIC8vIFRlc3QgdGhhdCBJc0luaXRpYWxpemVkKCkgcmV0dXJucyBmYWxzZSBpZiByZXF1aXJlZCBmaWVsZHMgaW4gbmVzdGVkCisgIC8vIG1lc3NhZ2VzIGFyZSBtaXNzaW5nLgorICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkRm9yZWlnbiBtZXNzYWdlOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9hKDEpOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpLT5zZXRfYigyKTsKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2MoMyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9tZXNzYWdlKCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX3JlcGVhdGVkX21lc3NhZ2UoMCktPnNldF9hKDEpOworICBtZXNzYWdlLm11dGFibGVfcmVwZWF0ZWRfbWVzc2FnZSgwKS0+c2V0X2IoMik7CisgIG1lc3NhZ2UubXV0YWJsZV9yZXBlYXRlZF9tZXNzYWdlKDApLT5zZXRfYygzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBGb3JlaWduTmVzdGVkKSB7CisgIC8vIFRlc3QgdGhhdCBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UgY2FuIGJlIGVtYmVkZGVkIGRpcmVjdGx5IGludG8KKyAgLy8gYW5vdGhlciBtZXNzYWdlLgorICB1bml0dGVzdDo6VGVzdEZvcmVpZ25OZXN0ZWQgbWVzc2FnZTsKKworICAvLyBJZiB0aGlzIGNvbXBpbGVzIGFuZCBydW5zIHdpdGhvdXQgY3Jhc2hpbmcsIGl0IG11c3Qgd29yay4gIFdlIGhhdmUKKyAgLy8gbm90aGluZyBtb3JlIHRvIHRlc3QuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIG5lc3RlZCA9CisgICAgbWVzc2FnZS5tdXRhYmxlX2ZvcmVpZ25fbmVzdGVkKCk7CisgIG5lc3RlZC0+c2V0X2JiKDEpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBSZWFsbHlMYXJnZVRhZ051bWJlcikgeworICAvLyBUZXN0IHRoYXQgcmVhbGx5IGxhcmdlIHRhZyBudW1iZXJzIGRvbid0IGJyZWFrIGFueXRoaW5nLgorICB1bml0dGVzdDo6VGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgc3RyaW5nIGRhdGE7CisKKyAgLy8gRm9yIHRoZSBtb3N0IHBhcnQsIGlmIHRoaXMgY29tcGlsZXMgYW5kIHJ1bnMgdGhlbiB3ZSdyZSBwcm9iYWJseSBnb29kLgorICAvLyAoVGhlIG1vc3QgbGlrZWx5IGNhdXNlIGZvciBmYWlsdXJlIHdvdWxkIGJlIGlmIHNvbWV0aGluZyB3ZXJlIGF0dGVtcHRpbmcKKyAgLy8gdG8gYWxsb2NhdGUgYSBsb29rdXAgdGFibGUgb2Ygc29tZSBzb3J0IHVzaW5nIHRhZyBudW1iZXJzIGFzIHRoZSBpbmRleC4pCisgIC8vIFdlJ2xsIHRyeSBzZXJpYWxpemluZyBqdXN0IGZvciBmdW4uCisgIG1lc3NhZ2UxLnNldF9hKDEyMzQpOworICBtZXNzYWdlMS5zZXRfYmIoNTY3OCk7CisgIG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgRVhQRUNUX0VRKDEyMzQsIG1lc3NhZ2UyLmEoKSk7CisgIEVYUEVDVF9FUSg1Njc4LCBtZXNzYWdlMi5iYigpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgTXV0dWFsUmVjdXJzaW9uKSB7CisgIC8vIFRlc3QgdGhhdCBtdXR1YWxseS1yZWN1cnNpdmUgbWVzc2FnZSB0eXBlcyB3b3JrLgorICB1bml0dGVzdDo6VGVzdE11dHVhbFJlY3Vyc2lvbkEgbWVzc2FnZTsKKyAgdW5pdHRlc3Q6OlRlc3RNdXR1YWxSZWN1cnNpb25BKiBuZXN0ZWQgPSBtZXNzYWdlLm11dGFibGVfYmIoKS0+bXV0YWJsZV9hKCk7CisgIHVuaXR0ZXN0OjpUZXN0TXV0dWFsUmVjdXJzaW9uQSogbmVzdGVkMiA9IG5lc3RlZC0+bXV0YWJsZV9iYigpLT5tdXRhYmxlX2EoKTsKKworICAvLyBBZ2FpbiwgaWYgdGhlIGFib3ZlIGNvbXBpbGVzIGFuZCBydW5zLCB0aGF0J3MgYWxsIHdlIHJlYWxseSBoYXZlIHRvCisgIC8vIHRlc3QsIGJ1dCBqdXN0IGZvciBydW4gd2UnbGwgY2hlY2sgdGhhdCB0aGUgc3lzdGVtIGRpZG4ndCBzb21laG93IGNvbWUKKyAgLy8gdXAgd2l0aCBhIHBvaW50ZXIgbG9vcC4uLgorICBFWFBFQ1RfTkUoJm1lc3NhZ2UsIG5lc3RlZCk7CisgIEVYUEVDVF9ORSgmbWVzc2FnZSwgbmVzdGVkMik7CisgIEVYUEVDVF9ORShuZXN0ZWQsIG5lc3RlZDIpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBDYW1lbENhc2VGaWVsZE5hbWVzKSB7CisgIC8vIFRoaXMgdGVzdCBpcyBtYWlubHkgY2hlY2tpbmcgdGhhdCB0aGUgZm9sbG93aW5nIGNvbXBpbGVzLCB3aGljaCB2ZXJpZmllcworICAvLyB0aGF0IHRoZSBmaWVsZCBuYW1lcyB3ZXJlIGNvZXJjZWQgdG8gbG93ZXItY2FzZS4KKyAgLy8KKyAgLy8gUHJvdG9jb2wgYnVmZmVycyBzdGFuZGFyZCBzdHlsZSBpcyB0byB1c2UgbG93ZXJjYXNlLXdpdGgtdW5kZXJzY29yZXMgZm9yCisgIC8vIGZpZWxkIG5hbWVzLiAgU29tZSBvbGQgcHJvdG8xIC5wcm90b3MgdW5mb3J0dW5hdGVseSB1c2VkIGNhbWVsLWNhc2UgZmllbGQKKyAgLy8gbmFtZXMuICBJbiBwcm90bzEsIHRoZXNlIG5hbWVzIHdlcmUgZm9yY2VkIHRvIGxvd2VyLWNhc2UuICBTbywgd2UgZG8gdGhlCisgIC8vIHNhbWUgdGhpbmcgaW4gcHJvdG8yLgorCisgIHVuaXR0ZXN0OjpUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBtZXNzYWdlOworCisgIG1lc3NhZ2Uuc2V0X3ByaW1pdGl2ZWZpZWxkKDIpOworICBtZXNzYWdlLnNldF9zdHJpbmdmaWVsZCgiZm9vIik7CisgIG1lc3NhZ2Uuc2V0X2VudW1maWVsZCh1bml0dGVzdDo6Rk9SRUlHTl9GT08pOworICBtZXNzYWdlLm11dGFibGVfbWVzc2FnZWZpZWxkKCktPnNldF9jKDYpOworCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkcHJpbWl0aXZlZmllbGQoOCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkc3RyaW5nZmllbGQoInF1eCIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZGVudW1maWVsZCh1bml0dGVzdDo6Rk9SRUlHTl9CQVIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZG1lc3NhZ2VmaWVsZCgpLT5zZXRfYygxNSk7CisKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UucHJpbWl0aXZlZmllbGQoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgbWVzc2FnZS5zdHJpbmdmaWVsZCgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTywgbWVzc2FnZS5lbnVtZmllbGQoKSk7CisgIEVYUEVDVF9FUSg2LCBtZXNzYWdlLm1lc3NhZ2VmaWVsZCgpLmMoKSk7CisKKyAgRVhQRUNUX0VRKDgsIG1lc3NhZ2UucmVwZWF0ZWRwcmltaXRpdmVmaWVsZCgwKSk7CisgIEVYUEVDVF9FUSgicXV4IiwgbWVzc2FnZS5yZXBlYXRlZHN0cmluZ2ZpZWxkKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiwgbWVzc2FnZS5yZXBlYXRlZGVudW1maWVsZCgwKSk7CisgIEVYUEVDVF9FUSgxNSwgbWVzc2FnZS5yZXBlYXRlZG1lc3NhZ2VmaWVsZCgwKS5jKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBUZXN0Q29uZmxpY3RpbmdTeW1ib2xOYW1lcykgeworICAvLyB0ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byBzdWNjZXNzZnVsbHkgY29tcGlsZWQsIHRoZW4gaXQgd29ya3MuICBUaGUKKyAgLy8gZm9sbG93aW5nIGlzIGp1c3QgYSB0b2tlbiB1c2FnZSB0byBpbnN1cmUgdGhhdCB0aGUgY29kZSBpcywgaW4gZmFjdCwKKyAgLy8gYmVpbmcgY29tcGlsZWQgYW5kIGxpbmtlZC4KKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdENvbmZsaWN0aW5nU3ltYm9sTmFtZXMgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfdWludDMyKDEpOworICBFWFBFQ1RfRVEoMywgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKKworICBtZXNzYWdlLnNldF9mcmllbmRfKDUpOworICBFWFBFQ1RfRVEoNSwgbWVzc2FnZS5mcmllbmRfKCkpOworfQorCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgVGVzdE9wdGltaXplZEZvclNpemUpIHsKKyAgLy8gV2UgcmVseSBvbiB0aGUgdGVzdHMgaW4gcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QgYW5kIHdpcmVfZm9ybWF0X3VuaXR0ZXN0CisgIC8vIHRvIHJlYWxseSB0ZXN0IHRoYXQgcmVmbGVjdGlvbi1iYXNlZCBtZXRob2RzIHdvcmsuICBIZXJlIHdlIGFyZSBtb3N0bHkKKyAgLy8ganVzdCBtYWtpbmcgc3VyZSB0aGF0IFRlc3RPcHRpbWl6ZWRGb3JTaXplIGFjdHVhbGx5IGJ1aWxkcyBhbmQgc2VlbXMgdG8KKyAgLy8gZnVuY3Rpb24uCisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RPcHRpbWl6ZWRGb3JTaXplIG1lc3NhZ2UsIG1lc3NhZ2UyOworICBtZXNzYWdlLnNldF9pKDEpOworICBtZXNzYWdlLm11dGFibGVfbXNnKCktPnNldF9jKDIpOworICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UyLmkoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlMi5tc2coKS5jKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplKSB7CisgIC8vIFZlcmlmaWVzIHRoYXQgc29tZXRoaW5nIG9wdGltaXplZCBmb3Igc3BlZWQgY2FuIGNvbnRhaW4gc29tZXRoaW5nIG9wdGltaXplZAorICAvLyBmb3Igc2l6ZS4KKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSBtZXNzYWdlLCBtZXNzYWdlMjsKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2koMSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX21lc3NhZ2UoKS0+bXV0YWJsZV9tc2coKS0+c2V0X2MoMik7CisgIHN0cmluZyBkYXRhOworICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UyLm9wdGlvbmFsX21lc3NhZ2UoKS5pKCkpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZTIucmVwZWF0ZWRfbWVzc2FnZSgwKS5tc2coKS5jKCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBUZXN0U3BhY2VVc2VkKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7CisgIC8vIHNpemVvZiBwcm92aWRlcyBhIGxvd2VyIGJvdW5kIG9uIFNwYWNlVXNlZCgpLgorICBFWFBFQ1RfTEUoc2l6ZW9mKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMpLCBtZXNzYWdlMS5TcGFjZVVzZWQoKSk7CisgIGNvbnN0IGludCBlbXB0eV9tZXNzYWdlX3NpemUgPSBtZXNzYWdlMS5TcGFjZVVzZWQoKTsKKworICAvLyBTZXR0aW5nIHByaW1pdGl2ZSB0eXBlcyBzaG91bGRuJ3QgYWZmZWN0IHRoZSBzcGFjZSB1c2VkLgorICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfaW50MzIoMTIzKTsKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX2ludDY0KDEyMzQ1KTsKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX3VpbnQzMigxMjMpOworICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfdWludDY0KDEyMzQ1KTsKKyAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2Vfc2l6ZSwgbWVzc2FnZTEuU3BhY2VVc2VkKCkpOworCisgIC8vIE9uIHNvbWUgU1RMIGltcGxlbWVudGF0aW9ucywgc2V0dGluZyB0aGUgc3RyaW5nIHRvIGEgc21hbGwgdmFsdWUgc2hvdWxkCisgIC8vIG9ubHkgaW5jcmVhc2UgU3BhY2VVc2VkKCkgYnkgdGhlIHNpemUgb2YgYSBzdHJpbmcgb2JqZWN0LCB0aG91Z2ggdGhpcyBpcworICAvLyBub3QgdHJ1ZSBldmVyeXdoZXJlLgorICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfc3RyaW5nKCJhYmMiKTsKKyAgRVhQRUNUX0xFKGVtcHR5X21lc3NhZ2Vfc2l6ZSArIHNpemVvZihzdHJpbmcpLCBtZXNzYWdlMS5TcGFjZVVzZWQoKSk7CisKKyAgLy8gU2V0dGluZyBhIHN0cmluZyB0byBhIHZhbHVlIGxhcmdlciB0aGFuIHRoZSBzdHJpbmcgb2JqZWN0IGl0c2VsZiBzaG91bGQKKyAgLy8gaW5jcmVhc2UgU3BhY2VVc2VkKCksIGJlY2F1c2UgaXQgY2Fubm90IHN0b3JlIHRoZSB2YWx1ZSBpbnRlcm5hbGx5LgorICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfc3RyaW5nKHN0cmluZyhzaXplb2Yoc3RyaW5nKSArIDEsICd4JykpOworICBpbnQgbWluX2V4cGVjdGVkX2luY3JlYXNlID0gbWVzc2FnZTEub3B0aW9uYWxfc3RyaW5nKCkuY2FwYWNpdHkoKSArCisgICAgICBzaXplb2Yoc3RyaW5nKTsKKyAgRVhQRUNUX0xFKGVtcHR5X21lc3NhZ2Vfc2l6ZSArIG1pbl9leHBlY3RlZF9pbmNyZWFzZSwKKyAgICAgICAgICAgIG1lc3NhZ2UxLlNwYWNlVXNlZCgpKTsKKworICBpbnQgcHJldmlvdXNfc2l6ZSA9IG1lc3NhZ2UxLlNwYWNlVXNlZCgpOworICAvLyBBZGRpbmcgYW4gb3B0aW9uYWwgbWVzc2FnZSBzaG91bGQgaW5jcmVhc2UgdGhlIHNpemUgYnkgdGhlIHNpemUgb2YgdGhlCisgIC8vIG5lc3RlZCBtZXNzYWdlIHR5cGUuIE5lc3RlZE1lc3NhZ2UgaXMgc2ltcGxlIGVub3VnaCAoMSBpbnQgZmllbGQpIHRoYXQgaXQKKyAgLy8gaXMgZXF1YWwgdG8gc2l6ZW9mKE5lc3RlZE1lc3NhZ2UpCisgIG1lc3NhZ2UxLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKKyAgQVNTRVJUX0VRKHNpemVvZih1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKSwKKyAgICAgICAgICAgIG1lc3NhZ2UxLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuU3BhY2VVc2VkKCkpOworICBFWFBFQ1RfRVEocHJldmlvdXNfc2l6ZSArCisgICAgICAgICAgICBzaXplb2YodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSksCisgICAgICAgICAgICBtZXNzYWdlMS5TcGFjZVVzZWQoKSk7Cit9CisKKyNlbmRpZiAgLy8gIVBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBGaWVsZENvbnN0YW50VmFsdWVzKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZTo6a0JiRmllbGROdW1iZXIsIDEpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6a09wdGlvbmFsSW50MzJGaWVsZE51bWJlciwgMSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprT3B0aW9uYWxncm91cEZpZWxkTnVtYmVyLCAxNik7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprT3B0aW9uYWxOZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIsIDE4KTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmtPcHRpb25hbE5lc3RlZEVudW1GaWVsZE51bWJlciwgMjEpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6a1JlcGVhdGVkSW50MzJGaWVsZE51bWJlciwgMzEpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6a1JlcGVhdGVkZ3JvdXBGaWVsZE51bWJlciwgNDYpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6a1JlcGVhdGVkTmVzdGVkTWVzc2FnZUZpZWxkTnVtYmVyLCA0OCk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprUmVwZWF0ZWROZXN0ZWRFbnVtRmllbGROdW1iZXIsIDUxKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgRXh0ZW5zaW9uQ29uc3RhbnRWYWx1ZXMpIHsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OmtTaW5nbGVGaWVsZE51bWJlciwgMTAwMCk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjprTXVsdGlGaWVsZE51bWJlciwgMTAwMSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6a09wdGlvbmFsSW50MzJFeHRlbnNpb25GaWVsZE51bWJlciwgMSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6a09wdGlvbmFsZ3JvdXBFeHRlbnNpb25GaWVsZE51bWJlciwgMTYpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OmtPcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25GaWVsZE51bWJlciwgMTgpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OmtPcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25GaWVsZE51bWJlciwgMjEpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OmtSZXBlYXRlZEludDMyRXh0ZW5zaW9uRmllbGROdW1iZXIsIDMxKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjprUmVwZWF0ZWRncm91cEV4dGVuc2lvbkZpZWxkTnVtYmVyLCA0Nik7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6a1JlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkZpZWxkTnVtYmVyLCA0OCk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6a1JlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyLCA1MSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVEVTVChHZW5lcmF0ZWRFbnVtVGVzdCwgRW51bVZhbHVlc0FzU3dpdGNoQ2FzZXMpIHsKKyAgLy8gVGVzdCB0aGF0IG91ciBuZXN0ZWQgZW51bSB2YWx1ZXMgY2FuIGJlIHVzZWQgYXMgc3dpdGNoIGNhc2VzLiAgVGhpcyB0ZXN0CisgIC8vIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcsIHRoZSBwcm9vZiB0aGF0IGl0IHdvcmtzIGlzIHRoYXQgaXQKKyAgLy8gY29tcGlsZXMuCisgIGludCBpID0wOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtIGEgPSB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVI7CisgIHN3aXRjaCAoYSkgeworICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9POgorICAgICAgaSA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUjoKKyAgICAgIGkgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVo6CisgICAgICBpID0gMzsKKyAgICAgIGJyZWFrOworICAgIC8vIG5vIGRlZmF1bHQgY2FzZTogIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBjb21waWxlciByZWNvZ25pemVzIHRoYXQKKyAgICAvLyAgIGFsbCBjYXNlcyBhcmUgY292ZXJlZC4gIChHQ0Mgd2FybnMgaWYgeW91IGRvIG5vdCBjb3ZlciBhbGwgY2FzZXMgb2YKKyAgICAvLyAgIGFuIGVudW0gaW4gYSBzd2l0Y2guKQorICB9CisKKyAgLy8gVG9rZW4gY2hlY2sganVzdCBmb3IgZnVuLgorICBFWFBFQ1RfRVEoMiwgaSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkRW51bVRlc3QsIElzVmFsaWRWYWx1ZSkgeworICAvLyBUZXN0IGVudW0gSXNWYWxpZFZhbHVlLgorICBFWFBFQ1RfVFJVRSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0lzVmFsaWQoMSkpOworICBFWFBFQ1RfVFJVRSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0lzVmFsaWQoMikpOworICBFWFBFQ1RfVFJVRSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0lzVmFsaWQoMykpOworCisgIEVYUEVDVF9GQUxTRSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0lzVmFsaWQoMCkpOworICBFWFBFQ1RfRkFMU0UodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bV9Jc1ZhbGlkKDQpKTsKKworICAvLyBNYWtlIHN1cmUgaXQgYWxzbyB3b3JrcyB3aGVuIHRoZXJlIGFyZSBkdXBzLgorICBFWFBFQ1RfVFJVRSh1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfSXNWYWxpZCgxKSk7CisgIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9Jc1ZhbGlkKDIpKTsKKyAgRVhQRUNUX1RSVUUodW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX0lzVmFsaWQoMykpOworCisgIEVYUEVDVF9GQUxTRSh1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfSXNWYWxpZCgwKSk7CisgIEVYUEVDVF9GQUxTRSh1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfSXNWYWxpZCg0KSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkRW51bVRlc3QsIE1pbkFuZE1heCkgeworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PLAorICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bV9NSU4pOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLAorICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bV9NQVgpOworICBFWFBFQ1RfRVEoNCwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bV9BUlJBWVNJWkUpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08sIHVuaXR0ZXN0OjpGb3JlaWduRW51bV9NSU4pOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaLCB1bml0dGVzdDo6Rm9yZWlnbkVudW1fTUFYKTsKKyAgRVhQRUNUX0VRKDcsIHVuaXR0ZXN0OjpGb3JlaWduRW51bV9BUlJBWVNJWkUpOworCisgIEVYUEVDVF9FUSgxLCB1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfTUlOKTsKKyAgRVhQRUNUX0VRKDMsIHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9NQVgpOworICBFWFBFQ1RfRVEoNCwgdW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX0FSUkFZU0laRSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpTUEFSU0VfRSwgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX01JTik7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6U1BBUlNFX0MsIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9NQVgpOworICBFWFBFQ1RfRVEoMTI1ODkyMzUsIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9BUlJBWVNJWkUpOworCisgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gdGFrZSB0aGUgYWRkcmVzcyBvZiBfTUlOLCBfTUFYIGFuZCBfQVJSQVlTSVpFLgorICB2b2lkKiBudWxsX3BvaW50ZXIgPSAwOyAgLy8gTlVMTCBtYXkgYmUgaW50ZWdlci10eXBlLCBub3QgcG9pbnRlci10eXBlLgorICBFWFBFQ1RfTkUobnVsbF9wb2ludGVyLCAmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bV9NSU4pOworICBFWFBFQ1RfTkUobnVsbF9wb2ludGVyLCAmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bV9NQVgpOworICBFWFBFQ1RfTkUobnVsbF9wb2ludGVyLCAmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bV9BUlJBWVNJWkUpOworCisgIEVYUEVDVF9ORShudWxsX3BvaW50ZXIsICZ1bml0dGVzdDo6Rm9yZWlnbkVudW1fTUlOKTsKKyAgRVhQRUNUX05FKG51bGxfcG9pbnRlciwgJnVuaXR0ZXN0OjpGb3JlaWduRW51bV9NQVgpOworICBFWFBFQ1RfTkUobnVsbF9wb2ludGVyLCAmdW5pdHRlc3Q6OkZvcmVpZ25FbnVtX0FSUkFZU0laRSk7CisKKyAgLy8gTWFrZSBzdXJlIHdlIGNhbiB1c2UgX01JTiwgX01BWCBhbmQgX0FSUkFZU0laRSBhcyBzd2l0Y2ggY2FzZXMuCisgIHN3aXRjaCAodW5pdHRlc3Q6OlNQQVJTRV9BKSB7CisgICAgY2FzZSB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTUlOOgorICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX01BWDoKKyAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9BUlJBWVNJWkU6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisKK1RFU1QoR2VuZXJhdGVkRW51bVRlc3QsIE5hbWUpIHsKKyAgLy8gIk5hbWVzIiBpbiB0aGUgcHJlc2VuY2Ugb2YgZHVwIHZhbHVlcyBhcmUgYSBiaXQgYXJiaXRyYXJ5LgorICBFWFBFQ1RfRVEoIkZPTzEiLCB1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfTmFtZSh1bml0dGVzdDo6Rk9PMSkpOworICBFWFBFQ1RfRVEoIkZPTzEiLCB1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfTmFtZSh1bml0dGVzdDo6Rk9PMikpOworCisgIEVYUEVDVF9FUSgiU1BBUlNFX0EiLCB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTmFtZSh1bml0dGVzdDo6U1BBUlNFX0EpKTsKKyAgRVhQRUNUX0VRKCJTUEFSU0VfQiIsIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9OYW1lKHVuaXR0ZXN0OjpTUEFSU0VfQikpOworICBFWFBFQ1RfRVEoIlNQQVJTRV9DIiwgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX05hbWUodW5pdHRlc3Q6OlNQQVJTRV9DKSk7CisgIEVYUEVDVF9FUSgiU1BBUlNFX0QiLCB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTmFtZSh1bml0dGVzdDo6U1BBUlNFX0QpKTsKKyAgRVhQRUNUX0VRKCJTUEFSU0VfRSIsIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9OYW1lKHVuaXR0ZXN0OjpTUEFSU0VfRSkpOworICBFWFBFQ1RfRVEoIlNQQVJTRV9GIiwgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX05hbWUodW5pdHRlc3Q6OlNQQVJTRV9GKSk7CisgIEVYUEVDVF9FUSgiU1BBUlNFX0ciLCB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTmFtZSh1bml0dGVzdDo6U1BBUlNFX0cpKTsKK30KKworVEVTVChHZW5lcmF0ZWRFbnVtVGVzdCwgUGFyc2UpIHsKKyAgdW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlIGR1cF92YWx1ZSA9IHVuaXR0ZXN0OjpGT08xOworICBFWFBFQ1RfVFJVRSh1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfUGFyc2UoIkZPTzEiLCAmZHVwX3ZhbHVlKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9PMSwgZHVwX3ZhbHVlKTsKKyAgRVhQRUNUX1RSVUUodW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX1BhcnNlKCJGT08yIiwgJmR1cF92YWx1ZSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPTzIsIGR1cF92YWx1ZSk7CisgIEVYUEVDVF9GQUxTRSh1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfUGFyc2UoIkZPTyIsICZkdXBfdmFsdWUpKTsKK30KKworVEVTVChHZW5lcmF0ZWRFbnVtVGVzdCwgR2V0RW51bURlc2NyaXB0b3IpIHsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fZGVzY3JpcHRvcigpLAorICAgICAgICAgICAgR2V0RW51bURlc2NyaXB0b3I8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bT4oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rm9yZWlnbkVudW1fZGVzY3JpcHRvcigpLAorICAgICAgICAgICAgR2V0RW51bURlc2NyaXB0b3I8dW5pdHRlc3Q6OkZvcmVpZ25FbnVtPigpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9kZXNjcmlwdG9yKCksCisgICAgICAgICAgICBHZXRFbnVtRGVzY3JpcHRvcjx1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWU+KCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX2Rlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgIEdldEVudW1EZXNjcmlwdG9yPHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bT4oKSk7Cit9CisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworCisvLyBTdXBwb3J0IGNvZGUgZm9yIHRlc3Rpbmcgc2VydmljZXMuCitjbGFzcyBHZW5lcmF0ZWRTZXJ2aWNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIGNsYXNzIE1vY2tUZXN0U2VydmljZSA6IHB1YmxpYyB1bml0dGVzdDo6VGVzdFNlcnZpY2UgeworICAgcHVibGljOgorICAgIE1vY2tUZXN0U2VydmljZSgpCisgICAgICA6IGNhbGxlZF8oZmFsc2UpLAorICAgICAgICBtZXRob2RfKCIiKSwKKyAgICAgICAgY29udHJvbGxlcl8oTlVMTCksCisgICAgICAgIHJlcXVlc3RfKE5VTEwpLAorICAgICAgICByZXNwb25zZV8oTlVMTCksCisgICAgICAgIGRvbmVfKE5VTEwpIHt9CisKKyAgICB+TW9ja1Rlc3RTZXJ2aWNlKCkge30KKworICAgIHZvaWQgUmVzZXQoKSB7IGNhbGxlZF8gPSBmYWxzZTsgfQorCisgICAgLy8gaW1wbGVtZW50cyBUZXN0U2VydmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICB2b2lkIEZvbyhScGNDb250cm9sbGVyKiBjb250cm9sbGVyLAorICAgICAgICAgICAgIGNvbnN0IHVuaXR0ZXN0OjpGb29SZXF1ZXN0KiByZXF1ZXN0LAorICAgICAgICAgICAgIHVuaXR0ZXN0OjpGb29SZXNwb25zZSogcmVzcG9uc2UsCisgICAgICAgICAgICAgQ2xvc3VyZSogZG9uZSkgeworICAgICAgQVNTRVJUX0ZBTFNFKGNhbGxlZF8pOworICAgICAgY2FsbGVkXyA9IHRydWU7CisgICAgICBtZXRob2RfID0gIkZvbyI7CisgICAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7CisgICAgICByZXF1ZXN0XyA9IHJlcXVlc3Q7CisgICAgICByZXNwb25zZV8gPSByZXNwb25zZTsKKyAgICAgIGRvbmVfID0gZG9uZTsKKyAgICB9CisKKyAgICB2b2lkIEJhcihScGNDb250cm9sbGVyKiBjb250cm9sbGVyLAorICAgICAgICAgICAgIGNvbnN0IHVuaXR0ZXN0OjpCYXJSZXF1ZXN0KiByZXF1ZXN0LAorICAgICAgICAgICAgIHVuaXR0ZXN0OjpCYXJSZXNwb25zZSogcmVzcG9uc2UsCisgICAgICAgICAgICAgQ2xvc3VyZSogZG9uZSkgeworICAgICAgQVNTRVJUX0ZBTFNFKGNhbGxlZF8pOworICAgICAgY2FsbGVkXyA9IHRydWU7CisgICAgICBtZXRob2RfID0gIkJhciI7CisgICAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7CisgICAgICByZXF1ZXN0XyA9IHJlcXVlc3Q7CisgICAgICByZXNwb25zZV8gPSByZXNwb25zZTsKKyAgICAgIGRvbmVfID0gZG9uZTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGJvb2wgY2FsbGVkXzsKKyAgICBzdHJpbmcgbWV0aG9kXzsKKyAgICBScGNDb250cm9sbGVyKiBjb250cm9sbGVyXzsKKyAgICBjb25zdCBNZXNzYWdlKiByZXF1ZXN0XzsKKyAgICBNZXNzYWdlKiByZXNwb25zZV87CisgICAgQ2xvc3VyZSogZG9uZV87CisgIH07CisKKyAgY2xhc3MgTW9ja1JwY0NoYW5uZWwgOiBwdWJsaWMgUnBjQ2hhbm5lbCB7CisgICBwdWJsaWM6CisgICAgTW9ja1JwY0NoYW5uZWwoKQorICAgICAgOiBjYWxsZWRfKGZhbHNlKSwKKyAgICAgICAgbWV0aG9kXyhOVUxMKSwKKyAgICAgICAgY29udHJvbGxlcl8oTlVMTCksCisgICAgICAgIHJlcXVlc3RfKE5VTEwpLAorICAgICAgICByZXNwb25zZV8oTlVMTCksCisgICAgICAgIGRvbmVfKE5VTEwpLAorICAgICAgICBkZXN0cm95ZWRfKE5VTEwpIHt9CisKKyAgICB+TW9ja1JwY0NoYW5uZWwoKSB7CisgICAgICBpZiAoZGVzdHJveWVkXyAhPSBOVUxMKSAqZGVzdHJveWVkXyA9IHRydWU7CisgICAgfQorCisgICAgdm9pZCBSZXNldCgpIHsgY2FsbGVkXyA9IGZhbHNlOyB9CisKKyAgICAvLyBpbXBsZW1lbnRzIFRlc3RTZXJ2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHZvaWQgQ2FsbE1ldGhvZChjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgIFJwY0NvbnRyb2xsZXIqIGNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICBDbG9zdXJlKiBkb25lKSB7CisgICAgICBBU1NFUlRfRkFMU0UoY2FsbGVkXyk7CisgICAgICBjYWxsZWRfID0gdHJ1ZTsKKyAgICAgIG1ldGhvZF8gPSBtZXRob2Q7CisgICAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7CisgICAgICByZXF1ZXN0XyA9IHJlcXVlc3Q7CisgICAgICByZXNwb25zZV8gPSByZXNwb25zZTsKKyAgICAgIGRvbmVfID0gZG9uZTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGJvb2wgY2FsbGVkXzsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2RfOworICAgIFJwY0NvbnRyb2xsZXIqIGNvbnRyb2xsZXJfOworICAgIGNvbnN0IE1lc3NhZ2UqIHJlcXVlc3RfOworICAgIE1lc3NhZ2UqIHJlc3BvbnNlXzsKKyAgICBDbG9zdXJlKiBkb25lXzsKKyAgICBib29sKiBkZXN0cm95ZWRfOworICB9OworCisgIGNsYXNzIE1vY2tDb250cm9sbGVyIDogcHVibGljIFJwY0NvbnRyb2xsZXIgeworICAgcHVibGljOgorICAgIHZvaWQgUmVzZXQoKSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8ICJSZXNldCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7CisgICAgfQorICAgIGJvb2wgRmFpbGVkKCkgY29uc3QgeworICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiRmFpbGVkKCkgbm90IGV4cGVjdGVkIGR1cmluZyB0aGlzIHRlc3QuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RyaW5nIEVycm9yVGV4dCgpIGNvbnN0IHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkVycm9yVGV4dCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHZvaWQgU3RhcnRDYW5jZWwoKSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8ICJTdGFydENhbmNlbCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7CisgICAgfQorICAgIHZvaWQgU2V0RmFpbGVkKGNvbnN0IHN0cmluZyYgcmVhc29uKSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8ICJTZXRGYWlsZWQoKSBub3QgZXhwZWN0ZWQgZHVyaW5nIHRoaXMgdGVzdC4iOworICAgIH0KKyAgICBib29sIElzQ2FuY2VsZWQoKSBjb25zdCB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8ICJJc0NhbmNlbGVkKCkgbm90IGV4cGVjdGVkIGR1cmluZyB0aGlzIHRlc3QuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdm9pZCBOb3RpZnlPbkNhbmNlbChDbG9zdXJlKiBjYWxsYmFjaykgeworICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiTm90aWZ5T25DYW5jZWwoKSBub3QgZXhwZWN0ZWQgZHVyaW5nIHRoaXMgdGVzdC4iOworICAgIH0KKyAgfTsKKworICBHZW5lcmF0ZWRTZXJ2aWNlVGVzdCgpCisgICAgOiBkZXNjcmlwdG9yXyh1bml0dGVzdDo6VGVzdFNlcnZpY2U6OmRlc2NyaXB0b3IoKSksCisgICAgICBmb29fKGRlc2NyaXB0b3JfLT5GaW5kTWV0aG9kQnlOYW1lKCJGb28iKSksCisgICAgICBiYXJfKGRlc2NyaXB0b3JfLT5GaW5kTWV0aG9kQnlOYW1lKCJCYXIiKSksCisgICAgICBzdHViXygmbW9ja19jaGFubmVsXyksCisgICAgICBkb25lXyhOZXdQZXJtYW5lbnRDYWxsYmFjaygmRG9Ob3RoaW5nKSkge30KKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgQVNTRVJUX1RSVUUoZm9vXyAhPSBOVUxMKTsKKyAgICBBU1NFUlRfVFJVRShiYXJfICE9IE5VTEwpOworICB9CisKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBmb29fOworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBiYXJfOworCisgIE1vY2tUZXN0U2VydmljZSBtb2NrX3NlcnZpY2VfOworICBNb2NrQ29udHJvbGxlciBtb2NrX2NvbnRyb2xsZXJfOworCisgIE1vY2tScGNDaGFubmVsIG1vY2tfY2hhbm5lbF87CisgIHVuaXR0ZXN0OjpUZXN0U2VydmljZTo6U3R1YiBzdHViXzsKKworICAvLyBKdXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gcmUtZGVmaW5lIHRoZXNlIHdpdGggZXZlcnkgdGVzdC4KKyAgdW5pdHRlc3Q6OkZvb1JlcXVlc3QgZm9vX3JlcXVlc3RfOworICB1bml0dGVzdDo6Rm9vUmVzcG9uc2UgZm9vX3Jlc3BvbnNlXzsKKyAgdW5pdHRlc3Q6OkJhclJlcXVlc3QgYmFyX3JlcXVlc3RfOworICB1bml0dGVzdDo6QmFyUmVzcG9uc2UgYmFyX3Jlc3BvbnNlXzsKKyAgc2NvcGVkX3B0cjxDbG9zdXJlPiBkb25lXzsKK307CisKK1RFU1RfRihHZW5lcmF0ZWRTZXJ2aWNlVGVzdCwgR2V0RGVzY3JpcHRvcikgeworICAvLyBUZXN0IHRoYXQgR2V0RGVzY3JpcHRvcigpIHdvcmtzLgorCisgIEVYUEVDVF9FUShkZXNjcmlwdG9yXywgbW9ja19zZXJ2aWNlXy5HZXREZXNjcmlwdG9yKCkpOworfQorCitURVNUX0YoR2VuZXJhdGVkU2VydmljZVRlc3QsIEdldENoYW5uZWwpIHsKKyAgRVhQRUNUX0VRKCZtb2NrX2NoYW5uZWxfLCBzdHViXy5jaGFubmVsKCkpOworfQorCitURVNUX0YoR2VuZXJhdGVkU2VydmljZVRlc3QsIE93bnNDaGFubmVsKSB7CisgIE1vY2tScGNDaGFubmVsKiBjaGFubmVsID0gbmV3IE1vY2tScGNDaGFubmVsOworICBib29sIGRlc3Ryb3llZCA9IGZhbHNlOworICBjaGFubmVsLT5kZXN0cm95ZWRfID0gJmRlc3Ryb3llZDsKKworICB7CisgICAgdW5pdHRlc3Q6OlRlc3RTZXJ2aWNlOjpTdHViIG93bmluZ19zdHViKGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2U6OlNUVUJfT1dOU19DSEFOTkVMKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKyAgfQorCisgIEVYUEVDVF9UUlVFKGRlc3Ryb3llZCk7Cit9CisKK1RFU1RfRihHZW5lcmF0ZWRTZXJ2aWNlVGVzdCwgQ2FsbE1ldGhvZCkgeworICAvLyBUZXN0IHRoYXQgQ2FsbE1ldGhvZCgpIHdvcmtzLgorCisgIC8vIENhbGwgRm9vKCkgdmlhIENhbGxNZXRob2QoKS4KKyAgbW9ja19zZXJ2aWNlXy5DYWxsTWV0aG9kKGZvb18sICZtb2NrX2NvbnRyb2xsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvb19yZXF1ZXN0XywgJmZvb19yZXNwb25zZV8sIGRvbmVfLmdldCgpKTsKKworICBBU1NFUlRfVFJVRShtb2NrX3NlcnZpY2VfLmNhbGxlZF8pOworCisgIEVYUEVDVF9FUSgiRm9vIiAgICAgICAgICAgICwgbW9ja19zZXJ2aWNlXy5tZXRob2RfICAgICk7CisgIEVYUEVDVF9FUSgmbW9ja19jb250cm9sbGVyXywgbW9ja19zZXJ2aWNlXy5jb250cm9sbGVyXyk7CisgIEVYUEVDVF9FUSgmZm9vX3JlcXVlc3RfICAgICwgbW9ja19zZXJ2aWNlXy5yZXF1ZXN0XyAgICk7CisgIEVYUEVDVF9FUSgmZm9vX3Jlc3BvbnNlXyAgICwgbW9ja19zZXJ2aWNlXy5yZXNwb25zZV8gICk7CisgIEVYUEVDVF9FUShkb25lXy5nZXQoKSAgICAgICwgbW9ja19zZXJ2aWNlXy5kb25lXyAgICAgICk7CisKKyAgLy8gVHJ5IGFnYWluLCBidXQgY2FsbCBCYXIoKSBpbnN0ZWFkLgorICBtb2NrX3NlcnZpY2VfLlJlc2V0KCk7CisgIG1vY2tfc2VydmljZV8uQ2FsbE1ldGhvZChiYXJfLCAmbW9ja19jb250cm9sbGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXJfcmVxdWVzdF8sICZiYXJfcmVzcG9uc2VfLCBkb25lXy5nZXQoKSk7CisKKyAgQVNTRVJUX1RSVUUobW9ja19zZXJ2aWNlXy5jYWxsZWRfKTsKKyAgRVhQRUNUX0VRKCJCYXIiLCBtb2NrX3NlcnZpY2VfLm1ldGhvZF8pOworfQorCitURVNUX0YoR2VuZXJhdGVkU2VydmljZVRlc3QsIENhbGxNZXRob2RUeXBlRmFpbHVyZSkgeworICAvLyBWZXJpZnkgZGVhdGggaWYgd2UgY2FsbCBGb28oKSB3aXRoIEJhcidzIG1lc3NhZ2UgdHlwZXMuCisKKyNpZmRlZiBHVEVTVF9IQVNfREVBVEhfVEVTVCAgLy8gZGVhdGggdGVzdHMgZG8gbm90IHdvcmsgb24gV2luZG93cyB5ZXQKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKAorICAgIG1vY2tfc2VydmljZV8uQ2FsbE1ldGhvZChmb29fLCAmbW9ja19jb250cm9sbGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvb19yZXF1ZXN0XywgJmJhcl9yZXNwb25zZV8sIGRvbmVfLmdldCgpKSwKKyAgICAiZHluYW1pY19jYXN0Iik7CisKKyAgbW9ja19zZXJ2aWNlXy5SZXNldCgpOworICBFWFBFQ1RfREVCVUdfREVBVEgoCisgICAgbW9ja19zZXJ2aWNlXy5DYWxsTWV0aG9kKGZvb18sICZtb2NrX2NvbnRyb2xsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFyX3JlcXVlc3RfLCAmZm9vX3Jlc3BvbnNlXywgZG9uZV8uZ2V0KCkpLAorICAgICJkeW5hbWljX2Nhc3QiKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKK30KKworVEVTVF9GKEdlbmVyYXRlZFNlcnZpY2VUZXN0LCBHZXRQcm90b3R5cGVzKSB7CisgIC8vIFRlc3QgR2V0e1JlcXVlc3QsUmVzcG9uc2V9UHJvdG90eXBlKCkgbWV0aG9kcy4KKworICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpGb29SZXF1ZXN0OjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbW9ja19zZXJ2aWNlXy5HZXRSZXF1ZXN0UHJvdG90eXBlKGZvb18pKTsKKyAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6QmFyUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1vY2tfc2VydmljZV8uR2V0UmVxdWVzdFByb3RvdHlwZShiYXJfKSk7CisKKyAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6Rm9vUmVzcG9uc2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtb2NrX3NlcnZpY2VfLkdldFJlc3BvbnNlUHJvdG90eXBlKGZvb18pKTsKKyAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6QmFyUmVzcG9uc2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtb2NrX3NlcnZpY2VfLkdldFJlc3BvbnNlUHJvdG90eXBlKGJhcl8pKTsKK30KKworVEVTVF9GKEdlbmVyYXRlZFNlcnZpY2VUZXN0LCBTdHViKSB7CisgIC8vIFRlc3QgdGhhdCB0aGUgc3R1YiBjbGFzcyB3b3Jrcy4KKworICAvLyBDYWxsIEZvbygpIHZpYSB0aGUgc3R1Yi4KKyAgc3R1Yl8uRm9vKCZtb2NrX2NvbnRyb2xsZXJfLCAmZm9vX3JlcXVlc3RfLCAmZm9vX3Jlc3BvbnNlXywgZG9uZV8uZ2V0KCkpOworCisgIEFTU0VSVF9UUlVFKG1vY2tfY2hhbm5lbF8uY2FsbGVkXyk7CisKKyAgRVhQRUNUX0VRKGZvb18gICAgICAgICAgICAgLCBtb2NrX2NoYW5uZWxfLm1ldGhvZF8gICAgKTsKKyAgRVhQRUNUX0VRKCZtb2NrX2NvbnRyb2xsZXJfLCBtb2NrX2NoYW5uZWxfLmNvbnRyb2xsZXJfKTsKKyAgRVhQRUNUX0VRKCZmb29fcmVxdWVzdF8gICAgLCBtb2NrX2NoYW5uZWxfLnJlcXVlc3RfICAgKTsKKyAgRVhQRUNUX0VRKCZmb29fcmVzcG9uc2VfICAgLCBtb2NrX2NoYW5uZWxfLnJlc3BvbnNlXyAgKTsKKyAgRVhQRUNUX0VRKGRvbmVfLmdldCgpICAgICAgLCBtb2NrX2NoYW5uZWxfLmRvbmVfICAgICAgKTsKKworICAvLyBDYWxsIEJhcigpIHZpYSB0aGUgc3R1Yi4KKyAgbW9ja19jaGFubmVsXy5SZXNldCgpOworICBzdHViXy5CYXIoJm1vY2tfY29udHJvbGxlcl8sICZiYXJfcmVxdWVzdF8sICZiYXJfcmVzcG9uc2VfLCBkb25lXy5nZXQoKSk7CisKKyAgQVNTRVJUX1RSVUUobW9ja19jaGFubmVsXy5jYWxsZWRfKTsKKyAgRVhQRUNUX0VRKGJhcl8sIG1vY2tfY2hhbm5lbF8ubWV0aG9kXyk7Cit9CisKK1RFU1RfRihHZW5lcmF0ZWRTZXJ2aWNlVGVzdCwgTm90SW1wbGVtZW50ZWQpIHsKKyAgLy8gVGVzdCB0aGF0IGZhaWxpbmcgdG8gaW1wbGVtZW50IGEgbWV0aG9kIG9mIGEgc2VydmljZSBjYXVzZXMgaXQgdG8gZmFpbAorICAvLyB3aXRoIGEgIm5vdCBpbXBsZW1lbnRlZCIgZXJyb3IgbWVzc2FnZS4KKworICAvLyBBIHNlcnZpY2Ugd2hpY2ggZG9lc24ndCBpbXBsZW1lbnQgYW55IG1ldGhvZHMuCisgIGNsYXNzIFVuaW1wbGVtZW50ZWRTZXJ2aWNlIDogcHVibGljIHVuaXR0ZXN0OjpUZXN0U2VydmljZSB7CisgICBwdWJsaWM6CisgICAgVW5pbXBsZW1lbnRlZFNlcnZpY2UoKSB7fQorICB9OworCisgIFVuaW1wbGVtZW50ZWRTZXJ2aWNlIHVuaW1wbGVtZW50ZWRfc2VydmljZTsKKworICAvLyBBbmQgYSBjb250cm9sbGVyIHdoaWNoIGV4cGVjdHMgdG8gZ2V0IGEgIm5vdCBpbXBsZW1lbnRlZCIgZXJyb3IuCisgIGNsYXNzIEV4cGVjdFVuaW1wbGVtZW50ZWRDb250cm9sbGVyIDogcHVibGljIE1vY2tDb250cm9sbGVyIHsKKyAgIHB1YmxpYzoKKyAgICBFeHBlY3RVbmltcGxlbWVudGVkQ29udHJvbGxlcigpIDogY2FsbGVkXyhmYWxzZSkge30KKworICAgIHZvaWQgU2V0RmFpbGVkKGNvbnN0IHN0cmluZyYgcmVhc29uKSB7CisgICAgICBFWFBFQ1RfRkFMU0UoY2FsbGVkXyk7CisgICAgICBjYWxsZWRfID0gdHJ1ZTsKKyAgICAgIEVYUEVDVF9FUSgiTWV0aG9kIEZvbygpIG5vdCBpbXBsZW1lbnRlZC4iLCByZWFzb24pOworICAgIH0KKworICAgIGJvb2wgY2FsbGVkXzsKKyAgfTsKKworICBFeHBlY3RVbmltcGxlbWVudGVkQ29udHJvbGxlciBjb250cm9sbGVyOworCisgIC8vIENhbGwgRm9vLgorICB1bmltcGxlbWVudGVkX3NlcnZpY2UuRm9vKCZjb250cm9sbGVyLCAmZm9vX3JlcXVlc3RfLCAmZm9vX3Jlc3BvbnNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lXy5nZXQoKSk7CisKKyAgRVhQRUNUX1RSVUUoY29udHJvbGxlci5jYWxsZWRfKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcF91bml0dGVzdAorfSAgLy8gbmFtZXNwYWNlIGNwcAorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCisKK25hbWVzcGFjZSBub19nZW5lcmljX3NlcnZpY2VzX3Rlc3QgeworICAvLyBWZXJpZnkgdGhhdCBubyBjbGFzcyBjYWxsZWQgIlRlc3RTZXJ2aWNlIiB3YXMgZGVmaW5lZCBpbgorICAvLyB1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmggYnkgZGVmaW5pbmcgYSBkaWZmZXJlbnQgdHlwZSBieSB0aGUgc2FtZQorICAvLyBuYW1lLiAgSWYgc3VjaCBhIHNlcnZpY2Ugd2FzIGdlbmVyYXRlZCwgdGhpcyB3aWxsIG5vdCBjb21waWxlLgorICBzdHJ1Y3QgVGVzdFNlcnZpY2UgeworICAgIGludCBpOworICB9OworfQorCituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGNwcCB7CituYW1lc3BhY2UgY3BwX3VuaXR0ZXN0IHsKKworVEVTVF9GKEdlbmVyYXRlZFNlcnZpY2VUZXN0LCBOb0dlbmVyaWNTZXJ2aWNlcykgeworICAvLyBWZXJpZnkgdGhhdCBub24tc2VydmljZXMgaW4gdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90byB3ZXJlCisgIC8vIGdlbmVyYXRlZC4KKyAgbm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0OjpUZXN0TWVzc2FnZSBtZXNzYWdlOworICBtZXNzYWdlLnNldF9hKDEpOworICBtZXNzYWdlLlNldEV4dGVuc2lvbihub19nZW5lcmljX3NlcnZpY2VzX3Rlc3Q6OnRlc3RfZXh0ZW5zaW9uLCAxMjMpOworICBub19nZW5lcmljX3NlcnZpY2VzX3Rlc3Q6OlRlc3RFbnVtIGUgPSBub19nZW5lcmljX3NlcnZpY2VzX3Rlc3Q6OkZPTzsKKyAgRVhQRUNUX0VRKGUsIDEpOworCisgIC8vIFZlcmlmeSB0aGF0IGEgU2VydmljZURlc2NyaXB0b3IgaXMgZ2VuZXJhdGVkIGZvciB0aGUgc2VydmljZSBldmVuIGlmIHRoZQorICAvLyBjbGFzcyBpdHNlbGYgaXMgbm90LgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9CisgICAgICBub19nZW5lcmljX3NlcnZpY2VzX3Rlc3Q6OlRlc3RNZXNzYWdlOjpkZXNjcmlwdG9yKCktPmZpbGUoKTsKKworICBBU1NFUlRfRVEoMSwgZmlsZS0+c2VydmljZV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0U2VydmljZSIsIGZpbGUtPnNlcnZpY2UoMCktPm5hbWUoKSk7CisgIEFTU0VSVF9FUSgxLCBmaWxlLT5zZXJ2aWNlKDApLT5tZXRob2RfY291bnQoKSk7CisgIEVYUEVDVF9FUSgiRm9vIiwgZmlsZS0+c2VydmljZSgwKS0+bWV0aG9kKDApLT5uYW1lKCkpOworfQorCisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVGhpcyB0ZXN0IG11c3QgcnVuIGxhc3QuICBJdCB2ZXJpZmllcyB0aGF0IGRlc2NyaXB0b3JzIHdlcmUgb3Igd2VyZSBub3QKKy8vIGluaXRpYWxpemVkIGRlcGVuZGluZyBvbiB3aGV0aGVyIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMgd2FzIGRlZmluZWQuCisvLyBXaGVuIHRoaXMgaXMgZGVmaW5lZCwgd2Ugc2tpcCBhbGwgdGVzdHMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvIHRyaWdnZXIKKy8vIGRlc2NyaXB0b3IgaW5pdGlhbGl6YXRpb24uICBUaGlzIHZlcmlmaWVzIHRoYXQgZXZlcnl0aGluZyBlbHNlIHN0aWxsIHdvcmtzCisvLyBpZiBkZXNjcmlwdG9ycyBhcmUgbm90IGluaXRpYWxpemVkLgorVEVTVChEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25UZXN0LCBJbml0aWFsaXplZCkgeworI2lmZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKyAgYm9vbCBzaG91bGRfaGF2ZV9kZXNjcmlwdG9ycyA9IGZhbHNlOworI2Vsc2UKKyAgYm9vbCBzaG91bGRfaGF2ZV9kZXNjcmlwdG9ycyA9IHRydWU7CisjZW5kaWYKKworICBFWFBFQ1RfRVEoc2hvdWxkX2hhdmVfZGVzY3JpcHRvcnMsCisgICAgRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCktPkludGVybmFsSXNGaWxlTG9hZGVkKAorICAgICAgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNwcF91bml0dGVzdAorCit9ICAvLyBuYW1lc3BhY2UgY3BwCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjJmNzU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MKQEAgLTAsMCArMSw0NTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCisjaWZkZWYgX1dJTjMyCisjaWZuZGVmIEZfT0sKKyNkZWZpbmUgRl9PSyAwMCAgLy8gbm90IGRlZmluZWQgYnkgTVNWQyBmb3Igd2hhdGV2ZXIgcmVhc29uCisjZW5kaWYKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2VuZGlmCisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBsb29rcyBsaWtlIGEgV2luZG93cy1zdHlsZSBhYnNvbHV0ZSBwYXRoLCBzdGFydGluZworLy8gd2l0aCBhIGRyaXZlIGxldHRlci4gIEV4YW1wbGU6ICAiQzpcZm9vIi4gIFRPRE8oa2VudG9uKTogIFNoYXJlIHRoaXMgd2l0aAorLy8gY29weSBpbiBjb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjPworc3RhdGljIGJvb2wgSXNXaW5kb3dzQWJzb2x1dGVQYXRoKGNvbnN0IHN0cmluZyYgdGV4dCkgeworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisgIHJldHVybiB0ZXh0LnNpemUoKSA+PSAzICYmIHRleHRbMV0gPT0gJzonICYmCisgICAgICAgICBpc2FscGhhKHRleHRbMF0pICYmCisgICAgICAgICAodGV4dFsyXSA9PSAnLycgfHwgdGV4dFsyXSA9PSAnXFwnKSAmJgorICAgICAgICAgdGV4dC5maW5kX2xhc3Rfb2YoJzonKSA9PSAxOworI2Vsc2UKKyAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK011bHRpRmlsZUVycm9yQ29sbGVjdG9yOjp+TXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IoKSB7fQorCisvLyBUaGlzIGNsYXNzIHNlcnZlcyB0d28gcHVycG9zZXM6CisvLyAtIEl0IGltcGxlbWVudHMgdGhlIEVycm9yQ29sbGVjdG9yIGludGVyZmFjZSAodXNlZCBieSBUb2tlbml6ZXIgYW5kIFBhcnNlcikKKy8vICAgaW4gdGVybXMgb2YgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IsIHVzaW5nIGEgcGFydGljdWxhciBmaWxlbmFtZS4KKy8vIC0gSXQgbGV0cyB1cyBjaGVjayBpZiBhbnkgZXJyb3JzIGhhdmUgb2NjdXJyZWQuCitjbGFzcyBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjpTaW5nbGVGaWxlRXJyb3JDb2xsZWN0b3IKKyAgICA6IHB1YmxpYyBpbzo6RXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgU2luZ2xlRmlsZUVycm9yQ29sbGVjdG9yKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciogbXVsdGlfZmlsZV9lcnJvcl9jb2xsZWN0b3IpCisgICAgOiBmaWxlbmFtZV8oZmlsZW5hbWUpLAorICAgICAgbXVsdGlfZmlsZV9lcnJvcl9jb2xsZWN0b3JfKG11bHRpX2ZpbGVfZXJyb3JfY29sbGVjdG9yKSwKKyAgICAgIGhhZF9lcnJvcnNfKGZhbHNlKSB7fQorICB+U2luZ2xlRmlsZUVycm9yQ29sbGVjdG9yKCkge30KKworICBib29sIGhhZF9lcnJvcnMoKSB7IHJldHVybiBoYWRfZXJyb3JzXzsgfQorCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIGlmIChtdWx0aV9maWxlX2Vycm9yX2NvbGxlY3Rvcl8gIT0gTlVMTCkgeworICAgICAgbXVsdGlfZmlsZV9lcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcihmaWxlbmFtZV8sIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7CisgICAgfQorICAgIGhhZF9lcnJvcnNfID0gdHJ1ZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RyaW5nIGZpbGVuYW1lXzsKKyAgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IqIG11bHRpX2ZpbGVfZXJyb3JfY29sbGVjdG9yXzsKKyAgYm9vbCBoYWRfZXJyb3JzXzsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6U291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSgKKyAgICBTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSkKKyAgOiBzb3VyY2VfdHJlZV8oc291cmNlX3RyZWUpLAorICAgIGVycm9yX2NvbGxlY3Rvcl8oTlVMTCksCisgICAgdXNpbmdfdmFsaWRhdGlvbl9lcnJvcl9jb2xsZWN0b3JfKGZhbHNlKSwKKyAgICB2YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl8odGhpcykge30KKworU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6flNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UoKSB7fQorCitib29sIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weUlucHV0U3RyZWFtPiBpbnB1dChzb3VyY2VfdHJlZV8tPk9wZW4oZmlsZW5hbWUpKTsKKyAgaWYgKGlucHV0ID09IE5VTEwpIHsKKyAgICBpZiAoZXJyb3JfY29sbGVjdG9yXyAhPSBOVUxMKSB7CisgICAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcihmaWxlbmFtZSwgLTEsIDAsICJGaWxlIG5vdCBmb3VuZC4iKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIgYW5kIHBhcnNlci4KKyAgU2luZ2xlRmlsZUVycm9yQ29sbGVjdG9yIGZpbGVfZXJyb3JfY29sbGVjdG9yKGZpbGVuYW1lLCBlcnJvcl9jb2xsZWN0b3JfKTsKKyAgaW86OlRva2VuaXplciB0b2tlbml6ZXIoaW5wdXQuZ2V0KCksICZmaWxlX2Vycm9yX2NvbGxlY3Rvcik7CisKKyAgUGFyc2VyIHBhcnNlcjsKKyAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gIT0gTlVMTCkgeworICAgIHBhcnNlci5SZWNvcmRFcnJvcnNUbygmZmlsZV9lcnJvcl9jb2xsZWN0b3IpOworICB9CisgIGlmICh1c2luZ192YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl8pIHsKKyAgICBwYXJzZXIuUmVjb3JkU291cmNlTG9jYXRpb25zVG8oJnNvdXJjZV9sb2NhdGlvbnNfKTsKKyAgfQorCisgIC8vIFBhcnNlIGl0LgorICBvdXRwdXQtPnNldF9uYW1lKGZpbGVuYW1lKTsKKyAgcmV0dXJuIHBhcnNlci5QYXJzZSgmdG9rZW5pemVyLCBvdXRwdXQpICYmCisgICAgICAgICAhZmlsZV9lcnJvcl9jb2xsZWN0b3IuaGFkX2Vycm9ycygpOworfQorCitib29sIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLCBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigKKyAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwgaW50IGZpZWxkX251bWJlciwKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OlZhbGlkYXRpb25FcnJvckNvbGxlY3Rvcjo6CitWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IoU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSogb3duZXIpCisgIDogb3duZXJfKG93bmVyKSB7fQorCitTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjpWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3I6OgorflZhbGlkYXRpb25FcnJvckNvbGxlY3RvcigpIHt9CisKK3ZvaWQgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yOjpBZGRFcnJvcigKKyAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgaWYgKG93bmVyXy0+ZXJyb3JfY29sbGVjdG9yXyA9PSBOVUxMKSByZXR1cm47CisKKyAgaW50IGxpbmUsIGNvbHVtbjsKKyAgb3duZXJfLT5zb3VyY2VfbG9jYXRpb25zXy5GaW5kKGRlc2NyaXB0b3IsIGxvY2F0aW9uLCAmbGluZSwgJmNvbHVtbik7CisgIG93bmVyXy0+ZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IoZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW1wb3J0ZXI6OkltcG9ydGVyKFNvdXJjZVRyZWUqIHNvdXJjZV90cmVlLAorICAgICAgICAgICAgICAgICAgIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpCisgIDogZGF0YWJhc2VfKHNvdXJjZV90cmVlKSwKKyAgICBwb29sXygmZGF0YWJhc2VfLCBkYXRhYmFzZV8uR2V0VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKCkpIHsKKyAgZGF0YWJhc2VfLlJlY29yZEVycm9yc1RvKGVycm9yX2NvbGxlY3Rvcik7Cit9CisKK0ltcG9ydGVyOjp+SW1wb3J0ZXIoKSB7fQorCitjb25zdCBGaWxlRGVzY3JpcHRvciogSW1wb3J0ZXI6OkltcG9ydChjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHJldHVybiBwb29sXy5GaW5kRmlsZUJ5TmFtZShmaWxlbmFtZSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU291cmNlVHJlZTo6flNvdXJjZVRyZWUoKSB7fQorCitEaXNrU291cmNlVHJlZTo6RGlza1NvdXJjZVRyZWUoKSB7fQorCitEaXNrU291cmNlVHJlZTo6fkRpc2tTb3VyY2VUcmVlKCkge30KKworc3RhdGljIGlubGluZSBjaGFyIExhc3RDaGFyKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIHJldHVybiBzdHJbc3RyLnNpemUoKSAtIDFdOworfQorCisvLyBHaXZlbiBhIHBhdGgsIHJldHVybnMgYW4gZXF1aXZhbGVudCBwYXRoIHdpdGggdGhlc2UgY2hhbmdlczoKKy8vIC0gT24gV2luZG93cywgYW55IGJhY2tzbGFzaGVzIGFyZSByZXBsYWNlZCB3aXRoIGZvcndhcmQgc2xhc2hlcy4KKy8vIC0gQW55IGluc3RhbmNlcyBvZiB0aGUgZGlyZWN0b3J5ICIuIiBhcmUgcmVtb3ZlZC4KKy8vIC0gQW55IGNvbnNlY3V0aXZlICcvJ3MgYXJlIGNvbGxhcHNlZCBpbnRvIGEgc2luZ2xlIHNsYXNoLgorLy8gTm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIG1heSBiZSBlbXB0eS4KKy8vCisvLyBUT0RPKGtlbnRvbik6ICBJdCB3b3VsZCBiZSBuaWNlIHRvIGhhbmRsZSAiLi4iLCBlLmcuIHNvIHRoYXQgd2UgY2FuIGZpZ3VyZQorLy8gICBvdXQgdGhhdCAiZm9vL2Jhci5wcm90byIgaXMgaW5zaWRlICJiYXovLi4vZm9vIi4gIEhvd2V2ZXIsIGlmIGJheiBpcyBhCisvLyAgIHN5bWxpbmsgb3IgZG9lc24ndCBleGlzdCwgdGhlbiB0aGluZ3MgZ2V0IGNvbXBsaWNhdGVkLCBhbmQgd2UgY2FuJ3QKKy8vICAgYWN0dWFsbHkgZGV0ZXJtaW5lIHRoaXMgd2l0aG91dCBpbnZlc3RpZ2F0aW5nIHRoZSBmaWxlc3lzdGVtLCBwcm9iYWJseQorLy8gICBpbiBub24tcG9ydGFibGUgd2F5cy4gIFNvLCB3ZSBwdW50LgorLy8KKy8vIFRPRE8oa2VudG9uKTogIEl0IHdvdWxkIGJlIG5pY2UgdG8gdXNlIHJlYWxwYXRoKCkgaGVyZSBleGNlcHQgdGhhdCBpdAorLy8gICByZXNvbHZlcyBzeW1ib2xpYyBsaW5rcy4gIFRoaXMgY291bGQgY2F1c2UgcHJvYmxlbXMgaWYgcGVvcGxlIHBsYWNlCisvLyAgIHN5bWJvbGljIGxpbmtzIGluIHRoZWlyIHNvdXJjZSB0cmVlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBleGVjdXRlZDoKKy8vICAgICBwcm90b2MgLS1wcm90b19wYXRoPWZvbyBmb28vYmFyL2Jhei5wcm90bworLy8gICB0aGVuIGlmIGZvby9iYXIgaXMgYSBzeW1ib2xpYyBsaW5rLCBmb28vYmFyL2Jhei5wcm90byB3aWxsIGNhbm9uaWNhbGl6ZQorLy8gICB0byBhIHBhdGggd2hpY2ggZG9lcyBub3QgYXBwZWFyIHRvIGJlIHVuZGVyIGZvbywgYW5kIHRodXMgdGhlIGNvbXBpbGVyCisvLyAgIHdpbGwgY29tcGxhaW4gdGhhdCBiYXoucHJvdG8gaXMgbm90IGluc2lkZSB0aGUgLS1wcm90b19wYXRoLgorc3RhdGljIHN0cmluZyBDYW5vbmljYWxpemVQYXRoKHN0cmluZyBwYXRoKSB7CisjaWZkZWYgX1dJTjMyCisgIC8vIFRoZSBXaW4zMiBBUEkgYWNjZXB0cyBmb3J3YXJkIHNsYXNoZXMgYXMgYSBwYXRoIGRlbGltaXRlciBldmVuIHRob3VnaAorICAvLyBiYWNrc2xhc2hlcyBhcmUgc3RhbmRhcmQuICBMZXQncyBhdm9pZCBjb25mdXNpb24gYW5kIHVzZSBvbmx5IGZvcndhcmQKKyAgLy8gc2xhc2hlcy4KKyAgaWYgKEhhc1ByZWZpeFN0cmluZyhwYXRoLCAiXFxcXCIpKSB7CisgICAgLy8gQXZvaWQgY29udmVydGluZyB0d28gbGVhZGluZyBiYWNrc2xhc2hlcy4KKyAgICBwYXRoID0gIlxcXFwiICsgU3RyaW5nUmVwbGFjZShwYXRoLnN1YnN0cigyKSwgIlxcIiwgIi8iLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBwYXRoID0gU3RyaW5nUmVwbGFjZShwYXRoLCAiXFwiLCAiLyIsIHRydWUpOworICB9CisjZW5kaWYKKworICB2ZWN0b3I8c3RyaW5nPiBwYXJ0czsKKyAgdmVjdG9yPHN0cmluZz4gY2Fub25pY2FsX3BhcnRzOworICBTcGxpdFN0cmluZ1VzaW5nKHBhdGgsICIvIiwgJnBhcnRzKTsgIC8vIE5vdGU6ICBSZW1vdmVzIGVtcHR5IHBhcnRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHBhcnRzW2ldID09ICIuIikgeworICAgICAgLy8gSWdub3JlLgorICAgIH0gZWxzZSB7CisgICAgICBjYW5vbmljYWxfcGFydHMucHVzaF9iYWNrKHBhcnRzW2ldKTsKKyAgICB9CisgIH0KKyAgc3RyaW5nIHJlc3VsdCA9IEpvaW5TdHJpbmdzKGNhbm9uaWNhbF9wYXJ0cywgIi8iKTsKKyAgaWYgKCFwYXRoLmVtcHR5KCkgJiYgcGF0aFswXSA9PSAnLycpIHsKKyAgICAvLyBSZXN0b3JlIGxlYWRpbmcgc2xhc2guCisgICAgcmVzdWx0ID0gJy8nICsgcmVzdWx0OworICB9CisgIGlmICghcGF0aC5lbXB0eSgpICYmIExhc3RDaGFyKHBhdGgpID09ICcvJyAmJgorICAgICAgIXJlc3VsdC5lbXB0eSgpICYmIExhc3RDaGFyKHJlc3VsdCkgIT0gJy8nKSB7CisgICAgLy8gUmVzdG9yZSB0cmFpbGluZyBzbGFzaC4KKyAgICByZXN1bHQgKz0gJy8nOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBDb250YWluc1BhcmVudFJlZmVyZW5jZShjb25zdCBzdHJpbmcmIHBhdGgpIHsKKyAgcmV0dXJuIHBhdGggPT0gIi4uIiB8fAorICAgICAgICAgSGFzUHJlZml4U3RyaW5nKHBhdGgsICIuLi8iKSB8fAorICAgICAgICAgSGFzU3VmZml4U3RyaW5nKHBhdGgsICIvLi4iKSB8fAorICAgICAgICAgcGF0aC5maW5kKCIvLi4vIikgIT0gc3RyaW5nOjpucG9zOworfQorCisvLyBNYXBzIGEgZmlsZSBmcm9tIGFuIG9sZCBsb2NhdGlvbiB0byBhIG5ldyBvbmUuICBUeXBpY2FsbHksIG9sZF9wcmVmaXggaXMKKy8vIGEgdmlydHVhbCBwYXRoIGFuZCBuZXdfcHJlZml4IGlzIGl0cyBjb3JyZXNwb25kaW5nIGRpc2sgcGF0aC4gIFJldHVybnMKKy8vIGZhbHNlIGlmIHRoZSBmaWxlbmFtZSBkaWQgbm90IHN0YXJ0IHdpdGggb2xkX3ByZWZpeCwgb3RoZXJ3aXNlIHJlcGxhY2VzCisvLyBvbGRfcHJlZml4IHdpdGggbmV3X3ByZWZpeCBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gKnJlc3VsdC4gIEV4YW1wbGVzOgorLy8gICBzdHJpbmcgcmVzdWx0OworLy8gICBhc3NlcnQoQXBwbHlNYXBwaW5nKCJmb28vYmFyIiwgIiIsICJiYXoiLCAmcmVzdWx0KSk7CisvLyAgIGFzc2VydChyZXN1bHQgPT0gImJhei9mb28vYmFyIik7CisvLworLy8gICBhc3NlcnQoQXBwbHlNYXBwaW5nKCJmb28vYmFyIiwgImZvbyIsICJiYXoiLCAmcmVzdWx0KSk7CisvLyAgIGFzc2VydChyZXN1bHQgPT0gImJhei9iYXIiKTsKKy8vCisvLyAgIGFzc2VydChBcHBseU1hcHBpbmcoImZvbyIsICJmb28iLCAiYmFyIiwgJnJlc3VsdCkpOworLy8gICBhc3NlcnQocmVzdWx0ID09ICJiYXIiKTsKKy8vCisvLyAgIGFzc2VydCghQXBwbHlNYXBwaW5nKCJmb28vYmFyIiwgImJheiIsICJxdXgiLCAmcmVzdWx0KSk7CisvLyAgIGFzc2VydCghQXBwbHlNYXBwaW5nKCJmb28vYmFyIiwgImJheiIsICJxdXgiLCAmcmVzdWx0KSk7CisvLyAgIGFzc2VydCghQXBwbHlNYXBwaW5nKCJmb29iYXIiLCAiZm9vIiwgImJheiIsICZyZXN1bHQpKTsKK3N0YXRpYyBib29sIEFwcGx5TWFwcGluZyhjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb2xkX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5ld19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiByZXN1bHQpIHsKKyAgaWYgKG9sZF9wcmVmaXguZW1wdHkoKSkgeworICAgIC8vIG9sZF9wcmVmaXggbWF0Y2hlcyBhbnkgcmVsYXRpdmUgcGF0aC4KKyAgICBpZiAoQ29udGFpbnNQYXJlbnRSZWZlcmVuY2UoZmlsZW5hbWUpKSB7CisgICAgICAvLyBXZSBkbyBub3QgYWxsb3cgdGhlIGZpbGUgbmFtZSB0byB1c2UgIi4uIi4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKEhhc1ByZWZpeFN0cmluZyhmaWxlbmFtZSwgIi8iKSB8fAorICAgICAgICBJc1dpbmRvd3NBYnNvbHV0ZVBhdGgoZmlsZW5hbWUpKSB7CisgICAgICAvLyBUaGlzIGlzIGFuIGFic29sdXRlIHBhdGgsIHNvIGl0IGlzbid0IG1hdGNoZWQgYnkgdGhlIGVtcHR5IHN0cmluZy4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmVzdWx0LT5hc3NpZ24obmV3X3ByZWZpeCk7CisgICAgaWYgKCFyZXN1bHQtPmVtcHR5KCkpIHJlc3VsdC0+cHVzaF9iYWNrKCcvJyk7CisgICAgcmVzdWx0LT5hcHBlbmQoZmlsZW5hbWUpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKEhhc1ByZWZpeFN0cmluZyhmaWxlbmFtZSwgb2xkX3ByZWZpeCkpIHsKKyAgICAvLyBvbGRfcHJlZml4IGlzIGEgcHJlZml4IG9mIHRoZSBmaWxlbmFtZS4gIElzIGl0IHRoZSB3aG9sZSBmaWxlbmFtZT8KKyAgICBpZiAoZmlsZW5hbWUuc2l6ZSgpID09IG9sZF9wcmVmaXguc2l6ZSgpKSB7CisgICAgICAvLyBZZXAsIGl0J3MgYW4gZXhhY3QgbWF0Y2guCisgICAgICAqcmVzdWx0ID0gbmV3X3ByZWZpeDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAvLyBOb3QgYW4gZXhhY3QgbWF0Y2guICBJcyB0aGUgbmV4dCBjaGFyYWN0ZXIgYSAnLyc/ICBPdGhlcndpc2UsCisgICAgICAvLyB0aGlzIGlzbid0IGFjdHVhbGx5IGEgbWF0Y2ggYXQgYWxsLiAgRS5nLiB0aGUgcHJlZml4ICJmb28vYmFyIgorICAgICAgLy8gZG9lcyBub3QgbWF0Y2ggdGhlIGZpbGVuYW1lICJmb28vYmFyYmF6Ii4KKyAgICAgIGludCBhZnRlcl9wcmVmaXhfc3RhcnQgPSAtMTsKKyAgICAgIGlmIChmaWxlbmFtZVtvbGRfcHJlZml4LnNpemUoKV0gPT0gJy8nKSB7CisgICAgICAgIGFmdGVyX3ByZWZpeF9zdGFydCA9IG9sZF9wcmVmaXguc2l6ZSgpICsgMTsKKyAgICAgIH0gZWxzZSBpZiAoZmlsZW5hbWVbb2xkX3ByZWZpeC5zaXplKCkgLSAxXSA9PSAnLycpIHsKKyAgICAgICAgLy8gb2xkX3ByZWZpeCBpcyBuZXZlciBlbXB0eSwgYW5kIGNhbm9uaWNhbGl6ZWQgcGF0aHMgbmV2ZXIgaGF2ZQorICAgICAgICAvLyBjb25zZWN1dGl2ZSAnLycgY2hhcmFjdGVycy4KKyAgICAgICAgYWZ0ZXJfcHJlZml4X3N0YXJ0ID0gb2xkX3ByZWZpeC5zaXplKCk7CisgICAgICB9CisgICAgICBpZiAoYWZ0ZXJfcHJlZml4X3N0YXJ0ICE9IC0xKSB7CisgICAgICAgIC8vIFllcC4gIFNvIHRoZSBwcmVmaXhlcyBhcmUgZGlyZWN0b3JpZXMgYW5kIHRoZSBmaWxlbmFtZSBpcyBhIGZpbGUKKyAgICAgICAgLy8gaW5zaWRlIHRoZW0uCisgICAgICAgIHN0cmluZyBhZnRlcl9wcmVmaXggPSBmaWxlbmFtZS5zdWJzdHIoYWZ0ZXJfcHJlZml4X3N0YXJ0KTsKKyAgICAgICAgaWYgKENvbnRhaW5zUGFyZW50UmVmZXJlbmNlKGFmdGVyX3ByZWZpeCkpIHsKKyAgICAgICAgICAvLyBXZSBkbyBub3QgYWxsb3cgdGhlIGZpbGUgbmFtZSB0byB1c2UgIi4uIi4KKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LT5hc3NpZ24obmV3X3ByZWZpeCk7CisgICAgICAgIGlmICghcmVzdWx0LT5lbXB0eSgpKSByZXN1bHQtPnB1c2hfYmFjaygnLycpOworICAgICAgICByZXN1bHQtPmFwcGVuZChhZnRlcl9wcmVmaXgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRGlza1NvdXJjZVRyZWU6Ok1hcFBhdGgoY29uc3Qgc3RyaW5nJiB2aXJ0dWFsX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGlza19wYXRoKSB7CisgIG1hcHBpbmdzXy5wdXNoX2JhY2soTWFwcGluZyh2aXJ0dWFsX3BhdGgsIENhbm9uaWNhbGl6ZVBhdGgoZGlza19wYXRoKSkpOworfQorCitEaXNrU291cmNlVHJlZTo6RGlza0ZpbGVUb1ZpcnR1YWxGaWxlUmVzdWx0CitEaXNrU291cmNlVHJlZTo6RGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAorICAgIGNvbnN0IHN0cmluZyYgZGlza19maWxlLAorICAgIHN0cmluZyogdmlydHVhbF9maWxlLAorICAgIHN0cmluZyogc2hhZG93aW5nX2Rpc2tfZmlsZSkgeworICBpbnQgbWFwcGluZ19pbmRleCA9IC0xOworICBzdHJpbmcgY2Fub25pY2FsX2Rpc2tfZmlsZSA9IENhbm9uaWNhbGl6ZVBhdGgoZGlza19maWxlKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdzXy5zaXplKCk7IGkrKykgeworICAgIC8vIEFwcGx5IHRoZSBtYXBwaW5nIGluIHJldmVyc2UuCisgICAgaWYgKEFwcGx5TWFwcGluZyhjYW5vbmljYWxfZGlza19maWxlLCBtYXBwaW5nc19baV0uZGlza19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3NfW2ldLnZpcnR1YWxfcGF0aCwgdmlydHVhbF9maWxlKSkgeworICAgICAgLy8gU3VjY2Vzcy4KKyAgICAgIG1hcHBpbmdfaW5kZXggPSBpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKG1hcHBpbmdfaW5kZXggPT0gLTEpIHsKKyAgICByZXR1cm4gTk9fTUFQUElORzsKKyAgfQorCisgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgbWFwcGluZ3Mgd2l0aCBoaWdoZXIgcHJlY2VkZW5jZSBhbmQgdmVyaWZ5IHRoYXQgbm9uZQorICAvLyBvZiB0aGVtIG1hcCB0aGlzIGZpbGUgdG8gc29tZSBvdGhlciBleGlzdGluZyBmaWxlLgorICBmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdfaW5kZXg7IGkrKykgeworICAgIGlmIChBcHBseU1hcHBpbmcoKnZpcnR1YWxfZmlsZSwgbWFwcGluZ3NfW2ldLnZpcnR1YWxfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzX1tpXS5kaXNrX3BhdGgsIHNoYWRvd2luZ19kaXNrX2ZpbGUpKSB7CisgICAgICBpZiAoYWNjZXNzKHNoYWRvd2luZ19kaXNrX2ZpbGUtPmNfc3RyKCksIEZfT0spID49IDApIHsKKyAgICAgICAgLy8gRmlsZSBleGlzdHMuCisgICAgICAgIHJldHVybiBTSEFET1dFRDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc2hhZG93aW5nX2Rpc2tfZmlsZS0+Y2xlYXIoKTsKKworICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gb3BlbiB0aGUgZmlsZS4gIE5vdGUgdGhhdCB0aGlzIGFsc28gaGFzIHRoZSBzaWRlLWVmZmVjdAorICAvLyBvZiB2ZXJpZnlpbmcgdGhhdCB3ZSBhcmUgbm90IGNhbm9uaWNhbGl6aW5nIGF3YXkgYW55IG5vbi1leGlzdGVudAorICAvLyBkaXJlY3Rvcmllcy4KKyAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gc3RyZWFtKE9wZW5EaXNrRmlsZShkaXNrX2ZpbGUpKTsKKyAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIENBTk5PVF9PUEVOOworICB9CisKKyAgcmV0dXJuIFNVQ0NFU1M7Cit9CisKK2Jvb2wgRGlza1NvdXJjZVRyZWU6OlZpcnR1YWxGaWxlVG9EaXNrRmlsZShjb25zdCBzdHJpbmcmIHZpcnR1YWxfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGRpc2tfZmlsZSkgeworICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weUlucHV0U3RyZWFtPiBzdHJlYW0oT3BlblZpcnR1YWxGaWxlKHZpcnR1YWxfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNrX2ZpbGUpKTsKKyAgcmV0dXJuIHN0cmVhbSAhPSBOVUxMOworfQorCitpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogRGlza1NvdXJjZVRyZWU6Ok9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gT3BlblZpcnR1YWxGaWxlKGZpbGVuYW1lLCBOVUxMKTsKK30KKworaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIERpc2tTb3VyY2VUcmVlOjpPcGVuVmlydHVhbEZpbGUoCisgICAgY29uc3Qgc3RyaW5nJiB2aXJ0dWFsX2ZpbGUsCisgICAgc3RyaW5nKiBkaXNrX2ZpbGUpIHsKKyAgaWYgKHZpcnR1YWxfZmlsZSAhPSBDYW5vbmljYWxpemVQYXRoKHZpcnR1YWxfZmlsZSkgfHwKKyAgICAgIENvbnRhaW5zUGFyZW50UmVmZXJlbmNlKHZpcnR1YWxfZmlsZSkpIHsKKyAgICAvLyBXZSBkbyBub3QgYWxsb3cgaW1wb3J0aW5nIG9mIHBhdGhzIGNvbnRhaW5pbmcgdGhpbmdzIGxpa2UgIi4uIiBvcgorICAgIC8vIGNvbnNlY3V0aXZlIHNsYXNoZXMgc2luY2UgdGhlIGNvbXBpbGVyIGV4cGVjdHMgZmlsZXMgdG8gYmUgdW5pcXVlbHkKKyAgICAvLyBpZGVudGlmaWVkIGJ5IGZpbGUgbmFtZS4KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3NfLnNpemUoKTsgaSsrKSB7CisgICAgc3RyaW5nIHRlbXBfZGlza19maWxlOworICAgIGlmIChBcHBseU1hcHBpbmcodmlydHVhbF9maWxlLCBtYXBwaW5nc19baV0udmlydHVhbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3NfW2ldLmRpc2tfcGF0aCwgJnRlbXBfZGlza19maWxlKSkgeworICAgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIHN0cmVhbSA9IE9wZW5EaXNrRmlsZSh0ZW1wX2Rpc2tfZmlsZSk7CisgICAgICBpZiAoc3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRpc2tfZmlsZSAhPSBOVUxMKSB7CisgICAgICAgICAgKmRpc2tfZmlsZSA9IHRlbXBfZGlza19maWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHJlYW07CisgICAgICB9CisKKyAgICAgIGlmIChlcnJubyA9PSBFQUNDRVMpIHsKKyAgICAgICAgLy8gVGhlIGZpbGUgZXhpc3RzIGJ1dCBpcyBub3QgcmVhZGFibGUuCisgICAgICAgIC8vIFRPRE8oa2VudG9uKTogIEZpbmQgYSB3YXkgdG8gcmVwb3J0IHRoaXMgbW9yZSBuaWNlbHkuCisgICAgICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIlJlYWQgYWNjZXNzIGlzIGRlbmllZCBmb3IgZmlsZTogIiA8PCB0ZW1wX2Rpc2tfZmlsZTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2lvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBEaXNrU291cmNlVHJlZTo6T3BlbkRpc2tGaWxlKAorICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgaW50IGZpbGVfZGVzY3JpcHRvcjsKKyAgZG8geworICAgIGZpbGVfZGVzY3JpcHRvciA9IG9wZW4oZmlsZW5hbWUuY19zdHIoKSwgT19SRE9OTFkpOworICB9IHdoaWxlIChmaWxlX2Rlc2NyaXB0b3IgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKyAgaWYgKGZpbGVfZGVzY3JpcHRvciA+PSAwKSB7CisgICAgaW86OkZpbGVJbnB1dFN0cmVhbSogcmVzdWx0ID0gbmV3IGlvOjpGaWxlSW5wdXRTdHJlYW0oZmlsZV9kZXNjcmlwdG9yKTsKKyAgICByZXN1bHQtPlNldENsb3NlT25EZWxldGUodHJ1ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyZWZjMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmgKQEAgLTAsMCArMSwzMDMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBpcyB0aGUgcHVibGljIGludGVyZmFjZSB0byB0aGUgLnByb3RvIGZpbGUgcGFyc2VyLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9JTVBPUlRFUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0lNUE9SVEVSX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK25hbWVzcGFjZSBpbyB7IGNsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07IH0KKworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCitjbGFzcyBJbXBvcnRlcjsKK2NsYXNzIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yOworY2xhc3MgU291cmNlVHJlZTsKK2NsYXNzIERpc2tTb3VyY2VUcmVlOworCisvLyBUT0RPKGtlbnRvbik6ICBNb3ZlIGFsbCBTb3VyY2VUcmVlIHN0dWZmIHRvIGEgc2VwYXJhdGUgZmlsZT8KKworLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgRGVzY3JpcHRvckRhdGFiYXNlIHdoaWNoIGxvYWRzIGZpbGVzIGZyb20gYSBTb3VyY2VUcmVlCisvLyBhbmQgcGFyc2VzIHRoZW0uCisvLworLy8gTm90ZTogIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZC1zYWZlIHNpbmNlIGl0IG1haW50YWlucyBhIHRhYmxlIG9mIHNvdXJjZQorLy8gICBjb2RlIGxvY2F0aW9ucyBmb3IgZXJyb3IgcmVwb3J0aW5nLiAgSG93ZXZlciwgd2hlbiBhIERlc2NyaXB0b3JQb29sIHdyYXBzCisvLyAgIGEgRGVzY3JpcHRvckRhdGFiYXNlLCBpdCB1c2VzIG11dGV4IGxvY2tpbmcgdG8gbWFrZSBzdXJlIG9ubHkgb25lIG1ldGhvZAorLy8gICBvZiB0aGUgZGF0YWJhc2UgaXMgY2FsbGVkIGF0IGEgdGltZSwgZXZlbiBpZiB0aGUgRGVzY3JpcHRvclBvb2wgaXMgdXNlZAorLy8gICBmcm9tIG11bHRpcGxlIHRocmVhZHMuICBUaGVyZWZvcmUsIHRoZXJlIGlzIG9ubHkgYSBwcm9ibGVtIGlmIHlvdSBjcmVhdGUKKy8vICAgbXVsdGlwbGUgRGVzY3JpcHRvclBvb2xzIHdyYXBwaW5nIHRoZSBzYW1lIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UKKy8vICAgYW5kIHVzZSB0aGVtIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KKy8vCisvLyBOb3RlOiAgVGhpcyBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCkgb3IKKy8vICAgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCk7IHRoZXNlIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZSB7CisgcHVibGljOgorICBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKFNvdXJjZVRyZWUqIHNvdXJjZV90cmVlKTsKKyAgflNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UoKTsKKworICAvLyBJbnN0cnVjdHMgdGhlIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UgdG8gcmVwb3J0IGFueSBwYXJzZSBlcnJvcnMKKyAgLy8gdG8gdGhlIGdpdmVuIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZQorICAvLyBwYXJzaW5nLiAgZXJyb3JfY29sbGVjdG9yIG11c3QgcmVtYWluIHZhbGlkIHVudGlsIGVpdGhlciB0aGlzIG1ldGhvZAorICAvLyBpcyBjYWxsZWQgYWdhaW4gb3IgdGhlIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UgaXMgZGVzdHJveWVkLgorICB2b2lkIFJlY29yZEVycm9yc1RvKE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpIHsKKyAgICBlcnJvcl9jb2xsZWN0b3JfID0gZXJyb3JfY29sbGVjdG9yOworICB9CisKKyAgLy8gR2V0cyBhIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciB3aGljaCByZWNvcmRzIGVycm9ycyB0byB0aGUKKyAgLy8gTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3Igc3BlY2lmaWVkIHdpdGggUmVjb3JkRXJyb3JzVG8oKS4gIFRoaXMgY29sbGVjdG9yCisgIC8vIGhhcyB0aGUgYWJpbGl0eSB0byBkZXRlcm1pbmUgZXhhY3QgbGluZSBhbmQgY29sdW1uIG51bWJlcnMgb2YgZXJyb3JzCisgIC8vIGZyb20gdGhlIGluZm9ybWF0aW9uIGdpdmVuIHRvIGl0IGJ5IHRoZSBEZXNjcmlwdG9yUG9vbC4KKyAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yKiBHZXRWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IoKSB7CisgICAgdXNpbmdfdmFsaWRhdGlvbl9lcnJvcl9jb2xsZWN0b3JfID0gdHJ1ZTsKKyAgICByZXR1cm4gJnZhbGlkYXRpb25fZXJyb3JfY29sbGVjdG9yXzsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKyAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKyAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisKKyBwcml2YXRlOgorICBjbGFzcyBTaW5nbGVGaWxlRXJyb3JDb2xsZWN0b3I7CisKKyAgU291cmNlVHJlZSogc291cmNlX3RyZWVfOworICBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yXzsKKworICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yIDogcHVibGljIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciB7CisgICBwdWJsaWM6CisgICAgVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UqIG93bmVyKTsKKyAgICB+VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKCk7CisKKyAgICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpOworCisgICBwcml2YXRlOgorICAgIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UqIG93bmVyXzsKKyAgfTsKKyAgZnJpZW5kIGNsYXNzIFZhbGlkYXRpb25FcnJvckNvbGxlY3RvcjsKKworICBib29sIHVzaW5nX3ZhbGlkYXRpb25fZXJyb3JfY29sbGVjdG9yXzsKKyAgU291cmNlTG9jYXRpb25UYWJsZSBzb3VyY2VfbG9jYXRpb25zXzsKKyAgVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yIHZhbGlkYXRpb25fZXJyb3JfY29sbGVjdG9yXzsKK307CisKKy8vIFNpbXBsZSBpbnRlcmZhY2UgZm9yIHBhcnNpbmcgLnByb3RvIGZpbGVzLiAgVGhpcyB3cmFwcyB0aGUgcHJvY2VzcworLy8gb2Ygb3BlbmluZyB0aGUgZmlsZSwgcGFyc2luZyBpdCB3aXRoIGEgUGFyc2VyLCByZWN1cnNpdmVseSBwYXJzaW5nIGFsbCBpdHMKKy8vIGltcG9ydHMsIGFuZCB0aGVuIGNyb3NzLWxpbmtpbmcgdGhlIHJlc3VsdHMgdG8gcHJvZHVjZSBhIEZpbGVEZXNjcmlwdG9yLgorLy8KKy8vIFRoaXMgaXMgcmVhbGx5IGp1c3QgYSB0aGluIHdyYXBwZXIgYXJvdW5kIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UuCisvLyBZb3UgbWF5IGZpbmQgdGhhdCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlIGlzIG1vcmUgZmxleGlibGUuCisvLworLy8gVE9ETyhrZW50b24pOiAgSSBmZWVsIGxpa2UgdGhpcyBjbGFzcyBpcyBub3Qgd2VsbC1uYW1lZC4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBJbXBvcnRlciB7CisgcHVibGljOgorICBJbXBvcnRlcihTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSwKKyAgICAgICAgICAgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcik7CisgIH5JbXBvcnRlcigpOworCisgIC8vIEltcG9ydCB0aGUgZ2l2ZW4gZmlsZSBhbmQgYnVpbGQgYSBGaWxlRGVzY3JpcHRvciByZXByZXNlbnRpbmcgaXQuICBJZgorICAvLyB0aGUgZmlsZSBpcyBhbHJlYWR5IGluIHRoZSBEZXNjcmlwdG9yUG9vbCwgdGhlIGV4aXN0aW5nIEZpbGVEZXNjcmlwdG9yCisgIC8vIHdpbGwgYmUgcmV0dXJuZWQuICBUaGUgRmlsZURlc2NyaXB0b3IgaXMgcHJvcGVydHkgb2YgdGhlIERlc2NyaXB0b3JQb29sLAorICAvLyBhbmQgd2lsbCByZW1haW4gdmFsaWQgdW50aWwgaXQgaXMgZGVzdHJveWVkLiAgSWYgYW55IGVycm9ycyBvY2N1ciwgdGhleQorICAvLyB3aWxsIGJlIHJlcG9ydGVkIHVzaW5nIHRoZSBlcnJvciBjb2xsZWN0b3IgYW5kIEltcG9ydCgpIHdpbGwgcmV0dXJuIE5VTEwuCisgIC8vCisgIC8vIEEgcGFydGljdWxhciBJbXBvcnRlciBvYmplY3Qgd2lsbCBvbmx5IHJlcG9ydCBlcnJvcnMgZm9yIGEgcGFydGljdWxhcgorICAvLyBmaWxlIG9uY2UuICBBbGwgZnV0dXJlIGF0dGVtcHRzIHRvIGltcG9ydCB0aGUgc2FtZSBmaWxlIHdpbGwgcmV0dXJuIE5VTEwKKyAgLy8gd2l0aG91dCByZXBvcnRpbmcgYW55IGVycm9ycy4gIFRoZSBpZGVhIGlzIHRoYXQgeW91IG1pZ2h0IHdhbnQgdG8gaW1wb3J0CisgIC8vIGEgbG90IG9mIGZpbGVzIHdpdGhvdXQgc2VlaW5nIHRoZSBzYW1lIGVycm9ycyBvdmVyIGFuZCBvdmVyIGFnYWluLiAgSWYKKyAgLy8geW91IHdhbnQgdG8gc2VlIGVycm9ycyBmb3IgdGhlIHNhbWUgZmlsZXMgcmVwZWF0ZWRseSwgeW91IGNhbiB1c2UgYQorICAvLyBzZXBhcmF0ZSBJbXBvcnRlciBvYmplY3QgdG8gaW1wb3J0IGVhY2ggb25lIChidXQgdXNlIHRoZSBzYW1lCisgIC8vIERlc2NyaXB0b3JQb29sIHNvIHRoYXQgdGhleSBjYW4gYmUgY3Jvc3MtbGlua2VkKS4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIEltcG9ydChjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKKworICAvLyBUaGUgRGVzY3JpcHRvclBvb2wgaW4gd2hpY2ggYWxsIGltcG9ydGVkIEZpbGVEZXNjcmlwdG9ycyBhbmQgdGhlaXIKKyAgLy8gY29udGVudHMgYXJlIHN0b3JlZC4KKyAgaW5saW5lIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKCkgY29uc3QgeworICAgIHJldHVybiAmcG9vbF87CisgIH0KKworIHByaXZhdGU6CisgIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UgZGF0YWJhc2VfOworICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1wb3J0ZXIpOworfTsKKworLy8gSWYgdGhlIGltcG9ydGVyIGVuY291bnRlcnMgcHJvYmxlbXMgd2hpbGUgdHJ5aW5nIHRvIGltcG9ydCB0aGUgcHJvdG8gZmlsZXMsCisvLyBpdCByZXBvcnRzIHRoZW0gdG8gYSBNdWx0aUZpbGVFcnJvckNvbGxlY3Rvci4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBpbmxpbmUgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IoKSB7fQorICB2aXJ0dWFsIH5NdWx0aUZpbGVFcnJvckNvbGxlY3RvcigpOworCisgIC8vIExpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGFyZSB6ZXJvLWJhc2VkLiAgQSBsaW5lIG51bWJlciBvZiAtMSBpbmRpY2F0ZXMKKyAgLy8gYW4gZXJyb3Igd2l0aCB0aGUgZW50aXJlIGZpbGUgKGUuZy4gIm5vdCBmb3VuZCIpLgorICB2aXJ0dWFsIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpID0gMDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNdWx0aUZpbGVFcnJvckNvbGxlY3Rvcik7Cit9OworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2Ugd2hpY2ggcmVwcmVzZW50cyBhIGRpcmVjdG9yeSB0cmVlIGNvbnRhaW5pbmcgcHJvdG8gZmlsZXMuCisvLyBVc2VkIGJ5IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEltcG9ydGVyIHRvIHJlc29sdmUgaW1wb3J0IHN0YXRlbWVudHMKKy8vIE1vc3QgdXNlcnMgd2lsbCBwcm9iYWJseSB3YW50IHRvIHVzZSB0aGUgRGlza1NvdXJjZVRyZWUgaW1wbGVtZW50YXRpb24sCisvLyBiZWxvdy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTb3VyY2VUcmVlIHsKKyBwdWJsaWM6CisgIGlubGluZSBTb3VyY2VUcmVlKCkge30KKyAgdmlydHVhbCB+U291cmNlVHJlZSgpOworCisgIC8vIE9wZW4gdGhlIGdpdmVuIGZpbGUgYW5kIHJldHVybiBhIHN0cmVhbSB0aGF0IHJlYWRzIGl0LCBvciBOVUxMIGlmIG5vdAorICAvLyBmb3VuZC4gIFRoZSBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCBvYmplY3QuICBUaGUgZmlsZW5hbWUKKyAgLy8gbXVzdCBiZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlIGFuZCBtdXN0IG5vdAorICAvLyBjb250YWluICIuIiBvciAiLi4iIGNvbXBvbmVudHMuCisgIHZpcnR1YWwgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvdXJjZVRyZWUpOworfTsKKworLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgU291cmNlVHJlZSB3aGljaCBsb2FkcyBmaWxlcyBmcm9tIGxvY2F0aW9ucyBvbiBkaXNrLgorLy8gTXVsdGlwbGUgbWFwcGluZ3MgY2FuIGJlIHNldCB1cCB0byBtYXAgbG9jYXRpb25zIGluIHRoZSBEaXNrU291cmNlVHJlZSB0bworLy8gbG9jYXRpb25zIGluIHRoZSBwaHlzaWNhbCBmaWxlc3lzdGVtLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIERpc2tTb3VyY2VUcmVlIDogcHVibGljIFNvdXJjZVRyZWUgeworIHB1YmxpYzoKKyAgRGlza1NvdXJjZVRyZWUoKTsKKyAgfkRpc2tTb3VyY2VUcmVlKCk7CisKKyAgLy8gTWFwIGEgcGF0aCBvbiBkaXNrIHRvIGEgbG9jYXRpb24gaW4gdGhlIFNvdXJjZVRyZWUuICBUaGUgcGF0aCBtYXkgYmUKKyAgLy8gZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeS4gIElmIGl0IGlzIGEgZGlyZWN0b3J5LCB0aGUgZW50aXJlIHRyZWUKKyAgLy8gdW5kZXIgaXQgd2lsbCBiZSBtYXBwZWQgdG8gdGhlIGdpdmVuIHZpcnR1YWwgbG9jYXRpb24uICBUbyBtYXAgYSBkaXJlY3RvcnkKKyAgLy8gdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLCBwYXNzIGFuIGVtcHR5IHN0cmluZyBmb3IgdmlydHVhbF9wYXRoLgorICAvLworICAvLyBJZiBtdWx0aXBsZSBtYXBwZWQgcGF0aHMgYXBwbHkgd2hlbiBvcGVuaW5nIGEgZmlsZSwgdGhleSB3aWxsIGJlIHNlYXJjaGVkCisgIC8vIGluIG9yZGVyLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkbzoKKyAgLy8gICBNYXBQYXRoKCJiYXIiLCAiZm9vL2JhciIpOworICAvLyAgIE1hcFBhdGgoIiIsICJiYXoiKTsKKyAgLy8gYW5kIHRoZW4geW91IGRvOgorICAvLyAgIE9wZW4oImJhci9xdXgiKTsKKyAgLy8gdGhlIERpc2tTb3VyY2VUcmVlIHdpbGwgZmlyc3QgdHJ5IHRvIG9wZW4gZm9vL2Jhci9xdXgsIHRoZW4gYmF6L2Jhci9xdXgsCisgIC8vIHJldHVybmluZyB0aGUgZmlyc3Qgb25lIHRoYXQgb3BlbnMgc3VjY2Vzc2Z1bHkuCisgIC8vCisgIC8vIGRpc2tfcGF0aCBtYXkgYmUgYW4gYWJzb2x1dGUgcGF0aCBvciByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnksCisgIC8vIGp1c3QgbGlrZSBhIHBhdGggeW91J2QgcGFzcyB0byBvcGVuKCkuCisgIHZvaWQgTWFwUGF0aChjb25zdCBzdHJpbmcmIHZpcnR1YWxfcGF0aCwgY29uc3Qgc3RyaW5nJiBkaXNrX3BhdGgpOworCisgIC8vIFJldHVybiB0eXBlIGZvciBEaXNrRmlsZVRvVmlydHVhbEZpbGUoKS4KKyAgZW51bSBEaXNrRmlsZVRvVmlydHVhbEZpbGVSZXN1bHQgeworICAgIFNVQ0NFU1MsCisgICAgU0hBRE9XRUQsCisgICAgQ0FOTk9UX09QRU4sCisgICAgTk9fTUFQUElORworICB9OworCisgIC8vIEdpdmVuIGEgcGF0aCB0byBhIGZpbGUgb24gZGlzaywgZmluZCBhIHZpcnR1YWwgcGF0aCBtYXBwaW5nIHRvIHRoYXQKKyAgLy8gZmlsZS4gIFRoZSBmaXJzdCBtYXBwaW5nIGNyZWF0ZWQgd2l0aCBNYXBQYXRoKCkgd2hvc2UgZGlza19wYXRoIGNvbnRhaW5zCisgIC8vIHRoZSBmaWxlbmFtZSBpcyB1c2VkLiAgSG93ZXZlciwgdGhhdCB2aXJ0dWFsIHBhdGggbWF5IG5vdCBhY3R1YWxseSBiZQorICAvLyB1c2FibGUgdG8gb3BlbiB0aGUgZ2l2ZW4gZmlsZS4gIFBvc3NpYmxlIHJldHVybiB2YWx1ZXMgYXJlOgorICAvLyAqIFNVQ0NFU1M6IFRoZSBtYXBwaW5nIHdhcyBmb3VuZC4gICp2aXJ0dWFsX2ZpbGUgaXMgZmlsbGVkIGluIHNvIHRoYXQKKyAgLy8gICBjYWxsaW5nIE9wZW4oKnZpcnR1YWxfZmlsZSkgd2lsbCBvcGVuIHRoZSBmaWxlIG5hbWVkIGJ5IGRpc2tfZmlsZS4KKyAgLy8gKiBTSEFET1dFRDogQSBtYXBwaW5nIHdhcyBmb3VuZCwgYnV0IHVzaW5nIE9wZW4oKSB0byBvcGVuIHRoaXMgdmlydHVhbAorICAvLyAgIHBhdGggd2lsbCBlbmQgdXAgcmV0dXJuaW5nIHNvbWUgZGlmZmVyZW50IGZpbGUuICBUaGlzIGlzIGJlY2F1c2Ugc29tZQorICAvLyAgIG90aGVyIG1hcHBpbmcgd2l0aCBhIGhpZ2hlciBwcmVjZWRlbmNlIGFsc28gbWF0Y2hlcyB0aGlzIHZpcnR1YWwgcGF0aAorICAvLyAgIGFuZCBtYXBzIGl0IHRvIGEgZGlmZmVyZW50IGZpbGUgdGhhdCBleGlzdHMgb24gZGlzay4gICp2aXJ0dWFsX2ZpbGUKKyAgLy8gICBpcyBmaWxsZWQgaW4gYXMgaXQgd291bGQgYmUgaW4gdGhlIFNVQ0NFU1MgY2FzZS4gICpzaGFkb3dpbmdfZGlza19maWxlCisgIC8vICAgaXMgZmlsbGVkIGluIHdpdGggdGhlIGRpc2sgcGF0aCBvZiB0aGUgZmlsZSB3aGljaCB3b3VsZCBiZSBvcGVuZWQgaWYKKyAgLy8gICB5b3Ugd2VyZSB0byBjYWxsIE9wZW4oKnZpcnR1YWxfZmlsZSkuCisgIC8vICogQ0FOTk9UX09QRU46IFRoZSBtYXBwaW5nIHdhcyBmb3VuZCBhbmQgd2FzIG5vdCBzaGFkb3dlZCwgYnV0IHRoZQorICAvLyAgIGZpbGUgc3BlY2lmaWVkIGNhbm5vdCBiZSBvcGVuZWQuICBXaGVuIHRoaXMgdmFsdWUgaXMgcmV0dXJuZWQsCisgIC8vICAgZXJybm8gd2lsbCBpbmRpY2F0ZSB0aGUgcmVhc29uIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQuICAqdmlydHVhbF9maWxlCisgIC8vICAgd2lsbCBiZSBzZXQgdG8gdGhlIHZpcnR1YWwgcGF0aCBhcyBpbiB0aGUgU1VDQ0VTUyBjYXNlLCBldmVuIHRob3VnaAorICAvLyAgIGl0IGlzIG5vdCB1c2VmdWwuCisgIC8vICogTk9fTUFQUElORzogSW5kaWNhdGVzIHRoYXQgbm8gbWFwcGluZyB3YXMgZm91bmQgd2hpY2ggY29udGFpbnMgdGhpcworICAvLyAgIGZpbGUuCisgIERpc2tGaWxlVG9WaXJ0dWFsRmlsZVJlc3VsdAorICAgIERpc2tGaWxlVG9WaXJ0dWFsRmlsZShjb25zdCBzdHJpbmcmIGRpc2tfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiB2aXJ0dWFsX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogc2hhZG93aW5nX2Rpc2tfZmlsZSk7CisKKyAgLy8gR2l2ZW4gYSB2aXJ0dWFsIHBhdGgsIGZpbmQgdGhlIHBhdGggdG8gdGhlIGZpbGUgb24gZGlzay4KKyAgLy8gUmV0dXJuIHRydWUgYW5kIHVwZGF0ZSBkaXNrX2ZpbGUgd2l0aCB0aGUgb24tZGlzayBwYXRoIGlmIHRoZSBmaWxlIGV4aXN0cy4KKyAgLy8gUmV0dXJuIGZhbHNlIGFuZCBsZWF2ZSBkaXNrX2ZpbGUgdW50b3VjaGVkIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuCisgIGJvb2wgVmlydHVhbEZpbGVUb0Rpc2tGaWxlKGNvbnN0IHN0cmluZyYgdmlydHVhbF9maWxlLCBzdHJpbmcqIGRpc2tfZmlsZSk7CisKKyAgLy8gaW1wbGVtZW50cyBTb3VyY2VUcmVlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgTWFwcGluZyB7CisgICAgc3RyaW5nIHZpcnR1YWxfcGF0aDsKKyAgICBzdHJpbmcgZGlza19wYXRoOworCisgICAgaW5saW5lIE1hcHBpbmcoY29uc3Qgc3RyaW5nJiB2aXJ0dWFsX3BhdGgsIGNvbnN0IHN0cmluZyYgZGlza19wYXRoKQorICAgICAgOiB2aXJ0dWFsX3BhdGgodmlydHVhbF9wYXRoKSwgZGlza19wYXRoKGRpc2tfcGF0aCkge30KKyAgfTsKKyAgdmVjdG9yPE1hcHBpbmc+IG1hcHBpbmdzXzsKKworICAvLyBMaWtlIE9wZW4oKSwgYnV0IHJldHVybnMgdGhlIG9uLWRpc2sgcGF0aCBpbiBkaXNrX2ZpbGUgaWYgZGlza19maWxlIGlzCisgIC8vIG5vbi1OVUxMIGFuZCB0aGUgZmlsZSBjb3VsZCBiZSBzdWNjZXNzZnVsbHkgb3BlbmVkLgorICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogT3BlblZpcnR1YWxGaWxlKGNvbnN0IHN0cmluZyYgdmlydHVhbF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZGlza19maWxlKTsKKworICAvLyBMaWtlIE9wZW4oKSBidXQgZ2l2ZW4gdGhlIGFjdHVhbCBvbi1kaXNrIHBhdGguCisgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBPcGVuRGlza0ZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERpc2tTb3VyY2VUcmVlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0lNUE9SVEVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmZhZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw2MDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKK25hbWVzcGFjZSB7CisKKyNkZWZpbmUgRVhQRUNUX1NVQlNUUklORyhuZWVkbGUsIGhheXN0YWNrKSBcCisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsIChuZWVkbGUpLCAoaGF5c3RhY2spKQorCitjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgTW9ja0Vycm9yQ29sbGVjdG9yKCkge30KKyAgfk1vY2tFcnJvckNvbGxlY3RvcigpIHt9CisKKyAgc3RyaW5nIHRleHRfOworCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmdGV4dF8sICIkMDokMTokMjogJDNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBIGR1bW15IGltcGxlbWVudGF0aW9uIG9mIFNvdXJjZVRyZWUgYmFja2VkIGJ5IGEgc2ltcGxlIG1hcC4KK2NsYXNzIE1vY2tTb3VyY2VUcmVlIDogcHVibGljIFNvdXJjZVRyZWUgeworIHB1YmxpYzoKKyAgTW9ja1NvdXJjZVRyZWUoKSB7fQorICB+TW9ja1NvdXJjZVRyZWUoKSB7fQorCisgIHZvaWQgQWRkRmlsZShjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IGNoYXIqIGNvbnRlbnRzKSB7CisgICAgZmlsZXNfW25hbWVdID0gY29udGVudHM7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIFNvdXJjZVRyZWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogT3Blbihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgICAgY29uc3QgY2hhciogY29udGVudHMgPSBGaW5kUHRyT3JOdWxsKGZpbGVzXywgZmlsZW5hbWUpOworICAgIGlmIChjb250ZW50cyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBpbzo6QXJyYXlJbnB1dFN0cmVhbShjb250ZW50cywgc3RybGVuKGNvbnRlbnRzKSk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBoYXNoX21hcDxzdHJpbmcsIGNvbnN0IGNoYXIqPiBmaWxlc187Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEltcG9ydGVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIEltcG9ydGVyVGVzdCgpCisgICAgOiBpbXBvcnRlcl8oJnNvdXJjZV90cmVlXywgJmVycm9yX2NvbGxlY3Rvcl8pIHt9CisKKyAgdm9pZCBBZGRGaWxlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgICBzb3VyY2VfdHJlZV8uQWRkRmlsZShmaWxlbmFtZSwgdGV4dCk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIGNvbGxlY3RlZCBlcnJvciB0ZXh0CisgIHN0cmluZyBlcnJvcigpIGNvbnN0IHsgcmV0dXJuIGVycm9yX2NvbGxlY3Rvcl8udGV4dF87IH0KKworICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yXzsKKyAgTW9ja1NvdXJjZVRyZWUgc291cmNlX3RyZWVfOworICBJbXBvcnRlciBpbXBvcnRlcl87Cit9OworCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBJbXBvcnQpIHsKKyAgLy8gVGVzdCBub3JtYWwgaW1wb3J0aW5nLgorICBBZGRGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBpbXBvcnRlcl8uSW1wb3J0KCJmb28ucHJvdG8iKTsKKyAgRVhQRUNUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKKworICBBU1NFUlRfRVEoMSwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoIkZvbyIsIGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+bmFtZSgpKTsKKworICAvLyBJbXBvcnRpbmcgYWdhaW4gc2hvdWxkIHJldHVybiBzYW1lIG9iamVjdC4KKyAgRVhQRUNUX0VRKGZpbGUsIGltcG9ydGVyXy5JbXBvcnQoImZvby5wcm90byIpKTsKK30KKworVEVTVF9GKEltcG9ydGVyVGVzdCwgSW1wb3J0TmVzdGVkKSB7CisgIC8vIFRlc3QgdGhhdCBpbXBvcnRpbmcgYSBmaWxlIHdoaWNoIGltcG9ydHMgYW5vdGhlciBmaWxlIHdvcmtzLgorICBBZGRGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICIgIG9wdGlvbmFsIEJhciBiYXIgPSAxO1xuIgorICAgICJ9XG4iKTsKKyAgQWRkRmlsZSgiYmFyLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBCYXIge31cbiIpOworCisgIC8vIE5vdGUgdGhhdCBib3RoIGZpbGVzIGFyZSBhY3R1YWxseSBwYXJzZWQgYnkgdGhlIGZpcnN0IGNhbGwgdG8gSW1wb3J0KCkKKyAgLy8gaGVyZSwgc2luY2UgZm9vLnByb3RvIGltcG9ydHMgYmFyLnByb3RvLiAgVGhlIHNlY29uZCBjYWxsIGp1c3QgcmV0dXJucworICAvLyB0aGUgc2FtZSBQcm90b0ZpbGUgZm9yIGJhci5wcm90byB3aGljaCB3YXMgY29uc3RydWN0ZWQgd2hpbGUgaW1wb3J0aW5nCisgIC8vIGZvby5wcm90by4gIFdlIHRlc3QgdGhhdCB0aGlzIGlzIHRoZSBjYXNlIGJlbG93IGJ5IGNoZWNraW5nIHRoYXQgYmFyCisgIC8vIGlzIGFtb25nIGZvbydzIGRlcGVuZGVuY2llcyAoYnkgcG9pbnRlcikuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb28gPSBpbXBvcnRlcl8uSW1wb3J0KCJmb28ucHJvdG8iKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhciA9IGltcG9ydGVyXy5JbXBvcnQoImJhci5wcm90byIpOworICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworICBBU1NFUlRfVFJVRShmb28gIT0gTlVMTCk7CisgIEFTU0VSVF9UUlVFKGJhciAhPSBOVUxMKTsKKworICAvLyBDaGVjayB0aGF0IGZvbydzIGRlcGVuZGVuY3kgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIGJhci4KKyAgQVNTRVJUX0VRKDEsIGZvby0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGJhciwgZm9vLT5kZXBlbmRlbmN5KDApKTsKKworICAvLyBDaGVjayB0aGF0IGZvbyBwcm9wZXJseSBjcm9zcy1saW5rcyBiYXIuCisgIEFTU0VSVF9FUSgxLCBmb28tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDEsIGJhci0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICBBU1NFUlRfRVEoMSwgZm9vLT5tZXNzYWdlX3R5cGUoMCktPmZpZWxkX2NvdW50KCkpOworICBBU1NFUlRfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UsCisgICAgICAgICAgICBmb28tPm1lc3NhZ2VfdHlwZSgwKS0+ZmllbGQoMCktPnR5cGUoKSk7CisgIEVYUEVDVF9FUShiYXItPm1lc3NhZ2VfdHlwZSgwKSwKKyAgICAgICAgICAgIGZvby0+bWVzc2FnZV90eXBlKDApLT5maWVsZCgwKS0+bWVzc2FnZV90eXBlKCkpOworfQorCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBGaWxlTm90Rm91bmQpIHsKKyAgLy8gRXJyb3I6ICBQYXJzaW5nIGEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QuCisgIEVYUEVDVF9UUlVFKGltcG9ydGVyXy5JbXBvcnQoImZvby5wcm90byIpID09IE5VTEwpOworICBFWFBFQ1RfRVEoCisgICAgImZvby5wcm90bzotMTowOiBGaWxlIG5vdCBmb3VuZC5cbiIsCisgICAgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7Cit9CisKK1RFU1RfRihJbXBvcnRlclRlc3QsIEltcG9ydE5vdEZvdW5kKSB7CisgIC8vIEVycm9yOiAgSW1wb3J0aW5nIGEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QuCisgIEFkZEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcImJhci5wcm90b1wiO1xuIik7CisKKyAgRVhQRUNUX1RSVUUoaW1wb3J0ZXJfLkltcG9ydCgiZm9vLnByb3RvIikgPT0gTlVMTCk7CisgIEVYUEVDVF9FUSgKKyAgICAiYmFyLnByb3RvOi0xOjA6IEZpbGUgbm90IGZvdW5kLlxuIgorICAgICJmb28ucHJvdG86LTE6MDogSW1wb3J0IFwiYmFyLnByb3RvXCIgd2FzIG5vdCBmb3VuZCBvciBoYWQgZXJyb3JzLlxuIiwKKyAgICBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKK30KKworVEVTVF9GKEltcG9ydGVyVGVzdCwgUmVjdXJzaXZlSW1wb3J0KSB7CisgIC8vIEVycm9yOiAgUmVjdXJzaXZlIGltcG9ydC4KKyAgQWRkRmlsZSgicmVjdXJzaXZlMS5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcInJlY3Vyc2l2ZTIucHJvdG9cIjtcbiIpOworICBBZGRGaWxlKCJyZWN1cnNpdmUyLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiaW1wb3J0IFwicmVjdXJzaXZlMS5wcm90b1wiO1xuIik7CisKKyAgRVhQRUNUX1RSVUUoaW1wb3J0ZXJfLkltcG9ydCgicmVjdXJzaXZlMS5wcm90byIpID09IE5VTEwpOworICBFWFBFQ1RfRVEoCisgICAgInJlY3Vyc2l2ZTEucHJvdG86LTE6MDogRmlsZSByZWN1cnNpdmVseSBpbXBvcnRzIGl0c2VsZjogcmVjdXJzaXZlMS5wcm90byAiCisgICAgICAiLT4gcmVjdXJzaXZlMi5wcm90byAtPiByZWN1cnNpdmUxLnByb3RvXG4iCisgICAgInJlY3Vyc2l2ZTIucHJvdG86LTE6MDogSW1wb3J0IFwicmVjdXJzaXZlMS5wcm90b1wiIHdhcyBub3QgZm91bmQgIgorICAgICAgIm9yIGhhZCBlcnJvcnMuXG4iCisgICAgInJlY3Vyc2l2ZTEucHJvdG86LTE6MDogSW1wb3J0IFwicmVjdXJzaXZlMi5wcm90b1wiIHdhcyBub3QgZm91bmQgIgorICAgICAgIm9yIGhhZCBlcnJvcnMuXG4iLAorICAgIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworfQorCisvLyBUT0RPKHNhbmpheSk6IFRoZSBNYXBGaWVsZCB0ZXN0cyBiZWxvdyBtb3JlIHByb3Blcmx5IGJlbG9uZyBpbgorLy8gZGVzY3JpcHRvcl91bml0dGVzdCwgYnV0IGFyZSBtb3JlIGNvbnZlbmllbnQgdG8gdGVzdCBoZXJlLgorVEVTVF9GKEltcG9ydGVyVGVzdCwgTWFwRmllbGRWYWxpZCkgeworICBBZGRGaWxlKAorICAgICAgIm1hcC5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIEl0ZW0ge1xuIgorICAgICAgIiAgcmVxdWlyZWQgc3RyaW5nIGtleSA9IDE7XG4iCisgICAgICAifVxuIgorICAgICAgIm1lc3NhZ2UgTWFwIHtcbiIKKyAgICAgICIgIHJlcGVhdGVkIEl0ZW0gaXRlbXMgPSAxIFtleHBlcmltZW50YWxfbWFwX2tleSA9IFwia2V5XCJdO1xuIgorICAgICAgIn1cbiIKKyAgICAgICk7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gaW1wb3J0ZXJfLkltcG9ydCgibWFwLnByb3RvIik7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCkgPDwgZXJyb3JfY29sbGVjdG9yXy50ZXh0XzsKKyAgRVhQRUNUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKworICAvLyBDaGVjayB0aGF0IE1hcDo6aXRlbXMgcG9pbnRzIHRvIEl0ZW06OmtleQorICBjb25zdCBEZXNjcmlwdG9yKiBpdGVtX3R5cGUgPSBmaWxlLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkl0ZW0iKTsKKyAgQVNTRVJUX1RSVUUoaXRlbV90eXBlICE9IE5VTEwpOworICBjb25zdCBEZXNjcmlwdG9yKiBtYXBfdHlwZSA9IGZpbGUtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiTWFwIik7CisgIEFTU0VSVF9UUlVFKG1hcF90eXBlICE9IE5VTEwpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGtleV9maWVsZCA9IGl0ZW1fdHlwZS0+RmluZEZpZWxkQnlOYW1lKCJrZXkiKTsKKyAgQVNTRVJUX1RSVUUoa2V5X2ZpZWxkICE9IE5VTEwpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGl0ZW1zX2ZpZWxkID0gbWFwX3R5cGUtPkZpbmRGaWVsZEJ5TmFtZSgiaXRlbXMiKTsKKyAgQVNTRVJUX1RSVUUoaXRlbXNfZmllbGQgIT0gTlVMTCk7CisgIEVYUEVDVF9FUShpdGVtc19maWVsZC0+ZXhwZXJpbWVudGFsX21hcF9rZXkoKSwga2V5X2ZpZWxkKTsKK30KKworVEVTVF9GKEltcG9ydGVyVGVzdCwgTWFwRmllbGROb3RSZXBlYXRlZCkgeworICBBZGRGaWxlKAorICAgICAgIm1hcC5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIEl0ZW0ge1xuIgorICAgICAgIiAgcmVxdWlyZWQgc3RyaW5nIGtleSA9IDE7XG4iCisgICAgICAifVxuIgorICAgICAgIm1lc3NhZ2UgTWFwIHtcbiIKKyAgICAgICIgIHJlcXVpcmVkIEl0ZW0gaXRlbXMgPSAxIFtleHBlcmltZW50YWxfbWFwX2tleSA9IFwia2V5XCJdO1xuIgorICAgICAgIn1cbiIKKyAgICAgICk7CisgIEVYUEVDVF9UUlVFKGltcG9ydGVyXy5JbXBvcnQoIm1hcC5wcm90byIpID09IE5VTEwpOworICBFWFBFQ1RfU1VCU1RSSU5HKCJvbmx5IGFsbG93ZWQgZm9yIHJlcGVhdGVkIGZpZWxkcyIsIGVycm9yKCkpOworfQorCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBNYXBGaWVsZE5vdE1lc3NhZ2VUeXBlKSB7CisgIEFkZEZpbGUoCisgICAgICAibWFwLnByb3RvIiwKKyAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgIm1lc3NhZ2UgTWFwIHtcbiIKKyAgICAgICIgIHJlcGVhdGVkIGludDMyIGl0ZW1zID0gMSBbZXhwZXJpbWVudGFsX21hcF9rZXkgPSBcImtleVwiXTtcbiIKKyAgICAgICJ9XG4iCisgICAgICApOworICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJtYXAucHJvdG8iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1NVQlNUUklORygib25seSBhbGxvd2VkIGZvciBmaWVsZHMgd2l0aCBhIG1lc3NhZ2UgdHlwZSIsIGVycm9yKCkpOworfQorCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBNYXBGaWVsZFR5cGVOb3RGb3VuZCkgeworICBBZGRGaWxlKAorICAgICAgIm1hcC5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIE1hcCB7XG4iCisgICAgICAiICByZXBlYXRlZCBVbmtub3duIGl0ZW1zID0gMSBbZXhwZXJpbWVudGFsX21hcF9rZXkgPSBcImtleVwiXTtcbiIKKyAgICAgICJ9XG4iCisgICAgICApOworICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJtYXAucHJvdG8iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1NVQlNUUklORygibm90IGRlZmluZWQiLCBlcnJvcigpKTsKK30KKworVEVTVF9GKEltcG9ydGVyVGVzdCwgTWFwRmllbGRLZXlOb3RGb3VuZCkgeworICBBZGRGaWxlKAorICAgICAgIm1hcC5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIEl0ZW0ge1xuIgorICAgICAgIiAgcmVxdWlyZWQgc3RyaW5nIGtleSA9IDE7XG4iCisgICAgICAifVxuIgorICAgICAgIm1lc3NhZ2UgTWFwIHtcbiIKKyAgICAgICIgIHJlcGVhdGVkIEl0ZW0gaXRlbXMgPSAxIFtleHBlcmltZW50YWxfbWFwX2tleSA9IFwiYmFka2V5XCJdO1xuIgorICAgICAgIn1cbiIKKyAgICAgICk7CisgIEVYUEVDVF9UUlVFKGltcG9ydGVyXy5JbXBvcnQoIm1hcC5wcm90byIpID09IE5VTEwpOworICBFWFBFQ1RfU1VCU1RSSU5HKCJDb3VsZCBub3QgZmluZCBmaWVsZCIsIGVycm9yKCkpOworfQorCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBNYXBGaWVsZEtleVJlcGVhdGVkKSB7CisgIEFkZEZpbGUoCisgICAgICAibWFwLnByb3RvIiwKKyAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgIm1lc3NhZ2UgSXRlbSB7XG4iCisgICAgICAiICByZXBlYXRlZCBzdHJpbmcga2V5ID0gMTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAibWVzc2FnZSBNYXAge1xuIgorICAgICAgIiAgcmVwZWF0ZWQgSXRlbSBpdGVtcyA9IDEgW2V4cGVyaW1lbnRhbF9tYXBfa2V5ID0gXCJrZXlcIl07XG4iCisgICAgICAifVxuIgorICAgICAgKTsKKyAgRVhQRUNUX1RSVUUoaW1wb3J0ZXJfLkltcG9ydCgibWFwLnByb3RvIikgPT0gTlVMTCk7CisgIEVYUEVDVF9TVUJTVFJJTkcoIm11c3Qgbm90IG5hbWUgYSByZXBlYXRlZCBmaWVsZCIsIGVycm9yKCkpOworfQorCitURVNUX0YoSW1wb3J0ZXJUZXN0LCBNYXBGaWVsZEtleU5vdFNjYWxhcikgeworICBBZGRGaWxlKAorICAgICAgIm1hcC5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIEl0ZW1LZXkgeyB9XG4iCisgICAgICAibWVzc2FnZSBJdGVtIHtcbiIKKyAgICAgICIgIHJlcXVpcmVkIEl0ZW1LZXkga2V5ID0gMTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAibWVzc2FnZSBNYXAge1xuIgorICAgICAgIiAgcmVwZWF0ZWQgSXRlbSBpdGVtcyA9IDEgW2V4cGVyaW1lbnRhbF9tYXBfa2V5ID0gXCJrZXlcIl07XG4iCisgICAgICAifVxuIgorICAgICAgKTsKKyAgRVhQRUNUX1RSVUUoaW1wb3J0ZXJfLkltcG9ydCgibWFwLnByb3RvIikgPT0gTlVMTCk7CisgIEVYUEVDVF9TVUJTVFJJTkcoIm11c3QgbmFtZSBhIHNjYWxhciBvciBzdHJpbmciLCBlcnJvcigpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBEaXNrU291cmNlVHJlZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZGlybmFtZXNfLnB1c2hfYmFjayhUZXN0VGVtcERpcigpICsgIi90ZXN0X3Byb3RvMl9pbXBvcnRfcGF0aF8xIik7CisgICAgZGlybmFtZXNfLnB1c2hfYmFjayhUZXN0VGVtcERpcigpICsgIi90ZXN0X3Byb3RvMl9pbXBvcnRfcGF0aF8yIik7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcm5hbWVzXy5zaXplKCk7IGkrKykgeworICAgICAgaWYgKEZpbGU6OkV4aXN0cyhkaXJuYW1lc19baV0pKSB7CisgICAgICAgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KGRpcm5hbWVzX1tpXSwgTlVMTCwgTlVMTCk7CisgICAgICB9CisgICAgICBHT09HTEVfQ0hFQ0soRmlsZTo6Q3JlYXRlRGlyKGRpcm5hbWVzX1tpXS5jX3N0cigpLCBERUZBVUxUX0ZJTEVfTU9ERSkpOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcm5hbWVzXy5zaXplKCk7IGkrKykgeworICAgICAgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkoZGlybmFtZXNfW2ldLCBOVUxMLCBOVUxMKTsKKyAgICB9CisgIH0KKworICB2b2lkIEFkZEZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgY2hhciogY29udGVudHMpIHsKKyAgICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKGNvbnRlbnRzLCBmaWxlbmFtZSk7CisgIH0KKworICB2b2lkIEFkZFN1YmRpcihjb25zdCBzdHJpbmcmIGRpcm5hbWUpIHsKKyAgICBHT09HTEVfQ0hFQ0soRmlsZTo6Q3JlYXRlRGlyKGRpcm5hbWUuY19zdHIoKSwgREVGQVVMVF9GSUxFX01PREUpKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0RmlsZUNvbnRlbnRzKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2NvbnRlbnRzKSB7CisgICAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gaW5wdXQoc291cmNlX3RyZWVfLk9wZW4oZmlsZW5hbWUpKTsKKworICAgIEFTU0VSVF9GQUxTRShpbnB1dCA9PSBOVUxMKTsKKworICAgIC8vIFJlYWQgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUuCisgICAgc3RyaW5nIGZpbGVfY29udGVudHM7CisgICAgY29uc3Qgdm9pZCogZGF0YTsKKyAgICBpbnQgc2l6ZTsKKyAgICB3aGlsZSAoaW5wdXQtPk5leHQoJmRhdGEsICZzaXplKSkgeworICAgICAgZmlsZV9jb250ZW50cy5hcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksIHNpemUpOworICAgIH0KKworICAgIEVYUEVDVF9FUShleHBlY3RlZF9jb250ZW50cywgZmlsZV9jb250ZW50cyk7CisgIH0KKworICB2b2lkIEV4cGVjdEZpbGVOb3RGb3VuZChjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgICAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gaW5wdXQoc291cmNlX3RyZWVfLk9wZW4oZmlsZW5hbWUpKTsKKyAgICBFWFBFQ1RfVFJVRShpbnB1dCA9PSBOVUxMKTsKKyAgfQorCisgIERpc2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlXzsKKworICAvLyBQYXRocyBvZiB0d28gb24tZGlzayBkaXJlY3RvcmllcyB0byB1c2UgZHVyaW5nIHRoZSB0ZXN0LgorICB2ZWN0b3I8c3RyaW5nPiBkaXJuYW1lc187Cit9OworCitURVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBNYXBSb290KSB7CisgIC8vIFRlc3Qgb3BlbmluZyBhIGZpbGUgaW4gYSBkaXJlY3RvcnkgdGhhdCBpcyBtYXBwZWQgdG8gdGhlIHJvb3Qgb2YgdGhlCisgIC8vIHNvdXJjZSB0cmVlLgorICBBZGRGaWxlKGRpcm5hbWVzX1swXSArICIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgZGlybmFtZXNfWzBdKTsKKworICBFeHBlY3RGaWxlQ29udGVudHMoImZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXIiKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgTWFwRGlyZWN0b3J5KSB7CisgIC8vIFRlc3Qgb3BlbmluZyBhIGZpbGUgaW4gYSBkaXJlY3RvcnkgdGhhdCBpcyBtYXBwZWQgdG8gc29tZXdoZXJlIG90aGVyCisgIC8vIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorCisgIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9mb28iLCAiSGVsbG8gV29ybGQhIik7CisgIHNvdXJjZV90cmVlXy5NYXBQYXRoKCJiYXoiLCBkaXJuYW1lc19bMF0pOworCisgIEV4cGVjdEZpbGVDb250ZW50cygiYmF6L2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXovYmFyIik7CisgIEV4cGVjdEZpbGVOb3RGb3VuZCgiZm9vIik7CisgIEV4cGVjdEZpbGVOb3RGb3VuZCgiYmFyIik7CisKKyAgLy8gTm9uLWNhbm9uaWNhbCBmaWxlIG5hbWVzIHNob3VsZCBub3Qgd29yay4KKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXovL2ZvbyIpOworICBFeHBlY3RGaWxlTm90Rm91bmQoImJhei8uLi9iYXovZm9vIik7CisgIEV4cGVjdEZpbGVOb3RGb3VuZCgiYmF6Ly4vZm9vIik7CisgIEV4cGVjdEZpbGVOb3RGb3VuZCgiYmF6L2Zvby8iKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgTm9QYXJlbnQpIHsKKyAgLy8gVGVzdCB0aGF0IHdlIGNhbm5vdCBvcGVuIGZpbGVzIGluIGEgcGFyZW50IG9mIGEgbWFwcGVkIGRpcmVjdG9yeS4KKworICBBZGRGaWxlKGRpcm5hbWVzX1swXSArICIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBBZGRTdWJkaXIoZGlybmFtZXNfWzBdICsgIi9iYXIiKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2Jhci9iYXoiLCAiQmxhaC4iKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoIiIsIGRpcm5hbWVzX1swXSArICIvYmFyIik7CisKKyAgRXhwZWN0RmlsZUNvbnRlbnRzKCJiYXoiLCAiQmxhaC4iKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCIuLi9mb28iKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCIuLi9iYXIvYmF6Iik7Cit9CisKK1RFU1RfRihEaXNrU291cmNlVHJlZVRlc3QsIE1hcEZpbGUpIHsKKyAgLy8gVGVzdCBvcGVuaW5nIGEgZmlsZSB0aGF0IGlzIG1hcHBlZCBkaXJlY3RseSBpbnRvIHRoZSBzb3VyY2UgdHJlZS4KKworICBBZGRGaWxlKGRpcm5hbWVzX1swXSArICIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiZm9vIiwgZGlybmFtZXNfWzBdICsgIi9mb28iKTsKKworICBFeHBlY3RGaWxlQ29udGVudHMoImZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXIiKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgU2VhcmNoTXVsdGlwbGVEaXJlY3RvcmllcykgeworICAvLyBUZXN0IG1hcHBpbmcgYW5kIHNlYXJjaGluZyBtdWx0aXBsZSBkaXJlY3Rvcmllcy4KKworICBBZGRGaWxlKGRpcm5hbWVzX1swXSArICIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBBZGRGaWxlKGRpcm5hbWVzX1sxXSArICIvZm9vIiwgIlRoaXMgZmlsZSBzaG91bGQgYmUgaGlkZGVuLiIpOworICBBZGRGaWxlKGRpcm5hbWVzX1sxXSArICIvYmFyIiwgIkdvb2RieWUgV29ybGQhIik7CisgIHNvdXJjZV90cmVlXy5NYXBQYXRoKCIiLCBkaXJuYW1lc19bMF0pOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgZGlybmFtZXNfWzFdKTsKKworICBFeHBlY3RGaWxlQ29udGVudHMoImZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgRXhwZWN0RmlsZUNvbnRlbnRzKCJiYXIiLCAiR29vZGJ5ZSBXb3JsZCEiKTsKKyAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXoiKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgT3JkZXJpbmdUcnVtcHNTcGVjaWZpY2l0eSkgeworICAvLyBUZXN0IHRoYXQgZGlyZWN0b3JpZXMgYXJlIGFsd2F5cyBzZWFyY2hlZCBpbiBvcmRlciwgZXZlbiB3aGVuIGEgbGF0dGVyCisgIC8vIGRpcmVjdG9yeSBpcyBtb3JlLXNwZWNpZmljIHRoYW4gYSBmb3JtZXIgb25lLgorCisgIC8vIENyZWF0ZSB0aGUgImJhciIgZGlyZWN0b3J5IHNvIHdlIGNhbiBwdXQgYSBmaWxlIGluIGl0LgorICBBU1NFUlRfVFJVRShGaWxlOjpDcmVhdGVEaXIoKGRpcm5hbWVzX1swXSArICIvYmFyIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRklMRV9NT0RFKSk7CisKKyAgLy8gQWRkIGZpbGVzIGFuZCBtYXAgcGF0aHMuCisgIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9iYXIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOworICBBZGRGaWxlKGRpcm5hbWVzX1sxXSArICIvZm9vIiwgIlRoaXMgZmlsZSBzaG91bGQgYmUgaGlkZGVuLiIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgZGlybmFtZXNfWzBdKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImJhciIsIGRpcm5hbWVzX1sxXSk7CisKKyAgLy8gQ2hlY2suCisgIEV4cGVjdEZpbGVDb250ZW50cygiYmFyL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKSB7CisgIC8vIFRlc3QgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlLgorCisgIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9mb28iLCAiSGVsbG8gV29ybGQhIik7CisgIEFkZEZpbGUoZGlybmFtZXNfWzFdICsgIi9mb28iLCAiVGhpcyBmaWxlIHNob3VsZCBiZSBoaWRkZW4uIik7CisgIHNvdXJjZV90cmVlXy5NYXBQYXRoKCJiYXIiLCBkaXJuYW1lc19bMF0pOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiYmFyIiwgZGlybmFtZXNfWzFdKTsKKworICBzdHJpbmcgdmlydHVhbF9maWxlOworICBzdHJpbmcgc2hhZG93aW5nX2Rpc2tfZmlsZTsKKworICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6Ok5PX01BUFBJTkcsCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgICIvZm9vIiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKworICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OlNIQURPV0VELAorICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoCisgICAgICBkaXJuYW1lc19bMV0gKyAiL2ZvbyIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiYmFyL2ZvbyIsIHZpcnR1YWxfZmlsZSk7CisgIEVYUEVDVF9FUShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsIHNoYWRvd2luZ19kaXNrX2ZpbGUpOworCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgIGRpcm5hbWVzX1sxXSArICIvYmF6IiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKCJiYXIvYmF6IiwgdmlydHVhbF9maWxlKTsKKworICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OlNVQ0NFU1MsCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgIGRpcm5hbWVzX1swXSArICIvZm9vIiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKCJiYXIvZm9vIiwgdmlydHVhbF9maWxlKTsKK30KKworVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlQ2Fub25pY2FsaXphdGlvbikgeworICAvLyBUZXN0IGhhbmRsaW5nIG9mICIuLiIsICIuIiwgZXRjLiBpbiBEaXNrRmlsZVRvVmlydHVhbEZpbGUoKS4KKworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiZGlyMSIsICIuLiIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiZGlyMiIsICIuLi8uLi9mb28iKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjMiLCAiLi9mb28vYmFyLy4iKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjQiLCAiLiIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgIi9xdXgiKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjUiLCAiL3F1dXgvIik7CisKKyAgc3RyaW5nIHZpcnR1YWxfZmlsZTsKKyAgc3RyaW5nIHNoYWRvd2luZ19kaXNrX2ZpbGU7CisKKyAgLy8gIi4uLy4uIiBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgdW5kZXIgIi4uIi4KKyAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpOT19NQVBQSU5HLAorICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoCisgICAgICAiLi4vLi4vYmF6IiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKworICAvLyAiL2ZvbyIgaXMgbm90IG1hcHBlZCAoaXQgc2hvdWxkIG5vdCBiZSBtaXNpbnRlcHJldGVkIGFzIGJlaW5nIHVuZGVyICIuIikuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Tk9fTUFQUElORywKKyAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAorICAgICAgIi9mb28iLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOworCisjaWZkZWYgV0lOMzIKKyAgLy8gIkM6XGZvbyIgaXMgbm90IG1hcHBlZCAoaXQgc2hvdWxkIG5vdCBiZSBtaXNpbnRlcHJldGVkIGFzIGJlaW5nIHVuZGVyICIuIikuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Tk9fTUFQUElORywKKyAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAorICAgICAgIkM6XFxmb28iLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOworI2VuZGlmICAvLyBXSU4zMgorCisgIC8vIEJ1dCAiLi4vYmF6IiBzaG91bGQgYmUuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgICIuLi9iYXoiLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOworICBFWFBFQ1RfRVEoImRpcjEvYmF6IiwgdmlydHVhbF9maWxlKTsKKworICAvLyAiLi4vLi4vZm9vL2JheiIgaXMgdW5kZXIgIi4uLy4uL2ZvbyIuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgICIuLi8uLi9mb28vYmF6IiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKCJkaXIyL2JheiIsIHZpcnR1YWxfZmlsZSk7CisKKyAgLy8gImZvby8uL2Jhci9iYXoiIGlzIHVuZGVyICIuL2Zvby9iYXIvLiIuCisgIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCisgICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKKyAgICAgICJmb28vYmFyL2JheiIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiZGlyMy9iYXoiLCB2aXJ0dWFsX2ZpbGUpOworCisgIC8vICJiYXIiIGlzIHVuZGVyICIuIi4KKyAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpDQU5OT1RfT1BFTiwKKyAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAorICAgICAgImJhciIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiZGlyNC9iYXIiLCB2aXJ0dWFsX2ZpbGUpOworCisgIC8vICIvcXV4L2JheiIgaXMgdW5kZXIgIi9xdXgiLgorICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OkNBTk5PVF9PUEVOLAorICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoCisgICAgICAiL3F1eC9iYXoiLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOworICBFWFBFQ1RfRVEoImJheiIsIHZpcnR1YWxfZmlsZSk7CisKKyAgLy8gIi9xdXV4L2JhciIgaXMgdW5kZXIgIi9xdXV4Ii4KKyAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpDQU5OT1RfT1BFTiwKKyAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAorICAgICAgIi9xdXV4L2JhciIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7CisgIEVYUEVDVF9FUSgiZGlyNS9iYXIiLCB2aXJ0dWFsX2ZpbGUpOworfQorCitURVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBWaXJ0dWFsRmlsZVRvRGlza0ZpbGUpIHsKKyAgLy8gVGVzdCBWaXJ0dWFsRmlsZVRvRGlza0ZpbGUuCisKKyAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMV0gKyAiL2ZvbyIsICJUaGlzIGZpbGUgc2hvdWxkIGJlIGhpZGRlbi4iKTsKKyAgQWRkRmlsZShkaXJuYW1lc19bMV0gKyAiL3F1dXgiLCAiVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgaGlkZGVuLiIpOworICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiYmFyIiwgZGlybmFtZXNfWzBdKTsKKyAgc291cmNlX3RyZWVfLk1hcFBhdGgoImJhciIsIGRpcm5hbWVzX1sxXSk7CisKKyAgLy8gRXhpc3RlbnQgZmlsZXMsIHNoYWRvd2VkIGFuZCBub24tc2hhZG93ZWQgY2FzZS4KKyAgc3RyaW5nIGRpc2tfZmlsZTsKKyAgRVhQRUNUX1RSVUUoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmFyL2ZvbyIsICZkaXNrX2ZpbGUpKTsKKyAgRVhQRUNUX0VRKGRpcm5hbWVzX1swXSArICIvZm9vIiwgZGlza19maWxlKTsKKyAgRVhQRUNUX1RSVUUoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmFyL3F1dXgiLCAmZGlza19maWxlKSk7CisgIEVYUEVDVF9FUShkaXJuYW1lc19bMV0gKyAiL3F1dXgiLCBkaXNrX2ZpbGUpOworCisgIC8vIE5vbmV4aXN0ZW50IGZpbGUgaW4gZXhpc3RlbnQgZGlyZWN0b3J5IGFuZCB2aWNlIHZlcnNhLgorICBzdHJpbmcgbm90X3RvdWNoZWQgPSAibm90IHRvdWNoZWQiOworICBFWFBFQ1RfRkFMU0Uoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmFyL2JheiIsICZub3RfdG91Y2hlZCkpOworICBFWFBFQ1RfRVEoIm5vdCB0b3VjaGVkIiwgbm90X3RvdWNoZWQpOworICBFWFBFQ1RfRkFMU0Uoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmF6L2ZvbyIsICZub3RfdG91Y2hlZCkpOworICBFWFBFQ1RfRVEoIm5vdCB0b3VjaGVkIiwgbm90X3RvdWNoZWQpOworCisgIC8vIEFjY2VwdCBOVUxMIGFzIG91dHB1dCBwYXJhbWV0ZXIuCisgIEVYUEVDVF9UUlVFKHNvdXJjZV90cmVlXy5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUoImJhci9mb28iLCBOVUxMKSk7CisgIEVYUEVDVF9GQUxTRShzb3VyY2VfdHJlZV8uVmlydHVhbEZpbGVUb0Rpc2tGaWxlKCJiYXovZm9vIiwgTlVMTCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3YmNhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmNjCkBAIC0wLDAgKzEsMjQzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworRW51bUdlbmVyYXRvcjo6RW51bUdlbmVyYXRvcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcikKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlID0gZGVzY3JpcHRvcl8tPnZhbHVlKGkpOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGNhbm9uaWNhbF92YWx1ZSA9CisgICAgICBkZXNjcmlwdG9yXy0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUtPm51bWJlcigpKTsKKworICAgIGlmICh2YWx1ZSA9PSBjYW5vbmljYWxfdmFsdWUpIHsKKyAgICAgIGNhbm9uaWNhbF92YWx1ZXNfLnB1c2hfYmFjayh2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFsaWFzIGFsaWFzOworICAgICAgYWxpYXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgIGFsaWFzLmNhbm9uaWNhbF92YWx1ZSA9IGNhbm9uaWNhbF92YWx1ZTsKKyAgICAgIGFsaWFzZXNfLnB1c2hfYmFjayhhbGlhcyk7CisgICAgfQorICB9Cit9CisKK0VudW1HZW5lcmF0b3I6On5FbnVtR2VuZXJhdG9yKCkge30KKwordm9pZCBFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIGVudW0gJGNsYXNzbmFtZSRcbiIKKyAgICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLlByb3RvY29sTWVzc2FnZUVudW0ge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJwdWJsaWMgZW51bSAkY2xhc3NuYW1lJFxuIgorICAgICAgIiAgICBpbXBsZW1lbnRzIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGUge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgfQorICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGNhbm9uaWNhbF92YWx1ZXNfLnNpemUoKTsgaSsrKSB7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIHZhcnNbIm5hbWUiXSA9IGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5uYW1lKCk7CisgICAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoY2Fub25pY2FsX3ZhbHVlc19baV0tPmluZGV4KCkpOworICAgIHZhcnNbIm51bWJlciJdID0gU2ltcGxlSXRvYShjYW5vbmljYWxfdmFsdWVzX1tpXS0+bnVtYmVyKCkpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiJG5hbWUkKCRpbmRleCQsICRudW1iZXIkKSxcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIjtcbiIKKyAgICAiXG4iKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxpYXNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgICAgdmFyc1siY2xhc3NuYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOworICAgIHZhcnNbIm5hbWUiXSA9IGFsaWFzZXNfW2ldLnZhbHVlLT5uYW1lKCk7CisgICAgdmFyc1siY2Fub25pY2FsX25hbWUiXSA9IGFsaWFzZXNfW2ldLmNhbm9uaWNhbF92YWx1ZS0+bmFtZSgpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCAkY2xhc3NuYW1lJCAkbmFtZSQgPSAkY2Fub25pY2FsX25hbWUkO1xuIik7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgICAgdmFyc1sibmFtZSJdID0gZGVzY3JpcHRvcl8tPnZhbHVlKGkpLT5uYW1lKCk7CisgICAgdmFyc1sibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bnVtYmVyKCkpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJG5hbWUkX1ZBTFVFID0gJG51bWJlciQ7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAicHVibGljIGZpbmFsIGludCBnZXROdW1iZXIoKSB7IHJldHVybiB2YWx1ZTsgfVxuIgorICAgICJcbiIKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCB2YWx1ZU9mKGludCB2YWx1ZSkge1xuIgorICAgICIgIHN3aXRjaCAodmFsdWUpIHtcbiIsCisgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5vbmljYWxfdmFsdWVzXy5zaXplKCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgImNhc2UgJG51bWJlciQ6IHJldHVybiAkbmFtZSQ7XG4iLAorICAgICAgIm5hbWUiLCBjYW5vbmljYWxfdmFsdWVzX1tpXS0+bmFtZSgpLAorICAgICAgIm51bWJlciIsIFNpbXBsZUl0b2EoY2Fub25pY2FsX3ZhbHVlc19baV0tPm51bWJlcigpKSk7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5FbnVtTGl0ZU1hcDwkY2xhc3NuYW1lJD5cbiIKKyAgICAiICAgIGludGVybmFsR2V0VmFsdWVNYXAoKSB7XG4iCisgICAgIiAgcmV0dXJuIGludGVybmFsVmFsdWVNYXA7XG4iCisgICAgIn1cbiIKKyAgICAicHJpdmF0ZSBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5FbnVtTGl0ZU1hcDwkY2xhc3NuYW1lJD5cbiIKKyAgICAiICAgIGludGVybmFsVmFsdWVNYXAgPVxuIgorICAgICIgICAgICBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5FbnVtTGl0ZU1hcDwkY2xhc3NuYW1lJD4oKSB7XG4iCisgICAgIiAgICAgICAgcHVibGljICRjbGFzc25hbWUkIGZpbmRWYWx1ZUJ5TnVtYmVyKGludCBudW1iZXIpIHtcbiIKKyAgICAiICAgICAgICAgIHJldHVybiAkY2xhc3NuYW1lJC52YWx1ZU9mKG51bWJlcik7XG4iCisgICAgIiAgICAgICAgfVxuIgorICAgICIgICAgICB9O1xuIgorICAgICJcbiIsCisgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFJlZmxlY3Rpb24KKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHVibGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvclxuIgorICAgICAgIiAgICBnZXRWYWx1ZURlc2NyaXB0b3IoKSB7XG4iCisgICAgICAiICByZXR1cm4gZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpLmdldChpbmRleCk7XG4iCisgICAgICAifVxuIgorICAgICAgInB1YmxpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yXG4iCisgICAgICAiICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkge1xuIgorICAgICAgIiAgcmV0dXJuIGdldERlc2NyaXB0b3IoKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yXG4iCisgICAgICAiICAgIGdldERlc2NyaXB0b3IoKSB7XG4iKTsKKworICAgIC8vIFRPRE8oa2VudG9uKTogIENhY2hlIHN0YXRpY2FsbHk/ICBOb3RlIHRoYXQgd2UgY2FuJ3QgYWNjZXNzIGRlc2NyaXB0b3JzCisgICAgLy8gICBhdCBtb2R1bGUgaW5pdCB0aW1lIGJlY2F1c2UgaXQgd291bGRuJ3Qgd29yayB3aXRoIGRlc2NyaXB0b3IucHJvdG8sIGJ1dAorICAgIC8vICAgd2UgY2FuIGNhY2hlIHRoZSB2YWx1ZSB0aGUgZmlyc3QgdGltZSBnZXREZXNjcmlwdG9yKCkgaXMgY2FsbGVkLgorICAgIGlmIChkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIHJldHVybiAkZmlsZSQuZ2V0RGVzY3JpcHRvcigpLmdldEVudW1UeXBlcygpLmdldCgkaW5kZXgkKTtcbiIsCisgICAgICAgICJmaWxlIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpLAorICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICByZXR1cm4gJHBhcmVudCQuZ2V0RGVzY3JpcHRvcigpLmdldEVudW1UeXBlcygpLmdldCgkaW5kZXgkKTtcbiIsCisgICAgICAgICJwYXJlbnQiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSwKKyAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+aW5kZXgoKSkpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIn1cbiIKKyAgICAgICJcbiIKKyAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCAkY2xhc3NuYW1lJFtdIFZBTFVFUyA9IHtcbiIKKyAgICAgICIgICIsCisgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIHByaW50ZXItPlByaW50KCIkbmFtZSQsICIsCisgICAgICAgICJuYW1lIiwgZGVzY3JpcHRvcl8tPnZhbHVlKGkpLT5uYW1lKCkpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIlxuIgorICAgICAgIn07XG4iCisgICAgICAiXG4iCisgICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCB2YWx1ZU9mKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgZGVzYykge1xuIgorICAgICAgIiAgaWYgKGRlc2MuZ2V0VHlwZSgpICE9IGdldERlc2NyaXB0b3IoKSkge1xuIgorICAgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcbiIKKyAgICAgICIgICAgICBcIkVudW1WYWx1ZURlc2NyaXB0b3IgaXMgbm90IGZvciB0aGlzIHR5cGUuXCIpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgcmV0dXJuIFZBTFVFU1tkZXNjLmdldEluZGV4KCldO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisKKyAgICAvLyBpbmRleCBpcyBvbmx5IHVzZWQgZm9yIHJlZmxlY3Rpb247IGxpdGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgbmVlZCBpdAorICAgIHByaW50ZXItPlByaW50KCJwcml2YXRlIGZpbmFsIGludCBpbmRleDtcbiIpOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBwcmludGVyLT5QcmludCgKKyAgICAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7XG5cbiIKKyAgICAicHJpdmF0ZSAkY2xhc3NuYW1lJChpbnQgaW5kZXgsIGludCB2YWx1ZSkge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCgiICB0aGlzLmluZGV4ID0gaW5kZXg7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICAiICB0aGlzLnZhbHVlID0gdmFsdWU7XG4iCisgICAgIn1cbiIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGVudW1fc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAorICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlY2UxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmgKQEAgLTAsMCArMSw4NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICB9Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitjbGFzcyBFbnVtR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEVudW1HZW5lcmF0b3IoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB+RW51bUdlbmVyYXRvcigpOworCisgIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgcHJpdmF0ZToKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworCisgIC8vIFRoZSBwcm90byBsYW5ndWFnZSBhbGxvd3MgbXVsdGlwbGUgZW51bSBjb25zdGFudHMgdG8gaGF2ZSB0aGUgc2FtZSBudW1lcmljCisgIC8vIHZhbHVlLiAgSmF2YSwgaG93ZXZlciwgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgZW51bSBjb25zdGFudHMgdG8gYmUKKyAgLy8gY29uc2lkZXJlZCBlcXVpdmFsZW50LiAgV2UgdHJlYXQgdGhlIGZpcnN0IGRlZmluZWQgY29uc3RhbnQgZm9yIGFueQorICAvLyBnaXZlbiBudW1lcmljIHZhbHVlIGFzICJjYW5vbmljYWwiIGFuZCB0aGUgcmVzdCBhcyBhbGlhc2VzIG9mIHRoYXQKKyAgLy8gY2Fub25pY2FsIHZhbHVlLgorICB2ZWN0b3I8Y29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcio+IGNhbm9uaWNhbF92YWx1ZXNfOworCisgIHN0cnVjdCBBbGlhcyB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWU7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogY2Fub25pY2FsX3ZhbHVlOworICB9OworICB2ZWN0b3I8QWxpYXM+IGFsaWFzZXNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFbnVtR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VOVU1fSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyY2FhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5jYwpAQCAtMCwwICsxLDUzNyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworbmFtZXNwYWNlIHsKKworLy8gVE9ETyhrZW50b24pOiAgRmFjdG9yIG91dCBhICJTZXRDb21tb25GaWVsZFZhcmlhYmxlcygpIiB0byBnZXQgcmlkIG9mCisvLyAgIHJlcGVhdCBjb2RlIGJldHdlZW4gdGhpcyBhbmQgdGhlIG90aGVyIGZpZWxkIHR5cGVzLgordm9pZCBTZXRFbnVtVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKSB7CisgICgqdmFyaWFibGVzKVsibmFtZSJdID0KKyAgICBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSA9CisgICAgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5udW1iZXIoKSk7CisgICgqdmFyaWFibGVzKVsidHlwZSJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmVudW1fdHlwZSgpKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsidGFnIl0gPSBTaW1wbGVJdG9hKGludGVybmFsOjpXaXJlRm9ybWF0OjpNYWtlVGFnKGRlc2NyaXB0b3IpKTsKKyAgKCp2YXJpYWJsZXMpWyJ0YWdfc2l6ZSJdID0gU2ltcGxlSXRvYSgKKyAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3ItPm51bWJlcigpLCBHZXRUeXBlKGRlc2NyaXB0b3IpKSk7CisgIC8vIFRPRE8oYmlyZG8pOiBBZGQgQGRlcHJlY2F0ZWQgamF2YWRvYyB3aGVuIGdlbmVyYXRpbmcgamF2YWRvYyBpcyBzdXBwb3J0ZWQKKyAgLy8gYnkgdGhlIHByb3RvIGNvbXBpbGVyCisgICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9IGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKKyAgICAgID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7CisgICgqdmFyaWFibGVzKVsib25fY2hhbmdlZCJdID0KKyAgICAgIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpKSA/ICJvbkNoYW5nZWQoKTsiIDogIiI7CisKKyAgLy8gRm9yIHNpbmd1bGFyIG1lc3NhZ2VzIGFuZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB0aGUgaGFzRmllbGQgYml0LgorICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9IEdlbmVyYXRlR2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7CisKKyAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPQorICAgICAgR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpOworCisgIC8vIEZvciByZXBhdGVkIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZS4KKyAgKCp2YXJpYWJsZXMpWyJnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUNsZWFyQml0KGJ1aWxkZXJCaXRJbmRleCk7CisKKyAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsIl0gPQorICAgICAgR2VuZXJhdGVHZXRCaXRGcm9tTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCJdID0KKyAgICAgIEdlbmVyYXRlU2V0Qml0VG9Mb2NhbChtZXNzYWdlQml0SW5kZXgpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitFbnVtRmllbGRHZW5lcmF0b3I6OgorRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKKyAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCkgeworICBTZXRFbnVtVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCAmdmFyaWFibGVzXyk7Cit9CisKK0VudW1GaWVsZEdlbmVyYXRvcjo6fkVudW1GaWVsZEdlbmVyYXRvcigpIHt9CisKK2ludCBFbnVtRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gMTsKK30KKworaW50IEVudW1GaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCisgICAgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgJHR5cGUkICRuYW1lJF87XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgJHR5cGUkICRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgIn1cbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAiICBpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICIgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCisgICAgIiAgfVxuIgorICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgICRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICIgICRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3IgZW51bXMKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIKKyAgICAgICIkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmIChvdGhlci5oYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSkge1xuIgorICAgICIgIHNldCRjYXBpdGFsaXplZF9uYW1lJChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCisgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKKyAgICAifVxuIgorICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgorICAgICIkdHlwZSQgdmFsdWUgPSAkdHlwZSQudmFsdWVPZihyYXdWYWx1ZSk7XG4iKTsKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKHZhbHVlID09IG51bGwpIHtcbiIKKyAgICAgICIgIHVua25vd25GaWVsZHMubWVyZ2VWYXJpbnRGaWVsZCgkbnVtYmVyJCwgcmF3VmFsdWUpO1xuIgorICAgICAgIn0gZWxzZSB7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmICh2YWx1ZSAhPSBudWxsKSB7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBvdXRwdXQud3JpdGVFbnVtKCRudW1iZXIkLCAkbmFtZSRfLmdldE51bWJlcigpKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAiICAgIC5jb21wdXRlRW51bVNpemUoJG51bWJlciQsICRuYW1lJF8uZ2V0TnVtYmVyKCkpO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInJlc3VsdCA9IHJlc3VsdCAmJlxuIgorICAgICIgICAgKGdldCRjYXBpdGFsaXplZF9uYW1lJCgpID09IG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworfQorCit2b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKKyAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgaGFzaEVudW0oZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7Cit9CisKK3N0cmluZyBFbnVtRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK1JlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4KQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCisgICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpIHsKKyAgU2V0RW51bVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kamF2YS51dGlsLkxpc3Q8JHR5cGUkPiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCk7XG4iCisgICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIKKyAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gJG5hbWUkXztcbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+IGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iICAgLy8gbm90ZTogIHVubW9kaWZpYWJsZSBsaXN0CisgICAgIn1cbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIgorICAgICJ9XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgorICAgICJ9XG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSAmJgorICAgICAgSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIGludCAkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplO1xuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgLy8gT25lIGZpZWxkIGlzIHRoZSBsaXN0IGFuZCB0aGUgb3RoZXIgZmllbGQga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUKKyAgICAvLyBsaXN0IGlzIGltbXV0YWJsZS4gSWYgaXQncyBpbW11dGFibGUsIHRoZSBpbnZhcmlhbnQgaXMgdGhhdCBpdCBtdXN0CisgICAgLy8gZWl0aGVyIGFuIGluc3RhbmNlIG9mIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIG9yIGl0J3MgYW4gQXJyYXlMaXN0CisgICAgLy8gd3JhcHBlZCBpbiBhIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKSB3cmFwcGVyIGFuZCBub2JvZHkgZWxzZSBoYXMKKyAgICAvLyBhIHJlZmVyZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIEFycmF5TGlzdC4gVGhpcyBpbnZhcmlhbnQgYWxsb3dzIHVzIHRvCisgICAgLy8gc2hhcmUgaW5zdGFuY2VzIG9mIGxpc3RzIGJldHdlZW4gcHJvdG9jb2wgYnVmZmVycyBhdm9pZGluZyBleHBlbnNpdmUKKyAgICAvLyBtZW1vcnkgYWxsb2NhdGlvbnMuIE5vdGUsIGltbXV0YWJsZSBpcyBhIHN0cm9uZyBndWFyYW50ZWUgaGVyZSAtLSBub3QKKyAgICAvLyBqdXN0IHRoYXQgdGhlIGxpc3QgY2Fubm90IGJlIG1vZGlmaWVkIHZpYSB0aGUgcmVmZXJlbmNlIGJ1dCB0aGF0IHRoZQorICAgIC8vIGxpc3QgY2FuIG5ldmVyIGJlIG1vZGlmaWVkLgorICAgICJwcml2YXRlIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gJG5hbWUkXyA9XG4iCisgICAgIiAgamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgorCisgICAgInByaXZhdGUgdm9pZCBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKSB7XG4iCisgICAgIiAgaWYgKCEkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkKSB7XG4iCisgICAgIiAgICAkbmFtZSRfID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8JHR5cGUkPigkbmFtZSRfKTtcbiIKKyAgICAiICAgICRzZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iCisKKyAgICAvLyBOb3RlOiAgV2UgcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBsaXN0IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjYWxsZXIKKyAgICAvLyAgIGNvdWxkIGhvbGQgb24gdG8gdGhlIHJldHVybmVkIGxpc3QgYW5kIG1vZGlmeSBpdCBhZnRlciB0aGUgbWVzc2FnZQorICAgIC8vICAgaGFzIGJlZW4gYnVpbHQsIHRodXMgbXV0YXRpbmcgdGhlIG1lc3NhZ2Ugd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUKKyAgICAvLyAgIGltbXV0YWJsZS4KKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+IGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSB7XG4iCisgICAgIiAgcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCRuYW1lJF8pO1xuIgorICAgICJ9XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICIgICAgaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAiICBpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICIgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCisgICAgIiAgfVxuIgorICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgICRuYW1lJF8uc2V0KGluZGV4LCB2YWx1ZSk7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAiICBpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICIgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCisgICAgIiAgfVxuIgorICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgICRuYW1lJF8uYWRkKHZhbHVlKTtcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICIgICAgamF2YS5sYW5nLkl0ZXJhYmxlPD8gZXh0ZW5kcyAkdHlwZSQ+IHZhbHVlcykge1xuIgorICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgIHN1cGVyLmFkZEFsbCh2YWx1ZXMsICRuYW1lJF8pO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgorICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7CisgIC8vIG5vb3AgZm9yIGVudW1zCit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJG5hbWUkXyA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTtcbiIKKyAgICAiJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBUaGUgY29kZSBiZWxvdyBkb2VzIHR3byBvcHRpbWl6YXRpb25zOgorICAvLyAgIDEuIElmIHRoZSBvdGhlciBsaXN0IGlzIGVtcHR5LCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uIFRoaXMgZW5zdXJlcyB3ZQorICAvLyAgICAgIGRvbid0IGFsbG9jYXRlIGEgbmV3IGFycmF5IGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBpbW11dGFibGUgb25lLgorICAvLyAgIDIuIElmIHRoZSBvdGhlciBsaXN0IGlzIG5vbi1lbXB0eSBhbmQgb3VyIGN1cnJlbnQgbGlzdCBpcyBlbXB0eSwgd2UgY2FuCisgIC8vICAgICAgcmV1c2UgdGhlIG90aGVyIGxpc3Qgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBpbW11dGFibGUuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICghb3RoZXIuJG5hbWUkXy5pc0VtcHR5KCkpIHtcbiIKKyAgICAiICBpZiAoJG5hbWUkXy5pc0VtcHR5KCkpIHtcbiIKKyAgICAiICAgICRuYW1lJF8gPSBvdGhlci4kbmFtZSRfO1xuIgorICAgICIgICAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiICAgICRuYW1lJF8uYWRkQWxsKG90aGVyLiRuYW1lJF8pO1xuIgorICAgICIgIH1cbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gVGhlIGNvZGUgYmVsb3cgZW5zdXJlcyB0aGF0IHRoZSByZXN1bHQgaGFzIGFuIGltbXV0YWJsZSBsaXN0LiBJZiBvdXIKKyAgLy8gbGlzdCBpcyBpbW11dGFibGUsIHdlIGNhbiBqdXN0IHJldXNlIGl0LiBJZiBub3QsIHdlIG1ha2UgaXQgaW1tdXRhYmxlLgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCkge1xuIgorICAgICIgICRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAiICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIn1cbiIKKyAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRfO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBSZWFkIGFuZCBzdG9yZSB0aGUgZW51bQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgorICAgICIkdHlwZSQgdmFsdWUgPSAkdHlwZSQudmFsdWVPZihyYXdWYWx1ZSk7XG4iKTsKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKHZhbHVlID09IG51bGwpIHtcbiIKKyAgICAgICIgIHVua25vd25GaWVsZHMubWVyZ2VWYXJpbnRGaWVsZCgkbnVtYmVyJCwgcmF3VmFsdWUpO1xuIgorICAgICAgIn0gZWxzZSB7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmICh2YWx1ZSAhPSBudWxsKSB7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIgIGFkZCRjYXBpdGFsaXplZF9uYW1lJCh2YWx1ZSk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFdyYXAgR2VuZXJhdGVQYXJzaW5nQ29kZSdzIGNvbnRlbnRzIHdpdGggYSB3aGlsZSBsb29wLgorCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImludCBsZW5ndGggPSBpbnB1dC5yZWFkUmF3VmFyaW50MzIoKTtcbiIKKyAgICAiaW50IG9sZExpbWl0ID0gaW5wdXQucHVzaExpbWl0KGxlbmd0aCk7XG4iCisgICAgIndoaWxlKGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIEdlbmVyYXRlUGFyc2luZ0NvZGUocHJpbnRlcik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ9XG4iCisgICAgImlucHV0LnBvcExpbWl0KG9sZExpbWl0KTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuc2l6ZSgpID4gMCkge1xuIgorICAgICAgIiAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoJHRhZyQpO1xuIgorICAgICAgIiAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoJG5hbWUkTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSk7XG4iCisgICAgICAifVxuIgorICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgorICAgICAgIiAgb3V0cHV0LndyaXRlRW51bU5vVGFnKCRuYW1lJF8uZ2V0KGkpLmdldE51bWJlcigpKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgorICAgICAgIiAgb3V0cHV0LndyaXRlRW51bSgkbnVtYmVyJCwgJG5hbWUkXy5nZXQoaSkuZ2V0TnVtYmVyKCkpO1xuIgorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAie1xuIgorICAgICIgIGludCBkYXRhU2l6ZSA9IDA7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCisgICAgIiAgZGF0YVNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgorICAgICIgICAgLmNvbXB1dGVFbnVtU2l6ZU5vVGFnKCRuYW1lJF8uZ2V0KGkpLmdldE51bWJlcigpKTtcbiIKKyAgICAifVxuIik7CisgIHByaW50ZXItPlByaW50KAorICAgICJzaXplICs9IGRhdGFTaXplO1xuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAoIWdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5pc0VtcHR5KCkpIHsiCisgICAgICAiICBzaXplICs9ICR0YWdfc2l6ZSQ7XG4iCisgICAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAgICIgICAgLmNvbXB1dGVSYXdWYXJpbnQzMlNpemUoZGF0YVNpemUpO1xuIgorICAgICAgIn0iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgInNpemUgKz0gJHRhZ19zaXplJCAqICRuYW1lJF8uc2l6ZSgpO1xuIik7CisgIH0KKworICAvLyBjYWNoZSB0aGUgZGF0YSBzaXplIGZvciBwYWNrZWQgZmllbGRzLgorICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJG5hbWUkTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplO1xuIik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicmVzdWx0ID0gcmVzdWx0ICYmIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKVxuIgorICAgICIgICAgLmVxdWFscyhvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSA+IDApIHtcbiIKKyAgICAiICBoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iCisgICAgIiAgaGFzaCA9ICg1MyAqIGhhc2gpICsgaGFzaEVudW1MaXN0KGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSk7XG4iCisgICAgIn1cbiIpOworfQorCitzdHJpbmcgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYWQ2YmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5oCkBAIC0wLDAgKzEsMTIxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9FTlVNX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9FTlVNX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIEVudW1GaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7CisgIH5FbnVtRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKKyAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKKyAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1GaWVsZEdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKKyAgflJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKCk7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Q7CisgIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworICBzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CisgIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOworICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTQ3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmNjCkBAIC0wLDAgKzEsMjE2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCituYW1lc3BhY2UgeworCitjb25zdCBjaGFyKiBUeXBlTmFtZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgZmllbGRfdHlwZSkgeworICBzd2l0Y2ggKGZpZWxkX3R5cGUpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMiAgIDogcmV0dXJuICJJTlQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyICA6IHJldHVybiAiVUlOVDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzIgIDogcmV0dXJuICJTSU5UMzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzIgOiByZXR1cm4gIkZJWEVEMzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOiByZXR1cm4gIlNGSVhFRDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NCAgIDogcmV0dXJuICJJTlQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0ICA6IHJldHVybiAiVUlOVDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQgIDogcmV0dXJuICJTSU5UNjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQgOiByZXR1cm4gIkZJWEVENjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OiByZXR1cm4gIlNGSVhFRDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVCAgIDogcmV0dXJuICJGTE9BVCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFICA6IHJldHVybiAiRE9VQkxFIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MICAgIDogcmV0dXJuICJCT09MIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgIDogcmV0dXJuICJTVFJJTkciOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTICAgOiByZXR1cm4gIkJZVEVTIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNICAgIDogcmV0dXJuICJFTlVNIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCAgIDogcmV0dXJuICJHUk9VUCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSA6IHJldHVybiAiTUVTU0FHRSI7CisKKyAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KKyAgfQorCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gTlVMTDsKK30KKworfQorCitFeHRlbnNpb25HZW5lcmF0b3I6OkV4dGVuc2lvbkdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9zY29wZSgpICE9IE5VTEwpIHsKKyAgICBzY29wZV8gPSBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9zY29wZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBzY29wZV8gPSBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSk7CisgIH0KK30KKworRXh0ZW5zaW9uR2VuZXJhdG9yOjp+RXh0ZW5zaW9uR2VuZXJhdG9yKCkge30KKworLy8gSW5pdGlhbGl6ZXMgdGhlIHZhcnMgcmVmZXJlbmNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgdGVtcGxhdGVzLgordm9pZCBJbml0VGVtcGxhdGVWYXJzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcnNfcG9pbnRlcikgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+ICZ2YXJzID0gKnZhcnNfcG9pbnRlcjsKKyAgdmFyc1sic2NvcGUiXSA9IHNjb3BlOworICB2YXJzWyJuYW1lIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOworICB2YXJzWyJjb250YWluaW5nX3R5cGUiXSA9IENsYXNzTmFtZShkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSk7CisgIHZhcnNbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5udW1iZXIoKSk7CisgIHZhcnNbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOworICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5pbmRleCgpKTsKKyAgdmFyc1siZGVmYXVsdCJdID0KKyAgICAgIGRlc2NyaXB0b3ItPmlzX3JlcGVhdGVkKCkgPyAiIiA6IERlZmF1bHRWYWx1ZShkZXNjcmlwdG9yKTsKKyAgdmFyc1sidHlwZV9jb25zdGFudCJdID0gVHlwZU5hbWUoR2V0VHlwZShkZXNjcmlwdG9yKSk7CisgIHZhcnNbInBhY2tlZCJdID0gZGVzY3JpcHRvci0+b3B0aW9ucygpLnBhY2tlZCgpID8gInRydWUiIDogImZhbHNlIjsKKyAgdmFyc1siZW51bV9tYXAiXSA9ICJudWxsIjsKKyAgdmFyc1sicHJvdG90eXBlIl0gPSAibnVsbCI7CisKKyAgSmF2YVR5cGUgamF2YV90eXBlID0gR2V0SmF2YVR5cGUoZGVzY3JpcHRvcik7CisgIHN0cmluZyBzaW5ndWxhcl90eXBlOworICBzd2l0Y2ggKGphdmFfdHlwZSkgeworICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKKyAgICAgIHNpbmd1bGFyX3R5cGUgPSBDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAgICAgdmFyc1sicHJvdG90eXBlIl0gPSBzaW5ndWxhcl90eXBlICsgIi5nZXREZWZhdWx0SW5zdGFuY2UoKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICBzaW5ndWxhcl90eXBlID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmVudW1fdHlwZSgpKTsKKyAgICAgIHZhcnNbImVudW1fbWFwIl0gPSBzaW5ndWxhcl90eXBlICsgIi5pbnRlcm5hbEdldFZhbHVlTWFwKCkiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNpbmd1bGFyX3R5cGUgPSBCb3hlZFByaW1pdGl2ZVR5cGVOYW1lKGphdmFfdHlwZSk7CisgICAgICBicmVhazsKKyAgfQorICB2YXJzWyJ0eXBlIl0gPSBkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpID8KKyAgICAgICJqYXZhLnV0aWwuTGlzdDwiICsgc2luZ3VsYXJfdHlwZSArICI+IiA6IHNpbmd1bGFyX3R5cGU7CisgIHZhcnNbInNpbmd1bGFyX3R5cGUiXSA9IHNpbmd1bGFyX3R5cGU7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIEluaXRUZW1wbGF0ZVZhcnMoZGVzY3JpcHRvcl8sIHNjb3BlXywgJnZhcnMpOworICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICRjb25zdGFudF9uYW1lJCA9ICRudW1iZXIkO1xuIik7CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgLy8gTm9uLWxpdGUgZXh0ZW5zaW9ucworICAgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gTlVMTCkgeworICAgICAgLy8gTm9uLW5lc3RlZAorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFycywKKyAgICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbFxuIgorICAgICAgICAgICIgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5HZW5lcmF0ZWRFeHRlbnNpb248XG4iCisgICAgICAgICAgIiAgICAkY29udGFpbmluZ190eXBlJCxcbiIKKyAgICAgICAgICAiICAgICR0eXBlJD4gJG5hbWUkID0gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlXG4iCisgICAgICAgICAgIiAgICAgICAgLm5ld0ZpbGVTY29wZWRHZW5lcmF0ZWRFeHRlbnNpb24oXG4iCisgICAgICAgICAgIiAgICAgICRzaW5ndWxhcl90eXBlJC5jbGFzcyxcbiIKKyAgICAgICAgICAiICAgICAgJHByb3RvdHlwZSQpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5lc3RlZAorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFycywKKyAgICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbFxuIgorICAgICAgICAgICIgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5HZW5lcmF0ZWRFeHRlbnNpb248XG4iCisgICAgICAgICAgIiAgICAkY29udGFpbmluZ190eXBlJCxcbiIKKyAgICAgICAgICAiICAgICR0eXBlJD4gJG5hbWUkID0gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlXG4iCisgICAgICAgICAgIiAgICAgICAgLm5ld01lc3NhZ2VTY29wZWRHZW5lcmF0ZWRFeHRlbnNpb24oXG4iCisgICAgICAgICAgIiAgICAgICRzY29wZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCksXG4iCisgICAgICAgICAgIiAgICAgICRpbmRleCQsXG4iCisgICAgICAgICAgIiAgICAgICRzaW5ndWxhcl90eXBlJC5jbGFzcyxcbiIKKyAgICAgICAgICAiICAgICAgJHByb3RvdHlwZSQpO1xuIik7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIExpdGUgZXh0ZW5zaW9ucworICAgIGlmIChkZXNjcmlwdG9yXy0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFycywKKyAgICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbFxuIgorICAgICAgICAgICIgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUuR2VuZXJhdGVkRXh0ZW5zaW9uPFxuIgorICAgICAgICAgICIgICAgJGNvbnRhaW5pbmdfdHlwZSQsXG4iCisgICAgICAgICAgIiAgICAkdHlwZSQ+ICRuYW1lJCA9IGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGVcbiIKKyAgICAgICAgICAiICAgICAgICAubmV3UmVwZWF0ZWRHZW5lcmF0ZWRFeHRlbnNpb24oXG4iCisgICAgICAgICAgIiAgICAgICRjb250YWluaW5nX3R5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpLFxuIgorICAgICAgICAgICIgICAgICAkcHJvdG90eXBlJCxcbiIKKyAgICAgICAgICAiICAgICAgJGVudW1fbWFwJCxcbiIKKyAgICAgICAgICAiICAgICAgJG51bWJlciQsXG4iCisgICAgICAgICAgIiAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuV2lyZUZvcm1hdC5GaWVsZFR5cGUuJHR5cGVfY29uc3RhbnQkLFxuIgorICAgICAgICAgICIgICAgICAkcGFja2VkJCk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgdmFycywKKyAgICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbFxuIgorICAgICAgICAgICIgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUuR2VuZXJhdGVkRXh0ZW5zaW9uPFxuIgorICAgICAgICAgICIgICAgJGNvbnRhaW5pbmdfdHlwZSQsXG4iCisgICAgICAgICAgIiAgICAkdHlwZSQ+ICRuYW1lJCA9IGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGVcbiIKKyAgICAgICAgICAiICAgICAgICAubmV3U2luZ3VsYXJHZW5lcmF0ZWRFeHRlbnNpb24oXG4iCisgICAgICAgICAgIiAgICAgICRjb250YWluaW5nX3R5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpLFxuIgorICAgICAgICAgICIgICAgICAkZGVmYXVsdCQsXG4iCisgICAgICAgICAgIiAgICAgICRwcm90b3R5cGUkLFxuIgorICAgICAgICAgICIgICAgICAkZW51bV9tYXAkLFxuIgorICAgICAgICAgICIgICAgICAkbnVtYmVyJCxcbiIKKyAgICAgICAgICAiICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5XaXJlRm9ybWF0LkZpZWxkVHlwZS4kdHlwZV9jb25zdGFudCQpO1xuIik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZU5vbk5lc3RlZEluaXRpYWxpemF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9zY29wZSgpID09IE5VTEwgJiYKKyAgICAgIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgLy8gT25seSBhcHBsaWVzIHRvIG5vbi1uZXN0ZWQsIG5vbi1saXRlIGV4dGVuc2lvbnMuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIkbmFtZSQuaW50ZXJuYWxJbml0KGRlc2NyaXB0b3IuZ2V0RXh0ZW5zaW9ucygpLmdldCgkaW5kZXgkKSk7XG4iLAorICAgICAgICAibmFtZSIsIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcl8pLAorICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKSk7CisgIH0KK30KKwordm9pZCBFeHRlbnNpb25HZW5lcmF0b3I6OkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAicmVnaXN0cnkuYWRkKCRzY29wZSQuJG5hbWUkKTtcbiIsCisgICAgInNjb3BlIiwgc2NvcGVfLAorICAgICJuYW1lIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShkZXNjcmlwdG9yXykpOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDllZDlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VYVEVOU0lPTl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRVhURU5TSU9OX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisgIGNsYXNzIEZpZWxkRGVzY3JpcHRvcjsgICAgICAgLy8gZGVzY3JpcHRvci5oCisgIG5hbWVzcGFjZSBpbyB7CisgICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCisgIH0KK30KKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKKy8vIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBleHRlbnNpb24sIHdoaWNoIG1heSBiZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHNvbWUKKy8vIG1lc3NhZ2Ugb3IgbWF5IGJlIGF0IGZpbGUgc2NvcGUuICBUaGlzIGlzIG11Y2ggc2ltcGxlciB0aGFuIEZpZWxkR2VuZXJhdG9yCisvLyBzaW5jZSBleHRlbnNpb25zIGFyZSBqdXN0IHNpbXBsZSBpZGVudGlmaWVycyB3aXRoIGludGVyZXN0aW5nIHR5cGVzLgorY2xhc3MgRXh0ZW5zaW9uR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEV4dGVuc2lvbkdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB+RXh0ZW5zaW9uR2VuZXJhdG9yKCk7CisKKyAgdm9pZCBHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVOb25OZXN0ZWRJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzdHJpbmcgc2NvcGVfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRXh0ZW5zaW9uR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkNDMzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5jYwpAQCAtMCwwICsxLDEzNyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworRmllbGRHZW5lcmF0b3I6On5GaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFJlYWNoaW5nIGhlcmUgaW5kaWNhdGVzIGEgYnVnLiBDYXNlcyBhcmU6CisgIC8vICAgLSBUaGlzIEZpZWxkR2VuZXJhdG9yIHNob3VsZCBzdXBwb3J0IHBhY2tpbmcsIGJ1dCB0aGlzIG1ldGhvZCBzaG91bGQgYmUKKyAgLy8gICAgIG92ZXJyaWRkZW4uCisgIC8vICAgLSBUaGlzIEZpZWxkR2VuZXJhdG9yIGRvZXNuJ3Qgc3VwcG9ydCBwYWNraW5nLCBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkCisgIC8vICAgICBuZXZlciBoYXZlIGJlZW4gY2FsbGVkLgorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoKSAiCisgICAgICAgICAgICAgPDwgImNhbGxlZCBvbiBmaWVsZCBnZW5lcmF0b3IgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHBhY2tpbmcuIjsKK30KKworRmllbGRHZW5lcmF0b3JNYXA6OkZpZWxkR2VuZXJhdG9yTWFwKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCisgICAgZmllbGRfZ2VuZXJhdG9yc18oCisgICAgICBuZXcgc2NvcGVkX3B0cjxGaWVsZEdlbmVyYXRvcj5bZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKV0pLAorICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzXygKKyAgICAgIG5ldyBzY29wZWRfcHRyPEZpZWxkR2VuZXJhdG9yPltkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKV0pIHsKKworICAvLyBDb25zdHJ1Y3QgYWxsIHRoZSBGaWVsZEdlbmVyYXRvcnMgYW5kIGFzc2lnbiB0aGVtIGJpdCBpbmRpY2VzIGZvciB0aGVpcgorICAvLyBiaXQgZmllbGRzLgorICBpbnQgbWVzc2FnZUJpdEluZGV4ID0gMDsKKyAgaW50IGJ1aWxkZXJCaXRJbmRleCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgRmllbGRHZW5lcmF0b3IqIGdlbmVyYXRvciA9IE1ha2VHZW5lcmF0b3IoZGVzY3JpcHRvci0+ZmllbGQoaSksCisgICAgICAgIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4KTsKKyAgICBmaWVsZF9nZW5lcmF0b3JzX1tpXS5yZXNldChnZW5lcmF0b3IpOworICAgIG1lc3NhZ2VCaXRJbmRleCArPSBnZW5lcmF0b3ItPkdldE51bUJpdHNGb3JNZXNzYWdlKCk7CisgICAgYnVpbGRlckJpdEluZGV4ICs9IGdlbmVyYXRvci0+R2V0TnVtQml0c0ZvckJ1aWxkZXIoKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBGaWVsZEdlbmVyYXRvciogZ2VuZXJhdG9yID0gTWFrZUdlbmVyYXRvcihkZXNjcmlwdG9yLT5leHRlbnNpb24oaSksCisgICAgICAgIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4KTsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0ucmVzZXQoZ2VuZXJhdG9yKTsKKyAgICBtZXNzYWdlQml0SW5kZXggKz0gZ2VuZXJhdG9yLT5HZXROdW1CaXRzRm9yTWVzc2FnZSgpOworICAgIGJ1aWxkZXJCaXRJbmRleCArPSBnZW5lcmF0b3ItPkdldE51bUJpdHNGb3JCdWlsZGVyKCk7CisgIH0KK30KKworRmllbGRHZW5lcmF0b3IqIEZpZWxkR2VuZXJhdG9yTWFwOjpNYWtlR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgpIHsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKKyAgICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCk7CisgICAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgpOworICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKEdldEphdmFUeXBlKGZpZWxkKSkgeworICAgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCk7CisgICAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICAgIHJldHVybiBuZXcgRW51bUZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4KTsKKyAgICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgorICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0ZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4KTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgpOworICAgIH0KKyAgfQorfQorCitGaWVsZEdlbmVyYXRvck1hcDo6fkZpZWxkR2VuZXJhdG9yTWFwKCkge30KKworY29uc3QgRmllbGRHZW5lcmF0b3ImIEZpZWxkR2VuZXJhdG9yTWFwOjpnZXQoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBHT09HTEVfQ0hFQ0tfRVEoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLCBkZXNjcmlwdG9yXyk7CisgIHJldHVybiAqZmllbGRfZ2VuZXJhdG9yc19bZmllbGQtPmluZGV4KCldOworfQorCitjb25zdCBGaWVsZEdlbmVyYXRvciYgRmllbGRHZW5lcmF0b3JNYXA6OmdldF9leHRlbnNpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiAqZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2luZGV4XTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOTdmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaApAQCAtMCwwICsxLDEwOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBpbyB7CisgICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCisgIH0KK30KKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEZpZWxkR2VuZXJhdG9yKCkge30KKyAgdmlydHVhbCB+RmllbGRHZW5lcmF0b3IoKTsKKworICB2aXJ0dWFsIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikKKyAgICAgIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3QgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkR2VuZXJhdG9yKTsKK307CisKKy8vIENvbnZlbmllbmNlIGNsYXNzIHdoaWNoIGNvbnN0cnVjdHMgRmllbGRHZW5lcmF0b3JzIGZvciBhIERlc2NyaXB0b3IuCitjbGFzcyBGaWVsZEdlbmVyYXRvck1hcCB7CisgcHVibGljOgorICBleHBsaWNpdCBGaWVsZEdlbmVyYXRvck1hcChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgfkZpZWxkR2VuZXJhdG9yTWFwKCk7CisKKyAgY29uc3QgRmllbGRHZW5lcmF0b3ImIGdldChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgY29uc3QgRmllbGRHZW5lcmF0b3ImIGdldF9leHRlbnNpb24oaW50IGluZGV4KSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxGaWVsZEdlbmVyYXRvcj4gPiBmaWVsZF9nZW5lcmF0b3JzXzsKKyAgc2NvcGVkX2FycmF5PHNjb3BlZF9wdHI8RmllbGRHZW5lcmF0b3I+ID4gZXh0ZW5zaW9uX2dlbmVyYXRvcnNfOworCisgIHN0YXRpYyBGaWVsZEdlbmVyYXRvciogTWFrZUdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkR2VuZXJhdG9yTWFwKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJRUxEX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTY4MDY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MKQEAgLTAsMCArMSw0MjggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCituYW1lc3BhY2UgeworCisvLyBSZWN1cnNpdmVseSBzZWFyY2hlcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBzZWUgaWYgaXQgY29udGFpbnMgYW55IGV4dGVuc2lvbnMuCitib29sIFVzZXNFeHRlbnNpb25zKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIC8vIFdlIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSB0aGF0IHVua25vd24gZmllbGRzIGFyZSBleHRlbnNpb25zLgorICBpZiAocmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKS5maWVsZF9jb3VudCgpID4gMCkgcmV0dXJuIHRydWU7CisKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlLCAmZmllbGRzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgeworICAgIGlmIChmaWVsZHNbaV0tPmlzX2V4dGVuc2lvbigpKSByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChHZXRKYXZhVHlwZShmaWVsZHNbaV0pID09IEpBVkFUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmIChmaWVsZHNbaV0tPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgaW50IHNpemUgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgZmllbGRzW2ldKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9CisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGRzW2ldLCBqKTsKKyAgICAgICAgICBpZiAoVXNlc0V4dGVuc2lvbnMoc3ViX21lc3NhZ2UpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkc1tpXSk7CisgICAgICAgIGlmIChVc2VzRXh0ZW5zaW9ucyhzdWJfbWVzc2FnZSkpIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UKKworRmlsZUdlbmVyYXRvcjo6RmlsZUdlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkKKyAgOiBmaWxlXyhmaWxlKSwKKyAgICBqYXZhX3BhY2thZ2VfKEZpbGVKYXZhUGFja2FnZShmaWxlKSksCisgICAgY2xhc3NuYW1lXyhGaWxlQ2xhc3NOYW1lKGZpbGUpKSB7Cit9CisKK0ZpbGVHZW5lcmF0b3I6On5GaWxlR2VuZXJhdG9yKCkge30KKworYm9vbCBGaWxlR2VuZXJhdG9yOjpWYWxpZGF0ZShzdHJpbmcqIGVycm9yKSB7CisgIC8vIENoZWNrIHRoYXQgbm8gY2xhc3MgbmFtZSBtYXRjaGVzIHRoZSBmaWxlJ3MgY2xhc3MgbmFtZS4gIFRoaXMgaXMgYSBjb21tb24KKyAgLy8gcHJvYmxlbSB0aGF0IGxlYWRzIHRvIEphdmEgY29tcGlsZSBlcnJvcnMgdGhhdCBjYW4gYmUgaGFyZCB0byB1bmRlcnN0YW5kLgorICAvLyBJdCdzIGVzcGVjaWFsbHkgYmFkIHdoZW4gdXNpbmcgdGhlIGphdmFfbXVsdGlwbGVfZmlsZXMsIHNpbmNlIHdlIHdvdWxkCisgIC8vIGVuZCB1cCBvdmVyd3JpdGluZyB0aGUgb3V0ZXIgY2xhc3Mgd2l0aCBvbmUgb2YgdGhlIGlubmVyIG9uZXMuCisKKyAgYm9vbCBmb3VuZF9jb25mbGljdCA9IGZhbHNlOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKSAmJiAhZm91bmRfY29uZmxpY3Q7IGkrKykgeworICAgIGlmIChmaWxlXy0+ZW51bV90eXBlKGkpLT5uYW1lKCkgPT0gY2xhc3NuYW1lXykgeworICAgICAgZm91bmRfY29uZmxpY3QgPSB0cnVlOworICAgIH0KKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKSAmJiAhZm91bmRfY29uZmxpY3Q7IGkrKykgeworICAgIGlmIChmaWxlXy0+bWVzc2FnZV90eXBlKGkpLT5uYW1lKCkgPT0gY2xhc3NuYW1lXykgeworICAgICAgZm91bmRfY29uZmxpY3QgPSB0cnVlOworICAgIH0KKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5zZXJ2aWNlX2NvdW50KCkgJiYgIWZvdW5kX2NvbmZsaWN0OyBpKyspIHsKKyAgICBpZiAoZmlsZV8tPnNlcnZpY2UoaSktPm5hbWUoKSA9PSBjbGFzc25hbWVfKSB7CisgICAgICBmb3VuZF9jb25mbGljdCA9IHRydWU7CisgICAgfQorICB9CisKKyAgaWYgKGZvdW5kX2NvbmZsaWN0KSB7CisgICAgZXJyb3ItPmFzc2lnbihmaWxlXy0+bmFtZSgpKTsKKyAgICBlcnJvci0+YXBwZW5kKAorICAgICAgIjogQ2Fubm90IGdlbmVyYXRlIEphdmEgb3V0cHV0IGJlY2F1c2UgdGhlIGZpbGUncyBvdXRlciBjbGFzcyBuYW1lLCBcIiIpOworICAgIGVycm9yLT5hcHBlbmQoY2xhc3NuYW1lXyk7CisgICAgZXJyb3ItPmFwcGVuZCgKKyAgICAgICJcIiwgbWF0Y2hlcyB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHR5cGVzIGRlY2xhcmVkIGluc2lkZSBpdC4gICIKKyAgICAgICJQbGVhc2UgZWl0aGVyIHJlbmFtZSB0aGUgdHlwZSBvciB1c2UgdGhlIGphdmFfb3V0ZXJfY2xhc3NuYW1lICIKKyAgICAgICJvcHRpb24gdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBvdXRlciBjbGFzcyBuYW1lIGZvciB0aGUgLnByb3RvIGZpbGUuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gV2UgZG9uJ3QgaW1wb3J0IGFueXRoaW5nIGJlY2F1c2Ugd2UgcmVmZXIgdG8gYWxsIGNsYXNzZXMgYnkgdGhlaXIKKyAgLy8gZnVsbHktcXVhbGlmaWVkIG5hbWVzIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLgorICBwcmludGVyLT5QcmludCgKKyAgICAiLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCFcbiIKKyAgICAiLy8gc291cmNlOiAkZmlsZW5hbWUkXG4iCisgICAgIlxuIiwKKyAgICAiZmlsZW5hbWUiLCBmaWxlXy0+bmFtZSgpKTsKKyAgaWYgKCFqYXZhX3BhY2thZ2VfLmVtcHR5KCkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJwYWNrYWdlICRwYWNrYWdlJDtcbiIKKyAgICAgICJcbiIsCisgICAgICAicGFja2FnZSIsIGphdmFfcGFja2FnZV8pOworICB9CisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgZmluYWwgY2xhc3MgJGNsYXNzbmFtZSQge1xuIgorICAgICIgIHByaXZhdGUgJGNsYXNzbmFtZSQoKSB7fVxuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckFsbEV4dGVuc2lvbnMoXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5JGxpdGUkIHJlZ2lzdHJ5KSB7XG4iLAorICAgICJsaXRlIiwgSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pID8gIiIgOiAiTGl0ZSIpOworCisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBFeHRlbnNpb25HZW5lcmF0b3IoZmlsZV8tPmV4dGVuc2lvbihpKSkuR2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKHByaW50ZXIpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIE1lc3NhZ2VHZW5lcmF0b3IoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSkKKyAgICAgIC5HZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUocHJpbnRlcik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJ9XG4iKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGlmICghZmlsZV8tPm9wdGlvbnMoKS5qYXZhX211bHRpcGxlX2ZpbGVzKCkpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBFbnVtR2VuZXJhdG9yKGZpbGVfLT5lbnVtX3R5cGUoaSkpLkdlbmVyYXRlKHByaW50ZXIpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VHZW5lcmF0b3IoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CisgICAgICBtZXNzYWdlR2VuZXJhdG9yLkdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOworICAgICAgbWVzc2FnZUdlbmVyYXRvci5HZW5lcmF0ZShwcmludGVyKTsKKyAgICB9CisgICAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXykpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgICAgIFNlcnZpY2VHZW5lcmF0b3IoZmlsZV8tPnNlcnZpY2UoaSkpLkdlbmVyYXRlKHByaW50ZXIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEV4dGVuc2lvbnMgbXVzdCBiZSBnZW5lcmF0ZWQgaW4gdGhlIG91dGVyIGNsYXNzIHNpbmNlIHRoZXkgYXJlIHZhbHVlcywKKyAgLy8gbm90IGNsYXNzZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBFeHRlbnNpb25HZW5lcmF0b3IoZmlsZV8tPmV4dGVuc2lvbihpKSkuR2VuZXJhdGUocHJpbnRlcik7CisgIH0KKworICAvLyBTdGF0aWMgdmFyaWFibGVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgLy8gVE9ETyhrZW50b24pOiAgUmV1c2UgTWVzc2FnZUdlbmVyYXRvciBvYmplY3RzPworICAgIE1lc3NhZ2VHZW5lcmF0b3IoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSkuR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMocHJpbnRlcik7CisgIH0KKworICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pKSB7CisgICAgR2VuZXJhdGVFbWJlZGRlZERlc2NyaXB0b3IocHJpbnRlcik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAic3RhdGljIHtcbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgICAgLy8gVE9ETyhrZW50b24pOiAgUmV1c2UgTWVzc2FnZUdlbmVyYXRvciBvYmplY3RzPworICAgICAgTWVzc2FnZUdlbmVyYXRvcihmaWxlXy0+bWVzc2FnZV90eXBlKGkpKQorICAgICAgICAuR2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhwcmludGVyKTsKKyAgICB9CisKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAifVxuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiXG4iCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChvdXRlcl9jbGFzc19zY29wZSlcbiIpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlRW1iZWRkZWREZXNjcmlwdG9yKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIEVtYmVkIHRoZSBkZXNjcmlwdG9yLiAgV2Ugc2ltcGx5IHNlcmlhbGl6ZSB0aGUgZW50aXJlIEZpbGVEZXNjcmlwdG9yUHJvdG8KKyAgLy8gYW5kIGVtYmVkIGl0IGFzIGEgc3RyaW5nIGxpdGVyYWwsIHdoaWNoIGlzIHBhcnNlZCBhbmQgYnVpbHQgaW50byByZWFsCisgIC8vIGRlc2NyaXB0b3JzIGF0IGluaXRpYWxpemF0aW9uIHRpbWUuICBXZSB1bmZvcnR1bmF0ZWx5IGhhdmUgdG8gcHV0IGl0IGluCisgIC8vIGEgc3RyaW5nIGxpdGVyYWwsIG5vdCBhIGJ5dGUgYXJyYXksIGJlY2F1c2UgYXBwYXJlbnRseSB1c2luZyBhIGxpdGVyYWwKKyAgLy8gYnl0ZSBhcnJheSBjYXVzZXMgdGhlIEphdmEgY29tcGlsZXIgdG8gZ2VuZXJhdGUgKmluc3RydWN0aW9ucyogdG8KKyAgLy8gaW5pdGlhbGl6ZSBlYWNoIGFuZCBldmVyeSBieXRlIG9mIHRoZSBhcnJheSwgZS5nLiBhcyBpZiB5b3UgdHlwZWQ6CisgIC8vICAgYlswXSA9IDEyMzsgYlsxXSA9IDQ1NjsgYlsyXSA9IDc4OTsKKyAgLy8gVGhpcyBtYWtlcyBodWdlIGJ5dGVjb2RlIGZpbGVzIGFuZCBjYW4gZWFzaWx5IGhpdCB0aGUgY29tcGlsZXIncyBpbnRlcm5hbAorICAvLyBjb2RlIHNpemUgbGltaXRzIChlcnJvciAiY29kZSB0byBsYXJnZSIpLiAgU3RyaW5nIGxpdGVyYWxzIGFyZSBhcHBhcmVudGx5CisgIC8vIGVtYmVkZGVkIHJhdywgd2hpY2ggaXMgd2hhdCB3ZSB3YW50LgorICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIGZpbGVfLT5Db3B5VG8oJmZpbGVfcHJvdG8pOworCisgIHN0cmluZyBmaWxlX2RhdGE7CisgIGZpbGVfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJmZpbGVfZGF0YSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvclxuIgorICAgICIgICAgZ2V0RGVzY3JpcHRvcigpIHtcbiIKKyAgICAiICByZXR1cm4gZGVzY3JpcHRvcjtcbiIKKyAgICAifVxuIgorICAgICJwcml2YXRlIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yXG4iCisgICAgIiAgICBkZXNjcmlwdG9yO1xuIgorICAgICJzdGF0aWMge1xuIgorICAgICIgIGphdmEubGFuZy5TdHJpbmdbXSBkZXNjcmlwdG9yRGF0YSA9IHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgLy8gT25seSB3cml0ZSA0MCBieXRlcyBwZXIgbGluZS4KKyAgc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJMaW5lID0gNDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9kYXRhLnNpemUoKTsgaSArPSBrQnl0ZXNQZXJMaW5lKSB7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICAvLyBFdmVyeSA0MDAgbGluZXMsIHN0YXJ0IGEgbmV3IHN0cmluZyBsaXRlcmFsLCBpbiBvcmRlciB0byBhdm9pZCB0aGUKKyAgICAgIC8vIDY0ayBsZW5ndGggbGltaXQuCisgICAgICBpZiAoaSAlIDQwMCA9PSAwKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KCIsXG4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZXItPlByaW50KCIgK1xuIik7CisgICAgICB9CisgICAgfQorICAgIHByaW50ZXItPlByaW50KCJcIiRkYXRhJFwiIiwKKyAgICAgICJkYXRhIiwgQ0VzY2FwZShmaWxlX2RhdGEuc3Vic3RyKGksIGtCeXRlc1BlckxpbmUpKSk7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJcbn07XG4iKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBDcmVhdGUgdGhlIEludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyLgorCisgIHByaW50ZXItPlByaW50KAorICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLiIKKyAgICAgICJJbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9XG4iCisgICAgIiAgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IuIgorICAgICAgIkludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyKCkge1xuIgorICAgICIgICAgcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnkgYXNzaWduRGVzY3JpcHRvcnMoXG4iCisgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvciByb290KSB7XG4iCisgICAgIiAgICAgIGRlc2NyaXB0b3IgPSByb290O1xuIik7CisKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgLy8gVE9ETyhrZW50b24pOiAgUmV1c2UgTWVzc2FnZUdlbmVyYXRvciBvYmplY3RzPworICAgIE1lc3NhZ2VHZW5lcmF0b3IoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSkKKyAgICAgIC5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKHByaW50ZXIpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICAvLyBUT0RPKGtlbnRvbik6ICBSZXVzZSBFeHRlbnNpb25HZW5lcmF0b3Igb2JqZWN0cz8KKyAgICBFeHRlbnNpb25HZW5lcmF0b3IoZmlsZV8tPmV4dGVuc2lvbihpKSkKKyAgICAgICAgLkdlbmVyYXRlTm9uTmVzdGVkSW5pdGlhbGl6YXRpb25Db2RlKHByaW50ZXIpOworICB9CisKKyAgaWYgKFVzZXNFeHRlbnNpb25zKGZpbGVfcHJvdG8pKSB7CisgICAgLy8gTXVzdCBjb25zdHJ1Y3QgYW4gRXh0ZW5zaW9uUmVnaXN0cnkgY29udGFpbmluZyBhbGwgcG9zc2libGUgZXh0ZW5zaW9ucworICAgIC8vIGFuZCByZXR1cm4gaXQuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9XG4iCisgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7XG4iCisgICAgICAicmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTtcbiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgICBpZiAoU2hvdWxkSW5jbHVkZURlcGVuZGVuY3koZmlsZV8tPmRlcGVuZGVuY3koaSkpKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgIiRkZXBlbmRlbmN5JC5yZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpO1xuIiwKKyAgICAgICAgICAgICJkZXBlbmRlbmN5IiwgQ2xhc3NOYW1lKGZpbGVfLT5kZXBlbmRlbmN5KGkpKSk7CisgICAgICB9CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgInJldHVybiByZWdpc3RyeTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInJldHVybiBudWxsO1xuIik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworCisgIHByaW50ZXItPlByaW50KAorICAgICIgICAgfVxuIgorICAgICIgIH07XG4iKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBJbnZva2UgaW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKCkgdG8gYnVpbGQgdGhlIGZpbGUuCisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JcbiIKKyAgICAiICAuaW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKGRlc2NyaXB0b3JEYXRhLFxuIgorICAgICIgICAgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JbXSB7XG4iKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIGlmIChTaG91bGRJbmNsdWRlRGVwZW5kZW5jeShmaWxlXy0+ZGVwZW5kZW5jeShpKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICAgICAgJGRlcGVuZGVuY3kkLmdldERlc2NyaXB0b3IoKSxcbiIsCisgICAgICAgICJkZXBlbmRlbmN5IiwgQ2xhc3NOYW1lKGZpbGVfLT5kZXBlbmRlbmN5KGkpKSk7CisgICAgfQorICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgICB9LCBhc3NpZ25lcik7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJ9XG4iKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgR2VuZXJhdG9yQ2xhc3MsIHR5cGVuYW1lIERlc2NyaXB0b3JDbGFzcz4KK3N0YXRpYyB2b2lkIEdlbmVyYXRlU2libGluZyhjb25zdCBzdHJpbmcmIHBhY2thZ2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgamF2YV9wYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JDbGFzcyogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiBmaWxlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lX3N1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIChHZW5lcmF0b3JDbGFzczo6KnBmbikoaW86OlByaW50ZXIqIHByaW50ZXIpKSB7CisgIHN0cmluZyBmaWxlbmFtZSA9IHBhY2thZ2VfZGlyICsgZGVzY3JpcHRvci0+bmFtZSgpICsgbmFtZV9zdWZmaXggKyAiLmphdmEiOworICBmaWxlX2xpc3QtPnB1c2hfYmFjayhmaWxlbmFtZSk7CisKKyAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dChjb250ZXh0LT5PcGVuKGZpbGVuYW1lKSk7CisgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOworCisgIHByaW50ZXIuUHJpbnQoCisgICAgIi8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhXG4iCisgICAgIlxuIik7CisgIGlmICghamF2YV9wYWNrYWdlLmVtcHR5KCkpIHsKKyAgICBwcmludGVyLlByaW50KAorICAgICAgInBhY2thZ2UgJHBhY2thZ2UkO1xuIgorICAgICAgIlxuIiwKKyAgICAgICJwYWNrYWdlIiwgamF2YV9wYWNrYWdlKTsKKyAgfQorCisgIEdlbmVyYXRvckNsYXNzIGdlbmVyYXRvcihkZXNjcmlwdG9yKTsKKyAgKGdlbmVyYXRvci4qcGZuKSgmcHJpbnRlcik7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVTaWJsaW5ncyhjb25zdCBzdHJpbmcmIHBhY2thZ2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIGZpbGVfbGlzdCkgeworICBpZiAoZmlsZV8tPm9wdGlvbnMoKS5qYXZhX211bHRpcGxlX2ZpbGVzKCkpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgICBHZW5lcmF0ZVNpYmxpbmc8RW51bUdlbmVyYXRvcj4ocGFja2FnZV9kaXIsIGphdmFfcGFja2FnZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV8tPmVudW1fdHlwZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBmaWxlX2xpc3QsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZSk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIEdlbmVyYXRlU2libGluZzxNZXNzYWdlR2VuZXJhdG9yPihwYWNrYWdlX2RpciwgamF2YV9wYWNrYWdlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXy0+bWVzc2FnZV90eXBlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGZpbGVfbGlzdCwgIk9yQnVpbGRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlKTsKKyAgICAgIEdlbmVyYXRlU2libGluZzxNZXNzYWdlR2VuZXJhdG9yPihwYWNrYWdlX2RpciwgamF2YV9wYWNrYWdlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXy0+bWVzc2FnZV90eXBlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGZpbGVfbGlzdCwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlKTsKKyAgICB9CisgICAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXykpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgICAgIEdlbmVyYXRlU2libGluZzxTZXJ2aWNlR2VuZXJhdG9yPihwYWNrYWdlX2RpciwgamF2YV9wYWNrYWdlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfLT5zZXJ2aWNlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgZmlsZV9saXN0LCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2Jvb2wgRmlsZUdlbmVyYXRvcjo6U2hvdWxkSW5jbHVkZURlcGVuZGVuY3koY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk5MTE0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJTEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJTEVfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBjbGFzcyBGaWxlRGVzY3JpcHRvcjsgICAgICAgIC8vIGRlc2NyaXB0b3IuaAorICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICB9CisgIG5hbWVzcGFjZSBjb21waWxlciB7CisgICAgY2xhc3MgR2VuZXJhdG9yQ29udGV4dDsgICAgIC8vIGNvZGVfZ2VuZXJhdG9yLmgKKyAgfQorfQorCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY2xhc3MgRmlsZUdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBGaWxlR2VuZXJhdG9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKyAgfkZpbGVHZW5lcmF0b3IoKTsKKworICAvLyBDaGVja3MgZm9yIHByb2JsZW1zIHRoYXQgd291bGQgb3RoZXJ3aXNlIGxlYWQgdG8gY3J5cHRpYyBjb21waWxlIGVycm9ycy4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBubyBwcm9ibGVtcywgb3Igd3JpdGVzIGFuIGVycm9yIGRlc2NyaXB0aW9uIHRvCisgIC8vIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIFZhbGlkYXRlKHN0cmluZyogZXJyb3IpOworCisgIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIElmIHdlIGFyZW4ndCBwdXR0aW5nIGV2ZXJ5dGhpbmcgaW50byBvbmUgZmlsZSwgdGhpcyB3aWxsIHdyaXRlIGFsbCB0aGUKKyAgLy8gZmlsZXMgb3RoZXIgdGhhbiB0aGUgb3V0ZXIgZmlsZSAoaS5lLiBvbmUgZm9yIGVhY2ggbWVzc2FnZSwgZW51bSwgYW5kCisgIC8vIHNlcnZpY2UgdHlwZSkuCisgIHZvaWQgR2VuZXJhdGVTaWJsaW5ncyhjb25zdCBzdHJpbmcmIHBhY2thZ2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogZmlsZV9saXN0KTsKKworICBjb25zdCBzdHJpbmcmIGphdmFfcGFja2FnZSgpIHsgcmV0dXJuIGphdmFfcGFja2FnZV87IH0KKyAgY29uc3Qgc3RyaW5nJiBjbGFzc25hbWUoKSAgICB7IHJldHVybiBjbGFzc25hbWVfOyAgICB9CisKKworIHByaXZhdGU6CisgIC8vIFJldHVybnMgd2hldGhlciB0aGUgZGVwZW5kZW5jeSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgorICAvLyBBbHdheXMgcmV0dXJucyB0cnVlIGZvciBvcGVuc291cmNlLCBidXQgdXNlZCBpbnRlcm5hbGx5IGF0IEdvb2dsZSB0byBoZWxwCisgIC8vIGltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb24gMSBvZiBwcm90b2NvbCBidWZmZXJzLgorICBib29sIFNob3VsZEluY2x1ZGVEZXBlbmRlbmN5KGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIHN0cmluZyBqYXZhX3BhY2thZ2VfOworICBzdHJpbmcgY2xhc3NuYW1lXzsKKworCisgIHZvaWQgR2VuZXJhdGVFbWJlZGRlZERlc2NyaXB0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWxlR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJTEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmM3OWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEyOCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKKworSmF2YUdlbmVyYXRvcjo6SmF2YUdlbmVyYXRvcigpIHt9CitKYXZhR2VuZXJhdG9yOjp+SmF2YUdlbmVyYXRvcigpIHt9CisKK2Jvb2wgSmF2YUdlbmVyYXRvcjo6R2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdCB7CisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIHBhcnNlIGdlbmVyYXRvciBvcHRpb25zCisKKyAgLy8gTmFtZSBhIGZpbGUgd2hlcmUgd2Ugd2lsbCB3cml0ZSBhIGxpc3Qgb2YgZ2VuZXJhdGVkIGZpbGUgbmFtZXMsIG9uZQorICAvLyBwZXIgbGluZS4KKyAgc3RyaW5nIG91dHB1dF9saXN0X2ZpbGU7CisKKworICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiBvcHRpb25zOworICBQYXJzZUdlbmVyYXRvclBhcmFtZXRlcihwYXJhbWV0ZXIsICZvcHRpb25zKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAib3V0cHV0X2xpc3RfZmlsZSIpIHsKKyAgICAgIG91dHB1dF9saXN0X2ZpbGUgPSBvcHRpb25zW2ldLnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgKmVycm9yID0gIlVua25vd24gZ2VuZXJhdG9yIG9wdGlvbjogIiArIG9wdGlvbnNbaV0uZmlyc3Q7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgIGlmIChmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgPT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRSAmJgorICAgICAgZmlsZS0+b3B0aW9ucygpLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkpIHsKKyAgICAqZXJyb3IgPSAiVGhlIFwiamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hcIiBvcHRpb24gaXMgaW5jb21wYXRpYmxlICIKKyAgICAgICAgICAgICAid2l0aCBcIm9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRVwiLiAgWW91IG11c3Qgb3B0aW1pemUgZm9yICIKKyAgICAgICAgICAgICAiU1BFRUQgb3IgQ09ERV9TSVpFIGlmIHlvdSB3YW50IHRvIHVzZSB0aGlzIG9wdGlvbi4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEZpbGVHZW5lcmF0b3IgZmlsZV9nZW5lcmF0b3IoZmlsZSk7CisgIGlmICghZmlsZV9nZW5lcmF0b3IuVmFsaWRhdGUoZXJyb3IpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RyaW5nIHBhY2thZ2VfZGlyID0gSmF2YVBhY2thZ2VUb0RpcihmaWxlX2dlbmVyYXRvci5qYXZhX3BhY2thZ2UoKSk7CisKKyAgdmVjdG9yPHN0cmluZz4gYWxsX2ZpbGVzOworCisgIHN0cmluZyBqYXZhX2ZpbGVuYW1lID0gcGFja2FnZV9kaXI7CisgIGphdmFfZmlsZW5hbWUgKz0gZmlsZV9nZW5lcmF0b3IuY2xhc3NuYW1lKCk7CisgIGphdmFfZmlsZW5hbWUgKz0gIi5qYXZhIjsKKyAgYWxsX2ZpbGVzLnB1c2hfYmFjayhqYXZhX2ZpbGVuYW1lKTsKKworICAvLyBHZW5lcmF0ZSBtYWluIGphdmEgZmlsZS4KKyAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICBjb250ZXh0LT5PcGVuKGphdmFfZmlsZW5hbWUpKTsKKyAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgIGZpbGVfZ2VuZXJhdG9yLkdlbmVyYXRlKCZwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBzaWJsaW5nIGZpbGVzLgorICBmaWxlX2dlbmVyYXRvci5HZW5lcmF0ZVNpYmxpbmdzKHBhY2thZ2VfZGlyLCBjb250ZXh0LCAmYWxsX2ZpbGVzKTsKKworICAvLyBHZW5lcmF0ZSBvdXRwdXQgbGlzdCBpZiByZXF1ZXN0ZWQuCisgIGlmICghb3V0cHV0X2xpc3RfZmlsZS5lbXB0eSgpKSB7CisgICAgLy8gR2VuZXJhdGUgb3V0cHV0IGxpc3QuICBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgdGV4dCBmaWxlIHBsYWNlZCBpbiBhCisgICAgLy8gZGV0ZXJtaW5pc3RpYyBsb2NhdGlvbiB3aGljaCBsaXN0cyB0aGUgLmphdmEgZmlsZXMgYmVpbmcgZ2VuZXJhdGVkLgorICAgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBzcmNsaXN0X3Jhd19vdXRwdXQoCisgICAgICBjb250ZXh0LT5PcGVuKG91dHB1dF9saXN0X2ZpbGUpKTsKKyAgICBpbzo6UHJpbnRlciBzcmNsaXN0X3ByaW50ZXIoc3JjbGlzdF9yYXdfb3V0cHV0LmdldCgpLCAnJCcpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsX2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICBzcmNsaXN0X3ByaW50ZXIuUHJpbnQoIiRmaWxlbmFtZSRcbiIsICJmaWxlbmFtZSIsIGFsbF9maWxlc1tpXSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OGI4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSw3MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gR2VuZXJhdGVzIEphdmEgY29kZSBmb3IgYSBnaXZlbiAucHJvdG8gZmlsZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9HRU5FUkFUT1JfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworLy8gQ29kZUdlbmVyYXRvciBpbXBsZW1lbnRhdGlvbiB3aGljaCBnZW5lcmF0ZXMgSmF2YSBjb2RlLiAgSWYgeW91IGNyZWF0ZSB5b3VyCisvLyBvd24gcHJvdG9jb2wgY29tcGlsZXIgYmluYXJ5IGFuZCB5b3Ugd2FudCBpdCB0byBzdXBwb3J0IEphdmEgb3V0cHV0LCB5b3UKKy8vIGNhbiBkbyBzbyBieSByZWdpc3RlcmluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIENvZGVHZW5lcmF0b3Igd2l0aCB0aGUKKy8vIENvbW1hbmRMaW5lSW50ZXJmYWNlIGluIHlvdXIgbWFpbigpIGZ1bmN0aW9uLgorY2xhc3MgTElCUFJPVE9DX0VYUE9SVCBKYXZhR2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgSmF2YUdlbmVyYXRvcigpOworICB+SmF2YUdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgQ29kZUdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKYXZhR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0dFTkVSQVRPUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2ZjE2NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjCkBAIC0wLDAgKzEsNDc4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY29uc3QgY2hhciBrVGhpY2tTZXBhcmF0b3JbXSA9CisgICIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworY29uc3QgY2hhciBrVGhpblNlcGFyYXRvcltdID0KKyAgIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGNoYXIqIGtEZWZhdWx0UGFja2FnZSA9ICIiOworCitjb25zdCBzdHJpbmcmIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIEdyb3VwcyBhcmUgaGFja3k6ICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgaXMganVzdCB0aGUgbG93ZXItY2FzZWQgbmFtZQorICAvLyBvZiB0aGUgZ3JvdXAgdHlwZS4gIEluIEphdmEsIHRob3VnaCwgd2Ugd291bGQgbGlrZSB0byByZXRhaW4gdGhlIG9yaWdpbmFsCisgIC8vIGNhcGl0YWxpemF0aW9uIG9mIHRoZSB0eXBlIG5hbWUuCisgIGlmIChHZXRUeXBlKGZpZWxkKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICByZXR1cm4gZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZpZWxkLT5uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2VJbXBsKGNvbnN0IHN0cmluZyYgaW5wdXQsIGJvb2wgY2FwX25leHRfbGV0dGVyKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIC8vIE5vdGU6ICBJIGRpc3RydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoJ2EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICd6JykgeworICAgICAgaWYgKGNhcF9uZXh0X2xldHRlcikgeworICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV0gKyAoJ0EnIC0gJ2EnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKKyAgICAgIH0KKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoJ0EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICdaJykgeworICAgICAgaWYgKGkgPT0gMCAmJiAhY2FwX25leHRfbGV0dGVyKSB7CisgICAgICAgIC8vIEZvcmNlIGZpcnN0IGxldHRlciB0byBsb3dlci1jYXNlIHVubGVzcyBleHBsaWNpdGx5IHRvbGQgdG8KKyAgICAgICAgLy8gY2FwaXRhbGl6ZSBpdC4KKyAgICAgICAgcmVzdWx0ICs9IGlucHV0W2ldICsgKCdhJyAtICdBJyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDYXBpdGFsIGxldHRlcnMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBsZWZ0IGFzLWlzLgorICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV07CisgICAgICB9CisgICAgICBjYXBfbmV4dF9sZXR0ZXIgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKCcwJyA8PSBpbnB1dFtpXSAmJiBpbnB1dFtpXSA8PSAnOScpIHsKKyAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNhcF9uZXh0X2xldHRlciA9IHRydWU7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlSW1wbChGaWVsZE5hbWUoZmllbGQpLCBmYWxzZSk7Cit9CisKK3N0cmluZyBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZUltcGwoRmllbGROYW1lKGZpZWxkKSwgdHJ1ZSk7Cit9CisKK3N0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCkgeworICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZUltcGwobWV0aG9kLT5uYW1lKCksIGZhbHNlKTsKK30KKworc3RyaW5nIFN0cmlwUHJvdG8oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICBpZiAoSGFzU3VmZml4U3RyaW5nKGZpbGVuYW1lLCAiLnByb3RvZGV2ZWwiKSkgeworICAgIHJldHVybiBTdHJpcFN1ZmZpeFN0cmluZyhmaWxlbmFtZSwgIi5wcm90b2RldmVsIik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFN0cmlwU3VmZml4U3RyaW5nKGZpbGVuYW1lLCAiLnByb3RvIik7CisgIH0KK30KKworc3RyaW5nIEZpbGVDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgaWYgKGZpbGUtPm9wdGlvbnMoKS5oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgeworICAgIHJldHVybiBmaWxlLT5vcHRpb25zKCkuamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgYmFzZW5hbWU7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IGZpbGUtPm5hbWUoKS5maW5kX2xhc3Rfb2YoJy8nKTsKKyAgICBpZiAobGFzdF9zbGFzaCA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGJhc2VuYW1lID0gZmlsZS0+bmFtZSgpOworICAgIH0gZWxzZSB7CisgICAgICBiYXNlbmFtZSA9IGZpbGUtPm5hbWUoKS5zdWJzdHIobGFzdF9zbGFzaCArIDEpOworICAgIH0KKyAgICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZUltcGwoU3RyaXBQcm90byhiYXNlbmFtZSksIHRydWUpOworICB9Cit9CisKK3N0cmluZyBGaWxlSmF2YVBhY2thZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKworICBpZiAoZmlsZS0+b3B0aW9ucygpLmhhc19qYXZhX3BhY2thZ2UoKSkgeworICAgIHJlc3VsdCA9IGZpbGUtPm9wdGlvbnMoKS5qYXZhX3BhY2thZ2UoKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBrRGVmYXVsdFBhY2thZ2U7CisgICAgaWYgKCFmaWxlLT5wYWNrYWdlKCkuZW1wdHkoKSkgeworICAgICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgcmVzdWx0ICs9ICcuJzsKKyAgICAgIHJlc3VsdCArPSBmaWxlLT5wYWNrYWdlKCk7CisgICAgfQorICB9CisKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgSmF2YVBhY2thZ2VUb0RpcihzdHJpbmcgcGFja2FnZV9uYW1lKSB7CisgIHN0cmluZyBwYWNrYWdlX2RpciA9CisgICAgU3RyaW5nUmVwbGFjZShwYWNrYWdlX25hbWUsICIuIiwgIi8iLCB0cnVlKTsKKyAgaWYgKCFwYWNrYWdlX2Rpci5lbXB0eSgpKSBwYWNrYWdlX2RpciArPSAiLyI7CisgIHJldHVybiBwYWNrYWdlX2RpcjsKK30KKworc3RyaW5nIFRvSmF2YU5hbWUoY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIGlmIChmaWxlLT5vcHRpb25zKCkuamF2YV9tdWx0aXBsZV9maWxlcygpKSB7CisgICAgcmVzdWx0ID0gRmlsZUphdmFQYWNrYWdlKGZpbGUpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IENsYXNzTmFtZShmaWxlKTsKKyAgfQorICBpZiAoIXJlc3VsdC5lbXB0eSgpKSB7CisgICAgcmVzdWx0ICs9ICcuJzsKKyAgfQorICBpZiAoZmlsZS0+cGFja2FnZSgpLmVtcHR5KCkpIHsKKyAgICByZXN1bHQgKz0gZnVsbF9uYW1lOworICB9IGVsc2UgeworICAgIC8vIFN0cmlwIHRoZSBwcm90byBwYWNrYWdlIGZyb20gZnVsbF9uYW1lIHNpbmNlIHdlJ3ZlIHJlcGxhY2VkIGl0IHdpdGgKKyAgICAvLyB0aGUgSmF2YSBwYWNrYWdlLgorICAgIHJlc3VsdCArPSBmdWxsX25hbWUuc3Vic3RyKGZpbGUtPnBhY2thZ2UoKS5zaXplKCkgKyAxKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHN0cmluZyByZXN1bHQgPSBGaWxlSmF2YVBhY2thZ2UoZGVzY3JpcHRvcik7CisgIGlmICghcmVzdWx0LmVtcHR5KCkpIHJlc3VsdCArPSAnLic7CisgIHJlc3VsdCArPSBGaWxlQ2xhc3NOYW1lKGRlc2NyaXB0b3IpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgRmllbGRDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yICpmaWVsZCkgeworICBzdHJpbmcgbmFtZSA9IGZpZWxkLT5uYW1lKCkgKyAiX0ZJRUxEX05VTUJFUiI7CisgIFVwcGVyU3RyaW5nKCZuYW1lKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK0ZpZWxkRGVzY3JpcHRvcjo6VHlwZSBHZXRUeXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIGZpZWxkLT50eXBlKCk7Cit9CisKK0phdmFUeXBlIEdldEphdmFUeXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgc3dpdGNoIChHZXRUeXBlKGZpZWxkKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKKyAgICAgIHJldHVybiBKQVZBVFlQRV9JTlQ7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6CisgICAgICByZXR1cm4gSkFWQVRZUEVfTE9ORzsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIEpBVkFUWVBFX0ZMT0FUOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIEpBVkFUWVBFX0RPVUJMRTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gSkFWQVRZUEVfQk9PTEVBTjsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiBKQVZBVFlQRV9TVFJJTkc7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKKyAgICAgIHJldHVybiBKQVZBVFlQRV9CWVRFUzsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06CisgICAgICByZXR1cm4gSkFWQVRZUEVfRU5VTTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgICByZXR1cm4gSkFWQVRZUEVfTUVTU0FHRTsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBKQVZBVFlQRV9JTlQ7Cit9CisKK2NvbnN0IGNoYXIqIEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoSmF2YVR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEpBVkFUWVBFX0lOVCAgICA6IHJldHVybiAiamF2YS5sYW5nLkludGVnZXIiOworICAgIGNhc2UgSkFWQVRZUEVfTE9ORyAgIDogcmV0dXJuICJqYXZhLmxhbmcuTG9uZyI7CisgICAgY2FzZSBKQVZBVFlQRV9GTE9BVCAgOiByZXR1cm4gImphdmEubGFuZy5GbG9hdCI7CisgICAgY2FzZSBKQVZBVFlQRV9ET1VCTEUgOiByZXR1cm4gImphdmEubGFuZy5Eb3VibGUiOworICAgIGNhc2UgSkFWQVRZUEVfQk9PTEVBTjogcmV0dXJuICJqYXZhLmxhbmcuQm9vbGVhbiI7CisgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkcgOiByZXR1cm4gImphdmEubGFuZy5TdHJpbmciOworICAgIGNhc2UgSkFWQVRZUEVfQllURVMgIDogcmV0dXJuICJjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmciOworICAgIGNhc2UgSkFWQVRZUEVfRU5VTSAgIDogcmV0dXJuIE5VTEw7CisgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOiByZXR1cm4gTlVMTDsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gSmF2YVR5cGVzIGFyZSBhZGRlZC4KKyAgfQorCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gTlVMTDsKK30KKworYm9vbCBBbGxBc2NpaShjb25zdCBzdHJpbmcmIHRleHQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0LnNpemUoKTsgaSsrKSB7CisgICAgaWYgKCh0ZXh0W2ldICYgMHg4MCkgIT0gMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RyaW5nIERlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIFN3aXRjaCBvbiBDcHBUeXBlIHNpbmNlIHdlIG5lZWQgdG8ga25vdyB3aGljaCBkZWZhdWx0X3ZhbHVlXyogbWV0aG9kCisgIC8vIG9mIEZpZWxkRGVzY3JpcHRvciB0byBjYWxsLgorICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gU2ltcGxlSXRvYShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICAvLyBOZWVkIHRvIHByaW50IGFzIGEgc2lnbmVkIGludCBzaW5jZSBKYXZhIGhhcyBubyB1bnNpZ25lZC4KKyAgICAgIHJldHVybiBTaW1wbGVJdG9hKHN0YXRpY19jYXN0PGludDMyPihmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50MzIoKSkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50NjQoKSkgKyAiTCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgcmV0dXJuIFNpbXBsZUl0b2Eoc3RhdGljX2Nhc3Q8aW50NjQ+KGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKSkgKworICAgICAgICAgICAgICJMIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKKyAgICAgIGRvdWJsZSB2YWx1ZSA9IGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2RvdWJsZSgpOworICAgICAgaWYgKHZhbHVlID09IG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKKyAgICAgICAgcmV0dXJuICJEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgeworICAgICAgICByZXR1cm4gIkRvdWJsZS5ORUdBVElWRV9JTkZJTklUWSI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAiRG91YmxlLk5hTiI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU2ltcGxlRHRvYSh2YWx1ZSkgKyAiRCI7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CisgICAgICBmbG9hdCB2YWx1ZSA9IGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0KCk7CisgICAgICBpZiAodmFsdWUgPT0gbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7CisgICAgICAgIHJldHVybiAiRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7CisgICAgICAgIHJldHVybiAiRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gIkZsb2F0Lk5hTiI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU2ltcGxlRnRvYSh2YWx1ZSkgKyAiRiI7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfYm9vbCgpID8gInRydWUiIDogImZhbHNlIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICBpZiAoR2V0VHlwZShmaWVsZCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKSB7CisgICAgICAgIGlmIChmaWVsZC0+aGFzX2RlZmF1bHRfdmFsdWUoKSkgeworICAgICAgICAgIC8vIFNlZSBjb21tZW50cyBpbiBJbnRlcm5hbC5qYXZhIGZvciBnb3J5IGRldGFpbHMuCisgICAgICAgICAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5ieXRlc0RlZmF1bHRWYWx1ZShcIiQwXCIpIiwKKyAgICAgICAgICAgIENFc2NhcGUoZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5FTVBUWSI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChBbGxBc2NpaShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkpIHsKKyAgICAgICAgICAvLyBBbGwgY2hhcnMgYXJlIEFTQ0lJLiAgSW4gdGhpcyBjYXNlIENFc2NhcGUoKSB3b3JrcyBmaW5lLgorICAgICAgICAgIHJldHVybiAiXCIiICsgQ0VzY2FwZShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkgKyAiXCIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFNlZSBjb21tZW50cyBpbiBJbnRlcm5hbC5qYXZhIGZvciBnb3J5IGRldGFpbHMuCisgICAgICAgICAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5zdHJpbmdEZWZhdWx0VmFsdWUoXCIkMFwiKSIsCisgICAgICAgICAgICBDRXNjYXBlKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gQ2xhc3NOYW1lKGZpZWxkLT5lbnVtX3R5cGUoKSkgKyAiLiIgKworICAgICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bmFtZSgpOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiBDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSArICIuZ2V0RGVmYXVsdEluc3RhbmNlKCkiOworCisgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuICIiOworfQorCitib29sIElzRGVmYXVsdFZhbHVlSmF2YURlZmF1bHQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAvLyBTd2l0Y2ggb24gQ3BwVHlwZSBzaW5jZSB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggZGVmYXVsdF92YWx1ZV8qIG1ldGhvZAorICAvLyBvZiBGaWVsZERlc2NyaXB0b3IgdG8gY2FsbC4KKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDMyKCkgPT0gMDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDMyKCkgPT0gMDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpID09IDBMOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSA9PSAwTDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfZG91YmxlKCkgPT0gMC4wOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0KCkgPT0gMC4wOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfYm9vbCgpID09IGZhbHNlOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBmYWxzZTsKK30KKworY29uc3QgY2hhciogYml0X21hc2tzW10gPSB7CisgICIweDAwMDAwMDAxIiwKKyAgIjB4MDAwMDAwMDIiLAorICAiMHgwMDAwMDAwNCIsCisgICIweDAwMDAwMDA4IiwKKyAgIjB4MDAwMDAwMTAiLAorICAiMHgwMDAwMDAyMCIsCisgICIweDAwMDAwMDQwIiwKKyAgIjB4MDAwMDAwODAiLAorCisgICIweDAwMDAwMTAwIiwKKyAgIjB4MDAwMDAyMDAiLAorICAiMHgwMDAwMDQwMCIsCisgICIweDAwMDAwODAwIiwKKyAgIjB4MDAwMDEwMDAiLAorICAiMHgwMDAwMjAwMCIsCisgICIweDAwMDA0MDAwIiwKKyAgIjB4MDAwMDgwMDAiLAorCisgICIweDAwMDEwMDAwIiwKKyAgIjB4MDAwMjAwMDAiLAorICAiMHgwMDA0MDAwMCIsCisgICIweDAwMDgwMDAwIiwKKyAgIjB4MDAxMDAwMDAiLAorICAiMHgwMDIwMDAwMCIsCisgICIweDAwNDAwMDAwIiwKKyAgIjB4MDA4MDAwMDAiLAorCisgICIweDAxMDAwMDAwIiwKKyAgIjB4MDIwMDAwMDAiLAorICAiMHgwNDAwMDAwMCIsCisgICIweDA4MDAwMDAwIiwKKyAgIjB4MTAwMDAwMDAiLAorICAiMHgyMDAwMDAwMCIsCisgICIweDQwMDAwMDAwIiwKKyAgIjB4ODAwMDAwMDAiLAorfTsKKworc3RyaW5nIEdldEJpdEZpZWxkTmFtZShpbnQgaW5kZXgpIHsKKyAgc3RyaW5nIHZhck5hbWUgPSAiYml0RmllbGQiOworICB2YXJOYW1lICs9IFNpbXBsZUl0b2EoaW5kZXgpOworICB2YXJOYW1lICs9ICJfIjsKKyAgcmV0dXJuIHZhck5hbWU7Cit9CisKK3N0cmluZyBHZXRCaXRGaWVsZE5hbWVGb3JCaXQoaW50IGJpdEluZGV4KSB7CisgIHJldHVybiBHZXRCaXRGaWVsZE5hbWUoYml0SW5kZXggLyAzMik7Cit9CisKK3N0cmluZyBHZW5lcmF0ZUdldEJpdChpbnQgYml0SW5kZXgpIHsKKyAgc3RyaW5nIHZhck5hbWUgPSBHZXRCaXRGaWVsZE5hbWVGb3JCaXQoYml0SW5kZXgpOworICBpbnQgYml0SW5WYXJJbmRleCA9IGJpdEluZGV4ICUgMzI7CisKKyAgc3RyaW5nIG1hc2sgPSBiaXRfbWFza3NbYml0SW5WYXJJbmRleF07CisgIHN0cmluZyByZXN1bHQgPSAiKCgiICsgdmFyTmFtZSArICIgJiAiICsgbWFzayArICIpID09ICIgKyBtYXNrICsgIikiOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgR2VuZXJhdGVTZXRCaXQoaW50IGJpdEluZGV4KSB7CisgIHN0cmluZyB2YXJOYW1lID0gR2V0Qml0RmllbGROYW1lRm9yQml0KGJpdEluZGV4KTsKKyAgaW50IGJpdEluVmFySW5kZXggPSBiaXRJbmRleCAlIDMyOworCisgIHN0cmluZyBtYXNrID0gYml0X21hc2tzW2JpdEluVmFySW5kZXhdOworICBzdHJpbmcgcmVzdWx0ID0gdmFyTmFtZSArICIgfD0gIiArIG1hc2s7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyBHZW5lcmF0ZUNsZWFyQml0KGludCBiaXRJbmRleCkgeworICBzdHJpbmcgdmFyTmFtZSA9IEdldEJpdEZpZWxkTmFtZUZvckJpdChiaXRJbmRleCk7CisgIGludCBiaXRJblZhckluZGV4ID0gYml0SW5kZXggJSAzMjsKKworICBzdHJpbmcgbWFzayA9IGJpdF9tYXNrc1tiaXRJblZhckluZGV4XTsKKyAgc3RyaW5nIHJlc3VsdCA9IHZhck5hbWUgKyAiID0gKCIgKyB2YXJOYW1lICsgIiAmIH4iICsgbWFzayArICIpIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIEdlbmVyYXRlR2V0Qml0RnJvbUxvY2FsKGludCBiaXRJbmRleCkgeworICBzdHJpbmcgdmFyTmFtZSA9ICJmcm9tXyIgKyBHZXRCaXRGaWVsZE5hbWVGb3JCaXQoYml0SW5kZXgpOworICBpbnQgYml0SW5WYXJJbmRleCA9IGJpdEluZGV4ICUgMzI7CisKKyAgc3RyaW5nIG1hc2sgPSBiaXRfbWFza3NbYml0SW5WYXJJbmRleF07CisgIHN0cmluZyByZXN1bHQgPSAiKCgiICsgdmFyTmFtZSArICIgJiAiICsgbWFzayArICIpID09ICIgKyBtYXNrICsgIikiOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgR2VuZXJhdGVTZXRCaXRUb0xvY2FsKGludCBiaXRJbmRleCkgeworICBzdHJpbmcgdmFyTmFtZSA9ICJ0b18iICsgR2V0Qml0RmllbGROYW1lRm9yQml0KGJpdEluZGV4KTsKKyAgaW50IGJpdEluVmFySW5kZXggPSBiaXRJbmRleCAlIDMyOworCisgIHN0cmluZyBtYXNrID0gYml0X21hc2tzW2JpdEluVmFySW5kZXhdOworICBzdHJpbmcgcmVzdWx0ID0gdmFyTmFtZSArICIgfD0gIiArIG1hc2s7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlZmQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0hFTFBFUlNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0hFTFBFUlNfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCisvLyBDb21tb25seS11c2VkIHNlcGFyYXRvciBjb21tZW50cy4gIFRoaWNrIGlzIGEgbGluZSBvZiAnPScsIHRoaW4gaXMgYSBsaW5lCisvLyBvZiAnLScuCitleHRlcm4gY29uc3QgY2hhciBrVGhpY2tTZXBhcmF0b3JbXTsKK2V4dGVybiBjb25zdCBjaGFyIGtUaGluU2VwYXJhdG9yW107CisKKy8vIENvbnZlcnRzIHRoZSBmaWVsZCdzIG5hbWUgdG8gY2FtZWwtY2FzZSwgZS5nLiAiZm9vX2Jhcl9iYXoiIGJlY29tZXMKKy8vICJmb29CYXJCYXoiIG9yICJGb29CYXJCYXoiLCByZXNwZWN0aXZlbHkuCitzdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKK3N0cmluZyBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKy8vIFNpbWlsYXIsIGJ1dCBmb3IgbWV0aG9kIG5hbWVzLiAgKFR5cGljYWxseSwgdGhpcyBtZXJlbHkgaGFzIHRoZSBlZmZlY3QKKy8vIG9mIGxvd2VyLWNhc2luZyB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBuYW1lLikKK3N0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCk7CisKKy8vIFN0cmlwcyAiLnByb3RvIiBvciAiLnByb3RvZGV2ZWwiIGZyb20gdGhlIGVuZCBvZiBhIGZpbGVuYW1lLgorc3RyaW5nIFN0cmlwUHJvdG8oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisKKy8vIEdldHMgdGhlIHVucXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBmaWxlLiAgRWFjaCAucHJvdG8gZmlsZSBiZWNvbWVzIGEKKy8vIHNpbmdsZSBKYXZhIGNsYXNzLCB3aXRoIGFsbCBpdHMgY29udGVudHMgbmVzdGVkIGluIHRoYXQgY2xhc3MuCitzdHJpbmcgRmlsZUNsYXNzTmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisKKy8vIFJldHVybnMgdGhlIGZpbGUncyBKYXZhIHBhY2thZ2UgbmFtZS4KK3N0cmluZyBGaWxlSmF2YVBhY2thZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworCisvLyBSZXR1cm5zIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUuCitzdHJpbmcgSmF2YVBhY2thZ2VUb0RpcihzdHJpbmcgcGFja2FnZV9uYW1lKTsKKworLy8gQ29udmVydHMgdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGluIHRoZSBwcm90byBuYW1lc3BhY2UgdG8gaXRzCisvLyBmdWxseS1xdWFsaWZpZWQgbmFtZSBpbiB0aGUgSmF2YSBuYW1lc3BhY2UsIGdpdmVuIHRoYXQgaXQgaXMgaW4gdGhlIGdpdmVuCisvLyBmaWxlLgorc3RyaW5nIFRvSmF2YU5hbWUoY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworLy8gVGhlc2UgcmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgorLy8gZGVzY3JpcHRvci4KK2lubGluZSBzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIFRvSmF2YU5hbWUoZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCksIGRlc2NyaXB0b3ItPmZpbGUoKSk7Cit9CitpbmxpbmUgc3RyaW5nIENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gVG9KYXZhTmFtZShkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSwgZGVzY3JpcHRvci0+ZmlsZSgpKTsKK30KK2lubGluZSBzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBUb0phdmFOYW1lKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLCBkZXNjcmlwdG9yLT5maWxlKCkpOworfQoraW5saW5lIHN0cmluZyBFeHRlbnNpb25JZGVudGlmaWVyTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIFRvSmF2YU5hbWUoZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCksIGRlc2NyaXB0b3ItPmZpbGUoKSk7Cit9CitzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworLy8gR2V0IHRoZSB1bnF1YWxpZmllZCBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEgZmllbGQncyBmaWVsZAorLy8gbnVtYmVyIGNvbnN0YW50Lgorc3RyaW5nIEZpZWxkQ29uc3RhbnROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciAqZmllbGQpOworCisvLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBGaWVsZERlc2NyaXB0b3IuCisvLyBUaGlzIGRvZXMgbm90aGluZyBpbnRlcmVzdGluZyBmb3IgdGhlIG9wZW4gc291cmNlIHJlbGVhc2UsIGJ1dCBpcyB1c2VkIGZvcgorLy8gaGFja3MgdGhhdCBpbXByb3ZlIGNvbXBhdGFiaWxpdHkgd2l0aCB2ZXJzaW9uIDEgcHJvdG9jb2wgYnVmZmVycyBhdCBHb29nbGUuCitGaWVsZERlc2NyaXB0b3I6OlR5cGUgR2V0VHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworZW51bSBKYXZhVHlwZSB7CisgIEpBVkFUWVBFX0lOVCwKKyAgSkFWQVRZUEVfTE9ORywKKyAgSkFWQVRZUEVfRkxPQVQsCisgIEpBVkFUWVBFX0RPVUJMRSwKKyAgSkFWQVRZUEVfQk9PTEVBTiwKKyAgSkFWQVRZUEVfU1RSSU5HLAorICBKQVZBVFlQRV9CWVRFUywKKyAgSkFWQVRZUEVfRU5VTSwKKyAgSkFWQVRZUEVfTUVTU0FHRQorfTsKKworSmF2YVR5cGUgR2V0SmF2YVR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKy8vIEdldCB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIGEgYm94ZWQgcHJpbWl0aXZlIHR5cGUsIGUuZy4KKy8vICJqYXZhLmxhbmcuSW50ZWdlciIgZm9yIEpBVkFUWVBFX0lOVC4gIFJldHVybnMgTlVMTCBmb3IgZW51bSBhbmQgbWVzc2FnZQorLy8gdHlwZXMuCitjb25zdCBjaGFyKiBCb3hlZFByaW1pdGl2ZVR5cGVOYW1lKEphdmFUeXBlIHR5cGUpOworCitzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworYm9vbCBJc0RlZmF1bHRWYWx1ZUphdmFEZWZhdWx0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisvLyBEb2VzIHRoaXMgbWVzc2FnZSBjbGFzcyBrZWVwIHRyYWNrIG9mIHVua25vd24gZmllbGRzPworaW5saW5lIGJvb2wgSGFzVW5rbm93bkZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5maWxlKCktPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPQorICAgICAgICAgICBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FIHx8CisgICAgICAgICBkZXNjcmlwdG9yLT5maWxlKCktPm9wdGlvbnMoKS5yZXRhaW5fdW5rbm93bl9maWVsZHMoKTsKK30KKworLy8gRG9lcyB0aGlzIG1lc3NhZ2UgY2xhc3MgaGF2ZSBnZW5lcmF0ZWQgcGFyc2luZywgc2VyaWFsaXphdGlvbiwgYW5kIG90aGVyCisvLyBzdGFuZGFyZCBtZXRob2RzIGZvciB3aGljaCByZWZsZWN0aW9uLWJhc2VkIGZhbGxiYWNrIGltcGxlbWVudGF0aW9ucyBleGlzdD8KK2lubGluZSBib29sIEhhc0dlbmVyYXRlZE1ldGhvZHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0KKyAgICAgICAgICAgRmlsZU9wdGlvbnM6OkNPREVfU0laRTsKK30KKworLy8gRG9lcyB0aGlzIG1lc3NhZ2UgaGF2ZSBzcGVjaWFsaXplZCBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKSBtZXRob2RzPworaW5saW5lIGJvb2wgSGFzRXF1YWxzQW5kSGFzaENvZGUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkuamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKK30KKworLy8gRG9lcyB0aGlzIG1lc3NhZ2UgY2xhc3MgaGF2ZSBkZXNjcmlwdG9yIGFuZCByZWZsZWN0aW9uIG1ldGhvZHM/CitpbmxpbmUgYm9vbCBIYXNEZXNjcmlwdG9yTWV0aG9kcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5maWxlKCktPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPQorICAgICAgICAgICBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOworfQoraW5saW5lIGJvb2wgSGFzRGVzY3JpcHRvck1ldGhvZHMoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPmZpbGUoKS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9CisgICAgICAgICAgIEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Cit9CitpbmxpbmUgYm9vbCBIYXNEZXNjcmlwdG9yTWV0aG9kcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvci0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9CisgICAgICAgICAgIEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Cit9CisKK2lubGluZSBib29sIEhhc05lc3RlZEJ1aWxkZXJzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgLy8gVGhlIHByb3RvLWxpdGUgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgbmVzdGVkIGJ1aWxkZXJzLgorICByZXR1cm4gZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0KKyAgICAgICAgICAgRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKK30KKworLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGdlbmVyaWMgc2VydmljZXMgZm9yIHRoaXMgZmlsZT8KK2lubGluZSBib29sIEhhc0dlbmVyaWNTZXJ2aWNlcyhjb25zdCBGaWxlRGVzY3JpcHRvciAqZmlsZSkgeworICByZXR1cm4gZmlsZS0+c2VydmljZV9jb3VudCgpID4gMCAmJgorICAgICAgICAgZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUUgJiYKKyAgICAgICAgIGZpbGUtPm9wdGlvbnMoKS5qYXZhX2dlbmVyaWNfc2VydmljZXMoKTsKK30KKworCisvLyBNZXRob2RzIGZvciBzaGFyZWQgYml0ZmllbGRzLgorCisvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgYml0ZmllbGQgZm9yIHRoZSBnaXZlbiBpbmRleC4KK3N0cmluZyBHZXRCaXRGaWVsZE5hbWUoaW50IGluZGV4KTsKKworLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGJpdGZpZWxkIGZvciB0aGUgZ2l2ZW4gYml0IGluZGV4LgorLy8gRWZmZWN0aXZlbHksIEdldEJpdEZpZWxkTmFtZShiaXRJbmRleCAvIDMyKQorc3RyaW5nIEdldEJpdEZpZWxkTmFtZUZvckJpdChpbnQgYml0SW5kZXgpOworCisvLyBHZW5lcmF0ZXMgdGhlIGphdmEgY29kZSBmb3IgdGhlIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRoZSBib29sZWFuIHZhbHVlCisvLyBvZiB0aGUgYml0IG9mIHRoZSBzaGFyZWQgYml0ZmllbGRzIGZvciB0aGUgZ2l2ZW4gYml0IGluZGV4LgorLy8gRXhhbXBsZTogIigoYml0RmllbGQxXyAmIDB4MDQpID09IDB4MDQpIgorc3RyaW5nIEdlbmVyYXRlR2V0Qml0KGludCBiaXRJbmRleCk7CisKKy8vIEdlbmVyYXRlcyB0aGUgamF2YSBjb2RlIGZvciB0aGUgZXhwcmVzc2lvbiB0aGF0IHNldHMgdGhlIGJpdCBvZiB0aGUgc2hhcmVkCisvLyBiaXRmaWVsZHMgZm9yIHRoZSBnaXZlbiBiaXQgaW5kZXguCisvLyBFeGFtcGxlOiAiYml0RmllbGQxXyA9IChiaXRGaWVsZDFfIHwgMHgwNCkiCitzdHJpbmcgR2VuZXJhdGVTZXRCaXQoaW50IGJpdEluZGV4KTsKKworLy8gR2VuZXJhdGVzIHRoZSBqYXZhIGNvZGUgZm9yIHRoZSBleHByZXNzaW9uIHRoYXQgY2xlYXJzIHRoZSBiaXQgb2YgdGhlIHNoYXJlZAorLy8gYml0ZmllbGRzIGZvciB0aGUgZ2l2ZW4gYml0IGluZGV4LgorLy8gRXhhbXBsZTogImJpdEZpZWxkMV8gPSAoYml0RmllbGQxXyAmIH4weDA0KSIKK3N0cmluZyBHZW5lcmF0ZUNsZWFyQml0KGludCBiaXRJbmRleCk7CisKKy8vIERvZXMgdGhlIHNhbWUgYXMgR2VuZXJhdGVHZXRCaXQgYnV0IG9wZXJhdGVzIG9uIHRoZSBiaXQgZmllbGQgb24gYSBsb2NhbAorLy8gdmFyaWFibGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgYnVpbGRlciB0byBjb3B5IHRoZSB2YWx1ZSBpbiB0aGUgYnVpbGRlciB0bworLy8gdGhlIG1lc3NhZ2UuCisvLyBFeGFtcGxlOiAiKChmcm9tX2JpdEZpZWxkMV8gJiAweDA0KSA9PSAweDA0KSIKK3N0cmluZyBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChpbnQgYml0SW5kZXgpOworCisvLyBEb2VzIHRoZSBzYW1lIGFzIEdlbmVyYXRlU2V0Qml0IGJ1dCBvcGVyYXRlcyBvbiB0aGUgYml0IGZpZWxkIG9uIGEgbG9jYWwKKy8vIHZhcmlhYmxlLiBUaGlzIGlzIHVzZWQgYnkgdGhlIGJ1aWxkZXIgdG8gY29weSB0aGUgdmFsdWUgaW4gdGhlIGJ1aWxkZXIgdG8KKy8vIHRoZSBtZXNzYWdlLgorLy8gRXhhbXBsZTogInRvX2JpdEZpZWxkMV8gPSAodG9fYml0RmllbGQxXyB8IDB4MDQpIgorc3RyaW5nIEdlbmVyYXRlU2V0Qml0VG9Mb2NhbChpbnQgYml0SW5kZXgpOworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9IRUxQRVJTX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzA4N2RiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuY2MKQEAgLTAsMCArMSwxMjg3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTsKKworbmFtZXNwYWNlIHsKKwordm9pZCBQcmludEZpZWxkQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAvLyBQcmludCB0aGUgZmllbGQncyBwcm90by1zeW50YXggZGVmaW5pdGlvbiBhcyBhIGNvbW1lbnQuICBXZSBkb24ndCB3YW50IHRvCisgIC8vIHByaW50IGdyb3VwIGJvZGllcyBzbyB3ZSBjdXQgb2ZmIGFmdGVyIHRoZSBmaXJzdCBsaW5lLgorICBzdHJpbmcgZGVmID0gZmllbGQtPkRlYnVnU3RyaW5nKCk7CisgIHByaW50ZXItPlByaW50KCIvLyAkZGVmJFxuIiwKKyAgICAiZGVmIiwgZGVmLnN1YnN0cigwLCBkZWYuZmluZF9maXJzdF9vZignXG4nKSkpOworfQorCitzdHJ1Y3QgRmllbGRPcmRlcmluZ0J5TnVtYmVyIHsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiKSBjb25zdCB7CisgICAgcmV0dXJuIGEtPm51bWJlcigpIDwgYi0+bnVtYmVyKCk7CisgIH0KK307CisKK3N0cnVjdCBFeHRlbnNpb25SYW5nZU9yZGVyaW5nIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiBhLAorICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYS0+c3RhcnQgPCBiLT5zdGFydDsKKyAgfQorfTsKKworLy8gU29ydCB0aGUgZmllbGRzIG9mIHRoZSBnaXZlbiBEZXNjcmlwdG9yIGJ5IG51bWJlciBpbnRvIGEgbmV3W10nZCBhcnJheQorLy8gYW5kIHJldHVybiBpdC4KK2NvbnN0IEZpZWxkRGVzY3JpcHRvcioqIFNvcnRGaWVsZHNCeU51bWJlcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioqIGZpZWxkcyA9CisgICAgbmV3IGNvbnN0IEZpZWxkRGVzY3JpcHRvcipbZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKV07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRzW2ldID0gZGVzY3JpcHRvci0+ZmllbGQoaSk7CisgIH0KKyAgc29ydChmaWVsZHMsIGZpZWxkcyArIGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCksCisgICAgICAgRmllbGRPcmRlcmluZ0J5TnVtYmVyKCkpOworICByZXR1cm4gZmllbGRzOworfQorCisvLyBHZXQgYW4gaWRlbnRpZmllciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyB0eXBlIHdpdGhpbiB0aGUgZmlsZS4KKy8vIFRoaXMgaXMgdXNlZCB0byBkZWNsYXJlIHN0YXRpYyB2YXJpYWJsZXMgcmVsYXRlZCB0byB0aGlzIHR5cGUgYXQgdGhlCisvLyBvdXRlcm1vc3QgZmlsZSBzY29wZS4KK3N0cmluZyBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuICJzdGF0aWNfIiArIFN0cmluZ1JlcGxhY2UoZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCksICIuIiwgIl8iLCB0cnVlKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzYWdlIHR5cGUgaGFzIGFueSByZXF1aXJlZCBmaWVsZHMuICBJZiBpdCBkb2Vzbid0LAorLy8gd2UgY2FuIG9wdGltaXplIG91dCBjYWxscyB0byBpdHMgaXNJbml0aWFsaXplZCgpIG1ldGhvZC4KKy8vCisvLyBhbHJlYWR5X3NlZW4gaXMgdXNlZCB0byBhdm9pZCBjaGVja2luZyB0aGUgc2FtZSB0eXBlIG11bHRpcGxlIHRpbWVzCisvLyAoYW5kIGFsc28gdG8gcHJvdGVjdCBhZ2FpbnN0IHJlY3Vyc2lvbikuCitzdGF0aWMgYm9vbCBIYXNSZXF1aXJlZEZpZWxkcygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlLAorICAgIGhhc2hfc2V0PGNvbnN0IERlc2NyaXB0b3IqPiogYWxyZWFkeV9zZWVuKSB7CisgIGlmIChhbHJlYWR5X3NlZW4tPmNvdW50KHR5cGUpID4gMCkgeworICAgIC8vIFRoZSB0eXBlIGlzIGFscmVhZHkgaW4gY2FjaGUuICBUaGlzIG1lYW5zIHRoYXQgZWl0aGVyOgorICAgIC8vIGEuIFRoZSB0eXBlIGhhcyBubyByZXF1aXJlZCBmaWVsZHMuCisgICAgLy8gYi4gV2UgYXJlIGluIHRoZSBtaWRzdCBvZiBjaGVja2luZyBpZiB0aGUgdHlwZSBoYXMgcmVxdWlyZWQgZmllbGRzLAorICAgIC8vICAgIHNvbWV3aGVyZSB1cCB0aGUgc3RhY2suICBJbiB0aGlzIGNhc2UsIHdlIGtub3cgdGhhdCBpZiB0aGUgdHlwZQorICAgIC8vICAgIGhhcyBhbnkgcmVxdWlyZWQgZmllbGRzLCB0aGV5J2xsIGJlIGZvdW5kIHdoZW4gd2UgcmV0dXJuIHRvIGl0LAorICAgIC8vICAgIGFuZCB0aGUgd2hvbGUgY2FsbCB0byBIYXNSZXF1aXJlZEZpZWxkcygpIHdpbGwgcmV0dXJuIHRydWUuCisgICAgLy8gICAgVGhlcmVmb3JlLCB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGlmIHRoaXMgdHlwZSBoYXMgcmVxdWlyZWQgZmllbGRzCisgICAgLy8gICAgaGVyZS4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYWxyZWFkeV9zZWVuLT5pbnNlcnQodHlwZSk7CisKKyAgLy8gSWYgdGhlIHR5cGUgaGFzIGV4dGVuc2lvbnMsIGFuIGV4dGVuc2lvbiB3aXRoIG1lc3NhZ2UgdHlwZSBjb3VsZCBjb250YWluCisgIC8vIHJlcXVpcmVkIGZpZWxkcywgc28gd2UgaGF2ZSB0byBiZSBjb25zZXJ2YXRpdmUgYW5kIGFzc3VtZSBzdWNoIGFuCisgIC8vIGV4dGVuc2lvbiBleGlzdHMuCisgIGlmICh0eXBlLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHJldHVybiB0cnVlOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IHR5cGUtPmZpZWxkKGkpOworICAgIGlmIChmaWVsZC0+aXNfcmVxdWlyZWQoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChHZXRKYXZhVHlwZShmaWVsZCkgPT0gSkFWQVRZUEVfTUVTU0FHRSkgeworICAgICAgaWYgKEhhc1JlcXVpcmVkRmllbGRzKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgYWxyZWFkeV9zZWVuKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIEhhc1JlcXVpcmVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIHsKKyAgaGFzaF9zZXQ8Y29uc3QgRGVzY3JpcHRvcio+IGFscmVhZHlfc2VlbjsKKyAgcmV0dXJuIEhhc1JlcXVpcmVkRmllbGRzKHR5cGUsICZhbHJlYWR5X3NlZW4pOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitNZXNzYWdlR2VuZXJhdG9yOjpNZXNzYWdlR2VuZXJhdG9yKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCisgICAgZmllbGRfZ2VuZXJhdG9yc18oZGVzY3JpcHRvcikgeworfQorCitNZXNzYWdlR2VuZXJhdG9yOjp+TWVzc2FnZUdlbmVyYXRvcigpIHt9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIC8vIEJlY2F1c2UgZGVzY3JpcHRvci5wcm90byAoY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zKSBpcworICAgIC8vIHVzZWQgaW4gdGhlIGNvbnN0cnVjdGlvbiBvZiBkZXNjcmlwdG9ycywgd2UgaGF2ZSBhIHRyaWNreSBib290c3RyYXBwaW5nCisgICAgLy8gcHJvYmxlbS4gIFRvIGhlbHAgY29udHJvbCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb3JkZXIsIHdlIG1ha2Ugc3VyZSBhbGwKKyAgICAvLyBkZXNjcmlwdG9ycyBhbmQgb3RoZXIgc3RhdGljIGRhdGEgdGhhdCBkZXBlbmRzIG9uIHRoZW0gYXJlIG1lbWJlcnMgb2YKKyAgICAvLyB0aGUgb3V0ZXJtb3N0IGNsYXNzIGluIHRoZSBmaWxlLiAgVGhpcyB3YXksIHRoZXkgd2lsbCBiZSBpbml0aWFsaXplZCBpbgorICAgIC8vIGEgZGV0ZXJtaW5pc3RpYyBvcmRlci4KKworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJpZGVudGlmaWVyIl0gPSBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGRlc2NyaXB0b3JfKTsKKyAgICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+aW5kZXgoKSk7CisgICAgdmFyc1siY2xhc3NuYW1lIl0gPSBDbGFzc05hbWUoZGVzY3JpcHRvcl8pOworICAgIGlmIChkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkgIT0gTlVMTCkgeworICAgICAgdmFyc1sicGFyZW50Il0gPSBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKAorICAgICAgICAgIGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdG9yXy0+ZmlsZSgpLT5vcHRpb25zKCkuamF2YV9tdWx0aXBsZV9maWxlcygpKSB7CisgICAgICAvLyBXZSBjYW4gb25seSBtYWtlIHRoZXNlIHBhY2thZ2UtcHJpdmF0ZSBzaW5jZSB0aGUgY2xhc3NlcyB0aGF0IHVzZSB0aGVtCisgICAgICAvLyBhcmUgaW4gc2VwYXJhdGUgZmlsZXMuCisgICAgICB2YXJzWyJwcml2YXRlIl0gPSAiIjsKKyAgICB9IGVsc2UgeworICAgICAgdmFyc1sicHJpdmF0ZSJdID0gInByaXZhdGUgIjsKKyAgICB9CisKKyAgICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyB0eXBlLgorICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiJHByaXZhdGUkc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvclxuIgorICAgICAgIiAgaW50ZXJuYWxfJGlkZW50aWZpZXIkX2Rlc2NyaXB0b3I7XG4iKTsKKworICAgIC8vIEFuZCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlLgorICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiJHByaXZhdGUkc3RhdGljXG4iCisgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRmllbGRBY2Nlc3NvclRhYmxlXG4iCisgICAgICAiICAgIGludGVybmFsXyRpZGVudGlmaWVyJF9maWVsZEFjY2Vzc29yVGFibGU7XG4iKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHN0YXRpYyBtZW1iZXJzIGZvciBhbGwgbmVzdGVkIHR5cGVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAvLyBUT0RPKGtlbnRvbik6ICBSZXVzZSBNZXNzYWdlR2VuZXJhdG9yIG9iamVjdHM/CisgICAgTWVzc2FnZUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpCisgICAgICAuR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMocHJpbnRlcik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgICAgdmFyc1siaWRlbnRpZmllciJdID0gVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXyk7CisgICAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPmluZGV4KCkpOworICAgIHZhcnNbImNsYXNzbmFtZSJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKTsKKyAgICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIHsKKyAgICAgIHZhcnNbInBhcmVudCJdID0gVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcigKKyAgICAgICAgICBkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpOworICAgIH0KKworICAgIC8vIFRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIHR5cGUuCisgICAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAiaW50ZXJuYWxfJGlkZW50aWZpZXIkX2Rlc2NyaXB0b3IgPVxuIgorICAgICAgICAiICBnZXREZXNjcmlwdG9yKCkuZ2V0TWVzc2FnZVR5cGVzKCkuZ2V0KCRpbmRleCQpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICJpbnRlcm5hbF8kaWRlbnRpZmllciRfZGVzY3JpcHRvciA9XG4iCisgICAgICAgICIgIGludGVybmFsXyRwYXJlbnQkX2Rlc2NyaXB0b3IuZ2V0TmVzdGVkVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iKTsKKyAgICB9CisKKyAgICAvLyBBbmQgdGhlIEZpZWxkQWNjZXNzb3JUYWJsZS4KKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgImludGVybmFsXyRpZGVudGlmaWVyJF9maWVsZEFjY2Vzc29yVGFibGUgPSBuZXdcbiIKKyAgICAgICIgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5GaWVsZEFjY2Vzc29yVGFibGUoXG4iCisgICAgICAiICAgIGludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yLFxuIgorICAgICAgIiAgICBuZXcgamF2YS5sYW5nLlN0cmluZ1tdIHsgIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIlwiJGZpZWxkX25hbWUkXCIsICIsCisgICAgICAgICJmaWVsZF9uYW1lIiwKKyAgICAgICAgICBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSk7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KCJ9LFxuIgorICAgICAgIiAgICAkY2xhc3NuYW1lJC5jbGFzcyxcbiIKKyAgICAgICIgICAgJGNsYXNzbmFtZSQuQnVpbGRlci5jbGFzcyk7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICB9CisKKyAgLy8gR2VuZXJhdGUgc3RhdGljIG1lbWJlciBpbml0aWFsaXplcnMgZm9yIGFsbCBuZXN0ZWQgdHlwZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIC8vIFRPRE8oa2VudG9uKTogIFJldXNlIE1lc3NhZ2VHZW5lcmF0b3Igb2JqZWN0cz8KKyAgICBNZXNzYWdlR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSkKKyAgICAgIC5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKHByaW50ZXIpOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgaW50ZXJmYWNlICRjbGFzc25hbWUkT3JCdWlsZGVyIGV4dGVuZHNcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuXG4iCisgICAgICAgICIgICAgICAgIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPCRjbGFzc25hbWUkPiB7XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIGludGVyZmFjZSAkY2xhc3NuYW1lJE9yQnVpbGRlciBleHRlbmRzIFxuIgorICAgICAgICAiICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLlxuIgorICAgICAgICAiICAgICAgICAgIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPCRjbGFzc25hbWUkPiB7XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIGludGVyZmFjZSAkY2xhc3NuYW1lJE9yQnVpbGRlclxuIgorICAgICAgICAiICAgIGV4dGVuZHMgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgaW50ZXJmYWNlICRjbGFzc25hbWUkT3JCdWlsZGVyXG4iCisgICAgICAgICIgICAgZXh0ZW5kcyBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VMaXRlT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgICB9CisgIH0KKworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8tPmZpZWxkKGkpKTsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgIC5HZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMocHJpbnRlcik7CisgICAgfQorICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgYm9vbCBpc19vd25fZmlsZSA9CisgICAgZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpID09IE5VTEwgJiYKKyAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLT5vcHRpb25zKCkuamF2YV9tdWx0aXBsZV9maWxlcygpOworCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgJHN0YXRpYyQgZmluYWwgY2xhc3MgJGNsYXNzbmFtZSQgZXh0ZW5kc1xuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5FeHRlbmRhYmxlTWVzc2FnZTxcbiIKKyAgICAgICAgIiAgICAgICRjbGFzc25hbWUkPiBpbXBsZW1lbnRzICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJzdGF0aWMiLCBpc19vd25fZmlsZSA/ICIiIDogInN0YXRpYyIsCisgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgJHN0YXRpYyQgZmluYWwgY2xhc3MgJGNsYXNzbmFtZSQgZXh0ZW5kc1xuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUuRXh0ZW5kYWJsZU1lc3NhZ2U8XG4iCisgICAgICAgICIgICAgICAkY2xhc3NuYW1lJD4gaW1wbGVtZW50cyAkY2xhc3NuYW1lJE9yQnVpbGRlciB7XG4iLAorICAgICAgICAic3RhdGljIiwgaXNfb3duX2ZpbGUgPyAiIiA6ICJzdGF0aWMiLAorICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljICRzdGF0aWMkIGZpbmFsIGNsYXNzICRjbGFzc25hbWUkIGV4dGVuZHNcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VcbiIKKyAgICAgICAgIiAgICBpbXBsZW1lbnRzICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJzdGF0aWMiLCBpc19vd25fZmlsZSA/ICIiIDogInN0YXRpYyIsCisgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgJHN0YXRpYyQgZmluYWwgY2xhc3MgJGNsYXNzbmFtZSQgZXh0ZW5kc1xuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGVcbiIKKyAgICAgICAgIiAgICBpbXBsZW1lbnRzICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJzdGF0aWMiLCBpc19vd25fZmlsZSA/ICIiIDogInN0YXRpYyIsCisgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgICB9CisgIH0KKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICIvLyBVc2UgJGNsYXNzbmFtZSQubmV3QnVpbGRlcigpIHRvIGNvbnN0cnVjdC5cbiIKKyAgICAicHJpdmF0ZSAkY2xhc3NuYW1lJChCdWlsZGVyIGJ1aWxkZXIpIHtcbiIKKyAgICAiICBzdXBlcihidWlsZGVyKTtcbiIKKyAgICAifVxuIgorICAgIC8vIFVzZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGRlZmF1bHQgaW5zdGFuY2UsIHdoaWNoIGNhbm5vdCBiZSBpbml0aWFsaXplZAorICAgIC8vIGltbWVkaWF0ZWx5IGJlY2F1c2UgaXQgbWF5IGN5Y2xpY2FsbHkgcmVmZXIgdG8gb3RoZXIgZGVmYXVsdCBpbnN0YW5jZXMuCisgICAgInByaXZhdGUgJGNsYXNzbmFtZSQoYm9vbGVhbiBub0luaXQpIHt9XG4iCisgICAgIlxuIgorICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCAkY2xhc3NuYW1lJCBkZWZhdWx0SW5zdGFuY2U7XG4iCisgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgZ2V0RGVmYXVsdEluc3RhbmNlKCkge1xuIgorICAgICIgIHJldHVybiBkZWZhdWx0SW5zdGFuY2U7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkge1xuIgorICAgICIgIHJldHVybiBkZWZhdWx0SW5zdGFuY2U7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iLAorICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKworICBHZW5lcmF0ZURlc2NyaXB0b3JNZXRob2RzKHByaW50ZXIpOworCisgIC8vIE5lc3RlZCB0eXBlcworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgRW51bUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+ZW51bV90eXBlKGkpKS5HZW5lcmF0ZShwcmludGVyKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpOworICAgIG1lc3NhZ2VHZW5lcmF0b3IuR2VuZXJhdGVJbnRlcmZhY2UocHJpbnRlcik7CisgICAgbWVzc2FnZUdlbmVyYXRvci5HZW5lcmF0ZShwcmludGVyKTsKKyAgfQorCisgIC8vIEludGVnZXJzIGZvciBiaXQgZmllbGRzLgorICBpbnQgdG90YWxCaXRzID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgdG90YWxCaXRzICs9IGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgIC5HZXROdW1CaXRzRm9yTWVzc2FnZSgpOworICB9CisgIGludCB0b3RhbEludHMgPSAodG90YWxCaXRzICsgMzEpIC8gMzI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxJbnRzOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBpbnQgJGJpdF9maWVsZF9uYW1lJDtcbiIsCisgICAgICAiYml0X2ZpZWxkX25hbWUiLCBHZXRCaXRGaWVsZE5hbWUoaSkpOworICB9CisKKyAgLy8gRmllbGRzCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLT5maWVsZChpKSk7CisgICAgcHJpbnRlci0+UHJpbnQoInB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICRjb25zdGFudF9uYW1lJCA9ICRudW1iZXIkO1xuIiwKKyAgICAgICJjb25zdGFudF9uYW1lIiwgRmllbGRDb25zdGFudE5hbWUoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSwKKyAgICAgICJudW1iZXIiLCBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5maWVsZChpKS0+bnVtYmVyKCkpKTsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKS5HZW5lcmF0ZU1lbWJlcnMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIH0KKworICAvLyBDYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgdGhlIGRlZmF1bHQgaW5zdGFuY2UsCisgIC8vIGluIHdoaWNoIGNhc2UgdGhpcyBpcyBjYWxsZWQgYnkgc3RhdGljIGluaXQgY29kZSBsYXRlciBvbi4KKyAgcHJpbnRlci0+UHJpbnQoInByaXZhdGUgdm9pZCBpbml0RmllbGRzKCkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAgICAgICAgICAgICAgLkdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKHByaW50ZXIpOworICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworCisgIGlmIChIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIEdlbmVyYXRlSXNJbml0aWFsaXplZChwcmludGVyLCBNRU1PSVpFKTsKKyAgICBHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcyhwcmludGVyKTsKKyAgfQorCisgIGlmIChIYXNFcXVhbHNBbmRIYXNoQ29kZShkZXNjcmlwdG9yXykpIHsKKyAgICBHZW5lcmF0ZUVxdWFsc0FuZEhhc2hDb2RlKHByaW50ZXIpOworICB9CisKKyAgR2VuZXJhdGVQYXJzZUZyb21NZXRob2RzKHByaW50ZXIpOworICBHZW5lcmF0ZUJ1aWxkZXIocHJpbnRlcik7CisKKyAgLy8gQ2FyZWZ1bGx5IGluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGRvZXNuJ3QKKyAgLy8gY29uZmxpY3Qgd2l0aCBvdGhlciBpbml0aWFsaXphdGlvbi4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICJzdGF0aWMge1xuIgorICAgICIgIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyAkY2xhc3NuYW1lJCh0cnVlKTtcbiIKKyAgICAiICBkZWZhdWx0SW5zdGFuY2UuaW5pdEZpZWxkcygpO1xuIgorICAgICJ9XG4iCisgICAgIlxuIgorICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAorICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpLAorICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworCisgIC8vIEV4dGVuc2lvbnMgbXVzdCBiZSBkZWNsYXJlZCBhZnRlciB0aGUgZGVmYXVsdEluc3RhbmNlIGlzIGluaXRpYWxpemVkCisgIC8vIGJlY2F1c2UgdGhlIGRlZmF1bHRJbnN0YW5jZSBpcyB1c2VkIGJ5IHRoZSBleHRlbnNpb24gdG8gbGF6aWx5IHJldHJpZXZlCisgIC8vIHRoZSBvdXRlciBjbGFzcydzIEZpbGVEZXNjcmlwdG9yLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgRXh0ZW5zaW9uR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5leHRlbnNpb24oaSkpLkdlbmVyYXRlKHByaW50ZXIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBzY29wZWRfYXJyYXk8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gc29ydGVkX2ZpZWxkcygKKyAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pKTsKKworICB2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqPiBzb3J0ZWRfZXh0ZW5zaW9uczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7ICsraSkgeworICAgIHNvcnRlZF9leHRlbnNpb25zLnB1c2hfYmFjayhkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlKGkpKTsKKyAgfQorICBzb3J0KHNvcnRlZF9leHRlbnNpb25zLmJlZ2luKCksIHNvcnRlZF9leHRlbnNpb25zLmVuZCgpLAorICAgICAgIEV4dGVuc2lvblJhbmdlT3JkZXJpbmcoKSk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICAvLyB3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgbWlnaHQgYmUgaW52b2tlZCB3aXRob3V0CisgIC8vIGdldFNlcmlhbGl6ZWRTaXplKCkgZXZlciBiZWluZyBjYWxsZWQsIGJ1dCB3ZSBuZWVkIHRoZSBtZW1vaXplZAorICAvLyBzaXplcyBpbiBjYXNlIHRoaXMgbWVzc2FnZSBoYXMgcGFja2VkIGZpZWxkcy4gUmF0aGVyIHRoYW4gZW1pdCBjaGVja3MgZm9yCisgIC8vIGVhY2ggcGFja2VkIGZpZWxkLCBqdXN0IGNhbGwgZ2V0U2VyaWFsaXplZFNpemUoKSB1cCBmcm9udCBmb3IgYWxsIG1lc3NhZ2VzLgorICAvLyBJbiBtb3N0IGNhc2VzLCBnZXRTZXJpYWxpemVkU2l6ZSgpIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGFueXdheSBieQorICAvLyBvbmUgb2YgdGhlIHdyYXBwZXIgd3JpdGVUbygpIG1ldGhvZHMsIG1ha2luZyB0aGlzIGNhbGwgY2hlYXAuCisgIHByaW50ZXItPlByaW50KAorICAgICJnZXRTZXJpYWxpemVkU2l6ZSgpO1xuIik7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSRsaXRlJFxuIgorICAgICAgICAiICAuRXh0ZW5kYWJsZU1lc3NhZ2U8JGNsYXNzbmFtZSQ+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPVxuIgorICAgICAgICAiICAgIG5ld01lc3NhZ2VTZXRFeHRlbnNpb25Xcml0ZXIoKTtcbiIsCisgICAgICAgICJsaXRlIiwgSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pID8gIiIgOiAiTGl0ZSIsCisgICAgICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UkbGl0ZSRcbiIKKyAgICAgICAgIiAgLkV4dGVuZGFibGVNZXNzYWdlPCRjbGFzc25hbWUkPi5FeHRlbnNpb25Xcml0ZXIgZXh0ZW5zaW9uV3JpdGVyID1cbiIKKyAgICAgICAgIiAgICBuZXdFeHRlbnNpb25Xcml0ZXIoKTtcbiIsCisgICAgICAgICJsaXRlIiwgSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pID8gIiIgOiAiTGl0ZSIsCisgICAgICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgICB9CisgIH0KKworICAvLyBNZXJnZSB0aGUgZmllbGRzIGFuZCB0aGUgZXh0ZW5zaW9uIHJhbmdlcywgYm90aCBzb3J0ZWQgYnkgZmllbGQgbnVtYmVyLgorICBmb3IgKGludCBpID0gMCwgaiA9IDA7CisgICAgICAgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpIHx8IGogPCBzb3J0ZWRfZXh0ZW5zaW9ucy5zaXplKCk7CisgICAgICAgKSB7CisgICAgaWYgKGkgPT0gZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkpIHsKKyAgICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UocHJpbnRlciwgc29ydGVkX2V4dGVuc2lvbnNbaisrXSk7CisgICAgfSBlbHNlIGlmIChqID09IHNvcnRlZF9leHRlbnNpb25zLnNpemUoKSkgeworICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChwcmludGVyLCBzb3J0ZWRfZmllbGRzW2krK10pOworICAgIH0gZWxzZSBpZiAoc29ydGVkX2ZpZWxkc1tpXS0+bnVtYmVyKCkgPCBzb3J0ZWRfZXh0ZW5zaW9uc1tqXS0+c3RhcnQpIHsKKyAgICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQocHJpbnRlciwgc29ydGVkX2ZpZWxkc1tpKytdKTsKKyAgICB9IGVsc2UgeworICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZShwcmludGVyLCBzb3J0ZWRfZXh0ZW5zaW9uc1tqKytdKTsKKyAgICB9CisgIH0KKworICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXykpIHsKKyAgICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImdldFVua25vd25GaWVsZHMoKS53cml0ZUFzTWVzc2FnZVNldFRvKG91dHB1dCk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJnZXRVbmtub3duRmllbGRzKCkud3JpdGVUbyhvdXRwdXQpO1xuIik7CisgICAgfQorICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAifVxuIgorICAgICJcbiIKKyAgICAicHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xO1xuIgorICAgICJwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkge1xuIgorICAgICIgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTtcbiIKKyAgICAiICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7XG4iCisgICAgIlxuIgorICAgICIgIHNpemUgPSAwO1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChzb3J0ZWRfZmllbGRzW2ldKS5HZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShwcmludGVyKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJzaXplICs9IGV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldCgpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAic2l6ZSArPSBleHRlbnNpb25zU2VyaWFsaXplZFNpemUoKTtcbiIpOworICAgIH0KKyAgfQorCisgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgeworICAgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAic2l6ZSArPSBnZXRVbmtub3duRmllbGRzKCkuZ2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKTtcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInNpemUgKz0gZ2V0VW5rbm93bkZpZWxkcygpLmdldFNlcmlhbGl6ZWRTaXplKCk7XG4iKTsKKyAgICB9CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICIgIG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBzaXplO1xuIgorICAgICIgIHJldHVybiBzaXplO1xuIgorICAgICJ9XG4iCisgICAgIlxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDBMO1xuIgorICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgInByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IHdyaXRlUmVwbGFjZSgpXG4iCisgICAgIiAgICB0aHJvd3MgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb24ge1xuIgorICAgICIgIHJldHVybiBzdXBlci53cml0ZVJlcGxhY2UoKTtcbiIKKyAgICAifVxuIgorICAgICJcbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzZUZyb21NZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIE5vdGU6ICBUaGVzZSBhcmUgc2VwYXJhdGUgZnJvbSBHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcygpCisgIC8vICAgYmVjYXVzZSB0aGV5IG5lZWQgdG8gYmUgZ2VuZXJhdGVkIGV2ZW4gZm9yIG1lc3NhZ2VzIHRoYXQgYXJlIG9wdGltaXplZAorICAvLyAgIGZvciBjb2RlIHNpemUuCisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBkYXRhKVxuIgorICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKKyAgICAiICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShkYXRhKS5idWlsZFBhcnNlZCgpO1xuIgorICAgICJ9XG4iCisgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGRhdGEsXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAiICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7XG4iCisgICAgIiAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCisgICAgIiAgICAgICAgICAgLmJ1aWxkUGFyc2VkKCk7XG4iCisgICAgIn1cbiIKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpXG4iCisgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIgorICAgICIgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGRhdGEpLmJ1aWxkUGFyc2VkKCk7XG4iCisgICAgIn1cbiIKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCisgICAgIiAgICBieXRlW10gZGF0YSxcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgorICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKKyAgICAiICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAiICAgICAgICAgICAuYnVpbGRQYXJzZWQoKTtcbiIKKyAgICAifVxuIgorICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0KVxuIgorICAgICIgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIgorICAgICIgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGlucHV0KS5idWlsZFBhcnNlZCgpO1xuIgorICAgICJ9XG4iCisgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgorICAgICIgICAgamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dCxcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgorICAgICIgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIgorICAgICIgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAiICAgICAgICAgICAuYnVpbGRQYXJzZWQoKTtcbiIKKyAgICAifVxuIgorICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRGVsaW1pdGVkRnJvbShqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0KVxuIgorICAgICIgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIgorICAgICIgIEJ1aWxkZXIgYnVpbGRlciA9IG5ld0J1aWxkZXIoKTtcbiIKKyAgICAiICBpZiAoYnVpbGRlci5tZXJnZURlbGltaXRlZEZyb20oaW5wdXQpKSB7XG4iCisgICAgIiAgICByZXR1cm4gYnVpbGRlci5idWlsZFBhcnNlZCgpO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICByZXR1cm4gbnVsbDtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZURlbGltaXRlZEZyb20oXG4iCisgICAgIiAgICBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0LFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCisgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCisgICAgIiAgQnVpbGRlciBidWlsZGVyID0gbmV3QnVpbGRlcigpO1xuIgorICAgICIgIGlmIChidWlsZGVyLm1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKSB7XG4iCisgICAgIiAgICByZXR1cm4gYnVpbGRlci5idWlsZFBhcnNlZCgpO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICByZXR1cm4gbnVsbDtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpXG4iCisgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCisgICAgIiAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oaW5wdXQpLmJ1aWxkUGFyc2VkKCk7XG4iCisgICAgIn1cbiIKKyAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKKyAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKKyAgICAiICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCisgICAgIiAgICAgICAgICAgLmJ1aWxkUGFyc2VkKCk7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iLAorICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZU9uZUZpZWxkKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShwcmludGVyKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcmlhbGl6ZU9uZUV4dGVuc2lvblJhbmdlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImV4dGVuc2lvbldyaXRlci53cml0ZVVudGlsKCRlbmQkLCBvdXRwdXQpO1xuIiwKKyAgICAiZW5kIiwgU2ltcGxlSXRvYShyYW5nZS0+ZW5kKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKCkgeyByZXR1cm4gQnVpbGRlci5jcmVhdGUoKTsgfVxuIgorICAgICJwdWJsaWMgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ld0J1aWxkZXIoKTsgfVxuIgorICAgICJwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcigkY2xhc3NuYW1lJCBwcm90b3R5cGUpIHtcbiIKKyAgICAiICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShwcm90b3R5cGUpO1xuIgorICAgICJ9XG4iCisgICAgInB1YmxpYyBCdWlsZGVyIHRvQnVpbGRlcigpIHsgcmV0dXJuIG5ld0J1aWxkZXIodGhpcyk7IH1cbiIKKyAgICAiXG4iLAorICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKworICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8pKSB7CisgICAgIHByaW50ZXItPlByaW50KAorICAgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAgICJwcm90ZWN0ZWQgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZShcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgcGFyZW50KSB7XG4iCisgICAgICAiICBCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcihwYXJlbnQpO1xuIgorICAgICAgIiAgcmV0dXJuIGJ1aWxkZXI7XG4iCisgICAgICAifVxuIik7CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIGV4dGVuZHNcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRXh0ZW5kYWJsZUJ1aWxkZXI8XG4iCisgICAgICAgICIgICAgICAkY2xhc3NuYW1lJCwgQnVpbGRlcj4gaW1wbGVtZW50cyAkY2xhc3NuYW1lJE9yQnVpbGRlciB7XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIGV4dGVuZHNcbiIKKyAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VMaXRlLkV4dGVuZGFibGVCdWlsZGVyPFxuIgorICAgICAgICAiICAgICAgJGNsYXNzbmFtZSQsIEJ1aWxkZXI+IGltcGxlbWVudHMgJGNsYXNzbmFtZSRPckJ1aWxkZXIge1xuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBleHRlbmRzXG4iCisgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXI8QnVpbGRlcj5cbiIKKyAgICAgICAgICIgICBpbXBsZW1lbnRzICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kc1xuIgorICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUuQnVpbGRlcjxcbiIKKyAgICAgICAgIiAgICAgICRjbGFzc25hbWUkLCBCdWlsZGVyPlxuIgorICAgICAgICAiICAgIGltcGxlbWVudHMgJGNsYXNzbmFtZSRPckJ1aWxkZXIge1xuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICAgIH0KKyAgfQorICBwcmludGVyLT5JbmRlbnQoKTsKKworICBHZW5lcmF0ZURlc2NyaXB0b3JNZXRob2RzKHByaW50ZXIpOworICBHZW5lcmF0ZUNvbW1vbkJ1aWxkZXJNZXRob2RzKHByaW50ZXIpOworCisgIGlmIChIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIEdlbmVyYXRlSXNJbml0aWFsaXplZChwcmludGVyLCBET05UX01FTU9JWkUpOworICAgIEdlbmVyYXRlQnVpbGRlclBhcnNpbmdNZXRob2RzKHByaW50ZXIpOworICB9CisKKyAgLy8gSW50ZWdlcnMgZm9yIGJpdCBmaWVsZHMuCisgIGludCB0b3RhbEJpdHMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICB0b3RhbEJpdHMgKz0gZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKKyAgICAgICAgLkdldE51bUJpdHNGb3JCdWlsZGVyKCk7CisgIH0KKyAgaW50IHRvdGFsSW50cyA9ICh0b3RhbEJpdHMgKyAzMSkgLyAzMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbEludHM7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJwcml2YXRlIGludCAkYml0X2ZpZWxkX25hbWUkO1xuIiwKKyAgICAgICJiaXRfZmllbGRfbmFtZSIsIEdldEJpdEZpZWxkTmFtZShpKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXy0+ZmllbGQoaSkpOworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgICAgICAgICAgICAgICAuR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGJ1aWxkZXJfc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAorICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlRGVzY3JpcHRvck1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yXG4iCisgICAgICAiICAgIGdldERlc2NyaXB0b3IoKSB7XG4iCisgICAgICAiICByZXR1cm4gJGZpbGVjbGFzcyQuaW50ZXJuYWxfJGlkZW50aWZpZXIkX2Rlc2NyaXB0b3I7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgInByb3RlY3RlZCBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRmllbGRBY2Nlc3NvclRhYmxlXG4iCisgICAgICAiICAgIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRmaWxlY2xhc3MkLmludGVybmFsXyRpZGVudGlmaWVyJF9maWVsZEFjY2Vzc29yVGFibGU7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJmaWxlY2xhc3MiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSksCisgICAgICAiaWRlbnRpZmllciIsIFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoZGVzY3JpcHRvcl8pKTsKKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVDb21tb25CdWlsZGVyTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAiLy8gQ29uc3RydWN0IHVzaW5nICRjbGFzc25hbWUkLm5ld0J1aWxkZXIoKVxuIgorICAgICJwcml2YXRlIEJ1aWxkZXIoKSB7XG4iCisgICAgIiAgbWF5YmVGb3JjZUJ1aWxkZXJJbml0aWFsaXphdGlvbigpO1xuIgorICAgICJ9XG4iCisgICAgIlxuIiwKKyAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInByaXZhdGUgQnVpbGRlcihCdWlsZGVyUGFyZW50IHBhcmVudCkge1xuIgorICAgICAgIiAgc3VwZXIocGFyZW50KTtcbiIKKyAgICAgICIgIG1heWJlRm9yY2VCdWlsZGVySW5pdGlhbGl6YXRpb24oKTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICB9CisKKworICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHJpdmF0ZSB2b2lkIG1heWJlRm9yY2VCdWlsZGVySW5pdGlhbGl6YXRpb24oKSB7XG4iCisgICAgICAiICBpZiAoY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLmFsd2F5c1VzZUZpZWxkQnVpbGRlcnMpIHtcbiIpOworCisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAgIC5HZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShwcmludGVyKTsKKyAgICB9CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInByaXZhdGUgdm9pZCBtYXliZUZvcmNlQnVpbGRlckluaXRpYWxpemF0aW9uKCkge1xuIgorICAgICAgIn1cbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInByaXZhdGUgc3RhdGljIEJ1aWxkZXIgY3JlYXRlKCkge1xuIgorICAgICIgIHJldHVybiBuZXcgQnVpbGRlcigpO1xuIgorICAgICJ9XG4iCisgICAgIlxuIgorICAgICJwdWJsaWMgQnVpbGRlciBjbGVhcigpIHtcbiIKKyAgICAiICBzdXBlci5jbGVhcigpO1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKKyAgICAgICAgLkdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShwcmludGVyKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIgorICAgICJcbiIKKyAgICAicHVibGljIEJ1aWxkZXIgY2xvbmUoKSB7XG4iCisgICAgIiAgcmV0dXJuIGNyZWF0ZSgpLm1lcmdlRnJvbShidWlsZFBhcnRpYWwoKSk7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iLAorICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3JcbiIKKyAgICAgICIgICAgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7XG4iCisgICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSQuZ2V0RGVzY3JpcHRvcigpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkge1xuIgorICAgICIgIHJldHVybiAkY2xhc3NuYW1lJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIKKyAgICAifVxuIgorICAgICJcbiIsCisgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBidWlsZCgpIHtcbiIKKyAgICAiICAkY2xhc3NuYW1lJCByZXN1bHQgPSBidWlsZFBhcnRpYWwoKTtcbiIKKyAgICAiICBpZiAoIXJlc3VsdC5pc0luaXRpYWxpemVkKCkpIHtcbiIKKyAgICAiICAgIHRocm93IG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKHJlc3VsdCk7XG4iCisgICAgIiAgfVxuIgorICAgICIgIHJldHVybiByZXN1bHQ7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInByaXZhdGUgJGNsYXNzbmFtZSQgYnVpbGRQYXJzZWQoKVxuIgorICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKKyAgICAiICAkY2xhc3NuYW1lJCByZXN1bHQgPSBidWlsZFBhcnRpYWwoKTtcbiIKKyAgICAiICBpZiAoIXJlc3VsdC5pc0luaXRpYWxpemVkKCkpIHtcbiIKKyAgICAiICAgIHRocm93IG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKFxuIgorICAgICIgICAgICByZXN1bHQpLmFzSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCk7XG4iCisgICAgIiAgfVxuIgorICAgICIgIHJldHVybiByZXN1bHQ7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBidWlsZFBhcnRpYWwoKSB7XG4iCisgICAgIiAgJGNsYXNzbmFtZSQgcmVzdWx0ID0gbmV3ICRjbGFzc25hbWUkKHRoaXMpO1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgLy8gTG9jYWwgdmFycyBmb3IgZnJvbSBhbmQgdG8gYml0IGZpZWxkcyB0byBhdm9pZCBhY2Nlc3NpbmcgdGhlIGJ1aWxkZXIgYW5kCisgIC8vIG1lc3NhZ2Ugb3ZlciBhbmQgb3ZlciBmb3IgdGhlc2UgZmllbGRzLiBTZWVtcyB0byBwcm92aWRlIGEgc2xpZ2h0CisgIC8vIHBlcmZvcmFtYW5jZSBpbXByb3ZlbWVudCBpbiBtaWNybyBiZW5jaG1hcmsgYW5kIHRoaXMgaXMgYWxzbyB3aGF0IHByb3RvMQorICAvLyBjb2RlIGRvZXMuCisgIGludCB0b3RhbEJ1aWxkZXJCaXRzID0gMDsKKyAgaW50IHRvdGFsTWVzc2FnZUJpdHMgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZEdlbmVyYXRvciYgZmllbGQgPSBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKTsKKyAgICB0b3RhbEJ1aWxkZXJCaXRzICs9IGZpZWxkLkdldE51bUJpdHNGb3JCdWlsZGVyKCk7CisgICAgdG90YWxNZXNzYWdlQml0cyArPSBmaWVsZC5HZXROdW1CaXRzRm9yTWVzc2FnZSgpOworICB9CisgIGludCB0b3RhbEJ1aWxkZXJJbnRzID0gKHRvdGFsQnVpbGRlckJpdHMgKyAzMSkgLyAzMjsKKyAgaW50IHRvdGFsTWVzc2FnZUludHMgPSAodG90YWxNZXNzYWdlQml0cyArIDMxKSAvIDMyOworICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsQnVpbGRlckludHM7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KCJpbnQgZnJvbV8kYml0X2ZpZWxkX25hbWUkID0gJGJpdF9maWVsZF9uYW1lJDtcbiIsCisgICAgICAiYml0X2ZpZWxkX25hbWUiLCBHZXRCaXRGaWVsZE5hbWUoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxNZXNzYWdlSW50czsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoImludCB0b18kYml0X2ZpZWxkX25hbWUkID0gMDtcbiIsCisgICAgICAiYml0X2ZpZWxkX25hbWUiLCBHZXRCaXRGaWVsZE5hbWUoaSkpOworICB9CisKKyAgLy8gT3V0cHV0IGdlbmVyYXRpb24gY29kZSBmb3IgZWFjaCBmaWVsZC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkuR2VuZXJhdGVCdWlsZGluZ0NvZGUocHJpbnRlcik7CisgIH0KKworICAvLyBDb3B5IHRoZSBiaXQgZmllbGQgcmVzdWx0cyB0byB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbE1lc3NhZ2VJbnRzOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgicmVzdWx0LiRiaXRfZmllbGRfbmFtZSQgPSB0b18kYml0X2ZpZWxkX25hbWUkO1xuIiwKKyAgICAgICJiaXRfZmllbGRfbmFtZSIsIEdldEJpdEZpZWxkTmFtZShpKSk7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICIgIG9uQnVpbHQoKTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgcmV0dXJuIHJlc3VsdDtcbiIKKyAgICAifVxuIgorICAgICJcbiIsCisgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgLy8gTWVyZ2VGcm9tKE1lc3NhZ2Ugb3RoZXIpIHJlcXVpcmVzIHRoZSBhYmlsaXR5IHRvIGRpc3Rpbmd1aXNoIHRoZSBvdGhlcgorICAgIC8vIG1lc3NhZ2VzIHR5cGUgYnkgaXRzIGRlc2NyaXB0b3IuCisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlIG90aGVyKSB7XG4iCisgICAgICAgICIgIGlmIChvdGhlciBpbnN0YW5jZW9mICRjbGFzc25hbWUkKSB7XG4iCisgICAgICAgICIgICAgcmV0dXJuIG1lcmdlRnJvbSgoJGNsYXNzbmFtZSQpb3RoZXIpO1xuIgorICAgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgICAiICAgIHN1cGVyLm1lcmdlRnJvbShvdGhlcik7XG4iCisgICAgICAgICIgICAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgIlxuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICAgIH0KKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbSgkY2xhc3NuYW1lJCBvdGhlcikge1xuIgorICAgICAgLy8gT3B0aW1pemF0aW9uOiAgSWYgb3RoZXIgaXMgdGhlIGRlZmF1bHQgaW5zdGFuY2UsIHdlIGtub3cgbm9uZSBvZiBpdHMKKyAgICAgIC8vICAgZmllbGRzIGFyZSBzZXQgc28gd2UgY2FuIHNraXAgdGhlIG1lcmdlLgorICAgICAgIiAgaWYgKG90aGVyID09ICRjbGFzc25hbWUkLmdldERlZmF1bHRJbnN0YW5jZSgpKSByZXR1cm4gdGhpcztcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpLkdlbmVyYXRlTWVyZ2luZ0NvZGUocHJpbnRlcik7CisgICAgfQorCisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworCisgICAgLy8gaWYgbWVzc2FnZSB0eXBlIGhhcyBleHRlbnNpb25zCisgICAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICB0aGlzLm1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTtcbiIpOworICAgIH0KKworICAgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIHRoaXMubWVyZ2VVbmtub3duRmllbGRzKG90aGVyLmdldFVua25vd25GaWVsZHMoKSk7XG4iKTsKKyAgICB9CisKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIpOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBzY29wZWRfYXJyYXk8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gc29ydGVkX2ZpZWxkcygKKyAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZElucHV0U3RyZWFtIGlucHV0LFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCisgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5Vbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID1cbiIKKyAgICAgICIgIGNvbS5nb29nbGUucHJvdG9idWYuVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoXG4iCisgICAgICAiICAgIHRoaXMuZ2V0VW5rbm93bkZpZWxkcygpKTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIndoaWxlICh0cnVlKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7XG4iCisgICAgInN3aXRjaCAodGFnKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiY2FzZSAwOlxuIiAgICAgICAgICAvLyB6ZXJvIHNpZ25hbHMgRU9GIC8gbGltaXQgcmVhY2hlZAorICAgICAgIiAgdGhpcy5zZXRVbmtub3duRmllbGRzKHVua25vd25GaWVsZHMuYnVpbGQoKSk7XG4iCisgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgImRlZmF1bHQ6IHtcbiIKKyAgICAgICIgIGlmICghcGFyc2VVbmtub3duRmllbGQoaW5wdXQsIHVua25vd25GaWVsZHMsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YWcpKSB7XG4iCisgICAgICAiICAgIHRoaXMuc2V0VW5rbm93bkZpZWxkcyh1bmtub3duRmllbGRzLmJ1aWxkKCkpO1xuIgorICAgICAgIiAgICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICIgICAgcmV0dXJuIHRoaXM7XG4iICAgLy8gaXQncyBhbiBlbmRncm91cCB0YWcKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIGJyZWFrO1xuIgorICAgICAgIn1cbiIsCisgICAgICAib25fY2hhbmdlZCIsIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSA/ICJvbkNoYW5nZWQoKTsiIDogIiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgImNhc2UgMDpcbiIgICAgICAgICAgLy8gemVybyBzaWduYWxzIEVPRiAvIGxpbWl0IHJlYWNoZWQKKyAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAiZGVmYXVsdDoge1xuIgorICAgICAgIiAgaWYgKCFwYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZykpIHtcbiIKKyAgICAgICIgICAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAiICAgIHJldHVybiB0aGlzO1xuIiAgIC8vIGl0J3MgYW4gZW5kZ3JvdXAgdGFnCisgICAgICAiICB9XG4iCisgICAgICAiICBicmVhaztcbiIKKyAgICAgICJ9XG4iLAorICAgICAgIm9uX2NoYW5nZWQiLCBIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykgPyAib25DaGFuZ2VkKCk7IiA6ICIiKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBzb3J0ZWRfZmllbGRzW2ldOworICAgIHVpbnQzMiB0YWcgPSBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC0+bnVtYmVyKCksCisgICAgICBXaXJlRm9ybWF0OjpXaXJlVHlwZUZvckZpZWxkVHlwZShmaWVsZC0+dHlwZSgpKSk7CisKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJjYXNlICR0YWckOiB7XG4iLAorICAgICAgInRhZyIsIFNpbXBsZUl0b2EodGFnKSk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlUGFyc2luZ0NvZGUocHJpbnRlcik7CisKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICBicmVhaztcbiIKKyAgICAgICJ9XG4iKTsKKworICAgIGlmIChmaWVsZC0+aXNfcGFja2FibGUoKSkgeworICAgICAgLy8gVG8gbWFrZSBwYWNrZWQgPSB0cnVlIHdpcmUgY29tcGF0aWJsZSwgd2UgZ2VuZXJhdGUgcGFyc2luZyBjb2RlIGZyb20gYQorICAgICAgLy8gcGFja2VkIHZlcnNpb24gb2YgdGhpcyBmaWVsZCByZWdhcmRsZXNzIG9mIGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCkuCisgICAgICB1aW50MzIgcGFja2VkX3RhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjYXNlICR0YWckOiB7XG4iLAorICAgICAgICAidGFnIiwgU2ltcGxlSXRvYShwYWNrZWRfdGFnKSk7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChwcmludGVyKTsKKworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIGJyZWFrO1xuIgorICAgICAgICAifVxuIik7CisgICAgfQorICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgICB9XG4iICAgICAvLyBzd2l0Y2ggKHRhZykKKyAgICAiICB9XG4iICAgICAgIC8vIHdoaWxlICh0cnVlKQorICAgICJ9XG4iCisKKyAgICAiXG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlSXNJbml0aWFsaXplZCgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgVXNlTWVtb2l6YXRpb24gdXNlTWVtb2l6YXRpb24pIHsKKyAgYm9vbCBtZW1vaXphdGlvbiA9IHVzZU1lbW9pemF0aW9uID09IE1FTU9JWkU7CisgIGlmIChtZW1vaXphdGlvbikgeworICAgIC8vIE1lbW9pemVzIHdoZXRoZXIgdGhlIHByb3RvY29sIGJ1ZmZlciBpcyBmdWxseSBpbml0aWFsaXplZCAoaGFzIGFsbAorICAgIC8vIHJlcXVpcmVkIGZpZWxkcykuIC0xIG1lYW5zIG5vdCB5ZXQgY29tcHV0ZWQuIDAgbWVhbnMgZmFsc2UgYW5kIDEgbWVhbnMKKyAgICAvLyB0cnVlLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgInByaXZhdGUgYnl0ZSBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAtMTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGlmIChtZW1vaXphdGlvbikgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgImJ5dGUgaXNJbml0aWFsaXplZCA9IG1lbW9pemVkSXNJbml0aWFsaXplZDtcbiIKKyAgICAgICJpZiAoaXNJbml0aWFsaXplZCAhPSAtMSkgcmV0dXJuIGlzSW5pdGlhbGl6ZWQgPT0gMTtcbiIKKyAgICAgICJcbiIpOworICB9CisKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGluIHRoaXMgbWVzc2FnZSBhcmUgc2V0LgorICAvLyBUT0RPKGtlbnRvbik6ICBXZSBjYW4gb3B0aW1pemUgdGhpcyB3aGVuIHdlIHN3aXRjaCB0byBwdXR0aW5nIGFsbCB0aGUKKyAgLy8gICAiaGFzIiBmaWVsZHMgaW50byBhIHNpbmdsZSBiaXRmaWVsZC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKworICAgIGlmIChmaWVsZC0+aXNfcmVxdWlyZWQoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoIWhhcyRuYW1lJCgpKSB7XG4iCisgICAgICAgICIgICRtZW1vaXplJFxuIgorICAgICAgICAiICByZXR1cm4gZmFsc2U7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICAibmFtZSIsIFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShmaWVsZCksCisgICAgICAgICJtZW1vaXplIiwgbWVtb2l6YXRpb24gPyAibWVtb2l6ZWRJc0luaXRpYWxpemVkID0gMDsiIDogIiIpOworICAgIH0KKyAgfQorCisgIC8vIE5vdyBjaGVjayB0aGF0IGFsbCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFICYmCisgICAgICAgIEhhc1JlcXVpcmVkRmllbGRzKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmxhYmVsKCkpIHsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUVVJUkVEOgorICAgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgImlmICghZ2V0JG5hbWUkKCkuaXNJbml0aWFsaXplZCgpKSB7XG4iCisgICAgICAgICAgICAgIiAgJG1lbW9pemUkXG4iCisgICAgICAgICAgICAgIiAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgInR5cGUiLCBDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSwKKyAgICAgICAgICAgICJuYW1lIiwgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGZpZWxkKSwKKyAgICAgICAgICAgICJtZW1vaXplIiwgbWVtb2l6YXRpb24gPyAibWVtb2l6ZWRJc0luaXRpYWxpemVkID0gMDsiIDogIiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUw6CisgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiaWYgKGhhcyRuYW1lJCgpKSB7XG4iCisgICAgICAgICAgICAiICBpZiAoIWdldCRuYW1lJCgpLmlzSW5pdGlhbGl6ZWQoKSkge1xuIgorICAgICAgICAgICAgIiAgICAkbWVtb2l6ZSRcbiIKKyAgICAgICAgICAgICIgICAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgICAidHlwZSIsIENsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpLAorICAgICAgICAgICAgIm5hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZmllbGQpLAorICAgICAgICAgICAgIm1lbW9pemUiLCBtZW1vaXphdGlvbiA/ICJtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwOyIgOiAiIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRDoKKyAgICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IGdldCRuYW1lJENvdW50KCk7IGkrKykge1xuIgorICAgICAgICAgICAgIiAgaWYgKCFnZXQkbmFtZSQoaSkuaXNJbml0aWFsaXplZCgpKSB7XG4iCisgICAgICAgICAgICAiICAgICRtZW1vaXplJFxuIgorICAgICAgICAgICAgIiAgICByZXR1cm4gZmFsc2U7XG4iCisgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICJ0eXBlIiwgQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSksCisgICAgICAgICAgICAibmFtZSIsIFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShmaWVsZCksCisgICAgICAgICAgICAibWVtb2l6ZSIsIG1lbW9pemF0aW9uID8gIm1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7IiA6ICIiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgImlmICghZXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKCkpIHtcbiIKKyAgICAgICIgICRtZW1vaXplJFxuIgorICAgICAgIiAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgIn1cbiIsCisgICAgICAibWVtb2l6ZSIsIG1lbW9pemF0aW9uID8gIm1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7IiA6ICIiKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKworICBpZiAobWVtb2l6YXRpb24pIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDE7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICIgIHJldHVybiB0cnVlO1xuIgorICAgICJ9XG4iCisgICAgIlxuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUVxdWFsc0FuZEhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgInB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IG9iaikge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAiaWYgKG9iaiA9PSB0aGlzKSB7XG4iCisgICAgIiByZXR1cm4gdHJ1ZTtcbiIKKyAgICAifVxuIgorICAgICJpZiAoIShvYmogaW5zdGFuY2VvZiAkY2xhc3NuYW1lJCkpIHtcbiIKKyAgICAiICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7XG4iCisgICAgIn1cbiIKKyAgICAiJGNsYXNzbmFtZSQgb3RoZXIgPSAoJGNsYXNzbmFtZSQpIG9iajtcbiIKKyAgICAiXG4iLAorICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKworICBwcmludGVyLT5QcmludCgiYm9vbGVhbiByZXN1bHQgPSB0cnVlO1xuIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJyZXN1bHQgPSByZXN1bHQgJiYgKGhhcyRuYW1lJCgpID09IG90aGVyLmhhcyRuYW1lJCgpKTtcbiIKKyAgICAgICAgImlmIChoYXMkbmFtZSQoKSkge1xuIiwKKyAgICAgICAgIm5hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZmllbGQpKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgIH0KKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlRXF1YWxzQ29kZShwcmludGVyKTsKKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIn1cbiIpOworICAgIH0KKyAgfQorICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicmVzdWx0ID0gcmVzdWx0ICYmXG4iCisgICAgICAiICAgIGdldFVua25vd25GaWVsZHMoKS5lcXVhbHMob3RoZXIuZ2V0VW5rbm93bkZpZWxkcygpKTtcbiIpOworICAgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJlxuIgorICAgICAgICAiICAgIGdldEV4dGVuc2lvbkZpZWxkcygpLmVxdWFscyhvdGhlci5nZXRFeHRlbnNpb25GaWVsZHMoKSk7XG4iKTsKKyAgICB9CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInJldHVybiByZXN1bHQ7XG4iKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAifVxuIgorICAgICJcbiIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJpbnQgaGFzaCA9IDQxO1xuIgorICAgICJoYXNoID0gKDE5ICogaGFzaCkgKyBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmhhc2hDb2RlKCk7XG4iKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImlmIChoYXMkbmFtZSQoKSkge1xuIiwKKyAgICAgICAgIm5hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZmllbGQpKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgIH0KKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlSGFzaENvZGUocHJpbnRlcik7CisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgIH0KKyAgfQorICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaGFzaCA9IGhhc2hGaWVsZHMoaGFzaCwgZ2V0RXh0ZW5zaW9uRmllbGRzKCkpO1xuIik7CisgICAgfQorICB9CisgIHByaW50ZXItPlByaW50KAorICAgICJoYXNoID0gKDI5ICogaGFzaCkgKyBnZXRVbmtub3duRmllbGRzKCkuaGFzaENvZGUoKTtcbiIKKyAgICAicmV0dXJuIGhhc2g7XG4iKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAifVxuIgorICAgICJcbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVFeHRlbnNpb25SZWdpc3RyYXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBFeHRlbnNpb25HZW5lcmF0b3IoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbihpKSkKKyAgICAgIC5HZW5lcmF0ZVJlZ2lzdHJhdGlvbkNvZGUocHJpbnRlcik7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBNZXNzYWdlR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSkKKyAgICAgIC5HZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUocHJpbnRlcik7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzZmYmJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaApAQCAtMCwwICsxLDEwOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBpbyB7CisgICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCisgIH0KK30KKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIE1lc3NhZ2VHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgfk1lc3NhZ2VHZW5lcmF0b3IoKTsKKworICAvLyBBbGwgc3RhdGljIHZhcmlhYmxlcyBoYXZlIHRvIGJlIGRlY2xhcmVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIGZpbGUKKyAgLy8gc28gdGhhdCB3ZSBjYW4gY29udHJvbCBpbml0aWFsaXphdGlvbiBvcmRlciwgd2hpY2ggaXMgaW1wb3J0YW50IGZvcgorICAvLyBEZXNjcmlwdG9yUHJvdG8gYm9vdHN0cmFwcGluZyB0byB3b3JrLgorICB2b2lkIEdlbmVyYXRlU3RhdGljVmFyaWFibGVzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBPdXRwdXQgY29kZSB3aGljaCBpbml0aWFsaXplcyB0aGUgc3RhdGljIHZhcmlhYmxlcyBnZW5lcmF0ZWQgYnkKKyAgLy8gR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoKS4KKyAgdm9pZCBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xhc3MgaXRzZWxmLgorICB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZXMgdGhlIGJhc2UgaW50ZXJmYWNlIHRoYXQgYm90aCB0aGUgY2xhc3MgYW5kIGl0cyBidWlsZGVyIGltcGxlbWVudAorICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBjb2RlIHRvIHJlZ2lzdGVyIGFsbCBjb250YWluZWQgZXh0ZW5zaW9ucyB3aXRoIGFuCisgIC8vIEV4dGVuc2lvblJlZ2lzdHJ5LgorICB2b2lkIEdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorICBlbnVtIFVzZU1lbW9pemF0aW9uIHsKKyAgICBNRU1PSVpFLAorICAgIERPTlRfTUVNT0laRQorICB9OworCisgIHZvaWQgR2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlUGFyc2VGcm9tTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlKTsKKworICB2b2lkIEdlbmVyYXRlQnVpbGRlcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVDb21tb25CdWlsZGVyTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVEZXNjcmlwdG9yTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ01ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlSXNJbml0aWFsaXplZChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgIFVzZU1lbW9pemF0aW9uIHVzZU1lbW9pemF0aW9uKTsKKyAgdm9pZCBHZW5lcmF0ZUVxdWFsc0FuZEhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgRmllbGRHZW5lcmF0b3JNYXAgZmllbGRfZ2VuZXJhdG9yc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VHZW5lcmF0b3IpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxOTQ1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmNjCkBAIC0wLDAgKzEsODg0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK25hbWVzcGFjZSB7CisKKy8vIFRPRE8oa2VudG9uKTogIEZhY3RvciBvdXQgYSAiU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoKSIgdG8gZ2V0IHJpZCBvZgorLy8gICByZXBlYXQgY29kZSBiZXR3ZWVuIHRoaXMgYW5kIHRoZSBvdGhlciBmaWVsZCB0eXBlcy4KK3ZvaWQgU2V0TWVzc2FnZVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgeworICAoKnZhcmlhYmxlcylbIm5hbWUiXSA9CisgICAgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJjYXBpdGFsaXplZF9uYW1lIl0gPQorICAgIFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJjb25zdGFudF9uYW1lIl0gPSBGaWVsZENvbnN0YW50TmFtZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJudW1iZXIiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+bnVtYmVyKCkpOworICAoKnZhcmlhYmxlcylbInR5cGUiXSA9IENsYXNzTmFtZShkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSk7CisgICgqdmFyaWFibGVzKVsiZ3JvdXBfb3JfbWVzc2FnZSJdID0KKyAgICAoR2V0VHlwZShkZXNjcmlwdG9yKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApID8KKyAgICAiR3JvdXAiIDogIk1lc3NhZ2UiOworICAvLyBUT0RPKGJpcmRvKTogQWRkIEBkZXByZWNhdGVkIGphdmFkb2Mgd2hlbiBnZW5lcmF0aW5nIGphdmFkb2MgaXMgc3VwcG9ydGVkCisgIC8vIGJ5IHRoZSBwcm90byBjb21waWxlcgorICAoKnZhcmlhYmxlcylbImRlcHJlY2F0aW9uIl0gPSBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpCisgICAgICA/ICJAamF2YS5sYW5nLkRlcHJlY2F0ZWQgIiA6ICIiOworICAoKnZhcmlhYmxlcylbIm9uX2NoYW5nZWQiXSA9CisgICAgICBIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSkgPyAib25DaGFuZ2VkKCk7IiA6ICIiOworCisgIC8vIEZvciBzaW5ndWxhciBtZXNzYWdlcyBhbmQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3IgdGhlIGhhc0ZpZWxkIGJpdC4KKyAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworCisgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KKyAgICAgIEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKKworICAvLyBGb3IgcmVwYXRlZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB3aGV0aGVyIHRoZSBhcnJheSBpcyBpbW11dGFibGUuCisgICgqdmFyaWFibGVzKVsiZ2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsiY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpOworCisgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCJdID0KKyAgICAgIEdlbmVyYXRlR2V0Qml0RnJvbUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwiXSA9CisgICAgICBHZW5lcmF0ZVNldEJpdFRvTG9jYWwobWVzc2FnZUJpdEluZGV4KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK01lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4KQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCisgICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpIHsKKyAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVzXyk7Cit9CisKK01lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6fk1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpIHt9CisKK2ludCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gMTsKK30KKworaW50IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gVE9ETyhqb25wKTogSW4gdGhlIGZ1dHVyZSwgY29uc2lkZXIgaGF2aW5nIGEgbWV0aG9kIHNwZWNpZmljIHRvIHRoZQorICAvLyBpbnRlcmZhY2Ugc28gdGhhdCBidWlsZGVycyBjYW4gY2hvb3NlIGR5bmFtaWNhbGx5IHRvIGVpdGhlciByZXR1cm4gYQorICAvLyBtZXNzYWdlIG9yIGEgbmVzdGVkIGJ1aWxkZXIsIHNvIHRoYXQgYXNraW5nIGZvciB0aGUgaW50ZXJmYWNlIGRvZXNuJ3QKKyAgLy8gY2F1c2UgYSBtZXNzYWdlIHRvIGV2ZXIgYmUgYnVpbHQuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICIkZGVwcmVjYXRpb24kJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisKKyAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiQkdHlwZSRPckJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKCk7XG4iKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSAkdHlwZSQgJG5hbWUkXztcbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkO1xuIgorICAgICJ9XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAifVxuIik7CisKKyAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkT3JCdWlsZGVyIGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlcigpIHtcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAorICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UpIGNvbnN0IHsKKyAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKKyAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgImlmICgkbmFtZSRCdWlsZGVyXyA9PSBudWxsKSB7XG4iKTsKKyAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIHJlZ3VsYXJfY2FzZSk7CisgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgcHJpbnRlci0+UHJpbnQoIn0gZWxzZSB7XG4iKTsKKyAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIG5lc3RlZF9idWlsZGVyX2Nhc2UpOworICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgIH0gZWxzZSB7CisgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIHJlZ3VsYXJfY2FzZSk7CisgICB9Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICBjb25zdCBjaGFyKiBtZXRob2RfcHJvdG90eXBlLAorICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwKKyAgICBjb25zdCBjaGFyKiBuZXN0ZWRfYnVpbGRlcl9jYXNlLAorICAgIGNvbnN0IGNoYXIqIHRyYWlsaW5nX2NvZGUpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgbWV0aG9kX3Byb3RvdHlwZSk7CisgIHByaW50ZXItPlByaW50KCIge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwgcmVndWxhcl9jYXNlLCBuZXN0ZWRfYnVpbGRlcl9jYXNlKTsKKyAgaWYgKHRyYWlsaW5nX2NvZGUgIT0gTlVMTCkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIHRyYWlsaW5nX2NvZGUpOworICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFdoZW4gdXNpbmcgbmVzdGVkLWJ1aWxkZXJzLCB0aGUgY29kZSBpbml0aWFsbHkgd29ya3MganVzdCBsaWtlIHRoZQorICAvLyBub24tbmVzdGVkIGJ1aWxkZXIgY2FzZS4gSXQgb25seSBjcmVhdGVzIGEgbmVzdGVkIGJ1aWxkZXIgbGF6aWx5IG9uCisgIC8vIGRlbWFuZCBhbmQgdGhlbiBmb3JldmVyIGRlbGVnYXRlcyB0byBpdCBhZnRlciBjcmVhdGlvbi4KKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgIC8vIFVzZWQgd2hlbiB0aGUgYnVpbGRlciBpcyBudWxsLgorICAgICJwcml2YXRlICR0eXBlJCAkbmFtZSRfID0gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIik7CisKKyAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgLy8gSWYgdGhpcyBidWlsZGVyIGlzIG5vbi1udWxsLCBpdCBpcyB1c2VkIGFuZCB0aGUgb3RoZXIgZmllbGRzIGFyZQorICAgICAgLy8gaWdub3JlZC4KKyAgICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuU2luZ2xlRmllbGRCdWlsZGVyPFxuIgorICAgICAgIiAgICAkdHlwZSQsICR0eXBlJC5CdWlsZGVyLCAkdHlwZSRPckJ1aWxkZXI+ICRuYW1lJEJ1aWxkZXJfOyIKKyAgICAgICJcbiIpOworICB9CisKKyAgLy8gVGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBtZXRob2RzIGJlbG93IGFyZSBiYXNlZCBvbiBhIGh5cG90aGV0aWNhbAorICAvLyBmaWVsZCBvZiB0eXBlICJGaWVsZCIgY2FsbGVkICJGaWVsZCIuCisKKyAgLy8gYm9vbGVhbiBoYXNGaWVsZCgpCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAifVxuIik7CisKKyAgLy8gRmllbGQgZ2V0RmllbGQoKQorICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSIsCisKKyAgICAicmV0dXJuICRuYW1lJF87XG4iLAorCisgICAgInJldHVybiAkbmFtZSRCdWlsZGVyXy5nZXRNZXNzYWdlKCk7XG4iLAorCisgICAgTlVMTCk7CisKKyAgLy8gRmllbGQuQnVpbGRlciBzZXRGaWVsZChGaWVsZCB2YWx1ZSkKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIiwKKworICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICJ9XG4iCisgICAgIiRuYW1lJF8gPSB2YWx1ZTtcbiIKKyAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgIiRuYW1lJEJ1aWxkZXJfLnNldE1lc3NhZ2UodmFsdWUpO1xuIiwKKworICAgICIkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gRmllbGQuQnVpbGRlciBzZXRGaWVsZChGaWVsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAiICAgICR0eXBlJC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkiLAorCisgICAgIiRuYW1lJF8gPSBidWlsZGVyRm9yVmFsdWUuYnVpbGQoKTtcbiIKKyAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgIiRuYW1lJEJ1aWxkZXJfLnNldE1lc3NhZ2UoYnVpbGRlckZvclZhbHVlLmJ1aWxkKCkpO1xuIiwKKworICAgICIkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gRmllbGQuQnVpbGRlciBtZXJnZUZpZWxkKEZpZWxkIHZhbHVlKQorICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgbWVyZ2UkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSIsCisKKyAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJCAmJlxuIgorICAgICIgICAgJG5hbWUkXyAhPSAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpIHtcbiIKKyAgICAiICAkbmFtZSRfID1cbiIKKyAgICAiICAgICR0eXBlJC5uZXdCdWlsZGVyKCRuYW1lJF8pLm1lcmdlRnJvbSh2YWx1ZSkuYnVpbGRQYXJ0aWFsKCk7XG4iCisgICAgIn0gZWxzZSB7XG4iCisgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICJ9XG4iCisgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5tZXJnZUZyb20odmFsdWUpO1xuIiwKKworICAgICIkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gRmllbGQuQnVpbGRlciBjbGVhckZpZWxkKCkKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkiLAorCisgICAgIiRuYW1lJF8gPSAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iCisgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5jbGVhcigpO1xuIiwKKworICAgICIkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKCkge1xuIgorICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlcigpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoKSB7XG4iCisgICAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gIT0gbnVsbCkge1xuIgorICAgICAgIiAgICByZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZU9yQnVpbGRlcigpO1xuIgorICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICIgICAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIgorICAgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5TaW5nbGVGaWVsZEJ1aWxkZXI8XG4iCisgICAgICAiICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4gXG4iCisgICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpIHtcbiIKKyAgICAgICIgIGlmICgkbmFtZSRCdWlsZGVyXyA9PSBudWxsKSB7XG4iCisgICAgICAiICAgICRuYW1lJEJ1aWxkZXJfID0gbmV3IGNvbS5nb29nbGUucHJvdG9idWYuU2luZ2xlRmllbGRCdWlsZGVyPFxuIgorICAgICAgIiAgICAgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPihcbiIKKyAgICAgICIgICAgICAgICAgICAkbmFtZSRfLFxuIgorICAgICAgIiAgICAgICAgICAgIGdldFBhcmVudEZvckNoaWxkcmVuKCksXG4iCisgICAgICAiICAgICAgICAgICAgaXNDbGVhbigpKTtcbiIKKyAgICAgICIgICAgJG5hbWUkXyA9IG51bGw7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkQnVpbGRlcl87XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpO1xuIik7Cit9CisKKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLAorICAgICIkbmFtZSRfID0gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5jbGVhcigpO1xuIik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmIChvdGhlci5oYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSkge1xuIgorICAgICIgIG1lcmdlJGNhcGl0YWxpemVkX25hbWUkKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCisgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwkO1xuIgorICAgICAgIn1cbiIpOworCisgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLAorICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iLAorCisgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkQnVpbGRlcl8uYnVpbGQoKTtcbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiR0eXBlJC5CdWlsZGVyIHN1YkJ1aWxkZXIgPSAkdHlwZSQubmV3QnVpbGRlcigpO1xuIgorICAgICJpZiAoaGFzJGNhcGl0YWxpemVkX25hbWUkKCkpIHtcbiIKKyAgICAiICBzdWJCdWlsZGVyLm1lcmdlRnJvbShnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCisgICAgIn1cbiIpOworCisgIGlmIChHZXRUeXBlKGRlc2NyaXB0b3JfKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlucHV0LnJlYWRHcm91cCgkbnVtYmVyJCwgc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpbnB1dC5yZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInNldCRjYXBpdGFsaXplZF9uYW1lJChzdWJCdWlsZGVyLmJ1aWxkUGFydGlhbCgpKTtcbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBvdXRwdXQud3JpdGUkZ3JvdXBfb3JfbWVzc2FnZSQoJG51bWJlciQsICRuYW1lJF8pO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJCkge1xuIgorICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgorICAgICIgICAgLmNvbXB1dGUkZ3JvdXBfb3JfbWVzc2FnZSRTaXplKCRudW1iZXIkLCAkbmFtZSRfKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkKClcbiIKKyAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIgorICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5oYXNoQ29kZSgpO1xuIik7Cit9CisKK3N0cmluZyBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK1JlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4KQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCisgICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpIHsKKyAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVzXyk7Cit9CisKK1JlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoKSB7fQorCitpbnQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gMDsKK30KKworaW50IFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IHsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRPRE8oam9ucCk6IEluIHRoZSBmdXR1cmUsIGNvbnNpZGVyIGhhdmluZyBtZXRob2RzIHNwZWNpZmljIHRvIHRoZQorICAvLyBpbnRlcmZhY2Ugc28gdGhhdCBidWlsZGVycyBjYW4gY2hvb3NlIGR5bmFtaWNhbGx5IHRvIGVpdGhlciByZXR1cm4gYQorICAvLyBtZXNzYWdlIG9yIGEgbmVzdGVkIGJ1aWxkZXIsIHNvIHRoYXQgYXNraW5nIGZvciB0aGUgaW50ZXJmYWNlIGRvZXNuJ3QKKyAgLy8gY2F1c2UgYSBtZXNzYWdlIHRvIGV2ZXIgYmUgYnVpbHQuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+IFxuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpO1xuIgorICAgICIkZGVwcmVjYXRpb24kJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpO1xuIgorICAgICIkZGVwcmVjYXRpb24kaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCk7XG4iKTsKKyAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgJHR5cGUkT3JCdWlsZGVyPiBcbiIKKyAgICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyTGlzdCgpO1xuIgorICAgICAgIiRkZXByZWNhdGlvbiQkdHlwZSRPckJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKFxuIgorICAgICAgIiAgICBpbnQgaW5kZXgpO1xuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+ICRuYW1lJF87XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8JHR5cGUkPiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfO1xuIiAgIC8vIG5vdGU6ICB1bm1vZGlmaWFibGUgbGlzdAorICAgICJ9XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzICR0eXBlJE9yQnVpbGRlcj4gXG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXJMaXN0KCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICJ9XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoXG4iCisgICAgIiAgICBpbnQgaW5kZXgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgorICAgICJ9XG4iKTsKKworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24oCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAorICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UpIGNvbnN0IHsKKyAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKKyAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgImlmICgkbmFtZSRCdWlsZGVyXyA9PSBudWxsKSB7XG4iKTsKKyAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIHJlZ3VsYXJfY2FzZSk7CisgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgcHJpbnRlci0+UHJpbnQoIn0gZWxzZSB7XG4iKTsKKyAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIG5lc3RlZF9idWlsZGVyX2Nhc2UpOworICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgIH0gZWxzZSB7CisgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIHJlZ3VsYXJfY2FzZSk7CisgICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OlByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9wcm90b3R5cGUsCisgICAgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAorICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UsCisgICAgY29uc3QgY2hhciogdHJhaWxpbmdfY29kZSkgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCBtZXRob2RfcHJvdG90eXBlKTsKKyAgcHJpbnRlci0+UHJpbnQoIiB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLCByZWd1bGFyX2Nhc2UsIG5lc3RlZF9idWlsZGVyX2Nhc2UpOworICBpZiAodHJhaWxpbmdfY29kZSAhPSBOVUxMKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgdHJhaWxpbmdfY29kZSk7CisgIH0KKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBXaGVuIHVzaW5nIG5lc3RlZC1idWlsZGVycywgdGhlIGNvZGUgaW5pdGlhbGx5IHdvcmtzIGp1c3QgbGlrZSB0aGUKKyAgLy8gbm9uLW5lc3RlZCBidWlsZGVyIGNhc2UuIEl0IG9ubHkgY3JlYXRlcyBhIG5lc3RlZCBidWlsZGVyIGxhemlseSBvbgorICAvLyBkZW1hbmQgYW5kIHRoZW4gZm9yZXZlciBkZWxlZ2F0ZXMgdG8gaXQgYWZ0ZXIgY3JlYXRpb24uCisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAvLyBVc2VkIHdoZW4gdGhlIGJ1aWxkZXIgaXMgbnVsbC4KKyAgICAvLyBPbmUgZmllbGQgaXMgdGhlIGxpc3QgYW5kIHRoZSBvdGhlciBmaWVsZCBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZQorICAgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLiBJZiBpdCdzIGltbXV0YWJsZSwgdGhlIGludmFyaWFudCBpcyB0aGF0IGl0IG11c3QKKyAgICAvLyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgb3IgaXQncyBhbiBBcnJheUxpc3QKKyAgICAvLyB3cmFwcGVkIGluIGEgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgpIHdyYXBwZXIgYW5kIG5vYm9keSBlbHNlIGhhcworICAgIC8vIGEgcmVmZXJlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgQXJyYXlMaXN0LiBUaGlzIGludmFyaWFudCBhbGxvd3MgdXMgdG8KKyAgICAvLyBzaGFyZSBpbnN0YW5jZXMgb2YgbGlzdHMgYmV0d2VlbiBwcm90b2NvbCBidWZmZXJzIGF2b2lkaW5nIGV4cGVuc2l2ZQorICAgIC8vIG1lbW9yeSBhbGxvY2F0aW9ucy4gTm90ZSwgaW1tdXRhYmxlIGlzIGEgc3Ryb25nIGd1YXJhbnRlZSBoZXJlIC0tIG5vdAorICAgIC8vIGp1c3QgdGhhdCB0aGUgbGlzdCBjYW5ub3QgYmUgbW9kaWZpZWQgdmlhIHRoZSByZWZlcmVuY2UgYnV0IHRoYXQgdGhlCisgICAgLy8gbGlzdCBjYW4gbmV2ZXIgYmUgbW9kaWZpZWQuCisgICAgInByaXZhdGUgamF2YS51dGlsLkxpc3Q8JHR5cGUkPiAkbmFtZSRfID1cbiIKKyAgICAiICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iCisKKyAgICAicHJpdmF0ZSB2b2lkIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpIHtcbiIKKyAgICAiICBpZiAoISRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKKyAgICAiICAgICRuYW1lJF8gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDwkdHlwZSQ+KCRuYW1lJF8pO1xuIgorICAgICIgICAgJHNldF9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiICAgfVxuIgorICAgICJ9XG4iCisgICAgIlxuIik7CisKKyAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgLy8gSWYgdGhpcyBidWlsZGVyIGlzIG5vbi1udWxsLCBpdCBpcyB1c2VkIGFuZCB0aGUgb3RoZXIgZmllbGRzIGFyZQorICAgICAgLy8gaWdub3JlZC4KKyAgICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8XG4iCisgICAgICAiICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4gJG5hbWUkQnVpbGRlcl87XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIFRoZSBjb21tZW50cyBhYm92ZSB0aGUgbWV0aG9kcyBiZWxvdyBhcmUgYmFzZWQgb24gYSBoeXBvdGhldGljYWwKKyAgLy8gcmVwZWF0ZWQgZmllbGQgb2YgdHlwZSAiRmllbGQiIGNhbGxlZCAiUmVwZWF0ZWRGaWVsZCIuCisKKyAgLy8gTGlzdDxGaWVsZD4gZ2V0UmVwZWF0ZWRGaWVsZExpc3QoKQorICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpIiwKKworICAgICJyZXR1cm4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iLAorICAgICJyZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZUxpc3QoKTtcbiIsCisKKyAgICBOVUxMKTsKKworICAvLyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KCkKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSIsCisKKyAgICAicmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIiwKKyAgICAicmV0dXJuICRuYW1lJEJ1aWxkZXJfLmdldENvdW50KCk7XG4iLAorCisgICAgTlVMTCk7CisKKyAgLy8gRmllbGQgZ2V0UmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgpCisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIiwKKworICAgICJyZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIiwKKworICAgICJyZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZShpbmRleCk7XG4iLAorCisgICAgTlVMTCk7CisKKyAgLy8gQnVpbGRlciBzZXRSZXBlYXRlZEZpZWxkKGludCBpbmRleCwgRmllbGQgdmFsdWUpCisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkiLAorICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICJ9XG4iCisgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIkbmFtZSRfLnNldChpbmRleCwgdmFsdWUpO1xuIgorICAgICIkb25fY2hhbmdlZCRcbiIsCisgICAgIiRuYW1lJEJ1aWxkZXJfLnNldE1lc3NhZ2UoaW5kZXgsIHZhbHVlKTtcbiIsCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gQnVpbGRlciBzZXRSZXBlYXRlZEZpZWxkKGludCBpbmRleCwgRmllbGQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpCisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkiLAorCisgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIkbmFtZSRfLnNldChpbmRleCwgYnVpbGRlckZvclZhbHVlLmJ1aWxkKCkpO1xuIgorICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAiJG5hbWUkQnVpbGRlcl8uc2V0TWVzc2FnZShpbmRleCwgYnVpbGRlckZvclZhbHVlLmJ1aWxkKCkpO1xuIiwKKworICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChGaWVsZCB2YWx1ZSkKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIiwKKworICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICJ9XG4iCisgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIkbmFtZSRfLmFkZCh2YWx1ZSk7XG4iCisKKyAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgIiRuYW1lJEJ1aWxkZXJfLmFkZE1lc3NhZ2UodmFsdWUpO1xuIiwKKworICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkIHZhbHVlKQorICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkJGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICIgICAgaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIiwKKworICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICJ9XG4iCisgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIkbmFtZSRfLmFkZChpbmRleCwgdmFsdWUpO1xuIgorICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAiJG5hbWUkQnVpbGRlcl8uYWRkTWVzc2FnZShpbmRleCwgdmFsdWUpO1xuIiwKKworICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChGaWVsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAiICAgICR0eXBlJC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkiLAorCisgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIkbmFtZSRfLmFkZChidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iCisgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5hZGRNZXNzYWdlKGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIsCisKKyAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBCdWlsZGVyIGFkZFJlcGVhdGVkRmllbGQoaW50IGluZGV4LCBGaWVsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAiICAgIGludCBpbmRleCwgJHR5cGUkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSIsCisKKyAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgIiRuYW1lJF8uYWRkKGluZGV4LCBidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iCisgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5hZGRNZXNzYWdlKGluZGV4LCBidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iLAorCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gQnVpbGRlciBhZGRBbGxSZXBlYXRlZEZpZWxkKEl0ZXJhYmxlPEZpZWxkPiB2YWx1ZXMpCisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzICR0eXBlJD4gdmFsdWVzKSIsCisKKyAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgInN1cGVyLmFkZEFsbCh2YWx1ZXMsICRuYW1lJF8pO1xuIgorICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAiJG5hbWUkQnVpbGRlcl8uYWRkQWxsTWVzc2FnZXModmFsdWVzKTtcbiIsCisKKyAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBCdWlsZGVyIGNsZWFyQWxsUmVwZWF0ZWRGaWVsZCgpCisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIiwKKworICAgICIkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgorICAgICIkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiRvbl9jaGFuZ2VkJFxuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5jbGVhcigpO1xuIiwKKworICAgICJyZXR1cm4gdGhpcztcbiIpOworCisgIC8vIEJ1aWxkZXIgcmVtb3ZlUmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgpCisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciByZW1vdmUkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSIsCisKKyAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgIiRuYW1lJF8ucmVtb3ZlKGluZGV4KTtcbiIKKyAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgIiRuYW1lJEJ1aWxkZXJfLnJlbW92ZShpbmRleCk7XG4iLAorCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkLkJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnVpbGRlcihcbiIKKyAgICAgICIgICAgaW50IGluZGV4KSB7XG4iCisgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlcihpbmRleCk7XG4iCisgICAgICAifVxuIgorCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSRPckJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKFxuIgorICAgICAgIiAgICBpbnQgaW5kZXgpIHtcbiIKKyAgICAgICIgIGlmICgkbmFtZSRCdWlsZGVyXyA9PSBudWxsKSB7XG4iCisgICAgICAiICAgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7IgorICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICIgICAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfLmdldE1lc3NhZ2VPckJ1aWxkZXIoaW5kZXgpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIKKworICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzICR0eXBlJE9yQnVpbGRlcj4gXG4iCisgICAgICAiICAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXJMaXN0KCkge1xuIgorICAgICAgIiAgaWYgKCRuYW1lJEJ1aWxkZXJfICE9IG51bGwpIHtcbiIKKyAgICAgICIgICAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfLmdldE1lc3NhZ2VPckJ1aWxkZXJMaXN0KCk7XG4iCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICByZXR1cm4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIgorCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKCkge1xuIgorICAgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmFkZEJ1aWxkZXIoXG4iCisgICAgICAiICAgICAgJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKFxuIgorICAgICAgIiAgICBpbnQgaW5kZXgpIHtcbiIKKyAgICAgICIgIHJldHVybiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKS5hZGRCdWlsZGVyKFxuIgorICAgICAgIiAgICAgIGluZGV4LCAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJC5CdWlsZGVyPiBcbiIKKyAgICAgICIgICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ1aWxkZXJMaXN0KCkge1xuIgorICAgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmdldEJ1aWxkZXJMaXN0KCk7XG4iCisgICAgICAifVxuIgorICAgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5SZXBlYXRlZEZpZWxkQnVpbGRlcjxcbiIKKyAgICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiBcbiIKKyAgICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkge1xuIgorICAgICAgIiAgaWYgKCRuYW1lJEJ1aWxkZXJfID09IG51bGwpIHtcbiIKKyAgICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5SZXBlYXRlZEZpZWxkQnVpbGRlcjxcbiIKKyAgICAgICIgICAgICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4oXG4iCisgICAgICAiICAgICAgICAgICAgJG5hbWUkXyxcbiIKKyAgICAgICIgICAgICAgICAgICAkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkLFxuIgorICAgICAgIiAgICAgICAgICAgIGdldFBhcmVudEZvckNoaWxkcmVuKCksXG4iCisgICAgICAiICAgICAgICAgICAgaXNDbGVhbigpKTtcbiIKKyAgICAgICIgICAgJG5hbWUkXyA9IG51bGw7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkQnVpbGRlcl87XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwKKyAgICAiJG5hbWUkXyA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTtcbiIKKyAgICAiJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIiwKKworICAgICIkbmFtZSRCdWlsZGVyXy5jbGVhcigpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBUaGUgY29kZSBiZWxvdyBkb2VzIHR3byBvcHRpbWl6YXRpb25zIChub24tbmVzdGVkIGJ1aWxkZXIgY2FzZSk6CisgIC8vICAgMS4gSWYgdGhlIG90aGVyIGxpc3QgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gVGhpcyBlbnN1cmVzIHdlCisgIC8vICAgICAgZG9uJ3QgYWxsb2NhdGUgYSBuZXcgYXJyYXkgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGltbXV0YWJsZSBvbmUuCisgIC8vICAgMi4gSWYgdGhlIG90aGVyIGxpc3QgaXMgbm9uLWVtcHR5IGFuZCBvdXIgY3VycmVudCBsaXN0IGlzIGVtcHR5LCB3ZSBjYW4KKyAgLy8gICAgICByZXVzZSB0aGUgb3RoZXIgbGlzdCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGltbXV0YWJsZS4KKyAgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKHByaW50ZXIsCisgICAgImlmICghb3RoZXIuJG5hbWUkXy5pc0VtcHR5KCkpIHtcbiIKKyAgICAiICBpZiAoJG5hbWUkXy5pc0VtcHR5KCkpIHtcbiIKKyAgICAiICAgICRuYW1lJF8gPSBvdGhlci4kbmFtZSRfO1xuIgorICAgICIgICAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiICAgICRuYW1lJF8uYWRkQWxsKG90aGVyLiRuYW1lJF8pO1xuIgorICAgICIgIH1cbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAifVxuIiwKKworICAgICJpZiAoIW90aGVyLiRuYW1lJF8uaXNFbXB0eSgpKSB7XG4iCisgICAgIiAgaWYgKCRuYW1lJEJ1aWxkZXJfLmlzRW1wdHkoKSkge1xuIgorICAgICIgICAgJG5hbWUkQnVpbGRlcl8uZGlzcG9zZSgpO1xuIgorICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBudWxsO1xuIgorICAgICIgICAgJG5hbWUkXyA9IG90aGVyLiRuYW1lJF87XG4iCisgICAgIiAgICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgICAkbmFtZSRCdWlsZGVyXyA9IFxuIgorICAgICIgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuYWx3YXlzVXNlRmllbGRCdWlsZGVycyA/XG4iCisgICAgIiAgICAgICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpIDogbnVsbDtcbiIKKyAgICAiICB9IGVsc2Uge1xuIgorICAgICIgICAgJG5hbWUkQnVpbGRlcl8uYWRkQWxsTWVzc2FnZXMob3RoZXIuJG5hbWUkXyk7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBUaGUgY29kZSBiZWxvdyAobm9uLW5lc3RlZCBidWlsZGVyIGNhc2UpIGVuc3VyZXMgdGhhdCB0aGUgcmVzdWx0IGhhcyBhbgorICAvLyBpbW11dGFibGUgbGlzdC4gSWYgb3VyIGxpc3QgaXMgaW1tdXRhYmxlLCB3ZSBjYW4ganVzdCByZXVzZSBpdC4gSWYgbm90LAorICAvLyB3ZSBtYWtlIGl0IGltbXV0YWJsZS4KKyAgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKHByaW50ZXIsCisgICAgImlmICgkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkKSB7XG4iCisgICAgIiAgJG5hbWUkXyA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCRuYW1lJF8pO1xuIgorICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAifVxuIgorICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iLAorCisgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkQnVpbGRlcl8uYnVpbGQoKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJHR5cGUkLkJ1aWxkZXIgc3ViQnVpbGRlciA9ICR0eXBlJC5uZXdCdWlsZGVyKCk7XG4iKTsKKworICBpZiAoR2V0VHlwZShkZXNjcmlwdG9yXykgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpbnB1dC5yZWFkR3JvdXAoJG51bWJlciQsIHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaW5wdXQucmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoc3ViQnVpbGRlci5idWlsZFBhcnRpYWwoKSk7XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgorICAgICIgIG91dHB1dC53cml0ZSRncm91cF9vcl9tZXNzYWdlJCgkbnVtYmVyJCwgJG5hbWUkXy5nZXQoaSkpO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAiICAgIC5jb21wdXRlJGdyb3VwX29yX21lc3NhZ2UkU2l6ZSgkbnVtYmVyJCwgJG5hbWUkXy5nZXQoaSkpO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicmVzdWx0ID0gcmVzdWx0ICYmIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKVxuIgorICAgICIgICAgLmVxdWFscyhvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSA+IDApIHtcbiIKKyAgICAiICBoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iCisgICAgIiAgaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmhhc2hDb2RlKCk7XG4iCisgICAgIn1cbiIpOworfQorCitzdHJpbmcgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZmJjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5oCkBAIC0wLDAgKzEsMTM0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIE1lc3NhZ2VGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7CisgIH5NZXNzYWdlRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKKyAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKKyAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VGaWVsZEdlbmVyYXRvcik7CisKKyAgdm9pZCBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UpIGNvbnN0OworICB2b2lkIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgY29uc3QgY2hhciogbWV0aG9kX3Byb3RvdHlwZSwgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAorICAgICAgY29uc3QgY2hhciogbmVzdGVkX2J1aWxkZXJfY2FzZSwKKyAgICAgIGNvbnN0IGNoYXIqIHRyYWlsaW5nX2NvZGUpIGNvbnN0OworfTsKKworY2xhc3MgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7CisgIH5SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OworICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworICBzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CisgIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOworICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IpOworCisgIHZvaWQgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLCBjb25zdCBjaGFyKiBuZXN0ZWRfYnVpbGRlcl9jYXNlKSBjb25zdDsKKyAgdm9pZCBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9wcm90b3R5cGUsIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwKKyAgICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UsCisgICAgICBjb25zdCBjaGFyKiB0cmFpbGluZ19jb2RlKSBjb25zdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcGx1Z2luX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2M5NGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDEyMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFRPRE8oa2VudG9uKTogIFNoYXJlIGNvZGUgd2l0aCB0aGUgdmVyc2lvbnMgb2YgdGhpcyB0ZXN0IGluIG90aGVyIGxhbmd1YWdlcz8KKy8vICAgSXQgc2VlbWVkIGxpa2UgcGFyYW1ldGVyaXppbmcgaXQgd291bGQgYWRkIG1vcmUgY29tcGxleGl0eSB0aGFuIGl0IGlzCisvLyAgIHdvcnRoLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKK25hbWVzcGFjZSB7CisKK2NsYXNzIFRlc3RHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7CisgcHVibGljOgorICBUZXN0R2VuZXJhdG9yKCkge30KKyAgflRlc3RHZW5lcmF0b3IoKSB7fQorCisgIHZpcnR1YWwgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIGNvbnN0IHsKKyAgICBzdHJpbmcgZmlsZW5hbWUgPSAiVGVzdC5qYXZhIjsKKyAgICBUcnlJbnNlcnQoZmlsZW5hbWUsICJvdXRlcl9jbGFzc19zY29wZSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydChmaWxlbmFtZSwgImNsYXNzX3Njb3BlOmZvby5CYXIiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoZmlsZW5hbWUsICJjbGFzc19zY29wZTpmb28uQmFyLkJheiIsIGNvbnRleHQpOworICAgIFRyeUluc2VydChmaWxlbmFtZSwgImJ1aWxkZXJfc2NvcGU6Zm9vLkJhciIsIGNvbnRleHQpOworICAgIFRyeUluc2VydChmaWxlbmFtZSwgImJ1aWxkZXJfc2NvcGU6Zm9vLkJhci5CYXoiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoZmlsZW5hbWUsICJlbnVtX3Njb3BlOmZvby5RdXgiLCBjb250ZXh0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZvaWQgVHJ5SW5zZXJ0KGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9uX3BvaW50LAorICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0KSBjb25zdCB7CisgICAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgIGNvbnRleHQtPk9wZW5Gb3JJbnNlcnQoZmlsZW5hbWUsIGluc2VydGlvbl9wb2ludCkpOworICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOworICAgIHByaW50ZXIuUHJpbnQoIi8vIGluc2VydGVkICRuYW1lJFxuIiwgIm5hbWUiLCBpbnNlcnRpb25fcG9pbnQpOworICB9Cit9OworCisvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBhbGwgdGhlIGV4cGVjdGVkIGluc2VydGlvbiBwb2ludHMgZXhpc3QuICBJdCBkb2VzCisvLyBub3QgdmVyaWZ5IHRoYXQgdGhleSBhcmUgY29ycmVjdGx5LXBsYWNlZDsgdGhhdCB3b3VsZCByZXF1aXJlIGFjdHVhbGx5CisvLyBjb21waWxpbmcgdGhlIG91dHB1dCB3aGljaCBpcyBhIGJpdCBtb3JlIHRoYW4gSSBjYXJlIHRvIGRvIGZvciB0aGlzIHRlc3QuCitURVNUKEphdmFQbHVnaW5UZXN0LCBQbHVnaW5UZXN0KSB7CisgIEZpbGU6OldyaXRlU3RyaW5nVG9GaWxlT3JEaWUoCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJwYWNrYWdlIGZvbztcbiIKKyAgICAgICJvcHRpb24gamF2YV9wYWNrYWdlID0gXCJcIjtcbiIKKyAgICAgICJvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSBcIlRlc3RcIjtcbiIKKyAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAiICBtZXNzYWdlIEJheiB7fVxuIgorICAgICAgIn1cbiIKKyAgICAgICJlbnVtIFF1eCB7IEJMQUggPSAxOyB9XG4iLAorICAgICAgVGVzdFRlbXBEaXIoKSArICIvdGVzdC5wcm90byIpOworCisgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb21tYW5kTGluZUludGVyZmFjZSBjbGk7CisgIGNsaS5TZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZSh0cnVlKTsKKworICBKYXZhR2VuZXJhdG9yIGphdmFfZ2VuZXJhdG9yOworICBUZXN0R2VuZXJhdG9yIHRlc3RfZ2VuZXJhdG9yOworICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tamF2YV9vdXQiLCAmamF2YV9nZW5lcmF0b3IsICIiKTsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLXRlc3Rfb3V0IiwgJnRlc3RfZ2VuZXJhdG9yLCAiIik7CisKKyAgc3RyaW5nIHByb3RvX3BhdGggPSAiLUkiICsgVGVzdFRlbXBEaXIoKTsKKyAgc3RyaW5nIGphdmFfb3V0ID0gIi0tamF2YV9vdXQ9IiArIFRlc3RUZW1wRGlyKCk7CisgIHN0cmluZyB0ZXN0X291dCA9ICItLXRlc3Rfb3V0PSIgKyBUZXN0VGVtcERpcigpOworCisgIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKKyAgICAicHJvdG9jIiwKKyAgICBwcm90b19wYXRoLmNfc3RyKCksCisgICAgamF2YV9vdXQuY19zdHIoKSwKKyAgICB0ZXN0X291dC5jX3N0cigpLAorICAgICJ0ZXN0LnByb3RvIgorICB9OworCisgIEVYUEVDVF9FUSgwLCBjbGkuUnVuKDUsIGFyZ3YpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMmUwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmNjCkBAIC0wLDAgKzEsNzE5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOworCituYW1lc3BhY2UgeworCitjb25zdCBjaGFyKiBQcmltaXRpdmVUeXBlTmFtZShKYXZhVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UICAgIDogcmV0dXJuICJpbnQiOworICAgIGNhc2UgSkFWQVRZUEVfTE9ORyAgIDogcmV0dXJuICJsb25nIjsKKyAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUICA6IHJldHVybiAiZmxvYXQiOworICAgIGNhc2UgSkFWQVRZUEVfRE9VQkxFIDogcmV0dXJuICJkb3VibGUiOworICAgIGNhc2UgSkFWQVRZUEVfQk9PTEVBTjogcmV0dXJuICJib29sZWFuIjsKKyAgICBjYXNlIEpBVkFUWVBFX1NUUklORyA6IHJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgY2FzZSBKQVZBVFlQRV9CWVRFUyAgOiByZXR1cm4gImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyI7CisgICAgY2FzZSBKQVZBVFlQRV9FTlVNICAgOiByZXR1cm4gTlVMTDsKKyAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6IHJldHVybiBOVUxMOworCisgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAvLyBKYXZhVHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBOVUxMOworfQorCitib29sIElzUmVmZXJlbmNlVHlwZShKYXZhVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UICAgIDogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgSkFWQVRZUEVfTE9ORyAgIDogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgSkFWQVRZUEVfRkxPQVQgIDogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgSkFWQVRZUEVfRE9VQkxFIDogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgSkFWQVRZUEVfQk9PTEVBTjogcmV0dXJuIGZhbHNlOworICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HIDogcmV0dXJuIHRydWU7CisgICAgY2FzZSBKQVZBVFlQRV9CWVRFUyAgOiByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEpBVkFUWVBFX0VOVU0gICA6IHJldHVybiB0cnVlOworICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRTogcmV0dXJuIHRydWU7CisKKyAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgIC8vIEphdmFUeXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIGZhbHNlOworfQorCitjb25zdCBjaGFyKiBHZXRDYXBpdGFsaXplZFR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBzd2l0Y2ggKEdldFR5cGUoZmllbGQpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzIgICA6IHJldHVybiAiSW50MzIiICAgOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMiAgOiByZXR1cm4gIlVJbnQzMiIgIDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzIgIDogcmV0dXJuICJTSW50MzIiICA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMiA6IHJldHVybiAiRml4ZWQzMiIgOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOiByZXR1cm4gIlNGaXhlZDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NCAgIDogcmV0dXJuICJJbnQ2NCIgICA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0ICA6IHJldHVybiAiVUludDY0IiAgOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NCAgOiByZXR1cm4gIlNJbnQ2NCIgIDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0IDogcmV0dXJuICJGaXhlZDY0IiA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6IHJldHVybiAiU0ZpeGVkNjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUICAgOiByZXR1cm4gIkZsb2F0IiAgIDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEUgIDogcmV0dXJuICJEb3VibGUiICA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTCAgICA6IHJldHVybiAiQm9vbCIgICAgOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAgOiByZXR1cm4gIlN0cmluZyIgIDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyAgIDogcmV0dXJuICJCeXRlcyIgICA7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAiRW51bSIgICAgOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICAgOiByZXR1cm4gIkdyb3VwIiAgIDsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFIDogcmV0dXJuICJNZXNzYWdlIiA7CisKKyAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KKyAgfQorCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gTlVMTDsKK30KKworLy8gRm9yIGVuY29kaW5ncyB3aXRoIGZpeGVkIHNpemVzLCByZXR1cm5zIHRoYXQgc2l6ZSBpbiBieXRlcy4gIE90aGVyd2lzZQorLy8gcmV0dXJucyAtMS4KK2ludCBGaXhlZFNpemUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzIgICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NCAgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMiAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0ICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzIgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NCAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMiA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0ZpeGVkMzJTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtGaXhlZDY0U2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprU0ZpeGVkMzJTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtTRml4ZWQ2NFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQgICA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0Zsb2F0U2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEUgIDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRG91YmxlU2l6ZTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0wgICAgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtCb29sU2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNICAgIDogcmV0dXJuIC0xOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyAgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSA6IHJldHVybiAtMTsKKworICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3CisgICAgLy8gdHlwZXMgYXJlIGFkZGVkLgorICB9CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKSB7CisgICgqdmFyaWFibGVzKVsibmFtZSJdID0KKyAgICBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSA9CisgICAgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5udW1iZXIoKSk7CisgICgqdmFyaWFibGVzKVsidHlwZSJdID0gUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcikpOworICAoKnZhcmlhYmxlcylbImJveGVkX3R5cGUiXSA9IEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcikpOworICAoKnZhcmlhYmxlcylbImZpZWxkX3R5cGUiXSA9ICgqdmFyaWFibGVzKVsidHlwZSJdOworICAoKnZhcmlhYmxlcylbImZpZWxkX2xpc3RfdHlwZSJdID0gImphdmEudXRpbC5MaXN0PCIgKworICAgICAgKCp2YXJpYWJsZXMpWyJib3hlZF90eXBlIl0gKyAiPiI7CisgICgqdmFyaWFibGVzKVsiZW1wdHlfbGlzdCJdID0gImphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKSI7CisgICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdID0gRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbImRlZmF1bHRfaW5pdCJdID0gSXNEZWZhdWx0VmFsdWVKYXZhRGVmYXVsdChkZXNjcmlwdG9yKSA/CisgICAgICAiIiA6ICgiPSAiICsgRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpKTsKKyAgKCp2YXJpYWJsZXMpWyJjYXBpdGFsaXplZF90eXBlIl0gPSBHZXRDYXBpdGFsaXplZFR5cGUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsidGFnIl0gPSBTaW1wbGVJdG9hKFdpcmVGb3JtYXQ6Ok1ha2VUYWcoZGVzY3JpcHRvcikpOworICAoKnZhcmlhYmxlcylbInRhZ19zaXplIl0gPSBTaW1wbGVJdG9hKAorICAgICAgV2lyZUZvcm1hdDo6VGFnU2l6ZShkZXNjcmlwdG9yLT5udW1iZXIoKSwgR2V0VHlwZShkZXNjcmlwdG9yKSkpOworICBpZiAoSXNSZWZlcmVuY2VUeXBlKEdldEphdmFUeXBlKGRlc2NyaXB0b3IpKSkgeworICAgICgqdmFyaWFibGVzKVsibnVsbF9jaGVjayJdID0KKyAgICAgICAgIiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiIKKyAgICAgICAgIiAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKKyAgICAgICAgIiAgfVxuIjsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbIm51bGxfY2hlY2siXSA9ICIiOworICB9CisgIC8vIFRPRE8oYmlyZG8pOiBBZGQgQGRlcHJlY2F0ZWQgamF2YWRvYyB3aGVuIGdlbmVyYXRpbmcgamF2YWRvYyBpcyBzdXBwb3J0ZWQKKyAgLy8gYnkgdGhlIHByb3RvIGNvbXBpbGVyCisgICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9IGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKKyAgICAgID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7CisgIGludCBmaXhlZF9zaXplID0gRml4ZWRTaXplKEdldFR5cGUoZGVzY3JpcHRvcikpOworICBpZiAoZml4ZWRfc2l6ZSAhPSAtMSkgeworICAgICgqdmFyaWFibGVzKVsiZml4ZWRfc2l6ZSJdID0gU2ltcGxlSXRvYShmaXhlZF9zaXplKTsKKyAgfQorICAoKnZhcmlhYmxlcylbIm9uX2NoYW5nZWQiXSA9CisgICAgICBIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSkgPyAib25DaGFuZ2VkKCk7IiA6ICIiOworCisgIC8vIEZvciBzaW5ndWxhciBtZXNzYWdlcyBhbmQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3IgdGhlIGhhc0ZpZWxkIGJpdC4KKyAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworCisgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KKyAgICAgIEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKKworICAvLyBGb3IgcmVwYXRlZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB3aGV0aGVyIHRoZSBhcnJheSBpcyBpbW11dGFibGUuCisgICgqdmFyaWFibGVzKVsiZ2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsiY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpOworCisgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCJdID0KKyAgICAgIEdlbmVyYXRlR2V0Qml0RnJvbUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwiXSA9CisgICAgICBHZW5lcmF0ZVNldEJpdFRvTG9jYWwobWVzc2FnZUJpdEluZGV4KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKKyAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCkgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVzXyk7Cit9CisKK1ByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjp+UHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKSB7fQorCitpbnQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gMTsKK30KKworaW50IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IHsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgorICAgICIkZGVwcmVjYXRpb24kJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgJGZpZWxkX3R5cGUkICRuYW1lJF87XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAifVxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgJGZpZWxkX3R5cGUkICRuYW1lJF8gJGRlZmF1bHRfaW5pdCQ7XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAifVxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICJ9XG4iKTsKKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICIkbnVsbF9jaGVjayQiCisgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICIgICRuYW1lJF8gPSB2YWx1ZTtcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iKTsKKyAgSmF2YVR5cGUgdHlwZSA9IEdldEphdmFUeXBlKGRlc2NyaXB0b3JfKTsKKyAgaWYgKHR5cGUgPT0gSkFWQVRZUEVfU1RSSU5HIHx8IHR5cGUgPT0gSkFWQVRZUEVfQllURVMpIHsKKyAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgYSBzaW1wbGUgbGl0ZXJhbCBzbyB3ZSB3YW50IHRvIGF2b2lkIGV4ZWN1dGluZworICAgIC8vIGl0IG11bHRpcGxlIHRpbWVzLiAgSW5zdGVhZCwgZ2V0IHRoZSBkZWZhdWx0IG91dCBvZiB0aGUgZGVmYXVsdCBpbnN0YW5jZS4KKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiAgJG5hbWUkXyA9IGdldERlZmF1bHRJbnN0YW5jZSgpLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgICRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3IgcHJpbWl0aXZlcworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGRlZmF1bHQkO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iCisgICAgIiRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAob3RoZXIuaGFzJGNhcGl0YWxpemVkX25hbWUkKCkpIHtcbiIKKyAgICAiICBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCisgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKKyAgICAifVxuIgorICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiJG5hbWUkXyA9IGlucHV0LnJlYWQkY2FwaXRhbGl6ZWRfdHlwZSQoKTtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJCkge1xuIgorICAgICIgIG91dHB1dC53cml0ZSRjYXBpdGFsaXplZF90eXBlJCgkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAiICAgIC5jb21wdXRlJGNhcGl0YWxpemVkX3R5cGUkU2l6ZSgkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBzd2l0Y2ggKEdldEphdmFUeXBlKGRlc2NyaXB0b3JfKSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UOgorICAgIGNhc2UgSkFWQVRZUEVfTE9ORzoKKyAgICBjYXNlIEpBVkFUWVBFX0JPT0xFQU46CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAicmVzdWx0ID0gcmVzdWx0ICYmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICAgICAiICAgID09IG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiAoRmxvYXQuZmxvYXRUb0ludEJpdHMoZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpIgorICAgICAgICAiICAgID09IEZsb2F0LmZsb2F0VG9JbnRCaXRzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKSk7XG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBKQVZBVFlQRV9ET1VCTEU6CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAicmVzdWx0ID0gcmVzdWx0ICYmIChEb3VibGUuZG91YmxlVG9Mb25nQml0cyhnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSkiCisgICAgICAgICIgICAgPT0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpKTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKKyAgICBjYXNlIEpBVkFUWVBFX0JZVEVTOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSkFWQVRZUEVfRU5VTToKKyAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6CisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIpOworICBzd2l0Y2ggKEdldEphdmFUeXBlKGRlc2NyaXB0b3JfKSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSkFWQVRZUEVfTE9ORzoKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBoYXNoTG9uZyhnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBKQVZBVFlQRV9CT09MRUFOOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGhhc2hCb29sZWFuKGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUOgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIEZsb2F0LmZsb2F0VG9JbnRCaXRzKFxuIgorICAgICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX0RPVUJMRToKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBoYXNoTG9uZyhcbiIKKyAgICAgICAgIiAgICBEb3VibGUuZG91YmxlVG9Mb25nQml0cyhnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSkpO1xuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgorICAgIGNhc2UgSkFWQVRZUEVfQllURVM6CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkuaGFzaENvZGUoKTtcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0cmluZyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gQm94ZWRQcmltaXRpdmVUeXBlTmFtZShHZXRKYXZhVHlwZShkZXNjcmlwdG9yXykpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKKyAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCkgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVzXyk7Cit9CisKK1JlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6On5SZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gMDsKK30KKworaW50IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgeworICByZXR1cm4gMTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kamF2YS51dGlsLkxpc3Q8JGJveGVkX3R5cGUkPiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCk7XG4iCisgICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIKKyAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KTtcbiIpOworfQorCisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSAkZmllbGRfbGlzdF90eXBlJCAkbmFtZSRfO1xuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCRib3hlZF90eXBlJD5cbiIKKyAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iICAgLy8gbm90ZTogIHVubW9kaWZpYWJsZSBsaXN0CisgICAgIn1cbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIgorICAgICJ9XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgorICAgICJ9XG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSAmJgorICAgICAgSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIGludCAkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBPbmUgZmllbGQgaXMgdGhlIGxpc3QgYW5kIHRoZSBiaXQgZmllbGQga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUKKyAgLy8gbGlzdCBpcyBpbW11dGFibGUuIElmIGl0J3MgaW1tdXRhYmxlLCB0aGUgaW52YXJpYW50IGlzIHRoYXQgaXQgbXVzdAorICAvLyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgb3IgaXQncyBhbiBBcnJheUxpc3QKKyAgLy8gd3JhcHBlZCBpbiBhIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKSB3cmFwcGVyIGFuZCBub2JvZHkgZWxzZSBoYXMKKyAgLy8gYSByZWZlcmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBBcnJheUxpc3QuIFRoaXMgaW52YXJpYW50IGFsbG93cyB1cyB0bworICAvLyBzaGFyZSBpbnN0YW5jZXMgb2YgbGlzdHMgYmV0d2VlbiBwcm90b2NvbCBidWZmZXJzIGF2b2lkaW5nIGV4cGVuc2l2ZQorICAvLyBtZW1vcnkgYWxsb2NhdGlvbnMuIE5vdGUsIGltbXV0YWJsZSBpcyBhIHN0cm9uZyBndWFyYW50ZWUgaGVyZSAtLSBub3QKKyAgLy8ganVzdCB0aGF0IHRoZSBsaXN0IGNhbm5vdCBiZSBtb2RpZmllZCB2aWEgdGhlIHJlZmVyZW5jZSBidXQgdGhhdCB0aGUKKyAgLy8gbGlzdCBjYW4gbmV2ZXIgYmUgbW9kaWZpZWQuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgJGZpZWxkX2xpc3RfdHlwZSQgJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIpOworCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgdm9pZCBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKSB7XG4iCisgICAgIiAgaWYgKCEkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkKSB7XG4iCisgICAgIiAgICAkbmFtZSRfID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8JGJveGVkX3R5cGUkPigkbmFtZSRfKTtcbiIKKyAgICAiICAgICRzZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgIH1cbiIKKyAgICAifVxuIik7CisKKyAgICAvLyBOb3RlOiAgV2UgcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBsaXN0IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjYWxsZXIKKyAgICAvLyAgIGNvdWxkIGhvbGQgb24gdG8gdGhlIHJldHVybmVkIGxpc3QgYW5kIG1vZGlmeSBpdCBhZnRlciB0aGUgbWVzc2FnZQorICAgIC8vICAgaGFzIGJlZW4gYnVpbHQsIHRodXMgbXV0YXRpbmcgdGhlIG1lc3NhZ2Ugd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUKKyAgICAvLyAgIGltbXV0YWJsZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkYm94ZWRfdHlwZSQ+XG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgorICAgICIgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCisgICAgIn1cbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7XG4iCisgICAgIn1cbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAiICAgIGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgIiRudWxsX2NoZWNrJCIKKyAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiICAkbmFtZSRfLnNldChpbmRleCwgdmFsdWUpO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgIiRudWxsX2NoZWNrJCIKKyAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiICAkbmFtZSRfLmFkZCh2YWx1ZSk7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAiICAgIGphdmEubGFuZy5JdGVyYWJsZTw/IGV4dGVuZHMgJGJveGVkX3R5cGUkPiB2YWx1ZXMpIHtcbiIKKyAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiICBzdXBlci5hZGRBbGwodmFsdWVzLCAkbmFtZSRfKTtcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIKKyAgICAiICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7CisgIC8vIG5vb3AgZm9yIHByaW1pdGl2ZXMKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIKKyAgICAiJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRoZSBjb2RlIGJlbG93IGRvZXMgdHdvIG9wdGltaXphdGlvbnM6CisgIC8vICAgMS4gSWYgdGhlIG90aGVyIGxpc3QgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gVGhpcyBlbnN1cmVzIHdlCisgIC8vICAgICAgZG9uJ3QgYWxsb2NhdGUgYSBuZXcgYXJyYXkgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGltbXV0YWJsZSBvbmUuCisgIC8vICAgMi4gSWYgdGhlIG90aGVyIGxpc3QgaXMgbm9uLWVtcHR5IGFuZCBvdXIgY3VycmVudCBsaXN0IGlzIGVtcHR5LCB3ZSBjYW4KKyAgLy8gICAgICByZXVzZSB0aGUgb3RoZXIgbGlzdCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGltbXV0YWJsZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCFvdGhlci4kbmFtZSRfLmlzRW1wdHkoKSkge1xuIgorICAgICIgIGlmICgkbmFtZSRfLmlzRW1wdHkoKSkge1xuIgorICAgICIgICAgJG5hbWUkXyA9IG90aGVyLiRuYW1lJF87XG4iCisgICAgIiAgICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgICAgJG5hbWUkXy5hZGRBbGwob3RoZXIuJG5hbWUkXyk7XG4iCisgICAgIiAgfVxuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIFRoZSBjb2RlIGJlbG93IGVuc3VyZXMgdGhhdCB0aGUgcmVzdWx0IGhhcyBhbiBpbW11dGFibGUgbGlzdC4gSWYgb3VyCisgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLCB3ZSBjYW4ganVzdCByZXVzZSBpdC4gSWYgbm90LCB3ZSBtYWtlIGl0IGltbXV0YWJsZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKKyAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCisgICAgIiAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICJ9XG4iCisgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiJG5hbWUkXy5hZGQoaW5wdXQucmVhZCRjYXBpdGFsaXplZF90eXBlJCgpKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW50IGxlbmd0aCA9IGlucHV0LnJlYWRSYXdWYXJpbnQzMigpO1xuIgorICAgICJpbnQgbGltaXQgPSBpbnB1dC5wdXNoTGltaXQobGVuZ3RoKTtcbiIKKyAgICAid2hpbGUgKGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkge1xuIgorICAgICIgIGFkZCRjYXBpdGFsaXplZF9uYW1lJChpbnB1dC5yZWFkJGNhcGl0YWxpemVkX3R5cGUkKCkpO1xuIgorICAgICJ9XG4iCisgICAgImlucHV0LnBvcExpbWl0KGxpbWl0KTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5zaXplKCkgPiAwKSB7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkdGFnJCk7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGUkY2FwaXRhbGl6ZWRfdHlwZSROb1RhZygkbmFtZSRfLmdldChpKSk7XG4iCisgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAgICIgIG91dHB1dC53cml0ZSRjYXBpdGFsaXplZF90eXBlJCgkbnVtYmVyJCwgJG5hbWUkXy5nZXQoaSkpO1xuIgorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ7XG4iCisgICAgIiAgaW50IGRhdGFTaXplID0gMDtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBpZiAoRml4ZWRTaXplKEdldFR5cGUoZGVzY3JpcHRvcl8pKSA9PSAtMSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCisgICAgICAiICBkYXRhU2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCisgICAgICAiICAgIC5jb21wdXRlJGNhcGl0YWxpemVkX3R5cGUkU2l6ZU5vVGFnKCRuYW1lJF8uZ2V0KGkpKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImRhdGFTaXplID0gJGZpeGVkX3NpemUkICogZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLnNpemUoKTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAic2l6ZSArPSBkYXRhU2l6ZTtcbiIpOworCisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAoIWdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5pc0VtcHR5KCkpIHtcbiIKKyAgICAgICIgIHNpemUgKz0gJHRhZ19zaXplJDtcbiIKKyAgICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgorICAgICAgIiAgICAgIC5jb21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpO1xuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAic2l6ZSArPSAkdGFnX3NpemUkICogZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLnNpemUoKTtcbiIpOworICB9CisKKyAgLy8gY2FjaGUgdGhlIGRhdGEgc2l6ZSBmb3IgcGFja2VkIGZpZWxkcy4KKyAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRuYW1lJE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTtcbiIpOworICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicmVzdWx0ID0gcmVzdWx0ICYmIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKVxuIgorICAgICIgICAgLmVxdWFscyhvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkpO1xuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpID4gMCkge1xuIgorICAgICIgIGhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKKyAgICAiICBoYXNoID0gKDUzICogaGFzaCkgKyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuaGFzaENvZGUoKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3N0cmluZyBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBCb3hlZFByaW1pdGl2ZVR5cGVOYW1lKEdldEphdmFUeXBlKGRlc2NyaXB0b3JfKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MDBmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1BSSU1JVElWRV9GSUVMRF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfUFJJTUlUSVZFX0ZJRUxEX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgpOworICB+UHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKKyAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKKyAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKKyAgflJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKKyAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgIHN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKKyAgY29uc3QgaW50IG1lc3NhZ2VCaXRJbmRleF87CisgIGNvbnN0IGludCBidWlsZGVyQml0SW5kZXhfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1BSSU1JVElWRV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlNGY0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmNjCkBAIC0wLDAgKzEsNDQ0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCitTZXJ2aWNlR2VuZXJhdG9yOjpTZXJ2aWNlR2VuZXJhdG9yKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHt9CisKK1NlcnZpY2VHZW5lcmF0b3I6On5TZXJ2aWNlR2VuZXJhdG9yKCkge30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBib29sIGlzX293bl9maWxlID0gZGVzY3JpcHRvcl8tPmZpbGUoKS0+b3B0aW9ucygpLmphdmFfbXVsdGlwbGVfZmlsZXMoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyAkc3RhdGljJCBhYnN0cmFjdCBjbGFzcyAkY2xhc3NuYW1lJFxuIgorICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2Uge1xuIiwKKyAgICAic3RhdGljIiwgaXNfb3duX2ZpbGUgPyAiIiA6ICJzdGF0aWMiLAorICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInByb3RlY3RlZCAkY2xhc3NuYW1lJCgpIHt9XG5cbiIsCisgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworCisgIEdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOworCisgIEdlbmVyYXRlTmV3UmVmbGVjdGl2ZVNlcnZpY2VNZXRob2QocHJpbnRlcik7CisgIEdlbmVyYXRlTmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZU1ldGhvZChwcmludGVyKTsKKworICBHZW5lcmF0ZUFic3RyYWN0TWV0aG9kcyhwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBnZXREZXNjcmlwdG9yKCkgYW5kIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuCisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgc3RhdGljIGZpbmFsXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLlNlcnZpY2VEZXNjcmlwdG9yXG4iCisgICAgIiAgICBnZXREZXNjcmlwdG9yKCkge1xuIgorICAgICIgIHJldHVybiAkZmlsZSQuZ2V0RGVzY3JpcHRvcigpLmdldFNlcnZpY2VzKCkuZ2V0KCRpbmRleCQpO1xuIgorICAgICJ9XG4iLAorICAgICJmaWxlIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpLAorICAgICJpbmRleCIsIFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPmluZGV4KCkpKTsKKyAgR2VuZXJhdGVHZXREZXNjcmlwdG9yRm9yVHlwZShwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBtb3JlIHN0dWZmLgorICBHZW5lcmF0ZUNhbGxNZXRob2QocHJpbnRlcik7CisgIEdlbmVyYXRlR2V0UHJvdG90eXBlKFJFUVVFU1QsIHByaW50ZXIpOworICBHZW5lcmF0ZUdldFByb3RvdHlwZShSRVNQT05TRSwgcHJpbnRlcik7CisgIEdlbmVyYXRlU3R1YihwcmludGVyKTsKKyAgR2VuZXJhdGVCbG9ja2luZ1N0dWIocHJpbnRlcik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUdldERlc2NyaXB0b3JGb3JUeXBlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5TZXJ2aWNlRGVzY3JpcHRvclxuIgorICAgICIgICAgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7XG4iCisgICAgIiAgcmV0dXJuIGdldERlc2NyaXB0b3IoKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoInB1YmxpYyBpbnRlcmZhY2UgSW50ZXJmYWNlIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgR2VuZXJhdGVBYnN0cmFjdE1ldGhvZHMocHJpbnRlcik7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVOZXdSZWZsZWN0aXZlU2VydmljZU1ldGhvZCgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2UgbmV3UmVmbGVjdGl2ZVNlcnZpY2UoXG4iCisgICAgIiAgICBmaW5hbCBJbnRlcmZhY2UgaW1wbCkge1xuIgorICAgICIgIHJldHVybiBuZXcgJGNsYXNzbmFtZSQoKSB7XG4iLAorICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIHByaW50ZXItPlByaW50KCJAamF2YS5sYW5nLk92ZXJyaWRlXG4iKTsKKyAgICBHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZShwcmludGVyLCBtZXRob2QsIElTX0NPTkNSRVRFKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIge1xuIgorICAgICAgIiAgaW1wbC4kbWV0aG9kJChjb250cm9sbGVyLCByZXF1ZXN0LCBkb25lKTtcbiIKKyAgICAgICJ9XG5cbiIsCisgICAgICAibWV0aG9kIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QpKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn07XG4iKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU5ld1JlZmxlY3RpdmVCbG9ja2luZ1NlcnZpY2VNZXRob2QoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CbG9ja2luZ1NlcnZpY2VcbiIKKyAgICAiICAgIG5ld1JlZmxlY3RpdmVCbG9ja2luZ1NlcnZpY2UoZmluYWwgQmxvY2tpbmdJbnRlcmZhY2UgaW1wbCkge1xuIgorICAgICIgIHJldHVybiBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5CbG9ja2luZ1NlcnZpY2UoKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIEdlbmVyYXRlR2V0RGVzY3JpcHRvckZvclR5cGUocHJpbnRlcik7CisKKyAgR2VuZXJhdGVDYWxsQmxvY2tpbmdNZXRob2QocHJpbnRlcik7CisgIEdlbmVyYXRlR2V0UHJvdG90eXBlKFJFUVVFU1QsIHByaW50ZXIpOworICBHZW5lcmF0ZUdldFByb3RvdHlwZShSRVNQT05TRSwgcHJpbnRlcik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifTtcbiIpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlQWJzdHJhY3RNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIEdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlKHByaW50ZXIsIG1ldGhvZCwgSVNfQUJTVFJBQ1QpOworICAgIHByaW50ZXItPlByaW50KCI7XG5cbiIpOworICB9Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVDYWxsTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJcbiIKKyAgICAicHVibGljIGZpbmFsIHZvaWQgY2FsbE1ldGhvZChcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NvbnRyb2xsZXIgY29udHJvbGxlcixcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZSByZXF1ZXN0LFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDYWxsYmFjazxcbiIKKyAgICAiICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlPiBkb25lKSB7XG4iCisgICAgIiAgaWYgKG1ldGhvZC5nZXRTZXJ2aWNlKCkgIT0gZ2V0RGVzY3JpcHRvcigpKSB7XG4iCisgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcbiIKKyAgICAiICAgICAgXCJTZXJ2aWNlLmNhbGxNZXRob2QoKSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvciBmb3Igd3JvbmcgXCIgK1xuIgorICAgICIgICAgICBcInNlcnZpY2UgdHlwZS5cIik7XG4iCisgICAgIiAgfVxuIgorICAgICIgIHN3aXRjaChtZXRob2QuZ2V0SW5kZXgoKSkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgICAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaSk7CisgICAgdmFyc1sibWV0aG9kIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG1ldGhvZCk7CisgICAgdmFyc1siaW5wdXQiXSA9IENsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSk7CisgICAgdmFyc1sib3V0cHV0Il0gPSBDbGFzc05hbWUobWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgImNhc2UgJGluZGV4JDpcbiIKKyAgICAgICIgIHRoaXMuJG1ldGhvZCQoY29udHJvbGxlciwgKCRpbnB1dCQpcmVxdWVzdCxcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNVdGlsLjwkb3V0cHV0JD5zcGVjaWFsaXplQ2FsbGJhY2soXG4iCisgICAgICAiICAgICAgZG9uZSkpO1xuIgorICAgICAgIiAgcmV0dXJuO1xuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiZGVmYXVsdDpcbiIKKyAgICAiICB0aHJvdyBuZXcgamF2YS5sYW5nLkFzc2VydGlvbkVycm9yKFwiQ2FuJ3QgZ2V0IGhlcmUuXCIpO1xuIik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5PdXRkZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIiAgfVxuIgorICAgICJ9XG4iCisgICAgIlxuIik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVDYWxsQmxvY2tpbmdNZXRob2QoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICJwdWJsaWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlIGNhbGxCbG9ja2luZ01ldGhvZChcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NvbnRyb2xsZXIgY29udHJvbGxlcixcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZSByZXF1ZXN0KVxuIgorICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuU2VydmljZUV4Y2VwdGlvbiB7XG4iCisgICAgIiAgaWYgKG1ldGhvZC5nZXRTZXJ2aWNlKCkgIT0gZ2V0RGVzY3JpcHRvcigpKSB7XG4iCisgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcbiIKKyAgICAiICAgICAgXCJTZXJ2aWNlLmNhbGxCbG9ja2luZ01ldGhvZCgpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciBcIiArXG4iCisgICAgIiAgICAgIFwid3Jvbmcgc2VydmljZSB0eXBlLlwiKTtcbiIKKyAgICAiICB9XG4iCisgICAgIiAgc3dpdGNoKG1ldGhvZC5nZXRJbmRleCgpKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKKyAgICB2YXJzWyJtZXRob2QiXSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UobWV0aG9kKTsKKyAgICB2YXJzWyJpbnB1dCJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+aW5wdXRfdHlwZSgpKTsKKyAgICB2YXJzWyJvdXRwdXQiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCkpOworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiY2FzZSAkaW5kZXgkOlxuIgorICAgICAgIiAgcmV0dXJuIGltcGwuJG1ldGhvZCQoY29udHJvbGxlciwgKCRpbnB1dCQpcmVxdWVzdCk7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJkZWZhdWx0OlxuIgorICAgICIgIHRocm93IG5ldyBqYXZhLmxhbmcuQXNzZXJ0aW9uRXJyb3IoXCJDYW4ndCBnZXQgaGVyZS5cIik7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiICB9XG4iCisgICAgIn1cbiIKKyAgICAiXG4iKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUdldFByb3RvdHlwZShSZXF1ZXN0T3JSZXNwb25zZSB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLyoKKyAgICogVE9ETyhjcG92aXJrKTogVGhlIGV4Y2VwdGlvbiBtZXNzYWdlIHNheXMgIlNlcnZpY2UuZm9vIiB3aGVuIGl0IG1heSBiZQorICAgKiAiQmxvY2tpbmdTZXJ2aWNlLmZvby4iICBDb25zaWRlciBmaXhpbmcuCisgICAqLworICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZVxuIgorICAgICIgICAgZ2V0JHJlcXVlc3Rfb3JfcmVzcG9uc2UkUHJvdG90eXBlKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIG1ldGhvZCkge1xuIgorICAgICIgIGlmIChtZXRob2QuZ2V0U2VydmljZSgpICE9IGdldERlc2NyaXB0b3IoKSkge1xuIgorICAgICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXG4iCisgICAgIiAgICAgIFwiU2VydmljZS5nZXQkcmVxdWVzdF9vcl9yZXNwb25zZSRQcm90b3R5cGUoKSBnaXZlbiBtZXRob2QgXCIgK1xuIgorICAgICIgICAgICBcImRlc2NyaXB0b3IgZm9yIHdyb25nIHNlcnZpY2UgdHlwZS5cIik7XG4iCisgICAgIiAgfVxuIgorICAgICIgIHN3aXRjaChtZXRob2QuZ2V0SW5kZXgoKSkge1xuIiwKKyAgICAicmVxdWVzdF9vcl9yZXNwb25zZSIsICh3aGljaCA9PSBSRVFVRVNUKSA/ICJSZXF1ZXN0IiA6ICJSZXNwb25zZSIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGkpOworICAgIHZhcnNbInR5cGUiXSA9IENsYXNzTmFtZSgKKyAgICAgICh3aGljaCA9PSBSRVFVRVNUKSA/IG1ldGhvZC0+aW5wdXRfdHlwZSgpIDogbWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgImNhc2UgJGluZGV4JDpcbiIKKyAgICAgICIgIHJldHVybiAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJkZWZhdWx0OlxuIgorICAgICIgIHRocm93IG5ldyBqYXZhLmxhbmcuQXNzZXJ0aW9uRXJyb3IoXCJDYW4ndCBnZXQgaGVyZS5cIik7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiICB9XG4iCisgICAgIn1cbiIKKyAgICAiXG4iKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZVN0dWIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyBzdGF0aWMgU3R1YiBuZXdTdHViKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDaGFubmVsIGNoYW5uZWwpIHtcbiIKKyAgICAiICByZXR1cm4gbmV3IFN0dWIoY2hhbm5lbCk7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3R1YiBleHRlbmRzICRjbGFzc25hbWUkIGltcGxlbWVudHMgSW50ZXJmYWNlIHsiCisgICAgIlxuIiwKKyAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJwcml2YXRlIFN0dWIoY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDaGFubmVsIGNoYW5uZWwpIHtcbiIKKyAgICAiICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuIgorICAgICJ9XG4iCisgICAgIlxuIgorICAgICJwcml2YXRlIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ2hhbm5lbCBjaGFubmVsO1xuIgorICAgICJcbiIKKyAgICAicHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ2hhbm5lbCBnZXRDaGFubmVsKCkge1xuIgorICAgICIgIHJldHVybiBjaGFubmVsO1xuIgorICAgICJ9XG4iKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICBHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZShwcmludGVyLCBtZXRob2QsIElTX0NPTkNSRVRFKTsKKyAgICBwcmludGVyLT5QcmludCgiIHtcbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGkpOworICAgIHZhcnNbIm91dHB1dCJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+b3V0cHV0X3R5cGUoKSk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJjaGFubmVsLmNhbGxNZXRob2QoXG4iCisgICAgICAiICBnZXREZXNjcmlwdG9yKCkuZ2V0TWV0aG9kcygpLmdldCgkaW5kZXgkKSxcbiIKKyAgICAgICIgIGNvbnRyb2xsZXIsXG4iCisgICAgICAiICByZXF1ZXN0LFxuIgorICAgICAgIiAgJG91dHB1dCQuZ2V0RGVmYXVsdEluc3RhbmNlKCksXG4iCisgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY1V0aWwuZ2VuZXJhbGl6ZUNhbGxiYWNrKFxuIgorICAgICAgIiAgICBkb25lLFxuIgorICAgICAgIiAgICAkb3V0cHV0JC5jbGFzcyxcbiIKKyAgICAgICIgICAgJG91dHB1dCQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTtcbiIpOworCisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIn1cbiIKKyAgICAiXG4iKTsKK30KKwordm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUJsb2NraW5nU3R1Yihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIHN0YXRpYyBCbG9ja2luZ0ludGVyZmFjZSBuZXdCbG9ja2luZ1N0dWIoXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJsb2NraW5nUnBjQ2hhbm5lbCBjaGFubmVsKSB7XG4iCisgICAgIiAgcmV0dXJuIG5ldyBCbG9ja2luZ1N0dWIoY2hhbm5lbCk7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIGludGVyZmFjZSBCbG9ja2luZ0ludGVyZmFjZSB7Iik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIEdlbmVyYXRlQmxvY2tpbmdNZXRob2RTaWduYXR1cmUocHJpbnRlciwgbWV0aG9kKTsKKyAgICBwcmludGVyLT5QcmludCgiO1xuIik7CisgIH0KKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJ9XG4iCisgICAgIlxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEJsb2NraW5nU3R1YiBpbXBsZW1lbnRzIEJsb2NraW5nSW50ZXJmYWNlIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAicHJpdmF0ZSBCbG9ja2luZ1N0dWIoY29tLmdvb2dsZS5wcm90b2J1Zi5CbG9ja2luZ1JwY0NoYW5uZWwgY2hhbm5lbCkge1xuIgorICAgICIgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInByaXZhdGUgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5CbG9ja2luZ1JwY0NoYW5uZWwgY2hhbm5lbDtcbiIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOworICAgIEdlbmVyYXRlQmxvY2tpbmdNZXRob2RTaWduYXR1cmUocHJpbnRlciwgbWV0aG9kKTsKKyAgICBwcmludGVyLT5QcmludCgiIHtcbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGkpOworICAgIHZhcnNbIm91dHB1dCJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+b3V0cHV0X3R5cGUoKSk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICJyZXR1cm4gKCRvdXRwdXQkKSBjaGFubmVsLmNhbGxCbG9ja2luZ01ldGhvZChcbiIKKyAgICAgICIgIGdldERlc2NyaXB0b3IoKS5nZXRNZXRob2RzKCkuZ2V0KCRpbmRleCQpLFxuIgorICAgICAgIiAgY29udHJvbGxlcixcbiIKKyAgICAgICIgIHJlcXVlc3QsXG4iCisgICAgICAiICAkb3V0cHV0JC5nZXREZWZhdWx0SW5zdGFuY2UoKSk7XG4iKTsKKworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzQWJzdHJhY3QgaXNfYWJzdHJhY3QpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJuYW1lIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG1ldGhvZCk7CisgIHZhcnNbImlucHV0Il0gPSBDbGFzc05hbWUobWV0aG9kLT5pbnB1dF90eXBlKCkpOworICB2YXJzWyJvdXRwdXQiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCkpOworICB2YXJzWyJhYnN0cmFjdCJdID0gKGlzX2Fic3RyYWN0ID09IElTX0FCU1RSQUNUKSA/ICJhYnN0cmFjdCIgOiAiIjsKKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAicHVibGljICRhYnN0cmFjdCQgdm9pZCAkbmFtZSQoXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NvbnRyb2xsZXIgY29udHJvbGxlcixcbiIKKyAgICAiICAgICRpbnB1dCQgcmVxdWVzdCxcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ2FsbGJhY2s8JG91dHB1dCQ+IGRvbmUpIik7Cit9CisKK3ZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVCbG9ja2luZ01ldGhvZFNpZ25hdHVyZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJtZXRob2QiXSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UobWV0aG9kKTsKKyAgdmFyc1siaW5wdXQiXSA9IENsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSk7CisgIHZhcnNbIm91dHB1dCJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+b3V0cHV0X3R5cGUoKSk7CisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgIlxuIgorICAgICJwdWJsaWMgJG91dHB1dCQgJG1ldGhvZCQoXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NvbnRyb2xsZXIgY29udHJvbGxlcixcbiIKKyAgICAiICAgICRpbnB1dCQgcmVxdWVzdClcbiIKKyAgICAiICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VFeGNlcHRpb24iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGphdmEKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdlZWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaApAQCAtMCwwICsxLDExMyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfU0VSVklDRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfU0VSVklDRV9IX18KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBpbyB7CisgICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCisgIH0KK30KKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CituYW1lc3BhY2UgamF2YSB7CisKK2NsYXNzIFNlcnZpY2VHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU2VydmljZUdlbmVyYXRvcihjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIH5TZXJ2aWNlR2VuZXJhdG9yKCk7CisKKyAgdm9pZCBHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorCisgIC8vIEdlbmVyYXRlIHRoZSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIG1ldGhvZC4KKyAgdm9pZCBHZW5lcmF0ZUdldERlc2NyaXB0b3JGb3JUeXBlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBhIEphdmEgaW50ZXJmYWNlIGZvciB0aGUgc2VydmljZS4KKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgbmV3UmVmbGVjdGl2ZVNlcnZpY2UoKSBtZXRob2QuCisgIHZvaWQgR2VuZXJhdGVOZXdSZWZsZWN0aXZlU2VydmljZU1ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgbmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZSgpIG1ldGhvZC4KKyAgdm9pZCBHZW5lcmF0ZU5ld1JlZmxlY3RpdmVCbG9ja2luZ1NlcnZpY2VNZXRob2QoaW86OlByaW50ZXIqIHByaW50ZXIpOworCisgIC8vIEdlbmVyYXRlIGFic3RyYWN0IG1ldGhvZCBkZWNsYXJhdGlvbnMgZm9yIGFsbCBtZXRob2RzLgorICB2b2lkIEdlbmVyYXRlQWJzdHJhY3RNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgU2VydmljZS5jYWxsTWV0aG9kKCkuCisgIHZvaWQgR2VuZXJhdGVDYWxsTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgQmxvY2tpbmdTZXJ2aWNlLmNhbGxCbG9ja2luZ01ldGhvZCgpLgorICB2b2lkIEdlbmVyYXRlQ2FsbEJsb2NraW5nTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb25zIG9mIFNlcnZpY2UuZ2V0e1JlcXVlc3QsUmVzcG9uc2V9UHJvdG90eXBlKCkuCisgIGVudW0gUmVxdWVzdE9yUmVzcG9uc2UgeyBSRVFVRVNULCBSRVNQT05TRSB9OworICB2b2lkIEdlbmVyYXRlR2V0UHJvdG90eXBlKFJlcXVlc3RPclJlc3BvbnNlIHdoaWNoLCBpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgYSBzdHViIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlLgorICB2b2lkIEdlbmVyYXRlU3R1Yihpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGUgYSBtZXRob2Qgc2lnbmF0dXJlLCBwb3NzaWJseSBhYnN0cmFjdCwgd2l0aG91dCBib2R5IG9yIHRyYWlsaW5nCisgIC8vIHNlbWljb2xvbi4KKyAgZW51bSBJc0Fic3RyYWN0IHsgSVNfQUJTVFJBQ1QsIElTX0NPTkNSRVRFIH07CisgIHZvaWQgR2VuZXJhdGVNZXRob2RTaWduYXR1cmUoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzQWJzdHJhY3QgaXNfYWJzdHJhY3QpOworCisgIC8vIEdlbmVyYXRlIGEgYmxvY2tpbmcgc3R1YiBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlLgorICB2b2lkIEdlbmVyYXRlQmxvY2tpbmdTdHViKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgbWV0aG9kIHNpZ25hdHVyZSBmb3Igb25lIG1ldGhvZCBvZiBhIGJsb2NraW5nIHN0dWIuCisgIHZvaWQgR2VuZXJhdGVCbG9ja2luZ01ldGhvZFNpZ25hdHVyZShpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCk7CisKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXJ2aWNlR2VuZXJhdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCisjZW5kaWYgIC8vIE5FVF9QUk9UTzJfQ09NUElMRVJfSkFWQV9TRVJWSUNFX0hfXworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyMjg1YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MKQEAgLTAsMCArMSw2MTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIEF1dGhvcjogam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIGphdmEgeworCit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTsKKworbmFtZXNwYWNlIHsKKwordm9pZCBTZXRQcmltaXRpdmVWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gPQorICAgIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsiY2FwaXRhbGl6ZWRfbmFtZSJdID0KKyAgICBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsiY29uc3RhbnRfbmFtZSJdID0gRmllbGRDb25zdGFudE5hbWUoZGVzY3JpcHRvcik7CisgICgqdmFyaWFibGVzKVsibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgKCp2YXJpYWJsZXMpWyJlbXB0eV9saXN0Il0gPSAiY29tLmdvb2dsZS5wcm90b2J1Zi5MYXp5U3RyaW5nQXJyYXlMaXN0LkVNUFRZIjsKKworICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IERlZmF1bHRWYWx1ZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X2luaXQiXSA9ICgiPSAiICsgRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpKTsKKyAgKCp2YXJpYWJsZXMpWyJjYXBpdGFsaXplZF90eXBlIl0gPSAiU3RyaW5nIjsKKyAgKCp2YXJpYWJsZXMpWyJ0YWciXSA9IFNpbXBsZUl0b2EoV2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSk7CisgICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFNpbXBsZUl0b2EoCisgICAgICBXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3ItPm51bWJlcigpLCBHZXRUeXBlKGRlc2NyaXB0b3IpKSk7CisgICgqdmFyaWFibGVzKVsibnVsbF9jaGVjayJdID0KKyAgICAgICIgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCisgICAgICAiICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICAgIiAgfVxuIjsKKworICAvLyBUT0RPKGJpcmRvKTogQWRkIEBkZXByZWNhdGVkIGphdmFkb2Mgd2hlbiBnZW5lcmF0aW5nIGphdmFkb2MgaXMgc3VwcG9ydGVkCisgIC8vIGJ5IHRoZSBwcm90byBjb21waWxlcgorICAoKnZhcmlhYmxlcylbImRlcHJlY2F0aW9uIl0gPSBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpCisgICAgICA/ICJAamF2YS5sYW5nLkRlcHJlY2F0ZWQgIiA6ICIiOworICAoKnZhcmlhYmxlcylbIm9uX2NoYW5nZWQiXSA9CisgICAgICBIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSkgPyAib25DaGFuZ2VkKCk7IiA6ICIiOworCisgIC8vIEZvciBzaW5ndWxhciBtZXNzYWdlcyBhbmQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3IgdGhlIGhhc0ZpZWxkIGJpdC4KKyAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworCisgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KKyAgICAgIEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKKworICAvLyBGb3IgcmVwYXRlZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB3aGV0aGVyIHRoZSBhcnJheSBpcyBpbW11dGFibGUuCisgICgqdmFyaWFibGVzKVsiZ2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsiY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpOworCisgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCJdID0KKyAgICAgIEdlbmVyYXRlR2V0Qml0RnJvbUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwiXSA9CisgICAgICBHZW5lcmF0ZVNldEJpdFRvTG9jYWwobWVzc2FnZUJpdEluZGV4KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKKyAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCkgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVzXyk7Cit9CisKK1N0cmluZ0ZpZWxkR2VuZXJhdG9yOjp+U3RyaW5nRmllbGRHZW5lcmF0b3IoKSB7fQorCitpbnQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gMTsKK30KKworaW50IFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IHsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIEEgbm90ZSBhYm91dCBob3cgc3RyaW5ncyBhcmUgaGFuZGxlZC4gVGhpcyBjb2RlIHVzZWQgdG8ganVzdCBzdG9yZSBhIFN0cmluZworLy8gaW4gdGhlIE1lc3NhZ2UuIFRoaXMgaGFkIHR3byBpc3N1ZXM6CisvLworLy8gIDEuIEl0IHdvdWxkbid0IHJvdW5kdHJpcCBieXRlIGFycmF5cyB0aGF0IHdlcmUgbm90IHZhaWQgVVRGLTggZW5jb2RlZAorLy8gICAgIHN0cmluZ3MsIGJ1dCByYXRoZXIgZmllbGRzIHRoYXQgd2VyZSByYXcgYnl0ZXMgaW5jb3JyZWN0bHkgbWFya2VkCisvLyAgICAgYXMgc3RyaW5ncyBpbiB0aGUgcHJvdG8gZmlsZS4gVGhpcyBpcyBjb21tb24gYmVjYXVzZSBpbiB0aGUgcHJvdG8xCisvLyAgICAgc3ludGF4LCBzdHJpbmcgd2FzIHRoZSB3YXkgdG8gaW5kaWNhdGUgYnl0ZXMgYW5kIEMrKyBlbmdpbmVlcnMgY2FuCisvLyAgICAgZWFzaWx5IG1ha2UgdGhpcyBtaXN0YWtlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBDKysgQVBJLiBCeSBjb252ZXJ0aW5nIHRvCisvLyAgICAgc3RyaW5ncyBpbW1lZGlhdGVseSwgc29tZSBqYXZhIGNvZGUgbWlnaHQgY29ycnVwdCB0aGVzZSBieXRlIGFycmF5cyBhcworLy8gICAgIGl0IHBhc3NlcyB0aHJvdWdoIGEgamF2YSBzZXJ2ZXIgZXZlbiBpZiB0aGUgZmllbGQgd2FzIG5ldmVyIGFjY2Vzc2VkIGJ5CisvLyAgICAgYXBwbGljYXRpb24gY29kZS4KKy8vCisvLyAgMi4gVGhlcmUncyBhIHBlcmZvcm1hbmNlIGhpdCB0byBjb252ZXJ0aW5nIGJldHdlZW4gYnl0ZXMgYW5kIHN0cmluZ3MgYW5kCisvLyAgICAgaXQgbWFueSBjYXNlcywgdGhlIGZpZWxkIGlzIG5ldmVyIGV2ZW4gcmVhZCBieSB0aGUgYXBwbGljYXRpb24gY29kZS4gVGhpcworLy8gICAgIGF2b2lkcyB1bm5lY2Vzc2FyeSBjb252ZXJzaW9ucyBpbiB0aGUgY29tbW9uIHVzZSBjYXNlcy4KKy8vCisvLyBTbyBub3csIHRoZSBmaWVsZCBmb3IgU3RyaW5nIGlzIG1haW50YWluZWQgYXMgYW4gT2JqZWN0IHJlZmVyZW5jZSB3aGljaCBjYW4KKy8vIGVpdGhlciBzdG9yZSBhIFN0cmluZyBvciBhIEJ5dGVTdHJpbmcuIFRoZSBjb2RlIHVzZXMgYW4gaW5zdGFuY2VvZiBjaGVjaworLy8gdG8gc2VlIHdoaWNoIG9uZSBpdCBoYXMgYW5kIGNvbnZlcnRzIHRvIHRoZSBvdGhlciBvbmUgaWYgbmVlZGVkLiBJdCByZW1lbWJlcnMKKy8vIHRoZSBsYXN0IHZhbHVlIHJlcXVlc3RlZCAoaW4gYSB0aHJlYWQgc2FmZSBtYW5uZXIpIGFzIHRoaXMgaXMgbW9zdCBsaWtlbHkKKy8vIHRoZSBvbmUgbmVlZGVkIG5leHQuIFRoZSB0aHJlYWQgc2FmZXR5IGlzIHN1Y2ggdGhhdCBpZiB0d28gdGhyZWFkcyBib3RoCisvLyBjb252ZXJ0IHRoZSBmaWVsZCBiZWNhdXNlIHRoZSBjaGFuZ2VzIG1hZGUgYnkgZWFjaCB0aHJlYWQgd2VyZSBub3QgdmlzaWJsZSB0bworLy8gdGhlIG90aGVyLCB0aGV5IG1heSBjYXVzZSBhIGNvbnZlcnNpb24gdG8gaGFwcGVuIG1vcmUgdGltZXMgdGhhbiB3b3VsZAorLy8gb3RoZXJ3aXNlIGJlIG5lY2Vzc2FyeS4gVGhpcyB3YXMgZGVlbWVkIGJldHRlciB0aGFuIGFkZGluZyBzeW5jaHJvbml6YXRpb24KKy8vIG92ZXJoZWFkLiBJdCB3aWxsIG5vdCBjYXVzZSBhbnkgY29ycnVwdGlvbiBpc3N1ZXMgb3IgYWZmZWN0IHRoZSBiZWhhdmlvciBvZgorLy8gdGhlIEFQSS4gVGhlIGluc3RhbmNlb2YgY2hlY2sgaXMgYWxzbyBoaWdobHkgb3B0aW1pemVkIGluIHRoZSBKVk0gYW5kIHdlCisvLyBkZWNpZGVkIGl0IHdhcyBiZXR0ZXIgdG8gcmVkdWNlIHRoZSBtZW1vcnkgb3ZlcmhlYWQgYnkgbm90IGhhdmluZyB0d28KKy8vIHNlcGFyYXRlIGZpZWxkcyBidXQgcmF0aGVyIHVzZSBkeW5hbWljIHR5cGUgY2hlY2tpbmcuCisvLworLy8gRm9yIHNpbmdsZSBmaWVsZHMsIHRoZSBsb2dpYyBmb3IgdGhpcyBpcyBkb25lIGluc2lkZSB0aGUgZ2VuZXJhdGVkIGNvZGUuIEZvcgorLy8gcmVwZWF0ZWQgZmllbGRzLCB0aGUgbG9naWMgaXMgZG9uZSBpbiBMYXp5U3RyaW5nQXJyYXlMaXN0IGFuZAorLy8gVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QuCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKKyAgICAiJGRlcHJlY2F0aW9uJGphdmEubGFuZy5TdHJpbmcgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0ICRuYW1lJF87XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAifVxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICBqYXZhLmxhbmcuT2JqZWN0IHJlZiA9ICRuYW1lJF87XG4iCisgICAgIiAgaWYgKHJlZiBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcpIHtcbiIKKyAgICAiICAgIHJldHVybiAoamF2YS5sYW5nLlN0cmluZykgcmVmO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYnMgPSBcbiIKKyAgICAiICAgICAgICAoY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nKSByZWY7XG4iCisgICAgIiAgICBqYXZhLmxhbmcuU3RyaW5nIHMgPSBicy50b1N0cmluZ1V0ZjgoKTtcbiIKKyAgICAiICAgIGlmIChjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLmlzVmFsaWRVdGY4KGJzKSkge1xuIgorICAgICIgICAgICAkbmFtZSRfID0gcztcbiIKKyAgICAiICAgIH1cbiIKKyAgICAiICAgIHJldHVybiBzO1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIgorICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcygpIHtcbiIKKyAgICAiICBqYXZhLmxhbmcuT2JqZWN0IHJlZiA9ICRuYW1lJF87XG4iCisgICAgIiAgaWYgKHJlZiBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcpIHtcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBiID0gXG4iCisgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChcbiIKKyAgICAiICAgICAgICAgICAgKGphdmEubGFuZy5TdHJpbmcpIHJlZik7XG4iCisgICAgIiAgICAkbmFtZSRfID0gYjtcbiIKKyAgICAiICAgIHJldHVybiBiO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICByZXR1cm4gKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlIGphdmEubGFuZy5PYmplY3QgJG5hbWUkXyAkZGVmYXVsdF9pbml0JDtcbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICJ9XG4iKTsKKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIGphdmEubGFuZy5PYmplY3QgcmVmID0gJG5hbWUkXztcbiIKKyAgICAiICBpZiAoIShyZWYgaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nKSkge1xuIgorICAgICIgICAgamF2YS5sYW5nLlN0cmluZyBzID0gKChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZilcbiIKKyAgICAiICAgICAgICAudG9TdHJpbmdVdGY4KCk7XG4iCisgICAgIiAgICAkbmFtZSRfID0gcztcbiIKKyAgICAiICAgIHJldHVybiBzO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICByZXR1cm4gKGphdmEubGFuZy5TdHJpbmcpIHJlZjtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpOworCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgIiAgICBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgIiRudWxsX2NoZWNrJCIKKyAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICAkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIpOworICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgYSBzaW1wbGUgbGl0ZXJhbCBzbyB3ZSB3YW50IHRvIGF2b2lkIGV4ZWN1dGluZworICAvLyBpdCBtdWx0aXBsZSB0aW1lcy4gIEluc3RlYWQsIGdldCB0aGUgZGVmYXVsdCBvdXQgb2YgdGhlIGRlZmF1bHQgaW5zdGFuY2UuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiAgJG5hbWUkXyA9IGdldERlZmF1bHRJbnN0YW5jZSgpLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInZvaWQgc2V0JGNhcGl0YWxpemVkX25hbWUkKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyB2YWx1ZSkge1xuIgorICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSAgY29uc3QgeworICAvLyBub29wIGZvciBwcmltaXRpdmVzCit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIKKyAgICAiJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmIChvdGhlci5oYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSkge1xuIgorICAgICIgIHNldCRjYXBpdGFsaXplZF9uYW1lJChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCQpIHtcbiIKKyAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwkO1xuIgorICAgICJ9XG4iCisgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOworfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICIkbmFtZSRfID0gaW5wdXQucmVhZEJ5dGVzKCk7XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBvdXRwdXQud3JpdGVCeXRlcygkbnVtYmVyJCwgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoKSk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAiICAgIC5jb21wdXRlQnl0ZXNTaXplKCRudW1iZXIkLCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcygpKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInJlc3VsdCA9IHJlc3VsdCAmJiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgorICAgICIgICAgLmVxdWFscyhvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5oYXNoQ29kZSgpO1xuIik7Cit9CisKK3N0cmluZyBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gImphdmEubGFuZy5TdHJpbmciOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCkKKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgbWVzc2FnZUJpdEluZGV4XyhtZXNzYWdlQml0SW5kZXgpLAorICAgIGJ1aWxkZXJCaXRJbmRleF8oYnVpbGRlckJpdEluZGV4KSB7CisgIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZXNfKTsKK30KKworUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoKSB7fQorCitpbnQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7CisgIHJldHVybiAwOworfQorCitpbnQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CisgIHJldHVybiAxOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPlxuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpO1xuIgorICAgICIkZGVwcmVjYXRpb24kaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCk7XG4iCisgICAgIiRkZXByZWNhdGlvbiRqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpO1xuIik7Cit9CisKKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuTGF6eVN0cmluZ0xpc3QgJG5hbWUkXztcbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPlxuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXztcbiIgICAvLyBub3RlOiAgdW5tb2RpZmlhYmxlIGxpc3QKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCisgICAgIn1cbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgorICAgICJ9XG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSAmJgorICAgICAgSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJwcml2YXRlIGludCAkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7XG4iKTsKKyAgfQorfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBPbmUgZmllbGQgaXMgdGhlIGxpc3QgYW5kIHRoZSBiaXQgZmllbGQga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUKKyAgLy8gbGlzdCBpcyBpbW11dGFibGUuIElmIGl0J3MgaW1tdXRhYmxlLCB0aGUgaW52YXJpYW50IGlzIHRoYXQgaXQgbXVzdAorICAvLyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgb3IgaXQncyBhbiBBcnJheUxpc3QKKyAgLy8gd3JhcHBlZCBpbiBhIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKSB3cmFwcGVyIGFuZCBub2JvZHkgZWxzZSBoYXMKKyAgLy8gYSByZWZlcmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBBcnJheUxpc3QuIFRoaXMgaW52YXJpYW50IGFsbG93cyB1cyB0bworICAvLyBzaGFyZSBpbnN0YW5jZXMgb2YgbGlzdHMgYmV0d2VlbiBwcm90b2NvbCBidWZmZXJzIGF2b2lkaW5nIGV4cGVuc2l2ZQorICAvLyBtZW1vcnkgYWxsb2NhdGlvbnMuIE5vdGUsIGltbXV0YWJsZSBpcyBhIHN0cm9uZyBndWFyYW50ZWUgaGVyZSAtLSBub3QKKyAgLy8ganVzdCB0aGF0IHRoZSBsaXN0IGNhbm5vdCBiZSBtb2RpZmllZCB2aWEgdGhlIHJlZmVyZW5jZSBidXQgdGhhdCB0aGUKKyAgLy8gbGlzdCBjYW4gbmV2ZXIgYmUgbW9kaWZpZWQuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5MYXp5U3RyaW5nTGlzdCAkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIik7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSB2b2lkIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpIHtcbiIKKyAgICAiICBpZiAoISRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKKyAgICAiICAgICRuYW1lJF8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5MYXp5U3RyaW5nQXJyYXlMaXN0KCRuYW1lJF8pO1xuIgorICAgICIgICAgJHNldF9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiICAgfVxuIgorICAgICJ9XG4iKTsKKworICAgIC8vIE5vdGU6ICBXZSByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIGxpc3QgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGNhbGxlcgorICAgIC8vICAgY291bGQgaG9sZCBvbiB0byB0aGUgcmV0dXJuZWQgbGlzdCBhbmQgbW9kaWZ5IGl0IGFmdGVyIHRoZSBtZXNzYWdlCisgICAgLy8gICBoYXMgYmVlbiBidWlsdCwgdGh1cyBtdXRhdGluZyB0aGUgbWVzc2FnZSB3aGljaCBpcyBzdXBwb3NlZCB0byBiZQorICAgIC8vICAgaW1tdXRhYmxlLgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+XG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgorICAgICIgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCisgICAgIn1cbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgorICAgICJ9XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgIiAgICBpbnQgaW5kZXgsIGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHtcbiIKKyAgICAiJG51bGxfY2hlY2skIgorICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgICRuYW1lJF8uc2V0KGluZGV4LCB2YWx1ZSk7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJChcbiIKKyAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHtcbiIKKyAgICAiJG51bGxfY2hlY2skIgorICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgICRuYW1lJF8uYWRkKHZhbHVlKTtcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICIgICAgamF2YS5sYW5nLkl0ZXJhYmxlPGphdmEubGFuZy5TdHJpbmc+IHZhbHVlcykge1xuIgorICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICIgIHN1cGVyLmFkZEFsbCh2YWx1ZXMsICRuYW1lJF8pO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICAkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIgorICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIik7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAidm9pZCBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgIiAgJG5hbWUkXy5hZGQodmFsdWUpO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSAgY29uc3QgeworICAvLyBub29wIGZvciBwcmltaXRpdmVzCit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iCisgICAgIiRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBUaGUgY29kZSBiZWxvdyBkb2VzIHR3byBvcHRpbWl6YXRpb25zOgorICAvLyAgIDEuIElmIHRoZSBvdGhlciBsaXN0IGlzIGVtcHR5LCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uIFRoaXMgZW5zdXJlcyB3ZQorICAvLyAgICAgIGRvbid0IGFsbG9jYXRlIGEgbmV3IGFycmF5IGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBpbW11dGFibGUgb25lLgorICAvLyAgIDIuIElmIHRoZSBvdGhlciBsaXN0IGlzIG5vbi1lbXB0eSBhbmQgb3VyIGN1cnJlbnQgbGlzdCBpcyBlbXB0eSwgd2UgY2FuCisgIC8vICAgICAgcmV1c2UgdGhlIG90aGVyIGxpc3Qgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBpbW11dGFibGUuCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICghb3RoZXIuJG5hbWUkXy5pc0VtcHR5KCkpIHtcbiIKKyAgICAiICBpZiAoJG5hbWUkXy5pc0VtcHR5KCkpIHtcbiIKKyAgICAiICAgICRuYW1lJF8gPSBvdGhlci4kbmFtZSRfO1xuIgorICAgICIgICAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAiICAgICRuYW1lJF8uYWRkQWxsKG90aGVyLiRuYW1lJF8pO1xuIgorICAgICIgIH1cbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBUaGUgY29kZSBiZWxvdyBlbnN1cmVzIHRoYXQgdGhlIHJlc3VsdCBoYXMgYW4gaW1tdXRhYmxlIGxpc3QuIElmIG91cgorICAvLyBsaXN0IGlzIGltbXV0YWJsZSwgd2UgY2FuIGp1c3QgcmV1c2UgaXQuIElmIG5vdCwgd2UgbWFrZSBpdCBpbW11dGFibGUuCisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKKyAgICAiICAkbmFtZSRfID0gbmV3IGNvbS5nb29nbGUucHJvdG9idWYuVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QoXG4iCisgICAgIiAgICAgICRuYW1lJF8pO1xuIgorICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKKyAgICAifVxuIgorICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgIiRuYW1lJF8uYWRkKGlucHV0LnJlYWRCeXRlcygpKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiaW50IGxlbmd0aCA9IGlucHV0LnJlYWRSYXdWYXJpbnQzMigpO1xuIgorICAgICJpbnQgbGltaXQgPSBpbnB1dC5wdXNoTGltaXQobGVuZ3RoKTtcbiIKKyAgICAid2hpbGUgKGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkge1xuIgorICAgICIgIGFkZCRjYXBpdGFsaXplZF9uYW1lJChpbnB1dC5yZWFkJGNhcGl0YWxpemVkX3R5cGUkKCkpO1xuIgorICAgICJ9XG4iCisgICAgImlucHV0LnBvcExpbWl0KGxpbWl0KTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5zaXplKCkgPiAwKSB7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkdGFnJCk7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCisgICAgICAiICBvdXRwdXQud3JpdGUkY2FwaXRhbGl6ZWRfdHlwZSROb1RhZygkbmFtZSRfLmdldChpKSk7XG4iCisgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAgICIgIG91dHB1dC53cml0ZUJ5dGVzKCRudW1iZXIkLCAkbmFtZSRfLmdldEJ5dGVTdHJpbmcoaSkpO1xuIgorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJ7XG4iCisgICAgIiAgaW50IGRhdGFTaXplID0gMDtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAiICBkYXRhU2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCisgICAgIiAgICAuY29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKCRuYW1lJF8uZ2V0Qnl0ZVN0cmluZyhpKSk7XG4iCisgICAgIn1cbiIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICAgInNpemUgKz0gZGF0YVNpemU7XG4iKTsKKworICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKCFnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuaXNFbXB0eSgpKSB7XG4iCisgICAgICAiICBzaXplICs9ICR0YWdfc2l6ZSQ7XG4iCisgICAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAgICIgICAgICAuY29tcHV0ZUludDMyU2l6ZU5vVGFnKGRhdGFTaXplKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgInNpemUgKz0gJHRhZ19zaXplJCAqIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5zaXplKCk7XG4iKTsKKyAgfQorCisgIC8vIGNhY2hlIHRoZSBkYXRhIHNpemUgZm9yIHBhY2tlZCBmaWVsZHMuCisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInJlc3VsdCA9IHJlc3VsdCAmJiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KClcbiIKKyAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpKTtcbiIpOworfQorCit2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSA+IDApIHtcbiIKKyAgICAiICBoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iCisgICAgIiAgaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmhhc2hDb2RlKCk7XG4iCisgICAgIn1cbiIpOworfQorCitzdHJpbmcgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gIlN0cmluZyI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBqYXZhCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYjQxNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIEF1dGhvcjogam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfU1RSSU5HX0ZJRUxEX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9TVFJJTkdfRklFTERfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBqYXZhIHsKKworY2xhc3MgU3RyaW5nRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7CisgIH5TdHJpbmdGaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OworICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOworICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKKyAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN0cmluZ0ZpZWxkR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKKyAgflJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKKyAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICBzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CisgIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOworICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgamF2YQorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9TVFJJTkdfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWIwYzNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbWFpbi5jYwpAQCAtMCwwICsxLDYxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmg+CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworCisgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb21tYW5kTGluZUludGVyZmFjZSBjbGk7CisgIGNsaS5BbGxvd1BsdWdpbnMoInByb3RvYy0iKTsKKworICAvLyBQcm90bzIgQysrCisgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpjcHA6OkNwcEdlbmVyYXRvciBjcHBfZ2VuZXJhdG9yOworICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tY3BwX291dCIsICZjcHBfZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIEMrKyBoZWFkZXIgYW5kIHNvdXJjZS4iKTsKKworICAvLyBQcm90bzIgSmF2YQorICBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6amF2YTo6SmF2YUdlbmVyYXRvciBqYXZhX2dlbmVyYXRvcjsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWphdmFfb3V0IiwgJmphdmFfZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIEphdmEgc291cmNlIGZpbGUuIik7CisKKworICAvLyBQcm90bzIgUHl0aG9uCisgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpweXRob246OkdlbmVyYXRvciBweV9nZW5lcmF0b3I7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1weXRob25fb3V0IiwgJnB5X2dlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBQeXRob24gc291cmNlIGZpbGUuIik7CisKKyAgcmV0dXJuIGNsaS5SdW4oYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjc2YWYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDIzMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKKy8vIFJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIGZpbGVzIGluIGFsbF9maWxlcyBpbiB0aGUgZm9ybSBvZiBhCisvLyBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgorc3RyaW5nIENvbW1hU2VwYXJhdGVkTGlzdChjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBhbGxfZmlsZXMpIHsKKyAgdmVjdG9yPHN0cmluZz4gbmFtZXM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsX2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgbmFtZXMucHVzaF9iYWNrKGFsbF9maWxlc1tpXS0+bmFtZSgpKTsKKyAgfQorICByZXR1cm4gSm9pblN0cmluZ3MobmFtZXMsICIsIik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBrRmlyc3RJbnNlcnRpb25Qb2ludE5hbWUgPSAiZmlyc3RfbW9ja19pbnNlcnRpb25fcG9pbnQiOworc3RhdGljIGNvbnN0IGNoYXIqIGtTZWNvbmRJbnNlcnRpb25Qb2ludE5hbWUgPSAic2Vjb25kX21vY2tfaW5zZXJ0aW9uX3BvaW50IjsKK3N0YXRpYyBjb25zdCBjaGFyKiBrRmlyc3RJbnNlcnRpb25Qb2ludCA9CisgICAgIiMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpcnN0X21vY2tfaW5zZXJ0aW9uX3BvaW50KSBpcyBoZXJlXG4iOworc3RhdGljIGNvbnN0IGNoYXIqIGtTZWNvbmRJbnNlcnRpb25Qb2ludCA9CisgICAgIiAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2Vjb25kX21vY2tfaW5zZXJ0aW9uX3BvaW50KSBpcyBoZXJlXG4iOworCitNb2NrQ29kZUdlbmVyYXRvcjo6TW9ja0NvZGVHZW5lcmF0b3IoY29uc3Qgc3RyaW5nJiBuYW1lKQorICAgIDogbmFtZV8obmFtZSkge30KKworTW9ja0NvZGVHZW5lcmF0b3I6On5Nb2NrQ29kZUdlbmVyYXRvcigpIHt9CisKK3ZvaWQgTW9ja0NvZGVHZW5lcmF0b3I6OkV4cGVjdEdlbmVyYXRlZCgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25zLAorICAgIGNvbnN0IHN0cmluZyYgZmlsZSwKKyAgICBjb25zdCBzdHJpbmcmIGZpcnN0X21lc3NhZ2VfbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIGZpcnN0X3BhcnNlZF9maWxlX25hbWUsCisgICAgY29uc3Qgc3RyaW5nJiBvdXRwdXRfZGlyZWN0b3J5KSB7CisgIHN0cmluZyBjb250ZW50OworICBBU1NFUlRfVFJVRShGaWxlOjpSZWFkRmlsZVRvU3RyaW5nKAorICAgICAgb3V0cHV0X2RpcmVjdG9yeSArICIvIiArIEdldE91dHB1dEZpbGVOYW1lKG5hbWUsIGZpbGUpLCAmY29udGVudCkpOworCisgIHZlY3RvcjxzdHJpbmc+IGxpbmVzOworICBTcGxpdFN0cmluZ1VzaW5nKGNvbnRlbnQsICJcbiIsICZsaW5lcyk7CisKKyAgd2hpbGUgKCFsaW5lcy5lbXB0eSgpICYmIGxpbmVzLmJhY2soKS5lbXB0eSgpKSB7CisgICAgbGluZXMucG9wX2JhY2soKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgbGluZXNbaV0gKz0gIlxuIjsKKyAgfQorCisgIHZlY3RvcjxzdHJpbmc+IGluc2VydGlvbl9saXN0OworICBpZiAoIWluc2VydGlvbnMuZW1wdHkoKSkgeworICAgIFNwbGl0U3RyaW5nVXNpbmcoaW5zZXJ0aW9ucywgIiwiLCAmaW5zZXJ0aW9uX2xpc3QpOworICB9CisKKyAgQVNTRVJUX0VRKGxpbmVzLnNpemUoKSwgMyArIGluc2VydGlvbl9saXN0LnNpemUoKSAqIDIpOworICBFWFBFQ1RfRVEoR2V0T3V0cHV0RmlsZUNvbnRlbnQobmFtZSwgcGFyYW1ldGVyLCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfcGFyc2VkX2ZpbGVfbmFtZSwgZmlyc3RfbWVzc2FnZV9uYW1lKSwKKyAgICAgICAgICAgIGxpbmVzWzBdKTsKKworICBFWFBFQ1RfRVEoa0ZpcnN0SW5zZXJ0aW9uUG9pbnQsIGxpbmVzWzEgKyBpbnNlcnRpb25fbGlzdC5zaXplKCldKTsKKyAgRVhQRUNUX0VRKGtTZWNvbmRJbnNlcnRpb25Qb2ludCwgbGluZXNbMiArIGluc2VydGlvbl9saXN0LnNpemUoKSAqIDJdKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGluc2VydGlvbl9saXN0LnNpemUoKTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKEdldE91dHB1dEZpbGVDb250ZW50KGluc2VydGlvbl9saXN0W2ldLCAiZmlyc3RfaW5zZXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgZmlsZSwgZmlyc3RfbWVzc2FnZV9uYW1lKSwKKyAgICAgICAgICAgICAgbGluZXNbMSArIGldKTsKKyAgICAvLyBTZWNvbmQgaW5zZXJ0aW9uIHBvaW50IGlzIGluZGVudGVkLCBzbyB0aGUgaW5zZXJ0ZWQgdGV4dCBzaG91bGQKKyAgICAvLyBhdXRvbWF0aWNhbGx5IGJlIGluZGVudGVkIHRvby4KKyAgICBFWFBFQ1RfRVEoIiAgIiArIEdldE91dHB1dEZpbGVDb250ZW50KGluc2VydGlvbl9saXN0W2ldLCAic2Vjb25kX2luc2VydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBmaWxlLCBmaXJzdF9tZXNzYWdlX25hbWUpLAorICAgICAgICAgICAgICBsaW5lc1syICsgaW5zZXJ0aW9uX2xpc3Quc2l6ZSgpICsgaV0pOworICB9Cit9CisKK2Jvb2wgTW9ja0NvZGVHZW5lcmF0b3I6OkdlbmVyYXRlKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCisgICAgc3RyaW5nKiBlcnJvcikgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoSGFzUHJlZml4U3RyaW5nKGZpbGUtPm1lc3NhZ2VfdHlwZShpKS0+bmFtZSgpLCAiTW9ja0NvZGVHZW5lcmF0b3JfIikpIHsKKyAgICAgIHN0cmluZyBjb21tYW5kID0gU3RyaXBQcmVmaXhTdHJpbmcoZmlsZS0+bWVzc2FnZV90eXBlKGkpLT5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb2NrQ29kZUdlbmVyYXRvcl8iKTsKKyAgICAgIGlmIChjb21tYW5kID09ICJFcnJvciIpIHsKKyAgICAgICAgKmVycm9yID0gIlNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfRXJyb3IuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09ICJFeGl0IikgeworICAgICAgICBjZXJyIDw8ICJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0V4aXQuIiA8PCBlbmRsOworICAgICAgICBleGl0KDEyMyk7CisgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gIkFib3J0IikgeworICAgICAgICBjZXJyIDw8ICJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0Fib3J0LiIgPDwgZW5kbDsKKyAgICAgICAgYWJvcnQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmtub3duIE1vY2tDb2RlR2VuZXJhdG9yIGNvbW1hbmQ6ICIgPDwgY29tbWFuZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoSGFzUHJlZml4U3RyaW5nKHBhcmFtZXRlciwgImluc2VydD0iKSkgeworICAgIHZlY3RvcjxzdHJpbmc+IGluc2VydF9pbnRvOworICAgIFNwbGl0U3RyaW5nVXNpbmcoU3RyaXBQcmVmaXhTdHJpbmcocGFyYW1ldGVyLCAiaW5zZXJ0PSIpLAorICAgICAgICAgICAgICAgICAgICAgIiwiLCAmaW5zZXJ0X2ludG8pOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnNlcnRfaW50by5zaXplKCk7IGkrKykgeworICAgICAgeworICAgICAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydCgKKyAgICAgICAgICAgICAgR2V0T3V0cHV0RmlsZU5hbWUoaW5zZXJ0X2ludG9baV0sIGZpbGUpLAorICAgICAgICAgICAgICBrRmlyc3RJbnNlcnRpb25Qb2ludE5hbWUpKTsKKyAgICAgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgICAgICAgIHByaW50ZXIuUHJpbnRSYXcoR2V0T3V0cHV0RmlsZUNvbnRlbnQobmFtZV8sICJmaXJzdF9pbnNlcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGNvbnRleHQpKTsKKyAgICAgICAgaWYgKHByaW50ZXIuZmFpbGVkKCkpIHsKKyAgICAgICAgICAqZXJyb3IgPSAiTW9ja0NvZGVHZW5lcmF0b3IgZGV0ZWN0ZWQgd3JpdGUgZXJyb3IuIjsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgeworICAgICAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydCgKKyAgICAgICAgICAgICAgR2V0T3V0cHV0RmlsZU5hbWUoaW5zZXJ0X2ludG9baV0sIGZpbGUpLAorICAgICAgICAgICAgICBrU2Vjb25kSW5zZXJ0aW9uUG9pbnROYW1lKSk7CisgICAgICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOworICAgICAgICBwcmludGVyLlByaW50UmF3KEdldE91dHB1dEZpbGVDb250ZW50KG5hbWVfLCAic2Vjb25kX2luc2VydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgY29udGV4dCkpOworICAgICAgICBpZiAocHJpbnRlci5mYWlsZWQoKSkgeworICAgICAgICAgICplcnJvciA9ICJNb2NrQ29kZUdlbmVyYXRvciBkZXRlY3RlZCB3cml0ZSBlcnJvci4iOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgICBjb250ZXh0LT5PcGVuKEdldE91dHB1dEZpbGVOYW1lKG5hbWVfLCBmaWxlKSkpOworCisgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgICAgcHJpbnRlci5QcmludFJhdyhHZXRPdXRwdXRGaWxlQ29udGVudChuYW1lXywgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgY29udGV4dCkpOworICAgIHByaW50ZXIuUHJpbnRSYXcoa0ZpcnN0SW5zZXJ0aW9uUG9pbnQpOworICAgIHByaW50ZXIuUHJpbnRSYXcoa1NlY29uZEluc2VydGlvblBvaW50KTsKKworICAgIGlmIChwcmludGVyLmZhaWxlZCgpKSB7CisgICAgICAqZXJyb3IgPSAiTW9ja0NvZGVHZW5lcmF0b3IgZGV0ZWN0ZWQgd3JpdGUgZXJyb3IuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RyaW5nIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlTmFtZShjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICByZXR1cm4gR2V0T3V0cHV0RmlsZU5hbWUoZ2VuZXJhdG9yX25hbWUsIGZpbGUtPm5hbWUoKSk7Cit9CisKK3N0cmluZyBNb2NrQ29kZUdlbmVyYXRvcjo6R2V0T3V0cHV0RmlsZU5hbWUoY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlKSB7CisgIHJldHVybiBmaWxlICsgIi5Nb2NrQ29kZUdlbmVyYXRvci4iICsgZ2VuZXJhdG9yX25hbWU7Cit9CisKK3N0cmluZyBNb2NrQ29kZUdlbmVyYXRvcjo6R2V0T3V0cHV0RmlsZUNvbnRlbnQoCisgICAgY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICBHZW5lcmF0b3JDb250ZXh0ICpjb250ZXh0KSB7CisgIHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+IGFsbF9maWxlczsKKyAgY29udGV4dC0+TGlzdFBhcnNlZEZpbGVzKCZhbGxfZmlsZXMpOworICByZXR1cm4gR2V0T3V0cHV0RmlsZUNvbnRlbnQoCisgICAgICBnZW5lcmF0b3JfbmFtZSwgcGFyYW1ldGVyLCBmaWxlLT5uYW1lKCksCisgICAgICBDb21tYVNlcGFyYXRlZExpc3QoYWxsX2ZpbGVzKSwKKyAgICAgIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpID4gMCA/CisgICAgICAgICAgZmlsZS0+bWVzc2FnZV90eXBlKDApLT5uYW1lKCkgOiAiKG5vbmUpIik7Cit9CisKK3N0cmluZyBNb2NrQ29kZUdlbmVyYXRvcjo6R2V0T3V0cHV0RmlsZUNvbnRlbnQoCisgICAgY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICBjb25zdCBzdHJpbmcmIGZpbGUsCisgICAgY29uc3Qgc3RyaW5nJiBwYXJzZWRfZmlsZV9saXN0LAorICAgIGNvbnN0IHN0cmluZyYgZmlyc3RfbWVzc2FnZV9uYW1lKSB7CisgIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKCIkMDogJDEsICQyLCAkMywgJDRcbiIsCisgICAgICBnZW5lcmF0b3JfbmFtZSwgcGFyYW1ldGVyLCBmaWxlLAorICAgICAgZmlyc3RfbWVzc2FnZV9uYW1lLCBwYXJzZWRfZmlsZV9saXN0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzc5NDJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTEzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX01PQ0tfQ09ERV9HRU5FUkFUT1JfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9NT0NLX0NPREVfR0VORVJBVE9SX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCisvLyBBIG1vY2sgQ29kZUdlbmVyYXRvciwgdXNlZCBieSBjb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LiAgVGhpcyBpcyBpbgorLy8gaXRzIG93biBmaWxlIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYm90aCBkaXJlY3RseSBhbmQgYXMgYSBwbHVnaW4uCisvLworLy8gR2VuZXJhdGUoKSBwcm9kdWNlcyBzb21lIG91dHB1dCB3aGljaCBjYW4gYmUgY2hlY2tlZCBieSBFeHBlY3RDYWxsZWQoKS4gIFRoZQorLy8gZ2VuZXJhdG9yIGNhbiBydW4gaW4gYSBkaWZmZXJlbnQgcHJvY2VzcyAoZS5nLiBhIHBsdWdpbikuCisvLworLy8gSWYgdGhlIHBhcmFtZXRlciBpcyAiaW5zZXJ0PU5BTUVTIiwgdGhlIE1vY2tDb2RlR2VuZXJhdG9yIHdpbGwgaW5zZXJ0IGxpbmVzCisvLyBpbnRvIHRoZSBmaWxlcyBnZW5lcmF0ZWQgYnkgb3RoZXIgTW9ja0NvZGVHZW5lcmF0b3JzIGluc3RlYWQgb2YgY3JlYXRpbmcKKy8vIGl0cyBvd24gZmlsZS4gIE5BTUVTIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIHRob3NlIG90aGVyCisvLyBNb2NrQ29kZUdlbmVyYXRvcnMuCisvLworLy8gTW9ja0NvZGVHZW5lcmF0b3Igd2lsbCBhbHNvIG1vZGlmeSBpdHMgYmVoYXZpb3Igc2xpZ2h0bHkgaWYgdGhlIGlucHV0IGZpbGUKKy8vIGNvbnRhaW5zIGEgbWVzc2FnZSB0eXBlIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgbmFtZXM6CisvLyAgIE1vY2tDb2RlR2VuZXJhdG9yX0Vycm9yOiAgQ2F1c2VzIEdlbmVyYXRlKCkgdG8gcmV0dXJuIGZhbHNlIGFuZCBzZXQgdGhlCisvLyAgICAgZXJyb3IgbWVzc2FnZSB0byAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9FcnJvci4iCisvLyAgIE1vY2tDb2RlR2VuZXJhdG9yX0V4aXQ6ICBHZW5lcmF0ZSgpIHByaW50cyAiU2F3IG1lc3NhZ2UgdHlwZQorLy8gICAgIE1vY2tDb2RlR2VuZXJhdG9yX0V4aXQuIiB0byBzdGRlcnIgYW5kIHRoZW4gY2FsbHMgZXhpdCgxMjMpLgorLy8gICBNb2NrQ29kZUdlbmVyYXRvcl9BYm9ydDogIEdlbmVyYXRlKCkgcHJpbnRzICJTYXcgbWVzc2FnZSB0eXBlCisvLyAgICAgTW9ja0NvZGVHZW5lcmF0b3JfQWJvcnQuIiB0byBzdGRlcnIgYW5kIHRoZW4gY2FsbHMgYWJvcnQoKS4KK2NsYXNzIE1vY2tDb2RlR2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgTW9ja0NvZGVHZW5lcmF0b3IoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKyAgdmlydHVhbCB+TW9ja0NvZGVHZW5lcmF0b3IoKTsKKworICAvLyBFeHBlY3QgKHZpYSBnVGVzdCkgdGhhdCBhIE1vY2tDb2RlR2VuZXJhdG9yIHdpdGggdGhlIGdpdmVuIG5hbWUgd2FzIGNhbGxlZAorICAvLyB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIGJ5IGluc3BlY3RpbmcgdGhlIG91dHB1dCBsb2NhdGlvbi4KKyAgLy8KKyAgLy8gfGluc2VydGlvbnN8IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbmFtZXMgb2YgTW9ja0NvZGVHZW5lcmF0b3JzIHdoaWNoCisgIC8vIHNob3VsZCBoYXZlIGluc2VydGVkIGxpbmVzIGludG8gdGhpcyBmaWxlLgorICAvLyB8cGFyc2VkX2ZpbGVfbGlzdHwgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBuYW1lcyBvZiB0aGUgZmlsZXMKKyAgLy8gdGhhdCBhcmUgYmVpbmcgY29tcGlsZWQgdG9nZXRoZXIgaW4gdGhpcyBydW4uCisgIHN0YXRpYyB2b2lkIEV4cGVjdEdlbmVyYXRlZChjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmlyc3RfbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJzZWRfZmlsZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvdXRwdXRfZGlyZWN0b3J5KTsKKworICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2hpY2ggd291bGQgYmUgd3JpdHRlbiBieSB0aGUgZ2l2ZW4gZ2VuZXJhdG9yLgorICBzdGF0aWMgc3RyaW5nIEdldE91dHB1dEZpbGVOYW1lKGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworICBzdGF0aWMgc3RyaW5nIEdldE91dHB1dEZpbGVOYW1lKGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlKTsKKworICAvLyBpbXBsZW1lbnRzIENvZGVHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHZpcnR1YWwgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgc3RyaW5nIG5hbWVfOworCisgIHN0YXRpYyBzdHJpbmcgR2V0T3V0cHV0RmlsZUNvbnRlbnQoY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0ICpjb250ZXh0KTsKKyAgc3RhdGljIHN0cmluZyBHZXRPdXRwdXRGaWxlQ29udGVudChjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcnNlZF9maWxlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaXJzdF9tZXNzYWdlX25hbWUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfTU9DS19DT0RFX0dFTkVSQVRPUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhY2thZ2VfaW5mby5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFja2FnZV9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5NzEyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhY2thZ2VfaW5mby5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBleGlzdHMgc29sZWx5IHRvIGRvY3VtZW50IHRoZSBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlciBuYW1lc3BhY2UuCisvLyBJdCBpcyBub3QgY29tcGlsZWQgaW50byBhbnl0aGluZywgYnV0IGl0IG1heSBiZSByZWFkIGJ5IGFuIGF1dG9tYXRlZAorLy8gZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IuCisKK25hbWVzcGFjZSBnb29nbGUgeworCituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJvdG9jb2wgQnVmZmVyIGNvbXBpbGVyLgorLy8KKy8vIFRoaXMgcGFja2FnZSBjb250YWlucyBjb2RlIGZvciBwYXJzaW5nIC5wcm90byBmaWxlcyBhbmQgZ2VuZXJhdGluZyBjb2RlCisvLyBiYXNlZCBvbiB0aGVtLiAgVGhlcmUgYXJlIHR3byByZWFzb25zIHlvdSBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMKKy8vIHBhY2thZ2U6CisvLyAtIFlvdSB3YW50IHRvIHBhcnNlIC5wcm90byBmaWxlcyBhdCBydW50aW1lLiAgSW4gdGhpcyBjYXNlLCB5b3Ugc2hvdWxkCisvLyAgIGxvb2sgYXQgaW1wb3J0ZXIuaC4gIFNpbmNlIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyB3aWRlbHkgdXNlZnVsLCBpdCBpcworLy8gICBpbmNsdWRlZCBpbiB0aGUgbGlicHJvdG9idWYgYmFzZSBsaWJyYXJ5OyB5b3UgZG8gbm90IGhhdmUgdG8gbGluayBhZ2FpbnN0CisvLyAgIGxpYnByb3RvYy4KKy8vIC0gWW91IHdhbnQgdG8gd3JpdGUgYSBjdXN0b20gcHJvdG9jb2wgY29tcGlsZXIgd2hpY2ggZ2VuZXJhdGVzIGRpZmZlcmVudAorLy8gICBraW5kcyBvZiBjb2RlLCBlLmcuIGNvZGUgaW4gYSBkaWZmZXJlbnQgbGFuZ3VhZ2Ugd2hpY2ggaXMgbm90IHN1cHBvcnRlZAorLy8gICBieSB0aGUgb2ZmaWNpYWwgY29tcGlsZXIuICBGb3IgdGhpcyBwdXJwb3NlLCBjb21tYW5kX2xpbmVfaW50ZXJmYWNlLmgKKy8vICAgcHJvdmlkZXMgeW91IHdpdGggYSBjb21wbGV0ZSBjb21waWxlciBmcm9udC1lbmQsIHNvIGFsbCB5b3UgbmVlZCB0byBkbworLy8gICBpcyB3cml0ZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBDb2RlR2VuZXJhdG9yIGFuZCBhIHRyaXZpYWwgbWFpbigpCisvLyAgIGZ1bmN0aW9uLiAgWW91IGNhbiBldmVuIG1ha2UgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBvZmZpY2lhbCBsYW5ndWFnZXMKKy8vICAgaW4gYWRkaXRpb24gdG8geW91ciBvd24uICBTaW5jZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgb25seSB1c2VmdWwgdG8gdGhvc2UKKy8vICAgd3JpdGluZyBjdXN0b20gY29tcGlsZXJzLCBpdCBpcyBpbiBhIHNlcGFyYXRlIGxpYnJhcnkgY2FsbGVkICJsaWJwcm90b2MiCisvLyAgIHdoaWNoIHlvdSB3aWxsIGhhdmUgdG8gbGluayBhZ2FpbnN0LgorbmFtZXNwYWNlIGNvbXBpbGVyIHt9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzE3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuY2MKQEAgLTAsMCArMSwxNDczIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBSZWN1cnNpdmUgZGVzY2VudCBGVFcuCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisjaW5jbHVkZSA8bGltaXRzPgorCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7CisKK25hbWVzcGFjZSB7CisKK3R5cGVkZWYgaGFzaF9tYXA8c3RyaW5nLCBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZT4gVHlwZU5hbWVNYXA7CisKK1R5cGVOYW1lTWFwIE1ha2VUeXBlTmFtZVRhYmxlKCkgeworICBUeXBlTmFtZU1hcCByZXN1bHQ7CisKKyAgcmVzdWx0WyJkb3VibGUiICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRE9VQkxFOworICByZXN1bHRbImZsb2F0IiAgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GTE9BVDsKKyAgcmVzdWx0WyJ1aW50NjQiICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfVUlOVDY0OworICByZXN1bHRbImZpeGVkNjQiIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GSVhFRDY0OworICByZXN1bHRbImZpeGVkMzIiIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GSVhFRDMyOworICByZXN1bHRbImJvb2wiICAgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9CT09MOworICByZXN1bHRbInN0cmluZyIgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkc7CisgIHJlc3VsdFsiZ3JvdXAiICAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0dST1VQOworCisgIHJlc3VsdFsiYnl0ZXMiICAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JZVEVTOworICByZXN1bHRbInVpbnQzMiIgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9VSU5UMzI7CisgIHJlc3VsdFsic2ZpeGVkMzIiXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NGSVhFRDMyOworICByZXN1bHRbInNmaXhlZDY0Il0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TRklYRUQ2NDsKKyAgcmVzdWx0WyJpbnQzMiIgICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzI7CisgIHJlc3VsdFsiaW50NjQiICAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDY0OworICByZXN1bHRbInNpbnQzMiIgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UMzI7CisgIHJlc3VsdFsic2ludDY0IiAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NJTlQ2NDsKKworICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBUeXBlTmFtZU1hcCBrVHlwZU5hbWVzID0gTWFrZVR5cGVOYW1lVGFibGUoKTsKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBNYWtlcyBjb2RlIHNsaWdodGx5IG1vcmUgcmVhZGFibGUuICBUaGUgbWVhbmluZyBvZiAiRE8oZm9vKSIgaXMKKy8vICJFeGVjdXRlIGZvbyBhbmQgZmFpbCBpZiBpdCBmYWlscy4iLCB3aGVyZSBmYWlsdXJlIGlzIGluZGljYXRlZCBieQorLy8gcmV0dXJuaW5nIGZhbHNlLgorI2RlZmluZSBETyhTVEFURU1FTlQpIGlmIChTVEFURU1FTlQpIHt9IGVsc2UgcmV0dXJuIGZhbHNlCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUGFyc2VyOjpQYXJzZXIoKQorICA6IGlucHV0XyhOVUxMKSwKKyAgICBlcnJvcl9jb2xsZWN0b3JfKE5VTEwpLAorICAgIHNvdXJjZV9sb2NhdGlvbl90YWJsZV8oTlVMTCksCisgICAgaGFkX2Vycm9yc18oZmFsc2UpLAorICAgIHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfKGZhbHNlKSwKKyAgICBzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXyhmYWxzZSkgeworfQorCitQYXJzZXI6On5QYXJzZXIoKSB7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5saW5lIGJvb2wgUGFyc2VyOjpMb29raW5nQXQoY29uc3QgY2hhciogdGV4dCkgeworICByZXR1cm4gaW5wdXRfLT5jdXJyZW50KCkudGV4dCA9PSB0ZXh0OworfQorCitpbmxpbmUgYm9vbCBQYXJzZXI6Okxvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VG9rZW5UeXBlIHRva2VuX3R5cGUpIHsKKyAgcmV0dXJuIGlucHV0Xy0+Y3VycmVudCgpLnR5cGUgPT0gdG9rZW5fdHlwZTsKK30KKworaW5saW5lIGJvb2wgUGFyc2VyOjpBdEVuZCgpIHsKKyAgcmV0dXJuIExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9FTkQpOworfQorCitib29sIFBhcnNlcjo6VHJ5Q29uc3VtZShjb25zdCBjaGFyKiB0ZXh0KSB7CisgIGlmIChMb29raW5nQXQodGV4dCkpIHsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OkNvbnN1bWUoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgaWYgKFRyeUNvbnN1bWUodGV4dCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcihlcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpDb25zdW1lKGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgaWYgKFRyeUNvbnN1bWUodGV4dCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcigiRXhwZWN0ZWQgXCIiICsgc3RyaW5nKHRleHQpICsgIlwiLiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6Q29uc3VtZUlkZW50aWZpZXIoc3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKSB7CisgIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUikpIHsKKyAgICAqb3V0cHV0ID0gaW5wdXRfLT5jdXJyZW50KCkudGV4dDsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcihlcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpDb25zdW1lSW50ZWdlcihpbnQqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSkgeworICAgIHVpbnQ2NCB2YWx1ZSA9IDA7CisgICAgaWYgKCFpbzo6VG9rZW5pemVyOjpQYXJzZUludGVnZXIoaW5wdXRfLT5jdXJyZW50KCkudGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW50MzJtYXgsICZ2YWx1ZSkpIHsKKyAgICAgIEFkZEVycm9yKCJJbnRlZ2VyIG91dCBvZiByYW5nZS4iKTsKKyAgICAgIC8vIFdlIHN0aWxsIHJldHVybiB0cnVlIGJlY2F1c2Ugd2UgZGlkLCBpbiBmYWN0LCBwYXJzZSBhbiBpbnRlZ2VyLgorICAgIH0KKyAgICAqb3V0cHV0ID0gdmFsdWU7CisgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgQWRkRXJyb3IoZXJyb3IpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6Q29uc3VtZUludGVnZXI2NCh1aW50NjQgbWF4X3ZhbHVlLCB1aW50NjQqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yKSB7CisgIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSU5URUdFUikpIHsKKyAgICBpZiAoIWlvOjpUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcihpbnB1dF8tPmN1cnJlbnQoKS50ZXh0LCBtYXhfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KSkgeworICAgICAgQWRkRXJyb3IoIkludGVnZXIgb3V0IG9mIHJhbmdlLiIpOworICAgICAgLy8gV2Ugc3RpbGwgcmV0dXJuIHRydWUgYmVjYXVzZSB3ZSBkaWQsIGluIGZhY3QsIHBhcnNlIGFuIGludGVnZXIuCisgICAgICAqb3V0cHV0ID0gMDsKKyAgICB9CisgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgQWRkRXJyb3IoZXJyb3IpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6Q29uc3VtZU51bWJlcihkb3VibGUqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9GTE9BVCkpIHsKKyAgICAqb3V0cHV0ID0gaW86OlRva2VuaXplcjo6UGFyc2VGbG9hdChpbnB1dF8tPmN1cnJlbnQoKS50ZXh0KTsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSU5URUdFUikpIHsKKyAgICAvLyBBbHNvIGFjY2VwdCBpbnRlZ2Vycy4KKyAgICB1aW50NjQgdmFsdWUgPSAwOworICAgIGlmICghaW86OlRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKGlucHV0Xy0+Y3VycmVudCgpLnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3VpbnQ2NG1heCwgJnZhbHVlKSkgeworICAgICAgQWRkRXJyb3IoIkludGVnZXIgb3V0IG9mIHJhbmdlLiIpOworICAgICAgLy8gV2Ugc3RpbGwgcmV0dXJuIHRydWUgYmVjYXVzZSB3ZSBkaWQsIGluIGZhY3QsIHBhcnNlIGEgbnVtYmVyLgorICAgIH0KKyAgICAqb3V0cHV0ID0gdmFsdWU7CisgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJpbmYiKSkgeworICAgICpvdXRwdXQgPSBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOworICAgIGlucHV0Xy0+TmV4dCgpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgibmFuIikpIHsKKyAgICAqb3V0cHV0ID0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCk7CisgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgQWRkRXJyb3IoZXJyb3IpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6Q29uc3VtZVN0cmluZyhzdHJpbmcqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpIHsKKyAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgaW86OlRva2VuaXplcjo6UGFyc2VTdHJpbmcoaW5wdXRfLT5jdXJyZW50KCkudGV4dCwgb3V0cHV0KTsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICAvLyBBbGxvdyBDKysgbGlrZSBjb25jYXRlbmF0aW9uIG9mIGFkamFjZW50IHN0cmluZyB0b2tlbnMuCisgICAgd2hpbGUgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgICBpbzo6VG9rZW5pemVyOjpQYXJzZVN0cmluZ0FwcGVuZChpbnB1dF8tPmN1cnJlbnQoKS50ZXh0LCBvdXRwdXQpOworICAgICAgaW5wdXRfLT5OZXh0KCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIEFkZEVycm9yKGVycm9yKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFBhcnNlcjo6QWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgZXJyb3IpIHsKKyAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gIT0gTlVMTCkgeworICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGxpbmUsIGNvbHVtbiwgZXJyb3IpOworICB9CisgIGhhZF9lcnJvcnNfID0gdHJ1ZTsKK30KKwordm9pZCBQYXJzZXI6OkFkZEVycm9yKGNvbnN0IHN0cmluZyYgZXJyb3IpIHsKKyAgQWRkRXJyb3IoaW5wdXRfLT5jdXJyZW50KCkubGluZSwgaW5wdXRfLT5jdXJyZW50KCkuY29sdW1uLCBlcnJvcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpMb2NhdGlvblJlY29yZGVyKFBhcnNlciogcGFyc2VyKQorICA6IHBhcnNlcl8ocGFyc2VyKSwKKyAgICBsb2NhdGlvbl8ocGFyc2VyXy0+c291cmNlX2NvZGVfaW5mb18tPmFkZF9sb2NhdGlvbigpKSB7CisgIGxvY2F0aW9uXy0+YWRkX3NwYW4ocGFyc2VyXy0+aW5wdXRfLT5jdXJyZW50KCkubGluZSk7CisgIGxvY2F0aW9uXy0+YWRkX3NwYW4ocGFyc2VyXy0+aW5wdXRfLT5jdXJyZW50KCkuY29sdW1uKTsKK30KKworUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpMb2NhdGlvblJlY29yZGVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCkgeworICBJbml0KHBhcmVudCk7Cit9CisKK1BhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6TG9jYXRpb25SZWNvcmRlcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhdGgxKSB7CisgIEluaXQocGFyZW50KTsKKyAgQWRkUGF0aChwYXRoMSk7Cit9CisKK1BhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6TG9jYXRpb25SZWNvcmRlcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhdGgxLCBpbnQgcGF0aDIpIHsKKyAgSW5pdChwYXJlbnQpOworICBBZGRQYXRoKHBhdGgxKTsKKyAgQWRkUGF0aChwYXRoMik7Cit9CisKK3ZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpJbml0KGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCkgeworICBwYXJzZXJfID0gcGFyZW50LnBhcnNlcl87CisgIGxvY2F0aW9uXyA9IHBhcnNlcl8tPnNvdXJjZV9jb2RlX2luZm9fLT5hZGRfbG9jYXRpb24oKTsKKyAgbG9jYXRpb25fLT5tdXRhYmxlX3BhdGgoKS0+Q29weUZyb20ocGFyZW50LmxvY2F0aW9uXy0+cGF0aCgpKTsKKworICBsb2NhdGlvbl8tPmFkZF9zcGFuKHBhcnNlcl8tPmlucHV0Xy0+Y3VycmVudCgpLmxpbmUpOworICBsb2NhdGlvbl8tPmFkZF9zcGFuKHBhcnNlcl8tPmlucHV0Xy0+Y3VycmVudCgpLmNvbHVtbik7Cit9CisKK1BhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6fkxvY2F0aW9uUmVjb3JkZXIoKSB7CisgIGlmIChsb2NhdGlvbl8tPnNwYW5fc2l6ZSgpIDw9IDIpIHsKKyAgICBFbmRBdChwYXJzZXJfLT5pbnB1dF8tPnByZXZpb3VzKCkpOworICB9Cit9CisKK3ZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpBZGRQYXRoKGludCBwYXRoX2NvbXBvbmVudCkgeworICBsb2NhdGlvbl8tPmFkZF9wYXRoKHBhdGhfY29tcG9uZW50KTsKK30KKwordm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OlN0YXJ0QXQoY29uc3QgaW86OlRva2VuaXplcjo6VG9rZW4mIHRva2VuKSB7CisgIGxvY2F0aW9uXy0+c2V0X3NwYW4oMCwgdG9rZW4ubGluZSk7CisgIGxvY2F0aW9uXy0+c2V0X3NwYW4oMSwgdG9rZW4uY29sdW1uKTsKK30KKwordm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkVuZEF0KGNvbnN0IGlvOjpUb2tlbml6ZXI6OlRva2VuJiB0b2tlbikgeworICBpZiAodG9rZW4ubGluZSAhPSBsb2NhdGlvbl8tPnNwYW4oMCkpIHsKKyAgICBsb2NhdGlvbl8tPmFkZF9zcGFuKHRva2VuLmxpbmUpOworICB9CisgIGxvY2F0aW9uXy0+YWRkX3NwYW4odG9rZW4uZW5kX2NvbHVtbik7Cit9CisKK3ZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpSZWNvcmRMZWdhY3lMb2NhdGlvbihjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbikgeworICBpZiAocGFyc2VyXy0+c291cmNlX2xvY2F0aW9uX3RhYmxlXyAhPSBOVUxMKSB7CisgICAgcGFyc2VyXy0+c291cmNlX2xvY2F0aW9uX3RhYmxlXy0+QWRkKAorICAgICAgICBkZXNjcmlwdG9yLCBsb2NhdGlvbiwgbG9jYXRpb25fLT5zcGFuKDApLCBsb2NhdGlvbl8tPnNwYW4oMSkpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBQYXJzZXI6OlNraXBTdGF0ZW1lbnQoKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TWU1CT0wpKSB7CisgICAgICBpZiAoVHJ5Q29uc3VtZSgiOyIpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgieyIpKSB7CisgICAgICAgIFNraXBSZXN0T2ZCbG9jaygpOworICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgaWYgKExvb2tpbmdBdCgifSIpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRfLT5OZXh0KCk7CisgIH0KK30KKwordm9pZCBQYXJzZXI6OlNraXBSZXN0T2ZCbG9jaygpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoQXRFbmQoKSkgeworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NZTUJPTCkpIHsKKyAgICAgIGlmIChUcnlDb25zdW1lKCJ9IikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCJ7IikpIHsKKyAgICAgICAgU2tpcFJlc3RPZkJsb2NrKCk7CisgICAgICB9CisgICAgfQorICAgIGlucHV0Xy0+TmV4dCgpOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYm9vbCBQYXJzZXI6OlBhcnNlKGlvOjpUb2tlbml6ZXIqIGlucHV0LCBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlKSB7CisgIGlucHV0XyA9IGlucHV0OworICBoYWRfZXJyb3JzXyA9IGZhbHNlOworICBzeW50YXhfaWRlbnRpZmllcl8uY2xlYXIoKTsKKworICAvLyBOb3RlIHRoYXQgfGZpbGV8IGNvdWxkIGJlIE5VTEwgYXQgdGhpcyBwb2ludCBpZgorICAvLyBzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXyBpcyB0cnVlLiAgU28sIHdlIGNvbnNlcnZhdGl2ZWx5IGFsbG9jYXRlCisgIC8vIFNvdXJjZUNvZGVJbmZvIG9uIHRoZSBzdGFjaywgdGhlbiBzd2FwIGl0IGludG8gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8KKyAgLy8gbGF0ZXIgb24uCisgIFNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm87CisgIHNvdXJjZV9jb2RlX2luZm9fID0gJnNvdXJjZV9jb2RlX2luZm87CisKKyAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVEFSVCkpIHsKKyAgICAvLyBBZHZhbmNlIHRvIGZpcnN0IHRva2VuLgorICAgIGlucHV0Xy0+TmV4dCgpOworICB9CisKKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgcm9vdF9sb2NhdGlvbih0aGlzKTsKKworICAgIGlmIChyZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyB8fCBMb29raW5nQXQoInN5bnRheCIpKSB7CisgICAgICBpZiAoIVBhcnNlU3ludGF4SWRlbnRpZmllcigpKSB7CisgICAgICAgIC8vIERvbid0IGF0dGVtcHQgdG8gcGFyc2UgdGhlIGZpbGUgaWYgd2UgZGlkbid0IHJlY29nbml6ZSB0aGUgc3ludGF4CisgICAgICAgIC8vIGlkZW50aWZpZXIuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXykgeworICAgICAgc3ludGF4X2lkZW50aWZpZXJfID0gInByb3RvMiI7CisgICAgfQorCisgICAgaWYgKHN0b3BfYWZ0ZXJfc3ludGF4X2lkZW50aWZpZXJfKSByZXR1cm4gIWhhZF9lcnJvcnNfOworCisgICAgLy8gUmVwZWF0ZWRseSBwYXJzZSBzdGF0ZW1lbnRzIHVudGlsIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgICAgd2hpbGUgKCFBdEVuZCgpKSB7CisgICAgICBpZiAoIVBhcnNlVG9wTGV2ZWxTdGF0ZW1lbnQoZmlsZSwgcm9vdF9sb2NhdGlvbikpIHsKKyAgICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQorICAgICAgICAvLyBvdGhlciBzdGF0ZW1lbnRzLgorICAgICAgICBTa2lwU3RhdGVtZW50KCk7CisKKyAgICAgICAgaWYgKExvb2tpbmdBdCgifSIpKSB7CisgICAgICAgICAgQWRkRXJyb3IoIlVubWF0Y2hlZCBcIn1cIi4iKTsKKyAgICAgICAgICBpbnB1dF8tPk5leHQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlucHV0XyA9IE5VTEw7CisgIHNvdXJjZV9jb2RlX2luZm9fID0gTlVMTDsKKyAgc291cmNlX2NvZGVfaW5mby5Td2FwKGZpbGUtPm11dGFibGVfc291cmNlX2NvZGVfaW5mbygpKTsKKyAgcmV0dXJuICFoYWRfZXJyb3JzXzsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlU3ludGF4SWRlbnRpZmllcigpIHsKKyAgRE8oQ29uc3VtZSgic3ludGF4IiwgIkZpbGUgbXVzdCBiZWdpbiB3aXRoICdzeW50YXggPSBcInByb3RvMlwiOycuIikpOworICBETyhDb25zdW1lKCI9IikpOworICBpbzo6VG9rZW5pemVyOjpUb2tlbiBzeW50YXhfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKKyAgc3RyaW5nIHN5bnRheDsKKyAgRE8oQ29uc3VtZVN0cmluZygmc3ludGF4LCAiRXhwZWN0ZWQgc3ludGF4IGlkZW50aWZpZXIuIikpOworICBETyhDb25zdW1lKCI7IikpOworCisgIHN5bnRheF9pZGVudGlmaWVyXyA9IHN5bnRheDsKKworICBpZiAoc3ludGF4ICE9ICJwcm90bzIiICYmICFzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXykgeworICAgIEFkZEVycm9yKHN5bnRheF90b2tlbi5saW5lLCBzeW50YXhfdG9rZW4uY29sdW1uLAorICAgICAgIlVucmVjb2duaXplZCBzeW50YXggaWRlbnRpZmllciBcIiIgKyBzeW50YXggKyAiXCIuICBUaGlzIHBhcnNlciAiCisgICAgICAib25seSByZWNvZ25pemVzIFwicHJvdG8yXCIuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZVRvcExldmVsU3RhdGVtZW50KEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiByb290X2xvY2F0aW9uKSB7CisgIGlmIChUcnlDb25zdW1lKCI7IikpIHsKKyAgICAvLyBlbXB0eSBzdGF0ZW1lbnQ7IGlnbm9yZQorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgibWVzc2FnZSIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAorICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIsIGZpbGUtPm1lc3NhZ2VfdHlwZV9zaXplKCkpOworICAgIHJldHVybiBQYXJzZU1lc3NhZ2VEZWZpbml0aW9uKGZpbGUtPmFkZF9tZXNzYWdlX3R5cGUoKSwgbG9jYXRpb24pOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiZW51bSIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAorICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXIsIGZpbGUtPmVudW1fdHlwZV9zaXplKCkpOworICAgIHJldHVybiBQYXJzZUVudW1EZWZpbml0aW9uKGZpbGUtPmFkZF9lbnVtX3R5cGUoKSwgbG9jYXRpb24pOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgic2VydmljZSIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAorICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a1NlcnZpY2VGaWVsZE51bWJlciwgZmlsZS0+c2VydmljZV9zaXplKCkpOworICAgIHJldHVybiBQYXJzZVNlcnZpY2VEZWZpbml0aW9uKGZpbGUtPmFkZF9zZXJ2aWNlKCksIGxvY2F0aW9uKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoImV4dGVuZCIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAorICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIpOworICAgIHJldHVybiBQYXJzZUV4dGVuZChmaWxlLT5tdXRhYmxlX2V4dGVuc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlLT5tdXRhYmxlX21lc3NhZ2VfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICByb290X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprTWVzc2FnZVR5cGVGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiaW1wb3J0IikpIHsKKyAgICBpbnQgaW5kZXggPSBmaWxlLT5kZXBlbmRlbmN5X3NpemUoKTsKKyAgICByZXR1cm4gUGFyc2VJbXBvcnQoZmlsZS0+YWRkX2RlcGVuZGVuY3koKSwgcm9vdF9sb2NhdGlvbiwgaW5kZXgpOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgicGFja2FnZSIpKSB7CisgICAgcmV0dXJuIFBhcnNlUGFja2FnZShmaWxlLCByb290X2xvY2F0aW9uKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoIm9wdGlvbiIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAorICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKKyAgICByZXR1cm4gUGFyc2VPcHRpb24oZmlsZS0+bXV0YWJsZV9vcHRpb25zKCksIGxvY2F0aW9uKTsKKyAgfSBlbHNlIHsKKyAgICBBZGRFcnJvcigiRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1lc3NhZ2VzCisKK2Jvb2wgUGFyc2VyOjpQYXJzZU1lc3NhZ2VEZWZpbml0aW9uKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24pIHsKKyAgRE8oQ29uc3VtZSgibWVzc2FnZSIpKTsKKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICAgIG1lc3NhZ2UsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIobWVzc2FnZS0+bXV0YWJsZV9uYW1lKCksICJFeHBlY3RlZCBtZXNzYWdlIG5hbWUuIikpOworICB9CisgIERPKFBhcnNlTWVzc2FnZUJsb2NrKG1lc3NhZ2UsIG1lc3NhZ2VfbG9jYXRpb24pKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZU1lc3NhZ2VCbG9jayhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbikgeworICBETyhDb25zdW1lKCJ7IikpOworCisgIHdoaWxlICghVHJ5Q29uc3VtZSgifSIpKSB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIEFkZEVycm9yKCJSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBtZXNzYWdlIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIVBhcnNlTWVzc2FnZVN0YXRlbWVudChtZXNzYWdlLCBtZXNzYWdlX2xvY2F0aW9uKSkgeworICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQorICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KKyAgICAgIFNraXBTdGF0ZW1lbnQoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlTWVzc2FnZVN0YXRlbWVudChEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24pIHsKKyAgaWYgKFRyeUNvbnN1bWUoIjsiKSkgeworICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJtZXNzYWdlIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5uZXN0ZWRfdHlwZV9zaXplKCkpOworICAgIHJldHVybiBQYXJzZU1lc3NhZ2VEZWZpbml0aW9uKG1lc3NhZ2UtPmFkZF9uZXN0ZWRfdHlwZSgpLCBsb2NhdGlvbik7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJlbnVtIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtFbnVtVHlwZUZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+ZW51bV90eXBlX3NpemUoKSk7CisgICAgcmV0dXJuIFBhcnNlRW51bURlZmluaXRpb24obWVzc2FnZS0+YWRkX2VudW1fdHlwZSgpLCBsb2NhdGlvbik7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJleHRlbnNpb25zIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtFeHRlbnNpb25SYW5nZUZpZWxkTnVtYmVyKTsKKyAgICByZXR1cm4gUGFyc2VFeHRlbnNpb25zKG1lc3NhZ2UsIGxvY2F0aW9uKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoImV4dGVuZCIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIpOworICAgIHJldHVybiBQYXJzZUV4dGVuZChtZXNzYWdlLT5tdXRhYmxlX2V4dGVuc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5tdXRhYmxlX25lc3RlZF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a05lc3RlZFR5cGVGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgib3B0aW9uIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOworICAgIHJldHVybiBQYXJzZU9wdGlvbihtZXNzYWdlLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24pOworICB9IGVsc2UgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a0ZpZWxkRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5maWVsZF9zaXplKCkpOworICAgIHJldHVybiBQYXJzZU1lc3NhZ2VGaWVsZChtZXNzYWdlLT5hZGRfZmllbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6UGFyc2VNZXNzYWdlRmllbGQoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uKSB7CisgIC8vIFBhcnNlIGxhYmVsIGFuZCB0eXBlLgorICBpbzo6VG9rZW5pemVyOjpUb2tlbiBsYWJlbF90b2tlbiA9IGlucHV0Xy0+Y3VycmVudCgpOworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjprTGFiZWxGaWVsZE51bWJlcik7CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsIGxhYmVsOworICAgIERPKFBhcnNlTGFiZWwoJmxhYmVsKSk7CisgICAgZmllbGQtPnNldF9sYWJlbChsYWJlbCk7CisgIH0KKworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihmaWVsZF9sb2NhdGlvbik7ICAvLyBhZGQgcGF0aCBsYXRlcgorICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKGZpZWxkLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUpOworCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUgdHlwZSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyOworICAgIHN0cmluZyB0eXBlX25hbWU7CisgICAgRE8oUGFyc2VUeXBlKCZ0eXBlLCAmdHlwZV9uYW1lKSk7CisgICAgaWYgKHR5cGVfbmFtZS5lbXB0eSgpKSB7CisgICAgICBsb2NhdGlvbi5BZGRQYXRoKEZpZWxkRGVzY3JpcHRvclByb3RvOjprVHlwZUZpZWxkTnVtYmVyKTsKKyAgICAgIGZpZWxkLT5zZXRfdHlwZSh0eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgbG9jYXRpb24uQWRkUGF0aChGaWVsZERlc2NyaXB0b3JQcm90bzo6a1R5cGVOYW1lRmllbGROdW1iZXIpOworICAgICAgZmllbGQtPnNldF90eXBlX25hbWUodHlwZV9uYW1lKTsKKyAgICB9CisgIH0KKworICAvLyBQYXJzZSBuYW1lIGFuZCAnPScuCisgIGlvOjpUb2tlbml6ZXI6OlRva2VuIG5hbWVfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oZmllbGQsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoZmllbGQtPm11dGFibGVfbmFtZSgpLCAiRXhwZWN0ZWQgZmllbGQgbmFtZS4iKSk7CisgIH0KKyAgRE8oQ29uc3VtZSgiPSIsICJNaXNzaW5nIGZpZWxkIG51bWJlci4iKSk7CisKKyAgLy8gUGFyc2UgZmllbGQgbnVtYmVyLgorICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjprTnVtYmVyRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICBmaWVsZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIpOworICAgIGludCBudW1iZXI7CisgICAgRE8oQ29uc3VtZUludGVnZXIoJm51bWJlciwgIkV4cGVjdGVkIGZpZWxkIG51bWJlci4iKSk7CisgICAgZmllbGQtPnNldF9udW1iZXIobnVtYmVyKTsKKyAgfQorCisgIC8vIFBhcnNlIG9wdGlvbnMuCisgIERPKFBhcnNlRmllbGRPcHRpb25zKGZpZWxkLCBmaWVsZF9sb2NhdGlvbikpOworCisgIC8vIERlYWwgd2l0aCBncm91cHMuCisgIGlmIChmaWVsZC0+aGFzX3R5cGUoKSAmJiBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0dST1VQKSB7CisgICAgLy8gQXdrd2FyZDogIFNpbmNlIGEgZ3JvdXAgZGVjbGFyZXMgYm90aCBhIG1lc3NhZ2UgdHlwZSBhbmQgYSBmaWVsZCwgd2UKKyAgICAvLyAgIGhhdmUgdG8gY3JlYXRlIG92ZXJsYXBwaW5nIGxvY2F0aW9ucy4KKyAgICBMb2NhdGlvblJlY29yZGVyIGdyb3VwX2xvY2F0aW9uKHBhcmVudF9sb2NhdGlvbik7CisgICAgZ3JvdXBfbG9jYXRpb24uU3RhcnRBdChsYWJlbF90b2tlbik7CisgICAgZ3JvdXBfbG9jYXRpb24uQWRkUGF0aChsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlKTsKKyAgICBncm91cF9sb2NhdGlvbi5BZGRQYXRoKG1lc3NhZ2VzLT5zaXplKCkpOworCisgICAgRGVzY3JpcHRvclByb3RvKiBncm91cCA9IG1lc3NhZ2VzLT5BZGQoKTsKKyAgICBncm91cC0+c2V0X25hbWUoZmllbGQtPm5hbWUoKSk7CisKKyAgICAvLyBSZWNvcmQgbmFtZSBsb2NhdGlvbiB0byBtYXRjaCB0aGUgZmllbGQgbmFtZSdzIGxvY2F0aW9uLgorICAgIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZ3JvdXBfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcik7CisgICAgICBsb2NhdGlvbi5TdGFydEF0KG5hbWVfdG9rZW4pOworICAgICAgbG9jYXRpb24uRW5kQXQobmFtZV90b2tlbik7CisgICAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICAgICAgICBncm91cCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FKTsKKyAgICB9CisKKyAgICAvLyBUaGUgZmllbGQncyB0eXBlX25hbWUgYWxzbyBjb21lcyBmcm9tIHRoZSBuYW1lLiAgQ29uZnVzaW5nIQorICAgIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjprVHlwZU5hbWVGaWVsZE51bWJlcik7CisgICAgICBsb2NhdGlvbi5TdGFydEF0KG5hbWVfdG9rZW4pOworICAgICAgbG9jYXRpb24uRW5kQXQobmFtZV90b2tlbik7CisgICAgfQorCisgICAgLy8gQXMgYSBoYWNrIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSwgd2UgZm9yY2UgdGhlIGdyb3VwIG5hbWUgdG8gc3RhcnQKKyAgICAvLyB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgYW5kIGxvd2VyLWNhc2UgdGhlIGZpZWxkIG5hbWUuICBOZXcgY29kZSBzaG91bGQKKyAgICAvLyBub3QgdXNlIGdyb3VwczsgaXQgc2hvdWxkIHVzZSBuZXN0ZWQgbWVzc2FnZXMuCisgICAgaWYgKGdyb3VwLT5uYW1lKClbMF0gPCAnQScgfHwgJ1onIDwgZ3JvdXAtPm5hbWUoKVswXSkgeworICAgICAgQWRkRXJyb3IobmFtZV90b2tlbi5saW5lLCBuYW1lX3Rva2VuLmNvbHVtbiwKKyAgICAgICAgIkdyb3VwIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLiIpOworICAgIH0KKyAgICBMb3dlclN0cmluZyhmaWVsZC0+bXV0YWJsZV9uYW1lKCkpOworCisgICAgZmllbGQtPnNldF90eXBlX25hbWUoZ3JvdXAtPm5hbWUoKSk7CisgICAgaWYgKExvb2tpbmdBdCgieyIpKSB7CisgICAgICBETyhQYXJzZU1lc3NhZ2VCbG9jayhncm91cCwgZ3JvdXBfbG9jYXRpb24pKTsKKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IoIk1pc3NpbmcgZ3JvdXAgYm9keS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRE8oQ29uc3VtZSgiOyIpKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VGaWVsZE9wdGlvbnMoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uKSB7CisgIGlmICghTG9va2luZ0F0KCJbIikpIHJldHVybiB0cnVlOworCisgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOworCisgIERPKENvbnN1bWUoIlsiKSk7CisKKyAgLy8gUGFyc2UgZmllbGQgb3B0aW9ucy4KKyAgZG8geworICAgIGlmIChMb29raW5nQXQoImRlZmF1bHQiKSkgeworICAgICAgLy8gV2UgaW50ZW50aW9uYWxseSBwYXNzIGZpZWxkX2xvY2F0aW9uIHJhdGhlciB0aGFuIGxvY2F0aW9uIGhlcmUsIHNpbmNlCisgICAgICAvLyB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgYWN0dWFsbHkgYW4gb3B0aW9uLgorICAgICAgRE8oUGFyc2VEZWZhdWx0QXNzaWdubWVudChmaWVsZCwgZmllbGRfbG9jYXRpb24pKTsKKyAgICB9IGVsc2UgeworICAgICAgRE8oUGFyc2VPcHRpb25Bc3NpZ25tZW50KGZpZWxkLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24pKTsKKyAgICB9CisgIH0gd2hpbGUgKFRyeUNvbnN1bWUoIiwiKSk7CisKKyAgRE8oQ29uc3VtZSgiXSIpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZURlZmF1bHRBc3NpZ25tZW50KEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uKSB7CisgIGlmIChmaWVsZC0+aGFzX2RlZmF1bHRfdmFsdWUoKSkgeworICAgIEFkZEVycm9yKCJBbHJlYWR5IHNldCBvcHRpb24gXCJkZWZhdWx0XCIuIik7CisgICAgZmllbGQtPmNsZWFyX2RlZmF1bHRfdmFsdWUoKTsKKyAgfQorCisgIERPKENvbnN1bWUoImRlZmF1bHQiKSk7CisgIERPKENvbnN1bWUoIj0iKSk7CisKKyAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0RlZmF1bHRWYWx1ZUZpZWxkTnVtYmVyKTsKKyAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICBmaWVsZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFKTsKKyAgc3RyaW5nKiBkZWZhdWx0X3ZhbHVlID0gZmllbGQtPm11dGFibGVfZGVmYXVsdF92YWx1ZSgpOworCisgIGlmICghZmllbGQtPmhhc190eXBlKCkpIHsKKyAgICAvLyBUaGUgZmllbGQgaGFzIGEgdHlwZSBuYW1lLCBidXQgd2UgZG9uJ3Qga25vdyBpZiBpdCBpcyBhIG1lc3NhZ2Ugb3IgYW4KKyAgICAvLyBlbnVtIHlldC4gIEFzc3VtZSBhbiBlbnVtIGZvciBub3cuCisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoZGVmYXVsdF92YWx1ZSwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIikpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0ZJWEVEMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TRklYRUQ2NDogeworICAgICAgdWludDY0IG1heF92YWx1ZSA9IGtpbnQ2NG1heDsKKyAgICAgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyIHx8CisgICAgICAgICAgZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UMzIgfHwKKyAgICAgICAgICBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NGSVhFRDMyKSB7CisgICAgICAgIG1heF92YWx1ZSA9IGtpbnQzMm1heDsKKyAgICAgIH0KKworICAgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIG5lZ2F0aXZlLgorICAgICAgaWYgKFRyeUNvbnN1bWUoIi0iKSkgeworICAgICAgICBkZWZhdWx0X3ZhbHVlLT5hcHBlbmQoIi0iKTsKKyAgICAgICAgLy8gVHdvJ3MgY29tcGxlbWVudCBhbHdheXMgaGFzIG9uZSBtb3JlIG5lZ2F0aXZlIHZhbHVlIHRoYW4gcG9zaXRpdmUuCisgICAgICAgICsrbWF4X3ZhbHVlOworICAgICAgfQorICAgICAgLy8gUGFyc2UgdGhlIGludGVnZXIgdG8gdmVyaWZ5IHRoYXQgaXQgaXMgbm90IG91dC1vZi1yYW5nZS4KKyAgICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICAgIERPKENvbnN1bWVJbnRlZ2VyNjQobWF4X3ZhbHVlLCAmdmFsdWUsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKKyAgICAgIC8vIEFuZCBzdHJpbmdpZnkgaXQgYWdhaW4uCisgICAgICBkZWZhdWx0X3ZhbHVlLT5hcHBlbmQoU2ltcGxlSXRvYSh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9VSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GSVhFRDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRklYRUQ2NDogeworICAgICAgdWludDY0IG1heF92YWx1ZSA9IGt1aW50NjRtYXg7CisgICAgICBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9VSU5UMzIgfHwKKyAgICAgICAgICBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZJWEVEMzIpIHsKKyAgICAgICAgbWF4X3ZhbHVlID0ga3VpbnQzMm1heDsKKyAgICAgIH0KKworICAgICAgLy8gTnVtZXJpYywgbm90IG5lZ2F0aXZlLgorICAgICAgaWYgKFRyeUNvbnN1bWUoIi0iKSkgeworICAgICAgICBBZGRFcnJvcigiVW5zaWduZWQgZmllbGQgY2FuJ3QgaGF2ZSBuZWdhdGl2ZSBkZWZhdWx0IHZhbHVlLiIpOworICAgICAgfQorICAgICAgLy8gUGFyc2UgdGhlIGludGVnZXIgdG8gdmVyaWZ5IHRoYXQgaXQgaXMgbm90IG91dC1vZi1yYW5nZS4KKyAgICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICAgIERPKENvbnN1bWVJbnRlZ2VyNjQobWF4X3ZhbHVlLCAmdmFsdWUsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKKyAgICAgIC8vIEFuZCBzdHJpbmdpZnkgaXQgYWdhaW4uCisgICAgICBkZWZhdWx0X3ZhbHVlLT5hcHBlbmQoU2ltcGxlSXRvYSh2YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GTE9BVDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0RPVUJMRToKKyAgICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBuZWdhdGl2ZS4KKyAgICAgIGlmIChUcnlDb25zdW1lKCItIikpIHsKKyAgICAgICAgZGVmYXVsdF92YWx1ZS0+YXBwZW5kKCItIik7CisgICAgICB9CisgICAgICAvLyBQYXJzZSB0aGUgaW50ZWdlciBiZWNhdXNlIHdlIGhhdmUgdG8gY29udmVydCBoZXggaW50ZWdlcnMgdG8gZGVjaW1hbAorICAgICAgLy8gZmxvYXRzLgorICAgICAgZG91YmxlIHZhbHVlOworICAgICAgRE8oQ29uc3VtZU51bWJlcigmdmFsdWUsICJFeHBlY3RlZCBudW1iZXIuIikpOworICAgICAgLy8gQW5kIHN0cmluZ2lmeSBpdCBhZ2Fpbi4KKyAgICAgIGRlZmF1bHRfdmFsdWUtPmFwcGVuZChTaW1wbGVEdG9hKHZhbHVlKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQk9PTDoKKyAgICAgIGlmIChUcnlDb25zdW1lKCJ0cnVlIikpIHsKKyAgICAgICAgZGVmYXVsdF92YWx1ZS0+YXNzaWduKCJ0cnVlIik7CisgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoImZhbHNlIikpIHsKKyAgICAgICAgZGVmYXVsdF92YWx1ZS0+YXNzaWduKCJmYWxzZSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQWRkRXJyb3IoIkV4cGVjdGVkIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIi4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORzoKKyAgICAgIERPKENvbnN1bWVTdHJpbmcoZGVmYXVsdF92YWx1ZSwgIkV4cGVjdGVkIHN0cmluZy4iKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQllURVM6CisgICAgICBETyhDb25zdW1lU3RyaW5nKGRlZmF1bHRfdmFsdWUsICJFeHBlY3RlZCBzdHJpbmcuIikpOworICAgICAgKmRlZmF1bHRfdmFsdWUgPSBDRXNjYXBlKCpkZWZhdWx0X3ZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9FTlVNOgorICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoZGVmYXVsdF92YWx1ZSwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIikpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX01FU1NBR0U6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9HUk9VUDoKKyAgICAgIEFkZEVycm9yKCJNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZU9wdGlvbk5hbWVQYXJ0KFVuaW50ZXJwcmV0ZWRPcHRpb24qIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFydF9sb2NhdGlvbikgeworICBVbmludGVycHJldGVkT3B0aW9uOjpOYW1lUGFydCogbmFtZSA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uLT5hZGRfbmFtZSgpOworICBzdHJpbmcgaWRlbnRpZmllcjsgIC8vIFdlIHBhcnNlIGlkZW50aWZpZXJzIGludG8gdGhpcyBzdHJpbmcuCisgIGlmIChMb29raW5nQXQoIigiKSkgeyAgLy8gVGhpcyBpcyBhbiBleHRlbnNpb24uCisgICAgRE8oQ29uc3VtZSgiKCIpKTsKKworICAgIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oCisgICAgICAgICAgcGFydF9sb2NhdGlvbiwgVW5pbnRlcnByZXRlZE9wdGlvbjo6TmFtZVBhcnQ6OmtOYW1lUGFydEZpZWxkTnVtYmVyKTsKKyAgICAgIC8vIEFuIGV4dGVuc2lvbiBuYW1lIGNvbnNpc3RzIG9mIGRvdC1zZXBhcmF0ZWQgaWRlbnRpZmllcnMsIGFuZCBtYXkgYmVnaW4KKyAgICAgIC8vIHdpdGggYSBkb3QuCisgICAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7CisgICAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZpZGVudGlmaWVyLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iKSk7CisgICAgICAgIG5hbWUtPm11dGFibGVfbmFtZV9wYXJ0KCktPmFwcGVuZChpZGVudGlmaWVyKTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChMb29raW5nQXQoIi4iKSkgeworICAgICAgICBETyhDb25zdW1lKCIuIikpOworICAgICAgICBuYW1lLT5tdXRhYmxlX25hbWVfcGFydCgpLT5hcHBlbmQoIi4iKTsKKyAgICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJmlkZW50aWZpZXIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIpKTsKKyAgICAgICAgbmFtZS0+bXV0YWJsZV9uYW1lX3BhcnQoKS0+YXBwZW5kKGlkZW50aWZpZXIpOworICAgICAgfQorICAgIH0KKworICAgIERPKENvbnN1bWUoIikiKSk7CisgICAgbmFtZS0+c2V0X2lzX2V4dGVuc2lvbih0cnVlKTsKKyAgfSBlbHNlIHsgIC8vIFRoaXMgaXMgYSByZWd1bGFyIGZpZWxkLgorICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oCisgICAgICAgIHBhcnRfbG9jYXRpb24sIFVuaW50ZXJwcmV0ZWRPcHRpb246Ok5hbWVQYXJ0OjprTmFtZVBhcnRGaWVsZE51bWJlcik7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJmlkZW50aWZpZXIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIpKTsKKyAgICBuYW1lLT5tdXRhYmxlX25hbWVfcGFydCgpLT5hcHBlbmQoaWRlbnRpZmllcik7CisgICAgbmFtZS0+c2V0X2lzX2V4dGVuc2lvbihmYWxzZSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZVVuaW50ZXJwcmV0ZWRCbG9jayhzdHJpbmcqIHZhbHVlKSB7CisgIC8vIE5vdGUgdGhhdCBlbmNsb3NpbmcgYnJhY2VzIGFyZSBub3QgYWRkZWQgdG8gKnZhbHVlLgorICBETyhDb25zdW1lKCJ7IikpOworICBpbnQgYnJhY2VfZGVwdGggPSAxOworICB3aGlsZSAoIUF0RW5kKCkpIHsKKyAgICBpZiAoTG9va2luZ0F0KCJ7IikpIHsKKyAgICAgIGJyYWNlX2RlcHRoKys7CisgICAgfSBlbHNlIGlmIChMb29raW5nQXQoIn0iKSkgeworICAgICAgYnJhY2VfZGVwdGgtLTsKKyAgICAgIGlmIChicmFjZV9kZXB0aCA9PSAwKSB7CisgICAgICAgIGlucHV0Xy0+TmV4dCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gVE9ETyhzYW5qYXkpOiBJbnRlcnByZXQgbGluZS9jb2x1bW4gbnVtYmVycyB0byBwcmVzZXJ2ZSBmb3JtYXR0aW5nCisgICAgaWYgKCF2YWx1ZS0+ZW1wdHkoKSkgdmFsdWUtPnB1c2hfYmFjaygnICcpOworICAgIHZhbHVlLT5hcHBlbmQoaW5wdXRfLT5jdXJyZW50KCkudGV4dCk7CisgICAgaW5wdXRfLT5OZXh0KCk7CisgIH0KKyAgQWRkRXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSB3aGlsZSBwYXJzaW5nIGFnZ3JlZ2F0ZSB2YWx1ZS4iKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBXZSBkb24ndCBpbnRlcnByZXQgdGhlIG9wdGlvbiBoZXJlLiBJbnN0ZWFkIHdlIHN0b3JlIGl0IGluIGFuCisvLyBVbmludGVycHJldGVkT3B0aW9uLCB0byBiZSBpbnRlcnByZXRlZCBsYXRlci4KK2Jvb2wgUGFyc2VyOjpQYXJzZU9wdGlvbkFzc2lnbm1lbnQoTWVzc2FnZSogb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgb3B0aW9uc19sb2NhdGlvbikgeworICAvLyBDcmVhdGUgYW4gZW50cnkgaW4gdGhlIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIGZpZWxkLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHVuaW50ZXJwcmV0ZWRfb3B0aW9uX2ZpZWxkID0gb3B0aW9ucy0+R2V0RGVzY3JpcHRvcigpLT4KKyAgICAgIEZpbmRGaWVsZEJ5TmFtZSgidW5pbnRlcnByZXRlZF9vcHRpb24iKTsKKyAgR09PR0xFX0NIRUNLKHVuaW50ZXJwcmV0ZWRfb3B0aW9uX2ZpZWxkICE9IE5VTEwpCisgICAgICA8PCAiTm8gZmllbGQgbmFtZWQgXCJ1bmludGVycHJldGVkX29wdGlvblwiIGluIHRoZSBPcHRpb25zIHByb3RvLiI7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG9wdGlvbnMtPkdldFJlZmxlY3Rpb24oKTsKKworICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgb3B0aW9uc19sb2NhdGlvbiwgdW5pbnRlcnByZXRlZF9vcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgcmVmbGVjdGlvbi0+RmllbGRTaXplKCpvcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl9maWVsZCkpOworCisgIFVuaW50ZXJwcmV0ZWRPcHRpb24qIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gZG93bl9jYXN0PFVuaW50ZXJwcmV0ZWRPcHRpb24qPigKKyAgICAgIG9wdGlvbnMtPkdldFJlZmxlY3Rpb24oKS0+QWRkTWVzc2FnZShvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uX2ZpZWxkKSk7CisKKyAgLy8gUGFyc2UgZG90LXNlcGFyYXRlZCBuYW1lLgorICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBuYW1lX2xvY2F0aW9uKGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmludGVycHJldGVkT3B0aW9uOjprTmFtZUZpZWxkTnVtYmVyKTsKKyAgICBuYW1lX2xvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICB1bmludGVycHJldGVkX29wdGlvbiwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPUFRJT05fTkFNRSk7CisKKyAgICB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIHBhcnRfbG9jYXRpb24obmFtZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+bmFtZV9zaXplKCkpOworICAgICAgRE8oUGFyc2VPcHRpb25OYW1lUGFydCh1bmludGVycHJldGVkX29wdGlvbiwgcGFydF9sb2NhdGlvbikpOworICAgIH0KKworICAgIHdoaWxlIChMb29raW5nQXQoIi4iKSkgeworICAgICAgRE8oQ29uc3VtZSgiLiIpKTsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgcGFydF9sb2NhdGlvbihuYW1lX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLT5uYW1lX3NpemUoKSk7CisgICAgICBETyhQYXJzZU9wdGlvbk5hbWVQYXJ0KHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCBwYXJ0X2xvY2F0aW9uKSk7CisgICAgfQorICB9CisKKyAgRE8oQ29uc3VtZSgiPSIpKTsKKworICBMb2NhdGlvblJlY29yZGVyIHZhbHVlX2xvY2F0aW9uKGxvY2F0aW9uKTsKKyAgdmFsdWVfbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICB1bmludGVycHJldGVkX29wdGlvbiwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPUFRJT05fVkFMVUUpOworCisgIC8vIEFsbCB2YWx1ZXMgYXJlIGEgc2luZ2xlIHRva2VuLCBleGNlcHQgZm9yIG5lZ2F0aXZlIG51bWJlcnMsIHdoaWNoIGNvbnNpc3QKKyAgLy8gb2YgYSBzaW5nbGUgJy0nIHN5bWJvbCwgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBudW1iZXIuCisgIGJvb2wgaXNfbmVnYXRpdmUgPSBUcnlDb25zdW1lKCItIik7CisKKyAgc3dpdGNoIChpbnB1dF8tPmN1cnJlbnQoKS50eXBlKSB7CisgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX1NUQVJUOgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRyeWluZyB0byByZWFkIHZhbHVlIGJlZm9yZSBhbnkgdG9rZW5zIGhhdmUgYmVlbiByZWFkLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjYXNlIGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5EOgorICAgICAgQWRkRXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSB3aGlsZSBwYXJzaW5nIG9wdGlvbiB2YWx1ZS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSOiB7CisgICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKFVuaW50ZXJwcmV0ZWRPcHRpb246OmtJZGVudGlmaWVyVmFsdWVGaWVsZE51bWJlcik7CisgICAgICBpZiAoaXNfbmVnYXRpdmUpIHsKKyAgICAgICAgQWRkRXJyb3IoIkludmFsaWQgJy0nIHN5bWJvbCBiZWZvcmUgaWRlbnRpZmllci4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbHVlOworICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJnZhbHVlLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iKSk7CisgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X2lkZW50aWZpZXJfdmFsdWUodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVI6IHsKKyAgICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICAgIHVpbnQ2NCBtYXhfdmFsdWUgPQorICAgICAgICAgIGlzX25lZ2F0aXZlID8gc3RhdGljX2Nhc3Q8dWludDY0PihraW50NjRtYXgpICsgMSA6IGt1aW50NjRtYXg7CisgICAgICBETyhDb25zdW1lSW50ZWdlcjY0KG1heF92YWx1ZSwgJnZhbHVlLCAiRXhwZWN0ZWQgaW50ZWdlci4iKSk7CisgICAgICBpZiAoaXNfbmVnYXRpdmUpIHsKKyAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aCgKKyAgICAgICAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb246OmtOZWdhdGl2ZUludFZhbHVlRmllbGROdW1iZXIpOworICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X25lZ2F0aXZlX2ludF92YWx1ZSgtc3RhdGljX2Nhc3Q8aW50NjQ+KHZhbHVlKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKAorICAgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6a1Bvc2l0aXZlSW50VmFsdWVGaWVsZE51bWJlcik7CisgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLT5zZXRfcG9zaXRpdmVfaW50X3ZhbHVlKHZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9GTE9BVDogeworICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aChVbmludGVycHJldGVkT3B0aW9uOjprRG91YmxlVmFsdWVGaWVsZE51bWJlcik7CisgICAgICBkb3VibGUgdmFsdWU7CisgICAgICBETyhDb25zdW1lTnVtYmVyKCZ2YWx1ZSwgIkV4cGVjdGVkIG51bWJlci4iKSk7CisgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X2RvdWJsZV92YWx1ZShpc19uZWdhdGl2ZSA/IC12YWx1ZSA6IHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkc6IHsKKyAgICAgIHZhbHVlX2xvY2F0aW9uLkFkZFBhdGgoVW5pbnRlcnByZXRlZE9wdGlvbjo6a1N0cmluZ1ZhbHVlRmllbGROdW1iZXIpOworICAgICAgaWYgKGlzX25lZ2F0aXZlKSB7CisgICAgICAgIEFkZEVycm9yKCJJbnZhbGlkICctJyBzeW1ib2wgYmVmb3JlIHN0cmluZy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbHVlOworICAgICAgRE8oQ29uc3VtZVN0cmluZygmdmFsdWUsICJFeHBlY3RlZCBzdHJpbmcuIikpOworICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPnNldF9zdHJpbmdfdmFsdWUodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX1NZTUJPTDoKKyAgICAgIGlmIChMb29raW5nQXQoInsiKSkgeworICAgICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKFVuaW50ZXJwcmV0ZWRPcHRpb246OmtBZ2dyZWdhdGVWYWx1ZUZpZWxkTnVtYmVyKTsKKyAgICAgICAgRE8oUGFyc2VVbmludGVycHJldGVkQmxvY2soCisgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+bXV0YWJsZV9hZ2dyZWdhdGVfdmFsdWUoKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQWRkRXJyb3IoIkV4cGVjdGVkIG9wdGlvbiB2YWx1ZS4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRXh0ZW5zaW9ucyhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGV4dGVuc2lvbnNfbG9jYXRpb24pIHsKKyAgLy8gUGFyc2UgdGhlIGRlY2xhcmF0aW9uLgorICBETyhDb25zdW1lKCJleHRlbnNpb25zIikpOworCisgIGRvIHsKKyAgICAvLyBOb3RlIHRoYXQga0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXIgd2FzIGFscmVhZHkgcHVzaGVkIGJ5IHRoZSBwYXJlbnQuCisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihleHRlbnNpb25zX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKSk7CisKKyAgICBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlKiByYW5nZSA9IG1lc3NhZ2UtPmFkZF9leHRlbnNpb25fcmFuZ2UoKTsKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICAgICAgcmFuZ2UsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSKTsKKworICAgIGludCBzdGFydCwgZW5kOworICAgIGlvOjpUb2tlbml6ZXI6OlRva2VuIHN0YXJ0X3Rva2VuOworCisgICAgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBzdGFydF9sb2NhdGlvbigKKyAgICAgICAgICBsb2NhdGlvbiwgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZTo6a1N0YXJ0RmllbGROdW1iZXIpOworICAgICAgc3RhcnRfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKKyAgICAgIERPKENvbnN1bWVJbnRlZ2VyKCZzdGFydCwgIkV4cGVjdGVkIGZpZWxkIG51bWJlciByYW5nZS4iKSk7CisgICAgfQorCisgICAgaWYgKFRyeUNvbnN1bWUoInRvIikpIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgZW5kX2xvY2F0aW9uKAorICAgICAgICAgIGxvY2F0aW9uLCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlOjprRW5kRmllbGROdW1iZXIpOworICAgICAgaWYgKFRyeUNvbnN1bWUoIm1heCIpKSB7CisgICAgICAgIGVuZCA9IEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERPKENvbnN1bWVJbnRlZ2VyKCZlbmQsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBlbmRfbG9jYXRpb24oCisgICAgICAgICAgbG9jYXRpb24sIERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2U6OmtFbmRGaWVsZE51bWJlcik7CisgICAgICBlbmRfbG9jYXRpb24uU3RhcnRBdChzdGFydF90b2tlbik7CisgICAgICBlbmRfbG9jYXRpb24uRW5kQXQoc3RhcnRfdG9rZW4pOworICAgICAgZW5kID0gc3RhcnQ7CisgICAgfQorCisgICAgLy8gVXNlcnMgbGlrZSB0byBzcGVjaWZ5IGluY2x1c2l2ZSByYW5nZXMsIGJ1dCBpbiBjb2RlIHdlIGxpa2UgdGhlIGVuZAorICAgIC8vIG51bWJlciB0byBiZSBleGNsdXNpdmUuCisgICAgKytlbmQ7CisKKyAgICByYW5nZS0+c2V0X3N0YXJ0KHN0YXJ0KTsKKyAgICByYW5nZS0+c2V0X2VuZChlbmQpOworICB9IHdoaWxlIChUcnlDb25zdW1lKCIsIikpOworCisgIERPKENvbnN1bWUoIjsiKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VFeHRlbmQoUmVwZWF0ZWRQdHJGaWVsZDxGaWVsZERlc2NyaXB0b3JQcm90bz4qIGV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxEZXNjcmlwdG9yUHJvdG8+KiBtZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZXh0ZW5kX2xvY2F0aW9uKSB7CisgIERPKENvbnN1bWUoImV4dGVuZCIpKTsKKworICAvLyBQYXJzZSB0aGUgZXh0ZW5kZWUgdHlwZS4KKyAgaW86OlRva2VuaXplcjo6VG9rZW4gZXh0ZW5kZWVfc3RhcnQgPSBpbnB1dF8tPmN1cnJlbnQoKTsKKyAgc3RyaW5nIGV4dGVuZGVlOworICBETyhQYXJzZVVzZXJEZWZpbmVkVHlwZSgmZXh0ZW5kZWUpKTsKKyAgaW86OlRva2VuaXplcjo6VG9rZW4gZXh0ZW5kZWVfZW5kID0gaW5wdXRfLT5wcmV2aW91cygpOworCisgIC8vIFBhcnNlIHRoZSBibG9jay4KKyAgRE8oQ29uc3VtZSgieyIpKTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKworICBkbyB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIEFkZEVycm9yKCJSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBleHRlbmQgZGVmaW5pdGlvbiAobWlzc2luZyAnfScpLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE5vdGUgdGhhdCBrRXh0ZW5zaW9uRmllbGROdW1iZXIgd2FzIGFscmVhZHkgcHVzaGVkIGJ5IHRoZSBwYXJlbnQuCisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihleHRlbmRfbG9jYXRpb24sIGV4dGVuc2lvbnMtPnNpemUoKSk7CisKKyAgICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQgPSBleHRlbnNpb25zLT5BZGQoKTsKKworICAgIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgZXh0ZW5kZWVfbG9jYXRpb24oCisgICAgICAgICAgbG9jYXRpb24sIEZpZWxkRGVzY3JpcHRvclByb3RvOjprRXh0ZW5kZWVGaWVsZE51bWJlcik7CisgICAgICBleHRlbmRlZV9sb2NhdGlvbi5TdGFydEF0KGV4dGVuZGVlX3N0YXJ0KTsKKyAgICAgIGV4dGVuZGVlX2xvY2F0aW9uLkVuZEF0KGV4dGVuZGVlX2VuZCk7CisKKyAgICAgIGlmIChpc19maXJzdCkgeworICAgICAgICBleHRlbmRlZV9sb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICAgICAgICAgIGZpZWxkLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFKTsKKyAgICAgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmaWVsZC0+c2V0X2V4dGVuZGVlKGV4dGVuZGVlKTsKKworICAgIGlmICghUGFyc2VNZXNzYWdlRmllbGQoZmllbGQsIG1lc3NhZ2VzLCBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pKSB7CisgICAgICAvLyBUaGlzIHN0YXRlbWVudCBmYWlsZWQgdG8gcGFyc2UuICBTa2lwIGl0LCBidXQga2VlcCBsb29waW5nIHRvIHBhcnNlCisgICAgICAvLyBvdGhlciBzdGF0ZW1lbnRzLgorICAgICAgU2tpcFN0YXRlbWVudCgpOworICAgIH0KKyAgfSB3aGlsZSghVHJ5Q29uc3VtZSgifSIpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW51bXMKKworYm9vbCBQYXJzZXI6OlBhcnNlRW51bURlZmluaXRpb24oRW51bURlc2NyaXB0b3JQcm90byogZW51bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbikgeworICBETyhDb25zdW1lKCJlbnVtIikpOworCisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGVudW1fbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyKTsKKyAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKKyAgICAgICAgZW51bV90eXBlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUpOworICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGVudW1fdHlwZS0+bXV0YWJsZV9uYW1lKCksICJFeHBlY3RlZCBlbnVtIG5hbWUuIikpOworICB9CisKKyAgRE8oUGFyc2VFbnVtQmxvY2soZW51bV90eXBlLCBlbnVtX2xvY2F0aW9uKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VFbnVtQmxvY2soRW51bURlc2NyaXB0b3JQcm90byogZW51bV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fbG9jYXRpb24pIHsKKyAgRE8oQ29uc3VtZSgieyIpKTsKKworICB3aGlsZSAoIVRyeUNvbnN1bWUoIn0iKSkgeworICAgIGlmIChBdEVuZCgpKSB7CisgICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gZW51bSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFQYXJzZUVudW1TdGF0ZW1lbnQoZW51bV90eXBlLCBlbnVtX2xvY2F0aW9uKSkgeworICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQorICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KKyAgICAgIFNraXBTdGF0ZW1lbnQoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRW51bVN0YXRlbWVudChFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fbG9jYXRpb24pIHsKKyAgaWYgKFRyeUNvbnN1bWUoIjsiKSkgeworICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJvcHRpb24iKSkgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZW51bV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOworICAgIHJldHVybiBQYXJzZU9wdGlvbihlbnVtX3R5cGUtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbik7CisgIH0gZWxzZSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihlbnVtX2xvY2F0aW9uLAorICAgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjprVmFsdWVGaWVsZE51bWJlciwgZW51bV90eXBlLT52YWx1ZV9zaXplKCkpOworICAgIHJldHVybiBQYXJzZUVudW1Db25zdGFudChlbnVtX3R5cGUtPmFkZF92YWx1ZSgpLCBsb2NhdGlvbik7CisgIH0KK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRW51bUNvbnN0YW50KEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogZW51bV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX3ZhbHVlX2xvY2F0aW9uKSB7CisgIC8vIFBhcnNlIG5hbWUuCisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGVudW1fdmFsdWVfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICBlbnVtX3ZhbHVlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUpOworICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGVudW1fdmFsdWUtPm11dGFibGVfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBlbnVtIGNvbnN0YW50IG5hbWUuIikpOworICB9CisKKyAgRE8oQ29uc3VtZSgiPSIsICJNaXNzaW5nIG51bWVyaWMgdmFsdWUgZm9yIGVudW0gY29uc3RhbnQuIikpOworCisgIC8vIFBhcnNlIHZhbHVlLgorICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbigKKyAgICAgICAgZW51bV92YWx1ZV9sb2NhdGlvbiwgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjprTnVtYmVyRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICBlbnVtX3ZhbHVlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUik7CisKKyAgICBib29sIGlzX25lZ2F0aXZlID0gVHJ5Q29uc3VtZSgiLSIpOworICAgIGludCBudW1iZXI7CisgICAgRE8oQ29uc3VtZUludGVnZXIoJm51bWJlciwgIkV4cGVjdGVkIGludGVnZXIuIikpOworICAgIGlmIChpc19uZWdhdGl2ZSkgbnVtYmVyICo9IC0xOworICAgIGVudW1fdmFsdWUtPnNldF9udW1iZXIobnVtYmVyKTsKKyAgfQorCisgIERPKFBhcnNlRW51bUNvbnN0YW50T3B0aW9ucyhlbnVtX3ZhbHVlLCBlbnVtX3ZhbHVlX2xvY2F0aW9uKSk7CisKKyAgRE8oQ29uc3VtZSgiOyIpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlRW51bUNvbnN0YW50T3B0aW9ucygKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIHZhbHVlLAorICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fdmFsdWVfbG9jYXRpb24pIHsKKyAgaWYgKCFMb29raW5nQXQoIlsiKSkgcmV0dXJuIHRydWU7CisKKyAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbigKKyAgICAgIGVudW1fdmFsdWVfbG9jYXRpb24sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcik7CisKKyAgRE8oQ29uc3VtZSgiWyIpKTsKKworICBkbyB7CisgICAgRE8oUGFyc2VPcHRpb25Bc3NpZ25tZW50KHZhbHVlLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24pKTsKKyAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKKworICBETyhDb25zdW1lKCJdIikpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2VydmljZXMKKworYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZURlZmluaXRpb24oU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHNlcnZpY2VfbG9jYXRpb24pIHsKKyAgRE8oQ29uc3VtZSgic2VydmljZSIpKTsKKworICB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihzZXJ2aWNlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICAgIHNlcnZpY2UsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoc2VydmljZS0+bXV0YWJsZV9uYW1lKCksICJFeHBlY3RlZCBzZXJ2aWNlIG5hbWUuIikpOworICB9CisKKyAgRE8oUGFyc2VTZXJ2aWNlQmxvY2soc2VydmljZSwgc2VydmljZV9sb2NhdGlvbikpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZUJsb2NrKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbikgeworICBETyhDb25zdW1lKCJ7IikpOworCisgIHdoaWxlICghVHJ5Q29uc3VtZSgifSIpKSB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIEFkZEVycm9yKCJSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBzZXJ2aWNlIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIVBhcnNlU2VydmljZVN0YXRlbWVudChzZXJ2aWNlLCBzZXJ2aWNlX2xvY2F0aW9uKSkgeworICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQorICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KKyAgICAgIFNraXBTdGF0ZW1lbnQoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZVN0YXRlbWVudChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uKSB7CisgIGlmIChUcnlDb25zdW1lKCI7IikpIHsKKyAgICAvLyBlbXB0eSBzdGF0ZW1lbnQ7IGlnbm9yZQorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKExvb2tpbmdBdCgib3B0aW9uIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgICBzZXJ2aWNlX2xvY2F0aW9uLCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKKyAgICByZXR1cm4gUGFyc2VPcHRpb24oc2VydmljZS0+bXV0YWJsZV9vcHRpb25zKCksIGxvY2F0aW9uKTsKKyAgfSBlbHNlIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHNlcnZpY2VfbG9jYXRpb24sCisgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtNZXRob2RGaWVsZE51bWJlciwgc2VydmljZS0+bWV0aG9kX3NpemUoKSk7CisgICAgcmV0dXJuIFBhcnNlU2VydmljZU1ldGhvZChzZXJ2aWNlLT5hZGRfbWV0aG9kKCksIGxvY2F0aW9uKTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6UGFyc2VTZXJ2aWNlTWV0aG9kKE1ldGhvZERlc2NyaXB0b3JQcm90byogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXRob2RfbG9jYXRpb24pIHsKKyAgRE8oQ29uc3VtZSgicnBjIikpOworCisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1ldGhvZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICAgIG1ldGhvZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FKTsKKyAgICBETyhDb25zdW1lSWRlbnRpZmllcihtZXRob2QtPm11dGFibGVfbmFtZSgpLCAiRXhwZWN0ZWQgbWV0aG9kIG5hbWUuIikpOworICB9CisKKyAgLy8gUGFyc2UgaW5wdXQgdHlwZS4KKyAgRE8oQ29uc3VtZSgiKCIpKTsKKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWV0aG9kX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprSW5wdXRUeXBlRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICBtZXRob2QsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6SU5QVVRfVFlQRSk7CisgICAgRE8oUGFyc2VVc2VyRGVmaW5lZFR5cGUobWV0aG9kLT5tdXRhYmxlX2lucHV0X3R5cGUoKSkpOworICB9CisgIERPKENvbnN1bWUoIikiKSk7CisKKyAgLy8gUGFyc2Ugb3V0cHV0IHR5cGUuCisgIERPKENvbnN1bWUoInJldHVybnMiKSk7CisgIERPKENvbnN1bWUoIigiKSk7CisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1ldGhvZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a091dHB1dFR5cGVGaWVsZE51bWJlcik7CisgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICAgIG1ldGhvZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVVRQVVRfVFlQRSk7CisgICAgRE8oUGFyc2VVc2VyRGVmaW5lZFR5cGUobWV0aG9kLT5tdXRhYmxlX291dHB1dF90eXBlKCkpKTsKKyAgfQorICBETyhDb25zdW1lKCIpIikpOworCisgIGlmIChUcnlDb25zdW1lKCJ7IikpIHsKKyAgICAvLyBPcHRpb25zIQorICAgIHdoaWxlICghVHJ5Q29uc3VtZSgifSIpKSB7CisgICAgICBpZiAoQXRFbmQoKSkgeworICAgICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gbWV0aG9kIG9wdGlvbnMgKG1pc3NpbmcgJ30nKS4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoVHJ5Q29uc3VtZSgiOyIpKSB7CisgICAgICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCisgICAgICB9IGVsc2UgeworICAgICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1ldGhvZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOworICAgICAgICBpZiAoIVBhcnNlT3B0aW9uKG1ldGhvZC0+bXV0YWJsZV9vcHRpb25zKCksIGxvY2F0aW9uKSkgeworICAgICAgICAgIC8vIFRoaXMgc3RhdGVtZW50IGZhaWxlZCB0byBwYXJzZS4gIFNraXAgaXQsIGJ1dCBrZWVwIGxvb3BpbmcgdG8KKyAgICAgICAgICAvLyBwYXJzZSBvdGhlciBzdGF0ZW1lbnRzLgorICAgICAgICAgIFNraXBTdGF0ZW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBETyhDb25zdW1lKCI7IikpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBQYXJzZXI6OlBhcnNlTGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsKiBsYWJlbCkgeworICBpZiAoVHJ5Q29uc3VtZSgib3B0aW9uYWwiKSkgeworICAgICpsYWJlbCA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCJyZXBlYXRlZCIpKSB7CisgICAgKmxhYmVsID0gRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUEVBVEVEOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoInJlcXVpcmVkIikpIHsKKyAgICAqbGFiZWwgPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVRVUlSRUQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgQWRkRXJyb3IoIkV4cGVjdGVkIFwicmVxdWlyZWRcIiwgXCJvcHRpb25hbFwiLCBvciBcInJlcGVhdGVkXCIuIik7CisgICAgLy8gV2UgY2FuIGFjdHVhbGx5IHJlYXNvbmFibHkgcmVjb3ZlciBoZXJlIGJ5IGp1c3QgYXNzdW1pbmcgdGhlIHVzZXIKKyAgICAvLyBmb3Jnb3QgdGhlIGxhYmVsIGFsdG9nZXRoZXIuCisgICAgKmxhYmVsID0gRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZVR5cGUoRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogdHlwZV9uYW1lKSB7CisgIFR5cGVOYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdGVyID0ga1R5cGVOYW1lcy5maW5kKGlucHV0Xy0+Y3VycmVudCgpLnRleHQpOworICBpZiAoaXRlciAhPSBrVHlwZU5hbWVzLmVuZCgpKSB7CisgICAgKnR5cGUgPSBpdGVyLT5zZWNvbmQ7CisgICAgaW5wdXRfLT5OZXh0KCk7CisgIH0gZWxzZSB7CisgICAgRE8oUGFyc2VVc2VyRGVmaW5lZFR5cGUodHlwZV9uYW1lKSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZVVzZXJEZWZpbmVkVHlwZShzdHJpbmcqIHR5cGVfbmFtZSkgeworICB0eXBlX25hbWUtPmNsZWFyKCk7CisKKyAgVHlwZU5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBrVHlwZU5hbWVzLmZpbmQoaW5wdXRfLT5jdXJyZW50KCkudGV4dCk7CisgIGlmIChpdGVyICE9IGtUeXBlTmFtZXMuZW5kKCkpIHsKKyAgICAvLyBOb3RlOiAgVGhlIG9ubHkgcGxhY2UgZW51bSB0eXBlcyBhcmUgYWxsb3dlZCBpcyBmb3IgZmllbGQgdHlwZXMsIGJ1dAorICAgIC8vICAgaWYgd2UgYXJlIHBhcnNpbmcgYSBmaWVsZCB0eXBlIHRoZW4gd2Ugd291bGQgbm90IGdldCBoZXJlIGJlY2F1c2UKKyAgICAvLyAgIHByaW1pdGl2ZXMgYXJlIGFsbG93ZWQgdGhlcmUgYXMgd2VsbC4gIFNvIHRoaXMgZXJyb3IgbWVzc2FnZSBkb2Vzbid0CisgICAgLy8gICBuZWVkIHRvIGFjY291bnQgZm9yIGVudW1zLgorICAgIEFkZEVycm9yKCJFeHBlY3RlZCBtZXNzYWdlIHR5cGUuIik7CisKKyAgICAvLyBQcmV0ZW5kIHRvIGFjY2VwdCB0aGlzIHR5cGUgc28gdGhhdCB3ZSBjYW4gZ28gb24gcGFyc2luZy4KKyAgICAqdHlwZV9uYW1lID0gaW5wdXRfLT5jdXJyZW50KCkudGV4dDsKKyAgICBpbnB1dF8tPk5leHQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEEgbGVhZGluZyAiLiIgbWVhbnMgdGhlIG5hbWUgaXMgZnVsbHktcXVhbGlmaWVkLgorICBpZiAoVHJ5Q29uc3VtZSgiLiIpKSB0eXBlX25hbWUtPmFwcGVuZCgiLiIpOworCisgIC8vIENvbnN1bWUgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIG5hbWUuCisgIHN0cmluZyBpZGVudGlmaWVyOworICBETyhDb25zdW1lSWRlbnRpZmllcigmaWRlbnRpZmllciwgIkV4cGVjdGVkIHR5cGUgbmFtZS4iKSk7CisgIHR5cGVfbmFtZS0+YXBwZW5kKGlkZW50aWZpZXIpOworCisgIC8vIENvbnN1bWUgbW9yZSBwYXJ0cy4KKyAgd2hpbGUgKFRyeUNvbnN1bWUoIi4iKSkgeworICAgIHR5cGVfbmFtZS0+YXBwZW5kKCIuIik7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJmlkZW50aWZpZXIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIpKTsKKyAgICB0eXBlX25hbWUtPmFwcGVuZChpZGVudGlmaWVyKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2Jvb2wgUGFyc2VyOjpQYXJzZVBhY2thZ2UoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcm9vdF9sb2NhdGlvbikgeworICBpZiAoZmlsZS0+aGFzX3BhY2thZ2UoKSkgeworICAgIEFkZEVycm9yKCJNdWx0aXBsZSBwYWNrYWdlIGRlZmluaXRpb25zLiIpOworICAgIC8vIERvbid0IGFwcGVuZCB0aGUgbmV3IHBhY2thZ2UgdG8gdGhlIG9sZCBvbmUuICBKdXN0IHJlcGxhY2UgaXQuICBOb3QKKyAgICAvLyB0aGF0IGl0IHJlYWxseSBtYXR0ZXJzIHNpbmNlIHRoaXMgaXMgYW4gZXJyb3IgYW55d2F5LgorICAgIGZpbGUtPmNsZWFyX3BhY2thZ2UoKTsKKyAgfQorCisgIERPKENvbnN1bWUoInBhY2thZ2UiKSk7CisKKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24ocm9vdF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtQYWNrYWdlRmllbGROdW1iZXIpOworICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKGZpbGUsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgc3RyaW5nIGlkZW50aWZpZXI7CisgICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmaWRlbnRpZmllciwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIikpOworICAgICAgZmlsZS0+bXV0YWJsZV9wYWNrYWdlKCktPmFwcGVuZChpZGVudGlmaWVyKTsKKyAgICAgIGlmICghVHJ5Q29uc3VtZSgiLiIpKSBicmVhazsKKyAgICAgIGZpbGUtPm11dGFibGVfcGFja2FnZSgpLT5hcHBlbmQoIi4iKTsKKyAgICB9CisgIH0KKworICBETyhDb25zdW1lKCI7IikpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlSW1wb3J0KHN0cmluZyogaW1wb3J0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHJvb3RfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CisgIERPKENvbnN1bWUoImltcG9ydCIpKTsKKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24ocm9vdF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtEZXBlbmRlbmN5RmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgRE8oQ29uc3VtZVN0cmluZyhpbXBvcnRfZmlsZW5hbWUsCisgICAgICAiRXhwZWN0ZWQgYSBzdHJpbmcgbmFtaW5nIHRoZSBmaWxlIHRvIGltcG9ydC4iKSk7CisgIH0KKyAgRE8oQ29uc3VtZSgiOyIpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyc2VyOjpQYXJzZU9wdGlvbihNZXNzYWdlKiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG9wdGlvbnNfbG9jYXRpb24pIHsKKyAgRE8oQ29uc3VtZSgib3B0aW9uIikpOworICBETyhQYXJzZU9wdGlvbkFzc2lnbm1lbnQob3B0aW9ucywgb3B0aW9uc19sb2NhdGlvbikpOworICBETyhDb25zdW1lKCI7IikpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTb3VyY2VMb2NhdGlvblRhYmxlOjpTb3VyY2VMb2NhdGlvblRhYmxlKCkge30KK1NvdXJjZUxvY2F0aW9uVGFibGU6On5Tb3VyY2VMb2NhdGlvblRhYmxlKCkge30KKworYm9vbCBTb3VyY2VMb2NhdGlvblRhYmxlOjpGaW5kKAorICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgIGludCogbGluZSwgaW50KiBjb2x1bW4pIGNvbnN0IHsKKyAgY29uc3QgcGFpcjxpbnQsIGludD4qIHJlc3VsdCA9CisgICAgRmluZE9yTnVsbChsb2NhdGlvbl9tYXBfLCBtYWtlX3BhaXIoZGVzY3JpcHRvciwgbG9jYXRpb24pKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgKmxpbmUgICA9IC0xOworICAgICpjb2x1bW4gPSAwOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICAqbGluZSAgID0gcmVzdWx0LT5maXJzdDsKKyAgICAqY29sdW1uID0gcmVzdWx0LT5zZWNvbmQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKwordm9pZCBTb3VyY2VMb2NhdGlvblRhYmxlOjpBZGQoCisgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKKyAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgaW50IGxpbmUsIGludCBjb2x1bW4pIHsKKyAgbG9jYXRpb25fbWFwX1ttYWtlX3BhaXIoZGVzY3JpcHRvciwgbG9jYXRpb24pXSA9IG1ha2VfcGFpcihsaW5lLCBjb2x1bW4pOworfQorCit2b2lkIFNvdXJjZUxvY2F0aW9uVGFibGU6OkNsZWFyKCkgeworICBsb2NhdGlvbl9tYXBfLmNsZWFyKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYzkwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaApAQCAtMCwwICsxLDQzNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gSW1wbGVtZW50cyBwYXJzaW5nIG9mIC5wcm90byBmaWxlcyB0byBGaWxlRGVzY3JpcHRvclByb3Rvcy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUEFSU0VSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUEFSU0VSX0hfXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7IGNsYXNzIE1lc3NhZ2U7IH0KKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgUGFyc2VyOworY2xhc3MgU291cmNlTG9jYXRpb25UYWJsZTsKKworLy8gSW1wbGVtZW50cyBwYXJzaW5nIG9mIHByb3RvY29sIGRlZmluaXRpb25zIChzdWNoIGFzIC5wcm90byBmaWxlcykuCisvLworLy8gTm90ZSB0aGF0IG1vc3QgdXNlcnMgd2lsbCBiZSBtb3JlIGludGVyZXN0ZWQgaW4gdGhlIEltcG9ydGVyIGNsYXNzLgorLy8gUGFyc2VyIGlzIGEgbG93ZXItbGV2ZWwgY2xhc3Mgd2hpY2ggc2ltcGx5IGNvbnZlcnRzIGEgc2luZ2xlIC5wcm90byBmaWxlCisvLyB0byBhIEZpbGVEZXNjcmlwdG9yUHJvdG8uICBJdCBkb2VzIG5vdCByZXNvbHZlIGltcG9ydCBkaXJlY3RpdmVzIG9yIHBlcmZvcm0KKy8vIG1hbnkgb3RoZXIga2luZHMgb2YgdmFsaWRhdGlvbiBuZWVkZWQgdG8gY29uc3RydWN0IGEgY29tcGxldGUKKy8vIEZpbGVEZXNjcmlwdG9yLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFBhcnNlciB7CisgcHVibGljOgorICBQYXJzZXIoKTsKKyAgflBhcnNlcigpOworCisgIC8vIFBhcnNlIHRoZSBlbnRpcmUgaW5wdXQgYW5kIGNvbnN0cnVjdCBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gcmVwcmVzZW50aW5nCisgIC8vIGl0LiAgUmV0dXJucyB0cnVlIGlmIG5vIGVycm9ycyBvY2N1cnJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIFBhcnNlKGlvOjpUb2tlbml6ZXIqIGlucHV0LCBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlKTsKKworICAvLyBPcHRpb25hbCBmZXRhdXJlczoKKworICAvLyBERVBSRUNBVEVEOiAgTmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgU291cmNlQ29kZUluZm8gZW1iZWRkZWQgaW4gdGhlCisgIC8vICAgRmlsZURlc2NyaXB0b3JQcm90by4KKyAgLy8KKyAgLy8gUmVxdWVzdHMgdGhhdCBsb2NhdGlvbnMgb2YgY2VydGFpbiBkZWZpbml0aW9ucyBiZSByZWNvcmRlZCB0byB0aGUgZ2l2ZW4KKyAgLy8gU291cmNlTG9jYXRpb25UYWJsZSB3aGlsZSBwYXJzaW5nLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBsb29rIHVwIGV4YWN0IGxpbmUKKyAgLy8gYW5kIGNvbHVtbiBudW1iZXJzIGZvciBlcnJvcnMgcmVwb3J0ZWQgYnkgRGVzY3JpcHRvclBvb2wgZHVyaW5nIHZhbGlkYXRpb24uCisgIC8vIFNldCB0byBOVUxMICh0aGUgZGVmYXVsdCkgdG8gZGlzY2FyZCBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgIHZvaWQgUmVjb3JkU291cmNlTG9jYXRpb25zVG8oU291cmNlTG9jYXRpb25UYWJsZSogbG9jYXRpb25fdGFibGUpIHsKKyAgICBzb3VyY2VfbG9jYXRpb25fdGFibGVfID0gbG9jYXRpb25fdGFibGU7CisgIH0KKworICAvLyBSZXF1ZXN0cyB0aGF0IGVycm9ycyBiZSByZWNvcmRlZCB0byB0aGUgZ2l2ZW4gRXJyb3JDb2xsZWN0b3Igd2hpbGUKKyAgLy8gcGFyc2luZy4gIFNldCB0byBOVUxMICh0aGUgZGVmYXVsdCkgdG8gZGlzY2FyZCBlcnJvciBtZXNzYWdlcy4KKyAgdm9pZCBSZWNvcmRFcnJvcnNUbyhpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvcikgeworICAgIGVycm9yX2NvbGxlY3Rvcl8gPSBlcnJvcl9jb2xsZWN0b3I7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIHVzZWQgaW4gdGhlICJzeW50YXggPSAiIGRlY2xhcmF0aW9uLCBpZiBvbmUgd2FzCisgIC8vIHNlZW4gZHVyaW5nIHRoZSBsYXN0IGNhbGwgdG8gUGFyc2UoKSwgb3IgdGhlIGVtcHR5IHN0cmluZyBvdGhlcndpc2UuCisgIGNvbnN0IHN0cmluZyYgR2V0U3ludGF4SWRlbnRpZmllcigpIHsgcmV0dXJuIHN5bnRheF9pZGVudGlmaWVyXzsgfQorCisgIC8vIElmIHNldCB0cnVlLCBpbnB1dCBmaWxlcyB3aWxsIGJlIHJlcXVpcmVkIHRvIGJlZ2luIHdpdGggYSBzeW50YXgKKyAgLy8gaWRlbnRpZmllci4gIE90aGVyd2lzZSwgZmlsZXMgbWF5IG9taXQgdGhpcy4gIElmIGEgc3ludGF4IGlkZW50aWZpZXIKKyAgLy8gaXMgcHJvdmlkZWQsIGl0IG11c3QgYmUgJ3N5bnRheCA9ICJwcm90bzIiOycgYW5kIG11c3QgYXBwZWFyIGF0IHRoZQorICAvLyB0b3Agb2YgdGhpcyBmaWxlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgaXQgd2FzIHJlcXVpcmVkLgorICB2b2lkIFNldFJlcXVpcmVTeW50YXhJZGVudGlmaWVyKGJvb2wgdmFsdWUpIHsKKyAgICByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyA9IHZhbHVlOworICB9CisKKyAgLy8gQ2FsbCBTZXRTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyKHRydWUpIHRvIHRlbGwgdGhlIHBhcnNlciB0byBzdG9wCisgIC8vIHBhcnNpbmcgYXMgc29vbiBhcyBpdCBoYXMgc2VlbiB0aGUgc3ludGF4IGlkZW50aWZpZXIsIG9yIGxhY2sgdGhlcmVvZi4KKyAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHF1aWNrbHkgaWRlbnRpZnlpbmcgdGhlIHN5bnRheCBvZiB0aGUgZmlsZSB3aXRob3V0CisgIC8vIHBhcnNpbmcgdGhlIHdob2xlIHRoaW5nLiAgSWYgdGhpcyBpcyBlbmFibGVkLCBubyBlcnJvciB3aWxsIGJlIHJlY29yZGVkCisgIC8vIGlmIHRoZSBzeW50YXggaWRlbnRpZmllciBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiAicHJvdG8yIiAoc2luY2UKKyAgLy8gcHJlc3VtYWJseSB0aGUgY2FsbGVyIGludGVuZHMgdG8gZGVhbCB3aXRoIHRoYXQpLCBidXQgb3RoZXIga2luZHMgb2YKKyAgLy8gZXJyb3JzIChlLmcuIHBhcnNlIGVycm9ycykgd2lsbCBzdGlsbCBiZSByZXBvcnRlZC4gIFdoZW4gdGhpcyBpcyBlbmFibGVkLAorICAvLyB5b3UgbWF5IHBhc3MgYSBOVUxMIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gUGFyc2UoKS4KKyAgdm9pZCBTZXRTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyKGJvb2wgdmFsdWUpIHsKKyAgICBzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXyA9IHZhbHVlOworICB9CisKKyBwcml2YXRlOgorICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBFcnJvciByZWNvdmVyeSBoZWxwZXJzCisKKyAgLy8gQ29uc3VtZSB0aGUgcmVzdCBvZiB0aGUgY3VycmVudCBzdGF0ZW1lbnQuICBUaGlzIGNvbnN1bWVzIHRva2VucworICAvLyB1bnRpbCBpdCBzZWVzIG9uZSBvZjoKKyAgLy8gICAnOycgIENvbnN1bWVzIHRoZSB0b2tlbiBhbmQgcmV0dXJucy4KKyAgLy8gICAneycgIENvbnN1bWVzIHRoZSBicmFjZSB0aGVuIGNhbGxzIFNraXBSZXN0T2ZCbG9jaygpLgorICAvLyAgICd9JyAgUmV0dXJucyB3aXRob3V0IGNvbnN1bWluZy4KKyAgLy8gICBFT0YgIFJldHVybnMgKGNhbid0IGNvbnN1bWUpLgorICAvLyBUaGUgUGFyc2VyIG9mdGVuIGNhbGxzIFNraXBTdGF0ZW1lbnQoKSBhZnRlciBlbmNvdW50ZXJpbmcgYSBzeW50YXgKKyAgLy8gZXJyb3IuICBUaGlzIGFsbG93cyBpdCB0byBnbyBvbiBwYXJzaW5nIHRoZSBmb2xsb3dpbmcgbGluZXMsIGFsbG93aW5nCisgIC8vIGl0IHRvIHJlcG9ydCBtb3JlIHRoYW4ganVzdCBvbmUgZXJyb3IgaW4gdGhlIGZpbGUuCisgIHZvaWQgU2tpcFN0YXRlbWVudCgpOworCisgIC8vIENvbnN1bWUgdGhlIHJlc3Qgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGluY2x1ZGluZyBuZXN0ZWQgYmxvY2tzLAorICAvLyBlbmRpbmcgYWZ0ZXIgdGhlIGNsb3NpbmcgJ30nIGlzIGVuY291bnRlcmVkIGFuZCBjb25zdW1lZCwgb3IgYXQgRU9GLgorICB2b2lkIFNraXBSZXN0T2ZCbG9jaygpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFNpbmdsZS10b2tlbiBjb25zdW1pbmcgaGVscGVycworICAvLworICAvLyBUaGVzZSBtYWtlIHBhcnNpbmcgY29kZSBtb3JlIHJlYWRhYmxlLgorCisgIC8vIFRydWUgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgVFlQRV9FTkQuCisgIGlubGluZSBib29sIEF0RW5kKCk7CisKKyAgLy8gVHJ1ZSBpZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBnaXZlbiB0ZXh0LgorICBpbmxpbmUgYm9vbCBMb29raW5nQXQoY29uc3QgY2hhciogdGV4dCk7CisgIC8vIFRydWUgaWYgdGhlIG5leHQgdG9rZW4gaXMgb2YgdGhlIGdpdmVuIHR5cGUuCisgIGlubGluZSBib29sIExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VG9rZW5UeXBlIHRva2VuX3R5cGUpOworCisgIC8vIElmIHRoZSBuZXh0IHRva2VuIGV4YWN0bHkgbWF0Y2hlcyB0aGUgdGV4dCBnaXZlbiwgY29uc3VtZSBpdCBhbmQgcmV0dXJuCisgIC8vIHRydWUuICBPdGhlcndpc2UsIHJldHVybiBmYWxzZSB3aXRob3V0IGxvZ2dpbmcgYW4gZXJyb3IuCisgIGJvb2wgVHJ5Q29uc3VtZShjb25zdCBjaGFyKiB0ZXh0KTsKKworICAvLyBUaGVzZSBhdHRlbXB0IHRvIHJlYWQgc29tZSBraW5kIG9mIHRva2VuIGZyb20gdGhlIGlucHV0LiAgSWYgc3VjY2Vzc2Z1bCwKKyAgLy8gdGhleSByZXR1cm4gdHJ1ZS4gIE90aGVyd2lzZSB0aGV5IHJldHVybiBmYWxzZSBhbmQgYWRkIHRoZSBnaXZlbiBlcnJvcgorICAvLyB0byB0aGUgZXJyb3IgbGlzdC4KKworICAvLyBDb25zdW1lIGEgdG9rZW4gd2l0aCB0aGUgZXhhY3QgdGV4dCBnaXZlbi4KKyAgYm9vbCBDb25zdW1lKGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGNoYXIqIGVycm9yKTsKKyAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIHRoZSBlcnJvciAiRXhwZWN0ZWQgXCJ0ZXh0XCIuIiwKKyAgLy8gd2hlcmUgInRleHQiIGlzIHRoZSBleHBlY3RlZCB0b2tlbiB0ZXh0LgorICBib29sIENvbnN1bWUoY29uc3QgY2hhciogdGV4dCk7CisgIC8vIENvbnN1bWUgYSB0b2tlbiBvZiB0eXBlIElERU5USUZJRVIgYW5kIHN0b3JlIGl0cyB0ZXh0IGluICJvdXRwdXQiLgorICBib29sIENvbnN1bWVJZGVudGlmaWVyKHN0cmluZyogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcik7CisgIC8vIENvbnN1bWUgYW4gaW50ZWdlciBhbmQgc3RvcmUgaXRzIHZhbHVlIGluICJvdXRwdXQiLgorICBib29sIENvbnN1bWVJbnRlZ2VyKGludCogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcik7CisgIC8vIENvbnN1bWUgYSA2NC1iaXQgaW50ZWdlciBhbmQgc3RvcmUgaXRzIHZhbHVlIGluICJvdXRwdXQiLiAgSWYgdGhlIHZhbHVlCisgIC8vIGlzIGdyZWF0ZXIgdGhhbiBtYXhfdmFsdWUsIGFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQuCisgIGJvb2wgQ29uc3VtZUludGVnZXI2NCh1aW50NjQgbWF4X3ZhbHVlLCB1aW50NjQqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpOworICAvLyBDb25zdW1lIGEgbnVtYmVyIGFuZCBzdG9yZSBpdHMgdmFsdWUgaW4gIm91dHB1dCIuICBUaGlzIHdpbGwgYWNjZXB0CisgIC8vIHRva2VucyBvZiBlaXRoZXIgSU5URUdFUiBvciBGTE9BVCB0eXBlLgorICBib29sIENvbnN1bWVOdW1iZXIoZG91YmxlKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKKyAgLy8gQ29uc3VtZSBhIHN0cmluZyBsaXRlcmFsIGFuZCBzdG9yZSBpdHMgKHVuZXNjYXBlZCkgdmFsdWUgaW4gIm91dHB1dCIuCisgIGJvb2wgQ29uc3VtZVN0cmluZyhzdHJpbmcqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEVycm9yIGxvZ2dpbmcgaGVscGVycworCisgIC8vIEludm9rZXMgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IoKSwgaWYgZXJyb3JfY29sbGVjdG9yXyBpcyBub3QgTlVMTC4KKyAgdm9pZCBBZGRFcnJvcihpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBlcnJvcik7CisKKyAgLy8gSW52b2tlcyBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcigpIHdpdGggdGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXIKKyAgLy8gb2YgdGhlIGN1cnJlbnQgdG9rZW4uCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBlcnJvcik7CisKKyAgLy8gUmVjb3JkcyBhIGxvY2F0aW9uIGluIHRoZSBTb3VyY2VDb2RlSW5mby5sb2NhdGlvbiB0YWJsZSAoc2VlCisgIC8vIGRlc2NyaXB0b3IucHJvdG8pLiAgV2UgdXNlIFJBSUkgdG8gZW5zdXJlIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb25zCisgIC8vIGFyZSByZWNvcmRlZCAtLSB0aGUgY29uc3RydWN0b3IgcmVjb3JkcyB0aGUgc3RhcnQgbG9jYXRpb24gYW5kIHRoZQorICAvLyBkZXN0cnVjdG9yIHJlY29yZHMgdGhlIGVuZCBsb2NhdGlvbi4gIFNpbmNlIHRoZSBwYXJzZXIgaXMKKyAgLy8gcmVjdXJzaXZlLWRlc2NlbnQsIHRoaXMgd29ya3Mgb3V0IGJlYXV0aWZ1bGx5LgorICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTG9jYXRpb25SZWNvcmRlciB7CisgICBwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0IHRoZSBmaWxlJ3MgInJvb3QiIGxvY2F0aW9uLgorICAgIExvY2F0aW9uUmVjb3JkZXIoUGFyc2VyKiBwYXJzZXIpOworCisgICAgLy8gQ29uc3RydWN0IGEgbG9jYXRpb24gdGhhdCByZXByZXNlbnRzIGEgZGVjbGFyYXRpb24gbmVzdGVkIHdpdGhpbiB0aGUKKyAgICAvLyBnaXZlbiBwYXJlbnQuICBFLmcuIGEgZmllbGQncyBsb2NhdGlvbiBpcyBuZXN0ZWQgd2l0aGluIHRoZSBsb2NhdGlvbgorICAgIC8vIGZvciBhIG1lc3NhZ2UgdHlwZS4gIFRoZSBwYXJlbnQncyBwYXRoIHdpbGwgYmUgY29waWVkLCBzbyB5b3Ugc2hvdWxkCisgICAgLy8gY2FsbCBBZGRQYXRoKCkgb25seSB0byBhZGQgdGhlIHBhdGggY29tcG9uZW50cyBsZWFkaW5nIGZyb20gdGhlIHBhcmVudAorICAgIC8vIHRvIHRoZSBjaGlsZCAoYXMgb3Bwb3NlZCB0byBsZWFkaW5nIGZyb20gdGhlIHJvb3QgdG8gdGhlIGNoaWxkKS4KKyAgICBMb2NhdGlvblJlY29yZGVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCk7CisKKyAgICAvLyBDb252ZW5pZW5jZSBjb25zdHJ1Y3RvcnMgdGhhdCBjYWxsIEFkZFBhdGgoKSBvbmUgb3IgdHdvIHRpbWVzLgorICAgIExvY2F0aW9uUmVjb3JkZXIoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50LCBpbnQgcGF0aDEpOworICAgIExvY2F0aW9uUmVjb3JkZXIoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50LCBpbnQgcGF0aDEsIGludCBwYXRoMik7CisKKyAgICB+TG9jYXRpb25SZWNvcmRlcigpOworCisgICAgLy8gQWRkIGEgcGF0aCBjb21wb25lbnQuICBTZWUgU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCBpbgorICAgIC8vIGRlc2NyaXB0b3IucHJvdG8uCisgICAgdm9pZCBBZGRQYXRoKGludCBwYXRoX2NvbXBvbmVudCk7CisKKyAgICAvLyBCeSBkZWZhdWx0IHRoZSBsb2NhdGlvbiBpcyBjb25zaWRlcmVkIHRvIHN0YXJ0IGF0IHRoZSBjdXJyZW50IHRva2VuIGF0CisgICAgLy8gdGhlIHRpbWUgdGhlIExvY2F0aW9uUmVjb3JkZXIgaXMgY3JlYXRlZC4gIFN0YXJ0QXQoKSBzZXRzIHRoZSBzdGFydAorICAgIC8vIGxvY2F0aW9uIHRvIHRoZSBnaXZlbiB0b2tlbiBpbnN0ZWFkLgorICAgIHZvaWQgU3RhcnRBdChjb25zdCBpbzo6VG9rZW5pemVyOjpUb2tlbiYgdG9rZW4pOworCisgICAgLy8gQnkgZGVmYXVsdCB0aGUgbG9jYXRpb24gaXMgY29uc2lkZXJlZCB0byBlbmQgYXQgdGhlIHByZXZpb3VzIHRva2VuIGF0CisgICAgLy8gdGhlIHRpbWUgdGhlIExvY2F0aW9uUmVjb3JkZXIgaXMgZGVzdHJveWVkLiAgRW5kQXQoKSBzZXRzIHRoZSBlbmQKKyAgICAvLyBsb2NhdGlvbiB0byB0aGUgZ2l2ZW4gdG9rZW4gaW5zdGVhZC4KKyAgICB2b2lkIEVuZEF0KGNvbnN0IGlvOjpUb2tlbml6ZXI6OlRva2VuJiB0b2tlbik7CisKKyAgICAvLyBSZWNvcmRzIHRoZSBzdGFydCBwb2ludCBvZiB0aGlzIGxvY2F0aW9uIHRvIHRoZSBTb3VyY2VMb2NhdGlvblRhYmxlIHRoYXQKKyAgICAvLyB3YXMgcGFzc2VkIHRvIFJlY29yZFNvdXJjZUxvY2F0aW9uc1RvKCksIGlmIGFueS4gIFNvdXJjZUxvY2F0aW9uVGFibGUKKyAgICAvLyBpcyBhbiBvbGRlciB3YXkgb2Yga2VlcGluZyB0cmFjayBvZiBzb3VyY2UgbG9jYXRpb25zIHdoaWNoIGlzIHN0aWxsCisgICAgLy8gdXNlZCBpbiBzb21lIHBsYWNlcy4KKyAgICB2b2lkIFJlY29yZExlZ2FjeUxvY2F0aW9uKGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbik7CisKKyAgIHByaXZhdGU6CisgICAgUGFyc2VyKiBwYXJzZXJfOworICAgIFNvdXJjZUNvZGVJbmZvOjpMb2NhdGlvbiogbG9jYXRpb25fOworCisgICAgdm9pZCBJbml0KGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCk7CisgIH07CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gUGFyc2VycyBmb3IgdmFyaW91cyBsYW5ndWFnZSBjb25zdHJ1Y3RzCisKKyAgLy8gUGFyc2VzIHRoZSAic3ludGF4ID0gXCJwcm90bzJcIjsiIGxpbmUgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4gIFJldHVybnMKKyAgLy8gZmFsc2UgaWYgaXQgZmFpbGVkIHRvIHBhcnNlIG9yIGlmIHRoZSBzeW50YXggaWRlbnRpZmllciB3YXMgbm90CisgIC8vIHJlY29nbml6ZWQuCisgIGJvb2wgUGFyc2VTeW50YXhJZGVudGlmaWVyKCk7CisKKyAgLy8gVGhlc2UgbWV0aG9kcyBwYXJzZSB2YXJpb3VzIGluZGl2aWR1YWwgYml0cyBvZiBjb2RlLiAgVGhleSByZXR1cm4KKyAgLy8gZmFsc2UgaWYgdGhleSBjb21wbGV0ZWx5IGZhaWwgdG8gcGFyc2UgdGhlIGNvbnN0cnVjdC4gIEluIHRoaXMgY2FzZSwKKyAgLy8gaXQgaXMgcHJvYmFibHkgbmVjZXNzYXJ5IHRvIHNraXAgdGhlIHJlc3Qgb2YgdGhlIHN0YXRlbWVudCB0byByZWNvdmVyLgorICAvLyBIb3dldmVyLCBpZiB0aGVzZSBtZXRob2RzIHJldHVybiB0cnVlLCBpdCBkb2VzIE5PVCBtZWFuIHRoYXQgdGhlcmUKKyAgLy8gd2VyZSBubyBlcnJvcnM7IG9ubHkgdGhhdCB0aGVyZSB3ZXJlIG5vICpzeW50YXgqIGVycm9ycy4gIEZvciBpbnN0YW5jZSwKKyAgLy8gaWYgYSBzZXJ2aWNlIG1ldGhvZCBpcyBkZWZpbmVkIHVzaW5nIHByb3BlciBzeW50YXggYnV0IHVzZXMgYSBwcmltaXRpdmUKKyAgLy8gdHlwZSBhcyBpdHMgaW5wdXQgb3Igb3V0cHV0LCBQYXJzZU1ldGhvZEZpZWxkKCkgc3RpbGwgcmV0dXJucyB0cnVlCisgIC8vIGFuZCBvbmx5IHJlcG9ydHMgdGhlIGVycm9yIGJ5IGNhbGxpbmcgQWRkRXJyb3IoKS4gIEluIHByYWN0aWNlLCB0aGlzCisgIC8vIG1ha2VzIGxvZ2ljIG11Y2ggc2ltcGxlciBmb3IgdGhlIGNhbGxlci4KKworICAvLyBQYXJzZSBhIHRvcC1sZXZlbCBtZXNzYWdlLCBlbnVtLCBzZXJ2aWNlLCBldGMuCisgIGJvb2wgUGFyc2VUb3BMZXZlbFN0YXRlbWVudChGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcm9vdF9sb2NhdGlvbik7CisKKyAgLy8gUGFyc2UgdmFyaW91cyBsYW5ndWFnZSBoaWdoLWxldmVsIGxhbmd1YWdlIGNvbnN0cnVyY3RzLgorICBib29sIFBhcnNlTWVzc2FnZURlZmluaXRpb24oRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbik7CisgIGJvb2wgUGFyc2VFbnVtRGVmaW5pdGlvbihFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uKTsKKyAgYm9vbCBQYXJzZVNlcnZpY2VEZWZpbml0aW9uKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uKTsKKyAgYm9vbCBQYXJzZVBhY2thZ2UoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcm9vdF9sb2NhdGlvbik7CisgIGJvb2wgUGFyc2VJbXBvcnQoc3RyaW5nKiBpbXBvcnRfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcm9vdF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOworICBib29sIFBhcnNlT3B0aW9uKE1lc3NhZ2UqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgb3B0aW9uc19sb2NhdGlvbik7CisKKyAgLy8gVGhlc2UgbWV0aG9kcyBwYXJzZSB0aGUgY29udGVudHMgb2YgYSBtZXNzYWdlLCBlbnVtLCBvciBzZXJ2aWNlIHR5cGUgYW5kCisgIC8vIGFkZCB0aGVtIHRvIHRoZSBnaXZlbiBvYmplY3QuICBUaGV5IGNvbnN1bWUgdGhlIGVudGlyZSBibG9jayBpbmNsdWRpbmcKKyAgLy8gdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIGJyYWNlLgorICBib29sIFBhcnNlTWVzc2FnZUJsb2NrKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXNzYWdlX2xvY2F0aW9uKTsKKyAgYm9vbCBQYXJzZUVudW1CbG9jayhFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbik7CisgIGJvb2wgUGFyc2VTZXJ2aWNlQmxvY2soU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uKTsKKworICAvLyBQYXJzZSBvbmUgc3RhdGVtZW50IHdpdGhpbiBhIG1lc3NhZ2UsIGVudW0sIG9yIHNlcnZpY2UgYmxvY2ssIGluY2x1bmRpbmcKKyAgLy8gZmluYWwgc2VtaWNvbG9uLgorICBib29sIFBhcnNlTWVzc2FnZVN0YXRlbWVudChEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24pOworICBib29sIFBhcnNlRW51bVN0YXRlbWVudChFbnVtRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uKTsKKyAgYm9vbCBQYXJzZVNlcnZpY2VTdGF0ZW1lbnQoU2VydmljZURlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbik7CisKKyAgLy8gUGFyc2UgYSBmaWVsZCBvZiBhIG1lc3NhZ2UuICBJZiB0aGUgZmllbGQgaXMgYSBncm91cCwgaXRzIHR5cGUgd2lsbCBiZQorICAvLyBhZGRlZCB0byAibWVzc2FnZXMiLgorICAvLworICAvLyBwYXJlbnRfbG9jYXRpb24gYW5kIGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUgYXJlIG5lZWRlZCB3aGVuCisgIC8vIHBhcnNpbmcgZ3JvdXBzIC0tIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBuZXN0ZWQgbWVzc2FnZSB0eXBlIHdpdGhpbiB0aGUKKyAgLy8gcGFyZW50IGFuZCByZWNvcmQgaXRzIGxvY2F0aW9uIGFjY29yZGluZ2x5LiAgU2luY2UgdGhlIHBhcmVudCBjb3VsZCBiZQorICAvLyBlaXRoZXIgYSBGaWxlRGVzY3JpcHRvclByb3RvIG9yIGEgRGVzY3JpcHRvclByb3RvLCB3ZSBtdXN0IHBhc3MgaW4gdGhlCisgIC8vIGNvcnJlY3QgZmllbGQgbnVtYmVyIHRvIHVzZS4KKyAgYm9vbCBQYXJzZU1lc3NhZ2VGaWVsZChGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxEZXNjcmlwdG9yUHJvdG8+KiBtZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24pOworCisgIC8vIFBhcnNlIGFuICJleHRlbnNpb25zIiBkZWNsYXJhdGlvbi4KKyAgYm9vbCBQYXJzZUV4dGVuc2lvbnMoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBleHRlbnNpb25zX2xvY2F0aW9uKTsKKworICAvLyBQYXJzZSBhbiAiZXh0ZW5kIiBkZWNsYXJhdGlvbi4gIChTZWUgYWxzbyBjb21tZW50cyBmb3IKKyAgLy8gUGFyc2VNZXNzYWdlRmllbGQoKS4pCisgIGJvb2wgUGFyc2VFeHRlbmQoUmVwZWF0ZWRQdHJGaWVsZDxGaWVsZERlc2NyaXB0b3JQcm90bz4qIGV4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxEZXNjcmlwdG9yUHJvdG8+KiBtZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgaW50IGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZXh0ZW5kX2xvY2F0aW9uKTsKKworICAvLyBQYXJzZSBhIHNpbmdsZSBlbnVtIHZhbHVlIHdpdGhpbiBhbiBlbnVtIGJsb2NrLgorICBib29sIFBhcnNlRW51bUNvbnN0YW50KEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogZW51bV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX3ZhbHVlX2xvY2F0aW9uKTsKKworICAvLyBQYXJzZSBlbnVtIGNvbnN0YW50IG9wdGlvbnMsIGkuZS4gdGhlIGxpc3QgaW4gc3F1YXJlIGJyYWNrZXRzIGF0IHRoZSBlbmQKKyAgLy8gb2YgdGhlIGVudW0gY29uc3RhbnQgdmFsdWUgZGVmaW5pdGlvbi4KKyAgYm9vbCBQYXJzZUVudW1Db25zdGFudE9wdGlvbnMoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV92YWx1ZV9sb2NhdGlvbik7CisKKyAgLy8gUGFyc2UgYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhIHNlcnZpY2UgZGVmaW5pdGlvbi4KKyAgYm9vbCBQYXJzZVNlcnZpY2VNZXRob2QoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1ldGhvZF9sb2NhdGlvbik7CisKKyAgLy8gUGFyc2UgInJlcXVpcmVkIiwgIm9wdGlvbmFsIiwgb3IgInJlcGVhdGVkIiBhbmQgZmlsbCBpbiAibGFiZWwiCisgIC8vIHdpdGggdGhlIHZhbHVlLgorICBib29sIFBhcnNlTGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsKiBsYWJlbCk7CisKKyAgLy8gUGFyc2UgYSB0eXBlIG5hbWUgYW5kIGZpbGwgaW4gInR5cGUiIChpZiBpdCBpcyBhIHByaW1pdGl2ZSkgb3IKKyAgLy8gInR5cGVfbmFtZSIgKGlmIGl0IGlzIG5vdCkgd2l0aCB0aGUgdHlwZSBwYXJzZWQuCisgIGJvb2wgUGFyc2VUeXBlKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICBzdHJpbmcqIHR5cGVfbmFtZSk7CisgIC8vIFBhcnNlIGEgdXNlci1kZWZpbmVkIHR5cGUgYW5kIGZpbGwgaW4gInR5cGVfbmFtZSIgd2l0aCB0aGUgbmFtZS4KKyAgLy8gSWYgYSBwcmltaXRpdmUgdHlwZSBpcyBuYW1lZCwgaXQgaXMgdHJlYXRlZCBhcyBhbiBlcnJvci4KKyAgYm9vbCBQYXJzZVVzZXJEZWZpbmVkVHlwZShzdHJpbmcqIHR5cGVfbmFtZSk7CisKKyAgLy8gUGFyc2VzIGZpZWxkIG9wdGlvbnMsIGkuZS4gdGhlIHN0dWZmIGluIHNxdWFyZSBicmFja2V0cyBhdCB0aGUgZW5kCisgIC8vIG9mIGEgZmllbGQgZGVmaW5pdGlvbi4gIEFsc28gcGFyc2VzIGRlZmF1bHQgdmFsdWUuCisgIGJvb2wgUGFyc2VGaWVsZE9wdGlvbnMoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uKTsKKworICAvLyBQYXJzZSB0aGUgImRlZmF1bHQiIG9wdGlvbi4gIFRoaXMgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyBiZWNhdXNlIGl0cworICAvLyB0eXBlIGlzIHRoZSBmaWVsZCdzIHR5cGUuCisgIGJvb2wgUGFyc2VEZWZhdWx0QXNzaWdubWVudChGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbik7CisKKyAgLy8gUGFyc2UgYSBzaW5nbGUgb3B0aW9uIG5hbWUvdmFsdWUgcGFpciwgZS5nLiAiY3R5cGUgPSBDT1JEIi4gIFRoZSBuYW1lCisgIC8vIGlkZW50aWZpZXMgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gTWVzc2FnZSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGF0IGZpZWxkCisgIC8vIGlzIHNldCB0byB0aGUgcGFyc2VkIHZhbHVlLgorICBib29sIFBhcnNlT3B0aW9uQXNzaWdubWVudChNZXNzYWdlKiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBvcHRpb25zX2xvY2F0aW9uKTsKKworICAvLyBQYXJzZXMgYSBzaW5nbGUgcGFydCBvZiBhIG11bHRpcGFydCBvcHRpb24gbmFtZS4gQSBtdWx0aXBhcnQgbmFtZSBjb25zaXN0cworICAvLyBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgZG90cy4gRWFjaCBuYW1lIGlzIGVpdGhlciBhbiBpZGVudGlmaWVyIG9yIGEgc2VyaWVzCisgIC8vIG9mIGlkZW50aWZpZXJzIHNlcGFyYXRlZCBieSBkb3RzIGFuZCBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcy4gRS5nLiwKKyAgLy8gImZvby4oYmFyLmJheikucXV4Ii4KKyAgYm9vbCBQYXJzZU9wdGlvbk5hbWVQYXJ0KFVuaW50ZXJwcmV0ZWRPcHRpb24qIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFydF9sb2NhdGlvbik7CisKKyAgLy8gUGFyc2VzIGEgc3RyaW5nIHN1cnJvdW5kZWQgYnkgYmFsYW5jZWQgYnJhY2VzLiAgU3RyaXBzIG9mZiB0aGUgb3V0ZXIKKyAgLy8gYnJhY2VzIGFuZCBzdG9yZXMgdGhlIGVuY2xvc2VkIHN0cmluZyBpbiAqdmFsdWUuCisgIC8vIEUuZy4sCisgIC8vICAgICB7IGZvbyB9ICAgICAgICAgICAgICAgICAgICAgKnZhbHVlIGdldHMgJ2ZvbycKKyAgLy8gICAgIHsgZm9vIHsgYmFyOiBib3ggfSB9ICAgICAgICAqdmFsdWUgZ2V0cyAnZm9vIHsgYmFyOiBib3ggfScKKyAgLy8gICAgIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUgZ2V0cyAnJworICAvLworICAvLyBSRVFVSVJFUzogTG9va2luZ0F0KCJ7IikKKyAgLy8gV2hlbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHksIHdlIGFyZSBsb29raW5nIGF0IHRoZSBmaXJzdCB0b2tlbiBwYXN0CisgIC8vIHRoZSBlbmRpbmcgYnJhY2UuCisgIGJvb2wgUGFyc2VVbmludGVycHJldGVkQmxvY2soc3RyaW5nKiB2YWx1ZSk7CisKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBpbzo6VG9rZW5pemVyKiBpbnB1dF87CisgIGlvOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yXzsKKyAgU291cmNlQ29kZUluZm8qIHNvdXJjZV9jb2RlX2luZm9fOworICBTb3VyY2VMb2NhdGlvblRhYmxlKiBzb3VyY2VfbG9jYXRpb25fdGFibGVfOyAgLy8gbGVnYWN5CisgIGJvb2wgaGFkX2Vycm9yc187CisgIGJvb2wgcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl87CisgIGJvb2wgc3RvcF9hZnRlcl9zeW50YXhfaWRlbnRpZmllcl87CisgIHN0cmluZyBzeW50YXhfaWRlbnRpZmllcl87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcnNlcik7Cit9OworCisvLyBBIHRhYmxlIG1hcHBpbmcgKGRlc2NyaXB0b3IsIEVycm9yTG9jYXRpb24pIHBhaXJzIC0tIGFzIHJlcG9ydGVkIGJ5CisvLyBEZXNjcmlwdG9yUG9vbCB3aGVuIHZhbGlkYXRpbmcgZGVzY3JpcHRvcnMgLS0gdG8gbGluZSBhbmQgY29sdW1uIG51bWJlcnMKKy8vIHdpdGhpbiB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuCisvLworLy8gVGhpcyBpcyBzZW1pLW9ic29sZXRlOiAgRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvIG5vdyBjb250YWlucworLy8gZmFyIG1vcmUgY29tcGxldGUgaW5mb3JtYXRpb24gYWJvdXQgc291cmNlIGxvY2F0aW9ucy4gIEhvd2V2ZXIsIGFzIG9mIHRoaXMKKy8vIHdyaXRpbmcgeW91IHN0aWxsIG5lZWQgdG8gdXNlIFNvdXJjZUxvY2F0aW9uVGFibGUgd2hlbiBpbnRlZ3JhdGluZyB3aXRoCisvLyBEZXNjcmlwdG9yUG9vbC4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTb3VyY2VMb2NhdGlvblRhYmxlIHsKKyBwdWJsaWM6CisgIFNvdXJjZUxvY2F0aW9uVGFibGUoKTsKKyAgflNvdXJjZUxvY2F0aW9uVGFibGUoKTsKKworICAvLyBGaW5kcyB0aGUgcHJlY2lzZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gZXJyb3IgYW5kIGZpbGxzIGluICpsaW5lIGFuZAorICAvLyAqY29sdW1uIHdpdGggdGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLiAgSWYgbm90IGZvdW5kLCBzZXRzICpsaW5lIHRvCisgIC8vIC0xIGFuZCAqY29sdW1uIHRvIDAgKHNpbmNlIGxpbmUgPSAtMSBpcyB1c2VkIHRvIG1lYW4gImVycm9yIGhhcyBubyBleGFjdAorICAvLyBsb2NhdGlvbiIgaW4gdGhlIEVycm9yQ29sbGVjdG9yIGludGVyZmFjZSkuICBSZXR1cm5zIHRydWUgaWYgZm91bmQsIGZhbHNlCisgIC8vIG90aGVyd2lzZS4KKyAgYm9vbCBGaW5kKGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgICAgICAgICBpbnQqIGxpbmUsIGludCogY29sdW1uKSBjb25zdDsKKworICAvLyBBZGRzIGEgbG9jYXRpb24gdG8gdGhlIHRhYmxlLgorICB2b2lkIEFkZChjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgICAgICAgIGludCBsaW5lLCBpbnQgY29sdW1uKTsKKworICAvLyBDbGVhcnMgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YWJsZS4KKyAgdm9pZCBDbGVhcigpOworCisgcHJpdmF0ZToKKyAgdHlwZWRlZiBtYXA8CisgICAgcGFpcjxjb25zdCBNZXNzYWdlKiwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uPiwKKyAgICBwYWlyPGludCwgaW50PiA+IExvY2F0aW9uTWFwOworICBMb2NhdGlvbk1hcCBsb2NhdGlvbl9tYXBfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUEFSU0VSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NmMwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwyMTIyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgaW86OkVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIE1vY2tFcnJvckNvbGxlY3RvcigpIHt9CisgIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorCisgIHN0cmluZyB0ZXh0XzsKKworICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiAkMlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7CisgIH0KK307CisKK2NsYXNzIE1vY2tWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIE1vY2tWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IoY29uc3QgU291cmNlTG9jYXRpb25UYWJsZSYgc291cmNlX2xvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6RXJyb3JDb2xsZWN0b3IqIHdyYXBwZWRfY29sbGVjdG9yKQorICAgIDogc291cmNlX2xvY2F0aW9uc18oc291cmNlX2xvY2F0aW9ucyksCisgICAgICB3cmFwcGVkX2NvbGxlY3Rvcl8od3JhcHBlZF9jb2xsZWN0b3IpIHt9CisgIH5Nb2NrVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKCkge30KKworICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIGludCBsaW5lLCBjb2x1bW47CisgICAgc291cmNlX2xvY2F0aW9uc18uRmluZChkZXNjcmlwdG9yLCBsb2NhdGlvbiwgJmxpbmUsICZjb2x1bW4pOworICAgIHdyYXBwZWRfY29sbGVjdG9yXy0+QWRkRXJyb3IobGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgU291cmNlTG9jYXRpb25UYWJsZSYgc291cmNlX2xvY2F0aW9uc187CisgIGlvOjpFcnJvckNvbGxlY3Rvciogd3JhcHBlZF9jb2xsZWN0b3JfOworfTsKKworY2xhc3MgUGFyc2VyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFBhcnNlclRlc3QoKQorICAgIDogcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl8oZmFsc2UpIHt9CisKKyAgLy8gU2V0IHVwIHRoZSBwYXJzZXIgdG8gcGFyc2UgdGhlIGdpdmVuIHRleHQuCisgIHZvaWQgU2V0dXBQYXJzZXIoY29uc3QgY2hhciogdGV4dCkgeworICAgIHJhd19pbnB1dF8ucmVzZXQobmV3IGlvOjpBcnJheUlucHV0U3RyZWFtKHRleHQsIHN0cmxlbih0ZXh0KSkpOworICAgIGlucHV0Xy5yZXNldChuZXcgaW86OlRva2VuaXplcihyYXdfaW5wdXRfLmdldCgpLCAmZXJyb3JfY29sbGVjdG9yXykpOworICAgIHBhcnNlcl8ucmVzZXQobmV3IFBhcnNlcigpKTsKKyAgICBwYXJzZXJfLT5SZWNvcmRFcnJvcnNUbygmZXJyb3JfY29sbGVjdG9yXyk7CisgICAgcGFyc2VyXy0+U2V0UmVxdWlyZVN5bnRheElkZW50aWZpZXIocmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl8pOworICB9CisKKyAgLy8gUGFyc2UgdGhlIGlucHV0IGFuZCBleHBlY3QgdGhhdCB0aGUgcmVzdWx0aW5nIEZpbGVEZXNjcmlwdG9yUHJvdG8gbWF0Y2hlcworICAvLyB0aGUgZ2l2ZW4gb3V0cHV0LiAgVGhlIG91dHB1dCBpcyBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gaW4gcHJvdG9jb2wgYnVmZmVyCisgIC8vIHRleHQgZm9ybWF0LgorICB2b2lkIEV4cGVjdFBhcnNlc1RvKGNvbnN0IGNoYXIqIGlucHV0LCBjb25zdCBjaGFyKiBvdXRwdXQpIHsKKyAgICBTZXR1cFBhcnNlcihpbnB1dCk7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBhY3R1YWwsIGV4cGVjdGVkOworCisgICAgcGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmYWN0dWFsKTsKKyAgICBFWFBFQ1RfRVEoaW86OlRva2VuaXplcjo6VFlQRV9FTkQsIGlucHV0Xy0+Y3VycmVudCgpLnR5cGUpOworICAgIEFTU0VSVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisKKyAgICAvLyBXZSBkb24ndCBjb3ZlciBTb3VyY2VDb2RlSW5mbyBpbiB0aGVzZSB0ZXN0cy4KKyAgICBhY3R1YWwuY2xlYXJfc291cmNlX2NvZGVfaW5mbygpOworCisgICAgLy8gUGFyc2UgdGhlIEFTQ0lJIHJlcHJlc2VudGF0aW9uIGluIG9yZGVyIHRvIGNhbm9uaWNhbGl6ZSBpdC4gIFdlIGNvdWxkCisgICAgLy8ganVzdCBjb21wYXJlIGRpcmVjdGx5IHRvIGFjdHVhbC5EZWJ1Z1N0cmluZygpLCBidXQgdGhhdCB3b3VsZCByZXF1aXJlCisgICAgLy8gdGhhdCB0aGUgY2FsbGVyIHByZWNpc2VseSBtYXRjaCB0aGUgZm9ybWF0dGluZyB0aGF0IERlYnVnU3RyaW5nKCkKKyAgICAvLyBwcm9kdWNlcy4KKyAgICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcob3V0cHV0LCAmZXhwZWN0ZWQpKTsKKworICAgIC8vIENvbXBhcmUgYnkgY29tcGFyaW5nIGRlYnVnIHN0cmluZ3MuCisgICAgLy8gVE9ETyhrZW50b24pOiAgVXNlIGRpZmZlcmVuY2VyLCBvbmNlIGl0IGlzIGF2YWlsYWJsZS4KKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuRGVidWdTdHJpbmcoKSwgYWN0dWFsLkRlYnVnU3RyaW5nKCkpOworICB9CisKKyAgLy8gUGFyc2UgdGhlIHRleHQgYW5kIGV4cGVjdCB0aGF0IHRoZSBnaXZlbiBlcnJvcnMgYXJlIHJlcG9ydGVkLgorICB2b2lkIEV4cGVjdEhhc0Vycm9ycyhjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiBleHBlY3RlZF9lcnJvcnMpIHsKKyAgICBFeHBlY3RIYXNFYXJseUV4aXRFcnJvcnModGV4dCwgZXhwZWN0ZWRfZXJyb3JzKTsKKyAgICBFWFBFQ1RfRVEoaW86OlRva2VuaXplcjo6VFlQRV9FTkQsIGlucHV0Xy0+Y3VycmVudCgpLnR5cGUpOworICB9CisKKyAgLy8gU2FtZSBhcyBhYm92ZSBidXQgZG9lcyBub3QgZXhwZWN0IHRoYXQgdGhlIHBhcnNlciBwYXJzZXMgdGhlIGNvbXBsZXRlCisgIC8vIGlucHV0LgorICB2b2lkIEV4cGVjdEhhc0Vhcmx5RXhpdEVycm9ycyhjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiBleHBlY3RlZF9lcnJvcnMpIHsKKyAgICBTZXR1cFBhcnNlcih0ZXh0KTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgcGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmZmlsZSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkX2Vycm9ycywgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisgIH0KKworICAvLyBQYXJzZSB0aGUgdGV4dCBhcyBhIGZpbGUgYW5kIHZhbGlkYXRlIGl0ICh3aXRoIGEgRGVzY3JpcHRvclBvb2wpLCBhbmQKKyAgLy8gZXhwZWN0IHRoYXQgdGhlIHZhbGlkYXRpb24gc3RlcCByZXBvcnRzIHRoZSBnaXZlbiBlcnJvcnMuCisgIHZvaWQgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycyhjb25zdCBjaGFyKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfZXJyb3JzKSB7CisgICAgU2V0dXBQYXJzZXIodGV4dCk7CisgICAgU291cmNlTG9jYXRpb25UYWJsZSBzb3VyY2VfbG9jYXRpb25zOworICAgIHBhcnNlcl8tPlJlY29yZFNvdXJjZUxvY2F0aW9uc1RvKCZzb3VyY2VfbG9jYXRpb25zKTsKKworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBmaWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgICBwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZmaWxlKTsKKyAgICBFWFBFQ1RfRVEoaW86OlRva2VuaXplcjo6VFlQRV9FTkQsIGlucHV0Xy0+Y3VycmVudCgpLnR5cGUpOworICAgIEFTU0VSVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisKKyAgICBNb2NrVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yIHZhbGlkYXRpb25fZXJyb3JfY29sbGVjdG9yKAorICAgICAgc291cmNlX2xvY2F0aW9ucywgJmVycm9yX2NvbGxlY3Rvcl8pOworICAgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoCisgICAgICBmaWxlLCAmdmFsaWRhdGlvbl9lcnJvcl9jb2xsZWN0b3IpID09IE5VTEwpOworICAgIEVYUEVDVF9FUShleHBlY3RlZF9lcnJvcnMsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworICB9CisKKyAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3Rvcl87CisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworCisgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5SW5wdXRTdHJlYW0+IHJhd19pbnB1dF87CisgIHNjb3BlZF9wdHI8aW86OlRva2VuaXplcj4gaW5wdXRfOworICBzY29wZWRfcHRyPFBhcnNlcj4gcGFyc2VyXzsKKyAgYm9vbCByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXzsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVEVTVF9GKFBhcnNlclRlc3QsIFN0b3BBZnRlclN5bnRheElkZW50aWZpZXIpIHsKKyAgU2V0dXBQYXJzZXIoCisgICAgIi8vIGJsYWhcbiIKKyAgICAic3ludGF4ID0gXCJmb29iYXJcIjtcbiIKKyAgICAidGhpcyBsaW5lIHdpbGwgbm90IGJlIHBhcnNlZFxuIik7CisgIHBhcnNlcl8tPlNldFN0b3BBZnRlclN5bnRheElkZW50aWZpZXIodHJ1ZSk7CisgIEVYUEVDVF9UUlVFKHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgTlVMTCkpOworICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworICBFWFBFQ1RfRVEoImZvb2JhciIsIHBhcnNlcl8tPkdldFN5bnRheElkZW50aWZpZXIoKSk7Cit9CisKK1RFU1RfRihQYXJzZXJUZXN0LCBTdG9wQWZ0ZXJPbWl0dGVkU3ludGF4SWRlbnRpZmllcikgeworICBTZXR1cFBhcnNlcigKKyAgICAiLy8gYmxhaFxuIgorICAgICJ0aGlzIGxpbmUgd2lsbCBub3QgYmUgcGFyc2VkXG4iKTsKKyAgcGFyc2VyXy0+U2V0U3RvcEFmdGVyU3ludGF4SWRlbnRpZmllcih0cnVlKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCBOVUxMKSk7CisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CisgIEVYUEVDVF9FUSgiIiwgcGFyc2VyXy0+R2V0U3ludGF4SWRlbnRpZmllcigpKTsKK30KKworVEVTVF9GKFBhcnNlclRlc3QsIFN0b3BBZnRlclN5bnRheElkZW50aWZpZXJXaXRoRXJyb3JzKSB7CisgIFNldHVwUGFyc2VyKAorICAgICIvLyBibGFoXG4iCisgICAgInN5bnRheCA9IGVycm9yO1xuIik7CisgIHBhcnNlcl8tPlNldFN0b3BBZnRlclN5bnRheElkZW50aWZpZXIodHJ1ZSk7CisgIEVYUEVDVF9GQUxTRShwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksIE5VTEwpKTsKKyAgRVhQRUNUX0VRKCIxOjk6IEV4cGVjdGVkIHN5bnRheCBpZGVudGlmaWVyLlxuIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordHlwZWRlZiBQYXJzZXJUZXN0IFBhcnNlTWVzc2FnZVRlc3Q7CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBTaW1wbGVNZXNzYWdlKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxO1xuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSIKKyAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgSW1wbGljaXRTeW50YXhJZGVudGlmaWVyKSB7CisgIHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfID0gZmFsc2U7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxO1xuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSIKKyAgICAifSIpOworICBFWFBFQ1RfRVEoInByb3RvMiIsIHBhcnNlcl8tPkdldFN5bnRheElkZW50aWZpZXIoKSk7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBFeHBsaWNpdFN5bnRheElkZW50aWZpZXIpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIHJlcXVpcmVkIGludDMyIGZvbyA9IDE7XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSB9IgorICAgICJ9Iik7CisgIEVYUEVDVF9FUSgicHJvdG8yIiwgcGFyc2VyXy0+R2V0U3ludGF4SWRlbnRpZmllcigpKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEV4cGxpY2l0UmVxdWlyZWRTeW50YXhJZGVudGlmaWVyKSB7CisgIHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfID0gdHJ1ZTsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIHJlcXVpcmVkIGludDMyIGZvbyA9IDE7XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSB9IgorICAgICJ9Iik7CisgIEVYUEVDVF9FUSgicHJvdG8yIiwgcGFyc2VyXy0+R2V0U3ludGF4SWRlbnRpZmllcigpKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIFNpbXBsZUZpZWxkcykgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgcmVxdWlyZWQgaW50MzIgZm9vID0gMTU7XG4iCisgICAgIiAgb3B0aW9uYWwgaW50MzIgYmFyID0gMzQ7XG4iCisgICAgIiAgcmVwZWF0ZWQgaW50MzIgYmF6ID0gMztcbiIKKyAgICAifVxuIiwKKworICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxNSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImJhclwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MzQgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXpcIiBsYWJlbDpMQUJFTF9SRVBFQVRFRCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjMgIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIFByaW1pdGl2ZUZpZWxkVHlwZXMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIHJlcXVpcmVkIGludDMyICAgIGZvbyA9IDE7XG4iCisgICAgIiAgcmVxdWlyZWQgaW50NjQgICAgZm9vID0gMTtcbiIKKyAgICAiICByZXF1aXJlZCB1aW50MzIgICBmb28gPSAxO1xuIgorICAgICIgIHJlcXVpcmVkIHVpbnQ2NCAgIGZvbyA9IDE7XG4iCisgICAgIiAgcmVxdWlyZWQgc2ludDMyICAgZm9vID0gMTtcbiIKKyAgICAiICByZXF1aXJlZCBzaW50NjQgICBmb28gPSAxO1xuIgorICAgICIgIHJlcXVpcmVkIGZpeGVkMzIgIGZvbyA9IDE7XG4iCisgICAgIiAgcmVxdWlyZWQgZml4ZWQ2NCAgZm9vID0gMTtcbiIKKyAgICAiICByZXF1aXJlZCBzZml4ZWQzMiBmb28gPSAxO1xuIgorICAgICIgIHJlcXVpcmVkIHNmaXhlZDY0IGZvbyA9IDE7XG4iCisgICAgIiAgcmVxdWlyZWQgZmxvYXQgICAgZm9vID0gMTtcbiIKKyAgICAiICByZXF1aXJlZCBkb3VibGUgICBmb28gPSAxO1xuIgorICAgICIgIHJlcXVpcmVkIHN0cmluZyAgIGZvbyA9IDE7XG4iCisgICAgIiAgcmVxdWlyZWQgYnl0ZXMgICAgZm9vID0gMTtcbiIKKyAgICAiICByZXF1aXJlZCBib29sICAgICBmb28gPSAxO1xuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfSU5UMzIgICAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfSU5UNjQgICAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfVUlOVDMyICAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfVUlOVDY0ICAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfU0lOVDMyICAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfU0lOVDY0ICAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfRklYRUQzMiAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfRklYRUQ2NCAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfU0ZJWEVEMzIgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfU0ZJWEVENjQgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfRkxPQVQgICAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfRE9VQkxFICAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfU1RSSU5HICAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfQllURVMgICAgbnVtYmVyOjEgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfQk9PTCAgICAgbnVtYmVyOjEgfSIKKyAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgRmllbGREZWZhdWx0cykgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgcmVxdWlyZWQgaW50MzIgIGZvbyA9IDEgW2RlZmF1bHQ9ICAxICBdO1xuIgorICAgICIgIHJlcXVpcmVkIGludDMyICBmb28gPSAxIFtkZWZhdWx0PSAtMiAgXTtcbiIKKyAgICAiICByZXF1aXJlZCBpbnQ2NCAgZm9vID0gMSBbZGVmYXVsdD0gIDMgIF07XG4iCisgICAgIiAgcmVxdWlyZWQgaW50NjQgIGZvbyA9IDEgW2RlZmF1bHQ9IC00ICBdO1xuIgorICAgICIgIHJlcXVpcmVkIHVpbnQzMiBmb28gPSAxIFtkZWZhdWx0PSAgNSAgXTtcbiIKKyAgICAiICByZXF1aXJlZCB1aW50NjQgZm9vID0gMSBbZGVmYXVsdD0gIDYgIF07XG4iCisgICAgIiAgcmVxdWlyZWQgZmxvYXQgIGZvbyA9IDEgW2RlZmF1bHQ9ICA3LjVdO1xuIgorICAgICIgIHJlcXVpcmVkIGZsb2F0ICBmb28gPSAxIFtkZWZhdWx0PSAtOC41XTtcbiIKKyAgICAiICByZXF1aXJlZCBmbG9hdCAgZm9vID0gMSBbZGVmYXVsdD0gIDkgIF07XG4iCisgICAgIiAgcmVxdWlyZWQgZG91YmxlIGZvbyA9IDEgW2RlZmF1bHQ9IDEwLjVdO1xuIgorICAgICIgIHJlcXVpcmVkIGRvdWJsZSBmb28gPSAxIFtkZWZhdWx0PS0xMS41XTtcbiIKKyAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0gMTIgIF07XG4iCisgICAgIiAgcmVxdWlyZWQgZG91YmxlIGZvbyA9IDEgW2RlZmF1bHQ9IGluZiBdO1xuIgorICAgICIgIHJlcXVpcmVkIGRvdWJsZSBmb28gPSAxIFtkZWZhdWx0PS1pbmYgXTtcbiIKKyAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0gbmFuIF07XG4iCisgICAgIiAgcmVxdWlyZWQgc3RyaW5nIGZvbyA9IDEgW2RlZmF1bHQ9JzEzXFwwMDEnXTtcbiIKKyAgICAiICByZXF1aXJlZCBzdHJpbmcgZm9vID0gMSBbZGVmYXVsdD0nYScgXCJiXCIgXG4gXCJjXCJdO1xuIgorICAgICIgIHJlcXVpcmVkIGJ5dGVzICBmb28gPSAxIFtkZWZhdWx0PScxNFxcMDAyJ107XG4iCisgICAgIiAgcmVxdWlyZWQgYnl0ZXMgIGZvbyA9IDEgW2RlZmF1bHQ9J2EnIFwiYlwiIFxuICdjJ107XG4iCisgICAgIiAgcmVxdWlyZWQgYm9vbCAgIGZvbyA9IDEgW2RlZmF1bHQ9dHJ1ZSBdO1xuIgorICAgICIgIHJlcXVpcmVkIEZvbyAgICBmb28gPSAxIFtkZWZhdWx0PUZPTyAgXTtcbiIKKworICAgICIgIHJlcXVpcmVkIGludDMyICBmb28gPSAxIFtkZWZhdWx0PSAweDdGRkZGRkZGXTtcbiIKKyAgICAiICByZXF1aXJlZCBpbnQzMiAgZm9vID0gMSBbZGVmYXVsdD0tMHg4MDAwMDAwMF07XG4iCisgICAgIiAgcmVxdWlyZWQgdWludDMyIGZvbyA9IDEgW2RlZmF1bHQ9IDB4RkZGRkZGRkZdO1xuIgorICAgICIgIHJlcXVpcmVkIGludDY0ICBmb28gPSAxIFtkZWZhdWx0PSAweDdGRkZGRkZGRkZGRkZGRkZdO1xuIgorICAgICIgIHJlcXVpcmVkIGludDY0ICBmb28gPSAxIFtkZWZhdWx0PS0weDgwMDAwMDAwMDAwMDAwMDBdO1xuIgorICAgICIgIHJlcXVpcmVkIHVpbnQ2NCBmb28gPSAxIFtkZWZhdWx0PSAweEZGRkZGRkZGRkZGRkZGRkZdO1xuIgorICAgICIgIHJlcXVpcmVkIGRvdWJsZSBmb28gPSAxIFtkZWZhdWx0PSAweGFiY2RdO1xuIgorICAgICJ9XG4iLAorCisjZGVmaW5lIEVUQyAibmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIG51bWJlcjoxIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfSU5UMzIgICBkZWZhdWx0X3ZhbHVlOlwiMVwiICAgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQzMiAgIGRlZmF1bHRfdmFsdWU6XCItMlwiICAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDY0ICAgZGVmYXVsdF92YWx1ZTpcIjNcIiAgICAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfSU5UNjQgICBkZWZhdWx0X3ZhbHVlOlwiLTRcIiAgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9VSU5UMzIgIGRlZmF1bHRfdmFsdWU6XCI1XCIgICAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX1VJTlQ2NCAgZGVmYXVsdF92YWx1ZTpcIjZcIiAgICAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRkxPQVQgICBkZWZhdWx0X3ZhbHVlOlwiNy41XCIgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9GTE9BVCAgIGRlZmF1bHRfdmFsdWU6XCItOC41XCIgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0ZMT0FUICAgZGVmYXVsdF92YWx1ZTpcIjlcIiAgICAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiMTAuNVwiICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCItMTEuNVwiICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcIjEyXCIgICAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiaW5mXCIgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCItaW5mXCIgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcIm5hblwiICAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfU1RSSU5HICBkZWZhdWx0X3ZhbHVlOlwiMTNcXDAwMVwiICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9TVFJJTkcgIGRlZmF1bHRfdmFsdWU6XCJhYmNcIiAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0JZVEVTICAgZGVmYXVsdF92YWx1ZTpcIjE0XFxcXDAwMlwiICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfQllURVMgICBkZWZhdWx0X3ZhbHVlOlwiYWJjXCIgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9CT09MICAgIGRlZmF1bHRfdmFsdWU6XCJ0cnVlXCIgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZV9uYW1lOlwiRm9vXCIgZGVmYXVsdF92YWx1ZTpcIkZPT1wiICAgICAgICJFVEMiIH0iCisKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQzMiAgIGRlZmF1bHRfdmFsdWU6XCIyMTQ3NDgzNjQ3XCIgICAgICAgICAgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfSU5UMzIgICBkZWZhdWx0X3ZhbHVlOlwiLTIxNDc0ODM2NDhcIiAgICAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX1VJTlQzMiAgZGVmYXVsdF92YWx1ZTpcIjQyOTQ5NjcyOTVcIiAgICAgICAgICAgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQ2NCAgIGRlZmF1bHRfdmFsdWU6XCI5MjIzMzcyMDM2ODU0Nzc1ODA3XCIgICJFVEMiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfSU5UNjQgICBkZWZhdWx0X3ZhbHVlOlwiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcIiAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX1VJTlQ2NCAgZGVmYXVsdF92YWx1ZTpcIjE4NDQ2NzQ0MDczNzA5NTUxNjE1XCIgIkVUQyIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCI0Mzk4MVwiICAgICAgICAgICAgICAgICJFVEMiIH0iCisgICAgIn0iKTsKKyN1bmRlZiBFVEMKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEZpZWxkT3B0aW9ucykgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDFcbiIKKyAgICAiICAgICAgW2N0eXBlPUNPUkQsIChmb28pPTcsIGZvby4oLmJhci5iYXopLnF1eC5xdXV4Lihjb3JnZSk9LTMzLCBcbiIKKyAgICAiICAgICAgIChxdXV4KT1cInhcMDQweVwiLCAoYmF6LnF1eCk9aGV5XTtcbiIKKyAgICAifVxuIiwKKworICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX1NUUklORyBudW1iZXI6IDEiCisgICAgIiAgICAgICAgICBvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb246IHsgbmFtZSB7IG5hbWVfcGFydDogXCJjdHlwZVwiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcIkNPUkRcIiAgfSIKKyAgICAiICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogNyAgfSIKKyAgICAiICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcIi5iYXIuYmF6XCIiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcInF1eFwiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcInF1dXhcIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJjb3JnZVwiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlX2ludF92YWx1ZTogLTMzIH0iCisgICAgIiAgICAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb246IHsgbmFtZSB7IG5hbWVfcGFydDogXCJxdXV4XCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlOiBcInggeVwiIH0iCisgICAgIiAgICAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb246IHsgbmFtZSB7IG5hbWVfcGFydDogXCJiYXoucXV4XCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJoZXlcIiB9IgorICAgICIgICAgICAgICAgfSIKKyAgICAiICB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBHcm91cCkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgb3B0aW9uYWwgZ3JvdXAgVGVzdEdyb3VwID0gMSB7fTtcbiIKKyAgICAifVxuIiwKKworICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgbmVzdGVkX3R5cGUgeyBuYW1lOiBcIlRlc3RHcm91cFwiIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOlwidGVzdGdyb3VwXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgbnVtYmVyOjEiCisgICAgIiAgICAgICAgICB0eXBlOlRZUEVfR1JPVVAgdHlwZV9uYW1lOiBcIlRlc3RHcm91cFwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIE5lc3RlZE1lc3NhZ2UpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG1lc3NhZ2UgTmVzdGVkIHt9XG4iCisgICAgIiAgb3B0aW9uYWwgTmVzdGVkIHRlc3RfbmVzdGVkID0gMTtcbiIKKyAgICAifVxuIiwKKworICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgbmVzdGVkX3R5cGUgeyBuYW1lOiBcIk5lc3RlZFwiIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOlwidGVzdF9uZXN0ZWRcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCBudW1iZXI6MSIKKyAgICAiICAgICAgICAgIHR5cGVfbmFtZTogXCJOZXN0ZWRcIiB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBOZXN0ZWRFbnVtKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBlbnVtIE5lc3RlZEVudW0ge31cbiIKKyAgICAiICBvcHRpb25hbCBOZXN0ZWRFbnVtIHRlc3RfZW51bSA9IDE7XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgIGVudW1fdHlwZSB7IG5hbWU6IFwiTmVzdGVkRW51bVwiIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOlwidGVzdF9lbnVtXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgbnVtYmVyOjEiCisgICAgIiAgICAgICAgICB0eXBlX25hbWU6IFwiTmVzdGVkRW51bVwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEV4dGVuc2lvblJhbmdlKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBleHRlbnNpb25zIDEwIHRvIDE5O1xuIgorICAgICIgIGV4dGVuc2lvbnMgMzAgdG8gbWF4O1xuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDoxMCBlbmQ6MjAgICAgICAgIH0iCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6MzAgZW5kOjUzNjg3MDkxMiB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBDb21wb3VuZEV4dGVuc2lvblJhbmdlKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBleHRlbnNpb25zIDIsIDE1LCA5IHRvIDExLCAxMDAgdG8gbWF4LCAzO1xuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDoyICAgZW5kOjMgICAgICAgICB9IgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjE1ICBlbmQ6MTYgICAgICAgIH0iCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6OSAgIGVuZDoxMiAgICAgICAgfSIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDoxMDAgZW5kOjUzNjg3MDkxMiB9IgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjMgICBlbmQ6NCAgICAgICAgIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEV4dGVuc2lvbnMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgImV4dGVuZCBFeHRlbmRlZTEgeyBvcHRpb25hbCBpbnQzMiBmb28gPSAxMjsgfVxuIgorICAgICJleHRlbmQgRXh0ZW5kZWUyIHsgcmVwZWF0ZWQgVGVzdE1lc3NhZ2UgYmFyID0gMjI7IH1cbiIsCisKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MTIiCisgICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcIkV4dGVuZGVlMVwiIH0gIgorICAgICJleHRlbnNpb24geyBuYW1lOlwiYmFyXCIgbGFiZWw6TEFCRUxfUkVQRUFURUQgbnVtYmVyOjIyIgorICAgICIgICAgICAgICAgICB0eXBlX25hbWU6XCJUZXN0TWVzc2FnZVwiIGV4dGVuZGVlOiBcIkV4dGVuZGVlMlwiIH0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEV4dGVuc2lvbnNJbk1lc3NhZ2VTY29wZSkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgZXh0ZW5kIEV4dGVuZGVlMSB7IG9wdGlvbmFsIGludDMyIGZvbyA9IDEyOyB9XG4iCisgICAgIiAgZXh0ZW5kIEV4dGVuZGVlMiB7IHJlcGVhdGVkIFRlc3RNZXNzYWdlIGJhciA9IDIyOyB9XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEyIgorICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiBcIkV4dGVuZGVlMVwiIH0iCisgICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTpcImJhclwiIGxhYmVsOkxBQkVMX1JFUEVBVEVEIG51bWJlcjoyMiIKKyAgICAiICAgICAgICAgICAgICB0eXBlX25hbWU6XCJUZXN0TWVzc2FnZVwiIGV4dGVuZGVlOiBcIkV4dGVuZGVlMlwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIE11bHRpcGxlRXh0ZW5zaW9uc09uZUV4dGVuZGVlKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJleHRlbmQgRXh0ZW5kZWUxIHtcbiIKKyAgICAiICBvcHRpb25hbCBpbnQzMiBmb28gPSAxMjtcbiIKKyAgICAiICByZXBlYXRlZCBUZXN0TWVzc2FnZSBiYXIgPSAyMjtcbiIKKyAgICAifVxuIiwKKworICAgICJleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxMiIKKyAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiRXh0ZW5kZWUxXCIgfSAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJiYXJcIiBsYWJlbDpMQUJFTF9SRVBFQVRFRCBudW1iZXI6MjIiCisgICAgIiAgICAgICAgICAgIHR5cGVfbmFtZTpcIlRlc3RNZXNzYWdlXCIgZXh0ZW5kZWU6IFwiRXh0ZW5kZWUxXCIgfSIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3R5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZUVudW1UZXN0OworCitURVNUX0YoUGFyc2VFbnVtVGVzdCwgU2ltcGxlRW51bSkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAiZW51bSBUZXN0RW51bSB7XG4iCisgICAgIiAgRk9PID0gMDtcbiIKKyAgICAifVxuIiwKKworICAgICJlbnVtX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RFbnVtXCIiCisgICAgIiAgdmFsdWUgeyBuYW1lOlwiRk9PXCIgbnVtYmVyOjAgfSIKKyAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VFbnVtVGVzdCwgVmFsdWVzKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJlbnVtIFRlc3RFbnVtIHtcbiIKKyAgICAiICBGT08gPSAxMztcbiIKKyAgICAiICBCQVIgPSAtMTA7XG4iCisgICAgIiAgQkFaID0gNTAwO1xuIgorICAgICJ9XG4iLAorCisgICAgImVudW1fdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdEVudW1cIiIKKyAgICAiICB2YWx1ZSB7IG5hbWU6XCJGT09cIiBudW1iZXI6MTMgfSIKKyAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVJcIiBudW1iZXI6LTEwIH0iCisgICAgIiAgdmFsdWUgeyBuYW1lOlwiQkFaXCIgbnVtYmVyOjUwMCB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZUVudW1UZXN0LCBWYWx1ZU9wdGlvbnMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgImVudW0gVGVzdEVudW0ge1xuIgorICAgICIgIEZPTyA9IDEzO1xuIgorICAgICIgIEJBUiA9IC0xMCBbIChzb21ldGhpbmcudGV4dCkgPSAnYWJjJyBdO1xuIgorICAgICIgIEJBWiA9IDUwMCBbIChzb21ldGhpbmcudGV4dCkgPSAnZGVmJywgb3RoZXIgPSAxIF07XG4iCisgICAgIn1cbiIsCisKKyAgICAiZW51bV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0RW51bVwiIgorICAgICIgIHZhbHVlIHsgbmFtZTogXCJGT09cIiBudW1iZXI6IDEzIH0iCisgICAgIiAgdmFsdWUgeyBuYW1lOiBcIkJBUlwiIG51bWJlcjogLTEwICIKKyAgICAiICAgIG9wdGlvbnMgeyAiCisgICAgIiAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICIgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwic29tZXRoaW5nLnRleHRcIiBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgc3RyaW5nX3ZhbHVlOiBcImFiY1wiICIKKyAgICAiICAgICAgfSAiCisgICAgIiAgICB9ICIKKyAgICAiICB9ICIKKyAgICAiICB2YWx1ZSB7IG5hbWU6IFwiQkFaXCIgbnVtYmVyOiA1MDAgIgorICAgICIgICAgb3B0aW9ucyB7ICIKKyAgICAiICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJzb21ldGhpbmcudGV4dFwiIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICBzdHJpbmdfdmFsdWU6IFwiZGVmXCIgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJvdGhlclwiIGlzX2V4dGVuc2lvbjogZmFsc2UgfSAiCisgICAgIiAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxICIKKyAgICAiICAgICAgfSAiCisgICAgIiAgICB9ICIKKyAgICAiICB9ICIKKyAgICAifSIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3R5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZVNlcnZpY2VUZXN0OworCitURVNUX0YoUGFyc2VTZXJ2aWNlVGVzdCwgU2ltcGxlU2VydmljZSkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAic2VydmljZSBUZXN0U2VydmljZSB7XG4iCisgICAgIiAgcnBjIEZvbyhJbikgcmV0dXJucyAoT3V0KTtcbiIKKyAgICAifVxuIiwKKworICAgICJzZXJ2aWNlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgorICAgICIgIG1ldGhvZCB7IG5hbWU6XCJGb29cIiBpbnB1dF90eXBlOlwiSW5cIiBvdXRwdXRfdHlwZTpcIk91dFwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFBhcnNlU2VydmljZVRlc3QsIE1ldGhvZHMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgInNlcnZpY2UgVGVzdFNlcnZpY2Uge1xuIgorICAgICIgIHJwYyBGb28oSW4xKSByZXR1cm5zIChPdXQxKTtcbiIKKyAgICAiICBycGMgQmFyKEluMikgcmV0dXJucyAoT3V0Mik7XG4iCisgICAgIiAgcnBjIEJheihJbjMpIHJldHVybnMgKE91dDMpO1xuIgorICAgICJ9XG4iLAorCisgICAgInNlcnZpY2UgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RTZXJ2aWNlXCIiCisgICAgIiAgbWV0aG9kIHsgbmFtZTpcIkZvb1wiIGlucHV0X3R5cGU6XCJJbjFcIiBvdXRwdXRfdHlwZTpcIk91dDFcIiB9IgorICAgICIgIG1ldGhvZCB7IG5hbWU6XCJCYXJcIiBpbnB1dF90eXBlOlwiSW4yXCIgb3V0cHV0X3R5cGU6XCJPdXQyXCIgfSIKKyAgICAiICBtZXRob2QgeyBuYW1lOlwiQmF6XCIgaW5wdXRfdHlwZTpcIkluM1wiIG91dHB1dF90eXBlOlwiT3V0M1wiIH0iCisgICAgIn0iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gaW1wb3J0cyBhbmQgcGFja2FnZXMKKwordHlwZWRlZiBQYXJzZXJUZXN0IFBhcnNlTWlzY1Rlc3Q7CisKK1RFU1RfRihQYXJzZU1pc2NUZXN0LCBQYXJzZUltcG9ydCkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAiaW1wb3J0IFwiZm9vL2Jhci9iYXoucHJvdG9cIjtcbiIsCisgICAgImRlcGVuZGVuY3k6IFwiZm9vL2Jhci9iYXoucHJvdG9cIiIpOworfQorCitURVNUX0YoUGFyc2VNaXNjVGVzdCwgUGFyc2VNdWx0aXBsZUltcG9ydHMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKKyAgICAiaW1wb3J0IFwiYmF6LnByb3RvXCI7XG4iLAorICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcImJhei5wcm90b1wiIik7Cit9CisKK1RFU1RfRihQYXJzZU1pc2NUZXN0LCBQYXJzZVBhY2thZ2UpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgInBhY2thZ2UgZm9vLmJhci5iYXo7XG4iLAorICAgICJwYWNrYWdlOiBcImZvby5iYXIuYmF6XCIiKTsKK30KKworVEVTVF9GKFBhcnNlTWlzY1Rlc3QsIFBhcnNlUGFja2FnZVdpdGhTcGFjZXMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgInBhY2thZ2UgZm9vICAgLiAgIGJhci4gIFxuIgorICAgICIgIGJhejtcbiIsCisgICAgInBhY2thZ2U6IFwiZm9vLmJhci5iYXpcIiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBvcHRpb25zCisKK1RFU1RfRihQYXJzZU1pc2NUZXN0LCBQYXJzZUZpbGVPcHRpb25zKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJvcHRpb24gamF2YV9wYWNrYWdlID0gXCJjb20uZ29vZ2xlLmZvb1wiO1xuIgorICAgICJvcHRpb24gb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFOyIsCisKKyAgICAib3B0aW9ucyB7IgorICAgICJ1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiamF2YV9wYWNrYWdlXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlOiBcImNvbS5nb29nbGUuZm9vXCJ9ICIKKyAgICAidW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcIm9wdGltaXplX2ZvclwiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgorICAgICIgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiQ09ERV9TSVpFXCIgfSAiCisgICAgIn0iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRXJyb3IgdGVzdHMKKy8vCisvLyBUaGVyZSBhcmUgYSB2ZXJ5IGxhcmdlIG51bWJlciBvZiBwb3NzaWJsZSBlcnJvcnMgdGhhdCB0aGUgcGFyc2VyIGNvdWxkCisvLyByZXBvcnQsIHNvIGl0J3MgaW5mZWFzaWJsZSB0byB0ZXN0IGV2ZXJ5IHNpbmdsZSBvbmUgb2YgdGhlbS4gIEluc3RlYWQsCisvLyB3ZSB0ZXN0IGVhY2ggdW5pcXVlIGNhbGwgdG8gQWRkRXJyb3IoKSBpbiBwYXJzZXIuaC4gIFRoaXMgZG9lcyBub3QgbWVhbgorLy8gd2UgYXJlIHRlc3RpbmcgZXZlcnkgcG9zc2libGUgZXJyb3IgdGhhdCBQYXJzZXIgY2FuIGdlbmVyYXRlIGJlY2F1c2UKKy8vIGVhY2ggdmFyaWFudCBvZiB0aGUgQ29uc3VtZSgpIGhlbHBlciBvbmx5IGNvdW50cyBhcyBvbmUgdW5pcXVlIGNhbGwgdG8KKy8vIEFkZEVycm9yKCkuCisKK3R5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZUVycm9yVGVzdDsKKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNaXNzaW5nU3ludGF4SWRlbnRpZmllcikgeworICByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyA9IHRydWU7CisgIEV4cGVjdEhhc0Vhcmx5RXhpdEVycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7fSIsCisgICAgIjA6MDogRmlsZSBtdXN0IGJlZ2luIHdpdGggJ3N5bnRheCA9IFwicHJvdG8yXCI7Jy5cbiIpOworICBFWFBFQ1RfRVEoIiIsIHBhcnNlcl8tPkdldFN5bnRheElkZW50aWZpZXIoKSk7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgVW5rbm93blN5bnRheElkZW50aWZpZXIpIHsKKyAgRXhwZWN0SGFzRWFybHlFeGl0RXJyb3JzKAorICAgICJzeW50YXggPSBcIm5vX3N1Y2hfc3ludGF4XCI7IiwKKyAgICAiMDo5OiBVbnJlY29nbml6ZWQgc3ludGF4IGlkZW50aWZpZXIgXCJub19zdWNoX3N5bnRheFwiLiAgVGhpcyBwYXJzZXIgIgorICAgICAgIm9ubHkgcmVjb2duaXplcyBcInByb3RvMlwiLlxuIik7CisgIEVYUEVDVF9FUSgibm9fc3VjaF9zeW50YXgiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIFNpbXBsZVN5bnRheEVycm9yKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSBAIyQgeyBibGFoIH0iLAorICAgICIwOjIwOiBFeHBlY3RlZCBcIntcIi5cbiIpOworICBFWFBFQ1RfRVEoInByb3RvMiIsIHBhcnNlcl8tPkdldFN5bnRheElkZW50aWZpZXIoKSk7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRXhwZWN0ZWRUb3BMZXZlbCkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgImJsYWg7IiwKKyAgICAiMDowOiBFeHBlY3RlZCB0b3AtbGV2ZWwgc3RhdGVtZW50IChlLmcuIFwibWVzc2FnZVwiKS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIFVubWF0Y2hlZENsb3NlQnJhY2UpIHsKKyAgLy8gVGhpcyB1c2VkIHRvIGNhdXNlIGFuIGluZmluaXRlIGxvb3AuICBEb2guCisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAifSIsCisgICAgIjA6MDogRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuXG4iCisgICAgIjA6MDogVW5tYXRjaGVkIFwifVwiLlxuIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1lc3NhZ2UgZXJyb3JzCisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWVzc2FnZU1pc3NpbmdOYW1lKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSB7fSIsCisgICAgIjA6ODogRXhwZWN0ZWQgbWVzc2FnZSBuYW1lLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWVzc2FnZU1pc3NpbmdCb2R5KSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZTsiLAorICAgICIwOjE5OiBFeHBlY3RlZCBcIntcIi5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVvZkluTWVzc2FnZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2UgeyIsCisgICAgIjA6MjE6IFJlYWNoZWQgZW5kIG9mIGlucHV0IGluIG1lc3NhZ2UgZGVmaW5pdGlvbiAobWlzc2luZyAnfScpLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWlzc2luZ0ZpZWxkTnVtYmVyKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vO1xuIgorICAgICJ9XG4iLAorICAgICIxOjIwOiBNaXNzaW5nIGZpZWxkIG51bWJlci5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEV4cGVjdGVkRmllbGROdW1iZXIpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCBpbnQzMiBmb28gPSA7XG4iCisgICAgIn1cbiIsCisgICAgIjE6MjM6IEV4cGVjdGVkIGZpZWxkIG51bWJlci5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEZpZWxkTnVtYmVyT3V0T2ZSYW5nZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIGludDMyIGZvbyA9IDB4MTAwMDAwMDAwO1xuIgorICAgICJ9XG4iLAorICAgICIxOjIzOiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIE1pc3NpbmdMYWJlbCkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIGludDMyIGZvbyA9IDE7XG4iCisgICAgIn1cbiIsCisgICAgIjE6MjogRXhwZWN0ZWQgXCJyZXF1aXJlZFwiLCBcIm9wdGlvbmFsXCIsIG9yIFwicmVwZWF0ZWRcIi5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEV4cGVjdGVkT3B0aW9uTmFtZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIHVpbnQzMiBmb28gPSAxIFtdO1xuIgorICAgICJ9XG4iLAorICAgICIxOjI3OiBFeHBlY3RlZCBpZGVudGlmaWVyLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTm9uRXh0ZW5zaW9uT3B0aW9uTmFtZUJlZ2lubmluZ1dpdGhEb3QpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbLmZvbz0xXTtcbiIKKyAgICAifVxuIiwKKyAgICAiMToyNzogRXhwZWN0ZWQgaWRlbnRpZmllci5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZVR5cGVNaXNtYXRjaCkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIHVpbnQzMiBmb28gPSAxIFtkZWZhdWx0PXRydWVdO1xuIgorICAgICJ9XG4iLAorICAgICIxOjM1OiBFeHBlY3RlZCBpbnRlZ2VyLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRGVmYXVsdFZhbHVlTm90Qm9vbGVhbikgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIGJvb2wgZm9vID0gMSBbZGVmYXVsdD1ibGFoXTtcbiIKKyAgICAifVxuIiwKKyAgICAiMTozMzogRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRGVmYXVsdFZhbHVlTm90U3RyaW5nKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDEgW2RlZmF1bHQ9MV07XG4iCisgICAgIn1cbiIsCisgICAgIjE6MzU6IEV4cGVjdGVkIHN0cmluZy5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZVVuc2lnbmVkTmVnYXRpdmUpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD0tMV07XG4iCisgICAgIn1cbiIsCisgICAgIjE6MzY6IFVuc2lnbmVkIGZpZWxkIGNhbid0IGhhdmUgbmVnYXRpdmUgZGVmYXVsdCB2YWx1ZS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZVRvb0xhcmdlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgb3B0aW9uYWwgaW50MzIgIGZvbyA9IDEgW2RlZmF1bHQ9IDB4ODAwMDAwMDBdO1xuIgorICAgICIgIG9wdGlvbmFsIGludDMyICBmb28gPSAxIFtkZWZhdWx0PS0weDgwMDAwMDAxXTtcbiIKKyAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD0gMHgxMDAwMDAwMDBdO1xuIgorICAgICIgIG9wdGlvbmFsIGludDY0ICBmb28gPSAxIFtkZWZhdWx0PSAweDgwMDAwMDAwMDAwMDAwMDAwXTtcbiIKKyAgICAiICBvcHRpb25hbCBpbnQ2NCAgZm9vID0gMSBbZGVmYXVsdD0tMHg4MDAwMDAwMDAwMDAwMDAwMV07XG4iCisgICAgIiAgb3B0aW9uYWwgdWludDY0IGZvbyA9IDEgW2RlZmF1bHQ9IDB4MTAwMDAwMDAwMDAwMDAwMDAwXTtcbiIKKyAgICAifVxuIiwKKyAgICAiMTozNjogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iCisgICAgIjI6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICIzOjM2OiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIKKyAgICAiNDozNjogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iCisgICAgIjU6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICI2OjM2OiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZU1pc3NpbmcpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD1dO1xuIgorICAgICJ9XG4iLAorICAgICIxOjM1OiBFeHBlY3RlZCBpbnRlZ2VyLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRGVmYXVsdFZhbHVlRm9yR3JvdXApIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCBncm91cCBGb28gPSAxIFtkZWZhdWx0PWJsYWhdIHt9XG4iCisgICAgIn1cbiIsCisgICAgIjE6MzQ6IE1lc3NhZ2VzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEdXBsaWNhdGVEZWZhdWx0VmFsdWUpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD0xLGRlZmF1bHQ9Ml07XG4iCisgICAgIn1cbiIsCisgICAgIjE6Mzc6IEFscmVhZHkgc2V0IG9wdGlvbiBcImRlZmF1bHRcIi5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEdyb3VwTm90Q2FwaXRhbGl6ZWQpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCBncm91cCBmb28gPSAxIHt9XG4iCisgICAgIn1cbiIsCisgICAgIjE6MTc6IEdyb3VwIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgR3JvdXBNaXNzaW5nQm9keSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIGdyb3VwIEZvbyA9IDE7XG4iCisgICAgIn1cbiIsCisgICAgIjE6MjQ6IE1pc3NpbmcgZ3JvdXAgYm9keS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEV4dGVuZGluZ1ByaW1pdGl2ZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgImV4dGVuZCBpbnQzMiB7IG9wdGlvbmFsIHN0cmluZyBmb28gPSA0OyB9XG4iLAorICAgICIwOjc6IEV4cGVjdGVkIG1lc3NhZ2UgdHlwZS5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVycm9ySW5FeHRlbnNpb24pIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIEZvbyB7IGV4dGVuc2lvbnMgMTAwIHRvIDE5OTsgfVxuIgorICAgICJleHRlbmQgRm9vIHsgb3B0aW9uYWwgc3RyaW5nIGZvbzsgfVxuIiwKKyAgICAiMTozMjogTWlzc2luZyBmaWVsZCBudW1iZXIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNdWx0aXBsZVBhcnNlRXJyb3JzKSB7CisgIC8vIFdoZW4gYSBzdGF0ZW1lbnQgaGFzIGEgcGFyc2UgZXJyb3IsIHRoZSBwYXJzZXIgc2hvdWxkIGJlIGFibGUgdG8gY29udGludWUKKyAgLy8gcGFyc2luZyBhdCB0aGUgbmV4dCBzdGF0ZW1lbnQuCisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vO1xuIgorICAgICIgICFpbnZhbGlkIHN0YXRlbWVudCBlbmRpbmcgaW4gYSBibG9jayB7IGJsYWggYmxhaCB7IGJsYWggfSBibGFoIH1cbiIKKyAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAzIHt9XG4iCisgICAgIn1cbiIsCisgICAgIjE6MjA6IE1pc3NpbmcgZmllbGQgbnVtYmVyLlxuIgorICAgICIyOjI6IEV4cGVjdGVkIFwicmVxdWlyZWRcIiwgXCJvcHRpb25hbFwiLCBvciBcInJlcGVhdGVkXCIuXG4iCisgICAgIjI6MjogRXhwZWN0ZWQgdHlwZSBuYW1lLlxuIgorICAgICIzOjI1OiBFeHBlY3RlZCBcIjtcIi5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVvZkluQWdncmVnYXRlVmFsdWUpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICAgIm9wdGlvbiAoZmlsZW9wdCkgPSB7IGk6MTAwXG4iLAorICAgICAgIjE6MDogVW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIHdoaWxlIHBhcnNpbmcgYWdncmVnYXRlIHZhbHVlLlxuIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudW0gZXJyb3JzCisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRW9mSW5FbnVtKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAiZW51bSBUZXN0RW51bSB7IiwKKyAgICAiMDoxNTogUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gZW51bSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFbnVtVmFsdWVNaXNzaW5nTnVtYmVyKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAiZW51bSBUZXN0RW51bSB7XG4iCisgICAgIiAgRk9PO1xuIgorICAgICJ9XG4iLAorICAgICIxOjU6IE1pc3NpbmcgbnVtZXJpYyB2YWx1ZSBmb3IgZW51bSBjb25zdGFudC5cbiIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZXJ2aWNlIGVycm9ycworCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEVvZkluU2VydmljZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgInNlcnZpY2UgVGVzdFNlcnZpY2UgeyIsCisgICAgIjA6MjE6IFJlYWNoZWQgZW5kIG9mIGlucHV0IGluIHNlcnZpY2UgZGVmaW5pdGlvbiAobWlzc2luZyAnfScpLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgU2VydmljZU1ldGhvZFByaW1pdGl2ZVBhcmFtcykgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgInNlcnZpY2UgVGVzdFNlcnZpY2Uge1xuIgorICAgICIgIHJwYyBGb28oaW50MzIpIHJldHVybnMgKHN0cmluZyk7XG4iCisgICAgIn1cbiIsCisgICAgIjE6MTA6IEV4cGVjdGVkIG1lc3NhZ2UgdHlwZS5cbiIKKyAgICAiMToyNjogRXhwZWN0ZWQgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRW9mSW5NZXRob2RPcHRpb25zKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAic2VydmljZSBUZXN0U2VydmljZSB7XG4iCisgICAgIiAgcnBjIEZvbyhCYXIpIHJldHVybnMoQmFyKSB7IiwKKyAgICAiMToyOTogUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gbWV0aG9kIG9wdGlvbnMgKG1pc3NpbmcgJ30nKS5cbiIKKyAgICAiMToyOTogUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gc2VydmljZSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBQcmltaXRpdmVNZXRob2RJbnB1dCkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgInNlcnZpY2UgVGVzdFNlcnZpY2Uge1xuIgorICAgICIgIHJwYyBGb28oaW50MzIpIHJldHVybnMoQmFyKTtcbiIKKyAgICAifVxuIiwKKyAgICAiMToxMDogRXhwZWN0ZWQgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWV0aG9kT3B0aW9uVHlwZUVycm9yKSB7CisgIC8vIFRoaXMgdXNlZCB0byBjYXVzZSBhbiBpbmZpbml0ZSBsb29wLgorICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgQmF6IHt9XG4iCisgICAgInNlcnZpY2UgRm9vIHtcbiIKKyAgICAiICBycGMgQmFyKEJheikgcmV0dXJucyhCYXopIHsgb3B0aW9uIGludmFsaWQgc3ludGF4OyB9XG4iCisgICAgIn1cbiIsCisgICAgIjI6NDU6IEV4cGVjdGVkIFwiPVwiLlxuIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltcG9ydCBhbmQgcGFja2FnZSBlcnJvcnMKKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBJbXBvcnROb3RRdW90ZWQpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJpbXBvcnQgZm9vO1xuIiwKKyAgICAiMDo3OiBFeHBlY3RlZCBhIHN0cmluZyBuYW1pbmcgdGhlIGZpbGUgdG8gaW1wb3J0LlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTXVsdGlwbGVQYWNrYWdlc0luRmlsZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgInBhY2thZ2UgZm9vO1xuIgorICAgICJwYWNrYWdlIGJhcjtcbiIsCisgICAgIjE6MDogTXVsdGlwbGUgcGFja2FnZSBkZWZpbml0aW9ucy5cbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUZXN0IHRoYXQgZXJyb3JzIGRldGVjdGVkIGJ5IERlc2NyaXB0b3JQb29sIGNvcnJlY3RseSByZXBvcnQgbGluZSBhbmQKKy8vIGNvbHVtbiBudW1iZXJzLiAgV2UgaGF2ZSBvbmUgdGVzdCBmb3IgZXZlcnkgY2FsbCB0byBSZWNvcmRMb2NhdGlvbigpIGluCisvLyBwYXJzZXIuY2MuCisKK3R5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0OworCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgUGFja2FnZU5hbWVFcnJvcikgeworICAvLyBDcmVhdGUgYW5vdGhlciBmaWxlIHdoaWNoIGRlZmluZXMgc3ltYm9sICJmb28iLgorICBGaWxlRGVzY3JpcHRvclByb3RvIG90aGVyX2ZpbGU7CisgIG90aGVyX2ZpbGUuc2V0X25hbWUoImJhci5wcm90byIpOworICBvdGhlcl9maWxlLmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoImZvbyIpOworICBFWFBFQ1RfVFJVRShwb29sXy5CdWlsZEZpbGUob3RoZXJfZmlsZSkgIT0gTlVMTCk7CisKKyAgLy8gTm93IHRyeSB0byBkZWZpbmUgaXQgYXMgYSBwYWNrYWdlLgorICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJwYWNrYWdlIGZvby5iYXI7IiwKKyAgICAiMDo4OiBcImZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZCAoYXMgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBwYWNrYWdlKSAiCisgICAgICAiaW4gZmlsZSBcImJhci5wcm90b1wiLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBNZXNzYWdlTmFtZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iLAorICAgICIxOjg6IFwiRm9vXCIgaXMgYWxyZWFkeSBkZWZpbmVkLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZE5hbWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgIiAgb3B0aW9uYWwgaW50MzIgYmFyID0gMTtcbiIKKyAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAyO1xuIgorICAgICJ9XG4iLAorICAgICIyOjE3OiBcImJhclwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBcIkZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZFR5cGVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgIiAgb3B0aW9uYWwgQmF6IGJhciA9IDE7XG4iCisgICAgIn1cbiIsCisgICAgIjE6MTE6IFwiQmF6XCIgaXMgbm90IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkTnVtYmVyRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICIgIG9wdGlvbmFsIGludDMyIGJhciA9IDA7XG4iCisgICAgIn1cbiIsCisgICAgIjE6MjM6IEZpZWxkIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2Vycy5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRFeHRlbmRlZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgImV4dGVuZCBCYXogeyBvcHRpb25hbCBpbnQzMiBiYXIgPSAxOyB9XG4iLAorICAgICIwOjc6IFwiQmF6XCIgaXMgbm90IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkRGVmYXVsdFZhbHVlRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAiZW51bSBCYXogeyBRVVggPSAxOyB9XG4iCisgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAiICBvcHRpb25hbCBCYXogYmFyID0gMSBbZGVmYXVsdD1OT19TVUNIX1ZBTFVFXTtcbiIKKyAgICAifVxuIiwKKyAgICAiMjozMjogRW51bSB0eXBlIFwiQmF6XCIgaGFzIG5vIHZhbHVlIG5hbWVkIFwiTk9fU1VDSF9WQUxVRVwiLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWxlT3B0aW9uTmFtZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgIm9wdGlvbiBmb28gPSA1OyIsCisgICAgIjA6NzogT3B0aW9uIFwiZm9vXCIgdW5rbm93bi5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRmlsZU9wdGlvblZhbHVlRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAib3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gNTsiLAorICAgICIwOjMwOiBWYWx1ZSBtdXN0IGJlIHF1b3RlZCBzdHJpbmcgZm9yIHN0cmluZyBvcHRpb24gIgorICAgICJcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZVwiLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZE9wdGlvbk5hbWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgIiAgb3B0aW9uYWwgYm9vbCBiYXIgPSAxIFtmb289MV07XG4iCisgICAgIn1cbiIsCisgICAgIjE6MjU6IE9wdGlvbiBcImZvb1wiIHVua25vd24uXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkT3B0aW9uVmFsdWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgIiAgb3B0aW9uYWwgaW50MzIgYmFyID0gMSBbY3R5cGU9MV07XG4iCisgICAgIn1cbiIsCisgICAgIjE6MzI6IFZhbHVlIG11c3QgYmUgaWRlbnRpZmllciBmb3IgZW51bS12YWx1ZWQgb3B0aW9uICIKKyAgICAiXCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmN0eXBlXCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEV4dGVuc2lvblJhbmdlTnVtYmVyRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICIgIGV4dGVuc2lvbnMgMDtcbiIKKyAgICAifVxuIiwKKyAgICAiMToxMzogRXh0ZW5zaW9uIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2Vycy5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bU5hbWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJlbnVtIEZvbyB7QSA9IDE7fVxuIgorICAgICJlbnVtIEZvbyB7QiA9IDE7fVxuIiwKKyAgICAiMTo1OiBcIkZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bVZhbHVlTmFtZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgImVudW0gRm9vIHtcbiIKKyAgICAiICBCQVIgPSAxO1xuIgorICAgICIgIEJBUiA9IDE7XG4iCisgICAgIn1cbiIsCisgICAgIjI6MjogXCJCQVJcIiBpcyBhbHJlYWR5IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIFNlcnZpY2VOYW1lRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAic2VydmljZSBGb28ge31cbiIKKyAgICAic2VydmljZSBGb28ge31cbiIsCisgICAgIjE6ODogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIE1ldGhvZE5hbWVFcnJvcikgeworICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAorICAgICJtZXNzYWdlIEJheiB7fVxuIgorICAgICJzZXJ2aWNlIEZvbyB7XG4iCisgICAgIiAgcnBjIEJhcihCYXopIHJldHVybnMoQmF6KTtcbiIKKyAgICAiICBycGMgQmFyKEJheikgcmV0dXJucyhCYXopO1xuIgorICAgICJ9XG4iLAorICAgICIzOjY6IFwiQmFyXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIFwiRm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIE1ldGhvZElucHV0VHlwZUVycm9yKSB7CisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgIm1lc3NhZ2UgQmF6IHt9XG4iCisgICAgInNlcnZpY2UgRm9vIHtcbiIKKyAgICAiICBycGMgQmFyKFF1eCkgcmV0dXJucyhCYXopO1xuIgorICAgICJ9XG4iLAorICAgICIyOjEwOiBcIlF1eFwiIGlzIG5vdCBkZWZpbmVkLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBNZXRob2RPdXRwdXRUeXBlRXJyb3IpIHsKKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAibWVzc2FnZSBCYXoge31cbiIKKyAgICAic2VydmljZSBGb28ge1xuIgorICAgICIgIHJwYyBCYXIoQmF6KSByZXR1cm5zKFF1eCk7XG4iCisgICAgIn1cbiIsCisgICAgIjI6MjM6IFwiUXV4XCIgaXMgbm90IGRlZmluZWQuXG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGVzdCB0aGF0IHRoZSBvdXRwdXQgZnJvbSBGaWxlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSAoYW5kIGFsbCBvdGhlcgorLy8gZGVzY3JpcHRvciB0eXBlcykgaXMgcGFyc2VhYmxlLCBhbmQgcmVzdWx0cyBpbiB0aGUgc2FtZSBEZXNjcmlwdG9yCisvLyBkZWZpbml0aW9ucyBhZ2FpbiBhZm90ZXIgcGFyc2luZyAobm90LCBob3dldmVyLCB0aGF0IHRoZSBvcmRlciBvZiBtZXNzYWdlcworLy8gY2Fubm90IGJlIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUpCisKK3R5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZURlY3JpcHRvckRlYnVnVGVzdDsKKworY2xhc3MgQ29tcGFyZURlc2NyaXB0b3JOYW1lcyB7CisgcHVibGljOgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgRGVzY3JpcHRvclByb3RvKiBsZWZ0LCBjb25zdCBEZXNjcmlwdG9yUHJvdG8qIHJpZ2h0KSB7CisgICAgcmV0dXJuIGxlZnQtPm5hbWUoKSA8IHJpZ2h0LT5uYW1lKCk7CisgIH0KK307CisKKy8vIFNvcnRzIG5lc3RlZCBEZXNjcmlwdG9yUHJvdG9zIG9mIGEgRGVzY3JpcHRvUHJvdG8sIGJ5IG5hbWUuCit2b2lkIFNvcnRNZXNzYWdlcyhEZXNjcmlwdG9yUHJvdG8gKmRlc2NyaXB0b3JfcHJvdG8pIHsKKyAgaW50IHNpemUgPSBkZXNjcmlwdG9yX3Byb3RvLT5uZXN0ZWRfdHlwZV9zaXplKCk7CisgIC8vIHJlY3Vyc2l2ZWx5IHNvcnQ7IHdlIGNhbid0IGd1YXJhbnRlZSB0aGUgb3JkZXIgb2YgbmVzdGVkIG1lc3NhZ2VzIGVpdGhlcgorICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgIFNvcnRNZXNzYWdlcyhkZXNjcmlwdG9yX3Byb3RvLT5tdXRhYmxlX25lc3RlZF90eXBlKGkpKTsKKyAgfQorICBEZXNjcmlwdG9yUHJvdG8gKipkYXRhID0KKyAgICBkZXNjcmlwdG9yX3Byb3RvLT5tdXRhYmxlX25lc3RlZF90eXBlKCktPm11dGFibGVfZGF0YSgpOworICBzb3J0KGRhdGEsIGRhdGEgKyBzaXplLCBDb21wYXJlRGVzY3JpcHRvck5hbWVzKCkpOworfQorCisvLyBTb3J0cyBEZXNjcmlwdG9yUHJvdG9zIGJlbG9uZ2luZyB0byBhIEZpbGVEZXNjcmlwdG9yUHJvdG8sIGJ5IG5hbWUuCit2b2lkIFNvcnRNZXNzYWdlcyhGaWxlRGVzY3JpcHRvclByb3RvICpmaWxlX2Rlc2NyaXB0b3JfcHJvdG8pIHsKKyAgaW50IHNpemUgPSBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPm1lc3NhZ2VfdHlwZV9zaXplKCk7CisgIC8vIHJlY3Vyc2l2ZWx5IHNvcnQ7IHdlIGNhbid0IGd1YXJhbnRlZSB0aGUgb3JkZXIgb2YgbmVzdGVkIG1lc3NhZ2VzIGVpdGhlcgorICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgIFNvcnRNZXNzYWdlcyhmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPm11dGFibGVfbWVzc2FnZV90eXBlKGkpKTsKKyAgfQorICBEZXNjcmlwdG9yUHJvdG8gKipkYXRhID0KKyAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8tPm11dGFibGVfbWVzc2FnZV90eXBlKCktPm11dGFibGVfZGF0YSgpOworICBzb3J0KGRhdGEsIGRhdGEgKyBzaXplLCBDb21wYXJlRGVzY3JpcHRvck5hbWVzKCkpOworfQorCitURVNUX0YoUGFyc2VEZWNyaXB0b3JEZWJ1Z1Rlc3QsIFRlc3RBbGxEZXNjcmlwdG9yVHlwZXMpIHsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIG9yaWdpbmFsX2ZpbGUgPQorICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPmZpbGUoKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBleHBlY3RlZDsKKyAgb3JpZ2luYWxfZmlsZS0+Q29weVRvKCZleHBlY3RlZCk7CisKKyAgLy8gR2V0IHRoZSBEZWJ1Z1N0cmluZyBvZiB0aGUgdW5pdHRlc3QucHJvdG8gRmlsZURlY3JpcHRvciwgd2hpY2ggaW5jbHVkZXMKKyAgLy8gYWxsIG90aGVyIGRlc2NyaXB0b3IgdHlwZXMKKyAgc3RyaW5nIGRlYnVnX3N0cmluZyA9IG9yaWdpbmFsX2ZpbGUtPkRlYnVnU3RyaW5nKCk7CisKKyAgLy8gUGFyc2UgdGhlIGRlYnVnIHN0cmluZworICBTZXR1cFBhcnNlcihkZWJ1Z19zdHJpbmcuY19zdHIoKSk7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcGFyc2VkOworICBwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZwYXJzZWQpOworICBFWFBFQ1RfRVEoaW86OlRva2VuaXplcjo6VFlQRV9FTkQsIGlucHV0Xy0+Y3VycmVudCgpLnR5cGUpOworICBBU1NFUlRfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworCisgIC8vIFdlIG5vdyBoYXZlIGEgRmlsZURlc2NyaXB0b3JQcm90bywgYnV0IHRvIGNvbXBhcmUgd2l0aCB0aGUgZXhwZWN0ZWQgd2UKKyAgLy8gbmVlZCB0byBsaW5rIHRvIGEgRmlsZURlY3JpcHRvciwgdGhlbiBvdXRwdXQgYmFjayB0byBhIHByb3RvLiBXZSdsbAorICAvLyBhbHNvIG5lZWQgdG8gZ2l2ZSBpdCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBvcmlnaW5hbC4KKyAgcGFyc2VkLnNldF9uYW1lKCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iKTsKKyAgLy8gV2UgbmVlZCB0aGUgaW1wb3J0ZWQgZGVwZW5kZW5jeSBiZWZvcmUgd2UgY2FuIGJ1aWxkIG91ciBwYXJzZWQgcHJvdG8KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGltcG9ydCA9CisgICAgICAgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZXNjcmlwdG9yKCktPmZpbGUoKTsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBpbXBvcnRfcHJvdG87CisgIGltcG9ydC0+Q29weVRvKCZpbXBvcnRfcHJvdG8pOworICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUoaW1wb3J0X3Byb3RvKSAhPSBOVUxMKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGFjdHVhbCA9IHBvb2xfLkJ1aWxkRmlsZShwYXJzZWQpOworICBwYXJzZWQuQ2xlYXIoKTsKKyAgYWN0dWFsLT5Db3B5VG8oJnBhcnNlZCk7CisgIEFTU0VSVF9UUlVFKGFjdHVhbCAhPSBOVUxMKTsKKworICAvLyBUaGUgbWVzc2FnZXMgbWlnaHQgYmUgaW4gZGlmZmVyZW50IG9yZGVycywgbWFraW5nIHRoZW0gaGFyZCB0byBjb21wYXJlLgorICAvLyBTbywgc29ydCB0aGUgbWVzc2FnZXMgaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9zIChpbmNsdWRpbmcgbmVzdGVkIG1lc3NhZ2VzLAorICAvLyByZWN1cnNpdmVseSkuCisgIFNvcnRNZXNzYWdlcygmZXhwZWN0ZWQpOworICBTb3J0TWVzc2FnZXMoJnBhcnNlZCk7CisKKyAgLy8gSSByZWFsbHkgd2FudGVkIHRvIHVzZSBTdHJpbmdEaWZmIGhlcmUgZm9yIHRoZSBkZWJ1ZyBvdXRwdXQgb24gZmFpbCwKKyAgLy8gYnV0IHRoZSBzdHJpbmdzIGFyZSB0b28gbG9uZyBmb3IgaXQsIGFuZCBpZiBJIGluY3JlYXNlIGl0cyBtYXggc2l6ZSwKKyAgLy8gd2UgZ2V0IGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSA6KAorICBFWFBFQ1RfRVEoZXhwZWN0ZWQuRGVidWdTdHJpbmcoKSwgcGFyc2VkLkRlYnVnU3RyaW5nKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTb3VyY2VDb2RlSW5mbyB0ZXN0cy4KKworLy8gRm9sbG93cyBhIHBhdGggLS0gYXMgZGVmaW5lZCBieSBTb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoIC0tIGZyb20gYQorLy8gbWVzc2FnZSB0byBhIHBhcnRpY3VsYXIgc3ViLWZpZWxkLgorLy8gKiBJZiB0aGUgdGFyZ2V0IGlzIGl0c2VsZiBhIG1lc3NhZ2UsIHNldHMgKm91dHB1dF9tZXNzYWdlIHRvIHBvaW50IGF0IGl0LAorLy8gICAqb3V0cHV0X2ZpZWxkIHRvIE5VTEwsIGFuZCAqb3V0cHV0X2luZGV4IHRvIC0xLgorLy8gKiBPdGhlcndpc2UsIGlmIHRoZSB0YXJnZXQgaXMgYW4gZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLCBzZXRzCisvLyAgICpvdXRwdXRfbWVzc2FnZSB0byB0aGUgY29udGFpbmluZyBtZXNzYWdlLCAqb3V0cHV0X2ZpZWxkIHRvIHRoZSBkZXNjcmlwdG9yCisvLyAgIG9mIHRoZSBmaWVsZCwgYW5kICpvdXRwdXRfaW5kZXggdG8gdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LgorLy8gKiBPdGhlcndpc2UsIHRoZSB0YXJnZXQgaXMgYSBmaWVsZCAocG9zc2libHkgYSByZXBlYXRlZCBmaWVsZCwgYnV0IG5vdCBhbnkKKy8vICAgb25lIGVsZW1lbnQpLiAgU2V0cyAqb3V0cHV0X21lc3NhZ2UgdG8gdGhlIGNvbnRhaW5pbmcgbWVzc2FnZSwKKy8vICAgKm91dHB1dF9maWVsZCB0byB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQsIGFuZCAqb3V0cHV0X2luZGV4IHRvIC0xLgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIHdhcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLiAgQSBnVGVzdCBmYWlsdXJlIGlzCisvLyByZWNvcmRlZCBiZWZvcmUgcmV0dXJuaW5nIGZhbHNlLgorYm9vbCBGb2xsb3dQYXRoKGNvbnN0IE1lc3NhZ2UmIHJvb3QsCisgICAgICAgICAgICAgICAgY29uc3QgaW50KiBwYXRoX2JlZ2luLCBjb25zdCBpbnQqIHBhdGhfZW5kLAorICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqKiBvdXRwdXRfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKiBvdXRwdXRfZmllbGQsCisgICAgICAgICAgICAgICAgaW50KiBvdXRwdXRfaW5kZXgpIHsKKyAgaWYgKHBhdGhfYmVnaW4gPT0gcGF0aF9lbmQpIHsKKyAgICAvLyBQYXRoIHJlZmVycyB0byB0aGlzIHdob2xlIG1lc3NhZ2UuCisgICAgKm91dHB1dF9tZXNzYWdlID0gJnJvb3Q7CisgICAgKm91dHB1dF9maWVsZCA9IE5VTEw7CisgICAgKm91dHB1dF9pbmRleCA9IC0xOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHJvb3QuR2V0RGVzY3JpcHRvcigpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gcm9vdC5HZXRSZWZsZWN0aW9uKCk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TnVtYmVyKCpwYXRoX2JlZ2luKTsKKworICBpZiAoZmllbGQgPT0gTlVMTCkgeworICAgIEFERF9GQUlMVVJFKCkgPDwgZGVzY3JpcHRvci0+bmFtZSgpIDw8ICIgaGFzIG5vIGZpZWxkIG51bWJlcjogIgorICAgICAgICAgICAgICAgICAgPDwgKnBhdGhfYmVnaW47CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKytwYXRoX2JlZ2luOworCisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIGlmIChwYXRoX2JlZ2luID09IHBhdGhfZW5kKSB7CisgICAgICAvLyBQYXRoIHJlZmVycyB0byB0aGUgd2hvbGUgcmVwZWF0ZWQgZmllbGQuCisgICAgICAqb3V0cHV0X21lc3NhZ2UgPSAmcm9vdDsKKyAgICAgICpvdXRwdXRfZmllbGQgPSBmaWVsZDsKKyAgICAgICpvdXRwdXRfaW5kZXggPSAtMTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGludCBpbmRleCA9ICpwYXRoX2JlZ2luKys7CisgICAgaW50IHNpemUgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUocm9vdCwgZmllbGQpOworCisgICAgaWYgKGluZGV4ID49IHNpemUpIHsKKyAgICAgIEFERF9GQUlMVVJFKCkgPDwgZGVzY3JpcHRvci0+bmFtZSgpIDw8ICIuIiA8PCBmaWVsZC0+bmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgaGFzIHNpemUgIiA8PCBzaXplIDw8ICIsIGJ1dCBwYXRoIGNvbnRhaW5lZCBpbmRleDogIgorICAgICAgICAgICAgICAgICAgICA8PCBpbmRleDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIC8vIERlc2NlbmQgaW50byBjaGlsZCBtZXNzYWdlLgorICAgICAgY29uc3QgTWVzc2FnZSYgY2hpbGQgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2Uocm9vdCwgZmllbGQsIGluZGV4KTsKKyAgICAgIHJldHVybiBGb2xsb3dQYXRoKGNoaWxkLCBwYXRoX2JlZ2luLCBwYXRoX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9tZXNzYWdlLCBvdXRwdXRfZmllbGQsIG91dHB1dF9pbmRleCk7CisgICAgfSBlbHNlIGlmIChwYXRoX2JlZ2luID09IHBhdGhfZW5kKSB7CisgICAgICAvLyBQYXRoIHJlZmVycyB0byB0aGlzIGVsZW1lbnQuCisgICAgICAqb3V0cHV0X21lc3NhZ2UgPSAmcm9vdDsKKyAgICAgICpvdXRwdXRfZmllbGQgPSBmaWVsZDsKKyAgICAgICpvdXRwdXRfaW5kZXggPSBpbmRleDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8IGRlc2NyaXB0b3ItPm5hbWUoKSA8PCAiLiIgPDwgZmllbGQtPm5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIGlzIG5vdCBhIG1lc3NhZ2U7IGNhbm5vdCBkZXNjZW5kIGludG8gaXQuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBjb25zdCBNZXNzYWdlJiBjaGlsZCA9IHJlZmxlY3Rpb24tPkdldE1lc3NhZ2Uocm9vdCwgZmllbGQpOworICAgICAgcmV0dXJuIEZvbGxvd1BhdGgoY2hpbGQsIHBhdGhfYmVnaW4sIHBhdGhfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X21lc3NhZ2UsIG91dHB1dF9maWVsZCwgb3V0cHV0X2luZGV4KTsKKyAgICB9IGVsc2UgaWYgKHBhdGhfYmVnaW4gPT0gcGF0aF9lbmQpIHsKKyAgICAgIC8vIFBhdGggcmVmZXJzIHRvIHRoaXMgZmllbGQuCisgICAgICAqb3V0cHV0X21lc3NhZ2UgPSAmcm9vdDsKKyAgICAgICpvdXRwdXRfZmllbGQgPSBmaWVsZDsKKyAgICAgICpvdXRwdXRfaW5kZXggPSAtMTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBBRERfRkFJTFVSRSgpIDw8IGRlc2NyaXB0b3ItPm5hbWUoKSA8PCAiLiIgPDwgZmllbGQtPm5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIGlzIG5vdCBhIG1lc3NhZ2U7IGNhbm5vdCBkZXNjZW5kIGludG8gaXQuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KKworLy8gU3BsaXQgc29tZSB0ZXh0IG9uIGxpbmUgYnJlYWtzLiAgVGhlIGxpbmUgYnJlYWtzIGFyZSByZXRhaW5lZCBpbiB0aGUgb3V0cHV0LAorLy8gc28gZWFjaCBsaW5lIChleGNlcHQgdGhlIGxhc3QpIGVuZHMgd2l0aCBhICdcbicsIGFuZCB0aGUgbGluZXMgY2FuIGJlCisvLyBjb25jYXRlbmF0ZWQgdG8gcHJvZHVjZSB0aGUgb3JpZ2luYWwgdGV4dC4KKy8vCisvLyBJIGNvdWxkbid0IGZpbmQgdGhlIHByb3BlciBzdHJpbmcgdXRpbGl0eSBmdW5jdGlvbiBmb3IgdGhpcy4gIE91cgorLy8gc3BsaXQtb24tZGVsaW1pdGVyIGZ1bmN0aW9ucyBkb24ndCBpbmNsdWRlIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIG91dHB1dC4KK3ZvaWQgU3BsaXRMaW5lcyhjb25zdCBzdHJpbmcmIHRleHQsIHZlY3RvcjxzdHJpbmc+KiBsaW5lcykgeworICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworCisgIHdoaWxlIChwb3MgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9wb3MgPSBwb3M7CisgICAgcG9zID0gdGV4dC5maW5kX2ZpcnN0X29mKCdcbicsIHBvcyk7CisgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpICsrcG9zOworICAgIGxpbmVzLT5wdXNoX2JhY2sodGV4dC5zdWJzdHIobGFzdF9wb3MsIHBvcyAtIGxhc3RfcG9zKSk7CisgIH0KK30KKworLy8gTG9vayBmb3IgdGhlIGdpdmVuIHRhZ3MgaW4gdGhlIGdpdmVuIHRleHQgYW5kIGNvbnN0cnVjdCBhIHNwYW4gKGFzIGRlZmluZWQKKy8vIGJ5IFNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnNwYW4pIGZyb20gdGhlbS4gIEUuZy4gZm9yIHRleHQgbGlrZToKKy8vICAgLyphKi9tZXNzYWdlIC8qYiovRm9vLypjKi8ge30vKmQqLworLy8gVGhlcmUgYXJlIGZvdXIgdGFnczogICJhIiwgImIiLCAiYyIsIGFuZCAiZCIuICBUaGUgY29uc3RydWN0ZWQgc3BhbiBzdGFydHMKKy8vIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzdGFydCB0YWcncyB0cmFpbGluZyAnLycgYW5kIGVuZHMgaW1tZWRpYXRlbHkgYmVmb3JlCisvLyB0aGUgZW5kIHRhZ3MgbGVhZGluZyAnLycuCit2b2lkIE1ha2VFeHBlY3RlZFNwYW4oY29uc3QgdmVjdG9yPHN0cmluZz4mIGxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3RhcnRfdGFnLCBjb25zdCBzdHJpbmcmIGVuZF90YWcsCisgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+KiBvdXRwdXQpIHsKKyAgc3RyaW5nIHN0YXJ0X2NvbW1lbnQgPSAiLyoiICsgc3RhcnRfdGFnICsgIiovIjsKKyAgc3RyaW5nIGVuZF9jb21tZW50ID0gIi8qIiArIGVuZF90YWcgKyAiKi8iOworCisgIGludCBzdGFydF9saW5lID0gLTE7CisgIGludCBzdGFydF9jb2x1bW4gPSAtMTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7IGkrKykgeworICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGxpbmVzW2ldLmZpbmQoc3RhcnRfY29tbWVudCk7CisgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHN0YXJ0X2xpbmUgPSBpOworICAgICAgc3RhcnRfY29sdW1uID0gcG9zICsgc3RhcnRfY29tbWVudC5zaXplKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgQVNTRVJUX05FKHN0YXJ0X2xpbmUsIC0xKQorICAgICAgPDwgIlRhZyBcIiIgPDwgc3RhcnRfY29tbWVudCA8PCAiXCIgbm90IGZvdW5kIGluIHRleHQuIjsKKworICBpbnQgZW5kX2xpbmUgPSAtMTsKKyAgaW50IGVuZF9jb2x1bW4gPSAtMTsKKyAgZm9yIChpbnQgaSA9IHN0YXJ0X2xpbmU7IGkgPCBsaW5lcy5zaXplKCk7IGkrKykgeworICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGxpbmVzW2ldLmZpbmQoZW5kX2NvbW1lbnQpOworICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBlbmRfbGluZSA9IGk7CisgICAgICBlbmRfY29sdW1uID0gcG9zOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIEFTU0VSVF9ORShlbmRfbGluZSwgLTEpCisgICAgICA8PCAiVGFnIFwiIiA8PCBlbmRfY29tbWVudCA8PCAiXCIgbm90IGZvdW5kIGluIHRleHQuIjsKKworICBvdXRwdXQtPkFkZChzdGFydF9saW5lKTsKKyAgb3V0cHV0LT5BZGQoc3RhcnRfY29sdW1uKTsKKyAgaWYgKGVuZF9saW5lICE9IHN0YXJ0X2xpbmUpIG91dHB1dC0+QWRkKGVuZF9saW5lKTsKKyAgb3V0cHV0LT5BZGQoZW5kX2NvbHVtbik7Cit9CisKKy8vIENoZWNrIGlmIHR3byBzcGFucyBhcmUgZXF1YWwuCitib29sIENvbXBhcmVTcGFucyhjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIHNwYW4xLAorICAgICAgICAgICAgICAgICAgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ+JiBzcGFuMikgeworICBpZiAoc3BhbjEuc2l6ZSgpICE9IHNwYW4yLnNpemUoKSkgcmV0dXJuIGZhbHNlOworICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW4xLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHNwYW4xLkdldChpKSAhPSBzcGFuMi5HZXQoaSkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVGVzdCBmaXh0dXJlIGZvciBzb3VyY2UgaW5mbyB0ZXN0cywgd2hpY2ggY2hlY2sgdGhhdCBzb3VyY2UgbG9jYXRpb25zIGFyZQorLy8gcmVjb3JkZWQgY29ycmVjdGx5IGluIEZpbGVEZXNjcmlwdG9yUHJvdG8uc291cmNlX2NvZGVfaW5mby5sb2NhdGlvbi4KK2NsYXNzIFNvdXJjZUluZm9UZXN0IDogcHVibGljIFBhcnNlclRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gVGhlIHBhcnNlZCBmaWxlIChpbml0aWFsaXplZCBieSBQYXJzZSgpKS4KKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlXzsKKworICAvLyBQYXJzZSB0aGUgZ2l2ZW4gdGV4dCBhcyBhIC5wcm90byBmaWxlIGFuZCBwb3B1bGF0ZSB0aGUgc3BhbnNfIG1hcCB3aXRoCisgIC8vIGFsbCB0aGUgc291cmNlIGxvY2F0aW9uIHNwYW5zIGluIGl0cyBTb3VyY2VDb2RlSW5mbyB0YWJsZS4KKyAgYm9vbCBQYXJzZShjb25zdCBjaGFyKiB0ZXh0KSB7CisgICAgU2V0dXBQYXJzZXIodGV4dCk7CisgICAgU3BsaXRMaW5lcyh0ZXh0LCAmbGluZXNfKTsKKyAgICBpZiAoIXBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJmZpbGVfKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBzb3VyY2VfaW5mbyA9IGZpbGVfLnNvdXJjZV9jb2RlX2luZm8oKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZV9pbmZvLmxvY2F0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgICBjb25zdCBTb3VyY2VDb2RlSW5mbzo6TG9jYXRpb24mIGxvY2F0aW9uID0gc291cmNlX2luZm8ubG9jYXRpb24oaSk7CisgICAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yX3Byb3RvID0gTlVMTDsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBOVUxMOworICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgIGlmICghRm9sbG93UGF0aChmaWxlXywgbG9jYXRpb24ucGF0aCgpLmJlZ2luKCksIGxvY2F0aW9uLnBhdGgoKS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvcl9wcm90bywgJmZpZWxkLCAmaW5kZXgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgc3BhbnNfLmluc2VydChtYWtlX3BhaXIoU3BhbktleSgqZGVzY3JpcHRvcl9wcm90bywgZmllbGQsIGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2NhdGlvbikpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIEVYUEVDVF9UUlVFKHNwYW5zXy5lbXB0eSgpKQorICAgICAgICA8PCAiRm9yZ290IHRvIGNhbGwgSGFzU3BhbigpIGZvcjpcbiIKKyAgICAgICAgPDwgc3BhbnNfLmJlZ2luKCktPnNlY29uZC0+RGVidWdTdHJpbmcoKTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEhhc1NwYW4oKSBjaGVja3MgdGhhdCB0aGUgc3BhbiBvZiBzb3VyY2UgY29kZSBkZWxpbWl0ZWQgYnkgdGhlIGdpdmVuCisgIC8vIHRhZ3MgKGNvbW1lbnRzKSBjb3JyZXNwb25kIHZpYSB0aGUgU291cmNlQ29kZUluZm8gdGFibGUgdG8gdGhlIGdpdmVuCisgIC8vIHBhcnQgb2YgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uICAoSWYgdW5jbGVhciwgbG9vayBhdCB0aGUgYWN0dWFsIHRlc3RzOworICAvLyBpdCBzaG91bGQgcXVpY2tseSBiZWNvbWUgb2J2aW91cy4pCisKKyAgYm9vbCBIYXNTcGFuKGNvbnN0IGNoYXIqIHN0YXJ0X3RhZywgY29uc3QgY2hhciogZW5kX3RhZywKKyAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8pIHsKKyAgICByZXR1cm4gSGFzU3BhbihzdGFydF90YWcsIGVuZF90YWcsIGRlc2NyaXB0b3JfcHJvdG8sIE5VTEwsIC0xKTsKKyAgfQorCisgIGJvb2wgSGFzU3Bhbihjb25zdCBjaGFyKiBzdGFydF90YWcsIGNvbnN0IGNoYXIqIGVuZF90YWcsCisgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLCBjb25zdCBzdHJpbmcmIGZpZWxkX25hbWUpIHsKKyAgICByZXR1cm4gSGFzU3BhbihzdGFydF90YWcsIGVuZF90YWcsIGRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkX25hbWUsIC0xKTsKKyAgfQorCisgIGJvb2wgSGFzU3Bhbihjb25zdCBjaGFyKiBzdGFydF90YWcsIGNvbnN0IGNoYXIqIGVuZF90YWcsCisgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLCBjb25zdCBzdHJpbmcmIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICAgICAgZGVzY3JpcHRvcl9wcm90by5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZShmaWVsZF9uYW1lKTsKKyAgICBpZiAoZmllbGQgPT0gTlVMTCkgeworICAgICAgQUREX0ZBSUxVUkUoKSA8PCBkZXNjcmlwdG9yX3Byb3RvLkdldERlc2NyaXB0b3IoKS0+bmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgaGFzIG5vIHN1Y2ggZmllbGQ6ICIgPDwgZmllbGRfbmFtZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gSGFzU3BhbihzdGFydF90YWcsIGVuZF90YWcsIGRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkLCBpbmRleCk7CisgIH0KKworICBib29sIEhhc1NwYW4oY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bykgeworICAgIHJldHVybiBIYXNTcGFuKE5VTEwsIE5VTEwsIGRlc2NyaXB0b3JfcHJvdG8sIE5VTEwsIC0xKTsKKyAgfQorCisgIGJvb2wgSGFzU3Bhbihjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLCBjb25zdCBzdHJpbmcmIGZpZWxkX25hbWUpIHsKKyAgICByZXR1cm4gSGFzU3BhbihOVUxMLCBOVUxMLCBkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZF9uYW1lLCAtMSk7CisgIH0KKworICBib29sIEhhc1NwYW4oY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bywgY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CisgICAgcmV0dXJuIEhhc1NwYW4oTlVMTCwgTlVMTCwgZGVzY3JpcHRvcl9wcm90bywgZmllbGRfbmFtZSwgaW5kZXgpOworICB9CisKKyAgYm9vbCBIYXNTcGFuKGNvbnN0IGNoYXIqIHN0YXJ0X3RhZywgY29uc3QgY2hhciogZW5kX3RhZywKKyAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8sIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgICBwYWlyPFNwYW5NYXA6Oml0ZXJhdG9yLCBTcGFuTWFwOjppdGVyYXRvcj4gcmFuZ2UgPQorICAgICAgICBzcGFuc18uZXF1YWxfcmFuZ2UoU3BhbktleShkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZCwgaW5kZXgpKTsKKworICAgIGlmIChzdGFydF90YWcgPT0gTlVMTCkgeworICAgICAgaWYgKHJhbmdlLmZpcnN0ID09IHJhbmdlLnNlY29uZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcGFuc18uZXJhc2UocmFuZ2UuZmlyc3QpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGV4cGVjdGVkX3NwYW47CisgICAgICBNYWtlRXhwZWN0ZWRTcGFuKGxpbmVzXywgc3RhcnRfdGFnLCBlbmRfdGFnLCAmZXhwZWN0ZWRfc3Bhbik7CisKKyAgICAgIGZvciAoU3Bhbk1hcDo6aXRlcmF0b3IgaXRlciA9IHJhbmdlLmZpcnN0OyBpdGVyICE9IHJhbmdlLnNlY29uZDsgKytpdGVyKSB7CisgICAgICAgIGlmIChDb21wYXJlU3BhbnMoZXhwZWN0ZWRfc3BhbiwgaXRlci0+c2Vjb25kLT5zcGFuKCkpKSB7CisgICAgICAgICAgc3BhbnNfLmVyYXNlKGl0ZXIpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIHN0cnVjdCBTcGFuS2V5IHsKKyAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yX3Byb3RvOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQ7CisgICAgaW50IGluZGV4OworCisgICAgaW5saW5lIFNwYW5LZXkoKSB7fQorICAgIGlubGluZSBTcGFuS2V5KGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8sCisgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpCisgICAgICAgIDogZGVzY3JpcHRvcl9wcm90bygmZGVzY3JpcHRvcl9wcm90byksIGZpZWxkKGZpZWxkKSwgaW5kZXgoaW5kZXgpIHt9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgU3BhbktleSYgb3RoZXIpIGNvbnN0IHsKKyAgICAgIGlmIChkZXNjcmlwdG9yX3Byb3RvIDwgb3RoZXIuZGVzY3JpcHRvcl9wcm90bykgcmV0dXJuIHRydWU7CisgICAgICBpZiAoZGVzY3JpcHRvcl9wcm90byA+IG90aGVyLmRlc2NyaXB0b3JfcHJvdG8pIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChmaWVsZCA8IG90aGVyLmZpZWxkKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChmaWVsZCA+IG90aGVyLmZpZWxkKSByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gaW5kZXggPCBvdGhlci5pbmRleDsKKyAgICB9CisgIH07CisKKyAgdHlwZWRlZiBtdWx0aW1hcDxTcGFuS2V5LCBjb25zdCBTb3VyY2VDb2RlSW5mbzo6TG9jYXRpb24qPiBTcGFuTWFwOworICBTcGFuTWFwIHNwYW5zXzsKKyAgdmVjdG9yPHN0cmluZz4gbGluZXNfOworfTsKKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBCYXNpY0ZpbGVEZWNscykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICIvKmEqL3N5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAicGFja2FnZSAvKmIqL2Zvby5iYXIvKmMqLztcbiIKKyAgICAgICJpbXBvcnQgLypkKi9cImJhei5wcm90b1wiLyplKi87XG4iCisgICAgICAiaW1wb3J0IC8qZiovXCJxdXgucHJvdG9cIi8qZyovOy8qaCovXG4iCisgICAgICAiLy8gY29tbWVudCBpZ25vcmVkXG4iKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYSIsICJoIiwgZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgZmlsZV8sICJwYWNrYWdlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJkIiwgImUiLCBmaWxlXywgImRlcGVuZGVuY3kiLCAwKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImYiLCAiZyIsIGZpbGVfLCAiZGVwZW5kZW5jeSIsIDEpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBNZXNzYWdlcykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICIvKmEqL21lc3NhZ2UgLypiKi9Gb28vKmMqLyB7fS8qZCovXG4iCisgICAgICAiLyplKi9tZXNzYWdlIC8qZiovQmFyLypnKi8ge30vKmgqL1xuIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiZCIsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImMiLCBmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJlIiwgImgiLCBmaWxlXy5tZXNzYWdlX3R5cGUoMSkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJnIiwgZmlsZV8ubWVzc2FnZV90eXBlKDEpLCAibmFtZSIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBGaWVsZHMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgLyphKi9vcHRpb25hbC8qYiovIC8qYyovaW50MzIvKmQqLyAvKmUqL2Jhci8qZiovID0gLypnKi8xLypoKi87LyppKi9cbiIKKyAgICAgICIgIC8qaiovcmVwZWF0ZWQvKmsqLyAvKmwqL1guWS8qbSovIC8qbiovYmF6LypvKi8gPSAvKnAqLzIvKnEqLzsvKnIqL1xuIgorICAgICAgIn1cbiIpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQxID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmZpZWxkKDApOworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQyID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmZpZWxkKDEpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiaSIsIGZpZWxkMSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImIiLCBmaWVsZDEsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYyIsICJkIiwgZmllbGQxLCAidHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZSIsICJmIiwgZmllbGQxLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZyIsICJoIiwgZmllbGQxLCAibnVtYmVyIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImoiLCAiciIsIGZpZWxkMikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJqIiwgImsiLCBmaWVsZDIsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigibCIsICJtIiwgZmllbGQyLCAidHlwZV9uYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJuIiwgIm8iLCBmaWVsZDIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJwIiwgInEiLCBmaWVsZDIsICJudW1iZXIiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBFeHRlbnNpb25zKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIi8qYSovZXh0ZW5kIC8qYiovRm9vLypjKi8ge1xuIgorICAgICAgIiAgLypkKi9vcHRpb25hbC8qZSovIGludDMyIGJhciA9IDE7LypmKi9cbiIKKyAgICAgICIgIC8qZyovcmVwZWF0ZWQvKmgqLyBYLlkgYmF6ID0gMjsvKmkqL1xuIgorICAgICAgIn0vKmoqL1xuIgorICAgICAgIi8qayovZXh0ZW5kIC8qbCovQmFyLyptKi8ge1xuIgorICAgICAgIiAgLypuKi9vcHRpb25hbCBpbnQzMiBxdXggPSAxOy8qbyovXG4iCisgICAgICAifS8qcCovXG4iKSk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMSA9IGZpbGVfLmV4dGVuc2lvbigwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMiA9IGZpbGVfLmV4dGVuc2lvbigxKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMyA9IGZpbGVfLmV4dGVuc2lvbigyKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImoiLCBmaWxlXywgImV4dGVuc2lvbiIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiayIsICJwIiwgZmlsZV8sICJleHRlbnNpb24iKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJmIiwgZmllbGQxKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImQiLCAiZSIsIGZpZWxkMSwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImMiLCBmaWVsZDEsICJleHRlbmRlZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJnIiwgImkiLCBmaWVsZDIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZyIsICJoIiwgZmllbGQyLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImIiLCAiYyIsIGZpZWxkMiwgImV4dGVuZGVlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oIm4iLCAibyIsIGZpZWxkMykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJsIiwgIm0iLCBmaWVsZDMsICJleHRlbmRlZSIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDEsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQxLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgInR5cGVfbmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgIm51bWJlciIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMywgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQzLCAibnVtYmVyIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIE5lc3RlZEV4dGVuc2lvbnMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAibWVzc2FnZSBNZXNzYWdlIHtcbiIKKyAgICAgICIgIC8qYSovZXh0ZW5kIC8qYiovRm9vLypjKi8ge1xuIgorICAgICAgIiAgICAvKmQqL29wdGlvbmFsLyplKi8gaW50MzIgYmFyID0gMTsvKmYqL1xuIgorICAgICAgIiAgICAvKmcqL3JlcGVhdGVkLypoKi8gWC5ZIGJheiA9IDI7LyppKi9cbiIKKyAgICAgICIgIH0vKmoqL1xuIgorICAgICAgIiAgLyprKi9leHRlbmQgLypsKi9CYXIvKm0qLyB7XG4iCisgICAgICAiICAgIC8qbiovb3B0aW9uYWwgaW50MzIgcXV4ID0gMTsvKm8qL1xuIgorICAgICAgIiAgfS8qcCovXG4iCisgICAgICAifVxuIikpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZDEgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZXh0ZW5zaW9uKDApOworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQyID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmV4dGVuc2lvbigxKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMyA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5leHRlbnNpb24oMik7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYSIsICJqIiwgZmlsZV8ubWVzc2FnZV90eXBlKDApLCAiZXh0ZW5zaW9uIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJrIiwgInAiLCBmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJleHRlbnNpb24iKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJmIiwgZmllbGQxKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImQiLCAiZSIsIGZpZWxkMSwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImMiLCBmaWVsZDEsICJleHRlbmRlZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJnIiwgImkiLCBmaWVsZDIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZyIsICJoIiwgZmllbGQyLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImIiLCAiYyIsIGZpZWxkMiwgImV4dGVuZGVlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oIm4iLCAibyIsIGZpZWxkMykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJsIiwgIm0iLCBmaWVsZDMsICJleHRlbmRlZSIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMSwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQxLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDEsICJudW1iZXIiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQyLCAidHlwZV9uYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQyLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMywgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMywgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQzLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJudW1iZXIiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRXh0ZW5zaW9uUmFuZ2VzKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIm1lc3NhZ2UgTWVzc2FnZSB7XG4iCisgICAgICAiICAvKmEqL2V4dGVuc2lvbnMgLypiKi8xLypjKi8gdG8gLypkKi80LyplKi8sIC8qZiovNi8qZyovOy8qaCovXG4iCisgICAgICAiICAvKmkqL2V4dGVuc2lvbnMgLypqKi84LyprKi8gdG8gLypsKi9tYXgvKm0qLzsvKm4qL1xuIgorICAgICAgIn1cbiIpKTsKKworICBjb25zdCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlJiByYW5nZTEgPQorICAgICAgZmlsZV8ubWVzc2FnZV90eXBlKDApLmV4dGVuc2lvbl9yYW5nZSgwKTsKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSYgcmFuZ2UyID0KKyAgICAgIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5leHRlbnNpb25fcmFuZ2UoMSk7CisgIGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIHJhbmdlMyA9CisgICAgICBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZXh0ZW5zaW9uX3JhbmdlKDIpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiaCIsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgImV4dGVuc2lvbl9yYW5nZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiaSIsICJuIiwgZmlsZV8ubWVzc2FnZV90eXBlKDApLCAiZXh0ZW5zaW9uX3JhbmdlIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImIiLCAiZSIsIHJhbmdlMSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImMiLCByYW5nZTEsICJzdGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJlIiwgcmFuZ2UxLCAiZW5kIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImYiLCAiZyIsIHJhbmdlMikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJmIiwgImciLCByYW5nZTIsICJzdGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJnIiwgcmFuZ2UyLCAiZW5kIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImoiLCAibSIsIHJhbmdlMykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJqIiwgImsiLCByYW5nZTMsICJzdGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigibCIsICJtIiwgcmFuZ2UzLCAiZW5kIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgTmVzdGVkTWVzc2FnZXMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgLyphKi9tZXNzYWdlIC8qYiovQmFyLypjKi8ge1xuIgorICAgICAgIiAgICAvKmQqL21lc3NhZ2UgLyplKi9CYXovKmYqLyB7fS8qZyovXG4iCisgICAgICAiICB9LypoKi9cbiIKKyAgICAgICIgIC8qaSovbWVzc2FnZSAvKmoqL1F1eC8qayovIHt9LypsKi9cbiIKKyAgICAgICJ9XG4iKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkubmVzdGVkX3R5cGUoMCk7CisgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgYmF6ID0gYmFyLm5lc3RlZF90eXBlKDApOworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHF1eCA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5uZXN0ZWRfdHlwZSgxKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImgiLCBiYXIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJnIiwgYmF6KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImUiLCAiZiIsIGJheiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImkiLCAibCIsIHF1eCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJqIiwgImsiLCBxdXgsICJuYW1lIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgR3JvdXBzKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICIgIG1lc3NhZ2UgQmFyIHt9XG4iCisgICAgICAiICAvKmEqL29wdGlvbmFsLypiKi8gLypjKi9ncm91cC8qZCovIC8qZSovQmF6LypmKi8gPSAvKmcqLzEvKmgqLyB7XG4iCisgICAgICAiICAgIC8qaSovbWVzc2FnZSBRdXgge30vKmoqL1xuIgorICAgICAgIiAgfS8qayovXG4iCisgICAgICAifVxuIikpOworCisgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgYmFyID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLm5lc3RlZF90eXBlKDApOworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGJheiA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5uZXN0ZWRfdHlwZSgxKTsKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBxdXggPSBiYXoubmVzdGVkX3R5cGUoMCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZCA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5maWVsZCgwKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImsiLCBmaWVsZCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImIiLCBmaWVsZCwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJjIiwgImQiLCBmaWVsZCwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImUiLCAiZiIsIGZpZWxkLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZSIsICJmIiwgZmllbGQsICJ0eXBlX25hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImciLCAiaCIsIGZpZWxkLCAibnVtYmVyIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiayIsIGJheikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJlIiwgImYiLCBiYXosICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJpIiwgImoiLCBxdXgpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhcikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ocXV4LCAibmFtZSIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBFbnVtcykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICIvKmEqL2VudW0gLypiKi9Gb28vKmMqLyB7fS8qZCovXG4iCisgICAgICAiLyplKi9lbnVtIC8qZiovQmFyLypnKi8ge30vKmgqL1xuIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiZCIsIGZpbGVfLmVudW1fdHlwZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImMiLCBmaWxlXy5lbnVtX3R5cGUoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJlIiwgImgiLCBmaWxlXy5lbnVtX3R5cGUoMSkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJnIiwgZmlsZV8uZW51bV90eXBlKDEpLCAibmFtZSIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBFbnVtVmFsdWVzKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgImVudW0gRm9vIHtcbiIKKyAgICAgICIgIC8qYSovQkFSLypiKi8gPSAvKmMqLzEvKmQqLzsvKmUqL1xuIgorICAgICAgIiAgLypmKi9CQVovKmcqLyA9IC8qaCovMi8qaSovOy8qaiovXG4iCisgICAgICAifSIpKTsKKworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZpbGVfLmVudW1fdHlwZSgwKS52YWx1ZSgwKTsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBiYXogPSBmaWxlXy5lbnVtX3R5cGUoMCkudmFsdWUoMSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYSIsICJlIiwgYmFyKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiYiIsIGJhciwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImMiLCAiZCIsIGJhciwgIm51bWJlciIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJqIiwgYmF6KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImYiLCAiZyIsIGJheiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImgiLCAiaSIsIGJheiwgIm51bWJlciIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5lbnVtX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5lbnVtX3R5cGUoMCksICJuYW1lIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIE5lc3RlZEVudW1zKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICIgIC8qYSovZW51bSAvKmIqL0Jhci8qYyovIHt9LypkKi9cbiIKKyAgICAgICIgIC8qZSovZW51bSAvKmYqL0Jhei8qZyovIHt9LypoKi9cbiIKKyAgICAgICJ9XG4iKSk7CisKKyAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgYmFyID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmVudW1fdHlwZSgwKTsKKyAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgYmF6ID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmVudW1fdHlwZSgxKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImQiLCBiYXIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZSIsICJoIiwgYmF6KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImYiLCAiZyIsIGJheiwgIm5hbWUiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBTZXJ2aWNlcykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICIvKmEqL3NlcnZpY2UgLypiKi9Gb28vKmMqLyB7fS8qZCovXG4iCisgICAgICAiLyplKi9zZXJ2aWNlIC8qZiovQmFyLypnKi8ge30vKmgqL1xuIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiZCIsIGZpbGVfLnNlcnZpY2UoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgZmlsZV8uc2VydmljZSgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImUiLCAiaCIsIGZpbGVfLnNlcnZpY2UoMSkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJnIiwgZmlsZV8uc2VydmljZSgxKSwgIm5hbWUiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgTWV0aG9kcykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICJzZXJ2aWNlIEZvbyB7XG4iCisgICAgICAiICAvKmEqL3JwYyAvKmIqL0Jhci8qYyovKC8qZCovWC8qZSovKSByZXR1cm5zKC8qZiovWS8qZyovKTsvKmgqLyIKKyAgICAgICIgIC8qaSovcnBjIC8qaiovQmF6LyprKi8oLypsKi9aLyptKi8pIHJldHVybnMoLypuKi9XLypvKi8pOy8qcCovIgorICAgICAgIn0iKSk7CisKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKTsKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBiYXogPSBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImgiLCBiYXIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJlIiwgYmFyLCAiaW5wdXRfdHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJnIiwgYmFyLCAib3V0cHV0X3R5cGUiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiaSIsICJwIiwgYmF6KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImoiLCAiayIsIGJheiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImwiLCAibSIsIGJheiwgImlucHV0X3R5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oIm4iLCAibyIsIGJheiwgIm91dHB1dF90eXBlIikpOworCisgIC8vIElnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLCAibmFtZSIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBPcHRpb25zKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIi8qYSovb3B0aW9uIC8qYiovZm9vLypjKi8uLypkKi8oLyplKi9iYXIuYmF6LypmKi8pLypnKi8gPSAiCisgICAgICAgICAgIi8qaCovMTIzLyppKi87LypqKi9cbiIKKyAgICAgICIvKmsqL29wdGlvbiBxdXggPSAvKmwqLy0xMjMvKm0qLzsvKm4qL1xuIgorICAgICAgIi8qbyovb3B0aW9uIGNvcmdlID0gLypwKi9hYmMvKnEqLzsvKnIqL1xuIgorICAgICAgIi8qcyovb3B0aW9uIGdyYXVsdCA9IC8qdCovJ2JsYWgnLyp1Ki87Lyp2Ki9cbiIKKyAgICAgICIvKncqL29wdGlvbiBnYXJwbHkgPSAvKngqL3sgeWFkZGEgeWFkZGEgfS8qeSovOy8qeiovXG4iCisgICAgICAiLyowKi9vcHRpb24gd2FsZG8gPSAvKjEqLzEyMy4wLyoyKi87LyozKi9cbiIKKyAgKSk7CisKKyAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uMSA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKTsKKyAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uMiA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigxKTsKKyAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uMyA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigyKTsKKyAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uNCA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigzKTsKKyAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uNSA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbig0KTsKKyAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uNiA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbig1KTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImoiLCBmaWxlXy5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJpIiwgb3B0aW9uMSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImciLCBvcHRpb24xLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgb3B0aW9uMS5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImIiLCAiYyIsIG9wdGlvbjEubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJnIiwgb3B0aW9uMS5uYW1lKDEpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImUiLCAiZiIsIG9wdGlvbjEubmFtZSgxKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiaCIsICJpIiwgb3B0aW9uMSwgInBvc2l0aXZlX2ludF92YWx1ZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJrIiwgIm4iLCBmaWxlXy5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigibCIsICJtIiwgb3B0aW9uMiwgIm5lZ2F0aXZlX2ludF92YWx1ZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJvIiwgInIiLCBmaWxlXy5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigicCIsICJxIiwgb3B0aW9uMywgImlkZW50aWZpZXJfdmFsdWUiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigicyIsICJ2IiwgZmlsZV8ub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oInQiLCAidSIsIG9wdGlvbjQsICJzdHJpbmdfdmFsdWUiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigidyIsICJ6IiwgZmlsZV8ub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oIngiLCAieSIsIG9wdGlvbjUsICJhZ2dyZWdhdGVfdmFsdWUiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiMCIsICIzIiwgZmlsZV8ub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oIjEiLCAiMiIsIG9wdGlvbjYsICJkb3VibGVfdmFsdWUiKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjMpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb240KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjYpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24zLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb240LCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb241LCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb242LCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24zLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb240Lm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb241Lm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb242Lm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMy5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjQubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb241Lm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNi5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIFNjb3BlZE9wdGlvbnMpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAiICAvKmEqL29wdGlvbiBtb3B0ID0gMTsvKmIqL1xuIgorICAgICJ9XG4iCisgICAgImVudW0gQmFyIHtcbiIKKyAgICAiICAvKmMqL29wdGlvbiBlb3B0ID0gMTsvKmQqL1xuIgorICAgICJ9XG4iCisgICAgInNlcnZpY2UgQmF6IHtcbiIKKyAgICAiICAvKmUqL29wdGlvbiBzb3B0ID0gMTsvKmYqL1xuIgorICAgICIgIHJwYyBNKFgpIHJldHVybnMoWSkge1xuIgorICAgICIgICAgLypnKi9vcHRpb24gbW9wdCA9IDE7LypoKi9cbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImIiLCBmaWxlXy5tZXNzYWdlX3R5cGUoMCkub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImMiLCAiZCIsIGZpbGVfLmVudW1fdHlwZSgwKS5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZSIsICJmIiwgZmlsZV8uc2VydmljZSgwKS5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZyIsICJoIiwgZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCkub3B0aW9ucygpKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5lbnVtX3R5cGUoMCkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLCAiaW5wdXRfdHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKSwgIm91dHB1dF90eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRmllbGRPcHRpb25zKSB7CisgIC8vIFRoZSBhY3R1YWwgIm5hbWUgPSB2YWx1ZSIgcGFpcnMgYXJlIHBhcnNlZCBieSB0aGUgc2FtZSBjb2RlIGFzIGZvcgorICAvLyB0b3AtbGV2ZWwgb3B0aW9ucyBzbyB3ZSB3b24ndCByZS10ZXN0IHRoYXQgLS0ganVzdCBtYWtlIHN1cmUgdGhhdCB0aGUKKyAgLy8gc3ludGF4IHVzZWQgZm9yIGZpZWxkIG9wdGlvbnMgaXMgdW5kZXJzdG9vZC4KKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAibWVzc2FnZSBGb28geyIKKyAgICAgICIgIG9wdGlvbmFsIGludDMyIGJhciA9IDEgIgorICAgICAgICAgICIvKmEqL1tkZWZhdWx0PS8qYiovMTIzLypjKi8sLypkKi9vcHQxPTEyMy8qZSovLCIKKyAgICAgICAgICAiLypmKi9vcHQyPSdoaScvKmcqL10vKmgqLzsiCisgICAgICAifVxuIgorICApKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjEgPSBmaWVsZC5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbjIgPSBmaWVsZC5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYSIsICJoIiwgZmllbGQub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImIiLCAiYyIsIGZpZWxkLCAiZGVmYXVsdF92YWx1ZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJlIiwgb3B0aW9uMSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJmIiwgImciLCBvcHRpb24yKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZCwgIm51bWJlciIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMi5uYW1lKDApLCAibmFtZV9wYXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjEsICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMiwgInN0cmluZ192YWx1ZSIpKTsKK30KKworVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBFbnVtVmFsdWVPcHRpb25zKSB7CisgIC8vIFRoZSBhY3R1YWwgIm5hbWUgPSB2YWx1ZSIgcGFpcnMgYXJlIHBhcnNlZCBieSB0aGUgc2FtZSBjb2RlIGFzIGZvcgorICAvLyB0b3AtbGV2ZWwgb3B0aW9ucyBzbyB3ZSB3b24ndCByZS10ZXN0IHRoYXQgLS0ganVzdCBtYWtlIHN1cmUgdGhhdCB0aGUKKyAgLy8gc3ludGF4IHVzZWQgZm9yIGVudW0gb3B0aW9ucyBpcyB1bmRlcnN0b29kLgorICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICJlbnVtIEZvbyB7IgorICAgICAgIiAgQkFSID0gMSAvKmEqL1svKmIqL29wdDE9MTIzLypjKi8sLypkKi9vcHQyPSdoaScvKmUqL10vKmYqLzsiCisgICAgICAifVxuIgorICApKTsKKworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIHZhbHVlID0gZmlsZV8uZW51bV90eXBlKDApLnZhbHVlKDApOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24xID0gdmFsdWUub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24yID0gdmFsdWUub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDEpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiZiIsIHZhbHVlLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImMiLCBvcHRpb24xKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oImQiLCAiZSIsIG9wdGlvbjIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5lbnVtX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5lbnVtX3R5cGUoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKHZhbHVlKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4odmFsdWUsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKHZhbHVlLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjEsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjEubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjEubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMSwgInBvc2l0aXZlX2ludF92YWx1ZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLCAic3RyaW5nX3ZhbHVlIikpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdmOTQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjCkBAIC0wLDAgKzEsMTYzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZuZGVmIFNURElOX0ZJTEVOTworI2RlZmluZSBTVERJTl9GSUxFTk8gMAorI2VuZGlmCisjaWZuZGVmIFNURE9VVF9GSUxFTk8KKyNkZWZpbmUgU1RET1VUX0ZJTEVOTyAxCisjZW5kaWYKKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworY2xhc3MgR2VuZXJhdG9yUmVzcG9uc2VDb250ZXh0IDogcHVibGljIEdlbmVyYXRvckNvbnRleHQgeworIHB1YmxpYzoKKyAgR2VuZXJhdG9yUmVzcG9uc2VDb250ZXh0KENvZGVHZW5lcmF0b3JSZXNwb25zZSogcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzKQorICAgICAgOiByZXNwb25zZV8ocmVzcG9uc2UpLAorICAgICAgICBwYXJzZWRfZmlsZXNfKHBhcnNlZF9maWxlcykge30KKyAgdmlydHVhbCB+R2VuZXJhdG9yUmVzcG9uc2VDb250ZXh0KCkge30KKworICAvLyBpbXBsZW1lbnRzIEdlbmVyYXRvckNvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB2aXJ0dWFsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3Blbihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpGaWxlKiBmaWxlID0gcmVzcG9uc2VfLT5hZGRfZmlsZSgpOworICAgIGZpbGUtPnNldF9uYW1lKGZpbGVuYW1lKTsKKyAgICByZXR1cm4gbmV3IGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0oZmlsZS0+bXV0YWJsZV9jb250ZW50KCkpOworICB9CisKKyAgdmlydHVhbCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW5Gb3JJbnNlcnQoCisgICAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCkgeworICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6RmlsZSogZmlsZSA9IHJlc3BvbnNlXy0+YWRkX2ZpbGUoKTsKKyAgICBmaWxlLT5zZXRfbmFtZShmaWxlbmFtZSk7CisgICAgZmlsZS0+c2V0X2luc2VydGlvbl9wb2ludChpbnNlcnRpb25fcG9pbnQpOworICAgIHJldHVybiBuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbShmaWxlLT5tdXRhYmxlX2NvbnRlbnQoKSk7CisgIH0KKworICB2b2lkIExpc3RQYXJzZWRGaWxlcyh2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiogb3V0cHV0KSB7CisgICAgKm91dHB1dCA9IHBhcnNlZF9maWxlc187CisgIH0KKworIHByaXZhdGU6CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZSogcmVzcG9uc2VfOworICBjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzXzsKK307CisKK2ludCBQbHVnaW5NYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10sIGNvbnN0IENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvcikgeworCisgIGlmIChhcmdjID4gMSkgeworICAgIGNlcnIgPDwgYXJndlswXSA8PCAiOiBVbmtub3duIG9wdGlvbjogIiA8PCBhcmd2WzFdIDw8IGVuZGw7CisgICAgcmV0dXJuIDE7CisgIH0KKworI2lmZGVmIF9XSU4zMgorICBfc2V0bW9kZShTVERJTl9GSUxFTk8sIF9PX0JJTkFSWSk7CisgIF9zZXRtb2RlKFNURE9VVF9GSUxFTk8sIF9PX0JJTkFSWSk7CisjZW5kaWYKKworICBDb2RlR2VuZXJhdG9yUmVxdWVzdCByZXF1ZXN0OworICBpZiAoIXJlcXVlc3QuUGFyc2VGcm9tRmlsZURlc2NyaXB0b3IoU1RESU5fRklMRU5PKSkgeworICAgIGNlcnIgPDwgYXJndlswXSA8PCAiOiBwcm90b2Mgc2VudCB1bnBhcnNlYWJsZSByZXF1ZXN0IHRvIHBsdWdpbi4iIDw8IGVuZGw7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBEZXNjcmlwdG9yUG9vbCBwb29sOworICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3QucHJvdG9fZmlsZV9zaXplKCk7IGkrKykgeworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5CdWlsZEZpbGUocmVxdWVzdC5wcm90b19maWxlKGkpKTsKKyAgICBpZiAoZmlsZSA9PSBOVUxMKSB7CisgICAgICAvLyBCdWlsZEZpbGUoKSBhbHJlYWR5IHdyb3RlIGFuIGVycm9yIG1lc3NhZ2UuCisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBwYXJzZWRfZmlsZXM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlX3NpemUoKTsgaSsrKSB7CisgICAgcGFyc2VkX2ZpbGVzLnB1c2hfYmFjayhwb29sLkZpbmRGaWxlQnlOYW1lKHJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZShpKSkpOworICAgIGlmIChwYXJzZWRfZmlsZXMuYmFjaygpID09IE5VTEwpIHsKKyAgICAgIGNlcnIgPDwgYXJndlswXSA8PCAiOiBwcm90b2MgYXNrZWQgcGx1Z2luIHRvIGdlbmVyYXRlIGEgZmlsZSBidXQgIgorICAgICAgICAgICAgICAiZGlkIG5vdCBwcm92aWRlIGEgZGVzY3JpcHRvciBmb3IgdGhlIGZpbGU6ICIKKyAgICAgICAgICAgPDwgcmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKGkpIDw8IGVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgcmVzcG9uc2U7CisgIEdlbmVyYXRvclJlc3BvbnNlQ29udGV4dCBjb250ZXh0KCZyZXNwb25zZSwgcGFyc2VkX2ZpbGVzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZF9maWxlcy5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcGFyc2VkX2ZpbGVzW2ldOworCisgICAgc3RyaW5nIGVycm9yOworICAgIGJvb2wgc3VjY2VlZGVkID0gZ2VuZXJhdG9yLT5HZW5lcmF0ZSgKKyAgICAgICAgZmlsZSwgcmVxdWVzdC5wYXJhbWV0ZXIoKSwgJmNvbnRleHQsICZlcnJvcik7CisKKyAgICBpZiAoIXN1Y2NlZWRlZCAmJiBlcnJvci5lbXB0eSgpKSB7CisgICAgICBlcnJvciA9ICJDb2RlIGdlbmVyYXRvciByZXR1cm5lZCBmYWxzZSBidXQgcHJvdmlkZWQgbm8gZXJyb3IgIgorICAgICAgICAgICAgICAiZGVzY3JpcHRpb24uIjsKKyAgICB9CisgICAgaWYgKCFlcnJvci5lbXB0eSgpKSB7CisgICAgICByZXNwb25zZS5zZXRfZXJyb3IoZmlsZS0+bmFtZSgpICsgIjogIiArIGVycm9yKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICghcmVzcG9uc2UuU2VyaWFsaXplVG9GaWxlRGVzY3JpcHRvcihTVERPVVRfRklMRU5PKSkgeworICAgIGNlcnIgPDwgYXJndlswXSA8PCAiOiBFcnJvciB3cml0aW5nIHRvIHN0ZG91dC4iIDw8IGVuZGw7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gMDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0MDMzMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBGcm9udC1lbmQgZm9yIHByb3RvYyBjb2RlIGdlbmVyYXRvciBwbHVnaW5zIHdyaXR0ZW4gaW4gQysrLgorLy8KKy8vIFRvIGltcGxlbWVudCBhIHByb3RvYyBwbHVnaW4gaW4gQysrLCBzaW1wbHkgd3JpdGUgYW4gaW1wbGVtZW50YXRpb24gb2YKKy8vIENvZGVHZW5lcmF0b3IsIHRoZW4gY3JlYXRlIGEgbWFpbigpIGZ1bmN0aW9uIGxpa2U6CisvLyAgIGludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKy8vICAgICBNeUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yOworLy8gICAgIHJldHVybiBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6UGx1Z2luTWFpbihhcmdjLCBhcmd2LCAmZ2VuZXJhdG9yKTsKKy8vICAgfQorLy8gWW91IG11c3QgbGluayB5b3VyIHBsdWdpbiBhZ2FpbnN0IGxpYnByb3RvYnVmIGFuZCBsaWJwcm90b2MuCisvLworLy8gVG8gZ2V0IHByb3RvYyB0byB1c2UgdGhlIHBsdWdpbiwgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisvLyAqIFBsYWNlIHRoZSBwbHVnaW4gYmluYXJ5IHNvbWV3aGVyZSBpbiB0aGUgUEFUSCBhbmQgZ2l2ZSBpdCB0aGUgbmFtZQorLy8gICAicHJvdG9jLWdlbi1OQU1FIiAocmVwbGFjaW5nICJOQU1FIiB3aXRoIHRoZSBuYW1lIG9mIHlvdXIgcGx1Z2luKS4gIElmIHlvdQorLy8gICB0aGVuIGludm9rZSBwcm90b2Mgd2l0aCB0aGUgcGFyYW1ldGVyIC0tTkFNRV9vdXQ9T1VUX0RJUiAoYWdhaW4sIHJlcGxhY2UKKy8vICAgIk5BTUUiIHdpdGggeW91ciBwbHVnaW4ncyBuYW1lKSwgcHJvdG9jIHdpbGwgaW52b2tlIHlvdXIgcGx1Z2luIHRvIGdlbmVyYXRlCisvLyAgIHRoZSBvdXRwdXQsIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGluIE9VVF9ESVIuCisvLyAqIFBsYWNlIHRoZSBwbHVnaW4gYmluYXJ5IGFueXdoZXJlLCB3aXRoIGFueSBuYW1lLCBhbmQgcGFzcyB0aGUgLS1wbHVnaW4KKy8vICAgcGFyYW1ldGVyIHRvIHByb3RvYyB0byBkaXJlY3QgaXQgdG8geW91ciBwbHVnaW4gbGlrZSBzbzoKKy8vICAgICBwcm90b2MgLS1wbHVnaW49cHJvdG9jLWdlbi1OQU1FPXBhdGgvdG8vbXliaW5hcnkgLS1OQU1FX291dD1PVVRfRElSCisvLyAgIE9uIFdpbmRvd3MsIG1ha2Ugc3VyZSB0byBpbmNsdWRlIHRoZSAuZXhlIHN1ZmZpeDoKKy8vICAgICBwcm90b2MgLS1wbHVnaW49cHJvdG9jLWdlbi1OQU1FPXBhdGgvdG8vbXliaW5hcnkuZXhlIC0tTkFNRV9vdXQ9T1VUX0RJUgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QTFVHSU5fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QTFVHSU5fSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKK2NsYXNzIENvZGVHZW5lcmF0b3I7ICAgIC8vIGNvZGVfZ2VuZXJhdG9yLmgKKworLy8gSW1wbGVtZW50cyBtYWluKCkgZm9yIGEgcHJvdG9jIHBsdWdpbiBleHBvc2luZyB0aGUgZ2l2ZW4gY29kZSBnZW5lcmF0b3IuCitMSUJQUk9UT0NfRVhQT1JUIGludCBQbHVnaW5NYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10sIGNvbnN0IENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvcik7CisKK30gIC8vIG5hbWVzcGFjZSBjb21waWxlcgorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BMVUdJTl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTU2MTg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjCkBAIC0wLDAgKzEsMTA4MSBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKworI2RlZmluZSBJTlRFUk5BTF9TVVBQUkVTU19QUk9UT0JVRl9GSUVMRF9ERVBSRUNBVElPTgorI2luY2x1ZGUgImdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBjb21waWxlciB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ29kZUdlbmVyYXRvclJlcXVlc3RfZGVzY3JpcHRvcl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0X3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ29kZUdlbmVyYXRvclJlc3BvbnNlX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfcmVmbGVjdGlvbl8gPSBOVUxMOworCit9ICAvLyBuYW1lc3BhY2UKKworCit2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCkgeworICBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yKiBmaWxlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5GaW5kRmlsZUJ5TmFtZSgKKyAgICAgICJnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvIik7CisgIEdPT0dMRV9DSEVDSyhmaWxlICE9IE5VTEwpOworICBDb2RlR2VuZXJhdG9yUmVxdWVzdF9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKTsKKyAgc3RhdGljIGNvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVxdWVzdF9vZmZzZXRzX1szXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXF1ZXN0LCBmaWxlX3RvX2dlbmVyYXRlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVxdWVzdCwgcGFyYW1ldGVyXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVxdWVzdCwgcHJvdG9fZmlsZV8pLAorICB9OworICBDb2RlR2VuZXJhdG9yUmVxdWVzdF9yZWZsZWN0aW9uXyA9CisgICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgQ29kZUdlbmVyYXRvclJlcXVlc3RfZGVzY3JpcHRvcl8sCisgICAgICBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBDb2RlR2VuZXJhdG9yUmVxdWVzdF9vZmZzZXRzXywKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlcXVlc3QsIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVxdWVzdCwgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKENvZGVHZW5lcmF0b3JSZXF1ZXN0KSk7CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxKTsKKyAgc3RhdGljIGNvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2Vfb2Zmc2V0c19bMl0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVzcG9uc2UsIGVycm9yXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVzcG9uc2UsIGZpbGVfKSwKKyAgfTsKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVzY3JpcHRvcl8sCisgICAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVzcG9uc2UsIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVzcG9uc2UsIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihDb2RlR2VuZXJhdG9yUmVzcG9uc2UpKTsKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfZGVzY3JpcHRvcl8gPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKDApOworICBzdGF0aWMgY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX29mZnNldHNfWzNdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUsIG5hbWVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlLCBpbnNlcnRpb25fcG9pbnRfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlLCBjb250ZW50XyksCisgIH07CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9kZXNjcmlwdG9yXywKKyAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSwgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUpKTsKK30KKworbmFtZXNwYWNlIHsKKworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc19vbmNlXyk7CitpbmxpbmUgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJnByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzX29uY2VfLAorICAgICAgICAgICAgICAgICAmcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8pOworfQorCit2b2lkIHByb3RvYnVmX1JlZ2lzdGVyVHlwZXMoY29uc3QgOjpzdGQ6OnN0cmluZyYpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIENvZGVHZW5lcmF0b3JSZXF1ZXN0X2Rlc2NyaXB0b3JfLCAmQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9kZXNjcmlwdG9yXywgJkNvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfZGVzY3JpcHRvcl8sICZDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpIHsKKyAgZGVsZXRlIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIENvZGVHZW5lcmF0b3JSZXF1ZXN0X3JlZmxlY3Rpb25fOworICBkZWxldGUgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIENvZGVHZW5lcmF0b3JSZXNwb25zZV9yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX3JlZmxlY3Rpb25fOworfQorCit2b2lkIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCkgeworICBzdGF0aWMgYm9vbCBhbHJlYWR5X2hlcmUgPSBmYWxzZTsKKyAgaWYgKGFscmVhZHlfaGVyZSkgcmV0dXJuOworICBhbHJlYWR5X2hlcmUgPSB0cnVlOworICBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT047CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6cHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoCisgICAgIlxuJWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG9cMDIyIgorICAgICJcMDMwZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyXDAzMiBnb29nbGUvcHJvdG9iIgorICAgICJ1Zi9kZXNjcmlwdG9yLnByb3RvXCJ9XG5cMDI0Q29kZUdlbmVyYXRvclJlcXUiCisgICAgImVzdFwwMjJcMDMwXG5cMDIwZmlsZV90b19nZW5lcmF0ZVwwMzBcMDAxIFwwMDMoXHRcMDIyXDAyMVxuXHRwYXJhbWV0IgorICAgICJlclwwMzBcMDAyIFwwMDEoXHRcMDIyOFxuXG5wcm90b19maWxlXDAzMFwwMTcgXDAwMyhcMDEzMiQuZ29vZ2xlLnByIgorICAgICJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90b1wiXDI1MlwwMDFcblwwMjVDb2RlR2VuZXIiCisgICAgImF0b3JSZXNwb25zZVwwMjJcclxuXDAwNWVycm9yXDAzMFwwMDEgXDAwMShcdFwwMjJCXG5cMDA0ZmlsZVwwMzBcMDE3IFwwMDMoIgorICAgICJcMDEzMjQuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0IgorICAgICJvclJlc3BvbnNlLkZpbGVcMDMyPlxuXDAwNEZpbGVcMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxKFx0XDAyMlwwMjdcbiIKKyAgICAiXDAxN2luc2VydGlvbl9wb2ludFwwMzBcMDAyIFwwMDEoXHRcMDIyXDAxN1xuXDAwN2NvbnRlbnRcMDMwXDAxNyBcMDAxKFx0IiwgMzk5KTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZEZpbGUoCisgICAgImdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8iLCAmcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyk7CisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBDb2RlR2VuZXJhdG9yUmVxdWVzdCgpOworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IENvZGVHZW5lcmF0b3JSZXNwb25zZSgpOworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUoKTsKKyAgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok9uU2h1dGRvd24oJnByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8pOworfQorCisvLyBGb3JjZSBBZGREZXNjcmlwdG9ycygpIHRvIGJlIGNhbGxlZCBhdCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gdGltZS4KK3N0cnVjdCBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvIHsKKyAgU3RhdGljRGVzY3JpcHRvckluaXRpYWxpemVyX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpIHsKKyAgICBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICB9Cit9IHN0YXRpY19kZXNjcmlwdG9yX2luaXRpYWxpemVyX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90b187CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXF1ZXN0OjprRmlsZVRvR2VuZXJhdGVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6a1BhcmFtZXRlckZpZWxkTnVtYmVyOworY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXF1ZXN0OjprUHJvdG9GaWxlRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Q29kZUdlbmVyYXRvclJlcXVlc3QoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK0NvZGVHZW5lcmF0b3JSZXF1ZXN0OjpDb2RlR2VuZXJhdG9yUmVxdWVzdChjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgcGFyYW1ldGVyXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworQ29kZUdlbmVyYXRvclJlcXVlc3Q6On5Db2RlR2VuZXJhdG9yUmVxdWVzdCgpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpTaGFyZWREdG9yKCkgeworICBpZiAocGFyYW1ldGVyXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIHBhcmFtZXRlcl87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gQ29kZUdlbmVyYXRvclJlcXVlc3RfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0NvZGVHZW5lcmF0b3JSZXF1ZXN0KiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitDb2RlR2VuZXJhdG9yUmVxdWVzdCogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBDb2RlR2VuZXJhdG9yUmVxdWVzdDsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzEgLyAzMl0gJiAoMHhmZnUgPDwgKDEgJSAzMikpKSB7CisgICAgaWYgKGhhc19wYXJhbWV0ZXIoKSkgeworICAgICAgaWYgKHBhcmFtZXRlcl8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBwYXJhbWV0ZXJfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgfQorICBmaWxlX3RvX2dlbmVyYXRlXy5DbGVhcigpOworICBwcm90b19maWxlXy5DbGVhcigpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIHJlcGVhdGVkIHN0cmluZyBmaWxlX3RvX2dlbmVyYXRlID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9maWxlX3RvX2dlbmVyYXRlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpIC0gMSkuZGF0YSgpLAorICAgICAgICAgICAgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZSh0aGlzLT5maWxlX3RvX2dlbmVyYXRlX3NpemUoKSAtIDEpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTApKSBnb3RvIHBhcnNlX2ZpbGVfdG9fZ2VuZXJhdGU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9wYXJhbWV0ZXI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgcGFyYW1ldGVyID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9wYXJhbWV0ZXI6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3BhcmFtZXRlcigpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPnBhcmFtZXRlcigpLmRhdGEoKSwgdGhpcy0+cGFyYW1ldGVyKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMjIpKSBnb3RvIHBhcnNlX3Byb3RvX2ZpbGU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG9fZmlsZSA9IDE1OworICAgICAgY2FzZSAxNTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9wcm90b19maWxlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9wcm90b19maWxlKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEyMikpIGdvdG8gcGFyc2VfcHJvdG9fZmlsZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZV9zaXplKCk7IGkrKykgeworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGUoaSkuZGF0YSgpLCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKGkpLmxlbmd0aCgpLAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMSwgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZShpKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7CisgIGlmIChoYXNfcGFyYW1ldGVyKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+cGFyYW1ldGVyKCkuZGF0YSgpLCB0aGlzLT5wYXJhbWV0ZXIoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMiwgdGhpcy0+cGFyYW1ldGVyKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cHJvdG9fZmlsZV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICAxNSwgdGhpcy0+cHJvdG9fZmlsZShpKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZShpKS5kYXRhKCksIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGUoaSkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlU3RyaW5nVG9BcnJheSgxLCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKGkpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgcGFyYW1ldGVyID0gMjsKKyAgaWYgKGhhc19wYXJhbWV0ZXIoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5wYXJhbWV0ZXIoKS5kYXRhKCksIHRoaXMtPnBhcmFtZXRlcigpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMiwgdGhpcy0+cGFyYW1ldGVyKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cHJvdG9fZmlsZV9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDE1LCB0aGlzLT5wcm90b19maWxlKGkpLCB0YXJnZXQpOworICB9CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgIAorICBpZiAoX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgeworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOworICAgIGlmIChoYXNfcGFyYW1ldGVyKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPnBhcmFtZXRlcigpKTsKKyAgICB9CisgICAgCisgIH0KKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5maWxlX3RvX2dlbmVyYXRlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGUoaSkpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG9fZmlsZSA9IDE1OworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5wcm90b19maWxlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wcm90b19maWxlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5wcm90b19maWxlKGkpKTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ok1lcmdlRnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBmaWxlX3RvX2dlbmVyYXRlXy5NZXJnZUZyb20oZnJvbS5maWxlX3RvX2dlbmVyYXRlXyk7CisgIHByb3RvX2ZpbGVfLk1lcmdlRnJvbShmcm9tLnByb3RvX2ZpbGVfKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19wYXJhbWV0ZXIoKSkgeworICAgICAgc2V0X3BhcmFtZXRlcihmcm9tLnBhcmFtZXRlcigpKTsKKyAgICB9CisgIH0KKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Q29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICAKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90b19maWxlX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT5wcm90b19maWxlKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpTd2FwKENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIGZpbGVfdG9fZ2VuZXJhdGVfLlN3YXAoJm90aGVyLT5maWxlX3RvX2dlbmVyYXRlXyk7CisgICAgc3RkOjpzd2FwKHBhcmFtZXRlcl8sIG90aGVyLT5wYXJhbWV0ZXJfKTsKKyAgICBwcm90b19maWxlXy5Td2FwKCZvdGhlci0+cHJvdG9fZmlsZV8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBDb2RlR2VuZXJhdG9yUmVxdWVzdF9kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IENvZGVHZW5lcmF0b3JSZXF1ZXN0X3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmtOYW1lRmllbGROdW1iZXI7Citjb25zdCBpbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmtJbnNlcnRpb25Qb2ludEZpZWxkTnVtYmVyOworY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjprQ29udGVudEZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUoY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBpbnNlcnRpb25fcG9pbnRfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBjb250ZW50XyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6On5Db2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSgpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpTaGFyZWREdG9yKCkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lXzsKKyAgfQorICBpZiAoaW5zZXJ0aW9uX3BvaW50XyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGluc2VydGlvbl9wb2ludF87CisgIH0KKyAgaWYgKGNvbnRlbnRfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgY29udGVudF87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0NvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIG5hbWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX2luc2VydGlvbl9wb2ludCgpKSB7CisgICAgICBpZiAoaW5zZXJ0aW9uX3BvaW50XyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGluc2VydGlvbl9wb2ludF8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChoYXNfY29udGVudCgpKSB7CisgICAgICBpZiAoY29udGVudF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBjb250ZW50Xy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2luc2VydGlvbl9wb2ludDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnNlcnRpb25fcG9pbnQgPSAyOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2luc2VydGlvbl9wb2ludDoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfaW5zZXJ0aW9uX3BvaW50KCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCkuZGF0YSgpLCB0aGlzLT5pbnNlcnRpb25fcG9pbnQoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEyMikpIGdvdG8gcGFyc2VfY29udGVudDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7CisgICAgICBjYXNlIDE1OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2NvbnRlbnQ6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2NvbnRlbnQoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5jb250ZW50KCkuZGF0YSgpLCB0aGlzLT5jb250ZW50KCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnNlcnRpb25fcG9pbnQgPSAyOworICBpZiAoaGFzX2luc2VydGlvbl9wb2ludCgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLmRhdGEoKSwgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDIsIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OworICBpZiAoaGFzX2NvbnRlbnQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5jb250ZW50KCkuZGF0YSgpLCB0aGlzLT5jb250ZW50KCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDE1LCB0aGlzLT5jb250ZW50KCksIG91dHB1dCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKKyAgaWYgKGhhc19pbnNlcnRpb25fcG9pbnQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5pbnNlcnRpb25fcG9pbnQoKS5kYXRhKCksIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMiwgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7CisgIGlmIChoYXNfY29udGVudCgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmNvbnRlbnQoKS5kYXRhKCksIHRoaXMtPmNvbnRlbnQoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDE1LCB0aGlzLT5jb250ZW50KCksIHRhcmdldCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKyAgCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5uYW1lKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKKyAgICBpZiAoaGFzX2luc2VydGlvbl9wb2ludCgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5pbnNlcnRpb25fcG9pbnQoKSk7CisgICAgfQorICAgIAorICAgIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7CisgICAgaWYgKGhhc19jb250ZW50KCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmNvbnRlbnQoKSk7CisgICAgfQorICAgIAorICB9CisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpNZXJnZUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKKyAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX2luc2VydGlvbl9wb2ludCgpKSB7CisgICAgICBzZXRfaW5zZXJ0aW9uX3BvaW50KGZyb20uaW5zZXJ0aW9uX3BvaW50KCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfY29udGVudCgpKSB7CisgICAgICBzZXRfY29udGVudChmcm9tLmNvbnRlbnQoKSk7CisgICAgfQorICB9CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkNvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpTd2FwKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHN0ZDo6c3dhcChuYW1lXywgb3RoZXItPm5hbWVfKTsKKyAgICBzdGQ6OnN3YXAoaW5zZXJ0aW9uX3BvaW50Xywgb3RoZXItPmluc2VydGlvbl9wb2ludF8pOworICAgIHN0ZDo6c3dhcChjb250ZW50Xywgb3RoZXItPmNvbnRlbnRfKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZTo6a0Vycm9yRmllbGROdW1iZXI7Citjb25zdCBpbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjprRmlsZUZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2UoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNvZGVHZW5lcmF0b3JSZXNwb25zZShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBlcnJvcl8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0NvZGVHZW5lcmF0b3JSZXNwb25zZTo6fkNvZGVHZW5lcmF0b3JSZXNwb25zZSgpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKGVycm9yXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGVycm9yXzsKKyAgfQorICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICB9Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIENvZGVHZW5lcmF0b3JSZXNwb25zZV9kZXNjcmlwdG9yXzsKK30KKworY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IENvZGVHZW5lcmF0b3JSZXNwb25zZTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNsZWFyKCkgeworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChoYXNfZXJyb3IoKSkgeworICAgICAgaWYgKGVycm9yXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGVycm9yXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZmlsZV8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2Vycm9yKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+ZXJyb3IoKS5kYXRhKCksIHRoaXMtPmVycm9yKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMjIpKSBnb3RvIHBhcnNlX2ZpbGU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlIGZpbGUgPSAxNTsKKyAgICAgIGNhc2UgMTU6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfZmlsZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZmlsZSgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMjIpKSBnb3RvIHBhcnNlX2ZpbGU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBlcnJvciA9IDE7CisgIGlmIChoYXNfZXJyb3IoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5lcnJvcigpLmRhdGEoKSwgdGhpcy0+ZXJyb3IoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMSwgdGhpcy0+ZXJyb3IoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmlsZV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICAxNSwgdGhpcy0+ZmlsZShpKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBlcnJvciA9IDE7CisgIGlmIChoYXNfZXJyb3IoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5lcnJvcigpLmRhdGEoKSwgdGhpcy0+ZXJyb3IoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDEsIHRoaXMtPmVycm9yKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUgZmlsZSA9IDE1OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpbGVfc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICAxNSwgdGhpcy0+ZmlsZShpKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKyAgCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKKyAgICBpZiAoaGFzX2Vycm9yKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmVycm9yKCkpOworICAgIH0KKyAgICAKKyAgfQorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlIGZpbGUgPSAxNTsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZmlsZV9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmlsZV9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+ZmlsZShpKSk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6TWVyZ2VGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBmaWxlXy5NZXJnZUZyb20oZnJvbS5maWxlXyk7CisgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfZXJyb3IoKSkgeworICAgICAgc2V0X2Vycm9yKGZyb20uZXJyb3IoKSk7CisgICAgfQorICB9CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Q29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OlN3YXAoQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHN0ZDo6c3dhcChlcnJvcl8sIG90aGVyLT5lcnJvcl8pOworICAgIGZpbGVfLlN3YXAoJm90aGVyLT5maWxlXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDI0NmZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmgKQEAgLTAsMCArMSw3OTEgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KKworI2lmbmRlZiBQUk9UT0JVRl9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fX0lOQ0xVREVECisjZGVmaW5lIFBST1RPQlVGX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90b19fSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2lmIEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDwgMjAwNDAwMAorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlIHVwZGF0ZQorI2Vycm9yIHlvdXIgaGVhZGVycy4KKyNlbmRpZgorI2lmIDIwMDQwMDIgPCBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlCisjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oIgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCisvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuCit2b2lkIExJQlBST1RPQ19FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKK3ZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKK3ZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworCitjbGFzcyBDb2RlR2VuZXJhdG9yUmVxdWVzdDsKK2NsYXNzIENvZGVHZW5lcmF0b3JSZXNwb25zZTsKK2NsYXNzIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIExJQlBST1RPQ19FWFBPUlQgQ29kZUdlbmVyYXRvclJlcXVlc3QgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0KCk7CisgIHZpcnR1YWwgfkNvZGVHZW5lcmF0b3JSZXF1ZXN0KCk7CisgIAorICBDb2RlR2VuZXJhdG9yUmVxdWVzdChjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZnJvbSk7CisgIAorICBpbmxpbmUgQ29kZUdlbmVyYXRvclJlcXVlc3QmIG9wZXJhdG9yPShjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgCisgIHZvaWQgU3dhcChDb2RlR2VuZXJhdG9yUmVxdWVzdCogb3RoZXIpOworICAKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKyAgCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOworICBpbmxpbmUgaW50IGZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9maWxlX3RvX2dlbmVyYXRlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0ZpbGVUb0dlbmVyYXRlRmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCk7CisgIGlubGluZSB2b2lkIHNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogYWRkX2ZpbGVfdG9fZ2VuZXJhdGUoKTsKKyAgaW5saW5lIHZvaWQgYWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBhZGRfZmlsZV90b19nZW5lcmF0ZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIGFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JiBmaWxlX3RvX2dlbmVyYXRlKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KiBtdXRhYmxlX2ZpbGVfdG9fZ2VuZXJhdGUoKTsKKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOworICBpbmxpbmUgYm9vbCBoYXNfcGFyYW1ldGVyKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3BhcmFtZXRlcigpOworICBzdGF0aWMgY29uc3QgaW50IGtQYXJhbWV0ZXJGaWVsZE51bWJlciA9IDI7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X3BhcmFtZXRlcihjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9wYXJhbWV0ZXIoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfcGFyYW1ldGVyKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3BhcmFtZXRlcigpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9wYXJhbWV0ZXIoKTsKKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7CisgIGlubGluZSBpbnQgcHJvdG9fZmlsZV9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3Byb3RvX2ZpbGUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrUHJvdG9GaWxlRmllbGROdW1iZXIgPSAxNTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG9fZmlsZShpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX3Byb3RvX2ZpbGUoaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogYWRkX3Byb3RvX2ZpbGUoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4mCisgICAgICBwcm90b19maWxlKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9wcm90b19maWxlKCk7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfcGFyYW1ldGVyKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19wYXJhbWV0ZXIoKTsKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+IGZpbGVfdG9fZ2VuZXJhdGVfOworICA6OnN0ZDo6c3RyaW5nKiBwYXJhbWV0ZXJfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+IHByb3RvX2ZpbGVfOworICAKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMyArIDMxKSAvIDMyXTsKKyAgCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQ19FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICAKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQ19FWFBPUlQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKCk7CisgIHZpcnR1YWwgfkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKCk7CisgIAorICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZnJvbSk7CisgIAorICBpbmxpbmUgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIG9wZXJhdG9yPShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgCisgIHZvaWQgU3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogb3RoZXIpOworICAKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKyAgCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpbmxpbmUgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9uYW1lKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga05hbWVGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnNlcnRpb25fcG9pbnQgPSAyOworICBpbmxpbmUgYm9vbCBoYXNfaW5zZXJ0aW9uX3BvaW50KCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2luc2VydGlvbl9wb2ludCgpOworICBzdGF0aWMgY29uc3QgaW50IGtJbnNlcnRpb25Qb2ludEZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGluc2VydGlvbl9wb2ludCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2luc2VydGlvbl9wb2ludChjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfaW5zZXJ0aW9uX3BvaW50KCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2luc2VydGlvbl9wb2ludCgpOworICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGNvbnRlbnQgPSAxNTsKKyAgaW5saW5lIGJvb2wgaGFzX2NvbnRlbnQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfY29udGVudCgpOworICBzdGF0aWMgY29uc3QgaW50IGtDb250ZW50RmllbGROdW1iZXIgPSAxNTsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGNvbnRlbnQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2NvbnRlbnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfY29udGVudChjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9jb250ZW50KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2NvbnRlbnQoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfY29udGVudCgpOworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX25hbWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX25hbWUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19pbnNlcnRpb25fcG9pbnQoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2luc2VydGlvbl9wb2ludCgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2NvbnRlbnQoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2NvbnRlbnQoKTsKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisgIAorICA6OnN0ZDo6c3RyaW5nKiBuYW1lXzsKKyAgOjpzdGQ6OnN0cmluZyogaW5zZXJ0aW9uX3BvaW50XzsKKyAgOjpzdGQ6OnN0cmluZyogY29udGVudF87CisgIAorICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOworICAKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9DX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCk7CisgIAorICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTElCUFJPVE9DX0VYUE9SVCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZSgpOworICB2aXJ0dWFsIH5Db2RlR2VuZXJhdG9yUmVzcG9uc2UoKTsKKyAgCisgIENvZGVHZW5lcmF0b3JSZXNwb25zZShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pOworICAKKyAgaW5saW5lIENvZGVHZW5lcmF0b3JSZXNwb25zZSYgb3BlcmF0b3I9KGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBkZWZhdWx0X2luc3RhbmNlKCk7CisgIAorICB2b2lkIFN3YXAoQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBvdGhlcik7CisgIAorICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisgIAorICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworICAKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIHR5cGVkZWYgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgRmlsZTsKKyAgCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOworICBpbmxpbmUgYm9vbCBoYXNfZXJyb3IoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfZXJyb3IoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRXJyb3JGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBlcnJvcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfZXJyb3IoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZXJyb3IoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZXJyb3IoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZXJyb3IoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfZXJyb3IoKTsKKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUgZmlsZSA9IDE1OworICBpbmxpbmUgaW50IGZpbGVfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9maWxlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0ZpbGVGaWVsZE51bWJlciA9IDE1OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZpbGUoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBtdXRhYmxlX2ZpbGUoaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBhZGRfZmlsZSgpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+JgorICAgICAgZmlsZSgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+KgorICAgICAgbXV0YWJsZV9maWxlKCk7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX2Vycm9yKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19lcnJvcigpOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKyAgCisgIDo6c3RkOjpzdHJpbmcqIGVycm9yXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+IGZpbGVfOworICAKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMiArIDMxKSAvIDMyXTsKKyAgCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQ19FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOworICAKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIENvZGVHZW5lcmF0b3JSZXNwb25zZSogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQ29kZUdlbmVyYXRvclJlcXVlc3QKKworLy8gcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOworaW5saW5lIGludCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZmlsZV90b19nZW5lcmF0ZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gZmlsZV90b19nZW5lcmF0ZV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmNsZWFyX2ZpbGVfdG9fZ2VuZXJhdGUoKSB7CisgIGZpbGVfdG9fZ2VuZXJhdGVfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjptdXRhYmxlX2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4KSB7CisgIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGZpbGVfdG9fZ2VuZXJhdGVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgZmlsZV90b19nZW5lcmF0ZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgZmlsZV90b19nZW5lcmF0ZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbigKKyAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjphZGRfZmlsZV90b19nZW5lcmF0ZSgpIHsKKyAgcmV0dXJuIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBmaWxlX3RvX2dlbmVyYXRlXy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYKK0NvZGVHZW5lcmF0b3JSZXF1ZXN0OjpmaWxlX3RvX2dlbmVyYXRlKCkgY29uc3QgeworICByZXR1cm4gZmlsZV90b19nZW5lcmF0ZV87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPioKK0NvZGVHZW5lcmF0b3JSZXF1ZXN0OjptdXRhYmxlX2ZpbGVfdG9fZ2VuZXJhdGUoKSB7CisgIHJldHVybiAmZmlsZV90b19nZW5lcmF0ZV87Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOworaW5saW5lIGJvb2wgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Omhhc19wYXJhbWV0ZXIoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9oYXNfcGFyYW1ldGVyKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmNsZWFyX2hhc19wYXJhbWV0ZXIoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmNsZWFyX3BhcmFtZXRlcigpIHsKKyAgaWYgKHBhcmFtZXRlcl8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHBhcmFtZXRlcl8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX3BhcmFtZXRlcigpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpwYXJhbWV0ZXIoKSBjb25zdCB7CisgIHJldHVybiAqcGFyYW1ldGVyXzsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfcGFyYW1ldGVyKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfcGFyYW1ldGVyKCk7CisgIGlmIChwYXJhbWV0ZXJfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBwYXJhbWV0ZXJfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcGFyYW1ldGVyXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfcGFyYW1ldGVyKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfcGFyYW1ldGVyKCk7CisgIGlmIChwYXJhbWV0ZXJfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBwYXJhbWV0ZXJfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcGFyYW1ldGVyXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfcGFyYW1ldGVyKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX3BhcmFtZXRlcigpOworICBpZiAocGFyYW1ldGVyXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcGFyYW1ldGVyXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHBhcmFtZXRlcl8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjptdXRhYmxlX3BhcmFtZXRlcigpIHsKKyAgc2V0X2hhc19wYXJhbWV0ZXIoKTsKKyAgaWYgKHBhcmFtZXRlcl8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHBhcmFtZXRlcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gcGFyYW1ldGVyXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6cmVsZWFzZV9wYXJhbWV0ZXIoKSB7CisgIGNsZWFyX2hhc19wYXJhbWV0ZXIoKTsKKyAgaWYgKHBhcmFtZXRlcl8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBwYXJhbWV0ZXJfOworICAgIHBhcmFtZXRlcl8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIHByb3RvX2ZpbGUgPSAxNTsKK2lubGluZSBpbnQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnByb3RvX2ZpbGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHByb3RvX2ZpbGVfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpjbGVhcl9wcm90b19maWxlKCkgeworICBwcm90b19maWxlXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byYgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnByb3RvX2ZpbGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBwcm90b19maWxlXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfcHJvdG9fZmlsZShpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIHByb3RvX2ZpbGVfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9wcm90b19maWxlKCkgeworICByZXR1cm4gcHJvdG9fZmlsZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiYKK0NvZGVHZW5lcmF0b3JSZXF1ZXN0Ojpwcm90b19maWxlKCkgY29uc3QgeworICByZXR1cm4gcHJvdG9fZmlsZV87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPioKK0NvZGVHZW5lcmF0b3JSZXF1ZXN0OjptdXRhYmxlX3Byb3RvX2ZpbGUoKSB7CisgIHJldHVybiAmcHJvdG9fZmlsZV87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUKKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworaW5saW5lIGJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNsZWFyX25hbWUoKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpuYW1lXzsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjptdXRhYmxlX25hbWUoKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIG5hbWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpyZWxlYXNlX25hbWUoKSB7CisgIGNsZWFyX2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IG5hbWVfOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBpbnNlcnRpb25fcG9pbnQgPSAyOworaW5saW5lIGJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Omhhc19pbnNlcnRpb25fcG9pbnQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNsZWFyX2hhc19pbnNlcnRpb25fcG9pbnQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNsZWFyX2luc2VydGlvbl9wb2ludCgpIHsKKyAgaWYgKGluc2VydGlvbl9wb2ludF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGluc2VydGlvbl9wb2ludF8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX2luc2VydGlvbl9wb2ludCgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjppbnNlcnRpb25fcG9pbnQoKSBjb25zdCB7CisgIHJldHVybiAqaW5zZXJ0aW9uX3BvaW50XzsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7CisgIGlmIChpbnNlcnRpb25fcG9pbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBpbnNlcnRpb25fcG9pbnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgaW5zZXJ0aW9uX3BvaW50Xy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7CisgIGlmIChpbnNlcnRpb25fcG9pbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBpbnNlcnRpb25fcG9pbnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgaW5zZXJ0aW9uX3BvaW50Xy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpOworICBpZiAoaW5zZXJ0aW9uX3BvaW50XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgaW5zZXJ0aW9uX3BvaW50XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGluc2VydGlvbl9wb2ludF8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjptdXRhYmxlX2luc2VydGlvbl9wb2ludCgpIHsKKyAgc2V0X2hhc19pbnNlcnRpb25fcG9pbnQoKTsKKyAgaWYgKGluc2VydGlvbl9wb2ludF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGluc2VydGlvbl9wb2ludF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gaW5zZXJ0aW9uX3BvaW50XzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6cmVsZWFzZV9pbnNlcnRpb25fcG9pbnQoKSB7CisgIGNsZWFyX2hhc19pbnNlcnRpb25fcG9pbnQoKTsKKyAgaWYgKGluc2VydGlvbl9wb2ludF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBpbnNlcnRpb25fcG9pbnRfOworICAgIGluc2VydGlvbl9wb2ludF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGNvbnRlbnQgPSAxNTsKK2lubGluZSBib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpoYXNfY29udGVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2hhc19jb250ZW50KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNsZWFyX2hhc19jb250ZW50KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9jb250ZW50KCkgeworICBpZiAoY29udGVudF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGNvbnRlbnRfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19jb250ZW50KCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNvbnRlbnQoKSBjb25zdCB7CisgIHJldHVybiAqY29udGVudF87Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2NvbnRlbnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19jb250ZW50KCk7CisgIGlmIChjb250ZW50XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgY29udGVudF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBjb250ZW50Xy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfY29udGVudChjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2NvbnRlbnQoKTsKKyAgaWYgKGNvbnRlbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBjb250ZW50XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGNvbnRlbnRfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9jb250ZW50KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2NvbnRlbnQoKTsKKyAgaWYgKGNvbnRlbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBjb250ZW50XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGNvbnRlbnRfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bXV0YWJsZV9jb250ZW50KCkgeworICBzZXRfaGFzX2NvbnRlbnQoKTsKKyAgaWYgKGNvbnRlbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBjb250ZW50XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBjb250ZW50XzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6cmVsZWFzZV9jb250ZW50KCkgeworICBjbGVhcl9oYXNfY29udGVudCgpOworICBpZiAoY29udGVudF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBjb250ZW50XzsKKyAgICBjb250ZW50XyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIENvZGVHZW5lcmF0b3JSZXNwb25zZQorCisvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOworaW5saW5lIGJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpoYXNfZXJyb3IoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfaGFzX2Vycm9yKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpjbGVhcl9oYXNfZXJyb3IoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpjbGVhcl9lcnJvcigpIHsKKyAgaWYgKGVycm9yXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZXJyb3JfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19lcnJvcigpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZXJyb3IoKSBjb25zdCB7CisgIHJldHVybiAqZXJyb3JfOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfZXJyb3IoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19lcnJvcigpOworICBpZiAoZXJyb3JfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBlcnJvcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBlcnJvcl8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OnNldF9lcnJvcihjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2Vycm9yKCk7CisgIGlmIChlcnJvcl8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGVycm9yXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGVycm9yXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X2Vycm9yKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2Vycm9yKCk7CisgIGlmIChlcnJvcl8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGVycm9yXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGVycm9yXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjptdXRhYmxlX2Vycm9yKCkgeworICBzZXRfaGFzX2Vycm9yKCk7CisgIGlmIChlcnJvcl8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGVycm9yXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBlcnJvcl87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpyZWxlYXNlX2Vycm9yKCkgeworICBjbGVhcl9oYXNfZXJyb3IoKTsKKyAgaWYgKGVycm9yXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IGVycm9yXzsKKyAgICBlcnJvcl8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7CitpbmxpbmUgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZmlsZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gZmlsZV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpjbGVhcl9maWxlKCkgeworICBmaWxlXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmZpbGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBmaWxlXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Om11dGFibGVfZmlsZShpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGZpbGVfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmFkZF9maWxlKCkgeworICByZXR1cm4gZmlsZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+JgorQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpmaWxlKCkgY29uc3QgeworICByZXR1cm4gZmlsZV87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+KgorQ29kZUdlbmVyYXRvclJlc3BvbnNlOjptdXRhYmxlX2ZpbGUoKSB7CisgIHJldHVybiAmZmlsZV87Cit9CisKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2lmbmRlZiBTV0lHCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisjZW5kaWYgIC8vIFNXSUcKKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKKworI2VuZGlmICAvLyBQUk9UT0JVRl9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fX0lOQ0xVREVECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxZWQxMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90bwpAQCAtMCwwICsxLDE0NSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFdBUk5JTkc6ICBUaGUgcGx1Z2luIGludGVyZmFjZSBpcyBjdXJyZW50bHkgRVhQRVJJTUVOVEFMIGFuZCBpcyBzdWJqZWN0IHRvCisvLyAgIGNoYW5nZS4KKy8vCisvLyBwcm90b2MgKGFrYSB0aGUgUHJvdG9jb2wgQ29tcGlsZXIpIGNhbiBiZSBleHRlbmRlZCB2aWEgcGx1Z2lucy4gIEEgcGx1Z2luIGlzCisvLyBqdXN0IGEgcHJvZ3JhbSB0aGF0IHJlYWRzIGEgQ29kZUdlbmVyYXRvclJlcXVlc3QgZnJvbSBzdGRpbiBhbmQgd3JpdGVzIGEKKy8vIENvZGVHZW5lcmF0b3JSZXNwb25zZSB0byBzdGRvdXQuCisvLworLy8gUGx1Z2lucyB3cml0dGVuIHVzaW5nIEMrKyBjYW4gdXNlIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uaCBpbnN0ZWFkCisvLyBvZiBkZWFsaW5nIHdpdGggdGhlIHJhdyBwcm90b2NvbCBkZWZpbmVkIGhlcmUuCisvLworLy8gQSBwbHVnaW4gZXhlY3V0YWJsZSBuZWVkcyBvbmx5IHRvIGJlIHBsYWNlZCBzb21ld2hlcmUgaW4gdGhlIHBhdGguICBUaGUKKy8vIHBsdWdpbiBzaG91bGQgYmUgbmFtZWQgInByb3RvYy1nZW4tJE5BTUUiLCBhbmQgd2lsbCB0aGVuIGJlIHVzZWQgd2hlbiB0aGUKKy8vIGZsYWcgIi0tJHtOQU1FfV9vdXQiIGlzIHBhc3NlZCB0byBwcm90b2MuCisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyOworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKKworLy8gQW4gZW5jb2RlZCBDb2RlR2VuZXJhdG9yUmVxdWVzdCBpcyB3cml0dGVuIHRvIHRoZSBwbHVnaW4ncyBzdGRpbi4KK21lc3NhZ2UgQ29kZUdlbmVyYXRvclJlcXVlc3QgeworICAvLyBUaGUgLnByb3RvIGZpbGVzIHRoYXQgd2VyZSBleHBsaWNpdGx5IGxpc3RlZCBvbiB0aGUgY29tbWFuZC1saW5lLiAgVGhlCisgIC8vIGNvZGUgZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSBjb2RlIG9ubHkgZm9yIHRoZXNlIGZpbGVzLiAgRWFjaCBmaWxlJ3MKKyAgLy8gZGVzY3JpcHRvciB3aWxsIGJlIGluY2x1ZGVkIGluIHByb3RvX2ZpbGUsIGJlbG93LgorICByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7CisKKyAgLy8gVGhlIGdlbmVyYXRvciBwYXJhbWV0ZXIgcGFzc2VkIG9uIHRoZSBjb21tYW5kLWxpbmUuCisgIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOworCisgIC8vIEZpbGVEZXNjcmlwdG9yUHJvdG9zIGZvciBhbGwgZmlsZXMgaW4gZmlsZXNfdG9fZ2VuZXJhdGUgYW5kIGV2ZXJ5dGhpbmcKKyAgLy8gdGhleSBpbXBvcnQuICBUaGUgZmlsZXMgd2lsbCBhcHBlYXIgaW4gdG9wb2xvZ2ljYWwgb3JkZXIsIHNvIGVhY2ggZmlsZQorICAvLyBhcHBlYXJzIGJlZm9yZSBhbnkgZmlsZSB0aGF0IGltcG9ydHMgaXQuCisgIC8vCisgIC8vIHByb3RvYyBndWFyYW50ZWVzIHRoYXQgYWxsIHByb3RvX2ZpbGVzIHdpbGwgYmUgd3JpdHRlbiBhZnRlcgorICAvLyB0aGUgZmllbGRzIGFib3ZlLCBldmVuIHRob3VnaCB0aGlzIGlzIG5vdCB0ZWNobmljYWxseSBndWFyYW50ZWVkIGJ5IHRoZQorICAvLyBwcm90b2J1ZiB3aXJlIGZvcm1hdC4gIFRoaXMgdGhlb3JldGljYWxseSBjb3VsZCBhbGxvdyBhIHBsdWdpbiB0byBzdHJlYW0KKyAgLy8gaW4gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG9zIGFuZCBoYW5kbGUgdGhlbSBvbmUgYnkgb25lIHJhdGhlciB0aGFuIHJlYWQKKyAgLy8gdGhlIGVudGlyZSBzZXQgaW50byBtZW1vcnkgYXQgb25jZS4gIEhvd2V2ZXIsIGFzIG9mIHRoaXMgd3JpdGluZywgdGhpcworICAvLyBpcyBub3Qgc2ltaWxhcmx5IG9wdGltaXplZCBvbiBwcm90b2MncyBlbmQgLS0gaXQgd2lsbCBzdG9yZSBhbGwgZmllbGRzIGluCisgIC8vIG1lbW9yeSBhdCBvbmNlIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8gdGhlIHBsdWdpbi4KKyAgcmVwZWF0ZWQgRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7Cit9CisKKy8vIFRoZSBwbHVnaW4gd3JpdGVzIGFuIGVuY29kZWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlIHRvIHN0ZG91dC4KK21lc3NhZ2UgQ29kZUdlbmVyYXRvclJlc3BvbnNlIHsKKyAgLy8gRXJyb3IgbWVzc2FnZS4gIElmIG5vbi1lbXB0eSwgY29kZSBnZW5lcmF0aW9uIGZhaWxlZC4gIFRoZSBwbHVnaW4gcHJvY2VzcworICAvLyBzaG91bGQgZXhpdCB3aXRoIHN0YXR1cyBjb2RlIHplcm8gZXZlbiBpZiBpdCByZXBvcnRzIGFuIGVycm9yIGluIHRoaXMgd2F5LgorICAvLworICAvLyBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGluZGljYXRlIGVycm9ycyBpbiAucHJvdG8gZmlsZXMgd2hpY2ggcHJldmVudCB0aGUKKyAgLy8gY29kZSBnZW5lcmF0b3IgZnJvbSBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZS4gIEVycm9ycyB3aGljaCBpbmRpY2F0ZSBhCisgIC8vIHByb2JsZW0gaW4gcHJvdG9jIGl0c2VsZiAtLSBzdWNoIGFzIHRoZSBpbnB1dCBDb2RlR2VuZXJhdG9yUmVxdWVzdCBiZWluZworICAvLyB1bnBhcnNlYWJsZSAtLSBzaG91bGQgYmUgcmVwb3J0ZWQgYnkgd3JpdGluZyBhIG1lc3NhZ2UgdG8gc3RkZXJyIGFuZAorICAvLyBleGl0aW5nIHdpdGggYSBub24temVybyBzdGF0dXMgY29kZS4KKyAgb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKKworICAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIGdlbmVyYXRlZCBmaWxlLgorICBtZXNzYWdlIEZpbGUgeworICAgIC8vIFRoZSBmaWxlIG5hbWUsIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiAgVGhlIG5hbWUgbXVzdCBub3QKKyAgICAvLyBjb250YWluICIuIiBvciAiLi4iIGNvbXBvbmVudHMgYW5kIG11c3QgYmUgcmVsYXRpdmUsIG5vdCBiZSBhYnNvbHV0ZSAoc28sCisgICAgLy8gdGhlIGZpbGUgY2Fubm90IGxpZSBvdXRzaWRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5KS4gICIvIiBtdXN0IGJlIHVzZWQgYXMKKyAgICAvLyB0aGUgcGF0aCBzZXBhcmF0b3IsIG5vdCAiXCIuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgbmFtZSBpcyBvbWl0dGVkLCB0aGUgY29udGVudCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBwcmV2aW91cworICAgIC8vIGZpbGUuICBUaGlzIGFsbG93cyB0aGUgZ2VuZXJhdG9yIHRvIGJyZWFrIGxhcmdlIGZpbGVzIGludG8gc21hbGwgY2h1bmtzLAorICAgIC8vIGFuZCBhbGxvd3MgdGhlIGdlbmVyYXRlZCB0ZXh0IHRvIGJlIHN0cmVhbWVkIGJhY2sgdG8gcHJvdG9jIHNvIHRoYXQgbGFyZ2UKKyAgICAvLyBmaWxlcyBuZWVkIG5vdCByZXNpZGUgY29tcGxldGVseSBpbiBtZW1vcnkgYXQgb25lIHRpbWUuICBOb3RlIHRoYXQgYXMgb2YKKyAgICAvLyB0aGlzIHdyaXRpbmcgcHJvdG9jIGRvZXMgbm90IG9wdGltaXplIGZvciB0aGlzIC0tIGl0IHdpbGwgcmVhZCB0aGUgZW50aXJlCisgICAgLy8gQ29kZUdlbmVyYXRvclJlc3BvbnNlIGJlZm9yZSB3cml0aW5nIGZpbGVzIHRvIGRpc2suCisgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworCisgICAgLy8gSWYgbm9uLWVtcHR5LCBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZWQgZmlsZSBzaG91bGQgYWxyZWFkeSBleGlzdCwgYW5kIHRoZQorICAgIC8vIGNvbnRlbnQgaGVyZSBpcyB0byBiZSBpbnNlcnRlZCBpbnRvIHRoYXQgZmlsZSBhdCBhIGRlZmluZWQgaW5zZXJ0aW9uCisgICAgLy8gcG9pbnQuICBUaGlzIGZlYXR1cmUgYWxsb3dzIGEgY29kZSBnZW5lcmF0b3IgdG8gZXh0ZW5kIHRoZSBvdXRwdXQKKyAgICAvLyBwcm9kdWNlZCBieSBhbm90aGVyIGNvZGUgZ2VuZXJhdG9yLiAgVGhlIG9yaWdpbmFsIGdlbmVyYXRvciBtYXkgcHJvdmlkZQorICAgIC8vIGluc2VydGlvbiBwb2ludHMgYnkgcGxhY2luZyBzcGVjaWFsIGFubm90YXRpb25zIGluIHRoZSBmaWxlIHRoYXQgbG9vaworICAgIC8vIGxpa2U6CisgICAgLy8gICBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoTkFNRSkKKyAgICAvLyBUaGUgYW5ub3RhdGlvbiBjYW4gaGF2ZSBhcmJpdHJhcnkgdGV4dCBiZWZvcmUgYW5kIGFmdGVyIGl0IG9uIHRoZSBsaW5lLAorICAgIC8vIHdoaWNoIGFsbG93cyBpdCB0byBiZSBwbGFjZWQgaW4gYSBjb21tZW50LiAgTkFNRSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aAorICAgIC8vIGFuIGlkZW50aWZpZXIgbmFtaW5nIHRoZSBwb2ludCAtLSB0aGlzIGlzIHdoYXQgb3RoZXIgZ2VuZXJhdG9ycyB3aWxsIHVzZQorICAgIC8vIGFzIHRoZSBpbnNlcnRpb25fcG9pbnQuICBDb2RlIGluc2VydGVkIGF0IHRoaXMgcG9pbnQgd2lsbCBiZSBwbGFjZWQKKyAgICAvLyBpbW1lZGlhdGVseSBhYm92ZSB0aGUgbGluZSBjb250YWluaW5nIHRoZSBpbnNlcnRpb24gcG9pbnQgKHRodXMgbXVsdGlwbGUKKyAgICAvLyBpbnNlcnRpb25zIHRvIHRoZSBzYW1lIHBvaW50IHdpbGwgY29tZSBvdXQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZCkuCisgICAgLy8gVGhlIGRvdWJsZS1AIGlzIGludGVuZGVkIHRvIG1ha2UgaXQgdW5saWtlbHkgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUKKyAgICAvLyBjb3VsZCBjb250YWluIHRoaW5ncyB0aGF0IGxvb2sgbGlrZSBpbnNlcnRpb24gcG9pbnRzIGJ5IGFjY2lkZW50LgorICAgIC8vCisgICAgLy8gRm9yIGV4YW1wbGUsIHRoZSBDKysgY29kZSBnZW5lcmF0b3IgcGxhY2VzIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB0aGUKKyAgICAvLyAucGIuaCBmaWxlcyB0aGF0IGl0IGdlbmVyYXRlczoKKyAgICAvLyAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisgICAgLy8gVGhpcyBsaW5lIGFwcGVhcnMgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgZmlsZSdzIHBhY2thZ2UgbmFtZXNwYWNlLCBidXQKKyAgICAvLyBvdXRzaWRlIG9mIGFueSBwYXJ0aWN1bGFyIGNsYXNzLiAgQW5vdGhlciBwbHVnaW4gY2FuIHRoZW4gc3BlY2lmeSB0aGUKKyAgICAvLyBpbnNlcnRpb25fcG9pbnQgIm5hbWVzcGFjZV9zY29wZSIgdG8gZ2VuZXJhdGUgYWRkaXRpb25hbCBjbGFzc2VzIG9yCisgICAgLy8gb3RoZXIgZGVjbGFyYXRpb25zIHRoYXQgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGlzIHNjb3BlLgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IGlmIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGluc2VydGlvbiBwb2ludCBiZWdpbnMgd2l0aAorICAgIC8vIHdoaXRlc3BhY2UsIHRoZSBzYW1lIHdoaXRlc3BhY2Ugd2lsbCBiZSBhZGRlZCB0byBldmVyeSBsaW5lIG9mIHRoZQorICAgIC8vIGluc2VydGVkIHRleHQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgbGFuZ3VhZ2VzIGxpa2UgUHl0aG9uLCB3aGVyZQorICAgIC8vIGluZGVudGF0aW9uIG1hdHRlcnMuICBJbiB0aGVzZSBsYW5ndWFnZXMsIHRoZSBpbnNlcnRpb24gcG9pbnQgY29tbWVudAorICAgIC8vIHNob3VsZCBiZSBpbmRlbnRlZCB0aGUgc2FtZSBhbW91bnQgYXMgYW55IGluc2VydGVkIGNvZGUgd2lsbCBuZWVkIHRvIGJlCisgICAgLy8gaW4gb3JkZXIgdG8gd29yayBjb3JyZWN0bHkgaW4gdGhhdCBjb250ZXh0LgorICAgIC8vCisgICAgLy8gVGhlIGNvZGUgZ2VuZXJhdG9yIHRoYXQgZ2VuZXJhdGVzIHRoZSBpbml0aWFsIGZpbGUgYW5kIHRoZSBvbmUgd2hpY2gKKyAgICAvLyBpbnNlcnRzIGludG8gaXQgbXVzdCBib3RoIHJ1biBhcyBwYXJ0IG9mIGEgc2luZ2xlIGludm9jYXRpb24gb2YgcHJvdG9jLgorICAgIC8vIENvZGUgZ2VuZXJhdG9ycyBhcmUgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIG9uIHRoZQorICAgIC8vIGNvbW1hbmQgbGluZS4KKyAgICAvLworICAgIC8vIElmIHxpbnNlcnRpb25fcG9pbnR8IGlzIHByZXNlbnQsIHxuYW1lfCBtdXN0IGFsc28gYmUgcHJlc2VudC4KKyAgICBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKKworICAgIC8vIFRoZSBmaWxlIGNvbnRlbnRzLgorICAgIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7CisgIH0KKyAgcmVwZWF0ZWQgRmlsZSBmaWxlID0gMTU7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTA5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDEwMDYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogcm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbikKKy8vCisvLyBUaGlzIG1vZHVsZSBvdXRwdXRzIHB1cmUtUHl0aG9uIHByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyB0aGF0IHdpbGwKKy8vIGxhcmdlbHkgYmUgY29uc3RydWN0ZWQgYXQgcnVudGltZSB2aWEgdGhlIG1ldGFjbGFzcyBpbiByZWZsZWN0aW9uLnB5LgorLy8gSW4gb3RoZXIgd29yZHMsIG91ciBqb2IgaXMgYmFzaWNhbGx5IHRvIG91dHB1dCBhIFB5dGhvbiBlcXVpdmFsZW50CisvLyBvZiB0aGUgQysrICpEZXNjcmlwdG9yIG9iamVjdHMsIGFuZCBmaXggdXAgYWxsIGNpcmN1bGFyIHJlZmVyZW5jZXMKKy8vIHdpdGhpbiB0aGVzZSBvYmplY3RzLgorLy8KKy8vIE5vdGUgdGhhdCB0aGUgcnVudGltZSBwZXJmb3JtYW5jZSBvZiBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgY3JlYXRlZCBpbgorLy8gdGhpcyB3YXkgaXMgZXhwZWN0ZWQgdG8gYmUgbG91c3kuICBUaGUgcGxhbiBpcyB0byBjcmVhdGUgYW4gYWx0ZXJuYXRlCisvLyBnZW5lcmF0b3IgdGhhdCBvdXRwdXRzIGEgUHl0aG9uL0MgZXh0ZW5zaW9uIG1vZHVsZSB0aGF0IGxldHMKKy8vIHBlcmZvcm1hbmNlLW1pbmRlZCBQeXRob24gY29kZSBsZXZlcmFnZSB0aGUgZmFzdCBDKysgaW1wbGVtZW50YXRpb24KKy8vIGRpcmVjdGx5LgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBweXRob24geworCituYW1lc3BhY2UgeworCisvLyBSZXR1cm5zIGEgY29weSBvZiB8ZmlsZW5hbWV8IHdpdGggYW55IHRyYWlsaW5nICIucHJvdG9kZXZlbCIgb3IgIi5wcm90bworLy8gc3VmZml4IHN0cmlwcGVkLgorLy8gVE9ETyhyb2JpbnNvbik6IFVuaWZ5IHdpdGggY29weSBpbiBjb21waWxlci9jcHAvaW50ZXJuYWwvaGVscGVycy5jYy4KK3N0cmluZyBTdHJpcFByb3RvKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgY29uc3QgY2hhciogc3VmZml4ID0gSGFzU3VmZml4U3RyaW5nKGZpbGVuYW1lLCAiLnByb3RvZGV2ZWwiKQorICAgICAgPyAiLnByb3RvZGV2ZWwiIDogIi5wcm90byI7CisgIHJldHVybiBTdHJpcFN1ZmZpeFN0cmluZyhmaWxlbmFtZSwgc3VmZml4KTsKK30KKworCisvLyBSZXR1cm5zIHRoZSBQeXRob24gbW9kdWxlIG5hbWUgZXhwZWN0ZWQgZm9yIGEgZ2l2ZW4gLnByb3RvIGZpbGVuYW1lLgorc3RyaW5nIE1vZHVsZU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICBzdHJpbmcgYmFzZW5hbWUgPSBTdHJpcFByb3RvKGZpbGVuYW1lKTsKKyAgU3RyaXBTdHJpbmcoJmJhc2VuYW1lLCAiLSIsICdfJyk7CisgIFN0cmlwU3RyaW5nKCZiYXNlbmFtZSwgIi8iLCAnLicpOworICByZXR1cm4gYmFzZW5hbWUgKyAiX3BiMiI7Cit9CisKKworLy8gUmV0dXJucyB0aGUgbmFtZSBvZiBhbGwgY29udGFpbmluZyB0eXBlcyBmb3IgZGVzY3JpcHRvciwKKy8vIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdCwgZm9sbG93ZWQgYnkgZGVzY3JpcHRvcidzCisvLyBvd24gbmFtZS4gIEVhY2ggbmFtZSBpcyBzZXBhcmF0ZWQgYnkgfHNlcGFyYXRvcnwuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQ+CitzdHJpbmcgTmFtZVByZWZpeGVkV2l0aE5lc3RlZFR5cGVzKGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHNlcGFyYXRvcikgeworICBzdHJpbmcgbmFtZSA9IGRlc2NyaXB0b3IubmFtZSgpOworICBmb3IgKGNvbnN0IERlc2NyaXB0b3IqIGN1cnJlbnQgPSBkZXNjcmlwdG9yLmNvbnRhaW5pbmdfdHlwZSgpOworICAgICAgIGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPmNvbnRhaW5pbmdfdHlwZSgpKSB7CisgICAgbmFtZSA9IGN1cnJlbnQtPm5hbWUoKSArIHNlcGFyYXRvciArIG5hbWU7CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKKworLy8gTmFtZSBvZiB0aGUgY2xhc3MgYXR0cmlidXRlIHdoZXJlIHdlIHN0b3JlIHRoZSBQeXRob24KKy8vIGRlc2NyaXB0b3IuRGVzY3JpcHRvciBpbnN0YW5jZSBmb3IgdGhlIGdlbmVyYXRlZCBjbGFzcy4KKy8vIE11c3Qgc3RheSBjb25zaXN0ZW50IHdpdGggdGhlIF9ERVNDUklQVE9SX0tFWSBjb25zdGFudAorLy8gaW4gcHJvdG8yL3B1YmxpYy9yZWZsZWN0aW9uLnB5LgorY29uc3QgY2hhciBrRGVzY3JpcHRvcktleVtdID0gIkRFU0NSSVBUT1IiOworCisKKy8vIFNob3VsZCB3ZSBnZW5lcmF0ZSBnZW5lcmljIHNlcnZpY2VzIGZvciB0aGlzIGZpbGU/CitpbmxpbmUgYm9vbCBIYXNHZW5lcmljU2VydmljZXMoY29uc3QgRmlsZURlc2NyaXB0b3IgKmZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPnNlcnZpY2VfY291bnQoKSA+IDAgJiYKKyAgICAgICAgIGZpbGUtPm9wdGlvbnMoKS5weV9nZW5lcmljX3NlcnZpY2VzKCk7Cit9CisKKworLy8gUHJpbnRzIHRoZSBjb21tb24gYm9pbGVycGxhdGUgbmVlZGVkIGF0IHRoZSB0b3Agb2YgZXZlcnkgLnB5CisvLyBmaWxlIG91dHB1dCBieSB0aGlzIGdlbmVyYXRvci4KK3ZvaWQgUHJpbnRUb3BCb2lsZXJwbGF0ZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGJvb2wgZGVzY3JpcHRvcl9wcm90bykgeworICAvLyBUT0RPKHJvYmluc29uKTogQWxsb3cgcGFyYW1ldGVyaXphdGlvbiBvZiBQeXRob24gdmVyc2lvbj8KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIVxuIgorICAgICAgIlxuIgorICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yXG4iCisgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2VcbiIKKyAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvblxuIik7CisgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZSkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzZXJ2aWNlXG4iCisgICAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc2VydmljZV9yZWZsZWN0aW9uXG4iKTsKKyAgfQorCisgIC8vIEF2b2lkIGNpcmN1bGFyIGltcG9ydHMgaWYgdGhpcyBtb2R1bGUgaXMgZGVzY3JpcHRvcl9wYjIuCisgIGlmICghZGVzY3JpcHRvcl9wcm90bykgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyXG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICAiIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cylcbiIpOworICBwcmludGVyLT5QcmludCgiXG5cbiIpOworfQorCisKKy8vIFJldHVybnMgYSBQeXRob24gbGl0ZXJhbCBnaXZpbmcgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgZmllbGQuCisvLyBJZiB0aGUgZmllbGQgc3BlY2lmaWVzIG5vIGV4cGxpY2l0IGRlZmF1bHQgdmFsdWUsIHdlJ2xsIHJldHVybgorLy8gdGhlIGRlZmF1bHQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZpZWxkIHR5cGUgKHplcm8gZm9yIG51bWJlcnMsCisvLyBlbXB0eSBzdHJpbmcgZm9yIHN0cmluZ3MsIGVtcHR5IGxpc3QgZm9yIHJlcGVhdGVkIGZpZWxkcywgYW5kCisvLyBOb25lIGZvciBub24tcmVwZWF0ZWQsIGNvbXBvc2l0ZSBmaWVsZHMpLgorLy8KKy8vIFRPRE8ocm9iaW5zb24pOiBVbmlmeSB3aXRoIGNvZGUgZnJvbQorLy8gLy9jb21waWxlci9jcHAvaW50ZXJuYWwvcHJpbWl0aXZlX2ZpZWxkLmNjCisvLyAvL2NvbXBpbGVyL2NwcC9pbnRlcm5hbC9lbnVtX2ZpZWxkLmNjCisvLyAvL2NvbXBpbGVyL2NwcC9pbnRlcm5hbC9zdHJpbmdfZmllbGQuY2MKK3N0cmluZyBTdHJpbmdpZnlEZWZhdWx0VmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCkgeworICBpZiAoZmllbGQuaXNfcmVwZWF0ZWQoKSkgeworICAgIHJldHVybiAiW10iOworICB9CisKKyAgc3dpdGNoIChmaWVsZC5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gU2ltcGxlSXRvYShmaWVsZC5kZWZhdWx0X3ZhbHVlX2ludDMyKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgIHJldHVybiBTaW1wbGVJdG9hKGZpZWxkLmRlZmF1bHRfdmFsdWVfdWludDMyKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZmllbGQuZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gU2ltcGxlSXRvYShmaWVsZC5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKKyAgICAgIGRvdWJsZSB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRfdmFsdWVfZG91YmxlKCk7CisgICAgICBpZiAodmFsdWUgPT0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgeworICAgICAgICAvLyBQeXRob24gcHJlLTIuNiBvbiBXaW5kb3dzIGRvZXMgbm90IHBhcnNlICJpbmYiIGNvcnJlY3RseS4gIEhvd2V2ZXIsCisgICAgICAgIC8vIGEgbnVtZXJpYyBsaXRlcmFsIHRoYXQgaXMgdG9vIGJpZyBmb3IgYSBkb3VibGUgd2lsbCBiZWNvbWUgaW5maW5pdHkuCisgICAgICAgIHJldHVybiAiMWUxMDAwMCI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgICAgIC8vIFNlZSBhYm92ZS4KKyAgICAgICAgcmV0dXJuICItMWUxMDAwMCI7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgIC8vIGluZmluaXR5ICogMCA9IG5hbgorICAgICAgICByZXR1cm4gIigxZTEwMDAwICogMCkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFNpbXBsZUR0b2EodmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDogeworICAgICAgZmxvYXQgdmFsdWUgPSBmaWVsZC5kZWZhdWx0X3ZhbHVlX2Zsb2F0KCk7CisgICAgICBpZiAodmFsdWUgPT0gbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7CisgICAgICAgIC8vIFB5dGhvbiBwcmUtMi42IG9uIFdpbmRvd3MgZG9lcyBub3QgcGFyc2UgImluZiIgY29ycmVjdGx5LiAgSG93ZXZlciwKKyAgICAgICAgLy8gYSBudW1lcmljIGxpdGVyYWwgdGhhdCBpcyB0b28gYmlnIGZvciBhIGRvdWJsZSB3aWxsIGJlY29tZSBpbmZpbml0eS4KKyAgICAgICAgcmV0dXJuICIxZTEwMDAwIjsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gLW51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSkgeworICAgICAgICAvLyBTZWUgYWJvdmUuCisgICAgICAgIHJldHVybiAiLTFlMTAwMDAiOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB2YWx1ZSkgeworICAgICAgICAvLyBpbmZpbml0eSAtIGluZmluaXR5ID0gbmFuCisgICAgICAgIHJldHVybiAiKDFlMTAwMDAgKiAwKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU2ltcGxlRnRvYSh2YWx1ZSk7CisgICAgICB9CisgICAgfQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gZmllbGQuZGVmYXVsdF92YWx1ZV9ib29sKCkgPyAiVHJ1ZSIgOiAiRmFsc2UiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gU2ltcGxlSXRvYShmaWVsZC5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bnVtYmVyKCkpOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgIGlmIChmaWVsZC50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgICAgICByZXR1cm4gInVuaWNvZGUoXCIiICsgQ0VzY2FwZShmaWVsZC5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSArCisgICAgICAgICAgICAiXCIsIFwidXRmLThcIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJcIiIgKyBDRXNjYXBlKGZpZWxkLmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpICsgIlwiIjsKKyAgICAgIH0KKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuICJOb25lIjsKKyAgfQorICAvLyAoV2UgY291bGQgYWRkIGEgZGVmYXVsdCBjYXNlIGFib3ZlIGJ1dCB0aGVuIHdlIHdvdWxkbid0IGdldCB0aGUgbmljZQorICAvLyBjb21waWxlciB3YXJuaW5nIHdoZW4gYSBuZXcgdHlwZSBpcyBhZGRlZC4pCisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJOb3QgcmVhY2hlZC4iOworICByZXR1cm4gIiI7Cit9CisKKworCit9ICAvLyBuYW1lc3BhY2UKKworCitHZW5lcmF0b3I6OkdlbmVyYXRvcigpIDogZmlsZV8oTlVMTCkgeworfQorCitHZW5lcmF0b3I6On5HZW5lcmF0b3IoKSB7Cit9CisKK2Jvb2wgR2VuZXJhdG9yOjpHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIGNvbnN0IHsKKworICAvLyBDb21wbGV0ZWx5IHNlcmlhbGl6ZSBhbGwgR2VuZXJhdGUoKSBjYWxscyBvbiB0aGlzIGluc3RhbmNlLiAgVGhlCisgIC8vIHRocmVhZC1zYWZldHkgY29uc3RyYWludHMgb2YgdGhlIENvZGVHZW5lcmF0b3IgaW50ZXJmYWNlIGFyZW4ndCBjbGVhciBzbworICAvLyBqdXN0IGJlIGFzIGNvbnNlcnZhdGl2ZSBhcyBwb3NzaWJsZS4gIEl0J3MgZWFzaWVyIHRvIHJlbGF4IHRoaXMgbGF0ZXIgaWYKKyAgLy8gd2UgbmVlZCB0bywgYnV0IEkgZG91YnQgaXQgd2lsbCBiZSBhbiBpc3N1ZS4KKyAgLy8gVE9ETyhrZW50b24pOiAgVGhlIHByb3BlciB0aGluZyB0byBkbyB3b3VsZCBiZSB0byBhbGxvY2F0ZSBhbnkgc3RhdGUgb24KKyAgLy8gICB0aGUgc3RhY2sgYW5kIHVzZSB0aGF0LCBzbyB0aGF0IHRoZSBHZW5lcmF0b3IgY2xhc3MgaXRzZWxmIGRvZXMgbm90IG5lZWQKKyAgLy8gICB0byBoYXZlIGFueSBtdXRhYmxlIG1lbWJlcnMuICBUaGVuIGl0IGlzIGltcGxpY2l0bHkgdGhyZWFkLXNhZmUuCisgIE11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICBmaWxlXyA9IGZpbGU7CisgIHN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZmlsZS0+bmFtZSgpKTsKKyAgc3RyaW5nIGZpbGVuYW1lID0gbW9kdWxlX25hbWU7CisgIFN0cmlwU3RyaW5nKCZmaWxlbmFtZSwgIi4iLCAnLycpOworICBmaWxlbmFtZSArPSAiLnB5IjsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZkcDsKKyAgZmlsZV8tPkNvcHlUbygmZmRwKTsKKyAgZmRwLlNlcmlhbGl6ZVRvU3RyaW5nKCZmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF8pOworCisKKyAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dChjb250ZXh0LT5PcGVuKGZpbGVuYW1lKSk7CisgIEdPT0dMRV9DSEVDSyhvdXRwdXQuZ2V0KCkpOworICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgcHJpbnRlcl8gPSAmcHJpbnRlcjsKKworICBQcmludFRvcEJvaWxlcnBsYXRlKHByaW50ZXJfLCBmaWxlXywgR2VuZXJhdGluZ0Rlc2NyaXB0b3JQcm90bygpKTsKKyAgUHJpbnRJbXBvcnRzKCk7CisgIFByaW50RmlsZURlc2NyaXB0b3IoKTsKKyAgUHJpbnRUb3BMZXZlbEVudW1zKCk7CisgIFByaW50VG9wTGV2ZWxFeHRlbnNpb25zKCk7CisgIFByaW50QWxsTmVzdGVkRW51bXNJbkZpbGUoKTsKKyAgUHJpbnRNZXNzYWdlRGVzY3JpcHRvcnMoKTsKKyAgRml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcnMoKTsKKyAgUHJpbnRNZXNzYWdlcygpOworICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0aGUgZXh0ZW5zaW9ucyBhZnRlciB0aGUgbWVzc2FnZSBjbGFzc2VzIHRoZW1zZWx2ZXMsCisgIC8vIHNpbmNlIHRoZXkgbmVlZCB0byBjYWxsIHN0YXRpYyBSZWdpc3RlckV4dGVuc2lvbigpIG1ldGhvZHMgb24gdGhlc2UKKyAgLy8gY2xhc3Nlcy4KKyAgRml4Rm9yZWlnbkZpZWxkc0luRXh0ZW5zaW9ucygpOworICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGUpKSB7CisgICAgUHJpbnRTZXJ2aWNlcygpOworICB9CisKKyAgcHJpbnRlci5QcmludCgKKyAgICAiIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobW9kdWxlX3Njb3BlKVxuIik7CisKKyAgcmV0dXJuICFwcmludGVyLmZhaWxlZCgpOworfQorCisvLyBQcmludHMgUHl0aG9uIGltcG9ydHMgZm9yIGFsbCBtb2R1bGVzIGltcG9ydGVkIGJ5IHxmaWxlfC4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludEltcG9ydHMoKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgKytpKSB7CisgICAgc3RyaW5nIG1vZHVsZV9uYW1lID0gTW9kdWxlTmFtZShmaWxlXy0+ZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoImltcG9ydCAkbW9kdWxlJFxuIiwgIm1vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lKTsKKyAgfQorICBwcmludGVyXy0+UHJpbnQoIlxuIik7Cit9CisKKy8vIFByaW50cyB0aGUgc2luZ2xlIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhpcyBmaWxlLgordm9pZCBHZW5lcmF0b3I6OlByaW50RmlsZURlc2NyaXB0b3IoKSBjb25zdCB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKKyAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBrRGVzY3JpcHRvcktleTsKKyAgbVsibmFtZSJdID0gZmlsZV8tPm5hbWUoKTsKKyAgbVsicGFja2FnZSJdID0gZmlsZV8tPnBhY2thZ2UoKTsKKyAgY29uc3QgY2hhciBmaWxlX2Rlc2NyaXB0b3JfdGVtcGxhdGVbXSA9CisgICAgICAiJGRlc2NyaXB0b3JfbmFtZSQgPSBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKFxuIgorICAgICAgIiAgbmFtZT0nJG5hbWUkJyxcbiIKKyAgICAgICIgIHBhY2thZ2U9JyRwYWNrYWdlJCcsXG4iOworICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKKyAgcHJpbnRlcl8tPkluZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoCisgICAgICAic2VyaWFsaXplZF9wYj0nJHZhbHVlJCciLAorICAgICAgInZhbHVlIiwgc3RyaW5nczo6Q0hleEVzY2FwZShmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF8pKTsKKworICAvLyBUT0RPKGZhbGspOiBBbHNvIHByaW50IG9wdGlvbnMgYW5kIGZpeCB0aGUgbWVzc2FnZV90eXBlLCBlbnVtX3R5cGUsCisgIC8vICAgICAgICAgICAgIHNlcnZpY2UgYW5kIGV4dGVuc2lvbiBsYXRlciBpbiB0aGUgZ2VuZXJhdGlvbi4KKworICBwcmludGVyXy0+T3V0ZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoIilcbiIpOworICBwcmludGVyXy0+UHJpbnQoIlxuIik7Cit9CisKKy8vIFByaW50cyBkZXNjcmlwdG9ycyBhbmQgbW9kdWxlLWxldmVsIGNvbnN0YW50cyBmb3IgYWxsIHRvcC1sZXZlbAorLy8gZW51bXMgZGVmaW5lZCBpbiB8ZmlsZXwuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRUb3BMZXZlbEVudW1zKCkgY29uc3QgeworICB2ZWN0b3I8cGFpcjxzdHJpbmcsIGludD4gPiB0b3BfbGV2ZWxfZW51bV92YWx1ZXM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBFbnVtRGVzY3JpcHRvciYgZW51bV9kZXNjcmlwdG9yID0gKmZpbGVfLT5lbnVtX3R5cGUoaSk7CisgICAgUHJpbnRFbnVtKGVudW1fZGVzY3JpcHRvcik7CisgICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbnVtX2Rlc2NyaXB0b3IudmFsdWVfY291bnQoKTsgKytqKSB7CisgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yJiB2YWx1ZV9kZXNjcmlwdG9yID0gKmVudW1fZGVzY3JpcHRvci52YWx1ZShqKTsKKyAgICAgIHRvcF9sZXZlbF9lbnVtX3ZhbHVlcy5wdXNoX2JhY2soCisgICAgICAgICAgbWFrZV9wYWlyKHZhbHVlX2Rlc2NyaXB0b3IubmFtZSgpLCB2YWx1ZV9kZXNjcmlwdG9yLm51bWJlcigpKSk7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BfbGV2ZWxfZW51bV92YWx1ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBwcmludGVyXy0+UHJpbnQoIiRuYW1lJCA9ICR2YWx1ZSRcbiIsCisgICAgICAgICAgICAgICAgICAgICJuYW1lIiwgdG9wX2xldmVsX2VudW1fdmFsdWVzW2ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAidmFsdWUiLCBTaW1wbGVJdG9hKHRvcF9sZXZlbF9lbnVtX3ZhbHVlc1tpXS5zZWNvbmQpKTsKKyAgfQorICBwcmludGVyXy0+UHJpbnQoIlxuIik7Cit9CisKKy8vIFByaW50cyBhbGwgZW51bXMgY29udGFpbmVkIGluIGFsbCBtZXNzYWdlIHR5cGVzIGluIHxmaWxlfC4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludEFsbE5lc3RlZEVudW1zSW5GaWxlKCkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgUHJpbnROZXN0ZWRFbnVtcygqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CisgIH0KK30KKworLy8gUHJpbnRzIGEgUHl0aG9uIHN0YXRlbWVudCBhc3NpZ25pbmcgdGhlIGFwcHJvcHJpYXRlIG1vZHVsZS1sZXZlbAorLy8gZW51bSBuYW1lIHRvIGEgUHl0aG9uIEVudW1EZXNjcmlwdG9yIG9iamVjdCBlcXVpdmFsZW50IHRvCisvLyBlbnVtX2Rlc2NyaXB0b3IuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yJiBlbnVtX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBtOworICBtWyJkZXNjcmlwdG9yX25hbWUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZW51bV9kZXNjcmlwdG9yKTsKKyAgbVsibmFtZSJdID0gZW51bV9kZXNjcmlwdG9yLm5hbWUoKTsKKyAgbVsiZnVsbF9uYW1lIl0gPSBlbnVtX2Rlc2NyaXB0b3IuZnVsbF9uYW1lKCk7CisgIG1bImZpbGUiXSA9IGtEZXNjcmlwdG9yS2V5OworICBjb25zdCBjaGFyIGVudW1fZGVzY3JpcHRvcl90ZW1wbGF0ZVtdID0KKyAgICAgICIkZGVzY3JpcHRvcl9uYW1lJCA9IGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoXG4iCisgICAgICAiICBuYW1lPSckbmFtZSQnLFxuIgorICAgICAgIiAgZnVsbF9uYW1lPSckZnVsbF9uYW1lJCcsXG4iCisgICAgICAiICBmaWxlbmFtZT1Ob25lLFxuIgorICAgICAgIiAgZmlsZT0kZmlsZSQsXG4iCisgICAgICAiICB2YWx1ZXM9W1xuIjsKKyAgc3RyaW5nIG9wdGlvbnNfc3RyaW5nOworICBlbnVtX2Rlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZVRvU3RyaW5nKCZvcHRpb25zX3N0cmluZyk7CisgIHByaW50ZXJfLT5QcmludChtLCBlbnVtX2Rlc2NyaXB0b3JfdGVtcGxhdGUpOworICBwcmludGVyXy0+SW5kZW50KCk7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX2Rlc2NyaXB0b3IudmFsdWVfY291bnQoKTsgKytpKSB7CisgICAgUHJpbnRFbnVtVmFsdWVEZXNjcmlwdG9yKCplbnVtX2Rlc2NyaXB0b3IudmFsdWUoaSkpOworICAgIHByaW50ZXJfLT5QcmludCgiLFxuIik7CisgIH0KKyAgcHJpbnRlcl8tPk91dGRlbnQoKTsKKyAgcHJpbnRlcl8tPlByaW50KCJdLFxuIik7CisgIHByaW50ZXJfLT5QcmludCgiY29udGFpbmluZ190eXBlPU5vbmUsXG4iKTsKKyAgcHJpbnRlcl8tPlByaW50KCJvcHRpb25zPSRvcHRpb25zX3ZhbHVlJCxcbiIsCisgICAgICAgICAgICAgICAgICAib3B0aW9uc192YWx1ZSIsCisgICAgICAgICAgICAgICAgICBPcHRpb25zVmFsdWUoIkVudW1PcHRpb25zIiwgb3B0aW9uc19zdHJpbmcpKTsKKyAgRW51bURlc2NyaXB0b3JQcm90byBlZHA7CisgIFByaW50U2VyaWFsaXplZFBiSW50ZXJ2YWwoZW51bV9kZXNjcmlwdG9yLCBlZHApOworICBwcmludGVyXy0+T3V0ZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoIilcbiIpOworICBwcmludGVyXy0+UHJpbnQoIlxuIik7Cit9CisKKy8vIFJlY3Vyc2l2ZWx5IHByaW50cyBlbnVtcyBpbiBuZXN0ZWQgdHlwZXMgd2l0aGluIGRlc2NyaXB0b3IsIHRoZW4KKy8vIHByaW50cyBlbnVtcyBjb250YWluZWQgYXQgdGhlIHRvcCBsZXZlbCBpbiBkZXNjcmlwdG9yLgordm9pZCBHZW5lcmF0b3I6OlByaW50TmVzdGVkRW51bXMoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IubmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgUHJpbnROZXN0ZWRFbnVtcygqZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIFByaW50RW51bSgqZGVzY3JpcHRvci5lbnVtX3R5cGUoaSkpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdG9yOjpQcmludFRvcExldmVsRXh0ZW5zaW9ucygpIGNvbnN0IHsKKyAgY29uc3QgYm9vbCBpc19leHRlbnNpb24gPSB0cnVlOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBleHRlbnNpb25fZmllbGQgPSAqZmlsZV8tPmV4dGVuc2lvbihpKTsKKyAgICBzdHJpbmcgY29uc3RhbnRfbmFtZSA9IGV4dGVuc2lvbl9maWVsZC5uYW1lKCkgKyAiX0ZJRUxEX05VTUJFUiI7CisgICAgVXBwZXJTdHJpbmcoJmNvbnN0YW50X25hbWUpOworICAgIHByaW50ZXJfLT5QcmludCgiJGNvbnN0YW50X25hbWUkID0gJG51bWJlciRcbiIsCisgICAgICAiY29uc3RhbnRfbmFtZSIsIGNvbnN0YW50X25hbWUsCisgICAgICAibnVtYmVyIiwgU2ltcGxlSXRvYShleHRlbnNpb25fZmllbGQubnVtYmVyKCkpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIiRuYW1lJCA9ICIsICJuYW1lIiwgZXh0ZW5zaW9uX2ZpZWxkLm5hbWUoKSk7CisgICAgUHJpbnRGaWVsZERlc2NyaXB0b3IoZXh0ZW5zaW9uX2ZpZWxkLCBpc19leHRlbnNpb24pOworICAgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKKyAgfQorICBwcmludGVyXy0+UHJpbnQoIlxuIik7Cit9CisKKy8vIFByaW50cyBQeXRob24gZXF1aXZhbGVudHMgb2YgYWxsIERlc2NyaXB0b3JzIGluIHxmaWxlfC4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludE1lc3NhZ2VEZXNjcmlwdG9ycygpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIFByaW50RGVzY3JpcHRvcigqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CisgICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdG9yOjpQcmludFNlcnZpY2VzKCkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5zZXJ2aWNlX2NvdW50KCk7ICsraSkgeworICAgIFByaW50U2VydmljZURlc2NyaXB0b3IoKmZpbGVfLT5zZXJ2aWNlKGkpKTsKKyAgICBQcmludFNlcnZpY2VDbGFzcygqZmlsZV8tPnNlcnZpY2UoaSkpOworICAgIFByaW50U2VydmljZVN0dWIoKmZpbGVfLT5zZXJ2aWNlKGkpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIlxuIik7CisgIH0KK30KKwordm9pZCBHZW5lcmF0b3I6OlByaW50U2VydmljZURlc2NyaXB0b3IoCisgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworICBzdHJpbmcgc2VydmljZV9uYW1lID0gTW9kdWxlTGV2ZWxTZXJ2aWNlRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcik7CisgIHN0cmluZyBvcHRpb25zX3N0cmluZzsKKyAgZGVzY3JpcHRvci5vcHRpb25zKCkuU2VyaWFsaXplVG9TdHJpbmcoJm9wdGlvbnNfc3RyaW5nKTsKKworICBwcmludGVyXy0+UHJpbnQoCisgICAgICAiJHNlcnZpY2VfbmFtZSQgPSBkZXNjcmlwdG9yLlNlcnZpY2VEZXNjcmlwdG9yKFxuIiwKKyAgICAgICJzZXJ2aWNlX25hbWUiLCBzZXJ2aWNlX25hbWUpOworICBwcmludGVyXy0+SW5kZW50KCk7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKKyAgbVsibmFtZSJdID0gZGVzY3JpcHRvci5uYW1lKCk7CisgIG1bImZ1bGxfbmFtZSJdID0gZGVzY3JpcHRvci5mdWxsX25hbWUoKTsKKyAgbVsiZmlsZSJdID0ga0Rlc2NyaXB0b3JLZXk7CisgIG1bImluZGV4Il0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3IuaW5kZXgoKSk7CisgIG1bIm9wdGlvbnNfdmFsdWUiXSA9IE9wdGlvbnNWYWx1ZSgiU2VydmljZU9wdGlvbnMiLCBvcHRpb25zX3N0cmluZyk7CisgIGNvbnN0IGNoYXIgcmVxdWlyZWRfZnVuY3Rpb25fYXJndW1lbnRzW10gPQorICAgICAgIm5hbWU9JyRuYW1lJCcsXG4iCisgICAgICAiZnVsbF9uYW1lPSckZnVsbF9uYW1lJCcsXG4iCisgICAgICAiZmlsZT0kZmlsZSQsXG4iCisgICAgICAiaW5kZXg9JGluZGV4JCxcbiIKKyAgICAgICJvcHRpb25zPSRvcHRpb25zX3ZhbHVlJCxcbiI7CisgIHByaW50ZXJfLT5QcmludChtLCByZXF1aXJlZF9mdW5jdGlvbl9hcmd1bWVudHMpOworCisgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2RwOworICBQcmludFNlcmlhbGl6ZWRQYkludGVydmFsKGRlc2NyaXB0b3IsIHNkcCk7CisKKyAgcHJpbnRlcl8tPlByaW50KCJtZXRob2RzPVtcbiIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IubWV0aG9kX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3IubWV0aG9kKGkpOworICAgIHN0cmluZyBvcHRpb25zX3N0cmluZzsKKyAgICBtZXRob2QtPm9wdGlvbnMoKS5TZXJpYWxpemVUb1N0cmluZygmb3B0aW9uc19zdHJpbmcpOworCisgICAgbS5jbGVhcigpOworICAgIG1bIm5hbWUiXSA9IG1ldGhvZC0+bmFtZSgpOworICAgIG1bImZ1bGxfbmFtZSJdID0gbWV0aG9kLT5mdWxsX25hbWUoKTsKKyAgICBtWyJpbmRleCJdID0gU2ltcGxlSXRvYShtZXRob2QtPmluZGV4KCkpOworICAgIG1bInNlcmlhbGl6ZWRfb3B0aW9ucyJdID0gQ0VzY2FwZShvcHRpb25zX3N0cmluZyk7CisgICAgbVsiaW5wdXRfdHlwZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqKG1ldGhvZC0+aW5wdXRfdHlwZSgpKSk7CisgICAgbVsib3V0cHV0X3R5cGUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoKihtZXRob2QtPm91dHB1dF90eXBlKCkpKTsKKyAgICBtWyJvcHRpb25zX3ZhbHVlIl0gPSBPcHRpb25zVmFsdWUoIk1ldGhvZE9wdGlvbnMiLCBvcHRpb25zX3N0cmluZyk7CisgICAgcHJpbnRlcl8tPlByaW50KCJkZXNjcmlwdG9yLk1ldGhvZERlc2NyaXB0b3IoXG4iKTsKKyAgICBwcmludGVyXy0+SW5kZW50KCk7CisgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICBtLAorICAgICAgICAibmFtZT0nJG5hbWUkJyxcbiIKKyAgICAgICAgImZ1bGxfbmFtZT0nJGZ1bGxfbmFtZSQnLFxuIgorICAgICAgICAiaW5kZXg9JGluZGV4JCxcbiIKKyAgICAgICAgImNvbnRhaW5pbmdfc2VydmljZT1Ob25lLFxuIgorICAgICAgICAiaW5wdXRfdHlwZT0kaW5wdXRfdHlwZSQsXG4iCisgICAgICAgICJvdXRwdXRfdHlwZT0kb3V0cHV0X3R5cGUkLFxuIgorICAgICAgICAib3B0aW9ucz0kb3B0aW9uc192YWx1ZSQsXG4iKTsKKyAgICBwcmludGVyXy0+T3V0ZGVudCgpOworICAgIHByaW50ZXJfLT5QcmludCgiKSxcbiIpOworICB9CisKKyAgcHJpbnRlcl8tPk91dGRlbnQoKTsKKyAgcHJpbnRlcl8tPlByaW50KCJdKVxuXG4iKTsKK30KKwordm9pZCBHZW5lcmF0b3I6OlByaW50U2VydmljZUNsYXNzKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIC8vIFByaW50IHRoZSBzZXJ2aWNlLgorICBwcmludGVyXy0+UHJpbnQoImNsYXNzICRjbGFzc19uYW1lJChzZXJ2aWNlLlNlcnZpY2UpOlxuIiwKKyAgICAgICAgICAgICAgICAgICJjbGFzc19uYW1lIiwgZGVzY3JpcHRvci5uYW1lKCkpOworICBwcmludGVyXy0+SW5kZW50KCk7CisgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICJfX21ldGFjbGFzc19fID0gc2VydmljZV9yZWZsZWN0aW9uLkdlbmVyYXRlZFNlcnZpY2VUeXBlXG4iCisgICAgICAiJGRlc2NyaXB0b3Jfa2V5JCA9ICRkZXNjcmlwdG9yX25hbWUkXG4iLAorICAgICAgImRlc2NyaXB0b3Jfa2V5Iiwga0Rlc2NyaXB0b3JLZXksCisgICAgICAiZGVzY3JpcHRvcl9uYW1lIiwgTW9kdWxlTGV2ZWxTZXJ2aWNlRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcikpOworICBwcmludGVyXy0+T3V0ZGVudCgpOworfQorCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRTZXJ2aWNlU3R1Yihjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICAvLyBQcmludCB0aGUgc2VydmljZSBzdHViLgorICBwcmludGVyXy0+UHJpbnQoImNsYXNzICRjbGFzc19uYW1lJF9TdHViKCRjbGFzc19uYW1lJCk6XG4iLAorICAgICAgICAgICAgICAgICAgImNsYXNzX25hbWUiLCBkZXNjcmlwdG9yLm5hbWUoKSk7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgcHJpbnRlcl8tPlByaW50KAorICAgICAgIl9fbWV0YWNsYXNzX18gPSBzZXJ2aWNlX3JlZmxlY3Rpb24uR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlXG4iCisgICAgICAiJGRlc2NyaXB0b3Jfa2V5JCA9ICRkZXNjcmlwdG9yX25hbWUkXG4iLAorICAgICAgImRlc2NyaXB0b3Jfa2V5Iiwga0Rlc2NyaXB0b3JLZXksCisgICAgICAiZGVzY3JpcHRvcl9uYW1lIiwgTW9kdWxlTGV2ZWxTZXJ2aWNlRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcikpOworICBwcmludGVyXy0+T3V0ZGVudCgpOworfQorCisvLyBQcmludHMgc3RhdGVtZW50IGFzc2lnbmluZyBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKG1lc3NhZ2VfZGVzY3JpcHRvcikKKy8vIHRvIGEgUHl0aG9uIERlc2NyaXB0b3Igb2JqZWN0IGZvciBtZXNzYWdlX2Rlc2NyaXB0b3IuCisvLworLy8gTXV0dWFsbHkgcmVjdXJzaXZlIHdpdGggUHJpbnROZXN0ZWREZXNjcmlwdG9ycygpLgordm9pZCBHZW5lcmF0b3I6OlByaW50RGVzY3JpcHRvcihjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgUHJpbnROZXN0ZWREZXNjcmlwdG9ycyhtZXNzYWdlX2Rlc2NyaXB0b3IpOworCisgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKKyAgcHJpbnRlcl8tPlByaW50KCIkZGVzY3JpcHRvcl9uYW1lJCA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcihcbiIsCisgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvcl9uYW1lIiwKKyAgICAgICAgICAgICAgICAgIE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUobWVzc2FnZV9kZXNjcmlwdG9yKSk7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBtOworICBtWyJuYW1lIl0gPSBtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSgpOworICBtWyJmdWxsX25hbWUiXSA9IG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUoKTsKKyAgbVsiZmlsZSJdID0ga0Rlc2NyaXB0b3JLZXk7CisgIGNvbnN0IGNoYXIgcmVxdWlyZWRfZnVuY3Rpb25fYXJndW1lbnRzW10gPQorICAgICAgIm5hbWU9JyRuYW1lJCcsXG4iCisgICAgICAiZnVsbF9uYW1lPSckZnVsbF9uYW1lJCcsXG4iCisgICAgICAiZmlsZW5hbWU9Tm9uZSxcbiIKKyAgICAgICJmaWxlPSRmaWxlJCxcbiIKKyAgICAgICJjb250YWluaW5nX3R5cGU9Tm9uZSxcbiI7CisgIHByaW50ZXJfLT5QcmludChtLCByZXF1aXJlZF9mdW5jdGlvbl9hcmd1bWVudHMpOworICBQcmludEZpZWxkc0luRGVzY3JpcHRvcihtZXNzYWdlX2Rlc2NyaXB0b3IpOworICBQcmludEV4dGVuc2lvbnNJbkRlc2NyaXB0b3IobWVzc2FnZV9kZXNjcmlwdG9yKTsKKworICAvLyBOZXN0ZWQgdHlwZXMKKyAgcHJpbnRlcl8tPlByaW50KCJuZXN0ZWRfdHlwZXM9WyIpOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBzdHJpbmcgbmVzdGVkX25hbWUgPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKAorICAgICAgICAqbWVzc2FnZV9kZXNjcmlwdG9yLm5lc3RlZF90eXBlKGkpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIiRuYW1lJCwgIiwgIm5hbWUiLCBuZXN0ZWRfbmFtZSk7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCJdLFxuIik7CisKKyAgLy8gRW51bSB0eXBlcworICBwcmludGVyXy0+UHJpbnQoImVudW1fdHlwZXM9W1xuIik7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX2Rlc2NyaXB0b3IuZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IHN0cmluZyBkZXNjcmlwdG9yX25hbWUgPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKAorICAgICAgICAqbWVzc2FnZV9kZXNjcmlwdG9yLmVudW1fdHlwZShpKSk7CisgICAgcHJpbnRlcl8tPlByaW50KGRlc2NyaXB0b3JfbmFtZS5jX3N0cigpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIixcbiIpOworICB9CisgIHByaW50ZXJfLT5PdXRkZW50KCk7CisgIHByaW50ZXJfLT5QcmludCgiXSxcbiIpOworICBzdHJpbmcgb3B0aW9uc19zdHJpbmc7CisgIG1lc3NhZ2VfZGVzY3JpcHRvci5vcHRpb25zKCkuU2VyaWFsaXplVG9TdHJpbmcoJm9wdGlvbnNfc3RyaW5nKTsKKyAgcHJpbnRlcl8tPlByaW50KAorICAgICAgIm9wdGlvbnM9JG9wdGlvbnNfdmFsdWUkLFxuIgorICAgICAgImlzX2V4dGVuZGFibGU9JGV4dGVuZGFibGUkIiwKKyAgICAgICJvcHRpb25zX3ZhbHVlIiwgT3B0aW9uc1ZhbHVlKCJNZXNzYWdlT3B0aW9ucyIsIG9wdGlvbnNfc3RyaW5nKSwKKyAgICAgICJleHRlbmRhYmxlIiwgbWVzc2FnZV9kZXNjcmlwdG9yLmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCA/CisgICAgICAgICAgICAgICAgICAgICAgIlRydWUiIDogIkZhbHNlIik7CisgIHByaW50ZXJfLT5QcmludCgiLFxuIik7CisKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlcworICBwcmludGVyXy0+UHJpbnQoImV4dGVuc2lvbl9yYW5nZXM9WyIpOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfZGVzY3JpcHRvci5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlID0KKyAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmV4dGVuc2lvbl9yYW5nZShpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIigkc3RhcnQkLCAkZW5kJCksICIsCisgICAgICAgICAgICAgICAgICAgICJzdGFydCIsIFNpbXBsZUl0b2EocmFuZ2UtPnN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgImVuZCIsIFNpbXBsZUl0b2EocmFuZ2UtPmVuZCkpOworICB9CisgIHByaW50ZXJfLT5QcmludCgiXSxcbiIpOworCisgIC8vIFNlcmlhbGl6YXRpb24gb2YgcHJvdG8KKyAgRGVzY3JpcHRvclByb3RvIGVkcDsKKyAgUHJpbnRTZXJpYWxpemVkUGJJbnRlcnZhbChtZXNzYWdlX2Rlc2NyaXB0b3IsIGVkcCk7CisKKyAgcHJpbnRlcl8tPk91dGRlbnQoKTsKKyAgcHJpbnRlcl8tPlByaW50KCIpXG4iKTsKK30KKworLy8gUHJpbnRzIFB5dGhvbiBEZXNjcmlwdG9yIG9iamVjdHMgZm9yIGFsbCBuZXN0ZWQgdHlwZXMgY29udGFpbmVkIGluCisvLyBtZXNzYWdlX2Rlc2NyaXB0b3IuCisvLworLy8gTXV0dWFsbHkgcmVjdXJzaXZlIHdpdGggUHJpbnREZXNjcmlwdG9yKCkuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnROZXN0ZWREZXNjcmlwdG9ycygKKyAgICBjb25zdCBEZXNjcmlwdG9yJiBjb250YWluaW5nX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluaW5nX2Rlc2NyaXB0b3IubmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgUHJpbnREZXNjcmlwdG9yKCpjb250YWluaW5nX2Rlc2NyaXB0b3IubmVzdGVkX3R5cGUoaSkpOworICB9Cit9CisKKy8vIFByaW50cyBhbGwgbWVzc2FnZXMgaW4gfGZpbGV8Lgordm9pZCBHZW5lcmF0b3I6OlByaW50TWVzc2FnZXMoKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBQcmludE1lc3NhZ2UoKmZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpOworICAgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKKyAgfQorfQorCisvLyBQcmludHMgYSBQeXRob24gY2xhc3MgZm9yIHRoZSBnaXZlbiBtZXNzYWdlIGRlc2NyaXB0b3IuICBXZSBkZWZlciB0byB0aGUKKy8vIG1ldGFjbGFzcyB0byBkbyBhbG1vc3QgYWxsIG9mIHRoZSB3b3JrIG9mIGFjdHVhbGx5IGNyZWF0aW5nIGEgdXNlZnVsIGNsYXNzLgorLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBhbmQgaXRzIG1hbnkgaGVscGVyIGZ1bmN0aW9ucyBhYm92ZSBpcyBtZXJlbHkKKy8vIHRvIG91dHB1dCBhIFB5dGhvbiB2ZXJzaW9uIG9mIHRoZSBkZXNjcmlwdG9ycywgd2hpY2ggdGhlIG1ldGFjbGFzcyBpbgorLy8gcmVmbGVjdGlvbi5weSB3aWxsIHVzZSB0byBjb25zdHJ1Y3QgdGhlIG1lYXQgb2YgdGhlIGNsYXNzIGl0c2VsZi4KKy8vCisvLyBNdXR1YWxseSByZWN1cnNpdmUgd2l0aCBQcmludE5lc3RlZE1lc3NhZ2VzKCkuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRNZXNzYWdlKAorICAgIGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvcikgY29uc3QgeworICBwcmludGVyXy0+UHJpbnQoImNsYXNzICRuYW1lJChtZXNzYWdlLk1lc3NhZ2UpOlxuIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLm5hbWUoKSk7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgcHJpbnRlcl8tPlByaW50KCJfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlXG4iKTsKKyAgUHJpbnROZXN0ZWRNZXNzYWdlcyhtZXNzYWdlX2Rlc2NyaXB0b3IpOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07CisgIG1bImRlc2NyaXB0b3Jfa2V5Il0gPSBrRGVzY3JpcHRvcktleTsKKyAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKG1lc3NhZ2VfZGVzY3JpcHRvcik7CisgIHByaW50ZXJfLT5QcmludChtLCAiJGRlc2NyaXB0b3Jfa2V5JCA9ICRkZXNjcmlwdG9yX25hbWUkXG4iKTsKKworICBwcmludGVyXy0+UHJpbnQoCisgICAgIlxuIgorICAgICIjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTokZnVsbF9uYW1lJClcbiIsCisgICAgImZ1bGxfbmFtZSIsIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUoKSk7CisKKyAgcHJpbnRlcl8tPk91dGRlbnQoKTsKK30KKworLy8gUHJpbnRzIGFsbCBuZXN0ZWQgbWVzc2FnZXMgd2l0aGluIHxjb250YWluaW5nX2Rlc2NyaXB0b3J8LgorLy8gTXV0dWFsbHkgcmVjdXJzaXZlIHdpdGggUHJpbnRNZXNzYWdlKCkuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnROZXN0ZWRNZXNzYWdlcygKKyAgICBjb25zdCBEZXNjcmlwdG9yJiBjb250YWluaW5nX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluaW5nX2Rlc2NyaXB0b3IubmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworICAgIFByaW50TWVzc2FnZSgqY29udGFpbmluZ19kZXNjcmlwdG9yLm5lc3RlZF90eXBlKGkpKTsKKyAgfQorfQorCisvLyBSZWN1cnNpdmVseSBmaXhlcyBmb3JlaWduIGZpZWxkcyBpbiBhbGwgbmVzdGVkIHR5cGVzIGluIHxkZXNjcmlwdG9yfCwgdGhlbgorLy8gc2V0cyB0aGUgbWVzc2FnZV90eXBlIGFuZCBlbnVtX3R5cGUgb2YgYWxsIG1lc3NhZ2UgYW5kIGVudW0gZmllbGRzIHRvIHBvaW50CisvLyB0byB0aGVpciByZXNwZWN0aXZlIGRlc2NyaXB0b3JzLgorLy8gQXJnczoKKy8vICAgZGVzY3JpcHRvcjogZGVzY3JpcHRvciB0byBwcmludCBmaWVsZHMgZm9yLgorLy8gICBjb250YWluaW5nX2Rlc2NyaXB0b3I6IGlmIGRlc2NyaXB0b3IgaXMgYSBuZXN0ZWQgdHlwZSwgdGhpcyBpcyBpdHMKKy8vICAgICAgIGNvbnRhaW5pbmcgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIGEgcm9vdC90b3AtbGV2ZWwgdHlwZS4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9yKAorICAgIGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsCisgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9yKCpkZXNjcmlwdG9yLm5lc3RlZF90eXBlKGkpLCAmZGVzY3JpcHRvcik7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZF9kZXNjcmlwdG9yID0gKmRlc2NyaXB0b3IuZmllbGQoaSk7CisgICAgRml4Rm9yZWlnbkZpZWxkc0luRmllbGQoJmRlc2NyaXB0b3IsIGZpZWxkX2Rlc2NyaXB0b3IsICJmaWVsZHNfYnlfbmFtZSIpOworICB9CisKKyAgRml4Q29udGFpbmluZ1R5cGVJbkRlc2NyaXB0b3IoZGVzY3JpcHRvciwgY29udGFpbmluZ19kZXNjcmlwdG9yKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBFbnVtRGVzY3JpcHRvciYgZW51bV9kZXNjcmlwdG9yID0gKmRlc2NyaXB0b3IuZW51bV90eXBlKGkpOworICAgIEZpeENvbnRhaW5pbmdUeXBlSW5EZXNjcmlwdG9yKGVudW1fZGVzY3JpcHRvciwgJmRlc2NyaXB0b3IpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdG9yOjpBZGRNZXNzYWdlVG9GaWxlRGVzY3JpcHRvcihjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKKyAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBrRGVzY3JpcHRvcktleTsKKyAgbVsibWVzc2FnZV9uYW1lIl0gPSBkZXNjcmlwdG9yLm5hbWUoKTsKKyAgbVsibWVzc2FnZV9kZXNjcmlwdG9yX25hbWUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcik7CisgIGNvbnN0IGNoYXIgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlW10gPQorICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnJG1lc3NhZ2VfbmFtZSQnXSA9ICIKKyAgICAgICIkbWVzc2FnZV9kZXNjcmlwdG9yX25hbWUkXG4iOworICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKK30KKworLy8gU2V0cyBhbnkgbmVjZXNzYXJ5IG1lc3NhZ2VfdHlwZSBhbmQgZW51bV90eXBlIGF0dHJpYnV0ZXMKKy8vIGZvciB0aGUgUHl0aG9uIHZlcnNpb24gb2YgfGZpZWxkfC4KKy8vCisvLyBjb250YWluaW5nX3R5cGUgbWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2UgdGhpcyBpcyBhIG1vZHVsZS1sZXZlbCBmaWVsZC4KKy8vCisvLyBweXRob25fZGljdF9uYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBQeXRob24gZGljdCB3aGVyZSB3ZSBzaG91bGQKKy8vIGxvb2sgdGhlIGZpZWxkIHVwIGluIHRoZSBjb250YWluaW5nIHR5cGUuICAoZS5nLiwgZmllbGRzX2J5X25hbWUKKy8vIG9yIGV4dGVuc2lvbnNfYnlfbmFtZSkuICBXZSBpZ25vcmUgcHl0aG9uX2RpY3RfbmFtZSBpZiBjb250YWluaW5nX3R5cGUKKy8vIGlzIE5VTEwuCit2b2lkIEdlbmVyYXRvcjo6Rml4Rm9yZWlnbkZpZWxkc0luRmllbGQoY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBweXRob25fZGljdF9uYW1lKSBjb25zdCB7CisgIGNvbnN0IHN0cmluZyBmaWVsZF9yZWZlcmVuY2luZ19leHByZXNzaW9uID0gRmllbGRSZWZlcmVuY2luZ0V4cHJlc3Npb24oCisgICAgICBjb250YWluaW5nX3R5cGUsIGZpZWxkLCBweXRob25fZGljdF9uYW1lKTsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBtOworICBtWyJmaWVsZF9yZWYiXSA9IGZpZWxkX3JlZmVyZW5jaW5nX2V4cHJlc3Npb247CisgIGNvbnN0IERlc2NyaXB0b3IqIGZvcmVpZ25fbWVzc2FnZV90eXBlID0gZmllbGQubWVzc2FnZV90eXBlKCk7CisgIGlmIChmb3JlaWduX21lc3NhZ2VfdHlwZSkgeworICAgIG1bImZvcmVpZ25fdHlwZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqZm9yZWlnbl9tZXNzYWdlX3R5cGUpOworICAgIHByaW50ZXJfLT5QcmludChtLCAiJGZpZWxkX3JlZiQubWVzc2FnZV90eXBlID0gJGZvcmVpZ25fdHlwZSRcbiIpOworICB9CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUgPSBmaWVsZC5lbnVtX3R5cGUoKTsKKyAgaWYgKGVudW1fdHlwZSkgeworICAgIG1bImVudW1fdHlwZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqZW51bV90eXBlKTsKKyAgICBwcmludGVyXy0+UHJpbnQobSwgIiRmaWVsZF9yZWYkLmVudW1fdHlwZSA9ICRlbnVtX3R5cGUkXG4iKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIHRoZSBtb2R1bGUtbGV2ZWwgZXhwcmVzc2lvbiBmb3IgdGhlIGdpdmVuIEZpZWxkRGVzY3JpcHRvci4KKy8vIE9ubHkgd29ya3MgZm9yIGZpZWxkcyBpbiB0aGUgLnByb3RvIGZpbGUgdGhpcyBHZW5lcmF0b3IgaXMgZ2VuZXJhdGluZyBmb3IuCisvLworLy8gY29udGFpbmluZ190eXBlIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIHRoaXMgaXMgYSBtb2R1bGUtbGV2ZWwgZmllbGQuCisvLworLy8gcHl0aG9uX2RpY3RfbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgUHl0aG9uIGRpY3Qgd2hlcmUgd2Ugc2hvdWxkCisvLyBsb29rIHRoZSBmaWVsZCB1cCBpbiB0aGUgY29udGFpbmluZyB0eXBlLiAgKGUuZy4sIGZpZWxkc19ieV9uYW1lCisvLyBvciBleHRlbnNpb25zX2J5X25hbWUpLiAgV2UgaWdub3JlIHB5dGhvbl9kaWN0X25hbWUgaWYgY29udGFpbmluZ190eXBlCisvLyBpcyBOVUxMLgorc3RyaW5nIEdlbmVyYXRvcjo6RmllbGRSZWZlcmVuY2luZ0V4cHJlc3Npb24oCisgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsCisgICAgY29uc3Qgc3RyaW5nJiBweXRob25fZGljdF9uYW1lKSBjb25zdCB7CisgIC8vIFdlIHNob3VsZCBvbmx5IGV2ZXIgYmUgbG9va2luZyB1cCBmaWVsZHMgaW4gdGhlIGN1cnJlbnQgZmlsZS4KKyAgLy8gVGhlIG9ubHkgdGhpbmdzIHdlIHJlZmVyIHRvIGZyb20gb3RoZXIgZmlsZXMgYXJlIG1lc3NhZ2UgZGVzY3JpcHRvcnMuCisgIEdPT0dMRV9DSEVDS19FUShmaWVsZC5maWxlKCksIGZpbGVfKSA8PCBmaWVsZC5maWxlKCktPm5hbWUoKSA8PCAiIHZzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpbGVfLT5uYW1lKCk7CisgIGlmICghY29udGFpbmluZ190eXBlKSB7CisgICAgcmV0dXJuIGZpZWxkLm5hbWUoKTsKKyAgfQorICByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICIkMC4kMVsnJDInXSIsCisgICAgICBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKCpjb250YWluaW5nX3R5cGUpLAorICAgICAgcHl0aG9uX2RpY3RfbmFtZSwgZmllbGQubmFtZSgpKTsKK30KKworLy8gUHJpbnRzIGNvbnRhaW5pbmdfdHlwZSBmb3IgbmVzdGVkIGRlc2NyaXB0b3JzIG9yIGVudW0gZGVzY3JpcHRvcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQ+Cit2b2lkIEdlbmVyYXRvcjo6Rml4Q29udGFpbmluZ1R5cGVJbkRlc2NyaXB0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsCisgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdCB7CisgIGlmIChjb250YWluaW5nX2Rlc2NyaXB0b3IgIT0gTlVMTCkgeworICAgIGNvbnN0IHN0cmluZyBuZXN0ZWRfbmFtZSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcik7CisgICAgY29uc3Qgc3RyaW5nIHBhcmVudF9uYW1lID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgKKyAgICAgICAgKmNvbnRhaW5pbmdfZGVzY3JpcHRvcik7CisgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAiJG5lc3RlZF9uYW1lJC5jb250YWluaW5nX3R5cGUgPSAkcGFyZW50X25hbWUkO1xuIiwKKyAgICAgICAgIm5lc3RlZF9uYW1lIiwgbmVzdGVkX25hbWUsCisgICAgICAgICJwYXJlbnRfbmFtZSIsIHBhcmVudF9uYW1lKTsKKyAgfQorfQorCisvLyBQcmludHMgc3RhdGVtZW50cyBzZXR0aW5nIHRoZSBtZXNzYWdlX3R5cGUgYW5kIGVudW1fdHlwZSBmaWVsZHMgaW4gdGhlCisvLyBQeXRob24gZGVzY3JpcHRvciBvYmplY3RzIHdlJ3ZlIGFscmVhZHkgb3V0cHV0IGluIHRocyBmaWxlLiAgV2UgbXVzdAorLy8gZG8gdGhpcyBpbiBhIHNlcGFyYXRlIHN0ZXAgZHVlIHRvIGNpcmN1bGFyIHJlZmVyZW5jZXMgKG90aGVyd2lzZSwgd2UnZAorLy8ganVzdCBzZXQgZXZlcnl0aGluZyBpbiB0aGUgaW5pdGlhbCBhc3NpZ25tZW50IHN0YXRlbWVudHMpLgordm9pZCBHZW5lcmF0b3I6OkZpeEZvcmVpZ25GaWVsZHNJbkRlc2NyaXB0b3JzKCkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgRml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcigqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSwgTlVMTCk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIEFkZE1lc3NhZ2VUb0ZpbGVEZXNjcmlwdG9yKCpmaWxlXy0+bWVzc2FnZV90eXBlKGkpKTsKKyAgfQorICBwcmludGVyXy0+UHJpbnQoIlxuIik7Cit9CisKKy8vIFdlIG5lZWQgdG8gbm90IG9ubHkgc2V0IGFueSBuZWNlc3NhcnkgbWVzc2FnZV90eXBlIGZpZWxkcywgYnV0CisvLyBhbHNvIG5lZWQgdG8gY2FsbCBSZWdpc3RlckV4dGVuc2lvbigpIG9uIGVhY2ggbWVzc2FnZSB3ZSdyZQorLy8gZXh0ZW5kaW5nLgordm9pZCBHZW5lcmF0b3I6OkZpeEZvcmVpZ25GaWVsZHNJbkV4dGVuc2lvbnMoKSBjb25zdCB7CisgIC8vIFRvcC1sZXZlbCBleHRlbnNpb25zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgKytpKSB7CisgICAgRml4Rm9yZWlnbkZpZWxkc0luRXh0ZW5zaW9uKCpmaWxlXy0+ZXh0ZW5zaW9uKGkpKTsKKyAgfQorICAvLyBOZXN0ZWQgZXh0ZW5zaW9ucy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIEZpeEZvcmVpZ25GaWVsZHNJbk5lc3RlZEV4dGVuc2lvbnMoKmZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdG9yOjpGaXhGb3JlaWduRmllbGRzSW5FeHRlbnNpb24oCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBleHRlbnNpb25fZmllbGQpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLKGV4dGVuc2lvbl9maWVsZC5pc19leHRlbnNpb24oKSk7CisgIC8vIGV4dGVuc2lvbl9zY29wZSgpIHdpbGwgYmUgTlVMTCBmb3IgdG9wLWxldmVsIGV4dGVuc2lvbnMsIHdoaWNoIGlzCisgIC8vIGV4YWN0bHkgd2hhdCBGaXhGb3JlaWduRmllbGRzSW5GaWVsZCgpIHdhbnRzLgorICBGaXhGb3JlaWduRmllbGRzSW5GaWVsZChleHRlbnNpb25fZmllbGQuZXh0ZW5zaW9uX3Njb3BlKCksIGV4dGVuc2lvbl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVuc2lvbnNfYnlfbmFtZSIpOworCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKKyAgLy8gQ29uZnVzaW5nbHksIGZvciBGaWVsZERlc2NyaXB0b3JzIHRoYXQgaGFwcGVuIHRvIGJlIGV4dGVuc2lvbnMsCisgIC8vIGNvbnRhaW5pbmdfdHlwZSgpIG1lYW5zICJleHRlbmRlZCB0eXBlLiIKKyAgLy8gT24gdGhlIG90aGVyIGhhbmQsIGV4dGVuc2lvbl9zY29wZSgpIHdpbGwgZ2l2ZSB1cyB3aGF0IHdlIG5vcm1hbGx5CisgIC8vIG1lYW4gYnkgY29udGFpbmluZ190eXBlKCkuCisgIG1bImV4dGVuZGVkX21lc3NhZ2VfY2xhc3MiXSA9IE1vZHVsZUxldmVsTWVzc2FnZU5hbWUoCisgICAgICAqZXh0ZW5zaW9uX2ZpZWxkLmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgbVsiZmllbGQiXSA9IEZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKGV4dGVuc2lvbl9maWVsZC5leHRlbnNpb25fc2NvcGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb25zX2J5X25hbWUiKTsKKyAgcHJpbnRlcl8tPlByaW50KG0sICIkZXh0ZW5kZWRfbWVzc2FnZV9jbGFzcyQuUmVnaXN0ZXJFeHRlbnNpb24oJGZpZWxkJClcbiIpOworfQorCit2b2lkIEdlbmVyYXRvcjo6Rml4Rm9yZWlnbkZpZWxkc0luTmVzdGVkRXh0ZW5zaW9ucygKKyAgICBjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIC8vIFJlY3Vyc2l2ZWx5IGZpeCB1cCBleHRlbnNpb25zIGluIGFsbCBuZXN0ZWQgdHlwZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhGb3JlaWduRmllbGRzSW5OZXN0ZWRFeHRlbnNpb25zKCpkZXNjcmlwdG9yLm5lc3RlZF90eXBlKGkpKTsKKyAgfQorICAvLyBGaXggdXAgZXh0ZW5zaW9ucyBkaXJlY3RseSBjb250YWluZWQgd2l0aGluIHRoaXMgdHlwZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhGb3JlaWduRmllbGRzSW5FeHRlbnNpb24oKmRlc2NyaXB0b3IuZXh0ZW5zaW9uKGkpKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIGEgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBpbnN0YW50aWF0ZXMgYSBQeXRob24gRW51bVZhbHVlRGVzY3JpcHRvcgorLy8gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gQysrIGRlc2NyaXB0b3IuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRFbnVtVmFsdWVEZXNjcmlwdG9yKAorICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgLy8gVE9ETyhyb2JpbnNvbik6IEZpeCB1cCBFbnVtVmFsdWVEZXNjcmlwdG9yICJ0eXBlIiBmaWVsZHMuCisgIC8vIE1vcmUgY2lyY3VsYXIgcmVmZXJlbmNlcy4gIDo6c2lnaDo6CisgIHN0cmluZyBvcHRpb25zX3N0cmluZzsKKyAgZGVzY3JpcHRvci5vcHRpb25zKCkuU2VyaWFsaXplVG9TdHJpbmcoJm9wdGlvbnNfc3RyaW5nKTsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBtOworICBtWyJuYW1lIl0gPSBkZXNjcmlwdG9yLm5hbWUoKTsKKyAgbVsiaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvci5pbmRleCgpKTsKKyAgbVsibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3IubnVtYmVyKCkpOworICBtWyJvcHRpb25zIl0gPSBPcHRpb25zVmFsdWUoIkVudW1WYWx1ZU9wdGlvbnMiLCBvcHRpb25zX3N0cmluZyk7CisgIHByaW50ZXJfLT5QcmludCgKKyAgICAgIG0sCisgICAgICAiZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKFxuIgorICAgICAgIiAgbmFtZT0nJG5hbWUkJywgaW5kZXg9JGluZGV4JCwgbnVtYmVyPSRudW1iZXIkLFxuIgorICAgICAgIiAgb3B0aW9ucz0kb3B0aW9ucyQsXG4iCisgICAgICAiICB0eXBlPU5vbmUpIik7Cit9CisKKy8vIFJldHVybnMgYSBQeXRob24gZXhwcmVzc2lvbiB0aGF0IGNhbGxzIGRlc2NyaXB0b3IuX1BhcnNlT3B0aW9ucyB1c2luZworLy8gdGhlIGdpdmVuIGRlc2NyaXB0b3IgY2xhc3MgbmFtZSBhbmQgc2VyaWFsaXplZCBvcHRpb25zIHByb3RvYnVmIHN0cmluZy4KK3N0cmluZyBHZW5lcmF0b3I6Ok9wdGlvbnNWYWx1ZSgKKyAgICBjb25zdCBzdHJpbmcmIGNsYXNzX25hbWUsIGNvbnN0IHN0cmluZyYgc2VyaWFsaXplZF9vcHRpb25zKSBjb25zdCB7CisgIGlmIChzZXJpYWxpemVkX29wdGlvbnMubGVuZ3RoKCkgPT0gMCB8fCBHZW5lcmF0aW5nRGVzY3JpcHRvclByb3RvKCkpIHsKKyAgICByZXR1cm4gIk5vbmUiOworICB9IGVsc2UgeworICAgIHN0cmluZyBmdWxsX2NsYXNzX25hbWUgPSAiZGVzY3JpcHRvcl9wYjIuIiArIGNsYXNzX25hbWU7CisgICAgcmV0dXJuICJkZXNjcmlwdG9yLl9QYXJzZU9wdGlvbnMoIiArIGZ1bGxfY2xhc3NfbmFtZSArICIoKSwgJyIKKyAgICAgICAgKyBDRXNjYXBlKHNlcmlhbGl6ZWRfb3B0aW9ucykrICInKSI7CisgIH0KK30KKworLy8gUHJpbnRzIGFuIGV4cHJlc3Npb24gZm9yIGEgUHl0aG9uIEZpZWxkRGVzY3JpcHRvciBmb3IgfGZpZWxkfC4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludEZpZWxkRGVzY3JpcHRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkLCBib29sIGlzX2V4dGVuc2lvbikgY29uc3QgeworICBzdHJpbmcgb3B0aW9uc19zdHJpbmc7CisgIGZpZWxkLm9wdGlvbnMoKS5TZXJpYWxpemVUb1N0cmluZygmb3B0aW9uc19zdHJpbmcpOworICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07CisgIG1bIm5hbWUiXSA9IGZpZWxkLm5hbWUoKTsKKyAgbVsiZnVsbF9uYW1lIl0gPSBmaWVsZC5mdWxsX25hbWUoKTsKKyAgbVsiaW5kZXgiXSA9IFNpbXBsZUl0b2EoZmllbGQuaW5kZXgoKSk7CisgIG1bIm51bWJlciJdID0gU2ltcGxlSXRvYShmaWVsZC5udW1iZXIoKSk7CisgIG1bInR5cGUiXSA9IFNpbXBsZUl0b2EoZmllbGQudHlwZSgpKTsKKyAgbVsiY3BwX3R5cGUiXSA9IFNpbXBsZUl0b2EoZmllbGQuY3BwX3R5cGUoKSk7CisgIG1bImxhYmVsIl0gPSBTaW1wbGVJdG9hKGZpZWxkLmxhYmVsKCkpOworICBtWyJoYXNfZGVmYXVsdF92YWx1ZSJdID0gZmllbGQuaGFzX2RlZmF1bHRfdmFsdWUoKSA/ICJUcnVlIiA6ICJGYWxzZSI7CisgIG1bImRlZmF1bHRfdmFsdWUiXSA9IFN0cmluZ2lmeURlZmF1bHRWYWx1ZShmaWVsZCk7CisgIG1bImlzX2V4dGVuc2lvbiJdID0gaXNfZXh0ZW5zaW9uID8gIlRydWUiIDogIkZhbHNlIjsKKyAgbVsib3B0aW9ucyJdID0gT3B0aW9uc1ZhbHVlKCJGaWVsZE9wdGlvbnMiLCBvcHRpb25zX3N0cmluZyk7CisgIC8vIFdlIGFsd2F5cyBzZXQgbWVzc2FnZV90eXBlIGFuZCBlbnVtX3R5cGUgdG8gTm9uZSBhdCB0aGlzIHBvaW50LCBhbmQgdGhlbgorICAvLyB0aGVzZSBmaWVsZHMgaW4gY29ycmVjdGx5IGFmdGVyIGFsbCByZWZlcmVuY2VkIGRlc2NyaXB0b3JzIGhhdmUgYmVlbgorICAvLyBkZWZpbmVkIGFuZC9vciBpbXBvcnRlZCAoc2VlIEZpeEZvcmVpZ25GaWVsZHNJbkRlc2NyaXB0b3JzKCkpLgorICBjb25zdCBjaGFyIGZpZWxkX2Rlc2NyaXB0b3JfZGVjbFtdID0KKyAgICAiZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoXG4iCisgICAgIiAgbmFtZT0nJG5hbWUkJywgZnVsbF9uYW1lPSckZnVsbF9uYW1lJCcsIGluZGV4PSRpbmRleCQsXG4iCisgICAgIiAgbnVtYmVyPSRudW1iZXIkLCB0eXBlPSR0eXBlJCwgY3BwX3R5cGU9JGNwcF90eXBlJCwgbGFiZWw9JGxhYmVsJCxcbiIKKyAgICAiICBoYXNfZGVmYXVsdF92YWx1ZT0kaGFzX2RlZmF1bHRfdmFsdWUkLCBkZWZhdWx0X3ZhbHVlPSRkZWZhdWx0X3ZhbHVlJCxcbiIKKyAgICAiICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLFxuIgorICAgICIgIGlzX2V4dGVuc2lvbj0kaXNfZXh0ZW5zaW9uJCwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsXG4iCisgICAgIiAgb3B0aW9ucz0kb3B0aW9ucyQpIjsKKyAgcHJpbnRlcl8tPlByaW50KG0sIGZpZWxkX2Rlc2NyaXB0b3JfZGVjbCk7Cit9CisKKy8vIEhlbHBlciBmb3IgUHJpbnR7RmllbGRzLEV4dGVuc2lvbnN9SW5EZXNjcmlwdG9yKCkuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRGaWVsZERlc2NyaXB0b3JzSW5EZXNjcmlwdG9yKAorICAgIGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvciwKKyAgICBib29sIGlzX2V4dGVuc2lvbiwKKyAgICBjb25zdCBzdHJpbmcmIGxpc3RfdmFyaWFibGVfbmFtZSwKKyAgICBpbnQgKERlc2NyaXB0b3I6OipDb3VudEZuKSgpIGNvbnN0LAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogKERlc2NyaXB0b3I6OipHZXR0ZXJGbikoaW50KSBjb25zdCkgY29uc3QgeworICBwcmludGVyXy0+UHJpbnQoIiRsaXN0JD1bXG4iLCAibGlzdCIsIGxpc3RfdmFyaWFibGVfbmFtZSk7CisgIHByaW50ZXJfLT5JbmRlbnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAobWVzc2FnZV9kZXNjcmlwdG9yLipDb3VudEZuKSgpOyArK2kpIHsKKyAgICBQcmludEZpZWxkRGVzY3JpcHRvcigqKG1lc3NhZ2VfZGVzY3JpcHRvci4qR2V0dGVyRm4pKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbik7CisgICAgcHJpbnRlcl8tPlByaW50KCIsXG4iKTsKKyAgfQorICBwcmludGVyXy0+T3V0ZGVudCgpOworICBwcmludGVyXy0+UHJpbnQoIl0sXG4iKTsKK30KKworLy8gUHJpbnRzIGEgc3RhdGVtZW50IGFzc2lnbmluZyAiZmllbGRzIiB0byBhIGxpc3Qgb2YgUHl0aG9uIEZpZWxkRGVzY3JpcHRvcnMsCisvLyBvbmUgZm9yIGVhY2ggZmllbGQgcHJlc2VudCBpbiBtZXNzYWdlX2Rlc2NyaXB0b3IuCit2b2lkIEdlbmVyYXRvcjo6UHJpbnRGaWVsZHNJbkRlc2NyaXB0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdCB7CisgIGNvbnN0IGJvb2wgaXNfZXh0ZW5zaW9uID0gZmFsc2U7CisgIFByaW50RmllbGREZXNjcmlwdG9yc0luRGVzY3JpcHRvcigKKyAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvciwgaXNfZXh0ZW5zaW9uLCAiZmllbGRzIiwKKyAgICAgICZEZXNjcmlwdG9yOjpmaWVsZF9jb3VudCwgJkRlc2NyaXB0b3I6OmZpZWxkKTsKK30KKworLy8gUHJpbnRzIGEgc3RhdGVtZW50IGFzc2lnbmluZyAiZXh0ZW5zaW9ucyIgdG8gYSBsaXN0IG9mIFB5dGhvbgorLy8gRmllbGREZXNjcmlwdG9ycywgb25lIGZvciBlYWNoIGV4dGVuc2lvbiBwcmVzZW50IGluIG1lc3NhZ2VfZGVzY3JpcHRvci4KK3ZvaWQgR2VuZXJhdG9yOjpQcmludEV4dGVuc2lvbnNJbkRlc2NyaXB0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdCB7CisgIGNvbnN0IGJvb2wgaXNfZXh0ZW5zaW9uID0gdHJ1ZTsKKyAgUHJpbnRGaWVsZERlc2NyaXB0b3JzSW5EZXNjcmlwdG9yKAorICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLCBpc19leHRlbnNpb24sICJleHRlbnNpb25zIiwKKyAgICAgICZEZXNjcmlwdG9yOjpleHRlbnNpb25fY291bnQsICZEZXNjcmlwdG9yOjpleHRlbnNpb24pOworfQorCitib29sIEdlbmVyYXRvcjo6R2VuZXJhdGluZ0Rlc2NyaXB0b3JQcm90bygpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGVfLT5uYW1lKCkgPT0gImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKK30KKworLy8gUmV0dXJucyB0aGUgdW5pcXVlIFB5dGhvbiBtb2R1bGUtbGV2ZWwgaWRlbnRpZmllciBnaXZlbiB0byBhIGRlc2NyaXB0b3IuCisvLyBUaGlzIG5hbWUgaXMgbW9kdWxlLXF1YWxpZmllZCBpZmYgdGhlIGdpdmVuIGRlc2NyaXB0b3IgZGVzY3JpYmVzIGFuCisvLyBlbnRpdHkgdGhhdCBkb2Vzbid0IGNvbWUgZnJvbSB0aGUgY3VycmVudCBmaWxlLgordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUPgorc3RyaW5nIEdlbmVyYXRvcjo6TW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgKKyAgICBjb25zdCBEZXNjcmlwdG9yVCYgZGVzY3JpcHRvcikgY29uc3QgeworICAvLyBGSVhNRShyb2JpbnNvbik6CisgIC8vIFdlIGN1cnJlbnRseSBkb24ndCB3b3JyeSBhYm91dCBjb2xsaXNpb25zIHdpdGggdW5kZXJzY29yZXMgaW4gdGhlIHR5cGUKKyAgLy8gbmFtZXMsIHNvIHRoZXNlIHdvdWxkIGNvbGxpZGUgaW4gbmFzdHkgd2F5cyBpZiBmb3VuZCBpbiB0aGUgc2FtZSBmaWxlOgorICAvLyAgIE91dGVyUHJvdG8uUHJvdG9BLlByb3RvQgorICAvLyAgIE91dGVyUHJvdG9fUHJvdG9BLlByb3RvQiAgIyBVbmRlcnNjb3JlIGluc3RlYWQgb2YgcGVyaW9kLgorICAvLyBBcyB3b3VsZCB0aGVzZToKKyAgLy8gICBPdXRlclByb3RvLlByb3RvQV8uUHJvdG9CCisgIC8vICAgT3V0ZXJQcm90by5Qcm90b0EuX1Byb3RvQiAgIyBMZWFkaW5nIHZzLiB0cmFpbGluZyB1bmRlcnNjb3JlLgorICAvLyAoQ29udHJpdmVkLCBidXQgY2VydGFpbmx5IHBvc3NpYmxlKS4KKyAgLy8KKyAgLy8gVGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGd1YXJkIGFnYWluc3QgdGhpcyBlaXRoZXIuICBMZWF2aW5nCisgIC8vIGl0IGZvciBub3cuLi4KKyAgc3RyaW5nIG5hbWUgPSBOYW1lUHJlZml4ZWRXaXRoTmVzdGVkVHlwZXMoZGVzY3JpcHRvciwgIl8iKTsKKyAgVXBwZXJTdHJpbmcoJm5hbWUpOworICAvLyBNb2R1bGUtcHJpdmF0ZSBmb3Igbm93LiAgRWFzeSB0byBtYWtlIHB1YmxpYyBsYXRlcjsgYWxtb3N0IGltcG9zc2libGUKKyAgLy8gdG8gbWFrZSBwcml2YXRlIGxhdGVyLgorICBuYW1lID0gIl8iICsgbmFtZTsKKyAgLy8gV2Ugbm93IGhhdmUgdGhlIG5hbWUgcmVsYXRpdmUgdG8gaXRzIG93biBtb2R1bGUuICBBbHNvIHF1YWxpZnkgd2l0aAorICAvLyB0aGUgbW9kdWxlIG5hbWUgaWZmIHRoaXMgZGVzY3JpcHRvciBpcyBmcm9tIGEgZGlmZmVyZW50IC5wcm90byBmaWxlLgorICBpZiAoZGVzY3JpcHRvci5maWxlKCkgIT0gZmlsZV8pIHsKKyAgICBuYW1lID0gTW9kdWxlTmFtZShkZXNjcmlwdG9yLmZpbGUoKS0+bmFtZSgpKSArICIuIiArIG5hbWU7CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgY2xhc3MgaXRzZWxmLCBub3QgdGhlIGRlc2NyaXB0b3IuCisvLyBMaWtlIE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoKSwgbW9kdWxlLXF1YWxpZmllcyB0aGUgbmFtZSBpZmYKKy8vIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGRlc2NyaWJlcyBhbiBlbnRpdHkgdGhhdCBkb2Vzbid0IGNvbWUgZnJvbQorLy8gdGhlIGN1cnJlbnQgZmlsZS4KK3N0cmluZyBHZW5lcmF0b3I6Ok1vZHVsZUxldmVsTWVzc2FnZU5hbWUoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICBzdHJpbmcgbmFtZSA9IE5hbWVQcmVmaXhlZFdpdGhOZXN0ZWRUeXBlcyhkZXNjcmlwdG9yLCAiLiIpOworICBpZiAoZGVzY3JpcHRvci5maWxlKCkgIT0gZmlsZV8pIHsKKyAgICBuYW1lID0gTW9kdWxlTmFtZShkZXNjcmlwdG9yLmZpbGUoKS0+bmFtZSgpKSArICIuIiArIG5hbWU7CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8vIFJldHVybnMgdGhlIHVuaXF1ZSBQeXRob24gbW9kdWxlLWxldmVsIGlkZW50aWZpZXIgZ2l2ZW4gdG8gYSBzZXJ2aWNlCisvLyBkZXNjcmlwdG9yLgorc3RyaW5nIEdlbmVyYXRvcjo6TW9kdWxlTGV2ZWxTZXJ2aWNlRGVzY3JpcHRvck5hbWUoCisgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgc3RyaW5nIG5hbWUgPSBkZXNjcmlwdG9yLm5hbWUoKTsKKyAgVXBwZXJTdHJpbmcoJm5hbWUpOworICBuYW1lID0gIl8iICsgbmFtZTsKKyAgaWYgKGRlc2NyaXB0b3IuZmlsZSgpICE9IGZpbGVfKSB7CisgICAgbmFtZSA9IE1vZHVsZU5hbWUoZGVzY3JpcHRvci5maWxlKCktPm5hbWUoKSkgKyAiLiIgKyBuYW1lOworICB9CisgIHJldHVybiBuYW1lOworfQorCisvLyBQcmludHMgc3RhbmRhcmQgY29uc3RydWN0b3IgYXJndW1lbnRzIHNlcmlhbGl6ZWRfc3RhcnQgYW5kIHNlcmlhbGl6ZWRfZW5kLgorLy8gQXJnczoKKy8vICAgZGVzY3JpcHRvcjogVGhlIGNwcCBkZXNjcmlwdG9yIHRvIGhhdmUgYSBzZXJpYWxpemVkIHJlZmVyZW5jZS4KKy8vICAgcHJvdG86IEEgcHJvdG8KKy8vIEV4YW1wbGUgcHJpbnRlciBvdXRwdXQ6CisvLyBzZXJpYWxpemVkX3N0YXJ0PTQxLAorLy8gc2VyaWFsaXplZF9lbmQ9NDMsCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JULCB0eXBlbmFtZSBEZXNjcmlwdG9yUHJvdG9UPgordm9pZCBHZW5lcmF0b3I6OlByaW50U2VyaWFsaXplZFBiSW50ZXJ2YWwoCisgICAgY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsIERlc2NyaXB0b3JQcm90b1QmIHByb3RvKSBjb25zdCB7CisgIGRlc2NyaXB0b3IuQ29weVRvKCZwcm90byk7CisgIHN0cmluZyBzcDsKKyAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJnNwKTsKKyAgaW50IG9mZnNldCA9IGZpbGVfZGVzY3JpcHRvcl9zZXJpYWxpemVkXy5maW5kKHNwKTsKKyAgR09PR0xFX0NIRUNLX0dFKG9mZnNldCwgMCk7CisKKyAgcHJpbnRlcl8tPlByaW50KCJzZXJpYWxpemVkX3N0YXJ0PSRzZXJpYWxpemVkX3N0YXJ0JCxcbiIKKyAgICAgICAgICAgICAgICAgICJzZXJpYWxpemVkX2VuZD0kc2VyaWFsaXplZF9lbmQkLFxuIiwKKyAgICAgICAgICAgICAgICAgICJzZXJpYWxpemVkX3N0YXJ0IiwgU2ltcGxlSXRvYShvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgInNlcmlhbGl6ZWRfZW5kIiwgU2ltcGxlSXRvYShvZmZzZXQgKyBzcC5zaXplKCkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgorfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZWFmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTU2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IHJvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pCisvLworLy8gR2VuZXJhdGVzIFB5dGhvbiBjb2RlIGZvciBhIGdpdmVuIC5wcm90byBmaWxlLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QWVRIT05fR0VORVJBVE9SX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUFlUSE9OX0dFTkVSQVRPUl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBEZXNjcmlwdG9yOworY2xhc3MgRW51bURlc2NyaXB0b3I7CitjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yOworY2xhc3MgRmllbGREZXNjcmlwdG9yOworY2xhc3MgU2VydmljZURlc2NyaXB0b3I7CisKK25hbWVzcGFjZSBpbyB7IGNsYXNzIFByaW50ZXI7IH0KKworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK25hbWVzcGFjZSBweXRob24geworCisvLyBDb2RlR2VuZXJhdG9yIGltcGxlbWVudGF0aW9uIGZvciBnZW5lcmF0ZWQgUHl0aG9uIHByb3RvY29sIGJ1ZmZlciBjbGFzc2VzLgorLy8gSWYgeW91IGNyZWF0ZSB5b3VyIG93biBwcm90b2NvbCBjb21waWxlciBiaW5hcnkgYW5kIHlvdSB3YW50IGl0IHRvIHN1cHBvcnQKKy8vIFB5dGhvbiBvdXRwdXQsIHlvdSBjYW4gZG8gc28gYnkgcmVnaXN0ZXJpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcworLy8gQ29kZUdlbmVyYXRvciB3aXRoIHRoZSBDb21tYW5kTGluZUludGVyZmFjZSBpbiB5b3VyIG1haW4oKSBmdW5jdGlvbi4KK2NsYXNzIExJQlBST1RPQ19FWFBPUlQgR2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgR2VuZXJhdG9yKCk7CisgIHZpcnR1YWwgfkdlbmVyYXRvcigpOworCisgIC8vIENvZGVHZW5lcmF0b3IgbWV0aG9kcy4KKyAgdmlydHVhbCBib29sIEdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdm9pZCBQcmludEltcG9ydHMoKSBjb25zdDsKKyAgdm9pZCBQcmludEZpbGVEZXNjcmlwdG9yKCkgY29uc3Q7CisgIHZvaWQgUHJpbnRUb3BMZXZlbEVudW1zKCkgY29uc3Q7CisgIHZvaWQgUHJpbnRBbGxOZXN0ZWRFbnVtc0luRmlsZSgpIGNvbnN0OworICB2b2lkIFByaW50TmVzdGVkRW51bXMoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHZvaWQgUHJpbnRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yJiBlbnVtX2Rlc2NyaXB0b3IpIGNvbnN0OworCisgIHZvaWQgUHJpbnRUb3BMZXZlbEV4dGVuc2lvbnMoKSBjb25zdDsKKworICB2b2lkIFByaW50RmllbGREZXNjcmlwdG9yKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCwgYm9vbCBpc19leHRlbnNpb24pIGNvbnN0OworICB2b2lkIFByaW50RmllbGREZXNjcmlwdG9yc0luRGVzY3JpcHRvcigKKyAgICAgIGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvciwKKyAgICAgIGJvb2wgaXNfZXh0ZW5zaW9uLAorICAgICAgY29uc3Qgc3RyaW5nJiBsaXN0X3ZhcmlhYmxlX25hbWUsCisgICAgICBpbnQgKERlc2NyaXB0b3I6OipDb3VudEZuKSgpIGNvbnN0LAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiAoRGVzY3JpcHRvcjo6KkdldHRlckZuKShpbnQpIGNvbnN0KSBjb25zdDsKKyAgdm9pZCBQcmludEZpZWxkc0luRGVzY3JpcHRvcihjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIFByaW50RXh0ZW5zaW9uc0luRGVzY3JpcHRvcihjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIFByaW50TWVzc2FnZURlc2NyaXB0b3JzKCkgY29uc3Q7CisgIHZvaWQgUHJpbnREZXNjcmlwdG9yKGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvcikgY29uc3Q7CisgIHZvaWQgUHJpbnROZXN0ZWREZXNjcmlwdG9ycyhjb25zdCBEZXNjcmlwdG9yJiBjb250YWluaW5nX2Rlc2NyaXB0b3IpIGNvbnN0OworCisgIHZvaWQgUHJpbnRNZXNzYWdlcygpIGNvbnN0OworICB2b2lkIFByaW50TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIFByaW50TmVzdGVkTWVzc2FnZXMoY29uc3QgRGVzY3JpcHRvciYgY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdDsKKworICB2b2lkIEZpeEZvcmVpZ25GaWVsZHNJbkRlc2NyaXB0b3JzKCkgY29uc3Q7CisgIHZvaWQgRml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcigKKyAgICAgIGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsCisgICAgICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX2Rlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIEZpeEZvcmVpZ25GaWVsZHNJbkZpZWxkKGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHl0aG9uX2RpY3RfbmFtZSkgY29uc3Q7CisgIHZvaWQgQWRkTWVzc2FnZVRvRmlsZURlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHN0cmluZyBGaWVsZFJlZmVyZW5jaW5nRXhwcmVzc2lvbihjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBweXRob25fZGljdF9uYW1lKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUPgorICB2b2lkIEZpeENvbnRhaW5pbmdUeXBlSW5EZXNjcmlwdG9yKAorICAgICAgY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsCisgICAgICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX2Rlc2NyaXB0b3IpIGNvbnN0OworCisgIHZvaWQgRml4Rm9yZWlnbkZpZWxkc0luRXh0ZW5zaW9ucygpIGNvbnN0OworICB2b2lkIEZpeEZvcmVpZ25GaWVsZHNJbkV4dGVuc2lvbigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZXh0ZW5zaW9uX2ZpZWxkKSBjb25zdDsKKyAgdm9pZCBGaXhGb3JlaWduRmllbGRzSW5OZXN0ZWRFeHRlbnNpb25zKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworCisgIHZvaWQgUHJpbnRTZXJ2aWNlcygpIGNvbnN0OworICB2b2lkIFByaW50U2VydmljZURlc2NyaXB0b3IoY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIFByaW50U2VydmljZUNsYXNzKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBQcmludFNlcnZpY2VTdHViKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKworICB2b2lkIFByaW50RW51bVZhbHVlRGVzY3JpcHRvcihjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKyAgc3RyaW5nIE9wdGlvbnNWYWx1ZShjb25zdCBzdHJpbmcmIGNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzZXJpYWxpemVkX29wdGlvbnMpIGNvbnN0OworICBib29sIEdlbmVyYXRpbmdEZXNjcmlwdG9yUHJvdG8oKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQ+CisgIHN0cmluZyBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yKSBjb25zdDsKKyAgc3RyaW5nIE1vZHVsZUxldmVsTWVzc2FnZU5hbWUoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHN0cmluZyBNb2R1bGVMZXZlbFNlcnZpY2VEZXNjcmlwdG9yTmFtZSgKKyAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQsIHR5cGVuYW1lIERlc2NyaXB0b3JQcm90b1Q+CisgIHZvaWQgUHJpbnRTZXJpYWxpemVkUGJJbnRlcnZhbCgKKyAgICAgIGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yLCBEZXNjcmlwdG9yUHJvdG9UJiBwcm90bykgY29uc3Q7CisKKyAgLy8gVmVyeSBjb2Fyc2UtZ3JhaW5lZCBsb2NrIHRvIGVuc3VyZSB0aGF0IEdlbmVyYXRlKCkgaXMgcmVlbnRyYW50LgorICAvLyBHdWFyZHMgZmlsZV8sIHByaW50ZXJfIGFuZCBmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF8uCisgIG11dGFibGUgTXV0ZXggbXV0ZXhfOworICBtdXRhYmxlIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsgIC8vIFNldCBpbiBHZW5lcmF0ZSgpLiAgVW5kZXIgbXV0ZXhfLgorICBtdXRhYmxlIHN0cmluZyBmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF87CisgIG11dGFibGUgaW86OlByaW50ZXIqIHByaW50ZXJfOyAgLy8gU2V0IGluIEdlbmVyYXRlKCkuICBVbmRlciBtdXRleF8uCisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdlbmVyYXRvcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QWVRIT05fR0VORVJBVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX3BsdWdpbl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTYxOWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMTYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBUT0RPKGtlbnRvbik6ICBTaGFyZSBjb2RlIHdpdGggdGhlIHZlcnNpb25zIG9mIHRoaXMgdGVzdCBpbiBvdGhlciBsYW5ndWFnZXM/CisvLyAgIEl0IHNlZW1lZCBsaWtlIHBhcmFtZXRlcml6aW5nIGl0IHdvdWxkIGFkZCBtb3JlIGNvbXBsZXhpdHkgdGhhbiBpdCBpcworLy8gICB3b3J0aC4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworbmFtZXNwYWNlIHB5dGhvbiB7CituYW1lc3BhY2UgeworCitjbGFzcyBUZXN0R2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgVGVzdEdlbmVyYXRvcigpIHt9CisgIH5UZXN0R2VuZXJhdG9yKCkge30KKworICB2aXJ0dWFsIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdCB7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0X3BiMi5weSIsICJpbXBvcnRzIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0X3BiMi5weSIsICJtb2R1bGVfc2NvcGUiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3RfcGIyLnB5IiwgImNsYXNzX3Njb3BlOmZvby5CYXIiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3RfcGIyLnB5IiwgImNsYXNzX3Njb3BlOmZvby5CYXIuQmF6IiwgY29udGV4dCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIFRyeUluc2VydChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCwKKyAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCkgY29uc3QgeworICAgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICBjb250ZXh0LT5PcGVuRm9ySW5zZXJ0KGZpbGVuYW1lLCBpbnNlcnRpb25fcG9pbnQpKTsKKyAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKKyAgICBwcmludGVyLlByaW50KCIvLyBpbnNlcnRlZCAkbmFtZSRcbiIsICJuYW1lIiwgaW5zZXJ0aW9uX3BvaW50KTsKKyAgfQorfTsKKworLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgYWxsIHRoZSBleHBlY3RlZCBpbnNlcnRpb24gcG9pbnRzIGV4aXN0LiAgSXQgZG9lcworLy8gbm90IHZlcmlmeSB0aGF0IHRoZXkgYXJlIGNvcnJlY3RseS1wbGFjZWQ7IHRoYXQgd291bGQgcmVxdWlyZSBhY3R1YWxseQorLy8gY29tcGlsaW5nIHRoZSBvdXRwdXQgd2hpY2ggaXMgYSBiaXQgbW9yZSB0aGFuIEkgY2FyZSB0byBkbyBmb3IgdGhpcyB0ZXN0LgorVEVTVChQeXRob25QbHVnaW5UZXN0LCBQbHVnaW5UZXN0KSB7CisgIEZpbGU6OldyaXRlU3RyaW5nVG9GaWxlT3JEaWUoCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJwYWNrYWdlIGZvbztcbiIKKyAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAiICBtZXNzYWdlIEJheiB7fVxuIgorICAgICAgIn1cbiIsCisgICAgICBUZXN0VGVtcERpcigpICsgIi90ZXN0LnByb3RvIik7CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKKyAgY2xpLlNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKHRydWUpOworCisgIHB5dGhvbjo6R2VuZXJhdG9yIHB5dGhvbl9nZW5lcmF0b3I7CisgIFRlc3RHZW5lcmF0b3IgdGVzdF9nZW5lcmF0b3I7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1weXRob25fb3V0IiwgJnB5dGhvbl9nZW5lcmF0b3IsICIiKTsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLXRlc3Rfb3V0IiwgJnRlc3RfZ2VuZXJhdG9yLCAiIik7CisKKyAgc3RyaW5nIHByb3RvX3BhdGggPSAiLUkiICsgVGVzdFRlbXBEaXIoKTsKKyAgc3RyaW5nIHB5dGhvbl9vdXQgPSAiLS1weXRob25fb3V0PSIgKyBUZXN0VGVtcERpcigpOworICBzdHJpbmcgdGVzdF9vdXQgPSAiLS10ZXN0X291dD0iICsgVGVzdFRlbXBEaXIoKTsKKworICBjb25zdCBjaGFyKiBhcmd2W10gPSB7CisgICAgInByb3RvYyIsCisgICAgcHJvdG9fcGF0aC5jX3N0cigpLAorICAgIHB5dGhvbl9vdXQuY19zdHIoKSwKKyAgICB0ZXN0X291dC5jX3N0cigpLAorICAgICJ0ZXN0LnByb3RvIgorICB9OworCisgIEVYUEVDVF9FUSgwLCBjbGkuUnVuKDUsIGFyZ3YpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgcHl0aG9uCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiNWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MKQEAgLTAsMCArMSw0NjAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworI2lmZGVmIF9XSU4zMgorCitzdGF0aWMgdm9pZCBDbG9zZUhhbmRsZU9yRGllKEhBTkRMRSBoYW5kbGUpIHsKKyAgaWYgKCFDbG9zZUhhbmRsZShoYW5kbGUpKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNsb3NlSGFuZGxlOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgU3VicHJvY2Vzczo6V2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOworICB9Cit9CisKK1N1YnByb2Nlc3M6OlN1YnByb2Nlc3MoKQorICAgIDogcHJvY2Vzc19zdGFydF9lcnJvcl8oRVJST1JfU1VDQ0VTUyksCisgICAgICBjaGlsZF9oYW5kbGVfKE5VTEwpLCBjaGlsZF9zdGRpbl8oTlVMTCksIGNoaWxkX3N0ZG91dF8oTlVMTCkge30KKworU3VicHJvY2Vzczo6flN1YnByb2Nlc3MoKSB7CisgIGlmIChjaGlsZF9zdGRpbl8gIT0gTlVMTCkgeworICAgIENsb3NlSGFuZGxlT3JEaWUoY2hpbGRfc3RkaW5fKTsKKyAgfQorICBpZiAoY2hpbGRfc3Rkb3V0XyAhPSBOVUxMKSB7CisgICAgQ2xvc2VIYW5kbGVPckRpZShjaGlsZF9zdGRvdXRfKTsKKyAgfQorfQorCit2b2lkIFN1YnByb2Nlc3M6OlN0YXJ0KGNvbnN0IHN0cmluZyYgcHJvZ3JhbSwgU2VhcmNoTW9kZSBzZWFyY2hfbW9kZSkgeworICAvLyBDcmVhdGUgdGhlIHBpcGVzLgorICBIQU5ETEUgc3RkaW5fcGlwZV9yZWFkOworICBIQU5ETEUgc3RkaW5fcGlwZV93cml0ZTsKKyAgSEFORExFIHN0ZG91dF9waXBlX3JlYWQ7CisgIEhBTkRMRSBzdGRvdXRfcGlwZV93cml0ZTsKKworICBpZiAoIUNyZWF0ZVBpcGUoJnN0ZGluX3BpcGVfcmVhZCwgJnN0ZGluX3BpcGVfd3JpdGUsIE5VTEwsIDApKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNyZWF0ZVBpcGU6ICIgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOworICB9CisgIGlmICghQ3JlYXRlUGlwZSgmc3Rkb3V0X3BpcGVfcmVhZCwgJnN0ZG91dF9waXBlX3dyaXRlLCBOVUxMLCAwKSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDcmVhdGVQaXBlOiAiIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKKyAgfQorCisgIC8vIE1ha2UgY2hpbGQgc2lkZSBvZiB0aGUgcGlwZXMgaW5oZXJpdGFibGUuCisgIGlmICghU2V0SGFuZGxlSW5mb3JtYXRpb24oc3RkaW5fcGlwZV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GTEFHX0lOSEVSSVQsIEhBTkRMRV9GTEFHX0lOSEVSSVQpKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlNldEhhbmRsZUluZm9ybWF0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOworICB9CisgIGlmICghU2V0SGFuZGxlSW5mb3JtYXRpb24oc3Rkb3V0X3BpcGVfd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZMQUdfSU5IRVJJVCwgSEFORExFX0ZMQUdfSU5IRVJJVCkpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiU2V0SGFuZGxlSW5mb3JtYXRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBXaW4zMkVycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IoKSk7CisgIH0KKworICAvLyBTZXR1cCBTVEFSVFVQSU5GTyB0byByZWRpcmVjdCBoYW5kbGVzLgorICBTVEFSVFVQSU5GT0Egc3RhcnR1cF9pbmZvOworICBaZXJvTWVtb3J5KCZzdGFydHVwX2luZm8sIHNpemVvZihzdGFydHVwX2luZm8pKTsKKyAgc3RhcnR1cF9pbmZvLmNiID0gc2l6ZW9mKHN0YXJ0dXBfaW5mbyk7CisgIHN0YXJ0dXBfaW5mby5kd0ZsYWdzID0gU1RBUlRGX1VTRVNUREhBTkRMRVM7CisgIHN0YXJ0dXBfaW5mby5oU3RkSW5wdXQgPSBzdGRpbl9waXBlX3JlYWQ7CisgIHN0YXJ0dXBfaW5mby5oU3RkT3V0cHV0ID0gc3Rkb3V0X3BpcGVfd3JpdGU7CisgIHN0YXJ0dXBfaW5mby5oU3RkRXJyb3IgPSBHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7CisKKyAgaWYgKHN0YXJ0dXBfaW5mby5oU3RkRXJyb3IgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiR2V0U3RkSGFuZGxlOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOworICB9CisKKyAgLy8gQ3JlYXRlUHJvY2VzcygpIG11dGF0ZXMgaXRzIHNlY29uZCBwYXJhbWV0ZXIuICBXVEY/CisgIGNoYXIqIG5hbWVfY29weSA9IHN0cmR1cChwcm9ncmFtLmNfc3RyKCkpOworCisgIC8vIENyZWF0ZSB0aGUgcHJvY2Vzcy4KKyAgUFJPQ0VTU19JTkZPUk1BVElPTiBwcm9jZXNzX2luZm87CisKKyAgaWYgKENyZWF0ZVByb2Nlc3NBKChzZWFyY2hfbW9kZSA9PSBTRUFSQ0hfUEFUSCkgPyBOVUxMIDogcHJvZ3JhbS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgKHNlYXJjaF9tb2RlID09IFNFQVJDSF9QQVRIKSA/IG5hbWVfY29weSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gcHJvY2VzcyBzZWN1cml0eSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gdGhyZWFkIHNlY3VyaXR5IGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgIFRSVUUsICAvLyBpbmhlcml0IGhhbmRsZXM/CisgICAgICAgICAgICAgICAgICAgICAwLCAgICAgLy8gb2JzY3VyZSBjcmVhdGlvbiBmbGFncworICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIGVudmlyb25tZW50IChpbmhlcml0IGZyb20gcGFyZW50KQorICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIGN1cnJlbnQgZGlyZWN0b3J5IChpbmhlcml0IGZyb20gcGFyZW50KQorICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0dXBfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICZwcm9jZXNzX2luZm8pKSB7CisgICAgY2hpbGRfaGFuZGxlXyA9IHByb2Nlc3NfaW5mby5oUHJvY2VzczsKKyAgICBDbG9zZUhhbmRsZU9yRGllKHByb2Nlc3NfaW5mby5oVGhyZWFkKTsKKyAgICBjaGlsZF9zdGRpbl8gPSBzdGRpbl9waXBlX3dyaXRlOworICAgIGNoaWxkX3N0ZG91dF8gPSBzdGRvdXRfcGlwZV9yZWFkOworICB9IGVsc2UgeworICAgIHByb2Nlc3Nfc3RhcnRfZXJyb3JfID0gR2V0TGFzdEVycm9yKCk7CisgICAgQ2xvc2VIYW5kbGVPckRpZShzdGRpbl9waXBlX3dyaXRlKTsKKyAgICBDbG9zZUhhbmRsZU9yRGllKHN0ZG91dF9waXBlX3JlYWQpOworICB9CisKKyAgQ2xvc2VIYW5kbGVPckRpZShzdGRpbl9waXBlX3JlYWQpOworICBDbG9zZUhhbmRsZU9yRGllKHN0ZG91dF9waXBlX3dyaXRlKTsKKyAgZnJlZShuYW1lX2NvcHkpOworfQorCitib29sIFN1YnByb2Nlc3M6OkNvbW11bmljYXRlKGNvbnN0IE1lc3NhZ2UmIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIHsKKyAgaWYgKHByb2Nlc3Nfc3RhcnRfZXJyb3JfICE9IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAqZXJyb3IgPSBXaW4zMkVycm9yTWVzc2FnZShwcm9jZXNzX3N0YXJ0X2Vycm9yXyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgR09PR0xFX0NIRUNLKGNoaWxkX2hhbmRsZV8gIT0gTlVMTCkgPDwgIk11c3QgY2FsbCBTdGFydCgpIGZpcnN0LiI7CisKKyAgc3RyaW5nIGlucHV0X2RhdGEgPSBpbnB1dC5TZXJpYWxpemVBc1N0cmluZygpOworICBzdHJpbmcgb3V0cHV0X2RhdGE7CisKKyAgaW50IGlucHV0X3BvcyA9IDA7CisKKyAgd2hpbGUgKGNoaWxkX3N0ZG91dF8gIT0gTlVMTCkgeworICAgIEhBTkRMRSBoYW5kbGVzWzJdOworICAgIGludCBoYW5kbGVfY291bnQgPSAwOworCisgICAgaWYgKGNoaWxkX3N0ZGluXyAhPSBOVUxMKSB7CisgICAgICBoYW5kbGVzW2hhbmRsZV9jb3VudCsrXSA9IGNoaWxkX3N0ZGluXzsKKyAgICB9CisgICAgaWYgKGNoaWxkX3N0ZG91dF8gIT0gTlVMTCkgeworICAgICAgaGFuZGxlc1toYW5kbGVfY291bnQrK10gPSBjaGlsZF9zdGRvdXRfOworICAgIH0KKworICAgIERXT1JEIHdhaXRfcmVzdWx0ID0KKyAgICAgICAgV2FpdEZvck11bHRpcGxlT2JqZWN0cyhoYW5kbGVfY291bnQsIGhhbmRsZXMsIEZBTFNFLCBJTkZJTklURSk7CisKKyAgICBIQU5ETEUgc2lnbmFsZWRfaGFuZGxlOworICAgIGlmICh3YWl0X3Jlc3VsdCA+PSBXQUlUX09CSkVDVF8wICYmCisgICAgICAgIHdhaXRfcmVzdWx0IDwgV0FJVF9PQkpFQ1RfMCArIGhhbmRsZV9jb3VudCkgeworICAgICAgc2lnbmFsZWRfaGFuZGxlID0gaGFuZGxlc1t3YWl0X3Jlc3VsdCAtIFdBSVRfT0JKRUNUXzBdOworICAgIH0gZWxzZSBpZiAod2FpdF9yZXN1bHQgPT0gV0FJVF9GQUlMRUQpIHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJXYWl0Rm9yTXVsdGlwbGVPYmplY3RzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBXaW4zMkVycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJXYWl0Rm9yTXVsdGlwbGVPYmplY3RzOiBVbmV4cGVjdGVkIHJldHVybiBjb2RlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCB3YWl0X3Jlc3VsdDsKKyAgICB9CisKKyAgICBpZiAoc2lnbmFsZWRfaGFuZGxlID09IGNoaWxkX3N0ZGluXykgeworICAgICAgRFdPUkQgbjsKKyAgICAgIGlmICghV3JpdGVGaWxlKGNoaWxkX3N0ZGluXywKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0X2RhdGEuZGF0YSgpICsgaW5wdXRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZGF0YS5zaXplKCkgLSBpbnB1dF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAmbiwgTlVMTCkpIHsKKyAgICAgICAgLy8gQ2hpbGQgY2xvc2VkIHBpcGUuICBQcmVzdW1hYmx5IGl0IHdpbGwgcmVwb3J0IGFuIGVycm9yIGxhdGVyLgorICAgICAgICAvLyBQcmV0ZW5kIHdlJ3JlIGRvbmUgZm9yIG5vdy4KKyAgICAgICAgaW5wdXRfcG9zID0gaW5wdXRfZGF0YS5zaXplKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnB1dF9wb3MgKz0gbjsKKyAgICAgIH0KKworICAgICAgaWYgKGlucHV0X3BvcyA9PSBpbnB1dF9kYXRhLnNpemUoKSkgeworICAgICAgICAvLyBXZSdyZSBkb25lIHdyaXRpbmcuICBDbG9zZS4KKyAgICAgICAgQ2xvc2VIYW5kbGVPckRpZShjaGlsZF9zdGRpbl8pOworICAgICAgICBjaGlsZF9zdGRpbl8gPSBOVUxMOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2lnbmFsZWRfaGFuZGxlID09IGNoaWxkX3N0ZG91dF8pIHsKKyAgICAgIGNoYXIgYnVmZmVyWzQwOTZdOworICAgICAgRFdPUkQgbjsKKworICAgICAgaWYgKCFSZWFkRmlsZShjaGlsZF9zdGRvdXRfLCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAmbiwgTlVMTCkpIHsKKyAgICAgICAgLy8gV2UncmUgZG9uZSByZWFkaW5nLiAgQ2xvc2UuCisgICAgICAgIENsb3NlSGFuZGxlT3JEaWUoY2hpbGRfc3Rkb3V0Xyk7CisgICAgICAgIGNoaWxkX3N0ZG91dF8gPSBOVUxMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0X2RhdGEuYXBwZW5kKGJ1ZmZlciwgbik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGNoaWxkX3N0ZGluXyAhPSBOVUxMKSB7CisgICAgLy8gQ2hpbGQgZGlkIG5vdCBmaW5pc2ggcmVhZGluZyBpbnB1dCBiZWZvcmUgaXQgY2xvc2VkIHRoZSBvdXRwdXQuCisgICAgLy8gUHJlc3VtYWJseSBpdCBleGl0ZWQgd2l0aCBhbiBlcnJvci4KKyAgICBDbG9zZUhhbmRsZU9yRGllKGNoaWxkX3N0ZGluXyk7CisgICAgY2hpbGRfc3RkaW5fID0gTlVMTDsKKyAgfQorCisgIERXT1JEIHdhaXRfcmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChjaGlsZF9oYW5kbGVfLCBJTkZJTklURSk7CisKKyAgaWYgKHdhaXRfcmVzdWx0ID09IFdBSVRfRkFJTEVEKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIldhaXRGb3JTaW5nbGVPYmplY3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBXaW4zMkVycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IoKSk7CisgIH0gZWxzZSBpZiAod2FpdF9yZXN1bHQgIT0gV0FJVF9PQkpFQ1RfMCkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJXYWl0Rm9yU2luZ2xlT2JqZWN0OiBVbmV4cGVjdGVkIHJldHVybiBjb2RlOiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgd2FpdF9yZXN1bHQ7CisgIH0KKworICBEV09SRCBleGl0X2NvZGU7CisgIGlmICghR2V0RXhpdENvZGVQcm9jZXNzKGNoaWxkX2hhbmRsZV8sICZleGl0X2NvZGUpKSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkdldEV4aXRDb2RlUHJvY2VzczogIgorICAgICAgICAgICAgICAgICAgICAgIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKKyAgfQorCisgIENsb3NlSGFuZGxlT3JEaWUoY2hpbGRfaGFuZGxlXyk7CisgIGNoaWxkX2hhbmRsZV8gPSBOVUxMOworCisgIGlmIChleGl0X2NvZGUgIT0gMCkgeworICAgICplcnJvciA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICJQbHVnaW4gZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJDAuIiwgZXhpdF9jb2RlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIW91dHB1dC0+UGFyc2VGcm9tU3RyaW5nKG91dHB1dF9kYXRhKSkgeworICAgICplcnJvciA9ICJQbHVnaW4gb3V0cHV0IGlzIHVucGFyc2VhYmxlOiAiICsgQ0VzY2FwZShvdXRwdXRfZGF0YSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0cmluZyBTdWJwcm9jZXNzOjpXaW4zMkVycm9yTWVzc2FnZShEV09SRCBlcnJvcl9jb2RlKSB7CisgIGNoYXIqIG1lc3NhZ2U7CisKKyAgLy8gV1RGPworICBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8CisgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAorICAgICAgICAgICAgICAgIE5VTEwsIGVycm9yX2NvZGUsIDAsCisgICAgICAgICAgICAgICAgKExQVFNUUikmbWVzc2FnZSwgIC8vIE5PVCBBIEJVRyEKKyAgICAgICAgICAgICAgICAwLCBOVUxMKTsKKworICBzdHJpbmcgcmVzdWx0ID0gbWVzc2FnZTsKKyAgTG9jYWxGcmVlKG1lc3NhZ2UpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNlbHNlICAvLyBfV0lOMzIKKworU3VicHJvY2Vzczo6U3VicHJvY2VzcygpCisgICAgOiBjaGlsZF9waWRfKC0xKSwgY2hpbGRfc3RkaW5fKC0xKSwgY2hpbGRfc3Rkb3V0XygtMSkge30KKworU3VicHJvY2Vzczo6flN1YnByb2Nlc3MoKSB7CisgIGlmIChjaGlsZF9zdGRpbl8gIT0gLTEpIHsKKyAgICBjbG9zZShjaGlsZF9zdGRpbl8pOworICB9CisgIGlmIChjaGlsZF9zdGRvdXRfICE9IC0xKSB7CisgICAgY2xvc2UoY2hpbGRfc3Rkb3V0Xyk7CisgIH0KK30KKwordm9pZCBTdWJwcm9jZXNzOjpTdGFydChjb25zdCBzdHJpbmcmIHByb2dyYW0sIFNlYXJjaE1vZGUgc2VhcmNoX21vZGUpIHsKKyAgLy8gTm90ZSB0aGF0IHdlIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciB0aHJlYWRzLCB0aHVzIHdlIGRvbid0IGhhdmUgdG8KKyAgLy8gZG8gY3Jhenkgc3R1ZmYgbGlrZSB1c2luZyBzb2NrZXQgcGFpcnMgb3IgYXZvaWRpbmcgbGliYyBsb2Nrcy4KKworICAvLyBbMF0gaXMgcmVhZCBlbmQsIFsxXSBpcyB3cml0ZSBlbmQuCisgIGludCBzdGRpbl9waXBlWzJdOworICBpbnQgc3Rkb3V0X3BpcGVbMl07CisKKyAgcGlwZShzdGRpbl9waXBlKTsKKyAgcGlwZShzdGRvdXRfcGlwZSk7CisKKyAgY2hhciogYXJndlsyXSA9IHsgc3RyZHVwKHByb2dyYW0uY19zdHIoKSksIE5VTEwgfTsKKworICBjaGlsZF9waWRfID0gZm9yaygpOworICBpZiAoY2hpbGRfcGlkXyA9PSAtMSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJmb3JrOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKKyAgfSBlbHNlIGlmIChjaGlsZF9waWRfID09IDApIHsKKyAgICAvLyBXZSBhcmUgdGhlIGNoaWxkLgorICAgIGR1cDIoc3RkaW5fcGlwZVswXSwgU1RESU5fRklMRU5PKTsKKyAgICBkdXAyKHN0ZG91dF9waXBlWzFdLCBTVERPVVRfRklMRU5PKTsKKworICAgIGNsb3NlKHN0ZGluX3BpcGVbMF0pOworICAgIGNsb3NlKHN0ZGluX3BpcGVbMV0pOworICAgIGNsb3NlKHN0ZG91dF9waXBlWzBdKTsKKyAgICBjbG9zZShzdGRvdXRfcGlwZVsxXSk7CisKKyAgICBzd2l0Y2ggKHNlYXJjaF9tb2RlKSB7CisgICAgICBjYXNlIFNFQVJDSF9QQVRIOgorICAgICAgICBleGVjdnAoYXJndlswXSwgYXJndik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFWEFDVF9OQU1FOgorICAgICAgICBleGVjdihhcmd2WzBdLCBhcmd2KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gV3JpdGUgZGlyZWN0bHkgdG8gU1RERVJSX0ZJTEVOTyB0byBhdm9pZCBzdGRpbyBjb2RlIHBhdGhzIHRoYXQgbWF5IGRvCisgICAgLy8gc3R1ZmYgdGhhdCBpcyB1bnNhZmUgaGVyZS4KKyAgICB3cml0ZShTVERFUlJfRklMRU5PLCBhcmd2WzBdLCBzdHJsZW4oYXJndlswXSkpOworICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UgPSAiOiBwcm9ncmFtIG5vdCBmb3VuZCBvciBpcyBub3QgZXhlY3V0YWJsZVxuIjsKKyAgICB3cml0ZShTVERFUlJfRklMRU5PLCBtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSkpOworCisgICAgLy8gTXVzdCB1c2UgX2V4aXQoKSByYXRoZXIgdGhhbiBleGl0KCkgdG8gYXZvaWQgZmx1c2hpbmcgb3V0cHV0IGJ1ZmZlcnMKKyAgICAvLyB0aGF0IHdpbGwgYWxzbyBiZSBmbHVzaGVkIGJ5IHRoZSBwYXJlbnQuCisgICAgX2V4aXQoMSk7CisgIH0gZWxzZSB7CisgICAgZnJlZShhcmd2WzBdKTsKKworICAgIGNsb3NlKHN0ZGluX3BpcGVbMF0pOworICAgIGNsb3NlKHN0ZG91dF9waXBlWzFdKTsKKworICAgIGNoaWxkX3N0ZGluXyA9IHN0ZGluX3BpcGVbMV07CisgICAgY2hpbGRfc3Rkb3V0XyA9IHN0ZG91dF9waXBlWzBdOworICB9Cit9CisKK2Jvb2wgU3VicHJvY2Vzczo6Q29tbXVuaWNhdGUoY29uc3QgTWVzc2FnZSYgaW5wdXQsIE1lc3NhZ2UqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgeworCisgIEdPT0dMRV9DSEVDS19ORShjaGlsZF9zdGRpbl8sIC0xKSA8PCAiTXVzdCBjYWxsIFN0YXJ0KCkgZmlyc3QuIjsKKworICAvLyBUaGUgInNpZ2hhbmRsZXJfdCIgdHlwZWRlZiBpcyBHTlUtc3BlY2lmaWMsIHNvIGRlZmluZSBvdXIgb3duLgorICB0eXBlZGVmIHZvaWQgU2lnbmFsSGFuZGxlcihpbnQpOworCisgIC8vIE1ha2Ugc3VyZSBTSUdQSVBFIGlzIGRpc2FibGVkIHNvIHRoYXQgaWYgdGhlIGNoaWxkIGRpZXMgaXQgZG9lc24ndCBraWxsIHVzLgorICBTaWduYWxIYW5kbGVyKiBvbGRfcGlwZV9oYW5kbGVyID0gc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisgIHN0cmluZyBpbnB1dF9kYXRhID0gaW5wdXQuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgc3RyaW5nIG91dHB1dF9kYXRhOworCisgIGludCBpbnB1dF9wb3MgPSAwOworICBpbnQgbWF4X2ZkID0gbWF4KGNoaWxkX3N0ZGluXywgY2hpbGRfc3Rkb3V0Xyk7CisKKyAgd2hpbGUgKGNoaWxkX3N0ZG91dF8gIT0gLTEpIHsKKyAgICBmZF9zZXQgcmVhZF9mZHM7CisgICAgZmRfc2V0IHdyaXRlX2ZkczsKKyAgICBGRF9aRVJPKCZyZWFkX2Zkcyk7CisgICAgRkRfWkVSTygmd3JpdGVfZmRzKTsKKyAgICBpZiAoY2hpbGRfc3Rkb3V0XyAhPSAtMSkgeworICAgICAgRkRfU0VUKGNoaWxkX3N0ZG91dF8sICZyZWFkX2Zkcyk7CisgICAgfQorICAgIGlmIChjaGlsZF9zdGRpbl8gIT0gLTEpIHsKKyAgICAgIEZEX1NFVChjaGlsZF9zdGRpbl8sICZ3cml0ZV9mZHMpOworICAgIH0KKworICAgIGlmIChzZWxlY3QobWF4X2ZkICsgMSwgJnJlYWRfZmRzLCAmd3JpdGVfZmRzLCBOVUxMLCBOVUxMKSA8IDApIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgICAvLyBJbnRlcnJ1cHRlZCBieSBzaWduYWwuICBUcnkgYWdhaW4uCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgInNlbGVjdDogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNoaWxkX3N0ZGluXyAhPSAtMSAmJiBGRF9JU1NFVChjaGlsZF9zdGRpbl8sICZ3cml0ZV9mZHMpKSB7CisgICAgICBpbnQgbiA9IHdyaXRlKGNoaWxkX3N0ZGluXywgaW5wdXRfZGF0YS5kYXRhKCkgKyBpbnB1dF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZGF0YS5zaXplKCkgLSBpbnB1dF9wb3MpOworICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIC8vIENoaWxkIGNsb3NlZCBwaXBlLiAgUHJlc3VtYWJseSBpdCB3aWxsIHJlcG9ydCBhbiBlcnJvciBsYXRlci4KKyAgICAgICAgLy8gUHJldGVuZCB3ZSdyZSBkb25lIGZvciBub3cuCisgICAgICAgIGlucHV0X3BvcyA9IGlucHV0X2RhdGEuc2l6ZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRfcG9zICs9IG47CisgICAgICB9CisKKyAgICAgIGlmIChpbnB1dF9wb3MgPT0gaW5wdXRfZGF0YS5zaXplKCkpIHsKKyAgICAgICAgLy8gV2UncmUgZG9uZSB3cml0aW5nLiAgQ2xvc2UuCisgICAgICAgIGNsb3NlKGNoaWxkX3N0ZGluXyk7CisgICAgICAgIGNoaWxkX3N0ZGluXyA9IC0xOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjaGlsZF9zdGRvdXRfICE9IC0xICYmIEZEX0lTU0VUKGNoaWxkX3N0ZG91dF8sICZyZWFkX2ZkcykpIHsKKyAgICAgIGNoYXIgYnVmZmVyWzQwOTZdOworICAgICAgaW50IG4gPSByZWFkKGNoaWxkX3N0ZG91dF8sIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCisgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgb3V0cHV0X2RhdGEuYXBwZW5kKGJ1ZmZlciwgbik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSdyZSBkb25lIHJlYWRpbmcuICBDbG9zZS4KKyAgICAgICAgY2xvc2UoY2hpbGRfc3Rkb3V0Xyk7CisgICAgICAgIGNoaWxkX3N0ZG91dF8gPSAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoY2hpbGRfc3RkaW5fICE9IC0xKSB7CisgICAgLy8gQ2hpbGQgZGlkIG5vdCBmaW5pc2ggcmVhZGluZyBpbnB1dCBiZWZvcmUgaXQgY2xvc2VkIHRoZSBvdXRwdXQuCisgICAgLy8gUHJlc3VtYWJseSBpdCBleGl0ZWQgd2l0aCBhbiBlcnJvci4KKyAgICBjbG9zZShjaGlsZF9zdGRpbl8pOworICAgIGNoaWxkX3N0ZGluXyA9IC0xOworICB9CisKKyAgaW50IHN0YXR1czsKKyAgd2hpbGUgKHdhaXRwaWQoY2hpbGRfcGlkXywgJnN0YXR1cywgMCkgPT0gLTEpIHsKKyAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJ3YWl0cGlkOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKKyAgICB9CisgIH0KKworICAvLyBSZXN0b3JlIFNJR1BJUEUgaGFuZGxpbmcuCisgIHNpZ25hbChTSUdQSVBFLCBvbGRfcGlwZV9oYW5kbGVyKTsKKworICBpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKKyAgICBpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSAwKSB7CisgICAgICBpbnQgZXJyb3JfY29kZSA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisgICAgICAqZXJyb3IgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAgICJQbHVnaW4gZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJDAuIiwgZXJyb3JfY29kZSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKKyAgICBpbnQgc2lnbmFsID0gV1RFUk1TSUcoc3RhdHVzKTsKKyAgICAqZXJyb3IgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAiUGx1Z2luIGtpbGxlZCBieSBzaWduYWwgJDAuIiwgc2lnbmFsKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgKmVycm9yID0gIk5laXRoZXIgV0VYSVRTVEFUVVMgbm9yIFdURVJNU0lHIGlzIHRydWU/IjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIW91dHB1dC0+UGFyc2VGcm9tU3RyaW5nKG91dHB1dF9kYXRhKSkgeworICAgICplcnJvciA9ICJQbHVnaW4gb3V0cHV0IGlzIHVucGFyc2VhYmxlLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZiAgLy8gIV9XSU4zMgorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTY0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmgKQEAgLTAsMCArMSwxMDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfU1VCUFJPQ0VTU19IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1NVQlBST0NFU1NfSF9fCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAgIC8vIHJpZ2h0Li4uCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UgIC8vIF9XSU4zMgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmICAvLyAhX1dJTjMyCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY2xhc3MgTWVzc2FnZTsKKworbmFtZXNwYWNlIGNvbXBpbGVyIHsKKworLy8gVXRpbGl0eSBjbGFzcyBmb3IgbGF1bmNoaW5nIHN1Yi1wcm9jZXNzZXMuCitjbGFzcyBMSUJQUk9UT0NfRVhQT1JUIFN1YnByb2Nlc3MgeworIHB1YmxpYzoKKyAgU3VicHJvY2VzcygpOworICB+U3VicHJvY2VzcygpOworCisgIGVudW0gU2VhcmNoTW9kZSB7CisgICAgU0VBUkNIX1BBVEgsICAgLy8gVXNlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgRVhBQ1RfTkFNRSAgICAgLy8gUHJvZ3JhbSBpcyBhbiBleGFjdCBmaWxlIG5hbWU7IGRvbid0IHVzZSB0aGUgUEFUSC4KKyAgfTsKKworICAvLyBTdGFydCB0aGUgc3VicHJvY2Vzcy4gIEN1cnJlbnRseSB3ZSBkb24ndCBwcm92aWRlIGEgd2F5IHRvIHNwZWNpZnkKKyAgLy8gYXJndW1lbnRzIGFzIHByb3RvYyBwbHVnaW5zIGRvbid0IGhhdmUgYW55LgorICB2b2lkIFN0YXJ0KGNvbnN0IHN0cmluZyYgcHJvZ3JhbSwgU2VhcmNoTW9kZSBzZWFyY2hfbW9kZSk7CisKKyAgLy8gU2VyaWFsaXplIHRoZSBpbnB1dCBtZXNzYWdlIGFuZCBwaXBlIGl0IHRvIHRoZSBzdWJwcm9jZXNzJ3Mgc3RkaW4sIHRoZW4KKyAgLy8gY2xvc2UgdGhlIHBpcGUuICBNZWFud2hpbGUsIHJlYWQgZnJvbSB0aGUgc3VicHJvY2VzcydzIHN0ZG91dCBhbmQgcGFyc2UKKyAgLy8gdGhlIGRhdGEgaW50byAqb3V0cHV0LiAgQWxsIHRoaXMgaXMgZG9uZSBjYXJlZnVsbHkgdG8gYXZvaWQgZGVhZGxvY2tzLgorICAvLyBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4gIE9uIGFueSBzb3J0IG9mIGVycm9yLCByZXR1cm5zIGZhbHNlIGFuZCBzZXRzCisgIC8vICplcnJvciB0byBhIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtLgorICBib29sIENvbW11bmljYXRlKGNvbnN0IE1lc3NhZ2UmIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQsIHN0cmluZyogZXJyb3IpOworCisjaWZkZWYgX1dJTjMyCisgIC8vIEdpdmVuIGFuIGVycm9yIGNvZGUsIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLiAgVGhpcyBpcworICAvLyBkZWZpbmVkIGhlcmUgc28gdGhhdCBDb21tYW5kTGluZUludGVyZmFjZSBjYW4gc2hhcmUgaXQuCisgIHN0YXRpYyBzdHJpbmcgV2luMzJFcnJvck1lc3NhZ2UoRFdPUkQgZXJyb3JfY29kZSk7CisjZW5kaWYKKworIHByaXZhdGU6CisjaWZkZWYgX1dJTjMyCisgIERXT1JEIHByb2Nlc3Nfc3RhcnRfZXJyb3JfOworICBIQU5ETEUgY2hpbGRfaGFuZGxlXzsKKworICAvLyBUaGUgZmlsZSBoYW5kbGVzIGZvciBvdXIgZW5kIG9mIHRoZSBjaGlsZCdzIHBpcGVzLiAgV2UgY2xvc2UgZWFjaCBhbmQKKyAgLy8gc2V0IGl0IHRvIE5VTEwgd2hlbiBubyBsb25nZXIgbmVlZGVkLgorICBIQU5ETEUgY2hpbGRfc3RkaW5fOworICBIQU5ETEUgY2hpbGRfc3Rkb3V0XzsKKworI2Vsc2UgIC8vIF9XSU4zMgorICBwaWRfdCBjaGlsZF9waWRfOworCisgIC8vIFRoZSBmaWxlIGRlc2NyaXB0b3JzIGZvciBvdXIgZW5kIG9mIHRoZSBjaGlsZCdzIHBpcGVzLiAgV2UgY2xvc2UgZWFjaCBhbmQKKyAgLy8gc2V0IGl0IHRvIC0xIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAgaW50IGNoaWxkX3N0ZGluXzsKKyAgaW50IGNoaWxkX3N0ZG91dF87CisKKyNlbmRpZiAgLy8gIV9XSU4zMgorfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfU1VCUFJPQ0VTU19IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiYmYzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBUaGlzIGlzIGEgZHVtbXkgY29kZSBnZW5lcmF0b3IgcGx1Z2luIHVzZWQgYnkKKy8vIGNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworI2lmZGVmIF9NU0NfVkVSCisgIC8vIERvbid0IHByaW50IGEgc2lsbHkgbWVzc2FnZSBvciBzdGljayBhIG1vZGFsIGRpYWxvZyBib3ggaW4gbXkgZmFjZSwKKyAgLy8gcGxlYXNlLgorICBfc2V0X2Fib3J0X2JlaGF2aW9yKDAsIH4wKTsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6Ok1vY2tDb2RlR2VuZXJhdG9yIGdlbmVyYXRvcigidGVzdF9wbHVnaW4iKTsKKyAgcmV0dXJuIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpQbHVnaW5NYWluKGFyZ2MsIGFyZ3YsICZnZW5lcmF0b3IpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2EwMjQzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2gKQEAgLTAsMCArMSw5MSBAQAorIyEvYmluL3NoCisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisjCisjIFRlc3QgcHJvdG9jJ3MgemlwIG91dHB1dCBtb2RlLgorCitmYWlsKCkgeworICBlY2hvICIkQCIgPiYyCisgIGV4aXQgMQorfQorCitURVNUX1RNUERJUj0uCitQUk9UT0M9Li9wcm90b2MKKworZWNobyAnCisgIHN5bnRheCA9ICJwcm90bzIiOworICBvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7CisgIG9wdGlvbiBqYXZhX3BhY2thZ2UgPSAidGVzdC5qYXIiOworICBvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiT3V0ZXIiOworICBtZXNzYWdlIEZvbyB7fQorICBtZXNzYWdlIEJhciB7fQorJyA+ICRURVNUX1RNUERJUi90ZXN0emlwLnByb3RvCisKKyRQUk9UT0MgXAorICAgIC0tY3BwX291dD0kVEVTVF9UTVBESVIvdGVzdHppcC56aXAgLS1weXRob25fb3V0PSRURVNUX1RNUERJUi90ZXN0emlwLnppcCBcCisgICAgLS1qYXZhX291dD0kVEVTVF9UTVBESVIvdGVzdHppcC5qYXIgLUkkVEVTVF9UTVBESVIgdGVzdHppcC5wcm90byBcCisgICAgfHwgZmFpbCAncHJvdG9jIGZhaWxlZC4nCisKK2VjaG8gIlRlc3Rpbmcgb3V0cHV0IHRvIHppcC4uLiIKK2lmIHVuemlwIC1oID4gL2Rldi9udWxsOyB0aGVuCisgIHVuemlwIC10ICRURVNUX1RNUERJUi90ZXN0emlwLnppcCA+ICRURVNUX1RNUERJUi90ZXN0emlwLmxpc3QgfHwgZmFpbCAndW56aXAgZmFpbGVkLicKKworICBncmVwICd0ZXN0aW5nOiB0ZXN0emlwXC5wYlwuY2MgKk9LJCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCisgICAgfHwgZmFpbCAndGVzdHppcC5wYi5jYyBub3QgZm91bmQgaW4gb3V0cHV0IHppcC4nCisgIGdyZXAgJ3Rlc3Rpbmc6IHRlc3R6aXBcLnBiXC5oICpPSyQnICRURVNUX1RNUERJUi90ZXN0emlwLmxpc3QgPiAvZGV2L251bGwgXAorICAgIHx8IGZhaWwgJ3Rlc3R6aXAucGIuaCBub3QgZm91bmQgaW4gb3V0cHV0IHppcC4nCisgIGdyZXAgJ3Rlc3Rpbmc6IHRlc3R6aXBfcGIyXC5weSAqT0skJyAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0ID4gL2Rldi9udWxsIFwKKyAgICB8fCBmYWlsICd0ZXN0emlwX3BiMi5weSBub3QgZm91bmQgaW4gb3V0cHV0IHppcC4nCisgIGdyZXAgLWkgJ21hbmlmZXN0JyAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0ID4gL2Rldi9udWxsIFwKKyAgICAmJiBmYWlsICdaaXAgZmlsZSBjb250YWluZWQgbWFuaWZlc3QuJworZWxzZQorICBlY2hvICJXYXJuaW5nOiAgJ3VuemlwJyBjb21tYW5kIG5vdCBhdmFpbGFibGUuICBTa2lwcGluZyB0ZXN0LiIKK2ZpCisKK2VjaG8gIlRlc3Rpbmcgb3V0cHV0IHRvIGphci4uLiIKK2lmIGphciBjICRURVNUX1RNUERJUi90ZXN0emlwLnByb3RvID4gL2Rldi9udWxsOyB0aGVuCisgIGphciB0ZiAkVEVTVF9UTVBESVIvdGVzdHppcC5qYXIgPiAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0IHx8IGZhaWwgJ2phciBmYWlsZWQuJworCisgIGdyZXAgJ150ZXN0L2phci9Gb29cLmphdmEkJyAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0ID4gL2Rldi9udWxsIFwKKyAgICB8fCBmYWlsICdGb28uamF2YSBub3QgZm91bmQgaW4gb3V0cHV0IGphci4nCisgIGdyZXAgJ150ZXN0L2phci9CYXJcLmphdmEkJyAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0ID4gL2Rldi9udWxsIFwKKyAgICB8fCBmYWlsICdCYXIuamF2YSBub3QgZm91bmQgaW4gb3V0cHV0IGphci4nCisgIGdyZXAgJ150ZXN0L2phci9PdXRlclwuamF2YSQnICRURVNUX1RNUERJUi90ZXN0emlwLmxpc3QgPiAvZGV2L251bGwgXAorICAgIHx8IGZhaWwgJ091dGVyLmphdmEgbm90IGZvdW5kIGluIG91dHB1dCBqYXIuJworICBncmVwICdeTUVUQS1JTkYvTUFOSUZFU1RcLk1GJCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCisgICAgfHwgZmFpbCAnTWFuaWZlc3Qgbm90IGZvdW5kIGluIG91dHB1dCBqYXIuJworZWxzZQorICBlY2hvICJXYXJuaW5nOiAgJ2phcicgY29tbWFuZCBub3QgYXZhaWxhYmxlLiAgU2tpcHBpbmcgdGVzdC4iCitmaQorCitlY2hvIFBBU1MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDczNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmNjCkBAIC0wLDAgKzEsMjE4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGFtYnJvc2VAZ29vZ2xlLmNvbSAoQW1icm9zZSBGZWluc3RlaW4pLAorLy8gICAgICAgICBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIEJhc2VkIG9uIGh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCitzdGF0aWMgY29uc3QgdWludDMyIGtDUkMzMlRhYmxlWzI1Nl0gPSB7CisgIDB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsIDB4MDc2ZGM0MTksIDB4NzA2YWY0OGYsCisgIDB4ZTk2M2E1MzUsIDB4OWU2NDk1YTMsIDB4MGVkYjg4MzIsIDB4NzlkY2I4YTQsIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsCisgIDB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsIDB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsCisgIDB4ZjNiOTcxNDgsIDB4ODRiZTQxZGUsIDB4MWFkYWQ0N2QsIDB4NmRkZGU0ZWIsIDB4ZjRkNGI1NTEsIDB4ODNkMzg1YzcsCisgIDB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsIDB4MTQwMTVjNGYsIDB4NjMwNjZjZDksCisgIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsIDB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsCisgIDB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsIDB4MzViNWE4ZmEsIDB4NDJiMjk4NmMsCisgIDB4ZGJiYmM5ZDYsIDB4YWNiY2Y5NDAsIDB4MzJkODZjZTMsIDB4NDVkZjVjNzUsIDB4ZGNkNjBkY2YsIDB4YWJkMTNkNTksCisgIDB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsIDB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsCisgIDB4Y2ZiYTk1OTksIDB4YjhiZGE1MGYsIDB4MjgwMmI4OWUsIDB4NWYwNTg4MDgsIDB4YzYwY2Q5YjIsIDB4YjEwYmU5MjQsCisgIDB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsIDB4NzZkYzQxOTAsIDB4MDFkYjcxMDYsCisgIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsIDB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsCisgIDB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsIDB4N2Y2YTBkYmIsIDB4MDg2ZDNkMmQsCisgIDB4OTE2NDZjOTcsIDB4ZTY2MzVjMDEsIDB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsCisgIDB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsIDB4NjViMGQ5YzYsIDB4MTJiN2U5NTAsCisgIDB4OGJiZWI4ZWEsIDB4ZmNiOTg4N2MsIDB4NjJkZDFkZGYsIDB4MTVkYTJkNDksIDB4OGNkMzdjZjMsIDB4ZmJkNDRjNjUsCisgIDB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsIDB4NGFkZmE1NDEsIDB4M2RkODk1ZDcsCisgIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsIDB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsCisgIDB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksIDB4NTAwNTcxM2MsIDB4MjcwMjQxYWEsCisgIDB4YmUwYjEwMTAsIDB4YzkwYzIwODYsIDB4NTc2OGI1MjUsIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYsCisgIDB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsIDB4NTliMzNkMTcsIDB4MmViNDBkODEsCisgIDB4YjdiZDVjM2IsIDB4YzBiYTZjYWQsIDB4ZWRiODgzMjAsIDB4OWFiZmIzYjYsIDB4MDNiNmUyMGMsIDB4NzRiMWQyOWEsCisgIDB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsIDB4ZTM2MzBiMTIsIDB4OTQ2NDNiODQsCisgIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsIDB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsCisgIDB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsIDB4Zjc2MjU3NWQsIDB4ODA2NTY3Y2IsCisgIDB4MTk2YzM2NzEsIDB4NmU2YjA2ZTcsIDB4ZmVkNDFiNzYsIDB4ODlkMzJiZTAsIDB4MTBkYTdhNWEsIDB4NjdkZDRhY2MsCisgIDB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsIDB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsCisgIDB4MzhkOGMyYzQsIDB4NGZkZmYyNTIsIDB4ZDFiYjY3ZjEsIDB4YTZiYzU3NjcsIDB4M2ZiNTA2ZGQsIDB4NDhiMjM2NGIsCisgIDB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsIDB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsCisgIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksIDB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsCisgIDB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsIDB4YzViYTNiYmUsIDB4YjJiZDBiMjgsCisgIDB4MmJiNDVhOTIsIDB4NWNiMzZhMDQsIDB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEsIDB4MmNkOTllOGIsIDB4NWJkZWFlMWQsCisgIDB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsIDB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsCisgIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsIDB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsCisgIDB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsIDB4ODZkM2QyZDQsIDB4ZjFkNGUyNDIsCisgIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsIDB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsCisgIDB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsIDB4OGY2NTllZmYsIDB4Zjg2MmFlNjksCisgIDB4NjE2YmZmZDMsIDB4MTY2Y2NmNDUsIDB4YTAwYWUyNzgsIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsCisgIDB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsIDB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsCisgIDB4NDBkZjBiNjYsIDB4MzdkODNiZjAsIDB4YTliY2FlNTMsIDB4ZGViYjllYzUsIDB4NDdiMmNmN2YsIDB4MzBiNWZmZTksCisgIDB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsIDB4YmFkMDM2MDUsIDB4Y2RkNzA2OTMsCisgIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsIDB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsCisgIDB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKK307CisKK3N0YXRpYyB1aW50MzIgQ29tcHV0ZUNSQzMyKGNvbnN0IHN0cmluZyAmYnVmKSB7CisgIHVpbnQzMiB4ID0gfjBVOworICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5zaXplKCk7ICsraSkgeworICAgIHVuc2lnbmVkIGNoYXIgYyA9IGJ1ZltpXTsKKyAgICB4ID0ga0NSQzMyVGFibGVbKHggXiBjKSAmIDB4ZmZdIF4gKHggPj4gOCk7CisgIH0KKyAgcmV0dXJuIH54OworfQorCitzdGF0aWMgdm9pZCBXcml0ZVNob3J0KGlvOjpDb2RlZE91dHB1dFN0cmVhbSAqb3V0LCB1aW50MTYgdmFsKSB7CisgIHVpbnQ4IHBbMl07CisgIHBbMF0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsKTsKKyAgcFsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWwgPj4gOCk7CisgIG91dC0+V3JpdGVSYXcocCwgMik7Cit9CisKK1ppcFdyaXRlcjo6WmlwV3JpdGVyKGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogcmF3X291dHB1dCkKKyAgOiByYXdfb3V0cHV0XyhyYXdfb3V0cHV0KSB7fQorWmlwV3JpdGVyOjp+WmlwV3JpdGVyKCkge30KKworYm9vbCBaaXBXcml0ZXI6OldyaXRlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgY29udGVudHMpIHsKKyAgRmlsZUluZm8gaW5mbzsKKworICBpbmZvLm5hbWUgPSBmaWxlbmFtZTsKKyAgdWludDE2IGZpbGVuYW1lX3NpemUgPSBmaWxlbmFtZS5zaXplKCk7CisgIGluZm8ub2Zmc2V0ID0gcmF3X291dHB1dF8tPkJ5dGVDb3VudCgpOworICBpbmZvLnNpemUgPSBjb250ZW50cy5zaXplKCk7CisgIGluZm8uY3JjMzIgPSBDb21wdXRlQ1JDMzIoY29udGVudHMpOworCisgIGZpbGVzXy5wdXNoX2JhY2soaW5mbyk7CisKKyAgLy8gd3JpdGUgZmlsZSBoZWFkZXIKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dChyYXdfb3V0cHV0Xyk7CisgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKDB4MDQwMzRiNTApOyAgLy8gbWFnaWMKKyAgV3JpdGVTaG9ydCgmb3V0cHV0LCAxMCk7ICAvLyB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0CisgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAvLyBmbGFncworICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gY29tcHJlc3Npb24gbWV0aG9kOiBzdG9yZWQKKyAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgIC8vIGxhc3QgbW9kaWZpZWQgdGltZQorICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gbGFzdCBtb2RpZmllZCBkYXRlCisgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKGluZm8uY3JjMzIpOyAgLy8gY3JjLTMyCisgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKGluZm8uc2l6ZSk7ICAvLyBjb21wcmVzc2VkIHNpemUKKyAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoaW5mby5zaXplKTsgIC8vIHVuY29tcHJlc3NlZCBzaXplCisgIFdyaXRlU2hvcnQoJm91dHB1dCwgZmlsZW5hbWVfc2l6ZSk7ICAvLyBmaWxlIG5hbWUgbGVuZ3RoCisgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAgLy8gZXh0cmEgZmllbGQgbGVuZ3RoCisgIG91dHB1dC5Xcml0ZVN0cmluZyhmaWxlbmFtZSk7ICAvLyBmaWxlIG5hbWUKKyAgb3V0cHV0LldyaXRlU3RyaW5nKGNvbnRlbnRzKTsgIC8vIGZpbGUgZGF0YQorCisgIHJldHVybiAhb3V0cHV0LkhhZEVycm9yKCk7Cit9CisKK2Jvb2wgWmlwV3JpdGVyOjpXcml0ZURpcmVjdG9yeSgpIHsKKyAgdWludDE2IG51bV9lbnRyaWVzID0gZmlsZXNfLnNpemUoKTsKKyAgdWludDMyIGRpcl9vZnMgPSByYXdfb3V0cHV0Xy0+Qnl0ZUNvdW50KCk7CisKKyAgLy8gd3JpdGUgY2VudHJhbCBkaXJlY3RvcnkKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dChyYXdfb3V0cHV0Xyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7ICsraSkgeworICAgIGNvbnN0IHN0cmluZyAmZmlsZW5hbWUgPSBmaWxlc19baV0ubmFtZTsKKyAgICB1aW50MTYgZmlsZW5hbWVfc2l6ZSA9IGZpbGVuYW1lLnNpemUoKTsKKyAgICB1aW50MzIgY3JjMzIgPSBmaWxlc19baV0uY3JjMzI7CisgICAgdWludDMyIHNpemUgPSBmaWxlc19baV0uc2l6ZTsKKyAgICB1aW50MzIgb2Zmc2V0ID0gZmlsZXNfW2ldLm9mZnNldDsKKworICAgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKDB4MDIwMTRiNTApOyAgLy8gbWFnaWMKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDEwKTsgIC8vIHZlcnNpb24gbWFkZSBieQorICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgMTApOyAgLy8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdAorICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAvLyBmbGFncworICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAvLyBjb21wcmVzc2lvbiBtZXRob2Q6IHN0b3JlZAorICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAvLyBsYXN0IG1vZGlmaWVkIHRpbWUKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gbGFzdCBtb2RpZmllZCBkYXRlCisgICAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoY3JjMzIpOyAgLy8gY3JjLTMyCisgICAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoc2l6ZSk7ICAvLyBjb21wcmVzc2VkIHNpemUKKyAgICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihzaXplKTsgIC8vIHVuY29tcHJlc3NlZCBzaXplCisgICAgV3JpdGVTaG9ydCgmb3V0cHV0LCBmaWxlbmFtZV9zaXplKTsgIC8vIGZpbGUgbmFtZSBsZW5ndGgKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aAorICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAgLy8gZmlsZSBjb21tZW50IGxlbmd0aAorICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAgLy8gc3RhcnRpbmcgZGlzayBudW1iZXIKKyAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgIC8vIGludGVybmFsIGZpbGUgYXR0cmlidXRlcworICAgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKDApOyAgLy8gZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzCisgICAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIob2Zmc2V0KTsgIC8vIGxvY2FsIGhlYWRlciBvZmZzZXQKKyAgICBvdXRwdXQuV3JpdGVTdHJpbmcoZmlsZW5hbWUpOyAgLy8gZmlsZSBuYW1lCisgIH0KKyAgdWludDMyIGRpcl9sZW4gPSBvdXRwdXQuQnl0ZUNvdW50KCk7CisKKyAgLy8gd3JpdGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IG1hcmtlcgorICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMigweDA2MDU0YjUwKTsgIC8vIG1hZ2ljCisgIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAvLyBkaXNrIG51bWJlcgorICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gZGlzayB3aXRoIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5CisgIFdyaXRlU2hvcnQoJm91dHB1dCwgbnVtX2VudHJpZXMpOyAgLy8gY2VudHJhbCBkaXJlY3RvcnkgZW50cmllcyAodGhpcyBkaXNrKQorICBXcml0ZVNob3J0KCZvdXRwdXQsIG51bV9lbnRyaWVzKTsgIC8vIGNlbnRyYWwgZGlyZWN0b3J5IGVudHJpZXMgKHRvdGFsKQorICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihkaXJfbGVuKTsgIC8vIGNlbnRyYWwgZGlyZWN0b3J5IGJ5dGUgc2l6ZQorICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihkaXJfb2ZzKTsgIC8vIGNlbnRyYWwgZGlyZWN0b3J5IG9mZnNldAorICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgIC8vIGNvbW1lbnQgbGVuZ3RoCisKKyAgcmV0dXJuIG91dHB1dC5IYWRFcnJvcigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzM5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmgKQEAgLTAsMCArMSw5MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgY29tcGlsZXIgeworCitjbGFzcyBaaXBXcml0ZXIgeworIHB1YmxpYzoKKyAgWmlwV3JpdGVyKGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogcmF3X291dHB1dCk7CisgIH5aaXBXcml0ZXIoKTsKKworICBib29sIFdyaXRlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgY29udGVudHMpOworICBib29sIFdyaXRlRGlyZWN0b3J5KCk7CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgRmlsZUluZm8geworICAgIHN0cmluZyBuYW1lOworICAgIHVpbnQzMiBvZmZzZXQ7CisgICAgdWludDMyIHNpemU7CisgICAgdWludDMyIGNyYzMyOworICB9OworCisgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogcmF3X291dHB1dF87CisgIHZlY3RvcjxGaWxlSW5mbz4gZmlsZXNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZGQ1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmNjCkBAIC0wLDAgKzEsNDQ5NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KKworI3VuZGVmIFBBQ0tBR0UgIC8vIGF1dG9oZWFkZXIgI2RlZmluZXMgdGhpcy4gIDooCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY29uc3QgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlCitGaWVsZERlc2NyaXB0b3I6OmtUeXBlVG9DcHBUeXBlTWFwW01BWF9UWVBFICsgMV0gPSB7CisgIHN0YXRpY19jYXN0PENwcFR5cGU+KDApLCAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCisKKyAgQ1BQVFlQRV9ET1VCTEUsICAgLy8gVFlQRV9ET1VCTEUKKyAgQ1BQVFlQRV9GTE9BVCwgICAgLy8gVFlQRV9GTE9BVAorICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX0lOVDY0CisgIENQUFRZUEVfVUlOVDY0LCAgIC8vIFRZUEVfVUlOVDY0CisgIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfSU5UMzIKKyAgQ1BQVFlQRV9VSU5UNjQsICAgLy8gVFlQRV9GSVhFRDY0CisgIENQUFRZUEVfVUlOVDMyLCAgIC8vIFRZUEVfRklYRUQzMgorICBDUFBUWVBFX0JPT0wsICAgICAvLyBUWVBFX0JPT0wKKyAgQ1BQVFlQRV9TVFJJTkcsICAgLy8gVFlQRV9TVFJJTkcKKyAgQ1BQVFlQRV9NRVNTQUdFLCAgLy8gVFlQRV9HUk9VUAorICBDUFBUWVBFX01FU1NBR0UsICAvLyBUWVBFX01FU1NBR0UKKyAgQ1BQVFlQRV9TVFJJTkcsICAgLy8gVFlQRV9CWVRFUworICBDUFBUWVBFX1VJTlQzMiwgICAvLyBUWVBFX1VJTlQzMgorICBDUFBUWVBFX0VOVU0sICAgICAvLyBUWVBFX0VOVU0KKyAgQ1BQVFlQRV9JTlQzMiwgICAgLy8gVFlQRV9TRklYRUQzMgorICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX1NGSVhFRDY0CisgIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfU0lOVDMyCisgIENQUFRZUEVfSU5UNjQsICAgIC8vIFRZUEVfU0lOVDY0Cit9OworCitjb25zdCBjaGFyICogY29uc3QgRmllbGREZXNjcmlwdG9yOjprVHlwZVRvTmFtZVtNQVhfVFlQRSArIDFdID0geworICAiRVJST1IiLCAgICAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCisKKyAgImRvdWJsZSIsICAgIC8vIFRZUEVfRE9VQkxFCisgICJmbG9hdCIsICAgICAvLyBUWVBFX0ZMT0FUCisgICJpbnQ2NCIsICAgICAvLyBUWVBFX0lOVDY0CisgICJ1aW50NjQiLCAgICAvLyBUWVBFX1VJTlQ2NAorICAiaW50MzIiLCAgICAgLy8gVFlQRV9JTlQzMgorICAiZml4ZWQ2NCIsICAgLy8gVFlQRV9GSVhFRDY0CisgICJmaXhlZDMyIiwgICAvLyBUWVBFX0ZJWEVEMzIKKyAgImJvb2wiLCAgICAgIC8vIFRZUEVfQk9PTAorICAic3RyaW5nIiwgICAgLy8gVFlQRV9TVFJJTkcKKyAgImdyb3VwIiwgICAgIC8vIFRZUEVfR1JPVVAKKyAgIm1lc3NhZ2UiLCAgIC8vIFRZUEVfTUVTU0FHRQorICAiYnl0ZXMiLCAgICAgLy8gVFlQRV9CWVRFUworICAidWludDMyIiwgICAgLy8gVFlQRV9VSU5UMzIKKyAgImVudW0iLCAgICAgIC8vIFRZUEVfRU5VTQorICAic2ZpeGVkMzIiLCAgLy8gVFlQRV9TRklYRUQzMgorICAic2ZpeGVkNjQiLCAgLy8gVFlQRV9TRklYRUQ2NAorICAic2ludDMyIiwgICAgLy8gVFlQRV9TSU5UMzIKKyAgInNpbnQ2NCIsICAgIC8vIFRZUEVfU0lOVDY0Cit9OworCitjb25zdCBjaGFyICogY29uc3QgRmllbGREZXNjcmlwdG9yOjprTGFiZWxUb05hbWVbTUFYX0xBQkVMICsgMV0gPSB7CisgICJFUlJPUiIsICAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMKKworICAib3B0aW9uYWwiLCAgLy8gTEFCRUxfT1BUSU9OQUwKKyAgInJlcXVpcmVkIiwgIC8vIExBQkVMX1JFUVVJUkVECisgICJyZXBlYXRlZCIsICAvLyBMQUJFTF9SRVBFQVRFRAorfTsKKworI2lmbmRlZiBfTVNDX1ZFUiAgLy8gTVNWQyBkb2Vzbid0IG5lZWQgdGhlc2UgYW5kIHdvbid0IGV2ZW4gYWNjZXB0IHRoZW0uCitjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyOworY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvcjo6a0ZpcnN0UmVzZXJ2ZWROdW1iZXI7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yOjprTGFzdFJlc2VydmVkTnVtYmVyOworI2VuZGlmCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHN0cmluZyBrRW1wdHlTdHJpbmc7CisKK3N0cmluZyBUb0NhbWVsQ2FzZShjb25zdCBzdHJpbmcmIGlucHV0KSB7CisgIGJvb2wgY2FwaXRhbGl6ZV9uZXh0ID0gZmFsc2U7CisgIHN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKGlucHV0LnNpemUoKSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7IGkrKykgeworICAgIGlmIChpbnB1dFtpXSA9PSAnXycpIHsKKyAgICAgIGNhcGl0YWxpemVfbmV4dCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChjYXBpdGFsaXplX25leHQpIHsKKyAgICAgIC8vIE5vdGU6ICBJIGRpc3RydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuCisgICAgICBpZiAoJ2EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICd6JykgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKGlucHV0W2ldIC0gJ2EnICsgJ0EnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soaW5wdXRbaV0pOworICAgICAgfQorICAgICAgY2FwaXRhbGl6ZV9uZXh0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soaW5wdXRbaV0pOworICAgIH0KKyAgfQorCisgIC8vIExvd2VyLWNhc2UgdGhlIGZpcnN0IGxldHRlci4KKyAgaWYgKCFyZXN1bHQuZW1wdHkoKSAmJiAnQScgPD0gcmVzdWx0WzBdICYmIHJlc3VsdFswXSA8PSAnWicpIHsKKyAgICByZXN1bHRbMF0gPSByZXN1bHRbMF0gLSAnQScgKyAnYSc7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBBIERlc2NyaXB0b3JQb29sIGNvbnRhaW5zIGEgYnVuY2ggb2YgaGFzaF9tYXBzIHRvIGltcGxlbWVudCB0aGUKKy8vIHZhcmlvdXMgRmluZCpCeSooKSBtZXRob2RzLiAgU2luY2UgaGFzaHRhYmxlIGxvb2t1cHMgYXJlIE8oMSksIGl0J3MKKy8vIG1vc3QgZWZmaWNpZW50IHRvIGNvbnN0cnVjdCBhIGZpeGVkIHNldCBvZiBsYXJnZSBoYXNoX21hcHMgdXNlZCBieQorLy8gYWxsIG9iamVjdHMgaW4gdGhlIHBvb2wgcmF0aGVyIHRoYW4gY29uc3RydWN0IG9uZSBvciBtb3JlIHNtYWxsCisvLyBoYXNoX21hcHMgZm9yIGVhY2ggb2JqZWN0LgorLy8KKy8vIFRoZSBrZXlzIHRvIHRoZXNlIGhhc2hfbWFwcyBhcmUgKHBhcmVudCwgbmFtZSkgb3IgKHBhcmVudCwgbnVtYmVyKQorLy8gcGFpcnMuICBVbmZvcnR1bmF0ZWx5IFNUTCBkb2Vzbid0IHByb3ZpZGUgaGFzaCBmdW5jdGlvbnMgZm9yIHBhaXI8PiwKKy8vIHNvIHdlIG11c3QgaW52ZW50IG91ciBvd24uCisvLworLy8gVE9ETyhrZW50b24pOiAgVXNlIFN0cmluZ1BpZWNlIHJhdGhlciB0aGFuIGNvbnN0IGNoYXIqIGluIGtleXM/ICBJdCB3b3VsZAorLy8gICBiZSBhIGxvdCBjbGVhbmVyIGJ1dCB3ZSdkIGp1c3QgaGF2ZSB0byBjb252ZXJ0IGl0IGJhY2sgdG8gY29uc3QgY2hhcioKKy8vICAgZm9yIHRoZSBvcGVuIHNvdXJjZSByZWxlYXNlLgorCit0eXBlZGVmIHBhaXI8Y29uc3Qgdm9pZCosIGNvbnN0IGNoYXIqPiBQb2ludGVyU3RyaW5nUGFpcjsKKworc3RydWN0IFBvaW50ZXJTdHJpbmdQYWlyRXF1YWwgeworICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFBvaW50ZXJTdHJpbmdQYWlyJiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvaW50ZXJTdHJpbmdQYWlyJiBiKSBjb25zdCB7CisgICAgcmV0dXJuIGEuZmlyc3QgPT0gYi5maXJzdCAmJiBzdHJjbXAoYS5zZWNvbmQsIGIuc2Vjb25kKSA9PSAwOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBQYWlyVHlwZT4KK3N0cnVjdCBQb2ludGVySW50ZWdlclBhaXJIYXNoIHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgUGFpclR5cGUmIHApIGNvbnN0IHsKKyAgICAvLyBGSVhNRShrZW50b24pOiAgV2hhdCBpcyB0aGUgYmVzdCB3YXkgdG8gY29tcHV0ZSB0aGlzIGhhc2g/ICBJIGhhdmUKKyAgICAvLyBubyBpZGVhISAgVGhpcyBzZWVtcyBhIGJpdCBiZXR0ZXIgdGhhbiBhbiBYT1IuCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHAuZmlyc3QpICogKCgxIDw8IDE2KSAtIDEpICsgcC5zZWNvbmQ7CisgIH0KKworICAvLyBVc2VkIG9ubHkgYnkgTVNWQyBhbmQgcGxhdGZvcm1zIHdoZXJlIGhhc2hfbWFwIGlzIG5vdCBhdmFpbGFibGUuCisgIHN0YXRpYyBjb25zdCBzaXplX3QgYnVja2V0X3NpemUgPSA0OworICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbl9idWNrZXRzID0gODsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBQYWlyVHlwZSYgYSwgY29uc3QgUGFpclR5cGUmIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYS5maXJzdCA8IGIuZmlyc3QgfHwKKyAgICAgICAgICAoYS5maXJzdCA9PSBiLmZpcnN0ICYmIGEuc2Vjb25kIDwgYi5zZWNvbmQpOworICB9Cit9OworCit0eXBlZGVmIHBhaXI8Y29uc3QgRGVzY3JpcHRvciosIGludD4gRGVzY3JpcHRvckludFBhaXI7Cit0eXBlZGVmIHBhaXI8Y29uc3QgRW51bURlc2NyaXB0b3IqLCBpbnQ+IEVudW1JbnRQYWlyOworCitzdHJ1Y3QgUG9pbnRlclN0cmluZ1BhaXJIYXNoIHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgUG9pbnRlclN0cmluZ1BhaXImIHApIGNvbnN0IHsKKyAgICAvLyBGSVhNRShrZW50b24pOiAgV2hhdCBpcyB0aGUgYmVzdCB3YXkgdG8gY29tcHV0ZSB0aGlzIGhhc2g/ICBJIGhhdmUKKyAgICAvLyBubyBpZGVhISAgVGhpcyBzZWVtcyBhIGJpdCBiZXR0ZXIgdGhhbiBhbiBYT1IuCisgICAgaGFzaDxjb25zdCBjaGFyKj4gY3N0cmluZ19oYXNoOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGludHB0cl90PihwLmZpcnN0KSAqICgoMSA8PCAxNikgLSAxKSArCisgICAgICAgICAgIGNzdHJpbmdfaGFzaChwLnNlY29uZCk7CisgIH0KKworICAvLyBVc2VkIG9ubHkgYnkgTVNWQyBhbmQgcGxhdGZvcm1zIHdoZXJlIGhhc2hfbWFwIGlzIG5vdCBhdmFpbGFibGUuCisgIHN0YXRpYyBjb25zdCBzaXplX3QgYnVja2V0X3NpemUgPSA0OworICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbl9idWNrZXRzID0gODsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBQb2ludGVyU3RyaW5nUGFpciYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2ludGVyU3RyaW5nUGFpciYgYikgY29uc3QgeworICAgIGlmIChhLmZpcnN0IDwgYi5maXJzdCkgcmV0dXJuIHRydWU7CisgICAgaWYgKGEuZmlyc3QgPiBiLmZpcnN0KSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHN0cmNtcChhLnNlY29uZCwgYi5zZWNvbmQpIDwgMDsKKyAgfQorfTsKKworCitzdHJ1Y3QgU3ltYm9sIHsKKyAgZW51bSBUeXBlIHsKKyAgICBOVUxMX1NZTUJPTCwgTUVTU0FHRSwgRklFTEQsIEVOVU0sIEVOVU1fVkFMVUUsIFNFUlZJQ0UsIE1FVEhPRCwgUEFDS0FHRQorICB9OworICBUeXBlIHR5cGU7CisgIHVuaW9uIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcjsKKyAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWVfZGVzY3JpcHRvcjsKKyAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZV9kZXNjcmlwdG9yOworICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZF9kZXNjcmlwdG9yOworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBwYWNrYWdlX2ZpbGVfZGVzY3JpcHRvcjsKKyAgfTsKKworICBpbmxpbmUgU3ltYm9sKCkgOiB0eXBlKE5VTExfU1lNQk9MKSB7IGRlc2NyaXB0b3IgPSBOVUxMOyB9CisgIGlubGluZSBib29sIElzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUgPT0gTlVMTF9TWU1CT0w7IH0KKyAgaW5saW5lIGJvb2wgSXNUeXBlKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IE1FU1NBR0UgfHwgdHlwZSA9PSBFTlVNOworICB9CisgIGlubGluZSBib29sIElzQWdncmVnYXRlKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IE1FU1NBR0UgfHwgdHlwZSA9PSBQQUNLQUdFCisgICAgICAgIHx8IHR5cGUgPT0gRU5VTSB8fCB0eXBlID09IFNFUlZJQ0U7CisgIH0KKworI2RlZmluZSBDT05TVFJVQ1RPUihUWVBFLCBUWVBFX0NPTlNUQU5ULCBGSUVMRCkgIFwKKyAgaW5saW5lIGV4cGxpY2l0IFN5bWJvbChjb25zdCBUWVBFKiB2YWx1ZSkgeyAgICBcCisgICAgdHlwZSA9IFRZUEVfQ09OU1RBTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRoaXMtPkZJRUxEID0gdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisgIENPTlNUUlVDVE9SKERlc2NyaXB0b3IgICAgICAgICAsIE1FU1NBR0UgICAsIGRlc2NyaXB0b3IgICAgICAgICAgICAgKQorICBDT05TVFJVQ1RPUihGaWVsZERlc2NyaXB0b3IgICAgLCBGSUVMRCAgICAgLCBmaWVsZF9kZXNjcmlwdG9yICAgICAgICkKKyAgQ09OU1RSVUNUT1IoRW51bURlc2NyaXB0b3IgICAgICwgRU5VTSAgICAgICwgZW51bV9kZXNjcmlwdG9yICAgICAgICApCisgIENPTlNUUlVDVE9SKEVudW1WYWx1ZURlc2NyaXB0b3IsIEVOVU1fVkFMVUUsIGVudW1fdmFsdWVfZGVzY3JpcHRvciAgKQorICBDT05TVFJVQ1RPUihTZXJ2aWNlRGVzY3JpcHRvciAgLCBTRVJWSUNFICAgLCBzZXJ2aWNlX2Rlc2NyaXB0b3IgICAgICkKKyAgQ09OU1RSVUNUT1IoTWV0aG9kRGVzY3JpcHRvciAgICwgTUVUSE9EICAgICwgbWV0aG9kX2Rlc2NyaXB0b3IgICAgICApCisgIENPTlNUUlVDVE9SKEZpbGVEZXNjcmlwdG9yICAgICAsIFBBQ0tBR0UgICAsIHBhY2thZ2VfZmlsZV9kZXNjcmlwdG9yKQorI3VuZGVmIENPTlNUUlVDVE9SCisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIEdldEZpbGUoKSBjb25zdCB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIE5VTExfU1lNQk9MOiByZXR1cm4gTlVMTDsKKyAgICAgIGNhc2UgTUVTU0FHRSAgICA6IHJldHVybiBkZXNjcmlwdG9yICAgICAgICAgICAtPmZpbGUoKTsKKyAgICAgIGNhc2UgRklFTEQgICAgICA6IHJldHVybiBmaWVsZF9kZXNjcmlwdG9yICAgICAtPmZpbGUoKTsKKyAgICAgIGNhc2UgRU5VTSAgICAgICA6IHJldHVybiBlbnVtX2Rlc2NyaXB0b3IgICAgICAtPmZpbGUoKTsKKyAgICAgIGNhc2UgRU5VTV9WQUxVRSA6IHJldHVybiBlbnVtX3ZhbHVlX2Rlc2NyaXB0b3ItPnR5cGUoKS0+ZmlsZSgpOworICAgICAgY2FzZSBTRVJWSUNFICAgIDogcmV0dXJuIHNlcnZpY2VfZGVzY3JpcHRvciAgIC0+ZmlsZSgpOworICAgICAgY2FzZSBNRVRIT0QgICAgIDogcmV0dXJuIG1ldGhvZF9kZXNjcmlwdG9yICAgIC0+c2VydmljZSgpLT5maWxlKCk7CisgICAgICBjYXNlIFBBQ0tBR0UgICAgOiByZXR1cm4gcGFja2FnZV9maWxlX2Rlc2NyaXB0b3I7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9Cit9OworCitjb25zdCBTeW1ib2wga051bGxTeW1ib2w7CisKK3R5cGVkZWYgaGFzaF9tYXA8Y29uc3QgY2hhciosIFN5bWJvbCwKKyAgICAgICAgICAgICAgICAgaGFzaDxjb25zdCBjaGFyKj4sIHN0cmVxPgorICBTeW1ib2xzQnlOYW1lTWFwOwordHlwZWRlZiBoYXNoX21hcDxQb2ludGVyU3RyaW5nUGFpciwgU3ltYm9sLAorICAgICAgICAgICAgICAgICBQb2ludGVyU3RyaW5nUGFpckhhc2gsIFBvaW50ZXJTdHJpbmdQYWlyRXF1YWw+CisgIFN5bWJvbHNCeVBhcmVudE1hcDsKK3R5cGVkZWYgaGFzaF9tYXA8Y29uc3QgY2hhciosIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiwKKyAgICAgICAgICAgICAgICAgaGFzaDxjb25zdCBjaGFyKj4sIHN0cmVxPgorICBGaWxlc0J5TmFtZU1hcDsKK3R5cGVkZWYgaGFzaF9tYXA8UG9pbnRlclN0cmluZ1BhaXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciosCisgICAgICAgICAgICAgICAgIFBvaW50ZXJTdHJpbmdQYWlySGFzaCwgUG9pbnRlclN0cmluZ1BhaXJFcXVhbD4KKyAgRmllbGRzQnlOYW1lTWFwOwordHlwZWRlZiBoYXNoX21hcDxEZXNjcmlwdG9ySW50UGFpciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiwKKyAgICAgICAgICAgICAgICAgUG9pbnRlckludGVnZXJQYWlySGFzaDxEZXNjcmlwdG9ySW50UGFpcj4gPgorICBGaWVsZHNCeU51bWJlck1hcDsKK3R5cGVkZWYgaGFzaF9tYXA8RW51bUludFBhaXIsIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqLAorICAgICAgICAgICAgICAgICBQb2ludGVySW50ZWdlclBhaXJIYXNoPEVudW1JbnRQYWlyPiA+CisgIEVudW1WYWx1ZXNCeU51bWJlck1hcDsKKy8vIFRoaXMgaXMgYSBtYXAgcmF0aGVyIHRoYW4gYSBoYXNoX21hcCwgc2luY2Ugd2UgdXNlIGl0IHRvIGl0ZXJhdGUKKy8vIHRocm91Z2ggYWxsIHRoZSBleHRlbnNpb25zIHRoYXQgZXh0ZW5kIGEgZ2l2ZW4gRGVzY3JpcHRvciwgYW5kIGFuCisvLyBvcmRlcmVkIGRhdGEgc3RydWN0dXJlIHRoYXQgaW1wbGVtZW50cyBsb3dlcl9ib3VuZCBpcyBjb252ZW5pZW50CisvLyBmb3IgdGhhdC4KK3R5cGVkZWYgbWFwPERlc2NyaXB0b3JJbnRQYWlyLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqPgorICBFeHRlbnNpb25zR3JvdXBlZEJ5RGVzY3JpcHRvck1hcDsKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZXNjcmlwdG9yUG9vbDo6VGFibGVzCisKK2NsYXNzIERlc2NyaXB0b3JQb29sOjpUYWJsZXMgeworIHB1YmxpYzoKKyAgVGFibGVzKCk7CisgIH5UYWJsZXMoKTsKKworICAvLyBDaGVja3BvaW50IHRoZSBzdGF0ZSBvZiB0aGUgdGFibGVzLiAgRnV0dXJlIGNhbGxzIHRvIFJvbGxiYWNrKCkgd2lsbAorICAvLyByZXR1cm4gdGhlIFRhYmxlcyB0byB0aGlzIHN0YXRlLiAgVGhpcyBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgZmlsZXMsIHNpbmNlCisgIC8vIHNvbWUga2luZHMgb2YgdmFsaWRhdGlvbiBlcnJvcnMgY2Fubm90IGJlIGRldGVjdGVkIHVudGlsIHRoZSBmaWxlJ3MKKyAgLy8gZGVzY3JpcHRvcnMgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIHRhYmxlcy4gIEJ1aWxkRmlsZSgpIGNhbGxzCisgIC8vIENoZWNrcG9pbnQoKSBiZWZvcmUgaXQgc3RhcnRzIGJ1aWxkaW5nIGFuZCBSb2xsYmFjaygpIGlmIGl0IGVuY291bnRlcnMKKyAgLy8gYW4gZXJyb3IuCisgIHZvaWQgQ2hlY2twb2ludCgpOworCisgIC8vIFJvbGwgYmFjayB0aGUgVGFibGVzIHRvIHRoZSBzdGF0ZSBvZiB0aGUgbGFzdCBDaGVja3BvaW50KCksIHJlbW92aW5nCisgIC8vIGV2ZXJ5dGhpbmcgdGhhdCB3YXMgYWRkZWQgYWZ0ZXIgdGhhdCBwb2ludC4KKyAgdm9pZCBSb2xsYmFjaygpOworCisgIC8vIFRoZSBzdGFjayBvZiBmaWxlcyB3aGljaCBhcmUgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVXNlZCB0byBkZXRlY3QKKyAgLy8gY3ljbGljIGRlcGVuZGVuY2llcyB3aGVuIGxvYWRpbmcgZmlsZXMgZnJvbSBhIERlc2NyaXB0b3JEYXRhYmFzZS4gIE5vdAorICAvLyB1c2VkIHdoZW4gZmFsbGJhY2tfZGF0YWJhc2VfID09IE5VTEwuCisgIHZlY3RvcjxzdHJpbmc+IHBlbmRpbmdfZmlsZXNfOworCisgIC8vIEEgc2V0IG9mIGZpbGVzIHdoaWNoIHdlIGhhdmUgdHJpZWQgdG8gbG9hZCBmcm9tIHRoZSBmYWxsYmFjayBkYXRhYmFzZQorICAvLyBhbmQgZW5jb3VudGVyZWQgZXJyb3JzLiAgV2Ugd2lsbCBub3QgYXR0ZW1wdCB0byBsb2FkIHRoZW0gYWdhaW4uCisgIC8vIE5vdCB1c2VkIHdoZW4gZmFsbGJhY2tfZGF0YWJhc2VfID09IE5VTEwuCisgIGhhc2hfc2V0PHN0cmluZz4ga25vd25fYmFkX2ZpbGVzXzsKKworICAvLyBUaGUgc2V0IG9mIGRlc2NyaXB0b3JzIGZvciB3aGljaCB3ZSd2ZSBhbHJlYWR5IGxvYWRlZCB0aGUgZnVsbAorICAvLyBzZXQgb2YgZXh0ZW5zaW9ucyBudW1iZXJzIGZyb20gZmFsbGJhY2tfZGF0YWJhc2VfLgorICBoYXNoX3NldDxjb25zdCBEZXNjcmlwdG9yKj4gZXh0ZW5zaW9uc19sb2FkZWRfZnJvbV9kYl87CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRmluZGluZyBpdGVtcy4KKworICAvLyBGaW5kIHN5bWJvbHMuICBUaGlzIHJldHVybnMgYSBudWxsIFN5bWJvbCAoc3ltYm9sLklzTnVsbCgpIGlzIHRydWUpCisgIC8vIGlmIG5vdCBmb3VuZC4KKyAgaW5saW5lIFN5bWJvbCBGaW5kU3ltYm9sKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdDsKKworICAvLyBUaGlzIGltcGxlbWVudHMgdGhlIGJvZHkgb2YgRGVzY3JpcHRvclBvb2w6OkZpbmQqQnlOYW1lKCkuICBJdCBzaG91bGQKKyAgLy8gcmVhbGx5IGJlIGEgcHJpdmF0ZSBtZXRob2Qgb2YgRGVzY3JpcHRvclBvb2wsIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUKKyAgLy8gZGVjbGFyaW5nIFN5bWJvbCBpbiBkZXNjcmlwdG9yLmgsIHdoaWNoIHdvdWxkIGRyYWcgYWxsIGtpbmRzIG9mIG90aGVyCisgIC8vIHN0dWZmIGludG8gdGhlIGhlYWRlci4gIFlheSBDKysuCisgIFN5bWJvbCBGaW5kQnlOYW1lSGVscGVyKAorICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLCBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIC8vIFRoZXNlIHJldHVybiBOVUxMIGlmIG5vdCBmb3VuZC4KKyAgaW5saW5lIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBGaW5kRmlsZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3Q7CisgIGlubGluZSBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb24oY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7CisgIGlubGluZSB2b2lkIEZpbmRBbGxFeHRlbnNpb25zKGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dCkgY29uc3Q7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gQWRkaW5nIGl0ZW1zLgorCisgIC8vIFRoZXNlIGFkZCBpdGVtcyB0byB0aGUgY29ycmVzcG9uZGluZyB0YWJsZXMuICBUaGV5IHJldHVybiBmYWxzZSBpZgorICAvLyB0aGUga2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSB0YWJsZS4gIEZvciBBZGRTeW1ib2woKSwgdGhlIHN0cmluZyBwYXNzZWQKKyAgLy8gaW4gbXVzdCBiZSBvbmUgdGhhdCB3YXMgY29uc3RydWN0ZWQgdXNpbmcgQWxsb2NhdGVTdHJpbmcoKSwgYXMgaXQgd2lsbAorICAvLyBiZSB1c2VkIGFzIGEga2V5IGluIHRoZSBzeW1ib2xzX2J5X25hbWVfIG1hcCB3aXRob3V0IGNvcHlpbmcuCisgIGJvb2wgQWRkU3ltYm9sKGNvbnN0IHN0cmluZyYgZnVsbF9uYW1lLCBTeW1ib2wgc3ltYm9sKTsKKyAgYm9vbCBBZGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKyAgYm9vbCBBZGRFeHRlbnNpb24oY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gQWxsb2NhdGluZyBtZW1vcnkuCisKKyAgLy8gQWxsb2NhdGUgYW4gb2JqZWN0IHdoaWNoIHdpbGwgYmUgcmVjbGFpbWVkIHdoZW4gdGhlIHBvb2wgaXMKKyAgLy8gZGVzdHJveWVkLiAgTm90ZSB0aGF0IHRoZSBvYmplY3QncyBkZXN0cnVjdG9yIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLAorICAvLyBzbyBpdHMgZmllbGRzIG11c3QgYmUgcGxhaW4gb2xkIGRhdGEgKHByaW1pdGl2ZSBkYXRhIHR5cGVzIGFuZAorICAvLyBwb2ludGVycykuICBBbGwgb2YgdGhlIGRlc2NyaXB0b3IgdHlwZXMgYXJlIHN1Y2ggb2JqZWN0cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4gVHlwZSogQWxsb2NhdGUoKTsKKworICAvLyBBbGxvY2F0ZSBhbiBhcnJheSBvZiBvYmplY3RzIHdoaWNoIHdpbGwgYmUgcmVjbGFpbWVkIHdoZW4gdGhlCisgIC8vIHBvb2wgaW4gZGVzdHJveWVkLiAgQWdhaW4sIGRlc3RydWN0b3JzIGFyZSBuZXZlciBjYWxsZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+IFR5cGUqIEFsbG9jYXRlQXJyYXkoaW50IGNvdW50KTsKKworICAvLyBBbGxvY2F0ZSBhIHN0cmluZyB3aGljaCB3aWxsIGJlIGRlc3Ryb3llZCB3aGVuIHRoZSBwb29sIGlzIGRlc3Ryb3llZC4KKyAgLy8gVGhlIHN0cmluZyBpcyBpbml0aWFsaXplZCB0byB0aGUgZ2l2ZW4gdmFsdWUgZm9yIGNvbnZlbmllbmNlLgorICBzdHJpbmcqIEFsbG9jYXRlU3RyaW5nKGNvbnN0IHN0cmluZyYgdmFsdWUpOworCisgIC8vIEFsbG9jYXRlIGEgcHJvdG9jb2wgbWVzc2FnZSBvYmplY3QuICBTb21lIG9sZGVyIHZlcnNpb25zIG9mIEdDQyBoYXZlCisgIC8vIHRyb3VibGUgdW5kZXJzdGFuZGluZyBleHBsaWNpdCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucyBpbiBzb21lIGNhc2VzLCBzbworICAvLyBpbiB0aG9zZSBjYXNlcyB3ZSBoYXZlIHRvIHBhc3MgYSBkdW1teSBwb2ludGVyIG9mIHRoZSByaWdodCB0eXBlIGFzIHRoZQorICAvLyBwYXJhbWV0ZXIgaW5zdGVhZCBvZiBzcGVjaWZ5aW5nIHRoZSB0eXBlIGV4cGxpY2l0bHkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+IFR5cGUqIEFsbG9jYXRlTWVzc2FnZShUeXBlKiBkdW1teSA9IE5VTEwpOworCisgIC8vIEFsbG9jYXRlIGEgRmlsZURlc2NyaXB0b3JUYWJsZXMgb2JqZWN0LgorICBGaWxlRGVzY3JpcHRvclRhYmxlcyogQWxsb2NhdGVGaWxlVGFibGVzKCk7CisKKyBwcml2YXRlOgorICB2ZWN0b3I8c3RyaW5nKj4gc3RyaW5nc187ICAgIC8vIEFsbCBzdHJpbmdzIGluIHRoZSBwb29sLgorICB2ZWN0b3I8TWVzc2FnZSo+IG1lc3NhZ2VzXzsgIC8vIEFsbCBtZXNzYWdlcyBpbiB0aGUgcG9vbC4KKyAgdmVjdG9yPEZpbGVEZXNjcmlwdG9yVGFibGVzKj4gZmlsZV90YWJsZXNfOyAgLy8gQWxsIGZpbGUgdGFibGVzIGluIHRoZSBwb29sLgorICB2ZWN0b3I8dm9pZCo+IGFsbG9jYXRpb25zXzsgIC8vIEFsbCBvdGhlciBtZW1vcnkgYWxsb2NhdGVkIGluIHRoZSBwb29sLgorCisgIFN5bWJvbHNCeU5hbWVNYXAgICAgICBzeW1ib2xzX2J5X25hbWVfOworICBGaWxlc0J5TmFtZU1hcCAgICAgICAgZmlsZXNfYnlfbmFtZV87CisgIEV4dGVuc2lvbnNHcm91cGVkQnlEZXNjcmlwdG9yTWFwIGV4dGVuc2lvbnNfOworCisgIGludCBzdHJpbmdzX2JlZm9yZV9jaGVja3BvaW50XzsKKyAgaW50IG1lc3NhZ2VzX2JlZm9yZV9jaGVja3BvaW50XzsKKyAgaW50IGZpbGVfdGFibGVzX2JlZm9yZV9jaGVja3BvaW50XzsKKyAgaW50IGFsbG9jYXRpb25zX2JlZm9yZV9jaGVja3BvaW50XzsKKyAgdmVjdG9yPGNvbnN0IGNoYXIqICAgICAgPiBzeW1ib2xzX2FmdGVyX2NoZWNrcG9pbnRfOworICB2ZWN0b3I8Y29uc3QgY2hhciogICAgICA+IGZpbGVzX2FmdGVyX2NoZWNrcG9pbnRfOworICB2ZWN0b3I8RGVzY3JpcHRvckludFBhaXI+IGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF87CisKKyAgLy8gQWxsb2NhdGUgc29tZSBieXRlcyB3aGljaCB3aWxsIGJlIHJlY2xhaW1lZCB3aGVuIHRoZSBwb29sIGlzCisgIC8vIGRlc3Ryb3llZC4KKyAgdm9pZCogQWxsb2NhdGVCeXRlcyhpbnQgc2l6ZSk7Cit9OworCisvLyBDb250YWlucyB0YWJsZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGZpbGUuICBUaGVzZSB0YWJsZXMgYXJlIG5vdAorLy8gbW9kaWZpZWQgb25jZSB0aGUgZmlsZSBoYXMgYmVlbiBjb25zdHJ1Y3RlZCwgc28gdGhleSBuZWVkIG5vdCBiZQorLy8gcHJvdGVjdGVkIGJ5IGEgbXV0ZXguICBUaGlzIG1ha2VzIG9wZXJhdGlvbnMgdGhhdCBkZXBlbmQgb25seSBvbiB0aGUKKy8vIGNvbnRlbnRzIG9mIGEgc2luZ2xlIGZpbGUgLS0gZS5nLiBEZXNjcmlwdG9yOjpGaW5kRmllbGRCeU5hbWUoKSAtLQorLy8gbG9jay1mcmVlLgorLy8KKy8vIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgbWV0aG9kcyBvZgorLy8gRmlsZURlc2NyaXB0b3JUYWJsZXMgYW5kIERlc2NyaXB0b3JQb29sOjpUYWJsZXMgYXJlIGludGVybGVhdmVkIGJlbG93LgorLy8gVGhlc2UgdXNlZCB0byBiZSBhIHNpbmdsZSBjbGFzcy4KK2NsYXNzIEZpbGVEZXNjcmlwdG9yVGFibGVzIHsKKyBwdWJsaWM6CisgIEZpbGVEZXNjcmlwdG9yVGFibGVzKCk7CisgIH5GaWxlRGVzY3JpcHRvclRhYmxlcygpOworCisgIC8vIEVtcHR5IHRhYmxlLCB1c2VkIHdpdGggcGxhY2Vob2xkZXIgZmlsZXMuCisgIHN0YXRpYyBjb25zdCBGaWxlRGVzY3JpcHRvclRhYmxlcyBrRW1wdHk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRmluZGluZyBpdGVtcy4KKworICAvLyBGaW5kIHN5bWJvbHMuICBUaGVzZSByZXR1cm4gYSBudWxsIFN5bWJvbCAoc3ltYm9sLklzTnVsbCgpIGlzIHRydWUpCisgIC8vIGlmIG5vdCBmb3VuZC4KKyAgaW5saW5lIFN5bWJvbCBGaW5kTmVzdGVkU3ltYm9sKGNvbnN0IHZvaWQqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGlubGluZSBTeW1ib2wgRmluZE5lc3RlZFN5bWJvbE9mVHlwZShjb25zdCB2b2lkKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTeW1ib2w6OlR5cGUgdHlwZSkgY29uc3Q7CisKKyAgLy8gVGhlc2UgcmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgorICBpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRCeU51bWJlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsIGludCBudW1iZXIpIGNvbnN0OworICBpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoCisgICAgY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIGxvd2VyY2FzZV9uYW1lKSBjb25zdDsKKyAgaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKAorICAgIGNvbnN0IHZvaWQqIHBhcmVudCwgY29uc3Qgc3RyaW5nJiBjYW1lbGNhc2VfbmFtZSkgY29uc3Q7CisgIGlubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kRW51bVZhbHVlQnlOdW1iZXIoCisgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIHBhcmVudCwgaW50IG51bWJlcikgY29uc3Q7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gQWRkaW5nIGl0ZW1zLgorCisgIC8vIFRoZXNlIGFkZCBpdGVtcyB0byB0aGUgY29ycmVzcG9uZGluZyB0YWJsZXMuICBUaGV5IHJldHVybiBmYWxzZSBpZgorICAvLyB0aGUga2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSB0YWJsZS4gIEZvciBBZGRBbGlhc1VuZGVyUGFyZW50KCksIHRoZQorICAvLyBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb25lIHRoYXQgd2FzIGNvbnN0cnVjdGVkIHVzaW5nIEFsbG9jYXRlU3RyaW5nKCksCisgIC8vIGFzIGl0IHdpbGwgYmUgdXNlZCBhcyBhIGtleSBpbiB0aGUgc3ltYm9sc19ieV9wYXJlbnRfIG1hcCB3aXRob3V0IGNvcHlpbmcuCisgIGJvb2wgQWRkQWxpYXNVbmRlclBhcmVudChjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbCBzeW1ib2wpOworICBib29sIEFkZEZpZWxkQnlOdW1iZXIoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisgIGJvb2wgQWRkRW51bVZhbHVlQnlOdW1iZXIoY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpOworCisgIC8vIEFkZHMgdGhlIGZpZWxkIHRvIHRoZSBsb3dlcmNhc2VfbmFtZSBhbmQgY2FtZWxjYXNlX25hbWUgbWFwcy4gIE5ldmVyCisgIC8vIGZhaWxzIGJlY2F1c2Ugd2UgYWxsb3cgZHVwbGljYXRlczsgdGhlIGZpcnN0IGZpZWxkIGJ5IHRoZSBuYW1lIHdpbnMuCisgIHZvaWQgQWRkRmllbGRCeVN0eWxpemVkTmFtZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKKyBwcml2YXRlOgorICBTeW1ib2xzQnlQYXJlbnRNYXAgICAgc3ltYm9sc19ieV9wYXJlbnRfOworICBGaWVsZHNCeU5hbWVNYXAgICAgICAgZmllbGRzX2J5X2xvd2VyY2FzZV9uYW1lXzsKKyAgRmllbGRzQnlOYW1lTWFwICAgICAgIGZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZV87CisgIEZpZWxkc0J5TnVtYmVyTWFwICAgICBmaWVsZHNfYnlfbnVtYmVyXzsgICAgICAgLy8gTm90IGluY2x1ZGluZyBleHRlbnNpb25zLgorICBFbnVtVmFsdWVzQnlOdW1iZXJNYXAgZW51bV92YWx1ZXNfYnlfbnVtYmVyXzsKK307CisKK0Rlc2NyaXB0b3JQb29sOjpUYWJsZXM6OlRhYmxlcygpCisgIDogc3RyaW5nc19iZWZvcmVfY2hlY2twb2ludF8oMCksCisgICAgbWVzc2FnZXNfYmVmb3JlX2NoZWNrcG9pbnRfKDApLAorICAgIGFsbG9jYXRpb25zX2JlZm9yZV9jaGVja3BvaW50XygwKSB7fQorCitEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjp+VGFibGVzKCkgeworICAvLyBOb3RlIHRoYXQgdGhlIGRlbGV0aW9uIG9yZGVyIGlzIGltcG9ydGFudCwgc2luY2UgdGhlIGRlc3RydWN0b3JzIG9mIHNvbWUKKyAgLy8gbWVzc2FnZXMgbWF5IHJlZmVyIHRvIG9iamVjdHMgaW4gYWxsb2NhdGlvbnNfLgorICBTVExEZWxldGVFbGVtZW50cygmbWVzc2FnZXNfKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxvY2F0aW9uc18uc2l6ZSgpOyBpKyspIHsKKyAgICBvcGVyYXRvciBkZWxldGUoYWxsb2NhdGlvbnNfW2ldKTsKKyAgfQorICBTVExEZWxldGVFbGVtZW50cygmc3RyaW5nc18pOworICBTVExEZWxldGVFbGVtZW50cygmZmlsZV90YWJsZXNfKTsKK30KKworRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbGVEZXNjcmlwdG9yVGFibGVzKCkge30KK0ZpbGVEZXNjcmlwdG9yVGFibGVzOjp+RmlsZURlc2NyaXB0b3JUYWJsZXMoKSB7fQorCitjb25zdCBGaWxlRGVzY3JpcHRvclRhYmxlcyBGaWxlRGVzY3JpcHRvclRhYmxlczo6a0VtcHR5OworCit2b2lkIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkNoZWNrcG9pbnQoKSB7CisgIHN0cmluZ3NfYmVmb3JlX2NoZWNrcG9pbnRfID0gc3RyaW5nc18uc2l6ZSgpOworICBtZXNzYWdlc19iZWZvcmVfY2hlY2twb2ludF8gPSBtZXNzYWdlc18uc2l6ZSgpOworICBmaWxlX3RhYmxlc19iZWZvcmVfY2hlY2twb2ludF8gPSBmaWxlX3RhYmxlc18uc2l6ZSgpOworICBhbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludF8gPSBhbGxvY2F0aW9uc18uc2l6ZSgpOworCisgIHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8uY2xlYXIoKTsKKyAgZmlsZXNfYWZ0ZXJfY2hlY2twb2ludF8uY2xlYXIoKTsKKyAgZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50Xy5jbGVhcigpOworfQorCit2b2lkIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OlJvbGxiYWNrKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpOyBpKyspIHsKKyAgICBzeW1ib2xzX2J5X25hbWVfLmVyYXNlKHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF9baV0pOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpOyBpKyspIHsKKyAgICBmaWxlc19ieV9uYW1lXy5lcmFzZShmaWxlc19hZnRlcl9jaGVja3BvaW50X1tpXSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zX2FmdGVyX2NoZWNrcG9pbnRfLnNpemUoKTsgaSsrKSB7CisgICAgZXh0ZW5zaW9uc18uZXJhc2UoZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50X1tpXSk7CisgIH0KKworICBzeW1ib2xzX2FmdGVyX2NoZWNrcG9pbnRfLmNsZWFyKCk7CisgIGZpbGVzX2FmdGVyX2NoZWNrcG9pbnRfLmNsZWFyKCk7CisgIGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF8uY2xlYXIoKTsKKworICBTVExEZWxldGVDb250YWluZXJQb2ludGVycygKKyAgICBzdHJpbmdzXy5iZWdpbigpICsgc3RyaW5nc19iZWZvcmVfY2hlY2twb2ludF8sIHN0cmluZ3NfLmVuZCgpKTsKKyAgU1RMRGVsZXRlQ29udGFpbmVyUG9pbnRlcnMoCisgICAgbWVzc2FnZXNfLmJlZ2luKCkgKyBtZXNzYWdlc19iZWZvcmVfY2hlY2twb2ludF8sIG1lc3NhZ2VzXy5lbmQoKSk7CisgIFNUTERlbGV0ZUNvbnRhaW5lclBvaW50ZXJzKAorICAgIGZpbGVfdGFibGVzXy5iZWdpbigpICsgZmlsZV90YWJsZXNfYmVmb3JlX2NoZWNrcG9pbnRfLCBmaWxlX3RhYmxlc18uZW5kKCkpOworICBmb3IgKGludCBpID0gYWxsb2NhdGlvbnNfYmVmb3JlX2NoZWNrcG9pbnRfOyBpIDwgYWxsb2NhdGlvbnNfLnNpemUoKTsgaSsrKSB7CisgICAgb3BlcmF0b3IgZGVsZXRlKGFsbG9jYXRpb25zX1tpXSk7CisgIH0KKworICBzdHJpbmdzXy5yZXNpemUoc3RyaW5nc19iZWZvcmVfY2hlY2twb2ludF8pOworICBtZXNzYWdlc18ucmVzaXplKG1lc3NhZ2VzX2JlZm9yZV9jaGVja3BvaW50Xyk7CisgIGZpbGVfdGFibGVzXy5yZXNpemUoZmlsZV90YWJsZXNfYmVmb3JlX2NoZWNrcG9pbnRfKTsKKyAgYWxsb2NhdGlvbnNfLnJlc2l6ZShhbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludF8pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lubGluZSBTeW1ib2wgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6RmluZFN5bWJvbChjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBjb25zdCBTeW1ib2wqIHJlc3VsdCA9IEZpbmRPck51bGwoc3ltYm9sc19ieV9uYW1lXywga2V5LmNfc3RyKCkpOworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICByZXR1cm4ga051bGxTeW1ib2w7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICpyZXN1bHQ7CisgIH0KK30KKworaW5saW5lIFN5bWJvbCBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmluZE5lc3RlZFN5bWJvbCgKKyAgICBjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgeworICBjb25zdCBTeW1ib2wqIHJlc3VsdCA9CisgICAgRmluZE9yTnVsbChzeW1ib2xzX2J5X3BhcmVudF8sIFBvaW50ZXJTdHJpbmdQYWlyKHBhcmVudCwgbmFtZS5jX3N0cigpKSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIHJldHVybiBrTnVsbFN5bWJvbDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKnJlc3VsdDsKKyAgfQorfQorCitpbmxpbmUgU3ltYm9sIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKAorICAgIGNvbnN0IHZvaWQqIHBhcmVudCwgY29uc3Qgc3RyaW5nJiBuYW1lLCBjb25zdCBTeW1ib2w6OlR5cGUgdHlwZSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0gRmluZE5lc3RlZFN5bWJvbChwYXJlbnQsIG5hbWUpOworICBpZiAocmVzdWx0LnR5cGUgIT0gdHlwZSkgcmV0dXJuIGtOdWxsU3ltYm9sOworICByZXR1cm4gcmVzdWx0OworfQorCitTeW1ib2wgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6RmluZEJ5TmFtZUhlbHBlcigKKyAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIE11dGV4TG9ja01heWJlIGxvY2socG9vbC0+bXV0ZXhfKTsKKyAgU3ltYm9sIHJlc3VsdCA9IEZpbmRTeW1ib2wobmFtZSk7CisKKyAgaWYgKHJlc3VsdC5Jc051bGwoKSAmJiBwb29sLT51bmRlcmxheV8gIT0gTlVMTCkgeworICAgIC8vIFN5bWJvbCBub3QgZm91bmQ7IGNoZWNrIHRoZSB1bmRlcmxheS4KKyAgICByZXN1bHQgPQorICAgICAgcG9vbC0+dW5kZXJsYXlfLT50YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHBvb2wtPnVuZGVybGF5XywgbmFtZSk7CisgIH0KKworICBpZiAocmVzdWx0LklzTnVsbCgpKSB7CisgICAgLy8gU3ltYm9sIHN0aWxsIG5vdCBmb3VuZCwgc28gY2hlY2sgZmFsbGJhY2sgZGF0YWJhc2UuCisgICAgaWYgKHBvb2wtPlRyeUZpbmRTeW1ib2xJbkZhbGxiYWNrRGF0YWJhc2UobmFtZSkpIHsKKyAgICAgIHJlc3VsdCA9IEZpbmRTeW1ib2wobmFtZSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW5saW5lIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpGaW5kRmlsZSgKKyAgICBjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICByZXR1cm4gRmluZFB0ck9yTnVsbChmaWxlc19ieV9uYW1lXywga2V5LmNfc3RyKCkpOworfQorCitpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmluZEZpZWxkQnlOdW1iZXIoCisgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LCBpbnQgbnVtYmVyKSBjb25zdCB7CisgIHJldHVybiBGaW5kUHRyT3JOdWxsKGZpZWxkc19ieV9udW1iZXJfLCBtYWtlX3BhaXIocGFyZW50LCBudW1iZXIpKTsKK30KKworaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgKKyAgICBjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbG93ZXJjYXNlX25hbWUpIGNvbnN0IHsKKyAgcmV0dXJuIEZpbmRQdHJPck51bGwoZmllbGRzX2J5X2xvd2VyY2FzZV9uYW1lXywKKyAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclN0cmluZ1BhaXIocGFyZW50LCBsb3dlcmNhc2VfbmFtZS5jX3N0cigpKSk7Cit9CisKK2lubGluZSBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoCisgICAgY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIGNhbWVsY2FzZV9uYW1lKSBjb25zdCB7CisgIHJldHVybiBGaW5kUHRyT3JOdWxsKGZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZV8sCisgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJTdHJpbmdQYWlyKHBhcmVudCwgY2FtZWxjYXNlX25hbWUuY19zdHIoKSkpOworfQorCitpbmxpbmUgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRFbnVtVmFsdWVCeU51bWJlcigKKyAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogcGFyZW50LCBpbnQgbnVtYmVyKSBjb25zdCB7CisgIHJldHVybiBGaW5kUHRyT3JOdWxsKGVudW1fdmFsdWVzX2J5X251bWJlcl8sIG1ha2VfcGFpcihwYXJlbnQsIG51bWJlcikpOworfQorCitpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpGaW5kRXh0ZW5zaW9uKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLCBpbnQgbnVtYmVyKSB7CisgIHJldHVybiBGaW5kUHRyT3JOdWxsKGV4dGVuc2lvbnNfLCBtYWtlX3BhaXIoZXh0ZW5kZWUsIG51bWJlcikpOworfQorCitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpGaW5kQWxsRXh0ZW5zaW9ucygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXQpIGNvbnN0IHsKKyAgRXh0ZW5zaW9uc0dyb3VwZWRCeURlc2NyaXB0b3JNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgIGV4dGVuc2lvbnNfLmxvd2VyX2JvdW5kKG1ha2VfcGFpcihleHRlbmRlZSwgMCkpOworICBmb3IgKDsgaXQgIT0gZXh0ZW5zaW9uc18uZW5kKCkgJiYgaXQtPmZpcnN0LmZpcnN0ID09IGV4dGVuZGVlOyArK2l0KSB7CisgICAgb3V0LT5wdXNoX2JhY2soaXQtPnNlY29uZCk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitib29sIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFkZFN5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwgU3ltYm9sIHN5bWJvbCkgeworICBpZiAoSW5zZXJ0SWZOb3RQcmVzZW50KCZzeW1ib2xzX2J5X25hbWVfLCBmdWxsX25hbWUuY19zdHIoKSwgc3ltYm9sKSkgeworICAgIHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8ucHVzaF9iYWNrKGZ1bGxfbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclRhYmxlczo6QWRkQWxpYXNVbmRlclBhcmVudCgKKyAgICBjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbmFtZSwgU3ltYm9sIHN5bWJvbCkgeworICBQb2ludGVyU3RyaW5nUGFpciBieV9wYXJlbnRfa2V5KHBhcmVudCwgbmFtZS5jX3N0cigpKTsKKyAgcmV0dXJuIEluc2VydElmTm90UHJlc2VudCgmc3ltYm9sc19ieV9wYXJlbnRfLCBieV9wYXJlbnRfa2V5LCBzeW1ib2wpOworfQorCitib29sIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFkZEZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgaWYgKEluc2VydElmTm90UHJlc2VudCgmZmlsZXNfYnlfbmFtZV8sIGZpbGUtPm5hbWUoKS5jX3N0cigpLCBmaWxlKSkgeworICAgIGZpbGVzX2FmdGVyX2NoZWNrcG9pbnRfLnB1c2hfYmFjayhmaWxlLT5uYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JUYWJsZXM6OkFkZEZpZWxkQnlTdHlsaXplZE5hbWVzKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgY29uc3Qgdm9pZCogcGFyZW50OworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgaWYgKGZpZWxkLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKSB7CisgICAgICBwYXJlbnQgPSBmaWVsZC0+ZmlsZSgpOworICAgIH0gZWxzZSB7CisgICAgICBwYXJlbnQgPSBmaWVsZC0+ZXh0ZW5zaW9uX3Njb3BlKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHBhcmVudCA9IGZpZWxkLT5jb250YWluaW5nX3R5cGUoKTsKKyAgfQorCisgIFBvaW50ZXJTdHJpbmdQYWlyIGxvd2VyY2FzZV9rZXkocGFyZW50LCBmaWVsZC0+bG93ZXJjYXNlX25hbWUoKS5jX3N0cigpKTsKKyAgSW5zZXJ0SWZOb3RQcmVzZW50KCZmaWVsZHNfYnlfbG93ZXJjYXNlX25hbWVfLCBsb3dlcmNhc2Vfa2V5LCBmaWVsZCk7CisKKyAgUG9pbnRlclN0cmluZ1BhaXIgY2FtZWxjYXNlX2tleShwYXJlbnQsIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpLmNfc3RyKCkpOworICBJbnNlcnRJZk5vdFByZXNlbnQoJmZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZV8sIGNhbWVsY2FzZV9rZXksIGZpZWxkKTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclRhYmxlczo6QWRkRmllbGRCeU51bWJlcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIERlc2NyaXB0b3JJbnRQYWlyIGtleShmaWVsZC0+Y29udGFpbmluZ190eXBlKCksIGZpZWxkLT5udW1iZXIoKSk7CisgIHJldHVybiBJbnNlcnRJZk5vdFByZXNlbnQoJmZpZWxkc19ieV9udW1iZXJfLCBrZXksIGZpZWxkKTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclRhYmxlczo6QWRkRW51bVZhbHVlQnlOdW1iZXIoCisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIHsKKyAgRW51bUludFBhaXIga2V5KHZhbHVlLT50eXBlKCksIHZhbHVlLT5udW1iZXIoKSk7CisgIHJldHVybiBJbnNlcnRJZk5vdFByZXNlbnQoJmVudW1fdmFsdWVzX2J5X251bWJlcl8sIGtleSwgdmFsdWUpOworfQorCitib29sIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFkZEV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIERlc2NyaXB0b3JJbnRQYWlyIGtleShmaWVsZC0+Y29udGFpbmluZ190eXBlKCksIGZpZWxkLT5udW1iZXIoKSk7CisgIGlmIChJbnNlcnRJZk5vdFByZXNlbnQoJmV4dGVuc2lvbnNfLCBrZXksIGZpZWxkKSkgeworICAgIGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF8ucHVzaF9iYWNrKGtleSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4KK1R5cGUqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlKCkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUeXBlKj4oQWxsb2NhdGVCeXRlcyhzaXplb2YoVHlwZSkpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4KK1R5cGUqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlQXJyYXkoaW50IGNvdW50KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFR5cGUqPihBbGxvY2F0ZUJ5dGVzKHNpemVvZihUeXBlKSAqIGNvdW50KSk7Cit9CisKK3N0cmluZyogRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6QWxsb2NhdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICBzdHJpbmcqIHJlc3VsdCA9IG5ldyBzdHJpbmcodmFsdWUpOworICBzdHJpbmdzXy5wdXNoX2JhY2socmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4KK1R5cGUqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlTWVzc2FnZShUeXBlKiBkdW1teSkgeworICBUeXBlKiByZXN1bHQgPSBuZXcgVHlwZTsKKyAgbWVzc2FnZXNfLnB1c2hfYmFjayhyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCitGaWxlRGVzY3JpcHRvclRhYmxlcyogRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6QWxsb2NhdGVGaWxlVGFibGVzKCkgeworICBGaWxlRGVzY3JpcHRvclRhYmxlcyogcmVzdWx0ID0gbmV3IEZpbGVEZXNjcmlwdG9yVGFibGVzOworICBmaWxlX3RhYmxlc18ucHVzaF9iYWNrKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlQnl0ZXMoaW50IHNpemUpIHsKKyAgLy8gVE9ETyhrZW50b24pOiAgV291bGQgaXQgYmUgd29ydGh3aGlsZSB0byBpbXBsZW1lbnQgdGhpcyBpbiBzb21lIG1vcmUKKyAgLy8gc29waGlzdGljYXRlZCB3YXk/ICBQcm9iYWJseSBub3QgZm9yIHRoZSBvcGVuIHNvdXJjZSByZWxlYXNlLCBidXQgZm9yCisgIC8vIGludGVybmFsIHVzZSB3ZSBjb3VsZCBlYXNpbHkgcGx1ZyBpbiBvbmUgb2Ygb3VyIGV4aXN0aW5nIG1lbW9yeSBwb29sCisgIC8vIGFsbG9jYXRvcnMuLi4KKyAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIE5VTEw7CisKKyAgdm9pZCogcmVzdWx0ID0gb3BlcmF0b3IgbmV3KHNpemUpOworICBhbGxvY2F0aW9uc18ucHVzaF9iYWNrKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERlc2NyaXB0b3JQb29sCisKK0Rlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6fkVycm9yQ29sbGVjdG9yKCkge30KKworRGVzY3JpcHRvclBvb2w6OkRlc2NyaXB0b3JQb29sKCkKKyAgOiBtdXRleF8oTlVMTCksCisgICAgZmFsbGJhY2tfZGF0YWJhc2VfKE5VTEwpLAorICAgIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXyhOVUxMKSwKKyAgICB1bmRlcmxheV8oTlVMTCksCisgICAgdGFibGVzXyhuZXcgVGFibGVzKSwKKyAgICBlbmZvcmNlX2RlcGVuZGVuY2llc18odHJ1ZSksCisgICAgYWxsb3dfdW5rbm93bl8oZmFsc2UpIHt9CisKK0Rlc2NyaXB0b3JQb29sOjpEZXNjcmlwdG9yUG9vbChEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpCisgIDogbXV0ZXhfKG5ldyBNdXRleCksCisgICAgZmFsbGJhY2tfZGF0YWJhc2VfKGZhbGxiYWNrX2RhdGFiYXNlKSwKKyAgICBkZWZhdWx0X2Vycm9yX2NvbGxlY3Rvcl8oZXJyb3JfY29sbGVjdG9yKSwKKyAgICB1bmRlcmxheV8oTlVMTCksCisgICAgdGFibGVzXyhuZXcgVGFibGVzKSwKKyAgICBlbmZvcmNlX2RlcGVuZGVuY2llc18odHJ1ZSksCisgICAgYWxsb3dfdW5rbm93bl8oZmFsc2UpIHsKK30KKworRGVzY3JpcHRvclBvb2w6OkRlc2NyaXB0b3JQb29sKGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheSkKKyAgOiBtdXRleF8oTlVMTCksCisgICAgZmFsbGJhY2tfZGF0YWJhc2VfKE5VTEwpLAorICAgIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXyhOVUxMKSwKKyAgICB1bmRlcmxheV8odW5kZXJsYXkpLAorICAgIHRhYmxlc18obmV3IFRhYmxlcyksCisgICAgZW5mb3JjZV9kZXBlbmRlbmNpZXNfKHRydWUpLAorICAgIGFsbG93X3Vua25vd25fKGZhbHNlKSB7fQorCitEZXNjcmlwdG9yUG9vbDo6fkRlc2NyaXB0b3JQb29sKCkgeworICBpZiAobXV0ZXhfICE9IE5VTEwpIGRlbGV0ZSBtdXRleF87Cit9CisKKy8vIERlc2NyaXB0b3JQb29sOjpCdWlsZEZpbGUoKSBkZWZpbmVkIGxhdGVyLgorLy8gRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoKSBkZWZpbmVkIGxhdGVyLgorCit2b2lkIERlc2NyaXB0b3JQb29sOjpJbnRlcm5hbERvbnRFbmZvcmNlRGVwZW5kZW5jaWVzKCkgeworICBlbmZvcmNlX2RlcGVuZGVuY2llc18gPSBmYWxzZTsKK30KKworYm9vbCBEZXNjcmlwdG9yUG9vbDo6SW50ZXJuYWxJc0ZpbGVMb2FkZWQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgY29uc3QgeworICBNdXRleExvY2tNYXliZSBsb2NrKG11dGV4Xyk7CisgIHJldHVybiB0YWJsZXNfLT5GaW5kRmlsZShmaWxlbmFtZSkgIT0gTlVMTDsKK30KKworLy8gZ2VuZXJhdGVkX3Bvb2wgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCituYW1lc3BhY2UgeworCisKK0VuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UqIGdlbmVyYXRlZF9kYXRhYmFzZV8gPSBOVUxMOworRGVzY3JpcHRvclBvb2wqIGdlbmVyYXRlZF9wb29sXyA9IE5VTEw7CitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKGdlbmVyYXRlZF9wb29sX2luaXRfKTsKKwordm9pZCBEZWxldGVHZW5lcmF0ZWRQb29sKCkgeworICBkZWxldGUgZ2VuZXJhdGVkX2RhdGFiYXNlXzsKKyAgZ2VuZXJhdGVkX2RhdGFiYXNlXyA9IE5VTEw7CisgIGRlbGV0ZSBnZW5lcmF0ZWRfcG9vbF87CisgIGdlbmVyYXRlZF9wb29sXyA9IE5VTEw7Cit9CisKK3ZvaWQgSW5pdEdlbmVyYXRlZFBvb2woKSB7CisgIGdlbmVyYXRlZF9kYXRhYmFzZV8gPSBuZXcgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTsKKyAgZ2VuZXJhdGVkX3Bvb2xfID0gbmV3IERlc2NyaXB0b3JQb29sKGdlbmVyYXRlZF9kYXRhYmFzZV8pOworCisgIGludGVybmFsOjpPblNodXRkb3duKCZEZWxldGVHZW5lcmF0ZWRQb29sKTsKK30KKworaW5saW5lIHZvaWQgSW5pdEdlbmVyYXRlZFBvb2xPbmNlKCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCZnZW5lcmF0ZWRfcG9vbF9pbml0XywgJkluaXRHZW5lcmF0ZWRQb29sKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitjb25zdCBEZXNjcmlwdG9yUG9vbCogRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkgeworICBJbml0R2VuZXJhdGVkUG9vbE9uY2UoKTsKKyAgcmV0dXJuIGdlbmVyYXRlZF9wb29sXzsKK30KKworRGVzY3JpcHRvclBvb2wqIERlc2NyaXB0b3JQb29sOjppbnRlcm5hbF9nZW5lcmF0ZWRfcG9vbCgpIHsKKyAgSW5pdEdlbmVyYXRlZFBvb2xPbmNlKCk7CisgIHJldHVybiBnZW5lcmF0ZWRfcG9vbF87Cit9CisKK3ZvaWQgRGVzY3JpcHRvclBvb2w6OkludGVybmFsQWRkR2VuZXJhdGVkRmlsZSgKKyAgICBjb25zdCB2b2lkKiBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgaW50IHNpemUpIHsKKyAgLy8gU28sIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcm9jZXNzIG9mIGluaXRpYWxpemluZyB0aGUKKyAgLy8gZGVzY3JpcHRvcnMgZm9yIGdlbmVyYXRlZCBwcm90byBjbGFzc2VzLiAgRWFjaCBnZW5lcmF0ZWQgLnBiLmNjIGZpbGUKKyAgLy8gaGFzIGFuIGludGVybmFsIHByb2NlZHVyZSBjYWxsZWQgQWRkRGVzY3JpcHRvcnMoKSB3aGljaCBpcyBjYWxsZWQgYXQKKyAgLy8gcHJvY2VzcyBzdGFydHVwLCBhbmQgdGhhdCBmdW5jdGlvbiBjYWxscyB0aGlzIG9uZSBpbiBvcmRlciB0byByZWdpc3RlcgorICAvLyB0aGUgcmF3IGJ5dGVzIG9mIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHJlcHJlc2VudGluZyB0aGUgZmlsZS4KKyAgLy8KKyAgLy8gV2UgZG8gbm90IGFjdHVhbGx5IGNvbnN0cnVjdCB0aGUgZGVzY3JpcHRvciBvYmplY3RzIHJpZ2h0IGF3YXkuICBXZSBqdXN0CisgIC8vIGhhbmcgb24gdG8gdGhlIGJ5dGVzIHVudGlsIHRoZXkgYXJlIGFjdHVhbGx5IG5lZWRlZC4gIFdlIGFjdHVhbGx5IGNvbnN0cnVjdAorICAvLyB0aGUgZGVzY3JpcHRvciB0aGUgZmlyc3QgdGltZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0aGluZ3MgaGFwcGVuczoKKyAgLy8gKiBTb21lb25lIGNhbGxzIGEgbWV0aG9kIGxpa2UgZGVzY3JpcHRvcigpLCBHZXREZXNjcmlwdG9yKCksIG9yCisgIC8vICAgR2V0UmVmbGVjdGlvbigpIG9uIHRoZSBnZW5lcmF0ZWQgdHlwZXMsIHdoaWNoIHJlcXVpcmVzIHJldHVybmluZyB0aGUKKyAgLy8gICBkZXNjcmlwdG9yIG9yIGFuIG9iamVjdCBiYXNlZCBvbiBpdC4KKyAgLy8gKiBTb21lb25lIGxvb2tzIHVwIHRoZSBkZXNjcmlwdG9yIGluIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLgorICAvLworICAvLyBPbmNlIG9uZSBvZiB0aGVzZSBoYXBwZW5zLCB0aGUgRGVzY3JpcHRvclBvb2wgYWN0dWFsbHkgcGFyc2VzIHRoZQorICAvLyBGaWxlRGVzY3JpcHRvclByb3RvIGFuZCBnZW5lcmF0ZXMgYSBGaWxlRGVzY3JpcHRvciAoYW5kIGFsbCBpdHMgY2hpbGRyZW4pCisgIC8vIGJhc2VkIG9uIGl0LgorICAvLworICAvLyBOb3RlIHRoYXQgRmlsZURlc2NyaXB0b3JQcm90byBpcyBpdHNlbGYgYSBnZW5lcmF0ZWQgcHJvdG9jb2wgbWVzc2FnZS4KKyAgLy8gVGhlcmVmb3JlLCB3aGVuIHdlIHBhcnNlIG9uZSwgd2UgaGF2ZSB0byBiZSB2ZXJ5IGNhcmVmdWwgdG8gYXZvaWQgdXNpbmcKKyAgLy8gYW55IGRlc2NyaXB0b3ItYmFzZWQgb3BlcmF0aW9ucywgc2luY2UgdGhpcyBtaWdodCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24KKyAgLy8gb3IgZGVhZGxvY2suCisgIEluaXRHZW5lcmF0ZWRQb29sT25jZSgpOworICBHT09HTEVfQ0hFQ0soZ2VuZXJhdGVkX2RhdGFiYXNlXy0+QWRkKGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBzaXplKSk7Cit9CisKKworLy8gRmluZCpCeSogbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUT0RPKGtlbnRvbik6ICBUaGVyZSdzIGEgbG90IG9mIHJlcGVhdGVkIGNvZGUgaGVyZSwgYnV0IEknbSBub3Qgc3VyZSBpZgorLy8gICB0aGVyZSdzIGFueSBnb29kIHdheSB0byBmYWN0b3IgaXQgb3V0LiAgVGhpbmsgYWJvdXQgdGhpcyBzb21lIHRpbWUgd2hlbgorLy8gICB0aGVyZSdzIG5vdGhpbmcgbW9yZSBpbXBvcnRhbnQgdG8gZG8gKHJlYWQ6IG5ldmVyKS4KKworY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgTXV0ZXhMb2NrTWF5YmUgbG9jayhtdXRleF8pOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogcmVzdWx0ID0gdGFibGVzXy0+RmluZEZpbGUobmFtZSk7CisgIGlmIChyZXN1bHQgIT0gTlVMTCkgcmV0dXJuIHJlc3VsdDsKKyAgaWYgKHVuZGVybGF5XyAhPSBOVUxMKSB7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHJlc3VsdCA9IHVuZGVybGF5Xy0+RmluZEZpbGVCeU5hbWUobmFtZSk7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSByZXR1cm4gcmVzdWx0OworICB9CisgIGlmIChUcnlGaW5kRmlsZUluRmFsbGJhY2tEYXRhYmFzZShuYW1lKSkgeworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXNfLT5GaW5kRmlsZShuYW1lKTsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHJldHVybiByZXN1bHQ7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgIGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUpIGNvbnN0IHsKKyAgTXV0ZXhMb2NrTWF5YmUgbG9jayhtdXRleF8pOworICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZFN5bWJvbChzeW1ib2xfbmFtZSk7CisgIGlmICghcmVzdWx0LklzTnVsbCgpKSByZXR1cm4gcmVzdWx0LkdldEZpbGUoKTsKKyAgaWYgKHVuZGVybGF5XyAhPSBOVUxMKSB7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHJlc3VsdCA9CisgICAgICB1bmRlcmxheV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzeW1ib2xfbmFtZSk7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSByZXR1cm4gcmVzdWx0OworICB9CisgIGlmIChUcnlGaW5kU3ltYm9sSW5GYWxsYmFja0RhdGFiYXNlKHN5bWJvbF9uYW1lKSkgeworICAgIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kU3ltYm9sKHN5bWJvbF9uYW1lKTsKKyAgICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgcmV0dXJuIHJlc3VsdC5HZXRGaWxlKCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IERlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kTWVzc2FnZVR5cGVCeU5hbWUoCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpOworICByZXR1cm4gKHJlc3VsdC50eXBlID09IFN5bWJvbDo6TUVTU0FHRSkgPyByZXN1bHQuZGVzY3JpcHRvciA6IE5VTEw7Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRGaWVsZEJ5TmFtZSgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRCeU5hbWVIZWxwZXIodGhpcywgbmFtZSk7CisgIGlmIChyZXN1bHQudHlwZSA9PSBTeW1ib2w6OkZJRUxEICYmCisgICAgICAhcmVzdWx0LmZpZWxkX2Rlc2NyaXB0b3ItPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRFeHRlbnNpb25CeU5hbWUoCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpOworICBpZiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpGSUVMRCAmJgorICAgICAgcmVzdWx0LmZpZWxkX2Rlc2NyaXB0b3ItPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2NvbnN0IEVudW1EZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZEVudW1UeXBlQnlOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZEJ5TmFtZUhlbHBlcih0aGlzLCBuYW1lKTsKKyAgcmV0dXJuIChyZXN1bHQudHlwZSA9PSBTeW1ib2w6OkVOVU0pID8gcmVzdWx0LmVudW1fZGVzY3JpcHRvciA6IE5VTEw7Cit9CisKK2NvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRW51bVZhbHVlQnlOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZEJ5TmFtZUhlbHBlcih0aGlzLCBuYW1lKTsKKyAgcmV0dXJuIChyZXN1bHQudHlwZSA9PSBTeW1ib2w6OkVOVU1fVkFMVUUpID8KKyAgICByZXN1bHQuZW51bV92YWx1ZV9kZXNjcmlwdG9yIDogTlVMTDsKK30KKworY29uc3QgU2VydmljZURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kU2VydmljZUJ5TmFtZSgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRCeU5hbWVIZWxwZXIodGhpcywgbmFtZSk7CisgIHJldHVybiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpTRVJWSUNFKSA/IHJlc3VsdC5zZXJ2aWNlX2Rlc2NyaXB0b3IgOiBOVUxMOworfQorCitjb25zdCBNZXRob2REZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZE1ldGhvZEJ5TmFtZSgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRCeU5hbWVIZWxwZXIodGhpcywgbmFtZSk7CisgIHJldHVybiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpNRVRIT0QpID8gcmVzdWx0Lm1ldGhvZF9kZXNjcmlwdG9yIDogTlVMTDsKK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZEV4dGVuc2lvbkJ5TnVtYmVyKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLCBpbnQgbnVtYmVyKSBjb25zdCB7CisgIE11dGV4TG9ja01heWJlIGxvY2sobXV0ZXhfKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXNfLT5GaW5kRXh0ZW5zaW9uKGV4dGVuZGVlLCBudW1iZXIpOworICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGlmICh1bmRlcmxheV8gIT0gTlVMTCkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0KKyAgICAgIHVuZGVybGF5Xy0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKGV4dGVuZGVlLCBudW1iZXIpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBpZiAoVHJ5RmluZEV4dGVuc2lvbkluRmFsbGJhY2tEYXRhYmFzZShleHRlbmRlZSwgbnVtYmVyKSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0gdGFibGVzXy0+RmluZEV4dGVuc2lvbihleHRlbmRlZSwgbnVtYmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIERlc2NyaXB0b3JQb29sOjpGaW5kQWxsRXh0ZW5zaW9ucygKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXQpIGNvbnN0IHsKKyAgTXV0ZXhMb2NrTWF5YmUgbG9jayhtdXRleF8pOworCisgIC8vIEluaXRpYWxpemUgdGFibGVzXy0+ZXh0ZW5zaW9uc18gZnJvbSB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgZmlyc3QKKyAgLy8gKGJ1dCBkbyB0aGlzIG9ubHkgb25jZSBwZXIgZGVzY3JpcHRvcikuCisgIGlmIChmYWxsYmFja19kYXRhYmFzZV8gIT0gTlVMTCAmJgorICAgICAgdGFibGVzXy0+ZXh0ZW5zaW9uc19sb2FkZWRfZnJvbV9kYl8uY291bnQoZXh0ZW5kZWUpID09IDApIHsKKyAgICB2ZWN0b3I8aW50PiBudW1iZXJzOworICAgIGlmIChmYWxsYmFja19kYXRhYmFzZV8tPkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGV4dGVuZGVlLT5mdWxsX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVycykpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBpbnQgbnVtYmVyID0gbnVtYmVyc1tpXTsKKyAgICAgICAgaWYgKHRhYmxlc18tPkZpbmRFeHRlbnNpb24oZXh0ZW5kZWUsIG51bWJlcikgPT0gTlVMTCkgeworICAgICAgICAgIFRyeUZpbmRFeHRlbnNpb25JbkZhbGxiYWNrRGF0YWJhc2UoZXh0ZW5kZWUsIG51bWJlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRhYmxlc18tPmV4dGVuc2lvbnNfbG9hZGVkX2Zyb21fZGJfLmluc2VydChleHRlbmRlZSk7CisgICAgfQorICB9CisKKyAgdGFibGVzXy0+RmluZEFsbEV4dGVuc2lvbnMoZXh0ZW5kZWUsIG91dCk7CisgIGlmICh1bmRlcmxheV8gIT0gTlVMTCkgeworICAgIHVuZGVybGF5Xy0+RmluZEFsbEV4dGVuc2lvbnMoZXh0ZW5kZWUsIG91dCk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqCitEZXNjcmlwdG9yOjpGaW5kRmllbGRCeU51bWJlcihpbnQga2V5KSBjb25zdCB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0KKyAgICBmaWxlKCktPnRhYmxlc18tPkZpbmRGaWVsZEJ5TnVtYmVyKHRoaXMsIGtleSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCByZXN1bHQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqCitEZXNjcmlwdG9yOjpGaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPQorICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKHRoaXMsIGtleSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCByZXN1bHQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqCitEZXNjcmlwdG9yOjpGaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPQorICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKHRoaXMsIGtleSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCByZXN1bHQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqCitEZXNjcmlwdG9yOjpGaW5kRmllbGRCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9CisgICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKHRoaXMsIGtleSwgU3ltYm9sOjpGSUVMRCk7CisgIGlmICghcmVzdWx0LklzTnVsbCgpICYmICFyZXN1bHQuZmllbGRfZGVzY3JpcHRvci0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gcmVzdWx0LmZpZWxkX2Rlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKgorRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0KKyAgICBmaWxlKCktPnRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6OkZJRUxEKTsKKyAgaWYgKCFyZXN1bHQuSXNOdWxsKCkgJiYgcmVzdWx0LmZpZWxkX2Rlc2NyaXB0b3ItPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvcioKK0Rlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPQorICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKHRoaXMsIGtleSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCAhcmVzdWx0LT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKgorRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9CisgICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUodGhpcywga2V5KTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICFyZXN1bHQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCitjb25zdCBEZXNjcmlwdG9yKgorRGVzY3JpcHRvcjo6RmluZE5lc3RlZFR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9CisgICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKHRoaXMsIGtleSwgU3ltYm9sOjpNRVNTQUdFKTsKKyAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHsKKyAgICByZXR1cm4gcmVzdWx0LmRlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworY29uc3QgRW51bURlc2NyaXB0b3IqCitEZXNjcmlwdG9yOjpGaW5kRW51bVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9CisgICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKHRoaXMsIGtleSwgU3ltYm9sOjpFTlVNKTsKKyAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHsKKyAgICByZXR1cm4gcmVzdWx0LmVudW1fZGVzY3JpcHRvcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKgorRGVzY3JpcHRvcjo6RmluZEVudW1WYWx1ZUJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0KKyAgICBmaWxlKCktPnRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6OkVOVU1fVkFMVUUpOworICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgeworICAgIHJldHVybiByZXN1bHQuZW51bV92YWx1ZV9kZXNjcmlwdG9yOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2NvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqCitFbnVtRGVzY3JpcHRvcjo6RmluZFZhbHVlQnlOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7CisgIFN5bWJvbCByZXN1bHQgPQorICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbE9mVHlwZSh0aGlzLCBrZXksIFN5bWJvbDo6RU5VTV9WQUxVRSk7CisgIGlmICghcmVzdWx0LklzTnVsbCgpKSB7CisgICAgcmV0dXJuIHJlc3VsdC5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcioKK0VudW1EZXNjcmlwdG9yOjpGaW5kVmFsdWVCeU51bWJlcihpbnQga2V5KSBjb25zdCB7CisgIHJldHVybiBmaWxlKCktPnRhYmxlc18tPkZpbmRFbnVtVmFsdWVCeU51bWJlcih0aGlzLCBrZXkpOworfQorCitjb25zdCBNZXRob2REZXNjcmlwdG9yKgorU2VydmljZURlc2NyaXB0b3I6OkZpbmRNZXRob2RCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9CisgICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKHRoaXMsIGtleSwgU3ltYm9sOjpNRVRIT0QpOworICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgeworICAgIHJldHVybiByZXN1bHQubWV0aG9kX2Rlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworY29uc3QgRGVzY3JpcHRvcioKK0ZpbGVEZXNjcmlwdG9yOjpGaW5kTWVzc2FnZVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6Ok1FU1NBR0UpOworICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgeworICAgIHJldHVybiByZXN1bHQuZGVzY3JpcHRvcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitjb25zdCBFbnVtRGVzY3JpcHRvcioKK0ZpbGVEZXNjcmlwdG9yOjpGaW5kRW51bVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6OkVOVU0pOworICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgeworICAgIHJldHVybiByZXN1bHQuZW51bV9kZXNjcmlwdG9yOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2NvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqCitGaWxlRGVzY3JpcHRvcjo6RmluZEVudW1WYWx1ZUJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0KKyAgICB0YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKHRoaXMsIGtleSwgU3ltYm9sOjpFTlVNX1ZBTFVFKTsKKyAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHsKKyAgICByZXR1cm4gcmVzdWx0LmVudW1fdmFsdWVfZGVzY3JpcHRvcjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCitjb25zdCBTZXJ2aWNlRGVzY3JpcHRvcioKK0ZpbGVEZXNjcmlwdG9yOjpGaW5kU2VydmljZUJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbE9mVHlwZSh0aGlzLCBrZXksIFN5bWJvbDo6U0VSVklDRSk7CisgIGlmICghcmVzdWx0LklzTnVsbCgpKSB7CisgICAgcmV0dXJuIHJlc3VsdC5zZXJ2aWNlX2Rlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKgorRmlsZURlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25CeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6OkZJRUxEKTsKKyAgaWYgKCFyZXN1bHQuSXNOdWxsKCkgJiYgcmVzdWx0LmZpZWxkX2Rlc2NyaXB0b3ItPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2NvbnN0IEZpZWxkRGVzY3JpcHRvcioKK0ZpbGVEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0gdGFibGVzXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKHRoaXMsIGtleSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCAhcmVzdWx0LT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKgorRmlsZURlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXNfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUodGhpcywga2V5KTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICFyZXN1bHQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCitib29sIERlc2NyaXB0b3I6OklzRXh0ZW5zaW9uTnVtYmVyKGludCBudW1iZXIpIGNvbnN0IHsKKyAgLy8gTGluZWFyIHNlYXJjaCBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHdlIGRvbid0IGV4cGVjdCBhIG1lc3NhZ2UgdG8gaGF2ZQorICAvLyBtb3JlIHRoYW4gYSBjb3VwbGUgZXh0ZW5zaW9uIHJhbmdlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fcmFuZ2VfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKG51bWJlciA+PSBleHRlbnNpb25fcmFuZ2UoaSktPnN0YXJ0ICYmCisgICAgICAgIG51bWJlciA8ICBleHRlbnNpb25fcmFuZ2UoaSktPmVuZCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitib29sIERlc2NyaXB0b3JQb29sOjpUcnlGaW5kRmlsZUluRmFsbGJhY2tEYXRhYmFzZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uY291bnQobmFtZSkgPiAwKSByZXR1cm4gZmFsc2U7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBpZiAoIWZhbGxiYWNrX2RhdGFiYXNlXy0+RmluZEZpbGVCeU5hbWUobmFtZSwgJmZpbGVfcHJvdG8pIHx8CisgICAgICBCdWlsZEZpbGVGcm9tRGF0YWJhc2UoZmlsZV9wcm90bykgPT0gTlVMTCkgeworICAgIHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uaW5zZXJ0KG5hbWUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIERlc2NyaXB0b3JQb29sOjpUcnlGaW5kU3ltYm9sSW5GYWxsYmFja0RhdGFiYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgeworICBpZiAoZmFsbGJhY2tfZGF0YWJhc2VfID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIGlmICghZmFsbGJhY2tfZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2wobmFtZSwgJmZpbGVfcHJvdG8pKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHRhYmxlc18tPkZpbmRGaWxlKGZpbGVfcHJvdG8ubmFtZSgpKSAhPSBOVUxMKSB7CisgICAgLy8gV2UndmUgYWxyZWFkeSBsb2FkZWQgdGhpcyBmaWxlLCBhbmQgaXQgYXBwYXJlbnRseSBkb2Vzbid0IGNvbnRhaW4gdGhlCisgICAgLy8gc3ltYm9sIHdlJ3JlIGxvb2tpbmcgZm9yLiAgU29tZSBEZXNjcmlwdG9yRGF0YWJhc2VzIHJldHVybiBmYWxzZQorICAgIC8vIHBvc2l0aXZlcy4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoQnVpbGRGaWxlRnJvbURhdGFiYXNlKGZpbGVfcHJvdG8pID09IE5VTEwpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXNjcmlwdG9yUG9vbDo6VHJ5RmluZEV4dGVuc2lvbkluRmFsbGJhY2tEYXRhYmFzZSgKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsIGludCBmaWVsZF9udW1iZXIpIGNvbnN0IHsKKyAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBpZiAoIWZhbGxiYWNrX2RhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAorICAgICAgICBjb250YWluaW5nX3R5cGUtPmZ1bGxfbmFtZSgpLCBmaWVsZF9udW1iZXIsICZmaWxlX3Byb3RvKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICh0YWJsZXNfLT5GaW5kRmlsZShmaWxlX3Byb3RvLm5hbWUoKSkgIT0gTlVMTCkgeworICAgIC8vIFdlJ3ZlIGFscmVhZHkgbG9hZGVkIHRoaXMgZmlsZSwgYW5kIGl0IGFwcGFyZW50bHkgZG9lc24ndCBjb250YWluIHRoZQorICAgIC8vIGV4dGVuc2lvbiB3ZSdyZSBsb29raW5nIGZvci4gIFNvbWUgRGVzY3JpcHRvckRhdGFiYXNlcyByZXR1cm4gZmFsc2UKKyAgICAvLyBwb3NpdGl2ZXMuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKEJ1aWxkRmlsZUZyb21EYXRhYmFzZShmaWxlX3Byb3RvKSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RyaW5nIEZpZWxkRGVzY3JpcHRvcjo6RGVmYXVsdFZhbHVlQXNTdHJpbmcoYm9vbCBxdW90ZV9zdHJpbmdfdHlwZSkgY29uc3QgeworICBHT09HTEVfQ0hFQ0soaGFzX2RlZmF1bHRfdmFsdWUoKSkgPDwgIk5vIGRlZmF1bHQgdmFsdWUiOworICBzd2l0Y2ggKGNwcF90eXBlKCkpIHsKKyAgICBjYXNlIENQUFRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gU2ltcGxlSXRvYShkZWZhdWx0X3ZhbHVlX2ludDMyKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUFBUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BQVFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gU2ltcGxlSXRvYShkZWZhdWx0X3ZhbHVlX3VpbnQzMigpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BQVFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gU2ltcGxlSXRvYShkZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BQVFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiBTaW1wbGVGdG9hKGRlZmF1bHRfdmFsdWVfZmxvYXQoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQUFRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIFNpbXBsZUR0b2EoZGVmYXVsdF92YWx1ZV9kb3VibGUoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQUFRZUEVfQk9PTDoKKyAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlX2Jvb2woKSA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQUFRZUEVfU1RSSU5HOgorICAgICAgaWYgKHF1b3RlX3N0cmluZ190eXBlKSB7CisgICAgICAgIHJldHVybiAiXCIiICsgQ0VzY2FwZShkZWZhdWx0X3ZhbHVlX3N0cmluZygpKSArICJcIiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAodHlwZSgpID09IFRZUEVfQllURVMpIHsKKyAgICAgICAgICByZXR1cm4gQ0VzY2FwZShkZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZV9zdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUFBUWVBFX0VOVU06CisgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZV9lbnVtKCktPm5hbWUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BQVFlQRV9NRVNTQUdFOgorICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzISI7CisgICAgICBicmVhazsKKyAgfQorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmU6IGZhaWxlZCB0byBnZXQgZGVmYXVsdCB2YWx1ZSBhcyBzdHJpbmciOworICByZXR1cm4gIiI7Cit9CisKKy8vIENvcHlUbyBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBGaWxlRGVzY3JpcHRvcjo6Q29weVRvKEZpbGVEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CisgIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOworICBpZiAoIXBhY2thZ2UoKS5lbXB0eSgpKSBwcm90by0+c2V0X3BhY2thZ2UocGFja2FnZSgpKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgcHJvdG8tPmFkZF9kZXBlbmRlbmN5KGRlcGVuZGVuY3koaSktPm5hbWUoKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX3R5cGUoaSktPkNvcHlUbyhwcm90by0+YWRkX21lc3NhZ2VfdHlwZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX3R5cGUoaSktPkNvcHlUbyhwcm90by0+YWRkX2VudW1fdHlwZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgc2VydmljZShpKS0+Q29weVRvKHByb3RvLT5hZGRfc2VydmljZSgpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb24oaSktPkNvcHlUbyhwcm90by0+YWRkX2V4dGVuc2lvbigpKTsKKyAgfQorCisgIGlmICgmb3B0aW9ucygpICE9ICZGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvcjo6Q29weVRvKERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKKyAgcHJvdG8tPnNldF9uYW1lKG5hbWUoKSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZChpKS0+Q29weVRvKHByb3RvLT5hZGRfZmllbGQoKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBuZXN0ZWRfdHlwZShpKS0+Q29weVRvKHByb3RvLT5hZGRfbmVzdGVkX3R5cGUoKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV90eXBlKGkpLT5Db3B5VG8ocHJvdG8tPmFkZF9lbnVtX3R5cGUoKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fcmFuZ2VfY291bnQoKTsgaSsrKSB7CisgICAgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UgPSBwcm90by0+YWRkX2V4dGVuc2lvbl9yYW5nZSgpOworICAgIHJhbmdlLT5zZXRfc3RhcnQoZXh0ZW5zaW9uX3JhbmdlKGkpLT5zdGFydCk7CisgICAgcmFuZ2UtPnNldF9lbmQoZXh0ZW5zaW9uX3JhbmdlKGkpLT5lbmQpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGV4dGVuc2lvbihpKS0+Q29weVRvKHByb3RvLT5hZGRfZXh0ZW5zaW9uKCkpOworICB9CisKKyAgaWYgKCZvcHRpb25zKCkgIT0gJk1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKKyAgICBwcm90by0+bXV0YWJsZV9vcHRpb25zKCktPkNvcHlGcm9tKG9wdGlvbnMoKSk7CisgIH0KK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3I6OkNvcHlUbyhGaWVsZERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKKyAgcHJvdG8tPnNldF9uYW1lKG5hbWUoKSk7CisgIHByb3RvLT5zZXRfbnVtYmVyKG51bWJlcigpKTsKKworICAvLyBTb21lIGNvbXBpbGVycyBkbyBub3QgYWxsb3cgc3RhdGljX2Nhc3QgZGlyZWN0bHkgYmV0d2VlbiB0d28gZW51bSB0eXBlcywKKyAgLy8gc28gd2UgbXVzdCBjYXN0IHRvIGludCBmaXJzdC4KKyAgcHJvdG8tPnNldF9sYWJlbChzdGF0aWNfY2FzdDxGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWw+KAorICAgICAgICAgICAgICAgICAgICAgaW1wbGljaXRfY2FzdDxpbnQ+KGxhYmVsKCkpKSk7CisgIHByb3RvLT5zZXRfdHlwZShzdGF0aWNfY2FzdDxGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZT4oCisgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50Pih0eXBlKCkpKSk7CisKKyAgaWYgKGlzX2V4dGVuc2lvbigpKSB7CisgICAgaWYgKCFjb250YWluaW5nX3R5cGUoKS0+aXNfdW5xdWFsaWZpZWRfcGxhY2Vob2xkZXJfKSB7CisgICAgICBwcm90by0+c2V0X2V4dGVuZGVlKCIuIik7CisgICAgfQorICAgIHByb3RvLT5tdXRhYmxlX2V4dGVuZGVlKCktPmFwcGVuZChjb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCkpOworICB9CisKKyAgaWYgKGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9NRVNTQUdFKSB7CisgICAgaWYgKG1lc3NhZ2VfdHlwZSgpLT5pc19wbGFjZWhvbGRlcl8pIHsKKyAgICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IGtub3cgaWYgdGhlIHR5cGUgaXMgYSBtZXNzYWdlIHR5cGUuICBJdCBjb3VsZCBiZQorICAgICAgLy8gYW4gZW51bS4KKyAgICAgIHByb3RvLT5jbGVhcl90eXBlKCk7CisgICAgfQorCisgICAgaWYgKCFtZXNzYWdlX3R5cGUoKS0+aXNfdW5xdWFsaWZpZWRfcGxhY2Vob2xkZXJfKSB7CisgICAgICBwcm90by0+c2V0X3R5cGVfbmFtZSgiLiIpOworICAgIH0KKyAgICBwcm90by0+bXV0YWJsZV90eXBlX25hbWUoKS0+YXBwZW5kKG1lc3NhZ2VfdHlwZSgpLT5mdWxsX25hbWUoKSk7CisgIH0gZWxzZSBpZiAoY3BwX3R5cGUoKSA9PSBDUFBUWVBFX0VOVU0pIHsKKyAgICBpZiAoIWVudW1fdHlwZSgpLT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8pIHsKKyAgICAgIHByb3RvLT5zZXRfdHlwZV9uYW1lKCIuIik7CisgICAgfQorICAgIHByb3RvLT5tdXRhYmxlX3R5cGVfbmFtZSgpLT5hcHBlbmQoZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKyAgfQorCisgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgcHJvdG8tPnNldF9kZWZhdWx0X3ZhbHVlKERlZmF1bHRWYWx1ZUFzU3RyaW5nKGZhbHNlKSk7CisgIH0KKworICBpZiAoJm9wdGlvbnMoKSAhPSAmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKKyAgICBwcm90by0+bXV0YWJsZV9vcHRpb25zKCktPkNvcHlGcm9tKG9wdGlvbnMoKSk7CisgIH0KK30KKwordm9pZCBFbnVtRGVzY3JpcHRvcjo6Q29weVRvKEVudW1EZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CisgIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgdmFsdWUoaSktPkNvcHlUbyhwcm90by0+YWRkX3ZhbHVlKCkpOworICB9CisKKyAgaWYgKCZvcHRpb25zKCkgIT0gJkVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKKyAgICBwcm90by0+bXV0YWJsZV9vcHRpb25zKCktPkNvcHlGcm9tKG9wdGlvbnMoKSk7CisgIH0KK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yOjpDb3B5VG8oRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBwcm90by0+c2V0X25hbWUobmFtZSgpKTsKKyAgcHJvdG8tPnNldF9udW1iZXIobnVtYmVyKCkpOworCisgIGlmICgmb3B0aW9ucygpICE9ICZFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKKyAgICBwcm90by0+bXV0YWJsZV9vcHRpb25zKCktPkNvcHlGcm9tKG9wdGlvbnMoKSk7CisgIH0KK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvcjo6Q29weVRvKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CisgIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIG1ldGhvZChpKS0+Q29weVRvKHByb3RvLT5hZGRfbWV0aG9kKCkpOworICB9CisKKyAgaWYgKCZvcHRpb25zKCkgIT0gJlNlcnZpY2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKKyAgICBwcm90by0+bXV0YWJsZV9vcHRpb25zKCktPkNvcHlGcm9tKG9wdGlvbnMoKSk7CisgIH0KK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yOjpDb3B5VG8oTWV0aG9kRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBwcm90by0+c2V0X25hbWUobmFtZSgpKTsKKworICBpZiAoIWlucHV0X3R5cGUoKS0+aXNfdW5xdWFsaWZpZWRfcGxhY2Vob2xkZXJfKSB7CisgICAgcHJvdG8tPnNldF9pbnB1dF90eXBlKCIuIik7CisgIH0KKyAgcHJvdG8tPm11dGFibGVfaW5wdXRfdHlwZSgpLT5hcHBlbmQoaW5wdXRfdHlwZSgpLT5mdWxsX25hbWUoKSk7CisKKyAgaWYgKCFvdXRwdXRfdHlwZSgpLT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8pIHsKKyAgICBwcm90by0+c2V0X291dHB1dF90eXBlKCIuIik7CisgIH0KKyAgcHJvdG8tPm11dGFibGVfb3V0cHV0X3R5cGUoKS0+YXBwZW5kKG91dHB1dF90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKworICBpZiAoJm9wdGlvbnMoKSAhPSAmTWV0aG9kT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CisgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOworICB9Cit9CisKKy8vIERlYnVnU3RyaW5nIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbmFtZXNwYWNlIHsKKworLy8gVXNlZCBieSBlYWNoIG9mIHRoZSBvcHRpb24gZm9ybWF0dGVycy4KK2Jvb2wgUmV0cmlldmVPcHRpb25zKGNvbnN0IE1lc3NhZ2UgJm9wdGlvbnMsIHZlY3RvcjxzdHJpbmc+ICpvcHRpb25fZW50cmllcykgeworICBvcHRpb25fZW50cmllcy0+Y2xlYXIoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG9wdGlvbnMuR2V0UmVmbGVjdGlvbigpOworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG9wdGlvbnMsICZmaWVsZHMpOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgeworICAgIC8vIERvZXNuJ3QgbWFrZSBzZW5zZSB0byBoYXZlIG1lc3NhZ2UgdHlwZSBmaWVsZHMgaGVyZQorICAgIGlmIChmaWVsZHNbaV0tPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgY291bnQgPSAxOworICAgIGJvb2wgcmVwZWF0ZWQgPSBmYWxzZTsKKyAgICBpZiAoZmllbGRzW2ldLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICBjb3VudCA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShvcHRpb25zLCBmaWVsZHNbaV0pOworICAgICAgcmVwZWF0ZWQgPSB0cnVlOworICAgIH0KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKyAgICAgIHN0cmluZyBmaWVsZHZhbDsKKyAgICAgIFRleHRGb3JtYXQ6OlByaW50RmllbGRWYWx1ZVRvU3RyaW5nKG9wdGlvbnMsIGZpZWxkc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkID8gY291bnQgOiAtMSwgJmZpZWxkdmFsKTsKKyAgICAgIG9wdGlvbl9lbnRyaWVzLT5wdXNoX2JhY2soZmllbGRzW2ldLT5uYW1lKCkgKyAiID0gIiArIGZpZWxkdmFsKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFvcHRpb25fZW50cmllcy0+ZW1wdHkoKTsKK30KKworLy8gRm9ybWF0cyBvcHRpb25zIHRoYXQgYWxsIGFwcGVhciB0b2dldGhlciBpbiBicmFja2V0cy4gRG9lcyBub3QgaW5jbHVkZQorLy8gYnJhY2tldHMuCitib29sIEZvcm1hdEJyYWNrZXRlZE9wdGlvbnMoY29uc3QgTWVzc2FnZSAmb3B0aW9ucywgc3RyaW5nICpvdXRwdXQpIHsKKyAgdmVjdG9yPHN0cmluZz4gYWxsX29wdGlvbnM7CisgIGlmIChSZXRyaWV2ZU9wdGlvbnMob3B0aW9ucywgJmFsbF9vcHRpb25zKSkgeworICAgIG91dHB1dC0+YXBwZW5kKEpvaW5TdHJpbmdzKGFsbF9vcHRpb25zLCAiLCAiKSk7CisgIH0KKyAgcmV0dXJuICFhbGxfb3B0aW9ucy5lbXB0eSgpOworfQorCisvLyBGb3JtYXRzIG9wdGlvbnMgb25lIHBlciBsaW5lCitib29sIEZvcm1hdExpbmVPcHRpb25zKGludCBkZXB0aCwgY29uc3QgTWVzc2FnZSAmb3B0aW9ucywgc3RyaW5nICpvdXRwdXQpIHsKKyAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgIHZlY3RvcjxzdHJpbmc+IGFsbF9vcHRpb25zOworICBpZiAoUmV0cmlldmVPcHRpb25zKG9wdGlvbnMsICZhbGxfb3B0aW9ucykpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbF9vcHRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKG91dHB1dCwgIiQwb3B0aW9uICQxO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LCBhbGxfb3B0aW9uc1tpXSk7CisgICAgfQorICB9CisgIHJldHVybiAhYWxsX29wdGlvbnMuZW1wdHkoKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitzdHJpbmcgRmlsZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBzdHJpbmcgY29udGVudHMgPSAic3ludGF4ID0gXCJwcm90bzJcIjtcblxuIjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJpbXBvcnQgXCIkMFwiO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3koaSktPm5hbWUoKSk7CisgIH0KKworICBpZiAoIXBhY2thZ2UoKS5lbXB0eSgpKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJwYWNrYWdlICQwO1xuXG4iLCBwYWNrYWdlKCkpOworICB9CisKKyAgaWYgKEZvcm1hdExpbmVPcHRpb25zKDAsIG9wdGlvbnMoKSwgJmNvbnRlbnRzKSkgeworICAgIGNvbnRlbnRzLmFwcGVuZCgiXG4iKTsgIC8vIGFkZCBzb21lIHNwYWNlIGlmIHdlIGhhZCBvcHRpb25zCisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX3R5cGUoaSktPkRlYnVnU3RyaW5nKDAsICZjb250ZW50cyk7CisgICAgY29udGVudHMuYXBwZW5kKCJcbiIpOworICB9CisKKyAgLy8gRmluZCBhbGwgdGhlICdncm91cCcgdHlwZSBleHRlbnNpb25zOyB3ZSB3aWxsIG5vdCBvdXRwdXQgdGhlaXIgbmVzdGVkCisgIC8vIGRlZmluaXRpb25zICh0aG9zZSB3aWxsIGJlIGRvbmUgd2l0aCB0aGVpciBncm91cCBmaWVsZCBkZXNjcmlwdG9yKS4KKyAgc2V0PGNvbnN0IERlc2NyaXB0b3IqPiBncm91cHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGlmIChleHRlbnNpb24oaSktPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICAgIGdyb3Vwcy5pbnNlcnQoZXh0ZW5zaW9uKGkpLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGdyb3Vwcy5jb3VudChtZXNzYWdlX3R5cGUoaSkpID09IDApIHsKKyAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJmNvbnRlbnRzLCAibWVzc2FnZSAkMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZShpKS0+bmFtZSgpKTsKKyAgICAgIG1lc3NhZ2VfdHlwZShpKS0+RGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzKTsKKyAgICAgIGNvbnRlbnRzLmFwcGVuZCgiXG4iKTsKKyAgICB9CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgc2VydmljZShpKS0+RGVidWdTdHJpbmcoJmNvbnRlbnRzKTsKKyAgICBjb250ZW50cy5hcHBlbmQoIlxuIik7CisgIH0KKworICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUgPSBOVUxMOworICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZXh0ZW5zaW9uKGkpLT5jb250YWluaW5nX3R5cGUoKSAhPSBjb250YWluaW5nX3R5cGUpIHsKKyAgICAgIGlmIChpID4gMCkgY29udGVudHMuYXBwZW5kKCJ9XG5cbiIpOworICAgICAgY29udGFpbmluZ190eXBlID0gZXh0ZW5zaW9uKGkpLT5jb250YWluaW5nX3R5cGUoKTsKKyAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJmNvbnRlbnRzLCAiZXh0ZW5kIC4kMCB7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUtPmZ1bGxfbmFtZSgpKTsKKyAgICB9CisgICAgZXh0ZW5zaW9uKGkpLT5EZWJ1Z1N0cmluZygxLCAmY29udGVudHMpOworICB9CisgIGlmIChleHRlbnNpb25fY291bnQoKSA+IDApIGNvbnRlbnRzLmFwcGVuZCgifVxuXG4iKTsKKworICByZXR1cm4gY29udGVudHM7Cit9CisKK3N0cmluZyBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgc3RyaW5nIGNvbnRlbnRzOworICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZjb250ZW50cywgIm1lc3NhZ2UgJDAiLCBuYW1lKCkpOworICBEZWJ1Z1N0cmluZygwLCAmY29udGVudHMpOworICByZXR1cm4gY29udGVudHM7Cit9CisKK3ZvaWQgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdCB7CisgIHN0cmluZyBwcmVmaXgoZGVwdGggKiAyLCAnICcpOworICArK2RlcHRoOworICBjb250ZW50cy0+YXBwZW5kKCIge1xuIik7CisKKyAgRm9ybWF0TGluZU9wdGlvbnMoZGVwdGgsIG9wdGlvbnMoKSwgY29udGVudHMpOworCisgIC8vIEZpbmQgYWxsIHRoZSAnZ3JvdXAnIHR5cGVzIGZvciBmaWVsZHMgYW5kIGV4dGVuc2lvbnM7IHdlIHdpbGwgbm90IG91dHB1dAorICAvLyB0aGVpciBuZXN0ZWQgZGVmaW5pdGlvbnMgKHRob3NlIHdpbGwgYmUgZG9uZSB3aXRoIHRoZWlyIGdyb3VwIGZpZWxkCisgIC8vIGRlc2NyaXB0b3IpLgorICBzZXQ8Y29uc3QgRGVzY3JpcHRvcio+IGdyb3VwczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZmllbGQoaSktPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICAgIGdyb3Vwcy5pbnNlcnQoZmllbGQoaSktPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGV4dGVuc2lvbihpKS0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgeworICAgICAgZ3JvdXBzLmluc2VydChleHRlbnNpb24oaSktPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICB9CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGlmIChncm91cHMuY291bnQobmVzdGVkX3R5cGUoaSkpID09IDApIHsKKyAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCAgbWVzc2FnZSAkMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgbmVzdGVkX3R5cGUoaSktPm5hbWUoKSk7CisgICAgICBuZXN0ZWRfdHlwZShpKS0+RGVidWdTdHJpbmcoZGVwdGgsIGNvbnRlbnRzKTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgZW51bV90eXBlKGkpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgY29udGVudHMpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGQoaSktPkRlYnVnU3RyaW5nKGRlcHRoLCBjb250ZW50cyk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBpKyspIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAgIGV4dGVuc2lvbnMgJDEgdG8gJDI7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX3JhbmdlKGkpLT5zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9yYW5nZShpKS0+ZW5kIC0gMSk7CisgIH0KKworICAvLyBHcm91cCBleHRlbnNpb25zIGJ5IHdoYXQgdGhleSBleHRlbmQsIHNvIHRoZXkgY2FuIGJlIHByaW50ZWQgb3V0IHRvZ2V0aGVyLgorICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUgPSBOVUxMOworICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZXh0ZW5zaW9uKGkpLT5jb250YWluaW5nX3R5cGUoKSAhPSBjb250YWluaW5nX3R5cGUpIHsKKyAgICAgIGlmIChpID4gMCkgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwICB9XG4iLCBwcmVmaXgpOworICAgICAgY29udGFpbmluZ190eXBlID0gZXh0ZW5zaW9uKGkpLT5jb250YWluaW5nX3R5cGUoKTsKKyAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCAgZXh0ZW5kIC4kMSB7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIGNvbnRhaW5pbmdfdHlwZS0+ZnVsbF9uYW1lKCkpOworICAgIH0KKyAgICBleHRlbnNpb24oaSktPkRlYnVnU3RyaW5nKGRlcHRoICsgMSwgY29udGVudHMpOworICB9CisgIGlmIChleHRlbnNpb25fY291bnQoKSA+IDApCisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwICB9XG4iLCBwcmVmaXgpOworCisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMH1cbiIsIHByZWZpeCk7Cit9CisKK3N0cmluZyBGaWVsZERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBzdHJpbmcgY29udGVudHM7CisgIGludCBkZXB0aCA9IDA7CisgIGlmIChpc19leHRlbnNpb24oKSkgeworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJmNvbnRlbnRzLCAiZXh0ZW5kIC4kMCB7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpKTsKKyAgICBkZXB0aCA9IDE7CisgIH0KKyAgRGVidWdTdHJpbmcoZGVwdGgsICZjb250ZW50cyk7CisgIGlmIChpc19leHRlbnNpb24oKSkgeworICAgICBjb250ZW50cy5hcHBlbmQoIn1cbiIpOworICB9CisgIHJldHVybiBjb250ZW50czsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nICpjb250ZW50cykgY29uc3QgeworICBzdHJpbmcgcHJlZml4KGRlcHRoICogMiwgJyAnKTsKKyAgc3RyaW5nIGZpZWxkX3R5cGU7CisgIHN3aXRjaCAodHlwZSgpKSB7CisgICAgY2FzZSBUWVBFX01FU1NBR0U6CisgICAgICBmaWVsZF90eXBlID0gIi4iICsgbWVzc2FnZV90eXBlKCktPmZ1bGxfbmFtZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0VOVU06CisgICAgICBmaWVsZF90eXBlID0gIi4iICsgZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZpZWxkX3R5cGUgPSBrVHlwZVRvTmFtZVt0eXBlKCldOworICB9CisKKyAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwJDEgJDIgJDMgPSAkNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMYWJlbFRvTmFtZVtsYWJlbCgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUoKSA9PSBUWVBFX0dST1VQID8gbWVzc2FnZV90eXBlKCktPm5hbWUoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyKCkpOworCisgIGJvb2wgYnJhY2tldGVkID0gZmFsc2U7CisgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgYnJhY2tldGVkID0gdHJ1ZTsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiIFtkZWZhdWx0ID0gJDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlQXNTdHJpbmcodHJ1ZSkpOworICB9CisKKyAgc3RyaW5nIGZvcm1hdHRlZF9vcHRpb25zOworICBpZiAoRm9ybWF0QnJhY2tldGVkT3B0aW9ucyhvcHRpb25zKCksICZmb3JtYXR0ZWRfb3B0aW9ucykpIHsKKyAgICBjb250ZW50cy0+YXBwZW5kKGJyYWNrZXRlZCA/ICIsICIgOiAiIFsiKTsKKyAgICBicmFja2V0ZWQgPSB0cnVlOworICAgIGNvbnRlbnRzLT5hcHBlbmQoZm9ybWF0dGVkX29wdGlvbnMpOworICB9CisKKyAgaWYgKGJyYWNrZXRlZCkgeworICAgIGNvbnRlbnRzLT5hcHBlbmQoIl0iKTsKKyAgfQorCisgIGlmICh0eXBlKCkgPT0gVFlQRV9HUk9VUCkgeworICAgIG1lc3NhZ2VfdHlwZSgpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgY29udGVudHMpOworICB9IGVsc2UgeworICAgIGNvbnRlbnRzLT5hcHBlbmQoIjtcbiIpOworICB9Cit9CisKK3N0cmluZyBFbnVtRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIHN0cmluZyBjb250ZW50czsKKyAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzKTsKKyAgcmV0dXJuIGNvbnRlbnRzOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMpIGNvbnN0IHsKKyAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgICsrZGVwdGg7CisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMGVudW0gJDEge1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIG5hbWUoKSk7CisKKyAgRm9ybWF0TGluZU9wdGlvbnMoZGVwdGgsIG9wdGlvbnMoKSwgY29udGVudHMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgdmFsdWUoaSktPkRlYnVnU3RyaW5nKGRlcHRoLCBjb250ZW50cyk7CisgIH0KKyAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwfVxuIiwgcHJlZml4KTsKK30KKworc3RyaW5nIEVudW1WYWx1ZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBzdHJpbmcgY29udGVudHM7CisgIERlYnVnU3RyaW5nKDAsICZjb250ZW50cyk7CisgIHJldHVybiBjb250ZW50czsKK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMpIGNvbnN0IHsKKyAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCQxID0gJDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgbmFtZSgpLCBudW1iZXIoKSk7CisKKyAgc3RyaW5nIGZvcm1hdHRlZF9vcHRpb25zOworICBpZiAoRm9ybWF0QnJhY2tldGVkT3B0aW9ucyhvcHRpb25zKCksICZmb3JtYXR0ZWRfb3B0aW9ucykpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiIFskMF0iLCBmb3JtYXR0ZWRfb3B0aW9ucyk7CisgIH0KKyAgY29udGVudHMtPmFwcGVuZCgiO1xuIik7Cit9CisKK3N0cmluZyBTZXJ2aWNlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIHN0cmluZyBjb250ZW50czsKKyAgRGVidWdTdHJpbmcoJmNvbnRlbnRzKTsKKyAgcmV0dXJuIGNvbnRlbnRzOworfQorCit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhzdHJpbmcgKmNvbnRlbnRzKSBjb25zdCB7CisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICJzZXJ2aWNlICQwIHtcbiIsIG5hbWUoKSk7CisKKyAgRm9ybWF0TGluZU9wdGlvbnMoMSwgb3B0aW9ucygpLCBjb250ZW50cyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RfY291bnQoKTsgaSsrKSB7CisgICAgbWV0aG9kKGkpLT5EZWJ1Z1N0cmluZygxLCBjb250ZW50cyk7CisgIH0KKworICBjb250ZW50cy0+YXBwZW5kKCJ9XG4iKTsKK30KKworc3RyaW5nIE1ldGhvZERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBzdHJpbmcgY29udGVudHM7CisgIERlYnVnU3RyaW5nKDAsICZjb250ZW50cyk7CisgIHJldHVybiBjb250ZW50czsKK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMpIGNvbnN0IHsKKyAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisgICsrZGVwdGg7CisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMHJwYyAkMSguJDIpIHJldHVybnMgKC4kMykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGUoKS0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGUoKS0+ZnVsbF9uYW1lKCkpOworCisgIHN0cmluZyBmb3JtYXR0ZWRfb3B0aW9uczsKKyAgaWYgKEZvcm1hdExpbmVPcHRpb25zKGRlcHRoLCBvcHRpb25zKCksICZmb3JtYXR0ZWRfb3B0aW9ucykpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiIHtcbiQwJDF9XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkX29wdGlvbnMsIHByZWZpeCk7CisgIH0gZWxzZSB7CisgICAgY29udGVudHMtPmFwcGVuZCgiO1xuIik7CisgIH0KK30KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbmFtZXNwYWNlIHsKKworLy8gUmVwcmVzZW50cyBhbiBvcHRpb25zIG1lc3NhZ2UgdG8gaW50ZXJwcmV0LiBFeHRlbnNpb24gbmFtZXMgaW4gdGhlIG9wdGlvbgorLy8gbmFtZSBhcmUgcmVzcG9sdmVkIHJlbGF0aXZlIHRvIG5hbWVfc2NvcGUuIGVsZW1lbnRfbmFtZSBhbmQgb3JpZ19vcHQgYXJlCisvLyB1c2VkIG9ubHkgZm9yIGVycm9yIHJlcG9ydGluZyAoc2luY2UgdGhlIHBhcnNlciByZWNvcmRzIGxvY2F0aW9ucyBhZ2FpbnN0CisvLyBwb2ludGVycyBpbiB0aGUgb3JpZ2luYWwgb3B0aW9ucywgbm90IHRoZSBtdXRhYmxlIGNvcHkpLiBUaGUgTWVzc2FnZSBtdXN0IGJlCisvLyBvbmUgb2YgdGhlIE9wdGlvbnMgbWVzc2FnZXMgaW4gZGVzY3JpcHRvci5wcm90by4KK3N0cnVjdCBPcHRpb25zVG9JbnRlcnByZXQgeworICBPcHRpb25zVG9JbnRlcnByZXQoY29uc3Qgc3RyaW5nJiBucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZWwsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBvcmlnX29wdCwKKyAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG9wdCkKKyAgICAgIDogbmFtZV9zY29wZShucyksCisgICAgICAgIGVsZW1lbnRfbmFtZShlbCksCisgICAgICAgIG9yaWdpbmFsX29wdGlvbnMob3JpZ19vcHQpLAorICAgICAgICBvcHRpb25zKG9wdCkgeworICB9CisgIHN0cmluZyBuYW1lX3Njb3BlOworICBzdHJpbmcgZWxlbWVudF9uYW1lOworICBjb25zdCBNZXNzYWdlKiBvcmlnaW5hbF9vcHRpb25zOworICBNZXNzYWdlKiBvcHRpb25zOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIERlc2NyaXB0b3JCdWlsZGVyIHsKKyBwdWJsaWM6CisgIERlc2NyaXB0b3JCdWlsZGVyKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAorICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6VGFibGVzKiB0YWJsZXMsCisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKTsKKyAgfkRlc2NyaXB0b3JCdWlsZGVyKCk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIEJ1aWxkRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgT3B0aW9uSW50ZXJwcmV0ZXI7CisKKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2xfOworICBEZXNjcmlwdG9yUG9vbDo6VGFibGVzKiB0YWJsZXNfOyAgLy8gZm9yIGNvbnZlbmllbmNlCisgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yXzsKKworICAvLyBBcyB3ZSBidWlsZCBkZXNjcmlwdG9ycyB3ZSBzdG9yZSBjb3BpZXMgb2YgdGhlIG9wdGlvbnMgbWVzc2FnZXMgaW4KKyAgLy8gdGhlbS4gV2UgcHV0IHBvaW50ZXJzIHRvIHRob3NlIGNvcGllcyBpbiB0aGlzIHZlY3RvciwgYXMgd2UgYnVpbGQsIHNvIHdlCisgIC8vIGNhbiBsYXRlciAoYWZ0ZXIgY3Jvc3MtbGlua2luZykgaW50ZXJwcmV0IHRob3NlIG9wdGlvbnMuCisgIHZlY3RvcjxPcHRpb25zVG9JbnRlcnByZXQ+IG9wdGlvbnNfdG9faW50ZXJwcmV0XzsKKworICBib29sIGhhZF9lcnJvcnNfOworICBzdHJpbmcgZmlsZW5hbWVfOworICBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIEZpbGVEZXNjcmlwdG9yVGFibGVzKiBmaWxlX3RhYmxlc187CisKKyAgLy8gSWYgTG9va3VwU3ltYm9sKCkgZmluZHMgYSBzeW1ib2wgdGhhdCBpcyBpbiBhIGZpbGUgd2hpY2ggaXMgbm90IGEgZGVjbGFyZWQKKyAgLy8gZGVwZW5kZW5jeSBvZiB0aGlzIGZpbGUsIGl0IHdpbGwgZmFpbCwgYnV0IHdpbGwgc2V0CisgIC8vIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8gdG8gcG9pbnQgYXQgdGhhdCBmaWxlLiAgVGhpcyBpcyBvbmx5IHVzZWQKKyAgLy8gYnkgQWRkTm90RGVmaW5lZEVycm9yKCkgdG8gcmVwb3J0IGEgbW9yZSB1c2VmdWwgZXJyb3IgbWVzc2FnZS4KKyAgLy8gcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5X25hbWVfIGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdGhhdCB3YXMKKyAgLy8gYWN0dWFsbHkgZm91bmQgaW4gcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5Xywgd2hpY2ggbWF5IGJlIGEgcGFyZW50CisgIC8vIG9mIHRoZSBzeW1ib2wgYWN0dWFsbHkgbG9va2VkIGZvci4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV87CisgIHN0cmluZyBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfbmFtZV87CisKKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGVycm9yKTsKKworICAvLyBBZGRzIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB1bmRlZmluZWRfc3ltYm9sIHdhcyBub3QgZGVmaW5lZC4gIE11c3QKKyAgLy8gb25seSBiZSBjYWxsZWQgYWZ0ZXIgTG9va3VwU3ltYm9sKCkgZmFpbHMuCisgIHZvaWQgQWRkTm90RGVmaW5lZEVycm9yKAorICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCisgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgIGNvbnN0IHN0cmluZyYgdW5kZWZpbmVkX3N5bWJvbCk7CisKKyAgLy8gU2lsbHkgaGVscGVyIHdoaWNoIGRldGVybWluZXMgaWYgdGhlIGdpdmVuIGZpbGUgaXMgaW4gdGhlIGdpdmVuIHBhY2thZ2UuCisgIC8vIEkuZS4sIGVpdGhlciBmaWxlLT5wYWNrYWdlKCkgPT0gcGFja2FnZV9uYW1lIG9yIGZpbGUtPnBhY2thZ2UoKSBpcyBhCisgIC8vIG5lc3RlZCBwYWNrYWdlIHdpdGhpbiBwYWNrYWdlX25hbWUuCisgIGJvb2wgSXNJblBhY2thZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IHN0cmluZyYgcGFja2FnZV9uYW1lKTsKKworICAvLyBMaWtlIHRhYmxlc18tPkZpbmRTeW1ib2woKSwgYnV0IGFkZGl0aW9uYWxseToKKyAgLy8gLSBTZWFyY2ggdGhlIHBvb2wncyB1bmRlcmxheSBpZiBub3QgZm91bmQgaW4gdGFibGVzXy4KKyAgLy8gLSBJbnN1cmUgdGhhdCB0aGUgcmVzdWx0aW5nIFN5bWJvbCBpcyBmcm9tIG9uZSBvZiB0aGUgZmlsZSdzIGRlY2xhcmVkCisgIC8vICAgZGVwZW5kZW5jaWVzLgorICBTeW1ib2wgRmluZFN5bWJvbChjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIExpa2UgRmluZFN5bWJvbCgpIGJ1dCBkb2VzIG5vdCByZXF1aXJlIHRoYXQgdGhlIHN5bWJvbCBpcyBpbiBvbmUgb2YgdGhlCisgIC8vIGZpbGUncyBkZWNsYXJlZCBkZXBlbmRlbmNpZXMuCisgIFN5bWJvbCBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcyhjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIExpa2UgRmluZFN5bWJvbCgpLCBidXQgbG9va3MgdXAgdGhlIG5hbWUgcmVsYXRpdmUgdG8gc29tZSBvdGhlciBzeW1ib2wKKyAgLy8gbmFtZS4gIFRoaXMgZmlyc3Qgc2VhcmNoZXMgc2libGluZ3Mgb2YgcmVsYXRpdmVfdG8sIHRoZW4gc2libGluZ3Mgb2YgaXRzCisgIC8vIHBhcmVudHMsIGV0Yy4gIEZvciBleGFtcGxlLCBMb29rdXBTeW1ib2woImZvby5iYXIiLCAiYmF6LnF1eC5jb3JnZSIpIG1ha2VzCisgIC8vIHRoZSBmb2xsb3dpbmcgY2FsbHMsIHJldHVybmluZyB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0OgorICAvLyBGaW5kU3ltYm9sKCJiYXoucXV4LmZvby5iYXIiKSwgRmluZFN5bWJvbCgiYmF6LmZvby5iYXIiKSwKKyAgLy8gRmluZFN5bWJvbCgiZm9vLmJhciIpLiAgSWYgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgaGFzIGJlZW4gY2FsbGVkCisgIC8vIG9uIHRoZSBEZXNjcmlwdG9yUG9vbCwgdGhpcyB3aWxsIGdlbmVyYXRlIGEgcGxhY2Vob2xkZXIgdHlwZSBpZgorICAvLyB0aGUgbmFtZSBpcyBub3QgZm91bmQgKHVubGVzcyB0aGUgbmFtZSBpdHNlbGYgaXMgbWFsZm9ybWVkKS4gIFRoZQorICAvLyBwbGFjZWhvbGRlcl90eXBlIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hhdCBraW5kIG9mIHBsYWNlaG9sZGVyIHNob3VsZCBiZQorICAvLyBjb25zdHJ1Y3RlZCBpbiB0aGlzIGNhc2UuICBUaGUgcmVzb2x2ZV9tb2RlIHBhcmFtZXRlciBkZXRlcm1pbmVzIHdoZXRoZXIKKyAgLy8gYW55IHN5bWJvbCBpcyByZXR1cm5lZCwgb3Igb25seSBzeW1ib2xzIHRoYXQgYXJlIHR5cGVzLiAgTm90ZSwgaG93ZXZlciwKKyAgLy8gdGhhdCBMb29rdXBTeW1ib2wgbWF5IHN0aWxsIHJldHVybiBhIG5vbi10eXBlIHN5bWJvbCBpbiBMT09LVVBfVFlQRVMgbW9kZSwKKyAgLy8gaWYgaXQgYmVsaWV2ZXMgdGhhdCdzIGFsbCBpdCBjb3VsZCByZWZlciB0by4gIFRoZSBjYWxsZXIgc2hvdWxkIGFsd2F5cworICAvLyBjaGVjayB0aGF0IGl0IHJlY2VpdmVzIHRoZSB0eXBlIG9mIHN5bWJvbCBpdCB3YXMgZXhwZWN0aW5nLgorICBlbnVtIFBsYWNlaG9sZGVyVHlwZSB7CisgICAgUExBQ0VIT0xERVJfTUVTU0FHRSwKKyAgICBQTEFDRUhPTERFUl9FTlVNLAorICAgIFBMQUNFSE9MREVSX0VYVEVOREFCTEVfTUVTU0FHRQorICB9OworICBlbnVtIFJlc29sdmVNb2RlIHsKKyAgICBMT09LVVBfQUxMLCBMT09LVVBfVFlQRVMKKyAgfTsKKyAgU3ltYm9sIExvb2t1cFN5bWJvbChjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgcmVsYXRpdmVfdG8sCisgICAgICAgICAgICAgICAgICAgICAgUGxhY2Vob2xkZXJUeXBlIHBsYWNlaG9sZGVyX3R5cGUgPSBQTEFDRUhPTERFUl9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVNb2RlIHJlc29sdmVfbW9kZSA9IExPT0tVUF9BTEwpOworCisgIC8vIExpa2UgTG9va3VwU3ltYm9sKCkgYnV0IHdpbGwgbm90IHJldHVybiBhIHBsYWNlaG9sZGVyIGV2ZW4gaWYKKyAgLy8gQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgaGFzIGJlZW4gdXNlZC4KKyAgU3ltYm9sIExvb2t1cFN5bWJvbE5vUGxhY2Vob2xkZXIoY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHJlbGF0aXZlX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlTW9kZSByZXNvbHZlX21vZGUgPSBMT09LVVBfQUxMKTsKKworICAvLyBDcmVhdGVzIGEgcGxhY2Vob2xkZXIgdHlwZSBzdWl0YWJsZSBmb3IgcmV0dXJuIGZyb20gTG9va3VwU3ltYm9sKCkuICBNYXkKKyAgLy8gcmV0dXJuIGtOdWxsU3ltYm9sIGlmIHRoZSBuYW1lIGlzIG5vdCBhIHZhbGlkIHR5cGUgbmFtZS4KKyAgU3ltYm9sIE5ld1BsYWNlaG9sZGVyKGNvbnN0IHN0cmluZyYgbmFtZSwgUGxhY2Vob2xkZXJUeXBlIHBsYWNlaG9sZGVyX3R5cGUpOworCisgIC8vIENyZWF0ZXMgYSBwbGFjZWhvbGRlciBmaWxlLiAgTmV2ZXIgcmV0dXJucyBOVUxMLiAgVGhpcyBpcyB1c2VkIHdoZW4gYW4KKyAgLy8gaW1wb3J0IGlzIG5vdCBmb3VuZCBhbmQgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgaXMgZW5hYmxlZC4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIE5ld1BsYWNlaG9sZGVyRmlsZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIENhbGxzIHRhYmxlc18tPkFkZFN5bWJvbCgpIGFuZCByZWNvcmRzIGFuIGVycm9yIGlmIGl0IGZhaWxzLiAgUmV0dXJucworICAvLyB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgZmFsc2UgaWYgZmFpbGVkLCB0aG91Z2ggbW9zdCBjYWxsZXJzIGNhbiBpZ25vcmUKKyAgLy8gdGhlIHJldHVybiB2YWx1ZSBzaW5jZSBhbiBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIHJlY29yZGVkLgorICBib29sIEFkZFN5bWJvbChjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHByb3RvLCBTeW1ib2wgc3ltYm9sKTsKKworICAvLyBMaWtlIEFkZFN5bWJvbCgpLCBidXQgc3VjY2VlZHMgaWYgdGhlIHN5bWJvbCBpcyBhbHJlYWR5IGRlZmluZWQgYXMgbG9uZworICAvLyBhcyB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBpcyBhbHNvIGEgcGFja2FnZSAoYmVjYXVzZSBpdCdzIE9LIHRvIGRlZmluZQorICAvLyB0aGUgc2FtZSBwYWNrYWdlIGluIHR3byBkaWZmZXJlbnQgZmlsZXMpLiAgQWxzbyBhZGRzIGFsbCBwYXJlbnRzIG9mIHRoZQorICAvLyBwYWNrZ2FlIHRvIHRoZSBzeW1ib2wgdGFibGUgKGUuZy4gQWRkUGFja2FnZSgiZm9vLmJhciIsIC4uLikgd2lsbCBhZGQKKyAgLy8gImZvby5iYXIiIGFuZCAiZm9vIiB0byB0aGUgdGFibGUpLgorICB2b2lkIEFkZFBhY2thZ2UoY29uc3Qgc3RyaW5nJiBuYW1lLCBjb25zdCBNZXNzYWdlJiBwcm90bywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworICAvLyBDaGVja3MgdGhhdCB0aGUgc3ltYm9sIG5hbWUgY29udGFpbnMgb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQKKyAgLy8gdW5kZXJzY29yZXMuICBSZWNvcmRzIGFuIGVycm9yIG90aGVyd2lzZS4KKyAgdm9pZCBWYWxpZGF0ZVN5bWJvbE5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lLCBjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgcHJvdG8pOworCisgIC8vIExpa2UgVmFsaWRhdGVTeW1ib2xOYW1lKCksIGJ1dCB0aGUgbmFtZSBpcyBhbGxvd2VkIHRvIGNvbnRhaW4gcGVyaW9kcyBhbmQKKyAgLy8gYW4gZXJyb3IgaXMgaW5kaWNhdGVkIGJ5IHJldHVybmluZyBmYWxzZSAobm90IHJlY29yZGluZyB0aGUgZXJyb3IpLgorICBib29sIFZhbGlkYXRlUXVhbGlmaWVkTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFVzZWQgYnkgQlVJTERfQVJSQVkgbWFjcm8gKGJlbG93KSB0byBhdm9pZCBoYXZpbmcgdG8gaGF2ZSB0aGUgdHlwZQorICAvLyBzcGVjaWZpZWQgYXMgYSBtYWNybyBwYXJhbWV0ZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUFycmF5KGludCBzaXplLCBUeXBlKiogb3V0cHV0KSB7CisgICAgKm91dHB1dCA9IHRhYmxlc18tPkFsbG9jYXRlQXJyYXk8VHlwZT4oc2l6ZSk7CisgIH0KKworICAvLyBBbGxvY2F0ZXMgYSBjb3B5IG9mIG9yaWdfb3B0aW9ucyBpbiB0YWJsZXNfIGFuZCBzdG9yZXMgaXQgaW4gdGhlCisgIC8vIGRlc2NyaXB0b3IuIFJlbWVtYmVycyBpdHMgdW5pbnRlcnByZXRlZCBvcHRpb25zLCB0byBiZSBpbnRlcnByZXRlZAorICAvLyBsYXRlci4gRGVzY3JpcHRvclQgbXVzdCBiZSBvbmUgb2YgdGhlIERlc2NyaXB0b3IgbWVzc2FnZXMgZnJvbQorICAvLyBkZXNjcmlwdG9yLnByb3RvLgorICB0ZW1wbGF0ZTxjbGFzcyBEZXNjcmlwdG9yVD4gdm9pZCBBbGxvY2F0ZU9wdGlvbnMoCisgICAgICBjb25zdCB0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGUmIG9yaWdfb3B0aW9ucywKKyAgICAgIERlc2NyaXB0b3JUKiBkZXNjcmlwdG9yKTsKKyAgLy8gU3BlY2lhbGl6YXRpb24gZm9yIEZpbGVPcHRpb25zLgorICB2b2lkIEFsbG9jYXRlT3B0aW9ucyhjb25zdCBGaWxlT3B0aW9ucyYgb3JpZ19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKKyAgLy8gSW1wbGVtZW50YXRpb24gZm9yIEFsbG9jYXRlT3B0aW9ucygpLiBEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHkuCisgIHRlbXBsYXRlPGNsYXNzIERlc2NyaXB0b3JUPiB2b2lkIEFsbG9jYXRlT3B0aW9uc0ltcGwoCisgICAgICBjb25zdCBzdHJpbmcmIG5hbWVfc2NvcGUsCisgICAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICAgIGNvbnN0IHR5cGVuYW1lIERlc2NyaXB0b3JUOjpPcHRpb25zVHlwZSYgb3JpZ19vcHRpb25zLAorICAgICAgRGVzY3JpcHRvclQqIGRlc2NyaXB0b3IpOworCisgIC8vIFRoZXNlIG1ldGhvZHMgYWxsIGhhdmUgdGhlIHNhbWUgc2lnbmF0dXJlIGZvciB0aGUgc2FrZSBvZiB0aGUgQlVJTERfQVJSQVkKKyAgLy8gbWFjcm8sIGJlbG93LgorICB2b2lkIEJ1aWxkTWVzc2FnZShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IqIHJlc3VsdCk7CisgIHZvaWQgQnVpbGRGaWVsZE9yRXh0ZW5zaW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHRlbnNpb24pOworICB2b2lkIEJ1aWxkRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yKiByZXN1bHQpIHsKKyAgICBCdWlsZEZpZWxkT3JFeHRlbnNpb24ocHJvdG8sIHBhcmVudCwgcmVzdWx0LCBmYWxzZSk7CisgIH0KKyAgdm9pZCBCdWlsZEV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciogcmVzdWx0KSB7CisgICAgQnVpbGRGaWVsZE9yRXh0ZW5zaW9uKHByb3RvLCBwYXJlbnQsIHJlc3VsdCwgdHJ1ZSk7CisgIH0KKyAgdm9pZCBCdWlsZEV4dGVuc2lvblJhbmdlKGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJlc3VsdCk7CisgIHZvaWQgQnVpbGRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yKiByZXN1bHQpOworICB2b2lkIEJ1aWxkRW51bVZhbHVlKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQpOworICB2b2lkIEJ1aWxkU2VydmljZShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZHVtbXksCisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yKiByZXN1bHQpOworICB2b2lkIEJ1aWxkTWV0aG9kKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yKiByZXN1bHQpOworCisgIC8vIE11c3QgYmUgcnVuIG9ubHkgYWZ0ZXIgYnVpbGRpbmcuCisgIC8vCisgIC8vIE5PVEU6IE9wdGlvbnMgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGR1cmluZyBjcm9zcy1saW5raW5nLCBhcyB0aGV5CisgIC8vIGhhdmUgbm90IHlldCBiZWVuIGludGVycHJldGVkLiBEZWZlciBhbnkgaGFuZGxpbmcgb2Ygb3B0aW9ucyB0byB0aGUKKyAgLy8gVmFsaWRhdGUqT3B0aW9ucyBtZXRob2RzLgorICB2b2lkIENyb3NzTGlua0ZpbGUoRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBDcm9zc0xpbmtNZXNzYWdlKERlc2NyaXB0b3IqIG1lc3NhZ2UsIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIENyb3NzTGlua0ZpZWxkKEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBDcm9zc0xpbmtFbnVtKEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgQ3Jvc3NMaW5rRW51bVZhbHVlKEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIENyb3NzTGlua1NlcnZpY2UoU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgQ3Jvc3NMaW5rTWV0aG9kKE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisKKyAgLy8gTXVzdCBiZSBydW4gb25seSBhZnRlciBjcm9zcy1saW5raW5nLgorICB2b2lkIEludGVycHJldE9wdGlvbnMoKTsKKworICAvLyBBIGhlbHBlciBjbGFzcyBmb3IgaW50ZXJwcmV0aW5nIG9wdGlvbnMuCisgIGNsYXNzIE9wdGlvbkludGVycHJldGVyIHsKKyAgIHB1YmxpYzoKKyAgICAvLyBDcmVhdGVzIGFuIGludGVycHJldGVyIHRoYXQgb3BlcmF0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBvb2wgb2YgdGhlCisgICAgLy8gc3BlY2lmaWVkIGJ1aWxkZXIsIHdoaWNoIG11c3Qgbm90IGJlIE5VTEwuIFdlIGRvbid0IHRha2Ugb3duZXJzaGlwIG9mIHRoZQorICAgIC8vIGJ1aWxkZXIuCisgICAgZXhwbGljaXQgT3B0aW9uSW50ZXJwcmV0ZXIoRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXIpOworCisgICAgfk9wdGlvbkludGVycHJldGVyKCk7CisKKyAgICAvLyBJbnRlcnByZXRzIHRoZSB1bmludGVycHJldGVkIG9wdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBPcHRpb25zIG1lc3NhZ2UuCisgICAgLy8gT24gZXJyb3IsIGNhbGxzIEFkZEVycm9yKCkgb24gdGhlIHVuZGVybHlpbmcgYnVpbGRlciBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICAvLyBPdGhlcndpc2UgcmV0dXJucyB0cnVlLgorICAgIGJvb2wgSW50ZXJwcmV0T3B0aW9ucyhPcHRpb25zVG9JbnRlcnByZXQqIG9wdGlvbnNfdG9faW50ZXJwcmV0KTsKKworICAgIGNsYXNzIEFnZ3JlZ2F0ZU9wdGlvbkZpbmRlcjsKKworICAgcHJpdmF0ZToKKyAgICAvLyBJbnRlcnByZXRzIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyBvbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIHdoaWNoCisgICAgLy8gbXVzdCBiZSB0aGUgbXV0YWJsZSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBvcHRpb25zIG1lc3NhZ2UgdG8gd2hpY2gKKyAgICAvLyB1bmludGVycHJldGVkX29wdGlvbl8gYmVsb25ncy4KKyAgICBib29sIEludGVycHJldFNpbmdsZU9wdGlvbihNZXNzYWdlKiBvcHRpb25zKTsKKworICAgIC8vIEFkZHMgdGhlIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHRvIHRoZSBnaXZlbiBvcHRpb25zIG1lc3NhZ2UgdmVyYmF0aW0uCisgICAgLy8gVXNlZCB3aGVuIEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpIGlzIGluIGVmZmVjdCBhbmQgd2UgY2FuJ3QgZmluZAorICAgIC8vIHRoZSBvcHRpb24ncyBkZWZpbml0aW9uLgorICAgIHZvaWQgQWRkV2l0aG91dEludGVycHJldGluZyhjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3B0aW9ucyk7CisKKyAgICAvLyBBIHJlY3Vyc2l2ZSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBkcmlsbHMgaW50byB0aGUgaW50ZXJtZWRpYXRlIGZpZWxkcworICAgIC8vIGluIHVua25vd25fZmllbGRzIHRvIGNoZWNrIGlmIGZpZWxkIGlubmVybW9zdF9maWVsZCBpcyBzZXQgb24gdGhlCisgICAgLy8gaW5uZXJtb3N0IG1lc3NhZ2UuIFJldHVybnMgZmFsc2UgYW5kIHNldHMgYW4gZXJyb3IgaWYgc28uCisgICAgYm9vbCBFeGFtaW5lSWZPcHRpb25Jc1NldCgKKyAgICAgICAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+Ojpjb25zdF9pdGVyYXRvciBpbnRlcm1lZGlhdGVfZmllbGRzX2l0ZXIsCisgICAgICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaW50ZXJtZWRpYXRlX2ZpZWxkc19lbmQsCisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaW5uZXJtb3N0X2ZpZWxkLCBjb25zdCBzdHJpbmcmIGRlYnVnX21zZ19uYW1lLAorICAgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKTsKKworICAgIC8vIFZhbGlkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBvcHRpb24gZmllbGQgb2YgdGhlIGN1cnJlbnRseSBpbnRlcnByZXRlZAorICAgIC8vIG9wdGlvbiBhbmQgdGhlbiBzZXRzIGl0IG9uIHRoZSB1bmtub3duX2ZpZWxkLgorICAgIGJvb2wgU2V0T3B0aW9uVmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBvcHRpb25fZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKworICAgIC8vIFBhcnNlcyBhbiBhZ2dyZWdhdGUgdmFsdWUgZm9yIGEgQ1BQVFlQRV9NRVNTQUdFIG9wdGlvbiBhbmQKKyAgICAvLyBzYXZlcyBpdCBpbnRvICp1bmtub3duX2ZpZWxkcy4KKyAgICBib29sIFNldEFnZ3JlZ2F0ZU9wdGlvbihjb25zdCBGaWVsZERlc2NyaXB0b3IqIG9wdGlvbl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKworICAgIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBzZXQgYW4gaW50IGZpZWxkIHRoZSByaWdodCB3YXksIGRlcGVuZGluZyBvbgorICAgIC8vIGl0cyB3aXJlIHR5cGUgKGEgc2luZ2xlIGludCBDcHBUeXBlIGNhbiByZXByZXNlbnQgbXVsdGlwbGUgd2lyZSB0eXBlcykuCisgICAgdm9pZCBTZXRJbnQzMihpbnQgbnVtYmVyLCBpbnQzMiB2YWx1ZSwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKyAgICB2b2lkIFNldEludDY0KGludCBudW1iZXIsIGludDY0IHZhbHVlLCBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOworICAgIHZvaWQgU2V0VUludDMyKGludCBudW1iZXIsIHVpbnQzMiB2YWx1ZSwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisgICAgdm9pZCBTZXRVSW50NjQoaW50IG51bWJlciwgdWludDY0IHZhbHVlLCBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKworICAgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgYWRkcyBhbiBlcnJvciBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIG9mIHRoZQorICAgIC8vIG9wdGlvbiB3ZSdyZSBjdXJyZW50bHkgaW50ZXJwcmV0aW5nLCBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIEFkZE9wdGlvbkVycm9yKERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbXNnKSB7CisgICAgICBidWlsZGVyXy0+QWRkRXJyb3Iob3B0aW9uc190b19pbnRlcnByZXRfLT5lbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKnVuaW50ZXJwcmV0ZWRfb3B0aW9uXywgbG9jYXRpb24sIG1zZyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBhZGRzIGFuIGVycm9yIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgb3B0aW9uIG5hbWUKKyAgICAvLyBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIEFkZE5hbWVFcnJvcihjb25zdCBzdHJpbmcmIG1zZykgeworICAgICAgcmV0dXJuIEFkZE9wdGlvbkVycm9yKERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1BUSU9OX05BTUUsIG1zZyk7CisgICAgfQorCisgICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBhZGRzIGFuIGVycm9yIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgb3B0aW9uIG5hbWUKKyAgICAvLyBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIEFkZFZhbHVlRXJyb3IoY29uc3Qgc3RyaW5nJiBtc2cpIHsKKyAgICAgIHJldHVybiBBZGRPcHRpb25FcnJvcihEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9QVElPTl9WQUxVRSwgbXNnKTsKKyAgICB9CisKKyAgICAvLyBXZSBpbnRlcnByZXQgYWdhaW5zdCB0aGlzIGJ1aWxkZXIncyBwb29sLiBJcyBuZXZlciBOVUxMLiBXZSBkb24ndCBvd24KKyAgICAvLyB0aGlzIHBvaW50ZXIuCisgICAgRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXJfOworCisgICAgLy8gVGhlIG9wdGlvbnMgd2UncmUgY3VycmVudGx5IGludGVycHJldGluZywgb3IgTlVMTCBpZiB3ZSdyZSBub3QgaW4gYSBjYWxsCisgICAgLy8gdG8gSW50ZXJwcmV0T3B0aW9ucy4KKyAgICBjb25zdCBPcHRpb25zVG9JbnRlcnByZXQqIG9wdGlvbnNfdG9faW50ZXJwcmV0XzsKKworICAgIC8vIFRoZSBvcHRpb24gd2UncmUgY3VycmVudGx5IGludGVycHJldGluZyB3aXRoaW4gb3B0aW9uc190b19pbnRlcnByZXRfLCBvcgorICAgIC8vIE5VTEwgaWYgd2UncmUgbm90IGluIGEgY2FsbCB0byBJbnRlcnByZXRPcHRpb25zKCkuIFRoaXMgcG9pbnRzIHRvIGEKKyAgICAvLyBzdWJtZXNzYWdlIG9mIHRoZSBvcmlnaW5hbCBvcHRpb24sIG5vdCB0aGUgbXV0YWJsZSBjb3B5LiBUaGVyZWZvcmUgd2UKKyAgICAvLyBjYW4gdXNlIGl0IHRvIGZpbmQgbG9jYXRpb25zIHJlY29yZGVkIGJ5IHRoZSBwYXJzZXIuCisgICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiogdW5pbnRlcnByZXRlZF9vcHRpb25fOworCisgICAgLy8gRmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgZHluYW1pYyBtZXNzYWdlcyB3ZSBuZWVkIHRvIHBhcnNlCisgICAgLy8gYW55IGFnZ3JlZ2F0ZSBvcHRpb24gdmFsdWVzIHdlIGVuY291bnRlci4KKyAgICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZHluYW1pY19mYWN0b3J5XzsKKworICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhPcHRpb25JbnRlcnByZXRlcik7CisgIH07CisKKyAgLy8gV29yay1hcm91bmQgZm9yIGJyb2tlbiBjb21waWxlcnM6ICBBY2NvcmRpbmcgdG8gdGhlIEMrKyBzdGFuZGFyZCwKKyAgLy8gT3B0aW9uSW50ZXJwcmV0ZXIgc2hvdWxkIGhhdmUgYWNjZXNzIHRvIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgYW55IGNsYXNzCisgIC8vIHdoaWNoIGhhcyBkZWNsYXJlZCBEZXNjcmlwdG9yQnVpbGRlciBhcyBhIGZyaWVuZC4gIFVuZm9ydHVuYXRlbHkgc29tZSBvbGQKKyAgLy8gdmVyc2lvbnMgb2YgR0NDIGFuZCBvdGhlciBjb21waWxlcnMgZG8gbm90IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseS4gIFNvLAorICAvLyB3ZSBoYXZlIHRvIGhhdmUgdGhlc2UgaW50ZXJtZWRpYXRlIG1ldGhvZHMgdG8gcHJvdmlkZSBhY2Nlc3MuICBXZSBhbHNvCisgIC8vIHJlZHVuZGFudGx5IGRlY2xhcmUgT3B0aW9uSW50ZXJwcmV0ZXIgYSBmcmllbmQganVzdCB0byBtYWtlIHRoaW5ncyBleHRyYQorICAvLyBjbGVhciBmb3IgdGhlc2UgYmFkIGNvbXBpbGVycy4KKyAgZnJpZW5kIGNsYXNzIE9wdGlvbkludGVycHJldGVyOworICBmcmllbmQgY2xhc3MgT3B0aW9uSW50ZXJwcmV0ZXI6OkFnZ3JlZ2F0ZU9wdGlvbkZpbmRlcjsKKworICBzdGF0aWMgaW5saW5lIGJvb2wgZ2V0X2FsbG93X3Vua25vd24oY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpIHsKKyAgICByZXR1cm4gcG9vbC0+YWxsb3dfdW5rbm93bl87CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIGdldF9pc19wbGFjZWhvbGRlcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgICAgcmV0dXJuIGRlc2NyaXB0b3ItPmlzX3BsYWNlaG9sZGVyXzsKKyAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0X211dGV4X2hlbGQoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpIHsKKyAgICBpZiAocG9vbC0+bXV0ZXhfICE9IE5VTEwpIHsKKyAgICAgIHBvb2wtPm11dGV4Xy0+QXNzZXJ0SGVsZCgpOworICAgIH0KKyAgfQorCisgIC8vIE11c3QgYmUgcnVuIG9ubHkgYWZ0ZXIgb3B0aW9ucyBoYXZlIGJlZW4gaW50ZXJwcmV0ZWQuCisgIC8vCisgIC8vIE5PVEU6IFZhbGlkYXRpb24gY29kZSBtdXN0IG9ubHkgcmVmZXJlbmNlIHRoZSBvcHRpb25zIGluIHRoZSBtdXRhYmxlCisgIC8vIGRlc2NyaXB0b3JzLCB3aGljaCBhcmUgdGhlIG9uZXMgdGhhdCBoYXZlIGJlZW4gaW50ZXJwcmV0ZWQuIFRoZSBjb25zdAorICAvLyBwcm90byByZWZlcmVuY2VzIGFyZSBwYXNzZWQgaW4gb25seSBzbyB0aGV5IGNhbiBiZSBwcm92aWRlZCB0byBjYWxscyB0bworICAvLyBBZGRFcnJvcigpLiBEbyBub3QgbG9vayBhdCB0aGVpciBvcHRpb25zLCB3aGljaCBoYXZlIG5vdCBiZWVuIGludGVycHJldGVkLgorICB2b2lkIFZhbGlkYXRlRmlsZU9wdGlvbnMoRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgVmFsaWRhdGVNZXNzYWdlT3B0aW9ucyhEZXNjcmlwdG9yKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgVmFsaWRhdGVGaWVsZE9wdGlvbnMoRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIFZhbGlkYXRlRW51bU9wdGlvbnMoRW51bURlc2NyaXB0b3IqIGVubSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBWYWxpZGF0ZUVudW1WYWx1ZU9wdGlvbnMoRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgVmFsaWRhdGVTZXJ2aWNlT3B0aW9ucyhTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBWYWxpZGF0ZU1ldGhvZE9wdGlvbnMoTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKworICB2b2lkIFZhbGlkYXRlTWFwS2V5KEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKK307CisKK2NvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6QnVpbGRGaWxlKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIEdPT0dMRV9DSEVDSyhmYWxsYmFja19kYXRhYmFzZV8gPT0gTlVMTCkKKyAgICA8PCAiQ2Fubm90IGNhbGwgQnVpbGRGaWxlIG9uIGEgRGVzY3JpcHRvclBvb2wgdGhhdCB1c2VzIGEgIgorICAgICAgICJEZXNjcmlwdG9yRGF0YWJhc2UuICBZb3UgbXVzdCBpbnN0ZWFkIGZpbmQgYSB3YXkgdG8gZ2V0IHlvdXIgZmlsZSAiCisgICAgICAgImludG8gdGhlIHVuZGVybHlpbmcgZGF0YWJhc2UuIjsKKyAgR09PR0xFX0NIRUNLKG11dGV4XyA9PSBOVUxMKTsgICAvLyBJbXBsaWVkIGJ5IHRoZSBhYm92ZSBHT09HTEVfQ0hFQ0suCisgIHJldHVybiBEZXNjcmlwdG9yQnVpbGRlcih0aGlzLCB0YWJsZXNfLmdldCgpLCBOVUxMKS5CdWlsZEZpbGUocHJvdG8pOworfQorCitjb25zdCBGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgRXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvcikgeworICBHT09HTEVfQ0hFQ0soZmFsbGJhY2tfZGF0YWJhc2VfID09IE5VTEwpCisgICAgPDwgIkNhbm5vdCBjYWxsIEJ1aWxkRmlsZSBvbiBhIERlc2NyaXB0b3JQb29sIHRoYXQgdXNlcyBhICIKKyAgICAgICAiRGVzY3JpcHRvckRhdGFiYXNlLiAgWW91IG11c3QgaW5zdGVhZCBmaW5kIGEgd2F5IHRvIGdldCB5b3VyIGZpbGUgIgorICAgICAgICJpbnRvIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlLiI7CisgIEdPT0dMRV9DSEVDSyhtdXRleF8gPT0gTlVMTCk7ICAgLy8gSW1wbGllZCBieSB0aGUgYWJvdmUgR09PR0xFX0NIRUNLLgorICByZXR1cm4gRGVzY3JpcHRvckJ1aWxkZXIodGhpcywgdGFibGVzXy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvbGxlY3RvcikuQnVpbGRGaWxlKHByb3RvKTsKK30KKworY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpCdWlsZEZpbGVGcm9tRGF0YWJhc2UoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIGNvbnN0IHsKKyAgbXV0ZXhfLT5Bc3NlcnRIZWxkKCk7CisgIHJldHVybiBEZXNjcmlwdG9yQnVpbGRlcih0aGlzLCB0YWJsZXNfLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9lcnJvcl9jb2xsZWN0b3JfKS5CdWlsZEZpbGUocHJvdG8pOworfQorCitEZXNjcmlwdG9yQnVpbGRlcjo6RGVzY3JpcHRvckJ1aWxkZXIoCisgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgRGVzY3JpcHRvclBvb2w6OlRhYmxlcyogdGFibGVzLAorICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKQorICA6IHBvb2xfKHBvb2wpLAorICAgIHRhYmxlc18odGFibGVzKSwKKyAgICBlcnJvcl9jb2xsZWN0b3JfKGVycm9yX2NvbGxlY3RvciksCisgICAgaGFkX2Vycm9yc18oZmFsc2UpLAorICAgIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8oTlVMTCkge30KKworRGVzY3JpcHRvckJ1aWxkZXI6On5EZXNjcmlwdG9yQnVpbGRlcigpIHt9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFkZEVycm9yKAorICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCisgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3IpIHsKKyAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gPT0gTlVMTCkgeworICAgIGlmICghaGFkX2Vycm9yc18pIHsKKyAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJJbnZhbGlkIHByb3RvIGRlc2NyaXB0b3IgZm9yIGZpbGUgXCIiIDw8IGZpbGVuYW1lXworICAgICAgICAgICAgICAgICA8PCAiXCI6IjsKKyAgICB9CisgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIiAgIiA8PCBlbGVtZW50X25hbWUgPDwgIjogIiA8PCBlcnJvcjsKKyAgfSBlbHNlIHsKKyAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcihmaWxlbmFtZV8sIGVsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvciwgbG9jYXRpb24sIGVycm9yKTsKKyAgfQorICBoYWRfZXJyb3JzXyA9IHRydWU7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFkZE5vdERlZmluZWRFcnJvcigKKyAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAorICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICBjb25zdCBzdHJpbmcmIHVuZGVmaW5lZF9zeW1ib2wpIHsKKyAgaWYgKHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8gPT0gTlVMTCkgeworICAgIEFkZEVycm9yKGVsZW1lbnRfbmFtZSwgZGVzY3JpcHRvciwgbG9jYXRpb24sCisgICAgICAgICAgICAgIlwiIiArIHVuZGVmaW5lZF9zeW1ib2wgKyAiXCIgaXMgbm90IGRlZmluZWQuIik7CisgIH0gZWxzZSB7CisgICAgQWRkRXJyb3IoZWxlbWVudF9uYW1lLCBkZXNjcmlwdG9yLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAiXCIiICsgcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5X25hbWVfICsKKyAgICAgICAgICAgICAiXCIgc2VlbXMgdG8gYmUgZGVmaW5lZCBpbiBcIiIgKworICAgICAgICAgICAgIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8tPm5hbWUoKSArICJcIiwgd2hpY2ggaXMgbm90ICIKKyAgICAgICAgICAgICAiaW1wb3J0ZWQgYnkgXCIiICsgZmlsZW5hbWVfICsgIlwiLiAgVG8gdXNlIGl0IGhlcmUsIHBsZWFzZSAiCisgICAgICAgICAgICAgImFkZCB0aGUgbmVjZXNzYXJ5IGltcG9ydC4iKTsKKyAgfQorfQorCitib29sIERlc2NyaXB0b3JCdWlsZGVyOjpJc0luUGFja2FnZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFja2FnZV9uYW1lKSB7CisgIHJldHVybiBIYXNQcmVmaXhTdHJpbmcoZmlsZS0+cGFja2FnZSgpLCBwYWNrYWdlX25hbWUpICYmCisgICAgICAgICAgIChmaWxlLT5wYWNrYWdlKCkuc2l6ZSgpID09IHBhY2thZ2VfbmFtZS5zaXplKCkgfHwKKyAgICAgICAgICAgIGZpbGUtPnBhY2thZ2UoKVtwYWNrYWdlX25hbWUuc2l6ZSgpXSA9PSAnLicpOworfQorCitTeW1ib2wgRGVzY3JpcHRvckJ1aWxkZXI6OkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBTeW1ib2wgcmVzdWx0OworCisgIC8vIFdlIG5lZWQgdG8gc2VhcmNoIG91ciBwb29sIGFuZCBhbGwgaXRzIHVuZGVybGF5cy4KKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wgPSBwb29sXzsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICAvLyBJZiB3ZSBhcmUgbG9va2luZyBhdCBhbiB1bmRlcmxheSwgd2UgbXVzdCBsb2NrIGl0cyBtdXRleF8sIHNpbmNlIHdlIGFyZQorICAgIC8vIGFjY2Vzc2luZyB0aGUgdW5kZXJsYXkncyB0YWJsZXNfIGRpcmNldGx5LgorICAgIE11dGV4TG9ja01heWJlIGxvY2soKHBvb2wgPT0gcG9vbF8pID8gTlVMTCA6IHBvb2wtPm11dGV4Xyk7CisKKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBmYWxsYmFja19kYXRhYmFzZV8gaGVyZSBiZWNhdXNlIHRoZQorICAgIC8vIHN5bWJvbCBoYXMgdG8gYmUgaW4gb25lIG9mIGl0cyBmaWxlJ3MgZGlyZWN0IGRlcGVuZGVuY2llcywgYW5kIHdlIGhhdmUKKyAgICAvLyBhbHJlYWR5IGxvYWRlZCB0aG9zZSBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZS4KKyAgICByZXN1bHQgPSBwb29sLT50YWJsZXNfLT5GaW5kU3ltYm9sKG5hbWUpOworICAgIGlmICghcmVzdWx0LklzTnVsbCgpKSBicmVhazsKKyAgICBpZiAocG9vbC0+dW5kZXJsYXlfID09IE5VTEwpIHJldHVybiBrTnVsbFN5bWJvbDsKKyAgICBwb29sID0gcG9vbC0+dW5kZXJsYXlfOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworU3ltYm9sIERlc2NyaXB0b3JCdWlsZGVyOjpGaW5kU3ltYm9sKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBTeW1ib2wgcmVzdWx0ID0gRmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHMobmFtZSk7CisKKyAgaWYgKCFwb29sXy0+ZW5mb3JjZV9kZXBlbmRlbmNpZXNfKSB7CisgICAgLy8gSGFjayBmb3IgQ29tcGlsZXJVcGdyYWRlci4KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8gT25seSBmaW5kIHN5bWJvbHMgd2hpY2ggd2VyZSBkZWZpbmVkIGluIHRoaXMgZmlsZSBvciBvbmUgb2YgaXRzCisgIC8vIGRlcGVuZGVuY2llcy4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSByZXN1bHQuR2V0RmlsZSgpOworICBpZiAoZmlsZSA9PSBmaWxlXykgcmV0dXJuIHJlc3VsdDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZmlsZSA9PSBmaWxlXy0+ZGVwZW5kZW5jeShpKSkgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGlmIChyZXN1bHQudHlwZSA9PSBTeW1ib2w6OlBBQ0tBR0UpIHsKKyAgICAvLyBBcmcsIHRoaXMgaXMgb3ZlcmNvbXBsaWNhdGVkLiAgVGhlIHN5bWJvbCBpcyBhIHBhY2thZ2UgbmFtZS4gIEl0IGNvdWxkCisgICAgLy8gYmUgdGhhdCB0aGUgcGFja2FnZSB3YXMgZGVmaW5lZCBpbiBtdWx0aXBsZSBmaWxlcy4gIHJlc3VsdC5HZXRGaWxlKCkKKyAgICAvLyByZXR1cm5zIHRoZSBmaXJzdCBmaWxlIHdlIHNhdyB0aGF0IHVzZWQgdGhpcyBwYWNrYWdlLiAgV2UndmUgZGV0ZXJtaW5lZAorICAgIC8vIHRoYXQgdGhhdCBmaWxlIGlzIG5vdCBhIGRpcmVjdCBkZXBlbmRlbmN5IG9mIHRoZSBmaWxlIHdlIGFyZSBjdXJyZW50bHkKKyAgICAvLyBidWlsZGluZywgYnV0IGl0IGNvdWxkIGJlIHRoYXQgc29tZSBvdGhlciBmaWxlIHdoaWNoICppcyogYSBkaXJlY3QKKyAgICAvLyBkZXBlbmRlbmN5IGFsc28gZGVmaW5lcyB0aGUgc2FtZSBwYWNrYWdlLiAgV2UgY2FuJ3QgcmVhbGx5IHJ1bGUgb3V0IHRoaXMKKyAgICAvLyBzeW1ib2wgdW5sZXNzIG5vbmUgb2YgdGhlIGRlcGVuZGVuY2llcyBkZWZpbmUgaXQuCisgICAgaWYgKElzSW5QYWNrYWdlKGZpbGVfLCBuYW1lKSkgcmV0dXJuIHJlc3VsdDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgICAgLy8gTm90ZTogIEEgZGVwZW5kZW5jeSBtYXkgYmUgTlVMTCBpZiBpdCB3YXMgbm90IGZvdW5kIG9yIGhhZCBlcnJvcnMuCisgICAgICBpZiAoZmlsZV8tPmRlcGVuZGVuY3koaSkgIT0gTlVMTCAmJgorICAgICAgICAgIElzSW5QYWNrYWdlKGZpbGVfLT5kZXBlbmRlbmN5KGkpLCBuYW1lKSkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8gPSBmaWxlOworICBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfbmFtZV8gPSBuYW1lOworICByZXR1cm4ga051bGxTeW1ib2w7Cit9CisKK1N5bWJvbCBEZXNjcmlwdG9yQnVpbGRlcjo6TG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcigKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgcmVsYXRpdmVfdG8sIFJlc29sdmVNb2RlIHJlc29sdmVfbW9kZSkgeworICBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfID0gTlVMTDsKKworICBpZiAobmFtZS5zaXplKCkgPiAwICYmIG5hbWVbMF0gPT0gJy4nKSB7CisgICAgLy8gRnVsbHktcXVhbGlmaWVkIG5hbWUuCisgICAgcmV0dXJuIEZpbmRTeW1ib2wobmFtZS5zdWJzdHIoMSkpOworICB9CisKKyAgLy8gSWYgbmFtZSBpcyBzb21ldGhpbmcgbGlrZSAiRm9vLkJhci5iYXoiLCBhbmQgc3ltYm9scyBuYW1lZCAiRm9vIiBhcmUKKyAgLy8gZGVmaW5lZCBpbiBtdWx0aXBsZSBwYXJlbnQgc2NvcGVzLCB3ZSBvbmx5IHdhbnQgdG8gZmluZCAiQmFyLmJheiIgaW4gdGhlCisgIC8vIGlubmVybW9zdCBvbmUuICBFLmcuLCB0aGUgZm9sbG93aW5nIHNob3VsZCBwcm9kdWNlIGFuIGVycm9yOgorICAvLyAgIG1lc3NhZ2UgQmFyIHsgbWVzc2FnZSBCYXoge30gfQorICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG1lc3NhZ2UgQmFyIHsKKyAgLy8gICAgIH0KKyAgLy8gICAgIG9wdGlvbmFsIEJhci5CYXogYmF6ID0gMTsKKyAgLy8gICB9CisgIC8vIFNvLCB3ZSBsb29rIGZvciBqdXN0ICJGb28iIGZpcnN0LCB0aGVuIGxvb2sgZm9yICJCYXIuYmF6IiB3aXRoaW4gaXQgaWYKKyAgLy8gZm91bmQuCisgIHN0cmluZzo6c2l6ZV90eXBlIG5hbWVfZG90X3BvcyA9IG5hbWUuZmluZF9maXJzdF9vZignLicpOworICBzdHJpbmcgZmlyc3RfcGFydF9vZl9uYW1lOworICBpZiAobmFtZV9kb3RfcG9zID09IHN0cmluZzo6bnBvcykgeworICAgIGZpcnN0X3BhcnRfb2ZfbmFtZSA9IG5hbWU7CisgIH0gZWxzZSB7CisgICAgZmlyc3RfcGFydF9vZl9uYW1lID0gbmFtZS5zdWJzdHIoMCwgbmFtZV9kb3RfcG9zKTsKKyAgfQorCisgIHN0cmluZyBzY29wZV90b190cnkocmVsYXRpdmVfdG8pOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gQ2hvcCBvZmYgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBzY29wZS4KKyAgICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gc2NvcGVfdG9fdHJ5LmZpbmRfbGFzdF9vZignLicpOworICAgIGlmIChkb3RfcG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgcmV0dXJuIEZpbmRTeW1ib2wobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNjb3BlX3RvX3RyeS5lcmFzZShkb3RfcG9zKTsKKyAgICB9CisKKyAgICAvLyBBcHBlbmQgIi5maXJzdF9wYXJ0X29mX25hbWUiIGFuZCB0cnkgdG8gZmluZC4KKyAgICBzdHJpbmc6OnNpemVfdHlwZSBvbGRfc2l6ZSA9IHNjb3BlX3RvX3RyeS5zaXplKCk7CisgICAgc2NvcGVfdG9fdHJ5LmFwcGVuZCgxLCAnLicpOworICAgIHNjb3BlX3RvX3RyeS5hcHBlbmQoZmlyc3RfcGFydF9vZl9uYW1lKTsKKyAgICBTeW1ib2wgcmVzdWx0ID0gRmluZFN5bWJvbChzY29wZV90b190cnkpOworICAgIGlmICghcmVzdWx0LklzTnVsbCgpKSB7CisgICAgICBpZiAoZmlyc3RfcGFydF9vZl9uYW1lLnNpemUoKSA8IG5hbWUuc2l6ZSgpKSB7CisgICAgICAgIC8vIG5hbWUgaXMgYSBjb21wb3VuZCBzeW1ib2wsIG9mIHdoaWNoIHdlIG9ubHkgZm91bmQgdGhlIGZpcnN0IHBhcnQuCisgICAgICAgIC8vIE5vdyB0cnkgdG8gbG9vayB1cCB0aGUgcmVzdCBvZiBpdC4KKyAgICAgICAgaWYgKHJlc3VsdC5Jc0FnZ3JlZ2F0ZSgpKSB7CisgICAgICAgICAgc2NvcGVfdG9fdHJ5LmFwcGVuZChuYW1lLCBmaXJzdF9wYXJ0X29mX25hbWUuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5zaXplKCkgLSBmaXJzdF9wYXJ0X29mX25hbWUuc2l6ZSgpKTsKKyAgICAgICAgICByZXR1cm4gRmluZFN5bWJvbChzY29wZV90b190cnkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3ltYm9sIGJ1dCBpdCdzIG5vdCBhbiBhZ2dyZWdhdGUuICBDb250aW51ZSB0aGUgbG9vcC4KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJlc29sdmVfbW9kZSA9PSBMT09LVVBfVFlQRVMgJiYgIXJlc3VsdC5Jc1R5cGUoKSkgeworICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3ltYm9sIGJ1dCBpdCdzIG5vdCBhIHR5cGUuICBDb250aW51ZSB0aGUgbG9vcC4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gTm90IGZvdW5kLiAgUmVtb3ZlIHRoZSBuYW1lIHNvIHdlIGNhbiB0cnkgYWdhaW4uCisgICAgc2NvcGVfdG9fdHJ5LmVyYXNlKG9sZF9zaXplKTsKKyAgfQorfQorCitTeW1ib2wgRGVzY3JpcHRvckJ1aWxkZXI6Okxvb2t1cFN5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgcmVsYXRpdmVfdG8sCisgICAgUGxhY2Vob2xkZXJUeXBlIHBsYWNlaG9sZGVyX3R5cGUsIFJlc29sdmVNb2RlIHJlc29sdmVfbW9kZSkgeworICBTeW1ib2wgcmVzdWx0ID0gTG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcigKKyAgICAgIG5hbWUsIHJlbGF0aXZlX3RvLCByZXNvbHZlX21vZGUpOworICBpZiAocmVzdWx0LklzTnVsbCgpICYmIHBvb2xfLT5hbGxvd191bmtub3duXykgeworICAgIC8vIE5vdCBmb3VuZCwgYnV0IEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpIGlzIGVuYWJsZWQuICBSZXR1cm4gYQorICAgIC8vIHBsYWNlaG9sZGVyIGluc3RlYWQuCisgICAgcmVzdWx0ID0gTmV3UGxhY2Vob2xkZXIobmFtZSwgcGxhY2Vob2xkZXJfdHlwZSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworU3ltYm9sIERlc2NyaXB0b3JCdWlsZGVyOjpOZXdQbGFjZWhvbGRlcihjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYWNlaG9sZGVyVHlwZSBwbGFjZWhvbGRlcl90eXBlKSB7CisgIC8vIENvbXB1dGUgbmFtZXMuCisgIGNvbnN0IHN0cmluZyogcGxhY2Vob2xkZXJfZnVsbF9uYW1lOworICBjb25zdCBzdHJpbmcqIHBsYWNlaG9sZGVyX25hbWU7CisgIGNvbnN0IHN0cmluZyogcGxhY2Vob2xkZXJfcGFja2FnZTsKKworICBpZiAoIVZhbGlkYXRlUXVhbGlmaWVkTmFtZShuYW1lKSkgcmV0dXJuIGtOdWxsU3ltYm9sOworICBpZiAobmFtZVswXSA9PSAnLicpIHsKKyAgICAvLyBGdWxseS1xdWFsaWZpZWQuCisgICAgcGxhY2Vob2xkZXJfZnVsbF9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcobmFtZS5zdWJzdHIoMSkpOworICB9IGVsc2UgeworICAgIHBsYWNlaG9sZGVyX2Z1bGxfbmFtZSA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKG5hbWUpOworICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgZG90cG9zID0gcGxhY2Vob2xkZXJfZnVsbF9uYW1lLT5maW5kX2xhc3Rfb2YoJy4nKTsKKyAgaWYgKGRvdHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBwbGFjZWhvbGRlcl9wYWNrYWdlID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoCisgICAgICBwbGFjZWhvbGRlcl9mdWxsX25hbWUtPnN1YnN0cigwLCBkb3Rwb3MpKTsKKyAgICBwbGFjZWhvbGRlcl9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoCisgICAgICBwbGFjZWhvbGRlcl9mdWxsX25hbWUtPnN1YnN0cihkb3Rwb3MgKyAxKSk7CisgIH0gZWxzZSB7CisgICAgcGxhY2Vob2xkZXJfcGFja2FnZSA9ICZrRW1wdHlTdHJpbmc7CisgICAgcGxhY2Vob2xkZXJfbmFtZSA9IHBsYWNlaG9sZGVyX2Z1bGxfbmFtZTsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgcGxhY2Vob2xkZXJzLgorICBGaWxlRGVzY3JpcHRvciogcGxhY2Vob2xkZXJfZmlsZSA9IHRhYmxlc18tPkFsbG9jYXRlPEZpbGVEZXNjcmlwdG9yPigpOworICBtZW1zZXQocGxhY2Vob2xkZXJfZmlsZSwgMCwgc2l6ZW9mKCpwbGFjZWhvbGRlcl9maWxlKSk7CisKKyAgcGxhY2Vob2xkZXJfZmlsZS0+bmFtZV8gPQorICAgIHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKCpwbGFjZWhvbGRlcl9mdWxsX25hbWUgKyAiLnBsYWNlaG9sZGVyLnByb3RvIik7CisgIHBsYWNlaG9sZGVyX2ZpbGUtPnBhY2thZ2VfID0gcGxhY2Vob2xkZXJfcGFja2FnZTsKKyAgcGxhY2Vob2xkZXJfZmlsZS0+cG9vbF8gPSBwb29sXzsKKyAgcGxhY2Vob2xkZXJfZmlsZS0+b3B0aW9uc18gPSAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgcGxhY2Vob2xkZXJfZmlsZS0+dGFibGVzXyA9ICZGaWxlRGVzY3JpcHRvclRhYmxlczo6a0VtcHR5OworICAvLyBBbGwgb3RoZXIgZmllbGRzIGFyZSB6ZXJvIG9yIE5VTEwuCisKKyAgaWYgKHBsYWNlaG9sZGVyX3R5cGUgPT0gUExBQ0VIT0xERVJfRU5VTSkgeworICAgIHBsYWNlaG9sZGVyX2ZpbGUtPmVudW1fdHlwZV9jb3VudF8gPSAxOworICAgIHBsYWNlaG9sZGVyX2ZpbGUtPmVudW1fdHlwZXNfID0KKyAgICAgIHRhYmxlc18tPkFsbG9jYXRlQXJyYXk8RW51bURlc2NyaXB0b3I+KDEpOworCisgICAgRW51bURlc2NyaXB0b3IqIHBsYWNlaG9sZGVyX2VudW0gPSAmcGxhY2Vob2xkZXJfZmlsZS0+ZW51bV90eXBlc19bMF07CisgICAgbWVtc2V0KHBsYWNlaG9sZGVyX2VudW0sIDAsIHNpemVvZigqcGxhY2Vob2xkZXJfZW51bSkpOworCisgICAgcGxhY2Vob2xkZXJfZW51bS0+ZnVsbF9uYW1lXyA9IHBsYWNlaG9sZGVyX2Z1bGxfbmFtZTsKKyAgICBwbGFjZWhvbGRlcl9lbnVtLT5uYW1lXyA9IHBsYWNlaG9sZGVyX25hbWU7CisgICAgcGxhY2Vob2xkZXJfZW51bS0+ZmlsZV8gPSBwbGFjZWhvbGRlcl9maWxlOworICAgIHBsYWNlaG9sZGVyX2VudW0tPm9wdGlvbnNfID0gJkVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgICAgcGxhY2Vob2xkZXJfZW51bS0+aXNfcGxhY2Vob2xkZXJfID0gdHJ1ZTsKKyAgICBwbGFjZWhvbGRlcl9lbnVtLT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8gPSAobmFtZVswXSAhPSAnLicpOworCisgICAgLy8gRW51bXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB2YWx1ZS4KKyAgICBwbGFjZWhvbGRlcl9lbnVtLT52YWx1ZV9jb3VudF8gPSAxOworICAgIHBsYWNlaG9sZGVyX2VudW0tPnZhbHVlc18gPSB0YWJsZXNfLT5BbGxvY2F0ZUFycmF5PEVudW1WYWx1ZURlc2NyaXB0b3I+KDEpOworCisgICAgRW51bVZhbHVlRGVzY3JpcHRvciogcGxhY2Vob2xkZXJfdmFsdWUgPSAmcGxhY2Vob2xkZXJfZW51bS0+dmFsdWVzX1swXTsKKyAgICBtZW1zZXQocGxhY2Vob2xkZXJfdmFsdWUsIDAsIHNpemVvZigqcGxhY2Vob2xkZXJfdmFsdWUpKTsKKworICAgIHBsYWNlaG9sZGVyX3ZhbHVlLT5uYW1lXyA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKCJQTEFDRUhPTERFUl9WQUxVRSIpOworICAgIC8vIE5vdGUgdGhhdCBlbnVtIHZhbHVlIG5hbWVzIGFyZSBzaWJsaW5ncyBvZiB0aGVpciB0eXBlLCBub3QgY2hpbGRyZW4uCisgICAgcGxhY2Vob2xkZXJfdmFsdWUtPmZ1bGxfbmFtZV8gPQorICAgICAgcGxhY2Vob2xkZXJfcGFja2FnZS0+ZW1wdHkoKSA/IHBsYWNlaG9sZGVyX3ZhbHVlLT5uYW1lXyA6CisgICAgICAgIHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKCpwbGFjZWhvbGRlcl9wYWNrYWdlICsgIi5QTEFDRUhPTERFUl9WQUxVRSIpOworCisgICAgcGxhY2Vob2xkZXJfdmFsdWUtPm51bWJlcl8gPSAwOworICAgIHBsYWNlaG9sZGVyX3ZhbHVlLT50eXBlXyA9IHBsYWNlaG9sZGVyX2VudW07CisgICAgcGxhY2Vob2xkZXJfdmFsdWUtPm9wdGlvbnNfID0gJkVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKworICAgIHJldHVybiBTeW1ib2wocGxhY2Vob2xkZXJfZW51bSk7CisgIH0gZWxzZSB7CisgICAgcGxhY2Vob2xkZXJfZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50XyA9IDE7CisgICAgcGxhY2Vob2xkZXJfZmlsZS0+bWVzc2FnZV90eXBlc18gPQorICAgICAgdGFibGVzXy0+QWxsb2NhdGVBcnJheTxEZXNjcmlwdG9yPigxKTsKKworICAgIERlc2NyaXB0b3IqIHBsYWNlaG9sZGVyX21lc3NhZ2UgPSAmcGxhY2Vob2xkZXJfZmlsZS0+bWVzc2FnZV90eXBlc19bMF07CisgICAgbWVtc2V0KHBsYWNlaG9sZGVyX21lc3NhZ2UsIDAsIHNpemVvZigqcGxhY2Vob2xkZXJfbWVzc2FnZSkpOworCisgICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+ZnVsbF9uYW1lXyA9IHBsYWNlaG9sZGVyX2Z1bGxfbmFtZTsKKyAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5uYW1lXyA9IHBsYWNlaG9sZGVyX25hbWU7CisgICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+ZmlsZV8gPSBwbGFjZWhvbGRlcl9maWxlOworICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPm9wdGlvbnNfID0gJk1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+aXNfcGxhY2Vob2xkZXJfID0gdHJ1ZTsKKyAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8gPSAobmFtZVswXSAhPSAnLicpOworCisgICAgaWYgKHBsYWNlaG9sZGVyX3R5cGUgPT0gUExBQ0VIT0xERVJfRVhURU5EQUJMRV9NRVNTQUdFKSB7CisgICAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5leHRlbnNpb25fcmFuZ2VfY291bnRfID0gMTsKKyAgICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZXNfID0KKyAgICAgICAgdGFibGVzXy0+QWxsb2NhdGVBcnJheTxEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZT4oMSk7CisgICAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5leHRlbnNpb25fcmFuZ2VzXy0+c3RhcnQgPSAxOworICAgICAgLy8ga01heE51bWJlciArIDEgYmVjYXVzZSBFeHRlbnNpb25SYW5nZTo6ZW5kIGlzIGV4Y2x1c2l2ZS4KKyAgICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZXNfLT5lbmQgPQorICAgICAgICBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIgKyAxOworICAgIH0KKworICAgIHJldHVybiBTeW1ib2wocGxhY2Vob2xkZXJfbWVzc2FnZSk7CisgIH0KK30KKworY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JCdWlsZGVyOjpOZXdQbGFjZWhvbGRlckZpbGUoCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIEZpbGVEZXNjcmlwdG9yKiBwbGFjZWhvbGRlciA9IHRhYmxlc18tPkFsbG9jYXRlPEZpbGVEZXNjcmlwdG9yPigpOworICBtZW1zZXQocGxhY2Vob2xkZXIsIDAsIHNpemVvZigqcGxhY2Vob2xkZXIpKTsKKworICBwbGFjZWhvbGRlci0+bmFtZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhuYW1lKTsKKyAgcGxhY2Vob2xkZXItPnBhY2thZ2VfID0gJmtFbXB0eVN0cmluZzsKKyAgcGxhY2Vob2xkZXItPnBvb2xfID0gcG9vbF87CisgIHBsYWNlaG9sZGVyLT5vcHRpb25zXyA9ICZGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworICBwbGFjZWhvbGRlci0+dGFibGVzXyA9ICZGaWxlRGVzY3JpcHRvclRhYmxlczo6a0VtcHR5OworICAvLyBBbGwgb3RoZXIgZmllbGRzIGFyZSB6ZXJvIG9yIE5VTEwuCisKKyAgcmV0dXJuIHBsYWNlaG9sZGVyOworfQorCitib29sIERlc2NyaXB0b3JCdWlsZGVyOjpBZGRTeW1ib2woCisgICAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUsIGNvbnN0IHZvaWQqIHBhcmVudCwgY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgIGNvbnN0IE1lc3NhZ2UmIHByb3RvLCBTeW1ib2wgc3ltYm9sKSB7CisgIC8vIElmIHRoZSBjYWxsZXIgcGFzc2VkIE5VTEwgZm9yIHRoZSBwYXJlbnQsIHRoZSBzeW1ib2wgaXMgYXQgZmlsZSBzY29wZS4KKyAgLy8gVXNlIGl0cyBmaWxlIGFzIHRoZSBwYXJlbnQgaW5zdGVhZC4KKyAgaWYgKHBhcmVudCA9PSBOVUxMKSBwYXJlbnQgPSBmaWxlXzsKKworICBpZiAodGFibGVzXy0+QWRkU3ltYm9sKGZ1bGxfbmFtZSwgc3ltYm9sKSkgeworICAgIGlmICghZmlsZV90YWJsZXNfLT5BZGRBbGlhc1VuZGVyUGFyZW50KHBhcmVudCwgbmFtZSwgc3ltYm9sKSkgeworICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJcIiIgPDwgZnVsbF9uYW1lIDw8ICJcIiBub3QgcHJldmlvdXNseSBkZWZpbmVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICJzeW1ib2xzX2J5X25hbWVfLCBidXQgd2FzIGRlZmluZWQgaW4gc3ltYm9sc19ieV9wYXJlbnRfOyAiCisgICAgICAgICAgICAgICAgICAgICAidGhpcyBzaG91bGRuJ3QgYmUgcG9zc2libGUuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIG90aGVyX2ZpbGUgPSB0YWJsZXNfLT5GaW5kU3ltYm9sKGZ1bGxfbmFtZSkuR2V0RmlsZSgpOworICAgIGlmIChvdGhlcl9maWxlID09IGZpbGVfKSB7CisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gZnVsbF9uYW1lLmZpbmRfbGFzdF9vZignLicpOworICAgICAgaWYgKGRvdF9wb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFkZEVycm9yKGZ1bGxfbmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICAgIlwiIiArIGZ1bGxfbmFtZSArICJcIiBpcyBhbHJlYWR5IGRlZmluZWQuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBBZGRFcnJvcihmdWxsX25hbWUsIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICAgICJcIiIgKyBmdWxsX25hbWUuc3Vic3RyKGRvdF9wb3MgKyAxKSArCisgICAgICAgICAgICAgICAgICJcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gXCIiICsKKyAgICAgICAgICAgICAgICAgZnVsbF9uYW1lLnN1YnN0cigwLCBkb3RfcG9zKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gU3ltYm9sIHNlZW1zIHRvIGhhdmUgYmVlbiBkZWZpbmVkIGluIGEgZGlmZmVyZW50IGZpbGUuCisgICAgICBBZGRFcnJvcihmdWxsX25hbWUsIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICAiXCIiICsgZnVsbF9uYW1lICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBmaWxlIFwiIiArCisgICAgICAgICAgICAgICBvdGhlcl9maWxlLT5uYW1lKCkgKyAiXCIuIik7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBZGRQYWNrYWdlKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSwgY29uc3QgTWVzc2FnZSYgcHJvdG8sIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIGlmICh0YWJsZXNfLT5BZGRTeW1ib2wobmFtZSwgU3ltYm9sKGZpbGUpKSkgeworICAgIC8vIFN1Y2Nlc3MuICBBbHNvIGFkZCBwYXJlbnQgcGFja2FnZSwgaWYgYW55LgorICAgIHN0cmluZzo6c2l6ZV90eXBlIGRvdF9wb3MgPSBuYW1lLmZpbmRfbGFzdF9vZignLicpOworICAgIGlmIChkb3RfcG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgLy8gTm8gcGFyZW50cy4KKyAgICAgIFZhbGlkYXRlU3ltYm9sTmFtZShuYW1lLCBuYW1lLCBwcm90byk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEhhcyBwYXJlbnQuCisgICAgICBzdHJpbmcqIHBhcmVudF9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcobmFtZS5zdWJzdHIoMCwgZG90X3BvcykpOworICAgICAgQWRkUGFja2FnZSgqcGFyZW50X25hbWUsIHByb3RvLCBmaWxlKTsKKyAgICAgIFZhbGlkYXRlU3ltYm9sTmFtZShuYW1lLnN1YnN0cihkb3RfcG9zICsgMSksIG5hbWUsIHByb3RvKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgU3ltYm9sIGV4aXN0aW5nX3N5bWJvbCA9IHRhYmxlc18tPkZpbmRTeW1ib2wobmFtZSk7CisgICAgLy8gSXQncyBPSyB0byByZWRlZmluZSBhIHBhY2thZ2UuCisgICAgaWYgKGV4aXN0aW5nX3N5bWJvbC50eXBlICE9IFN5bWJvbDo6UEFDS0FHRSkgeworICAgICAgLy8gU3ltYm9sIHNlZW1zIHRvIGhhdmUgYmVlbiBkZWZpbmVkIGluIGEgZGlmZmVyZW50IGZpbGUuCisgICAgICBBZGRFcnJvcihuYW1lLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICAgIlwiIiArIG5hbWUgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIChhcyBzb21ldGhpbmcgb3RoZXIgdGhhbiAiCisgICAgICAgICAgICAgICAiYSBwYWNrYWdlKSBpbiBmaWxlIFwiIiArIGV4aXN0aW5nX3N5bWJvbC5HZXRGaWxlKCktPm5hbWUoKSArCisgICAgICAgICAgICAgICAiXCIuIik7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlU3ltYm9sTmFtZSgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgZnVsbF9uYW1lLCBjb25zdCBNZXNzYWdlJiBwcm90bykgeworICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgQWRkRXJyb3IoZnVsbF9uYW1lLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICJNaXNzaW5nIG5hbWUuIik7CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7CisgICAgICAvLyBJIGRvbid0IHRydXN0IGlzYWxudW0oKSBkdWUgdG8gbG9jYWxlcy4gIDooCisgICAgICBpZiAoKG5hbWVbaV0gPCAnYScgfHwgJ3onIDwgbmFtZVtpXSkgJiYKKyAgICAgICAgICAobmFtZVtpXSA8ICdBJyB8fCAnWicgPCBuYW1lW2ldKSAmJgorICAgICAgICAgIChuYW1lW2ldIDwgJzAnIHx8ICc5JyA8IG5hbWVbaV0pICYmCisgICAgICAgICAgKG5hbWVbaV0gIT0gJ18nKSkgeworICAgICAgICBBZGRFcnJvcihmdWxsX25hbWUsIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICAgICJcIiIgKyBuYW1lICsgIlwiIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXIuIik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2Jvb2wgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlUXVhbGlmaWVkTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgYm9vbCBsYXN0X3dhc19wZXJpb2QgPSBmYWxzZTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBJIGRvbid0IHRydXN0IGlzYWxudW0oKSBkdWUgdG8gbG9jYWxlcy4gIDooCisgICAgaWYgKCgnYScgPD0gbmFtZVtpXSAmJiBuYW1lW2ldIDw9ICd6JykgfHwKKyAgICAgICAgKCdBJyA8PSBuYW1lW2ldICYmIG5hbWVbaV0gPD0gJ1onKSB8fAorICAgICAgICAoJzAnIDw9IG5hbWVbaV0gJiYgbmFtZVtpXSA8PSAnOScpIHx8CisgICAgICAgIChuYW1lW2ldID09ICdfJykpIHsKKyAgICAgIGxhc3Rfd2FzX3BlcmlvZCA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAobmFtZVtpXSA9PSAnLicpIHsKKyAgICAgIGlmIChsYXN0X3dhc19wZXJpb2QpIHJldHVybiBmYWxzZTsKKyAgICAgIGxhc3Rfd2FzX3BlcmlvZCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gIW5hbWUuZW1wdHkoKSAmJiAhbGFzdF93YXNfcGVyaW9kOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBpcyBnb29kIGZvciBhbGwgZGVzY3JpcHRvcnMgZXhjZXB0CisvLyBGaWxlRGVzY3JpcHRvci4KK3RlbXBsYXRlPGNsYXNzIERlc2NyaXB0b3JUPiB2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBbGxvY2F0ZU9wdGlvbnMoCisgICAgY29uc3QgdHlwZW5hbWUgRGVzY3JpcHRvclQ6Ok9wdGlvbnNUeXBlJiBvcmlnX29wdGlvbnMsCisgICAgRGVzY3JpcHRvclQqIGRlc2NyaXB0b3IpIHsKKyAgQWxsb2NhdGVPcHRpb25zSW1wbChkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgb3JpZ19vcHRpb25zLCBkZXNjcmlwdG9yKTsKK30KKworLy8gV2Ugc3BlY2lhbGl6ZSBmb3IgRmlsZURlc2NyaXB0b3IuCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBbGxvY2F0ZU9wdGlvbnMoY29uc3QgRmlsZU9wdGlvbnMmIG9yaWdfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAvLyBXZSBhZGQgdGhlIGR1bW15IHRva2VuIHNvIHRoYXQgTG9va3VwU3ltYm9sIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLgorICBBbGxvY2F0ZU9wdGlvbnNJbXBsKGRlc2NyaXB0b3ItPnBhY2thZ2UoKSArICIuZHVtbXkiLCBkZXNjcmlwdG9yLT5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgb3JpZ19vcHRpb25zLCBkZXNjcmlwdG9yKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgRGVzY3JpcHRvclQ+IHZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFsbG9jYXRlT3B0aW9uc0ltcGwoCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lX3Njb3BlLAorICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgIGNvbnN0IHR5cGVuYW1lIERlc2NyaXB0b3JUOjpPcHRpb25zVHlwZSYgb3JpZ19vcHRpb25zLAorICAgIERlc2NyaXB0b3JUKiBkZXNjcmlwdG9yKSB7CisgIC8vIFdlIG5lZWQgdG8gdXNlIGEgZHVtbXkgcG9pbnRlciB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBvbGRlciB2ZXJzaW9ucyBvZgorICAvLyBHQ0MuICBPdGhlcndpc2UsIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGNvdWxkIGJlIHJlcGxhY2VkIHdpdGg6CisgIC8vICAgdHlwZW5hbWUgRGVzY3JpcHRvclQ6Ok9wdGlvbnNUeXBlKiBvcHRpb25zID0KKyAgLy8gICAgICAgdGFibGVzXy0+QWxsb2NhdGVNZXNzYWdlPHR5cGVuYW1lIERlc2NyaXB0b3JUOjpPcHRpb25zVHlwZT4oKTsKKyAgdHlwZW5hbWUgRGVzY3JpcHRvclQ6Ok9wdGlvbnNUeXBlKiBjb25zdCBkdW1teSA9IE5VTEw7CisgIHR5cGVuYW1lIERlc2NyaXB0b3JUOjpPcHRpb25zVHlwZSogb3B0aW9ucyA9IHRhYmxlc18tPkFsbG9jYXRlTWVzc2FnZShkdW1teSk7CisgIG9wdGlvbnMtPkNvcHlGcm9tKG9yaWdfb3B0aW9ucyk7CisgIGRlc2NyaXB0b3ItPm9wdGlvbnNfID0gb3B0aW9uczsKKworICAvLyBEb24ndCBhZGQgdG8gb3B0aW9uc190b19pbnRlcnByZXRfIHVubGVzcyB0aGVyZSB3ZXJlIHVuaW50ZXJwcmV0ZWQKKyAgLy8gb3B0aW9ucy4gIFRoaXMgbm90IG9ubHkgYXZvaWRzIHVubmVjZXNzYXJ5IHdvcmssIGJ1dCBwcmV2ZW50cyBhCisgIC8vIGJvb3RzdHJhcHBpbmcgcHJvYmxlbSB3aGVuIGJ1aWxkaW5nIGRlc2NyaXB0b3JzIGZvciBkZXNjcmlwdG9yLnByb3RvLgorICAvLyBkZXNjcmlwdG9yLnByb3RvIGRvZXMgbm90IGNvbnRhaW4gYW55IHVuaW50ZXJwcmV0ZWQgb3B0aW9ucywgYnV0CisgIC8vIGF0dGVtcHRpbmcgdG8gaW50ZXJwcmV0IG9wdGlvbnMgYW55d2F5IHdpbGwgY2F1c2UKKyAgLy8gT3B0aW9uc1R5cGU6OkdldERlc2NyaXB0b3IoKSB0byBiZSBjYWxsZWQgd2hpY2ggbWF5IHRoZW4gZGVhZGxvY2sgc2luY2UKKyAgLy8gd2UncmUgc3RpbGwgdHJ5aW5nIHRvIGJ1aWxkIGl0LgorICBpZiAob3B0aW9ucy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpID4gMCkgeworICAgIG9wdGlvbnNfdG9faW50ZXJwcmV0Xy5wdXNoX2JhY2soCisgICAgICAgIE9wdGlvbnNUb0ludGVycHJldChuYW1lX3Njb3BlLCBlbGVtZW50X25hbWUsICZvcmlnX29wdGlvbnMsIG9wdGlvbnMpKTsKKyAgfQorfQorCisKKy8vIEEgY29tbW9uIHBhdHRlcm46ICBXZSB3YW50IHRvIGNvbnZlcnQgYSByZXBlYXRlZCBmaWVsZCBpbiB0aGUgZGVzY3JpcHRvcgorLy8gdG8gYW4gYXJyYXkgb2YgdmFsdWVzLCBjYWxsaW5nIHNvbWUgbWV0aG9kIHRvIGJ1aWxkIGVhY2ggdmFsdWUuCisjZGVmaW5lIEJVSUxEX0FSUkFZKElOUFVULCBPVVRQVVQsIE5BTUUsIE1FVEhPRCwgUEFSRU5UKSAgICAgICAgICAgICBcCisgIE9VVFBVVC0+TkFNRSMjX2NvdW50XyA9IElOUFVULk5BTUUjI19zaXplKCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFsbG9jYXRlQXJyYXkoSU5QVVQuTkFNRSMjX3NpemUoKSwgJk9VVFBVVC0+TkFNRSMjc18pOyAgICAgICAgICAgICBcCisgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5QVVQuTkFNRSMjX3NpemUoKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgTUVUSE9EKElOUFVULk5BTUUoaSksIFBBUkVOVCwgT1VUUFVULT5OQU1FIyNzXyArIGkpOyAgICAgICAgICAgICBcCisgIH0KKworY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZEZpbGUoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgZmlsZW5hbWVfID0gcHJvdG8ubmFtZSgpOworCisgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSBiZWluZyBidWlsdC4KKyAgLy8gTm90ZTogIFRoaXMgb25seSB3b3JrcyBpZiB0aGUgaW5wdXQgaXMgY2Fub25pY2FsIC0tIHRoYXQgaXMsIGl0CisgIC8vICAgZnVsbHktcXVhbGlmaWVzIGFsbCB0eXBlIG5hbWVzLCBoYXMgbm8gVW5pbnRlcnByZXRlZE9wdGlvbnMsIGV0Yy4KKyAgLy8gICBUaGlzIGlzIGZpbmUsIGJlY2F1c2UgdGhpcyBpZGVtcG90ZW5jeSAiZmVhdHVyZSIgcmVhbGx5IG9ubHkgZXhpc3RzIHRvCisgIC8vICAgYWNjb21vZGF0ZSBvbmUgaGFjayBpbiB0aGUgcHJvdG8xLT5wcm90bzIgbWlncmF0aW9uIGxheWVyLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogZXhpc3RpbmdfZmlsZSA9IHRhYmxlc18tPkZpbmRGaWxlKGZpbGVuYW1lXyk7CisgIGlmIChleGlzdGluZ19maWxlICE9IE5VTEwpIHsKKyAgICAvLyBGaWxlIGFscmVhZHkgaW4gcG9vbC4gIENvbXBhcmUgdGhlIGV4aXN0aW5nIG9uZSB0byB0aGUgaW5wdXQuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBleGlzdGluZ19wcm90bzsKKyAgICBleGlzdGluZ19maWxlLT5Db3B5VG8oJmV4aXN0aW5nX3Byb3RvKTsKKyAgICBpZiAoZXhpc3RpbmdfcHJvdG8uU2VyaWFsaXplQXNTdHJpbmcoKSA9PSBwcm90by5TZXJpYWxpemVBc1N0cmluZygpKSB7CisgICAgICAvLyBUaGV5J3JlIGlkZW50aWNhbC4gIFJldHVybiB0aGUgZXhpc3RpbmcgZGVzY3JpcHRvci4KKyAgICAgIHJldHVybiBleGlzdGluZ19maWxlOworICAgIH0KKworICAgIC8vIE5vdCBhIG1hdGNoLiAgVGhlIGVycm9yIHdpbGwgYmUgZGV0ZWN0ZWQgYW5kIGhhbmRsZWQgbGF0ZXIuCisgIH0KKworICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmaWxlIGlzIGFscmVhZHkgb24gdGhlIHBlbmRpbmcgZmlsZXMgbGlzdC4KKyAgLy8gVE9ETyhrZW50b24pOiAgQWxsb3cgcmVjdXJzaXZlIGltcG9ydHM/ICBJdCBtYXkgbm90IHdvcmsgd2l0aCBzb21lCisgIC8vICAgKG1vc3Q/KSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuICBFLmcuLCBpbiBDKyssIGEgZm9yd2FyZCBkZWNsYXJhdGlvbgorICAvLyAgIG9mIGEgdHlwZSBpcyBub3Qgc3VmZmljaWVudCB0byBhbGxvdyBpdCB0byBiZSB1c2VkIGV2ZW4gaW4gYQorICAvLyAgIGdlbmVyYXRlZCBoZWFkZXIgZmlsZSBkdWUgdG8gaW5saW5pbmcuICBUaGlzIGNvdWxkIHBlcmhhcHMgYmUKKyAgLy8gICB3b3JrZWQgYXJvdW5kIHVzaW5nIHRyaWNrcyBpbnZvbHZpbmcgaW5zZXJ0aW5nICNpbmNsdWRlIHN0YXRlbWVudHMKKyAgLy8gICBtaWQtZmlsZSwgYnV0IHRoYXQncyBwcmV0dHkgdWdseSwgYW5kIEknbSBwcmV0dHkgc3VyZSB0aGVyZSBhcmUKKyAgLy8gICBzb21lIGxhbmd1YWdlcyBvdXQgdGhlcmUgdGhhdCBkbyBub3QgYWxsb3cgcmVjdXJzaXZlIGRlcGVuZGVuY2llcworICAvLyAgIGF0IGFsbC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZXNfLT5wZW5kaW5nX2ZpbGVzXy5zaXplKCk7IGkrKykgeworICAgIGlmICh0YWJsZXNfLT5wZW5kaW5nX2ZpbGVzX1tpXSA9PSBwcm90by5uYW1lKCkpIHsKKyAgICAgIHN0cmluZyBlcnJvcl9tZXNzYWdlKCJGaWxlIHJlY3Vyc2l2ZWx5IGltcG9ydHMgaXRzZWxmOiAiKTsKKyAgICAgIGZvciAoOyBpIDwgdGFibGVzXy0+cGVuZGluZ19maWxlc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZXJyb3JfbWVzc2FnZS5hcHBlbmQodGFibGVzXy0+cGVuZGluZ19maWxlc19baV0pOworICAgICAgICBlcnJvcl9tZXNzYWdlLmFwcGVuZCgiIC0+ICIpOworICAgICAgfQorICAgICAgZXJyb3JfbWVzc2FnZS5hcHBlbmQocHJvdG8ubmFtZSgpKTsKKworICAgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgLy8gSWYgd2UgaGF2ZSBhIGZhbGxiYWNrX2RhdGFiYXNlXywgYXR0ZW1wdCB0byBsb2FkIGFsbCBkZXBlbmRlbmNpZXMgbm93LAorICAvLyBiZWZvcmUgY2hlY2twb2ludGluZyB0YWJsZXNfLiAgVGhpcyBhdm9pZHMgY29uZnVzaW9uIHdpdGggcmVjdXJzaXZlCisgIC8vIGNoZWNrcG9pbnRzLgorICBpZiAocG9vbF8tPmZhbGxiYWNrX2RhdGFiYXNlXyAhPSBOVUxMKSB7CisgICAgdGFibGVzXy0+cGVuZGluZ19maWxlc18ucHVzaF9iYWNrKHByb3RvLm5hbWUoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgICBpZiAodGFibGVzXy0+RmluZEZpbGUocHJvdG8uZGVwZW5kZW5jeShpKSkgPT0gTlVMTCAmJgorICAgICAgICAgIChwb29sXy0+dW5kZXJsYXlfID09IE5VTEwgfHwKKyAgICAgICAgICAgcG9vbF8tPnVuZGVybGF5Xy0+RmluZEZpbGVCeU5hbWUocHJvdG8uZGVwZW5kZW5jeShpKSkgPT0gTlVMTCkpIHsKKyAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSB3aGF0IHRoaXMgcmV0dXJucyBzaW5jZSB3ZSdsbCBmaW5kIG91dCBiZWxvdyBhbnl3YXkuCisgICAgICAgIHBvb2xfLT5UcnlGaW5kRmlsZUluRmFsbGJhY2tEYXRhYmFzZShwcm90by5kZXBlbmRlbmN5KGkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgdGFibGVzXy0+cGVuZGluZ19maWxlc18ucG9wX2JhY2soKTsKKyAgfQorCisgIC8vIENoZWNrcG9pbnQgdGhlIHRhYmxlcyBzbyB0aGF0IHdlIGNhbiByb2xsIGJhY2sgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgIHRhYmxlc18tPkNoZWNrcG9pbnQoKTsKKworICBGaWxlRGVzY3JpcHRvciogcmVzdWx0ID0gdGFibGVzXy0+QWxsb2NhdGU8RmlsZURlc2NyaXB0b3I+KCk7CisgIGZpbGVfID0gcmVzdWx0OworCisgIGZpbGVfdGFibGVzXyA9IHRhYmxlc18tPkFsbG9jYXRlRmlsZVRhYmxlcygpOworICBmaWxlXy0+dGFibGVzXyA9IGZpbGVfdGFibGVzXzsKKworICBpZiAoIXByb3RvLmhhc19uYW1lKCkpIHsKKyAgICBBZGRFcnJvcigiIiwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgICAgIk1pc3NpbmcgZmllbGQ6IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZS4iKTsKKyAgfQorCisgIHJlc3VsdC0+bmFtZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5uYW1lKCkpOworICBpZiAocHJvdG8uaGFzX3BhY2thZ2UoKSkgeworICAgIHJlc3VsdC0+cGFja2FnZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5wYWNrYWdlKCkpOworICB9IGVsc2UgeworICAgIC8vIFdlIGNhbm5vdCByZWx5IG9uIHByb3RvLnBhY2thZ2UoKSByZXR1cm5pbmcgYSB2YWxpZCBzdHJpbmcgaWYKKyAgICAvLyBwcm90by5oYXNfcGFja2FnZSgpIGlzIGZhbHNlLCBiZWNhdXNlIHdlIG1pZ2h0IGJlIHJ1bm5pbmcgYXQgc3RhdGljCisgICAgLy8gaW5pdGlhbGl6YXRpb24gdGltZSwgaW4gd2hpY2ggY2FzZSBkZWZhdWx0IHZhbHVlcyBoYXZlIG5vdCB5ZXQgYmVlbgorICAgIC8vIGluaXRpYWxpemVkLgorICAgIHJlc3VsdC0+cGFja2FnZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZygiIik7CisgIH0KKyAgcmVzdWx0LT5wb29sXyA9IHBvb2xfOworCisgIC8vIEFkZCB0byB0YWJsZXMuCisgIGlmICghdGFibGVzXy0+QWRkRmlsZShyZXN1bHQpKSB7CisgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAiQSBmaWxlIHdpdGggdGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdGhlIHBvb2wuIik7CisgICAgLy8gQmFpbCBvdXQgZWFybHkgc28gdGhhdCBpZiB0aGlzIGlzIGFjdHVhbGx5IHRoZSBleGFjdCBzYW1lIGZpbGUsIHdlCisgICAgLy8gZG9uJ3QgZW5kIHVwIHJlcG9ydGluZyB0aGF0IGV2ZXJ5IHNpbmdsZSBzeW1ib2wgaXMgYWxyZWFkeSBkZWZpbmVkLgorICAgIHRhYmxlc18tPlJvbGxiYWNrKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCFyZXN1bHQtPnBhY2thZ2UoKS5lbXB0eSgpKSB7CisgICAgQWRkUGFja2FnZShyZXN1bHQtPnBhY2thZ2UoKSwgcHJvdG8sIHJlc3VsdCk7CisgIH0KKworICAvLyBNYWtlIHN1cmUgYWxsIGRlcGVuZGVuY2llcyBhcmUgbG9hZGVkLgorICBzZXQ8c3RyaW5nPiBzZWVuX2RlcGVuZGVuY2llczsKKyAgcmVzdWx0LT5kZXBlbmRlbmN5X2NvdW50XyA9IHByb3RvLmRlcGVuZGVuY3lfc2l6ZSgpOworICByZXN1bHQtPmRlcGVuZGVuY2llc18gPQorICAgIHRhYmxlc18tPkFsbG9jYXRlQXJyYXk8Y29uc3QgRmlsZURlc2NyaXB0b3IqPihwcm90by5kZXBlbmRlbmN5X3NpemUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgIGlmICghc2Vlbl9kZXBlbmRlbmNpZXMuaW5zZXJ0KHByb3RvLmRlcGVuZGVuY3koaSkpLnNlY29uZCkgeworICAgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgICAgICAiSW1wb3J0IFwiIiArIHByb3RvLmRlcGVuZGVuY3koaSkgKyAiXCIgd2FzIGxpc3RlZCB0d2ljZS4iKTsKKyAgICB9CisKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVwZW5kZW5jeSA9IHRhYmxlc18tPkZpbmRGaWxlKHByb3RvLmRlcGVuZGVuY3koaSkpOworICAgIGlmIChkZXBlbmRlbmN5ID09IE5VTEwgJiYgcG9vbF8tPnVuZGVybGF5XyAhPSBOVUxMKSB7CisgICAgICBkZXBlbmRlbmN5ID0gcG9vbF8tPnVuZGVybGF5Xy0+RmluZEZpbGVCeU5hbWUocHJvdG8uZGVwZW5kZW5jeShpKSk7CisgICAgfQorCisgICAgaWYgKGRlcGVuZGVuY3kgPT0gTlVMTCkgeworICAgICAgaWYgKHBvb2xfLT5hbGxvd191bmtub3duXykgeworICAgICAgICBkZXBlbmRlbmN5ID0gTmV3UGxhY2Vob2xkZXJGaWxlKHByb3RvLmRlcGVuZGVuY3koaSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyaW5nIG1lc3NhZ2U7CisgICAgICAgIGlmIChwb29sXy0+ZmFsbGJhY2tfZGF0YWJhc2VfID09IE5VTEwpIHsKKyAgICAgICAgICBtZXNzYWdlID0gIkltcG9ydCBcIiIgKyBwcm90by5kZXBlbmRlbmN5KGkpICsKKyAgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBub3QgYmVlbiBsb2FkZWQuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtZXNzYWdlID0gIkltcG9ydCBcIiIgKyBwcm90by5kZXBlbmRlbmN5KGkpICsKKyAgICAgICAgICAgICAgICAgICAgIlwiIHdhcyBub3QgZm91bmQgb3IgaGFkIGVycm9ycy4iOworICAgICAgICB9CisgICAgICAgIEFkZEVycm9yKHByb3RvLm5hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UpOworICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdC0+ZGVwZW5kZW5jaWVzX1tpXSA9IGRlcGVuZGVuY3k7CisgIH0KKworICAvLyBDb252ZXJ0IGNoaWxkcmVuLgorICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBtZXNzYWdlX3R5cGUsIEJ1aWxkTWVzc2FnZSAgLCBOVUxMKTsKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZW51bV90eXBlICAgLCBCdWlsZEVudW0gICAgICwgTlVMTCk7CisgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIHNlcnZpY2UgICAgICwgQnVpbGRTZXJ2aWNlICAsIE5VTEwpOworICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBleHRlbnNpb24gICAsIEJ1aWxkRXh0ZW5zaW9uLCBOVUxMKTsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KKyAgfSBlbHNlIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOworICB9CisKKyAgLy8gTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgc3RlcHMgbXVzdCBvY2N1ciBpbiBleGFjdGx5IHRoZSBzcGVjaWZpZWQgb3JkZXIuCisKKyAgLy8gQ3Jvc3MtbGluay4KKyAgQ3Jvc3NMaW5rRmlsZShyZXN1bHQsIHByb3RvKTsKKworICAvLyBJbnRlcnByZXQgYW55IHJlbWFpbmluZyB1bmludGVycHJldGVkIG9wdGlvbnMgZ2F0aGVyZWQgaW50bworICAvLyBvcHRpb25zX3RvX2ludGVycHJldF8gZHVyaW5nIGRlc2NyaXB0b3IgYnVpbGRpbmcuICBDcm9zcy1saW5raW5nIGhhcyBtYWRlCisgIC8vIGV4dGVuc2lvbiBvcHRpb25zIGtub3duLCBzbyBhbGwgaW50ZXJwcmV0YXRpb25zIHNob3VsZCBub3cgc3VjY2VlZC4KKyAgaWYgKCFoYWRfZXJyb3JzXykgeworICAgIE9wdGlvbkludGVycHJldGVyIG9wdGlvbl9pbnRlcnByZXRlcih0aGlzKTsKKyAgICBmb3IgKHZlY3RvcjxPcHRpb25zVG9JbnRlcnByZXQ+OjppdGVyYXRvciBpdGVyID0KKyAgICAgICAgICAgICBvcHRpb25zX3RvX2ludGVycHJldF8uYmVnaW4oKTsKKyAgICAgICAgIGl0ZXIgIT0gb3B0aW9uc190b19pbnRlcnByZXRfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIG9wdGlvbl9pbnRlcnByZXRlci5JbnRlcnByZXRPcHRpb25zKCYoKml0ZXIpKTsKKyAgICB9CisgICAgb3B0aW9uc190b19pbnRlcnByZXRfLmNsZWFyKCk7CisgIH0KKworICAvLyBWYWxpZGF0ZSBvcHRpb25zLgorICBpZiAoIWhhZF9lcnJvcnNfKSB7CisgICAgVmFsaWRhdGVGaWxlT3B0aW9ucyhyZXN1bHQsIHByb3RvKTsKKyAgfQorCisgIGlmIChoYWRfZXJyb3JzXykgeworICAgIHRhYmxlc18tPlJvbGxiYWNrKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgdGFibGVzXy0+Q2hlY2twb2ludCgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IqIHJlc3VsdCkgeworICBjb25zdCBzdHJpbmcmIHNjb3BlID0gKHBhcmVudCA9PSBOVUxMKSA/CisgICAgZmlsZV8tPnBhY2thZ2UoKSA6IHBhcmVudC0+ZnVsbF9uYW1lKCk7CisgIHN0cmluZyogZnVsbF9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoc2NvcGUpOworICBpZiAoIWZ1bGxfbmFtZS0+ZW1wdHkoKSkgZnVsbF9uYW1lLT5hcHBlbmQoMSwgJy4nKTsKKyAgZnVsbF9uYW1lLT5hcHBlbmQocHJvdG8ubmFtZSgpKTsKKworICBWYWxpZGF0ZVN5bWJvbE5hbWUocHJvdG8ubmFtZSgpLCAqZnVsbF9uYW1lLCBwcm90byk7CisKKyAgcmVzdWx0LT5uYW1lXyAgICAgICAgICAgID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcocHJvdG8ubmFtZSgpKTsKKyAgcmVzdWx0LT5mdWxsX25hbWVfICAgICAgID0gZnVsbF9uYW1lOworICByZXN1bHQtPmZpbGVfICAgICAgICAgICAgPSBmaWxlXzsKKyAgcmVzdWx0LT5jb250YWluaW5nX3R5cGVfID0gcGFyZW50OworICByZXN1bHQtPmlzX3BsYWNlaG9sZGVyXyAgPSBmYWxzZTsKKyAgcmVzdWx0LT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8gPSBmYWxzZTsKKworICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBmaWVsZCAgICAgICAgICAsIEJ1aWxkRmllbGQgICAgICAgICAsIHJlc3VsdCk7CisgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIG5lc3RlZF90eXBlICAgICwgQnVpbGRNZXNzYWdlICAgICAgICwgcmVzdWx0KTsKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZW51bV90eXBlICAgICAgLCBCdWlsZEVudW0gICAgICAgICAgLCByZXN1bHQpOworICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBleHRlbnNpb25fcmFuZ2UsIEJ1aWxkRXh0ZW5zaW9uUmFuZ2UsIHJlc3VsdCk7CisgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIGV4dGVuc2lvbiAgICAgICwgQnVpbGRFeHRlbnNpb24gICAgICwgcmVzdWx0KTsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KKyAgfSBlbHNlIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOworICB9CisKKyAgQWRkU3ltYm9sKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHBhcmVudCwgcmVzdWx0LT5uYW1lKCksCisgICAgICAgICAgICBwcm90bywgU3ltYm9sKHJlc3VsdCkpOworCisgIC8vIENoZWNrIHRoYXQgbm8gZmllbGRzIGhhdmUgbnVtYmVycyBpbiBleHRlbnNpb24gcmFuZ2VzLgorICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IHJlc3VsdC0+ZmllbGQoaSk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCByZXN1bHQtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZSA9IHJlc3VsdC0+ZXh0ZW5zaW9uX3JhbmdlKGopOworICAgICAgaWYgKHJhbmdlLT5zdGFydCA8PSBmaWVsZC0+bnVtYmVyKCkgJiYgZmllbGQtPm51bWJlcigpIDwgcmFuZ2UtPmVuZCkgeworICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLmV4dGVuc2lvbl9yYW5nZShqKSwKKyAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgICAgICAgICAgIkV4dGVuc2lvbiByYW5nZSAkMCB0byAkMSBpbmNsdWRlcyBmaWVsZCBcIiQyXCIgKCQzKS4iLAorICAgICAgICAgICAgICAgICAgIHJhbmdlLT5zdGFydCwgcmFuZ2UtPmVuZCAtIDEsCisgICAgICAgICAgICAgICAgICAgZmllbGQtPm5hbWUoKSwgZmllbGQtPm51bWJlcigpKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgdGhhdCBleHRlbnNpb24gcmFuZ2VzIGRvbid0IG92ZXJsYXAuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LT5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlMSA9IHJlc3VsdC0+ZXh0ZW5zaW9uX3JhbmdlKGkpOworICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IHJlc3VsdC0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlMiA9IHJlc3VsdC0+ZXh0ZW5zaW9uX3JhbmdlKGopOworICAgICAgaWYgKHJhbmdlMS0+ZW5kID4gcmFuZ2UyLT5zdGFydCAmJiByYW5nZTItPmVuZCA+IHJhbmdlMS0+c3RhcnQpIHsKKyAgICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8uZXh0ZW5zaW9uX3JhbmdlKGopLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiRXh0ZW5zaW9uIHJhbmdlICQwIHRvICQxIG92ZXJsYXBzIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHJlYWR5LWRlZmluZWQgcmFuZ2UgJDIgdG8gJDMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTItPnN0YXJ0LCByYW5nZTItPmVuZCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UxLT5zdGFydCwgcmFuZ2UxLT5lbmQgLSAxKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkRmllbGRPckV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciogcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXh0ZW5zaW9uKSB7CisgIGNvbnN0IHN0cmluZyYgc2NvcGUgPSAocGFyZW50ID09IE5VTEwpID8KKyAgICBmaWxlXy0+cGFja2FnZSgpIDogcGFyZW50LT5mdWxsX25hbWUoKTsKKyAgc3RyaW5nKiBmdWxsX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhzY29wZSk7CisgIGlmICghZnVsbF9uYW1lLT5lbXB0eSgpKSBmdWxsX25hbWUtPmFwcGVuZCgxLCAnLicpOworICBmdWxsX25hbWUtPmFwcGVuZChwcm90by5uYW1lKCkpOworCisgIFZhbGlkYXRlU3ltYm9sTmFtZShwcm90by5uYW1lKCksICpmdWxsX25hbWUsIHByb3RvKTsKKworICByZXN1bHQtPm5hbWVfICAgICAgICAgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5uYW1lKCkpOworICByZXN1bHQtPmZ1bGxfbmFtZV8gICAgPSBmdWxsX25hbWU7CisgIHJlc3VsdC0+ZmlsZV8gICAgICAgICA9IGZpbGVfOworICByZXN1bHQtPm51bWJlcl8gICAgICAgPSBwcm90by5udW1iZXIoKTsKKyAgcmVzdWx0LT5pc19leHRlbnNpb25fID0gaXNfZXh0ZW5zaW9uOworCisgIC8vIElmIC5wcm90byBmaWxlcyBmb2xsb3cgdGhlIHN0eWxlIGd1aWRlIHRoZW4gdGhlIG5hbWUgc2hvdWxkIGFscmVhZHkgYmUKKyAgLy8gbG93ZXItY2FzZWQuICBJZiB0aGF0J3MgdGhlIGNhc2Ugd2UgY2FuIGp1c3QgcmV1c2UgdGhlIHN0cmluZyB3ZSBhbHJlYWR5CisgIC8vIGFsbG9jYXRlZCByYXRoZXIgdGhhbiBhbGxvY2F0ZSBhIG5ldyBvbmUuCisgIHN0cmluZyBsb3dlcmNhc2VfbmFtZShwcm90by5uYW1lKCkpOworICBMb3dlclN0cmluZygmbG93ZXJjYXNlX25hbWUpOworICBpZiAobG93ZXJjYXNlX25hbWUgPT0gcHJvdG8ubmFtZSgpKSB7CisgICAgcmVzdWx0LT5sb3dlcmNhc2VfbmFtZV8gPSByZXN1bHQtPm5hbWVfOworICB9IGVsc2UgeworICAgIHJlc3VsdC0+bG93ZXJjYXNlX25hbWVfID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcobG93ZXJjYXNlX25hbWUpOworICB9CisKKyAgLy8gRG9uJ3QgYm90aGVyIHdpdGggdGhlIGFib3ZlIG9wdGltaXphdGlvbiBmb3IgY2FtZWwtY2FzZSBuYW1lcyBzaW5jZQorICAvLyAucHJvdG8gZmlsZXMgdGhhdCBmb2xsb3cgdGhlIGd1aWRlIHNob3VsZG4ndCBiZSB1c2luZyBuYW1lcyBpbiB0aGlzCisgIC8vIGZvcm1hdCwgc28gdGhlIG9wdGltaXphdGlvbiB3b3VsZG4ndCBoZWxwIG11Y2guCisgIHJlc3VsdC0+Y2FtZWxjYXNlX25hbWVfID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoVG9DYW1lbENhc2UocHJvdG8ubmFtZSgpKSk7CisKKyAgLy8gU29tZSBjb21waWxlcnMgZG8gbm90IGFsbG93IHN0YXRpY19jYXN0IGRpcmVjdGx5IGJldHdlZW4gdHdvIGVudW0gdHlwZXMsCisgIC8vIHNvIHdlIG11c3QgY2FzdCB0byBpbnQgZmlyc3QuCisgIHJlc3VsdC0+dHlwZV8gID0gc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yOjpUeXBlPigKKyAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50Pihwcm90by50eXBlKCkpKTsKKyAgcmVzdWx0LT5sYWJlbF8gPSBzdGF0aWNfY2FzdDxGaWVsZERlc2NyaXB0b3I6OkxhYmVsPigKKyAgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50Pihwcm90by5sYWJlbCgpKSk7CisKKyAgLy8gU29tZSBvZiB0aGVzZSBtYXkgYmUgZmlsbGVkIGluIHdoZW4gY3Jvc3MtbGlua2luZy4KKyAgcmVzdWx0LT5jb250YWluaW5nX3R5cGVfID0gTlVMTDsKKyAgcmVzdWx0LT5leHRlbnNpb25fc2NvcGVfID0gTlVMTDsKKyAgcmVzdWx0LT5leHBlcmltZW50YWxfbWFwX2tleV8gPSBOVUxMOworICByZXN1bHQtPm1lc3NhZ2VfdHlwZV8gPSBOVUxMOworICByZXN1bHQtPmVudW1fdHlwZV8gPSBOVUxMOworCisgIHJlc3VsdC0+aGFzX2RlZmF1bHRfdmFsdWVfID0gcHJvdG8uaGFzX2RlZmF1bHRfdmFsdWUoKTsKKyAgaWYgKHByb3RvLmhhc19kZWZhdWx0X3ZhbHVlKCkgJiYgcmVzdWx0LT5pc19yZXBlYXRlZCgpKSB7CisgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAorICAgICAgICAgICAgICJSZXBlYXRlZCBmaWVsZHMgY2FuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4iKTsKKyAgfQorCisgIGlmIChwcm90by5oYXNfdHlwZSgpKSB7CisgICAgaWYgKHByb3RvLmhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKKyAgICAgIGNoYXIqIGVuZF9wb3MgPSBOVUxMOworICAgICAgc3dpdGNoIChyZXN1bHQtPmNwcF90eXBlKCkpIHsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2ludDMyXyA9CisgICAgICAgICAgICBzdHJ0b2wocHJvdG8uZGVmYXVsdF92YWx1ZSgpLmNfc3RyKCksICZlbmRfcG9zLCAwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2ludDY0XyA9CisgICAgICAgICAgICBzdHJ0bzY0KHByb3RvLmRlZmF1bHRfdmFsdWUoKS5jX3N0cigpLCAmZW5kX3BvcywgMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfdWludDMyXyA9CisgICAgICAgICAgICBzdHJ0b3VsKHByb3RvLmRlZmF1bHRfdmFsdWUoKS5jX3N0cigpLCAmZW5kX3BvcywgMCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfdWludDY0XyA9CisgICAgICAgICAgICBzdHJ0b3U2NChwcm90by5kZWZhdWx0X3ZhbHVlKCkuY19zdHIoKSwgJmVuZF9wb3MsIDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgICAgICBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpID09ICJpbmYiKSB7CisgICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZmxvYXRfID0gbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpID09ICItaW5mIikgeworICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Zsb2F0XyA9IC1udW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gIm5hbiIpIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9mbG9hdF8gPSBudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpOworICAgICAgICAgIH0gZWxzZSAgeworICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Zsb2F0XyA9CisgICAgICAgICAgICAgIE5vTG9jYWxlU3RydG9kKHByb3RvLmRlZmF1bHRfdmFsdWUoKS5jX3N0cigpLCAmZW5kX3Bvcyk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICAgICAgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKSA9PSAiaW5mIikgeworICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2RvdWJsZV8gPSBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOworICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpID09ICItaW5mIikgeworICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2RvdWJsZV8gPSAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKSA9PSAibmFuIikgeworICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2RvdWJsZV8gPSBudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKTsKKyAgICAgICAgICB9IGVsc2UgIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9kb3VibGVfID0KKyAgICAgICAgICAgICAgTm9Mb2NhbGVTdHJ0b2QocHJvdG8uZGVmYXVsdF92YWx1ZSgpLmNfc3RyKCksICZlbmRfcG9zKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICAgICAgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKSA9PSAidHJ1ZSIpIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9ib29sXyA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gImZhbHNlIikgeworICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Jvb2xfID0gZmFsc2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgIkJvb2xlYW4gZGVmYXVsdCBtdXN0IGJlIHRydWUgb3IgZmFsc2UuIik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBmaWxsZWQgaW4gd2hlbiBjcm9zcy1saW5raW5nLgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9lbnVtXyA9IE5VTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgICBpZiAocmVzdWx0LT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKSB7CisgICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nXyA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKAorICAgICAgICAgICAgICBVbmVzY2FwZUNFc2NhcGVTdHJpbmcocHJvdG8uZGVmYXVsdF92YWx1ZSgpKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmdfID0KKyAgICAgICAgICAgICAgdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcocHJvdG8uZGVmYXVsdF92YWx1ZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICJNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzLiIpOworICAgICAgICAgIHJlc3VsdC0+aGFzX2RlZmF1bHRfdmFsdWVfID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChlbmRfcG9zICE9IE5VTEwpIHsKKyAgICAgICAgLy8gZW5kX3BvcyBpcyBvbmx5IHNldCBub24tTlVMTCBieSB0aGUgcGFyc2VycyBmb3IgbnVtZXJpYyB0eXBlcywgYWJvdmUuCisgICAgICAgIC8vIFRoaXMgY2hlY2tzIHRoYXQgdGhlIGRlZmF1bHQgd2FzIG5vbi1lbXB0eSBhbmQgaGFkIG5vIGV4dHJhIGp1bmsKKyAgICAgICAgLy8gYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbnVtYmVyLgorICAgICAgICBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpLmVtcHR5KCkgfHwgKmVuZF9wb3MgIT0gJ1wwJykgeworICAgICAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6REVGQVVMVF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgcGFyc2UgZGVmYXVsdCB2YWx1ZS4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBObyBleHBsaWNpdCBkZWZhdWx0IHZhbHVlCisgICAgICBzd2l0Y2ggKHJlc3VsdC0+Y3BwX3R5cGUoKSkgeworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfaW50MzJfID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2ludDY0XyA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfdWludDMyXyA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfdWludDY0XyA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9mbG9hdF8gPSAwLjBmOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2RvdWJsZV8gPSAwLjA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6CisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Jvb2xfID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGZpbGxlZCBpbiB3aGVuIGNyb3NzLWxpbmtpbmcuCisgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2VudW1fID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmdfID0gJmtFbXB0eVN0cmluZzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAocmVzdWx0LT5udW1iZXIoKSA8PSAwKSB7CisgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICJGaWVsZCBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuIik7CisgIH0gZWxzZSBpZiAocmVzdWx0LT5udW1iZXIoKSA+IEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcikgeworICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKKyAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKCJGaWVsZCBudW1iZXJzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJDAuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcikpOworICB9IGVsc2UgaWYgKHJlc3VsdC0+bnVtYmVyKCkgPj0gRmllbGREZXNjcmlwdG9yOjprRmlyc3RSZXNlcnZlZE51bWJlciAmJgorICAgICAgICAgICAgIHJlc3VsdC0+bnVtYmVyKCkgPD0gRmllbGREZXNjcmlwdG9yOjprTGFzdFJlc2VydmVkTnVtYmVyKSB7CisgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgICAgICAiRmllbGQgbnVtYmVycyAkMCB0aHJvdWdoICQxIGFyZSByZXNlcnZlZCBmb3IgdGhlIHByb3RvY29sICIKKyAgICAgICAgICAgICAgICJidWZmZXIgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi4iLAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprRmlyc3RSZXNlcnZlZE51bWJlciwKKyAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6a0xhc3RSZXNlcnZlZE51bWJlcikpOworICB9CisKKyAgaWYgKGlzX2V4dGVuc2lvbikgeworICAgIGlmICghcHJvdG8uaGFzX2V4dGVuZGVlKCkpIHsKKyAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFWFRFTkRFRSwKKyAgICAgICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBub3Qgc2V0IGZvciBleHRlbnNpb24gZmllbGQuIik7CisgICAgfQorCisgICAgcmVzdWx0LT5leHRlbnNpb25fc2NvcGVfID0gcGFyZW50OworICB9IGVsc2UgeworICAgIGlmIChwcm90by5oYXNfZXh0ZW5kZWUoKSkgeworICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAorICAgICAgICAgICAgICAgIkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlIHNldCBmb3Igbm9uLWV4dGVuc2lvbiBmaWVsZC4iKTsKKyAgICB9CisKKyAgICByZXN1bHQtPmNvbnRhaW5pbmdfdHlwZV8gPSBwYXJlbnQ7CisgIH0KKworICAvLyBDb3B5IG9wdGlvbnMuCisgIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KKyAgfSBlbHNlIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOworICB9CisKKyAgQWRkU3ltYm9sKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHBhcmVudCwgcmVzdWx0LT5uYW1lKCksCisgICAgICAgICAgICBwcm90bywgU3ltYm9sKHJlc3VsdCkpOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZEV4dGVuc2lvblJhbmdlKAorICAgIGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIHByb3RvLAorICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKKyAgICBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmVzdWx0KSB7CisgIHJlc3VsdC0+c3RhcnQgPSBwcm90by5zdGFydCgpOworICByZXN1bHQtPmVuZCA9IHByb3RvLmVuZCgpOworICBpZiAocmVzdWx0LT5zdGFydCA8PSAwKSB7CisgICAgQWRkRXJyb3IocGFyZW50LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgIkV4dGVuc2lvbiBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuIik7CisgIH0KKworICBpZiAocmVzdWx0LT5lbmQgPiBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIgKyAxKSB7CisgICAgQWRkRXJyb3IocGFyZW50LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiRXh0ZW5zaW9uIG51bWJlcnMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAkMC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKSk7CisgIH0KKworICBpZiAocmVzdWx0LT5zdGFydCA+PSByZXN1bHQtPmVuZCkgeworICAgIEFkZEVycm9yKHBhcmVudC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICJFeHRlbnNpb24gcmFuZ2UgZW5kIG51bWJlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBzdGFydCBudW1iZXIuIik7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvciogcmVzdWx0KSB7CisgIGNvbnN0IHN0cmluZyYgc2NvcGUgPSAocGFyZW50ID09IE5VTEwpID8KKyAgICBmaWxlXy0+cGFja2FnZSgpIDogcGFyZW50LT5mdWxsX25hbWUoKTsKKyAgc3RyaW5nKiBmdWxsX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhzY29wZSk7CisgIGlmICghZnVsbF9uYW1lLT5lbXB0eSgpKSBmdWxsX25hbWUtPmFwcGVuZCgxLCAnLicpOworICBmdWxsX25hbWUtPmFwcGVuZChwcm90by5uYW1lKCkpOworCisgIFZhbGlkYXRlU3ltYm9sTmFtZShwcm90by5uYW1lKCksICpmdWxsX25hbWUsIHByb3RvKTsKKworICByZXN1bHQtPm5hbWVfICAgICAgICAgICAgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5uYW1lKCkpOworICByZXN1bHQtPmZ1bGxfbmFtZV8gICAgICAgPSBmdWxsX25hbWU7CisgIHJlc3VsdC0+ZmlsZV8gICAgICAgICAgICA9IGZpbGVfOworICByZXN1bHQtPmNvbnRhaW5pbmdfdHlwZV8gPSBwYXJlbnQ7CisgIHJlc3VsdC0+aXNfcGxhY2Vob2xkZXJfICA9IGZhbHNlOworICByZXN1bHQtPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXyA9IGZhbHNlOworCisgIGlmIChwcm90by52YWx1ZV9zaXplKCkgPT0gMCkgeworICAgIC8vIFdlIGNhbm5vdCBhbGxvdyBlbnVtcyB3aXRoIG5vIHZhbHVlcyBiZWNhdXNlIHRoaXMgd291bGQgbWVhbiB0aGVyZQorICAgIC8vIHdvdWxkIGJlIG5vIHZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGZpZWxkcyBvZiB0aGlzIHR5cGUuCisgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAorICAgICAgICAgICAgICJFbnVtcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHZhbHVlLiIpOworICB9CisKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgdmFsdWUsIEJ1aWxkRW51bVZhbHVlLCByZXN1bHQpOworCisgIC8vIENvcHkgb3B0aW9ucy4KKyAgaWYgKCFwcm90by5oYXNfb3B0aW9ucygpKSB7CisgICAgcmVzdWx0LT5vcHRpb25zXyA9IE5VTEw7ICAvLyBXaWxsIHNldCB0byBkZWZhdWx0X2luc3RhbmNlIGxhdGVyLgorICB9IGVsc2UgeworICAgIEFsbG9jYXRlT3B0aW9ucyhwcm90by5vcHRpb25zKCksIHJlc3VsdCk7CisgIH0KKworICBBZGRTeW1ib2wocmVzdWx0LT5mdWxsX25hbWUoKSwgcGFyZW50LCByZXN1bHQtPm5hbWUoKSwKKyAgICAgICAgICAgIHByb3RvLCBTeW1ib2wocmVzdWx0KSk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkRW51bVZhbHVlKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVZhbHVlRGVzY3JpcHRvciogcmVzdWx0KSB7CisgIHJlc3VsdC0+bmFtZV8gICA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLm5hbWUoKSk7CisgIHJlc3VsdC0+bnVtYmVyXyA9IHByb3RvLm51bWJlcigpOworICByZXN1bHQtPnR5cGVfICAgPSBwYXJlbnQ7CisKKyAgLy8gTm90ZTogIGZ1bGxfbmFtZSBmb3IgZW51bSB2YWx1ZXMgaXMgYSBzaWJsaW5nIHRvIHRoZSBwYXJlbnQncyBuYW1lLCBub3QgYQorICAvLyAgIGNoaWxkIG9mIGl0LgorICBzdHJpbmcqIGZ1bGxfbmFtZSA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKCpwYXJlbnQtPmZ1bGxfbmFtZV8pOworICBmdWxsX25hbWUtPnJlc2l6ZShmdWxsX25hbWUtPnNpemUoKSAtIHBhcmVudC0+bmFtZV8tPnNpemUoKSk7CisgIGZ1bGxfbmFtZS0+YXBwZW5kKCpyZXN1bHQtPm5hbWVfKTsKKyAgcmVzdWx0LT5mdWxsX25hbWVfID0gZnVsbF9uYW1lOworCisgIFZhbGlkYXRlU3ltYm9sTmFtZShwcm90by5uYW1lKCksICpmdWxsX25hbWUsIHByb3RvKTsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KKyAgfSBlbHNlIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOworICB9CisKKyAgLy8gQWdhaW4sIGVudW0gdmFsdWVzIGFyZSB3ZWlyZCBiZWNhdXNlIHdlIG1ha2VzIHRoZW0gYXBwZWFyIGFzIHNpYmxpbmdzCisgIC8vIG9mIHRoZSBlbnVtIHR5cGUgaW5zdGVhZCBvZiBjaGlsZHJlbiBvZiBpdC4gIFNvLCB3ZSB1c2UKKyAgLy8gcGFyZW50LT5jb250YWluaW5nX3R5cGUoKSBhcyB0aGUgdmFsdWUncyBwYXJlbnQuCisgIGJvb2wgYWRkZWRfdG9fb3V0ZXJfc2NvcGUgPQorICAgIEFkZFN5bWJvbChyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwYXJlbnQtPmNvbnRhaW5pbmdfdHlwZSgpLCByZXN1bHQtPm5hbWUoKSwKKyAgICAgICAgICAgICAgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKKworICAvLyBIb3dldmVyLCB3ZSBhbHNvIHdhbnQgdG8gYmUgYWJsZSB0byBzZWFyY2ggZm9yIHZhbHVlcyB3aXRoaW4gYSBzaW5nbGUKKyAgLy8gZW51bSB0eXBlLCBzbyB3ZSBhZGQgaXQgYXMgYSBjaGlsZCBvZiB0aGUgZW51bSB0eXBlIGl0c2VsZiwgdG9vLgorICAvLyBOb3RlOiAgVGhpcyBjb3VsZCBmYWlsLCBidXQgaWYgaXQgZG9lcywgdGhlIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4KKyAgLy8gICByZXBvcnRlZCBieSB0aGUgYWJvdmUgQWRkU3ltYm9sKCkgY2FsbCwgc28gd2UgaWdub3JlIHRoZSByZXR1cm4gY29kZS4KKyAgYm9vbCBhZGRlZF90b19pbm5lcl9zY29wZSA9CisgICAgZmlsZV90YWJsZXNfLT5BZGRBbGlhc1VuZGVyUGFyZW50KHBhcmVudCwgcmVzdWx0LT5uYW1lKCksIFN5bWJvbChyZXN1bHQpKTsKKworICBpZiAoYWRkZWRfdG9faW5uZXJfc2NvcGUgJiYgIWFkZGVkX3RvX291dGVyX3Njb3BlKSB7CisgICAgLy8gVGhpcyB2YWx1ZSBkaWQgbm90IGNvbmZsaWN0IHdpdGggYW55IHZhbHVlcyBkZWZpbmVkIGluIHRoZSBzYW1lIGVudW0sCisgICAgLy8gYnV0IGl0IGRpZCBjb25mbGljdCB3aXRoIHNvbWUgb3RoZXIgc3ltYm9sIGRlZmluZWQgaW4gdGhlIGVudW0gdHlwZSdzCisgICAgLy8gc2NvcGUuICBMZXQncyBwcmludCBhbiBhZGRpdGlvbmFsIGVycm9yIHRvIGV4cGxhaW4gdGhpcy4KKyAgICBzdHJpbmcgb3V0ZXJfc2NvcGU7CisgICAgaWYgKHBhcmVudC0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgeworICAgICAgb3V0ZXJfc2NvcGUgPSBmaWxlXy0+cGFja2FnZSgpOworICAgIH0gZWxzZSB7CisgICAgICBvdXRlcl9zY29wZSA9IHBhcmVudC0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpOworICAgIH0KKworICAgIGlmIChvdXRlcl9zY29wZS5lbXB0eSgpKSB7CisgICAgICBvdXRlcl9zY29wZSA9ICJ0aGUgZ2xvYmFsIHNjb3BlIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0ZXJfc2NvcGUgPSAiXCIiICsgb3V0ZXJfc2NvcGUgKyAiXCIiOworICAgIH0KKworICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAiTm90ZSB0aGF0IGVudW0gdmFsdWVzIHVzZSBDKysgc2NvcGluZyBydWxlcywgbWVhbmluZyB0aGF0ICIKKyAgICAgICAgICAgICAiZW51bSB2YWx1ZXMgYXJlIHNpYmxpbmdzIG9mIHRoZWlyIHR5cGUsIG5vdCBjaGlsZHJlbiBvZiBpdC4gICIKKyAgICAgICAgICAgICAiVGhlcmVmb3JlLCBcIiIgKyByZXN1bHQtPm5hbWUoKSArICJcIiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gIgorICAgICAgICAgICAgICsgb3V0ZXJfc2NvcGUgKyAiLCBub3QganVzdCB3aXRoaW4gXCIiICsgcGFyZW50LT5uYW1lKCkgKyAiXCIuIik7CisgIH0KKworICAvLyBBbiBlbnVtIGlzIGFsbG93ZWQgdG8gZGVmaW5lIHR3byBudW1iZXJzIHRoYXQgcmVmZXIgdG8gdGhlIHNhbWUgdmFsdWUuCisgIC8vIEZpbmRWYWx1ZUJ5TnVtYmVyKCkgc2hvdWxkIHJldHVybiB0aGUgZmlyc3Qgc3VjaCB2YWx1ZSwgc28gd2Ugc2ltcGx5CisgIC8vIGlnbm9yZSBBZGRFbnVtVmFsdWVCeU51bWJlcigpJ3MgcmV0dXJuIGNvZGUuCisgIGZpbGVfdGFibGVzXy0+QWRkRW51bVZhbHVlQnlOdW1iZXIocmVzdWx0KTsKK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRTZXJ2aWNlKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGR1bW15LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yKiByZXN1bHQpIHsKKyAgc3RyaW5nKiBmdWxsX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhmaWxlXy0+cGFja2FnZSgpKTsKKyAgaWYgKCFmdWxsX25hbWUtPmVtcHR5KCkpIGZ1bGxfbmFtZS0+YXBwZW5kKDEsICcuJyk7CisgIGZ1bGxfbmFtZS0+YXBwZW5kKHByb3RvLm5hbWUoKSk7CisKKyAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgKmZ1bGxfbmFtZSwgcHJvdG8pOworCisgIHJlc3VsdC0+bmFtZV8gICAgICA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLm5hbWUoKSk7CisgIHJlc3VsdC0+ZnVsbF9uYW1lXyA9IGZ1bGxfbmFtZTsKKyAgcmVzdWx0LT5maWxlXyAgICAgID0gZmlsZV87CisKKyAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgbWV0aG9kLCBCdWlsZE1ldGhvZCwgcmVzdWx0KTsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KKyAgfSBlbHNlIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOworICB9CisKKyAgQWRkU3ltYm9sKHJlc3VsdC0+ZnVsbF9uYW1lKCksIE5VTEwsIHJlc3VsdC0+bmFtZSgpLAorICAgICAgICAgICAgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRNZXRob2QoY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yKiByZXN1bHQpIHsKKyAgcmVzdWx0LT5uYW1lXyAgICA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLm5hbWUoKSk7CisgIHJlc3VsdC0+c2VydmljZV8gPSBwYXJlbnQ7CisKKyAgc3RyaW5nKiBmdWxsX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwYXJlbnQtPmZ1bGxfbmFtZSgpKTsKKyAgZnVsbF9uYW1lLT5hcHBlbmQoMSwgJy4nKTsKKyAgZnVsbF9uYW1lLT5hcHBlbmQoKnJlc3VsdC0+bmFtZV8pOworICByZXN1bHQtPmZ1bGxfbmFtZV8gPSBmdWxsX25hbWU7CisKKyAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgKmZ1bGxfbmFtZSwgcHJvdG8pOworCisgIC8vIFRoZXNlIHdpbGwgYmUgZmlsbGVkIGluIHdoZW4gY3Jvc3MtbGlua2luZy4KKyAgcmVzdWx0LT5pbnB1dF90eXBlXyA9IE5VTEw7CisgIHJlc3VsdC0+b3V0cHV0X3R5cGVfID0gTlVMTDsKKworICAvLyBDb3B5IG9wdGlvbnMuCisgIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgeworICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KKyAgfSBlbHNlIHsKKyAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOworICB9CisKKyAgQWRkU3ltYm9sKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHBhcmVudCwgcmVzdWx0LT5uYW1lKCksCisgICAgICAgICAgICBwcm90bywgU3ltYm9sKHJlc3VsdCkpOworfQorCisjdW5kZWYgQlVJTERfQVJSQVkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpDcm9zc0xpbmtGaWxlKAorICAgIEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBpZiAoZmlsZS0+b3B0aW9uc18gPT0gTlVMTCkgeworICAgIGZpbGUtPm9wdGlvbnNfID0gJkZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBDcm9zc0xpbmtNZXNzYWdlKCZmaWxlLT5tZXNzYWdlX3R5cGVzX1tpXSwgcHJvdG8ubWVzc2FnZV90eXBlKGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua0ZpZWxkKCZmaWxlLT5leHRlbnNpb25zX1tpXSwgcHJvdG8uZXh0ZW5zaW9uKGkpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua0VudW0oJmZpbGUtPmVudW1fdHlwZXNfW2ldLCBwcm90by5lbnVtX3R5cGUoaSkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua1NlcnZpY2UoJmZpbGUtPnNlcnZpY2VzX1tpXSwgcHJvdG8uc2VydmljZShpKSk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q3Jvc3NMaW5rTWVzc2FnZSgKKyAgICBEZXNjcmlwdG9yKiBtZXNzYWdlLCBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGlmIChtZXNzYWdlLT5vcHRpb25zXyA9PSBOVUxMKSB7CisgICAgbWVzc2FnZS0+b3B0aW9uc18gPSAmTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgQ3Jvc3NMaW5rTWVzc2FnZSgmbWVzc2FnZS0+bmVzdGVkX3R5cGVzX1tpXSwgcHJvdG8ubmVzdGVkX3R5cGUoaSkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgQ3Jvc3NMaW5rRW51bSgmbWVzc2FnZS0+ZW51bV90eXBlc19baV0sIHByb3RvLmVudW1fdHlwZShpKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua0ZpZWxkKCZtZXNzYWdlLT5maWVsZHNfW2ldLCBwcm90by5maWVsZChpKSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBDcm9zc0xpbmtGaWVsZCgmbWVzc2FnZS0+ZXh0ZW5zaW9uc19baV0sIHByb3RvLmV4dGVuc2lvbihpKSk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q3Jvc3NMaW5rRmllbGQoCisgICAgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGlmIChmaWVsZC0+b3B0aW9uc18gPT0gTlVMTCkgeworICAgIGZpZWxkLT5vcHRpb25zXyA9ICZGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCisgIGlmIChwcm90by5oYXNfZXh0ZW5kZWUoKSkgeworICAgIFN5bWJvbCBleHRlbmRlZSA9IExvb2t1cFN5bWJvbChwcm90by5leHRlbmRlZSgpLCBmaWVsZC0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMQUNFSE9MREVSX0VYVEVOREFCTEVfTUVTU0FHRSk7CisgICAgaWYgKGV4dGVuZGVlLklzTnVsbCgpKSB7CisgICAgICBBZGROb3REZWZpbmVkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLmV4dGVuZGVlKCkpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoZXh0ZW5kZWUudHlwZSAhPSBTeW1ib2w6Ok1FU1NBR0UpIHsKKyAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAorICAgICAgICAgICAgICAgIlwiIiArIHByb3RvLmV4dGVuZGVlKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlXyA9IGV4dGVuZGVlLmRlc2NyaXB0b3I7CisKKyAgICBpZiAoIWZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+SXNFeHRlbnNpb25OdW1iZXIoZmllbGQtPm51bWJlcigpKSkgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiXCIkMFwiIGRvZXMgbm90IGRlY2xhcmUgJDEgYXMgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIG51bWJlci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCkpKTsKKyAgICB9CisgIH0KKworICBpZiAocHJvdG8uaGFzX3R5cGVfbmFtZSgpKSB7CisgICAgLy8gQXNzdW1lIHdlIGFyZSBleHBlY3RpbmcgYSBtZXNzYWdlIHR5cGUgdW5sZXNzIHRoZSBwcm90byBjb250YWlucyBzb21lCisgICAgLy8gZXZpZGVuY2UgdGhhdCBpdCBleHBlY3RzIGFuIGVudW0gdHlwZS4gIFRoaXMgb25seSBtYWtlcyBhIGRpZmZlcmVuY2UgaWYKKyAgICAvLyB3ZSBlbmQgdXAgY3JlYXRpbmcgYSBwbGFjZWhvbGRlci4KKyAgICBib29sIGV4cGVjdGluZ19lbnVtID0gKHByb3RvLnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9FTlVNKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5oYXNfZGVmYXVsdF92YWx1ZSgpOworCisgICAgU3ltYm9sIHR5cGUgPQorICAgICAgTG9va3VwU3ltYm9sKHByb3RvLnR5cGVfbmFtZSgpLCBmaWVsZC0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgZXhwZWN0aW5nX2VudW0gPyBQTEFDRUhPTERFUl9FTlVNIDogUExBQ0VIT0xERVJfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICBMT09LVVBfVFlQRVMpOworCisgICAgaWYgKHR5cGUuSXNOdWxsKCkpIHsKKyAgICAgIEFkZE5vdERlZmluZWRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by50eXBlX25hbWUoKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFwcm90by5oYXNfdHlwZSgpKSB7CisgICAgICAvLyBDaG9vc2UgZmllbGQgdHlwZSBiYXNlZCBvbiBzeW1ib2wuCisgICAgICBpZiAodHlwZS50eXBlID09IFN5bWJvbDo6TUVTU0FHRSkgeworICAgICAgICBmaWVsZC0+dHlwZV8gPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRTsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS50eXBlID09IFN5bWJvbDo6RU5VTSkgeworICAgICAgICBmaWVsZC0+dHlwZV8gPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICAgIlwiIiArIHByb3RvLnR5cGVfbmFtZSgpICsgIlwiIGlzIG5vdCBhIHR5cGUuIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmICh0eXBlLnR5cGUgIT0gU3ltYm9sOjpNRVNTQUdFKSB7CisgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICAgIlwiIiArIHByb3RvLnR5cGVfbmFtZSgpICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZmllbGQtPm1lc3NhZ2VfdHlwZV8gPSB0eXBlLmRlc2NyaXB0b3I7CisKKyAgICAgIGlmIChmaWVsZC0+aGFzX2RlZmF1bHRfdmFsdWUoKSkgeworICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkRFRkFVTFRfVkFMVUUsCisgICAgICAgICAgICAgICAgICJNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzLiIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0pIHsKKyAgICAgIGlmICh0eXBlLnR5cGUgIT0gU3ltYm9sOjpFTlVNKSB7CisgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICAgIlwiIiArIHByb3RvLnR5cGVfbmFtZSgpICsgIlwiIGlzIG5vdCBhbiBlbnVtIHR5cGUuIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGZpZWxkLT5lbnVtX3R5cGVfID0gdHlwZS5lbnVtX2Rlc2NyaXB0b3I7CisKKyAgICAgIGlmIChmaWVsZC0+ZW51bV90eXBlKCktPmlzX3BsYWNlaG9sZGVyXykgeworICAgICAgICAvLyBXZSBjYW4ndCBsb29rIHVwIGRlZmF1bHQgdmFsdWVzIGZvciBwbGFjZWhvbGRlciB0eXBlcy4gIFdlJ2xsIGhhdmUKKyAgICAgICAgLy8gdG8ganVzdCBkcm9wIHRoZW0uCisgICAgICAgIGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZV8gPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICAgIC8vIFdlIGNhbid0IGp1c3QgdXNlIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOYW1lKCkgaGVyZQorICAgICAgICAvLyBiZWNhdXNlIHRoYXQgbG9ja3MgdGhlIHBvb2wncyBtdXRleCwgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IGxvY2tlZAorICAgICAgICAvLyBhdCB0aGlzIHBvaW50LgorICAgICAgICBTeW1ib2wgZGVmYXVsdF92YWx1ZSA9CisgICAgICAgICAgTG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcihwcm90by5kZWZhdWx0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+ZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKworICAgICAgICBpZiAoZGVmYXVsdF92YWx1ZS50eXBlID09IFN5bWJvbDo6RU5VTV9WQUxVRSAmJgorICAgICAgICAgICAgZGVmYXVsdF92YWx1ZS5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3ItPnR5cGUoKSA9PSBmaWVsZC0+ZW51bV90eXBlKCkpIHsKKyAgICAgICAgICBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtXyA9IGRlZmF1bHRfdmFsdWUuZW51bV92YWx1ZV9kZXNjcmlwdG9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICJFbnVtIHR5cGUgXCIiICsgZmllbGQtPmVudW1fdHlwZSgpLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBubyB2YWx1ZSBuYW1lZCBcIiIgKyBwcm90by5kZWZhdWx0X3ZhbHVlKCkgKyAiXCIuIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmVudW1fdHlwZSgpLT52YWx1ZV9jb3VudCgpID4gMCkgeworICAgICAgICAvLyBBbGwgZW51bXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB2YWx1ZSwgb3Igd2Ugd291bGQgaGF2ZSByZXBvcnRlZAorICAgICAgICAvLyBhbiBlcnJvciBlbHNld2hlcmUuICBXZSB1c2UgdGhlIGZpcnN0IGRlZmluZWQgdmFsdWUgYXMgdGhlIGRlZmF1bHQKKyAgICAgICAgLy8gaWYgYSBkZWZhdWx0IGlzIG5vdCBleHBsaWNpdGx5IGRlZmluZWQuCisgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW1fID0gZmllbGQtPmVudW1fdHlwZSgpLT52YWx1ZSgwKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICAgIkZpZWxkIHdpdGggcHJpbWl0aXZlIHR5cGUgaGFzIHR5cGVfbmFtZS4iKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFIHx8CisgICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7CisgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAiRmllbGQgd2l0aCBtZXNzYWdlIG9yIGVudW0gdHlwZSBtaXNzaW5nIHR5cGVfbmFtZS4iKTsKKyAgICB9CisgIH0KKworICAvLyBBZGQgdGhlIGZpZWxkIHRvIHRoZSBmaWVsZHMtYnktbnVtYmVyIHRhYmxlLgorICAvLyBOb3RlOiAgV2UgaGF2ZSB0byBkbyB0aGlzICphZnRlciogY3Jvc3MtbGlua2luZyBiZWNhdXNlIGV4dGVuc2lvbnMgZG8gbm90CisgIC8vICAga25vdyB0aGVpciBjb250YWluaW5nIHR5cGUgdW50aWwgbm93LgorICBpZiAoIWZpbGVfdGFibGVzXy0+QWRkRmllbGRCeU51bWJlcihmaWVsZCkpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGNvbmZsaWN0aW5nX2ZpZWxkID0KKyAgICAgIGZpbGVfdGFibGVzXy0+RmluZEZpZWxkQnlOdW1iZXIoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCkpOworICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKKyAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkV4dGVuc2lvbiBudW1iZXIgJDAgaGFzIGFscmVhZHkgYmVlbiB1c2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIFwiJDFcIiBieSBleHRlbnNpb24gXCIkMlwiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5mdWxsX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RpbmdfZmllbGQtPmZ1bGxfbmFtZSgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKKyAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkZpZWxkIG51bWJlciAkMCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIkMVwiIGJ5IGZpZWxkIFwiJDJcIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nX2ZpZWxkLT5uYW1lKCkpKTsKKyAgICB9CisgIH0KKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgLy8gTm8gbmVlZCBmb3IgZXJyb3IgY2hlY2tpbmc6IGlmIHRoZSBleHRlbnNpb24gbnVtYmVyIGNvbGxpZGVkLAorICAgIC8vIHdlJ3ZlIGFscmVhZHkgYmVlbiBpbmZvcm1lZCBvZiBpdCBieSB0aGUgaWYoKSBhYm92ZS4KKyAgICB0YWJsZXNfLT5BZGRFeHRlbnNpb24oZmllbGQpOworICB9CisKKyAgLy8gQWRkIHRoZSBmaWVsZCB0byB0aGUgbG93ZXJjYXNlLW5hbWUgYW5kIGNhbWVsY2FzZS1uYW1lIHRhYmxlcy4KKyAgZmlsZV90YWJsZXNfLT5BZGRGaWVsZEJ5U3R5bGl6ZWROYW1lcyhmaWVsZCk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua0VudW0oCisgICAgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZSwgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgaWYgKGVudW1fdHlwZS0+b3B0aW9uc18gPT0gTlVMTCkgeworICAgIGVudW1fdHlwZS0+b3B0aW9uc18gPSAmRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICBDcm9zc0xpbmtFbnVtVmFsdWUoJmVudW1fdHlwZS0+dmFsdWVzX1tpXSwgcHJvdG8udmFsdWUoaSkpOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua0VudW1WYWx1ZSgKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlLCBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGlmIChlbnVtX3ZhbHVlLT5vcHRpb25zXyA9PSBOVUxMKSB7CisgICAgZW51bV92YWx1ZS0+b3B0aW9uc18gPSAmRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua1NlcnZpY2UoCisgICAgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UsIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGlmIChzZXJ2aWNlLT5vcHRpb25zXyA9PSBOVUxMKSB7CisgICAgc2VydmljZS0+b3B0aW9uc18gPSAmU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZS0+bWV0aG9kX2NvdW50KCk7IGkrKykgeworICAgIENyb3NzTGlua01ldGhvZCgmc2VydmljZS0+bWV0aG9kc19baV0sIHByb3RvLm1ldGhvZChpKSk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q3Jvc3NMaW5rTWV0aG9kKAorICAgIE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBpZiAobWV0aG9kLT5vcHRpb25zXyA9PSBOVUxMKSB7CisgICAgbWV0aG9kLT5vcHRpb25zXyA9ICZNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KKworICBTeW1ib2wgaW5wdXRfdHlwZSA9IExvb2t1cFN5bWJvbChwcm90by5pbnB1dF90eXBlKCksIG1ldGhvZC0+ZnVsbF9uYW1lKCkpOworICBpZiAoaW5wdXRfdHlwZS5Jc051bGwoKSkgeworICAgIEFkZE5vdERlZmluZWRFcnJvcihtZXRob2QtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpJTlBVVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICBwcm90by5pbnB1dF90eXBlKCkpOworICB9IGVsc2UgaWYgKGlucHV0X3R5cGUudHlwZSAhPSBTeW1ib2w6Ok1FU1NBR0UpIHsKKyAgICBBZGRFcnJvcihtZXRob2QtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OklOUFVUX1RZUEUsCisgICAgICAgICAgICAgIlwiIiArIHByb3RvLmlucHV0X3R5cGUoKSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7CisgIH0gZWxzZSB7CisgICAgbWV0aG9kLT5pbnB1dF90eXBlXyA9IGlucHV0X3R5cGUuZGVzY3JpcHRvcjsKKyAgfQorCisgIFN5bWJvbCBvdXRwdXRfdHlwZSA9IExvb2t1cFN5bWJvbChwcm90by5vdXRwdXRfdHlwZSgpLCBtZXRob2QtPmZ1bGxfbmFtZSgpKTsKKyAgaWYgKG91dHB1dF90eXBlLklzTnVsbCgpKSB7CisgICAgQWRkTm90RGVmaW5lZEVycm9yKG1ldGhvZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9VVFBVVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICBwcm90by5vdXRwdXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmIChvdXRwdXRfdHlwZS50eXBlICE9IFN5bWJvbDo6TUVTU0FHRSkgeworICAgIEFkZEVycm9yKG1ldGhvZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1VUUFVUX1RZUEUsCisgICAgICAgICAgICAgIlwiIiArIHByb3RvLm91dHB1dF90eXBlKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOworICB9IGVsc2UgeworICAgIG1ldGhvZC0+b3V0cHV0X3R5cGVfID0gb3V0cHV0X3R5cGUuZGVzY3JpcHRvcjsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKGRlc2NyaXB0b3IsIGFycmF5X25hbWUsIHR5cGUpICBcCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+YXJyYXlfbmFtZSMjX2NvdW50KCk7ICsraSkgeyAgICAgXAorICAgIFZhbGlkYXRlIyN0eXBlIyNPcHRpb25zKGRlc2NyaXB0b3ItPmFycmF5X25hbWUjI3NfICsgaSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5hcnJheV9uYW1lKGkpKTsgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gRGV0ZXJtaW5lIGlmIHRoZSBmaWxlIHVzZXMgb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FLCBiZWluZyBjYXJlZnVsIHRvCisvLyBhdm9pZCBwcm9ibGVtcyB0aGF0IGV4aXN0IGF0IGluaXQgdGltZS4KK3N0YXRpYyBib29sIElzTGl0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICAvLyBUT0RPKGtlbnRvbik6ICBJIGRvbid0IGV2ZW4gcmVtZW1iZXIgaG93IG1hbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBhcmUKKyAgLy8gICBhY3R1YWxseSBwb3NzaWJsZS4gIEknbSBqdXN0IGJlaW5nIHN1cGVyLXNhZmUuCisgIHJldHVybiBmaWxlICE9IE5VTEwgJiYKKyAgICAgICAgICZmaWxlLT5vcHRpb25zKCkgIT0gTlVMTCAmJgorICAgICAgICAgJmZpbGUtPm9wdGlvbnMoKSAhPSAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSAmJgorICAgICAgICAgZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpID09IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlRmlsZU9wdGlvbnMoRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShmaWxlLCBtZXNzYWdlX3R5cGUsIE1lc3NhZ2UpOworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkoZmlsZSwgZW51bV90eXBlLCBFbnVtKTsKKyAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKGZpbGUsIHNlcnZpY2UsIFNlcnZpY2UpOworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkoZmlsZSwgZXh0ZW5zaW9uLCBGaWVsZCk7CisKKyAgLy8gTGl0ZSBmaWxlcyBjYW4gb25seSBiZSBpbXBvcnRlZCBieSBvdGhlciBMaXRlIGZpbGVzLgorICBpZiAoIUlzTGl0ZShmaWxlKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICAgIGlmIChJc0xpdGUoZmlsZS0+ZGVwZW5kZW5jeShpKSkpIHsKKyAgICAgICAgQWRkRXJyb3IoCisgICAgICAgICAgZmlsZS0+bmFtZSgpLCBwcm90bywKKyAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICJGaWxlcyB0aGF0IGRvIG5vdCB1c2Ugb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FIGNhbm5vdCBpbXBvcnQgIgorICAgICAgICAgICJmaWxlcyB3aGljaCBkbyB1c2UgdGhpcyBvcHRpb24uICBUaGlzIGZpbGUgaXMgbm90IGxpdGUsIGJ1dCBpdCAiCisgICAgICAgICAgImltcG9ydHMgXCIiICsgZmlsZS0+ZGVwZW5kZW5jeShpKS0+bmFtZSgpICsgIlwiIHdoaWNoIGlzLiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVNZXNzYWdlT3B0aW9ucyhEZXNjcmlwdG9yKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShtZXNzYWdlLCBmaWVsZCwgRmllbGQpOworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkobWVzc2FnZSwgbmVzdGVkX3R5cGUsIE1lc3NhZ2UpOworICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkobWVzc2FnZSwgZW51bV90eXBlLCBFbnVtKTsKKyAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKG1lc3NhZ2UsIGV4dGVuc2lvbiwgRmllbGQpOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZUZpZWxkT3B0aW9ucyhGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBpZiAoZmllbGQtPm9wdGlvbnMoKS5oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKSkgeworICAgIFZhbGlkYXRlTWFwS2V5KGZpZWxkLCBwcm90byk7CisgIH0KKworICAvLyBPbmx5IHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMgbWF5IGJlIHBhY2tlZC4KKyAgaWYgKGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCkgJiYgIWZpZWxkLT5pc19wYWNrYWJsZSgpKSB7CisgICAgQWRkRXJyb3IoCisgICAgICBmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgIltwYWNrZWQgPSB0cnVlXSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMuIik7CisgIH0KKworICAvLyBOb3RlOiAgRGVmYXVsdCBpbnN0YW5jZSBtYXkgbm90IHlldCBiZSBpbml0aWFsaXplZCBoZXJlLCBzbyB3ZSBoYXZlIHRvCisgIC8vICAgYXZvaWQgcmVhZGluZyBmcm9tIGl0LgorICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfdHlwZV8gIT0gTlVMTCAmJgorICAgICAgJmZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+b3B0aW9ucygpICE9CisgICAgICAmTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSAmJgorICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIGlmICghZmllbGQtPmlzX29wdGlvbmFsKCkgfHwKKyAgICAgICAgICBmaWVsZC0+dHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFKSB7CisgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAgICAgIkV4dGVuc2lvbnMgb2YgTWVzc2FnZVNldHMgbXVzdCBiZSBvcHRpb25hbCBtZXNzYWdlcy4iKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICJNZXNzYWdlU2V0cyBjYW5ub3QgaGF2ZSBmaWVsZHMsIG9ubHkgZXh0ZW5zaW9ucy4iKTsKKyAgICB9CisgIH0KKworICAvLyBMaXRlIGV4dGVuc2lvbnMgY2FuIG9ubHkgYmUgb2YgTGl0ZSB0eXBlcy4KKyAgaWYgKElzTGl0ZShmaWVsZC0+ZmlsZSgpKSAmJgorICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZV8gIT0gTlVMTCAmJgorICAgICAgIUlzTGl0ZShmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPmZpbGUoKSkpIHsKKyAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RVhURU5ERUUsCisgICAgICAgICAgICAgIkV4dGVuc2lvbnMgdG8gbm9uLWxpdGUgdHlwZXMgY2FuIG9ubHkgYmUgZGVjbGFyZWQgaW4gbm9uLWxpdGUgIgorICAgICAgICAgICAgICJmaWxlcy4gIE5vdGUgdGhhdCB5b3UgY2Fubm90IGV4dGVuZCBhIG5vbi1saXRlIHR5cGUgdG8gY29udGFpbiAiCisgICAgICAgICAgICAgImEgbGl0ZSB0eXBlLCBidXQgdGhlIHJldmVyc2UgaXMgYWxsb3dlZC4iKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZUVudW1PcHRpb25zKEVudW1EZXNjcmlwdG9yKiBlbm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShlbm0sIHZhbHVlLCBFbnVtVmFsdWUpOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZUVudW1WYWx1ZU9wdGlvbnMoCisgICAgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICAvLyBOb3RoaW5nIHRvIGRvIHNvIGZhci4KK30KK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlU2VydmljZU9wdGlvbnMoU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UsCisgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgaWYgKElzTGl0ZShzZXJ2aWNlLT5maWxlKCkpICYmCisgICAgICAoc2VydmljZS0+ZmlsZSgpLT5vcHRpb25zKCkuY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHx8CisgICAgICAgc2VydmljZS0+ZmlsZSgpLT5vcHRpb25zKCkuamF2YV9nZW5lcmljX3NlcnZpY2VzKCkpKSB7CisgICAgQWRkRXJyb3Ioc2VydmljZS0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAiRmlsZXMgd2l0aCBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUgY2Fubm90IGRlZmluZSBzZXJ2aWNlcyAiCisgICAgICAgICAgICAgInVubGVzcyB5b3Ugc2V0IGJvdGggb3B0aW9ucyBjY19nZW5lcmljX3NlcnZpY2VzIGFuZCAiCisgICAgICAgICAgICAgImphdmFfZ2VuZXJpY19zZXZpY2VzIHRvIGZhbHNlLiIpOworICB9CisKKyAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKHNlcnZpY2UsIG1ldGhvZCwgTWV0aG9kKTsKK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVNZXRob2RPcHRpb25zKE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKKyAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIC8vIE5vdGhpbmcgdG8gZG8gc28gZmFyLgorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZU1hcEtleShGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgIm1hcCB0eXBlIGlzIG9ubHkgYWxsb3dlZCBmb3IgcmVwZWF0ZWQgZmllbGRzLiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAibWFwIHR5cGUgaXMgb25seSBhbGxvd2VkIGZvciBmaWVsZHMgd2l0aCBhIG1lc3NhZ2UgdHlwZS4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBEZXNjcmlwdG9yKiBpdGVtX3R5cGUgPSBmaWVsZC0+bWVzc2FnZV90eXBlKCk7CisgIGlmIChpdGVtX3R5cGUgPT0gTlVMTCkgeworICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKKyAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgZmllbGQgdHlwZS4iKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBGaW5kIHRoZSBmaWVsZCBpbiBpdGVtX3R5cGUgbmFtZWQgYnkgImV4cGVyaW1lbnRhbF9tYXBfa2V5IgorICBjb25zdCBzdHJpbmcmIGtleV9uYW1lID0gZmllbGQtPm9wdGlvbnMoKS5leHBlcmltZW50YWxfbWFwX2tleSgpOworICBjb25zdCBTeW1ib2wga2V5X3N5bWJvbCA9IExvb2t1cFN5bWJvbCgKKyAgICAgIGtleV9uYW1lLAorICAgICAgLy8gV2UgYXBwZW5kICIua2V5X25hbWUiIHRvIHRoZSBjb250YWluaW5nIHR5cGUncyBuYW1lIHNpbmNlCisgICAgICAvLyBMb29rdXBTeW1ib2woKSBzZWFyY2hlcyBmb3IgcGVlcnMgb2YgdGhlIHN1cHBsaWVkIG5hbWUsIG5vdAorICAgICAgLy8gY2hpbGRyZW4gb2YgdGhlIHN1cHBsaWVkIG5hbWUuCisgICAgICBpdGVtX3R5cGUtPmZ1bGxfbmFtZSgpICsgIi4iICsga2V5X25hbWUpOworCisgIGlmIChrZXlfc3ltYm9sLklzTnVsbCgpIHx8IGtleV9zeW1ib2wuZmllbGRfZGVzY3JpcHRvci0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIGZpZWxkIG5hbWVkIFwiIiArIGtleV9uYW1lICsgIlwiIGluIHR5cGUgXCIiICsKKyAgICAgICAgICAgICBpdGVtX3R5cGUtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgIHJldHVybjsKKyAgfQorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGtleV9maWVsZCA9IGtleV9zeW1ib2wuZmllbGRfZGVzY3JpcHRvcjsKKworICBpZiAoa2V5X2ZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICJtYXBfa2V5IG11c3Qgbm90IG5hbWUgYSByZXBlYXRlZCBmaWVsZC4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoa2V5X2ZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICJtYXAga2V5IG11c3QgbmFtZSBhIHNjYWxhciBvciBzdHJpbmcgZmllbGQuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZmllbGQtPmV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9IGtleV9maWVsZDsKK30KKworI3VuZGVmIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Rlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6T3B0aW9uSW50ZXJwcmV0ZXIoCisgICAgRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXIpIDogYnVpbGRlcl8oYnVpbGRlcikgeworICBHT09HTEVfQ0hFQ0soYnVpbGRlcl8pOworfQorCitEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6On5PcHRpb25JbnRlcnByZXRlcigpIHsKK30KKworYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OkludGVycHJldE9wdGlvbnMoCisgICAgT3B0aW9uc1RvSW50ZXJwcmV0KiBvcHRpb25zX3RvX2ludGVycHJldCkgeworICAvLyBOb3RlIHRoYXQgdGhlc2UgbWF5IGJlIGluIGRpZmZlcmVudCBwb29scywgc28gd2UgY2FuJ3QgdXNlIHRoZSBzYW1lCisgIC8vIGRlc2NyaXB0b3IgYW5kIHJlZmxlY3Rpb24gb2JqZWN0cyBvbiBib3RoLgorICBNZXNzYWdlKiBvcHRpb25zID0gb3B0aW9uc190b19pbnRlcnByZXQtPm9wdGlvbnM7CisgIGNvbnN0IE1lc3NhZ2UqIG9yaWdpbmFsX29wdGlvbnMgPSBvcHRpb25zX3RvX2ludGVycHJldC0+b3JpZ2luYWxfb3B0aW9uczsKKworICBib29sIGZhaWxlZCA9IGZhbHNlOworICBvcHRpb25zX3RvX2ludGVycHJldF8gPSBvcHRpb25zX3RvX2ludGVycHJldDsKKworICAvLyBGaW5kIHRoZSB1bmludGVycHJldGVkX29wdGlvbiBmaWVsZCBpbiB0aGUgbXV0YWJsZSBjb3B5IG9mIHRoZSBvcHRpb25zCisgIC8vIGFuZCBjbGVhciB0aGVtLCBzaW5jZSB3ZSdyZSBhYm91dCB0byBpbnRlcnByZXQgdGhlbS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB1bmludGVycHJldGVkX29wdGlvbnNfZmllbGQgPQorICAgICAgb3B0aW9ucy0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInVuaW50ZXJwcmV0ZWRfb3B0aW9uIik7CisgIEdPT0dMRV9DSEVDSyh1bmludGVycHJldGVkX29wdGlvbnNfZmllbGQgIT0gTlVMTCkKKyAgICAgIDw8ICJObyBmaWVsZCBuYW1lZCBcInVuaW50ZXJwcmV0ZWRfb3B0aW9uXCIgaW4gdGhlIE9wdGlvbnMgcHJvdG8uIjsKKyAgb3B0aW9ucy0+R2V0UmVmbGVjdGlvbigpLT5DbGVhckZpZWxkKG9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uc19maWVsZCk7CisKKyAgLy8gRmluZCB0aGUgdW5pbnRlcnByZXRlZF9vcHRpb24gZmllbGQgaW4gdGhlIG9yaWdpbmFsIG9wdGlvbnMuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogb3JpZ2luYWxfdW5pbnRlcnByZXRlZF9vcHRpb25zX2ZpZWxkID0KKyAgICAgIG9yaWdpbmFsX29wdGlvbnMtPkdldERlc2NyaXB0b3IoKS0+CisgICAgICAgICAgRmluZEZpZWxkQnlOYW1lKCJ1bmludGVycHJldGVkX29wdGlvbiIpOworICBHT09HTEVfQ0hFQ0sob3JpZ2luYWxfdW5pbnRlcnByZXRlZF9vcHRpb25zX2ZpZWxkICE9IE5VTEwpCisgICAgICA8PCAiTm8gZmllbGQgbmFtZWQgXCJ1bmludGVycHJldGVkX29wdGlvblwiIGluIHRoZSBPcHRpb25zIHByb3RvLiI7CisKKyAgY29uc3QgaW50IG51bV91bmludGVycHJldGVkX29wdGlvbnMgPSBvcmlnaW5hbF9vcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPgorICAgICAgRmllbGRTaXplKCpvcmlnaW5hbF9vcHRpb25zLCBvcmlnaW5hbF91bmludGVycHJldGVkX29wdGlvbnNfZmllbGQpOworICBmb3IgKGludCBpID0gMDsgaSA8IG51bV91bmludGVycHJldGVkX29wdGlvbnM7ICsraSkgeworICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyA9IGRvd25fY2FzdDxjb25zdCBVbmludGVycHJldGVkT3B0aW9uKj4oCisgICAgICAgICZvcmlnaW5hbF9vcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPkdldFJlcGVhdGVkTWVzc2FnZSgKKyAgICAgICAgICAgICpvcmlnaW5hbF9vcHRpb25zLCBvcmlnaW5hbF91bmludGVycHJldGVkX29wdGlvbnNfZmllbGQsIGkpKTsKKyAgICBpZiAoIUludGVycHJldFNpbmdsZU9wdGlvbihvcHRpb25zKSkgeworICAgICAgLy8gRXJyb3IgYWxyZWFkeSBhZGRlZCBieSBJbnRlcnByZXRTaW5nbGVPcHRpb24oKS4KKyAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLy8gUmVzZXQgdGhlc2UsIHNvIHdlIGRvbid0IGhhdmUgYW55IGRhbmdsaW5nIHBvaW50ZXJzLgorICB1bmludGVycHJldGVkX29wdGlvbl8gPSBOVUxMOworICBvcHRpb25zX3RvX2ludGVycHJldF8gPSBOVUxMOworCisgIGlmICghZmFpbGVkKSB7CisgICAgLy8gSW50ZXJwcmV0U2luZ2xlT3B0aW9uKCkgYWRkZWQgdGhlIGludGVycHJldGVkIG9wdGlvbnMgaW4gdGhlCisgICAgLy8gVW5rbm93bkZpZWxkU2V0LCBpbiBjYXNlIHRoZSBvcHRpb24gaXNuJ3QgeWV0IGtub3duIHRvIHVzLiAgTm93IHdlCisgICAgLy8gc2VyaWFsaXplIHRoZSBvcHRpb25zIG1lc3NhZ2UgYW5kIGRlc2VyaWFsaXplIGl0IGJhY2suICBUaGF0IHdheSwgYW55CisgICAgLy8gb3B0aW9uIGZpZWxkcyB0aGF0IHdlIGRvIGhhcHBlbiB0byBrbm93IGFib3V0IHdpbGwgZ2V0IG1vdmVkIGZyb20gdGhlCisgICAgLy8gVW5rbm93bkZpZWxkU2V0IGludG8gdGhlIHJlYWwgZmllbGRzLCBhbmQgdGh1cyBiZSBhdmFpbGFibGUgcmlnaHQgYXdheS4KKyAgICAvLyBJZiB0aGV5IGFyZSBub3Qga25vd24sIHRoYXQncyBPSyB0b28uIFRoZXkgd2lsbCBnZXQgcmVwYXJzZWQgaW50byB0aGUKKyAgICAvLyBVbmtub3duRmllbGRTZXQgYW5kIHdhaXQgdGhlcmUgdW50aWwgdGhlIG1lc3NhZ2UgaXMgcGFyc2VkIGJ5IHNvbWV0aGluZworICAgIC8vIHRoYXQgZG9lcyBrbm93IGFib3V0IHRoZSBvcHRpb25zLgorICAgIHN0cmluZyBidWY7CisgICAgb3B0aW9ucy0+QXBwZW5kVG9TdHJpbmcoJmJ1Zik7CisgICAgR09PR0xFX0NIRUNLKG9wdGlvbnMtPlBhcnNlRnJvbVN0cmluZyhidWYpKQorICAgICAgICA8PCAiUHJvdG9jb2wgbWVzc2FnZSBzZXJpYWxpemVkIGl0c2VsZiBpbiBpbnZhbGlkIGZhc2hpb24uIjsKKyAgfQorCisgIHJldHVybiAhZmFpbGVkOworfQorCitib29sIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6SW50ZXJwcmV0U2luZ2xlT3B0aW9uKAorICAgIE1lc3NhZ2UqIG9wdGlvbnMpIHsKKyAgLy8gRmlyc3QgZG8gc29tZSBiYXNpYyB2YWxpZGF0aW9uLgorICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5uYW1lX3NpemUoKSA9PSAwKSB7CisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHVubGVzcyB0aGUgcGFyc2VyIGhhcyBnb25lIHNlcmlvdXNseSBhd3J5IG9yCisgICAgLy8gc29tZW9uZSBoYXMgbWFudWFsbHkgY3JlYXRlZCB0aGUgdW5pbnRlcnByZXRlZCBvcHRpb24gYmFkbHkuCisgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigiT3B0aW9uIG11c3QgaGF2ZSBhIG5hbWUuIik7CisgIH0KKyAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmFtZSgwKS5uYW1lX3BhcnQoKSA9PSAidW5pbnRlcnByZXRlZF9vcHRpb24iKSB7CisgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigiT3B0aW9uIG11c3Qgbm90IHVzZSByZXNlcnZlZCBuYW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcInVuaW50ZXJwcmV0ZWRfb3B0aW9uXCIuIik7CisgIH0KKworICBjb25zdCBEZXNjcmlwdG9yKiBvcHRpb25zX2Rlc2NyaXB0b3IgPSBOVUxMOworICAvLyBHZXQgdGhlIG9wdGlvbnMgbWVzc2FnZSdzIGRlc2NyaXB0b3IgZnJvbSB0aGUgYnVpbGRlcidzIHBvb2wsIHNvIHRoYXQgd2UKKyAgLy8gZ2V0IHRoZSB2ZXJzaW9uIHRoYXQga25vd3MgYWJvdXQgYW55IGV4dGVuc2lvbiBvcHRpb25zIGRlY2xhcmVkIGluIHRoZQorICAvLyBmaWxlIHdlJ3JlIGN1cnJlbnRseSBidWlsZGluZy4gVGhlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHRoZXJlIGFzIGxvbmcgYXMKKyAgLy8gdGhlIGZpbGUgd2UncmUgYnVpbGRpbmcgaW1wb3J0ZWQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9ycy5wcm90byIuCisKKyAgLy8gTm90ZSB0aGF0IHdlIHVzZSBEZXNjcmlwdG9yQnVpbGRlcjo6RmluZFN5bWJvbCgpLCBub3QKKyAgLy8gRGVzY3JpcHRvclBvb2w6OkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgpIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBob2xkaW5nIHRoZQorICAvLyBwb29sJ3MgbXV0ZXgsIGFuZCB0aGUgbGF0dGVyIG1ldGhvZCBsb2NrcyBpdCBhZ2Fpbi4KKyAgU3ltYm9sIHN5bWJvbCA9IGJ1aWxkZXJfLT5GaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcygKKyAgICBvcHRpb25zLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpKTsKKyAgaWYgKCFzeW1ib2wuSXNOdWxsKCkgJiYgc3ltYm9sLnR5cGUgPT0gU3ltYm9sOjpNRVNTQUdFKSB7CisgICAgb3B0aW9uc19kZXNjcmlwdG9yID0gc3ltYm9sLmRlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgLy8gVGhlIG9wdGlvbnMgbWVzc2FnZSdzIGRlc2NyaXB0b3Igd2FzIG5vdCBpbiB0aGUgYnVpbGRlcidzIHBvb2wsIHNvIHVzZQorICAgIC8vIHRoZSBzdGFuZGFyZCB2ZXJzaW9uIGZyb20gdGhlIGdlbmVyYXRlZCBwb29sLiBXZSdyZSBub3QgaG9sZGluZyB0aGUKKyAgICAvLyBnZW5lcmF0ZWQgcG9vbCdzIG11dGV4LCBzbyB3ZSBjYW4gc2VhcmNoIGl0IHRoZSBzdHJhaWdodGZvcndhcmQgd2F5LgorICAgIG9wdGlvbnNfZGVzY3JpcHRvciA9IG9wdGlvbnMtPkdldERlc2NyaXB0b3IoKTsKKyAgfQorICBHT09HTEVfQ0hFQ0sob3B0aW9uc19kZXNjcmlwdG9yKTsKKworICAvLyBXZSBpdGVyYXRlIG92ZXIgdGhlIG5hbWUgcGFydHMgdG8gZHJpbGwgaW50byB0aGUgc3VibWVzc2FnZXMgdW50aWwgd2UgZmluZAorICAvLyB0aGUgbGVhZiBmaWVsZCBmb3IgdGhlIG9wdGlvbi4gQXMgd2UgZHJpbGwgZG93biB3ZSByZW1lbWJlciB0aGUgY3VycmVudAorICAvLyBzdWJtZXNzYWdlJ3MgZGVzY3JpcHRvciBpbiB8ZGVzY3JpcHRvcnwgYW5kIHRoZSBuZXh0IGZpZWxkIGluIHRoYXQKKyAgLy8gc3VibWVzc2FnZSBpbiB8ZmllbGR8LiBXZSBhbHNvIHRyYWNrIHRoZSBmaWVsZHMgd2UncmUgZHJpbGxpbmcgZG93bgorICAvLyB0aHJvdWdoIGluIHxpbnRlcm1lZGlhdGVfZmllbGRzfC4gQXMgd2UgZ28sIHdlIHJlY29uc3RydWN0IHRoZSBmdWxsIG9wdGlvbgorICAvLyBuYW1lIGluIHxkZWJ1Z19tc2dfbmFtZXwsIGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnZXMuCisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBvcHRpb25zX2Rlc2NyaXB0b3I7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBOVUxMOworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gaW50ZXJtZWRpYXRlX2ZpZWxkczsKKyAgc3RyaW5nIGRlYnVnX21zZ19uYW1lID0gIiI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmludGVycHJldGVkX29wdGlvbl8tPm5hbWVfc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBzdHJpbmcmIG5hbWVfcGFydCA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmFtZShpKS5uYW1lX3BhcnQoKTsKKyAgICBpZiAoZGVidWdfbXNnX25hbWUuc2l6ZSgpID4gMCkgeworICAgICAgZGVidWdfbXNnX25hbWUgKz0gIi4iOworICAgIH0KKyAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5uYW1lKGkpLmlzX2V4dGVuc2lvbigpKSB7CisgICAgICBkZWJ1Z19tc2dfbmFtZSArPSAiKCIgKyBuYW1lX3BhcnQgKyAiKSI7CisgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBleHRlbnNpb24ncyBkZXNjcmlwdG9yIGFzIGFuIGV4dGVuc2lvbiBpbiB0aGUgYnVpbGRlcidzCisgICAgICAvLyBwb29sLiBOb3RlIHRoYXQgd2UgdXNlIERlc2NyaXB0b3JCdWlsZGVyOjpMb29rdXBTeW1ib2woKSwgbm90CisgICAgICAvLyBEZXNjcmlwdG9yUG9vbDo6RmluZEV4dGVuc2lvbkJ5TmFtZSgpLCBmb3IgdHdvIHJlYXNvbnM6IDEpIEl0IGFsbG93cworICAgICAgLy8gcmVsYXRpdmUgbG9va3VwcywgYW5kIDIpIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBob2xkaW5nIHRoZSBwb29sJ3MKKyAgICAgIC8vIG11dGV4LCBhbmQgdGhlIGxhdHRlciBtZXRob2QgbG9ja3MgaXQgYWdhaW4uCisgICAgICBTeW1ib2wgc3ltYm9sID0gYnVpbGRlcl8tPkxvb2t1cFN5bWJvbChuYW1lX3BhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zX3RvX2ludGVycHJldF8tPm5hbWVfc2NvcGUpOworICAgICAgaWYgKCFzeW1ib2wuSXNOdWxsKCkgJiYgc3ltYm9sLnR5cGUgPT0gU3ltYm9sOjpGSUVMRCkgeworICAgICAgICBmaWVsZCA9IHN5bWJvbC5maWVsZF9kZXNjcmlwdG9yOworICAgICAgfQorICAgICAgLy8gSWYgd2UgZG9uJ3QgZmluZCB0aGUgZmllbGQgdGhlbiB0aGUgZmllbGQncyBkZXNjcmlwdG9yIHdhcyBub3QgaW4gdGhlCisgICAgICAvLyBidWlsZGVyJ3MgcG9vbCwgYnV0IHRoZXJlJ3Mgbm8gcG9pbnQgaW4gbG9va2luZyBpbiB0aGUgZ2VuZXJhdGVkCisgICAgICAvLyBwb29sLiBXZSByZXF1aXJlIHRoYXQgeW91IGltcG9ydCB0aGUgZmlsZSB0aGF0IGRlZmluZXMgYW55IGV4dGVuc2lvbnMKKyAgICAgIC8vIHlvdSB1c2UsIHNvIHRoZXkgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBidWlsZGVyJ3MgcG9vbC4KKyAgICB9IGVsc2UgeworICAgICAgZGVidWdfbXNnX25hbWUgKz0gbmFtZV9wYXJ0OworICAgICAgLy8gU2VhcmNoIGZvciB0aGUgZmllbGQncyBkZXNjcmlwdG9yIGFzIGEgcmVndWxhciBmaWVsZC4KKyAgICAgIGZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKG5hbWVfcGFydCk7CisgICAgfQorCisgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICAgIGlmIChnZXRfYWxsb3dfdW5rbm93bihidWlsZGVyXy0+cG9vbF8pKSB7CisgICAgICAgIC8vIFdlIGNhbid0IGZpbmQgdGhlIG9wdGlvbiwgYnV0IEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpIGlzIGVuYWJsZWQsCisgICAgICAgIC8vIHNvIHdlIHdpbGwganVzdCBsZWF2ZSBpdCBhcyB1bmludGVycHJldGVkLgorICAgICAgICBBZGRXaXRob3V0SW50ZXJwcmV0aW5nKCp1bmludGVycHJldGVkX29wdGlvbl8sIG9wdGlvbnMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBZGROYW1lRXJyb3IoIk9wdGlvbiBcIiIgKyBkZWJ1Z19tc2dfbmFtZSArICJcIiB1bmtub3duLiIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpICE9IGRlc2NyaXB0b3IpIHsKKyAgICAgIGlmIChnZXRfaXNfcGxhY2Vob2xkZXIoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgICAgICAvLyBUaGUgZmllbGQgaXMgYW4gZXh0ZW5zaW9uIG9mIGEgcGxhY2Vob2xkZXIgdHlwZSwgc28gd2UgY2FuJ3QKKyAgICAgICAgLy8gcmVsaWFibHkgdmVyaWZ5IHdoZXRoZXIgaXQgaXMgYSB2YWxpZCBleHRlbnNpb24gdG8gdXNlIGhlcmUgKGUuZy4KKyAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBpZiBpdCBpcyBhbiBleHRlbnNpb24gb2YgdGhlIGNvcnJlY3QgKk9wdGlvbnMgbWVzc2FnZSwKKyAgICAgICAgLy8gb3IgaWYgaXQgaGFzIGEgdmFsaWQgZmllbGQgbnVtYmVyLCBldGMuKS4gIEp1c3QgbGVhdmUgaXQgYXMKKyAgICAgICAgLy8gdW5pbnRlcnByZXRlZCBpbnN0ZWFkLgorICAgICAgICBBZGRXaXRob3V0SW50ZXJwcmV0aW5nKCp1bmludGVycHJldGVkX29wdGlvbl8sIG9wdGlvbnMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmLCBkdWUgdG8gc29tZSBpbnNhbmUgbWlzY29uZmlndXJhdGlvbiBvZiB0aGUKKyAgICAgICAgLy8gcG9vbHMsIHdlIGZpbmQgdGhlIG9wdGlvbnMgbWVzc2FnZSBpbiBvbmUgcG9vbCBidXQgdGhlIGZpZWxkIGluCisgICAgICAgIC8vIGFub3RoZXIuIFRoaXMgd291bGQgcHJvYmFibHkgaW1wbHkgYSBoZWZ0eSBidWcgc29tZXdoZXJlLgorICAgICAgICByZXR1cm4gQWRkTmFtZUVycm9yKCJPcHRpb24gZmllbGQgXCIiICsgZGVidWdfbXNnX25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBpcyBub3QgYSBmaWVsZCBvciBleHRlbnNpb24gb2YgbWVzc2FnZSBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPm5hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICByZXR1cm4gQWRkTmFtZUVycm9yKCJPcHRpb24gZmllbGQgXCIiICsgZGVidWdfbXNnX25hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaXMgcmVwZWF0ZWQuIFJlcGVhdGVkIG9wdGlvbnMgYXJlIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQuIik7CisgICAgfSBlbHNlIGlmIChpIDwgdW5pbnRlcnByZXRlZF9vcHRpb25fLT5uYW1lX3NpemUoKSAtIDEpIHsKKyAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgICByZXR1cm4gQWRkTmFtZUVycm9yKCJPcHRpb24gXCIiICsgIGRlYnVnX21zZ19uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaXMgYW4gYXRvbWljIHR5cGUsIG5vdCBhIG1lc3NhZ2UuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBEcmlsbCBkb3duIGludG8gdGhlIHN1Ym1lc3NhZ2UuCisgICAgICAgIGludGVybWVkaWF0ZV9maWVsZHMucHVzaF9iYWNrKGZpZWxkKTsKKyAgICAgICAgZGVzY3JpcHRvciA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBXZSd2ZSBmb3VuZCB0aGUgbGVhZiBmaWVsZC4gTm93IHdlIHVzZSBVbmtub3duRmllbGRTZXRzIHRvIHNldCBpdHMgdmFsdWUKKyAgLy8gb24gdGhlIG9wdGlvbnMgbWVzc2FnZS4gV2UgZG8gc28gYmVjYXVzZSB0aGUgbWVzc2FnZSBtYXkgbm90IHlldCBrbm93CisgIC8vIGFib3V0IGl0cyBleHRlbnNpb24gZmllbGRzLCBzbyB3ZSBtYXkgbm90IGJlIGFibGUgdG8gc2V0IHRoZSBmaWVsZHMKKyAgLy8gZGlyZWN0bHkuIEJ1dCB0aGUgVW5rbm93bkZpZWxkU2V0cyB3aWxsIHNlcmlhbGl6ZSB0byB0aGUgc2FtZSB3aXJlLWZvcm1hdAorICAvLyBtZXNzYWdlLCBzbyByZWFkaW5nIHRoYXQgbWVzc2FnZSBiYWNrIGluIG9uY2UgdGhlIGV4dGVuc2lvbiBmaWVsZHMgYXJlCisgIC8vIGtub3duIHdpbGwgcG9wdWxhdGUgdGhlbSBjb3JyZWN0bHkuCisKKyAgLy8gRmlyc3Qgc2VlIGlmIHRoZSBvcHRpb24gaXMgYWxyZWFkeSBzZXQuCisgIGlmICghRXhhbWluZUlmT3B0aW9uSXNTZXQoCisgICAgICAgICAgaW50ZXJtZWRpYXRlX2ZpZWxkcy5iZWdpbigpLAorICAgICAgICAgIGludGVybWVkaWF0ZV9maWVsZHMuZW5kKCksCisgICAgICAgICAgZmllbGQsIGRlYnVnX21zZ19uYW1lLAorICAgICAgICAgIG9wdGlvbnMtPkdldFJlZmxlY3Rpb24oKS0+R2V0VW5rbm93bkZpZWxkcygqb3B0aW9ucykpKSB7CisgICAgcmV0dXJuIGZhbHNlOyAgLy8gRXhhbWluZUlmT3B0aW9uSXNTZXQoKSBhbHJlYWR5IGFkZGVkIHRoZSBlcnJvci4KKyAgfQorCisKKyAgLy8gRmlyc3Qgc2V0IHRoZSB2YWx1ZSBvbiB0aGUgVW5rbm93bkZpZWxkU2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgIC8vIGlubmVybW9zdCBtZXNzYWdlLgorICBzY29wZWRfcHRyPFVua25vd25GaWVsZFNldD4gdW5rbm93bl9maWVsZHMobmV3IFVua25vd25GaWVsZFNldCgpKTsKKyAgaWYgKCFTZXRPcHRpb25WYWx1ZShmaWVsZCwgdW5rbm93bl9maWVsZHMuZ2V0KCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOyAgLy8gU2V0T3B0aW9uVmFsdWUoKSBhbHJlYWR5IGFkZGVkIHRoZSBlcnJvci4KKyAgfQorCisgIC8vIE5vdyB3cmFwIHRoZSBVbmtub3duRmllbGRTZXQgd2l0aCBVbmtub3duRmllbGRTZXRzIGNvcnJlc3BvbmRpbmcgdG8gYWxsCisgIC8vIHRoZSBpbnRlcm1lZGlhdGUgbWVzc2FnZXMuCisgIGZvciAodmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+OjpyZXZlcnNlX2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgICAgICBpbnRlcm1lZGlhdGVfZmllbGRzLnJiZWdpbigpOworICAgICAgIGl0ZXIgIT0gaW50ZXJtZWRpYXRlX2ZpZWxkcy5yZW5kKCk7ICsraXRlcikgeworICAgIHNjb3BlZF9wdHI8VW5rbm93bkZpZWxkU2V0PiBwYXJlbnRfdW5rbm93bl9maWVsZHMobmV3IFVua25vd25GaWVsZFNldCgpKTsKKyAgICBzd2l0Y2ggKCgqaXRlciktPnR5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRTogeworICAgICAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHN0cigKKyAgICAgICAgICAgIHBhcmVudF91bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKCgqaXRlciktPm51bWJlcigpKSk7CisgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXQoJm91dHN0cik7CisgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygqdW5rbm93bl9maWVsZHMsICZvdXQpOworICAgICAgICBHT09HTEVfQ0hFQ0soIW91dC5IYWRFcnJvcigpKQorICAgICAgICAgICAgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZSB3aGlsZSBzZXJpYWxpemluZyBvcHRpb24gc3VibWVzc2FnZSAiCisgICAgICAgICAgICA8PCBkZWJ1Z19tc2dfbmFtZSA8PCAiXCIuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOiB7CisgICAgICAgICBwYXJlbnRfdW5rbm93bl9maWVsZHMtPkFkZEdyb3VwKCgqaXRlciktPm51bWJlcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5NZXJnZUZyb20oKnVua25vd25fZmllbGRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbnZhbGlkIHdpcmUgdHlwZSBmb3IgQ1BQVFlQRV9NRVNTQUdFOiAiCisgICAgICAgICAgICAgICAgICAgPDwgKCppdGVyKS0+dHlwZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVua25vd25fZmllbGRzLnJlc2V0KHBhcmVudF91bmtub3duX2ZpZWxkcy5yZWxlYXNlKCkpOworICB9CisKKyAgLy8gTm93IG1lcmdlIHRoZSBVbmtub3duRmllbGRTZXQgY29ycmVzcG9uZGluZyB0byB0aGUgdG9wLWxldmVsIG1lc3NhZ2UgaW50bworICAvLyB0aGUgb3B0aW9ucyBtZXNzYWdlLgorICBvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKG9wdGlvbnMpLT5NZXJnZUZyb20oCisgICAgICAqdW5rbm93bl9maWVsZHMpOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6QWRkV2l0aG91dEludGVycHJldGluZygKKyAgICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbiwgTWVzc2FnZSogb3B0aW9ucykgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICBvcHRpb25zLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgidW5pbnRlcnByZXRlZF9vcHRpb24iKTsKKyAgR09PR0xFX0NIRUNLKGZpZWxkICE9IE5VTEwpOworCisgIG9wdGlvbnMtPkdldFJlZmxlY3Rpb24oKS0+QWRkTWVzc2FnZShvcHRpb25zLCBmaWVsZCkKKyAgICAtPkNvcHlGcm9tKHVuaW50ZXJwcmV0ZWRfb3B0aW9uKTsKK30KKworYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OkV4YW1pbmVJZk9wdGlvbklzU2V0KAorICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaW50ZXJtZWRpYXRlX2ZpZWxkc19pdGVyLAorICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaW50ZXJtZWRpYXRlX2ZpZWxkc19lbmQsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBpbm5lcm1vc3RfZmllbGQsIGNvbnN0IHN0cmluZyYgZGVidWdfbXNnX25hbWUsCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcykgeworICAvLyBXZSBkbyBsaW5lYXIgc2VhcmNoZXMgb2YgdGhlIFVua25vd25GaWVsZFNldCBhbmQgaXRzIHN1Yi1ncm91cHMuICBUaGlzCisgIC8vIHNob3VsZCBiZSBmaW5lIHNpbmNlIGl0J3MgdW5saWtlbHkgdGhhdCBhbnkgb25lIG9wdGlvbnMgc3RydWN0dXJlIHdpbGwKKyAgLy8gY29udGFpbiBtb3JlIHRoYW4gYSBoYW5kZnVsIG9mIG9wdGlvbnMuCisKKyAgaWYgKGludGVybWVkaWF0ZV9maWVsZHNfaXRlciA9PSBpbnRlcm1lZGlhdGVfZmllbGRzX2VuZCkgeworICAgIC8vIFdlJ3JlIGF0IHRoZSBpbm5lcm1vc3Qgc3VibWVzc2FnZS4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgaWYgKHVua25vd25fZmllbGRzLmZpZWxkKGkpLm51bWJlcigpID09IGlubmVybW9zdF9maWVsZC0+bnVtYmVyKCkpIHsKKyAgICAgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigiT3B0aW9uIFwiIiArIGRlYnVnX21zZ19uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgd2FzIGFscmVhZHkgc2V0LiIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKHVua25vd25fZmllbGRzLmZpZWxkKGkpLm51bWJlcigpID09CisgICAgICAgICgqaW50ZXJtZWRpYXRlX2ZpZWxkc19pdGVyKS0+bnVtYmVyKCkpIHsKKyAgICAgIGNvbnN0IFVua25vd25GaWVsZCogdW5rbm93bl9maWVsZCA9ICZ1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKyAgICAgIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlID0gKCppbnRlcm1lZGlhdGVfZmllbGRzX2l0ZXIpLT50eXBlKCk7CisgICAgICAvLyBSZWN1cnNlIGludG8gdGhlIG5leHQgc3VibWVzc2FnZS4KKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOgorICAgICAgICAgIGlmICh1bmtub3duX2ZpZWxkLT50eXBlKCkgPT0gVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgICAgIFVua25vd25GaWVsZFNldCBpbnRlcm1lZGlhdGVfdW5rbm93bl9maWVsZHM7CisgICAgICAgICAgICBpZiAoaW50ZXJtZWRpYXRlX3Vua25vd25fZmllbGRzLlBhcnNlRnJvbVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9maWVsZC0+bGVuZ3RoX2RlbGltaXRlZCgpKSAmJgorICAgICAgICAgICAgICAgICFFeGFtaW5lSWZPcHRpb25Jc1NldChpbnRlcm1lZGlhdGVfZmllbGRzX2l0ZXIgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfZmllbGRzX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJtb3N0X2ZpZWxkLCBkZWJ1Z19tc2dfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX3Vua25vd25fZmllbGRzKSkgeworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBFcnJvciBhbHJlYWR5IGFkZGVkLgorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKKyAgICAgICAgICBpZiAodW5rbm93bl9maWVsZC0+dHlwZSgpID09IFVua25vd25GaWVsZDo6VFlQRV9HUk9VUCkgeworICAgICAgICAgICAgaWYgKCFFeGFtaW5lSWZPcHRpb25Jc1NldChpbnRlcm1lZGlhdGVfZmllbGRzX2l0ZXIgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfZmllbGRzX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJtb3N0X2ZpZWxkLCBkZWJ1Z19tc2dfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9maWVsZC0+Z3JvdXAoKSkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gRXJyb3IgYWxyZWFkeSBhZGRlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiSW52YWxpZCB3aXJlIHR5cGUgZm9yIENQUFRZUEVfTUVTU0FHRTogIiA8PCB0eXBlOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpTZXRPcHRpb25WYWx1ZSgKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG9wdGlvbl9maWVsZCwKKyAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7CisgIC8vIFdlIHN3aXRjaCBvbiB0aGUgQ3BwVHlwZSB0byB2YWxpZGF0ZS4KKyAgc3dpdGNoIChvcHRpb25fZmllbGQtPmNwcF90eXBlKCkpIHsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgorICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7CisgICAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpID4KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2ND4oa2ludDMybWF4KSkgeworICAgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIGludDMyIG9wdGlvbiBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU2V0SW50MzIob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+dHlwZSgpLCB1bmtub3duX2ZpZWxkcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmVnYXRpdmVfaW50X3ZhbHVlKCkgPAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjQ+KGtpbnQzMm1pbikpIHsKKyAgICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgb3V0IG9mIHJhbmdlIGZvciBpbnQzMiBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNldEludDMyKG9wdGlvbl9maWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPnR5cGUoKSwgdW5rbm93bl9maWVsZHMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBpbnRlZ2VyIGZvciBpbnQzMiBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCkgPgorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0PihraW50NjRtYXgpKSB7CisgICAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG91dCBvZiByYW5nZSBmb3IgaW50NjQgb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTZXRJbnQ2NChvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT50eXBlKCksIHVua25vd25fZmllbGRzKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICBTZXRJbnQ2NChvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl8tPm5lZ2F0aXZlX2ludF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPnR5cGUoKSwgdW5rbm93bl9maWVsZHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgaW50ZWdlciBmb3IgaW50NjQgb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKSA+IGt1aW50MzJtYXgpIHsKKyAgICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgb3V0IG9mIHJhbmdlIGZvciB1aW50MzIgb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5uYW1lKCkgKyAiXCIuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgU2V0VUludDMyKG9wdGlvbl9maWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+dHlwZSgpLCB1bmtub3duX2ZpZWxkcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGZvciB1aW50MzIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIFwiIiArIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICBTZXRVSW50NjQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPnR5cGUoKSwgdW5rbm93bl9maWVsZHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGludGVnZXIgZm9yIHVpbnQ2NCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gXCIiICsgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgIGZsb2F0IHZhbHVlOworICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX2RvdWJsZV92YWx1ZSgpKSB7CisgICAgICAgIHZhbHVlID0gdW5pbnRlcnByZXRlZF9vcHRpb25fLT5kb3VibGVfdmFsdWUoKTsKKyAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgdmFsdWUgPSB1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpOworICAgICAgfSBlbHNlIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgICB2YWx1ZSA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmVnYXRpdmVfaW50X3ZhbHVlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBudW1iZXIgZm9yIGZsb2F0IG9wdGlvbiBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgfQorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVuY29kZUZsb2F0KHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKKyAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19kb3VibGVfdmFsdWUoKSkgeworICAgICAgICB2YWx1ZSA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+ZG91YmxlX3ZhbHVlKCk7CisgICAgICB9IGVsc2UgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7CisgICAgICAgIHZhbHVlID0gdW5pbnRlcnByZXRlZF9vcHRpb25fLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKKyAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgICAgdmFsdWUgPSB1bmludGVycHJldGVkX29wdGlvbl8tPm5lZ2F0aXZlX2ludF92YWx1ZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgbnVtYmVyIGZvciBkb3VibGUgb3B0aW9uIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQ2NChvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW5jb2RlRG91YmxlKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgdWludDY0IHZhbHVlOworICAgICAgaWYgKCF1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKKyAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgaWRlbnRpZmllciBmb3IgYm9vbGVhbiBvcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmlkZW50aWZpZXJfdmFsdWUoKSA9PSAidHJ1ZSIpIHsKKyAgICAgICAgdmFsdWUgPSAxOworICAgICAgfSBlbHNlIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmlkZW50aWZpZXJfdmFsdWUoKSA9PSAiZmFsc2UiKSB7CisgICAgICAgIHZhbHVlID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBtdXN0IGJlIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIiBmb3IgYm9vbGVhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gXCIiICsgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwgdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOiB7CisgICAgICBpZiAoIXVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX2lkZW50aWZpZXJfdmFsdWUoKSkgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBpZGVudGlmaWVyIGZvciBlbnVtLXZhbHVlZCBvcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgIH0KKyAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUgPSBvcHRpb25fZmllbGQtPmVudW1fdHlwZSgpOworICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZV9uYW1lID0gdW5pbnRlcnByZXRlZF9vcHRpb25fLT5pZGVudGlmaWVyX3ZhbHVlKCk7CisgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0gTlVMTDsKKworICAgICAgaWYgKGVudW1fdHlwZS0+ZmlsZSgpLT5wb29sKCkgIT0gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkpIHsKKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBlbnVtIHZhbHVlJ3MgZnVsbHktcXVhbGlmaWVkIG5hbWUgaXMgYSBzaWJsaW5nIG9mIHRoZQorICAgICAgICAvLyBlbnVtJ3MgbmFtZSwgbm90IGEgY2hpbGQgb2YgaXQuCisgICAgICAgIHN0cmluZyBmdWxseV9xdWFsaWZpZWRfbmFtZSA9IGVudW1fdHlwZS0+ZnVsbF9uYW1lKCk7CisgICAgICAgIGZ1bGx5X3F1YWxpZmllZF9uYW1lLnJlc2l6ZShmdWxseV9xdWFsaWZpZWRfbmFtZS5zaXplKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bV90eXBlLT5uYW1lKCkuc2l6ZSgpKTsKKyAgICAgICAgZnVsbHlfcXVhbGlmaWVkX25hbWUgKz0gdmFsdWVfbmFtZTsKKworICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBlbnVtIHZhbHVlJ3MgZGVzY3JpcHRvciBpbiB0aGUgYnVpbGRlcidzIHBvb2wuIE5vdGUKKyAgICAgICAgLy8gdGhhdCB3ZSB1c2UgRGVzY3JpcHRvckJ1aWxkZXI6OkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKCksIG5vdAorICAgICAgICAvLyBEZXNjcmlwdG9yUG9vbDo6RmluZEVudW1WYWx1ZUJ5TmFtZSgpIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBob2xkaW5nCisgICAgICAgIC8vIHRoZSBwb29sJ3MgbXV0ZXgsIGFuZCB0aGUgbGF0dGVyIG1ldGhvZCBsb2NrcyBpdCBhZ2Fpbi4KKyAgICAgICAgU3ltYm9sIHN5bWJvbCA9CisgICAgICAgICAgYnVpbGRlcl8tPkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKGZ1bGx5X3F1YWxpZmllZF9uYW1lKTsKKyAgICAgICAgaWYgKCFzeW1ib2wuSXNOdWxsKCkgJiYgc3ltYm9sLnR5cGUgPT0gU3ltYm9sOjpFTlVNX1ZBTFVFKSB7CisgICAgICAgICAgaWYgKHN5bWJvbC5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3ItPnR5cGUoKSAhPSBlbnVtX3R5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJFbnVtIHR5cGUgXCIiICsgZW51bV90eXBlLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgIlwiIGhhcyBubyB2YWx1ZSBuYW1lZCBcIiIgKyB2YWx1ZV9uYW1lICsgIlwiIGZvciBvcHRpb24gXCIiICsKKyAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAiXCIuIFRoaXMgYXBwZWFycyB0byBiZSBhIHZhbHVlIGZyb20gYSBzaWJsaW5nIHR5cGUuIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudW1fdmFsdWUgPSBzeW1ib2wuZW51bV92YWx1ZV9kZXNjcmlwdG9yOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGVudW0gdHlwZSBpcyBpbiB0aGUgZ2VuZXJhdGVkIHBvb2wsIHNvIHdlIGNhbiBzZWFyY2ggZm9yIHRoZQorICAgICAgICAvLyB2YWx1ZSB0aGVyZS4KKyAgICAgICAgZW51bV92YWx1ZSA9IGVudW1fdHlwZS0+RmluZFZhbHVlQnlOYW1lKHZhbHVlX25hbWUpOworICAgICAgfQorCisgICAgICBpZiAoZW51bV92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJFbnVtIHR5cGUgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5lbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIHZhbHVlIG5hbWVkIFwiIiArIHZhbHVlX25hbWUgKyAiXCIgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiBcIiIgKyBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2lnbi1leHRlbnNpb24gaXMgbm90IGEgcHJvYmxlbSwgc2luY2Ugd2UgY2FzdCBkaXJlY3RseSBmcm9tIGludDMyIHRvCisgICAgICAgIC8vIHVpbnQ2NCwgd2l0aG91dCBmaXJzdCBnb2luZyB0aHJvdWdoIHVpbnQzMi4KKyAgICAgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2ND4oc3RhdGljX2Nhc3Q8aW50NjQ+KGVudW1fdmFsdWUtPm51bWJlcigpKSkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgaWYgKCF1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19zdHJpbmdfdmFsdWUoKSkgeworICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBxdW90ZWQgc3RyaW5nIGZvciBzdHJpbmcgb3B0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICB9CisgICAgICAvLyBUaGUgc3RyaW5nIGhhcyBhbHJlYWR5IGJlZW4gdW5xdW90ZWQgYW5kIHVuZXNjYXBlZCBieSB0aGUgcGFyc2VyLgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZExlbmd0aERlbGltaXRlZChvcHRpb25fZmllbGQtPm51bWJlcigpLAorICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+c3RyaW5nX3ZhbHVlKCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgaWYgKCFTZXRBZ2dyZWdhdGVPcHRpb24ob3B0aW9uX2ZpZWxkLCB1bmtub3duX2ZpZWxkcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpBZ2dyZWdhdGVPcHRpb25GaW5kZXIKKyAgICA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpGaW5kZXIgeworIHB1YmxpYzoKKyAgRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXJfOworCisgIHZpcnR1YWwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uKAorICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgICAgYXNzZXJ0X211dGV4X2hlbGQoYnVpbGRlcl8tPnBvb2xfKTsKKyAgICBTeW1ib2wgcmVzdWx0ID0gYnVpbGRlcl8tPkxvb2t1cFN5bWJvbE5vUGxhY2Vob2xkZXIoCisgICAgICAgIG5hbWUsIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkpOworICAgIGlmIChyZXN1bHQudHlwZSA9PSBTeW1ib2w6OkZJRUxEICYmCisgICAgICAgIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yLT5pc19leHRlbnNpb24oKSkgeworICAgICAgcmV0dXJuIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KK307CisKKy8vIEEgY3VzdG9tIGVycm9yIGNvbGxlY3RvciB0byByZWNvcmQgYW55IHRleHQtZm9ybWF0IHBhcnNpbmcgZXJyb3JzCituYW1lc3BhY2UgeworY2xhc3MgQWdncmVnYXRlRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgaW86OkVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIHN0cmluZyBlcnJvcl87CisKKyAgdmlydHVhbCB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBpZiAoIWVycm9yXy5lbXB0eSgpKSB7CisgICAgICBlcnJvcl8gKz0gIjsgIjsKKyAgICB9CisgICAgZXJyb3JfICs9IG1lc3NhZ2U7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZyhpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgLy8gSWdub3JlIHdhcm5pbmdzCisgIH0KK307Cit9CisKKy8vIFdlIGNvbnN0cnVjdCBhIGR5bmFtaWMgbWVzc2FnZSBvZiB0aGUgdHlwZSBjb3JyZXNwb25kaW5nIHRvCisvLyBvcHRpb25fZmllbGQsIHBhcnNlIHRoZSBzdXBwbGllZCB0ZXh0LWZvcm1hdCBzdHJpbmcgaW50byB0aGlzCisvLyBtZXNzYWdlLCBhbmQgc2VyaWFsaXplIHRoZSByZXN1bHRpbmcgbWVzc2FnZSB0byBwcm9kdWNlIHRoZSB2YWx1ZS4KK2Jvb2wgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpTZXRBZ2dyZWdhdGVPcHRpb24oCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBvcHRpb25fZmllbGQsCisgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICBpZiAoIXVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7CisgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIk9wdGlvbiBcIiIgKyBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaXMgYSBtZXNzYWdlLiBUbyBzZXQgdGhlIGVudGlyZSBtZXNzYWdlLCB1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJzeW50YXggbGlrZSBcIiIgKyBvcHRpb25fZmllbGQtPm5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIiA9IHsgPHByb3RvIHRleHQgZm9ybWF0PiB9XCIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVG8gc2V0IGZpZWxkcyB3aXRoaW4gaXQsIHVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInN5bnRheCBsaWtlIFwiIiArIG9wdGlvbl9maWVsZC0+bmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiLmZvbyA9IHZhbHVlXCIuIik7CisgIH0KKworICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlID0gb3B0aW9uX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKKyAgc2NvcGVkX3B0cjxNZXNzYWdlPiBkeW5hbWljKGR5bmFtaWNfZmFjdG9yeV8uR2V0UHJvdG90eXBlKHR5cGUpLT5OZXcoKSk7CisgIEdPT0dMRV9DSEVDSyhkeW5hbWljLmdldCgpICE9IE5VTEwpCisgICAgICA8PCAiQ291bGQgbm90IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiAiIDw8IG9wdGlvbl9maWVsZC0+RGVidWdTdHJpbmcoKTsKKworICBBZ2dyZWdhdGVFcnJvckNvbGxlY3RvciBjb2xsZWN0b3I7CisgIEFnZ3JlZ2F0ZU9wdGlvbkZpbmRlciBmaW5kZXI7CisgIGZpbmRlci5idWlsZGVyXyA9IGJ1aWxkZXJfOworICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOworICBwYXJzZXIuUmVjb3JkRXJyb3JzVG8oJmNvbGxlY3Rvcik7CisgIHBhcnNlci5TZXRGaW5kZXIoJmZpbmRlcik7CisgIGlmICghcGFyc2VyLlBhcnNlRnJvbVN0cmluZyh1bmludGVycHJldGVkX29wdGlvbl8tPmFnZ3JlZ2F0ZV92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYy5nZXQoKSkpIHsKKyAgICBBZGRWYWx1ZUVycm9yKCJFcnJvciB3aGlsZSBwYXJzaW5nIG9wdGlvbiB2YWx1ZSBmb3IgXCIiICsKKyAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+bmFtZSgpICsgIlwiOiAiICsgY29sbGVjdG9yLmVycm9yXyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIHN0cmluZyBzZXJpYWw7CisgICAgZHluYW1pYy0+U2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbCk7ICAvLyBOZXZlciBmYWlscworICAgIHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwgc2VyaWFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6U2V0SW50MzIoaW50IG51bWJlciwgaW50MzIgdmFsdWUsCisgICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzI6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwKKyAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0PihzdGF0aWNfY2FzdDxpbnQ2ND4odmFsdWUpKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIobnVtYmVyLCBzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMjoKKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQobnVtYmVyLAorICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlMzIodmFsdWUpKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbnZhbGlkIHdpcmUgdHlwZSBmb3IgQ1BQVFlQRV9JTlQzMjogIiA8PCB0eXBlOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OlNldEludDY0KGludCBudW1iZXIsIGludDY0IHZhbHVlLAorICAgIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlLCBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0OgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChudW1iZXIsIHN0YXRpY19jYXN0PHVpbnQ2ND4odmFsdWUpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQ2NChudW1iZXIsIHN0YXRpY19jYXN0PHVpbnQ2ND4odmFsdWUpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0OgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChudW1iZXIsCisgICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpaaWdaYWdFbmNvZGU2NCh2YWx1ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkludmFsaWQgd2lyZSB0eXBlIGZvciBDUFBUWVBFX0lOVDY0OiAiIDw8IHR5cGU7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6U2V0VUludDMyKGludCBudW1iZXIsIHVpbnQzMiB2YWx1ZSwKKyAgICBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSwgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzI6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwgc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyOgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIobnVtYmVyLCBzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlKSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiSW52YWxpZCB3aXJlIHR5cGUgZm9yIENQUFRZUEVfVUlOVDMyOiAiIDw8IHR5cGU7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6U2V0VUludDY0KGludCBudW1iZXIsIHVpbnQ2NCB2YWx1ZSwKKyAgICBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSwgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQ6CisgICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwgdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgorICAgICAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkNjQobnVtYmVyLCB2YWx1ZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiSW52YWxpZCB3aXJlIHR5cGUgZm9yIENQUFRZUEVfVUlOVDY0OiAiIDw8IHR5cGU7CisgICAgICBicmVhazsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjg3ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMTM2NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGNsYXNzZXMgd2hpY2ggZGVzY3JpYmUgYSB0eXBlIG9mIHByb3RvY29sIG1lc3NhZ2UuCisvLyBZb3UgY2FuIHVzZSBhIG1lc3NhZ2UncyBkZXNjcmlwdG9yIHRvIGxlYXJuIGF0IHJ1bnRpbWUgd2hhdCBmaWVsZHMKKy8vIGl0IGNvbnRhaW5zIGFuZCB3aGF0IHRoZSB0eXBlcyBvZiB0aG9zZSBmaWVsZHMgYXJlLiAgVGhlIE1lc3NhZ2UKKy8vIGludGVyZmFjZSBhbHNvIGFsbG93cyB5b3UgdG8gZHluYW1pY2FsbHkgYWNjZXNzIGFuZCBtb2RpZnkgaW5kaXZpZHVhbAorLy8gZmllbGRzIGJ5IHBhc3NpbmcgdGhlIEZpZWxkRGVzY3JpcHRvciBvZiB0aGUgZmllbGQgeW91IGFyZSBpbnRlcmVzdGVkCisvLyBpbi4KKy8vCisvLyBNb3N0IHVzZXJzIHdpbGwgbm90IGNhcmUgYWJvdXQgZGVzY3JpcHRvcnMsIGJlY2F1c2UgdGhleSB3aWxsIHdyaXRlCisvLyBjb2RlIHNwZWNpZmljIHRvIGNlcnRhaW4gcHJvdG9jb2wgdHlwZXMgYW5kIHdpbGwgc2ltcGx5IHVzZSB0aGUgY2xhc3NlcworLy8gZ2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBjb21waWxlciBkaXJlY3RseS4gIEFkdmFuY2VkIHVzZXJzIHdobyB3YW50CisvLyB0byBvcGVyYXRlIG9uIGFyYml0cmFyeSB0eXBlcyAobm90IGtub3duIGF0IGNvbXBpbGUgdGltZSkgbWF5IHdhbnQgdG8KKy8vIHJlYWQgZGVzY3JpcHRvcnMgaW4gb3JkZXIgdG8gbGVhcm4gYWJvdXQgdGhlIGNvbnRlbnRzIG9mIGEgbWVzc2FnZS4KKy8vIEEgdmVyeSBzbWFsbCBudW1iZXIgb2YgdXNlcnMgd2lsbCB3YW50IHRvIGNvbnN0cnVjdCB0aGVpciBvd24KKy8vIERlc2NyaXB0b3JzLCBlaXRoZXIgYmVjYXVzZSB0aGV5IGFyZSBpbXBsZW1lbnRpbmcgTWVzc2FnZSBtYW51YWxseSBvcgorLy8gYmVjYXVzZSB0aGV5IGFyZSB3cml0aW5nIHNvbWV0aGluZyBsaWtlIHRoZSBwcm90b2NvbCBjb21waWxlci4KKy8vCisvLyBGb3IgYW4gZXhhbXBsZSBvZiBob3cgeW91IG1pZ2h0IHVzZSBkZXNjcmlwdG9ycywgc2VlIHRoZSBjb2RlIGV4YW1wbGUKKy8vIGF0IHRoZSB0b3Agb2YgbWVzc2FnZS5oLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCitjbGFzcyBEZXNjcmlwdG9yOworY2xhc3MgRmllbGREZXNjcmlwdG9yOworY2xhc3MgRW51bURlc2NyaXB0b3I7CitjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yOworY2xhc3MgU2VydmljZURlc2NyaXB0b3I7CitjbGFzcyBNZXRob2REZXNjcmlwdG9yOworY2xhc3MgRmlsZURlc2NyaXB0b3I7CitjbGFzcyBEZXNjcmlwdG9yRGF0YWJhc2U7CitjbGFzcyBEZXNjcmlwdG9yUG9vbDsKKworLy8gRGVmaW5lZCBpbiBkZXNjcmlwdG9yLnByb3RvCitjbGFzcyBEZXNjcmlwdG9yUHJvdG87CitjbGFzcyBGaWVsZERlc2NyaXB0b3JQcm90bzsKK2NsYXNzIEVudW1EZXNjcmlwdG9yUHJvdG87CitjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG87CitjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOworY2xhc3MgTWV0aG9kRGVzY3JpcHRvclByb3RvOworY2xhc3MgRmlsZURlc2NyaXB0b3JQcm90bzsKK2NsYXNzIE1lc3NhZ2VPcHRpb25zOworY2xhc3MgRmllbGRPcHRpb25zOworY2xhc3MgRW51bU9wdGlvbnM7CitjbGFzcyBFbnVtVmFsdWVPcHRpb25zOworY2xhc3MgU2VydmljZU9wdGlvbnM7CitjbGFzcyBNZXRob2RPcHRpb25zOworY2xhc3MgRmlsZU9wdGlvbnM7CitjbGFzcyBVbmludGVycHJldGVkT3B0aW9uOworCisvLyBEZWZpbmVkIGluIG1lc3NhZ2UuaAorY2xhc3MgTWVzc2FnZTsKKworLy8gRGVmaW5lZCBpbiBkZXNjcmlwdG9yLmNjCitjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yVGFibGVzOworCisvLyBEZWZpbmVkIGluIHVua25vd25fZmllbGRfc2V0LmguCitjbGFzcyBVbmtub3duRmllbGQ7CisKKy8vIERlc2NyaWJlcyBhIHR5cGUgb2YgcHJvdG9jb2wgbWVzc2FnZSwgb3IgYSBwYXJ0aWN1bGFyIGdyb3VwIHdpdGhpbiBhCisvLyBtZXNzYWdlLiAgVG8gb2J0YWluIHRoZSBEZXNjcmlwdG9yIGZvciBhIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LCBjYWxsCisvLyBNZXNzYWdlOjpHZXREZXNjcmlwdG9yKCkuICBHZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzIGFsc28gaGF2ZSBhCisvLyBzdGF0aWMgbWV0aG9kIGNhbGxlZCBkZXNjcmlwdG9yKCkgd2hpY2ggcmV0dXJucyB0aGUgdHlwZSdzIGRlc2NyaXB0b3IuCisvLyBVc2UgRGVzY3JpcHRvclBvb2wgdG8gY29uc3RydWN0IHlvdXIgb3duIGRlc2NyaXB0b3JzLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3IgeworIHB1YmxpYzoKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgdHlwZSwgbm90IGluY2x1ZGluZyBpdHMgc2NvcGUuCisgIGNvbnN0IHN0cmluZyYgbmFtZSgpIGNvbnN0OworCisgIC8vIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgbWVzc2FnZSB0eXBlLCBzY29wZSBkZWxpbWl0ZWQgYnkKKyAgLy8gcGVyaW9kcy4gIEZvciBleGFtcGxlLCBtZXNzYWdlIHR5cGUgIkZvbyIgd2hpY2ggaXMgZGVjbGFyZWQgaW4gcGFja2FnZQorICAvLyAiYmFyIiBoYXMgZnVsbCBuYW1lICJiYXIuRm9vIi4gIElmIGEgdHlwZSAiQmF6IiBpcyBuZXN0ZWQgd2l0aGluCisgIC8vIEZvbywgQmF6J3MgZnVsbF9uYW1lIGlzICJiYXIuRm9vLkJheiIuICBUbyBnZXQgb25seSB0aGUgcGFydCB0aGF0CisgIC8vIGNvbWVzIGFmdGVyIHRoZSBsYXN0ICcuJywgdXNlIG5hbWUoKS4KKyAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsKKworICAvLyBJbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIHRoZSBmaWxlIG9yIGNvbnRhaW5pbmcgdHlwZSdzIG1lc3NhZ2UKKyAgLy8gdHlwZSBhcnJheS4KKyAgaW50IGluZGV4KCkgY29uc3Q7CisKKyAgLy8gVGhlIC5wcm90byBmaWxlIGluIHdoaWNoIHRoaXMgbWVzc2FnZSB0eXBlIHdhcyBkZWZpbmVkLiAgTmV2ZXIgTlVMTC4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUoKSBjb25zdDsKKworICAvLyBJZiB0aGlzIERlc2NyaXB0b3IgZGVzY3JpYmVzIGEgbmVzdGVkIHR5cGUsIHRoaXMgcmV0dXJucyB0aGUgdHlwZQorICAvLyBpbiB3aGljaCBpdCBpcyBuZXN0ZWQuICBPdGhlcndpc2UsIHJldHVybnMgTlVMTC4KKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlKCkgY29uc3Q7CisKKyAgLy8gR2V0IG9wdGlvbnMgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUKKyAgLy8gYnkgcGxhY2luZyBsaW5lcyBsaWtlICJvcHRpb24gZm9vID0gMTIzNDsiIGluIHRoZSBtZXNzYWdlIGRlZmluaXRpb24uCisgIC8vIEFsbG93ZWQgb3B0aW9ucyBhcmUgZGVmaW5lZCBieSBNZXNzYWdlT3B0aW9ucyBpbgorICAvLyBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bywgYW5kIGFueSBhdmFpbGFibGUgZXh0ZW5zaW9ucyBvZiB0aGF0CisgIC8vIG1lc3NhZ2UuCisgIGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisKKyAgLy8gV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgRGVzY3JpcHRvciBpbnRvIHRoZSBnaXZlbiBEZXNjcmlwdG9yUHJvdG8uCisgIC8vIFRoZSB0YXJnZXQgRGVzY3JpcHRvclByb3RvIG11c3QgYmUgY2xlYXIgYmVmb3JlIGNhbGxpbmcgdGhpczsgaWYgaXQKKyAgLy8gaXNuJ3QsIHRoZSByZXN1bHQgbWF5IGJlIGdhcmJhZ2UuCisgIHZvaWQgQ29weVRvKERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OworCisgIC8vIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGlzIGRlY3JpcHRvciBpbiBhIGh1bWFuLXJlYWRhYmxlIGZvcm0uIE91dHB1dAorICAvLyB3aWxsIGJlIHN1aXRhYmxlIGZvciByZS1wYXJzaW5nLgorICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKKworICAvLyBGaWVsZCBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFRoZSBudW1iZXIgb2YgZmllbGRzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgorICBpbnQgZmllbGRfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhIGZpZWxkIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgZmllbGRfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQoaW50IGluZGV4KSBjb25zdDsKKworICAvLyBMb29rcyB1cCBhIGZpZWxkIGJ5IGRlY2xhcmVkIHRhZyBudW1iZXIuICBSZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCBmaWVsZAorICAvLyBleGlzdHMuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlOdW1iZXIoaW50IG51bWJlcikgY29uc3Q7CisgIC8vIExvb2tzIHVwIGEgZmllbGQgYnkgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBubyBzdWNoIGZpZWxkIGV4aXN0cy4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAvLyBMb29rcyB1cCBhIGZpZWxkIGJ5IGxvd2VyY2FzZWQgbmFtZSAoYXMgcmV0dXJuZWQgYnkgbG93ZXJjYXNlX25hbWUoKSkuCisgIC8vIFRoaXMgbG9va3VwIG1heSBiZSBhbWJpZ3VvdXMgaWYgbXVsdGlwbGUgZmllbGQgbmFtZXMgZGlmZmVyIG9ubHkgYnkgY2FzZSwKKyAgLy8gaW4gd2hpY2ggY2FzZSB0aGUgZmllbGQgcmV0dXJuZWQgaXMgY2hvc2VuIGFyYml0cmFyaWx5IGZyb20gdGhlIG1hdGNoZXMuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKAorICAgICAgY29uc3Qgc3RyaW5nJiBsb3dlcmNhc2VfbmFtZSkgY29uc3Q7CisKKyAgLy8gTG9va3MgdXAgYSBmaWVsZCBieSBjYW1lbC1jYXNlIG5hbWUgKGFzIHJldHVybmVkIGJ5IGNhbWVsY2FzZV9uYW1lKCkpLgorICAvLyBUaGlzIGxvb2t1cCBtYXkgYmUgYW1iaWd1b3VzIGlmIG11bHRpcGxlIGZpZWxkIG5hbWVzIGRpZmZlciBpbiBhIHdheSB0aGF0CisgIC8vIGxlYWRzIHRoZW0gdG8gaGF2ZSBpZGVudGljYWwgY2FtZWwtY2FzZSBuYW1lcywgaW4gd2hpY2ggY2FzZSB0aGUgZmllbGQKKyAgLy8gcmV0dXJuZWQgaXMgY2hvc2VuIGFyYml0cmFyaWx5IGZyb20gdGhlIG1hdGNoZXMuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKAorICAgICAgY29uc3Qgc3RyaW5nJiBjYW1lbGNhc2VfbmFtZSkgY29uc3Q7CisKKyAgLy8gTmVzdGVkIHR5cGUgc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBUaGUgbnVtYmVyIG9mIG5lc3RlZCB0eXBlcyBpbiB0aGlzIG1lc3NhZ2UgdHlwZS4KKyAgaW50IG5lc3RlZF90eXBlX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYSBuZXN0ZWQgdHlwZSBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8IG5lc3RlZF90eXBlX2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBEZXNjcmlwdG9yKiBuZXN0ZWRfdHlwZShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIExvb2tzIHVwIGEgbmVzdGVkIHR5cGUgYnkgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBubyBzdWNoIG5lc3RlZCB0eXBlCisgIC8vIGV4aXN0cy4KKyAgY29uc3QgRGVzY3JpcHRvciogRmluZE5lc3RlZFR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAvLyBFbnVtIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFRoZSBudW1iZXIgb2YgZW51bSB0eXBlcyBpbiB0aGlzIG1lc3NhZ2UgdHlwZS4KKyAgaW50IGVudW1fdHlwZV9jb3VudCgpIGNvbnN0OworICAvLyBHZXRzIGFuIGVudW0gdHlwZSBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8IGVudW1fdHlwZV9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIExvb2tzIHVwIGFuIGVudW0gdHlwZSBieSBuYW1lLiAgUmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggZW51bSB0eXBlIGV4aXN0cy4KKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIEZpbmRFbnVtVHlwZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIC8vIExvb2tzIHVwIGFuIGVudW0gdmFsdWUgYnkgbmFtZSwgYW1vbmcgYWxsIGVudW0gdHlwZXMgaW4gdGhpcyBtZXNzYWdlLgorICAvLyBSZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMuCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEZpbmRFbnVtVmFsdWVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAvLyBFeHRlbnNpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIEEgcmFuZ2Ugb2YgZmllbGQgbnVtYmVycyB3aGljaCBhcmUgZGVzaWduYXRlZCBmb3IgdGhpcmQtcGFydHkKKyAgLy8gZXh0ZW5zaW9ucy4KKyAgc3RydWN0IEV4dGVuc2lvblJhbmdlIHsKKyAgICBpbnQgc3RhcnQ7ICAvLyBpbmNsdXNpdmUKKyAgICBpbnQgZW5kOyAgICAvLyBleGNsdXNpdmUKKyAgfTsKKworICAvLyBUaGUgbnVtYmVyIG9mIGV4dGVuc2lvbiByYW5nZXMgaW4gdGhpcyBtZXNzYWdlIHR5cGUuCisgIGludCBleHRlbnNpb25fcmFuZ2VfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhbiBleHRlbnNpb24gcmFuZ2UgYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPAorICAvLyBleHRlbnNpb25fcmFuZ2VfY291bnQoKS4gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZAorICAvLyBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IEV4dGVuc2lvblJhbmdlKiBleHRlbnNpb25fcmFuZ2UoaW50IGluZGV4KSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG51bWJlciBpcyBpbiBvbmUgb2YgdGhlIGV4dGVuc2lvbiByYW5nZXMuCisgIGJvb2wgSXNFeHRlbnNpb25OdW1iZXIoaW50IG51bWJlcikgY29uc3Q7CisKKyAgLy8gVGhlIG51bWJlciBvZiBleHRlbnNpb25zIC0tIGV4dGVuZGluZyAqb3RoZXIqIG1lc3NhZ2VzIC0tIHRoYXQgd2VyZQorICAvLyBkZWZpbmVkIG5lc3RlZCB3aXRoaW4gdGhpcyBtZXNzYWdlIHR5cGUncyBzY29wZS4KKyAgaW50IGV4dGVuc2lvbl9jb3VudCgpIGNvbnN0OworICAvLyBHZXQgYW4gZXh0ZW5zaW9uIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgZXh0ZW5zaW9uX2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIExvb2tzIHVwIGEgbmFtZWQgZXh0ZW5zaW9uICh3aGljaCBleHRlbmRzIHNvbWUgKm90aGVyKiBtZXNzYWdlIHR5cGUpCisgIC8vIGRlZmluZWQgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlJ3Mgc2NvcGUuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbkJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIC8vIFNpbWlsYXIgdG8gRmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCksIGJ1dCBmaW5kcyBleHRlbnNpb25zIGRlZmluZWQgd2l0aGluCisgIC8vIHRoaXMgbWVzc2FnZSB0eXBlJ3Mgc2NvcGUuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIC8vIFNpbWlsYXIgdG8gRmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCksIGJ1dCBmaW5kcyBleHRlbnNpb25zIGRlZmluZWQgd2l0aGluCisgIC8vIHRoaXMgbWVzc2FnZSB0eXBlJ3Mgc2NvcGUuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdHlwZWRlZiBNZXNzYWdlT3B0aW9ucyBPcHRpb25zVHlwZTsKKworICAvLyBJbnRlcm5hbCB2ZXJzaW9uIG9mIERlYnVnU3RyaW5nOyBjb250cm9scyB0aGUgbGV2ZWwgb2YgaW5kZW50aW5nIGZvcgorICAvLyBjb3JyZWN0IGRlcHRoCisgIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdDsKKworICBjb25zdCBzdHJpbmcqIG5hbWVfOworICBjb25zdCBzdHJpbmcqIGZ1bGxfbmFtZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlXzsKKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMqIG9wdGlvbnNfOworCisgIC8vIFRydWUgaWYgdGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBhbiB1bmtub3duIHR5cGUuCisgIGJvb2wgaXNfcGxhY2Vob2xkZXJfOworICAvLyBUcnVlIGlmIHRoaXMgaXMgYSBwbGFjZWhvbGRlciBhbmQgdGhlIHR5cGUgbmFtZSB3YXNuJ3QgZnVsbHktcXVhbGlmaWVkLgorICBib29sIGlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXzsKKworICBpbnQgZmllbGRfY291bnRfOworICBGaWVsZERlc2NyaXB0b3IqIGZpZWxkc187CisgIGludCBuZXN0ZWRfdHlwZV9jb3VudF87CisgIERlc2NyaXB0b3IqIG5lc3RlZF90eXBlc187CisgIGludCBlbnVtX3R5cGVfY291bnRfOworICBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlc187CisgIGludCBleHRlbnNpb25fcmFuZ2VfY291bnRfOworICBFeHRlbnNpb25SYW5nZSogZXh0ZW5zaW9uX3Jhbmdlc187CisgIGludCBleHRlbnNpb25fY291bnRfOworICBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbnNfOworICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCisgIC8vIG9mIEFsbG9jYXRlPERlc2NyaXB0b3I+KCkgYW5kIEFsbG9jYXRlQXJyYXk8RGVzY3JpcHRvcj4oKSBpbiBkZXNjcmlwdG9yLmNjCisgIC8vIGFuZCB1cGRhdGUgdGhlbSB0byBpbml0aWFsaXplIHRoZSBmaWVsZC4KKworICAvLyBNdXN0IGJlIGNvbnN0cnVjdGVkIHVzaW5nIERlc2NyaXB0b3JQb29sLgorICBEZXNjcmlwdG9yKCkge30KKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRW51bURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBGaWVsZERlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBNZXRob2REZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3I7CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXNjcmlwdG9yKTsKK307CisKKy8vIERlc2NyaWJlcyBhIHNpbmdsZSBmaWVsZCBvZiBhIG1lc3NhZ2UuICBUbyBnZXQgdGhlIGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4KKy8vIGZpZWxkLCBmaXJzdCBnZXQgdGhlIERlc2NyaXB0b3IgZm9yIHRoZSBtZXNzYWdlIGluIHdoaWNoIGl0IGlzIGRlZmluZWQsCisvLyB0aGVuIGNhbGwgRGVzY3JpcHRvcjo6RmluZEZpZWxkQnlOYW1lKCkuICBUbyBnZXQgYSBGaWVsZERlc2NyaXB0b3IgZm9yCisvLyBhbiBleHRlbnNpb24sIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorLy8gLSBHZXQgdGhlIERlc2NyaXB0b3Igb3IgRmlsZURlc2NyaXB0b3IgZm9yIGl0cyBjb250YWluaW5nIHNjb3BlLCB0aGVuCisvLyAgIGNhbGwgRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5TmFtZSgpIG9yCisvLyAgIEZpbGVEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uQnlOYW1lKCkuCisvLyAtIEdpdmVuIGEgRGVzY3JpcHRvclBvb2wsIGNhbGwgRGVzY3JpcHRvclBvb2w6OkZpbmRFeHRlbnNpb25CeU51bWJlcigpLgorLy8gLSBHaXZlbiBhIFJlZmxlY3Rpb24gZm9yIGEgbWVzc2FnZSBvYmplY3QsIGNhbGwKKy8vICAgUmVmbGVjdGlvbjo6RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKCkgb3IKKy8vICAgUmVmbGVjdGlvbjo6RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoKS4KKy8vIFVzZSBEZXNjcmlwdG9yUG9vbCB0byBjb25zdHJ1Y3QgeW91ciBvd24gZGVzY3JpcHRvcnMuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmllbGREZXNjcmlwdG9yIHsKKyBwdWJsaWM6CisgIC8vIElkZW50aWZpZXMgYSBmaWVsZCB0eXBlLiAgMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzLiAgVGhlIG9yZGVyIGlzIHdlaXJkCisgIC8vIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBUeXBlcyAxMiBhbmQgdXAgYXJlIG5ldyBpbiBwcm90bzIuCisgIGVudW0gVHlwZSB7CisgICAgVFlQRV9ET1VCTEUgICAgICAgICA9IDEsICAgLy8gZG91YmxlLCBleGFjdGx5IGVpZ2h0IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgIFRZUEVfRkxPQVQgICAgICAgICAgPSAyLCAgIC8vIGZsb2F0LCBleGFjdGx5IGZvdXIgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgVFlQRV9JTlQ2NCAgICAgICAgICA9IDMsICAgLy8gaW50NjQsIHZhcmludCBvbiB0aGUgd2lyZS4gIE5lZ2F0aXZlIG51bWJlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDY0IGlmIG5lZ2F0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGFyZSBsaWtlbHkuCisgICAgVFlQRV9VSU5UNjQgICAgICAgICA9IDQsICAgLy8gdWludDY0LCB2YXJpbnQgb24gdGhlIHdpcmUuCisgICAgVFlQRV9JTlQzMiAgICAgICAgICA9IDUsICAgLy8gaW50MzIsIHZhcmludCBvbiB0aGUgd2lyZS4gIE5lZ2F0aXZlIG51bWJlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDMyIGlmIG5lZ2F0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGFyZSBsaWtlbHkuCisgICAgVFlQRV9GSVhFRDY0ICAgICAgICA9IDYsICAgLy8gdWludDY0LCBleGFjdGx5IGVpZ2h0IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgIFRZUEVfRklYRUQzMiAgICAgICAgPSA3LCAgIC8vIHVpbnQzMiwgZXhhY3RseSBmb3VyIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgIFRZUEVfQk9PTCAgICAgICAgICAgPSA4LCAgIC8vIGJvb2wsIHZhcmludCBvbiB0aGUgd2lyZS4KKyAgICBUWVBFX1NUUklORyAgICAgICAgID0gOSwgICAvLyBVVEYtOCB0ZXh0LgorICAgIFRZUEVfR1JPVVAgICAgICAgICAgPSAxMCwgIC8vIFRhZy1kZWxpbWl0ZWQgbWVzc2FnZS4gIERlcHJlY2F0ZWQuCisgICAgVFlQRV9NRVNTQUdFICAgICAgICA9IDExLCAgLy8gTGVuZ3RoLWRlbGltaXRlZCBtZXNzYWdlLgorCisgICAgVFlQRV9CWVRFUyAgICAgICAgICA9IDEyLCAgLy8gQXJiaXRyYXJ5IGJ5dGUgYXJyYXkuCisgICAgVFlQRV9VSU5UMzIgICAgICAgICA9IDEzLCAgLy8gdWludDMyLCB2YXJpbnQgb24gdGhlIHdpcmUKKyAgICBUWVBFX0VOVU0gICAgICAgICAgID0gMTQsICAvLyBFbnVtLCB2YXJpbnQgb24gdGhlIHdpcmUKKyAgICBUWVBFX1NGSVhFRDMyICAgICAgID0gMTUsICAvLyBpbnQzMiwgZXhhY3RseSBmb3VyIGJ5dGVzIG9uIHRoZSB3aXJlCisgICAgVFlQRV9TRklYRUQ2NCAgICAgICA9IDE2LCAgLy8gaW50NjQsIGV4YWN0bHkgZWlnaHQgYnl0ZXMgb24gdGhlIHdpcmUKKyAgICBUWVBFX1NJTlQzMiAgICAgICAgID0gMTcsICAvLyBpbnQzMiwgWmlnWmFnLWVuY29kZWQgdmFyaW50IG9uIHRoZSB3aXJlCisgICAgVFlQRV9TSU5UNjQgICAgICAgICA9IDE4LCAgLy8gaW50NjQsIFppZ1phZy1lbmNvZGVkIHZhcmludCBvbiB0aGUgd2lyZQorCisgICAgTUFYX1RZUEUgICAgICAgICAgICA9IDE4LCAgLy8gQ29uc3RhbnQgdXNlZnVsIGZvciBkZWZpbmluZyBsb29rdXAgdGFibGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXhlZCBieSBUeXBlLgorICB9OworCisgIC8vIFNwZWNpZmllcyB0aGUgQysrIGRhdGEgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZmllbGQuICBUaGVyZSBpcyBhCisgIC8vIGZpeGVkIG1hcHBpbmcgZnJvbSBUeXBlIHRvIENwcFR5cGUgd2hlcmUgZWFjaCBUeXBlIG1hcHMgdG8gZXhhY3RseSBvbmUKKyAgLy8gQ3BwVHlwZS4gIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycy4KKyAgZW51bSBDcHBUeXBlIHsKKyAgICBDUFBUWVBFX0lOVDMyICAgICAgID0gMSwgICAgIC8vIFRZUEVfSU5UMzIsIFRZUEVfU0lOVDMyLCBUWVBFX1NGSVhFRDMyCisgICAgQ1BQVFlQRV9JTlQ2NCAgICAgICA9IDIsICAgICAvLyBUWVBFX0lOVDY0LCBUWVBFX1NJTlQ2NCwgVFlQRV9TRklYRUQ2NAorICAgIENQUFRZUEVfVUlOVDMyICAgICAgPSAzLCAgICAgLy8gVFlQRV9VSU5UMzIsIFRZUEVfRklYRUQzMgorICAgIENQUFRZUEVfVUlOVDY0ICAgICAgPSA0LCAgICAgLy8gVFlQRV9VSU5UNjQsIFRZUEVfRklYRUQ2NAorICAgIENQUFRZUEVfRE9VQkxFICAgICAgPSA1LCAgICAgLy8gVFlQRV9ET1VCTEUKKyAgICBDUFBUWVBFX0ZMT0FUICAgICAgID0gNiwgICAgIC8vIFRZUEVfRkxPQVQKKyAgICBDUFBUWVBFX0JPT0wgICAgICAgID0gNywgICAgIC8vIFRZUEVfQk9PTAorICAgIENQUFRZUEVfRU5VTSAgICAgICAgPSA4LCAgICAgLy8gVFlQRV9FTlVNCisgICAgQ1BQVFlQRV9TVFJJTkcgICAgICA9IDksICAgICAvLyBUWVBFX1NUUklORywgVFlQRV9CWVRFUworICAgIENQUFRZUEVfTUVTU0FHRSAgICAgPSAxMCwgICAgLy8gVFlQRV9NRVNTQUdFLCBUWVBFX0dST1VQCisKKyAgICBNQVhfQ1BQVFlQRSAgICAgICAgID0gMTAsICAgIC8vIENvbnN0YW50IHVzZWZ1bCBmb3IgZGVmaW5pbmcgbG9va3VwIHRhYmxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXhlZCBieSBDcHBUeXBlLgorICB9OworCisgIC8vIElkZW50aWZpZXMgd2hldGhlciB0aGUgZmllbGQgaXMgb3B0aW9uYWwsIHJlcXVpcmVkLCBvciByZXBlYXRlZC4gIDAgaXMKKyAgLy8gcmVzZXJ2ZWQgZm9yIGVycm9ycy4KKyAgZW51bSBMYWJlbCB7CisgICAgTEFCRUxfT1BUSU9OQUwgICAgICA9IDEsICAgIC8vIG9wdGlvbmFsCisgICAgTEFCRUxfUkVRVUlSRUQgICAgICA9IDIsICAgIC8vIHJlcXVpcmVkCisgICAgTEFCRUxfUkVQRUFURUQgICAgICA9IDMsICAgIC8vIHJlcGVhdGVkCisKKyAgICBNQVhfTEFCRUwgICAgICAgICAgID0gMywgICAgLy8gQ29uc3RhbnQgdXNlZnVsIGZvciBkZWZpbmluZyBsb29rdXAgdGFibGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGV4ZWQgYnkgTGFiZWwuCisgIH07CisKKyAgLy8gVmFsaWQgZmllbGQgbnVtYmVycyBhcmUgcG9zaXRpdmUgaW50ZWdlcnMgdXAgdG8ga01heE51bWJlci4KKyAgc3RhdGljIGNvbnN0IGludCBrTWF4TnVtYmVyID0gKDEgPDwgMjkpIC0gMTsKKworICAvLyBGaXJzdCBmaWVsZCBudW1iZXIgcmVzZXJ2ZWQgZm9yIHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gVXNlcnMgbWF5IG5vdCBkZWNsYXJlIGZpZWxkcyB0aGF0IHVzZSByZXNlcnZlZCBudW1iZXJzLgorICBzdGF0aWMgY29uc3QgaW50IGtGaXJzdFJlc2VydmVkTnVtYmVyID0gMTkwMDA7CisgIC8vIExhc3QgZmllbGQgbnVtYmVyIHJlc2VydmVkIGZvciB0aGUgcHJvdG9jb2wgYnVmZmVyIGxpYnJhcnkgaW1wbGVtZW50YXRpb24uCisgIC8vIFVzZXJzIG1heSBub3QgZGVjbGFyZSBmaWVsZHMgdGhhdCB1c2UgcmVzZXJ2ZWQgbnVtYmVycy4KKyAgc3RhdGljIGNvbnN0IGludCBrTGFzdFJlc2VydmVkTnVtYmVyICA9IDE5OTk5OworCisgIGNvbnN0IHN0cmluZyYgbmFtZSgpIGNvbnN0OyAgICAgICAgLy8gTmFtZSBvZiB0aGlzIGZpZWxkIHdpdGhpbiB0aGUgbWVzc2FnZS4KKyAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsgICAvLyBGdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZmllbGQuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKCkgY29uc3Q7Ly8gRmlsZSBpbiB3aGljaCB0aGlzIGZpZWxkIHdhcyBkZWZpbmVkLgorICBib29sIGlzX2V4dGVuc2lvbigpIGNvbnN0OyAgICAgICAgIC8vIElzIHRoaXMgYW4gZXh0ZW5zaW9uIGZpZWxkPworICBpbnQgbnVtYmVyKCkgY29uc3Q7ICAgICAgICAgICAgICAgIC8vIERlY2xhcmVkIHRhZyBudW1iZXIuCisKKyAgLy8gU2FtZSBhcyBuYW1lKCkgZXhjZXB0IGNvbnZlcnRlZCB0byBsb3dlci1jYXNlLiAgVGhpcyAoYW5kIGVzcGVjaWFsbHkgdGhlCisgIC8vIEZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgpIG1ldGhvZCkgY2FuIGJlIHVzZWZ1bCB3aGVuIHBhcnNpbmcgZm9ybWF0cworICAvLyB3aGljaCBwcmVmZXIgdG8gdXNlIGxvd2VyY2FzZSBuYW1pbmcgc3R5bGUuICAoQWx0aG91Z2gsIHRlY2huaWNhbGx5CisgIC8vIGZpZWxkIG5hbWVzIHNob3VsZCBiZSBsb3dlcmNhc2VkIGFueXdheSBhY2NvcmRpbmcgdG8gdGhlIHByb3RvYnVmIHN0eWxlCisgIC8vIGd1aWRlLCBzbyB0aGlzIG9ubHkgbWFrZXMgYSBkaWZmZXJlbmNlIHdoZW4gZGVhbGluZyB3aXRoIG9sZCAucHJvdG8gZmlsZXMKKyAgLy8gd2hpY2ggZG8gbm90IGZvbGxvdyB0aGUgZ3VpZGUuKQorICBjb25zdCBzdHJpbmcmIGxvd2VyY2FzZV9uYW1lKCkgY29uc3Q7CisKKyAgLy8gU2FtZSBhcyBuYW1lKCkgZXhjZXB0IGNvbnZlcnRlZCB0byBjYW1lbC1jYXNlLiAgSW4gdGhpcyBjb252ZXJzaW9uLCBhbnkKKyAgLy8gdGltZSBhbiB1bmRlcnNjb3JlIGFwcGVhcnMgaW4gdGhlIG5hbWUsIGl0IGlzIHJlbW92ZWQgYW5kIHRoZSBuZXh0CisgIC8vIGxldHRlciBpcyBjYXBpdGFsaXplZC4gIEZ1cnRoZXJtb3JlLCB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBuYW1lIGlzCisgIC8vIGxvd2VyLWNhc2VkLiAgRXhhbXBsZXM6CisgIC8vICAgRm9vQmFyIC0+IGZvb0JhcgorICAvLyAgIGZvb19iYXIgLT4gZm9vQmFyCisgIC8vICAgZm9vQmFyIC0+IGZvb0JhcgorICAvLyBUaGlzIChhbmQgZXNwZWNpYWxseSB0aGUgRmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCkgbWV0aG9kKSBjYW4gYmUgdXNlZnVsCisgIC8vIHdoZW4gcGFyc2luZyBmb3JtYXRzIHdoaWNoIHByZWZlciB0byB1c2UgY2FtZWwtY2FzZSBuYW1pbmcgc3R5bGUuCisgIGNvbnN0IHN0cmluZyYgY2FtZWxjYXNlX25hbWUoKSBjb25zdDsKKworICBUeXBlIHR5cGUoKSBjb25zdDsgICAgICAgICAgICAgICAgIC8vIERlY2xhcmVkIHR5cGUgb2YgdGhpcyBmaWVsZC4KKyAgQ3BwVHlwZSBjcHBfdHlwZSgpIGNvbnN0OyAgICAgICAgICAvLyBDKysgdHlwZSBvZiB0aGlzIGZpZWxkLgorICBMYWJlbCBsYWJlbCgpIGNvbnN0OyAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsL3JlcXVpcmVkL3JlcGVhdGVkCisKKyAgYm9vbCBpc19yZXF1aXJlZCgpIGNvbnN0OyAgICAgIC8vIHNob3J0aGFuZCBmb3IgbGFiZWwoKSA9PSBMQUJFTF9SRVFVSVJFRAorICBib29sIGlzX29wdGlvbmFsKCkgY29uc3Q7ICAgICAgLy8gc2hvcnRoYW5kIGZvciBsYWJlbCgpID09IExBQkVMX09QVElPTkFMCisgIGJvb2wgaXNfcmVwZWF0ZWQoKSBjb25zdDsgICAgICAvLyBzaG9ydGhhbmQgZm9yIGxhYmVsKCkgPT0gTEFCRUxfUkVQRUFURUQKKyAgYm9vbCBpc19wYWNrYWJsZSgpIGNvbnN0OyAgICAgIC8vIHNob3J0aGFuZCBmb3IgaXNfcmVwZWF0ZWQoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBJc1R5cGVQYWNrYWJsZSh0eXBlKCkpCisKKyAgLy8gSW5kZXggb2YgdGhpcyBmaWVsZCB3aXRoaW4gdGhlIG1lc3NhZ2UncyBmaWVsZCBhcnJheSwgb3IgdGhlIGZpbGUgb3IKKyAgLy8gZXh0ZW5zaW9uIHNjb3BlJ3MgZXh0ZW5zaW9ucyBhcnJheS4KKyAgaW50IGluZGV4KCkgY29uc3Q7CisKKyAgLy8gRG9lcyB0aGlzIGZpZWxkIGhhdmUgYW4gZXhwbGljaXRseS1kZWNsYXJlZCBkZWZhdWx0IHZhbHVlPworICBib29sIGhhc19kZWZhdWx0X3ZhbHVlKCkgY29uc3Q7CisKKyAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9JTlQzMi4gIElmIG5vCisgIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIDAuCisgIGludDMyIGRlZmF1bHRfdmFsdWVfaW50MzIoKSBjb25zdDsKKyAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9JTlQ2NC4gIElmIG5vCisgIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIDAuCisgIGludDY0IGRlZmF1bHRfdmFsdWVfaW50NjQoKSBjb25zdDsKKyAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9VSU5UMzIuICBJZiBubworICAvLyBleHBsaWNpdCBkZWZhdWx0IHdhcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpcyAwLgorICB1aW50MzIgZGVmYXVsdF92YWx1ZV91aW50MzIoKSBjb25zdDsKKyAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9VSU5UNjQuICBJZiBubworICAvLyBleHBsaWNpdCBkZWZhdWx0IHdhcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpcyAwLgorICB1aW50NjQgZGVmYXVsdF92YWx1ZV91aW50NjQoKSBjb25zdDsKKyAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9GTE9BVC4gIElmIG5vCisgIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIDAuMC4KKyAgZmxvYXQgZGVmYXVsdF92YWx1ZV9mbG9hdCgpIGNvbnN0OworICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX0RPVUJMRS4gIElmIG5vCisgIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIDAuMC4KKyAgZG91YmxlIGRlZmF1bHRfdmFsdWVfZG91YmxlKCkgY29uc3Q7CisgIC8vIEdldCB0aGUgZmllbGQgZGVmYXVsdCB2YWx1ZSBpZiBjcHBfdHlwZSgpID09IENQUFRZUEVfQk9PTC4gIElmIG5vCisgIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIGZhbHNlLgorICBib29sIGRlZmF1bHRfdmFsdWVfYm9vbCgpIGNvbnN0OworICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX0VOVU0uICBJZiBubworICAvLyBleHBsaWNpdCBkZWZhdWx0IHdhcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpcyB0aGUgZmlyc3QgdmFsdWUgZGVmaW5lZAorICAvLyBpbiB0aGUgZW51bSB0eXBlIChhbGwgZW51bSB0eXBlcyBhcmUgcmVxdWlyZWQgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgdmFsdWUpLgorICAvLyBUaGlzIG5ldmVyIHJldHVybnMgTlVMTC4KKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZGVmYXVsdF92YWx1ZV9lbnVtKCkgY29uc3Q7CisgIC8vIEdldCB0aGUgZmllbGQgZGVmYXVsdCB2YWx1ZSBpZiBjcHBfdHlwZSgpID09IENQUFRZUEVfU1RSSU5HLiAgSWYgbm8KKyAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgdGhlIGVtcHR5IHN0cmluZy4KKyAgY29uc3Qgc3RyaW5nJiBkZWZhdWx0X3ZhbHVlX3N0cmluZygpIGNvbnN0OworCisgIC8vIFRoZSBEZXNjcmlwdG9yIGZvciB0aGUgbWVzc2FnZSBvZiB3aGljaCB0aGlzIGlzIGEgZmllbGQuICBGb3IgZXh0ZW5zaW9ucywKKyAgLy8gdGhpcyBpcyB0aGUgZXh0ZW5kZWQgdHlwZS4gIE5ldmVyIE5VTEwuCisgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSgpIGNvbnN0OworCisgIC8vIEFuIGV4dGVuc2lvbiBtYXkgYmUgZGVjbGFyZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbm90aGVyIG1lc3NhZ2UuICBJZiB0aGlzCisgIC8vIGZpZWxkIGlzIGFuIGV4dGVuc2lvbiAoaXNfZXh0ZW5zaW9uKCkgaXMgdHJ1ZSksIHRoZW4gZXh0ZW5zaW9uX3Njb3BlKCkKKyAgLy8gcmV0dXJucyB0aGF0IG1lc3NhZ2UsIG9yIE5VTEwgaWYgdGhlIGV4dGVuc2lvbiB3YXMgZGVjbGFyZWQgYXQgZ2xvYmFsCisgIC8vIHNjb3BlLiAgSWYgdGhpcyBpcyBub3QgYW4gZXh0ZW5zaW9uLCBleHRlbnNpb25fc2NvcGUoKSBpcyB1bmRlZmluZWQgKG1heQorICAvLyBhc3NlcnQtZmFpbCkuCisgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuc2lvbl9zY29wZSgpIGNvbnN0OworCisgIC8vIElmIHR5cGUgaXMgVFlQRV9NRVNTQUdFIG9yIFRZUEVfR1JPVVAsIHJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUKKyAgLy8gbWVzc2FnZSBvciB0aGUgZ3JvdXAgdHlwZS4gIE90aGVyd2lzZSwgdW5kZWZpbmVkLgorICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUoKSBjb25zdDsKKyAgLy8gSWYgdHlwZSBpcyBUWVBFX0VOVU0sIHJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUgZW51bS4gIE90aGVyd2lzZSwKKyAgLy8gdW5kZWZpbmVkLgorICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlKCkgY29uc3Q7CisKKyAgLy8gRVhQRVJJTUVOVEFMOyBETyBOT1QgVVNFLgorICAvLyBJZiB0aGlzIGZpZWxkIGlzIGEgbWFwIGZpZWxkLCBleHBlcmltZW50YWxfbWFwX2tleSgpIGlzIHRoZSBmaWVsZAorICAvLyB0aGF0IGlzIHRoZSBrZXkgZm9yIHRoaXMgbWFwLgorICAvLyBleHBlcmltZW50YWxfbWFwX2tleSgpLT5jb250YWluaW5nX3R5cGUoKSBpcyB0aGUgc2FtZSBhcyBtZXNzYWdlX3R5cGUoKS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHBlcmltZW50YWxfbWFwX2tleSgpIGNvbnN0OworCisgIC8vIEdldCB0aGUgRmllbGRPcHRpb25zIGZvciB0aGlzIGZpZWxkLiAgVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlzdGVkIGluCisgIC8vIHNxdWFyZSBicmFja2V0cyBhZnRlciB0aGUgZmllbGQgZGVmaW5pdGlvbi4gIEUuZy4sIHRoZSBmaWVsZDoKKyAgLy8gICBvcHRpb25hbCBzdHJpbmcgdGV4dCA9IDEgW2N0eXBlPUNPUkRdOworICAvLyBoYXMgdGhlICJjdHlwZSIgb3B0aW9uIHNldC4gIEFsbG93ZWQgb3B0aW9ucyBhcmUgZGVmaW5lZCBieSBGaWVsZE9wdGlvbnMKKyAgLy8gaW4gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8sIGFuZCBhbnkgYXZhaWxhYmxlIGV4dGVuc2lvbnMgb2YgdGhhdAorICAvLyBtZXNzYWdlLgorICBjb25zdCBGaWVsZE9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6Q29weVRvKCkuCisgIHZvaWQgQ29weVRvKEZpZWxkRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OworCisgIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBDcHBUeXBlIGZvciBhIHBhcnRpY3VsYXIgVHlwZS4KKyAgc3RhdGljIENwcFR5cGUgVHlwZVRvQ3BwVHlwZShUeXBlIHR5cGUpOworCisgIC8vIFJldHVybiB0cnVlIGlmZiBbcGFja2VkID0gdHJ1ZV0gaXMgdmFsaWQgZm9yIGZpZWxkcyBvZiB0aGlzIHR5cGUuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBJc1R5cGVQYWNrYWJsZShUeXBlIGZpZWxkX3R5cGUpOworCisgcHJpdmF0ZToKKyAgdHlwZWRlZiBGaWVsZE9wdGlvbnMgT3B0aW9uc1R5cGU7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdDsKKworICAvLyBmb3JtYXRzIHRoZSBkZWZhdWx0IHZhbHVlIGFwcHJvcHJpYXRlbHkgYW5kIHJldHVybnMgaXQgYXMgYSBzdHJpbmcuCisgIC8vIE11c3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgdG8gY2FsbCB0aGlzLiBJZiBxdW90ZV9zdHJpbmdfdHlwZSBpcyB0cnVlLCB0aGVuCisgIC8vIHR5cGVzIG9mIENQUFRZUEVfU1RSSU5HIHdoaWxsIGJlIHN1cnJvdW5kZWQgYnkgcXVvdGVzIGFuZCBDRXNjYXBlZC4KKyAgc3RyaW5nIERlZmF1bHRWYWx1ZUFzU3RyaW5nKGJvb2wgcXVvdGVfc3RyaW5nX3R5cGUpIGNvbnN0OworCisgIGNvbnN0IHN0cmluZyogbmFtZV87CisgIGNvbnN0IHN0cmluZyogZnVsbF9uYW1lXzsKKyAgY29uc3Qgc3RyaW5nKiBsb3dlcmNhc2VfbmFtZV87CisgIGNvbnN0IHN0cmluZyogY2FtZWxjYXNlX25hbWVfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIGludCBudW1iZXJfOworICBUeXBlIHR5cGVfOworICBMYWJlbCBsYWJlbF87CisgIGJvb2wgaXNfZXh0ZW5zaW9uXzsKKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5zaW9uX3Njb3BlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXhwZXJpbWVudGFsX21hcF9rZXlfOworICBjb25zdCBGaWVsZE9wdGlvbnMqIG9wdGlvbnNfOworICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCisgIC8vIG9mIEFsbG9jYXRlPEZpZWxkRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxGaWVsZERlc2NyaXB0b3I+KCkgaW4KKyAgLy8gZGVzY3JpcHRvci5jYyBhbmQgdXBkYXRlIHRoZW0gdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQuCisKKyAgYm9vbCBoYXNfZGVmYXVsdF92YWx1ZV87CisgIHVuaW9uIHsKKyAgICBpbnQzMiAgZGVmYXVsdF92YWx1ZV9pbnQzMl87CisgICAgaW50NjQgIGRlZmF1bHRfdmFsdWVfaW50NjRfOworICAgIHVpbnQzMiBkZWZhdWx0X3ZhbHVlX3VpbnQzMl87CisgICAgdWludDY0IGRlZmF1bHRfdmFsdWVfdWludDY0XzsKKyAgICBmbG9hdCAgZGVmYXVsdF92YWx1ZV9mbG9hdF87CisgICAgZG91YmxlIGRlZmF1bHRfdmFsdWVfZG91YmxlXzsKKyAgICBib29sICAgZGVmYXVsdF92YWx1ZV9ib29sXzsKKworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlZmF1bHRfdmFsdWVfZW51bV87CisgICAgY29uc3Qgc3RyaW5nKiBkZWZhdWx0X3ZhbHVlX3N0cmluZ187CisgIH07CisKKyAgc3RhdGljIGNvbnN0IENwcFR5cGUga1R5cGVUb0NwcFR5cGVNYXBbTUFYX1RZUEUgKyAxXTsKKworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtUeXBlVG9OYW1lW01BWF9UWVBFICsgMV07CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrTGFiZWxUb05hbWVbTUFYX0xBQkVMICsgMV07CisKKyAgLy8gTXVzdCBiZSBjb25zdHJ1Y3RlZCB1c2luZyBEZXNjcmlwdG9yUG9vbC4KKyAgRmllbGREZXNjcmlwdG9yKCkge30KKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmllbGREZXNjcmlwdG9yKTsKK307CisKKy8vIERlc2NyaWJlcyBhbiBlbnVtIHR5cGUgZGVmaW5lZCBpbiBhIC5wcm90byBmaWxlLiAgVG8gZ2V0IHRoZSBFbnVtRGVzY3JpcHRvcgorLy8gZm9yIGEgZ2VuZXJhdGVkIGVudW0gdHlwZSwgY2FsbCBUeXBlTmFtZV9kZXNjcmlwdG9yKCkuICBVc2UgRGVzY3JpcHRvclBvb2wKKy8vIHRvIGNvbnN0cnVjdCB5b3VyIG93biBkZXNjcmlwdG9ycy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBFbnVtRGVzY3JpcHRvciB7CisgcHVibGljOgorICAvLyBUaGUgbmFtZSBvZiB0aGlzIGVudW0gdHlwZSBpbiB0aGUgY29udGFpbmluZyBzY29wZS4KKyAgY29uc3Qgc3RyaW5nJiBuYW1lKCkgY29uc3Q7CisKKyAgLy8gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnVtIHR5cGUsIHNjb3BlIGRlbGltaXRlZCBieSBwZXJpb2RzLgorICBjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSgpIGNvbnN0OworCisgIC8vIEluZGV4IG9mIHRoaXMgZW51bSB3aXRoaW4gdGhlIGZpbGUgb3IgY29udGFpbmluZyBtZXNzYWdlJ3MgZW51bSBhcnJheS4KKyAgaW50IGluZGV4KCkgY29uc3Q7CisKKyAgLy8gVGhlIC5wcm90byBmaWxlIGluIHdoaWNoIHRoaXMgZW51bSB0eXBlIHdhcyBkZWZpbmVkLiAgTmV2ZXIgTlVMTC4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUoKSBjb25zdDsKKworICAvLyBUaGUgbnVtYmVyIG9mIHZhbHVlcyBmb3IgdGhpcyBFbnVtRGVzY3JpcHRvci4gIEd1YXJhbnRlZWQgdG8gYmUgZ3JlYXRlcgorICAvLyB0aGFuIHplcm8uCisgIGludCB2YWx1ZV9jb3VudCgpIGNvbnN0OworICAvLyBHZXRzIGEgdmFsdWUgYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPCB2YWx1ZV9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUoaW50IGluZGV4KSBjb25zdDsKKworICAvLyBMb29rcyB1cCBhIHZhbHVlIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMuCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEZpbmRWYWx1ZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworICAvLyBMb29rcyB1cCBhIHZhbHVlIGJ5IG51bWJlci4gIFJldHVybnMgTlVMTCBpZiBubyBzdWNoIHZhbHVlIGV4aXN0cy4gIElmCisgIC8vIG11bHRpcGxlIHZhbHVlcyBoYXZlIHRoaXMgbnVtYmVyLCB0aGUgZmlyc3Qgb25lIGRlZmluZWQgaXMgcmV0dXJuZWQuCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEZpbmRWYWx1ZUJ5TnVtYmVyKGludCBudW1iZXIpIGNvbnN0OworCisgIC8vIElmIHRoaXMgZW51bSB0eXBlIGlzIG5lc3RlZCBpbiBhIG1lc3NhZ2UgdHlwZSwgdGhpcyBpcyB0aGF0IG1lc3NhZ2UgdHlwZS4KKyAgLy8gT3RoZXJ3aXNlLCBOVUxMLgorICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUoKSBjb25zdDsKKworICAvLyBHZXQgb3B0aW9ucyBmb3IgdGhpcyBlbnVtIHR5cGUuICBUaGVzZSBhcmUgc3BlY2lmaWVkIGluIHRoZSAucHJvdG8gZmlsZSBieQorICAvLyBwbGFjaW5nIGxpbmVzIGxpa2UgIm9wdGlvbiBmb28gPSAxMjM0OyIgaW4gdGhlIGVudW0gZGVmaW5pdGlvbi4gIEFsbG93ZWQKKyAgLy8gb3B0aW9ucyBhcmUgZGVmaW5lZCBieSBFbnVtT3B0aW9ucyBpbiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bywKKyAgLy8gYW5kIGFueSBhdmFpbGFibGUgZXh0ZW5zaW9ucyBvZiB0aGF0IG1lc3NhZ2UuCisgIGNvbnN0IEVudW1PcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkNvcHlUbygpLgorICB2b2lkIENvcHlUbyhFbnVtRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdHlwZWRlZiBFbnVtT3B0aW9ucyBPcHRpb25zVHlwZTsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KKyAgdm9pZCBEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMpIGNvbnN0OworCisgIGNvbnN0IHN0cmluZyogbmFtZV87CisgIGNvbnN0IHN0cmluZyogZnVsbF9uYW1lXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfOworICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGVfOworICBjb25zdCBFbnVtT3B0aW9ucyogb3B0aW9uc187CisKKyAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGFuIHVua25vd24gdHlwZS4KKyAgYm9vbCBpc19wbGFjZWhvbGRlcl87CisgIC8vIFRydWUgaWYgdGhpcyBpcyBhIHBsYWNlaG9sZGVyIGFuZCB0aGUgdHlwZSBuYW1lIHdhc24ndCBmdWxseS1xdWFsaWZpZWQuCisgIGJvb2wgaXNfdW5xdWFsaWZpZWRfcGxhY2Vob2xkZXJfOworCisgIGludCB2YWx1ZV9jb3VudF87CisgIEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlc187CisgIC8vIElNUE9SVEFOVDogIElmIHlvdSBhZGQgYSBuZXcgZmllbGQsIG1ha2Ugc3VyZSB0byBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMKKyAgLy8gb2YgQWxsb2NhdGU8RW51bURlc2NyaXB0b3I+KCkgYW5kIEFsbG9jYXRlQXJyYXk8RW51bURlc2NyaXB0b3I+KCkgaW4KKyAgLy8gZGVzY3JpcHRvci5jYyBhbmQgdXBkYXRlIHRoZW0gdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQuCisKKyAgLy8gTXVzdCBiZSBjb25zdHJ1Y3RlZCB1c2luZyBEZXNjcmlwdG9yUG9vbC4KKyAgRW51bURlc2NyaXB0b3IoKSB7fQorICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI7CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRmllbGREZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIEZpbGVEZXNjcmlwdG9yOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW51bURlc2NyaXB0b3IpOworfTsKKworLy8gRGVzY3JpYmVzIGFuIGluZGl2aWR1YWwgZW51bSBjb25zdGFudCBvZiBhIHBhcnRpY3VsYXIgdHlwZS4gIFRvIGdldCB0aGUKKy8vIEVudW1WYWx1ZURlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gZW51bSB2YWx1ZSwgZmlyc3QgZ2V0IHRoZSBFbnVtRGVzY3JpcHRvcgorLy8gZm9yIGl0cyB0eXBlLCB0aGVuIHVzZSBFbnVtRGVzY3JpcHRvcjo6RmluZFZhbHVlQnlOYW1lKCkgb3IKKy8vIEVudW1EZXNjcmlwdG9yOjpGaW5kVmFsdWVCeU51bWJlcigpLiAgVXNlIERlc2NyaXB0b3JQb29sIHRvIGNvbnN0cnVjdAorLy8geW91ciBvd24gZGVzY3JpcHRvcnMuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRW51bVZhbHVlRGVzY3JpcHRvciB7CisgcHVibGljOgorICBjb25zdCBzdHJpbmcmIG5hbWUoKSBjb25zdDsgIC8vIE5hbWUgb2YgdGhpcyBlbnVtIGNvbnN0YW50LgorICBpbnQgaW5kZXgoKSBjb25zdDsgICAgICAgICAgIC8vIEluZGV4IHdpdGhpbiB0aGUgZW51bXMncyBEZXNjcmlwdG9yLgorICBpbnQgbnVtYmVyKCkgY29uc3Q7ICAgICAgICAgIC8vIE51bWVyaWMgdmFsdWUgb2YgdGhpcyBlbnVtIGNvbnN0YW50LgorCisgIC8vIFRoZSBmdWxsX25hbWUgb2YgYW4gZW51bSB2YWx1ZSBpcyBhIHNpYmxpbmcgc3ltYm9sIG9mIHRoZSBlbnVtIHR5cGUuCisgIC8vIGUuZy4gdGhlIGZ1bGwgbmFtZSBvZiBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMiBpcyBhY3R1YWxseQorICAvLyAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlRZUEVfSU5UMzIiLCBOT1QKKyAgLy8gImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlLlRZUEVfSU5UMzIiLiAgVGhpcyBpcyB0byBjb25mb3JtCisgIC8vIHdpdGggQysrIHNjb3BpbmcgcnVsZXMgZm9yIGVudW1zLgorICBjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSgpIGNvbnN0OworCisgIC8vIFRoZSB0eXBlIG9mIHRoaXMgdmFsdWUuICBOZXZlciBOVUxMLgorICBjb25zdCBFbnVtRGVzY3JpcHRvciogdHlwZSgpIGNvbnN0OworCisgIC8vIEdldCBvcHRpb25zIGZvciB0aGlzIGVudW0gdmFsdWUuICBUaGVzZSBhcmUgc3BlY2lmaWVkIGluIHRoZSAucHJvdG8gZmlsZQorICAvLyBieSBhZGRpbmcgdGV4dCBsaWtlICJbZm9vID0gMTIzNF0iIGFmdGVyIGFuIGVudW0gdmFsdWUgZGVmaW5pdGlvbi4KKyAgLy8gQWxsb3dlZCBvcHRpb25zIGFyZSBkZWZpbmVkIGJ5IEVudW1WYWx1ZU9wdGlvbnMgaW4KKyAgLy8gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8sIGFuZCBhbnkgYXZhaWxhYmxlIGV4dGVuc2lvbnMgb2YgdGhhdAorICAvLyBtZXNzYWdlLgorICBjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkNvcHlUbygpLgorICB2b2lkIENvcHlUbyhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KKyAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB0eXBlZGVmIEVudW1WYWx1ZU9wdGlvbnMgT3B0aW9uc1R5cGU7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdDsKKworICBjb25zdCBzdHJpbmcqIG5hbWVfOworICBjb25zdCBzdHJpbmcqIGZ1bGxfbmFtZV87CisgIGludCBudW1iZXJfOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogdHlwZV87CisgIGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMqIG9wdGlvbnNfOworICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCisgIC8vIG9mIEFsbG9jYXRlPEVudW1WYWx1ZURlc2NyaXB0b3I+KCkgYW5kIEFsbG9jYXRlQXJyYXk8RW51bVZhbHVlRGVzY3JpcHRvcj4oKQorICAvLyBpbiBkZXNjcmlwdG9yLmNjIGFuZCB1cGRhdGUgdGhlbSB0byBpbml0aWFsaXplIHRoZSBmaWVsZC4KKworICAvLyBNdXN0IGJlIGNvbnN0cnVjdGVkIHVzaW5nIERlc2NyaXB0b3JQb29sLgorICBFbnVtVmFsdWVEZXNjcmlwdG9yKCkge30KKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOworICBmcmllbmQgY2xhc3MgRW51bURlc2NyaXB0b3I7CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFbnVtVmFsdWVEZXNjcmlwdG9yKTsKK307CisKKy8vIERlc2NyaWJlcyBhbiBSUEMgc2VydmljZS4gIFRvIGdldCB0aGUgU2VydmljZURlc2NyaXB0b3IgZm9yIGEgc2VydmljZSwKKy8vIGNhbGwgU2VydmljZTo6R2V0RGVzY3JpcHRvcigpLiAgR2VuZXJhdGVkIHNlcnZpY2UgY2xhc3NlcyBhbHNvIGhhdmUgYQorLy8gc3RhdGljIG1ldGhvZCBjYWxsZWQgZGVzY3JpcHRvcigpIHdoaWNoIHJldHVybnMgdGhlIHR5cGUncworLy8gU2VydmljZURlc2NyaXB0b3IuICBVc2UgRGVzY3JpcHRvclBvb2wgdG8gY29uc3RydWN0IHlvdXIgb3duIGRlc2NyaXB0b3JzLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFNlcnZpY2VEZXNjcmlwdG9yIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlLCBub3QgaW5jbHVkaW5nIGl0cyBjb250YWluaW5nIHNjb3BlLgorICBjb25zdCBzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgLy8gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZXJ2aWNlLCBzY29wZSBkZWxpbWl0ZWQgYnkgcGVyaW9kcy4KKyAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsKKyAgLy8gSW5kZXggb2YgdGhpcyBzZXJ2aWNlIHdpdGhpbiB0aGUgZmlsZSdzIHNlcnZpY2VzIGFycmF5LgorICBpbnQgaW5kZXgoKSBjb25zdDsKKworICAvLyBUaGUgLnByb3RvIGZpbGUgaW4gd2hpY2ggdGhpcyBzZXJ2aWNlIHdhcyBkZWZpbmVkLiAgTmV2ZXIgTlVMTC4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUoKSBjb25zdDsKKworICAvLyBHZXQgb3B0aW9ucyBmb3IgdGhpcyBzZXJ2aWNlIHR5cGUuICBUaGVzZSBhcmUgc3BlY2lmaWVkIGluIHRoZSAucHJvdG8gZmlsZQorICAvLyBieSBwbGFjaW5nIGxpbmVzIGxpa2UgIm9wdGlvbiBmb28gPSAxMjM0OyIgaW4gdGhlIHNlcnZpY2UgZGVmaW5pdGlvbi4KKyAgLy8gQWxsb3dlZCBvcHRpb25zIGFyZSBkZWZpbmVkIGJ5IFNlcnZpY2VPcHRpb25zIGluCisgIC8vIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvLCBhbmQgYW55IGF2YWlsYWJsZSBleHRlbnNpb25zIG9mIHRoYXQKKyAgLy8gbWVzc2FnZS4KKyAgY29uc3QgU2VydmljZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKworICAvLyBUaGUgbnVtYmVyIG9mIG1ldGhvZHMgdGhpcyBzZXJ2aWNlIGRlZmluZXMuCisgIGludCBtZXRob2RfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhIE1ldGhvZERlc2NyaXB0b3IgYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPCBtZXRob2RfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZChpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIExvb2sgdXAgYSBNZXRob2REZXNjcmlwdG9yIGJ5IG5hbWUuCisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIEZpbmRNZXRob2RCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6Q29weVRvKCkuCisgIHZvaWQgQ29weVRvKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KKyAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB0eXBlZGVmIFNlcnZpY2VPcHRpb25zIE9wdGlvbnNUeXBlOworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICB2b2lkIERlYnVnU3RyaW5nKHN0cmluZyAqY29udGVudHMpIGNvbnN0OworCisgIGNvbnN0IHN0cmluZyogbmFtZV87CisgIGNvbnN0IHN0cmluZyogZnVsbF9uYW1lXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfOworICBjb25zdCBTZXJ2aWNlT3B0aW9ucyogb3B0aW9uc187CisgIGludCBtZXRob2RfY291bnRfOworICBNZXRob2REZXNjcmlwdG9yKiBtZXRob2RzXzsKKyAgLy8gSU1QT1JUQU5UOiAgSWYgeW91IGFkZCBhIG5ldyBmaWVsZCwgbWFrZSBzdXJlIHRvIHNlYXJjaCBmb3IgYWxsIGluc3RhbmNlcworICAvLyBvZiBBbGxvY2F0ZTxTZXJ2aWNlRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxTZXJ2aWNlRGVzY3JpcHRvcj4oKSBpbgorICAvLyBkZXNjcmlwdG9yLmNjIGFuZCB1cGRhdGUgdGhlbSB0byBpbml0aWFsaXplIHRoZSBmaWVsZC4KKworICAvLyBNdXN0IGJlIGNvbnN0cnVjdGVkIHVzaW5nIERlc2NyaXB0b3JQb29sLgorICBTZXJ2aWNlRGVzY3JpcHRvcigpIHt9CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKKyAgZnJpZW5kIGNsYXNzIEZpbGVEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgTWV0aG9kRGVzY3JpcHRvcjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlcnZpY2VEZXNjcmlwdG9yKTsKK307CisKKy8vIERlc2NyaWJlcyBhbiBpbmRpdmlkdWFsIHNlcnZpY2UgbWV0aG9kLiAgVG8gb2J0YWluIGEgTWV0aG9kRGVzY3JpcHRvciBnaXZlbgorLy8gYSBzZXJ2aWNlLCBmaXJzdCBnZXQgaXRzIFNlcnZpY2VEZXNjcmlwdG9yLCB0aGVuIGNhbGwKKy8vIFNlcnZpY2VEZXNjcmlwdG9yOjpGaW5kTWV0aG9kQnlOYW1lKCkuICBVc2UgRGVzY3JpcHRvclBvb2wgdG8gY29uc3RydWN0IHlvdXIKKy8vIG93biBkZXNjcmlwdG9ycy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNZXRob2REZXNjcmlwdG9yIHsKKyBwdWJsaWM6CisgIC8vIE5hbWUgb2YgdGhpcyBtZXRob2QsIG5vdCBpbmNsdWRpbmcgY29udGFpbmluZyBzY29wZS4KKyAgY29uc3Qgc3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIC8vIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgbWV0aG9kLCBzY29wZSBkZWxpbWl0ZWQgYnkgcGVyaW9kcy4KKyAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsKKyAgLy8gSW5kZXggd2l0aGluIHRoZSBzZXJ2aWNlJ3MgRGVzY3JpcHRvci4KKyAgaW50IGluZGV4KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgc2VydmljZSB0byB3aGljaCB0aGlzIG1ldGhvZCBiZWxvbmdzLiAgTmV2ZXIgTlVMTC4KKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UoKSBjb25zdDsKKworICAvLyBHZXRzIHRoZSB0eXBlIG9mIHByb3RvY29sIG1lc3NhZ2Ugd2hpY2ggdGhpcyBtZXRob2QgYWNjZXB0cyBhcyBpbnB1dC4KKyAgY29uc3QgRGVzY3JpcHRvciogaW5wdXRfdHlwZSgpIGNvbnN0OworICAvLyBHZXRzIHRoZSB0eXBlIG9mIHByb3RvY29sIG1lc3NhZ2Ugd2hpY2ggdGhpcyBtZXNzYWdlIHByb2R1Y2VzIGFzIG91dHB1dC4KKyAgY29uc3QgRGVzY3JpcHRvciogb3V0cHV0X3R5cGUoKSBjb25zdDsKKworICAvLyBHZXQgb3B0aW9ucyBmb3IgdGhpcyBtZXRob2QuICBUaGVzZSBhcmUgc3BlY2lmaWVkIGluIHRoZSAucHJvdG8gZmlsZSBieQorICAvLyBwbGFjaW5nIGxpbmVzIGxpa2UgIm9wdGlvbiBmb28gPSAxMjM0OyIgaW4gY3VybHktYnJhY2VzIGFmdGVyIGEgbWV0aG9kCisgIC8vIGRlY2xhcmF0aW9uLiAgQWxsb3dlZCBvcHRpb25zIGFyZSBkZWZpbmVkIGJ5IE1ldGhvZE9wdGlvbnMgaW4KKyAgLy8gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8sIGFuZCBhbnkgYXZhaWxhYmxlIGV4dGVuc2lvbnMgb2YgdGhhdAorICAvLyBtZXNzYWdlLgorICBjb25zdCBNZXRob2RPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkNvcHlUbygpLgorICB2b2lkIENvcHlUbyhNZXRob2REZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KKyAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB0eXBlZGVmIE1ldGhvZE9wdGlvbnMgT3B0aW9uc1R5cGU7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdDsKKworICBjb25zdCBzdHJpbmcqIG5hbWVfOworICBjb25zdCBzdHJpbmcqIGZ1bGxfbmFtZV87CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogaW5wdXRfdHlwZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIG91dHB1dF90eXBlXzsKKyAgY29uc3QgTWV0aG9kT3B0aW9ucyogb3B0aW9uc187CisgIC8vIElNUE9SVEFOVDogIElmIHlvdSBhZGQgYSBuZXcgZmllbGQsIG1ha2Ugc3VyZSB0byBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMKKyAgLy8gb2YgQWxsb2NhdGU8TWV0aG9kRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxNZXRob2REZXNjcmlwdG9yPigpIGluCisgIC8vIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgorCisgIC8vIE11c3QgYmUgY29uc3RydWN0ZWQgdXNpbmcgRGVzY3JpcHRvclBvb2wuCisgIE1ldGhvZERlc2NyaXB0b3IoKSB7fQorICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI7CisgIGZyaWVuZCBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1ldGhvZERlc2NyaXB0b3IpOworfTsKKworLy8gRGVzY3JpYmVzIGEgd2hvbGUgLnByb3RvIGZpbGUuICBUbyBnZXQgdGhlIEZpbGVEZXNjcmlwdG9yIGZvciBhIGNvbXBpbGVkLWluCisvLyBmaWxlLCBnZXQgdGhlIGRlc2NyaXB0b3IgZm9yIHNvbWV0aGluZyBkZWZpbmVkIGluIHRoYXQgZmlsZSBhbmQgY2FsbAorLy8gZGVzY3JpcHRvci0+ZmlsZSgpLiAgVXNlIERlc2NyaXB0b3JQb29sIHRvIGNvbnN0cnVjdCB5b3VyIG93biBkZXNjcmlwdG9ycy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWxlRGVzY3JpcHRvciB7CisgcHVibGljOgorICAvLyBUaGUgZmlsZW5hbWUsIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgdHJlZS4KKyAgLy8gZS5nLiAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iCisgIGNvbnN0IHN0cmluZyYgbmFtZSgpIGNvbnN0OworCisgIC8vIFRoZSBwYWNrYWdlLCBlLmcuICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIiLgorICBjb25zdCBzdHJpbmcmIHBhY2thZ2UoKSBjb25zdDsKKworICAvLyBUaGUgRGVzY3JpcHRvclBvb2wgaW4gd2hpY2ggdGhpcyBGaWxlRGVzY3JpcHRvciBhbmQgYWxsIGl0cyBjb250ZW50cyB3ZXJlCisgIC8vIGFsbG9jYXRlZC4gIE5ldmVyIE5VTEwuCisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKCkgY29uc3Q7CisKKyAgLy8gVGhlIG51bWJlciBvZiBmaWxlcyBpbXBvcnRlZCBieSB0aGlzIG9uZS4KKyAgaW50IGRlcGVuZGVuY3lfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhbiBpbXBvcnRlZCBmaWxlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgZGVwZW5kZW5jeV9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKKworICAvLyBOdW1iZXIgb2YgdG9wLWxldmVsIG1lc3NhZ2UgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUuICAoVGhpcyBkb2VzIG5vdAorICAvLyBpbmNsdWRlIG5lc3RlZCB0eXBlcy4pCisgIGludCBtZXNzYWdlX3R5cGVfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhIHRvcC1sZXZlbCBtZXNzYWdlIHR5cGUsIHdoZXJlIDAgPD0gaW5kZXggPCBtZXNzYWdlX3R5cGVfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIE51bWJlciBvZiB0b3AtbGV2ZWwgZW51bSB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gIChUaGlzIGRvZXMgbm90CisgIC8vIGluY2x1ZGUgbmVzdGVkIHR5cGVzLikKKyAgaW50IGVudW1fdHlwZV9jb3VudCgpIGNvbnN0OworICAvLyBHZXRzIGEgdG9wLWxldmVsIGVudW0gdHlwZSwgd2hlcmUgMCA8PSBpbmRleCA8IGVudW1fdHlwZV9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIE51bWJlciBvZiBzZXJ2aWNlcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4KKyAgaW50IHNlcnZpY2VfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhIHNlcnZpY2UsIHdoZXJlIDAgPD0gaW5kZXggPCBzZXJ2aWNlX2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIE51bWJlciBvZiBleHRlbnNpb25zIGRlZmluZWQgYXQgZmlsZSBzY29wZS4gIChUaGlzIGRvZXMgbm90IGluY2x1ZGUKKyAgLy8gZXh0ZW5zaW9ucyBuZXN0ZWQgd2l0aGluIG1lc3NhZ2UgdHlwZXMuKQorICBpbnQgZXh0ZW5zaW9uX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYW4gZXh0ZW5zaW9uJ3MgZGVzY3JpcHRvciwgd2hlcmUgMCA8PSBpbmRleCA8IGV4dGVuc2lvbl9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24oaW50IGluZGV4KSBjb25zdDsKKworICAvLyBHZXQgb3B0aW9ucyBmb3IgdGhpcyBmaWxlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUgYnkKKyAgLy8gcGxhY2luZyBsaW5lcyBsaWtlICJvcHRpb24gZm9vID0gMTIzNDsiIGF0IHRoZSB0b3AgbGV2ZWwsIG91dHNpZGUgb2YgYW55CisgIC8vIG90aGVyIGRlZmluaXRpb25zLiAgQWxsb3dlZCBvcHRpb25zIGFyZSBkZWZpbmVkIGJ5IEZpbGVPcHRpb25zIGluCisgIC8vIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvLCBhbmQgYW55IGF2YWlsYWJsZSBleHRlbnNpb25zIG9mIHRoYXQKKyAgLy8gbWVzc2FnZS4KKyAgY29uc3QgRmlsZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKworICAvLyBGaW5kIGEgdG9wLWxldmVsIG1lc3NhZ2UgdHlwZSBieSBuYW1lLiAgUmV0dXJucyBOVUxMIGlmIG5vdCBmb3VuZC4KKyAgY29uc3QgRGVzY3JpcHRvciogRmluZE1lc3NhZ2VUeXBlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIC8vIEZpbmQgYSB0b3AtbGV2ZWwgZW51bSB0eXBlIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm90IGZvdW5kLgorICBjb25zdCBFbnVtRGVzY3JpcHRvciogRmluZEVudW1UeXBlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIC8vIEZpbmQgYW4gZW51bSB2YWx1ZSBkZWZpbmVkIGluIGFueSB0b3AtbGV2ZWwgZW51bSBieSBuYW1lLiAgUmV0dXJucyBOVUxMIGlmCisgIC8vIG5vdCBmb3VuZC4KKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogRmluZEVudW1WYWx1ZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworICAvLyBGaW5kIGEgc2VydmljZSBkZWZpbml0aW9uIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm90IGZvdW5kLgorICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogRmluZFNlcnZpY2VCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgLy8gRmluZCBhIHRvcC1sZXZlbCBleHRlbnNpb24gZGVmaW5pdGlvbiBieSBuYW1lLiAgUmV0dXJucyBOVUxMIGlmIG5vdCBmb3VuZC4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIC8vIFNpbWlsYXIgdG8gRmluZEV4dGVuc2lvbkJ5TmFtZSgpLCBidXQgc2VhcmNoZXMgYnkgbG93ZXJjYXNlZC1uYW1lLiAgU2VlCisgIC8vIERlc2NyaXB0b3I6OkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgpLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgLy8gU2ltaWxhciB0byBGaW5kRXh0ZW5zaW9uQnlOYW1lKCksIGJ1dCBzZWFyY2hlcyBieSBjYW1lbGNhc2VkLW5hbWUuICBTZWUKKyAgLy8gRGVzY3JpcHRvcjo6RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCkuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KKyAgdm9pZCBDb3B5VG8oRmlsZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgorICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHR5cGVkZWYgRmlsZU9wdGlvbnMgT3B0aW9uc1R5cGU7CisKKyAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKKyAgY29uc3Qgc3RyaW5nKiBwYWNrYWdlXzsKKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2xfOworICBpbnQgZGVwZW5kZW5jeV9jb3VudF87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiogZGVwZW5kZW5jaWVzXzsKKyAgaW50IG1lc3NhZ2VfdHlwZV9jb3VudF87CisgIERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZXNfOworICBpbnQgZW51bV90eXBlX2NvdW50XzsKKyAgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZXNfOworICBpbnQgc2VydmljZV9jb3VudF87CisgIFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlc187CisgIGludCBleHRlbnNpb25fY291bnRfOworICBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbnNfOworICBjb25zdCBGaWxlT3B0aW9ucyogb3B0aW9uc187CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3JUYWJsZXMqIHRhYmxlc187CisgIC8vIElNUE9SVEFOVDogIElmIHlvdSBhZGQgYSBuZXcgZmllbGQsIG1ha2Ugc3VyZSB0byBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMKKyAgLy8gb2YgQWxsb2NhdGU8RmlsZURlc2NyaXB0b3I+KCkgYW5kIEFsbG9jYXRlQXJyYXk8RmlsZURlc2NyaXB0b3I+KCkgaW4KKyAgLy8gZGVzY3JpcHRvci5jYyBhbmQgdXBkYXRlIHRoZW0gdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQuCisKKyAgRmlsZURlc2NyaXB0b3IoKSB7fQorICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI7CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRmllbGREZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRW51bURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVEZXNjcmlwdG9yKTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVXNlZCB0byBjb25zdHJ1Y3QgZGVzY3JpcHRvcnMuCisvLworLy8gTm9ybWFsbHkgeW91IHdvbid0IHdhbnQgdG8gYnVpbGQgeW91ciBvd24gZGVzY3JpcHRvcnMuICBNZXNzYWdlIGNsYXNzZXMKKy8vIGNvbnN0cnVjdGVkIGJ5IHRoZSBwcm90b2NvbCBjb21waWxlciB3aWxsIHByb3ZpZGUgdGhlbSBmb3IgeW91LiAgSG93ZXZlciwKKy8vIGlmIHlvdSBhcmUgaW1wbGVtZW50aW5nIE1lc3NhZ2Ugb24geW91ciBvd24sIG9yIGlmIHlvdSBhcmUgd3JpdGluZyBhCisvLyBwcm9ncmFtIHdoaWNoIGNhbiBvcGVyYXRlIG9uIHRvdGFsbHkgYXJiaXRyYXJ5IHR5cGVzIGFuZCBuZWVkcyB0byBsb2FkCisvLyB0aGVtIGZyb20gc29tZSBzb3J0IG9mIGRhdGFiYXNlLCB5b3UgbWlnaHQgbmVlZCB0by4KKy8vCisvLyBTaW5jZSBEZXNjcmlwdG9ycyBhcmUgY29tcG9zZWQgb2YgYSB3aG9sZSBsb3Qgb2YgY3Jvc3MtbGlua2VkIGJpdHMgb2YKKy8vIGRhdGEgdGhhdCB3b3VsZCBiZSBhIHBhaW4gdG8gcHV0IHRvZ2V0aGVyIG1hbnVhbGx5LCB0aGUKKy8vIERlc2NyaXB0b3JQb29sIGNsYXNzIGlzIHByb3ZpZGVkIHRvIG1ha2UgdGhlIHByb2Nlc3MgZWFzaWVyLiAgSXQgY2FuCisvLyB0YWtlIGEgRmlsZURlc2NyaXB0b3JQcm90byAoZGVmaW5lZCBpbiBkZXNjcmlwdG9yLnByb3RvKSwgdmFsaWRhdGUgaXQsCisvLyBhbmQgY29udmVydCBpdCB0byBhIHNldCBvZiBuaWNlbHkgY3Jvc3MtbGlua2VkIERlc2NyaXB0b3JzLgorLy8KKy8vIERlc2NyaXB0b3JQb29sIGFsc28gaGVscHMgd2l0aCBtZW1vcnkgbWFuYWdlbWVudC4gIERlc2NyaXB0b3JzIGFyZQorLy8gY29tcG9zZWQgb2YgbWFueSBvYmplY3RzIGNvbnRhaW5pbmcgc3RhdGljIGRhdGEgYW5kIHBvaW50ZXJzIHRvIGVhY2gKKy8vIG90aGVyLiAgSW4gYWxsIGxpa2VsaWhvb2QsIHdoZW4gaXQgY29tZXMgdGltZSB0byBkZWxldGUgdGhpcyBkYXRhLAorLy8geW91J2xsIHdhbnQgdG8gZGVsZXRlIGl0IGFsbCBhdCBvbmNlLiAgSW4gZmFjdCwgaXQgaXMgbm90IHVuY29tbW9uIHRvCisvLyBoYXZlIGEgd2hvbGUgcG9vbCBvZiBkZXNjcmlwdG9ycyBhbGwgY3Jvc3MtbGlua2VkIHdpdGggZWFjaCBvdGhlciB3aGljaAorLy8geW91IHdpc2ggdG8gZGVsZXRlIGFsbCBhdCBvbmNlLiAgVGhpcyBjbGFzcyByZXByZXNlbnRzIHN1Y2ggYSBwb29sLCBhbmQKKy8vIGhhbmRsZXMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGZvciB5b3UuCisvLworLy8gWW91IGNhbiBhbHNvIHNlYXJjaCBmb3IgZGVzY3JpcHRvcnMgd2l0aGluIGEgRGVzY3JpcHRvclBvb2wgYnkgbmFtZSwgYW5kCisvLyBleHRlbnNpb25zIGJ5IG51bWJlci4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBEZXNjcmlwdG9yUG9vbCB7CisgcHVibGljOgorICAvLyBDcmVhdGUgYSBub3JtYWwsIGVtcHR5IERlc2NyaXB0b3JQb29sLgorICBEZXNjcmlwdG9yUG9vbCgpOworCisgIC8vIENvbnN0cnVjdHMgYSBEZXNjcmlwdG9yUG9vbCB0aGF0LCB3aGVuIGl0IGNhbid0IGZpbmQgc29tZXRoaW5nIGFtb25nIHRoZQorICAvLyBkZXNjcmlwdG9ycyBhbHJlYWR5IGluIHRoZSBwb29sLCBsb29rcyBmb3IgaXQgaW4gdGhlIGdpdmVuCisgIC8vIERlc2NyaXB0b3JEYXRhYmFzZS4KKyAgLy8gTm90ZXM6CisgIC8vIC0gSWYgYSBEZXNjcmlwdG9yUG9vbCBpcyBjb25zdHJ1Y3RlZCB0aGlzIHdheSwgaXRzIEJ1aWxkRmlsZSooKSBtZXRob2RzCisgIC8vICAgbXVzdCBub3QgYmUgY2FsbGVkICh0aGV5IHdpbGwgYXNzZXJ0LWZhaWwpLiAgVGhlIG9ubHkgd2F5IHRvIHBvcHVsYXRlCisgIC8vICAgdGhlIHBvb2wgd2l0aCBkZXNjcmlwdG9ycyBpcyB0byBjYWxsIHRoZSBGaW5kKkJ5KigpIG1ldGhvZHMuCisgIC8vIC0gVGhlIEZpbmQqQnkqKCkgbWV0aG9kcyBtYXkgYmxvY2sgdGhlIGNhbGxpbmcgdGhyZWFkIGlmIHRoZQorICAvLyAgIERlc2NyaXB0b3JEYXRhYmFzZSBibG9ja3MuICBUaGlzIGluIHR1cm4gbWVhbnMgdGhhdCBwYXJzaW5nIG1lc3NhZ2VzCisgIC8vICAgbWF5IGJsb2NrIGlmIHRoZXkgbmVlZCB0byBsb29rIHVwIGV4dGVuc2lvbnMuCisgIC8vIC0gVGhlIEZpbmQqQnkqKCkgbWV0aG9kcyB3aWxsIHVzZSBtdXRleGVzIGZvciB0aHJlYWQtc2FmZXR5LCB0aHVzIG1ha2luZworICAvLyAgIHRoZW0gc2xvd2VyIGV2ZW4gd2hlbiB0aGV5IGRvbid0IGhhdmUgdG8gZmFsbCBiYWNrIHRvIHRoZSBkYXRhYmFzZS4KKyAgLy8gICBJbiBmYWN0LCBldmVuIHRoZSBGaW5kKkJ5KigpIG1ldGhvZHMgb2YgZGVzY3JpcHRvciBvYmplY3RzIG93bmVkIGJ5CisgIC8vICAgdGhpcyBwb29sIHdpbGwgYmUgc2xvd2VyLCBzaW5jZSB0aGV5IHdpbGwgaGF2ZSB0byBvYnRhaW4gbG9ja3MgdG9vLgorICAvLyAtIEFuIEVycm9yQ29sbGVjdG9yIG1heSBvcHRpb25hbGx5IGJlIGdpdmVuIHRvIGNvbGxlY3QgdmFsaWRhdGlvbiBlcnJvcnMKKyAgLy8gICBpbiBmaWxlcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuICBJZiBub3QgZ2l2ZW4sIGVycm9ycyB3aWxsIGJlIHByaW50ZWQKKyAgLy8gICB0byBHT09HTEVfTE9HKEVSUk9SKS4gIFJlbWVtYmVyIHRoYXQgZmlsZXMgYXJlIGJ1aWx0IG9uLWRlbWFuZCwgc28gdGhpcworICAvLyAgIEVycm9yQ29sbGVjdG9yIG1heSBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkIHRoYXQgY2FsbHMgb25lIG9mIHRoZQorICAvLyAgIEZpbmQqQnkqKCkgbWV0aG9kcy4KKyAgY2xhc3MgRXJyb3JDb2xsZWN0b3I7CisgIGV4cGxpY2l0IERlc2NyaXB0b3JQb29sKERlc2NyaXB0b3JEYXRhYmFzZSogZmFsbGJhY2tfZGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IgPSBOVUxMKTsKKworICB+RGVzY3JpcHRvclBvb2woKTsKKworICAvLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBnZW5lcmF0ZWQgcG9vbC4gIEdlbmVyYXRlZCBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMKKyAgLy8gd2hpY2ggYXJlIGNvbXBpbGVkIGludG8gdGhlIGJpbmFyeSB3aWxsIGFsbG9jYXRlIHRoZWlyIGRlc2NyaXB0b3JzIGluCisgIC8vIHRoaXMgcG9vbC4gIERvIG5vdCBhZGQgeW91ciBvd24gZGVzY3JpcHRvcnMgdG8gdGhpcyBwb29sLgorICBzdGF0aWMgY29uc3QgRGVzY3JpcHRvclBvb2wqIGdlbmVyYXRlZF9wb29sKCk7CisKKyAgLy8gRmluZCBhIEZpbGVEZXNjcmlwdG9yIGluIHRoZSBwb29sIGJ5IGZpbGUgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBub3QKKyAgLy8gZm91bmQuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIC8vIEZpbmQgdGhlIEZpbGVEZXNjcmlwdG9yIGluIHRoZSBwb29sIHdoaWNoIGRlZmluZXMgdGhlIGdpdmVuIHN5bWJvbC4KKyAgLy8gSWYgYW55IG9mIHRoZSBGaW5kKkJ5TmFtZSgpIG1ldGhvZHMgYmVsb3cgd291bGQgc3VjY2VlZCwgdGhlbiB0aGlzIGlzCisgIC8vIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGF0IG1ldGhvZCBhbmQgY2FsbGluZyB0aGUgcmVzdWx0J3MgZmlsZSgpIG1ldGhvZC4KKyAgLy8gT3RoZXJ3aXNlIHRoaXMgcmV0dXJucyBOVUxMLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgICAgY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSkgY29uc3Q7CisKKyAgLy8gTG9va2luZyB1cCBkZXNjcmlwdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgZmluZCBkZXNjcmlwdG9ycyBieSBmdWxseS1xdWFsaWZpZWQgbmFtZS4gIFRoZXNlIHdpbGwgZmluZCBib3RoCisgIC8vIHRvcC1sZXZlbCBkZXNjcmlwdG9ycyBhbmQgbmVzdGVkIGRlc2NyaXB0b3JzLiAgVGhleSByZXR1cm4gTlVMTCBpZiBub3QKKyAgLy8gZm91bmQuCisKKyAgY29uc3QgRGVzY3JpcHRvciogRmluZE1lc3NhZ2VUeXBlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbkJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworICBjb25zdCBFbnVtRGVzY3JpcHRvciogRmluZEVudW1UeXBlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEZpbmRFbnVtVmFsdWVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIEZpbmRTZXJ2aWNlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIEZpbmRNZXRob2RCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKworICAvLyBGaW5kcyBhbiBleHRlbnNpb24gb2YgdGhlIGdpdmVuIHR5cGUgYnkgbnVtYmVyLiAgVGhlIGV4dGVuZGVlIG11c3QgYmUKKyAgLy8gYSBtZW1iZXIgb2YgdGhpcyBEZXNjcmlwdG9yUG9vbCBvciBvbmUgb2YgaXRzIHVuZGVybGF5cy4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uQnlOdW1iZXIoY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIGNvbnN0OworCisgIC8vIEZpbmRzIGV4dGVuc2lvbnMgb2YgZXh0ZW5kZWUuIFRoZSBleHRlbnNpb25zIHdpbGwgYmUgYXBwZW5kZWQgdG8KKyAgLy8gb3V0IGluIGFuIHVuZGVmaW5lZCBvcmRlci4gT25seSBleHRlbnNpb25zIGRlZmluZWQgZGlyZWN0bHkgaW4KKyAgLy8gdGhpcyBEZXNjcmlwdG9yUG9vbCBvciBvbmUgb2YgaXRzIHVuZGVybGF5cyBhcmUgZ3VhcmFudGVlZCB0byBiZQorICAvLyBmb3VuZDogZXh0ZW5zaW9ucyBkZWZpbmVkIGluIHRoZSBmYWxsYmFjayBkYXRhYmFzZSBtaWdodCBub3QgYmUgZm91bmQKKyAgLy8gZGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSBpbXBsZW1lbnRhdGlvbi4KKyAgdm9pZCBGaW5kQWxsRXh0ZW5zaW9ucyhjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dCkgY29uc3Q7CisKKyAgLy8gQnVpbGRpbmcgZGVzY3JpcHRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBXaGVuIGNvbnZlcnRpbmcgYSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIGEgRmlsZURlc2NyaXB0b3IsIHZhcmlvdXMKKyAgLy8gZXJyb3JzIG1pZ2h0IGJlIGRldGVjdGVkIGluIHRoZSBpbnB1dC4gIFRoZSBjYWxsZXIgbWF5IGhhbmRsZSB0aGVzZQorICAvLyBwcm9ncmFtbWF0aWNhbGx5IGJ5IGltcGxlbWVudGluZyBhbiBFcnJvckNvbGxlY3Rvci4KKyAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEVycm9yQ29sbGVjdG9yIHsKKyAgIHB1YmxpYzoKKyAgICBpbmxpbmUgRXJyb3JDb2xsZWN0b3IoKSB7fQorICAgIHZpcnR1YWwgfkVycm9yQ29sbGVjdG9yKCk7CisKKyAgICAvLyBUaGVzZSBjb25zdGFudHMgc3BlY2lmeSB3aGF0IGV4YWN0IHBhcnQgb2YgdGhlIGNvbnN0cnVjdCBpcyBicm9rZW4uCisgICAgLy8gVGhpcyBpcyB1c2VmdWwgZS5nLiBmb3IgbWFwcGluZyB0aGUgZXJyb3IgYmFjayB0byBhbiBleGFjdCBsb2NhdGlvbgorICAgIC8vIGluIGEgLnByb3RvIGZpbGUuCisgICAgZW51bSBFcnJvckxvY2F0aW9uIHsKKyAgICAgIE5BTUUsICAgICAgICAgICAgICAvLyB0aGUgc3ltYm9sIG5hbWUsIG9yIHRoZSBwYWNrYWdlIG5hbWUgZm9yIGZpbGVzCisgICAgICBOVU1CRVIsICAgICAgICAgICAgLy8gZmllbGQgb3IgZXh0ZW5zaW9uIHJhbmdlIG51bWJlcgorICAgICAgVFlQRSwgICAgICAgICAgICAgIC8vIGZpZWxkIHR5cGUKKyAgICAgIEVYVEVOREVFLCAgICAgICAgICAvLyBmaWVsZCBleHRlbmRlZQorICAgICAgREVGQVVMVF9WQUxVRSwgICAgIC8vIGZpZWxkIGRlZmF1bHQgdmFsdWUKKyAgICAgIElOUFVUX1RZUEUsICAgICAgICAvLyBtZXRob2QgaW5wdXQgdHlwZQorICAgICAgT1VUUFVUX1RZUEUsICAgICAgIC8vIG1ldGhvZCBvdXRwdXQgdHlwZQorICAgICAgT1BUSU9OX05BTUUsICAgICAgIC8vIG5hbWUgaW4gYXNzaWdubWVudAorICAgICAgT1BUSU9OX1ZBTFVFLCAgICAgIC8vIHZhbHVlIGluIG9wdGlvbiBhc3NpZ25tZW50CisgICAgICBPVEhFUiAgICAgICAgICAgICAgLy8gc29tZSBvdGhlciBwcm9ibGVtCisgICAgfTsKKworICAgIC8vIFJlcG9ydHMgYW4gZXJyb3IgaW4gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uCisgICAgdmlydHVhbCB2b2lkIEFkZEVycm9yKAorICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgICAgICAvLyBGaWxlIG5hbWUgaW4gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLgorICAgICAgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsICAvLyBGdWxsIG5hbWUgb2YgdGhlIGVycm9uZW91cyBlbGVtZW50LgorICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwgICAvLyBEZXNjcmlwdG9yIG9mIHRoZSBlcnJvbmVvdXMgZWxlbWVudC4KKyAgICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sICAgICAgLy8gT25lIG9mIHRoZSBsb2NhdGlvbiBjb25zdGFudHMsIGFib3ZlLgorICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlICAgICAgICAvLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgICAgKSA9IDA7CisKKyAgIHByaXZhdGU6CisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVycm9yQ29sbGVjdG9yKTsKKyAgfTsKKworICAvLyBDb252ZXJ0IHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHJlYWwgZGVzY3JpcHRvcnMgYW5kIHBsYWNlIHRoZW0gaW4KKyAgLy8gdGhpcyBEZXNjcmlwdG9yUG9vbC4gIEFsbCBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgbXVzdCBhbHJlYWR5IGJlIGluCisgIC8vIHRoZSBwb29sLiAgUmV0dXJucyB0aGUgcmVzdWx0aW5nIEZpbGVEZXNjcmlwdG9yLCBvciBOVUxMIGlmIHRoZXJlIHdlcmUKKyAgLy8gcHJvYmxlbXMgd2l0aCB0aGUgaW5wdXQgKGUuZy4gdGhlIG1lc3NhZ2Ugd2FzIGludmFsaWQsIG9yIGRlcGVuZGVuY2llcworICAvLyB3ZXJlIG1pc3NpbmcpLiAgRGV0YWlscyBhYm91dCB0aGUgZXJyb3JzIGFyZSB3cml0dGVuIHRvIEdPT0dMRV9MT0coRVJST1IpLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKworICAvLyBTYW1lIGFzIEJ1aWxkRmlsZSgpIGV4Y2VwdCBlcnJvcnMgYXJlIHNlbnQgdG8gdGhlIGdpdmVuIEVycm9yQ29sbGVjdG9yLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlQ29sbGVjdGluZ0Vycm9ycygKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICBFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKTsKKworICAvLyBCeSBkZWZhdWx0LCBpdCBpcyBhbiBlcnJvciBpZiBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gY29udGFpbnMgcmVmZXJlbmNlcworICAvLyB0byB0eXBlcyBvciBvdGhlciBmaWxlcyB0aGF0IGFyZSBub3QgZm91bmQgaW4gdGhlIERlc2NyaXB0b3JQb29sIChvciBpdHMKKyAgLy8gYmFja2luZyBEZXNjcmlwdG9yRGF0YWJhc2UsIGlmIGFueSkuICBJZiB5b3UgY2FsbAorICAvLyBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSwgaG93ZXZlciwgdGhlbiB1bmtub3duIHR5cGVzIGFuZCBmaWxlcworICAvLyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHBsYWNlaG9sZGVyIGRlc2NyaXB0b3JzLiAgVGhpcyBjYW4gYWxsb3cgeW91IHRvCisgIC8vIHBlcmZvcm0gc29tZSB1c2VmdWwgb3BlcmF0aW9ucyB3aXRoIGEgLnByb3RvIGZpbGUgZXZlbiBpZiB5b3UgZG8gbm90CisgIC8vIGhhdmUgYWNjZXNzIHRvIG90aGVyIC5wcm90byBmaWxlcyBvbiB3aGljaCBpdCBkZXBlbmRzLiAgSG93ZXZlciwgc29tZQorICAvLyBoZXVyaXN0aWNzIG11c3QgYmUgdXNlZCB0byBmaWxsIGluIHRoZSBnYXBzIGluIGluZm9ybWF0aW9uLCBhbmQgdGhlc2UKKyAgLy8gY2FuIGxlYWQgdG8gZGVzY3JpcHRvcnMgd2hpY2ggYXJlIGluYWNjdXJhdGUuICBGb3IgZXhhbXBsZSwgdGhlCisgIC8vIERlc2NyaXB0b3JQb29sIG1heSBiZSBmb3JjZWQgdG8gZ3Vlc3Mgd2hldGhlciBhbiB1bmtub3duIHR5cGUgaXMgYSBtZXNzYWdlCisgIC8vIG9yIGFuIGVudW0sIGFzIHdlbGwgYXMgd2hhdCBwYWNrYWdlIGl0IHJlc2lkZXMgaW4uICBGdXJ0aGVybW9yZSwKKyAgLy8gcGxhY2Vob2xkZXIgdHlwZXMgd2lsbCBub3QgYmUgZGlzY292ZXJhYmxlIHZpYSBGaW5kTWVzc2FnZVR5cGVCeU5hbWUoKQorICAvLyBhbmQgc2ltaWxhciBtZXRob2RzLCB3aGljaCBjb3VsZCBjb25mdXNlIHNvbWUgZGVzY3JpcHRvci1iYXNlZCBhbGdvcml0aG1zLgorICAvLyBHZW5lcmFsbHksIHRoZSByZXN1bHRzIG9mIHRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHJlbGllZCB1cG9uIGZvcgorICAvLyBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgIHZvaWQgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgeyBhbGxvd191bmtub3duXyA9IHRydWU7IH0KKworICAvLyBJbnRlcm5hbCBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBtZXRob2RzIE1VU1QgTk9UIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgdGhlIHByb3RvMiBsaWJyYXJ5LgorICAvLyBUaGVzZSBtZXRob2RzIG1heSBjb250YWluIGhpZGRlbiBwaXRmYWxscyBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gYQorICAvLyBmdXR1cmUgbGlicmFyeSB2ZXJzaW9uLgorCisgIC8vIENyZWF0ZSBhIERlc2NyaXB0b3JQb29sIHdoaWNoIGlzIG92ZXJsYWlkIG9uIHRvcCBvZiBzb21lIG90aGVyIHBvb2wuCisgIC8vIElmIHlvdSBzZWFyY2ggZm9yIGEgZGVzY3JpcHRvciBpbiB0aGUgb3ZlcmxheSBhbmQgaXQgaXMgbm90IGZvdW5kLCB0aGUKKyAgLy8gdW5kZXJsYXkgd2lsbCBiZSBzZWFyY2hlZCBhcyBhIGJhY2t1cC4gIElmIHRoZSB1bmRlcmxheSBoYXMgaXRzIG93bgorICAvLyB1bmRlcmxheSwgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIG5leHQsIGFuZCBzbyBvbi4gIFRoaXMgYWxzbyBtZWFucyB0aGF0CisgIC8vIGZpbGVzIGJ1aWx0IGluIHRoZSBvdmVybGF5IHdpbGwgYmUgY3Jvc3MtbGlua2VkIHdpdGggdGhlIHVuZGVybGF5J3MKKyAgLy8gZGVzY3JpcHRvcnMgaWYgbmVjZXNzYXJ5LiAgVGhlIHVuZGVybGF5IHJlbWFpbnMgcHJvcGVydHkgb2YgdGhlIGNhbGxlcjsKKyAgLy8gaXQgbXVzdCByZW1haW4gdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgbmV3bHktY29uc3RydWN0ZWQgcG9vbC4KKyAgLy8KKyAgLy8gRXhhbXBsZTogIFNheSB5b3Ugd2FudCB0byBwYXJzZSBhIC5wcm90byBmaWxlIGF0IHJ1bnRpbWUgaW4gb3JkZXIgdG8gdXNlCisgIC8vIGl0cyB0eXBlIHdpdGggYSBEeW5hbWljTWVzc2FnZS4gIFNheSB0aGlzIC5wcm90byBmaWxlIGhhcyBkZXBlbmRlbmNpZXMsCisgIC8vIGJ1dCB5b3Uga25vdyB0aGF0IGFsbCB0aGUgZGVwZW5kZW5jaWVzIHdpbGwgYmUgdGhpbmdzIHRoYXQgYXJlIGFscmVhZHkKKyAgLy8gY29tcGlsZWQgaW50byB0aGUgYmluYXJ5LiAgRm9yIGVhc2Ugb2YgdXNlLCB5b3UnZCBsaWtlIHRvIGxvYWQgdGhlIHR5cGVzCisgIC8vIHJpZ2h0IG91dCBvZiBnZW5lcmF0ZWRfcG9vbCgpIHJhdGhlciB0aGFuIGhhdmUgdG8gcGFyc2UgcmVkdW5kYW50IGNvcGllcworICAvLyBvZiBhbGwgdGhlc2UgLnByb3RvcyBhbmQgcnVudGltZS4gIEJ1dCwgeW91IGRvbid0IHdhbnQgdG8gYWRkIHRoZSBwYXJzZWQKKyAgLy8gdHlwZXMgZGlyZWN0bHkgaW50byBnZW5lcmF0ZWRfcG9vbCgpOiB0aGlzIGlzIG5vdCBhbGxvd2VkLCBhbmQgd291bGQgYmUKKyAgLy8gYmFkIGRlc2lnbiBhbnl3YXkuICBTbywgaW5zdGVhZCwgeW91IGNvdWxkIHVzZSBnZW5lcmF0ZWRfcG9vbCgpIGFzIGFuCisgIC8vIHVuZGVybGF5IGZvciBhIG5ldyBEZXNjcmlwdG9yUG9vbCBpbiB3aGljaCB5b3UgYWRkIG9ubHkgdGhlIG5ldyBmaWxlLgorICAvLworICAvLyBXQVJOSU5HOiAgVXNlIG9mIHVuZGVybGF5cyBjYW4gbGVhZCB0byBtYW55IHN1YnRsZSBnb3RjaGFzLiAgSW5zdGVhZCwKKyAgLy8gICB0cnkgdG8gZm9ybXVsYXRlIHdoYXQgeW91IHdhbnQgdG8gZG8gaW4gdGVybXMgb2YgRGVzY3JpcHRvckRhdGFiYXNlcy4KKyAgZXhwbGljaXQgRGVzY3JpcHRvclBvb2woY29uc3QgRGVzY3JpcHRvclBvb2wqIHVuZGVybGF5KTsKKworICAvLyBDYWxsZWQgYnkgZ2VuZXJhdGVkIGNsYXNzZXMgYXQgaW5pdCB0aW1lIHRvIGFkZCB0aGVpciBkZXNjcmlwdG9ycyB0bworICAvLyBnZW5lcmF0ZWRfcG9vbC4gIERvIE5PVCBjYWxsIHRoaXMgaW4geW91ciBvd24gY29kZSEgIGZpbGVuYW1lIG11c3QgYmUgYQorICAvLyBwZXJtYW5lbnQgc3RyaW5nIChlLmcuIGEgc3RyaW5nIGxpdGVyYWwpLgorICBzdGF0aWMgdm9pZCBJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoCisgICAgICBjb25zdCB2b2lkKiBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgaW50IHNpemUpOworCisKKyAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5OiAgR2V0cyBhIG5vbi1jb25zdCBwb2ludGVyIHRvIHRoZSBnZW5lcmF0ZWQgcG9vbC4KKyAgLy8gVGhpcyBpcyBjYWxsZWQgYXQgc3RhdGljLWluaXRpYWxpemF0aW9uIHRpbWUgb25seSwgc28gdGhyZWFkLXNhZmV0eSBpcworICAvLyBub3QgYSBjb25jZXJuLiAgSWYgYm90aCBhbiB1bmRlcmxheSBhbmQgYSBmYWxsYmFjayBkYXRhYmFzZSBhcmUgcHJlc2VudCwKKyAgLy8gdGhlIGZhbGxiYWNrIGRhdGFiYXNlIHRha2VzIHByZWNlZGVuY2UuCisgIHN0YXRpYyBEZXNjcmlwdG9yUG9vbCogaW50ZXJuYWxfZ2VuZXJhdGVkX3Bvb2woKTsKKworICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHk6ICBDaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiBCdWlsZEZpbGUoKSBzdWNoIHRoYXQgaXQKKyAgLy8gYWxsb3dzIHRoZSBmaWxlIHRvIG1ha2UgcmVmZXJlbmNlIHRvIG1lc3NhZ2UgdHlwZXMgZGVjbGFyZWQgaW4gb3RoZXIgZmlsZXMKKyAgLy8gd2hpY2ggaXQgZGlkIG5vdCBvZmZpY2lhbGx5IGRlY2xhcmUgYXMgZGVwZW5kZW5jaWVzLgorICB2b2lkIEludGVybmFsRG9udEVuZm9yY2VEZXBlbmRlbmNpZXMoKTsKKworICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgIHZvaWQgaW50ZXJuYWxfc2V0X3VuZGVybGF5KGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheSkgeworICAgIHVuZGVybGF5XyA9IHVuZGVybGF5OworICB9CisKKyAgLy8gRm9yIGludGVybmFsICh1bml0IHRlc3QpIHVzZSBvbmx5OiAgUmV0dXJucyB0cnVlIGlmIGEgRmlsZURlc2NyaXB0b3IgaGFzCisgIC8vIGJlZW4gY29uc3RydWN0ZWQgZm9yIHRoZSBnaXZlbiBmaWxlLCBmYWxzZSBvdGhlcndpc2UuICBVc2VmdWwgZm9yIHRlc3RpbmcKKyAgLy8gbGF6eSBkZXNjcmlwdG9yIGluaXRpYWxpemF0aW9uIGJlaGF2aW9yLgorICBib29sIEludGVybmFsSXNGaWxlTG9hZGVkKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBGaWVsZERlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBFbnVtRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIFNlcnZpY2VEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKKworICAvLyBUcmllcyB0byBmaW5kIHNvbWV0aGluZyBpbiB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgYW5kIGxpbmsgaW4gdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgcHJvdG8gZmlsZS4gIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBpbiB3aGljaCBjYXNlCisgIC8vIHRoZSBjYWxsZXIgc2hvdWxkIHNlYXJjaCBmb3IgdGhlIHRoaW5nIGFnYWluLiAgVGhlc2UgYXJlIGRlY2xhcmVkCisgIC8vIGNvbnN0IGJlY2F1c2UgdGhleSBhcmUgY2FsbGVkIGJ5IChzZW1hbnRpY2FsbHkpIGNvbnN0IG1ldGhvZHMuCisgIGJvb2wgVHJ5RmluZEZpbGVJbkZhbGxiYWNrRGF0YWJhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgYm9vbCBUcnlGaW5kU3ltYm9sSW5GYWxsYmFja0RhdGFiYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGJvb2wgVHJ5RmluZEV4dGVuc2lvbkluRmFsbGJhY2tEYXRhYmFzZShjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyKSBjb25zdDsKKworICAvLyBMaWtlIEJ1aWxkRmlsZSgpIGJ1dCBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIHRoZSBmaWxlIGhhcyBiZWVuIGxvYWRlZCBmcm9tCisgIC8vIGZhbGxiYWNrX2RhdGFiYXNlXy4gIERlY2xhcmVkIGNvbnN0IGJlY2F1c2UgaXQgaXMgY2FsbGVkIGJ5IChzZW1hbnRpY2FsbHkpCisgIC8vIGNvbnN0IG1ldGhvZHMuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBCdWlsZEZpbGVGcm9tRGF0YWJhc2UoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIGNvbnN0OworCisgIC8vIElmIGZhbGxiYWNrX2RhdGFiYXNlXyBpcyBOVUxMLCB0aGlzIGlzIE5VTEwuICBPdGhlcndpc2UsIHRoaXMgaXMgYSBtdXRleAorICAvLyB3aGljaCBtdXN0IGJlIGxvY2tlZCB3aGlsZSBhY2Nlc3NpbmcgdGFibGVzXy4KKyAgTXV0ZXgqIG11dGV4XzsKKworICAvLyBTZWUgY29uc3RydWN0b3IuCisgIERlc2NyaXB0b3JEYXRhYmFzZSogZmFsbGJhY2tfZGF0YWJhc2VfOworICBFcnJvckNvbGxlY3RvciogZGVmYXVsdF9lcnJvcl9jb2xsZWN0b3JfOworICBjb25zdCBEZXNjcmlwdG9yUG9vbCogdW5kZXJsYXlfOworCisgIC8vIFRoaXMgY2xhc3MgY29udGFpbnMgYSBsb3Qgb2YgaGFzaCBtYXBzIHdpdGggY29tcGxpY2F0ZWQgdHlwZXMgdGhhdAorICAvLyB3ZSdkIGxpa2UgdG8ga2VlcCBvdXQgb2YgdGhlIGhlYWRlci4KKyAgY2xhc3MgVGFibGVzOworICBzY29wZWRfcHRyPFRhYmxlcz4gdGFibGVzXzsKKworICBib29sIGVuZm9yY2VfZGVwZW5kZW5jaWVzXzsKKyAgYm9vbCBhbGxvd191bmtub3duXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVzY3JpcHRvclBvb2wpOworfTsKKworLy8gaW5saW5lIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUaGVzZSBtYWNyb3MgbWFrZXMgdGhpcyByZXBldGl0aXZlIGNvZGUgbW9yZSByZWFkYWJsZS4KKyNkZWZpbmUgUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKENMQVNTLCBGSUVMRCwgVFlQRSkgXAorICBpbmxpbmUgVFlQRSBDTEFTUzo6RklFTEQoKSBjb25zdCB7IHJldHVybiBGSUVMRCMjXzsgfQorCisvLyBTdHJpbmdzIGZpZWxkcyBhcmUgc3RvcmVkIGFzIHBvaW50ZXJzIGJ1dCByZXR1cm5lZCBhcyBjb25zdCByZWZlcmVuY2VzLgorI2RlZmluZSBQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKENMQVNTLCBGSUVMRCkgXAorICBpbmxpbmUgY29uc3Qgc3RyaW5nJiBDTEFTUzo6RklFTEQoKSBjb25zdCB7IHJldHVybiAqRklFTEQjI187IH0KKworLy8gQXJyYXlzIHRha2UgYW4gaW5kZXggcGFyYW1ldGVyLCBvYnZpb3VzbHkuCisjZGVmaW5lIFBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihDTEFTUywgRklFTEQsIFRZUEUpIFwKKyAgaW5saW5lIFRZUEUgQ0xBU1M6OkZJRUxEKGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gRklFTEQjI3NfICsgaW5kZXg7IH0KKworI2RlZmluZSBQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihDTEFTUywgVFlQRSkgXAorICBpbmxpbmUgY29uc3QgVFlQRSYgQ0xBU1M6Om9wdGlvbnMoKSBjb25zdCB7IHJldHVybiAqb3B0aW9uc187IH0KKworUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihEZXNjcmlwdG9yLCBuYW1lKQorUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihEZXNjcmlwdG9yLCBmdWxsX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgZmlsZSwgY29uc3QgRmlsZURlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIGNvbnRhaW5pbmdfdHlwZSwgY29uc3QgRGVzY3JpcHRvciopCisKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBmaWVsZF9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIG5lc3RlZF90eXBlX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgZW51bV90eXBlX2NvdW50LCBpbnQpCisKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBmaWVsZCwgY29uc3QgRmllbGREZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBuZXN0ZWRfdHlwZSwgY29uc3QgRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRGVzY3JpcHRvciwgZW51bV90eXBlLCBjb25zdCBFbnVtRGVzY3JpcHRvciopCisKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBleHRlbnNpb25fcmFuZ2VfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBleHRlbnNpb25fY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBleHRlbnNpb25fcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqKQorUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKERlc2NyaXB0b3IsIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoRGVzY3JpcHRvciwgTWVzc2FnZU9wdGlvbnMpOworCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgbmFtZSkKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBmdWxsX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgbG93ZXJjYXNlX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgY2FtZWxjYXNlX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBmaWxlLCBjb25zdCBGaWxlRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBudW1iZXIsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGlzX2V4dGVuc2lvbiwgYm9vbCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIHR5cGUsIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGxhYmVsLCBGaWVsZERlc2NyaXB0b3I6OkxhYmVsKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgY29udGFpbmluZ190eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGV4dGVuc2lvbl9zY29wZSwgY29uc3QgRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBtZXNzYWdlX3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZW51bV90eXBlLCBjb25zdCBFbnVtRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBleHBlcmltZW50YWxfbWFwX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBGaWVsZE9wdGlvbnMpOworUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgaGFzX2RlZmF1bHRfdmFsdWUsIGJvb2wpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX2ludDMyICwgaW50MzIgKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV9pbnQ2NCAsIGludDY0ICkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfdWludDMyLCB1aW50MzIpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX3VpbnQ2NCwgdWludDY0KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV9mbG9hdCAsIGZsb2F0ICkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfZG91YmxlLCBkb3VibGUpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX2Jvb2wgICwgYm9vbCAgKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV9lbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfc3RyaW5nKQorCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEVudW1EZXNjcmlwdG9yLCBuYW1lKQorUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgZnVsbF9uYW1lKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEVudW1EZXNjcmlwdG9yLCBmaWxlLCBjb25zdCBGaWxlRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIGNvbnRhaW5pbmdfdHlwZSwgY29uc3QgRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIHZhbHVlX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIEVudW1PcHRpb25zKTsKKworUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCBuYW1lKQorUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCBmdWxsX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRW51bVZhbHVlRGVzY3JpcHRvciwgbnVtYmVyLCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRW51bVZhbHVlRGVzY3JpcHRvciwgdHlwZSwgY29uc3QgRW51bURlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoRW51bVZhbHVlRGVzY3JpcHRvciwgRW51bVZhbHVlT3B0aW9ucyk7CisKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoU2VydmljZURlc2NyaXB0b3IsIG5hbWUpCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKFNlcnZpY2VEZXNjcmlwdG9yLCBmdWxsX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoU2VydmljZURlc2NyaXB0b3IsIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihTZXJ2aWNlRGVzY3JpcHRvciwgbWV0aG9kX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoU2VydmljZURlc2NyaXB0b3IsIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKFNlcnZpY2VEZXNjcmlwdG9yLCBTZXJ2aWNlT3B0aW9ucyk7CisKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoTWV0aG9kRGVzY3JpcHRvciwgbmFtZSkKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoTWV0aG9kRGVzY3JpcHRvciwgZnVsbF9uYW1lKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKE1ldGhvZERlc2NyaXB0b3IsIHNlcnZpY2UsIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yLCBpbnB1dF90eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yLCBvdXRwdXRfdHlwZSwgY29uc3QgRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yLCBNZXRob2RPcHRpb25zKTsKKworUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgbmFtZSkKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHBhY2thZ2UpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHBvb2wsIGNvbnN0IERlc2NyaXB0b3JQb29sKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZGVwZW5kZW5jeV9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBtZXNzYWdlX3R5cGVfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZW51bV90eXBlX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHNlcnZpY2VfY291bnQsIGludCkKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZXh0ZW5zaW9uX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgRmlsZU9wdGlvbnMpOworCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIG1lc3NhZ2VfdHlwZSwgY29uc3QgRGVzY3JpcHRvciopCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIGVudW1fdHlwZSwgY29uc3QgRW51bURlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciopCisKKyN1bmRlZiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IKKyN1bmRlZiBQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SCisjdW5kZWYgUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SCisKKy8vIEEgZmV3IGFjY2Vzc29ycyBkaWZmZXIgZnJvbSB0aGUgbWFjcm9zLi4uCisKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvcjo6aXNfcmVxdWlyZWQoKSBjb25zdCB7CisgIHJldHVybiBsYWJlbCgpID09IExBQkVMX1JFUVVJUkVEOworfQorCitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3I6OmlzX29wdGlvbmFsKCkgY29uc3QgeworICByZXR1cm4gbGFiZWwoKSA9PSBMQUJFTF9PUFRJT05BTDsKK30KKworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yOjppc19yZXBlYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGxhYmVsKCkgPT0gTEFCRUxfUkVQRUFURUQ7Cit9CisKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvcjo6aXNfcGFja2FibGUoKSBjb25zdCB7CisgIHJldHVybiBpc19yZXBlYXRlZCgpICYmIElzVHlwZVBhY2thYmxlKHR5cGUoKSk7Cit9CisKKy8vIFRvIHNhdmUgc3BhY2UsIGluZGV4KCkgaXMgY29tcHV0ZWQgYnkgbG9va2luZyBhdCB0aGUgZGVzY3JpcHRvcidzIHBvc2l0aW9uCisvLyBpbiB0aGUgcGFyZW50J3MgYXJyYXkgb2YgY2hpbGRyZW4uCitpbmxpbmUgaW50IEZpZWxkRGVzY3JpcHRvcjo6aW5kZXgoKSBjb25zdCB7CisgIGlmICghaXNfZXh0ZW5zaW9uXykgeworICAgIHJldHVybiB0aGlzIC0gY29udGFpbmluZ190eXBlXy0+ZmllbGRzXzsKKyAgfSBlbHNlIGlmIChleHRlbnNpb25fc2NvcGVfICE9IE5VTEwpIHsKKyAgICByZXR1cm4gdGhpcyAtIGV4dGVuc2lvbl9zY29wZV8tPmV4dGVuc2lvbnNfOworICB9IGVsc2UgeworICAgIHJldHVybiB0aGlzIC0gZmlsZV8tPmV4dGVuc2lvbnNfOworICB9Cit9CisKK2lubGluZSBpbnQgRGVzY3JpcHRvcjo6aW5kZXgoKSBjb25zdCB7CisgIGlmIChjb250YWluaW5nX3R5cGVfID09IE5VTEwpIHsKKyAgICByZXR1cm4gdGhpcyAtIGZpbGVfLT5tZXNzYWdlX3R5cGVzXzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdGhpcyAtIGNvbnRhaW5pbmdfdHlwZV8tPm5lc3RlZF90eXBlc187CisgIH0KK30KKworaW5saW5lIGludCBFbnVtRGVzY3JpcHRvcjo6aW5kZXgoKSBjb25zdCB7CisgIGlmIChjb250YWluaW5nX3R5cGVfID09IE5VTEwpIHsKKyAgICByZXR1cm4gdGhpcyAtIGZpbGVfLT5lbnVtX3R5cGVzXzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdGhpcyAtIGNvbnRhaW5pbmdfdHlwZV8tPmVudW1fdHlwZXNfOworICB9Cit9CisKK2lubGluZSBpbnQgRW51bVZhbHVlRGVzY3JpcHRvcjo6aW5kZXgoKSBjb25zdCB7CisgIHJldHVybiB0aGlzIC0gdHlwZV8tPnZhbHVlc187Cit9CisKK2lubGluZSBpbnQgU2VydmljZURlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgeworICByZXR1cm4gdGhpcyAtIGZpbGVfLT5zZXJ2aWNlc187Cit9CisKK2lubGluZSBpbnQgTWV0aG9kRGVzY3JpcHRvcjo6aW5kZXgoKSBjb25zdCB7CisgIHJldHVybiB0aGlzIC0gc2VydmljZV8tPm1ldGhvZHNfOworfQorCitpbmxpbmUgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIEZpZWxkRGVzY3JpcHRvcjo6Y3BwX3R5cGUoKSBjb25zdCB7CisgIHJldHVybiBrVHlwZVRvQ3BwVHlwZU1hcFt0eXBlX107Cit9CisKK2lubGluZSBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgRmllbGREZXNjcmlwdG9yOjpUeXBlVG9DcHBUeXBlKFR5cGUgdHlwZSkgeworICByZXR1cm4ga1R5cGVUb0NwcFR5cGVNYXBbdHlwZV07Cit9CisKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvcjo6SXNUeXBlUGFja2FibGUoVHlwZSBmaWVsZF90eXBlKSB7CisgIHJldHVybiAoZmllbGRfdHlwZSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HICYmCisgICAgICAgICAgZmllbGRfdHlwZSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgJiYKKyAgICAgICAgICBmaWVsZF90eXBlICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFICYmCisgICAgICAgICAgZmllbGRfdHlwZSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMpOworfQorCitpbmxpbmUgY29uc3QgRmlsZURlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yOjpkZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gZGVwZW5kZW5jaWVzX1tpbmRleF07Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxNjA4MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MKQEAgLTAsMCArMSw3NzUzIEBACisvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorCisjZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OCisjaW5jbHVkZSAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIHsKKworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvclNldF9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgRmlsZURlc2NyaXB0b3JTZXRfcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBGaWxlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfZGVzY3JpcHRvcl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCisgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBGaWVsZERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgRW51bURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogU2VydmljZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgU2VydmljZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgTWV0aG9kRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRmlsZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCisgIEZpbGVPcHRpb25zX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIE1lc3NhZ2VPcHRpb25zX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBNZXNzYWdlT3B0aW9uc19yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpZWxkT3B0aW9uc19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgRmllbGRPcHRpb25zX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkT3B0aW9uc19DVHlwZV9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEVudW1PcHRpb25zX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBFbnVtT3B0aW9uc19yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEVudW1WYWx1ZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCisgIEVudW1WYWx1ZU9wdGlvbnNfcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBTZXJ2aWNlT3B0aW9uc19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgU2VydmljZU9wdGlvbnNfcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBNZXRob2RPcHRpb25zX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBNZXRob2RPcHRpb25zX3JlZmxlY3Rpb25fID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogVW5pbnRlcnByZXRlZE9wdGlvbl9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgVW5pbnRlcnByZXRlZE9wdGlvbl9yZWZsZWN0aW9uXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfZGVzY3JpcHRvcl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCisgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBTb3VyY2VDb2RlSW5mb19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgU291cmNlQ29kZUluZm9fcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fcmVmbGVjdGlvbl8gPSBOVUxMOworCit9ICAvLyBuYW1lc3BhY2UKKworCit2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKSB7CisgIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvciogZmlsZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS0+RmluZEZpbGVCeU5hbWUoCisgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iKTsKKyAgR09PR0xFX0NIRUNLKGZpbGUgIT0gTlVMTCk7CisgIEZpbGVEZXNjcmlwdG9yU2V0X2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDApOworICBzdGF0aWMgY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yU2V0X29mZnNldHNfWzFdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JTZXQsIGZpbGVfKSwKKyAgfTsKKyAgRmlsZURlc2NyaXB0b3JTZXRfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIEZpbGVEZXNjcmlwdG9yU2V0X2Rlc2NyaXB0b3JfLAorICAgICAgRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgRmlsZURlc2NyaXB0b3JTZXRfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yU2V0LCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JTZXQsIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihGaWxlRGVzY3JpcHRvclNldCkpOworICBGaWxlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDEpOworICBzdGF0aWMgY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bOV0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBwYWNrYWdlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBkZXBlbmRlbmN5XyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBtZXNzYWdlX3R5cGVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIGVudW1fdHlwZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgc2VydmljZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgZXh0ZW5zaW9uXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBvcHRpb25zXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBzb3VyY2VfY29kZV9pbmZvXyksCisgIH07CisgIEZpbGVEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sCisgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoRmlsZURlc2NyaXB0b3JQcm90bykpOworICBEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMik7CisgIHN0YXRpYyBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvX29mZnNldHNfWzddID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIGZpZWxkXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIGV4dGVuc2lvbl8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBuZXN0ZWRfdHlwZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBlbnVtX3R5cGVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgZXh0ZW5zaW9uX3JhbmdlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIG9wdGlvbnNfKSwKKyAgfTsKKyAgRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sCisgICAgICBEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihEZXNjcmlwdG9yUHJvdG8pKTsKKyAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX2Rlc2NyaXB0b3JfID0gRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZSgwKTsKKyAgc3RhdGljIGNvbnN0IGludCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2Vfb2Zmc2V0c19bMl0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UsIHN0YXJ0XyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UsIGVuZF8pLAorICB9OworICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9kZXNjcmlwdG9yXywKKyAgICAgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2Vfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSwgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSwgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSkpOworICBGaWVsZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgzKTsKKyAgc3RhdGljIGNvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90b19vZmZzZXRzX1s4XSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgbnVtYmVyXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgbGFiZWxfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCB0eXBlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgdHlwZV9uYW1lXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgZXh0ZW5kZWVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBkZWZhdWx0X3ZhbHVlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgb3B0aW9uc18pLAorICB9OworICBGaWVsZERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9CisgICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sCisgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBGaWVsZERlc2NyaXB0b3JQcm90b19vZmZzZXRzXywKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKEZpZWxkRGVzY3JpcHRvclByb3RvKSk7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcl8gPSBGaWVsZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXy0+ZW51bV90eXBlKDApOworICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9kZXNjcmlwdG9yXyA9IEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLT5lbnVtX3R5cGUoMSk7CisgIEVudW1EZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoNCk7CisgIHN0YXRpYyBjb25zdCBpbnQgRW51bURlc2NyaXB0b3JQcm90b19vZmZzZXRzX1szXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1EZXNjcmlwdG9yUHJvdG8sIG5hbWVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1EZXNjcmlwdG9yUHJvdG8sIHZhbHVlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtRGVzY3JpcHRvclByb3RvLCBvcHRpb25zXyksCisgIH07CisgIEVudW1EZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sCisgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1EZXNjcmlwdG9yUHJvdG8sIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtRGVzY3JpcHRvclByb3RvLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoRW51bURlc2NyaXB0b3JQcm90bykpOworICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoNSk7CisgIHN0YXRpYyBjb25zdCBpbnQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX29mZnNldHNfWzNdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8sIG51bWJlcl8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBvcHRpb25zXyksCisgIH07CisgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9CisgICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLAorICAgICAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19vZmZzZXRzXywKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKSk7CisgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoNik7CisgIHN0YXRpYyBjb25zdCBpbnQgU2VydmljZURlc2NyaXB0b3JQcm90b19vZmZzZXRzX1szXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8sIG5hbWVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8sIG1ldGhvZF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZURlc2NyaXB0b3JQcm90bywgb3B0aW9uc18pLAorICB9OworICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLAorICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTZXJ2aWNlRGVzY3JpcHRvclByb3RvLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZURlc2NyaXB0b3JQcm90bywgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pKTsKKyAgTWV0aG9kRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDcpOworICBzdGF0aWMgY29uc3QgaW50IE1ldGhvZERlc2NyaXB0b3JQcm90b19vZmZzZXRzX1s0XSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZERlc2NyaXB0b3JQcm90bywgbmFtZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kRGVzY3JpcHRvclByb3RvLCBpbnB1dF90eXBlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIG91dHB1dF90eXBlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIG9wdGlvbnNfKSwKKyAgfTsKKyAgTWV0aG9kRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sCisgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihNZXRob2REZXNjcmlwdG9yUHJvdG8pKTsKKyAgRmlsZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoOCk7CisgIHN0YXRpYyBjb25zdCBpbnQgRmlsZU9wdGlvbnNfb2Zmc2V0c19bMTBdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGphdmFfcGFja2FnZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGphdmFfb3V0ZXJfY2xhc3NuYW1lXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgamF2YV9tdWx0aXBsZV9maWxlc18pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIHJldGFpbl91bmtub3duX2ZpZWxkc18pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgb3B0aW1pemVfZm9yXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgY2NfZ2VuZXJpY19zZXJ2aWNlc18pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGphdmFfZ2VuZXJpY19zZXJ2aWNlc18pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIHB5X2dlbmVyaWNfc2VydmljZXNfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl8pLAorICB9OworICBGaWxlT3B0aW9uc19yZWZsZWN0aW9uXyA9CisgICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgRmlsZU9wdGlvbnNfZGVzY3JpcHRvcl8sCisgICAgICBGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBGaWxlT3B0aW9uc19vZmZzZXRzXywKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIF9oYXNfYml0c19bMF0pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgX3Vua25vd25fZmllbGRzXyksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBfZXh0ZW5zaW9uc18pLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoRmlsZU9wdGlvbnMpKTsKKyAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3JfID0gRmlsZU9wdGlvbnNfZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgwKTsKKyAgTWVzc2FnZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoOSk7CisgIHN0YXRpYyBjb25zdCBpbnQgTWVzc2FnZU9wdGlvbnNfb2Zmc2V0c19bM10gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXNzYWdlT3B0aW9ucywgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1lc3NhZ2VPcHRpb25zLCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXNzYWdlT3B0aW9ucywgdW5pbnRlcnByZXRlZF9vcHRpb25fKSwKKyAgfTsKKyAgTWVzc2FnZU9wdGlvbnNfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIE1lc3NhZ2VPcHRpb25zX2Rlc2NyaXB0b3JfLAorICAgICAgTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgTWVzc2FnZU9wdGlvbnNfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1lc3NhZ2VPcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWVzc2FnZU9wdGlvbnMsIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXNzYWdlT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKE1lc3NhZ2VPcHRpb25zKSk7CisgIEZpZWxkT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxMCk7CisgIHN0YXRpYyBjb25zdCBpbnQgRmllbGRPcHRpb25zX29mZnNldHNfWzVdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCBjdHlwZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCBwYWNrZWRfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgZGVwcmVjYXRlZF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCBleHBlcmltZW50YWxfbWFwX2tleV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl8pLAorICB9OworICBGaWVsZE9wdGlvbnNfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIEZpZWxkT3B0aW9uc19kZXNjcmlwdG9yXywKKyAgICAgIEZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBGaWVsZE9wdGlvbnNfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgX3Vua25vd25fZmllbGRzXyksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKEZpZWxkT3B0aW9ucykpOworICBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcl8gPSBGaWVsZE9wdGlvbnNfZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgwKTsKKyAgRW51bU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTEpOworICBzdGF0aWMgY29uc3QgaW50IEVudW1PcHRpb25zX29mZnNldHNfWzFdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bU9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCisgIH07CisgIEVudW1PcHRpb25zX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBFbnVtT3B0aW9uc19kZXNjcmlwdG9yXywKKyAgICAgIEVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIEVudW1PcHRpb25zX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtT3B0aW9ucywgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1PcHRpb25zLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bU9wdGlvbnMsIF9leHRlbnNpb25zXyksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihFbnVtT3B0aW9ucykpOworICBFbnVtVmFsdWVPcHRpb25zX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDEyKTsKKyAgc3RhdGljIGNvbnN0IGludCBFbnVtVmFsdWVPcHRpb25zX29mZnNldHNfWzFdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlT3B0aW9ucywgdW5pbnRlcnByZXRlZF9vcHRpb25fKSwKKyAgfTsKKyAgRW51bVZhbHVlT3B0aW9uc19yZWZsZWN0aW9uXyA9CisgICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgRW51bVZhbHVlT3B0aW9uc19kZXNjcmlwdG9yXywKKyAgICAgIEVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgRW51bVZhbHVlT3B0aW9uc19vZmZzZXRzXywKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlT3B0aW9ucywgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZU9wdGlvbnMsIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtVmFsdWVPcHRpb25zLCBfZXh0ZW5zaW9uc18pLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoRW51bVZhbHVlT3B0aW9ucykpOworICBTZXJ2aWNlT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxMyk7CisgIHN0YXRpYyBjb25zdCBpbnQgU2VydmljZU9wdGlvbnNfb2Zmc2V0c19bMV0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTZXJ2aWNlT3B0aW9ucywgdW5pbnRlcnByZXRlZF9vcHRpb25fKSwKKyAgfTsKKyAgU2VydmljZU9wdGlvbnNfcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIFNlcnZpY2VPcHRpb25zX2Rlc2NyaXB0b3JfLAorICAgICAgU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgU2VydmljZU9wdGlvbnNfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VPcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZU9wdGlvbnMsIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTZXJ2aWNlT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKFNlcnZpY2VPcHRpb25zKSk7CisgIE1ldGhvZE9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTQpOworICBzdGF0aWMgY29uc3QgaW50IE1ldGhvZE9wdGlvbnNfb2Zmc2V0c19bMV0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2RPcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl8pLAorICB9OworICBNZXRob2RPcHRpb25zX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBNZXRob2RPcHRpb25zX2Rlc2NyaXB0b3JfLAorICAgICAgTWV0aG9kT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBNZXRob2RPcHRpb25zX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2RPcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kT3B0aW9ucywgX3Vua25vd25fZmllbGRzXyksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZE9wdGlvbnMsIF9leHRlbnNpb25zXyksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihNZXRob2RPcHRpb25zKSk7CisgIFVuaW50ZXJwcmV0ZWRPcHRpb25fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTUpOworICBzdGF0aWMgY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25fb2Zmc2V0c19bN10gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uLCBuYW1lXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uLCBpZGVudGlmaWVyX3ZhbHVlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uLCBwb3NpdGl2ZV9pbnRfdmFsdWVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIG5lZ2F0aXZlX2ludF92YWx1ZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgZG91YmxlX3ZhbHVlXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uLCBzdHJpbmdfdmFsdWVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIGFnZ3JlZ2F0ZV92YWx1ZV8pLAorICB9OworICBVbmludGVycHJldGVkT3B0aW9uX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBVbmludGVycHJldGVkT3B0aW9uX2Rlc2NyaXB0b3JfLAorICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBVbmludGVycHJldGVkT3B0aW9uX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKFVuaW50ZXJwcmV0ZWRPcHRpb24pKTsKKyAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9kZXNjcmlwdG9yXyA9IFVuaW50ZXJwcmV0ZWRPcHRpb25fZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKDApOworICBzdGF0aWMgY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfb2Zmc2V0c19bMl0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0LCBuYW1lX3BhcnRfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQsIGlzX2V4dGVuc2lvbl8pLAorICB9OworICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2Rlc2NyaXB0b3JfLAorICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0LCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCwgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgc2l6ZW9mKFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQpKTsKKyAgU291cmNlQ29kZUluZm9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTYpOworICBzdGF0aWMgY29uc3QgaW50IFNvdXJjZUNvZGVJbmZvX29mZnNldHNfWzFdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm8sIGxvY2F0aW9uXyksCisgIH07CisgIFNvdXJjZUNvZGVJbmZvX3JlZmxlY3Rpb25fID0KKyAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBTb3VyY2VDb2RlSW5mb19kZXNjcmlwdG9yXywKKyAgICAgIFNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIFNvdXJjZUNvZGVJbmZvX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mbywgX2hhc19iaXRzX1swXSksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCisgICAgICBzaXplb2YoU291cmNlQ29kZUluZm8pKTsKKyAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fZGVzY3JpcHRvcl8gPSBTb3VyY2VDb2RlSW5mb19kZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoMCk7CisgIHN0YXRpYyBjb25zdCBpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb25fb2Zmc2V0c19bMl0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgcGF0aF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm9fTG9jYXRpb24sIHNwYW5fKSwKKyAgfTsKKyAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fcmVmbGVjdGlvbl8gPQorICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Rlc2NyaXB0b3JfLAorICAgICAgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm9fTG9jYXRpb24sIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgIHNpemVvZihTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbikpOworfQorCituYW1lc3BhY2UgeworCitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzX29uY2VfKTsKK2lubGluZSB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgmcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNfb25jZV8sCisgICAgICAgICAgICAgICAgICZwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKTsKK30KKwordm9pZCBwcm90b2J1Zl9SZWdpc3RlclR5cGVzKGNvbnN0IDo6c3RkOjpzdHJpbmcmKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICBGaWxlRGVzY3JpcHRvclNldF9kZXNjcmlwdG9yXywgJkZpbGVEZXNjcmlwdG9yU2V0OjpkZWZhdWx0X2luc3RhbmNlKCkpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLCAmRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLCAmRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfZGVzY3JpcHRvcl8sICZEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLCAmRmllbGREZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIEVudW1EZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZFbnVtRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICBNZXRob2REZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIEZpbGVPcHRpb25zX2Rlc2NyaXB0b3JfLCAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIE1lc3NhZ2VPcHRpb25zX2Rlc2NyaXB0b3JfLCAmTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIEZpZWxkT3B0aW9uc19kZXNjcmlwdG9yXywgJkZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgRW51bU9wdGlvbnNfZGVzY3JpcHRvcl8sICZFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgRW51bVZhbHVlT3B0aW9uc19kZXNjcmlwdG9yXywgJkVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIFNlcnZpY2VPcHRpb25zX2Rlc2NyaXB0b3JfLCAmU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIE1ldGhvZE9wdGlvbnNfZGVzY3JpcHRvcl8sICZNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICBVbmludGVycHJldGVkT3B0aW9uX2Rlc2NyaXB0b3JfLCAmVW5pbnRlcnByZXRlZE9wdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9kZXNjcmlwdG9yXywgJlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIFNvdXJjZUNvZGVJbmZvX2Rlc2NyaXB0b3JfLCAmU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Rlc2NyaXB0b3JfLCAmU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpIHsKKyAgZGVsZXRlIEZpbGVEZXNjcmlwdG9yU2V0OjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIEZpbGVEZXNjcmlwdG9yU2V0X3JlZmxlY3Rpb25fOworICBkZWxldGUgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBGaWxlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOworICBkZWxldGUgRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBGaWVsZERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIEVudW1EZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgRW51bURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgTWV0aG9kRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOworICBkZWxldGUgRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgRmlsZU9wdGlvbnNfcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBNZXNzYWdlT3B0aW9uc19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIEZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBGaWVsZE9wdGlvbnNfcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBFbnVtT3B0aW9uc19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIEVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgRW51bVZhbHVlT3B0aW9uc19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIFNlcnZpY2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIFNlcnZpY2VPcHRpb25zX3JlZmxlY3Rpb25fOworICBkZWxldGUgTWV0aG9kT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBNZXRob2RPcHRpb25zX3JlZmxlY3Rpb25fOworICBkZWxldGUgVW5pbnRlcnByZXRlZE9wdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBVbmludGVycHJldGVkT3B0aW9uX3JlZmxlY3Rpb25fOworICBkZWxldGUgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X3JlZmxlY3Rpb25fOworICBkZWxldGUgU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgU291cmNlQ29kZUluZm9fcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9yZWZsZWN0aW9uXzsKK30KKwordm9pZCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCkgeworICBzdGF0aWMgYm9vbCBhbHJlYWR5X2hlcmUgPSBmYWxzZTsKKyAgaWYgKGFscmVhZHlfaGVyZSkgcmV0dXJuOworICBhbHJlYWR5X2hlcmUgPSB0cnVlOworICBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT047CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OkludGVybmFsQWRkR2VuZXJhdGVkRmlsZSgKKyAgICAiXG4gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cMDIyXDAxN2dvb2ciCisgICAgImxlLnByb3RvYnVmXCJHXG5cMDIxRmlsZURlc2NyaXB0b3JTZXRcMDIyMlxuXDAwNGZpbGUiCisgICAgIlwwMzBcMDAxIFwwMDMoXDAxMzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclAiCisgICAgInJvdG9cIlwyMjdcMDAzXG5cMDIzRmlsZURlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEiCisgICAgIihcdFwwMjJcMDE3XG5cMDA3cGFja2FnZVwwMzBcMDAyIFwwMDEoXHRcMDIyXDAyMlxuXG5kZXBlbmRlbmN5XDAzMFwwMDMgXDAwMyhcdFwwMjIiCisgICAgIjZcblwwMTRtZXNzYWdlX3R5cGVcMDMwXDAwNCBcMDAzKFwwMTMyIC5nb29nbGUucHJvdG9idWYuIgorICAgICJEZXNjcmlwdG9yUHJvdG9cMDIyN1xuXHRlbnVtX3R5cGVcMDMwXDAwNSBcMDAzKFwwMTMyJC5nb28iCisgICAgImdsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvXDAyMjhcblwwMDdzZXJ2IgorICAgICJpY2VcMDMwXDAwNiBcMDAzKFwwMTMyXCcuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjciIKKyAgICAiaXB0b3JQcm90b1wwMjI4XG5cdGV4dGVuc2lvblwwMzBcMDA3IFwwMDMoXDAxMzIlLmdvb2dsZS5wIgorICAgICJyb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvXDAyMi1cblwwMDdvcHRpb25zXDAzMCIKKyAgICAiXDAxMCBcMDAxKFwwMTMyXDAzNC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcMDIyOVxuXDAyMHMiCisgICAgIm91cmNlX2NvZGVfaW5mb1wwMzBcdCBcMDAxKFwwMTMyXDAzNy5nb29nbGUucHJvdG9idWYuIgorICAgICJTb3VyY2VDb2RlSW5mb1wiXDI1MVwwMDNcblwwMTdEZXNjcmlwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNG5hIgorICAgICJtZVwwMzBcMDAxIFwwMDEoXHRcMDIyNFxuXDAwNWZpZWxkXDAzMFwwMDIgXDAwMyhcMDEzMiUuZ29vZ2xlLnByb3RvYnUiCisgICAgImYuRmllbGREZXNjcmlwdG9yUHJvdG9cMDIyOFxuXHRleHRlbnNpb25cMDMwXDAwNiBcMDAzKCIKKyAgICAiXDAxMzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byIKKyAgICAiXDAyMjVcblwwMTNuZXN0ZWRfdHlwZVwwMzBcMDAzIFwwMDMoXDAxMzIgLmdvb2dsZS5wcm90b2J1Zi4iCisgICAgIkRlc2NyaXB0b3JQcm90b1wwMjI3XG5cdGVudW1fdHlwZVwwMzBcMDA0IFwwMDMoXDAxMzIkLmdvbyIKKyAgICAiZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9cMDIySFxuXDAxN2V4dGUiCisgICAgIm5zaW9uX3JhbmdlXDAzMFwwMDUgXDAwMyhcMDEzMi8uZ29vZ2xlLnByb3RvYnVmLkRlc2MiCisgICAgInJpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlXDAyMjBcblwwMDdvcHRpb25zXDAzMFwwMDcgIgorICAgICJcMDAxKFwwMTMyXDAzNy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnNcMDMyLFxuXDAxNiIKKyAgICAiRXh0ZW5zaW9uUmFuZ2VcMDIyXHJcblwwMDVzdGFydFwwMzBcMDAxIFwwMDEoXDAwNVwwMjJcMDEzXG5cMDAzZW5kXDAzMFwwMDIgXDAwMSIKKyAgICAiKFwwMDVcIlwyMjRcMDA1XG5cMDI0RmllbGREZXNjcmlwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxKCIKKyAgICAiXHRcMDIyXDAxNlxuXDAwNm51bWJlclwwMzBcMDAzIFwwMDEoXDAwNVwwMjI6XG5cMDA1bGFiZWxcMDMwXDAwNCBcMDAxKFwwMTYyKy5nb29nbCIKKyAgICAiZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFwwMjI4XG4iCisgICAgIlwwMDR0eXBlXDAzMFwwMDUgXDAwMShcMDE2MiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3IiCisgICAgImlwdG9yUHJvdG8uVHlwZVwwMjJcMDIxXG5cdHR5cGVfbmFtZVwwMzBcMDA2IFwwMDEoXHRcMDIyXDAyMFxuXDAxMGV4IgorICAgICJ0ZW5kZWVcMDMwXDAwMiBcMDAxKFx0XDAyMlwwMjVcblxyZGVmYXVsdF92YWx1ZVwwMzBcMDA3IFwwMDEoXHRcMDIyLlxuXDAwN28iCisgICAgInB0aW9uc1wwMzBcMDEwIFwwMDEoXDAxMzJcMDM1Lmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGkiCisgICAgIm9uc1wiXDI2NlwwMDJcblwwMDRUeXBlXDAyMlwwMTdcblwwMTNUWVBFX0RPVUJMRVwwMjBcMDAxXDAyMlwwMTZcblxuVFlQRV9GTCIKKyAgICAiT0FUXDAyMFwwMDJcMDIyXDAxNlxuXG5UWVBFX0lOVDY0XDAyMFwwMDNcMDIyXDAxN1xuXDAxM1RZUEVfVUlOVDY0XDAyMFwwMDRcMDIyXDAxNiIKKyAgICAiXG5cblRZUEVfSU5UMzJcMDIwXDAwNVwwMjJcMDIwXG5cMDE0VFlQRV9GSVhFRDY0XDAyMFwwMDZcMDIyXDAyMFxuXDAxNFRZUEUiCisgICAgIl9GSVhFRDMyXDAyMFwwMDdcMDIyXHJcblx0VFlQRV9CT09MXDAyMFwwMTBcMDIyXDAxN1xuXDAxM1RZUEVfU1RSSU5HIgorICAgICJcMDIwXHRcMDIyXDAxNlxuXG5UWVBFX0dST1VQXDAyMFxuXDAyMlwwMjBcblwwMTRUWVBFX01FU1NBR0VcMDIwXDAxM1wwMjJcMDE2XG5cbiIKKyAgICAiVFlQRV9CWVRFU1wwMjBcMDE0XDAyMlwwMTdcblwwMTNUWVBFX1VJTlQzMlwwMjBcclwwMjJcclxuXHRUWVBFX0VOIgorICAgICJVTVwwMjBcMDE2XDAyMlwwMjFcblxyVFlQRV9TRklYRUQzMlwwMjBcMDE3XDAyMlwwMjFcblxyVFlQRV9TRklYRUQ2NCIKKyAgICAiXDAyMFwwMjBcMDIyXDAxN1xuXDAxM1RZUEVfU0lOVDMyXDAyMFwwMjFcMDIyXDAxN1xuXDAxM1RZUEVfU0lOVDY0XDAyMFwwMjJcIkNcblwwMDUiCisgICAgIkxhYmVsXDAyMlwwMjJcblwwMTZMQUJFTF9PUFRJT05BTFwwMjBcMDAxXDAyMlwwMjJcblwwMTZMQUJFTF9SRVFVSSIKKyAgICAiUkVEXDAyMFwwMDJcMDIyXDAyMlxuXDAxNkxBQkVMX1JFUEVBVEVEXDAyMFwwMDNcIlwyMTRcMDAxXG5cMDIzRW51bURlc2NyaSIKKyAgICAicHRvclByb3RvXDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjI4XG5cMDA1dmFsdWVcMDMwXDAwMiBcMDAzKFwwMTMyKSIKKyAgICAiLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdCIKKyAgICAib1wwMjItXG5cMDA3b3B0aW9uc1wwMzBcMDAzIFwwMDEoXDAxMzJcMDM0Lmdvb2dsZS5wcm90b2J1Zi5FbnUiCisgICAgIm1PcHRpb25zXCJsXG5cMDMwRW51bVZhbHVlRGVzY3JpcHRvclByb3RvXDAyMlwwMTRcblwwMDQiCisgICAgIm5hbWVcMDMwXDAwMSBcMDAxKFx0XDAyMlwwMTZcblwwMDZudW1iZXJcMDMwXDAwMiBcMDAxKFwwMDVcMDIyMlxuXDAwN29wdGlvbnNcMDMwXDAwMyAiCisgICAgIlwwMDEoXDAxMzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zXCJcMjIwIgorICAgICJcMDAxXG5cMDI2U2VydmljZURlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyIgorICAgICI2XG5cMDA2bWV0aG9kXDAzMFwwMDIgXDAwMyhcMDEzMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZCIKKyAgICAiRGVzY3JpcHRvclByb3RvXDAyMjBcblwwMDdvcHRpb25zXDAzMFwwMDMgXDAwMShcMDEzMlwwMzcuZ29vZ2wiCisgICAgImUucHJvdG9idWYuU2VydmljZU9wdGlvbnNcIlwxNzdcblwwMjVNZXRob2REZXNjciIKKyAgICAiaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyXDAyMlxuXG5pbnB1dF90eXBlXDAzMFwwMDIiCisgICAgIiBcMDAxKFx0XDAyMlwwMjNcblwwMTNvdXRwdXRfdHlwZVwwMzBcMDAzIFwwMDEoXHRcMDIyL1xuXDAwN29wdGlvbnNcMDMwXDAwNCBcMDAxIgorICAgICIoXDAxMzJcMDM2Lmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zXCJcMzczXDAwM1xuXDAxM0YiCisgICAgImlsZU9wdGlvbnNcMDIyXDAyNFxuXDAxNGphdmFfcGFja2FnZVwwMzBcMDAxIFwwMDEoXHRcMDIyXDAzNFxuXDAyNGphdmEiCisgICAgIl9vdXRlcl9jbGFzc25hbWVcMDMwXDAxMCBcMDAxKFx0XDAyMlwiXG5cMDIzamF2YV9tdWx0aXBsZV8iCisgICAgImZpbGVzXDAzMFxuIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyJFxuXDAyNXJldGFpbl91bmtub3duX2ZpZSIKKyAgICAibGRzXDAzMFwwMTMgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjIsXG5cMDM1amF2YV9nZW5lcmF0ZV9lcXVhbHMiCisgICAgIl9hbmRfaGFzaFwwMzBcMDI0IFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyRlxuXDAxNG9wdGltaXplX2ZvclwwMzBcdCIKKyAgICAiIFwwMDEoXDAxNjIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbSIKKyAgICAiaXplTW9kZTpcMDA1U1BFRURcMDIyXCJcblwwMjNjY19nZW5lcmljX3NlcnZpY2VzXDAzMFwwMjAgIgorICAgICJcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMiRcblwwMjVqYXZhX2dlbmVyaWNfc2VydmljZXNcMDMwXDAyMSBcMDAxKCIKKyAgICAiXDAxMDpcMDA1ZmFsc2VcMDIyXCJcblwwMjNweV9nZW5lcmljX3NlcnZpY2VzXDAzMFwwMjIgXDAwMShcMDEwOlwwMDVmIgorICAgICJhbHNlXDAyMkNcblwwMjR1bmludGVycHJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nbyIKKyAgICAib2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uXCI6XG5cMDE0T3B0IgorICAgICJpbWl6ZU1vZGVcMDIyXHRcblwwMDVTUEVFRFwwMjBcMDAxXDAyMlxyXG5cdENPREVfU0laRVwwMjBcMDAyXDAyMlwwMjBcblwwMTRMIgorICAgICJJVEVfUlVOVElNRVwwMjBcMDAzKlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJcMjcwXDAwMVxuXDAxNk1lc3NhZ2VPcHRpIgorICAgICJvbnNcMDIyJlxuXDAyN21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XDAzMFwwMDEgXDAwMShcMDEwOlwwMDVmYSIKKyAgICAibHNlXDAyMi5cblwwMzdub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXDAzMFwwMDIiCisgICAgIiBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMkNcblwwMjR1bmludGVycHJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzIgorICAgICIoXDAxMzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIgorICAgICIqXHRcMDEwXDM1MFwwMDdcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDJcIlwyMjRcMDAyXG5cMDE0RmllbGRPcHRpb25zXDAyMjpcblwwMDVjdHlwZVwwMzBcMDAxICIKKyAgICAiXDAwMShcMDE2MiMuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSIKKyAgICAiOlwwMDZTVFJJTkdcMDIyXDAxNlxuXDAwNnBhY2tlZFwwMzBcMDAyIFwwMDEoXDAxMFwwMjJcMDMxXG5cbmRlcHJlY2F0ZWRcMDMwXDAwMyIKKyAgICAiIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyXDAzNFxuXDAyNGV4cGVyaW1lbnRhbF9tYXBfa2V5XDAzMFx0IFwwMDEoIgorICAgICJcdFwwMjJDXG5cMDI0dW5pbnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2wiCisgICAgImUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblwiL1xuXDAwNUNUeXBlXDAyMiIKKyAgICAiXG5cblwwMDZTVFJJTkdcMDIwXDAwMFwwMjJcMDEwXG5cMDA0Q09SRFwwMjBcMDAxXDAyMlwwMjBcblwwMTRTVFJJTkdfUElFQ0VcMDIwXDAwMioiCisgICAgIlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJdXG5cMDEzRW51bU9wdGlvbnNcMDIyQ1xuXDAyNHVuaW50ZXJwcmV0IgorICAgICJlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50IgorICAgICJlcnByZXRlZE9wdGlvbipcdFwwMTBcMzUwXDAwN1wwMjBcMjAwXDIwMFwyMDBcMjAwXDAwMlwiYlxuXDAyMEVudW1WYWx1ZU9wIgorICAgICJ0aW9uc1wwMjJDXG5cMDI0dW5pbnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZyIKKyAgICAib29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFwwMTBcMzUwXDAwN1wwMjAiCisgICAgIlwyMDBcMjAwXDIwMFwyMDBcMDAyXCJgXG5cMDE2U2VydmljZU9wdGlvbnNcMDIyQ1xuXDAyNHVuaW50ZXJwcmV0ZWQiCisgICAgIl9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXIiCisgICAgInByZXRlZE9wdGlvbipcdFwwMTBcMzUwXDAwN1wwMjBcMjAwXDIwMFwyMDBcMjAwXDAwMlwiX1xuXHJNZXRob2RPcHRpb25zIgorICAgICJcMDIyQ1xuXDAyNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXDAzMFwzNDdcMDA3IFwwMDMoXDAxMzIkLmdvb2dsZSIKKyAgICAiLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qXHRcMDEwXDM1MFwwMDdcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDIiCisgICAgIlwiXDIzNlwwMDJcblwwMjNVbmludGVycHJldGVkT3B0aW9uXDAyMjtcblwwMDRuYW1lXDAzMFwwMDIgXDAwMyhcMDEzMi0iCisgICAgIi5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW0iCisgICAgImVQYXJ0XDAyMlwwMzBcblwwMjBpZGVudGlmaWVyX3ZhbHVlXDAzMFwwMDMgXDAwMShcdFwwMjJcMDMyXG5cMDIycG9zaXQiCisgICAgIml2ZV9pbnRfdmFsdWVcMDMwXDAwNCBcMDAxKFwwMDRcMDIyXDAzMlxuXDAyMm5lZ2F0aXZlX2ludF92YWx1IgorICAgICJlXDAzMFwwMDUgXDAwMShcMDAzXDAyMlwwMjRcblwwMTRkb3VibGVfdmFsdWVcMDMwXDAwNiBcMDAxKFwwMDFcMDIyXDAyNFxuXDAxNHN0cmluZ18iCisgICAgInZhbHVlXDAzMFwwMDcgXDAwMShcMDE0XDAyMlwwMjdcblwwMTdhZ2dyZWdhdGVfdmFsdWVcMDMwXDAxMCBcMDAxKFx0XDAzMjNcblwwMTAiCisgICAgIk5hbWVQYXJ0XDAyMlwwMjFcblx0bmFtZV9wYXJ0XDAzMFwwMDEgXDAwMihcdFwwMjJcMDI0XG5cMDE0aXNfZXh0ZW5zIgorICAgICJpb25cMDMwXDAwMiBcMDAyKFwwMTBcInxcblwwMTZTb3VyY2VDb2RlSW5mb1wwMjI6XG5cMDEwbG9jYXRpb25cMDMwIgorICAgICJcMDAxIFwwMDMoXDAxMzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5MIgorICAgICJvY2F0aW9uXDAzMi5cblwwMTBMb2NhdGlvblwwMjJcMDIwXG5cMDA0cGF0aFwwMzBcMDAxIFwwMDMoXDAwNUJcMDAyXDAyMFwwMDFcMDIyXDAyMFxuIgorICAgICJcMDA0c3BhblwwMzBcMDAyIFwwMDMoXDAwNUJcMDAyXDAyMFwwMDFCKVxuXDAyM2NvbS5nb29nbGUucHJvdG9idWZCXDAyMCIKKyAgICAiRGVzY3JpcHRvclByb3Rvc0hcMDAxIiwgMzk3OCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRGaWxlKAorICAgICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIsICZwcm90b2J1Zl9SZWdpc3RlclR5cGVzKTsKKyAgRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEZpbGVEZXNjcmlwdG9yU2V0KCk7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG8oKTsKKyAgRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBEZXNjcmlwdG9yUHJvdG8oKTsKKyAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEZpZWxkRGVzY3JpcHRvclByb3RvKCk7CisgIEVudW1EZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEVudW1EZXNjcmlwdG9yUHJvdG8oKTsKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKTsKKyAgU2VydmljZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgU2VydmljZURlc2NyaXB0b3JQcm90bygpOworICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IE1ldGhvZERlc2NyaXB0b3JQcm90bygpOworICBGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRmlsZU9wdGlvbnMoKTsKKyAgTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IE1lc3NhZ2VPcHRpb25zKCk7CisgIEZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRmllbGRPcHRpb25zKCk7CisgIEVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBFbnVtT3B0aW9ucygpOworICBFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBFbnVtVmFsdWVPcHRpb25zKCk7CisgIFNlcnZpY2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBTZXJ2aWNlT3B0aW9ucygpOworICBNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBNZXRob2RPcHRpb25zKCk7CisgIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFVuaW50ZXJwcmV0ZWRPcHRpb24oKTsKKyAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCgpOworICBTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgU291cmNlQ29kZUluZm8oKTsKKyAgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKCk7CisgIEZpbGVEZXNjcmlwdG9yU2V0OjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBFbnVtRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBTZXJ2aWNlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpPblNodXRkb3duKCZwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8pOworfQorCisvLyBGb3JjZSBBZGREZXNjcmlwdG9ycygpIHRvIGJlIGNhbGxlZCBhdCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gdGltZS4KK3N0cnVjdCBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8geworICBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKSB7CisgICAgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICB9Cit9IHN0YXRpY19kZXNjcmlwdG9yX2luaXRpYWxpemVyX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvXzsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JTZXQ6OmtGaWxlRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitGaWxlRGVzY3JpcHRvclNldDo6RmlsZURlc2NyaXB0b3JTZXQoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK0ZpbGVEZXNjcmlwdG9yU2V0OjpGaWxlRGVzY3JpcHRvclNldChjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworRmlsZURlc2NyaXB0b3JTZXQ6On5GaWxlRGVzY3JpcHRvclNldCgpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpTaGFyZWREdG9yKCkgeworICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICB9Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvclNldDo6ZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBGaWxlRGVzY3JpcHRvclNldF9kZXNjcmlwdG9yXzsKK30KKworY29uc3QgRmlsZURlc2NyaXB0b3JTZXQmIEZpbGVEZXNjcmlwdG9yU2V0OjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitGaWxlRGVzY3JpcHRvclNldCogRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworRmlsZURlc2NyaXB0b3JTZXQqIEZpbGVEZXNjcmlwdG9yU2V0OjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgRmlsZURlc2NyaXB0b3JTZXQ7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OkNsZWFyKCkgeworICBmaWxlXy5DbGVhcigpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgRmlsZURlc2NyaXB0b3JTZXQ6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9maWxlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9maWxlKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEwKSkgZ290byBwYXJzZV9maWxlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDEsIHRoaXMtPmZpbGUoaSksIG91dHB1dCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRmlsZURlc2NyaXB0b3JTZXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgMSwgdGhpcy0+ZmlsZShpKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IEZpbGVEZXNjcmlwdG9yU2V0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5maWxlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5maWxlKGkpKTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0KiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgRmlsZURlc2NyaXB0b3JTZXQqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6Ok1lcmdlRnJvbShjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBmaWxlXy5NZXJnZUZyb20oZnJvbS5maWxlXyk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OkNvcHlGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclNldDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+ZmlsZShpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclNldDo6U3dhcChGaWxlRGVzY3JpcHRvclNldCogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBmaWxlXy5Td2FwKCZvdGhlci0+ZmlsZV8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEZpbGVEZXNjcmlwdG9yU2V0OjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBGaWxlRGVzY3JpcHRvclNldF9kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEZpbGVEZXNjcmlwdG9yU2V0X3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprUGFja2FnZUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtEZXBlbmRlbmN5RmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a1NlcnZpY2VGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprU291cmNlQ29kZUluZm9GaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OkZpbGVEZXNjcmlwdG9yUHJvdG8oKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKKyAgb3B0aW9uc18gPSBjb25zdF9jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIHNvdXJjZV9jb2RlX2luZm9fID0gY29uc3RfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlKCkpOworfQorCitGaWxlRGVzY3JpcHRvclByb3RvOjpGaWxlRGVzY3JpcHRvclByb3RvKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIHBhY2thZ2VfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBvcHRpb25zXyA9IE5VTEw7CisgIHNvdXJjZV9jb2RlX2luZm9fID0gTlVMTDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworRmlsZURlc2NyaXB0b3JQcm90bzo6fkZpbGVEZXNjcmlwdG9yUHJvdG8oKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTaGFyZWREdG9yKCkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lXzsKKyAgfQorICBpZiAocGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBwYWNrYWdlXzsKKyAgfQorICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICAgIGRlbGV0ZSBvcHRpb25zXzsKKyAgICBkZWxldGUgc291cmNlX2NvZGVfaW5mb187CisgIH0KK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBGaWxlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitGaWxlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0ZpbGVEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBGaWxlRGVzY3JpcHRvclByb3RvOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OkNsZWFyKCkgeworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBuYW1lXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc19wYWNrYWdlKCkpIHsKKyAgICAgIGlmIChwYWNrYWdlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIHBhY2thZ2VfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zOjpDbGVhcigpOworICAgIH0KKyAgfQorICBpZiAoX2hhc19iaXRzX1s4IC8gMzJdICYgKDB4ZmZ1IDw8ICg4ICUgMzIpKSkgeworICAgIGlmIChoYXNfc291cmNlX2NvZGVfaW5mbygpKSB7CisgICAgICBpZiAoc291cmNlX2NvZGVfaW5mb18gIT0gTlVMTCkgc291cmNlX2NvZGVfaW5mb18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm86OkNsZWFyKCk7CisgICAgfQorICB9CisgIGRlcGVuZGVuY3lfLkNsZWFyKCk7CisgIG1lc3NhZ2VfdHlwZV8uQ2xlYXIoKTsKKyAgZW51bV90eXBlXy5DbGVhcigpOworICBzZXJ2aWNlXy5DbGVhcigpOworICBleHRlbnNpb25fLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX3BhY2thZ2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfcGFja2FnZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfcGFja2FnZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPnBhY2thZ2UoKS5kYXRhKCksIHRoaXMtPnBhY2thZ2UoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9kZXBlbmRlbmN5OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2RlcGVuZGVuY3k6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5hZGRfZGVwZW5kZW5jeSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPmRlcGVuZGVuY3kodGhpcy0+ZGVwZW5kZW5jeV9zaXplKCkgLSAxKS5kYXRhKCksCisgICAgICAgICAgICB0aGlzLT5kZXBlbmRlbmN5KHRoaXMtPmRlcGVuZGVuY3lfc2l6ZSgpIC0gMSkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2VfZGVwZW5kZW5jeTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX21lc3NhZ2VfdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CisgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfbWVzc2FnZV90eXBlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9tZXNzYWdlX3R5cGUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX21lc3NhZ2VfdHlwZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2VudW1fdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICAgICAgY2FzZSA1OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2VudW1fdHlwZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZW51bV90eXBlKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9lbnVtX3R5cGU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDUwKSkgZ290byBwYXJzZV9zZXJ2aWNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OworICAgICAgY2FzZSA2OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3NlcnZpY2U6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3NlcnZpY2UoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX3NlcnZpY2U7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9leHRlbnNpb247CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7CisgICAgICBjYXNlIDc6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfZXh0ZW5zaW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9leHRlbnNpb24oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTgpKSBnb3RvIHBhcnNlX2V4dGVuc2lvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX29wdGlvbnM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OworICAgICAgY2FzZSA4OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX29wdGlvbnM6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzQpKSBnb3RvIHBhcnNlX3NvdXJjZV9jb2RlX2luZm87CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OworICAgICAgY2FzZSA5OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3NvdXJjZV9jb2RlX2luZm86CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsKKyAgaWYgKGhhc19wYWNrYWdlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+cGFja2FnZSgpLmRhdGEoKSwgdGhpcy0+cGFja2FnZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAyLCB0aGlzLT5wYWNrYWdlKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5ID0gMzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgdGhpcy0+ZGVwZW5kZW5jeShpKS5kYXRhKCksIHRoaXMtPmRlcGVuZGVuY3koaSkubGVuZ3RoKCksCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAzLCB0aGlzLT5kZXBlbmRlbmN5KGkpLCBvdXRwdXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPm1lc3NhZ2VfdHlwZV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA0LCB0aGlzLT5tZXNzYWdlX3R5cGUoaSksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmVudW1fdHlwZV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA1LCB0aGlzLT5lbnVtX3R5cGUoaSksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90byBzZXJ2aWNlID0gNjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5zZXJ2aWNlX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDYsIHRoaXMtPnNlcnZpY2UoaSksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgNywgdGhpcy0+ZXh0ZW5zaW9uKGkpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA4LCB0aGlzLT5vcHRpb25zKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CisgIGlmIChoYXNfc291cmNlX2NvZGVfaW5mbygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDksIHRoaXMtPnNvdXJjZV9jb2RlX2luZm8oKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBGaWxlRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhY2thZ2UgPSAyOworICBpZiAoaGFzX3BhY2thZ2UoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5wYWNrYWdlKCkuZGF0YSgpLCB0aGlzLT5wYWNrYWdlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAyLCB0aGlzLT5wYWNrYWdlKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5ID0gMzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmRlcGVuZGVuY3koaSkuZGF0YSgpLCB0aGlzLT5kZXBlbmRlbmN5KGkpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZVN0cmluZ1RvQXJyYXkoMywgdGhpcy0+ZGVwZW5kZW5jeShpKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5tZXNzYWdlX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA0LCB0aGlzLT5tZXNzYWdlX3R5cGUoaSksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmVudW1fdHlwZV9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDUsIHRoaXMtPmVudW1fdHlwZShpKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnNlcnZpY2Vfc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA2LCB0aGlzLT5zZXJ2aWNlKGkpLCB0YXJnZXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgNywgdGhpcy0+ZXh0ZW5zaW9uKGkpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDgsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbyBzb3VyY2VfY29kZV9pbmZvID0gOTsKKyAgaWYgKGhhc19zb3VyY2VfY29kZV9pbmZvKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA5LCB0aGlzLT5zb3VyY2VfY29kZV9pbmZvKCksIHRhcmdldCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBGaWxlRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworICAKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPm5hbWUoKSk7CisgICAgfQorICAgIAorICAgIC8vIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsKKyAgICBpZiAoaGFzX3BhY2thZ2UoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+cGFja2FnZSgpKTsKKyAgICB9CisgICAgCisgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyBvcHRpb25zID0gODsKKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICAgIHRoaXMtPm9wdGlvbnMoKSk7CisgICAgfQorICAgIAorICB9CisgIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiAoMHhmZnUgPDwgKDggJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbyBzb3VyY2VfY29kZV9pbmZvID0gOTsKKyAgICBpZiAoaGFzX3NvdXJjZV9jb2RlX2luZm8oKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICAgIHRoaXMtPnNvdXJjZV9jb2RlX2luZm8oKSk7CisgICAgfQorICAgIAorICB9CisgIC8vIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5ID0gMzsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZGVwZW5kZW5jeV9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICB0aGlzLT5kZXBlbmRlbmN5KGkpKTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+bWVzc2FnZV90eXBlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5tZXNzYWdlX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPm1lc3NhZ2VfdHlwZShpKSk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmVudW1fdHlwZV9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+ZW51bV90eXBlKGkpKTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5zZXJ2aWNlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5zZXJ2aWNlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5zZXJ2aWNlKGkpKTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5leHRlbnNpb25fc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+ZXh0ZW5zaW9uKGkpKTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgZGVwZW5kZW5jeV8uTWVyZ2VGcm9tKGZyb20uZGVwZW5kZW5jeV8pOworICBtZXNzYWdlX3R5cGVfLk1lcmdlRnJvbShmcm9tLm1lc3NhZ2VfdHlwZV8pOworICBlbnVtX3R5cGVfLk1lcmdlRnJvbShmcm9tLmVudW1fdHlwZV8pOworICBzZXJ2aWNlXy5NZXJnZUZyb20oZnJvbS5zZXJ2aWNlXyk7CisgIGV4dGVuc2lvbl8uTWVyZ2VGcm9tKGZyb20uZXh0ZW5zaW9uXyk7CisgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfbmFtZSgpKSB7CisgICAgICBzZXRfbmFtZShmcm9tLm5hbWUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19wYWNrYWdlKCkpIHsKKyAgICAgIHNldF9wYWNrYWdlKGZyb20ucGFja2FnZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgeworICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7CisgICAgfQorICB9CisgIGlmIChmcm9tLl9oYXNfYml0c19bOCAvIDMyXSAmICgweGZmdSA8PCAoOCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfc291cmNlX2NvZGVfaW5mbygpKSB7CisgICAgICBtdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKS0+Ojpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbzo6TWVyZ2VGcm9tKGZyb20uc291cmNlX2NvZGVfaW5mbygpKTsKKyAgICB9CisgIH0KKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIAorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZV9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+bWVzc2FnZV90eXBlKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT5lbnVtX3R5cGUoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT5zZXJ2aWNlKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT5leHRlbnNpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICBpZiAoIXRoaXMtPm9wdGlvbnMoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTd2FwKEZpbGVEZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgIGlmIChvdGhlciAhPSB0aGlzKSB7CisgICAgc3RkOjpzd2FwKG5hbWVfLCBvdGhlci0+bmFtZV8pOworICAgIHN0ZDo6c3dhcChwYWNrYWdlXywgb3RoZXItPnBhY2thZ2VfKTsKKyAgICBkZXBlbmRlbmN5Xy5Td2FwKCZvdGhlci0+ZGVwZW5kZW5jeV8pOworICAgIG1lc3NhZ2VfdHlwZV8uU3dhcCgmb3RoZXItPm1lc3NhZ2VfdHlwZV8pOworICAgIGVudW1fdHlwZV8uU3dhcCgmb3RoZXItPmVudW1fdHlwZV8pOworICAgIHNlcnZpY2VfLlN3YXAoJm90aGVyLT5zZXJ2aWNlXyk7CisgICAgZXh0ZW5zaW9uXy5Td2FwKCZvdGhlci0+ZXh0ZW5zaW9uXyk7CisgICAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOworICAgIHN0ZDo6c3dhcChzb3VyY2VfY29kZV9pbmZvXywgb3RoZXItPnNvdXJjZV9jb2RlX2luZm9fKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBGaWxlRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBGaWxlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gRmlsZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6a1N0YXJ0RmllbGROdW1iZXI7Citjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjprRW5kRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSgpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIHN0YXJ0XyA9IDA7CisgIGVuZF8gPSAwOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6On5EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlNoYXJlZER0b3IoKSB7CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpDbGVhcigpIHsKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBzdGFydF8gPSAwOworICAgIGVuZF8gPSAwOworICB9CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZzdGFydF8pKSk7CisgICAgICAgICAgc2V0X2hhc19zdGFydCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTYpKSBnb3RvIHBhcnNlX2VuZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9lbmQ6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmZW5kXykpKTsKKyAgICAgICAgICBzZXRfaGFzX2VuZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworICBpZiAoaGFzX3N0YXJ0KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigxLCB0aGlzLT5zdGFydCgpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICBpZiAoaGFzX2VuZCgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMiwgdGhpcy0+ZW5kKCksIG91dHB1dCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CisgIGlmIChoYXNfc3RhcnQoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgxLCB0aGlzLT5zdGFydCgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICBpZiAoaGFzX2VuZCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDIsIHRoaXMtPmVuZCgpLCB0YXJnZXQpOworICB9CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworICAKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CisgICAgaWYgKGhhc19zdGFydCgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAorICAgICAgICAgIHRoaXMtPnN0YXJ0KCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICAgIGlmIChoYXNfZW5kKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCisgICAgICAgICAgdGhpcy0+ZW5kKCkpOworICAgIH0KKyAgICAKKyAgfQorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Ok1lcmdlRnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19zdGFydCgpKSB7CisgICAgICBzZXRfc3RhcnQoZnJvbS5zdGFydCgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX2VuZCgpKSB7CisgICAgICBzZXRfZW5kKGZyb20uZW5kKCkpOworICAgIH0KKyAgfQorICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkNvcHlGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICAKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpTd2FwKERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAoc3RhcnRfLCBvdGhlci0+c3RhcnRfKTsKKyAgICBzdGQ6OnN3YXAoZW5kXywgb3RoZXItPmVuZF8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyOworY29uc3QgaW50IERlc2NyaXB0b3JQcm90bzo6a0ZpZWxkRmllbGROdW1iZXI7Citjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXI7Citjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprTmVzdGVkVHlwZUZpZWxkTnVtYmVyOworY29uc3QgaW50IERlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXI7Citjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uUmFuZ2VGaWVsZE51bWJlcjsKK2NvbnN0IGludCBEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitEZXNjcmlwdG9yUHJvdG86OkRlc2NyaXB0b3JQcm90bygpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CisgIG9wdGlvbnNfID0gY29uc3RfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworfQorCitEZXNjcmlwdG9yUHJvdG86OkRlc2NyaXB0b3JQcm90byhjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgb3B0aW9uc18gPSBOVUxMOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitEZXNjcmlwdG9yUHJvdG86On5EZXNjcmlwdG9yUHJvdG8oKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIG5hbWVfOworICB9CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgICAgZGVsZXRlIG9wdGlvbnNfOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKK30KKworY29uc3QgRGVzY3JpcHRvclByb3RvJiBEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0Rlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0Rlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgRGVzY3JpcHRvclByb3RvOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIG5hbWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zOjpDbGVhcigpOworICAgIH0KKyAgfQorICBmaWVsZF8uQ2xlYXIoKTsKKyAgZXh0ZW5zaW9uXy5DbGVhcigpOworICBuZXN0ZWRfdHlwZV8uQ2xlYXIoKTsKKyAgZW51bV90eXBlXy5DbGVhcigpOworICBleHRlbnNpb25fcmFuZ2VfLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBEZXNjcmlwdG9yUHJvdG86Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX25hbWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfZmllbGQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9maWVsZDoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZmllbGQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2ZpZWxkOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2VfbmVzdGVkX3R5cGU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7CisgICAgICBjYXNlIDM6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfbmVzdGVkX3R5cGU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX25lc3RlZF90eXBlKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9uZXN0ZWRfdHlwZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX2VudW1fdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OworICAgICAgY2FzZSA0OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2VudW1fdHlwZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZW51bV90eXBlKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDM0KSkgZ290byBwYXJzZV9lbnVtX3R5cGU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9leHRlbnNpb25fcmFuZ2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSBleHRlbnNpb25fcmFuZ2UgPSA1OworICAgICAgY2FzZSA1OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2V4dGVuc2lvbl9yYW5nZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZXh0ZW5zaW9uX3JhbmdlKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9leHRlbnNpb25fcmFuZ2U7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDUwKSkgZ290byBwYXJzZV9leHRlbnNpb247CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CisgICAgICBjYXNlIDY6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfZXh0ZW5zaW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9leHRlbnNpb24oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2V4dGVuc2lvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTgpKSBnb3RvIHBhcnNlX29wdGlvbnM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OworICAgICAgY2FzZSA3OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX29wdGlvbnM6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIERlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpZiAoaGFzX25hbWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDEsIHRoaXMtPm5hbWUoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmllbGRfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgMiwgdGhpcy0+ZmllbGQoaSksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG5lc3RlZF90eXBlID0gMzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5uZXN0ZWRfdHlwZV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICAzLCB0aGlzLT5uZXN0ZWRfdHlwZShpKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZW51bV90eXBlX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDQsIHRoaXMtPmVudW1fdHlwZShpKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5leHRlbnNpb25fcmFuZ2Vfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgNSwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlKGkpLCBvdXRwdXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDYsIHRoaXMtPmV4dGVuc2lvbihpKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyBvcHRpb25zID0gNzsKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgNywgdGhpcy0+b3B0aW9ucygpLCBvdXRwdXQpOworICB9CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIERlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpZiAoaGFzX25hbWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAxLCB0aGlzLT5uYW1lKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpZWxkX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgMiwgdGhpcy0+ZmllbGQoaSksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG5lc3RlZF90eXBlID0gMzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5uZXN0ZWRfdHlwZV9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDMsIHRoaXMtPm5lc3RlZF90eXBlKGkpLCB0YXJnZXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA0LCB0aGlzLT5lbnVtX3R5cGUoaSksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgNSwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlKGkpLCB0YXJnZXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgNiwgdGhpcy0+ZXh0ZW5zaW9uKGkpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDcsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IERlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKyAgCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5uYW1lKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OworICAgIGlmIChoYXNfb3B0aW9ucygpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgICAgdGhpcy0+b3B0aW9ucygpKTsKKyAgICB9CisgICAgCisgIH0KKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmZpZWxkX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWVsZF9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+ZmllbGQoaSkpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5leHRlbnNpb24oaSkpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPm5lc3RlZF90eXBlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5uZXN0ZWRfdHlwZV9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+bmVzdGVkX3R5cGUoaSkpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNDsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZW51bV90eXBlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPmVudW1fdHlwZShpKSk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmV4dGVuc2lvbl9yYW5nZV9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5leHRlbnNpb25fcmFuZ2UoaSkpOworICB9CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IERlc2NyaXB0b3JQcm90byogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IERlc2NyaXB0b3JQcm90byo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgZmllbGRfLk1lcmdlRnJvbShmcm9tLmZpZWxkXyk7CisgIGV4dGVuc2lvbl8uTWVyZ2VGcm9tKGZyb20uZXh0ZW5zaW9uXyk7CisgIG5lc3RlZF90eXBlXy5NZXJnZUZyb20oZnJvbS5uZXN0ZWRfdHlwZV8pOworICBlbnVtX3R5cGVfLk1lcmdlRnJvbShmcm9tLmVudW1fdHlwZV8pOworICBleHRlbnNpb25fcmFuZ2VfLk1lcmdlRnJvbShmcm9tLmV4dGVuc2lvbl9yYW5nZV8pOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX25hbWUoKSkgeworICAgICAgc2V0X25hbWUoZnJvbS5uYW1lKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfb3B0aW9ucygpKSB7CisgICAgICBtdXRhYmxlX29wdGlvbnMoKS0+Ojpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9uczo6TWVyZ2VGcm9tKGZyb20ub3B0aW9ucygpKTsKKyAgICB9CisgIH0KKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIERlc2NyaXB0b3JQcm90bzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPmZpZWxkKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT5leHRlbnNpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRfdHlwZV9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+bmVzdGVkX3R5cGUoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPmVudW1fdHlwZShpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIGlmICghdGhpcy0+b3B0aW9ucygpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIERlc2NyaXB0b3JQcm90bzo6U3dhcChEZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgIGlmIChvdGhlciAhPSB0aGlzKSB7CisgICAgc3RkOjpzd2FwKG5hbWVfLCBvdGhlci0+bmFtZV8pOworICAgIGZpZWxkXy5Td2FwKCZvdGhlci0+ZmllbGRfKTsKKyAgICBleHRlbnNpb25fLlN3YXAoJm90aGVyLT5leHRlbnNpb25fKTsKKyAgICBuZXN0ZWRfdHlwZV8uU3dhcCgmb3RoZXItPm5lc3RlZF90eXBlXyk7CisgICAgZW51bV90eXBlXy5Td2FwKCZvdGhlci0+ZW51bV90eXBlXyk7CisgICAgZXh0ZW5zaW9uX3JhbmdlXy5Td2FwKCZvdGhlci0+ZXh0ZW5zaW9uX3JhbmdlXyk7CisgICAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIERlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9kZXNjcmlwdG9yXzsKK30KK2Jvb2wgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2godmFsdWUpIHsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgIGNhc2UgMzoKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA1OgorICAgIGNhc2UgNjoKKyAgICBjYXNlIDc6CisgICAgY2FzZSA4OgorICAgIGNhc2UgOToKKyAgICBjYXNlIDEwOgorICAgIGNhc2UgMTE6CisgICAgY2FzZSAxMjoKKyAgICBjYXNlIDEzOgorICAgIGNhc2UgMTQ6CisgICAgY2FzZSAxNToKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMTc6CisgICAgY2FzZSAxODoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9ET1VCTEU7Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZMT0FUOworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQ2NDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfVUlOVDY0OworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMjsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRklYRUQ2NDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRklYRUQzMjsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQk9PTDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HOworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9HUk9VUDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfTUVTU0FHRTsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQllURVM7Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1VJTlQzMjsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTTsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0ZJWEVEMzI7Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NGSVhFRDY0OworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UMzI7Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NJTlQ2NDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGVfTUlOOworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZV9NQVg7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGVfQVJSQVlTSVpFOworI2VuZGlmICAvLyBfTVNDX1ZFUgorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9kZXNjcmlwdG9yXzsKK30KK2Jvb2wgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgc3dpdGNoKHZhbHVlKSB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRDsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbF9NSU47Citjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWxfTUFYOworY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbF9BUlJBWVNJWkU7CisjZW5kaWYgIC8vIF9NU0NfVkVSCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtOdW1iZXJGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0xhYmVsRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtUeXBlRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtUeXBlTmFtZUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjprRXh0ZW5kZWVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0RlZmF1bHRWYWx1ZUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworRmllbGREZXNjcmlwdG9yUHJvdG86OkZpZWxkRGVzY3JpcHRvclByb3RvKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworICBvcHRpb25zXyA9IGNvbnN0X2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworfQorCitGaWVsZERlc2NyaXB0b3JQcm90bzo6RmllbGREZXNjcmlwdG9yUHJvdG8oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBudW1iZXJfID0gMDsKKyAgbGFiZWxfID0gMTsKKyAgdHlwZV8gPSAxOworICB0eXBlX25hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBleHRlbmRlZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIGRlZmF1bHRfdmFsdWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBvcHRpb25zXyA9IE5VTEw7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0ZpZWxkRGVzY3JpcHRvclByb3RvOjp+RmllbGREZXNjcmlwdG9yUHJvdG8oKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgbmFtZV87CisgIH0KKyAgaWYgKHR5cGVfbmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSB0eXBlX25hbWVfOworICB9CisgIGlmIChleHRlbmRlZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBleHRlbmRlZV87CisgIH0KKyAgaWYgKGRlZmF1bHRfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgZGVmYXVsdF92YWx1ZV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgICBkZWxldGUgb3B0aW9uc187CisgIH0KK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgRmllbGREZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0ZpZWxkRGVzY3JpcHRvclByb3RvKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitGaWVsZERlc2NyaXB0b3JQcm90byogRmllbGREZXNjcmlwdG9yUHJvdG86Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBGaWVsZERlc2NyaXB0b3JQcm90bzsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIG5hbWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBudW1iZXJfID0gMDsKKyAgICBsYWJlbF8gPSAxOworICAgIHR5cGVfID0gMTsKKyAgICBpZiAoaGFzX3R5cGVfbmFtZSgpKSB7CisgICAgICBpZiAodHlwZV9uYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIHR5cGVfbmFtZV8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChoYXNfZXh0ZW5kZWUoKSkgeworICAgICAgaWYgKGV4dGVuZGVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGV4dGVuZGVlXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKKyAgICAgIGlmIChkZWZhdWx0X3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGRlZmF1bHRfdmFsdWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uczo6Q2xlYXIoKTsKKyAgICB9CisgIH0KKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2V4dGVuZGVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9leHRlbmRlZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfZXh0ZW5kZWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5leHRlbmRlZSgpLmRhdGEoKSwgdGhpcy0+ZXh0ZW5kZWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9udW1iZXI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfbnVtYmVyOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJm51bWJlcl8pKSk7CisgICAgICAgICAgc2V0X2hhc19udW1iZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDMyKSkgZ290byBwYXJzZV9sYWJlbDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OworICAgICAgY2FzZSA0OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfbGFiZWw6CisgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKKyAgICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9Jc1ZhbGlkKHZhbHVlKSkgeworICAgICAgICAgICAgc2V0X2xhYmVsKHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsID4odmFsdWUpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoNCwgdmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQwKSkgZ290byBwYXJzZV90eXBlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHR5cGUgPSA1OworICAgICAgY2FzZSA1OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfdHlwZToKKyAgICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOworICAgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfSXNWYWxpZCh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgPih2YWx1ZSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCg1LCB2YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX3R5cGVfbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworICAgICAgY2FzZSA2OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3R5cGVfbmFtZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfdHlwZV9uYW1lKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+dHlwZV9uYW1lKCkuZGF0YSgpLCB0aGlzLT50eXBlX25hbWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9kZWZhdWx0X3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OworICAgICAgY2FzZSA3OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2RlZmF1bHRfdmFsdWU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2RlZmF1bHRfdmFsdWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5kZWZhdWx0X3ZhbHVlKCkuZGF0YSgpLCB0aGlzLT5kZWZhdWx0X3ZhbHVlKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg2NikpIGdvdG8gcGFyc2Vfb3B0aW9uczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworICAgICAgY2FzZSA4OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX29wdGlvbnM6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOworICBpZiAoaGFzX2V4dGVuZGVlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+ZXh0ZW5kZWUoKS5kYXRhKCksIHRoaXMtPmV4dGVuZGVlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDIsIHRoaXMtPmV4dGVuZGVlKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDM7CisgIGlmIChoYXNfbnVtYmVyKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigzLCB0aGlzLT5udW1iZXIoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbCBsYWJlbCA9IDQ7CisgIGlmIChoYXNfbGFiZWwoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oCisgICAgICA0LCB0aGlzLT5sYWJlbCgpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7CisgIGlmIChoYXNfdHlwZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKKyAgICAgIDUsIHRoaXMtPnR5cGUoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHR5cGVfbmFtZSA9IDY7CisgIGlmIChoYXNfdHlwZV9uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+dHlwZV9uYW1lKCkuZGF0YSgpLCB0aGlzLT50eXBlX25hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgNiwgdGhpcy0+dHlwZV9uYW1lKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKKyAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICA3LCB0aGlzLT5kZWZhdWx0X3ZhbHVlKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA4LCB0aGlzLT5vcHRpb25zKCksIG91dHB1dCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRmllbGREZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOworICBpZiAoaGFzX2V4dGVuZGVlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+ZXh0ZW5kZWUoKS5kYXRhKCksIHRoaXMtPmV4dGVuZGVlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAyLCB0aGlzLT5leHRlbmRlZSgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOworICBpZiAoaGFzX251bWJlcigpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDMsIHRoaXMtPm51bWJlcigpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIGxhYmVsID0gNDsKKyAgaWYgKGhhc19sYWJlbCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoCisgICAgICA0LCB0aGlzLT5sYWJlbCgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7CisgIGlmIChoYXNfdHlwZSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoCisgICAgICA1LCB0aGlzLT50eXBlKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworICBpZiAoaGFzX3R5cGVfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPnR5cGVfbmFtZSgpLmRhdGEoKSwgdGhpcy0+dHlwZV9uYW1lKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICA2LCB0aGlzLT50eXBlX25hbWUoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OworICBpZiAoaGFzX2RlZmF1bHRfdmFsdWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5kZWZhdWx0X3ZhbHVlKCkuZGF0YSgpLCB0aGlzLT5kZWZhdWx0X3ZhbHVlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICA3LCB0aGlzLT5kZWZhdWx0X3ZhbHVlKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDgsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworICAKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPm5hbWUoKSk7CisgICAgfQorICAgIAorICAgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDM7CisgICAgaWYgKGhhc19udW1iZXIoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKKyAgICAgICAgICB0aGlzLT5udW1iZXIoKSk7CisgICAgfQorICAgIAorICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OworICAgIGlmIChoYXNfbGFiZWwoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPmxhYmVsKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7CisgICAgaWYgKGhhc190eXBlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT50eXBlKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKKyAgICBpZiAoaGFzX3R5cGVfbmFtZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT50eXBlX25hbWUoKSk7CisgICAgfQorICAgIAorICAgIC8vIG9wdGlvbmFsIHN0cmluZyBleHRlbmRlZSA9IDI7CisgICAgaWYgKGhhc19leHRlbmRlZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5leHRlbmRlZSgpKTsKKyAgICB9CisgICAgCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OworICAgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5kZWZhdWx0X3ZhbHVlKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyBvcHRpb25zID0gODsKKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICAgIHRoaXMtPm9wdGlvbnMoKSk7CisgICAgfQorICAgIAorICB9CisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKKyAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX251bWJlcigpKSB7CisgICAgICBzZXRfbnVtYmVyKGZyb20ubnVtYmVyKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfbGFiZWwoKSkgeworICAgICAgc2V0X2xhYmVsKGZyb20ubGFiZWwoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc190eXBlKCkpIHsKKyAgICAgIHNldF90eXBlKGZyb20udHlwZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX3R5cGVfbmFtZSgpKSB7CisgICAgICBzZXRfdHlwZV9uYW1lKGZyb20udHlwZV9uYW1lKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfZXh0ZW5kZWUoKSkgeworICAgICAgc2V0X2V4dGVuZGVlKGZyb20uZXh0ZW5kZWUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKKyAgICAgIHNldF9kZWZhdWx0X3ZhbHVlKGZyb20uZGVmYXVsdF92YWx1ZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgeworICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zOjpNZXJnZUZyb20oZnJvbS5vcHRpb25zKCkpOworICAgIH0KKyAgfQorICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIAorICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIGlmICghdGhpcy0+b3B0aW9ucygpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpTd2FwKEZpZWxkRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHN0ZDo6c3dhcChuYW1lXywgb3RoZXItPm5hbWVfKTsKKyAgICBzdGQ6OnN3YXAobnVtYmVyXywgb3RoZXItPm51bWJlcl8pOworICAgIHN0ZDo6c3dhcChsYWJlbF8sIG90aGVyLT5sYWJlbF8pOworICAgIHN0ZDo6c3dhcCh0eXBlXywgb3RoZXItPnR5cGVfKTsKKyAgICBzdGQ6OnN3YXAodHlwZV9uYW1lXywgb3RoZXItPnR5cGVfbmFtZV8pOworICAgIHN0ZDo6c3dhcChleHRlbmRlZV8sIG90aGVyLT5leHRlbmRlZV8pOworICAgIHN0ZDo6c3dhcChkZWZhdWx0X3ZhbHVlXywgb3RoZXItPmRlZmF1bHRfdmFsdWVfKTsKKyAgICBzdGQ6OnN3YXAob3B0aW9uc18sIG90aGVyLT5vcHRpb25zXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgRmllbGREZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gRmllbGREZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBFbnVtRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyOworY29uc3QgaW50IEVudW1EZXNjcmlwdG9yUHJvdG86OmtWYWx1ZUZpZWxkTnVtYmVyOworY29uc3QgaW50IEVudW1EZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitFbnVtRGVzY3JpcHRvclByb3RvOjpFbnVtRGVzY3JpcHRvclByb3RvKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CisgIG9wdGlvbnNfID0gY29uc3RfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworfQorCitFbnVtRGVzY3JpcHRvclByb3RvOjpFbnVtRGVzY3JpcHRvclByb3RvKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIG9wdGlvbnNfID0gTlVMTDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworRW51bURlc2NyaXB0b3JQcm90bzo6fkVudW1EZXNjcmlwdG9yUHJvdG8oKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpTaGFyZWREdG9yKCkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lXzsKKyAgfQorICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICAgIGRlbGV0ZSBvcHRpb25zXzsKKyAgfQorfQorCit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBFbnVtRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIEVudW1EZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIEVudW1EZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0VudW1EZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworRW51bURlc2NyaXB0b3JQcm90byogRW51bURlc2NyaXB0b3JQcm90bzo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IEVudW1EZXNjcmlwdG9yUHJvdG87Cit9CisKK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIG5hbWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zOjpDbGVhcigpOworICAgIH0KKyAgfQorICB2YWx1ZV8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIEVudW1EZXNjcmlwdG9yUHJvdG86Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX25hbWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB2YWx1ZSA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfdmFsdWU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3ZhbHVlKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV92YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX29wdGlvbnM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIG9wdGlvbnMgPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX29wdGlvbnM6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT52YWx1ZV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICAyLCB0aGlzLT52YWx1ZShpKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgMywgdGhpcy0+b3B0aW9ucygpLCBvdXRwdXQpOworICB9CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEVudW1EZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB2YWx1ZSA9IDI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dmFsdWVfc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICAyLCB0aGlzLT52YWx1ZShpKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICAzLCB0aGlzLT5vcHRpb25zKCksIHRhcmdldCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBFbnVtRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworICAKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPm5hbWUoKSk7CisgICAgfQorICAgIAorICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgICB0aGlzLT5vcHRpb25zKCkpOworICAgIH0KKyAgICAKKyAgfQorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB2YWx1ZSA9IDI7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPnZhbHVlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT52YWx1ZV9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+dmFsdWUoaSkpOworICB9CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvKiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgRW51bURlc2NyaXB0b3JQcm90byo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICB2YWx1ZV8uTWVyZ2VGcm9tKGZyb20udmFsdWVfKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKKyAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgeworICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7CisgICAgfQorICB9CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBFbnVtRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICAKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZV9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+dmFsdWUoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICBpZiAoIXRoaXMtPm9wdGlvbnMoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpTd2FwKEVudW1EZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgIGlmIChvdGhlciAhPSB0aGlzKSB7CisgICAgc3RkOjpzd2FwKG5hbWVfLCBvdGhlci0+bmFtZV8pOworICAgIHZhbHVlXy5Td2FwKCZvdGhlci0+dmFsdWVfKTsKKyAgICBzdGQ6OnN3YXAob3B0aW9uc18sIG90aGVyLT5vcHRpb25zXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgRW51bURlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRW51bURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEVudW1EZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7Citjb25zdCBpbnQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjprTnVtYmVyRmllbGROdW1iZXI7Citjb25zdCBpbnQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworICBvcHRpb25zXyA9IGNvbnN0X2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Cit9CisKK0VudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBudW1iZXJfID0gMDsKKyAgb3B0aW9uc18gPSBOVUxMOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86On5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIG5hbWVfOworICB9CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgICAgZGVsZXRlIG9wdGlvbnNfOworICB9Cit9CisKK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKK30KKworY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0VudW1WYWx1ZURlc2NyaXB0b3JQcm90byogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0VudW1WYWx1ZURlc2NyaXB0b3JQcm90byogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOworfQorCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIG5hbWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBudW1iZXJfID0gMDsKKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnM6OkNsZWFyKCk7CisgICAgfQorICB9CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX25hbWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2VfbnVtYmVyOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgIHBhcnNlX251bWJlcjoKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZudW1iZXJfKSkpOworICAgICAgICAgIHNldF9oYXNfbnVtYmVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2Vfb3B0aW9uczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgICAgIGNhc2UgMzogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9vcHRpb25zOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9vcHRpb25zKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CisgIGlmIChoYXNfbnVtYmVyKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigyLCB0aGlzLT5udW1iZXIoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICAzLCB0aGlzLT5vcHRpb25zKCksIG91dHB1dCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMjsKKyAgaWYgKGhhc19udW1iZXIoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgyLCB0aGlzLT5udW1iZXIoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDMsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKyAgCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5uYW1lKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOworICAgIGlmIChoYXNfbnVtYmVyKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCisgICAgICAgICAgdGhpcy0+bnVtYmVyKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgICB0aGlzLT5vcHRpb25zKCkpOworICAgIH0KKyAgICAKKyAgfQorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKKyAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX251bWJlcigpKSB7CisgICAgICBzZXRfbnVtYmVyKGZyb20ubnVtYmVyKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfb3B0aW9ucygpKSB7CisgICAgICBtdXRhYmxlX29wdGlvbnMoKS0+Ojpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zOjpNZXJnZUZyb20oZnJvbS5vcHRpb25zKCkpOworICAgIH0KKyAgfQorICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICAKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICBpZiAoIXRoaXMtPm9wdGlvbnMoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OlN3YXAoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHN0ZDo6c3dhcChuYW1lXywgb3RoZXItPm5hbWVfKTsKKyAgICBzdGQ6OnN3YXAobnVtYmVyXywgb3RoZXItPm51bWJlcl8pOworICAgIHN0ZDo6c3dhcChvcHRpb25zXywgb3RoZXItPm9wdGlvbnNfKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7Citjb25zdCBpbnQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a01ldGhvZEZpZWxkTnVtYmVyOworY29uc3QgaW50IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CisgIG9wdGlvbnNfID0gY29uc3RfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworfQorCitTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIG9wdGlvbnNfID0gTlVMTDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworU2VydmljZURlc2NyaXB0b3JQcm90bzo6flNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTaGFyZWREdG9yKCkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lXzsKKyAgfQorICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICAgIGRlbGV0ZSBvcHRpb25zXzsKKyAgfQorfQorCit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK1NlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworU2VydmljZURlc2NyaXB0b3JQcm90byogU2VydmljZURlc2NyaXB0b3JQcm90bzo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG87Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIG5hbWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zOjpDbGVhcigpOworICAgIH0KKyAgfQorICBtZXRob2RfLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX21ldGhvZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfbWV0aG9kOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9tZXRob2QoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX21ldGhvZDsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX29wdGlvbnM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX29wdGlvbnM6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bWV0aG9kX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDIsIHRoaXMtPm1ldGhvZChpKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgMywgdGhpcy0+b3B0aW9ucygpLCBvdXRwdXQpOworICB9CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90byBtZXRob2QgPSAyOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPm1ldGhvZF9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDIsIHRoaXMtPm1ldGhvZChpKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyBvcHRpb25zID0gMzsKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICAzLCB0aGlzLT5vcHRpb25zKCksIHRhcmdldCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworICAKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPm5hbWUoKSk7CisgICAgfQorICAgIAorICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgICB0aGlzLT5vcHRpb25zKCkpOworICAgIH0KKyAgICAKKyAgfQorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90byBtZXRob2QgPSAyOworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5tZXRob2Rfc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPm1ldGhvZF9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+bWV0aG9kKGkpKTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgbWV0aG9kXy5NZXJnZUZyb20oZnJvbS5tZXRob2RfKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKKyAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgeworICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7CisgICAgfQorICB9CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICAKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2Rfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPm1ldGhvZChpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIGlmICghdGhpcy0+b3B0aW9ucygpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlN3YXAoU2VydmljZURlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAobmFtZV8sIG90aGVyLT5uYW1lXyk7CisgICAgbWV0aG9kXy5Td2FwKCZvdGhlci0+bWV0aG9kXyk7CisgICAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyOworY29uc3QgaW50IE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a0lucHV0VHlwZUZpZWxkTnVtYmVyOworY29uc3QgaW50IE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a091dHB1dFR5cGVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitNZXRob2REZXNjcmlwdG9yUHJvdG86Ok1ldGhvZERlc2NyaXB0b3JQcm90bygpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CisgIG9wdGlvbnNfID0gY29uc3RfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKK30KKworTWV0aG9kRGVzY3JpcHRvclByb3RvOjpNZXRob2REZXNjcmlwdG9yUHJvdG8oY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIGlucHV0X3R5cGVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBvdXRwdXRfdHlwZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIG9wdGlvbnNfID0gTlVMTDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworTWV0aG9kRGVzY3JpcHRvclByb3RvOjp+TWV0aG9kRGVzY3JpcHRvclByb3RvKCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpTaGFyZWREdG9yKCkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBuYW1lXzsKKyAgfQorICBpZiAoaW5wdXRfdHlwZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBpbnB1dF90eXBlXzsKKyAgfQorICBpZiAob3V0cHV0X3R5cGVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgb3V0cHV0X3R5cGVfOworICB9CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgICAgZGVsZXRlIG9wdGlvbnNfOworICB9Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKK30KKworY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK01ldGhvZERlc2NyaXB0b3JQcm90byogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK01ldGhvZERlc2NyaXB0b3JQcm90byogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgTWV0aG9kRGVzY3JpcHRvclByb3RvOworfQorCit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICAgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIG5hbWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX2lucHV0X3R5cGUoKSkgeworICAgICAgaWYgKGlucHV0X3R5cGVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICAgICAgaW5wdXRfdHlwZV8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChoYXNfb3V0cHV0X3R5cGUoKSkgeworICAgICAgaWYgKG91dHB1dF90eXBlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIG91dHB1dF90eXBlXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICAgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zOjpDbGVhcigpOworICAgIH0KKyAgfQorICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2lucHV0X3R5cGU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgaW5wdXRfdHlwZSA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfaW5wdXRfdHlwZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfaW5wdXRfdHlwZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPmlucHV0X3R5cGUoKS5kYXRhKCksIHRoaXMtPmlucHV0X3R5cGUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9vdXRwdXRfdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7CisgICAgICBjYXNlIDM6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2Vfb3V0cHV0X3R5cGU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX291dHB1dF90eXBlKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+b3V0cHV0X3R5cGUoKS5kYXRhKCksIHRoaXMtPm91dHB1dF90eXBlKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNCkpIGdvdG8gcGFyc2Vfb3B0aW9uczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKKyAgICAgIGNhc2UgNDogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9vcHRpb25zOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9vcHRpb25zKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKKyAgaWYgKGhhc19pbnB1dF90eXBlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+aW5wdXRfdHlwZSgpLmRhdGEoKSwgdGhpcy0+aW5wdXRfdHlwZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAyLCB0aGlzLT5pbnB1dF90eXBlKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7CisgIGlmIChoYXNfb3V0cHV0X3R5cGUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5vdXRwdXRfdHlwZSgpLmRhdGEoKSwgdGhpcy0+b3V0cHV0X3R5cGUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMywgdGhpcy0+b3V0cHV0X3R5cGUoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zIG9wdGlvbnMgPSA0OworICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA0LCB0aGlzLT5vcHRpb25zKCksIG91dHB1dCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOworICBpZiAoaGFzX2lucHV0X3R5cGUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5pbnB1dF90eXBlKCkuZGF0YSgpLCB0aGlzLT5pbnB1dF90eXBlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAyLCB0aGlzLT5pbnB1dF90eXBlKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7CisgIGlmIChoYXNfb3V0cHV0X3R5cGUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5vdXRwdXRfdHlwZSgpLmRhdGEoKSwgdGhpcy0+b3V0cHV0X3R5cGUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDMsIHRoaXMtPm91dHB1dF90eXBlKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKKyAgaWYgKGhhc19vcHRpb25zKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA0LCB0aGlzLT5vcHRpb25zKCksIHRhcmdldCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBNZXRob2REZXNjcmlwdG9yUHJvdG86OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgIAorICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICBpZiAoaGFzX25hbWUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+bmFtZSgpKTsKKyAgICB9CisgICAgCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOworICAgIGlmIChoYXNfaW5wdXRfdHlwZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5pbnB1dF90eXBlKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgb3V0cHV0X3R5cGUgPSAzOworICAgIGlmIChoYXNfb3V0cHV0X3R5cGUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+b3V0cHV0X3R5cGUoKSk7CisgICAgfQorICAgIAorICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKKyAgICBpZiAoaGFzX29wdGlvbnMoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICAgIHRoaXMtPm9wdGlvbnMoKSk7CisgICAgfQorICAgIAorICB9CisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvKiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX25hbWUoKSkgeworICAgICAgc2V0X25hbWUoZnJvbS5uYW1lKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfaW5wdXRfdHlwZSgpKSB7CisgICAgICBzZXRfaW5wdXRfdHlwZShmcm9tLmlucHV0X3R5cGUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19vdXRwdXRfdHlwZSgpKSB7CisgICAgICBzZXRfb3V0cHV0X3R5cGUoZnJvbS5vdXRwdXRfdHlwZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgeworICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9uczo6TWVyZ2VGcm9tKGZyb20ub3B0aW9ucygpKTsKKyAgICB9CisgIH0KKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgCisgIGlmIChoYXNfb3B0aW9ucygpKSB7CisgICAgaWYgKCF0aGlzLT5vcHRpb25zKCkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpTd2FwKE1ldGhvZERlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAobmFtZV8sIG90aGVyLT5uYW1lXyk7CisgICAgc3RkOjpzd2FwKGlucHV0X3R5cGVfLCBvdGhlci0+aW5wdXRfdHlwZV8pOworICAgIHN0ZDo6c3dhcChvdXRwdXRfdHlwZV8sIG90aGVyLT5vdXRwdXRfdHlwZV8pOworICAgIHN0ZDo6c3dhcChvcHRpb25zXywgb3RoZXItPm9wdGlvbnNfKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBNZXRob2REZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IE1ldGhvZERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3JfOworfQorYm9vbCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgc3dpdGNoKHZhbHVlKSB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6U1BFRUQ7Citjb25zdCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6OkNPREVfU0laRTsKK2NvbnN0IEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOworY29uc3QgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEZpbGVPcHRpb25zOjpPcHRpbWl6ZU1vZGVfTUlOOworY29uc3QgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEZpbGVPcHRpb25zOjpPcHRpbWl6ZU1vZGVfTUFYOworY29uc3QgaW50IEZpbGVPcHRpb25zOjpPcHRpbWl6ZU1vZGVfQVJSQVlTSVpFOworI2VuZGlmICAvLyBfTVNDX1ZFUgorI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IEZpbGVPcHRpb25zOjprSmF2YVBhY2thZ2VGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlT3B0aW9uczo6a0phdmFPdXRlckNsYXNzbmFtZUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVPcHRpb25zOjprSmF2YU11bHRpcGxlRmlsZXNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlT3B0aW9uczo6a1JldGFpblVua25vd25GaWVsZHNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlT3B0aW9uczo6a0phdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2hGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlT3B0aW9uczo6a09wdGltaXplRm9yRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtDY0dlbmVyaWNTZXJ2aWNlc0ZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVPcHRpb25zOjprSmF2YUdlbmVyaWNTZXJ2aWNlc0ZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVPcHRpb25zOjprUHlHZW5lcmljU2VydmljZXNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK0ZpbGVPcHRpb25zOjpGaWxlT3B0aW9ucygpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgRmlsZU9wdGlvbnM6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworRmlsZU9wdGlvbnM6OkZpbGVPcHRpb25zKGNvbnN0IEZpbGVPcHRpb25zJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRmlsZU9wdGlvbnM6OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBqYXZhX3BhY2thZ2VfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBqYXZhX291dGVyX2NsYXNzbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIGphdmFfbXVsdGlwbGVfZmlsZXNfID0gZmFsc2U7CisgIHJldGFpbl91bmtub3duX2ZpZWxkc18gPSBmYWxzZTsKKyAgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfID0gZmFsc2U7CisgIG9wdGltaXplX2Zvcl8gPSAxOworICBjY19nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOworICBqYXZhX2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7CisgIHB5X2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0ZpbGVPcHRpb25zOjp+RmlsZU9wdGlvbnMoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBGaWxlT3B0aW9uczo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKGphdmFfcGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBqYXZhX3BhY2thZ2VfOworICB9CisgIGlmIChqYXZhX291dGVyX2NsYXNzbmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlbGV0ZSBqYXZhX291dGVyX2NsYXNzbmFtZV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIEZpbGVPcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRmlsZU9wdGlvbnM6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRmlsZU9wdGlvbnNfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IEZpbGVPcHRpb25zJiBGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworRmlsZU9wdGlvbnMqIEZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0ZpbGVPcHRpb25zKiBGaWxlT3B0aW9uczo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IEZpbGVPcHRpb25zOworfQorCit2b2lkIEZpbGVPcHRpb25zOjpDbGVhcigpIHsKKyAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc19qYXZhX3BhY2thZ2UoKSkgeworICAgICAgaWYgKGphdmFfcGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBqYXZhX3BhY2thZ2VfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkpIHsKKyAgICAgIGlmIChqYXZhX291dGVyX2NsYXNzbmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBqYXZhX291dGVyX2NsYXNzbmFtZV8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICAgIGphdmFfbXVsdGlwbGVfZmlsZXNfID0gZmFsc2U7CisgICAgcmV0YWluX3Vua25vd25fZmllbGRzXyA9IGZhbHNlOworICAgIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXyA9IGZhbHNlOworICAgIG9wdGltaXplX2Zvcl8gPSAxOworICAgIGNjX2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7CisgICAgamF2YV9nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOworICB9CisgIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiAoMHhmZnUgPDwgKDggJSAzMikpKSB7CisgICAgcHlfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKKyAgfQorICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIEZpbGVPcHRpb25zOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9wYWNrYWdlID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2phdmFfcGFja2FnZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPmphdmFfcGFja2FnZSgpLmRhdGEoKSwgdGhpcy0+amF2YV9wYWNrYWdlKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg2NikpIGdvdG8gcGFyc2VfamF2YV9vdXRlcl9jbGFzc25hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OworICAgICAgY2FzZSA4OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2phdmFfb3V0ZXJfY2xhc3NuYW1lOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkuZGF0YSgpLCB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzIpKSBnb3RvIHBhcnNlX29wdGltaXplX2ZvcjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07CisgICAgICBjYXNlIDk6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9vcHRpbWl6ZV9mb3I6CisgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKKyAgICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfSXNWYWxpZCh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHNldF9vcHRpbWl6ZV9mb3Ioc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlID4odmFsdWUpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoOSwgdmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDgwKSkgZ290byBwYXJzZV9qYXZhX211bHRpcGxlX2ZpbGVzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDEwOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfamF2YV9tdWx0aXBsZV9maWxlczoKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJmphdmFfbXVsdGlwbGVfZmlsZXNfKSkpOworICAgICAgICAgIHNldF9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODgpKSBnb3RvIHBhcnNlX3JldGFpbl91bmtub3duX2ZpZWxkczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgcmV0YWluX3Vua25vd25fZmllbGRzID0gMTEgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDExOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfcmV0YWluX3Vua25vd25fZmllbGRzOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmcmV0YWluX3Vua25vd25fZmllbGRzXykpKTsKKyAgICAgICAgICBzZXRfaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTI4KSkgZ290byBwYXJzZV9jY19nZW5lcmljX3NlcnZpY2VzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDE2OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfY2NfZ2VuZXJpY19zZXJ2aWNlczoKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJmNjX2dlbmVyaWNfc2VydmljZXNfKSkpOworICAgICAgICAgIHNldF9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTM2KSkgZ290byBwYXJzZV9qYXZhX2dlbmVyaWNfc2VydmljZXM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAxNzogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgIHBhcnNlX2phdmFfZ2VuZXJpY19zZXJ2aWNlczoKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJmphdmFfZ2VuZXJpY19zZXJ2aWNlc18pKSk7CisgICAgICAgICAgc2V0X2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE0NCkpIGdvdG8gcGFyc2VfcHlfZ2VuZXJpY19zZXJ2aWNlczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IDE4IFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAxODogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgIHBhcnNlX3B5X2dlbmVyaWNfc2VydmljZXM6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZweV9nZW5lcmljX3NlcnZpY2VzXykpKTsKKyAgICAgICAgICBzZXRfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2MCkpIGdvdG8gcGFyc2VfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2g7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDIwOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgcGFyc2VfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2g6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8pKSk7CisgICAgICAgICAgc2V0X2hhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgICAgICBjYXNlIDk5OTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7CisgICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIEZpbGVPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9wYWNrYWdlID0gMTsKKyAgaWYgKGhhc19qYXZhX3BhY2thZ2UoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5qYXZhX3BhY2thZ2UoKS5kYXRhKCksIHRoaXMtPmphdmFfcGFja2FnZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICAxLCB0aGlzLT5qYXZhX3BhY2thZ2UoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gODsKKyAgaWYgKGhhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkuZGF0YSgpLCB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICA4LCB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0ID0gU1BFRURdOworICBpZiAoaGFzX29wdGltaXplX2ZvcigpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKKyAgICAgIDksIHRoaXMtPm9wdGltaXplX2ZvcigpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19qYXZhX211bHRpcGxlX2ZpbGVzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDEwLCB0aGlzLT5qYXZhX211bHRpcGxlX2ZpbGVzKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIGJvb2wgcmV0YWluX3Vua25vd25fZmllbGRzID0gMTEgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfcmV0YWluX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDExLCB0aGlzLT5yZXRhaW5fdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxNiwgdGhpcy0+Y2NfZ2VuZXJpY19zZXJ2aWNlcygpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxNywgdGhpcy0+amF2YV9nZW5lcmljX3NlcnZpY2VzKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IDE4IFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMTgsIHRoaXMtPnB5X2dlbmVyaWNfc2VydmljZXMoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDIwLCB0aGlzLT5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpLCBvdXRwdXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCisgIF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICAxMDAwLCA1MzY4NzA5MTIsIG91dHB1dCk7CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEZpbGVPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9wYWNrYWdlID0gMTsKKyAgaWYgKGhhc19qYXZhX3BhY2thZ2UoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5qYXZhX3BhY2thZ2UoKS5kYXRhKCksIHRoaXMtPmphdmFfcGFja2FnZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMSwgdGhpcy0+amF2YV9wYWNrYWdlKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7CisgIGlmIChoYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpLmRhdGEoKSwgdGhpcy0+amF2YV9vdXRlcl9jbGFzc25hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDgsIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07CisgIGlmIChoYXNfb3B0aW1pemVfZm9yKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKKyAgICAgIDksIHRoaXMtPm9wdGltaXplX2ZvcigpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19qYXZhX211bHRpcGxlX2ZpbGVzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxMCwgdGhpcy0+amF2YV9tdWx0aXBsZV9maWxlcygpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBib29sIHJldGFpbl91bmtub3duX2ZpZWxkcyA9IDExIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMTEsIHRoaXMtPnJldGFpbl91bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBib29sIGNjX2dlbmVyaWNfc2VydmljZXMgPSAxNiBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19jY19nZW5lcmljX3NlcnZpY2VzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxNiwgdGhpcy0+Y2NfZ2VuZXJpY19zZXJ2aWNlcygpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMTcsIHRoaXMtPmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxOCwgdGhpcy0+cHlfZ2VuZXJpY19zZXJ2aWNlcygpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDIwLCB0aGlzLT5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgdGFyZ2V0ID0gX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCk7CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgRmlsZU9wdGlvbnM6OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgIAorICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX3BhY2thZ2UgPSAxOworICAgIGlmIChoYXNfamF2YV9wYWNrYWdlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmphdmFfcGFja2FnZSgpKTsKKyAgICB9CisgICAgCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gODsKKyAgICBpZiAoaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisgICAgCisgICAgLy8gb3B0aW9uYWwgYm9vbCByZXRhaW5fdW5rbm93bl9maWVsZHMgPSAxMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGhhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKyAxOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0ID0gU1BFRURdOworICAgIGlmIChoYXNfb3B0aW1pemVfZm9yKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5vcHRpbWl6ZV9mb3IoKSk7CisgICAgfQorICAgIAorICAgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChoYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKyAxOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChoYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7CisgICAgfQorICAgIAorICB9CisgIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiAoMHhmZnUgPDwgKDggJSAzMikpKSB7CisgICAgLy8gb3B0aW9uYWwgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzID0gMTggW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7CisgICAgfQorICAgIAorICB9CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgdG90YWxfc2l6ZSArPSAyICogdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSk7CisgIH0KKyAgCisgIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgRmlsZU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgRmlsZU9wdGlvbnMqIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBGaWxlT3B0aW9ucyo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBGaWxlT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IEZpbGVPcHRpb25zJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS51bmludGVycHJldGVkX29wdGlvbl8pOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX2phdmFfcGFja2FnZSgpKSB7CisgICAgICBzZXRfamF2YV9wYWNrYWdlKGZyb20uamF2YV9wYWNrYWdlKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgeworICAgICAgc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGZyb20uamF2YV9vdXRlcl9jbGFzc25hbWUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19qYXZhX211bHRpcGxlX2ZpbGVzKCkpIHsKKyAgICAgIHNldF9qYXZhX211bHRpcGxlX2ZpbGVzKGZyb20uamF2YV9tdWx0aXBsZV9maWxlcygpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpKSB7CisgICAgICBzZXRfcmV0YWluX3Vua25vd25fZmllbGRzKGZyb20ucmV0YWluX3Vua25vd25fZmllbGRzKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSkgeworICAgICAgc2V0X2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKGZyb20uamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19vcHRpbWl6ZV9mb3IoKSkgeworICAgICAgc2V0X29wdGltaXplX2Zvcihmcm9tLm9wdGltaXplX2ZvcigpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKSkgeworICAgICAgc2V0X2NjX2dlbmVyaWNfc2VydmljZXMoZnJvbS5jY19nZW5lcmljX3NlcnZpY2VzKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKKyAgICAgIHNldF9qYXZhX2dlbmVyaWNfc2VydmljZXMoZnJvbS5qYXZhX2dlbmVyaWNfc2VydmljZXMoKSk7CisgICAgfQorICB9CisgIGlmIChmcm9tLl9oYXNfYml0c19bOCAvIDMyXSAmICgweGZmdSA8PCAoOCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CisgICAgICBzZXRfcHlfZ2VuZXJpY19zZXJ2aWNlcyhmcm9tLnB5X2dlbmVyaWNfc2VydmljZXMoKSk7CisgICAgfQorICB9CisgIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIEZpbGVPcHRpb25zOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIEZpbGVPcHRpb25zOjpDb3B5RnJvbShjb25zdCBGaWxlT3B0aW9ucyYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRmlsZU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIAorICBmb3IgKGludCBpID0gMDsgaSA8IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGaWxlT3B0aW9uczo6U3dhcChGaWxlT3B0aW9ucyogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAoamF2YV9wYWNrYWdlXywgb3RoZXItPmphdmFfcGFja2FnZV8pOworICAgIHN0ZDo6c3dhcChqYXZhX291dGVyX2NsYXNzbmFtZV8sIG90aGVyLT5qYXZhX291dGVyX2NsYXNzbmFtZV8pOworICAgIHN0ZDo6c3dhcChqYXZhX211bHRpcGxlX2ZpbGVzXywgb3RoZXItPmphdmFfbXVsdGlwbGVfZmlsZXNfKTsKKyAgICBzdGQ6OnN3YXAocmV0YWluX3Vua25vd25fZmllbGRzXywgb3RoZXItPnJldGFpbl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8sIG90aGVyLT5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8pOworICAgIHN0ZDo6c3dhcChvcHRpbWl6ZV9mb3JfLCBvdGhlci0+b3B0aW1pemVfZm9yXyk7CisgICAgc3RkOjpzd2FwKGNjX2dlbmVyaWNfc2VydmljZXNfLCBvdGhlci0+Y2NfZ2VuZXJpY19zZXJ2aWNlc18pOworICAgIHN0ZDo6c3dhcChqYXZhX2dlbmVyaWNfc2VydmljZXNfLCBvdGhlci0+amF2YV9nZW5lcmljX3NlcnZpY2VzXyk7CisgICAgc3RkOjpzd2FwKHB5X2dlbmVyaWNfc2VydmljZXNfLCBvdGhlci0+cHlfZ2VuZXJpY19zZXJ2aWNlc18pOworICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5Td2FwKCZvdGhlci0+dW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgICAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgRmlsZU9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEZpbGVPcHRpb25zX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gRmlsZU9wdGlvbnNfcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBNZXNzYWdlT3B0aW9uczo6a01lc3NhZ2VTZXRXaXJlRm9ybWF0RmllbGROdW1iZXI7Citjb25zdCBpbnQgTWVzc2FnZU9wdGlvbnM6OmtOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yRmllbGROdW1iZXI7Citjb25zdCBpbnQgTWVzc2FnZU9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitNZXNzYWdlT3B0aW9uczo6TWVzc2FnZU9wdGlvbnMoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIE1lc3NhZ2VPcHRpb25zOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK01lc3NhZ2VPcHRpb25zOjpNZXNzYWdlT3B0aW9ucyhjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIE1lc3NhZ2VPcHRpb25zOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfID0gZmFsc2U7CisgIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfID0gZmFsc2U7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK01lc3NhZ2VPcHRpb25zOjp+TWVzc2FnZU9wdGlvbnMoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBNZXNzYWdlT3B0aW9uczo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VPcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogTWVzc2FnZU9wdGlvbnM6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gTWVzc2FnZU9wdGlvbnNfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IE1lc3NhZ2VPcHRpb25zJiBNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworTWVzc2FnZU9wdGlvbnMqIE1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK01lc3NhZ2VPcHRpb25zKiBNZXNzYWdlT3B0aW9uczo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IE1lc3NhZ2VPcHRpb25zOworfQorCit2b2lkIE1lc3NhZ2VPcHRpb25zOjpDbGVhcigpIHsKKyAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfID0gZmFsc2U7CisgICAgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl8gPSBmYWxzZTsKKyAgfQorICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIE1lc3NhZ2VPcHRpb25zOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XykpKTsKKyAgICAgICAgICBzZXRfaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2Vfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl8pKSk7CisgICAgICAgICAgc2V0X2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgICAgIGNhc2UgOTk5OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF91bmludGVycHJldGVkX29wdGlvbigpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKKyAgICAgICAgICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgTWVzc2FnZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDEsIHRoaXMtPm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgyLCB0aGlzLT5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogTWVzc2FnZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxLCB0aGlzLT5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDIsIHRoaXMtPm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCisgIHRhcmdldCA9IF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgMTAwMCwgNTM2ODcwOTEyLCB0YXJnZXQpOworICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IE1lc3NhZ2VPcHRpb25zOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworICAKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgICAgfQorICAgIAorICAgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGhhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgICAgfQorICAgIAorICB9CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgdG90YWxfc2l6ZSArPSAyICogdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSk7CisgIH0KKyAgCisgIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgTWVzc2FnZU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMqIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBNZXNzYWdlT3B0aW9ucyo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBNZXNzYWdlT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS51bmludGVycHJldGVkX29wdGlvbl8pOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAgIHNldF9tZXNzYWdlX3NldF93aXJlX2Zvcm1hdChmcm9tLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CisgICAgICBzZXRfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcihmcm9tLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSk7CisgICAgfQorICB9CisgIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIE1lc3NhZ2VPcHRpb25zOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIE1lc3NhZ2VPcHRpb25zOjpDb3B5RnJvbShjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgTWVzc2FnZU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIAorICBmb3IgKGludCBpID0gMDsgaSA8IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNZXNzYWdlT3B0aW9uczo6U3dhcChNZXNzYWdlT3B0aW9ucyogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAobWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfLCBvdGhlci0+bWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfKTsKKyAgICBzdGQ6OnN3YXAobm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl8sIG90aGVyLT5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyk7CisgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLlN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgICBfZXh0ZW5zaW9uc18uU3dhcCgmb3RoZXItPl9leHRlbnNpb25zXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBNZXNzYWdlT3B0aW9uczo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gTWVzc2FnZU9wdGlvbnNfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBNZXNzYWdlT3B0aW9uc19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3JfOworfQorYm9vbCBGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgc3dpdGNoKHZhbHVlKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OlNUUklORzsKK2NvbnN0IEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OkNPUkQ7Citjb25zdCBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpTVFJJTkdfUElFQ0U7Citjb25zdCBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpDVHlwZV9NSU47Citjb25zdCBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpDVHlwZV9NQVg7Citjb25zdCBpbnQgRmllbGRPcHRpb25zOjpDVHlwZV9BUlJBWVNJWkU7CisjZW5kaWYgIC8vIF9NU0NfVkVSCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgRmllbGRPcHRpb25zOjprQ3R5cGVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWVsZE9wdGlvbnM6OmtQYWNrZWRGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWVsZE9wdGlvbnM6OmtEZXByZWNhdGVkRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmllbGRPcHRpb25zOjprRXhwZXJpbWVudGFsTWFwS2V5RmllbGROdW1iZXI7Citjb25zdCBpbnQgRmllbGRPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworRmllbGRPcHRpb25zOjpGaWVsZE9wdGlvbnMoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIEZpZWxkT3B0aW9uczo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitGaWVsZE9wdGlvbnM6OkZpZWxkT3B0aW9ucyhjb25zdCBGaWVsZE9wdGlvbnMmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBGaWVsZE9wdGlvbnM6OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBjdHlwZV8gPSAwOworICBwYWNrZWRfID0gZmFsc2U7CisgIGRlcHJlY2F0ZWRfID0gZmFsc2U7CisgIGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworRmllbGRPcHRpb25zOjp+RmllbGRPcHRpb25zKCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgRmllbGRPcHRpb25zOjpTaGFyZWREdG9yKCkgeworICBpZiAoZXhwZXJpbWVudGFsX21hcF9rZXlfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgZXhwZXJpbWVudGFsX21hcF9rZXlfOworICB9CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBGaWVsZE9wdGlvbnM6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBGaWVsZE9wdGlvbnM6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRmllbGRPcHRpb25zX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBGaWVsZE9wdGlvbnMmIEZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworRmllbGRPcHRpb25zKiBGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworRmllbGRPcHRpb25zKiBGaWVsZE9wdGlvbnM6Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBGaWVsZE9wdGlvbnM7Cit9CisKK3ZvaWQgRmllbGRPcHRpb25zOjpDbGVhcigpIHsKKyAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgY3R5cGVfID0gMDsKKyAgICBwYWNrZWRfID0gZmFsc2U7CisgICAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKKyAgICBpZiAoaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkpIHsKKyAgICAgIGlmIChleHBlcmltZW50YWxfbWFwX2tleV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBleHBlcmltZW50YWxfbWFwX2tleV8tPmNsZWFyKCk7CisgICAgICB9CisgICAgfQorICB9CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgRmllbGRPcHRpb25zOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGludCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSk7CisgICAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlX0lzVmFsaWQodmFsdWUpKSB7CisgICAgICAgICAgICBzZXRfY3R5cGUoc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlID4odmFsdWUpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMSwgdmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9wYWNrZWQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9wYWNrZWQ6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZwYWNrZWRfKSkpOworICAgICAgICAgIHNldF9oYXNfcGFja2VkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNCkpIGdvdG8gcGFyc2VfZGVwcmVjYXRlZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDM6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9kZXByZWNhdGVkOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmZGVwcmVjYXRlZF8pKSk7CisgICAgICAgICAgc2V0X2hhc19kZXByZWNhdGVkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3NCkpIGdvdG8gcGFyc2VfZXhwZXJpbWVudGFsX21hcF9rZXk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgZXhwZXJpbWVudGFsX21hcF9rZXkgPSA5OworICAgICAgY2FzZSA5OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2V4cGVyaW1lbnRhbF9tYXBfa2V5OgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9leHBlcmltZW50YWxfbWFwX2tleSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkuZGF0YSgpLCB0aGlzLT5leHBlcmltZW50YWxfbWFwX2tleSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgICAgICBjYXNlIDk5OTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7CisgICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIEZpZWxkT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKKyAgaWYgKGhhc19jdHlwZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKKyAgICAgIDEsIHRoaXMtPmN0eXBlKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKKyAgaWYgKGhhc19wYWNrZWQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMiwgdGhpcy0+cGFja2VkKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgzLCB0aGlzLT5kZXByZWNhdGVkKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBleHBlcmltZW50YWxfbWFwX2tleSA9IDk7CisgIGlmIChoYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5leHBlcmltZW50YWxfbWFwX2tleSgpLmRhdGEoKSwgdGhpcy0+ZXhwZXJpbWVudGFsX21hcF9rZXkoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgOSwgdGhpcy0+ZXhwZXJpbWVudGFsX21hcF9rZXkoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgMTAwMCwgNTM2ODcwOTEyLCBvdXRwdXQpOworICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBGaWVsZE9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlIGN0eXBlID0gMSBbZGVmYXVsdCA9IFNUUklOR107CisgIGlmIChoYXNfY3R5cGUoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAorICAgICAgMSwgdGhpcy0+Y3R5cGUoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgYm9vbCBwYWNrZWQgPSAyOworICBpZiAoaGFzX3BhY2tlZCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMiwgdGhpcy0+cGFja2VkKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMywgdGhpcy0+ZGVwcmVjYXRlZCgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgZXhwZXJpbWVudGFsX21hcF9rZXkgPSA5OworICBpZiAoaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+ZXhwZXJpbWVudGFsX21hcF9rZXkoKS5kYXRhKCksIHRoaXMtPmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICA5LCB0aGlzLT5leHBlcmltZW50YWxfbWFwX2tleSgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgdGFyZ2V0ID0gX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCk7CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgRmllbGRPcHRpb25zOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworICAKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOworICAgIGlmIChoYXNfY3R5cGUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPmN0eXBlKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7CisgICAgaWYgKGhhc19wYWNrZWQoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisgICAgCisgICAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisgICAgCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4cGVyaW1lbnRhbF9tYXBfa2V5ID0gOTsKKyAgICBpZiAoaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkpOworICAgIH0KKyAgICAKKyAgfQorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIHRvdGFsX3NpemUgKz0gMiAqIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkpOworICB9CisgIAorICB0b3RhbF9zaXplICs9IF9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOworICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIEZpZWxkT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBGaWVsZE9wdGlvbnMqIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBGaWVsZE9wdGlvbnMqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgRmllbGRPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgRmllbGRPcHRpb25zJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS51bmludGVycHJldGVkX29wdGlvbl8pOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX2N0eXBlKCkpIHsKKyAgICAgIHNldF9jdHlwZShmcm9tLmN0eXBlKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfcGFja2VkKCkpIHsKKyAgICAgIHNldF9wYWNrZWQoZnJvbS5wYWNrZWQoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19kZXByZWNhdGVkKCkpIHsKKyAgICAgIHNldF9kZXByZWNhdGVkKGZyb20uZGVwcmVjYXRlZCgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkpIHsKKyAgICAgIHNldF9leHBlcmltZW50YWxfbWFwX2tleShmcm9tLmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkpOworICAgIH0KKyAgfQorICBfZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGZyb20uX2V4dGVuc2lvbnNfKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBGaWVsZE9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRmllbGRPcHRpb25zOjpDb3B5RnJvbShjb25zdCBGaWVsZE9wdGlvbnMmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIEZpZWxkT3B0aW9uczo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIAorICBpZiAoIV9leHRlbnNpb25zXy5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZpZWxkT3B0aW9uczo6U3dhcChGaWVsZE9wdGlvbnMqIG90aGVyKSB7CisgIGlmIChvdGhlciAhPSB0aGlzKSB7CisgICAgc3RkOjpzd2FwKGN0eXBlXywgb3RoZXItPmN0eXBlXyk7CisgICAgc3RkOjpzd2FwKHBhY2tlZF8sIG90aGVyLT5wYWNrZWRfKTsKKyAgICBzdGQ6OnN3YXAoZGVwcmVjYXRlZF8sIG90aGVyLT5kZXByZWNhdGVkXyk7CisgICAgc3RkOjpzd2FwKGV4cGVyaW1lbnRhbF9tYXBfa2V5Xywgb3RoZXItPmV4cGVyaW1lbnRhbF9tYXBfa2V5Xyk7CisgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLlN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgICBfZXh0ZW5zaW9uc18uU3dhcCgmb3RoZXItPl9leHRlbnNpb25zXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBGaWVsZE9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEZpZWxkT3B0aW9uc19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEZpZWxkT3B0aW9uc19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IEVudW1PcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhX01TQ19WRVIKKworRW51bU9wdGlvbnM6OkVudW1PcHRpb25zKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworfQorCitFbnVtT3B0aW9uczo6RW51bU9wdGlvbnMoY29uc3QgRW51bU9wdGlvbnMmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK0VudW1PcHRpb25zOjp+RW51bU9wdGlvbnMoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIEVudW1PcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bU9wdGlvbnM6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRW51bU9wdGlvbnNfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IEVudW1PcHRpb25zJiBFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworRW51bU9wdGlvbnMqIEVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0VudW1PcHRpb25zKiBFbnVtT3B0aW9uczo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IEVudW1PcHRpb25zOworfQorCit2b2lkIEVudW1PcHRpb25zOjpDbGVhcigpIHsKKyAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgRW51bU9wdGlvbnM6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgICAgIGNhc2UgOTk5OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF91bmludGVycHJldGVkX29wdGlvbigpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKKyAgICAgICAgICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgRW51bU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRW51bU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICB0YXJnZXQgPSBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICAgIDEwMDAsIDUzNjg3MDkxMiwgdGFyZ2V0KTsKKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBFbnVtT3B0aW9uczo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgdG90YWxfc2l6ZSArPSAyICogdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSk7CisgIH0KKyAgCisgIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgRW51bU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgRW51bU9wdGlvbnMqIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBFbnVtT3B0aW9ucyo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBFbnVtT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IEVudW1PcHRpb25zJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS51bmludGVycHJldGVkX29wdGlvbl8pOworICBfZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGZyb20uX2V4dGVuc2lvbnNfKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBFbnVtT3B0aW9uczo6Q29weUZyb20oY29uc3QgRW51bU9wdGlvbnMmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIEVudW1PcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICAKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIGlmICghX2V4dGVuc2lvbnNfLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRW51bU9wdGlvbnM6OlN3YXAoRW51bU9wdGlvbnMqIG90aGVyKSB7CisgIGlmIChvdGhlciAhPSB0aGlzKSB7CisgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLlN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOworICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgICBfZXh0ZW5zaW9uc18uU3dhcCgmb3RoZXItPl9leHRlbnNpb25zXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBFbnVtT3B0aW9uczo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRW51bU9wdGlvbnNfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBFbnVtT3B0aW9uc19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmbmRlZiBfTVNDX1ZFUgorY29uc3QgaW50IEVudW1WYWx1ZU9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitFbnVtVmFsdWVPcHRpb25zOjpFbnVtVmFsdWVPcHRpb25zKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBFbnVtVmFsdWVPcHRpb25zOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK0VudW1WYWx1ZU9wdGlvbnM6OkVudW1WYWx1ZU9wdGlvbnMoY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitFbnVtVmFsdWVPcHRpb25zOjp+RW51bVZhbHVlT3B0aW9ucygpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OlNoYXJlZER0b3IoKSB7CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBFbnVtVmFsdWVPcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bVZhbHVlT3B0aW9uczo6ZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBFbnVtVmFsdWVPcHRpb25zX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitFbnVtVmFsdWVPcHRpb25zKiBFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0VudW1WYWx1ZU9wdGlvbnMqIEVudW1WYWx1ZU9wdGlvbnM6Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBFbnVtVmFsdWVPcHRpb25zOworfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OkNsZWFyKCkgeworICBfZXh0ZW5zaW9uc18uQ2xlYXIoKTsKKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBFbnVtVmFsdWVPcHRpb25zOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgICAgICBjYXNlIDk5OTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7CisgICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworI3VuZGVmIERPXworfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRW51bVZhbHVlT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCisgIHRhcmdldCA9IF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgMTAwMCwgNTM2ODcwOTEyLCB0YXJnZXQpOworICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IEVudW1WYWx1ZU9wdGlvbnM6OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIHRvdGFsX3NpemUgKz0gMiAqIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkpOworICB9CisgIAorICB0b3RhbF9zaXplICs9IF9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOworICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgRW51bVZhbHVlT3B0aW9ucyogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMqPigKKyAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLk1lcmdlRnJvbShmcm9tLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6Q29weUZyb20oY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRW51bVZhbHVlT3B0aW9uczo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgCisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIXRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIAorICBpZiAoIV9leHRlbnNpb25zXy5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsgIHJldHVybiB0cnVlOworfQorCit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OlN3YXAoRW51bVZhbHVlT3B0aW9ucyogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICB1bmludGVycHJldGVkX29wdGlvbl8uU3dhcCgmb3RoZXItPnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICAgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEVudW1WYWx1ZU9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEVudW1WYWx1ZU9wdGlvbnNfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBFbnVtVmFsdWVPcHRpb25zX3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgU2VydmljZU9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitTZXJ2aWNlT3B0aW9uczo6U2VydmljZU9wdGlvbnMoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK1NlcnZpY2VPcHRpb25zOjpTZXJ2aWNlT3B0aW9ucyhjb25zdCBTZXJ2aWNlT3B0aW9ucyYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworU2VydmljZU9wdGlvbnM6On5TZXJ2aWNlT3B0aW9ucygpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpTaGFyZWREdG9yKCkgeworICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICB9Cit9CisKK3ZvaWQgU2VydmljZU9wdGlvbnM6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBTZXJ2aWNlT3B0aW9uczo6ZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBTZXJ2aWNlT3B0aW9uc19kZXNjcmlwdG9yXzsKK30KKworY29uc3QgU2VydmljZU9wdGlvbnMmIFNlcnZpY2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitTZXJ2aWNlT3B0aW9ucyogU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworU2VydmljZU9wdGlvbnMqIFNlcnZpY2VPcHRpb25zOjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgU2VydmljZU9wdGlvbnM7Cit9CisKK3ZvaWQgU2VydmljZU9wdGlvbnM6OkNsZWFyKCkgeworICBfZXh0ZW5zaW9uc18uQ2xlYXIoKTsKKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBTZXJ2aWNlT3B0aW9uczo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICAgICAgY2FzZSA5OTk6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICAgcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb246CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc5OTQpKSBnb3RvIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoODAwMHUgPD0gdGFnKSkgeworICAgICAgICAgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBTZXJ2aWNlT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgMTAwMCwgNTM2ODcwOTEyLCBvdXRwdXQpOworICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJ2aWNlT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCisgIHRhcmdldCA9IF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgMTAwMCwgNTM2ODcwOTEyLCB0YXJnZXQpOworICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IFNlcnZpY2VPcHRpb25zOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICB0b3RhbF9zaXplICs9IDIgKiB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpKTsKKyAgfQorICAKKyAgdG90YWxfc2l6ZSArPSBfZXh0ZW5zaW9uc18uQnl0ZVNpemUoKTsKKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBTZXJ2aWNlT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBTZXJ2aWNlT3B0aW9ucyogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IFNlcnZpY2VPcHRpb25zKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLk1lcmdlRnJvbShmcm9tLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIFNlcnZpY2VPcHRpb25zOjpDb3B5RnJvbShjb25zdCBTZXJ2aWNlT3B0aW9ucyYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgU2VydmljZU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIAorICBmb3IgKGludCBpID0gMDsgaSA8IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTZXJ2aWNlT3B0aW9uczo6U3dhcChTZXJ2aWNlT3B0aW9ucyogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICB1bmludGVycHJldGVkX29wdGlvbl8uU3dhcCgmb3RoZXItPnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICAgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFNlcnZpY2VPcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBTZXJ2aWNlT3B0aW9uc19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFNlcnZpY2VPcHRpb25zX3JlZmxlY3Rpb25fOworICByZXR1cm4gbWV0YWRhdGE7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZuZGVmIF9NU0NfVkVSCitjb25zdCBpbnQgTWV0aG9kT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK01ldGhvZE9wdGlvbnM6Ok1ldGhvZE9wdGlvbnMoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIE1ldGhvZE9wdGlvbnM6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworTWV0aG9kT3B0aW9uczo6TWV0aG9kT3B0aW9ucyhjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Cit9CisKK01ldGhvZE9wdGlvbnM6On5NZXRob2RPcHRpb25zKCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIE1ldGhvZE9wdGlvbnM6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBNZXRob2RPcHRpb25zOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIE1ldGhvZE9wdGlvbnNfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IE1ldGhvZE9wdGlvbnMmIE1ldGhvZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK01ldGhvZE9wdGlvbnMqIE1ldGhvZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworTWV0aG9kT3B0aW9ucyogTWV0aG9kT3B0aW9uczo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IE1ldGhvZE9wdGlvbnM7Cit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6Q2xlYXIoKSB7CisgIF9leHRlbnNpb25zXy5DbGVhcigpOworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIE1ldGhvZE9wdGlvbnM6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgICAgIGNhc2UgOTk5OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF91bmludGVycHJldGVkX29wdGlvbigpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgorICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKKyAgICAgICAgICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQorICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgMTAwMCwgNTM2ODcwOTEyLCBvdXRwdXQpOworICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBNZXRob2RPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKKyAgdGFyZ2V0ID0gX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCk7CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgTWV0aG9kT3B0aW9uczo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgdG90YWxfc2l6ZSArPSAyICogdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSk7CisgIH0KKyAgCisgIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBNZXRob2RPcHRpb25zKiBzb3VyY2UgPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgTWV0aG9kT3B0aW9ucyo+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBNZXRob2RPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgTWV0aG9kT3B0aW9ucyYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICB1bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgX2V4dGVuc2lvbnNfLk1lcmdlRnJvbShmcm9tLl9leHRlbnNpb25zXyk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBNZXRob2RPcHRpb25zOjpDb3B5RnJvbShjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBNZXRob2RPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICAKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIGlmICghdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIGlmICghX2V4dGVuc2lvbnNfLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWV0aG9kT3B0aW9uczo6U3dhcChNZXRob2RPcHRpb25zKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5Td2FwKCZvdGhlci0+dW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgICAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgTWV0aG9kT3B0aW9uczo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gTWV0aG9kT3B0aW9uc19kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IE1ldGhvZE9wdGlvbnNfcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjprTmFtZVBhcnRGaWVsZE51bWJlcjsKK2NvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjprSXNFeHRlbnNpb25GaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydChjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIG5hbWVfcGFydF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIGlzX2V4dGVuc2lvbl8gPSBmYWxzZTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6flVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQoKSB7CisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpTaGFyZWREdG9yKCkgeworICBpZiAobmFtZV9wYXJ0XyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIG5hbWVfcGFydF87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ7Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGhhc19uYW1lX3BhcnQoKSkgeworICAgICAgaWYgKG5hbWVfcGFydF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBuYW1lX3BhcnRfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpc19leHRlbnNpb25fID0gZmFsc2U7CisgIH0KKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIHJlcXVpcmVkIHN0cmluZyBuYW1lX3BhcnQgPSAxOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZV9wYXJ0KCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+bmFtZV9wYXJ0KCkuZGF0YSgpLCB0aGlzLT5uYW1lX3BhcnQoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9pc19leHRlbnNpb247CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9pc19leHRlbnNpb246CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZpc19leHRlbnNpb25fKSkpOworICAgICAgICAgIHNldF9oYXNfaXNfZXh0ZW5zaW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgIGlmIChoYXNfbmFtZV9wYXJ0KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZV9wYXJ0KCkuZGF0YSgpLCB0aGlzLT5uYW1lX3BhcnQoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMSwgdGhpcy0+bmFtZV9wYXJ0KCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIHJlcXVpcmVkIGJvb2wgaXNfZXh0ZW5zaW9uID0gMjsKKyAgaWYgKGhhc19pc19leHRlbnNpb24oKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMiwgdGhpcy0+aXNfZXh0ZW5zaW9uKCksIG91dHB1dCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgIGlmIChoYXNfbmFtZV9wYXJ0KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgdGhpcy0+bmFtZV9wYXJ0KCkuZGF0YSgpLCB0aGlzLT5uYW1lX3BhcnQoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDEsIHRoaXMtPm5hbWVfcGFydCgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7CisgIGlmIChoYXNfaXNfZXh0ZW5zaW9uKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgyLCB0aGlzLT5pc19leHRlbnNpb24oKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgIAorICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIC8vIHJlcXVpcmVkIHN0cmluZyBuYW1lX3BhcnQgPSAxOworICAgIGlmIChoYXNfbmFtZV9wYXJ0KCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPm5hbWVfcGFydCgpKTsKKyAgICB9CisgICAgCisgICAgLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOworICAgIGlmIChoYXNfaXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgICAgfQorICAgIAorICB9CisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0Kj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ok1lcmdlRnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfbmFtZV9wYXJ0KCkpIHsKKyAgICAgIHNldF9uYW1lX3BhcnQoZnJvbS5uYW1lX3BhcnQoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19pc19leHRlbnNpb24oKSkgeworICAgICAgc2V0X2lzX2V4dGVuc2lvbihmcm9tLmlzX2V4dGVuc2lvbigpKTsKKyAgICB9CisgIH0KKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OkNvcHlGcm9tKGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIGlmICgoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDMpICE9IDB4MDAwMDAwMDMpIHJldHVybiBmYWxzZTsKKyAgCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBzdGQ6OnN3YXAobmFtZV9wYXJ0Xywgb3RoZXItPm5hbWVfcGFydF8pOworICAgIHN0ZDo6c3dhcChpc19leHRlbnNpb25fLCBvdGhlci0+aXNfZXh0ZW5zaW9uXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprTmFtZUZpZWxkTnVtYmVyOworY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246OmtJZGVudGlmaWVyVmFsdWVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprUG9zaXRpdmVJbnRWYWx1ZUZpZWxkTnVtYmVyOworY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246OmtOZWdhdGl2ZUludFZhbHVlRmllbGROdW1iZXI7Citjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbjo6a0RvdWJsZVZhbHVlRmllbGROdW1iZXI7Citjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbjo6a1N0cmluZ1ZhbHVlRmllbGROdW1iZXI7Citjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbjo6a0FnZ3JlZ2F0ZVZhbHVlRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitVbmludGVycHJldGVkT3B0aW9uOjpVbmludGVycHJldGVkT3B0aW9uKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK1VuaW50ZXJwcmV0ZWRPcHRpb246OlVuaW50ZXJwcmV0ZWRPcHRpb24oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBpZGVudGlmaWVyX3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgcG9zaXRpdmVfaW50X3ZhbHVlXyA9IEdPT0dMRV9VTE9OR0xPTkcoMCk7CisgIG5lZ2F0aXZlX2ludF92YWx1ZV8gPSBHT09HTEVfTE9OR0xPTkcoMCk7CisgIGRvdWJsZV92YWx1ZV8gPSAwOworICBzdHJpbmdfdmFsdWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBhZ2dyZWdhdGVfdmFsdWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitVbmludGVycHJldGVkT3B0aW9uOjp+VW5pbnRlcnByZXRlZE9wdGlvbigpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNoYXJlZER0b3IoKSB7CisgIGlmIChpZGVudGlmaWVyX3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGlkZW50aWZpZXJfdmFsdWVfOworICB9CisgIGlmIChzdHJpbmdfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWxldGUgc3RyaW5nX3ZhbHVlXzsKKyAgfQorICBpZiAoYWdncmVnYXRlX3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVsZXRlIGFnZ3JlZ2F0ZV92YWx1ZV87CisgIH0KKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBVbmludGVycHJldGVkT3B0aW9uOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIFVuaW50ZXJwcmV0ZWRPcHRpb25fZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK1VuaW50ZXJwcmV0ZWRPcHRpb24qIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworVW5pbnRlcnByZXRlZE9wdGlvbiogVW5pbnRlcnByZXRlZE9wdGlvbjo6TmV3KCkgY29uc3QgeworICByZXR1cm4gbmV3IFVuaW50ZXJwcmV0ZWRPcHRpb247Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Q2xlYXIoKSB7CisgIGlmIChfaGFzX2JpdHNfWzEgLyAzMl0gJiAoMHhmZnUgPDwgKDEgJSAzMikpKSB7CisgICAgaWYgKGhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKKyAgICAgIGlmIChpZGVudGlmaWVyX3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGlkZW50aWZpZXJfdmFsdWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBwb3NpdGl2ZV9pbnRfdmFsdWVfID0gR09PR0xFX1VMT05HTE9ORygwKTsKKyAgICBuZWdhdGl2ZV9pbnRfdmFsdWVfID0gR09PR0xFX0xPTkdMT05HKDApOworICAgIGRvdWJsZV92YWx1ZV8gPSAwOworICAgIGlmIChoYXNfc3RyaW5nX3ZhbHVlKCkpIHsKKyAgICAgIGlmIChzdHJpbmdfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICAgICAgc3RyaW5nX3ZhbHVlXy0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc19hZ2dyZWdhdGVfdmFsdWUoKSkgeworICAgICAgaWYgKGFnZ3JlZ2F0ZV92YWx1ZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgICAgICBhZ2dyZWdhdGVfdmFsdWVfLT5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgfQorICBuYW1lXy5DbGVhcigpOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Cit9CisKK2Jvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0IG5hbWUgPSAyOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX25hbWU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX25hbWUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX25hbWU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9pZGVudGlmaWVyX3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2lkZW50aWZpZXJfdmFsdWU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2lkZW50aWZpZXJfdmFsdWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5pZGVudGlmaWVyX3ZhbHVlKCkuZGF0YSgpLCB0aGlzLT5pZGVudGlmaWVyX3ZhbHVlKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzMikpIGdvdG8gcGFyc2VfcG9zaXRpdmVfaW50X3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CisgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgICBwYXJzZV9wb3NpdGl2ZV9pbnRfdmFsdWU6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfVUlOVDY0PigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZwb3NpdGl2ZV9pbnRfdmFsdWVfKSkpOworICAgICAgICAgIHNldF9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MCkpIGdvdG8gcGFyc2VfbmVnYXRpdmVfaW50X3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKKyAgICAgIGNhc2UgNTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgIHBhcnNlX25lZ2F0aXZlX2ludF92YWx1ZToKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDY0PigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZuZWdhdGl2ZV9pbnRfdmFsdWVfKSkpOworICAgICAgICAgIHNldF9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0OSkpIGdvdG8gcGFyc2VfZG91YmxlX3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDY7CisgICAgICBjYXNlIDY6IHsKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCkgeworICAgICAgICAgcGFyc2VfZG91YmxlX3ZhbHVlOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgZG91YmxlLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9ET1VCTEU+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJmRvdWJsZV92YWx1ZV8pKSk7CisgICAgICAgICAgc2V0X2hhc19kb3VibGVfdmFsdWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9zdHJpbmdfdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICAvLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OworICAgICAgY2FzZSA3OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3N0cmluZ192YWx1ZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRCeXRlcygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9zdHJpbmdfdmFsdWUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX2FnZ3JlZ2F0ZV92YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OworICAgICAgY2FzZSA4OiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX2FnZ3JlZ2F0ZV92YWx1ZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfYWdncmVnYXRlX3ZhbHVlKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCkuZGF0YSgpLCB0aGlzLT5hZ2dyZWdhdGVfdmFsdWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKKyAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bmFtZV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCisgICAgICAyLCB0aGlzLT5uYW1lKGkpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7CisgIGlmIChoYXNfaWRlbnRpZmllcl92YWx1ZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmlkZW50aWZpZXJfdmFsdWUoKS5kYXRhKCksIHRoaXMtPmlkZW50aWZpZXJfdmFsdWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgMywgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCB1aW50NjQgcG9zaXRpdmVfaW50X3ZhbHVlID0gNDsKKyAgaWYgKGhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQ2NCg0LCB0aGlzLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKKyAgaWYgKGhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0KDUsIHRoaXMtPm5lZ2F0aXZlX2ludF92YWx1ZSgpLCBvdXRwdXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKKyAgaWYgKGhhc19kb3VibGVfdmFsdWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZSg2LCB0aGlzLT5kb3VibGVfdmFsdWUoKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgYnl0ZXMgc3RyaW5nX3ZhbHVlID0gNzsKKyAgaWYgKGhhc19zdHJpbmdfdmFsdWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzKAorICAgICAgNywgdGhpcy0+c3RyaW5nX3ZhbHVlKCksIG91dHB1dCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OworICBpZiAoaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDgsIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLCBvdXRwdXQpOworICB9CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCBuYW1lID0gMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5uYW1lX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgMiwgdGhpcy0+bmFtZShpKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOworICBpZiAoaGFzX2lkZW50aWZpZXJfdmFsdWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICB0aGlzLT5pZGVudGlmaWVyX3ZhbHVlKCkuZGF0YSgpLCB0aGlzLT5pZGVudGlmaWVyX3ZhbHVlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAzLCB0aGlzLT5pZGVudGlmaWVyX3ZhbHVlKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OworICBpZiAoaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVUludDY0VG9BcnJheSg0LCB0aGlzLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKKyAgaWYgKGhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0VG9BcnJheSg1LCB0aGlzLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgLy8gb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDY7CisgIGlmIChoYXNfZG91YmxlX3ZhbHVlKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVEb3VibGVUb0FycmF5KDYsIHRoaXMtPmRvdWJsZV92YWx1ZSgpLCB0YXJnZXQpOworICB9CisgIAorICAvLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OworICBpZiAoaGFzX3N0cmluZ192YWx1ZSgpKSB7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzVG9BcnJheSgKKyAgICAgICAgNywgdGhpcy0+c3RyaW5nX3ZhbHVlKCksIHRhcmdldCk7CisgIH0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OworICBpZiAoaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICA4LCB0aGlzLT5hZ2dyZWdhdGVfdmFsdWUoKSwgdGFyZ2V0KTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgIAorICBpZiAoX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgeworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKKyAgICBpZiAoaGFzX2lkZW50aWZpZXJfdmFsdWUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpKTsKKyAgICB9CisgICAgCisgICAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CisgICAgaWYgKGhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlVJbnQ2NFNpemUoCisgICAgICAgICAgdGhpcy0+cG9zaXRpdmVfaW50X3ZhbHVlKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBpbnQ2NCBuZWdhdGl2ZV9pbnRfdmFsdWUgPSA1OworICAgIGlmIChoYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQ2NFNpemUoCisgICAgICAgICAgdGhpcy0+bmVnYXRpdmVfaW50X3ZhbHVlKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKKyAgICBpZiAoaGFzX2RvdWJsZV92YWx1ZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKyA4OworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OworICAgIGlmIChoYXNfc3RyaW5nX3ZhbHVlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpCeXRlc1NpemUoCisgICAgICAgICAgdGhpcy0+c3RyaW5nX3ZhbHVlKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKKyAgICBpZiAoaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgICB0aGlzLT5hZ2dyZWdhdGVfdmFsdWUoKSk7CisgICAgfQorICAgIAorICB9CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCBuYW1lID0gMjsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+bmFtZV9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bmFtZV9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+bmFtZShpKSk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24qIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBVbmludGVycHJldGVkT3B0aW9uKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246Ok1lcmdlRnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIG5hbWVfLk1lcmdlRnJvbShmcm9tLm5hbWVfKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKKyAgICAgIHNldF9pZGVudGlmaWVyX3ZhbHVlKGZyb20uaWRlbnRpZmllcl92YWx1ZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7CisgICAgICBzZXRfcG9zaXRpdmVfaW50X3ZhbHVlKGZyb20ucG9zaXRpdmVfaW50X3ZhbHVlKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkpIHsKKyAgICAgIHNldF9uZWdhdGl2ZV9pbnRfdmFsdWUoZnJvbS5uZWdhdGl2ZV9pbnRfdmFsdWUoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19kb3VibGVfdmFsdWUoKSkgeworICAgICAgc2V0X2RvdWJsZV92YWx1ZShmcm9tLmRvdWJsZV92YWx1ZSgpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX3N0cmluZ192YWx1ZSgpKSB7CisgICAgICBzZXRfc3RyaW5nX3ZhbHVlKGZyb20uc3RyaW5nX3ZhbHVlKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfYWdncmVnYXRlX3ZhbHVlKCkpIHsKKyAgICAgIHNldF9hZ2dyZWdhdGVfdmFsdWUoZnJvbS5hZ2dyZWdhdGVfdmFsdWUoKSk7CisgICAgfQorICB9CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpDb3B5RnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICAKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCF0aGlzLT5uYW1lKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbiogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBuYW1lXy5Td2FwKCZvdGhlci0+bmFtZV8pOworICAgIHN0ZDo6c3dhcChpZGVudGlmaWVyX3ZhbHVlXywgb3RoZXItPmlkZW50aWZpZXJfdmFsdWVfKTsKKyAgICBzdGQ6OnN3YXAocG9zaXRpdmVfaW50X3ZhbHVlXywgb3RoZXItPnBvc2l0aXZlX2ludF92YWx1ZV8pOworICAgIHN0ZDo6c3dhcChuZWdhdGl2ZV9pbnRfdmFsdWVfLCBvdGhlci0+bmVnYXRpdmVfaW50X3ZhbHVlXyk7CisgICAgc3RkOjpzd2FwKGRvdWJsZV92YWx1ZV8sIG90aGVyLT5kb3VibGVfdmFsdWVfKTsKKyAgICBzdGQ6OnN3YXAoc3RyaW5nX3ZhbHVlXywgb3RoZXItPnN0cmluZ192YWx1ZV8pOworICAgIHN0ZDo6c3dhcChhZ2dyZWdhdGVfdmFsdWVfLCBvdGhlci0+YWdncmVnYXRlX3ZhbHVlXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgVW5pbnRlcnByZXRlZE9wdGlvbjo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gVW5pbnRlcnByZXRlZE9wdGlvbl9kZXNjcmlwdG9yXzsKKyAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFVuaW50ZXJwcmV0ZWRPcHRpb25fcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6a1BhdGhGaWVsZE51bWJlcjsKK2NvbnN0IGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6a1NwYW5GaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIV9NU0NfVkVSCisKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbigpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworU291cmNlQ29kZUluZm9fTG9jYXRpb246OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OlNoYXJlZEN0b3IoKSB7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6flNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKCkgeworICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OlNoYXJlZER0b3IoKSB7CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogU291cmNlQ29kZUluZm9fTG9jYXRpb246Ok5ldygpIGNvbnN0IHsKKyAgcmV0dXJuIG5ldyBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjsKK30KKwordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Q2xlYXIoKSB7CisgIHBhdGhfLkNsZWFyKCk7CisgIHNwYW5fLkNsZWFyKCk7CisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKK30KKworYm9vbCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfcGF0aCgpKSkpOworICAgICAgICB9IGVsc2UgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpCisgICAgICAgICAgICAgICAgICAgPT0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICAgICAgICAgICAgICAgIFdJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZU5vSW5saW5lPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKKyAgICAgICAgICAgICAgICAgMSwgMTAsIGlucHV0LCB0aGlzLT5tdXRhYmxlX3BhdGgoKSkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9zcGFuOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgIHBhcnNlX3NwYW46CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3NwYW4oKSkpKTsKKyAgICAgICAgfSBlbHNlIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKQorICAgICAgICAgICAgICAgICAgID09IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgICAgICAgICAgICAgICBXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmVOb0lubGluZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgICAgICAgICAgICAgIDEsIDE4LCBpbnB1dCwgdGhpcy0+bXV0YWJsZV9zcGFuKCkpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgaWYgKHRoaXMtPnBhdGhfc2l6ZSgpID4gMCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZygxLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKKyAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoX3BhdGhfY2FjaGVkX2J5dGVfc2l6ZV8pOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cGF0aF9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyTm9UYWcoCisgICAgICB0aGlzLT5wYXRoKGkpLCBvdXRwdXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07CisgIGlmICh0aGlzLT5zcGFuX3NpemUoKSA+IDApIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7CisgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKF9zcGFuX2NhY2hlZF9ieXRlX3NpemVfKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnNwYW5fc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMk5vVGFnKAorICAgICAgdGhpcy0+c3BhbihpKSwgb3V0cHV0KTsKKyAgfQorICAKKyAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICBpZiAodGhpcy0+cGF0aF9zaXplKCkgPiAwKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnVG9BcnJheSgKKyAgICAgIDEsCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICAgIHRhcmdldCk7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KAorICAgICAgX3BhdGhfY2FjaGVkX2J5dGVfc2l6ZV8sIHRhcmdldCk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wYXRoX3NpemUoKTsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVJbnQzMk5vVGFnVG9BcnJheSh0aGlzLT5wYXRoKGkpLCB0YXJnZXQpOworICB9CisgIAorICAvLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07CisgIGlmICh0aGlzLT5zcGFuX3NpemUoKSA+IDApIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgMiwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAorICAgICAgdGFyZ2V0KTsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoCisgICAgICBfc3Bhbl9jYWNoZWRfYnl0ZV9zaXplXywgdGFyZ2V0KTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnNwYW5fc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZUludDMyTm9UYWdUb0FycmF5KHRoaXMtPnNwYW4oaSksIHRhcmdldCk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Qnl0ZVNpemUoKSBjb25zdCB7CisgIGludCB0b3RhbF9zaXplID0gMDsKKyAgCisgIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgeworICAgIGludCBkYXRhX3NpemUgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cGF0aF9zaXplKCk7IGkrKykgeworICAgICAgZGF0YV9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50MzJTaXplKHRoaXMtPnBhdGgoaSkpOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplID4gMCkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZShkYXRhX3NpemUpOworICAgIH0KKyAgICBfcGF0aF9jYWNoZWRfYnl0ZV9zaXplXyA9IGRhdGFfc2l6ZTsKKyAgICB0b3RhbF9zaXplICs9IGRhdGFfc2l6ZTsKKyAgfQorICAKKyAgLy8gcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOworICB7CisgICAgaW50IGRhdGFfc2l6ZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5zcGFuX3NpemUoKTsgaSsrKSB7CisgICAgICBkYXRhX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnQzMlNpemUodGhpcy0+c3BhbihpKSk7CisgICAgfQorICAgIGlmIChkYXRhX3NpemUgPiAwKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKGRhdGFfc2l6ZSk7CisgICAgfQorICAgIF9zcGFuX2NhY2hlZF9ieXRlX3NpemVfID0gZGF0YV9zaXplOworICAgIHRvdGFsX3NpemUgKz0gZGF0YV9zaXplOworICB9CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIHNvdXJjZSA9CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbio+KAorICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6TWVyZ2VGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKSB7CisgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisgIHBhdGhfLk1lcmdlRnJvbShmcm9tLnBhdGhfKTsKKyAgc3Bhbl8uTWVyZ2VGcm9tKGZyb20uc3Bhbl8pOworICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpDb3B5RnJvbShjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgU291cmNlQ29kZUluZm9fTG9jYXRpb246OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIAorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U3dhcChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogb3RoZXIpIHsKKyAgaWYgKG90aGVyICE9IHRoaXMpIHsKKyAgICBwYXRoXy5Td2FwKCZvdGhlci0+cGF0aF8pOworICAgIHNwYW5fLlN3YXAoJm90aGVyLT5zcGFuXyk7CisgICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gU291cmNlQ29kZUluZm9fTG9jYXRpb25fcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgX01TQ19WRVIKK2NvbnN0IGludCBTb3VyY2VDb2RlSW5mbzo6a0xvY2F0aW9uRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCitTb3VyY2VDb2RlSW5mbzo6U291cmNlQ29kZUluZm8oKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK1NvdXJjZUNvZGVJbmZvOjpTb3VyY2VDb2RlSW5mbyhjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworU291cmNlQ29kZUluZm86On5Tb3VyY2VDb2RlSW5mbygpIHsKKyAgU2hhcmVkRHRvcigpOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpTaGFyZWREdG9yKCkgeworICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICB9Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm86OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBTb3VyY2VDb2RlSW5mbzo6ZGVzY3JpcHRvcigpIHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIHJldHVybiBTb3VyY2VDb2RlSW5mb19kZXNjcmlwdG9yXzsKK30KKworY29uc3QgU291cmNlQ29kZUluZm8mIFNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlKCkgeworICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitTb3VyY2VDb2RlSW5mbyogU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworU291cmNlQ29kZUluZm8qIFNvdXJjZUNvZGVJbmZvOjpOZXcoKSBjb25zdCB7CisgIHJldHVybiBuZXcgU291cmNlQ29kZUluZm87Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm86OkNsZWFyKCkgeworICBsb2NhdGlvbl8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworfQorCitib29sIFNvdXJjZUNvZGVJbmZvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIGxvY2F0aW9uID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgICBwYXJzZV9sb2NhdGlvbjoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfbG9jYXRpb24oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTApKSBnb3RvIHBhcnNlX2xvY2F0aW9uOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6CisgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgU291cmNlQ29kZUluZm86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gbG9jYXRpb24gPSAxOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmxvY2F0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDEsIHRoaXMtPmxvY2F0aW9uKGkpLCBvdXRwdXQpOworICB9CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNvdXJjZUNvZGVJbmZvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIGxvY2F0aW9uID0gMTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5sb2NhdGlvbl9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDEsIHRoaXMtPmxvY2F0aW9uKGkpLCB0YXJnZXQpOworICB9CisgIAorICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgU291cmNlQ29kZUluZm86OkJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIGxvY2F0aW9uID0gMTsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+bG9jYXRpb25fc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmxvY2F0aW9uX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5sb2NhdGlvbihpKSk7CisgIH0KKyAgCisgIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CisgIH0KKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBTb3VyY2VDb2RlSW5mbzo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworICBjb25zdCBTb3VyY2VDb2RlSW5mbyogc291cmNlID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IFNvdXJjZUNvZGVJbmZvKj4oCisgICAgICAmZnJvbSk7CisgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAgIE1lcmdlRnJvbSgqc291cmNlKTsKKyAgfQorfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpNZXJnZUZyb20oY29uc3QgU291cmNlQ29kZUluZm8mIGZyb20pIHsKKyAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKyAgbG9jYXRpb25fLk1lcmdlRnJvbShmcm9tLmxvY2F0aW9uXyk7CisgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgU291cmNlQ29kZUluZm86OkNvcHlGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBmcm9tKSB7CisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBTb3VyY2VDb2RlSW5mbzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKyAgCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNvdXJjZUNvZGVJbmZvOjpTd2FwKFNvdXJjZUNvZGVJbmZvKiBvdGhlcikgeworICBpZiAob3RoZXIgIT0gdGhpcykgeworICAgIGxvY2F0aW9uXy5Td2FwKCZvdGhlci0+bG9jYXRpb25fKTsKKyAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIH0KK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBTb3VyY2VDb2RlSW5mbzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gU291cmNlQ29kZUluZm9fZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBTb3VyY2VDb2RlSW5mb19yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOTFkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmgKQEAgLTAsMCArMSw1MjU2IEBACisvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bworCisjaWZuZGVmIFBST1RPQlVGX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvX19JTkNMVURFRAorI2RlZmluZSBQUk9UT0JVRl9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19fSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2lmIEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDwgMjAwNDAwMAorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlIHVwZGF0ZQorI2Vycm9yIHlvdXIgaGVhZGVycy4KKyNlbmRpZgorI2lmIDIwMDQwMDIgPCBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlCisjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuCit2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Cit2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKK3ZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisKK2NsYXNzIEZpbGVEZXNjcmlwdG9yU2V0OworY2xhc3MgRmlsZURlc2NyaXB0b3JQcm90bzsKK2NsYXNzIERlc2NyaXB0b3JQcm90bzsKK2NsYXNzIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTsKK2NsYXNzIEZpZWxkRGVzY3JpcHRvclByb3RvOworY2xhc3MgRW51bURlc2NyaXB0b3JQcm90bzsKK2NsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzsKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG87CitjbGFzcyBNZXRob2REZXNjcmlwdG9yUHJvdG87CitjbGFzcyBGaWxlT3B0aW9uczsKK2NsYXNzIE1lc3NhZ2VPcHRpb25zOworY2xhc3MgRmllbGRPcHRpb25zOworY2xhc3MgRW51bU9wdGlvbnM7CitjbGFzcyBFbnVtVmFsdWVPcHRpb25zOworY2xhc3MgU2VydmljZU9wdGlvbnM7CitjbGFzcyBNZXRob2RPcHRpb25zOworY2xhc3MgVW5pbnRlcnByZXRlZE9wdGlvbjsKK2NsYXNzIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ7CitjbGFzcyBTb3VyY2VDb2RlSW5mbzsKK2NsYXNzIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOworCitlbnVtIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgeworICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRE9VQkxFID0gMSwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZMT0FUID0gMiwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0lOVDY0ID0gMywKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1VJTlQ2NCA9IDQsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9JTlQzMiA9IDUsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhFRDY0ID0gNiwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZJWEVEMzIgPSA3LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfQk9PTCA9IDgsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TVFJJTkcgPSA5LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfR1JPVVAgPSAxMCwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX01FU1NBR0UgPSAxMSwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0JZVEVTID0gMTIsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9VSU5UMzIgPSAxMywKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0VOVU0gPSAxNCwKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NGSVhFRDMyID0gMTUsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TRklYRUQ2NCA9IDE2LAorICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDMyID0gMTcsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TSU5UNjQgPSAxOAorfTsKK0xJQlBST1RPQlVGX0VYUE9SVCBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpOworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1R5cGVfTUlOID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0RPVUJMRTsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX01BWCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TSU5UNjQ7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX0FSUkFZU0laRSA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVHlwZV9NQVggKyAxOworCitMSUJQUk9UT0JVRl9FWFBPUlQgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9kZXNjcmlwdG9yKCk7CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9OYW1lKEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdmFsdWUpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9kZXNjcmlwdG9yKCksIHZhbHVlKTsKK30KK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfUGFyc2UoCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSogdmFsdWUpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGU+KAorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Cit9CitlbnVtIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIHsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfT1BUSU9OQUwgPSAxLAorICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVFVSVJFRCA9IDIsCisgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX1JFUEVBVEVEID0gMworfTsKK0xJQlBST1RPQlVGX0VYUE9SVCBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0lzVmFsaWQoaW50IHZhbHVlKTsKK2NvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xhYmVsX01JTiA9IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX09QVElPTkFMOworY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTGFiZWxfTUFYID0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfUkVQRUFURUQ7Citjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTGFiZWxfQVJSQVlTSVpFID0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTGFiZWxfTUFYICsgMTsKKworTElCUFJPVE9CVUZfRVhQT1JUIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2Rlc2NyaXB0b3IoKTsKK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9OYW1lKEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIHZhbHVlKSB7CisgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKAorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2Rlc2NyaXB0b3IoKSwgdmFsdWUpOworfQoraW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfUGFyc2UoCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwqIHZhbHVlKSB7CisgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTxGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbD4oCisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Cit9CitlbnVtIEZpbGVPcHRpb25zX09wdGltaXplTW9kZSB7CisgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9TUEVFRCA9IDEsCisgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9DT0RFX1NJWkUgPSAyLAorICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfTElURV9SVU5USU1FID0gMworfTsKK0xJQlBST1RPQlVGX0VYUE9SVCBib29sIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9Jc1ZhbGlkKGludCB2YWx1ZSk7Citjb25zdCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX09wdGltaXplTW9kZV9NSU4gPSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfU1BFRUQ7Citjb25zdCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX09wdGltaXplTW9kZV9NQVggPSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfTElURV9SVU5USU1FOworY29uc3QgaW50IEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9PcHRpbWl6ZU1vZGVfQVJSQVlTSVpFID0gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX09wdGltaXplTW9kZV9NQVggKyAxOworCitMSUJQUk9UT0JVRl9FWFBPUlQgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKTsKK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfTmFtZShGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgdmFsdWUpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCisgICAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKSwgdmFsdWUpOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX1BhcnNlKAorICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsIEZpbGVPcHRpb25zX09wdGltaXplTW9kZSogdmFsdWUpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPEZpbGVPcHRpb25zX09wdGltaXplTW9kZT4oCisgICAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOworfQorZW51bSBGaWVsZE9wdGlvbnNfQ1R5cGUgeworICBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HID0gMCwKKyAgRmllbGRPcHRpb25zX0NUeXBlX0NPUkQgPSAxLAorICBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HX1BJRUNFID0gMgorfTsKK0xJQlBST1RPQlVGX0VYUE9SVCBib29sIEZpZWxkT3B0aW9uc19DVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSk7Citjb25zdCBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zX0NUeXBlX0NUeXBlX01JTiA9IEZpZWxkT3B0aW9uc19DVHlwZV9TVFJJTkc7Citjb25zdCBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zX0NUeXBlX0NUeXBlX01BWCA9IEZpZWxkT3B0aW9uc19DVHlwZV9TVFJJTkdfUElFQ0U7Citjb25zdCBpbnQgRmllbGRPcHRpb25zX0NUeXBlX0NUeXBlX0FSUkFZU0laRSA9IEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9NQVggKyAxOworCitMSUJQUk9UT0JVRl9FWFBPUlQgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3IoKTsKK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZE9wdGlvbnNfQ1R5cGVfTmFtZShGaWVsZE9wdGlvbnNfQ1R5cGUgdmFsdWUpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCisgICAgRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3IoKSwgdmFsdWUpOworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zX0NUeXBlX1BhcnNlKAorICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsIEZpZWxkT3B0aW9uc19DVHlwZSogdmFsdWUpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPEZpZWxkT3B0aW9uc19DVHlwZT4oCisgICAgRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOworfQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmlsZURlc2NyaXB0b3JTZXQgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIEZpbGVEZXNjcmlwdG9yU2V0KCk7CisgIHZpcnR1YWwgfkZpbGVEZXNjcmlwdG9yU2V0KCk7CisgIAorICBGaWxlRGVzY3JpcHRvclNldChjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZnJvbSk7CisgIAorICBpbmxpbmUgRmlsZURlc2NyaXB0b3JTZXQmIG9wZXJhdG9yPShjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgRmlsZURlc2NyaXB0b3JTZXQmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgCisgIHZvaWQgU3dhcChGaWxlRGVzY3JpcHRvclNldCogb3RoZXIpOworICAKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIEZpbGVEZXNjcmlwdG9yU2V0KiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JTZXQmIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKyAgCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOworICBpbmxpbmUgaW50IGZpbGVfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9maWxlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0ZpbGVGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogbXV0YWJsZV9maWxlKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIGFkZF9maWxlKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+JgorICAgICAgZmlsZSgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPioKKyAgICAgIG11dGFibGVfZmlsZSgpOworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKKyBwcml2YXRlOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4gZmlsZV87CisgIAorICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxICsgMzEpIC8gMzJdOworICAKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBGaWxlRGVzY3JpcHRvclNldCogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmlsZURlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgRmlsZURlc2NyaXB0b3JQcm90bygpOworICB2aXJ0dWFsIH5GaWxlRGVzY3JpcHRvclByb3RvKCk7CisgIAorICBGaWxlRGVzY3JpcHRvclByb3RvKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICAKKyAgaW5saW5lIEZpbGVEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBkZWZhdWx0X2luc3RhbmNlKCk7CisgIAorICB2b2lkIFN3YXAoRmlsZURlc2NyaXB0b3JQcm90byogb3RoZXIpOworICAKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKyAgCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpbmxpbmUgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9uYW1lKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga05hbWVGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsKKyAgaW5saW5lIGJvb2wgaGFzX3BhY2thZ2UoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfcGFja2FnZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtQYWNrYWdlRmllbGROdW1iZXIgPSAyOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgcGFja2FnZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfcGFja2FnZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfcGFja2FnZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9wYWNrYWdlKCk7CisgIAorICAvLyByZXBlYXRlZCBzdHJpbmcgZGVwZW5kZW5jeSA9IDM7CisgIGlubGluZSBpbnQgZGVwZW5kZW5jeV9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2RlcGVuZGVuY3koKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRGVwZW5kZW5jeUZpZWxkTnVtYmVyID0gMzsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGRlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZGVwZW5kZW5jeShpbnQgaW5kZXgpOworICBpbmxpbmUgdm9pZCBzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIGFkZF9kZXBlbmRlbmN5KCk7CisgIGlubGluZSB2b2lkIGFkZF9kZXBlbmRlbmN5KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgYWRkX2RlcGVuZGVuY3koY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBhZGRfZGVwZW5kZW5jeShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYgZGVwZW5kZW5jeSgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiogbXV0YWJsZV9kZXBlbmRlbmN5KCk7CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OworICBpbmxpbmUgaW50IG1lc3NhZ2VfdHlwZV9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX21lc3NhZ2VfdHlwZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlVHlwZUZpZWxkTnVtYmVyID0gNDsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvJiBtZXNzYWdlX3R5cGUoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX21lc3NhZ2VfdHlwZShpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8qIGFkZF9tZXNzYWdlX3R5cGUoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG1lc3NhZ2VfdHlwZSgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9tZXNzYWdlX3R5cGUoKTsKKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworICBpbmxpbmUgaW50IGVudW1fdHlwZV9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2VudW1fdHlwZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtFbnVtVHlwZUZpZWxkTnVtYmVyID0gNTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byYgZW51bV90eXBlKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfZW51bV90eXBlKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIGFkZF9lbnVtX3R5cGUoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4mCisgICAgICBlbnVtX3R5cGUoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4qCisgICAgICBtdXRhYmxlX2VudW1fdHlwZSgpOworICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OworICBpbmxpbmUgaW50IHNlcnZpY2Vfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9zZXJ2aWNlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1NlcnZpY2VGaWVsZE51bWJlciA9IDY7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHNlcnZpY2UoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byogbXV0YWJsZV9zZXJ2aWNlKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIGFkZF9zZXJ2aWNlKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byA+JgorICAgICAgc2VydmljZSgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPioKKyAgICAgIG11dGFibGVfc2VydmljZSgpOworICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OworICBpbmxpbmUgaW50IGV4dGVuc2lvbl9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2V4dGVuc2lvbigpOworICBzdGF0aWMgY29uc3QgaW50IGtFeHRlbnNpb25GaWVsZE51bWJlciA9IDc7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvJiBleHRlbnNpb24oaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfZXh0ZW5zaW9uKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBhZGRfZXh0ZW5zaW9uKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIGV4dGVuc2lvbigpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCisgICAgICBtdXRhYmxlX2V4dGVuc2lvbigpOworICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyBvcHRpb25zID0gODsKKyAgaW5saW5lIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBzdGF0aWMgY29uc3QgaW50IGtPcHRpb25zRmllbGROdW1iZXIgPSA4OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CisgIGlubGluZSBib29sIGhhc19zb3VyY2VfY29kZV9pbmZvKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3NvdXJjZV9jb2RlX2luZm8oKTsKKyAgc3RhdGljIGNvbnN0IGludCBrU291cmNlQ29kZUluZm9GaWVsZE51bWJlciA9IDk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvJiBzb3VyY2VfY29kZV9pbmZvKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBtdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHJlbGVhc2Vfc291cmNlX2NvZGVfaW5mbygpOworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX3BhY2thZ2UoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3BhY2thZ2UoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19vcHRpb25zKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfc291cmNlX2NvZGVfaW5mbygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfc291cmNlX2NvZGVfaW5mbygpOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKyAgCisgIDo6c3RkOjpzdHJpbmcqIG5hbWVfOworICA6OnN0ZDo6c3RyaW5nKiBwYWNrYWdlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiBkZXBlbmRlbmN5XzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+IG1lc3NhZ2VfdHlwZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4gZW51bV90eXBlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPiBzZXJ2aWNlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4gZXh0ZW5zaW9uXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyogb3B0aW9uc187CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHNvdXJjZV9jb2RlX2luZm9fOworICAKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soOSArIDMxKSAvIDMyXTsKKyAgCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIAorICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgRmlsZURlc2NyaXB0b3JQcm90byogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoKTsKKyAgdmlydHVhbCB+RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKCk7CisgIAorICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBmcm9tKTsKKyAgCisgIGlubGluZSBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIG9wZXJhdG9yPShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZGVmYXVsdF9pbnN0YW5jZSgpOworICAKKyAgdm9pZCBTd2FwKERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogb3RoZXIpOworICAKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKyAgCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworICBpbmxpbmUgYm9vbCBoYXNfc3RhcnQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfc3RhcnQoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrU3RhcnRGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHN0YXJ0KCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9zdGFydCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKKyAgCisgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7CisgIGlubGluZSBib29sIGhhc19lbmQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfZW5kKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0VuZEZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgZW5kKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9lbmQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX3N0YXJ0KCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19zdGFydCgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2VuZCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZW5kKCk7CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBzdGFydF87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgZW5kXzsKKyAgCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDIgKyAzMSkgLyAzMl07CisgIAorICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICAKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBEZXNjcmlwdG9yUHJvdG8oKTsKKyAgdmlydHVhbCB+RGVzY3JpcHRvclByb3RvKCk7CisgIAorICBEZXNjcmlwdG9yUHJvdG8oY29uc3QgRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgCisgIGlubGluZSBEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IERlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpOworICAKKyAgdm9pZCBTd2FwKERlc2NyaXB0b3JQcm90byogb3RoZXIpOworICAKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIERlc2NyaXB0b3JQcm90byogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKyAgCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICB0eXBlZGVmIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSBFeHRlbnNpb25SYW5nZTsKKyAgCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlubGluZSBib29sIGhhc19uYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX25hbWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CisgIGlubGluZSBpbnQgZmllbGRfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9maWVsZCgpOworICBzdGF0aWMgY29uc3QgaW50IGtGaWVsZEZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2ZpZWxkKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBhZGRfZmllbGQoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgorICAgICAgZmllbGQoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9maWVsZCgpOworICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OworICBpbmxpbmUgaW50IGV4dGVuc2lvbl9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2V4dGVuc2lvbigpOworICBzdGF0aWMgY29uc3QgaW50IGtFeHRlbnNpb25GaWVsZE51bWJlciA9IDY7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvJiBleHRlbnNpb24oaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfZXh0ZW5zaW9uKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBhZGRfZXh0ZW5zaW9uKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIGV4dGVuc2lvbigpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCisgICAgICBtdXRhYmxlX2V4dGVuc2lvbigpOworICAKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbmVzdGVkX3R5cGUgPSAzOworICBpbmxpbmUgaW50IG5lc3RlZF90eXBlX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbmVzdGVkX3R5cGUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTmVzdGVkVHlwZUZpZWxkTnVtYmVyID0gMzsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvJiBuZXN0ZWRfdHlwZShpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfbmVzdGVkX3R5cGUoaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBhZGRfbmVzdGVkX3R5cGUoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG5lc3RlZF90eXBlKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4qCisgICAgICBtdXRhYmxlX25lc3RlZF90eXBlKCk7CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNDsKKyAgaW5saW5lIGludCBlbnVtX3R5cGVfc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9lbnVtX3R5cGUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRW51bVR5cGVGaWVsZE51bWJlciA9IDQ7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8mIGVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2VudW1fdHlwZShpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBhZGRfZW51bV90eXBlKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+JgorICAgICAgZW51bV90eXBlKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9lbnVtX3R5cGUoKTsKKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CisgIGlubGluZSBpbnQgZXh0ZW5zaW9uX3JhbmdlX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfZXh0ZW5zaW9uX3JhbmdlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXIgPSA1OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGV4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIG11dGFibGVfZXh0ZW5zaW9uX3JhbmdlKGludCBpbmRleCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogYWRkX2V4dGVuc2lvbl9yYW5nZSgpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA+JgorICAgICAgZXh0ZW5zaW9uX3JhbmdlKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlID4qCisgICAgICBtdXRhYmxlX2V4dGVuc2lvbl9yYW5nZSgpOworICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyBvcHRpb25zID0gNzsKKyAgaW5saW5lIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBzdGF0aWMgY29uc3QgaW50IGtPcHRpb25zRmllbGROdW1iZXIgPSA3OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisgIAorICA6OnN0ZDo6c3RyaW5nKiBuYW1lXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4gZmllbGRfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiBleHRlbnNpb25fOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4gbmVzdGVkX3R5cGVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+IGVudW1fdHlwZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPiBleHRlbnNpb25fcmFuZ2VfOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiBvcHRpb25zXzsKKyAgCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDcgKyAzMSkgLyAzMl07CisgIAorICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICAKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIERlc2NyaXB0b3JQcm90byogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmllbGREZXNjcmlwdG9yUHJvdG8gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKCk7CisgIHZpcnR1YWwgfkZpZWxkRGVzY3JpcHRvclByb3RvKCk7CisgIAorICBGaWVsZERlc2NyaXB0b3JQcm90byhjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIAorICBpbmxpbmUgRmllbGREZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgCisgIHZvaWQgU3dhcChGaWVsZERlc2NyaXB0b3JQcm90byogb3RoZXIpOworICAKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKyAgCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgVHlwZTsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9ET1VCTEUgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRE9VQkxFOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0ZMT0FUID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZMT0FUOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0lOVDY0ID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0lOVDY0OworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1VJTlQ2NCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9VSU5UNjQ7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfSU5UMzIgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfSU5UMzI7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfRklYRUQ2NCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhFRDY0OworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0ZJWEVEMzIgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRklYRUQzMjsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9CT09MID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0JPT0w7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU1RSSU5HID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NUUklORzsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9HUk9VUCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9HUk9VUDsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9NRVNTQUdFID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX01FU1NBR0U7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfQllURVMgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfQllURVM7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfVUlOVDMyID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1VJTlQzMjsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9FTlVNID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0VOVU07CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0ZJWEVEMzIgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVEMzI7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0ZJWEVENjQgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVENjQ7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0lOVDMyID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NJTlQzMjsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9TSU5UNjQgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDY0OworICBzdGF0aWMgaW5saW5lIGJvb2wgVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICAgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX0lzVmFsaWQodmFsdWUpOworICB9CisgIHN0YXRpYyBjb25zdCBUeXBlIFR5cGVfTUlOID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1R5cGVfTUlOOworICBzdGF0aWMgY29uc3QgVHlwZSBUeXBlX01BWCA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX01BWDsKKyAgc3RhdGljIGNvbnN0IGludCBUeXBlX0FSUkFZU0laRSA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX0FSUkFZU0laRTsKKyAgc3RhdGljIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKgorICBUeXBlX2Rlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcigpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgVHlwZV9OYW1lKFR5cGUgdmFsdWUpIHsKKyAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9OYW1lKHZhbHVlKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgVHlwZV9QYXJzZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgVHlwZSogdmFsdWUpIHsKKyAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9QYXJzZShuYW1lLCB2YWx1ZSk7CisgIH0KKyAgCisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgTGFiZWw7CisgIHN0YXRpYyBjb25zdCBMYWJlbCBMQUJFTF9PUFRJT05BTCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX09QVElPTkFMOworICBzdGF0aWMgY29uc3QgTGFiZWwgTEFCRUxfUkVRVUlSRUQgPSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVFVSVJFRDsKKyAgc3RhdGljIGNvbnN0IExhYmVsIExBQkVMX1JFUEVBVEVEID0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfUkVQRUFURUQ7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBMYWJlbF9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICAgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9Jc1ZhbGlkKHZhbHVlKTsKKyAgfQorICBzdGF0aWMgY29uc3QgTGFiZWwgTGFiZWxfTUlOID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MYWJlbF9NSU47CisgIHN0YXRpYyBjb25zdCBMYWJlbCBMYWJlbF9NQVggPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xhYmVsX01BWDsKKyAgc3RhdGljIGNvbnN0IGludCBMYWJlbF9BUlJBWVNJWkUgPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xhYmVsX0FSUkFZU0laRTsKKyAgc3RhdGljIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKgorICBMYWJlbF9kZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9kZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBMYWJlbF9OYW1lKExhYmVsIHZhbHVlKSB7CisgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX05hbWUodmFsdWUpOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBMYWJlbF9QYXJzZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgTGFiZWwqIHZhbHVlKSB7CisgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX1BhcnNlKG5hbWUsIHZhbHVlKTsKKyAgfQorICAKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaW5saW5lIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIAorICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOworICBpbmxpbmUgYm9vbCBoYXNfbnVtYmVyKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX251bWJlcigpOworICBzdGF0aWMgY29uc3QgaW50IGtOdW1iZXJGaWVsZE51bWJlciA9IDM7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG51bWJlcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbnVtYmVyKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbCBsYWJlbCA9IDQ7CisgIGlubGluZSBib29sIGhhc19sYWJlbCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9sYWJlbCgpOworICBzdGF0aWMgY29uc3QgaW50IGtMYWJlbEZpZWxkTnVtYmVyID0gNDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgbGFiZWwoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2xhYmVsKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgdmFsdWUpOworICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHR5cGUgPSA1OworICBpbmxpbmUgYm9vbCBoYXNfdHlwZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl90eXBlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1R5cGVGaWVsZE51bWJlciA9IDU7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdHlwZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfdHlwZSg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdmFsdWUpOworICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHR5cGVfbmFtZSA9IDY7CisgIGlubGluZSBib29sIGhhc190eXBlX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfdHlwZV9uYW1lKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1R5cGVOYW1lRmllbGROdW1iZXIgPSA2OworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgdHlwZV9uYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF90eXBlX25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfdHlwZV9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X3R5cGVfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV90eXBlX25hbWUoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfdHlwZV9uYW1lKCk7CisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOworICBpbmxpbmUgYm9vbCBoYXNfZXh0ZW5kZWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfZXh0ZW5kZWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRXh0ZW5kZWVGaWVsZE51bWJlciA9IDI7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBleHRlbmRlZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfZXh0ZW5kZWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZXh0ZW5kZWUoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfZXh0ZW5kZWUoKTsKKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKKyAgaW5saW5lIGJvb2wgaGFzX2RlZmF1bHRfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfZGVmYXVsdF92YWx1ZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0VmFsdWVGaWVsZE51bWJlciA9IDc7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBkZWZhdWx0X3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZGVmYXVsdF92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9kZWZhdWx0X3ZhbHVlKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2RlZmF1bHRfdmFsdWUoKTsKKyAgCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworICBpbmxpbmUgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga09wdGlvbnNGaWVsZE51bWJlciA9IDg7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX25hbWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX25hbWUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19udW1iZXIoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX251bWJlcigpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2xhYmVsKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19sYWJlbCgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX3R5cGUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3R5cGUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc190eXBlX25hbWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3R5cGVfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2V4dGVuZGVlKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19leHRlbmRlZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19vcHRpb25zKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworICAKKyAgOjpzdGQ6OnN0cmluZyogbmFtZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgbnVtYmVyXzsKKyAgaW50IGxhYmVsXzsKKyAgOjpzdGQ6OnN0cmluZyogdHlwZV9uYW1lXzsKKyAgOjpzdGQ6OnN0cmluZyogZXh0ZW5kZWVfOworICA6OnN0ZDo6c3RyaW5nKiBkZWZhdWx0X3ZhbHVlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIG9wdGlvbnNfOworICBpbnQgdHlwZV87CisgIAorICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWyg4ICsgMzEpIC8gMzJdOworICAKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBGaWVsZERlc2NyaXB0b3JQcm90byogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRW51bURlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgRW51bURlc2NyaXB0b3JQcm90bygpOworICB2aXJ0dWFsIH5FbnVtRGVzY3JpcHRvclByb3RvKCk7CisgIAorICBFbnVtRGVzY3JpcHRvclByb3RvKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICAKKyAgaW5saW5lIEVudW1EZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBkZWZhdWx0X2luc3RhbmNlKCk7CisgIAorICB2b2lkIFN3YXAoRW51bURlc2NyaXB0b3JQcm90byogb3RoZXIpOworICAKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIEVudW1EZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKyAgCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpbmxpbmUgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9uYW1lKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga05hbWVGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKKyAgaW5saW5lIGludCB2YWx1ZV9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3ZhbHVlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1ZhbHVlRmllbGROdW1iZXIgPSAyOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIHZhbHVlKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogbXV0YWJsZV92YWx1ZShpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIGFkZF92YWx1ZSgpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA+JgorICAgICAgdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPioKKyAgICAgIG11dGFibGVfdmFsdWUoKTsKKyAgCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgIGlubGluZSBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX29wdGlvbnMoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrT3B0aW9uc0ZpZWxkTnVtYmVyID0gMzsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCisgcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfb3B0aW9ucygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb3B0aW9ucygpOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKyAgCisgIDo6c3RkOjpzdHJpbmcqIG5hbWVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4gdmFsdWVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBvcHRpb25zXzsKKyAgCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDMgKyAzMSkgLyAzMl07CisgIAorICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICAKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIEVudW1EZXNjcmlwdG9yUHJvdG8qIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKCk7CisgIHZpcnR1YWwgfkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bygpOworICAKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIAorICBpbmxpbmUgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgCisgIHZvaWQgU3dhcChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKyAgCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKyAgCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisgIAorICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgaW5saW5lIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIAorICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOworICBpbmxpbmUgYm9vbCBoYXNfbnVtYmVyKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX251bWJlcigpOworICBzdGF0aWMgY29uc3QgaW50IGtOdW1iZXJGaWVsZE51bWJlciA9IDI7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG51bWJlcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbnVtYmVyKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOworICBpbmxpbmUgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga09wdGlvbnNGaWVsZE51bWJlciA9IDM7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCisgcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfbnVtYmVyKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19udW1iZXIoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19vcHRpb25zKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworICAKKyAgOjpzdGQ6OnN0cmluZyogbmFtZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogb3B0aW9uc187CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgbnVtYmVyXzsKKyAgCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDMgKyAzMSkgLyAzMl07CisgIAorICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICAKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU2VydmljZURlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgU2VydmljZURlc2NyaXB0b3JQcm90bygpOworICB2aXJ0dWFsIH5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKCk7CisgIAorICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICAKKyAgaW5saW5lIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBkZWZhdWx0X2luc3RhbmNlKCk7CisgIAorICB2b2lkIFN3YXAoU2VydmljZURlc2NyaXB0b3JQcm90byogb3RoZXIpOworICAKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKyAgCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpbmxpbmUgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9uYW1lKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga05hbWVGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7CisgIGlubGluZSBpbnQgbWV0aG9kX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbWV0aG9kKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga01ldGhvZEZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvJiBtZXRob2QoaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX21ldGhvZChpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIGFkZF9tZXRob2QoKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG1ldGhvZCgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byA+KgorICAgICAgbXV0YWJsZV9tZXRob2QoKTsKKyAgCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMgb3B0aW9ucyA9IDM7CisgIGlubGluZSBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX29wdGlvbnMoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrT3B0aW9uc0ZpZWxkTnVtYmVyID0gMzsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCisgcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfb3B0aW9ucygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb3B0aW9ucygpOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKyAgCisgIDo6c3RkOjpzdHJpbmcqIG5hbWVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4gbWV0aG9kXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogb3B0aW9uc187CisgIAorICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOworICAKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNZXRob2REZXNjcmlwdG9yUHJvdG8gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIE1ldGhvZERlc2NyaXB0b3JQcm90bygpOworICB2aXJ0dWFsIH5NZXRob2REZXNjcmlwdG9yUHJvdG8oKTsKKyAgCisgIE1ldGhvZERlc2NyaXB0b3JQcm90byhjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICAKKyAgaW5saW5lIE1ldGhvZERlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBkZWZhdWx0X2luc3RhbmNlKCk7CisgIAorICB2b2lkIFN3YXAoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBvdGhlcik7CisgIAorICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgTWV0aG9kRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisgIAorICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworICAKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlubGluZSBib29sIGhhc19uYW1lKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX25hbWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOworICBpbmxpbmUgYm9vbCBoYXNfaW5wdXRfdHlwZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9pbnB1dF90eXBlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0lucHV0VHlwZUZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGlucHV0X3R5cGUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2lucHV0X3R5cGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfaW5wdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9pbnB1dF90eXBlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2lucHV0X3R5cGUoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfaW5wdXRfdHlwZSgpOworICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKKyAgaW5saW5lIGJvb2wgaGFzX291dHB1dF90eXBlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX291dHB1dF90eXBlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga091dHB1dFR5cGVGaWVsZE51bWJlciA9IDM7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBvdXRwdXRfdHlwZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfb3V0cHV0X3R5cGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfb3V0cHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfb3V0cHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfb3V0cHV0X3R5cGUoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2Vfb3V0cHV0X3R5cGUoKTsKKyAgCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKKyAgaW5saW5lIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBzdGF0aWMgY29uc3QgaW50IGtPcHRpb25zRmllbGROdW1iZXIgPSA0OworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2lucHV0X3R5cGUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2lucHV0X3R5cGUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19vdXRwdXRfdHlwZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb3V0cHV0X3R5cGUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19vcHRpb25zKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworICAKKyAgOjpzdGQ6OnN0cmluZyogbmFtZV87CisgIDo6c3RkOjpzdHJpbmcqIGlucHV0X3R5cGVfOworICA6OnN0ZDo6c3RyaW5nKiBvdXRwdXRfdHlwZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogb3B0aW9uc187CisgIAorICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWyg0ICsgMzEpIC8gMzJdOworICAKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBNZXRob2REZXNjcmlwdG9yUHJvdG8qIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEZpbGVPcHRpb25zIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBGaWxlT3B0aW9ucygpOworICB2aXJ0dWFsIH5GaWxlT3B0aW9ucygpOworICAKKyAgRmlsZU9wdGlvbnMoY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pOworICAKKyAgaW5saW5lIEZpbGVPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IEZpbGVPcHRpb25zJiBkZWZhdWx0X2luc3RhbmNlKCk7CisgIAorICB2b2lkIFN3YXAoRmlsZU9wdGlvbnMqIG90aGVyKTsKKyAgCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBGaWxlT3B0aW9ucyogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWxlT3B0aW9ucyYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEZpbGVPcHRpb25zJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKyAgCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisgIAorICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgdHlwZWRlZiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgT3B0aW1pemVNb2RlOworICBzdGF0aWMgY29uc3QgT3B0aW1pemVNb2RlIFNQRUVEID0gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX1NQRUVEOworICBzdGF0aWMgY29uc3QgT3B0aW1pemVNb2RlIENPREVfU0laRSA9IEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9DT0RFX1NJWkU7CisgIHN0YXRpYyBjb25zdCBPcHRpbWl6ZU1vZGUgTElURV9SVU5USU1FID0gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0xJVEVfUlVOVElNRTsKKyAgc3RhdGljIGlubGluZSBib29sIE9wdGltaXplTW9kZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICAgIHJldHVybiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfSXNWYWxpZCh2YWx1ZSk7CisgIH0KKyAgc3RhdGljIGNvbnN0IE9wdGltaXplTW9kZSBPcHRpbWl6ZU1vZGVfTUlOID0KKyAgICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfT3B0aW1pemVNb2RlX01JTjsKKyAgc3RhdGljIGNvbnN0IE9wdGltaXplTW9kZSBPcHRpbWl6ZU1vZGVfTUFYID0KKyAgICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfT3B0aW1pemVNb2RlX01BWDsKKyAgc3RhdGljIGNvbnN0IGludCBPcHRpbWl6ZU1vZGVfQVJSQVlTSVpFID0KKyAgICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfT3B0aW1pemVNb2RlX0FSUkFZU0laRTsKKyAgc3RhdGljIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKgorICBPcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIE9wdGltaXplTW9kZV9OYW1lKE9wdGltaXplTW9kZSB2YWx1ZSkgeworICAgIHJldHVybiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfTmFtZSh2YWx1ZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBib29sIE9wdGltaXplTW9kZV9QYXJzZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgT3B0aW1pemVNb2RlKiB2YWx1ZSkgeworICAgIHJldHVybiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfUGFyc2UobmFtZSwgdmFsdWUpOworICB9CisgIAorICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7CisgIGlubGluZSBib29sIGhhc19qYXZhX3BhY2thZ2UoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfamF2YV9wYWNrYWdlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0phdmFQYWNrYWdlRmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgamF2YV9wYWNrYWdlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9qYXZhX3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfamF2YV9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2phdmFfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9qYXZhX3BhY2thZ2UoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfamF2YV9wYWNrYWdlKCk7CisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OworICBpbmxpbmUgYm9vbCBoYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrSmF2YU91dGVyQ2xhc3NuYW1lRmllbGROdW1iZXIgPSA4OworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgamF2YV9vdXRlcl9jbGFzc25hbWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgIAorICAvLyBvcHRpb25hbCBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaW5saW5lIGJvb2wgaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfamF2YV9tdWx0aXBsZV9maWxlcygpOworICBzdGF0aWMgY29uc3QgaW50IGtKYXZhTXVsdGlwbGVGaWxlc0ZpZWxkTnVtYmVyID0gMTA7CisgIGlubGluZSBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2phdmFfbXVsdGlwbGVfZmlsZXMoYm9vbCB2YWx1ZSk7CisgIAorICAvLyBvcHRpb25hbCBib29sIHJldGFpbl91bmtub3duX2ZpZWxkcyA9IDExIFtkZWZhdWx0ID0gZmFsc2VdOworICBpbmxpbmUgYm9vbCBoYXNfcmV0YWluX3Vua25vd25fZmllbGRzKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3JldGFpbl91bmtub3duX2ZpZWxkcygpOworICBzdGF0aWMgY29uc3QgaW50IGtSZXRhaW5Vbmtub3duRmllbGRzRmllbGROdW1iZXIgPSAxMTsKKyAgaW5saW5lIGJvb2wgcmV0YWluX3Vua25vd25fZmllbGRzKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9yZXRhaW5fdW5rbm93bl9maWVsZHMoYm9vbCB2YWx1ZSk7CisgIAorICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlubGluZSBib29sIGhhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpOworICBzdGF0aWMgY29uc3QgaW50IGtKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoRmllbGROdW1iZXIgPSAyMDsKKyAgaW5saW5lIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKGJvb2wgdmFsdWUpOworICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUgb3B0aW1pemVfZm9yID0gOSBbZGVmYXVsdCA9IFNQRUVEXTsKKyAgaW5saW5lIGJvb2wgaGFzX29wdGltaXplX2ZvcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9vcHRpbWl6ZV9mb3IoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrT3B0aW1pemVGb3JGaWVsZE51bWJlciA9IDk7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X29wdGltaXplX2Zvcig6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSB2YWx1ZSk7CisgIAorICAvLyBvcHRpb25hbCBib29sIGNjX2dlbmVyaWNfc2VydmljZXMgPSAxNiBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaW5saW5lIGJvb2wgaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfY2NfZ2VuZXJpY19zZXJ2aWNlcygpOworICBzdGF0aWMgY29uc3QgaW50IGtDY0dlbmVyaWNTZXJ2aWNlc0ZpZWxkTnVtYmVyID0gMTY7CisgIGlubGluZSBib29sIGNjX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2NjX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSk7CisgIAorICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOworICBpbmxpbmUgYm9vbCBoYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOworICBzdGF0aWMgY29uc3QgaW50IGtKYXZhR2VuZXJpY1NlcnZpY2VzRmllbGROdW1iZXIgPSAxNzsKKyAgaW5saW5lIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9qYXZhX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSk7CisgIAorICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaW5saW5lIGJvb2wgaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfcHlfZ2VuZXJpY19zZXJ2aWNlcygpOworICBzdGF0aWMgY29uc3QgaW50IGtQeUdlbmVyaWNTZXJ2aWNlc0ZpZWxkTnVtYmVyID0gMTg7CisgIGlubGluZSBib29sIHB5X2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X3B5X2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSk7CisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGlubGluZSBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIAorICBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhGaWxlT3B0aW9ucykKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX2phdmFfcGFja2FnZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfamF2YV9wYWNrYWdlKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfcmV0YWluX3Vua25vd25fZmllbGRzKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfb3B0aW1pemVfZm9yKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vcHRpbWl6ZV9mb3IoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19jY19nZW5lcmljX3NlcnZpY2VzKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19jY19nZW5lcmljX3NlcnZpY2VzKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKyAgCisgIDo6c3RkOjpzdHJpbmcqIGphdmFfcGFja2FnZV87CisgIDo6c3RkOjpzdHJpbmcqIGphdmFfb3V0ZXJfY2xhc3NuYW1lXzsKKyAgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzXzsKKyAgYm9vbCByZXRhaW5fdW5rbm93bl9maWVsZHNfOworICBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXzsKKyAgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzXzsKKyAgaW50IG9wdGltaXplX2Zvcl87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlc187CisgIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlc187CisgIAorICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxMCArIDMxKSAvIDMyXTsKKyAgCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIAorICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgRmlsZU9wdGlvbnMqIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE1lc3NhZ2VPcHRpb25zIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBNZXNzYWdlT3B0aW9ucygpOworICB2aXJ0dWFsIH5NZXNzYWdlT3B0aW9ucygpOworICAKKyAgTWVzc2FnZU9wdGlvbnMoY29uc3QgTWVzc2FnZU9wdGlvbnMmIGZyb20pOworICAKKyAgaW5saW5lIE1lc3NhZ2VPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZU9wdGlvbnMmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBkZWZhdWx0X2luc3RhbmNlKCk7CisgIAorICB2b2lkIFN3YXAoTWVzc2FnZU9wdGlvbnMqIG90aGVyKTsKKyAgCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBNZXNzYWdlT3B0aW9ucyogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKyAgCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisgIAorICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworICBpbmxpbmUgYm9vbCBoYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVNldFdpcmVGb3JtYXRGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9tZXNzYWdlX3NldF93aXJlX2Zvcm1hdChib29sIHZhbHVlKTsKKyAgCisgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlubGluZSBib29sIGhhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvckZpZWxkTnVtYmVyID0gMjsKKyAgaW5saW5lIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcihib29sIHZhbHVlKTsKKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgaW5saW5lIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCisgICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKKyAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgCisgIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKE1lc3NhZ2VPcHRpb25zKQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKKyAgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF87CisgIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl87CisgIAorICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOworICAKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBNZXNzYWdlT3B0aW9ucyogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmllbGRPcHRpb25zIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBGaWVsZE9wdGlvbnMoKTsKKyAgdmlydHVhbCB+RmllbGRPcHRpb25zKCk7CisgIAorICBGaWVsZE9wdGlvbnMoY29uc3QgRmllbGRPcHRpb25zJiBmcm9tKTsKKyAgCisgIGlubGluZSBGaWVsZE9wdGlvbnMmIG9wZXJhdG9yPShjb25zdCBGaWVsZE9wdGlvbnMmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IEZpZWxkT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpOworICAKKyAgdm9pZCBTd2FwKEZpZWxkT3B0aW9ucyogb3RoZXIpOworICAKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIEZpZWxkT3B0aW9ucyogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWVsZE9wdGlvbnMmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBGaWVsZE9wdGlvbnMmIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworICAKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHB1YmxpYzoKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKyAgCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICB0eXBlZGVmIEZpZWxkT3B0aW9uc19DVHlwZSBDVHlwZTsKKyAgc3RhdGljIGNvbnN0IENUeXBlIFNUUklORyA9IEZpZWxkT3B0aW9uc19DVHlwZV9TVFJJTkc7CisgIHN0YXRpYyBjb25zdCBDVHlwZSBDT1JEID0gRmllbGRPcHRpb25zX0NUeXBlX0NPUkQ7CisgIHN0YXRpYyBjb25zdCBDVHlwZSBTVFJJTkdfUElFQ0UgPSBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HX1BJRUNFOworICBzdGF0aWMgaW5saW5lIGJvb2wgQ1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gRmllbGRPcHRpb25zX0NUeXBlX0lzVmFsaWQodmFsdWUpOworICB9CisgIHN0YXRpYyBjb25zdCBDVHlwZSBDVHlwZV9NSU4gPQorICAgIEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9NSU47CisgIHN0YXRpYyBjb25zdCBDVHlwZSBDVHlwZV9NQVggPQorICAgIEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9NQVg7CisgIHN0YXRpYyBjb25zdCBpbnQgQ1R5cGVfQVJSQVlTSVpFID0KKyAgICBGaWVsZE9wdGlvbnNfQ1R5cGVfQ1R5cGVfQVJSQVlTSVpFOworICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqCisgIENUeXBlX2Rlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIEZpZWxkT3B0aW9uc19DVHlwZV9kZXNjcmlwdG9yKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDVHlwZV9OYW1lKENUeXBlIHZhbHVlKSB7CisgICAgcmV0dXJuIEZpZWxkT3B0aW9uc19DVHlwZV9OYW1lKHZhbHVlKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgQ1R5cGVfUGFyc2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgIENUeXBlKiB2YWx1ZSkgeworICAgIHJldHVybiBGaWVsZE9wdGlvbnNfQ1R5cGVfUGFyc2UobmFtZSwgdmFsdWUpOworICB9CisgIAorICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKKyAgaW5saW5lIGJvb2wgaGFzX2N0eXBlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2N0eXBlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0N0eXBlRmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGUgY3R5cGUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2N0eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlIHZhbHVlKTsKKyAgCisgIC8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKKyAgaW5saW5lIGJvb2wgaGFzX3BhY2tlZCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9wYWNrZWQoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrUGFja2VkRmllbGROdW1iZXIgPSAyOworICBpbmxpbmUgYm9vbCBwYWNrZWQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X3BhY2tlZChib29sIHZhbHVlKTsKKyAgCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlubGluZSBib29sIGhhc19kZXByZWNhdGVkKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2RlcHJlY2F0ZWQoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRGVwcmVjYXRlZEZpZWxkTnVtYmVyID0gMzsKKyAgaW5saW5lIGJvb2wgZGVwcmVjYXRlZCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBleHBlcmltZW50YWxfbWFwX2tleSA9IDk7CisgIGlubGluZSBib29sIGhhc19leHBlcmltZW50YWxfbWFwX2tleSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9leHBlcmltZW50YWxfbWFwX2tleSgpOworICBzdGF0aWMgY29uc3QgaW50IGtFeHBlcmltZW50YWxNYXBLZXlGaWVsZE51bWJlciA9IDk7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBleHBlcmltZW50YWxfbWFwX2tleSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfZXhwZXJpbWVudGFsX21hcF9rZXkoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZXhwZXJpbWVudGFsX21hcF9rZXkoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfZXhwZXJpbWVudGFsX21hcF9rZXkoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgaW5saW5lIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCisgICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKKyAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgCisgIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKEZpZWxkT3B0aW9ucykKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCisgcHJpdmF0ZToKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19jdHlwZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfY3R5cGUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19wYWNrZWQoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3BhY2tlZCgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworICAKKyAgaW50IGN0eXBlXzsKKyAgYm9vbCBwYWNrZWRfOworICBib29sIGRlcHJlY2F0ZWRfOworICA6OnN0ZDo6c3RyaW5nKiBleHBlcmltZW50YWxfbWFwX2tleV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICAKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soNSArIDMxKSAvIDMyXTsKKyAgCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIAorICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgRmllbGRPcHRpb25zKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBFbnVtT3B0aW9ucyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgRW51bU9wdGlvbnMoKTsKKyAgdmlydHVhbCB+RW51bU9wdGlvbnMoKTsKKyAgCisgIEVudW1PcHRpb25zKGNvbnN0IEVudW1PcHRpb25zJiBmcm9tKTsKKyAgCisgIGlubGluZSBFbnVtT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IEVudW1PcHRpb25zJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBFbnVtT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpOworICAKKyAgdm9pZCBTd2FwKEVudW1PcHRpb25zKiBvdGhlcik7CisgIAorICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgRW51bU9wdGlvbnMqIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgRW51bU9wdGlvbnMmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBFbnVtT3B0aW9ucyYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisgIAorICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworICAKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGlubGluZSBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIAorICBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhFbnVtT3B0aW9ucykKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucykKKyBwcml2YXRlOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKKyAgCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEgKyAzMSkgLyAzMl07CisgIAorICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICAKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIEVudW1PcHRpb25zKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBFbnVtVmFsdWVPcHRpb25zIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBFbnVtVmFsdWVPcHRpb25zKCk7CisgIHZpcnR1YWwgfkVudW1WYWx1ZU9wdGlvbnMoKTsKKyAgCisgIEVudW1WYWx1ZU9wdGlvbnMoY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZnJvbSk7CisgIAorICBpbmxpbmUgRW51bVZhbHVlT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgCisgIHZvaWQgU3dhcChFbnVtVmFsdWVPcHRpb25zKiBvdGhlcik7CisgIAorICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgRW51bVZhbHVlT3B0aW9ucyogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisgIAorICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworICAKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGlubGluZSBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIAorICBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhFbnVtVmFsdWVPcHRpb25zKQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCisgcHJpdmF0ZToKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87CisgIAorICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxICsgMzEpIC8gMzJdOworICAKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBFbnVtVmFsdWVPcHRpb25zKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTZXJ2aWNlT3B0aW9ucyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgU2VydmljZU9wdGlvbnMoKTsKKyAgdmlydHVhbCB+U2VydmljZU9wdGlvbnMoKTsKKyAgCisgIFNlcnZpY2VPcHRpb25zKGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKTsKKyAgCisgIGlubGluZSBTZXJ2aWNlT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBTZXJ2aWNlT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpOworICAKKyAgdm9pZCBTd2FwKFNlcnZpY2VPcHRpb25zKiBvdGhlcik7CisgIAorICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgU2VydmljZU9wdGlvbnMqIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBTZXJ2aWNlT3B0aW9ucyYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisgIAorICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworICAKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGlubGluZSBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIAorICBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhTZXJ2aWNlT3B0aW9ucykKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKKyBwcml2YXRlOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKKyAgCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEgKyAzMSkgLyAzMl07CisgIAorICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICAKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIFNlcnZpY2VPcHRpb25zKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNZXRob2RPcHRpb25zIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBNZXRob2RPcHRpb25zKCk7CisgIHZpcnR1YWwgfk1ldGhvZE9wdGlvbnMoKTsKKyAgCisgIE1ldGhvZE9wdGlvbnMoY29uc3QgTWV0aG9kT3B0aW9ucyYgZnJvbSk7CisgIAorICBpbmxpbmUgTWV0aG9kT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IE1ldGhvZE9wdGlvbnMmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IE1ldGhvZE9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgCisgIHZvaWQgU3dhcChNZXRob2RPcHRpb25zKiBvdGhlcik7CisgIAorICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgTWV0aG9kT3B0aW9ucyogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgTWV0aG9kT3B0aW9ucyYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisgIAorICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworICAKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisgIGlubGluZSBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIAorICBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhNZXRob2RPcHRpb25zKQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCisgcHJpdmF0ZToKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87CisgIAorICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxICsgMzEpIC8gMzJdOworICAKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBNZXRob2RPcHRpb25zKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0IDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KCk7CisgIHZpcnR1YWwgflVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQoKTsKKyAgCisgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQoY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSk7CisgIAorICBpbmxpbmUgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgb3BlcmF0b3I9KGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgCisgIHZvaWQgU3dhcChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBvdGhlcik7CisgIAorICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisgIAorICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworICAKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKKyAgaW5saW5lIGJvb2wgaGFzX25hbWVfcGFydCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9uYW1lX3BhcnQoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTmFtZVBhcnRGaWVsZE51bWJlciA9IDE7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lX3BhcnQoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X25hbWVfcGFydChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9uYW1lX3BhcnQoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfbmFtZV9wYXJ0KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWVfcGFydCgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lX3BhcnQoKTsKKyAgCisgIC8vIHJlcXVpcmVkIGJvb2wgaXNfZXh0ZW5zaW9uID0gMjsKKyAgaW5saW5lIGJvb2wgaGFzX2lzX2V4dGVuc2lvbigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9pc19leHRlbnNpb24oKTsKKyAgc3RhdGljIGNvbnN0IGludCBrSXNFeHRlbnNpb25GaWVsZE51bWJlciA9IDI7CisgIGlubGluZSBib29sIGlzX2V4dGVuc2lvbigpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfaXNfZXh0ZW5zaW9uKGJvb2wgdmFsdWUpOworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZV9wYXJ0KCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lX3BhcnQoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19pc19leHRlbnNpb24oKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2lzX2V4dGVuc2lvbigpOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKyAgCisgIDo6c3RkOjpzdHJpbmcqIG5hbWVfcGFydF87CisgIGJvb2wgaXNfZXh0ZW5zaW9uXzsKKyAgCisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDIgKyAzMSkgLyAzMl07CisgIAorICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICAKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFVuaW50ZXJwcmV0ZWRPcHRpb24gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIFVuaW50ZXJwcmV0ZWRPcHRpb24oKTsKKyAgdmlydHVhbCB+VW5pbnRlcnByZXRlZE9wdGlvbigpOworICAKKyAgVW5pbnRlcnByZXRlZE9wdGlvbihjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKTsKKyAgCisgIGlubGluZSBVbmludGVycHJldGVkT3B0aW9uJiBvcGVyYXRvcj0oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgfQorICAKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZGVmYXVsdF9pbnN0YW5jZSgpOworICAKKyAgdm9pZCBTd2FwKFVuaW50ZXJwcmV0ZWRPcHRpb24qIG90aGVyKTsKKyAgCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBVbmludGVycHJldGVkT3B0aW9uKiBOZXcoKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKyAgCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisgIAorICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgdHlwZWRlZiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0IE5hbWVQYXJ0OworICAKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCBuYW1lID0gMjsKKyAgaW5saW5lIGludCBuYW1lX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAyOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBuYW1lKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIG11dGFibGVfbmFtZShpbnQgaW5kZXgpOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBhZGRfbmFtZSgpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQgPiYKKyAgICAgIG5hbWUoKSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4qCisgICAgICBtdXRhYmxlX25hbWUoKTsKKyAgCisgIC8vIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKKyAgaW5saW5lIGJvb2wgaGFzX2lkZW50aWZpZXJfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaWRlbnRpZmllcl92YWx1ZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtJZGVudGlmaWVyVmFsdWVGaWVsZE51bWJlciA9IDM7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBpZGVudGlmaWVyX3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9pZGVudGlmaWVyX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9pZGVudGlmaWVyX3ZhbHVlKCk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgCisgIC8vIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OworICBpbmxpbmUgYm9vbCBoYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3Bvc2l0aXZlX2ludF92YWx1ZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtQb3NpdGl2ZUludFZhbHVlRmllbGROdW1iZXIgPSA0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQgcG9zaXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9wb3NpdGl2ZV9pbnRfdmFsdWUoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQgdmFsdWUpOworICAKKyAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKKyAgaW5saW5lIGJvb2wgaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTmVnYXRpdmVJbnRWYWx1ZUZpZWxkTnVtYmVyID0gNTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9uZWdhdGl2ZV9pbnRfdmFsdWUoOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCB2YWx1ZSk7CisgIAorICAvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKKyAgaW5saW5lIGJvb2wgaGFzX2RvdWJsZV92YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9kb3VibGVfdmFsdWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRG91YmxlVmFsdWVGaWVsZE51bWJlciA9IDY7CisgIGlubGluZSBkb3VibGUgZG91YmxlX3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9kb3VibGVfdmFsdWUoZG91YmxlIHZhbHVlKTsKKyAgCisgIC8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7CisgIGlubGluZSBib29sIGhhc19zdHJpbmdfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfc3RyaW5nX3ZhbHVlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1N0cmluZ1ZhbHVlRmllbGROdW1iZXIgPSA3OworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyaW5nX3ZhbHVlKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9zdHJpbmdfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgaW5saW5lIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9zdHJpbmdfdmFsdWUoKTsKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2Vfc3RyaW5nX3ZhbHVlKCk7CisgIAorICAvLyBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKKyAgaW5saW5lIGJvb2wgaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBjbGVhcl9hZ2dyZWdhdGVfdmFsdWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrQWdncmVnYXRlVmFsdWVGaWVsZE51bWJlciA9IDg7CisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBhZ2dyZWdhdGVfdmFsdWUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgc2V0X2FnZ3JlZ2F0ZV92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9hZ2dyZWdhdGVfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpOworICBpbmxpbmUgdm9pZCBzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9hZ2dyZWdhdGVfdmFsdWUoKTsKKyAgCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbikKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfZG91YmxlX3ZhbHVlKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19kb3VibGVfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19zdHJpbmdfdmFsdWUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3N0cmluZ192YWx1ZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQgPiBuYW1lXzsKKyAgOjpzdGQ6OnN0cmluZyogaWRlbnRpZmllcl92YWx1ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDY0IHBvc2l0aXZlX2ludF92YWx1ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlXzsKKyAgZG91YmxlIGRvdWJsZV92YWx1ZV87CisgIDo6c3RkOjpzdHJpbmcqIHN0cmluZ192YWx1ZV87CisgIDo6c3RkOjpzdHJpbmcqIGFnZ3JlZ2F0ZV92YWx1ZV87CisgIAorICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWyg3ICsgMzEpIC8gMzJdOworICAKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBVbmludGVycHJldGVkT3B0aW9uKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgU291cmNlQ29kZUluZm9fTG9jYXRpb24oKTsKKyAgdmlydHVhbCB+U291cmNlQ29kZUluZm9fTG9jYXRpb24oKTsKKyAgCisgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKTsKKyAgCisgIGlubGluZSBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIAorICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICB9CisgIAorICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZGVmYXVsdF9pbnN0YW5jZSgpOworICAKKyAgdm9pZCBTd2FwKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBvdGhlcik7CisgIAorICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIE5ldygpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisgIAorICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgcHVibGljOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworICAKKyAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07CisgIGlubGluZSBpbnQgcGF0aF9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX3BhdGgoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrUGF0aEZpZWxkTnVtYmVyID0gMTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgcGF0aChpbnQgaW5kZXgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRfcGF0aChpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworICBpbmxpbmUgdm9pZCBhZGRfcGF0aCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgorICAgICAgcGF0aCgpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCisgICAgICBtdXRhYmxlX3BhdGgoKTsKKyAgCisgIC8vIHJlcGVhdGVkIGludDMyIHNwYW4gPSAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgaW5saW5lIGludCBzcGFuX3NpemUoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgY2xlYXJfc3BhbigpOworICBzdGF0aWMgY29uc3QgaW50IGtTcGFuRmllbGROdW1iZXIgPSAyOworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBzcGFuKGludCBpbmRleCkgY29uc3Q7CisgIGlubGluZSB2b2lkIHNldF9zcGFuKGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIGFkZF9zcGFuKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCisgICAgICBzcGFuKCkgY29uc3Q7CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKKyAgICAgIG11dGFibGVfc3BhbigpOworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKKyBwcml2YXRlOgorICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKKyAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+IHBhdGhfOworICBtdXRhYmxlIGludCBfcGF0aF9jYWNoZWRfYnl0ZV9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4gc3Bhbl87CisgIG11dGFibGUgaW50IF9zcGFuX2NhY2hlZF9ieXRlX3NpemVfOworICAKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMiArIDMxKSAvIDMyXTsKKyAgCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIAorICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFNvdXJjZUNvZGVJbmZvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBTb3VyY2VDb2RlSW5mbygpOworICB2aXJ0dWFsIH5Tb3VyY2VDb2RlSW5mbygpOworICAKKyAgU291cmNlQ29kZUluZm8oY29uc3QgU291cmNlQ29kZUluZm8mIGZyb20pOworICAKKyAgaW5saW5lIFNvdXJjZUNvZGVJbmZvJiBvcGVyYXRvcj0oY29uc3QgU291cmNlQ29kZUluZm8mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgIH0KKyAgCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBkZWZhdWx0X2luc3RhbmNlKCk7CisgIAorICB2b2lkIFN3YXAoU291cmNlQ29kZUluZm8qIG90aGVyKTsKKyAgCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICBTb3VyY2VDb2RlSW5mbyogTmV3KCkgY29uc3Q7CisgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKyAgCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICBwdWJsaWM6CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7CisgIAorICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAKKyAgdHlwZWRlZiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiBMb2NhdGlvbjsKKyAgCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIGxvY2F0aW9uID0gMTsKKyAgaW5saW5lIGludCBsb2NhdGlvbl9zaXplKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGNsZWFyX2xvY2F0aW9uKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0xvY2F0aW9uRmllbGROdW1iZXIgPSAxOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgbG9jYXRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24qIG11dGFibGVfbG9jYXRpb24oaW50IGluZGV4KTsKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24qIGFkZF9sb2NhdGlvbigpOworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uID4mCisgICAgICBsb2NhdGlvbigpIGNvbnN0OworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uID4qCisgICAgICBtdXRhYmxlX2xvY2F0aW9uKCk7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQorIHByaXZhdGU6CisgIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOworICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uID4gbG9jYXRpb25fOworICAKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKKyAgCisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIAorICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgU291cmNlQ29kZUluZm8qIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEZpbGVEZXNjcmlwdG9yU2V0CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JTZXQ6OmZpbGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGVfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpjbGVhcl9maWxlKCkgeworICBmaWxlXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JTZXQ6OmZpbGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBmaWxlXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JTZXQ6Om11dGFibGVfZmlsZShpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGZpbGVfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JTZXQ6OmFkZF9maWxlKCkgeworICByZXR1cm4gZmlsZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiYKK0ZpbGVEZXNjcmlwdG9yU2V0OjpmaWxlKCkgY29uc3QgeworICByZXR1cm4gZmlsZV87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPioKK0ZpbGVEZXNjcmlwdG9yU2V0OjptdXRhYmxlX2ZpbGUoKSB7CisgIHJldHVybiAmZmlsZV87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRmlsZURlc2NyaXB0b3JQcm90bworCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19uYW1lKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZURlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpuYW1lXzsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gbmFtZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgeworICBjbGVhcl9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lXzsKKyAgICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CitpbmxpbmUgYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpoYXNfcGFja2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3BhY2thZ2UoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfcGFja2FnZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9wYWNrYWdlKCkgeworICBpZiAocGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHBhY2thZ2VfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19wYWNrYWdlKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZURlc2NyaXB0b3JQcm90bzo6cGFja2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpwYWNrYWdlXzsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9wYWNrYWdlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfcGFja2FnZSgpOworICBpZiAocGFja2FnZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHBhY2thZ2VfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcGFja2FnZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX3BhY2thZ2UoKTsKKyAgaWYgKHBhY2thZ2VfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBwYWNrYWdlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHBhY2thZ2VfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfcGFja2FnZSgpOworICBpZiAocGFja2FnZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHBhY2thZ2VfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcGFja2FnZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcGFja2FnZSgpIHsKKyAgc2V0X2hhc19wYWNrYWdlKCk7CisgIGlmIChwYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcGFja2FnZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gcGFja2FnZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9wYWNrYWdlKCkgeworICBjbGVhcl9oYXNfcGFja2FnZSgpOworICBpZiAocGFja2FnZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBwYWNrYWdlXzsKKyAgICBwYWNrYWdlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQorCisvLyByZXBlYXRlZCBzdHJpbmcgZGVwZW5kZW5jeSA9IDM7CitpbmxpbmUgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGRlcGVuZGVuY3lfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2RlcGVuZGVuY3koKSB7CisgIGRlcGVuZGVuY3lfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGRlcGVuZGVuY3lfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9kZXBlbmRlbmN5KGludCBpbmRleCkgeworICByZXR1cm4gZGVwZW5kZW5jeV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGRlcGVuZGVuY3lfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICBkZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIGRlcGVuZGVuY3lfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oCisgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZGVwZW5kZW5jeSgpIHsKKyAgcmV0dXJuIGRlcGVuZGVuY3lfLkFkZCgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2RlcGVuZGVuY3koY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgZGVwZW5kZW5jeV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZGVwZW5kZW5jeShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBkZXBlbmRlbmN5Xy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9kZXBlbmRlbmN5KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBkZXBlbmRlbmN5Xy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OmRlcGVuZGVuY3koKSBjb25zdCB7CisgIHJldHVybiBkZXBlbmRlbmN5XzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KgorRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9kZXBlbmRlbmN5KCkgeworICByZXR1cm4gJmRlcGVuZGVuY3lfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OworaW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjptZXNzYWdlX3R5cGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1lc3NhZ2VfdHlwZV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbWVzc2FnZV90eXBlKCkgeworICBtZXNzYWdlX3R5cGVfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8mIEZpbGVEZXNjcmlwdG9yUHJvdG86Om1lc3NhZ2VfdHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG1lc3NhZ2VfdHlwZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9tZXNzYWdlX3R5cGUoaW50IGluZGV4KSB7CisgIHJldHVybiBtZXNzYWdlX3R5cGVfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfbWVzc2FnZV90eXBlKCkgeworICByZXR1cm4gbWVzc2FnZV90eXBlXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4mCitGaWxlRGVzY3JpcHRvclByb3RvOjptZXNzYWdlX3R5cGUoKSBjb25zdCB7CisgIHJldHVybiBtZXNzYWdlX3R5cGVfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbWVzc2FnZV90eXBlKCkgeworICByZXR1cm4gJm1lc3NhZ2VfdHlwZV87Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OworaW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGVudW1fdHlwZV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZW51bV90eXBlKCkgeworICBlbnVtX3R5cGVfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBlbnVtX3R5cGVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2VudW1fdHlwZShpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGVudW1fdHlwZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZW51bV90eXBlKCkgeworICByZXR1cm4gZW51bV90eXBlXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+JgorRmlsZURlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlKCkgY29uc3QgeworICByZXR1cm4gZW51bV90eXBlXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+KgorRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9lbnVtX3R5cGUoKSB7CisgIHJldHVybiAmZW51bV90eXBlXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OworaW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXJ2aWNlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBzZXJ2aWNlXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zZXJ2aWNlKCkgeworICBzZXJ2aWNlXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JQcm90bzo6c2VydmljZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIHNlcnZpY2VfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3NlcnZpY2UoaW50IGluZGV4KSB7CisgIHJldHVybiBzZXJ2aWNlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9zZXJ2aWNlKCkgeworICByZXR1cm4gc2VydmljZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OnNlcnZpY2UoKSBjb25zdCB7CisgIHJldHVybiBzZXJ2aWNlXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byA+KgorRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9zZXJ2aWNlKCkgeworICByZXR1cm4gJnNlcnZpY2VfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7CitpbmxpbmUgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gZXh0ZW5zaW9uXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9leHRlbnNpb24oKSB7CisgIGV4dGVuc2lvbl8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBleHRlbnNpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb24oaW50IGluZGV4KSB7CisgIHJldHVybiBleHRlbnNpb25fLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9leHRlbnNpb24oKSB7CisgIHJldHVybiBleHRlbnNpb25fLkFkZCgpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgorRmlsZURlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uKCkgY29uc3QgeworICByZXR1cm4gZXh0ZW5zaW9uXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uKCkgeworICByZXR1cm4gJmV4dGVuc2lvbl87Cit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgb3B0aW9ucyA9IDg7CitpbmxpbmUgYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA4MHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA4MHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfb3B0aW9ucygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA4MHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgeworICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnM6OkNsZWFyKCk7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyYgRmlsZURlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKKyAgc2V0X2hhc19vcHRpb25zKCk7CisgIGlmIChvcHRpb25zXyA9PSBOVUxMKSBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zOworICByZXR1cm4gb3B0aW9uc187Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgeworICBjbGVhcl9oYXNfb3B0aW9ucygpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKiB0ZW1wID0gb3B0aW9uc187CisgIG9wdGlvbnNfID0gTlVMTDsKKyAgcmV0dXJuIHRlbXA7Cit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CitpbmxpbmUgYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpoYXNfc291cmNlX2NvZGVfaW5mbygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDEwMHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3NvdXJjZV9jb2RlX2luZm8oKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDEwMHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfc291cmNlX2NvZGVfaW5mbygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDEwMHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zb3VyY2VfY29kZV9pbmZvKCkgeworICBpZiAoc291cmNlX2NvZGVfaW5mb18gIT0gTlVMTCkgc291cmNlX2NvZGVfaW5mb18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm86OkNsZWFyKCk7CisgIGNsZWFyX2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyYgRmlsZURlc2NyaXB0b3JQcm90bzo6c291cmNlX2NvZGVfaW5mbygpIGNvbnN0IHsKKyAgcmV0dXJuIHNvdXJjZV9jb2RlX2luZm9fICE9IE5VTEwgPyAqc291cmNlX2NvZGVfaW5mb18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPnNvdXJjZV9jb2RlX2luZm9fOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc291cmNlX2NvZGVfaW5mbygpIHsKKyAgc2V0X2hhc19zb3VyY2VfY29kZV9pbmZvKCk7CisgIGlmIChzb3VyY2VfY29kZV9pbmZvXyA9PSBOVUxMKSBzb3VyY2VfY29kZV9pbmZvXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvOworICByZXR1cm4gc291cmNlX2NvZGVfaW5mb187Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9zb3VyY2VfY29kZV9pbmZvKCkgeworICBjbGVhcl9oYXNfc291cmNlX2NvZGVfaW5mbygpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiB0ZW1wID0gc291cmNlX2NvZGVfaW5mb187CisgIHNvdXJjZV9jb2RlX2luZm9fID0gTlVMTDsKKyAgcmV0dXJuIHRlbXA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlCisKKy8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKK2lubGluZSBib29sIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6aGFzX3N0YXJ0KCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6c2V0X2hhc19zdGFydCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Y2xlYXJfaGFzX3N0YXJ0KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Y2xlYXJfc3RhcnQoKSB7CisgIHN0YXJ0XyA9IDA7CisgIGNsZWFyX2hhc19zdGFydCgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpzdGFydCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXJ0XzsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6c2V0X3N0YXJ0KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgc2V0X2hhc19zdGFydCgpOworICBzdGFydF8gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKK2lubGluZSBib29sIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6aGFzX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnNldF9oYXNfZW5kKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpjbGVhcl9oYXNfZW5kKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Y2xlYXJfZW5kKCkgeworICBlbmRfID0gMDsKKyAgY2xlYXJfaGFzX2VuZCgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjplbmQoKSBjb25zdCB7CisgIHJldHVybiBlbmRfOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpzZXRfZW5kKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgc2V0X2hhc19lbmQoKTsKKyAgZW5kXyA9IHZhbHVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIERlc2NyaXB0b3JQcm90bworCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgYm9vbCBEZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBEZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIHJldHVybiAqbmFtZV87Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gbmFtZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIGNsZWFyX2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IG5hbWVfOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOworaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OmZpZWxkX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBmaWVsZF8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9maWVsZCgpIHsKKyAgZmllbGRfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpmaWVsZChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGZpZWxkXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9maWVsZChpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGZpZWxkXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9maWVsZCgpIHsKKyAgcmV0dXJuIGZpZWxkXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6ZmllbGQoKSBjb25zdCB7CisgIHJldHVybiBmaWVsZF87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCitEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZmllbGQoKSB7CisgIHJldHVybiAmZmllbGRfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBleHRlbnNpb25fLnNpemUoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5zaW9uKCkgeworICBleHRlbnNpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBleHRlbnNpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbihpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGV4dGVuc2lvbl8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjphZGRfZXh0ZW5zaW9uKCkgeworICByZXR1cm4gZXh0ZW5zaW9uXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uKCkgY29uc3QgeworICByZXR1cm4gZXh0ZW5zaW9uXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb24oKSB7CisgIHJldHVybiAmZXh0ZW5zaW9uXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbmVzdGVkX3R5cGUgPSAzOworaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86Om5lc3RlZF90eXBlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBuZXN0ZWRfdHlwZV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uZXN0ZWRfdHlwZSgpIHsKKyAgbmVzdGVkX3R5cGVfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6bmVzdGVkX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBuZXN0ZWRfdHlwZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25lc3RlZF90eXBlKGludCBpbmRleCkgeworICByZXR1cm4gbmVzdGVkX3R5cGVfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9uZXN0ZWRfdHlwZSgpIHsKKyAgcmV0dXJuIG5lc3RlZF90eXBlXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4mCitEZXNjcmlwdG9yUHJvdG86Om5lc3RlZF90eXBlKCkgY29uc3QgeworICByZXR1cm4gbmVzdGVkX3R5cGVfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uZXN0ZWRfdHlwZSgpIHsKKyAgcmV0dXJuICZuZXN0ZWRfdHlwZV87Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OworaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gZW51bV90eXBlXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2VudW1fdHlwZSgpIHsKKyAgZW51bV90eXBlXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBlbnVtX3R5cGVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZW51bV90eXBlKGludCBpbmRleCkgeworICByZXR1cm4gZW51bV90eXBlXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX2VudW1fdHlwZSgpIHsKKyAgcmV0dXJuIGVudW1fdHlwZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlKCkgY29uc3QgeworICByZXR1cm4gZW51bV90eXBlXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+KgorRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2VudW1fdHlwZSgpIHsKKyAgcmV0dXJuICZlbnVtX3R5cGVfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSBleHRlbnNpb25fcmFuZ2UgPSA1OworaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9yYW5nZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gZXh0ZW5zaW9uX3JhbmdlXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2V4dGVuc2lvbl9yYW5nZSgpIHsKKyAgZXh0ZW5zaW9uX3JhbmdlXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6YWRkX2V4dGVuc2lvbl9yYW5nZSgpIHsKKyAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA+JgorRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb25fcmFuZ2UoKSBjb25zdCB7CisgIHJldHVybiBleHRlbnNpb25fcmFuZ2VfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb25fcmFuZ2UoKSB7CisgIHJldHVybiAmZXh0ZW5zaW9uX3JhbmdlXzsKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyBvcHRpb25zID0gNzsKK2lubGluZSBib29sIERlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwNDB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA0MHU7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDQwdTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zOjpDbGVhcigpOworICBjbGVhcl9oYXNfb3B0aW9ucygpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMmIERlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgeworICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaWYgKG9wdGlvbnNfID09IE5VTEwpIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnM7CisgIHJldHVybiBvcHRpb25zXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiBEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOworICBvcHRpb25zXyA9IE5VTEw7CisgIHJldHVybiB0ZW1wOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEZpZWxkRGVzY3JpcHRvclByb3RvCisKKy8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19uYW1lKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIHJldHVybiAqbmFtZV87Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBuYW1lXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgeworICBjbGVhcl9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lXzsKKyAgICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQorCisvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19udW1iZXIoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbnVtYmVyKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19udW1iZXIoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX251bWJlcigpIHsKKyAgbnVtYmVyXyA9IDA7CisgIGNsZWFyX2hhc19udW1iZXIoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEZpZWxkRGVzY3JpcHRvclByb3RvOjpudW1iZXIoKSBjb25zdCB7CisgIHJldHVybiBudW1iZXJfOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9udW1iZXIoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzZXRfaGFzX251bWJlcigpOworICBudW1iZXJfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19sYWJlbCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19sYWJlbCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbGFiZWwoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2xhYmVsKCkgeworICBsYWJlbF8gPSAxOworICBjbGVhcl9oYXNfbGFiZWwoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpsYWJlbCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsID4obGFiZWxfKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfbGFiZWwoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfSXNWYWxpZCh2YWx1ZSkpOworICBzZXRfaGFzX2xhYmVsKCk7CisgIGxhYmVsXyA9IHZhbHVlOworfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX3R5cGUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfdHlwZSgpIHsKKyAgdHlwZV8gPSAxOworICBjbGVhcl9oYXNfdHlwZSgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6dHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgPih0eXBlXyk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X3R5cGUoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0soOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX0lzVmFsaWQodmFsdWUpKTsKKyAgc2V0X2hhc190eXBlKCk7CisgIHR5cGVfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc190eXBlX25hbWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMTB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfdHlwZV9uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc190eXBlX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX3R5cGVfbmFtZSgpIHsKKyAgaWYgKHR5cGVfbmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHR5cGVfbmFtZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX3R5cGVfbmFtZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjp0eXBlX25hbWUoKSBjb25zdCB7CisgIHJldHVybiAqdHlwZV9uYW1lXzsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfdHlwZV9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfdHlwZV9uYW1lKCk7CisgIGlmICh0eXBlX25hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICB0eXBlX25hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgdHlwZV9uYW1lXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfdHlwZV9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfdHlwZV9uYW1lKCk7CisgIGlmICh0eXBlX25hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICB0eXBlX25hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgdHlwZV9uYW1lXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfdHlwZV9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX3R5cGVfbmFtZSgpOworICBpZiAodHlwZV9uYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgdHlwZV9uYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHR5cGVfbmFtZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3R5cGVfbmFtZSgpIHsKKyAgc2V0X2hhc190eXBlX25hbWUoKTsKKyAgaWYgKHR5cGVfbmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHR5cGVfbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gdHlwZV9uYW1lXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV90eXBlX25hbWUoKSB7CisgIGNsZWFyX2hhc190eXBlX25hbWUoKTsKKyAgaWYgKHR5cGVfbmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSB0eXBlX25hbWVfOworICAgIHR5cGVfbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfZXh0ZW5kZWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfZXh0ZW5kZWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAyMHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX2V4dGVuZGVlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9leHRlbmRlZSgpIHsKKyAgaWYgKGV4dGVuZGVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZXh0ZW5kZWVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19leHRlbmRlZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpleHRlbmRlZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpleHRlbmRlZV87Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2V4dGVuZGVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfZXh0ZW5kZWUoKTsKKyAgaWYgKGV4dGVuZGVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZXh0ZW5kZWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgZXh0ZW5kZWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9leHRlbmRlZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2V4dGVuZGVlKCk7CisgIGlmIChleHRlbmRlZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGV4dGVuZGVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGV4dGVuZGVlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfZXh0ZW5kZWUoKTsKKyAgaWYgKGV4dGVuZGVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZXh0ZW5kZWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgZXh0ZW5kZWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbmRlZSgpIHsKKyAgc2V0X2hhc19leHRlbmRlZSgpOworICBpZiAoZXh0ZW5kZWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBleHRlbmRlZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gZXh0ZW5kZWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX2V4dGVuZGVlKCkgeworICBjbGVhcl9oYXNfZXh0ZW5kZWUoKTsKKyAgaWYgKGV4dGVuZGVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IGV4dGVuZGVlXzsKKyAgICBleHRlbmRlZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19kZWZhdWx0X3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDQwdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA0MHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwNDB1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2RlZmF1bHRfdmFsdWUoKSB7CisgIGlmIChkZWZhdWx0X3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZGVmYXVsdF92YWx1ZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpkZWZhdWx0X3ZhbHVlXzsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZGVmYXVsdF92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKKyAgaWYgKGRlZmF1bHRfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBkZWZhdWx0X3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGRlZmF1bHRfdmFsdWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBpZiAoZGVmYXVsdF92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlZmF1bHRfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgZGVmYXVsdF92YWx1ZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBpZiAoZGVmYXVsdF92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlZmF1bHRfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgZGVmYXVsdF92YWx1ZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2RlZmF1bHRfdmFsdWUoKSB7CisgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBpZiAoZGVmYXVsdF92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGRlZmF1bHRfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIGRlZmF1bHRfdmFsdWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX2RlZmF1bHRfdmFsdWUoKSB7CisgIGNsZWFyX2hhc19kZWZhdWx0X3ZhbHVlKCk7CisgIGlmIChkZWZhdWx0X3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IGRlZmF1bHRfdmFsdWVfOworICAgIGRlZmF1bHRfdmFsdWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OworaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDgwdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA4MHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwODB1OworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX29wdGlvbnMoKSB7CisgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnM6OkNsZWFyKCk7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIEZpZWxkRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7CisgIHNldF9oYXNfb3B0aW9ucygpOworICBpZiAob3B0aW9uc18gPT0gTlVMTCkgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnM7CisgIHJldHVybiBvcHRpb25zXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyogRmllbGREZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBOVUxMOworICByZXR1cm4gdGVtcDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFbnVtRGVzY3JpcHRvclByb3RvCisKKy8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKK2lubGluZSBib29sIEVudW1EZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBFbnVtRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICByZXR1cm4gKm5hbWVfOworfQoraW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRW51bURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBuYW1lXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBFbnVtRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIGNsZWFyX2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IG5hbWVfOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKK2lubGluZSBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6dmFsdWVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHZhbHVlXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpjbGVhcl92YWx1ZSgpIHsKKyAgdmFsdWVfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIEVudW1EZXNjcmlwdG9yUHJvdG86OnZhbHVlKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gdmFsdWVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfdmFsdWUoaW50IGluZGV4KSB7CisgIHJldHVybiB2YWx1ZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86OmFkZF92YWx1ZSgpIHsKKyAgcmV0dXJuIHZhbHVlXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4mCitFbnVtRGVzY3JpcHRvclByb3RvOjp2YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHZhbHVlXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4qCitFbnVtRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3ZhbHVlKCkgeworICByZXR1cm4gJnZhbHVlXzsKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKK2lubGluZSBib29sIEVudW1EZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX29wdGlvbnMoKSB7CisgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9uczo6Q2xlYXIoKTsKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zJiBFbnVtRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyogRW51bURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgeworICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaWYgKG9wdGlvbnNfID09IE5VTEwpIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnM7CisgIHJldHVybiBvcHRpb25zXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBFbnVtRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBOVUxMOworICByZXR1cm4gdGVtcDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworaW5saW5lIGJvb2wgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgeworICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19uYW1lKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICByZXR1cm4gKm5hbWVfOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIG5hbWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgeworICBjbGVhcl9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lXzsKKyAgICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQorCisvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOworaW5saW5lIGJvb2wgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpoYXNfbnVtYmVyKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19udW1iZXIoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19udW1iZXIoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9udW1iZXIoKSB7CisgIG51bWJlcl8gPSAwOworICBjbGVhcl9oYXNfbnVtYmVyKCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Om51bWJlcigpIGNvbnN0IHsKKyAgcmV0dXJuIG51bWJlcl87Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9udW1iZXIoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzZXRfaGFzX251bWJlcigpOworICBudW1iZXJfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKK2lubGluZSBib29sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnM6OkNsZWFyKCk7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zJiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgeworICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaWYgKG9wdGlvbnNfID09IE5VTEwpIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9uczsKKyAgcmV0dXJuIG9wdGlvbnNfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOworICBvcHRpb25zXyA9IE5VTEw7CisgIHJldHVybiB0ZW1wOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworaW5saW5lIGJvb2wgU2VydmljZURlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKKyAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfbmFtZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIHJldHVybiAqbmFtZV87Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIG5hbWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKKyAgY2xlYXJfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gbmFtZV87CisgICAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKK2lubGluZSBpbnQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6bWV0aG9kX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBtZXRob2RfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmNsZWFyX21ldGhvZCgpIHsKKyAgbWV0aG9kXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptZXRob2QoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBtZXRob2RfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbWV0aG9kKGludCBpbmRleCkgeworICByZXR1cm4gbWV0aG9kXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byogU2VydmljZURlc2NyaXB0b3JQcm90bzo6YWRkX21ldGhvZCgpIHsKKyAgcmV0dXJuIG1ldGhvZF8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byA+JgorU2VydmljZURlc2NyaXB0b3JQcm90bzo6bWV0aG9kKCkgY29uc3QgeworICByZXR1cm4gbWV0aG9kXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4qCitTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21ldGhvZCgpIHsKKyAgcmV0dXJuICZtZXRob2RfOworfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOworaW5saW5lIGJvb2wgU2VydmljZURlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zOjpDbGVhcigpOworICBjbGVhcl9oYXNfb3B0aW9ucygpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMmIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7CisgIHNldF9oYXNfb3B0aW9ucygpOworICBpZiAob3B0aW9uc18gPT0gTlVMTCkgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9uczsKKyAgcmV0dXJuIG9wdGlvbnNfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOworICBvcHRpb25zXyA9IE5VTEw7CisgIHJldHVybiB0ZW1wOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE1ldGhvZERlc2NyaXB0b3JQcm90bworCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIHJldHVybiAqbmFtZV87Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gbmFtZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIGNsZWFyX2hhc19uYW1lKCk7CisgIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IG5hbWVfOworICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKK2lubGluZSBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aGFzX2lucHV0X3R5cGUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX2lucHV0X3R5cGUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19pbnB1dF90eXBlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaW5wdXRfdHlwZSgpIHsKKyAgaWYgKGlucHV0X3R5cGVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBpbnB1dF90eXBlXy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfaW5wdXRfdHlwZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aW5wdXRfdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuICppbnB1dF90eXBlXzsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2lucHV0X3R5cGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19pbnB1dF90eXBlKCk7CisgIGlmIChpbnB1dF90eXBlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgaW5wdXRfdHlwZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBpbnB1dF90eXBlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2lucHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19pbnB1dF90eXBlKCk7CisgIGlmIChpbnB1dF90eXBlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgaW5wdXRfdHlwZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBpbnB1dF90eXBlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2lucHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfaW5wdXRfdHlwZSgpOworICBpZiAoaW5wdXRfdHlwZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGlucHV0X3R5cGVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgaW5wdXRfdHlwZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9pbnB1dF90eXBlKCkgeworICBzZXRfaGFzX2lucHV0X3R5cGUoKTsKKyAgaWYgKGlucHV0X3R5cGVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBpbnB1dF90eXBlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBpbnB1dF90eXBlXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfaW5wdXRfdHlwZSgpIHsKKyAgY2xlYXJfaGFzX2lucHV0X3R5cGUoKTsKKyAgaWYgKGlucHV0X3R5cGVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gaW5wdXRfdHlwZV87CisgICAgaW5wdXRfdHlwZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKK2lubGluZSBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aGFzX291dHB1dF90eXBlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vdXRwdXRfdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX291dHB1dF90eXBlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3V0cHV0X3R5cGUoKSB7CisgIGlmIChvdXRwdXRfdHlwZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG91dHB1dF90eXBlXy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfb3V0cHV0X3R5cGUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om91dHB1dF90eXBlKCkgY29uc3QgeworICByZXR1cm4gKm91dHB1dF90eXBlXzsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X291dHB1dF90eXBlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfb3V0cHV0X3R5cGUoKTsKKyAgaWYgKG91dHB1dF90eXBlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgb3V0cHV0X3R5cGVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgb3V0cHV0X3R5cGVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfb3V0cHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19vdXRwdXRfdHlwZSgpOworICBpZiAob3V0cHV0X3R5cGVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBvdXRwdXRfdHlwZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBvdXRwdXRfdHlwZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9vdXRwdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19vdXRwdXRfdHlwZSgpOworICBpZiAob3V0cHV0X3R5cGVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBvdXRwdXRfdHlwZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBvdXRwdXRfdHlwZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vdXRwdXRfdHlwZSgpIHsKKyAgc2V0X2hhc19vdXRwdXRfdHlwZSgpOworICBpZiAob3V0cHV0X3R5cGVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBvdXRwdXRfdHlwZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gb3V0cHV0X3R5cGVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vdXRwdXRfdHlwZSgpIHsKKyAgY2xlYXJfaGFzX291dHB1dF90eXBlKCk7CisgIGlmIChvdXRwdXRfdHlwZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBvdXRwdXRfdHlwZV87CisgICAgb3V0cHV0X3R5cGVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKK2lubGluZSBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnM6OkNsZWFyKCk7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zJiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgeworICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaWYgKG9wdGlvbnNfID09IE5VTEwpIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9uczsKKyAgcmV0dXJuIG9wdGlvbnNfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOworICBvcHRpb25zXyA9IE5VTEw7CisgIHJldHVybiB0ZW1wOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEZpbGVPcHRpb25zCisKKy8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX3BhY2thZ2UgPSAxOworaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX3BhY2thZ2UoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfamF2YV9wYWNrYWdlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX3BhY2thZ2UoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfcGFja2FnZSgpIHsKKyAgaWYgKGphdmFfcGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGphdmFfcGFja2FnZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX2phdmFfcGFja2FnZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpqYXZhX3BhY2thZ2UoKSBjb25zdCB7CisgIHJldHVybiAqamF2YV9wYWNrYWdlXzsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9wYWNrYWdlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7CisgIGlmIChqYXZhX3BhY2thZ2VfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBqYXZhX3BhY2thZ2VfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgamF2YV9wYWNrYWdlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7CisgIGlmIChqYXZhX3BhY2thZ2VfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBqYXZhX3BhY2thZ2VfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgamF2YV9wYWNrYWdlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2phdmFfcGFja2FnZSgpOworICBpZiAoamF2YV9wYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgamF2YV9wYWNrYWdlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGphdmFfcGFja2FnZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjptdXRhYmxlX2phdmFfcGFja2FnZSgpIHsKKyAgc2V0X2hhc19qYXZhX3BhY2thZ2UoKTsKKyAgaWYgKGphdmFfcGFja2FnZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGphdmFfcGFja2FnZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gamF2YV9wYWNrYWdlXzsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6cmVsZWFzZV9qYXZhX3BhY2thZ2UoKSB7CisgIGNsZWFyX2hhc19qYXZhX3BhY2thZ2UoKTsKKyAgaWYgKGphdmFfcGFja2FnZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBqYXZhX3BhY2thZ2VfOworICAgIGphdmFfcGFja2FnZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gODsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKKyAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgamF2YV9vdXRlcl9jbGFzc25hbWVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpqYXZhX291dGVyX2NsYXNzbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpqYXZhX291dGVyX2NsYXNzbmFtZV87Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgamF2YV9vdXRlcl9jbGFzc25hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgamF2YV9vdXRlcl9jbGFzc25hbWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgIGlmIChqYXZhX291dGVyX2NsYXNzbmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGphdmFfb3V0ZXJfY2xhc3NuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9vdXRlcl9jbGFzc25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgamF2YV9vdXRlcl9jbGFzc25hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgamF2YV9vdXRlcl9jbGFzc25hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKKyAgc2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICBpZiAoamF2YV9vdXRlcl9jbGFzc25hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBqYXZhX291dGVyX2NsYXNzbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gamF2YV9vdXRlcl9jbGFzc25hbWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpyZWxlYXNlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgeworICBjbGVhcl9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IGphdmFfb3V0ZXJfY2xhc3NuYW1lXzsKKyAgICBqYXZhX291dGVyX2NsYXNzbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9tdWx0aXBsZV9maWxlcygpIHsKKyAgamF2YV9tdWx0aXBsZV9maWxlc18gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpqYXZhX211bHRpcGxlX2ZpbGVzKCkgY29uc3QgeworICByZXR1cm4gamF2YV9tdWx0aXBsZV9maWxlc187Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfbXVsdGlwbGVfZmlsZXMoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKTsKKyAgamF2YV9tdWx0aXBsZV9maWxlc18gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYm9vbCByZXRhaW5fdW5rbm93bl9maWVsZHMgPSAxMSBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfcmV0YWluX3Vua25vd25fZmllbGRzKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfcmV0YWluX3Vua25vd25fZmllbGRzKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9yZXRhaW5fdW5rbm93bl9maWVsZHMoKSB7CisgIHJldGFpbl91bmtub3duX2ZpZWxkc18gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OnJldGFpbl91bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgcmV0dXJuIHJldGFpbl91bmtub3duX2ZpZWxkc187Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X3JldGFpbl91bmtub3duX2ZpZWxkcyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfcmV0YWluX3Vua25vd25fZmllbGRzKCk7CisgIHJldGFpbl91bmtub3duX2ZpZWxkc18gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAxMHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgeworICBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCk7Cit9CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6amF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdCB7CisgIHJldHVybiBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF87Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpOworICBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUgb3B0aW1pemVfZm9yID0gOSBbZGVmYXVsdCA9IFNQRUVEXTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfb3B0aW1pemVfZm9yKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDIwdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX29wdGltaXplX2ZvcigpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDIwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfb3B0aW1pemVfZm9yKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9vcHRpbWl6ZV9mb3IoKSB7CisgIG9wdGltaXplX2Zvcl8gPSAxOworICBjbGVhcl9oYXNfb3B0aW1pemVfZm9yKCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6Om9wdGltaXplX2ZvcigpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSA+KG9wdGltaXplX2Zvcl8pOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9vcHRpbWl6ZV9mb3IoOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgdmFsdWUpIHsKKyAgR09PR0xFX0RDSEVDSyg6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZV9Jc1ZhbGlkKHZhbHVlKSk7CisgIHNldF9oYXNfb3B0aW1pemVfZm9yKCk7CisgIG9wdGltaXplX2Zvcl8gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwNDB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDQwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA0MHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgY2NfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpjY19nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICByZXR1cm4gY2NfZ2VuZXJpY19zZXJ2aWNlc187Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2NjX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKKyAgY2NfZ2VuZXJpY19zZXJ2aWNlc18gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDgwdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDgwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDgwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX2dlbmVyaWNfc2VydmljZXMoKSB7CisgIGphdmFfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgcmV0dXJuIGphdmFfZ2VuZXJpY19zZXJ2aWNlc187Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7CisgIGphdmFfZ2VuZXJpY19zZXJ2aWNlc18gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzID0gMTggW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAxMDB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMTAwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDEwMHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgcHlfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpweV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICByZXR1cm4gcHlfZ2VuZXJpY19zZXJ2aWNlc187Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X3B5X2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKTsKKyAgcHlfZ2VuZXJpY19zZXJ2aWNlc18gPSB2YWx1ZTsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworaW5saW5lIGludCBGaWxlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgRmlsZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBGaWxlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpbGVPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK0ZpbGVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorRmlsZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE1lc3NhZ2VPcHRpb25zCisKKy8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Omhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2hhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgeworICBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCk7Cit9CitpbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6bWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdCB7CisgIHJldHVybiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF87Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpOworICBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYm9vbCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjpoYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgeworICBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IGZhbHNlOworICBjbGVhcl9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOworfQoraW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Om5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdCB7CisgIHJldHVybiBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXzsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpzZXRfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcihib29sIHZhbHVlKSB7CisgIHNldF9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOworICBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IHZhbHVlOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CitpbmxpbmUgaW50IE1lc3NhZ2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBNZXNzYWdlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1lc3NhZ2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogTWVzc2FnZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorTWVzc2FnZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCitNZXNzYWdlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRmllbGRPcHRpb25zCisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlIGN0eXBlID0gMSBbZGVmYXVsdCA9IFNUUklOR107CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Omhhc19jdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfY3R5cGUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc19jdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2N0eXBlKCkgeworICBjdHlwZV8gPSAwOworICBjbGVhcl9oYXNfY3R5cGUoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OmN0eXBlKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlID4oY3R5cGVfKTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2N0eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0soOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZCh2YWx1ZSkpOworICBzZXRfaGFzX2N0eXBlKCk7CisgIGN0eXBlXyA9IHZhbHVlOworfQorCisvLyBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Omhhc19wYWNrZWQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfaGFzX3BhY2tlZCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX3BhY2tlZCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX3BhY2tlZCgpIHsKKyAgcGFja2VkXyA9IGZhbHNlOworICBjbGVhcl9oYXNfcGFja2VkKCk7Cit9CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6OnBhY2tlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHBhY2tlZF87Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9wYWNrZWQoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX3BhY2tlZCgpOworICBwYWNrZWRfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6Omhhc19kZXByZWNhdGVkKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9oYXNfZGVwcmVjYXRlZCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2RlcHJlY2F0ZWQoKSB7CisgIGRlcHJlY2F0ZWRfID0gZmFsc2U7CisgIGNsZWFyX2hhc19kZXByZWNhdGVkKCk7Cit9CitpbmxpbmUgYm9vbCBGaWVsZE9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7CisgIHJldHVybiBkZXByZWNhdGVkXzsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGV4cGVyaW1lbnRhbF9tYXBfa2V5ID0gOTsKK2lubGluZSBib29sIEZpZWxkT3B0aW9uczo6aGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfZXhwZXJpbWVudGFsX21hcF9rZXkoKSB7CisgIGlmIChleHBlcmltZW50YWxfbWFwX2tleV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGV4cGVyaW1lbnRhbF9tYXBfa2V5Xy0+Y2xlYXIoKTsKKyAgfQorICBjbGVhcl9oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZE9wdGlvbnM6OmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkgY29uc3QgeworICByZXR1cm4gKmV4cGVyaW1lbnRhbF9tYXBfa2V5XzsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2V4cGVyaW1lbnRhbF9tYXBfa2V5KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKKyAgaWYgKGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgZXhwZXJpbWVudGFsX21hcF9rZXlfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgZXhwZXJpbWVudGFsX21hcF9rZXlfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfZXhwZXJpbWVudGFsX21hcF9rZXkoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpOworICBpZiAoZXhwZXJpbWVudGFsX21hcF9rZXlfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBleHBlcmltZW50YWxfbWFwX2tleV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBleHBlcmltZW50YWxfbWFwX2tleV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9leHBlcmltZW50YWxfbWFwX2tleShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpOworICBpZiAoZXhwZXJpbWVudGFsX21hcF9rZXlfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBleHBlcmltZW50YWxfbWFwX2tleV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBleHBlcmltZW50YWxfbWFwX2tleV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkT3B0aW9uczo6bXV0YWJsZV9leHBlcmltZW50YWxfbWFwX2tleSgpIHsKKyAgc2V0X2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpOworICBpZiAoZXhwZXJpbWVudGFsX21hcF9rZXlfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBleHBlcmltZW50YWxfbWFwX2tleV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gZXhwZXJpbWVudGFsX21hcF9rZXlfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkT3B0aW9uczo6cmVsZWFzZV9leHBlcmltZW50YWxfbWFwX2tleSgpIHsKKyAgY2xlYXJfaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCk7CisgIGlmIChleHBlcmltZW50YWxfbWFwX2tleV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBleHBlcmltZW50YWxfbWFwX2tleV87CisgICAgZXhwZXJpbWVudGFsX21hcF9rZXlfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKK2lubGluZSBpbnQgRmllbGRPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgRmllbGRPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRmllbGRPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRmllbGRPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK0ZpZWxkT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK0ZpZWxkT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRW51bU9wdGlvbnMKKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworaW5saW5lIGludCBFbnVtT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBFbnVtT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgRW51bU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEVudW1PcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK0VudW1PcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorRW51bU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEVudW1WYWx1ZU9wdGlvbnMKKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworaW5saW5lIGludCBFbnVtVmFsdWVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKK30KK2lubGluZSB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIEVudW1WYWx1ZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtVmFsdWVPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRW51bVZhbHVlT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCitFbnVtVmFsdWVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorRW51bVZhbHVlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU2VydmljZU9wdGlvbnMKKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworaW5saW5lIGludCBTZXJ2aWNlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgU2VydmljZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBTZXJ2aWNlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIFNlcnZpY2VPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK1NlcnZpY2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorU2VydmljZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE1ldGhvZE9wdGlvbnMKKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworaW5saW5lIGludCBNZXRob2RPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZE9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIE1ldGhvZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBNZXRob2RPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogTWV0aG9kT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCitNZXRob2RPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorTWV0aG9kT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydAorCisvLyByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Omhhc19uYW1lX3BhcnQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X2hhc19uYW1lX3BhcnQoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpjbGVhcl9oYXNfbmFtZV9wYXJ0KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmNsZWFyX25hbWVfcGFydCgpIHsKKyAgaWYgKG5hbWVfcGFydF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIG5hbWVfcGFydF8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX25hbWVfcGFydCgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Om5hbWVfcGFydCgpIGNvbnN0IHsKKyAgcmV0dXJuICpuYW1lX3BhcnRfOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X25hbWVfcGFydChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWVfcGFydCgpOworICBpZiAobmFtZV9wYXJ0XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgbmFtZV9wYXJ0XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIG5hbWVfcGFydF8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfbmFtZV9wYXJ0KGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZV9wYXJ0KCk7CisgIGlmIChuYW1lX3BhcnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lX3BhcnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV9wYXJ0Xy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnNldF9uYW1lX3BhcnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfbmFtZV9wYXJ0KCk7CisgIGlmIChuYW1lX3BhcnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lX3BhcnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgbmFtZV9wYXJ0Xy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6bXV0YWJsZV9uYW1lX3BhcnQoKSB7CisgIHNldF9oYXNfbmFtZV9wYXJ0KCk7CisgIGlmIChuYW1lX3BhcnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBuYW1lX3BhcnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIG5hbWVfcGFydF87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6cmVsZWFzZV9uYW1lX3BhcnQoKSB7CisgIGNsZWFyX2hhc19uYW1lX3BhcnQoKTsKKyAgaWYgKG5hbWVfcGFydF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lX3BhcnRfOworICAgIG5hbWVfcGFydF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOworaW5saW5lIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6aGFzX2lzX2V4dGVuc2lvbigpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfaGFzX2lzX2V4dGVuc2lvbigpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmNsZWFyX2hhc19pc19leHRlbnNpb24oKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Y2xlYXJfaXNfZXh0ZW5zaW9uKCkgeworICBpc19leHRlbnNpb25fID0gZmFsc2U7CisgIGNsZWFyX2hhc19pc19leHRlbnNpb24oKTsKK30KK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmlzX2V4dGVuc2lvbigpIGNvbnN0IHsKKyAgcmV0dXJuIGlzX2V4dGVuc2lvbl87Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfaXNfZXh0ZW5zaW9uKGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19pc19leHRlbnNpb24oKTsKKyAgaXNfZXh0ZW5zaW9uXyA9IHZhbHVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFVuaW50ZXJwcmV0ZWRPcHRpb24KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0IG5hbWUgPSAyOworaW5saW5lIGludCBVbmludGVycHJldGVkT3B0aW9uOjpuYW1lX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9uYW1lKCkgeworICBuYW1lXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgVW5pbnRlcnByZXRlZE9wdGlvbjo6bmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG5hbWVfLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBVbmludGVycHJldGVkT3B0aW9uOjptdXRhYmxlX25hbWUoaW50IGluZGV4KSB7CisgIHJldHVybiBuYW1lXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIFVuaW50ZXJwcmV0ZWRPcHRpb246OmFkZF9uYW1lKCkgeworICByZXR1cm4gbmFtZV8uQWRkKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQgPiYKK1VuaW50ZXJwcmV0ZWRPcHRpb246Om5hbWUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+KgorVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9uYW1lKCkgeworICByZXR1cm4gJm5hbWVfOworfQorCisvLyBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7CitpbmxpbmUgYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpoYXNfaWRlbnRpZmllcl92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfaWRlbnRpZmllcl92YWx1ZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9pZGVudGlmaWVyX3ZhbHVlKCkgeworICBpZiAoaWRlbnRpZmllcl92YWx1ZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGlkZW50aWZpZXJfdmFsdWVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgVW5pbnRlcnByZXRlZE9wdGlvbjo6aWRlbnRpZmllcl92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuICppZGVudGlmaWVyX3ZhbHVlXzsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9pZGVudGlmaWVyX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOworICBpZiAoaWRlbnRpZmllcl92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGlkZW50aWZpZXJfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgaWRlbnRpZmllcl92YWx1ZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgaWYgKGlkZW50aWZpZXJfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBpZGVudGlmaWVyX3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGlkZW50aWZpZXJfdmFsdWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOworICBpZiAoaWRlbnRpZmllcl92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGlkZW50aWZpZXJfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgaWRlbnRpZmllcl92YWx1ZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfaWRlbnRpZmllcl92YWx1ZSgpIHsKKyAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7CisgIGlmIChpZGVudGlmaWVyX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgaWRlbnRpZmllcl92YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICByZXR1cm4gaWRlbnRpZmllcl92YWx1ZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9pZGVudGlmaWVyX3ZhbHVlKCkgeworICBjbGVhcl9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOworICBpZiAoaWRlbnRpZmllcl92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBpZGVudGlmaWVyX3ZhbHVlXzsKKyAgICBpZGVudGlmaWVyX3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgICByZXR1cm4gdGVtcDsKKyAgfQorfQorCisvLyBvcHRpb25hbCB1aW50NjQgcG9zaXRpdmVfaW50X3ZhbHVlID0gNDsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX3Bvc2l0aXZlX2ludF92YWx1ZSgpIHsKKyAgcG9zaXRpdmVfaW50X3ZhbHVlXyA9IEdPT0dMRV9VTE9OR0xPTkcoMCk7CisgIGNsZWFyX2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCBVbmludGVycHJldGVkT3B0aW9uOjpwb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBwb3NpdGl2ZV9pbnRfdmFsdWVfOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X3Bvc2l0aXZlX2ludF92YWx1ZSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCB2YWx1ZSkgeworICBzZXRfaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpOworICBwb3NpdGl2ZV9pbnRfdmFsdWVfID0gdmFsdWU7Cit9CisKKy8vIG9wdGlvbmFsIGludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSA9IDU7CitpbmxpbmUgYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpoYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9uZWdhdGl2ZV9pbnRfdmFsdWUoKSB7CisgIG5lZ2F0aXZlX2ludF92YWx1ZV8gPSBHT09HTEVfTE9OR0xPTkcoMCk7CisgIGNsZWFyX2hhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IFVuaW50ZXJwcmV0ZWRPcHRpb246Om5lZ2F0aXZlX2ludF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG5lZ2F0aXZlX2ludF92YWx1ZV87Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfbmVnYXRpdmVfaW50X3ZhbHVlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgdmFsdWUpIHsKKyAgc2V0X2hhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKKyAgbmVnYXRpdmVfaW50X3ZhbHVlXyA9IHZhbHVlOworfQorCisvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19kb3VibGVfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMTB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19kb3VibGVfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfZG91YmxlX3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2RvdWJsZV92YWx1ZSgpIHsKKyAgZG91YmxlX3ZhbHVlXyA9IDA7CisgIGNsZWFyX2hhc19kb3VibGVfdmFsdWUoKTsKK30KK2lubGluZSBkb3VibGUgVW5pbnRlcnByZXRlZE9wdGlvbjo6ZG91YmxlX3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gZG91YmxlX3ZhbHVlXzsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9kb3VibGVfdmFsdWUoZG91YmxlIHZhbHVlKSB7CisgIHNldF9oYXNfZG91YmxlX3ZhbHVlKCk7CisgIGRvdWJsZV92YWx1ZV8gPSB2YWx1ZTsKK30KKworLy8gb3B0aW9uYWwgYnl0ZXMgc3RyaW5nX3ZhbHVlID0gNzsKK2lubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19zdHJpbmdfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19zdHJpbmdfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAyMHU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfc3RyaW5nX3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX3N0cmluZ192YWx1ZSgpIHsKKyAgaWYgKHN0cmluZ192YWx1ZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHN0cmluZ192YWx1ZV8tPmNsZWFyKCk7CisgIH0KKyAgY2xlYXJfaGFzX3N0cmluZ192YWx1ZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFVuaW50ZXJwcmV0ZWRPcHRpb246OnN0cmluZ192YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuICpzdHJpbmdfdmFsdWVfOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X3N0cmluZ192YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX3N0cmluZ192YWx1ZSgpOworICBpZiAoc3RyaW5nX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgc3RyaW5nX3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHN0cmluZ192YWx1ZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIGlmIChzdHJpbmdfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBzdHJpbmdfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgc3RyaW5nX3ZhbHVlXy0+YXNzaWduKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9zdHJpbmdfdmFsdWUoY29uc3Qgdm9pZCogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIGlmIChzdHJpbmdfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBzdHJpbmdfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgc3RyaW5nX3ZhbHVlXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9zdHJpbmdfdmFsdWUoKSB7CisgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIGlmIChzdHJpbmdfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBzdHJpbmdfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7CisgIH0KKyAgcmV0dXJuIHN0cmluZ192YWx1ZV87Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9zdHJpbmdfdmFsdWUoKSB7CisgIGNsZWFyX2hhc19zdHJpbmdfdmFsdWUoKTsKKyAgaWYgKHN0cmluZ192YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIHJldHVybiBOVUxMOworICB9IGVsc2UgeworICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBzdHJpbmdfdmFsdWVfOworICAgIHN0cmluZ192YWx1ZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgICAgcmV0dXJuIHRlbXA7CisgIH0KK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGFnZ3JlZ2F0ZV92YWx1ZSA9IDg7CitpbmxpbmUgYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpoYXNfYWdncmVnYXRlX3ZhbHVlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDQwdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwNDB1OworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA0MHU7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9hZ2dyZWdhdGVfdmFsdWUoKSB7CisgIGlmIChhZ2dyZWdhdGVfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICBhZ2dyZWdhdGVfdmFsdWVfLT5jbGVhcigpOworICB9CisgIGNsZWFyX2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uOjphZ2dyZWdhdGVfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAqYWdncmVnYXRlX3ZhbHVlXzsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9hZ2dyZWdhdGVfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKKyAgaWYgKGFnZ3JlZ2F0ZV92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgeworICAgIGFnZ3JlZ2F0ZV92YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKKyAgfQorICBhZ2dyZWdhdGVfdmFsdWVfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FnZ3JlZ2F0ZV92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICBpZiAoYWdncmVnYXRlX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgYWdncmVnYXRlX3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGFnZ3JlZ2F0ZV92YWx1ZV8tPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICBpZiAoYWdncmVnYXRlX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgYWdncmVnYXRlX3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIGFnZ3JlZ2F0ZV92YWx1ZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfYWdncmVnYXRlX3ZhbHVlKCkgeworICBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICBpZiAoYWdncmVnYXRlX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7CisgICAgYWdncmVnYXRlX3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOworICB9CisgIHJldHVybiBhZ2dyZWdhdGVfdmFsdWVfOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246OnJlbGVhc2VfYWdncmVnYXRlX3ZhbHVlKCkgeworICBjbGVhcl9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CisgIGlmIChhZ2dyZWdhdGVfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gYWdncmVnYXRlX3ZhbHVlXzsKKyAgICBhZ2dyZWdhdGVfdmFsdWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICAgIHJldHVybiB0ZW1wOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU291cmNlQ29kZUluZm9fTG9jYXRpb24KKworLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworaW5saW5lIGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6cGF0aF9zaXplKCkgY29uc3QgeworICByZXR1cm4gcGF0aF8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX3BhdGgoKSB7CisgIHBhdGhfLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6cGF0aChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIHBhdGhfLkdldChpbmRleCk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3BhdGgoaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHBhdGhfLlNldChpbmRleCwgdmFsdWUpOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmFkZF9wYXRoKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgcGF0aF8uQWRkKHZhbHVlKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpwYXRoKCkgY29uc3QgeworICByZXR1cm4gcGF0aF87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9wYXRoKCkgeworICByZXR1cm4gJnBhdGhfOworfQorCisvLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07CitpbmxpbmUgaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzcGFuX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBzcGFuXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfc3BhbigpIHsKKyAgc3Bhbl8uQ2xlYXIoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzcGFuKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gc3Bhbl8uR2V0KGluZGV4KTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfc3BhbihpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgc3Bhbl8uU2V0KGluZGV4LCB2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX3NwYW4oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzcGFuXy5BZGQodmFsdWUpOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgorU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNwYW4oKSBjb25zdCB7CisgIHJldHVybiBzcGFuXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjptdXRhYmxlX3NwYW4oKSB7CisgIHJldHVybiAmc3Bhbl87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU291cmNlQ29kZUluZm8KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiBsb2NhdGlvbiA9IDE7CitpbmxpbmUgaW50IFNvdXJjZUNvZGVJbmZvOjpsb2NhdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gbG9jYXRpb25fLnNpemUoKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvOjpjbGVhcl9sb2NhdGlvbigpIHsKKyAgbG9jYXRpb25fLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgU291cmNlQ29kZUluZm86OmxvY2F0aW9uKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gbG9jYXRpb25fLkdldChpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogU291cmNlQ29kZUluZm86Om11dGFibGVfbG9jYXRpb24oaW50IGluZGV4KSB7CisgIHJldHVybiBsb2NhdGlvbl8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogU291cmNlQ29kZUluZm86OmFkZF9sb2NhdGlvbigpIHsKKyAgcmV0dXJuIGxvY2F0aW9uXy5BZGQoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPiYKK1NvdXJjZUNvZGVJbmZvOjpsb2NhdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIGxvY2F0aW9uXzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPioKK1NvdXJjZUNvZGVJbmZvOjptdXRhYmxlX2xvY2F0aW9uKCkgeworICByZXR1cm4gJmxvY2F0aW9uXzsKK30KKworCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2lmbmRlZiBTV0lHCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGU+KCkgeworICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3IoKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsPigpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcigpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlPigpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZT4oKSB7CisgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZV9kZXNjcmlwdG9yKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorI2VuZGlmICAvLyBTV0lHCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fX0lOQ0xVREVECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDNjYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bwpAQCAtMCwwICsxLDU0NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhlIG1lc3NhZ2VzIGluIHRoaXMgZmlsZSBkZXNjcmliZSB0aGUgZGVmaW5pdGlvbnMgZm91bmQgaW4gLnByb3RvIGZpbGVzLgorLy8gQSB2YWxpZCAucHJvdG8gZmlsZSBjYW4gYmUgdHJhbnNsYXRlZCBkaXJlY3RseSB0byBhIEZpbGVEZXNjcmlwdG9yUHJvdG8KKy8vIHdpdGhvdXQgYW55IG90aGVyIGluZm9ybWF0aW9uIChlLmcuIHdpdGhvdXQgcmVhZGluZyBpdHMgaW1wb3J0cykuCisKKworCitwYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiRGVzY3JpcHRvclByb3RvcyI7CisKKy8vIGRlc2NyaXB0b3IucHJvdG8gbXVzdCBiZSBvcHRpbWl6ZWQgZm9yIHNwZWVkIGJlY2F1c2UgcmVmbGVjdGlvbi1iYXNlZAorLy8gYWxnb3JpdGhtcyBkb24ndCB3b3JrIGR1cmluZyBib290c3RyYXBwaW5nLgorb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOworCisvLyBUaGUgcHJvdG9jb2wgY29tcGlsZXIgY2FuIG91dHB1dCBhIEZpbGVEZXNjcmlwdG9yU2V0IGNvbnRhaW5pbmcgdGhlIC5wcm90bworLy8gZmlsZXMgaXQgcGFyc2VzLgorbWVzc2FnZSBGaWxlRGVzY3JpcHRvclNldCB7CisgIHJlcGVhdGVkIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZSA9IDE7Cit9CisKKy8vIERlc2NyaWJlcyBhIGNvbXBsZXRlIC5wcm90byBmaWxlLgorbWVzc2FnZSBGaWxlRGVzY3JpcHRvclByb3RvIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOyAgICAgICAvLyBmaWxlIG5hbWUsIHJlbGF0aXZlIHRvIHJvb3Qgb2Ygc291cmNlIHRyZWUKKyAgb3B0aW9uYWwgc3RyaW5nIHBhY2thZ2UgPSAyOyAgICAvLyBlLmcuICJmb28iLCAiZm9vLmJhciIsIGV0Yy4KKworICAvLyBOYW1lcyBvZiBmaWxlcyBpbXBvcnRlZCBieSB0aGlzIGZpbGUuCisgIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5ID0gMzsKKworICAvLyBBbGwgdG9wLWxldmVsIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZS4KKyAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CisgIHJlcGVhdGVkIEVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKKyAgcmVwZWF0ZWQgU2VydmljZURlc2NyaXB0b3JQcm90byBzZXJ2aWNlID0gNjsKKyAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKKworICBvcHRpb25hbCBGaWxlT3B0aW9ucyBvcHRpb25zID0gODsKKworICAvLyBUaGlzIGZpZWxkIGNvbnRhaW5zIG9wdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS4KKyAgLy8gWW91IG1heSBzYWZlbHkgcmVtb3ZlIHRoaXMgZW50aXJlIGZpZWxkIHdoaXRob3V0IGhhcm1pbmcgcnVudGltZQorICAvLyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBkZXNjcmlwdG9ycyAtLSB0aGUgaW5mb3JtYXRpb24gaXMgbmVlZGVkIG9ubHkgYnkKKyAgLy8gZGV2ZWxvcG1lbnQgdG9vbHMuCisgIG9wdGlvbmFsIFNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OworfQorCisvLyBEZXNjcmliZXMgYSBtZXNzYWdlIHR5cGUuCittZXNzYWdlIERlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CisgIHJlcGVhdGVkIEZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CisKKyAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG5lc3RlZF90eXBlID0gMzsKKyAgcmVwZWF0ZWQgRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OworCisgIG1lc3NhZ2UgRXh0ZW5zaW9uUmFuZ2UgeworICAgIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgICBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICB9CisgIHJlcGVhdGVkIEV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CisKKyAgb3B0aW9uYWwgTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7Cit9CisKKy8vIERlc2NyaWJlcyBhIGZpZWxkIHdpdGhpbiBhIG1lc3NhZ2UuCittZXNzYWdlIEZpZWxkRGVzY3JpcHRvclByb3RvIHsKKyAgZW51bSBUeXBlIHsKKyAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMuCisgICAgLy8gT3JkZXIgaXMgd2VpcmQgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4KKyAgICBUWVBFX0RPVUJMRSAgICAgICAgID0gMTsKKyAgICBUWVBFX0ZMT0FUICAgICAgICAgID0gMjsKKyAgICBUWVBFX0lOVDY0ICAgICAgICAgID0gMzsgICAvLyBOb3QgWmlnWmFnIGVuY29kZWQuICBOZWdhdGl2ZSBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQ2NCBpZiBuZWdhdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBhcmUgbGlrZWx5LgorICAgIFRZUEVfVUlOVDY0ICAgICAgICAgPSA0OworICAgIFRZUEVfSU5UMzIgICAgICAgICAgPSA1OyAgIC8vIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDMyIGlmIG5lZ2F0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGFyZSBsaWtlbHkuCisgICAgVFlQRV9GSVhFRDY0ICAgICAgICA9IDY7CisgICAgVFlQRV9GSVhFRDMyICAgICAgICA9IDc7CisgICAgVFlQRV9CT09MICAgICAgICAgICA9IDg7CisgICAgVFlQRV9TVFJJTkcgICAgICAgICA9IDk7CisgICAgVFlQRV9HUk9VUCAgICAgICAgICA9IDEwOyAgLy8gVGFnLWRlbGltaXRlZCBhZ2dyZWdhdGUuCisgICAgVFlQRV9NRVNTQUdFICAgICAgICA9IDExOyAgLy8gTGVuZ3RoLWRlbGltaXRlZCBhZ2dyZWdhdGUuCisKKyAgICAvLyBOZXcgaW4gdmVyc2lvbiAyLgorICAgIFRZUEVfQllURVMgICAgICAgICAgPSAxMjsKKyAgICBUWVBFX1VJTlQzMiAgICAgICAgID0gMTM7CisgICAgVFlQRV9FTlVNICAgICAgICAgICA9IDE0OworICAgIFRZUEVfU0ZJWEVEMzIgICAgICAgPSAxNTsKKyAgICBUWVBFX1NGSVhFRDY0ICAgICAgID0gMTY7CisgICAgVFlQRV9TSU5UMzIgICAgICAgICA9IDE3OyAgLy8gVXNlcyBaaWdaYWcgZW5jb2RpbmcuCisgICAgVFlQRV9TSU5UNjQgICAgICAgICA9IDE4OyAgLy8gVXNlcyBaaWdaYWcgZW5jb2RpbmcuCisgIH07CisKKyAgZW51bSBMYWJlbCB7CisgICAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCisgICAgTEFCRUxfT1BUSU9OQUwgICAgICA9IDE7CisgICAgTEFCRUxfUkVRVUlSRUQgICAgICA9IDI7CisgICAgTEFCRUxfUkVQRUFURUQgICAgICA9IDM7CisgICAgLy8gVE9ETyhzYW5qYXkpOiBTaG91bGQgd2UgYWRkIExBQkVMX01BUD8KKyAgfTsKKworICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDM7CisgIG9wdGlvbmFsIExhYmVsIGxhYmVsID0gNDsKKworICAvLyBJZiB0eXBlX25hbWUgaXMgc2V0LCB0aGlzIG5lZWQgbm90IGJlIHNldC4gIElmIGJvdGggdGhpcyBhbmQgdHlwZV9uYW1lCisgIC8vIGFyZSBzZXQsIHRoaXMgbXVzdCBiZSBlaXRoZXIgVFlQRV9FTlVNIG9yIFRZUEVfTUVTU0FHRS4KKyAgb3B0aW9uYWwgVHlwZSB0eXBlID0gNTsKKworICAvLyBGb3IgbWVzc2FnZSBhbmQgZW51bSB0eXBlcywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZS4gIElmIHRoZSBuYW1lCisgIC8vIHN0YXJ0cyB3aXRoIGEgJy4nLCBpdCBpcyBmdWxseS1xdWFsaWZpZWQuICBPdGhlcndpc2UsIEMrKy1saWtlIHNjb3BpbmcKKyAgLy8gcnVsZXMgYXJlIHVzZWQgdG8gZmluZCB0aGUgdHlwZSAoaS5lLiBmaXJzdCB0aGUgbmVzdGVkIHR5cGVzIHdpdGhpbiB0aGlzCisgIC8vIG1lc3NhZ2UgYXJlIHNlYXJjaGVkLCB0aGVuIHdpdGhpbiB0aGUgcGFyZW50LCBvbiB1cCB0byB0aGUgcm9vdAorICAvLyBuYW1lc3BhY2UpLgorICBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKKworICAvLyBGb3IgZXh0ZW5zaW9ucywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBiZWluZyBleHRlbmRlZC4gIEl0IGlzCisgIC8vIHJlc29sdmVkIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0eXBlX25hbWUuCisgIG9wdGlvbmFsIHN0cmluZyBleHRlbmRlZSA9IDI7CisKKyAgLy8gRm9yIG51bWVyaWMgdHlwZXMsIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZS4KKyAgLy8gRm9yIGJvb2xlYW5zLCAidHJ1ZSIgb3IgImZhbHNlIi4KKyAgLy8gRm9yIHN0cmluZ3MsIGNvbnRhaW5zIHRoZSBkZWZhdWx0IHRleHQgY29udGVudHMgKG5vdCBlc2NhcGVkIGluIGFueSB3YXkpLgorICAvLyBGb3IgYnl0ZXMsIGNvbnRhaW5zIHRoZSBDIGVzY2FwZWQgdmFsdWUuICBBbGwgYnl0ZXMgPj0gMTI4IGFyZSBlc2NhcGVkLgorICAvLyBUT0RPKGtlbnRvbik6ICBCYXNlLTY0IGVuY29kZT8KKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OworCisgIG9wdGlvbmFsIEZpZWxkT3B0aW9ucyBvcHRpb25zID0gODsKK30KKworLy8gRGVzY3JpYmVzIGFuIGVudW0gdHlwZS4KK21lc3NhZ2UgRW51bURlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICByZXBlYXRlZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOworCisgIG9wdGlvbmFsIEVudW1PcHRpb25zIG9wdGlvbnMgPSAzOworfQorCisvLyBEZXNjcmliZXMgYSB2YWx1ZSB3aXRoaW4gYW4gZW51bS4KK21lc3NhZ2UgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOworCisgIG9wdGlvbmFsIEVudW1WYWx1ZU9wdGlvbnMgb3B0aW9ucyA9IDM7Cit9CisKKy8vIERlc2NyaWJlcyBhIHNlcnZpY2UuCittZXNzYWdlIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8geworICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIHJlcGVhdGVkIE1ldGhvZERlc2NyaXB0b3JQcm90byBtZXRob2QgPSAyOworCisgIG9wdGlvbmFsIFNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOworfQorCisvLyBEZXNjcmliZXMgYSBtZXRob2Qgb2YgYSBzZXJ2aWNlLgorbWVzc2FnZSBNZXRob2REZXNjcmlwdG9yUHJvdG8geworICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisKKyAgLy8gSW5wdXQgYW5kIG91dHB1dCB0eXBlIG5hbWVzLiAgVGhlc2UgYXJlIHJlc29sdmVkIGluIHRoZSBzYW1lIHdheSBhcworICAvLyBGaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUsIGJ1dCBtdXN0IHJlZmVyIHRvIGEgbWVzc2FnZSB0eXBlLgorICBvcHRpb25hbCBzdHJpbmcgaW5wdXRfdHlwZSA9IDI7CisgIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7CisKKyAgb3B0aW9uYWwgTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gT3B0aW9ucworCisvLyBFYWNoIG9mIHRoZSBkZWZpbml0aW9ucyBhYm92ZSBtYXkgaGF2ZSAib3B0aW9ucyIgYXR0YWNoZWQuICBUaGVzZSBhcmUKKy8vIGp1c3QgYW5ub3RhdGlvbnMgd2hpY2ggbWF5IGNhdXNlIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIHNsaWdodGx5IGRpZmZlcmVudGx5CisvLyBvciBtYXkgY29udGFpbiBoaW50cyBmb3IgY29kZSB0aGF0IG1hbmlwdWxhdGVzIHByb3RvY29sIG1lc3NhZ2VzLgorLy8KKy8vIENsaWVudHMgbWF5IGRlZmluZSBjdXN0b20gb3B0aW9ucyBhcyBleHRlbnNpb25zIG9mIHRoZSAqT3B0aW9ucyBtZXNzYWdlcy4KKy8vIFRoZXNlIGV4dGVuc2lvbnMgbWF5IG5vdCB5ZXQgYmUga25vd24gYXQgcGFyc2luZyB0aW1lLCBzbyB0aGUgcGFyc2VyIGNhbm5vdAorLy8gc3RvcmUgdGhlIHZhbHVlcyBpbiB0aGVtLiAgSW5zdGVhZCBpdCBzdG9yZXMgdGhlbSBpbiBhIGZpZWxkIGluIHRoZSAqT3B0aW9ucworLy8gbWVzc2FnZSBjYWxsZWQgdW5pbnRlcnByZXRlZF9vcHRpb24uIFRoaXMgZmllbGQgbXVzdCBoYXZlIHRoZSBzYW1lIG5hbWUKKy8vIGFjcm9zcyBhbGwgKk9wdGlvbnMgbWVzc2FnZXMuIFdlIHRoZW4gdXNlIHRoaXMgZmllbGQgdG8gcG9wdWxhdGUgdGhlCisvLyBleHRlbnNpb25zIHdoZW4gd2UgYnVpbGQgYSBkZXNjcmlwdG9yLCBhdCB3aGljaCBwb2ludCBhbGwgcHJvdG9zIGhhdmUgYmVlbgorLy8gcGFyc2VkIGFuZCBzbyBhbGwgZXh0ZW5zaW9ucyBhcmUga25vd24uCisvLworLy8gRXh0ZW5zaW9uIG51bWJlcnMgZm9yIGN1c3RvbSBvcHRpb25zIG1heSBiZSBjaG9zZW4gYXMgZm9sbG93czoKKy8vICogRm9yIG9wdGlvbnMgd2hpY2ggd2lsbCBvbmx5IGJlIHVzZWQgd2l0aGluIGEgc2luZ2xlIGFwcGxpY2F0aW9uIG9yCisvLyAgIG9yZ2FuaXphdGlvbiwgb3IgZm9yIGV4cGVyaW1lbnRhbCBvcHRpb25zLCB1c2UgZmllbGQgbnVtYmVycyA1MDAwMAorLy8gICB0aHJvdWdoIDk5OTk5LiAgSXQgaXMgdXAgdG8geW91IHRvIGVuc3VyZSB0aGF0IHlvdSBkbyBub3QgdXNlIHRoZQorLy8gICBzYW1lIG51bWJlciBmb3IgbXVsdGlwbGUgb3B0aW9ucy4KKy8vICogRm9yIG9wdGlvbnMgd2hpY2ggd2lsbCBiZSBwdWJsaXNoZWQgYW5kIHVzZWQgcHVibGljbHkgYnkgbXVsdGlwbGUKKy8vICAgaW5kZXBlbmRlbnQgZW50aXRpZXMsIGUtbWFpbCBwcm90b2J1Zi1nbG9iYWwtZXh0ZW5zaW9uLXJlZ2lzdHJ5QGdvb2dsZS5jb20KKy8vICAgdG8gcmVzZXJ2ZSBleHRlbnNpb24gbnVtYmVycy4gU2ltcGx5IHByb3ZpZGUgeW91ciBwcm9qZWN0IG5hbWUgKGUuZy4KKy8vICAgT2JqZWN0LUMgcGx1Z2luKSBhbmQgeW91ciBwb3JqZWN0IHdlYnNpdGUgKGlmIGF2YWlsYWJsZSkgLS0gdGhlcmUncyBubyBuZWVkCisvLyAgIHRvIGV4cGxhaW4gaG93IHlvdSBpbnRlbmQgdG8gdXNlIHRoZW0uIFVzdWFsbHkgeW91IG9ubHkgbmVlZCBvbmUgZXh0ZW5zaW9uCisvLyAgIG51bWJlci4gWW91IGNhbiBkZWNsYXJlIG11bHRpcGxlIG9wdGlvbnMgd2l0aCBvbmx5IG9uZSBleHRlbnNpb24gbnVtYmVyIGJ5CisvLyAgIHB1dHRpbmcgdGhlbSBpbiBhIHN1Yi1tZXNzYWdlLiBTZWUgdGhlIEN1c3RvbSBPcHRpb25zIHNlY3Rpb24gb2YgdGhlIGRvY3MKKy8vICAgZm9yIGV4YW1wbGVzOgorLy8gICBodHRwOi8vY29kZS5nb29nbGUuY29tL2FwaXMvcHJvdG9jb2xidWZmZXJzL2RvY3MvcHJvdG8uaHRtbCNvcHRpb25zCisvLyAgIElmIHRoaXMgdHVybnMgb3V0IHRvIGJlIHBvcHVsYXIsIGEgd2ViIHNlcnZpY2Ugd2lsbCBiZSBzZXQgdXAKKy8vICAgdG8gYXV0b21hdGljYWxseSBhc3NpZ24gb3B0aW9uIG51bWJlcnMuCisKKworbWVzc2FnZSBGaWxlT3B0aW9ucyB7CisKKyAgLy8gU2V0cyB0aGUgSmF2YSBwYWNrYWdlIHdoZXJlIGNsYXNzZXMgZ2VuZXJhdGVkIGZyb20gdGhpcyAucHJvdG8gd2lsbCBiZQorICAvLyBwbGFjZWQuICBCeSBkZWZhdWx0LCB0aGUgcHJvdG8gcGFja2FnZSBpcyB1c2VkLCBidXQgdGhpcyBpcyBvZnRlbgorICAvLyBpbmFwcHJvcHJpYXRlIGJlY2F1c2UgcHJvdG8gcGFja2FnZXMgZG8gbm90IG5vcm1hbGx5IHN0YXJ0IHdpdGggYmFja3dhcmRzCisgIC8vIGRvbWFpbiBuYW1lcy4KKyAgb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7CisKKworICAvLyBJZiBzZXQsIGFsbCB0aGUgY2xhc3NlcyBmcm9tIHRoZSAucHJvdG8gZmlsZSBhcmUgd3JhcHBlZCBpbiBhIHNpbmdsZQorICAvLyBvdXRlciBjbGFzcyB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgVGhpcyBhcHBsaWVzIHRvIGJvdGggUHJvdG8xCisgIC8vIChlcXVpdmFsZW50IHRvIHRoZSBvbGQgIi0tb25lX2phdmFfZmlsZSIgb3B0aW9uKSBhbmQgUHJvdG8yICh3aGVyZQorICAvLyBhIC5wcm90byBhbHdheXMgdHJhbnNsYXRlcyB0byBhIHNpbmdsZSBjbGFzcywgYnV0IHlvdSBtYXkgd2FudCB0bworICAvLyBleHBsaWNpdGx5IGNob29zZSB0aGUgY2xhc3MgbmFtZSkuCisgIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7CisKKyAgLy8gSWYgc2V0IHRydWUsIHRoZW4gdGhlIEphdmEgY29kZSBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBhIHNlcGFyYXRlIC5qYXZhCisgIC8vIGZpbGUgZm9yIGVhY2ggdG9wLWxldmVsIG1lc3NhZ2UsIGVudW0sIGFuZCBzZXJ2aWNlIGRlZmluZWQgaW4gdGhlIC5wcm90bworICAvLyBmaWxlLiAgVGh1cywgdGhlc2UgdHlwZXMgd2lsbCAqbm90KiBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBvdXRlciBjbGFzcworICAvLyBuYW1lZCBieSBqYXZhX291dGVyX2NsYXNzbmFtZS4gIEhvd2V2ZXIsIHRoZSBvdXRlciBjbGFzcyB3aWxsIHN0aWxsIGJlCisgIC8vIGdlbmVyYXRlZCB0byBjb250YWluIHRoZSBmaWxlJ3MgZ2V0RGVzY3JpcHRvcigpIG1ldGhvZCBhcyB3ZWxsIGFzIGFueQorICAvLyB0b3AtbGV2ZWwgZXh0ZW5zaW9ucyBkZWZpbmVkIGluIHRoZSBmaWxlLgorICBvcHRpb25hbCBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMgPSAxMCBbZGVmYXVsdD1mYWxzZV07CisKKyAgLy8gSWYgc2V0IHRydWUsIHRoZW4gY29kZSBnZW5lcmF0b3JzIHdpbGwgc3RvcmUgdW5rbm93biBmaWVsZHMgc28gdGhhdAorICAvLyByZXNlcmlhbGl6aW5nIGEgbWVzc2FnZSB3aWxsIHJldGFpbiB0aGVtLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW91cgorICAvLyB1bmxlc3MgTElURV9SVU5USU1FIGlzIHNwZWNpZmllZC4gVGhlcmVmb3JlLCB0aGlzIG9wdGlvbiBvbmx5IG1ha2VzIHNlbnNlCisgIC8vIHdoZW4gTElURV9SVU5USU1FIGlzIGluIHVzZS4KKyAgb3B0aW9uYWwgYm9vbCByZXRhaW5fdW5rbm93bl9maWVsZHMgPSAxMSBbZGVmYXVsdD1mYWxzZV07CisKKyAgLy8gSWYgc2V0IHRydWUsIHRoZW4gdGhlIEphdmEgY29kZSBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBlcXVhbHMoKSBhbmQKKyAgLy8gaGFzaENvZGUoKSBtZXRob2RzIGZvciBhbGwgbWVzc2FnZXMgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuIFRoaXMgaXMKKyAgLy8gcHVyZWx5IGEgc3BlZWQgb3B0aW1pemF0aW9uLCBhcyB0aGUgQWJzdHJhY3RNZXNzYWdlIGJhc2UgY2xhc3MgaW5jbHVkZXMKKyAgLy8gcmVmbGVjdGlvbi1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlc2UgbWV0aG9kcy4KKyAgb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0PWZhbHNlXTsKKworICAvLyBHZW5lcmF0ZWQgY2xhc3NlcyBjYW4gYmUgb3B0aW1pemVkIGZvciBzcGVlZCBvciBjb2RlIHNpemUuCisgIGVudW0gT3B0aW1pemVNb2RlIHsKKyAgICBTUEVFRCA9IDE7ICAgICAgICAvLyBHZW5lcmF0ZSBjb21wbGV0ZSBjb2RlIGZvciBwYXJzaW5nLCBzZXJpYWxpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIC8vIGV0Yy4KKyAgICBDT0RFX1NJWkUgPSAyOyAgICAvLyBVc2UgUmVmbGVjdGlvbk9wcyB0byBpbXBsZW1lbnQgdGhlc2UgbWV0aG9kcy4KKyAgICBMSVRFX1JVTlRJTUUgPSAzOyAvLyBHZW5lcmF0ZSBjb2RlIHVzaW5nIE1lc3NhZ2VMaXRlIGFuZCB0aGUgbGl0ZSBydW50aW1lLgorICB9CisgIG9wdGlvbmFsIE9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0PVNQRUVEXTsKKworCisKKworICAvLyBTaG91bGQgZ2VuZXJpYyBzZXJ2aWNlcyBiZSBnZW5lcmF0ZWQgaW4gZWFjaCBsYW5ndWFnZT8gICJHZW5lcmljIiBzZXJ2aWNlcworICAvLyBhcmUgbm90IHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIFJQQyBzeXN0ZW0uICBUaGV5IGFyZSBnZW5lcmF0ZWQgYnkgdGhlCisgIC8vIG1haW4gY29kZSBnZW5lcmF0b3JzIGluIGVhY2ggbGFuZ3VhZ2UgKHdpdGhvdXQgYWRkaXRpb25hbCBwbHVnaW5zKS4KKyAgLy8gR2VuZXJpYyBzZXJ2aWNlcyB3ZXJlIHRoZSBvbmx5IGtpbmQgb2Ygc2VydmljZSBnZW5lcmF0aW9uIHN1cHBvcnRlZCBieQorICAvLyBlYXJseSB2ZXJzaW9ucyBvZiBwcm90bzIuCisgIC8vCisgIC8vIEdlbmVyaWMgc2VydmljZXMgYXJlIG5vdyBjb25zaWRlcmVkIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdXNpbmcgcGx1Z2lucworICAvLyB0aGF0IGdlbmVyYXRlIGNvZGUgc3BlY2lmaWMgdG8geW91ciBwYXJ0aWN1bGFyIFJQQyBzeXN0ZW0uICBUaGVyZWZvcmUsCisgIC8vIHRoZXNlIGRlZmF1bHQgdG8gZmFsc2UuICBPbGQgY29kZSB3aGljaCBkZXBlbmRzIG9uIGdlbmVyaWMgc2VydmljZXMgc2hvdWxkCisgIC8vIGV4cGxpY2l0bHkgc2V0IHRoZW0gdG8gdHJ1ZS4KKyAgb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQ9ZmFsc2VdOworICBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0PWZhbHNlXTsKKyAgb3B0aW9uYWwgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzID0gMTggW2RlZmF1bHQ9ZmFsc2VdOworCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIE1lc3NhZ2VPcHRpb25zIHsKKyAgLy8gU2V0IHRydWUgdG8gdXNlIHRoZSBvbGQgcHJvdG8xIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQgZm9yIGV4dGVuc2lvbnMuCisgIC8vIFRoaXMgaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggdGhlIE1lc3NhZ2VTZXQgd2lyZQorICAvLyBmb3JtYXQuICBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBmb3IgYW55IG90aGVyIHJlYXNvbjogIEl0J3MgbGVzcworICAvLyBlZmZpY2llbnQsIGhhcyBmZXdlciBmZWF0dXJlcywgYW5kIGlzIG1vcmUgY29tcGxpY2F0ZWQuCisgIC8vCisgIC8vIFRoZSBtZXNzYWdlIG11c3QgYmUgZGVmaW5lZCBleGFjdGx5IGFzIGZvbGxvd3M6CisgIC8vICAgbWVzc2FnZSBGb28geworICAvLyAgICAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTsKKyAgLy8gICAgIGV4dGVuc2lvbnMgNCB0byBtYXg7CisgIC8vICAgfQorICAvLyBOb3RlIHRoYXQgdGhlIG1lc3NhZ2UgY2Fubm90IGhhdmUgYW55IGRlZmluZWQgZmllbGRzOyBNZXNzYWdlU2V0cyBvbmx5CisgIC8vIGhhdmUgZXh0ZW5zaW9ucy4KKyAgLy8KKyAgLy8gQWxsIGV4dGVuc2lvbnMgb2YgeW91ciB0eXBlIG11c3QgYmUgc2luZ3VsYXIgbWVzc2FnZXM7IGUuZy4gdGhleSBjYW5ub3QKKyAgLy8gYmUgaW50MzJzLCBlbnVtcywgb3IgcmVwZWF0ZWQgbWVzc2FnZXMuCisgIC8vCisgIC8vIEJlY2F1c2UgdGhpcyBpcyBhbiBvcHRpb24sIHRoZSBhYm92ZSB0d28gcmVzdHJpY3Rpb25zIGFyZSBub3QgZW5mb3JjZWQgYnkKKyAgLy8gdGhlIHByb3RvY29sIGNvbXBpbGVyLgorICBvcHRpb25hbCBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gMSBbZGVmYXVsdD1mYWxzZV07CisKKyAgLy8gRGlzYWJsZXMgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN0YW5kYXJkICJkZXNjcmlwdG9yKCkiIGFjY2Vzc29yLCB3aGljaCBjYW4KKyAgLy8gY29uZmxpY3Qgd2l0aCBhIGZpZWxkIG9mIHRoZSBzYW1lIG5hbWUuICBUaGlzIGlzIG1lYW50IHRvIG1ha2UgbWlncmF0aW9uCisgIC8vIGZyb20gcHJvdG8xIGVhc2llcjsgbmV3IGNvZGUgc2hvdWxkIGF2b2lkIGZpZWxkcyBuYW1lZCAiZGVzY3JpcHRvciIuCisgIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQ9ZmFsc2VdOworCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIEZpZWxkT3B0aW9ucyB7CisgIC8vIFRoZSBjdHlwZSBvcHRpb24gaW5zdHJ1Y3RzIHRoZSBDKysgY29kZSBnZW5lcmF0b3IgdG8gdXNlIGEgZGlmZmVyZW50CisgIC8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaWVsZCB0aGFuIGl0IG5vcm1hbGx5IHdvdWxkLiAgU2VlIHRoZSBzcGVjaWZpYworICAvLyBvcHRpb25zIGJlbG93LiAgVGhpcyBvcHRpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiB0aGUgb3BlbiBzb3VyY2UKKyAgLy8gcmVsZWFzZSAtLSBzb3JyeSwgd2UnbGwgdHJ5IHRvIGluY2x1ZGUgaXQgaW4gYSBmdXR1cmUgdmVyc2lvbiEKKyAgb3B0aW9uYWwgQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKKyAgZW51bSBDVHlwZSB7CisgICAgLy8gRGVmYXVsdCBtb2RlLgorICAgIFNUUklORyA9IDA7CisKKyAgICBDT1JEID0gMTsKKworICAgIFNUUklOR19QSUVDRSA9IDI7CisgIH0KKyAgLy8gVGhlIHBhY2tlZCBvcHRpb24gY2FuIGJlIGVuYWJsZWQgZm9yIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMgdG8gZW5hYmxlCisgIC8vIGEgbW9yZSBlZmZpY2llbnQgcmVwcmVzZW50YXRpb24gb24gdGhlIHdpcmUuIFJhdGhlciB0aGFuIHJlcGVhdGVkbHkKKyAgLy8gd3JpdGluZyB0aGUgdGFnIGFuZCB0eXBlIGZvciBlYWNoIGVsZW1lbnQsIHRoZSBlbnRpcmUgYXJyYXkgaXMgZW5jb2RlZCBhcworICAvLyBhIHNpbmdsZSBsZW5ndGgtZGVsaW1pdGVkIGJsb2IuCisgIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKKworCisgIC8vIElzIHRoaXMgZmllbGQgZGVwcmVjYXRlZD8KKyAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucworICAvLyBmb3IgYWNjZXNzb3JzLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsIHRoaXMKKyAgLy8gaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBmaWVsZHMuCisgIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQ9ZmFsc2VdOworCisgIC8vIEVYUEVSSU1FTlRBTC4gIERPIE5PVCBVU0UuCisgIC8vIEZvciAibWFwIiBmaWVsZHMsIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgZW5jbG9zZWQgdHlwZSB0aGF0CisgIC8vIGlzIHRoZSBrZXkgZm9yIHRoaXMgbWFwLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2Ugd2UgaGF2ZToKKyAgLy8gICBtZXNzYWdlIEl0ZW0geworICAvLyAgICAgcmVxdWlyZWQgc3RyaW5nIG5hbWUgPSAxOworICAvLyAgICAgcmVxdWlyZWQgc3RyaW5nIHZhbHVlID0gMjsKKyAgLy8gICB9CisgIC8vICAgbWVzc2FnZSBDb25maWcgeworICAvLyAgICAgcmVwZWF0ZWQgSXRlbSBpdGVtcyA9IDEgW2V4cGVyaW1lbnRhbF9tYXBfa2V5PSJuYW1lIl07CisgIC8vICAgfQorICAvLyBJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIG1hcCBrZXkgZm9yIEl0ZW0gd2lsbCBiZSBzZXQgdG8gIm5hbWUiLgorICAvLyBUT0RPOiBGdWxseS1pbXBsZW1lbnQgdGhpcywgdGhlbiByZW1vdmUgdGhlICJleHBlcmltZW50YWxfIiBwcmVmaXguCisgIG9wdGlvbmFsIHN0cmluZyBleHBlcmltZW50YWxfbWFwX2tleSA9IDk7CisKKyAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCisgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CisKKyAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgRW51bU9wdGlvbnMgeworCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCittZXNzYWdlIEVudW1WYWx1ZU9wdGlvbnMgeworICAvLyBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KKyAgcmVwZWF0ZWQgVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKworICAvLyBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKK30KKworbWVzc2FnZSBTZXJ2aWNlT3B0aW9ucyB7CisKKyAgLy8gTm90ZTogIEZpZWxkIG51bWJlcnMgMSB0aHJvdWdoIDMyIGFyZSByZXNlcnZlZCBmb3IgR29vZ2xlJ3MgaW50ZXJuYWwgUlBDCisgIC8vICAgZnJhbWV3b3JrLiAgV2UgYXBvbG9naXplIGZvciBob2FyZGluZyB0aGVzZSBudW1iZXJzIHRvIG91cnNlbHZlcywgYnV0CisgIC8vICAgd2Ugd2VyZSBhbHJlYWR5IHVzaW5nIHRoZW0gbG9uZyBiZWZvcmUgd2UgZGVjaWRlZCB0byByZWxlYXNlIFByb3RvY29sCisgIC8vICAgQnVmZmVycy4KKworICAvLyBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KKyAgcmVwZWF0ZWQgVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKworICAvLyBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKK30KKworbWVzc2FnZSBNZXRob2RPcHRpb25zIHsKKworICAvLyBOb3RlOiAgRmllbGQgbnVtYmVycyAxIHRocm91Z2ggMzIgYXJlIHJlc2VydmVkIGZvciBHb29nbGUncyBpbnRlcm5hbCBSUEMKKyAgLy8gICBmcmFtZXdvcmsuICBXZSBhcG9sb2dpemUgZm9yIGhvYXJkaW5nIHRoZXNlIG51bWJlcnMgdG8gb3Vyc2VsdmVzLCBidXQKKyAgLy8gICB3ZSB3ZXJlIGFscmVhZHkgdXNpbmcgdGhlbSBsb25nIGJlZm9yZSB3ZSBkZWNpZGVkIHRvIHJlbGVhc2UgUHJvdG9jb2wKKyAgLy8gICBCdWZmZXJzLgorCisgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgorICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworCisgIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgorICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OworfQorCisvLyBBIG1lc3NhZ2UgcmVwcmVzZW50aW5nIGEgb3B0aW9uIHRoZSBwYXJzZXIgZG9lcyBub3QgcmVjb2duaXplLiBUaGlzIG9ubHkKKy8vIGFwcGVhcnMgaW4gb3B0aW9ucyBwcm90b3MgY3JlYXRlZCBieSB0aGUgY29tcGlsZXI6OlBhcnNlciBjbGFzcy4KKy8vIERlc2NyaXB0b3JQb29sIHJlc29sdmVzIHRoZXNlIHdoZW4gYnVpbGRpbmcgRGVzY3JpcHRvciBvYmplY3RzLiBUaGVyZWZvcmUsCisvLyBvcHRpb25zIHByb3RvcyBpbiBkZXNjcmlwdG9yIG9iamVjdHMgKGUuZy4gcmV0dXJuZWQgYnkgRGVzY3JpcHRvcjo6b3B0aW9ucygpLAorLy8gb3IgcHJvZHVjZWQgYnkgRGVzY3JpcHRvcjo6Q29weVRvKCkpIHdpbGwgbmV2ZXIgaGF2ZSBVbmludGVycHJldGVkT3B0aW9ucworLy8gaW4gdGhlbS4KK21lc3NhZ2UgVW5pbnRlcnByZXRlZE9wdGlvbiB7CisgIC8vIFRoZSBuYW1lIG9mIHRoZSB1bmludGVycHJldGVkIG9wdGlvbi4gIEVhY2ggc3RyaW5nIHJlcHJlc2VudHMgYSBzZWdtZW50IGluCisgIC8vIGEgZG90LXNlcGFyYXRlZCBuYW1lLiAgaXNfZXh0ZW5zaW9uIGlzIHRydWUgaWZmIGEgc2VnbWVudCByZXByZXNlbnRzIGFuCisgIC8vIGV4dGVuc2lvbiAoZGVub3RlZCB3aXRoIHBhcmVudGhlc2VzIGluIG9wdGlvbnMgc3BlY3MgaW4gLnByb3RvIGZpbGVzKS4KKyAgLy8gRS5nLix7IFsiZm9vIiwgZmFsc2VdLCBbImJhci5iYXoiLCB0cnVlXSwgWyJxdXgiLCBmYWxzZV0gfSByZXByZXNlbnRzCisgIC8vICJmb28uKGJhci5iYXopLnF1eCIuCisgIG1lc3NhZ2UgTmFtZVBhcnQgeworICAgIHJlcXVpcmVkIHN0cmluZyBuYW1lX3BhcnQgPSAxOworICAgIHJlcXVpcmVkIGJvb2wgaXNfZXh0ZW5zaW9uID0gMjsKKyAgfQorICByZXBlYXRlZCBOYW1lUGFydCBuYW1lID0gMjsKKworICAvLyBUaGUgdmFsdWUgb2YgdGhlIHVuaW50ZXJwcmV0ZWQgb3B0aW9uLCBpbiB3aGF0ZXZlciB0eXBlIHRoZSB0b2tlbml6ZXIKKyAgLy8gaWRlbnRpZmllZCBpdCBhcyBkdXJpbmcgcGFyc2luZy4gRXhhY3RseSBvbmUgb2YgdGhlc2Ugc2hvdWxkIGJlIHNldC4KKyAgb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOworICBvcHRpb25hbCB1aW50NjQgcG9zaXRpdmVfaW50X3ZhbHVlID0gNDsKKyAgb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKKyAgb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDY7CisgIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7CisgIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBPcHRpb25hbCBzb3VyY2UgY29kZSBpbmZvCisKKy8vIEVuY2Fwc3VsYXRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgZnJvbSB3aGljaCBhCisvLyBGaWxlRGVzY3JpcHRvclByb3RvIHdhcyBnZW5lcmF0ZWQuCittZXNzYWdlIFNvdXJjZUNvZGVJbmZvIHsKKyAgLy8gQSBMb2NhdGlvbiBpZGVudGlmaWVzIGEgcGllY2Ugb2Ygc291cmNlIGNvZGUgaW4gYSAucHJvdG8gZmlsZSB3aGljaAorICAvLyBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgZGVmaW5pdGlvbi4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW50ZW5kZWQKKyAgLy8gdG8gYmUgdXNlZnVsIHRvIElERXMsIGNvZGUgaW5kZXhlcnMsIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9ycywgYW5kIHNpbWlsYXIKKyAgLy8gdG9vbHMuCisgIC8vCisgIC8vIEZvciBleGFtcGxlLCBzYXkgd2UgaGF2ZSBhIGZpbGUgbGlrZToKKyAgLy8gICBtZXNzYWdlIEZvbyB7CisgIC8vICAgICBvcHRpb25hbCBzdHJpbmcgZm9vID0gMTsKKyAgLy8gICB9CisgIC8vIExldCdzIGxvb2sgYXQganVzdCB0aGUgZmllbGQgZGVmaW5pdGlvbjoKKyAgLy8gICBvcHRpb25hbCBzdHJpbmcgZm9vID0gMTsKKyAgLy8gICBeICAgICAgIF5eICAgICBeXiAgXiAgXl5eCisgIC8vICAgYSAgICAgICBiYyAgICAgZGUgIGYgIGdoaQorICAvLyBXZSBoYXZlIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorICAvLyAgIHNwYW4gICBwYXRoICAgICAgICAgICAgICAgcmVwcmVzZW50cworICAvLyAgIFthLGkpICBbIDQsIDAsIDIsIDAgXSAgICAgVGhlIHdob2xlIGZpZWxkIGRlZmluaXRpb24uCisgIC8vICAgW2EsYikgIFsgNCwgMCwgMiwgMCwgNCBdICBUaGUgbGFiZWwgKG9wdGlvbmFsKS4KKyAgLy8gICBbYyxkKSAgWyA0LCAwLCAyLCAwLCA1IF0gIFRoZSB0eXBlIChzdHJpbmcpLgorICAvLyAgIFtlLGYpICBbIDQsIDAsIDIsIDAsIDEgXSAgVGhlIG5hbWUgKGZvbykuCisgIC8vICAgW2csaCkgIFsgNCwgMCwgMiwgMCwgMyBdICBUaGUgbnVtYmVyICgxKS4KKyAgLy8KKyAgLy8gTm90ZXM6CisgIC8vIC0gQSBsb2NhdGlvbiBtYXkgcmVmZXIgdG8gYSByZXBlYXRlZCBmaWVsZCBpdHNlbGYgKGkuZS4gbm90IHRvIGFueQorICAvLyAgIHBhcnRpY3VsYXIgaW5kZXggd2l0aGluIGl0KS4gIFRoaXMgaXMgdXNlZCB3aGVuZXZlciBhIHNldCBvZiBlbGVtZW50cyBhcmUKKyAgLy8gICBsb2dpY2FsbHkgZW5jbG9zZWQgaW4gYSBzaW5nbGUgY29kZSBzZWdtZW50LiAgRm9yIGV4YW1wbGUsIGFuIGVudGlyZQorICAvLyAgIGV4dGVuZCBibG9jayAocG9zc2libHkgY29udGFpbmluZyBtdWx0aXBsZSBleHRlbnNpb24gZGVmaW5pdGlvbnMpIHdpbGwKKyAgLy8gICBoYXZlIGFuIG91dGVyIGxvY2F0aW9uIHdob3NlIHBhdGggcmVmZXJzIHRvIHRoZSAiZXh0ZW5zaW9ucyIgcmVwZWF0ZWQKKyAgLy8gICBmaWVsZCB3aXRob3V0IGFuIGluZGV4LgorICAvLyAtIE11bHRpcGxlIGxvY2F0aW9ucyBtYXkgaGF2ZSB0aGUgc2FtZSBwYXRoLiAgVGhpcyBoYXBwZW5zIHdoZW4gYSBzaW5nbGUKKyAgLy8gICBsb2dpY2FsIGRlY2xhcmF0aW9uIGlzIHNwcmVhZCBvdXQgYWNyb3NzIG11bHRpcGxlIHBsYWNlcy4gIFRoZSBtb3N0CisgIC8vICAgb2J2aW91cyBleGFtcGxlIGlzIHRoZSAiZXh0ZW5kIiBibG9jayBhZ2FpbiAtLSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUKKyAgLy8gICBleHRlbmQgYmxvY2tzIGluIHRoZSBzYW1lIHNjb3BlLCBlYWNoIG9mIHdoaWNoIHdpbGwgaGF2ZSB0aGUgc2FtZSBwYXRoLgorICAvLyAtIEEgbG9jYXRpb24ncyBzcGFuIGlzIG5vdCBhbHdheXMgYSBzdWJzZXQgb2YgaXRzIHBhcmVudCdzIHNwYW4uICBGb3IKKyAgLy8gICBleGFtcGxlLCB0aGUgImV4dGVuZGVlIiBvZiBhbiBleHRlbnNpb24gZGVjbGFyYXRpb24gYXBwZWFycyBhdCB0aGUKKyAgLy8gICBiZWdpbm5pbmcgb2YgdGhlICJleHRlbmQiIGJsb2NrIGFuZCBpcyBzaGFyZWQgYnkgYWxsIGV4dGVuc2lvbnMgd2l0aGluCisgIC8vICAgdGhlIGJsb2NrLgorICAvLyAtIEp1c3QgYmVjYXVzZSBhIGxvY2F0aW9uJ3Mgc3BhbiBpcyBhIHN1YnNldCBvZiBzb21lIG90aGVyIGxvY2F0aW9uJ3Mgc3BhbgorICAvLyAgIGRvZXMgbm90IG1lYW4gdGhhdCBpdCBpcyBhIGRlc2NlbmRlbnQuICBGb3IgZXhhbXBsZSwgYSAiZ3JvdXAiIGRlZmluZXMKKyAgLy8gICBib3RoIGEgdHlwZSBhbmQgYSBmaWVsZCBpbiBhIHNpbmdsZSBkZWNsYXJhdGlvbi4gIFRodXMsIHRoZSBsb2NhdGlvbnMKKyAgLy8gICBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGFuZCBmaWVsZCBhbmQgdGhlaXIgY29tcG9uZW50cyB3aWxsIG92ZXJsYXAuCisgIC8vIC0gQ29kZSB3aGljaCB0cmllcyB0byBpbnRlcnByZXQgbG9jYXRpb25zIHNob3VsZCBwcm9iYWJseSBiZSBkZXNpZ25lZCB0bworICAvLyAgIGlnbm9yZSB0aG9zZSB0aGF0IGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCwgYXMgbW9yZSB0eXBlcyBvZiBsb2NhdGlvbnMgY291bGQKKyAgLy8gICBiZSByZWNvcmRlZCBpbiB0aGUgZnV0dXJlLgorICByZXBlYXRlZCBMb2NhdGlvbiBsb2NhdGlvbiA9IDE7CisgIG1lc3NhZ2UgTG9jYXRpb24geworICAgIC8vIElkZW50aWZpZXMgd2hpY2ggcGFydCBvZiB0aGUgRmlsZURlc2NyaXB0b3JQcm90byB3YXMgZGVmaW5lZCBhdCB0aGlzCisgICAgLy8gbG9jYXRpb24uCisgICAgLy8KKyAgICAvLyBFYWNoIGVsZW1lbnQgaXMgYSBmaWVsZCBudW1iZXIgb3IgYW4gaW5kZXguICBUaGV5IGZvcm0gYSBwYXRoIGZyb20KKyAgICAvLyB0aGUgcm9vdCBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHRoZSBwbGFjZSB3aGVyZSB0aGUgZGVmaW5pdGlvbi4gIEZvcgorICAgIC8vIGV4YW1wbGUsIHRoaXMgcGF0aDoKKyAgICAvLyAgIFsgNCwgMywgMiwgNywgMSBdCisgICAgLy8gcmVmZXJzIHRvOgorICAgIC8vICAgZmlsZS5tZXNzYWdlX3R5cGUoMykgIC8vIDQsIDMKKyAgICAvLyAgICAgICAuZmllbGQoNykgICAgICAgICAvLyAyLCA3CisgICAgLy8gICAgICAgLm5hbWUoKSAgICAgICAgICAgLy8gMQorICAgIC8vIFRoaXMgaXMgYmVjYXVzZSBGaWxlRGVzY3JpcHRvclByb3RvLm1lc3NhZ2VfdHlwZSBoYXMgZmllbGQgbnVtYmVyIDQ6CisgICAgLy8gICByZXBlYXRlZCBEZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKKyAgICAvLyBhbmQgRGVzY3JpcHRvclByb3RvLmZpZWxkIGhhcyBmaWVsZCBudW1iZXIgMjoKKyAgICAvLyAgIHJlcGVhdGVkIEZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkID0gMjsKKyAgICAvLyBhbmQgRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSBoYXMgZmllbGQgbnVtYmVyIDE6CisgICAgLy8gICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgLy8KKyAgICAvLyBUaHVzLCB0aGUgYWJvdmUgcGF0aCBnaXZlcyB0aGUgbG9jYXRpb24gb2YgYSBmaWVsZCBuYW1lLiAgSWYgd2UgcmVtb3ZlZAorICAgIC8vIHRoZSBsYXN0IGVsZW1lbnQ6CisgICAgLy8gICBbIDQsIDMsIDIsIDcgXQorICAgIC8vIHRoaXMgcGF0aCByZWZlcnMgdG8gdGhlIHdob2xlIGZpZWxkIGRlY2xhcmF0aW9uIChmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAvLyBvZiB0aGUgbGFiZWwgdG8gdGhlIHRlcm1pbmF0aW5nIHNlbWljb2xvbikuCisgICAgcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZD10cnVlXTsKKworICAgIC8vIEFsd2F5cyBoYXMgZXhhY3RseSB0aHJlZSBvciBmb3VyIGVsZW1lbnRzOiBzdGFydCBsaW5lLCBzdGFydCBjb2x1bW4sCisgICAgLy8gZW5kIGxpbmUgKG9wdGlvbmFsLCBvdGhlcndpc2UgYXNzdW1lZCBzYW1lIGFzIHN0YXJ0IGxpbmUpLCBlbmQgY29sdW1uLgorICAgIC8vIFRoZXNlIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSBmaWVsZCBmb3IgZWZmaWNpZW5jeS4gIE5vdGUgdGhhdCBsaW5lCisgICAgLy8gYW5kIGNvbHVtbiBudW1iZXJzIGFyZSB6ZXJvLWJhc2VkIC0tIHR5cGljYWxseSB5b3Ugd2lsbCB3YW50IHRvIGFkZAorICAgIC8vIDEgdG8gZWFjaCBiZWZvcmUgZGlzcGxheWluZyB0byBhIHVzZXIuCisgICAgcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZD10cnVlXTsKKworICAgIC8vIFRPRE8oa2VudG9uKTogIFJlY29yZCBjb21tZW50cyBhcHBlYXJpbmcgYmVmb3JlIGFuZCBhZnRlciB0aGUKKyAgICAvLyBkZWNsYXJhdGlvbi4KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlNDhhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MKQEAgLTAsMCArMSw1NDEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaD4KKworI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworRGVzY3JpcHRvckRhdGFiYXNlOjp+RGVzY3JpcHRvckRhdGFiYXNlKCkge30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+Citib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6QWRkRmlsZSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlLAorICAgIFZhbHVlIHZhbHVlKSB7CisgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KCZieV9uYW1lXywgZmlsZS5uYW1lKCksIHZhbHVlKSkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJGaWxlIGFscmVhZHkgZXhpc3RzIGluIGRhdGFiYXNlOiAiIDw8IGZpbGUubmFtZSgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFdlIG11c3QgYmUgY2FyZWZ1bCBoZXJlIC0tIGNhbGxpbmcgZmlsZS5wYWNrYWdlKCkgaWYgZmlsZS5oYXNfcGFja2FnZSgpIGlzCisgIC8vIGZhbHNlIGNvdWxkIGFjY2VzcyBhbiB1bmluaXRpYWxpemVkIHN0YXRpYy1zdG9yYWdlIHZhcmlhYmxlIGlmIHdlIGFyZSBiZWluZworICAvLyBydW4gYXQgc3RhcnR1cCB0aW1lLgorICBzdHJpbmcgcGF0aCA9IGZpbGUuaGFzX3BhY2thZ2UoKSA/IGZpbGUucGFja2FnZSgpIDogc3RyaW5nKCk7CisgIGlmICghcGF0aC5lbXB0eSgpKSBwYXRoICs9ICcuJzsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUubWVzc2FnZV90eXBlX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCFBZGRTeW1ib2wocGF0aCArIGZpbGUubWVzc2FnZV90eXBlKGkpLm5hbWUoKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFBZGROZXN0ZWRFeHRlbnNpb25zKGZpbGUubWVzc2FnZV90eXBlKGkpLCB2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUuZW51bV90eXBlX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKCFBZGRTeW1ib2wocGF0aCArIGZpbGUuZW51bV90eXBlKGkpLm5hbWUoKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmV4dGVuc2lvbl9zaXplKCk7IGkrKykgeworICAgIGlmICghQWRkU3ltYm9sKHBhdGggKyBmaWxlLmV4dGVuc2lvbihpKS5uYW1lKCksIHZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghQWRkRXh0ZW5zaW9uKGZpbGUuZXh0ZW5zaW9uKGkpLCB2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUuc2VydmljZV9zaXplKCk7IGkrKykgeworICAgIGlmICghQWRkU3ltYm9sKHBhdGggKyBmaWxlLnNlcnZpY2UoaSkubmFtZSgpLCB2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+Citib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6QWRkU3ltYm9sKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSwgVmFsdWUgdmFsdWUpIHsKKyAgLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgbm90IHRvIHZpb2xhdGUgb3VyIG1hcCBpbnZhcmlhbnQuCisKKyAgLy8gSWYgdGhlIHN5bWJvbCBuYW1lIGlzIGludmFsaWQgaXQgY291bGQgYnJlYWsgb3VyIGxvb2t1cCBhbGdvcml0aG0gKHdoaWNoCisgIC8vIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0ICcuJyBzb3J0cyBiZWZvcmUgYWxsIG90aGVyIGNoYXJhY3RlcnMgdGhhdCBhcmUKKyAgLy8gdmFsaWQgaW4gc3ltYm9sIG5hbWVzKS4KKyAgaWYgKCFWYWxpZGF0ZVN5bWJvbE5hbWUobmFtZSkpIHsKKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBzeW1ib2wgbmFtZTogIiA8PCBuYW1lOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRyeSB0byBsb29rIHVwIHRoZSBzeW1ib2wgdG8gbWFrZSBzdXJlIGEgc3VwZXItc3ltYm9sIGRvZXNuJ3QgYWxyZWFkeQorICAvLyBleGlzdC4KKyAgdHlwZW5hbWUgbWFwPHN0cmluZywgVmFsdWU+OjppdGVyYXRvciBpdGVyID0gRmluZExhc3RMZXNzT3JFcXVhbChuYW1lKTsKKworICBpZiAoaXRlciA9PSBieV9zeW1ib2xfLmVuZCgpKSB7CisgICAgLy8gQXBwYXJlbnRseSB0aGUgbWFwIGlzIGN1cnJlbnRseSBlbXB0eS4gIEp1c3QgaW5zZXJ0IGFuZCBiZSBkb25lIHdpdGggaXQuCisgICAgYnlfc3ltYm9sXy5pbnNlcnQodHlwZW5hbWUgbWFwPHN0cmluZywgVmFsdWU+Ojp2YWx1ZV90eXBlKG5hbWUsIHZhbHVlKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoSXNTdWJTeW1ib2woaXRlci0+Zmlyc3QsIG5hbWUpKSB7CisgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIlN5bWJvbCBuYW1lIFwiIiA8PCBuYW1lIDw8ICJcIiBjb25mbGljdHMgd2l0aCB0aGUgZXhpc3RpbmcgIgorICAgICAgICAgICAgICAgICAgInN5bWJvbCBcIiIgPDwgaXRlci0+Zmlyc3QgPDwgIlwiLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gT0ssIHRoYXQgd29ya2VkLiAgTm93IHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgbm8gc3ltYm9sIGluIHRoZSBtYXAgaXMKKyAgLy8gYSBzdWItc3ltYm9sIG9mIHRoZSBvbmUgd2UgYXJlIGluc2VydGluZy4gIFRoZSBvbmx5IHN5bWJvbCB3aGljaCBjb3VsZAorICAvLyBiZSBzbyBpcyB0aGUgZmlyc3Qgc3ltYm9sIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBuZXcgc3ltYm9sLiAgU2luY2UKKyAgLy8gfGl0ZXJ8IHBvaW50cyBhdCB0aGUgbGFzdCBzeW1ib2wgdGhhdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwsIHdlIGp1c3QgaGF2ZQorICAvLyB0byBpbmNyZW1lbnQgaXQuCisgICsraXRlcjsKKworICBpZiAoaXRlciAhPSBieV9zeW1ib2xfLmVuZCgpICYmIElzU3ViU3ltYm9sKG5hbWUsIGl0ZXItPmZpcnN0KSkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJTeW1ib2wgbmFtZSBcIiIgPDwgbmFtZSA8PCAiXCIgY29uZmxpY3RzIHdpdGggdGhlIGV4aXN0aW5nICIKKyAgICAgICAgICAgICAgICAgICJzeW1ib2wgXCIiIDw8IGl0ZXItPmZpcnN0IDw8ICJcIi4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE9LLCBubyBjb25mbGljdHMuCisKKyAgLy8gSW5zZXJ0IHRoZSBuZXcgc3ltYm9sIHVzaW5nIHRoZSBpdGVyYXRvciBhcyBhIGhpbnQsIHRoZSBuZXcgZW50cnkgd2lsbAorICAvLyBhcHBlYXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBvbmUgdGhlIGl0ZXJhdG9yIGlzIHBvaW50aW5nIGF0LgorICBieV9zeW1ib2xfLmluc2VydChpdGVyLCB0eXBlbmFtZSBtYXA8c3RyaW5nLCBWYWx1ZT46OnZhbHVlX3R5cGUobmFtZSwgdmFsdWUpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgorYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkFkZE5lc3RlZEV4dGVuc2lvbnMoCisgICAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBtZXNzYWdlX3R5cGUsCisgICAgVmFsdWUgdmFsdWUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX3R5cGUubmVzdGVkX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIUFkZE5lc3RlZEV4dGVuc2lvbnMobWVzc2FnZV90eXBlLm5lc3RlZF90eXBlKGkpLCB2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZS5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIUFkZEV4dGVuc2lvbihtZXNzYWdlX3R5cGUuZXh0ZW5zaW9uKGkpLCB2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgorYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkFkZEV4dGVuc2lvbigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQsCisgICAgVmFsdWUgdmFsdWUpIHsKKyAgaWYgKCFmaWVsZC5leHRlbmRlZSgpLmVtcHR5KCkgJiYgZmllbGQuZXh0ZW5kZWUoKVswXSA9PSAnLicpIHsKKyAgICAvLyBUaGUgZXh0ZW5zaW9uIGlzIGZ1bGx5LXF1YWxpZmllZC4gIFdlIGNhbiB1c2UgaXQgYXMgYSBsb29rdXAga2V5IGluCisgICAgLy8gdGhlIGJ5X3N5bWJvbF8gdGFibGUuCisgICAgaWYgKCFJbnNlcnRJZk5vdFByZXNlbnQoJmJ5X2V4dGVuc2lvbl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKGZpZWxkLmV4dGVuZGVlKCkuc3Vic3RyKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5udW1iZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRXh0ZW5zaW9uIGNvbmZsaWN0cyB3aXRoIGV4dGVuc2lvbiBhbHJlYWR5IGluIGRhdGFiYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICJleHRlbmQgIiA8PCBmaWVsZC5leHRlbmRlZSgpIDw8ICIgeyAiCisgICAgICAgICAgICAgICAgIDw8IGZpZWxkLm5hbWUoKSA8PCAiID0gIiA8PCBmaWVsZC5udW1iZXIoKSA8PCAiIH0iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBOb3QgZnVsbHktcXVhbGlmaWVkLiAgV2UgY2FuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIGhlcmUsIHVuZm9ydHVuYXRlbHkuCisgICAgLy8gV2UgZG9uJ3QgY29uc2lkZXIgdGhpcyBhbiBlcnJvciwgdGhvdWdoLCBiZWNhdXNlIHRoZSBkZXNjcmlwdG9yIGlzCisgICAgLy8gdmFsaWQuCisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KK1ZhbHVlIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6RmluZEZpbGUoCisgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gRmluZFdpdGhEZWZhdWx0KGJ5X25hbWVfLCBmaWxlbmFtZSwgVmFsdWUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KK1ZhbHVlIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6RmluZFN5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgdHlwZW5hbWUgbWFwPHN0cmluZywgVmFsdWU+OjppdGVyYXRvciBpdGVyID0gRmluZExhc3RMZXNzT3JFcXVhbChuYW1lKTsKKworICByZXR1cm4gKGl0ZXIgIT0gYnlfc3ltYm9sXy5lbmQoKSAmJiBJc1N1YlN5bWJvbChpdGVyLT5maXJzdCwgbmFtZSkpID8KKyAgICAgICAgIGl0ZXItPnNlY29uZCA6IFZhbHVlKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KK1ZhbHVlIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6RmluZEV4dGVuc2lvbigKKyAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICBpbnQgZmllbGRfbnVtYmVyKSB7CisgIHJldHVybiBGaW5kV2l0aERlZmF1bHQoYnlfZXh0ZW5zaW9uXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoY29udGFpbmluZ190eXBlLCBmaWVsZF9udW1iZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+Citib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoCisgICAgY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgdmVjdG9yPGludD4qIG91dHB1dCkgeworICB0eXBlbmFtZSBtYXA8cGFpcjxzdHJpbmcsIGludD4sIFZhbHVlID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgIGJ5X2V4dGVuc2lvbl8ubG93ZXJfYm91bmQobWFrZV9wYWlyKGNvbnRhaW5pbmdfdHlwZSwgMCkpOworICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworICBmb3IgKDsgaXQgIT0gYnlfZXh0ZW5zaW9uXy5lbmQoKSAmJiBpdC0+Zmlyc3QuZmlyc3QgPT0gY29udGFpbmluZ190eXBlOworICAgICAgICsraXQpIHsKKyAgICBvdXRwdXQtPnB1c2hfYmFjayhpdC0+Zmlyc3Quc2Vjb25kKTsKKyAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBzdWNjZXNzOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+Cit0eXBlbmFtZSBtYXA8c3RyaW5nLCBWYWx1ZT46Oml0ZXJhdG9yCitTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkZpbmRMYXN0TGVzc09yRXF1YWwoCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIC8vIEZpbmQgdGhlIGxhc3Qga2V5IGluIHRoZSBtYXAgd2hpY2ggc29ydHMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQorICAvLyBzeW1ib2wgbmFtZS4gIFNpbmNlIHVwcGVyX2JvdW5kKCkgcmV0dXJucyB0aGUgKmZpcnN0KiBrZXkgdGhhdCBzb3J0cworICAvLyAqZ3JlYXRlciogdGhhbiB0aGUgaW5wdXQsIHdlIHdhbnQgdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoYXQuCisgIHR5cGVuYW1lIG1hcDxzdHJpbmcsIFZhbHVlPjo6aXRlcmF0b3IgaXRlciA9IGJ5X3N5bWJvbF8udXBwZXJfYm91bmQobmFtZSk7CisgIGlmIChpdGVyICE9IGJ5X3N5bWJvbF8uYmVnaW4oKSkgLS1pdGVyOworICByZXR1cm4gaXRlcjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgorYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OklzU3ViU3ltYm9sKAorICAgIGNvbnN0IHN0cmluZyYgc3ViX3N5bWJvbCwgY29uc3Qgc3RyaW5nJiBzdXBlcl9zeW1ib2wpIHsKKyAgcmV0dXJuIHN1Yl9zeW1ib2wgPT0gc3VwZXJfc3ltYm9sIHx8CisgICAgICAgICAoSGFzUHJlZml4U3RyaW5nKHN1cGVyX3N5bWJvbCwgc3ViX3N5bWJvbCkgJiYKKyAgICAgICAgICAgICBzdXBlcl9zeW1ib2xbc3ViX3N5bWJvbC5zaXplKCldID09ICcuJyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KK2Jvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpWYWxpZGF0ZVN5bWJvbE5hbWUoCisgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgeworICAgIC8vIEkgZG9uJ3QgdHJ1c3QgY3R5cGUuaCBkdWUgdG8gbG9jYWxlcy4gIDooCisgICAgaWYgKG5hbWVbaV0gIT0gJy4nICYmIG5hbWVbaV0gIT0gJ18nICYmCisgICAgICAgIChuYW1lW2ldIDwgJzAnIHx8IG5hbWVbaV0gPiAnOScpICYmCisgICAgICAgIChuYW1lW2ldIDwgJ0EnIHx8IG5hbWVbaV0gPiAnWicpICYmCisgICAgICAgIChuYW1lW2ldIDwgJ2EnIHx8IG5hbWVbaV0gPiAneicpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6U2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlKCkge30KK1NpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6flNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSgpIHsKKyAgU1RMRGVsZXRlRWxlbWVudHMoJmZpbGVzX3RvX2RlbGV0ZV8pOworfQorCitib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6QWRkKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byogbmV3X2ZpbGUgPSBuZXcgRmlsZURlc2NyaXB0b3JQcm90bzsKKyAgbmV3X2ZpbGUtPkNvcHlGcm9tKGZpbGUpOworICByZXR1cm4gQWRkQW5kT3duKG5ld19maWxlKTsKK30KKworYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkFkZEFuZE93bihjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlKSB7CisgIGZpbGVzX3RvX2RlbGV0ZV8ucHVzaF9iYWNrKGZpbGUpOworICByZXR1cm4gaW5kZXhfLkFkZEZpbGUoKmZpbGUsIGZpbGUpOworfQorCitib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVCeU5hbWUoCisgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgcmV0dXJuIE1heWJlQ29weShpbmRleF8uRmluZEZpbGUoZmlsZW5hbWUpLCBvdXRwdXQpOworfQorCitib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nU3ltYm9sKAorICAgIGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHJldHVybiBNYXliZUNvcHkoaW5kZXhfLkZpbmRTeW1ib2woc3ltYm9sX25hbWUpLCBvdXRwdXQpOworfQorCitib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAorICAgIGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHJldHVybiBNYXliZUNvcHkoaW5kZXhfLkZpbmRFeHRlbnNpb24oY29udGFpbmluZ190eXBlLCBmaWVsZF9udW1iZXIpLCBvdXRwdXQpOworfQorCitib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoCisgICAgY29uc3Qgc3RyaW5nJiBleHRlbmRlZV90eXBlLAorICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpIHsKKyAgcmV0dXJuIGluZGV4Xy5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhleHRlbmRlZV90eXBlLCBvdXRwdXQpOworfQorCitib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6TWF5YmVDb3B5KGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICBpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgIG91dHB1dC0+Q29weUZyb20oKmZpbGUpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlKCkge30KK0VuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6On5FbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzX3RvX2RlbGV0ZV8uc2l6ZSgpOyBpKyspIHsKKyAgICBvcGVyYXRvciBkZWxldGUoZmlsZXNfdG9fZGVsZXRlX1tpXSk7CisgIH0KK30KKworYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpBZGQoCisgICAgY29uc3Qgdm9pZCogZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIGludCBzaXplKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgaWYgKGZpbGUuUGFyc2VGcm9tQXJyYXkoZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIHNpemUpKSB7CisgICAgcmV0dXJuIGluZGV4Xy5BZGRGaWxlKGZpbGUsIG1ha2VfcGFpcihlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgc2l6ZSkpOworICB9IGVsc2UgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvciBkYXRhIHBhc3NlZCB0byAiCisgICAgICAgICAgICAgICAgICAiRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6QWRkKCkuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpBZGRDb3B5KAorICAgIGNvbnN0IHZvaWQqIGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBpbnQgc2l6ZSkgeworICB2b2lkKiBjb3B5ID0gb3BlcmF0b3IgbmV3KHNpemUpOworICBtZW1jcHkoY29weSwgZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIHNpemUpOworICBmaWxlc190b19kZWxldGVfLnB1c2hfYmFjayhjb3B5KTsKKyAgcmV0dXJuIEFkZChjb3B5LCBzaXplKTsKK30KKworYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kRmlsZUJ5TmFtZSgKKyAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICByZXR1cm4gTWF5YmVQYXJzZShpbmRleF8uRmluZEZpbGUoZmlsZW5hbWUpLCBvdXRwdXQpOworfQorCitib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICByZXR1cm4gTWF5YmVQYXJzZShpbmRleF8uRmluZFN5bWJvbChzeW1ib2xfbmFtZSksIG91dHB1dCk7Cit9CisKK2Jvb2wgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKAorICAgIGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgc3RyaW5nKiBvdXRwdXQpIHsKKyAgcGFpcjxjb25zdCB2b2lkKiwgaW50PiBlbmNvZGVkX2ZpbGUgPSBpbmRleF8uRmluZFN5bWJvbChzeW1ib2xfbmFtZSk7CisgIGlmIChlbmNvZGVkX2ZpbGUuZmlyc3QgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIE9wdGltaXphdGlvbjogIFRoZSBuYW1lIHNob3VsZCBiZSB0aGUgZmlyc3QgZmllbGQgaW4gdGhlIGVuY29kZWQgbWVzc2FnZS4KKyAgLy8gICBUcnkgdG8ganVzdCByZWFkIGl0IGRpcmVjdGx5LgorICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oZW5jb2RlZF9maWxlLmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZF9maWxlLnNlY29uZCk7CisKKyAgY29uc3QgdWludDMyIGtOYW1lVGFnID0gaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlciwKKyAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisKKyAgaWYgKGlucHV0LlJlYWRUYWcoKSA9PSBrTmFtZVRhZykgeworICAgIC8vIFN1Y2Nlc3MhCisgICAgcmV0dXJuIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygmaW5wdXQsIG91dHB1dCk7CisgIH0gZWxzZSB7CisgICAgLy8gU2xvdyBwYXRoLiAgUGFyc2Ugd2hvbGUgbWVzc2FnZS4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgICAgaWYgKCFmaWxlX3Byb3RvLlBhcnNlRnJvbUFycmF5KGVuY29kZWRfZmlsZS5maXJzdCwgZW5jb2RlZF9maWxlLnNlY29uZCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKm91dHB1dCA9IGZpbGVfcHJvdG8ubmFtZSgpOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK2Jvb2wgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAorICAgIGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIHJldHVybiBNYXliZVBhcnNlKGluZGV4Xy5GaW5kRXh0ZW5zaW9uKGNvbnRhaW5pbmdfdHlwZSwgZmllbGRfbnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKK30KKworYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygKKyAgICBjb25zdCBzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCisgICAgdmVjdG9yPGludD4qIG91dHB1dCkgeworICByZXR1cm4gaW5kZXhfLkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGV4dGVuZGVlX3R5cGUsIG91dHB1dCk7Cit9CisKK2Jvb2wgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6TWF5YmVQYXJzZSgKKyAgICBwYWlyPGNvbnN0IHZvaWQqLCBpbnQ+IGVuY29kZWRfZmlsZSwKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgaWYgKGVuY29kZWRfZmlsZS5maXJzdCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiBvdXRwdXQtPlBhcnNlRnJvbUFycmF5KGVuY29kZWRfZmlsZS5maXJzdCwgZW5jb2RlZF9maWxlLnNlY29uZCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRGVzY3JpcHRvclBvb2xEYXRhYmFzZTo6RGVzY3JpcHRvclBvb2xEYXRhYmFzZShjb25zdCBEZXNjcmlwdG9yUG9vbCYgcG9vbCkKKyAgOiBwb29sXyhwb29sKSB7fQorRGVzY3JpcHRvclBvb2xEYXRhYmFzZTo6fkRlc2NyaXB0b3JQb29sRGF0YWJhc2UoKSB7fQorCitib29sIERlc2NyaXB0b3JQb29sRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbF8uRmluZEZpbGVCeU5hbWUoZmlsZW5hbWUpOworICBpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgIG91dHB1dC0+Q2xlYXIoKTsKKyAgZmlsZS0+Q29weVRvKG91dHB1dCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIERlc2NyaXB0b3JQb29sRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2xfLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzeW1ib2xfbmFtZSk7CisgIGlmIChmaWxlID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgb3V0cHV0LT5DbGVhcigpOworICBmaWxlLT5Db3B5VG8ob3V0cHV0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVzY3JpcHRvclBvb2xEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAorICAgIGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlID0gcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKGNvbnRhaW5pbmdfdHlwZSk7CisgIGlmIChleHRlbmRlZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24gPQorICAgIHBvb2xfLkZpbmRFeHRlbnNpb25CeU51bWJlcihleHRlbmRlZSwgZmllbGRfbnVtYmVyKTsKKyAgaWYgKGV4dGVuc2lvbiA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgb3V0cHV0LT5DbGVhcigpOworICBleHRlbnNpb24tPmZpbGUoKS0+Q29weVRvKG91dHB1dCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIERlc2NyaXB0b3JQb29sRGF0YWJhc2U6OkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKAorICAgIGNvbnN0IHN0cmluZyYgZXh0ZW5kZWVfdHlwZSwKKyAgICB2ZWN0b3I8aW50Piogb3V0cHV0KSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlID0gcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKGV4dGVuZGVlX3R5cGUpOworICBpZiAoZXh0ZW5kZWUgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBleHRlbnNpb25zOworICBwb29sXy5GaW5kQWxsRXh0ZW5zaW9ucyhleHRlbmRlZSwgJmV4dGVuc2lvbnMpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5zaXplKCk7ICsraSkgeworICAgIG91dHB1dC0+cHVzaF9iYWNrKGV4dGVuc2lvbnNbaV0tPm51bWJlcigpKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK01lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTo6TWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKAorICAgIERlc2NyaXB0b3JEYXRhYmFzZSogc291cmNlMSwKKyAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIHNvdXJjZTIpIHsKKyAgc291cmNlc18ucHVzaF9iYWNrKHNvdXJjZTEpOworICBzb3VyY2VzXy5wdXNoX2JhY2soc291cmNlMik7Cit9CitNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2U6Ok1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZSgKKyAgICBjb25zdCB2ZWN0b3I8RGVzY3JpcHRvckRhdGFiYXNlKj4mIHNvdXJjZXMpCisgIDogc291cmNlc18oc291cmNlcykge30KK01lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTo6fk1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZSgpIHt9CisKK2Jvb2wgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kRmlsZUJ5TmFtZSgKKyAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZXNfLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHNvdXJjZXNfW2ldLT5GaW5kRmlsZUJ5TmFtZShmaWxlbmFtZSwgb3V0cHV0KSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKKyAgICBjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZXNfLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHNvdXJjZXNfW2ldLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woc3ltYm9sX25hbWUsIG91dHB1dCkpIHsKKyAgICAgIC8vIFRoZSBzeW1ib2wgd2FzIGZvdW5kIGluIHNvdXJjZSBpLiAgSG93ZXZlciwgaWYgb25lIG9mIHRoZSBwcmV2aW91cworICAgICAgLy8gc291cmNlcyBkZWZpbmVzIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgKHdoaWNoIHByZXN1bWFibHkgZG9lc24ndAorICAgICAgLy8gY29udGFpbiB0aGUgc3ltYm9sLCBzaW5jZSBpdCB3YXNuJ3QgZm91bmQgaW4gdGhhdCBzb3VyY2UpLCB0aGVuIHdlCisgICAgICAvLyBtdXN0IGhpZGUgaXQgZnJvbSB0aGUgY2FsbGVyLgorICAgICAgRmlsZURlc2NyaXB0b3JQcm90byB0ZW1wOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgaWYgKHNvdXJjZXNfW2pdLT5GaW5kRmlsZUJ5TmFtZShvdXRwdXQtPm5hbWUoKSwgJnRlbXApKSB7CisgICAgICAgICAgLy8gRm91bmQgY29uZmxpY3RpbmcgZmlsZSBpbiBhIHByZXZpb3VzIHNvdXJjZS4KKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oCisgICAgY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgaW50IGZpZWxkX251bWJlciwKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VzXy5zaXplKCk7IGkrKykgeworICAgIGlmIChzb3VyY2VzX1tpXS0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAorICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSwgZmllbGRfbnVtYmVyLCBvdXRwdXQpKSB7CisgICAgICAvLyBUaGUgc3ltYm9sIHdhcyBmb3VuZCBpbiBzb3VyY2UgaS4gIEhvd2V2ZXIsIGlmIG9uZSBvZiB0aGUgcHJldmlvdXMKKyAgICAgIC8vIHNvdXJjZXMgZGVmaW5lcyBhIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lICh3aGljaCBwcmVzdW1hYmx5IGRvZXNuJ3QKKyAgICAgIC8vIGNvbnRhaW4gdGhlIHN5bWJvbCwgc2luY2UgaXQgd2Fzbid0IGZvdW5kIGluIHRoYXQgc291cmNlKSwgdGhlbiB3ZQorICAgICAgLy8gbXVzdCBoaWRlIGl0IGZyb20gdGhlIGNhbGxlci4KKyAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdGVtcDsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgIGlmIChzb3VyY2VzX1tqXS0+RmluZEZpbGVCeU5hbWUob3V0cHV0LT5uYW1lKCksICZ0ZW1wKSkgeworICAgICAgICAgIC8vIEZvdW5kIGNvbmZsaWN0aW5nIGZpbGUgaW4gYSBwcmV2aW91cyBzb3VyY2UuCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoCisgICAgY29uc3Qgc3RyaW5nJiBleHRlbmRlZV90eXBlLAorICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpIHsKKyAgc2V0PGludD4gbWVyZ2VkX3Jlc3VsdHM7CisgIHZlY3RvcjxpbnQ+IHJlc3VsdHM7CisgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoc291cmNlc19baV0tPkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGV4dGVuZGVlX3R5cGUsICZyZXN1bHRzKSkgeworICAgICAgY29weShyZXN1bHRzLmJlZ2luKCksIHJlc3VsdHMuZW5kKCksCisgICAgICAgICAgIGluc2VydF9pdGVyYXRvcjxzZXQ8aW50PiA+KG1lcmdlZF9yZXN1bHRzLCBtZXJnZWRfcmVzdWx0cy5iZWdpbigpKSk7CisgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisgICAgcmVzdWx0cy5jbGVhcigpOworICB9CisKKyAgY29weShtZXJnZWRfcmVzdWx0cy5iZWdpbigpLCBtZXJnZWRfcmVzdWx0cy5lbmQoKSwKKyAgICAgICBpbnNlcnRfaXRlcmF0b3I8dmVjdG9yPGludD4gPigqb3V0cHV0LCBvdXRwdXQtPmVuZCgpKSk7CisKKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMmIxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmgKQEAgLTAsMCArMSwzNjYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEludGVyZmFjZSBmb3IgbWFuaXB1bGF0aW5nIGRhdGFiYXNlcyBvZiBkZXNjcmlwdG9ycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUl9EQVRBQkFTRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JfREFUQUJBU0VfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCitjbGFzcyBEZXNjcmlwdG9yRGF0YWJhc2U7CitjbGFzcyBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U7CitjbGFzcyBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOworY2xhc3MgRGVzY3JpcHRvclBvb2xEYXRhYmFzZTsKK2NsYXNzIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhIGRhdGFiYXNlIG9mIGRlc2NyaXB0b3JzLgorLy8KKy8vIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIERlc2NyaXB0b3JQb29sIHdoaWNoIGxvYWRzCisvLyBkZXNjcmlwdG9ycyBvbi1kZW1hbmQgZnJvbSBzb21lIHNvcnQgb2YgbGFyZ2UgZGF0YWJhc2UuICBJZiB0aGUgZGF0YWJhc2UKKy8vIGlzIGxhcmdlLCBpdCBtYXkgYmUgaW5lZmZpY2llbnQgdG8gZW51bWVyYXRlIGV2ZXJ5IC5wcm90byBmaWxlIGluc2lkZSBpdAorLy8gY2FsbGluZyBEZXNjcmlwdG9yUG9vbDo6QnVpbGRGaWxlKCkgZm9yIGVhY2ggb25lLiAgSW5zdGVhZCwgYSBEZXNjcmlwdG9yUG9vbAorLy8gY2FuIGJlIGNyZWF0ZWQgd2hpY2ggd3JhcHMgYSBEZXNjcmlwdG9yRGF0YWJhc2UgYW5kIG9ubHkgYnVpbGRzIHBhcnRpY3VsYXIKKy8vIGRlc2NyaXB0b3JzIHdoZW4gdGhleSBhcmUgbmVlZGVkLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3JEYXRhYmFzZSB7CisgcHVibGljOgorICBpbmxpbmUgRGVzY3JpcHRvckRhdGFiYXNlKCkge30KKyAgdmlydHVhbCB+RGVzY3JpcHRvckRhdGFiYXNlKCk7CisKKyAgLy8gRmluZCBhIGZpbGUgYnkgZmlsZSBuYW1lLiAgRmlsbHMgaW4gaW4gKm91dHB1dCBhbmQgcmV0dXJucyB0cnVlIGlmIGZvdW5kLgorICAvLyBPdGhlcndpc2UsIHJldHVybnMgZmFsc2UsIGxlYXZpbmcgdGhlIGNvbnRlbnRzIG9mICpvdXRwdXQgdW5kZWZpbmVkLgorICB2aXJ0dWFsIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgPSAwOworCisgIC8vIEZpbmQgdGhlIGZpbGUgdGhhdCBkZWNsYXJlcyB0aGUgZ2l2ZW4gZnVsbHktcXVhbGlmaWVkIHN5bWJvbCBuYW1lLgorICAvLyBJZiBmb3VuZCwgZmlsbHMgaW4gKm91dHB1dCBhbmQgcmV0dXJucyB0cnVlLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZQorICAvLyBhbmQgbGVhdmVzICpvdXRwdXQgdW5kZWZpbmVkLgorICB2aXJ0dWFsIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSA9IDA7CisKKyAgLy8gRmluZCB0aGUgZmlsZSB3aGljaCBkZWZpbmVzIGFuIGV4dGVuc2lvbiBleHRlbmRpbmcgdGhlIGdpdmVuIG1lc3NhZ2UgdHlwZQorICAvLyB3aXRoIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuICBJZiBmb3VuZCwgZmlsbHMgaW4gKm91dHB1dCBhbmQgcmV0dXJucyB0cnVlLAorICAvLyBvdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzICpvdXRwdXQgdW5kZWZpbmVkLiAgY29udGFpbmluZ190eXBlCisgIC8vIG11c3QgYmUgYSBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lLgorICB2aXJ0dWFsIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSA9IDA7CisKKyAgLy8gRmluZHMgdGhlIHRhZyBudW1iZXJzIHVzZWQgYnkgYWxsIGtub3duIGV4dGVuc2lvbnMgb2YKKyAgLy8gZXh0ZW5kZWVfdHlwZSwgYW5kIGFwcGVuZHMgdGhlbSB0byBvdXRwdXQgaW4gYW4gdW5kZWZpbmVkCisgIC8vIG9yZGVyLiBUaGlzIG1ldGhvZCBpcyBiZXN0LWVmZm9ydDogaXQncyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZQorICAvLyBkYXRhYmFzZSB3aWxsIGZpbmQgYWxsIGV4dGVuc2lvbnMsIGFuZCBpdCdzIG5vdCBndWFyYW50ZWVkIHRoYXQKKyAgLy8gRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uIHdpbGwgcmV0dXJuIHRydWUgb24gYWxsIG9mIHRoZSBmb3VuZAorICAvLyBudW1iZXJzLiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlYXJjaCB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlCisgIC8vIHJldHVybnMgZmFsc2UgYW5kIGxlYXZlcyBvdXRwdXQgdW5jaGFuZ2VkLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMKKyAgLy8gZmFsc2UuCisgIHZpcnR1YWwgYm9vbCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhjb25zdCBzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50Piogb3V0cHV0KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVzY3JpcHRvckRhdGFiYXNlKTsKK307CisKKy8vIEEgRGVzY3JpcHRvckRhdGFiYXNlIGludG8gd2hpY2ggeW91IGNhbiBpbnNlcnQgZmlsZXMgbWFudWFsbHkuCisvLworLy8gRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCkgaXMgZnVsbHktaW1wbGVtZW50ZWQuICBXaGVuIHlvdSBhZGQgYSBmaWxlLCBpdHMKKy8vIHN5bWJvbHMgd2lsbCBiZSBpbmRleGVkIGZvciB0aGlzIHB1cnBvc2UuICBOb3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uCisvLyBtYXkgcmV0dXJuIGZhbHNlIHBvc2l0aXZlcywgYnV0IG9ubHkgaWYgaXQgaXNuJ3QgcG9zc2libGUgZm9yIHRoZSBzeW1ib2wKKy8vIHRvIGJlIGRlZmluZWQgaW4gYW55IG90aGVyIGZpbGUuICBJbiBwYXJ0aWN1bGFyLCBpZiBhIGZpbGUgZGVmaW5lcyBhIHN5bWJvbAorLy8gIkZvbyIsIHRoZW4gc2VhcmNoaW5nIGZvciAiRm9vLlthbnl0aGluZ10iIHdpbGwgbWF0Y2ggdGhhdCBmaWxlLiAgVGhpcyB3YXksCisvLyB0aGUgZGF0YWJhc2UgZG9lcyBub3QgbmVlZCB0byBhZ2dyZXNzaXZlbHkgaW5kZXggYWxsIGNoaWxkcmVuIG9mIGEgc3ltYm9sLgorLy8KKy8vIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigpIGlzIG1vc3RseS1pbXBsZW1lbnRlZC4gIEl0IHdvcmtzIGlmIGFuZCBvbmx5CisvLyBpZiB0aGUgb3JpZ2luYWwgRmllbGREZXNjcmlwdG9yUHJvdG8gZGVmaW5pbmcgdGhlIGV4dGVuc2lvbiBoYXMgYQorLy8gZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZSBpbiBpdHMgImV4dGVuZGVlIiBmaWVsZCAoaS5lLiBzdGFydHMgd2l0aCBhICcuJykuCisvLyBJZiB0aGUgZXh0ZW5kZWUgaXMgYSByZWxhdGl2ZSBuYW1lLCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2Ugd2lsbCBub3QKKy8vIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgdHlwZSwgc28gaXQgd2lsbCBub3Qga25vdyB3aGF0IHR5cGUgdGhlIGV4dGVuc2lvbiBpcworLy8gZXh0ZW5kaW5nLiAgVGhlcmVmb3JlLCBjYWxsaW5nIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigpIHdpdGggdGhlCisvLyBleHRlbnNpb24ncyBjb250YWluaW5nIHR5cGUgd2lsbCBuZXZlciBhY3R1YWxseSBmaW5kIHRoYXQgZXh0ZW5zaW9uLiAgTm90ZQorLy8gdGhhdCB0aGlzIGlzIGFuIHVubGlrZWx5IHByb2JsZW0sIGFzIGFsbCBGaWxlRGVzY3JpcHRvclByb3RvcyBjcmVhdGVkIGJ5IHRoZQorLy8gcHJvdG9jb2wgY29tcGlsZXIgKGFzIHdlbGwgYXMgb25lcyBjcmVhdGVkIGJ5IGNhbGxpbmcKKy8vIEZpbGVEZXNjcmlwdG9yOjpDb3B5VG8oKSkgd2lsbCBhbHdheXMgdXNlIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBmb3IgYWxsCisvLyB0eXBlcy4gIFlvdSBvbmx5IG5lZWQgdG8gd29ycnkgaWYgeW91IGFyZSBjb25zdHJ1Y3RpbmcgRmlsZURlc2NyaXB0b3JQcm90b3MKKy8vIHlvdXJzZWxmLCBvciBhcmUgY2FsbGluZyBjb21waWxlcjo6UGFyc2VyIGRpcmVjdGx5LgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworIHB1YmxpYzoKKyAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlKCk7CisgIH5TaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UoKTsKKworICAvLyBBZGRzIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHRoZSBkYXRhYmFzZSwgbWFraW5nIGEgY29weS4gIFRoZSBvYmplY3QKKyAgLy8gY2FuIGJlIGRlbGV0ZWQgYWZ0ZXIgQWRkKCkgcmV0dXJucy4gIFJldHVybnMgZmFsc2UgaWYgdGhlIGZpbGUgY29uZmxpY3RlZAorICAvLyB3aXRoIGEgZmlsZSBhbHJlYWR5IGluIHRoZSBkYXRhYmFzZSwgaW4gd2hpY2ggY2FzZSBhbiBlcnJvciB3aWxsIGhhdmUKKyAgLy8gYmVlbiB3cml0dGVuIHRvIEdPT0dMRV9MT0coRVJST1IpLgorICBib29sIEFkZChjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKTsKKworICAvLyBBZGRzIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHRoZSBkYXRhYmFzZSBhbmQgdGFrZXMgb3duZXJzaGlwIG9mIGl0LgorICBib29sIEFkZEFuZE93bihjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlKTsKKworICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKyAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKyAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisgIGJvb2wgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoY29uc3Qgc3RyaW5nJiBleHRlbmRlZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpOworCisgcHJpdmF0ZToKKyAgLy8gU28gdGhhdCBpdCBjYW4gdXNlIERlc2NyaXB0b3JJbmRleC4KKyAgZnJpZW5kIGNsYXNzIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U7CisKKyAgLy8gQW4gaW5kZXggbWFwcGluZyBmaWxlIG5hbWVzLCBzeW1ib2wgbmFtZXMsIGFuZCBleHRlbnNpb24gbnVtYmVycyB0bworICAvLyBzb21lIHNvcnQgb2YgdmFsdWVzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+CisgIGNsYXNzIERlc2NyaXB0b3JJbmRleCB7CisgICBwdWJsaWM6CisgICAgLy8gSGVscGVycyB0byByZWN1cnNpdmVseSBhZGQgcGFydGljdWxhciBkZXNjcmlwdG9ycyBhbmQgYWxsIHRoZWlyIGNvbnRlbnRzCisgICAgLy8gdG8gdGhlIGluZGV4LgorICAgIGJvb2wgQWRkRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlLAorICAgICAgICAgICAgICAgICBWYWx1ZSB2YWx1ZSk7CisgICAgYm9vbCBBZGRTeW1ib2woY29uc3Qgc3RyaW5nJiBuYW1lLCBWYWx1ZSB2YWx1ZSk7CisgICAgYm9vbCBBZGROZXN0ZWRFeHRlbnNpb25zKGNvbnN0IERlc2NyaXB0b3JQcm90byYgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSB2YWx1ZSk7CisgICAgYm9vbCBBZGRFeHRlbnNpb24oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIHZhbHVlKTsKKworICAgIFZhbHVlIEZpbmRGaWxlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOworICAgIFZhbHVlIEZpbmRTeW1ib2woY29uc3Qgc3RyaW5nJiBuYW1lKTsKKyAgICBWYWx1ZSBGaW5kRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLCBpbnQgZmllbGRfbnVtYmVyKTsKKyAgICBib29sIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGludD4qIG91dHB1dCk7CisKKyAgIHByaXZhdGU6CisgICAgbWFwPHN0cmluZywgVmFsdWU+IGJ5X25hbWVfOworICAgIG1hcDxzdHJpbmcsIFZhbHVlPiBieV9zeW1ib2xfOworICAgIG1hcDxwYWlyPHN0cmluZywgaW50PiwgVmFsdWU+IGJ5X2V4dGVuc2lvbl87CisKKyAgICAvLyBJbnZhcmlhbnQ6ICBUaGUgYnlfc3ltYm9sXyBtYXAgZG9lcyBub3QgY29udGFpbiBhbnkgc3ltYm9scyB3aGljaCBhcmUKKyAgICAvLyBwcmVmaXhlcyBvZiBvdGhlciBzeW1ib2xzIGluIHRoZSBtYXAuICBGb3IgZXhhbXBsZSwgImZvby5iYXIiIGlzIGEKKyAgICAvLyBwcmVmaXggb2YgImZvby5iYXIuYmF6IiAoYnV0IGlzIG5vdCBhIHByZWZpeCBvZiAiZm9vLmJhcmJheiIpLgorICAgIC8vCisgICAgLy8gVGhpcyBpbnZhcmlhbnQgaXMgaW1wb3J0YW50IGJlY2F1c2UgaXQgbWVhbnMgdGhhdCBnaXZlbiBhIHN5bWJvbCBuYW1lLAorICAgIC8vIHdlIGNhbiBmaW5kIGEga2V5IGluIHRoZSBtYXAgd2hpY2ggaXMgYSBwcmVmaXggb2YgdGhlIHN5bWJvbCBpbiBPKGxnIG4pCisgICAgLy8gdGltZSwgYW5kIHdlIGtub3cgdGhhdCB0aGVyZSBpcyBhdCBtb3N0IG9uZSBzdWNoIGtleS4KKyAgICAvLworICAgIC8vIFRoZSBwcmVmaXggbG9va3VwIGFsZ29yaXRobSB3b3JrcyBsaWtlIHNvOgorICAgIC8vIDEpIEZpbmQgdGhlIGxhc3Qga2V5IGluIHRoZSBtYXAgd2hpY2ggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQorICAgIC8vICAgIHNlYXJjaCBrZXkuCisgICAgLy8gMikgSWYgdGhlIGZvdW5kIGtleSBpcyBhIHByZWZpeCBvZiB0aGUgc2VhcmNoIGtleSwgdGhlbiByZXR1cm4gaXQuCisgICAgLy8gICAgT3RoZXJ3aXNlLCB0aGVyZSBpcyBubyBtYXRjaC4KKyAgICAvLworICAgIC8vIEkgYW0gc3VyZSB0aGlzIGFsZ29yaXRobSBoYXMgYmVlbiBkZXNjcmliZWQgZWxzZXdoZXJlLCBidXQgc2luY2UgSQorICAgIC8vIHdhc24ndCBhYmxlIHRvIGZpbmQgaXQgcXVpY2tseSBJIHdpbGwgaW5zdGVhZCBwcm92ZSB0aGF0IGl0IHdvcmtzCisgICAgLy8gbXlzZWxmLiAgVGhlIGtleSB0byB0aGUgYWxnb3JpdGhtIGlzIHRoYXQgaWYgYSBtYXRjaCBleGlzdHMsIHN0ZXAgKDEpCisgICAgLy8gd2lsbCBmaW5kIGl0LiAgUHJvb2Y6CisgICAgLy8gMSkgRGVmaW5lIHRoZSAic2VhcmNoIGtleSIgdG8gYmUgdGhlIGtleSB3ZSBhcmUgbG9va2luZyBmb3IsIHRoZSAiZm91bmQKKyAgICAvLyAgICBrZXkiIHRvIGJlIHRoZSBrZXkgZm91bmQgaW4gc3RlcCAoMSksIGFuZCB0aGUgIm1hdGNoIGtleSIgdG8gYmUgdGhlCisgICAgLy8gICAga2V5IHdoaWNoIGFjdHVhbGx5IG1hdGNoZXMgdGhlIHNlcmFjaCBrZXkgKGkuZS4gdGhlIGtleSB3ZSdyZSB0cnlpbmcKKyAgICAvLyAgICB0byBmaW5kKS4KKyAgICAvLyAyKSBUaGUgZm91bmQga2V5IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWFyY2gga2V5IGJ5CisgICAgLy8gICAgZGVmaW5pdGlvbi4KKyAgICAvLyAzKSBUaGUgbWF0Y2gga2V5IG11c3QgYWxzbyBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlYXJjaCBrZXkKKyAgICAvLyAgICAoYmVjYXVzZSBpdCBpcyBhIHByZWZpeCkuCisgICAgLy8gNCkgVGhlIG1hdGNoIGtleSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBmb3VuZCBrZXksIGJlY2F1c2UgaWYgaXQKKyAgICAvLyAgICB3ZXJlLCB0aGVuIHN0ZXAgKDEpIG9mIHRoZSBhbGdvcml0aG0gd291bGQgaGF2ZSByZXR1cm5lZCB0aGUgbWF0Y2gKKyAgICAvLyAgICBrZXkgaW5zdGVhZCAoc2luY2UgaXQgZmluZHMgdGhlICpncmVhdGVzdCoga2V5IHdoaWNoIGlzIGxlc3MgdGhhbiBvcgorICAgIC8vICAgIGVxdWFsIHRvIHRoZSBzZWFyY2gga2V5KS4KKyAgICAvLyA1KSBUaGVyZWZvcmUsIHRoZSBmb3VuZCBrZXkgbXVzdCBiZSBiZXR3ZWVuIHRoZSBtYXRjaCBrZXkgYW5kIHRoZSBzZWFyY2gKKyAgICAvLyAgICBrZXksIGluY2x1c2l2ZS4KKyAgICAvLyA2KSBTaW5jZSB0aGUgc2VhcmNoIGtleSBtdXN0IGJlIGEgc3ViLXN5bWJvbCBvZiB0aGUgbWF0Y2gga2V5LCBpZiBpdCBpcworICAgIC8vICAgIG5vdCBlcXVhbCB0byB0aGUgbWF0Y2gga2V5LCB0aGVuIHNlYXJjaF9rZXlbbWF0Y2hfa2V5LnNpemUoKV0gbXVzdAorICAgIC8vICAgIGJlICcuJy4KKyAgICAvLyA3KSBTaW5jZSAnLicgc29ydHMgYmVmb3JlIGFueSBvdGhlciBjaGFyYWN0ZXIgdGhhdCBpcyB2YWxpZCBpbiBhIHN5bWJvbAorICAgIC8vICAgIG5hbWUsIHRoZW4gaWYgdGhlIGZvdW5kIGtleSBpcyBub3QgZXF1YWwgdG8gdGhlIG1hdGNoIGtleSwgdGhlbgorICAgIC8vICAgIGZvdW5kX2tleVttYXRjaF9rZXkuc2l6ZSgpXSBtdXN0IGFsc28gYmUgJy4nLCBiZWNhdXNlIGFueSBvdGhlciB2YWx1ZQorICAgIC8vICAgIHdvdWxkIG1ha2UgaXQgc29ydCBhZnRlciB0aGUgc2VhcmNoIGtleS4KKyAgICAvLyA4KSBUaGVyZWZvcmUsIGlmIHRoZSBmb3VuZCBrZXkgaXMgbm90IGVxdWFsIHRvIHRoZSBtYXRjaCBrZXksIHRoZW4gdGhlCisgICAgLy8gICAgZm91bmQga2V5IG11c3QgYmUgYSBzdWItc3ltYm9sIG9mIHRoZSBtYXRjaCBrZXkuICBIb3dldmVyLCB0aGlzIHdvdWxkCisgICAgLy8gICAgY29udHJhZGljdCBvdXIgbWFwIGludmFyaWFudCB3aGljaCBzYXlzIHRoYXQgbm8gc3ltYm9sIGluIHRoZSBtYXAgaXMKKyAgICAvLyAgICBhIHN1Yi1zeW1ib2wgb2YgYW55IG90aGVyLgorICAgIC8vIDkpIFRoZXJlZm9yZSwgdGhlIGZvdW5kIGtleSBtdXN0IG1hdGNoIHRoZSBtYXRjaCBrZXkuCisgICAgLy8KKyAgICAvLyBUaGUgYWJvdmUgcHJvb2YgYXNzdW1lcyB0aGUgbWF0Y2gga2V5IGV4aXN0cy4gIEluIHRoZSBjYXNlIHRoYXQgdGhlCisgICAgLy8gbWF0Y2gga2V5IGRvZXMgbm90IGV4aXN0LCB0aGVuIHN0ZXAgKDEpIHdpbGwgcmV0dXJuIHNvbWUgb3RoZXIgc3ltYm9sLgorICAgIC8vIFRoYXQgc3ltYm9sIGNhbm5vdCBiZSBhIHN1cGVyLXN5bWJvbCBvZiB0aGUgc2VhcmNoIGtleSBzaW5jZSBpZiBpdCB3ZXJlLAorICAgIC8vIHRoZW4gaXQgd291bGQgYmUgYSBtYXRjaCwgYW5kIHdlJ3JlIGFzc3VtaW5nIHRoZSBtYXRjaCBrZXkgZG9lc24ndCBleGlzdC4KKyAgICAvLyBUaGVyZWZvcmUsIHN0ZXAgMiB3aWxsIGNvcnJlY3RseSByZXR1cm4gbm8gbWF0Y2guCisKKyAgICAvLyBGaW5kIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBieV9zeW1ib2xfIG1hcCB3aG9zZSBrZXkgaXMgbGVzcyB0aGFuIG9yCisgICAgLy8gZXF1YWwgdG8gdGhlIGdpdmVuIG5hbWUuCisgICAgdHlwZW5hbWUgbWFwPHN0cmluZywgVmFsdWU+OjppdGVyYXRvciBGaW5kTGFzdExlc3NPckVxdWFsKAorICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpOworCisgICAgLy8gVHJ1ZSBpZiBlaXRoZXIgdGhlIGFyZ3VtZW50cyBhcmUgZXF1YWwgb3Igc3VwZXJfc3ltYm9sIGlkZW50aWZpZXMgYQorICAgIC8vIHBhcmVudCBzeW1ib2wgb2Ygc3ViX3N5bWJvbCAoZS5nLiAiZm9vLmJhciIgaXMgYSBwYXJlbnQgb2YKKyAgICAvLyAiZm9vLmJhci5iYXoiLCBidXQgbm90IGEgcGFyZW50IG9mICJmb28uYmFyYmF6IikuCisgICAgYm9vbCBJc1N1YlN5bWJvbChjb25zdCBzdHJpbmcmIHN1Yl9zeW1ib2wsIGNvbnN0IHN0cmluZyYgc3VwZXJfc3ltYm9sKTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgbmFtZSBhcmUgYWxwaGFudW1lcmljcywKKyAgICAvLyB1bmRlcnNjb3Jlcywgb3IgcGVyaW9kcy4KKyAgICBib29sIFZhbGlkYXRlU3ltYm9sTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpOworICB9OworCisKKyAgRGVzY3JpcHRvckluZGV4PGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qPiBpbmRleF87CisgIHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKj4gZmlsZXNfdG9fZGVsZXRlXzsKKworICAvLyBJZiBmaWxlIGlzIG5vbi1OVUxMLCBjb3B5IGl0IGludG8gKm91dHB1dCBhbmQgcmV0dXJuIHRydWUsIG90aGVyd2lzZQorICAvLyByZXR1cm4gZmFsc2UuCisgIGJvb2wgTWF5YmVDb3B5KGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsCisgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSk7Cit9OworCisvLyBWZXJ5IHNpbWlsYXIgdG8gU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlLCBidXQgc3RvcmVzIGFsbCB0aGUgZGVzY3JpcHRvcnMKKy8vIGFzIHJhdyBieXRlcyBhbmQgZ2VuZXJhbGx5IHRyaWVzIHRvIHVzZSBhcyBsaXR0bGUgbWVtb3J5IGFzIHBvc3NpYmxlLgorLy8KKy8vIFRoZSBzYW1lIGNhdmVhdHMgcmVnYXJkaW5nIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigpIGFwcGx5IGFzIHdpdGgKKy8vIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZSB7CisgcHVibGljOgorICBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlKCk7CisgIH5FbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlKCk7CisKKyAgLy8gQWRkcyB0aGUgRmlsZURlc2NyaXB0b3JQcm90byB0byB0aGUgZGF0YWJhc2UuICBUaGUgZGVzY3JpcHRvciBpcyBwcm92aWRlZAorICAvLyBpbiBlbmNvZGVkIGZvcm0uICBUaGUgZGF0YWJhc2UgZG9lcyBub3QgbWFrZSBhIGNvcHkgb2YgdGhlIGJ5dGVzLCBub3IKKyAgLy8gZG9lcyBpdCB0YWtlIG93bmVyc2hpcDsgaXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIG1ha2Ugc3VyZSB0aGUgYnl0ZXMKKyAgLy8gcmVtYWluIHZhbGlkIGZvciB0aGUgbGlmZSBvZiB0aGUgZGF0YWJhc2UuICBSZXR1cm5zIGZhbHNlIGFuZCBsb2dzIGFuIGVycm9yCisgIC8vIGlmIHRoZSBieXRlcyBhcmUgbm90IGEgdmFsaWQgRmlsZURlc2NyaXB0b3JQcm90byBvciBpZiB0aGUgZmlsZSBjb25mbGljdGVkCisgIC8vIHdpdGggYSBmaWxlIGFscmVhZHkgaW4gdGhlIGRhdGFiYXNlLgorICBib29sIEFkZChjb25zdCB2b2lkKiBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgaW50IHNpemUpOworCisgIC8vIExpa2UgQWRkKCksIGJ1dCBtYWtlcyBhIGNvcHkgb2YgdGhlIGRhdGEsIHNvIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAorICAvLyBuZWVkIHRvIGtlZXAgaXQgYXJvdW5kLgorICBib29sIEFkZENvcHkoY29uc3Qgdm9pZCogZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIGludCBzaXplKTsKKworICAvLyBMaWtlIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCBidXQgcmV0dXJucyBvbmx5IHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICBib29sIEZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIG91dHB1dCk7CisKKyAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOworICBib29sIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGNvbnN0IHN0cmluZyYgZXh0ZW5kZWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50Piogb3V0cHV0KTsKKworIHByaXZhdGU6CisgIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PHBhaXI8Y29uc3Qgdm9pZCosIGludD4gPiBpbmRleF87CisgIHZlY3Rvcjx2b2lkKj4gZmlsZXNfdG9fZGVsZXRlXzsKKworICAvLyBJZiBlbmNvZGVkX2ZpbGUuZmlyc3QgaXMgbm9uLU5VTEwsIHBhcnNlIHRoZSBkYXRhIGludG8gKm91dHB1dCBhbmQgcmV0dXJuCisgIC8vIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuCisgIGJvb2wgTWF5YmVQYXJzZShwYWlyPGNvbnN0IHZvaWQqLCBpbnQ+IGVuY29kZWRfZmlsZSwKKyAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UpOworfTsKKworLy8gQSBEZXNjcmlwdG9yRGF0YWJhc2UgdGhhdCBmZXRjaGVzIGZpbGVzIGZyb20gYSBnaXZlbiBwb29sLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3JQb29sRGF0YWJhc2UgOiBwdWJsaWMgRGVzY3JpcHRvckRhdGFiYXNlIHsKKyBwdWJsaWM6CisgIERlc2NyaXB0b3JQb29sRGF0YWJhc2UoY29uc3QgRGVzY3JpcHRvclBvb2wmIHBvb2wpOworICB+RGVzY3JpcHRvclBvb2xEYXRhYmFzZSgpOworCisgIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOworICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOworICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKKyAgYm9vbCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhjb25zdCBzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGludD4qIG91dHB1dCk7CisKKyBwcml2YXRlOgorICBjb25zdCBEZXNjcmlwdG9yUG9vbCYgcG9vbF87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXNjcmlwdG9yUG9vbERhdGFiYXNlKTsKK307CisKKy8vIEEgRGVzY3JpcHRvckRhdGFiYXNlIHRoYXQgd3JhcHMgdHdvIG9yIG1vcmUgb3RoZXJzLiAgSXQgZmlyc3Qgc2VhcmNoZXMgdGhlCisvLyBmaXJzdCBkYXRhYmFzZSBhbmQsIGlmIHRoYXQgZmFpbHMsIHRyaWVzIHRoZSBzZWNvbmQsIGFuZCBzbyBvbi4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UgOiBwdWJsaWMgRGVzY3JpcHRvckRhdGFiYXNlIHsKKyBwdWJsaWM6CisgIC8vIE1lcmdlIGp1c3QgdHdvIGRhdGFiYXNlcy4gIFRoZSBzb3VyY2VzIHJlbWFpbiBwcm9wZXJ0eSBvZiB0aGUgY2FsbGVyLgorICBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UoRGVzY3JpcHRvckRhdGFiYXNlKiBzb3VyY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvckRhdGFiYXNlKiBzb3VyY2UyKTsKKyAgLy8gTWVyZ2UgbW9yZSB0aGFuIHR3byBkYXRhYmFzZXMuICBUaGUgc291cmNlcyByZW1haW4gcHJvcGVydHkgb2YgdGhlIGNhbGxlci4KKyAgLy8gVGhlIHZlY3RvciBtYXkgYmUgZGVsZXRlZCBhZnRlciB0aGUgY29uc3RydWN0b3IgcmV0dXJucyBidXQgdGhlCisgIC8vIERlc2NyaXB0b3JEYXRhYmFzZXMgbmVlZCB0byBzdGljayBhcm91bmQuCisgIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZShjb25zdCB2ZWN0b3I8RGVzY3JpcHRvckRhdGFiYXNlKj4mIHNvdXJjZXMpOworICB+TWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKCk7CisKKyAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7CisgIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOworICAvLyBNZXJnZXMgdGhlIHJlc3VsdHMgb2YgY2FsbGluZyBhbGwgZGF0YWJhc2VzLiBSZXR1cm5zIHRydWUgaWZmIGFueQorICAvLyBvZiB0aGUgZGF0YWJhc2VzIHJldHVybmVkIHRydWUuCisgIGJvb2wgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoY29uc3Qgc3RyaW5nJiBleHRlbmRlZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpOworCisgcHJpdmF0ZToKKyAgdmVjdG9yPERlc2NyaXB0b3JEYXRhYmFzZSo+IHNvdXJjZXNfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SX0RBVEFCQVNFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3MmRkYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw3NDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBtYWtlcyBleHRlbnNpdmUgdXNlIG9mIFJGQyAzMDkyLiAgOikKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSB7CisKK3N0YXRpYyB2b2lkIEFkZFRvRGF0YWJhc2UoU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZV90ZXh0KSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKGZpbGVfdGV4dCwgJmZpbGVfcHJvdG8pKTsKKyAgZGF0YWJhc2UtPkFkZChmaWxlX3Byb3RvKTsKK30KKworc3RhdGljIHZvaWQgRXhwZWN0Q29udGFpbnNUeXBlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHlwZV9uYW1lKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8ubWVzc2FnZV90eXBlX3NpemUoKTsgaSsrKSB7CisgICAgaWYgKHByb3RvLm1lc3NhZ2VfdHlwZShpKS5uYW1lKCkgPT0gdHlwZV9uYW1lKSByZXR1cm47CisgIH0KKyAgQUREX0ZBSUxVUkUoKSA8PCAiXCIiIDw8IHByb3RvLm5hbWUoKQorICAgICAgICAgICAgICAgIDw8ICJcIiBkaWQgbm90IGNvbnRhaW4gZXhwZWN0ZWQgdHlwZSBcIiIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUgPDwgIlwiLiI7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmIEdURVNUX0hBU19QQVJBTV9URVNUCisKKy8vIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSwgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSwgYW5kCisvLyBEZXNjcmlwdG9yUG9vbERhdGFiYXNlIGNhbGwgZm9yIHZlcnkgc2ltaWxhciB0ZXN0cy4gIEluc3RlYWQgb2Ygd3JpdGluZworLy8gdGhyZWUgbmVhcmx5LWlkZW50aWNhbCBzZXRzIG9mIHRlc3RzLCB3ZSB1c2UgcGFyYW1ldGVyaXplZCB0ZXN0cyB0byBhcHBseQorLy8gdGhlIHNhbWUgY29kZSB0byBhbGwgdGhyZWUuCisKKy8vIFRoZSBwYXJhbWV0ZXJpemVkIHRlc3QgcnVucyBhZ2FpbnN0IGEgRGVzY3JpcHRhckRhdGFiYXNlVGVzdENhc2UuICBXZSBoYXZlCisvLyBpbXBsZW1lbnRhdGlvbnMgZm9yIGVhY2ggb2YgdGhlIHRocmVlIGNsYXNzZXMgd2Ugd2FudCB0byB0ZXN0LgorY2xhc3MgRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+RGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2UoKSB7fQorCisgIHZpcnR1YWwgRGVzY3JpcHRvckRhdGFiYXNlKiBHZXREYXRhYmFzZSgpID0gMDsKKyAgdmlydHVhbCBib29sIEFkZFRvRGF0YWJhc2UoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZmlsZSkgPSAwOworfTsKKworLy8gRmFjdG9yeSBmdW5jdGlvbiB0eXBlLgordHlwZWRlZiBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSogRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2VGYWN0b3J5KCk7CisKKy8vIFNwZWNpYWxpemF0aW9uIGZvciBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UuCitjbGFzcyBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSB7CisgcHVibGljOgorICBzdGF0aWMgRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2UqIE5ldygpIHsKKyAgICByZXR1cm4gbmV3IFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlOworICB9CisKKyAgdmlydHVhbCB+U2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2UoKSB7fQorCisgIHZpcnR1YWwgRGVzY3JpcHRvckRhdGFiYXNlKiBHZXREYXRhYmFzZSgpIHsKKyAgICByZXR1cm4gJmRhdGFiYXNlXzsKKyAgfQorICB2aXJ0dWFsIGJvb2wgQWRkVG9EYXRhYmFzZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKSB7CisgICAgcmV0dXJuIGRhdGFiYXNlXy5BZGQoZmlsZSk7CisgIH0KKworIHByaXZhdGU6CisgIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSBkYXRhYmFzZV87Cit9OworCisvLyBTcGVjaWFsaXphdGlvbiBmb3IgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZS4KK2NsYXNzIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSB7CisgcHVibGljOgorICBzdGF0aWMgRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2UqIE5ldygpIHsKKyAgICByZXR1cm4gbmV3IEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZTsKKyAgfQorCisgIHZpcnR1YWwgfkVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSgpIHt9CisKKyAgdmlydHVhbCBEZXNjcmlwdG9yRGF0YWJhc2UqIEdldERhdGFiYXNlKCkgeworICAgIHJldHVybiAmZGF0YWJhc2VfOworICB9CisgIHZpcnR1YWwgYm9vbCBBZGRUb0RhdGFiYXNlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUpIHsKKyAgICBzdHJpbmcgZGF0YTsKKyAgICBmaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgICByZXR1cm4gZGF0YWJhc2VfLkFkZENvcHkoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSBkYXRhYmFzZV87Cit9OworCisvLyBTcGVjaWFsaXphdGlvbiBmb3IgRGVzY3JpcHRvclBvb2xEYXRhYmFzZS4KK2NsYXNzIERlc2NyaXB0b3JQb29sRGF0YWJhc2VUZXN0Q2FzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSB7CisgcHVibGljOgorICBzdGF0aWMgRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2UqIE5ldygpIHsKKyAgICByZXR1cm4gbmV3IEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sRGF0YWJhc2VUZXN0Q2FzZSgpIDogZGF0YWJhc2VfKHBvb2xfKSB7fQorICB2aXJ0dWFsIH5EZXNjcmlwdG9yUG9vbERhdGFiYXNlVGVzdENhc2UoKSB7fQorCisgIHZpcnR1YWwgRGVzY3JpcHRvckRhdGFiYXNlKiBHZXREYXRhYmFzZSgpIHsKKyAgICByZXR1cm4gJmRhdGFiYXNlXzsKKyAgfQorICB2aXJ0dWFsIGJvb2wgQWRkVG9EYXRhYmFzZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKSB7CisgICAgcmV0dXJuIHBvb2xfLkJ1aWxkRmlsZShmaWxlKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisgIERlc2NyaXB0b3JQb29sRGF0YWJhc2UgZGF0YWJhc2VfOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0CisgICAgOiBwdWJsaWMgdGVzdGluZzo6VGVzdFdpdGhQYXJhbTxEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZUZhY3RvcnkqPiB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgdGVzdF9jYXNlXy5yZXNldChHZXRQYXJhbSgpKCkpOworICAgIGRhdGFiYXNlXyA9IHRlc3RfY2FzZV8tPkdldERhdGFiYXNlKCk7CisgIH0KKworICB2b2lkIEFkZFRvRGF0YWJhc2UoY29uc3QgY2hhciogZmlsZV9kZXNjcmlwdG9yX3RleHQpIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgICAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKGZpbGVfZGVzY3JpcHRvcl90ZXh0LCAmZmlsZV9wcm90bykpOworICAgIEVYUEVDVF9UUlVFKHRlc3RfY2FzZV8tPkFkZFRvRGF0YWJhc2UoZmlsZV9wcm90bykpOworICB9CisKKyAgdm9pZCBBZGRUb0RhdGFiYXNlV2l0aEVycm9yKGNvbnN0IGNoYXIqIGZpbGVfZGVzY3JpcHRvcl90ZXh0KSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhmaWxlX2Rlc2NyaXB0b3JfdGV4dCwgJmZpbGVfcHJvdG8pKTsKKyAgICBFWFBFQ1RfRkFMU0UodGVzdF9jYXNlXy0+QWRkVG9EYXRhYmFzZShmaWxlX3Byb3RvKSk7CisgIH0KKworICBzY29wZWRfcHRyPERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlPiB0ZXN0X2Nhc2VfOworICBEZXNjcmlwdG9yRGF0YWJhc2UqIGRhdGFiYXNlXzsKK307CisKK1RFU1RfUChEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kRmlsZUJ5TmFtZSkgeworICBBZGRUb0RhdGFiYXNlKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkZvb1wiIH0iKTsKKyAgQWRkVG9EYXRhYmFzZSgKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6XCJCYXJcIiB9Iik7CisKKyAgeworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRm9vIik7CisgIH0KKworICB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVCeU5hbWUoImJhci5wcm90byIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJCYXIiKTsKKyAgfQorCisgIHsKKyAgICAvLyBGYWlscyB0byBmaW5kIHVuZGVmaW5lZCBmaWxlcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKGRhdGFiYXNlXy0+RmluZEZpbGVCeU5hbWUoImJhei5wcm90byIsICZmaWxlKSk7CisgIH0KK30KKworVEVTVF9QKERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCkgeworICBBZGRUb0RhdGFiYXNlKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiRm9vXCIgIgorICAgICIgIGZpZWxkIHsgbmFtZTpcInF1eFwiIH0iCisgICAgIiAgbmVzdGVkX3R5cGUgeyBuYW1lOiBcIkdyYXVsdFwiIH0gIgorICAgICIgIGVudW1fdHlwZSB7IG5hbWU6IFwiR2FycGx5XCIgfSAiCisgICAgIn0gIgorICAgICJlbnVtX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJXYWxkb1wiICIKKyAgICAiICB2YWx1ZSB7IG5hbWU6XCJGUkVEXCIgfSAiCisgICAgIn0gIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcInBsdWdoXCIgfSAiCisgICAgInNlcnZpY2UgeyAiCisgICAgIiAgbmFtZTogXCJYeXp6eVwiICIKKyAgICAiICBtZXRob2QgeyBuYW1lOiBcIlRodWRcIiB9ICIKKyAgICAifSIKKyAgICApOworICBBZGRUb0RhdGFiYXNlKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAicGFja2FnZTogXCJjb3JnZVwiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXJcIiB9Iik7CisKKyAgeworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiRm9vIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBmaWVsZHMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGb28ucXV4IiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBuZXN0ZWQgdHlwZXMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGb28uR3JhdWx0IiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBuZXN0ZWQgZW51bXMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGb28uR2FycGx5IiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBlbnVtIHR5cGVzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiV2FsZG8iLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIC8vIENhbiBmaW5kIGVudW0gdmFsdWVzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiV2FsZG8uRlJFRCIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgZXh0ZW5zaW9ucy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woInBsdWdoIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBzZXJ2aWNlcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIlh5enp5IiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBtZXRob2RzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiWHl6enkuVGh1ZCIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgdGhpbmdzIGluIHBhY2thZ2VzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiY29yZ2UuQmFyIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBGYWlscyB0byBmaW5kIHVuZGVmaW5lZCBzeW1ib2xzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkJheiIsICZmaWxlKSk7CisgIH0KKworICB7CisgICAgLy8gTmFtZXMgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9GQUxTRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiQmFyIiwgJmZpbGUpKTsKKyAgfQorfQorCitURVNUX1AoRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKSB7CisgIEFkZFRvRGF0YWJhc2UoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAwIH0gIgorICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJxdXhcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjUgIgorICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiBcIi5Gb29cIiB9IgorICAgICJ9Iik7CisgIEFkZFRvRGF0YWJhc2UoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcImNvcmdlXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiQmFyXCIgIgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwMCB9ICIKKyAgICAifSAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJncmF1bHRcIiBleHRlbmRlZTogXCIuRm9vXCIgICAgICAgbnVtYmVyOjMyIH0gIgorICAgICJleHRlbnNpb24geyBuYW1lOlwiZ2FycGx5XCIgZXh0ZW5kZWU6IFwiLmNvcmdlLkJhclwiIG51bWJlcjo3MCB9ICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcIndhbGRvXCIgIGV4dGVuZGVlOiBcIkJhclwiICAgICAgICBudW1iZXI6NTYgfSAiKTsKKworICB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJGb28iLCA1LCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICB9CisKKyAgeworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiRm9vIiwgMzIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgZXh0ZW5zaW9ucyBmb3IgcXVhbGlmaWVkIHR5cGUgbmFtZXMuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJjb3JnZS5CYXIiLCA3MCwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIGV4dGVuc2lvbnMgd2hvc2UgZXh0ZW5kZWUgd2FzIG5vdCBmdWxseS1xdWFsaWZpZWQgaW4gdGhlCisgICAgLy8gRmlsZURlc2NyaXB0b3JQcm90by4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJCYXIiLCA1NiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRkFMU0UoCisgICAgICAgIGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJjb3JnZS5CYXIiLCA1NiwgJmZpbGUpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIG5vbi1leGlzdGVudCBleHRlbnNpb24gbnVtYmVycy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJGb28iLCAxMiwgJmZpbGUpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIGV4dGVuc2lvbnMgZm9yIG5vbi1leGlzdGVudCB0eXBlcy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKAorICAgICAgICBkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiTm9TdWNoVHlwZSIsIDUsICZmaWxlKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuJ3QgZmluZCBleHRlbnNpb25zIGZvciB1bnF1YWxpZmllZCB0eXBlIG5hbWVzLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJhciIsIDcwLCAmZmlsZSkpOworICB9Cit9CisKK1RFU1RfUChEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycykgeworICBBZGRUb0RhdGFiYXNlKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiRm9vXCIgIgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwMCB9ICIKKyAgICAiICBleHRlbnNpb24geyBuYW1lOlwicXV4XCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjo1ICIKKyAgICAiICAgICAgICAgICAgICBleHRlbmRlZTogXCIuRm9vXCIgfSIKKyAgICAifSIpOworICBBZGRUb0RhdGFiYXNlKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAicGFja2FnZTogXCJjb3JnZVwiICIKKyAgICAiZGVwZW5kZW5jeTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAiICBuYW1lOiBcIkJhclwiICIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMDAgfSAiCisgICAgIn0gIgorICAgICJleHRlbnNpb24geyBuYW1lOlwiZ3JhdWx0XCIgZXh0ZW5kZWU6IFwiLkZvb1wiICAgICAgIG51bWJlcjozMiB9ICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImdhcnBseVwiIGV4dGVuZGVlOiBcIi5jb3JnZS5CYXJcIiBudW1iZXI6NzAgfSAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJ3YWxkb1wiICBleHRlbmRlZTogXCJCYXJcIiAgICAgICAgbnVtYmVyOjU2IH0gIik7CisKKyAgeworICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7CisgICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygiRm9vIiwgJm51bWJlcnMpKTsKKyAgICBBU1NFUlRfRVEoMiwgbnVtYmVycy5zaXplKCkpOworICAgIHNvcnQobnVtYmVycy5iZWdpbigpLCBudW1iZXJzLmVuZCgpKTsKKyAgICBFWFBFQ1RfRVEoNSwgbnVtYmVyc1swXSk7CisgICAgRVhQRUNUX0VRKDMyLCBudW1iZXJzWzFdKTsKKyAgfQorCisgIHsKKyAgICB2ZWN0b3I8aW50PiBudW1iZXJzOworICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoImNvcmdlLkJhciIsICZudW1iZXJzKSk7CisgICAgLy8gTm90ZTogd29uJ3QgZmluZCBleHRlbnNpb24gNTYgZHVlIHRvIHRoZSBuYW1lIG5vdCBiZWluZyBmdWxseSBxdWFsaWZpZWQuCisgICAgQVNTRVJUX0VRKDEsIG51bWJlcnMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoNzAsIG51bWJlcnNbMF0pOworICB9CisKKyAgeworICAgIC8vIENhbid0IGZpbmQgZXh0ZW5zaW9ucyBmb3Igbm9uLWV4aXN0ZW50IHR5cGVzLgorICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7CisgICAgRVhQRUNUX0ZBTFNFKGRhdGFiYXNlXy0+RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIk5vU3VjaFR5cGUiLCAmbnVtYmVycykpOworICB9CisKKyAgeworICAgIC8vIENhbid0IGZpbmQgZXh0ZW5zaW9ucyBmb3IgdW5xdWFsaWZpZWQgdHlwZXMuCisgICAgdmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygiQmFyIiwgJm51bWJlcnMpKTsKKyAgfQorfQorCitURVNUX1AoRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgQ29uZmxpY3RpbmdGaWxlRXJyb3IpIHsKKyAgQWRkVG9EYXRhYmFzZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAiICBuYW1lOiBcIkZvb1wiICIKKyAgICAifSIpOworICBBZGRUb0RhdGFiYXNlV2l0aEVycm9yKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiQmFyXCIgIgorICAgICJ9Iik7Cit9CisKK1RFU1RfUChEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBDb25mbGljdGluZ1R5cGVFcnJvcikgeworICBBZGRUb0RhdGFiYXNlKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiRm9vXCIgIgorICAgICJ9Iik7CisgIEFkZFRvRGF0YWJhc2VXaXRoRXJyb3IoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgIn0iKTsKK30KKworVEVTVF9QKERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIENvbmZsaWN0aW5nRXh0ZW5zaW9uRXJyb3IpIHsKKyAgQWRkVG9EYXRhYmFzZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjUgIgorICAgICIgICAgICAgICAgICBleHRlbmRlZTogXCIuRm9vXCIgfSIpOworICBBZGRUb0RhdGFiYXNlV2l0aEVycm9yKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImJhclwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6NSAiCisgICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcIi5Gb29cIiB9Iik7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFNpbXBsZSwgRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwKKyAgICB0ZXN0aW5nOjpWYWx1ZXMoJlNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlOjpOZXcpKTsKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1lbW9yeUNvbnNlcnZpbmcsIERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsCisgICAgdGVzdGluZzo6VmFsdWVzKCZFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2U6Ok5ldykpOworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUG9vbCwgRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwKKyAgICB0ZXN0aW5nOjpWYWx1ZXMoJkRlc2NyaXB0b3JQb29sRGF0YWJhc2VUZXN0Q2FzZTo6TmV3KSk7CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX1BBUkFNX1RFU1QKKworVEVTVChFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlRXh0cmFUZXN0LCBGaW5kTmFtZU9mRmlsZUNvbnRhaW5pbmdTeW1ib2wpIHsKKyAgLy8gQ3JlYXRlIHR3byBmaWxlcywgb25lIG9mIHdoaWNoIGlzIGluIHR3byBwYXJ0cy4KKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlMSwgZmlsZTJhLCBmaWxlMmI7CisgIGZpbGUxLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgZmlsZTEuc2V0X3BhY2thZ2UoImZvbyIpOworICBmaWxlMS5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJGb28iKTsKKyAgZmlsZTJhLnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgZmlsZTJiLnNldF9wYWNrYWdlKCJiYXIiKTsKKyAgZmlsZTJiLmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkJhciIpOworCisgIC8vIE5vcm1hbCBzZXJpYWxpemF0aW9uIGFsbG93cyBvdXIgb3B0aW1pemF0aW9uIHRvIGtpY2sgaW4uCisgIHN0cmluZyBkYXRhMSA9IGZpbGUxLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisKKyAgLy8gRm9yY2Ugb3V0LW9mLW9yZGVyIHNlcmlhbGl6YXRpb24gdG8gdGVzdCBzbG93IHBhdGguCisgIHN0cmluZyBkYXRhMiA9IGZpbGUyYi5TZXJpYWxpemVBc1N0cmluZygpICsgZmlsZTJhLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisKKyAgLy8gQ3JlYXRlIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UgY29udGFpbmluZyBib3RoIGZpbGVzLgorICBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlIGRiOworICBkYi5BZGQoZGF0YTEuZGF0YSgpLCBkYXRhMS5zaXplKCkpOworICBkYi5BZGQoZGF0YTIuZGF0YSgpLCBkYXRhMi5zaXplKCkpOworCisgIC8vIFRlc3QhCisgIHN0cmluZyBmaWxlbmFtZTsKKyAgRVhQRUNUX1RSVUUoZGIuRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKCJmb28uRm9vIiwgJmZpbGVuYW1lKSk7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZW5hbWUpOworICBFWFBFQ1RfVFJVRShkYi5GaW5kTmFtZU9mRmlsZUNvbnRhaW5pbmdTeW1ib2woImZvby5Gb28uQmxhaCIsICZmaWxlbmFtZSkpOworICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGVuYW1lKTsKKyAgRVhQRUNUX1RSVUUoZGIuRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKCJiYXIuQmFyIiwgJmZpbGVuYW1lKSk7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZmlsZW5hbWUpOworICBFWFBFQ1RfRkFMU0UoZGIuRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKCJmb28iLCAmZmlsZW5hbWUpKTsKKyAgRVhQRUNUX0ZBTFNFKGRiLkZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCgiYmFyIiwgJmZpbGVuYW1lKSk7CisgIEVYUEVDVF9GQUxTRShkYi5GaW5kTmFtZU9mRmlsZUNvbnRhaW5pbmdTeW1ib2woImJhei5CYXoiLCAmZmlsZW5hbWUpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlVGVzdCgpCisgICAgOiBmb3J3YXJkX21lcmdlZF8oJmRhdGFiYXNlMV8sICZkYXRhYmFzZTJfKSwKKyAgICAgIHJldmVyc2VfbWVyZ2VkXygmZGF0YWJhc2UyXywgJmRhdGFiYXNlMV8pIHt9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIEFkZFRvRGF0YWJhc2UoJmRhdGFiYXNlMV8sCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkZvb1wiIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwIH0gfSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImZvb19leHRcIiBleHRlbmRlZTogXCIuRm9vXCIgbnVtYmVyOjMgIgorICAgICAgIiAgICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9ICIpOworICAgIEFkZFRvRGF0YWJhc2UoJmRhdGFiYXNlMl8sCisgICAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkJhclwiIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwIH0gfSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImJhcl9leHRcIiBleHRlbmRlZTogXCIuQmFyXCIgbnVtYmVyOjUgIgorICAgICAgIiAgICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9ICIpOworCisgICAgLy8gYmF6LnByb3RvIGV4aXN0cyBpbiBib3RoIHBvb2xzLCB3aXRoIGRpZmZlcmVudCBkZWZpbml0aW9ucy4KKyAgICBBZGRUb0RhdGFiYXNlKCZkYXRhYmFzZTFfLAorICAgICAgIm5hbWU6IFwiYmF6LnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6XCJCYXpcIiBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMCB9IH0gIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6XCJGcm9tUG9vbDFcIiB9ICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOlwiYmF6X2V4dFwiIGV4dGVuZGVlOiBcIi5CYXpcIiBudW1iZXI6MTIgIgorICAgICAgIiAgICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9ICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOlwiZGF0YWJhc2UxX29ubHlfZXh0XCIgZXh0ZW5kZWU6IFwiLkJhelwiIG51bWJlcjoxMyAiCisgICAgICAiICAgICAgICAgICAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0gIik7CisgICAgQWRkVG9EYXRhYmFzZSgmZGF0YWJhc2UyXywKKyAgICAgICJuYW1lOiBcImJhei5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOlwiQmF6XCIgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAgfSB9ICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOlwiRnJvbVBvb2wyXCIgfSAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImJhel9leHRcIiBleHRlbmRlZTogXCIuQmF6XCIgbnVtYmVyOjEyICIKKyAgICAgICIgICAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiKTsKKyAgfQorCisgIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSBkYXRhYmFzZTFfOworICBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UgZGF0YWJhc2UyXzsKKworICBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UgZm9yd2FyZF9tZXJnZWRfOworICBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UgcmV2ZXJzZV9tZXJnZWRfOworfTsKKworVEVTVF9GKE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIEZpbmRGaWxlQnlOYW1lKSB7CisgIHsKKyAgICAvLyBDYW4gZmluZCBmaWxlIHRoYXQgaXMgb25seSBpbiBkYXRhYmFzZTFfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGb28iKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBmaWxlIHRoYXQgaXMgb25seSBpbiBkYXRhYmFzZTJfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVCeU5hbWUoImJhci5wcm90byIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJCYXIiKTsKKyAgfQorCisgIHsKKyAgICAvLyBJbiBmb3J3YXJkX21lcmdlZF8sIGRhdGFiYXNlMV8ncyBiYXoucHJvdG8gdGFrZXMgcHJlY2VkZW5jZS4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQnlOYW1lKCJiYXoucHJvdG8iLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRnJvbVBvb2wxIik7CisgIH0KKworICB7CisgICAgLy8gSW4gcmV2ZXJzZV9tZXJnZWRfLCBkYXRhYmFzZTJfJ3MgYmF6LnByb3RvIHRha2VzIHByZWNlZGVuY2UuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKHJldmVyc2VfbWVyZ2VkXy5GaW5kRmlsZUJ5TmFtZSgiYmF6LnByb3RvIiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhei5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkZyb21Qb29sMiIpOworICB9CisKKyAgeworICAgIC8vIENhbid0IGZpbmQgbm9uLWV4aXN0ZW50IGZpbGUuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9GQUxTRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVCeU5hbWUoIm5vX3N1Y2gucHJvdG8iLCAmZmlsZSkpOworICB9Cit9CisKK1RFU1RfRihNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2wpIHsKKyAgeworICAgIC8vIENhbiBmaW5kIGZpbGUgdGhhdCBpcyBvbmx5IGluIGRhdGFiYXNlMV8uCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvbyIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGb28iKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4gZmluZCBmaWxlIHRoYXQgaXMgb25seSBpbiBkYXRhYmFzZTJfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJCYXIiLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiQmFyIik7CisgIH0KKworICB7CisgICAgLy8gSW4gZm9yd2FyZF9tZXJnZWRfLCBkYXRhYmFzZTFfJ3MgYmF6LnByb3RvIHRha2VzIHByZWNlZGVuY2UuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkJheiIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGcm9tUG9vbDEiKTsKKyAgfQorCisgIHsKKyAgICAvLyBJbiByZXZlcnNlX21lcmdlZF8sIGRhdGFiYXNlMl8ncyBiYXoucHJvdG8gdGFrZXMgcHJlY2VkZW5jZS4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUocmV2ZXJzZV9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiQmF6IiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhei5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkZyb21Qb29sMiIpOworICB9CisKKyAgeworICAgIC8vIEZyb21Qb29sMSBvbmx5IHNob3dzIHVwIGluIGZvcndhcmRfbWVyZ2VkXyBiZWNhdXNlIGl0IGlzIG1hc2tlZCBieQorICAgIC8vIGRhdGFiYXNlMl8ncyBiYXoucHJvdG8gaW4gcmV2ZXJzZV9tZXJnZWRfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGcm9tUG9vbDEiLCAmZmlsZSkpOworICAgIEVYUEVDVF9GQUxTRShyZXZlcnNlX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGcm9tUG9vbDEiLCAmZmlsZSkpOworICB9CisKKyAgeworICAgIC8vIENhbid0IGZpbmQgbm9uLWV4aXN0ZW50IHN5bWJvbC4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX0ZBTFNFKAorICAgICAgZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiTm9TdWNoVHlwZSIsICZmaWxlKSk7CisgIH0KK30KKworVEVTVF9GKE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbikgeworICB7CisgICAgLy8gQ2FuIGZpbmQgZmlsZSB0aGF0IGlzIG9ubHkgaW4gZGF0YWJhc2UxXy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICBmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJGb28iLCAzLCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRm9vIik7CisgIH0KKworICB7CisgICAgLy8gQ2FuIGZpbmQgZmlsZSB0aGF0IGlzIG9ubHkgaW4gZGF0YWJhc2UyXy4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICBmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJCYXIiLCA1LCAmZmlsZSkpOworICAgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZmlsZS5uYW1lKCkpOworICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiQmFyIik7CisgIH0KKworICB7CisgICAgLy8gSW4gZm9yd2FyZF9tZXJnZWRfLCBkYXRhYmFzZTFfJ3MgYmF6LnByb3RvIHRha2VzIHByZWNlZGVuY2UuCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOworICAgIEVYUEVDVF9UUlVFKAorICAgICAgZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiQmF6IiwgMTIsICZmaWxlKSk7CisgICAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBmaWxlLm5hbWUoKSk7CisgICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGcm9tUG9vbDEiKTsKKyAgfQorCisgIHsKKyAgICAvLyBJbiByZXZlcnNlX21lcmdlZF8sIGRhdGFiYXNlMl8ncyBiYXoucHJvdG8gdGFrZXMgcHJlY2VkZW5jZS4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICByZXZlcnNlX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJCYXoiLCAxMiwgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRVEoImJhei5wcm90byIsIGZpbGUubmFtZSgpKTsKKyAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkZyb21Qb29sMiIpOworICB9CisKKyAgeworICAgIC8vIEJheidzIGV4dGVuc2lvbiAxMyBvbmx5IHNob3dzIHVwIGluIGZvcndhcmRfbWVyZ2VkXyBiZWNhdXNlIGl0IGlzCisgICAgLy8gbWFza2VkIGJ5IGRhdGFiYXNlMl8ncyBiYXoucHJvdG8gaW4gcmV2ZXJzZV9tZXJnZWRfLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJCYXoiLCAxMywgJmZpbGUpKTsKKyAgICBFWFBFQ1RfRkFMU0UocmV2ZXJzZV9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiQmF6IiwgMTMsICZmaWxlKSk7CisgIH0KKworICB7CisgICAgLy8gQ2FuJ3QgZmluZCBub24tZXhpc3RlbnQgZXh0ZW5zaW9uLgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgICBFWFBFQ1RfRkFMU0UoCisgICAgICBmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJGb28iLCA2LCAmZmlsZSkpOworICB9Cit9CisKK1RFU1RfRihNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycykgeworICB7CisgICAgLy8gTWVzc2FnZSBvbmx5IGhhcyBleHRlbnNpb24gaW4gZGF0YWJhc2UxXworICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7CisgICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJGb28iLCAmbnVtYmVycykpOworICAgIEFTU0VSVF9FUSgxLCBudW1iZXJzLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDMsIG51bWJlcnNbMF0pOworICB9CisKKyAgeworICAgIC8vIE1lc3NhZ2Ugb25seSBoYXMgZXh0ZW5zaW9uIGluIGRhdGFiYXNlMl8KKyAgICB2ZWN0b3I8aW50PiBudW1iZXJzOworICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygiQmFyIiwgJm51bWJlcnMpKTsKKyAgICBBU1NFUlRfRVEoMSwgbnVtYmVycy5zaXplKCkpOworICAgIEVYUEVDVF9FUSg1LCBudW1iZXJzWzBdKTsKKyAgfQorCisgIHsKKyAgICAvLyBNZXJnZSByZXN1bHRzIGZyb20gdGhlIHR3byBkYXRhYmFzZXMuCisgICAgdmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkJheiIsICZudW1iZXJzKSk7CisgICAgQVNTRVJUX0VRKDIsIG51bWJlcnMuc2l6ZSgpKTsKKyAgICBzb3J0KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSk7CisgICAgRVhQRUNUX0VRKDEyLCBudW1iZXJzWzBdKTsKKyAgICBFWFBFQ1RfRVEoMTMsIG51bWJlcnNbMV0pOworICB9CisKKyAgeworICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7CisgICAgRVhQRUNUX1RSVUUocmV2ZXJzZV9tZXJnZWRfLkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJCYXoiLCAmbnVtYmVycykpOworICAgIEFTU0VSVF9FUSgyLCBudW1iZXJzLnNpemUoKSk7CisgICAgc29ydChudW1iZXJzLmJlZ2luKCksIG51bWJlcnMuZW5kKCkpOworICAgIEVYUEVDVF9FUSgxMiwgbnVtYmVyc1swXSk7CisgICAgRVhQRUNUX0VRKDEzLCBudW1iZXJzWzFdKTsKKyAgfQorCisgIHsKKyAgICAvLyBDYW4ndCBmaW5kIGV4dGVuc2lvbnMgZm9yIGEgbm9uLWV4aXN0ZW50IG1lc3NhZ2UuCisgICAgdmVjdG9yPGludD4gbnVtYmVyczsKKyAgICBFWFBFQ1RfRkFMU0UocmV2ZXJzZV9tZXJnZWRfLkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJCbGFoIiwgJm51bWJlcnMpKTsKKyAgfQorfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YWViZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNDAzNCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIG1ha2VzIGV4dGVuc2l2ZSB1c2Ugb2YgUkZDIDMwOTIuICA6KQorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBDYW4ndCB1c2UgYW4gYW5vbnltb3VzIG5hbWVzcGFjZSBoZXJlIGR1ZSB0byBicm9rZW5uZXNzIG9mIFRydTY0IGNvbXBpbGVyLgorbmFtZXNwYWNlIGRlc2NyaXB0b3JfdW5pdHRlc3QgeworCisvLyBTb21lIGhlbHBlcnMgdG8gbWFrZSBhc3NlbWJsaW5nIGRlc2NyaXB0b3JzIGZhc3Rlci4KK0Rlc2NyaXB0b3JQcm90byogQWRkTWVzc2FnZShGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgRGVzY3JpcHRvclByb3RvKiByZXN1bHQgPSBmaWxlLT5hZGRfbWVzc2FnZV90eXBlKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0Rlc2NyaXB0b3JQcm90byogQWRkTmVzdGVkTWVzc2FnZShEZXNjcmlwdG9yUHJvdG8qIHBhcmVudCwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIERlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gcGFyZW50LT5hZGRfbmVzdGVkX3R5cGUoKTsKKyAgcmVzdWx0LT5zZXRfbmFtZShuYW1lKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworRW51bURlc2NyaXB0b3JQcm90byogQWRkRW51bShGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgRW51bURlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gZmlsZS0+YWRkX2VudW1fdHlwZSgpOworICByZXN1bHQtPnNldF9uYW1lKG5hbWUpOworICByZXR1cm4gcmVzdWx0OworfQorCitFbnVtRGVzY3JpcHRvclByb3RvKiBBZGROZXN0ZWRFbnVtKERlc2NyaXB0b3JQcm90byogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgRW51bURlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gcGFyZW50LT5hZGRfZW51bV90eXBlKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK1NlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIEFkZFNlcnZpY2UoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IGZpbGUtPmFkZF9zZXJ2aWNlKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0ZpZWxkRGVzY3JpcHRvclByb3RvKiBBZGRGaWVsZChEZXNjcmlwdG9yUHJvdG8qIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsIGxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlIHR5cGUpIHsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IHBhcmVudC0+YWRkX2ZpZWxkKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJlc3VsdC0+c2V0X251bWJlcihudW1iZXIpOworICByZXN1bHQtPnNldF9sYWJlbChsYWJlbCk7CisgIHJlc3VsdC0+c2V0X3R5cGUodHlwZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0ZpZWxkRGVzY3JpcHRvclByb3RvKiBBZGRFeHRlbnNpb24oRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBleHRlbmRlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLCBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWwgbGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlIHR5cGUpIHsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IGZpbGUtPmFkZF9leHRlbnNpb24oKTsKKyAgcmVzdWx0LT5zZXRfbmFtZShuYW1lKTsKKyAgcmVzdWx0LT5zZXRfbnVtYmVyKG51bWJlcik7CisgIHJlc3VsdC0+c2V0X2xhYmVsKGxhYmVsKTsKKyAgcmVzdWx0LT5zZXRfdHlwZSh0eXBlKTsKKyAgcmVzdWx0LT5zZXRfZXh0ZW5kZWUoZXh0ZW5kZWUpOworICByZXR1cm4gcmVzdWx0OworfQorCitGaWVsZERlc2NyaXB0b3JQcm90byogQWRkTmVzdGVkRXh0ZW5zaW9uKERlc2NyaXB0b3JQcm90byogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGV4dGVuZGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbCBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUgdHlwZSkgeworICBGaWVsZERlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gcGFyZW50LT5hZGRfZXh0ZW5zaW9uKCk7CisgIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7CisgIHJlc3VsdC0+c2V0X251bWJlcihudW1iZXIpOworICByZXN1bHQtPnNldF9sYWJlbChsYWJlbCk7CisgIHJlc3VsdC0+c2V0X3R5cGUodHlwZSk7CisgIHJlc3VsdC0+c2V0X2V4dGVuZGVlKGV4dGVuZGVlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSogQWRkRXh0ZW5zaW9uUmFuZ2UoRGVzY3JpcHRvclByb3RvKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSogcmVzdWx0ID0gcGFyZW50LT5hZGRfZXh0ZW5zaW9uX3JhbmdlKCk7CisgIHJlc3VsdC0+c2V0X3N0YXJ0KHN0YXJ0KTsKKyAgcmVzdWx0LT5zZXRfZW5kKGVuZCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0VudW1WYWx1ZURlc2NyaXB0b3JQcm90byogQWRkRW51bVZhbHVlKEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGludCBudW1iZXIpIHsKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiByZXN1bHQgPSBlbnVtX3Byb3RvLT5hZGRfdmFsdWUoKTsKKyAgcmVzdWx0LT5zZXRfbmFtZShuYW1lKTsKKyAgcmVzdWx0LT5zZXRfbnVtYmVyKG51bWJlcik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK01ldGhvZERlc2NyaXB0b3JQcm90byogQWRkTWV0aG9kKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGlucHV0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG91dHB1dF90eXBlKSB7CisgIE1ldGhvZERlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gc2VydmljZS0+YWRkX21ldGhvZCgpOworICByZXN1bHQtPnNldF9uYW1lKG5hbWUpOworICByZXN1bHQtPnNldF9pbnB1dF90eXBlKGlucHV0X3R5cGUpOworICByZXN1bHQtPnNldF9vdXRwdXRfdHlwZShvdXRwdXRfdHlwZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEVtcHR5IGVudW1zIHRlY2huaWNhbGx5IGFyZW4ndCBhbGxvd2VkLiAgV2UgbmVlZCB0byBpbnNlcnQgYSBkdW1teSB2YWx1ZQorLy8gaW50byB0aGVtLgordm9pZCBBZGRFbXB0eUVudW0oRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIEFkZEVudW1WYWx1ZShBZGRFbnVtKGZpbGUsIG5hbWUpLCBuYW1lICsgIl9EVU1NWSIsIDEpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRlc3Qgc2ltcGxlIGZpbGVzLgorY2xhc3MgRmlsZURlc2NyaXB0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIC8vIEJ1aWxkIGRlc2NyaXB0b3JzIGZvciB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zOgorICAgIC8vCisgICAgLy8gICAvLyBpbiAiZm9vLnByb3RvIgorICAgIC8vICAgbWVzc2FnZSBGb29NZXNzYWdlIHsgZXh0ZW5zaW9ucyAxOyB9CisgICAgLy8gICBlbnVtIEZvb0VudW0ge0ZPT19FTlVNX1ZBTFVFID0gMTt9CisgICAgLy8gICBzZXJ2aWNlIEZvb1NlcnZpY2Uge30KKyAgICAvLyAgIGV4dGVuZCBGb29NZXNzYWdlIHsgb3B0aW9uYWwgaW50MzIgZm9vX2V4dGVuc2lvbiA9IDE7IH0KKyAgICAvLworICAgIC8vICAgLy8gaW4gImJhci5wcm90byIKKyAgICAvLyAgIHBhY2thZ2UgYmFyX3BhY2thZ2U7CisgICAgLy8gICBtZXNzYWdlIEJhck1lc3NhZ2UgeyBleHRlbnNpb25zIDE7IH0KKyAgICAvLyAgIGVudW0gQmFyRW51bSB7QkFSX0VOVU1fVkFMVUUgPSAxO30KKyAgICAvLyAgIHNlcnZpY2UgQmFyU2VydmljZSB7fQorICAgIC8vICAgZXh0ZW5kIEJhck1lc3NhZ2UgeyBvcHRpb25hbCBpbnQzMiBiYXJfZXh0ZW5zaW9uID0gMTsgfQorICAgIC8vCisgICAgLy8gQWxzbywgd2UgaGF2ZSBhbiBlbXB0eSBmaWxlICJiYXoucHJvdG8iLiAgVGhpcyBmaWxlJ3MgcHVycG9zZSBpcyB0bworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGV2ZW4gdGhvdWdoIGl0IGhhcyB0aGUgc2FtZSBwYWNrYWdlIGFzIGZvby5wcm90bywKKyAgICAvLyBzZWFyY2hpbmcgaXQgZm9yIG1lbWJlcnMgb2YgZm9vLnByb3RvIHdvbid0IHdvcmsuCisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlOworICAgIGZvb19maWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgICBBZGRFeHRlbnNpb25SYW5nZShBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkZvb01lc3NhZ2UiKSwgMSwgMik7CisgICAgQWRkRW51bVZhbHVlKEFkZEVudW0oJmZvb19maWxlLCAiRm9vRW51bSIpLCAiRk9PX0VOVU1fVkFMVUUiLCAxKTsKKyAgICBBZGRTZXJ2aWNlKCZmb29fZmlsZSwgIkZvb1NlcnZpY2UiKTsKKyAgICBBZGRFeHRlbnNpb24oJmZvb19maWxlLCAiRm9vTWVzc2FnZSIsICJmb29fZXh0ZW5zaW9uIiwgMSwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhcl9maWxlOworICAgIGJhcl9maWxlLnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgICBiYXJfZmlsZS5zZXRfcGFja2FnZSgiYmFyX3BhY2thZ2UiKTsKKyAgICBiYXJfZmlsZS5hZGRfZGVwZW5kZW5jeSgiZm9vLnByb3RvIik7CisgICAgQWRkRXh0ZW5zaW9uUmFuZ2UoQWRkTWVzc2FnZSgmYmFyX2ZpbGUsICJCYXJNZXNzYWdlIiksIDEsIDIpOworICAgIEFkZEVudW1WYWx1ZShBZGRFbnVtKCZiYXJfZmlsZSwgIkJhckVudW0iKSwgIkJBUl9FTlVNX1ZBTFVFIiwgMSk7CisgICAgQWRkU2VydmljZSgmYmFyX2ZpbGUsICJCYXJTZXJ2aWNlIik7CisgICAgQWRkRXh0ZW5zaW9uKCZiYXJfZmlsZSwgImJhcl9wYWNrYWdlLkJhck1lc3NhZ2UiLCAiYmFyX2V4dGVuc2lvbiIsIDEsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXpfZmlsZTsKKyAgICBiYXpfZmlsZS5zZXRfbmFtZSgiYmF6LnByb3RvIik7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKKyAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7CisKKyAgICBiYXJfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmFyX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGJhcl9maWxlXyAhPSBOVUxMKTsKKworICAgIGJhel9maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShiYXpfZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoYmF6X2ZpbGVfICE9IE5VTEwpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGZvb19tZXNzYWdlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDApOworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBmb29fZW51bV8gPSBmb29fZmlsZV8tPmVudW1fdHlwZSgwKTsKKyAgICBBU1NFUlRfRVEoMSwgZm9vX2VudW1fLT52YWx1ZV9jb3VudCgpKTsKKyAgICBmb29fZW51bV92YWx1ZV8gPSBmb29fZW51bV8tPnZhbHVlKDApOworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPnNlcnZpY2VfY291bnQoKSk7CisgICAgZm9vX3NlcnZpY2VfID0gZm9vX2ZpbGVfLT5zZXJ2aWNlKDApOworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgICBmb29fZXh0ZW5zaW9uXyA9IGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApOworCisgICAgQVNTRVJUX0VRKDEsIGJhcl9maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGJhcl9tZXNzYWdlXyA9IGJhcl9maWxlXy0+bWVzc2FnZV90eXBlKDApOworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBiYXJfZW51bV8gPSBiYXJfZmlsZV8tPmVudW1fdHlwZSgwKTsKKyAgICBBU1NFUlRfRVEoMSwgYmFyX2VudW1fLT52YWx1ZV9jb3VudCgpKTsKKyAgICBiYXJfZW51bV92YWx1ZV8gPSBiYXJfZW51bV8tPnZhbHVlKDApOworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPnNlcnZpY2VfY291bnQoKSk7CisgICAgYmFyX3NlcnZpY2VfID0gYmFyX2ZpbGVfLT5zZXJ2aWNlKDApOworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgICBiYXJfZXh0ZW5zaW9uXyA9IGJhcl9maWxlXy0+ZXh0ZW5zaW9uKDApOworICB9CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhcl9maWxlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhel9maWxlXzsKKworICBjb25zdCBEZXNjcmlwdG9yKiAgICAgICAgICBmb29fbWVzc2FnZV87CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiAgICAgIGZvb19lbnVtXzsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZm9vX2VudW1fdmFsdWVfOworICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogICBmb29fc2VydmljZV87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogICAgIGZvb19leHRlbnNpb25fOworCisgIGNvbnN0IERlc2NyaXB0b3IqICAgICAgICAgIGJhcl9tZXNzYWdlXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqICAgICAgYmFyX2VudW1fOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiYXJfZW51bV92YWx1ZV87CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiAgIGJhcl9zZXJ2aWNlXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiAgICAgYmFyX2V4dGVuc2lvbl87Cit9OworCitURVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBOYW1lKSB7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZm9vX2ZpbGVfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGJhcl9maWxlXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBiYXpfZmlsZV8tPm5hbWUoKSk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIFBhY2thZ2UpIHsKKyAgRVhQRUNUX0VRKCIiLCBmb29fZmlsZV8tPnBhY2thZ2UoKSk7CisgIEVYUEVDVF9FUSgiYmFyX3BhY2thZ2UiLCBiYXJfZmlsZV8tPnBhY2thZ2UoKSk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIERlcGVuZGVuY2llcykgeworICBFWFBFQ1RfRVEoMCwgZm9vX2ZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgYmFyX2ZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCkpOworICBFWFBFQ1RfRVEoZm9vX2ZpbGVfLCBiYXJfZmlsZV8tPmRlcGVuZGVuY3koMCkpOworfQorCitURVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBGaW5kTWVzc2FnZVR5cGVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb19tZXNzYWdlXywgZm9vX2ZpbGVfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvb01lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUShiYXJfbWVzc2FnZV8sIGJhcl9maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXJNZXNzYWdlIikpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXJNZXNzYWdlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhcl9maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhel9maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gTlVMTCk7CisKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIk5vU3VjaE1lc3NhZ2UiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvb0VudW0iKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgRmluZEVudW1UeXBlQnlOYW1lKSB7CisgIEVYUEVDVF9FUShmb29fZW51bV8sIGZvb19maWxlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJGb29FbnVtIikpOworICBFWFBFQ1RfRVEoYmFyX2VudW1fLCBiYXJfZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiQmFyRW51bSIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiQmFyRW51bSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShiYXJfZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9vRW51bSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShiYXpfZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9vRW51bSIpID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJOb1N1Y2hFbnVtIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEZpbmRFbnVtVmFsdWVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb19lbnVtX3ZhbHVlXywgZm9vX2ZpbGVfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJGT09fRU5VTV9WQUxVRSIpKTsKKyAgRVhQRUNUX0VRKGJhcl9lbnVtX3ZhbHVlXywgYmFyX2ZpbGVfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJCQVJfRU5VTV9WQUxVRSIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkJBUl9FTlVNX1ZBTFVFIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhcl9maWxlXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiRk9PX0VOVU1fVkFMVUUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoYmF6X2ZpbGVfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJGT09fRU5VTV9WQUxVRSIpID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiTk9fU1VDSF9WQUxVRSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkZvb01lc3NhZ2UiKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgRmluZFNlcnZpY2VCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb19zZXJ2aWNlXywgZm9vX2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiRm9vU2VydmljZSIpKTsKKyAgRVhQRUNUX0VRKGJhcl9zZXJ2aWNlXywgYmFyX2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiQmFyU2VydmljZSIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRTZXJ2aWNlQnlOYW1lKCJCYXJTZXJ2aWNlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhcl9maWxlXy0+RmluZFNlcnZpY2VCeU5hbWUoIkZvb1NlcnZpY2UiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoYmF6X2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiRm9vU2VydmljZSIpID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZFNlcnZpY2VCeU5hbWUoIk5vU3VjaFNlcnZpY2UiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiRm9vTWVzc2FnZSIpID09IE5VTEwpOworfQorCitURVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBGaW5kRXh0ZW5zaW9uQnlOYW1lKSB7CisgIEVYUEVDVF9FUShmb29fZXh0ZW5zaW9uXywgZm9vX2ZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJmb29fZXh0ZW5zaW9uIikpOworICBFWFBFQ1RfRVEoYmFyX2V4dGVuc2lvbl8sIGJhcl9maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiYmFyX2V4dGVuc2lvbiIpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFeHRlbnNpb25CeU5hbWUoImJhcl9leHRlbnNpb24iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoYmFyX2ZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJmb29fZXh0ZW5zaW9uIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhel9maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX2V4dGVuc2lvbiIpID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgibm9fc3VjaF9leHRlbnNpb24iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEZpbmRFeHRlbnNpb25CeU51bWJlcikgeworICBFWFBFQ1RfRVEoZm9vX2V4dGVuc2lvbl8sIHBvb2xfLkZpbmRFeHRlbnNpb25CeU51bWJlcihmb29fbWVzc2FnZV8sIDEpKTsKKyAgRVhQRUNUX0VRKGJhcl9leHRlbnNpb25fLCBwb29sXy5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoYmFyX21lc3NhZ2VfLCAxKSk7CisKKyAgRVhQRUNUX1RSVUUocG9vbF8uRmluZEV4dGVuc2lvbkJ5TnVtYmVyKGZvb19tZXNzYWdlXywgMikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEJ1aWxkQWdhaW4pIHsKKyAgLy8gVGVzdCB0aGF0IGlmIHRlIGNhbGwgQnVpbGRGaWxlIGFnYWluIG9uIHRoZSBzYW1lIGlucHV0IHdlIGdldCB0aGUgc2FtZQorICAvLyBGaWxlRGVzY3JpcHRvciBiYWNrLgorICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgIGZvb19maWxlXy0+Q29weVRvKCZmaWxlKTsKKyAgRVhQRUNUX0VRKGZvb19maWxlXywgcG9vbF8uQnVpbGRGaWxlKGZpbGUpKTsKKworICAvLyBCdXQgaWYgd2UgY2hhbmdlIHRoZSBmaWxlIHRoZW4gaXQgd29uJ3Qgd29yay4KKyAgZmlsZS5zZXRfcGFja2FnZSgic29tZS5vdGhlci5wYWNrYWdlIik7CisgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShmaWxlKSA9PSBOVUxMKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUZXN0IHNpbXBsZSBmbGF0IG1lc3NhZ2VzIGFuZCBmaWVsZHMuCitjbGFzcyBEZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgICAvLworICAgIC8vICAgLy8gaW4gImZvby5wcm90byIKKyAgICAvLyAgIG1lc3NhZ2UgVGVzdEZvcmVpZ24ge30KKyAgICAvLyAgIGVudW0gVGVzdEVudW0ge30KKyAgICAvLworICAgIC8vICAgbWVzc2FnZSBUZXN0TWVzc2FnZSB7CisgICAgLy8gICAgIHJlcXVpcmVkIHN0cmluZyAgICAgIGZvbyA9IDE7CisgICAgLy8gICAgIG9wdGlvbmFsIFRlc3RFbnVtICAgIGJhciA9IDY7CisgICAgLy8gICAgIHJlcGVhdGVkIFRlc3RGb3JlaWduIGJheiA9IDUwMDAwMDAwMDsKKyAgICAvLyAgICAgb3B0aW9uYWwgZ3JvdXAgICAgICAgcXV4ID0gMTUge30KKyAgICAvLyAgIH0KKyAgICAvLworICAgIC8vICAgLy8gaW4gImJhci5wcm90byIKKyAgICAvLyAgIHBhY2thZ2UgY29yZ2UuZ3JhdWx0OworICAgIC8vICAgbWVzc2FnZSBUZXN0TWVzc2FnZTIgeworICAgIC8vICAgICByZXF1aXJlZCBzdHJpbmcgZm9vID0gMTsKKyAgICAvLyAgICAgcmVxdWlyZWQgc3RyaW5nIGJhciA9IDI7CisgICAgLy8gICAgIHJlcXVpcmVkIHN0cmluZyBxdXV4ID0gNjsKKyAgICAvLyAgIH0KKyAgICAvLworICAgIC8vIFdlIGNoZWF0IGFuZCB1c2UgVGVzdEZvcmVpZ24gYXMgdGhlIHR5cGUgZm9yIHF1eCByYXRoZXIgdGhhbiBjcmVhdGUKKyAgICAvLyBhbiBhY3R1YWwgbmVzdGVkIHR5cGUuCisgICAgLy8KKyAgICAvLyBTaW5jZSBhbGwgcHJpbWl0aXZlIHR5cGVzIChpbmNsdWRpbmcgc3RyaW5nKSB1c2UgdGhlIHNhbWUgYnVpbGRpbmcKKyAgICAvLyBjb2RlLCB0aGVyZSdzIG5vIG5lZWQgdG8gdGVzdCBlYWNoIG9uZSBpbmRpdmlkdWFsbHkuCisgICAgLy8KKyAgICAvLyBUZXN0TWVzc2FnZTIgaXMgcHJpbWFyaWx5IGhlcmUgdG8gdGVzdCBGaW5kRmllbGRCeU5hbWUgYW5kIGZyaWVuZHMuCisgICAgLy8gQWxsIG1lc3NhZ2VzIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBEZXNjcmlwdG9yUG9vbCBzaGFyZSB0aGUgc2FtZSBsb29rdXAKKyAgICAvLyB0YWJsZSwgc28gd2UgbmVlZCB0byBpbnN1cmUgdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZS4KKworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZm9vX2ZpbGU7CisgICAgZm9vX2ZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworICAgIEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiVGVzdEZvcmVpZ24iKTsKKyAgICBBZGRFbXB0eUVudW0oJmZvb19maWxlLCAiVGVzdEVudW0iKTsKKworICAgIERlc2NyaXB0b3JQcm90byogbWVzc2FnZSA9IEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiVGVzdE1lc3NhZ2UiKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiZm9vIiwgMSwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVRVUlSRUQsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiYmFyIiwgNiwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTSkKKyAgICAgIC0+c2V0X3R5cGVfbmFtZSgiVGVzdEVudW0iKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiYmF6IiwgNTAwMDAwMDAwLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9NRVNTQUdFKQorICAgICAgLT5zZXRfdHlwZV9uYW1lKCJUZXN0Rm9yZWlnbiIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJxdXgiLCAxNSwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfR1JPVVApCisgICAgICAtPnNldF90eXBlX25hbWUoIlRlc3RGb3JlaWduIik7CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhcl9maWxlOworICAgIGJhcl9maWxlLnNldF9uYW1lKCJiYXIucHJvdG8iKTsKKyAgICBiYXJfZmlsZS5zZXRfcGFja2FnZSgiY29yZ2UuZ3JhdWx0Iik7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UyID0gQWRkTWVzc2FnZSgmYmFyX2ZpbGUsICJUZXN0TWVzc2FnZTIiKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlMiwgImZvbyIsIDEsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUVVJUkVELAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORyk7CisgICAgQWRkRmllbGQobWVzc2FnZTIsICJiYXIiLCAyLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UyLCAicXV1eCIsIDYsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUVVJUkVELAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORyk7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKKyAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7CisKKyAgICBiYXJfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmFyX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGJhcl9maWxlXyAhPSBOVUxMKTsKKworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBlbnVtXyA9IGZvb19maWxlXy0+ZW51bV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDIsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGZvcmVpZ25fID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7CisgICAgbWVzc2FnZV8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgxKTsKKworICAgIEFTU0VSVF9FUSg0LCBtZXNzYWdlXy0+ZmllbGRfY291bnQoKSk7CisgICAgZm9vXyA9IG1lc3NhZ2VfLT5maWVsZCgwKTsKKyAgICBiYXJfID0gbWVzc2FnZV8tPmZpZWxkKDEpOworICAgIGJhel8gPSBtZXNzYWdlXy0+ZmllbGQoMik7CisgICAgcXV4XyA9IG1lc3NhZ2VfLT5maWVsZCgzKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBtZXNzYWdlMl8gPSBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgzLCBtZXNzYWdlMl8tPmZpZWxkX2NvdW50KCkpOworICAgIGZvbzJfICA9IG1lc3NhZ2UyXy0+ZmllbGQoMCk7CisgICAgYmFyMl8gID0gbWVzc2FnZTJfLT5maWVsZCgxKTsKKyAgICBxdXV4Ml8gPSBtZXNzYWdlMl8tPmZpZWxkKDIpOworICB9CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhcl9maWxlXzsKKworICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZTJfOworICBjb25zdCBEZXNjcmlwdG9yKiBmb3JlaWduXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZm9vXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiYXJfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhel87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcXV4XzsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZvbzJfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhcjJfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHF1dXgyXzsKK307CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgTmFtZSkgeworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlIiwgbWVzc2FnZV8tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UiLCBtZXNzYWdlXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoZm9vX2ZpbGVfLCBtZXNzYWdlXy0+ZmlsZSgpKTsKKworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlMiIsIG1lc3NhZ2UyXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyIiwgbWVzc2FnZTJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUShiYXJfZmlsZV8sIG1lc3NhZ2UyXy0+ZmlsZSgpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBDb250YWluaW5nVHlwZSkgeworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRzQnlJbmRleCkgeworICBBU1NFUlRfRVEoNCwgbWVzc2FnZV8tPmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRVEoZm9vXywgbWVzc2FnZV8tPmZpZWxkKDApKTsKKyAgRVhQRUNUX0VRKGJhcl8sIG1lc3NhZ2VfLT5maWVsZCgxKSk7CisgIEVYUEVDVF9FUShiYXpfLCBtZXNzYWdlXy0+ZmllbGQoMikpOworICBFWFBFQ1RfRVEocXV4XywgbWVzc2FnZV8tPmZpZWxkKDMpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaW5kRmllbGRCeU5hbWUpIHsKKyAgLy8gQWxsIG1lc3NhZ2VzIGluIHRoZSBzYW1lIERlc2NyaXB0b3JQb29sIHNoYXJlIGEgc2luZ2xlIGxvb2t1cCB0YWJsZSBmb3IKKyAgLy8gZmllbGRzLiAgU28sIGluIGFkZGl0aW9uIHRvIHRlc3RpbmcgdGhhdCBGaW5kRmllbGRCeU5hbWUgZmluZHMgdGhlIGZpZWxkcworICAvLyBvZiB0aGUgbWVzc2FnZSwgd2UgbmVlZCB0byB0ZXN0IHRoYXQgaXQgZG9lcyAqbm90KiBmaW5kIHRoZSBmaWVsZHMgb2YKKyAgLy8gKm90aGVyKiBtZXNzYWdlcy4KKworICBFWFBFQ1RfRVEoZm9vXywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiZm9vIikpOworICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiYmFyIikpOworICBFWFBFQ1RfRVEoYmF6XywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiYmF6IikpOworICBFWFBFQ1RfRVEocXV4XywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgicXV4IikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlOYW1lKCJub19zdWNoX2ZpZWxkIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU5hbWUoInF1dXgiKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfRVEoZm9vMl8gLCBtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TmFtZSgiZm9vIiApKTsKKyAgRVhQRUNUX0VRKGJhcjJfICwgbWVzc2FnZTJfLT5GaW5kRmllbGRCeU5hbWUoImJhciIgKSk7CisgIEVYUEVDVF9FUShxdXV4Ml8sIG1lc3NhZ2UyXy0+RmluZEZpZWxkQnlOYW1lKCJxdXV4IikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TmFtZSgiYmF6IikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyXy0+RmluZEZpZWxkQnlOYW1lKCJxdXgiKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaW5kRmllbGRCeU51bWJlcikgeworICBFWFBFQ1RfRVEoZm9vXywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TnVtYmVyKDEpKTsKKyAgRVhQRUNUX0VRKGJhcl8sIG1lc3NhZ2VfLT5GaW5kRmllbGRCeU51bWJlcig2KSk7CisgIEVYUEVDVF9FUShiYXpfLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlOdW1iZXIoNTAwMDAwMDAwKSk7CisgIEVYUEVDVF9FUShxdXhfLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlOdW1iZXIoMTUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TnVtYmVyKDgzNzU5MikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU51bWJlcigyKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfRVEoZm9vMl8gLCBtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TnVtYmVyKDEpKTsKKyAgRVhQRUNUX0VRKGJhcjJfICwgbWVzc2FnZTJfLT5GaW5kRmllbGRCeU51bWJlcigyKSk7CisgIEVYUEVDVF9FUShxdXV4Ml8sIG1lc3NhZ2UyXy0+RmluZEZpZWxkQnlOdW1iZXIoNikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TnVtYmVyKDE1KSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kRmllbGRCeU51bWJlcig1MDAwMDAwMDApID09IE5VTEwpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkTmFtZSkgeworICBFWFBFQ1RfRVEoImZvbyIsIGZvb18tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmFyIiwgYmFyXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCBiYXpfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoInF1eCIsIHF1eF8tPm5hbWUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRGdWxsTmFtZSkgeworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLmZvbyIsIGZvb18tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0TWVzc2FnZS5iYXIiLCBiYXJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuYmF6IiwgYmF6Xy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLnF1eCIsIHF1eF8tPmZ1bGxfbmFtZSgpKTsKKworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0TWVzc2FnZTIuZm9vIiwgZm9vMl8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLmJhciIsIGJhcjJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RNZXNzYWdlMi5xdXV4IiwgcXV1eDJfLT5mdWxsX25hbWUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRGaWxlKSB7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIGZvb18tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIGJhcl8tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIGJhel8tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIHF1eF8tPmZpbGUoKSk7CisKKyAgRVhQRUNUX0VRKGJhcl9maWxlXywgZm9vMl8tPmZpbGUoKSk7CisgIEVYUEVDVF9FUShiYXJfZmlsZV8sIGJhcjJfLT5maWxlKCkpOworICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBxdXV4Ml8tPmZpbGUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRJbmRleCkgeworICBFWFBFQ1RfRVEoMCwgZm9vXy0+aW5kZXgoKSk7CisgIEVYUEVDVF9FUSgxLCBiYXJfLT5pbmRleCgpKTsKKyAgRVhQRUNUX0VRKDIsIGJhel8tPmluZGV4KCkpOworICBFWFBFQ1RfRVEoMywgcXV4Xy0+aW5kZXgoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGROdW1iZXIpIHsKKyAgRVhQRUNUX0VRKCAgICAgICAgMSwgZm9vXy0+bnVtYmVyKCkpOworICBFWFBFQ1RfRVEoICAgICAgICA2LCBiYXJfLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSg1MDAwMDAwMDAsIGJhel8tPm51bWJlcigpKTsKKyAgRVhQRUNUX0VRKCAgICAgICAxNSwgcXV4Xy0+bnVtYmVyKCkpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkVHlwZSkgeworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAsIGZvb18tPnR5cGUoKSk7CisgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICwgYmFyXy0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBiYXpfLT50eXBlKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICAsIHF1eF8tPnR5cGUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRMYWJlbCkgeworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVFVSVJFRCwgZm9vXy0+bGFiZWwoKSk7CisgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMLCBiYXJfLT5sYWJlbCgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQsIGJhel8tPmxhYmVsKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgcXV4Xy0+bGFiZWwoKSk7CisKKyAgRVhQRUNUX1RSVUUgKGZvb18tPmlzX3JlcXVpcmVkKCkpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+aXNfb3B0aW9uYWwoKSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5pc19yZXBlYXRlZCgpKTsKKworICBFWFBFQ1RfRkFMU0UoYmFyXy0+aXNfcmVxdWlyZWQoKSk7CisgIEVYUEVDVF9UUlVFIChiYXJfLT5pc19vcHRpb25hbCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGJhcl8tPmlzX3JlcGVhdGVkKCkpOworCisgIEVYUEVDVF9GQUxTRShiYXpfLT5pc19yZXF1aXJlZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGJhel8tPmlzX29wdGlvbmFsKCkpOworICBFWFBFQ1RfVFJVRSAoYmF6Xy0+aXNfcmVwZWF0ZWQoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRIYXNEZWZhdWx0KSB7CisgIEVYUEVDVF9GQUxTRShmb29fLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKGJhcl8tPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBFWFBFQ1RfRkFMU0UoYmF6Xy0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShxdXhfLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKK30KKworVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZENvbnRhaW5pbmdUeXBlKSB7CisgIEVYUEVDVF9FUShtZXNzYWdlXywgZm9vXy0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZV8sIGJhcl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfLCBiYXpfLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXywgcXV4Xy0+Y29udGFpbmluZ190eXBlKCkpOworCisgIEVYUEVDVF9FUShtZXNzYWdlMl8sIGZvbzJfIC0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTJfLCBiYXIyXyAtPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyXywgcXV1eDJfLT5jb250YWluaW5nX3R5cGUoKSk7Cit9CisKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRNZXNzYWdlVHlwZSkgeworICBFWFBFQ1RfVFJVRShmb29fLT5tZXNzYWdlX3R5cGUoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoYmFyXy0+bWVzc2FnZV90eXBlKCkgPT0gTlVMTCk7CisKKyAgRVhQRUNUX0VRKGZvcmVpZ25fLCBiYXpfLT5tZXNzYWdlX3R5cGUoKSk7CisgIEVYUEVDVF9FUShmb3JlaWduXywgcXV4Xy0+bWVzc2FnZV90eXBlKCkpOworfQorCitURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkRW51bVR5cGUpIHsKKyAgRVhQRUNUX1RSVUUoZm9vXy0+ZW51bV90eXBlKCkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGJhel8tPmVudW1fdHlwZSgpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShxdXhfLT5lbnVtX3R5cGUoKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfRVEoZW51bV8sIGJhcl8tPmVudW1fdHlwZSgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBTdHlsaXplZEZpZWxkTmFtZXNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgICAgZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisKKyAgICBBZGRFeHRlbnNpb25SYW5nZShBZGRNZXNzYWdlKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiKSwgMSwgMTAwMCk7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBBZGRNZXNzYWdlKCZmaWxlLCAiVGVzdE1lc3NhZ2UiKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiZm9vX2ZvbyIsIDEsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlLCAiRm9vQmFyIiwgMiwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJmb29CYXoiLCAzLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRmllbGQobWVzc2FnZSwgImZvb0ZvbyIsIDQsICAvLyBDYW1lbC1jYXNlIGNvbmZsaWN0IHdpdGggZm9vX2Zvby4KKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJmb29iYXIiLCA1LCAgLy8gTG93ZXItY2FzZSBjb25mbGljdCB3aXRoIEZvb0Jhci4KKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworCisgICAgQWRkTmVzdGVkRXh0ZW5zaW9uKG1lc3NhZ2UsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJiYXJfZm9vIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkTmVzdGVkRXh0ZW5zaW9uKG1lc3NhZ2UsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJCYXJCYXIiLCAyLAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGROZXN0ZWRFeHRlbnNpb24obWVzc2FnZSwgIkV4dGVuZGFibGVNZXNzYWdlIiwgIkJhckJheiIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZE5lc3RlZEV4dGVuc2lvbihtZXNzYWdlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmFyRm9vIiwgNCwgIC8vIENvbmZsaWN0CisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZE5lc3RlZEV4dGVuc2lvbihtZXNzYWdlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmFyYmFyIiwgNSwgIC8vIENvbmZsaWN0CisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworCisgICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmF6X2ZvbyIsIDExLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRFeHRlbnNpb24oJmZpbGUsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJCYXpCYXIiLCAxMiwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiQmF6QmF6IiwgMTMsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEV4dGVuc2lvbigmZmlsZSwgIkV4dGVuZGFibGVNZXNzYWdlIiwgImJhekZvbyIsIDE0LCAgLy8gQ29uZmxpY3QKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmF6YmFyIiwgMTUsICAvLyBDb25mbGljdAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKworICAgIGZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZpbGUpOworICAgIEFTU0VSVF9UUlVFKGZpbGVfICE9IE5VTEwpOworICAgIEFTU0VSVF9FUSgyLCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIG1lc3NhZ2VfID0gZmlsZV8tPm1lc3NhZ2VfdHlwZSgxKTsKKyAgICBBU1NFUlRfRVEoIlRlc3RNZXNzYWdlIiwgbWVzc2FnZV8tPm5hbWUoKSk7CisgICAgQVNTRVJUX0VRKDUsIG1lc3NhZ2VfLT5maWVsZF9jb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoNSwgbWVzc2FnZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoNSwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfOworfTsKKworVEVTVF9GKFN0eWxpemVkRmllbGROYW1lc1Rlc3QsIExvd2VyY2FzZU5hbWUpIHsKKyAgRVhQRUNUX0VRKCJmb29fZm9vIiwgbWVzc2FnZV8tPmZpZWxkKDApLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29iYXIiICwgbWVzc2FnZV8tPmZpZWxkKDEpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29iYXoiICwgbWVzc2FnZV8tPmZpZWxkKDIpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29mb28iICwgbWVzc2FnZV8tPmZpZWxkKDMpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29iYXIiICwgbWVzc2FnZV8tPmZpZWxkKDQpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKworICBFWFBFQ1RfRVEoImJhcl9mb28iLCBtZXNzYWdlXy0+ZXh0ZW5zaW9uKDApLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXJiYXIiICwgbWVzc2FnZV8tPmV4dGVuc2lvbigxKS0+bG93ZXJjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmFyYmF6IiAsIG1lc3NhZ2VfLT5leHRlbnNpb24oMiktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhcmZvbyIgLCBtZXNzYWdlXy0+ZXh0ZW5zaW9uKDMpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXJiYXIiICwgbWVzc2FnZV8tPmV4dGVuc2lvbig0KS0+bG93ZXJjYXNlX25hbWUoKSk7CisKKyAgRVhQRUNUX0VRKCJiYXpfZm9vIiwgZmlsZV8tPmV4dGVuc2lvbigwKS0+bG93ZXJjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6YmFyIiAsIGZpbGVfLT5leHRlbnNpb24oMSktPmxvd2VyY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhemJheiIgLCBmaWxlXy0+ZXh0ZW5zaW9uKDIpLT5sb3dlcmNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXpmb28iICwgZmlsZV8tPmV4dGVuc2lvbigzKS0+bG93ZXJjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6YmFyIiAsIGZpbGVfLT5leHRlbnNpb24oNCktPmxvd2VyY2FzZV9uYW1lKCkpOworfQorCitURVNUX0YoU3R5bGl6ZWRGaWVsZE5hbWVzVGVzdCwgQ2FtZWxjYXNlTmFtZSkgeworICBFWFBFQ1RfRVEoImZvb0ZvbyIsIG1lc3NhZ2VfLT5maWVsZCgwKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vQmFyIiwgbWVzc2FnZV8tPmZpZWxkKDEpLT5jYW1lbGNhc2VfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb29CYXoiLCBtZXNzYWdlXy0+ZmllbGQoMiktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImZvb0ZvbyIsIG1lc3NhZ2VfLT5maWVsZCgzKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vYmFyIiwgbWVzc2FnZV8tPmZpZWxkKDQpLT5jYW1lbGNhc2VfbmFtZSgpKTsKKworICBFWFBFQ1RfRVEoImJhckZvbyIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMCktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhckJhciIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMSktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhckJheiIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMiktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhckZvbyIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMyktPmNhbWVsY2FzZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhcmJhciIsIG1lc3NhZ2VfLT5leHRlbnNpb24oNCktPmNhbWVsY2FzZV9uYW1lKCkpOworCisgIEVYUEVDVF9FUSgiYmF6Rm9vIiwgZmlsZV8tPmV4dGVuc2lvbigwKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6QmFyIiwgZmlsZV8tPmV4dGVuc2lvbigxKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6QmF6IiwgZmlsZV8tPmV4dGVuc2lvbigyKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6Rm9vIiwgZmlsZV8tPmV4dGVuc2lvbigzKS0+Y2FtZWxjYXNlX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiYmF6YmFyIiwgZmlsZV8tPmV4dGVuc2lvbig0KS0+Y2FtZWxjYXNlX25hbWUoKSk7Cit9CisKK1RFU1RfRihTdHlsaXplZEZpZWxkTmFtZXNUZXN0LCBGaW5kQnlMb3dlcmNhc2VOYW1lKSB7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMCksCisgICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCJmb29fZm9vIikpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmZpZWxkKDEpLAorICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgiZm9vYmFyIikpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmZpZWxkKDIpLAorICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgiZm9vYmF6IikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCJGb29CYXIiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgiZm9vQmF6IikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoImJhcl9mb28iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgibm9zdWNoZmllbGQiKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmV4dGVuc2lvbigwKSwKKyAgICAgICAgICAgIG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXJfZm9vIikpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmV4dGVuc2lvbigxKSwKKyAgICAgICAgICAgIG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXJiYXIiKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZXh0ZW5zaW9uKDIpLAorICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhcmJheiIpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoIkJhckJhciIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgiYmFyQmF6IikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJmb29fZm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJub3N1Y2hmaWVsZCIpID09IE5VTEwpOworCisgIEVYUEVDVF9FUShmaWxlXy0+ZXh0ZW5zaW9uKDApLAorICAgICAgICAgICAgZmlsZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhel9mb28iKSk7CisgIEVYUEVDVF9FUShmaWxlXy0+ZXh0ZW5zaW9uKDEpLAorICAgICAgICAgICAgZmlsZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhemJhciIpKTsKKyAgRVhQRUNUX0VRKGZpbGVfLT5leHRlbnNpb24oMiksCisgICAgICAgICAgICBmaWxlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgiYmF6YmF6IikpOworICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgiQmF6QmFyIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXpCYXoiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZmlsZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoIm5vc3VjaGZpZWxkIikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihTdHlsaXplZEZpZWxkTmFtZXNUZXN0LCBGaW5kQnlDYW1lbGNhc2VOYW1lKSB7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMCksCisgICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJmb29Gb28iKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMSksCisgICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJmb29CYXIiKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMiksCisgICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJmb29CYXoiKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoImZvb19mb28iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgiRm9vQmFyIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoImJhckZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJub3N1Y2hmaWVsZCIpID09IE5VTEwpOworCisgIEVYUEVDVF9FUShtZXNzYWdlXy0+ZXh0ZW5zaW9uKDApLAorICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoImJhckZvbyIpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfLT5leHRlbnNpb24oMSksCisgICAgICAgICAgICBtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmFyQmFyIikpOworICBFWFBFQ1RfRVEobWVzc2FnZV8tPmV4dGVuc2lvbigyKSwKKyAgICAgICAgICAgIG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXJCYXoiKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXJfZm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJCYXJCYXIiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoImZvb0ZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgibm9zdWNoZmllbGQiKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfRVEoZmlsZV8tPmV4dGVuc2lvbigwKSwKKyAgICAgICAgICAgIGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXpGb28iKSk7CisgIEVYUEVDVF9FUShmaWxlXy0+ZXh0ZW5zaW9uKDEpLAorICAgICAgICAgICAgZmlsZV8tPkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoImJhekJhciIpKTsKKyAgRVhQRUNUX0VRKGZpbGVfLT5leHRlbnNpb24oMiksCisgICAgICAgICAgICBmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmF6QmF6IikpOworICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmF6X2ZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiQmF6QmFyIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJub3N1Y2hmaWVsZCIpID09IE5VTEwpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFRlc3QgZW51bSBkZXNjcmlwdG9ycy4KK2NsYXNzIEVudW1EZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgICAvLworICAgIC8vICAgLy8gaW4gImZvby5wcm90byIKKyAgICAvLyAgIGVudW0gVGVzdEVudW0geworICAgIC8vICAgICBGT08gPSAxOworICAgIC8vICAgICBCQVIgPSAyOworICAgIC8vICAgfQorICAgIC8vCisgICAgLy8gICAvLyBpbiAiYmFyLnByb3RvIgorICAgIC8vICAgcGFja2FnZSBjb3JnZS5ncmF1bHQ7CisgICAgLy8gICBlbnVtIFRlc3RFbnVtMiB7CisgICAgLy8gICAgIEZPTyA9IDE7CisgICAgLy8gICAgIEJBWiA9IDM7CisgICAgLy8gICB9CisgICAgLy8KKyAgICAvLyBUZXN0RW51bTIgaXMgcHJpbWFyaWx5IGhlcmUgdG8gdGVzdCBGaW5kVmFsdWVCeU5hbWUgYW5kIGZyaWVuZHMuCisgICAgLy8gQWxsIGVudW1zIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBEZXNjcmlwdG9yUG9vbCBzaGFyZSB0aGUgc2FtZSBsb29rdXAKKyAgICAvLyB0YWJsZSwgc28gd2UgbmVlZCB0byBpbnN1cmUgdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZS4KKworICAgIC8vIFRlc3RFbnVtCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKKyAgICBmb29fZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3Byb3RvID0gQWRkRW51bSgmZm9vX2ZpbGUsICJUZXN0RW51bSIpOworICAgIEFkZEVudW1WYWx1ZShlbnVtX3Byb3RvLCAiRk9PIiwgMSk7CisgICAgQWRkRW51bVZhbHVlKGVudW1fcHJvdG8sICJCQVIiLCAyKTsKKworICAgIC8vIFRlc3RFbnVtMgorICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYmFyX2ZpbGU7CisgICAgYmFyX2ZpbGUuc2V0X25hbWUoImJhci5wcm90byIpOworICAgIGJhcl9maWxlLnNldF9wYWNrYWdlKCJjb3JnZS5ncmF1bHQiKTsKKworICAgIEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW0yX3Byb3RvID0gQWRkRW51bSgmYmFyX2ZpbGUsICJUZXN0RW51bTIiKTsKKyAgICBBZGRFbnVtVmFsdWUoZW51bTJfcHJvdG8sICJGT08iLCAxKTsKKyAgICBBZGRFbnVtVmFsdWUoZW51bTJfcHJvdG8sICJCQVoiLCAzKTsKKworICAgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KKyAgICBmb29fZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoZm9vX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGZvb19maWxlXyAhPSBOVUxMKTsKKworICAgIGJhcl9maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShiYXJfZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoYmFyX2ZpbGVfICE9IE5VTEwpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+ZW51bV90eXBlX2NvdW50KCkpOworICAgIGVudW1fID0gZm9vX2ZpbGVfLT5lbnVtX3R5cGUoMCk7CisKKyAgICBBU1NFUlRfRVEoMiwgZW51bV8tPnZhbHVlX2NvdW50KCkpOworICAgIGZvb18gPSBlbnVtXy0+dmFsdWUoMCk7CisgICAgYmFyXyA9IGVudW1fLT52YWx1ZSgxKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBlbnVtMl8gPSBiYXJfZmlsZV8tPmVudW1fdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgyLCBlbnVtMl8tPnZhbHVlX2NvdW50KCkpOworICAgIGZvbzJfID0gZW51bTJfLT52YWx1ZSgwKTsKKyAgICBiYXoyXyA9IGVudW0yXy0+dmFsdWUoMSk7CisgIH0KKworICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZm9vX2ZpbGVfOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmFyX2ZpbGVfOworCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW0yXzsKKworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBmb29fOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiYXJfOworCisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGZvbzJfOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiYXoyXzsKK307CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIE5hbWUpIHsKKyAgRVhQRUNUX0VRKCJUZXN0RW51bSIsIGVudW1fLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoIlRlc3RFbnVtIiwgZW51bV8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKGZvb19maWxlXywgZW51bV8tPmZpbGUoKSk7CisKKyAgRVhQRUNUX0VRKCJUZXN0RW51bTIiLCBlbnVtMl8tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RFbnVtMiIsIGVudW0yXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBlbnVtMl8tPmZpbGUoKSk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIENvbnRhaW5pbmdUeXBlKSB7CisgIEVYUEVDVF9UUlVFKGVudW1fLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZW51bTJfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgVmFsdWVzQnlJbmRleCkgeworICBBU1NFUlRfRVEoMiwgZW51bV8tPnZhbHVlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoZm9vXywgZW51bV8tPnZhbHVlKDApKTsKKyAgRVhQRUNUX0VRKGJhcl8sIGVudW1fLT52YWx1ZSgxKSk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIEZpbmRWYWx1ZUJ5TmFtZSkgeworICBFWFBFQ1RfRVEoZm9vXyAsIGVudW1fIC0+RmluZFZhbHVlQnlOYW1lKCJGT08iKSk7CisgIEVYUEVDVF9FUShiYXJfICwgZW51bV8gLT5GaW5kVmFsdWVCeU5hbWUoIkJBUiIpKTsKKyAgRVhQRUNUX0VRKGZvbzJfLCBlbnVtMl8tPkZpbmRWYWx1ZUJ5TmFtZSgiRk9PIikpOworICBFWFBFQ1RfRVEoYmF6Ml8sIGVudW0yXy0+RmluZFZhbHVlQnlOYW1lKCJCQVoiKSk7CisKKyAgRVhQRUNUX1RSVUUoZW51bV8gLT5GaW5kVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZW51bV8gLT5GaW5kVmFsdWVCeU5hbWUoIkJBWiIgICAgICAgICAgKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZW51bTJfLT5GaW5kVmFsdWVCeU5hbWUoIkJBUiIgICAgICAgICAgKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgRmluZFZhbHVlQnlOdW1iZXIpIHsKKyAgRVhQRUNUX0VRKGZvb18gLCBlbnVtXyAtPkZpbmRWYWx1ZUJ5TnVtYmVyKDEpKTsKKyAgRVhQRUNUX0VRKGJhcl8gLCBlbnVtXyAtPkZpbmRWYWx1ZUJ5TnVtYmVyKDIpKTsKKyAgRVhQRUNUX0VRKGZvbzJfLCBlbnVtMl8tPkZpbmRWYWx1ZUJ5TnVtYmVyKDEpKTsKKyAgRVhQRUNUX0VRKGJhejJfLCBlbnVtMl8tPkZpbmRWYWx1ZUJ5TnVtYmVyKDMpKTsKKworICBFWFBFQ1RfVFJVRShlbnVtXyAtPkZpbmRWYWx1ZUJ5TnVtYmVyKDQxNikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGVudW1fIC0+RmluZFZhbHVlQnlOdW1iZXIoMykgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGVudW0yXy0+RmluZFZhbHVlQnlOdW1iZXIoMikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlTmFtZSkgeworICBFWFBFQ1RfRVEoIkZPTyIsIGZvb18tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiQkFSIiwgYmFyXy0+bmFtZSgpKTsKK30KKworVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgVmFsdWVGdWxsTmFtZSkgeworICBFWFBFQ1RfRVEoIkZPTyIsIGZvb18tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJCQVIiLCBiYXJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LkZPTyIsIGZvbzJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LkJBWiIsIGJhejJfLT5mdWxsX25hbWUoKSk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlSW5kZXgpIHsKKyAgRVhQRUNUX0VRKDAsIGZvb18tPmluZGV4KCkpOworICBFWFBFQ1RfRVEoMSwgYmFyXy0+aW5kZXgoKSk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlTnVtYmVyKSB7CisgIEVYUEVDVF9FUSgxLCBmb29fLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSgyLCBiYXJfLT5udW1iZXIoKSk7Cit9CisKK1RFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlVHlwZSkgeworICBFWFBFQ1RfRVEoZW51bV8gLCBmb29fIC0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKGVudW1fICwgYmFyXyAtPnR5cGUoKSk7CisgIEVYUEVDVF9FUShlbnVtMl8sIGZvbzJfLT50eXBlKCkpOworICBFWFBFQ1RfRVEoZW51bTJfLCBiYXoyXy0+dHlwZSgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUZXN0IHNlcnZpY2UgZGVzY3JpcHRvcnMuCitjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgLy8gQnVpbGQgZGVzY3JpcHRvcnMgZm9yIHRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgYW5kIHNlcnZpY2U6CisgICAgLy8gICAgLy8gaW4gImZvby5wcm90byIKKyAgICAvLyAgICBtZXNzYWdlIEZvb1JlcXVlc3QgIHt9CisgICAgLy8gICAgbWVzc2FnZSBGb29SZXNwb25zZSB7fQorICAgIC8vICAgIG1lc3NhZ2UgQmFyUmVxdWVzdCAge30KKyAgICAvLyAgICBtZXNzYWdlIEJhclJlc3BvbnNlIHt9CisgICAgLy8gICAgbWVzc2FnZSBCYXpSZXF1ZXN0ICB7fQorICAgIC8vICAgIG1lc3NhZ2UgQmF6UmVzcG9uc2Uge30KKyAgICAvLworICAgIC8vICAgIHNlcnZpY2UgVGVzdFNlcnZpY2UgeworICAgIC8vICAgICAgcnBjIEZvbyhGb29SZXF1ZXN0KSByZXR1cm5zIChGb29SZXNwb25zZSk7CisgICAgLy8gICAgICBycGMgQmFyKEJhclJlcXVlc3QpIHJldHVybnMgKEJhclJlc3BvbnNlKTsKKyAgICAvLyAgICB9CisgICAgLy8KKyAgICAvLyAgICAvLyBpbiAiYmFyLnByb3RvIgorICAgIC8vICAgIHBhY2thZ2UgY29yZ2UuZ3JhdWx0CisgICAgLy8gICAgc2VydmljZSBUZXN0U2VydmljZTIgeworICAgIC8vICAgICAgcnBjIEZvbyhGb29SZXF1ZXN0KSByZXR1cm5zIChGb29SZXNwb25zZSk7CisgICAgLy8gICAgICBycGMgQmF6KEJhelJlcXVlc3QpIHJldHVybnMgKEJhelJlc3BvbnNlKTsKKyAgICAvLyAgICB9CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlOworICAgIGZvb19maWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKworICAgIEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiRm9vUmVxdWVzdCIpOworICAgIEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiRm9vUmVzcG9uc2UiKTsKKyAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkJhclJlcXVlc3QiKTsKKyAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkJhclJlc3BvbnNlIik7CisgICAgQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJCYXpSZXF1ZXN0Iik7CisgICAgQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJCYXpSZXNwb25zZSIpOworCisgICAgU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSA9IEFkZFNlcnZpY2UoJmZvb19maWxlLCAiVGVzdFNlcnZpY2UiKTsKKyAgICBBZGRNZXRob2Qoc2VydmljZSwgIkZvbyIsICJGb29SZXF1ZXN0IiwgIkZvb1Jlc3BvbnNlIik7CisgICAgQWRkTWV0aG9kKHNlcnZpY2UsICJCYXIiLCAiQmFyUmVxdWVzdCIsICJCYXJSZXNwb25zZSIpOworCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJfZmlsZTsKKyAgICBiYXJfZmlsZS5zZXRfbmFtZSgiYmFyLnByb3RvIik7CisgICAgYmFyX2ZpbGUuc2V0X3BhY2thZ2UoImNvcmdlLmdyYXVsdCIpOworICAgIGJhcl9maWxlLmFkZF9kZXBlbmRlbmN5KCJmb28ucHJvdG8iKTsKKworICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UyID0gQWRkU2VydmljZSgmYmFyX2ZpbGUsICJUZXN0U2VydmljZTIiKTsKKyAgICBBZGRNZXRob2Qoc2VydmljZTIsICJGb28iLCAiRm9vUmVxdWVzdCIsICJGb29SZXNwb25zZSIpOworICAgIEFkZE1ldGhvZChzZXJ2aWNlMiwgIkJheiIsICJCYXpSZXF1ZXN0IiwgIkJhelJlc3BvbnNlIik7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKKyAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7CisKKyAgICBiYXJfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmFyX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGJhcl9maWxlXyAhPSBOVUxMKTsKKworICAgIEFTU0VSVF9FUSg2LCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBmb29fcmVxdWVzdF8gID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7CisgICAgZm9vX3Jlc3BvbnNlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDEpOworICAgIGJhcl9yZXF1ZXN0XyAgPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgyKTsKKyAgICBiYXJfcmVzcG9uc2VfID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMyk7CisgICAgYmF6X3JlcXVlc3RfICA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDQpOworICAgIGJhel9yZXNwb25zZV8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSg1KTsKKworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPnNlcnZpY2VfY291bnQoKSk7CisgICAgc2VydmljZV8gPSBmb29fZmlsZV8tPnNlcnZpY2UoMCk7CisKKyAgICBBU1NFUlRfRVEoMiwgc2VydmljZV8tPm1ldGhvZF9jb3VudCgpKTsKKyAgICBmb29fID0gc2VydmljZV8tPm1ldGhvZCgwKTsKKyAgICBiYXJfID0gc2VydmljZV8tPm1ldGhvZCgxKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPnNlcnZpY2VfY291bnQoKSk7CisgICAgc2VydmljZTJfID0gYmFyX2ZpbGVfLT5zZXJ2aWNlKDApOworCisgICAgQVNTRVJUX0VRKDIsIHNlcnZpY2UyXy0+bWV0aG9kX2NvdW50KCkpOworICAgIGZvbzJfID0gc2VydmljZTJfLT5tZXRob2QoMCk7CisgICAgYmF6Ml8gPSBzZXJ2aWNlMl8tPm1ldGhvZCgxKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87CisKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vX3JlcXVlc3RfOworICBjb25zdCBEZXNjcmlwdG9yKiBmb29fcmVzcG9uc2VfOworICBjb25zdCBEZXNjcmlwdG9yKiBiYXJfcmVxdWVzdF87CisgIGNvbnN0IERlc2NyaXB0b3IqIGJhcl9yZXNwb25zZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGJhel9yZXF1ZXN0XzsKKyAgY29uc3QgRGVzY3JpcHRvciogYmF6X3Jlc3BvbnNlXzsKKworICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZV87CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlMl87CisKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogZm9vXzsKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogYmFyXzsKKworICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBmb28yXzsKKyAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogYmF6Ml87Cit9OworCitURVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBOYW1lKSB7CisgIEVYUEVDVF9FUSgiVGVzdFNlcnZpY2UiLCBzZXJ2aWNlXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0U2VydmljZSIsIHNlcnZpY2VfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUShmb29fZmlsZV8sIHNlcnZpY2VfLT5maWxlKCkpOworCisgIEVYUEVDVF9FUSgiVGVzdFNlcnZpY2UyIiwgc2VydmljZTJfLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0U2VydmljZTIiLCBzZXJ2aWNlMl8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKGJhcl9maWxlXywgc2VydmljZTJfLT5maWxlKCkpOworfQorCitURVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBNZXRob2RzQnlJbmRleCkgeworICBBU1NFUlRfRVEoMiwgc2VydmljZV8tPm1ldGhvZF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGZvb18sIHNlcnZpY2VfLT5tZXRob2QoMCkpOworICBFWFBFQ1RfRVEoYmFyXywgc2VydmljZV8tPm1ldGhvZCgxKSk7Cit9CisKK1RFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIEZpbmRNZXRob2RCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGZvb18gLCBzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpKTsKKyAgRVhQRUNUX0VRKGJhcl8gLCBzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIkJhciIpKTsKKyAgRVhQRUNUX0VRKGZvbzJfLCBzZXJ2aWNlMl8tPkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpKTsKKyAgRVhQRUNUX0VRKGJhejJfLCBzZXJ2aWNlMl8tPkZpbmRNZXRob2RCeU5hbWUoIkJheiIpKTsKKworICBFWFBFQ1RfVFJVRShzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIk5vU3VjaE1ldGhvZCIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIkJheiIgICAgICAgICApID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShzZXJ2aWNlMl8tPkZpbmRNZXRob2RCeU5hbWUoIkJhciIgICAgICAgICApID09IE5VTEwpOworfQorCitURVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBNZXRob2ROYW1lKSB7CisgIEVYUEVDVF9FUSgiRm9vIiwgZm9vXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJCYXIiLCBiYXJfLT5uYW1lKCkpOworfQorCitURVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBNZXRob2RGdWxsTmFtZSkgeworICBFWFBFQ1RfRVEoIlRlc3RTZXJ2aWNlLkZvbyIsIGZvb18tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJUZXN0U2VydmljZS5CYXIiLCBiYXJfLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RTZXJ2aWNlMi5Gb28iLCBmb28yXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0U2VydmljZTIuQmF6IiwgYmF6Ml8tPmZ1bGxfbmFtZSgpKTsKK30KKworVEVTVF9GKFNlcnZpY2VEZXNjcmlwdG9yVGVzdCwgTWV0aG9kSW5kZXgpIHsKKyAgRVhQRUNUX0VRKDAsIGZvb18tPmluZGV4KCkpOworICBFWFBFQ1RfRVEoMSwgYmFyXy0+aW5kZXgoKSk7Cit9CisKK1RFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIE1ldGhvZFBhcmVudCkgeworICBFWFBFQ1RfRVEoc2VydmljZV8sIGZvb18tPnNlcnZpY2UoKSk7CisgIEVYUEVDVF9FUShzZXJ2aWNlXywgYmFyXy0+c2VydmljZSgpKTsKK30KKworVEVTVF9GKFNlcnZpY2VEZXNjcmlwdG9yVGVzdCwgTWV0aG9kSW5wdXRUeXBlKSB7CisgIEVYUEVDVF9FUShmb29fcmVxdWVzdF8sIGZvb18tPmlucHV0X3R5cGUoKSk7CisgIEVYUEVDVF9FUShiYXJfcmVxdWVzdF8sIGJhcl8tPmlucHV0X3R5cGUoKSk7Cit9CisKK1RFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIE1ldGhvZE91dHB1dFR5cGUpIHsKKyAgRVhQRUNUX0VRKGZvb19yZXNwb25zZV8sIGZvb18tPm91dHB1dF90eXBlKCkpOworICBFWFBFQ1RfRVEoYmFyX3Jlc3BvbnNlXywgYmFyXy0+b3V0cHV0X3R5cGUoKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVGVzdCBuZXN0ZWQgdHlwZXMuCitjbGFzcyBOZXN0ZWREZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgICAvLworICAgIC8vICAgLy8gaW4gImZvby5wcm90byIKKyAgICAvLyAgIG1lc3NhZ2UgVGVzdE1lc3NhZ2UgeworICAgIC8vICAgICBtZXNzYWdlIEZvbyB7fQorICAgIC8vICAgICBtZXNzYWdlIEJhciB7fQorICAgIC8vICAgICBlbnVtIEJheiB7IEEgPSAxOyB9CisgICAgLy8gICAgIGVudW0gUXV4IHsgQiA9IDE7IH0KKyAgICAvLyAgIH0KKyAgICAvLworICAgIC8vICAgLy8gaW4gImJhci5wcm90byIKKyAgICAvLyAgIHBhY2thZ2UgY29yZ2UuZ3JhdWx0OworICAgIC8vICAgbWVzc2FnZSBUZXN0TWVzc2FnZTIgeworICAgIC8vICAgICBtZXNzYWdlIEZvbyB7fQorICAgIC8vICAgICBtZXNzYWdlIEJheiB7fQorICAgIC8vICAgICBlbnVtIFF1eCAgeyBBID0gMTsgfQorICAgIC8vICAgICBlbnVtIFF1dXggeyBDID0gMTsgfQorICAgIC8vICAgfQorICAgIC8vCisgICAgLy8gVGVzdE1lc3NhZ2UyIGlzIHByaW1hcmlseSBoZXJlIHRvIHRlc3QgRmluZE5lc3RlZFR5cGVCeU5hbWUgYW5kIGZyaWVuZHMuCisgICAgLy8gQWxsIG1lc3NhZ2VzIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBEZXNjcmlwdG9yUG9vbCBzaGFyZSB0aGUgc2FtZSBsb29rdXAKKyAgICAvLyB0YWJsZSwgc28gd2UgbmVlZCB0byBpbnN1cmUgdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZS4KKyAgICAvLworICAgIC8vIFdlIGFkZCBlbnVtIHZhbHVlcyB0byB0aGUgZW51bXMgaW4gb3JkZXIgdG8gdGVzdCBzZWFyY2hpbmcgZm9yIGVudW0KKyAgICAvLyB2YWx1ZXMgYWNyb3NzIGEgbWVzc2FnZSdzIHNjb3BlLgorCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKKyAgICBmb29fZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIlRlc3RNZXNzYWdlIik7CisgICAgQWRkTmVzdGVkTWVzc2FnZShtZXNzYWdlLCAiRm9vIik7CisgICAgQWRkTmVzdGVkTWVzc2FnZShtZXNzYWdlLCAiQmFyIik7CisgICAgRW51bURlc2NyaXB0b3JQcm90byogYmF6ID0gQWRkTmVzdGVkRW51bShtZXNzYWdlLCAiQmF6Iik7CisgICAgQWRkRW51bVZhbHVlKGJheiwgIkEiLCAxKTsKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBxdXggPSBBZGROZXN0ZWRFbnVtKG1lc3NhZ2UsICJRdXgiKTsKKyAgICBBZGRFbnVtVmFsdWUocXV4LCAiQiIsIDEpOworCisgICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJfZmlsZTsKKyAgICBiYXJfZmlsZS5zZXRfbmFtZSgiYmFyLnByb3RvIik7CisgICAgYmFyX2ZpbGUuc2V0X3BhY2thZ2UoImNvcmdlLmdyYXVsdCIpOworCisgICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlMiA9IEFkZE1lc3NhZ2UoJmJhcl9maWxlLCAiVGVzdE1lc3NhZ2UyIik7CisgICAgQWRkTmVzdGVkTWVzc2FnZShtZXNzYWdlMiwgIkZvbyIpOworICAgIEFkZE5lc3RlZE1lc3NhZ2UobWVzc2FnZTIsICJCYXoiKTsKKyAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBxdXgyID0gQWRkTmVzdGVkRW51bShtZXNzYWdlMiwgIlF1eCIpOworICAgIEFkZEVudW1WYWx1ZShxdXgyLCAiQSIsIDEpOworICAgIEVudW1EZXNjcmlwdG9yUHJvdG8qIHF1dXgyID0gQWRkTmVzdGVkRW51bShtZXNzYWdlMiwgIlF1dXgiKTsKKyAgICBBZGRFbnVtVmFsdWUocXV1eDIsICJDIiwgMSk7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKKyAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7CisKKyAgICBiYXJfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmFyX2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKGJhcl9maWxlXyAhPSBOVUxMKTsKKworICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBtZXNzYWdlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2VfLT5uZXN0ZWRfdHlwZV9jb3VudCgpKTsKKyAgICBmb29fID0gbWVzc2FnZV8tPm5lc3RlZF90eXBlKDApOworICAgIGJhcl8gPSBtZXNzYWdlXy0+bmVzdGVkX3R5cGUoMSk7CisKKyAgICBBU1NFUlRfRVEoMiwgbWVzc2FnZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBiYXpfID0gbWVzc2FnZV8tPmVudW1fdHlwZSgwKTsKKyAgICBxdXhfID0gbWVzc2FnZV8tPmVudW1fdHlwZSgxKTsKKworICAgIEFTU0VSVF9FUSgxLCBiYXpfLT52YWx1ZV9jb3VudCgpKTsKKyAgICBhXyA9IGJhel8tPnZhbHVlKDApOworICAgIEFTU0VSVF9FUSgxLCBxdXhfLT52YWx1ZV9jb3VudCgpKTsKKyAgICBiXyA9IHF1eF8tPnZhbHVlKDApOworCisgICAgQVNTRVJUX0VRKDEsIGJhcl9maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIG1lc3NhZ2UyXyA9IGJhcl9maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UyXy0+bmVzdGVkX3R5cGVfY291bnQoKSk7CisgICAgZm9vMl8gPSBtZXNzYWdlMl8tPm5lc3RlZF90eXBlKDApOworICAgIGJhejJfID0gbWVzc2FnZTJfLT5uZXN0ZWRfdHlwZSgxKTsKKworICAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlMl8tPmVudW1fdHlwZV9jb3VudCgpKTsKKyAgICBxdXgyXyA9IG1lc3NhZ2UyXy0+ZW51bV90eXBlKDApOworICAgIHF1dXgyXyA9IG1lc3NhZ2UyXy0+ZW51bV90eXBlKDEpOworCisgICAgQVNTRVJUX0VRKDEsIHF1eDJfLT52YWx1ZV9jb3VudCgpKTsKKyAgICBhMl8gPSBxdXgyXy0+dmFsdWUoMCk7CisgICAgQVNTRVJUX0VRKDEsIHF1dXgyXy0+dmFsdWVfY291bnQoKSk7CisgICAgYzJfID0gcXV1eDJfLT52YWx1ZSgwKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87CisKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UyXzsKKworICBjb25zdCBEZXNjcmlwdG9yKiBmb29fOworICBjb25zdCBEZXNjcmlwdG9yKiBiYXJfOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogYmF6XzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIHF1eF87CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGFfOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiXzsKKworICBjb25zdCBEZXNjcmlwdG9yKiBmb28yXzsKKyAgY29uc3QgRGVzY3JpcHRvciogYmF6Ml87CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBxdXgyXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIHF1dXgyXzsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogYTJfOworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBjMl87Cit9OworCitURVNUX0YoTmVzdGVkRGVzY3JpcHRvclRlc3QsIE1lc3NhZ2VOYW1lKSB7CisgIEVYUEVDVF9FUSgiRm9vIiwgZm9vXyAtPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiQmFyIiwgYmFyXyAtPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiRm9vIiwgZm9vMl8tPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiQmF6IiwgYmF6Ml8tPm5hbWUoKSk7CisKKyAgRVhQRUNUX0VRKCJUZXN0TWVzc2FnZS5Gb28iLCBmb29fLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuQmFyIiwgYmFyXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0TWVzc2FnZTIuRm9vIiwgZm9vMl8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLkJheiIsIGJhejJfLT5mdWxsX25hbWUoKSk7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgTWVzc2FnZUNvbnRhaW5pbmdUeXBlKSB7CisgIEVYUEVDVF9FUShtZXNzYWdlXyAsIGZvb18gLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXyAsIGJhcl8gLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMl8sIGZvbzJfLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMl8sIGJhejJfLT5jb250YWluaW5nX3R5cGUoKSk7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgTmVzdGVkTWVzc2FnZXNCeUluZGV4KSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9FUShmb29fLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGUoMCkpOworICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPm5lc3RlZF90eXBlKDEpKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kRmllbGRCeU5hbWVEb2VzbnRGaW5kTmVzdGVkVHlwZXMpIHsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU5hbWUoIlF1eCIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJRdXgiKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kTmVzdGVkVHlwZUJ5TmFtZSkgeworICBFWFBFQ1RfRVEoZm9vXyAsIG1lc3NhZ2VfIC0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIkZvbyIpKTsKKyAgRVhQRUNUX0VRKGJhcl8gLCBtZXNzYWdlXyAtPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJCYXIiKSk7CisgIEVYUEVDVF9FUShmb28yXywgbWVzc2FnZTJfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiRm9vIikpOworICBFWFBFQ1RfRVEoYmF6Ml8sIG1lc3NhZ2UyXy0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIkJheiIpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlXyAtPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJOb1N1Y2hUeXBlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfIC0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIkJheiIgICAgICAgKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiQmFyIiAgICAgICApID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiUXV4IikgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgRW51bU5hbWUpIHsKKyAgRVhQRUNUX0VRKCJCYXoiICwgYmF6XyAtPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiUXV4IiAsIHF1eF8gLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoIlF1eCIgLCBxdXgyXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJRdXV4IiwgcXV1eDJfLT5uYW1lKCkpOworCisgIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuQmF6IiwgYmF6Xy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLlF1eCIsIHF1eF8tPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLlF1eCIgLCBxdXgyXyAtPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLlF1dXgiLCBxdXV4Ml8tPmZ1bGxfbmFtZSgpKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBFbnVtQ29udGFpbmluZ1R5cGUpIHsKKyAgRVhQRUNUX0VRKG1lc3NhZ2VfICwgYmF6XyAgLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlXyAsIHF1eF8gIC0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTJfLCBxdXgyXyAtPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyXywgcXV1eDJfLT5jb250YWluaW5nX3R5cGUoKSk7Cit9CisKK1RFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgTmVzdGVkRW51bXNCeUluZGV4KSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9FUShmb29fLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGUoMCkpOworICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPm5lc3RlZF90eXBlKDEpKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kRW51bVR5cGVCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKGJhel8gICwgbWVzc2FnZV8gLT5GaW5kRW51bVR5cGVCeU5hbWUoIkJheiIgKSk7CisgIEVYUEVDVF9FUShxdXhfICAsIG1lc3NhZ2VfIC0+RmluZEVudW1UeXBlQnlOYW1lKCJRdXgiICkpOworICBFWFBFQ1RfRVEocXV4Ml8gLCBtZXNzYWdlMl8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiUXV4IiApKTsKKyAgRVhQRUNUX0VRKHF1dXgyXywgbWVzc2FnZTJfLT5GaW5kRW51bVR5cGVCeU5hbWUoIlF1dXgiKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8gLT5GaW5kRW51bVR5cGVCeU5hbWUoIk5vU3VjaFR5cGUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8gLT5GaW5kRW51bVR5cGVCeU5hbWUoIlF1dXgiICAgICAgKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kRW51bVR5cGVCeU5hbWUoIkJheiIgICAgICAgKSA9PSBOVUxMKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJGb28iKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kRW51bVZhbHVlQnlOYW1lKSB7CisgIEVYUEVDVF9FUShhXyAsIG1lc3NhZ2VfIC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQSIpKTsKKyAgRVhQRUNUX0VRKGJfICwgbWVzc2FnZV8gLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJCIikpOworICBFWFBFQ1RfRVEoYTJfLCBtZXNzYWdlMl8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkEiKSk7CisgIEVYUEVDVF9FUShjMl8sIG1lc3NhZ2UyXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQyIpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlXyAtPkZpbmRFbnVtVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZV8gLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJDIiAgICAgICAgICAgICkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQiIgICAgICAgICAgICApID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJGb28iKSA9PSBOVUxMKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUZXN0IGV4dGVuc2lvbnMuCitjbGFzcyBFeHRlbnNpb25EZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAgICAvLworICAgIC8vICAgZW51bSBCYXoge30KKyAgICAvLyAgIG1lc3NhZ2UgUXV4IHt9CisgICAgLy8KKyAgICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgICAvLyAgICAgZXh0ZW5zaW9ucyAxMCB0byAxOTsKKyAgICAvLyAgICAgZXh0ZW5zaW9ucyAzMCB0byAzOTsKKyAgICAvLyAgIH0KKyAgICAvLyAgIGV4dGVuZHMgRm9vIHdpdGggb3B0aW9uYWwgaW50MzIgZm9vX2ludDMyID0gMTA7CisgICAgLy8gICBleHRlbmRzIEZvbyB3aXRoIHJlcGVhdGVkIFRlc3RFbnVtIGZvb19lbnVtID0gMTk7CisgICAgLy8gICBtZXNzYWdlIEJhciB7CisgICAgLy8gICAgIGV4dGVuZHMgRm9vIHdpdGggb3B0aW9uYWwgUXV4IGZvb19tZXNzYWdlID0gMzA7CisgICAgLy8gICAgIC8vICh1c2luZyBRdXggYXMgdGhlIGdyb3VwIHR5cGUpCisgICAgLy8gICAgIGV4dGVuZHMgRm9vIHdpdGggcmVwZWF0ZWQgZ3JvdXAgZm9vX2dyb3VwID0gMzk7CisgICAgLy8gICB9CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlOworICAgIGZvb19maWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKworICAgIEFkZEVtcHR5RW51bSgmZm9vX2ZpbGUsICJCYXoiKTsKKyAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIlF1eCIpOworCisgICAgRGVzY3JpcHRvclByb3RvKiBmb28gPSBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkZvbyIpOworICAgIEFkZEV4dGVuc2lvblJhbmdlKGZvbywgMTAsIDIwKTsKKyAgICBBZGRFeHRlbnNpb25SYW5nZShmb28sIDMwLCA0MCk7CisKKyAgICBBZGRFeHRlbnNpb24oJmZvb19maWxlLCAiRm9vIiwgImZvb19pbnQzMiIsIDEwLAorICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRFeHRlbnNpb24oJmZvb19maWxlLCAiRm9vIiwgImZvb19lbnVtIiwgMTksCisgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCwKKyAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTSkKKyAgICAgIC0+c2V0X3R5cGVfbmFtZSgiQmF6Iik7CisKKyAgICBEZXNjcmlwdG9yUHJvdG8qIGJhciA9IEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiQmFyIik7CisgICAgQWRkTmVzdGVkRXh0ZW5zaW9uKGJhciwgIkZvbyIsICJmb29fbWVzc2FnZSIsIDMwLAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX01FU1NBR0UpCisgICAgICAtPnNldF90eXBlX25hbWUoIlF1eCIpOworICAgIEFkZE5lc3RlZEV4dGVuc2lvbihiYXIsICJGb28iLCAiZm9vX2dyb3VwIiwgMzksCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfR1JPVVApCisgICAgICAtPnNldF90eXBlX25hbWUoIlF1eCIpOworCisgICAgLy8gQnVpbGQgdGhlIGRlc2NyaXB0b3JzIGFuZCBnZXQgdGhlIHBvaW50ZXJzLgorICAgIGZvb19maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShmb29fZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IE5VTEwpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+ZW51bV90eXBlX2NvdW50KCkpOworICAgIGJhel8gPSBmb29fZmlsZV8tPmVudW1fdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgzLCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBxdXhfID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7CisgICAgZm9vXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDEpOworICAgIGJhcl8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgyKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vXzsKKyAgY29uc3QgRGVzY3JpcHRvciogYmFyXzsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGJhel87CisgIGNvbnN0IERlc2NyaXB0b3IqIHF1eF87Cit9OworCitURVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIEV4dGVuc2lvblJhbmdlcykgeworICBFWFBFQ1RfRVEoMCwgYmFyXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOworICBBU1NFUlRfRVEoMiwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOworCisgIEVYUEVDVF9FUSgxMCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDApLT5zdGFydCk7CisgIEVYUEVDVF9FUSgzMCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDEpLT5zdGFydCk7CisKKyAgRVhQRUNUX0VRKDIwLCBmb29fLT5leHRlbnNpb25fcmFuZ2UoMCktPmVuZCk7CisgIEVYUEVDVF9FUSg0MCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDEpLT5lbmQpOworfTsKKworVEVTVF9GKEV4dGVuc2lvbkRlc2NyaXB0b3JUZXN0LCBFeHRlbnNpb25zKSB7CisgIEVYUEVDVF9FUSgwLCBmb29fLT5leHRlbnNpb25fY291bnQoKSk7CisgIEFTU0VSVF9FUSgyLCBmb29fZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKDIsIGJhcl8tPmV4dGVuc2lvbl9jb3VudCgpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+aXNfZXh0ZW5zaW9uKCkpOworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+aXNfZXh0ZW5zaW9uKCkpOworICBFWFBFQ1RfVFJVRShiYXJfLT5leHRlbnNpb24oMCktPmlzX2V4dGVuc2lvbigpKTsKKyAgRVhQRUNUX1RSVUUoYmFyXy0+ZXh0ZW5zaW9uKDEpLT5pc19leHRlbnNpb24oKSk7CisKKyAgRVhQRUNUX0VRKCJmb29faW50MzIiICAsIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImZvb19lbnVtIiAgICwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMSktPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vX21lc3NhZ2UiLCBiYXJfLT5leHRlbnNpb24oMCktPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vX2dyb3VwIiAgLCBiYXJfLT5leHRlbnNpb24oMSktPm5hbWUoKSk7CisKKyAgRVhQRUNUX0VRKDEwLCBmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+bnVtYmVyKCkpOworICBFWFBFQ1RfRVEoMTksIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDEpLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSgzMCwgYmFyXy0+ZXh0ZW5zaW9uKDApLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSgzOSwgYmFyXy0+ZXh0ZW5zaW9uKDEpLT5udW1iZXIoKSk7CisKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMiAgLCBmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNICAgLCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBiYXJfLT5leHRlbnNpb24oMCktPnR5cGUoKSk7CisgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgICwgYmFyXy0+ZXh0ZW5zaW9uKDEpLT50eXBlKCkpOworCisgIEVYUEVDVF9FUShiYXpfLCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+ZW51bV90eXBlKCkpOworICBFWFBFQ1RfRVEocXV4XywgYmFyXy0+ZXh0ZW5zaW9uKDApLT5tZXNzYWdlX3R5cGUoKSk7CisgIEVYUEVDVF9FUShxdXhfLCBiYXJfLT5leHRlbnNpb24oMSktPm1lc3NhZ2VfdHlwZSgpKTsKKworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMCktPmxhYmVsKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMSktPmxhYmVsKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgYmFyXy0+ZXh0ZW5zaW9uKDApLT5sYWJlbCgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQsIGJhcl8tPmV4dGVuc2lvbigxKS0+bGFiZWwoKSk7CisKKyAgRVhQRUNUX0VRKGZvb18sIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShmb29fLCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+Y29udGFpbmluZ190eXBlKCkpOworICBFWFBFQ1RfRVEoZm9vXywgYmFyXy0+ZXh0ZW5zaW9uKDApLT5jb250YWluaW5nX3R5cGUoKSk7CisgIEVYUEVDVF9FUShmb29fLCBiYXJfLT5leHRlbnNpb24oMSktPmNvbnRhaW5pbmdfdHlwZSgpKTsKKworICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+ZXh0ZW5zaW9uKDEpLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKTsKKyAgRVhQRUNUX0VRKGJhcl8sIGJhcl8tPmV4dGVuc2lvbigwKS0+ZXh0ZW5zaW9uX3Njb3BlKCkpOworICBFWFBFQ1RfRVEoYmFyXywgYmFyXy0+ZXh0ZW5zaW9uKDEpLT5leHRlbnNpb25fc2NvcGUoKSk7Cit9OworCitURVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIElzRXh0ZW5zaW9uTnVtYmVyKSB7CisgIEVYUEVDVF9GQUxTRShmb29fLT5Jc0V4dGVuc2lvbk51bWJlciggOSkpOworICBFWFBFQ1RfVFJVRSAoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoMTApKTsKKyAgRVhQRUNUX1RSVUUgKGZvb18tPklzRXh0ZW5zaW9uTnVtYmVyKDE5KSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5Jc0V4dGVuc2lvbk51bWJlcigyMCkpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoMjkpKTsKKyAgRVhQRUNUX1RSVUUgKGZvb18tPklzRXh0ZW5zaW9uTnVtYmVyKDMwKSk7CisgIEVYUEVDVF9UUlVFIChmb29fLT5Jc0V4dGVuc2lvbk51bWJlcigzOSkpOworICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoNDApKTsKK30KKworVEVTVF9GKEV4dGVuc2lvbkRlc2NyaXB0b3JUZXN0LCBGaW5kRXh0ZW5zaW9uQnlOYW1lKSB7CisgIC8vIE5vdGUgdGhhdCBGaWxlRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5TmFtZSgpIGlzIHRlc3RlZCBieQorICAvLyBGaWxlRGVzY3JpcHRvclRlc3QuCisgIEFTU0VSVF9FUSgyLCBiYXJfLT5leHRlbnNpb25fY291bnQoKSk7CisKKyAgRVhQRUNUX0VRKGJhcl8tPmV4dGVuc2lvbigwKSwgYmFyXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX21lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUShiYXJfLT5leHRlbnNpb24oMSksIGJhcl8tPkZpbmRFeHRlbnNpb25CeU5hbWUoImZvb19ncm91cCIgICkpOworCisgIEVYUEVDVF9UUlVFKGJhcl8tPkZpbmRFeHRlbnNpb25CeU5hbWUoIm5vX3N1Y2hfZXh0ZW5zaW9uIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZvb18tPkZpbmRFeHRlbnNpb25CeU5hbWUoImZvb19pbnQzMiIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShmb29fLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJmb29fbWVzc2FnZSIpID09IE5VTEwpOworfQorCitURVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIEZpbmRBbGxFeHRlbnNpb25zKSB7CisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBleHRlbnNpb25zOworICBwb29sXy5GaW5kQWxsRXh0ZW5zaW9ucyhmb29fLCAmZXh0ZW5zaW9ucyk7CisgIEFTU0VSVF9FUSg0LCBleHRlbnNpb25zLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxMCwgZXh0ZW5zaW9uc1swXS0+bnVtYmVyKCkpOworICBFWFBFQ1RfRVEoMTksIGV4dGVuc2lvbnNbMV0tPm51bWJlcigpKTsKKyAgRVhQRUNUX0VRKDMwLCBleHRlbnNpb25zWzJdLT5udW1iZXIoKSk7CisgIEVYUEVDVF9FUSgzOSwgZXh0ZW5zaW9uc1szXS0+bnVtYmVyKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIE1pc2NUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gRnVuY3Rpb24gd2hpY2ggbWFrZXMgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gdHlwZSBqdXN0IHRvIGZpbmQgb3V0IHdoYXQgaXRzCisgIC8vIGNwcF90eXBlIGlzLgorICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgR2V0Q3BwVHlwZUZvckZpZWxkVHlwZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgICBmaWxlX3Byb3RvLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgICBBZGRFbXB0eUVudW0oJmZpbGVfcHJvdG8sICJEdW1teUVudW0iKTsKKworICAgIERlc2NyaXB0b3JQcm90byogbWVzc2FnZSA9IEFkZE1lc3NhZ2UoJmZpbGVfcHJvdG8sICJUZXN0TWVzc2FnZSIpOworICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCA9CisgICAgICBBZGRGaWVsZChtZXNzYWdlLCAiZm9vIiwgMSwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGU+KHN0YXRpY19jYXN0PGludD4odHlwZSkpKTsKKworICAgIGlmICh0eXBlID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFIHx8CisgICAgICAgIHR5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgICBmaWVsZC0+c2V0X3R5cGVfbmFtZSgiVGVzdE1lc3NhZ2UiKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU0pIHsKKyAgICAgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKCJEdW1teUVudW0iKTsKKyAgICB9CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pOworCisgICAgaWYgKGZpbGUgIT0gTlVMTCAmJgorICAgICAgICBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSA9PSAxICYmCisgICAgICAgIGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+ZmllbGRfY291bnQoKSA9PSAxKSB7CisgICAgICByZXR1cm4gZmlsZS0+bWVzc2FnZV90eXBlKDApLT5maWVsZCgwKS0+Y3BwX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZT4oMCk7CisgICAgfQorICB9Cit9OworCitURVNUX0YoTWlzY1Rlc3QsIENwcFR5cGVzKSB7CisgIC8vIFRlc3QgdGhhdCBDUFAgdHlwZXMgYXJlIGFzc2lnbmVkIGNvcnJlY3RseS4KKworICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvciBGRDsgIC8vIGF2b2lkIHVnbHkgbGluZSB3cmFwcGluZworCisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9ET1VCTEUgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0RPVUJMRSAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9GTE9BVCAgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZMT0FUICAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9JTlQ2NCAgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0lOVDY0ICAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9VSU5UNjQgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX1VJTlQ2NCAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9JTlQzMiAgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0lOVDMyICAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9VSU5UNjQgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZJWEVENjQgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9VSU5UMzIgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZJWEVEMzIgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9CT09MICAgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JPT0wgICAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9TVFJJTkcgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NUUklORyAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9NRVNTQUdFLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0dST1VQICAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9NRVNTQUdFLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX01FU1NBR0UgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9TVFJJTkcgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JZVEVTICAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9VSU5UMzIgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX1VJTlQzMiAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9FTlVNICAgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX0VOVU0gICAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9JTlQzMiAgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NGSVhFRDMyKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9JTlQ2NCAgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NGSVhFRDY0KSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9JTlQzMiAgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NJTlQzMiAgKSk7CisgIEVYUEVDVF9FUShGRDo6Q1BQVFlQRV9JTlQ2NCAgLCBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NJTlQ2NCAgKSk7Cit9CisKK1RFU1RfRihNaXNjVGVzdCwgRGVmYXVsdFZhbHVlcykgeworICAvLyBUZXN0IHRoYXQgc2V0dGluZyBkZWZhdWx0IHZhbHVlcyB3b3Jrcy4KKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBmaWxlX3Byb3RvLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKworICBFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3R5cGVfcHJvdG8gPSBBZGRFbnVtKCZmaWxlX3Byb3RvLCAiRHVtbXlFbnVtIik7CisgIEFkZEVudW1WYWx1ZShlbnVtX3R5cGVfcHJvdG8sICJBIiwgMSk7CisgIEFkZEVudW1WYWx1ZShlbnVtX3R5cGVfcHJvdG8sICJCIiwgMik7CisKKyAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlX3Byb3RvID0gQWRkTWVzc2FnZSgmZmlsZV9wcm90bywgIlRlc3RNZXNzYWdlIik7CisKKyAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3JQcm90byBGRDsgIC8vIGF2b2lkIHVnbHkgbGluZSB3cmFwcGluZworICBjb25zdCBGRDo6TGFiZWwgbGFiZWwgPSBGRDo6TEFCRUxfT1BUSU9OQUw7CisKKyAgLy8gQ3JlYXRlIGZpZWxkcyBvZiBldmVyeSBDUFAgdHlwZSB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW50MzIiICwgMSwgbGFiZWwsIEZEOjpUWVBFX0lOVDMyICkKKyAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCItMSIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW50NjQiICwgMiwgbGFiZWwsIEZEOjpUWVBFX0lOVDY0ICkKKyAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCItMTAwMDAwMDAwMDAwMCIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAidWludDMyIiwgMywgbGFiZWwsIEZEOjpUWVBFX1VJTlQzMikKKyAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCI0MiIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAidWludDY0IiwgNCwgbGFiZWwsIEZEOjpUWVBFX1VJTlQ2NCkKKyAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCIyMDAwMDAwMDAwMDAwIik7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJmbG9hdCIgLCA1LCBsYWJlbCwgRkQ6OlRZUEVfRkxPQVQgKQorICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoIjQuNSIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiZG91YmxlIiwgNiwgbGFiZWwsIEZEOjpUWVBFX0RPVUJMRSkKKyAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCIxMGUxMDAiKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImJvb2wiICAsIDcsIGxhYmVsLCBGRDo6VFlQRV9CT09MICApCisgICAgLT5zZXRfZGVmYXVsdF92YWx1ZSgidHJ1ZSIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAic3RyaW5nIiwgOCwgbGFiZWwsIEZEOjpUWVBFX1NUUklORykKKyAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCJoZWxsbyIpOworICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiZGF0YSIgICwgOSwgbGFiZWwsIEZEOjpUWVBFX0JZVEVTICkKKyAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCJcXDAwMVxcMDAyXFwwMDMiKTsKKworICBGaWVsZERlc2NyaXB0b3JQcm90byogZW51bV9maWVsZCA9CisgICAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImVudW0iLCAxMCwgbGFiZWwsIEZEOjpUWVBFX0VOVU0pOworICBlbnVtX2ZpZWxkLT5zZXRfdHlwZV9uYW1lKCJEdW1teUVudW0iKTsKKyAgZW51bV9maWVsZC0+c2V0X2RlZmF1bHRfdmFsdWUoIkIiKTsKKworICAvLyBTdHJpbmdzIGFyZSBhbGxvd2VkIHRvIGhhdmUgZW1wdHkgZGVmYXVsdHMuICAoQXQgb25lIHBvaW50LCBkdWUgdG8KKyAgLy8gYSBidWcsIGVtcHR5IGRlZmF1bHRzIGZvciBzdHJpbmdzIHdlcmUgcmVqZWN0ZWQuICBPb3BzLikKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImVtcHR5X3N0cmluZyIsIDExLCBsYWJlbCwgRkQ6OlRZUEVfU1RSSU5HKQorICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoIiIpOworCisgIC8vIEFkZCBhIHNlY29uZCBzZXQgb2YgZmllbGRzIHdpdGggaW1wbGljaXQgZGVmYWx1dCB2YWx1ZXMuCisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF9pbnQzMiIgLCAyMSwgbGFiZWwsIEZEOjpUWVBFX0lOVDMyICk7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF9pbnQ2NCIgLCAyMiwgbGFiZWwsIEZEOjpUWVBFX0lOVDY0ICk7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF91aW50MzIiLCAyMywgbGFiZWwsIEZEOjpUWVBFX1VJTlQzMik7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF91aW50NjQiLCAyNCwgbGFiZWwsIEZEOjpUWVBFX1VJTlQ2NCk7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF9mbG9hdCIgLCAyNSwgbGFiZWwsIEZEOjpUWVBFX0ZMT0FUICk7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF9kb3VibGUiLCAyNiwgbGFiZWwsIEZEOjpUWVBFX0RPVUJMRSk7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF9ib29sIiAgLCAyNywgbGFiZWwsIEZEOjpUWVBFX0JPT0wgICk7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF9zdHJpbmciLCAyOCwgbGFiZWwsIEZEOjpUWVBFX1NUUklORyk7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF9kYXRhIiAgLCAyOSwgbGFiZWwsIEZEOjpUWVBFX0JZVEVTICk7CisgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJpbXBsaWNpdF9lbnVtIiAgLCAzMCwgbGFiZWwsIEZEOjpUWVBFX0VOVU0pCisgICAgLT5zZXRfdHlwZV9uYW1lKCJEdW1teUVudW0iKTsKKworICAvLyBCdWlsZCBpdC4KKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKKworICBBU1NFUlRfRVEoMSwgZmlsZS0+ZW51bV90eXBlX2NvdW50KCkpOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlID0gZmlsZS0+ZW51bV90eXBlKDApOworICBBU1NFUlRfRVEoMiwgZW51bV90eXBlLT52YWx1ZV9jb3VudCgpKTsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZV9hID0gZW51bV90eXBlLT52YWx1ZSgwKTsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZV9iID0gZW51bV90eXBlLT52YWx1ZSgxKTsKKworICBBU1NFUlRfRVEoMSwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlID0gZmlsZS0+bWVzc2FnZV90eXBlKDApOworCisgIEFTU0VSVF9FUSgyMSwgbWVzc2FnZS0+ZmllbGRfY291bnQoKSk7CisKKyAgLy8gQ2hlY2sgdGhlIGRlZmF1bHQgdmFsdWVzLgorICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCgwKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDEpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoMiktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCgzKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDQpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoNSktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCg2KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDcpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoOCktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCg5KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDEwKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisKKyAgRVhQRUNUX0VRKC0xICAgICAgICAgICAgICAsIG1lc3NhZ2UtPmZpZWxkKDApLT5kZWZhdWx0X3ZhbHVlX2ludDMyICgpKTsKKyAgRVhQRUNUX0VRKC1HT09HTEVfVUxPTkdMT05HKDEwMDAwMDAwMDAwMDApLAorICAgICAgICAgICAgbWVzc2FnZS0+ZmllbGQoMSktPmRlZmF1bHRfdmFsdWVfaW50NjQgKCkpOworICBFWFBFQ1RfRVEoNDIgICAgICAgICAgICAgICwgbWVzc2FnZS0+ZmllbGQoMiktPmRlZmF1bHRfdmFsdWVfdWludDMyKCkpOworICBFWFBFQ1RfRVEoR09PR0xFX1VMT05HTE9ORygyMDAwMDAwMDAwMDAwKSwKKyAgICAgICAgICAgIG1lc3NhZ2UtPmZpZWxkKDMpLT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKTsKKyAgRVhQRUNUX0VRKDQuNSAgICAgICAgICAgICAsIG1lc3NhZ2UtPmZpZWxkKDQpLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0ICgpKTsKKyAgRVhQRUNUX0VRKDEwZTEwMCAgICAgICAgICAsIG1lc3NhZ2UtPmZpZWxkKDUpLT5kZWZhdWx0X3ZhbHVlX2RvdWJsZSgpKTsKKyAgRVhQRUNUX0VRKHRydWUgICAgICAgICAgICAsIG1lc3NhZ2UtPmZpZWxkKDYpLT5kZWZhdWx0X3ZhbHVlX2Jvb2wgICgpKTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIgICAgICAgICAsIG1lc3NhZ2UtPmZpZWxkKDcpLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJcMDAxXDAwMlwwMDMiICAsIG1lc3NhZ2UtPmZpZWxkKDgpLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKGVudW1fdmFsdWVfYiAgICAsIG1lc3NhZ2UtPmZpZWxkKDkpLT5kZWZhdWx0X3ZhbHVlX2VudW0gICgpKTsKKyAgRVhQRUNUX0VRKCIiICAgICAgICAgICAgICAsIG1lc3NhZ2UtPmZpZWxkKDEwKS0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSk7CisKKyAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDExKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxMiktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTMpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDE0KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxNSktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTYpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDE3KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisgIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxOCktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOworICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTkpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKKyAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDIwKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CisKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLT5maWVsZCgxMSktPmRlZmF1bHRfdmFsdWVfaW50MzIgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UtPmZpZWxkKDEyKS0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS0+ZmllbGQoMTMpLT5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLT5maWVsZCgxNCktPmRlZmF1bHRfdmFsdWVfdWludDY0KCkpOworICBFWFBFQ1RfRVEoMC4wZiAsIG1lc3NhZ2UtPmZpZWxkKDE1KS0+ZGVmYXVsdF92YWx1ZV9mbG9hdCAoKSk7CisgIEVYUEVDVF9FUSgwLjAgICwgbWVzc2FnZS0+ZmllbGQoMTYpLT5kZWZhdWx0X3ZhbHVlX2RvdWJsZSgpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLT5maWVsZCgxNyktPmRlZmF1bHRfdmFsdWVfYm9vbCAgKCkpOworICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2UtPmZpZWxkKDE4KS0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgiIiAgICwgbWVzc2FnZS0+ZmllbGQoMTkpLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKGVudW1fdmFsdWVfYSwgbWVzc2FnZS0+ZmllbGQoMjApLT5kZWZhdWx0X3ZhbHVlX2VudW0oKSk7Cit9CisKK1RFU1RfRihNaXNjVGVzdCwgRmllbGRPcHRpb25zKSB7CisgIC8vIFRyeSBzZXR0aW5nIGZpZWxkIG9wdGlvbnMuCisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBmaWxlX3Byb3RvLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKworICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2VfcHJvdG8gPSBBZGRNZXNzYWdlKCZmaWxlX3Byb3RvLCAiVGVzdE1lc3NhZ2UiKTsKKyAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImZvbyIsIDEsCisgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICBGaWVsZERlc2NyaXB0b3JQcm90byogYmFyX3Byb3RvID0KKyAgICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiYmFyIiwgMiwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworCisgIEZpZWxkT3B0aW9ucyogb3B0aW9ucyA9IGJhcl9wcm90by0+bXV0YWJsZV9vcHRpb25zKCk7CisgIG9wdGlvbnMtPnNldF9jdHlwZShGaWVsZE9wdGlvbnM6OkNPUkQpOworCisgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKKworICBBU1NFUlRfRVEoMSwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlID0gZmlsZS0+bWVzc2FnZV90eXBlKDApOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLT5maWVsZF9jb3VudCgpKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmb28gPSBtZXNzYWdlLT5maWVsZCgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiYXIgPSBtZXNzYWdlLT5maWVsZCgxKTsKKworICAvLyAiZm9vIiBoYWQgbm8gb3B0aW9ucyBzZXQsIHNvIGl0IHNob3VsZCByZXR1cm4gdGhlIGRlZmF1bHQgb3B0aW9ucy4KKyAgRVhQRUNUX0VRKCZGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSwgJmZvby0+b3B0aW9ucygpKTsKKworICAvLyAiYmFyIiBoYWQgb3B0aW9ucyBzZXQuCisgIEVYUEVDVF9ORSgmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCksIG9wdGlvbnMpOworICBFWFBFQ1RfVFJVRShiYXItPm9wdGlvbnMoKS5oYXNfY3R5cGUoKSk7CisgIEVYUEVDVF9FUShGaWVsZE9wdGlvbnM6OkNPUkQsIGJhci0+b3B0aW9ucygpLmN0eXBlKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fcHJvdG8sIGJhcl9wcm90bzsKKworICAgIHBvb2xfLkFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpOworCisgICAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nIgorICAgICAgImRlcGVuZGVuY3k6ICdiYXIucHJvdG8nIgorICAgICAgImRlcGVuZGVuY3k6ICdiYXoucHJvdG8nIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogJ0ZvbyciCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2JhcicgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOidCYXInIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2JheicgbnVtYmVyOjIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOidCYXonIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6J3F1eCcgbnVtYmVyOjMgbGFiZWw6TEFCRUxfT1BUSU9OQUwiCisgICAgICAiICAgIHR5cGVfbmFtZTogJy5jb3JnZS5RdXgnIgorICAgICAgIiAgICB0eXBlOiBUWVBFX0VOVU0iCisgICAgICAiICAgIG9wdGlvbnMgeyIKKyAgICAgICIgICAgICB1bmludGVycHJldGVkX29wdGlvbiB7IgorICAgICAgIiAgICAgICAgbmFtZSB7IgorICAgICAgIiAgICAgICAgICBuYW1lX3BhcnQ6ICdncmF1bHQnIgorICAgICAgIiAgICAgICAgICBpc19leHRlbnNpb246IHRydWUiCisgICAgICAiICAgICAgICB9IgorICAgICAgIiAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxMjM0IgorICAgICAgIiAgICAgIH0iCisgICAgICAiICAgIH0iCisgICAgICAiICB9IgorICAgICAgIn0iLAorICAgICAgJmZvb19wcm90bykpOworICAgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAgICJuYW1lOiAnYmFyLnByb3RvJyIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiAnQmFyJyB9IiwKKyAgICAgICZiYXJfcHJvdG8pKTsKKworICAgIC8vIENvbGxlY3QgcG9pbnRlcnMgdG8gc3R1ZmYuCisgICAgYmFyX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGJhcl9wcm90byk7CisgICAgQVNTRVJUX1RSVUUoYmFyX2ZpbGVfICE9IE5VTEwpOworCisgICAgQVNTRVJUX0VRKDEsIGJhcl9maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGJhcl90eXBlXyA9IGJhcl9maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19wcm90byk7CisgICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IE5VTEwpOworCisgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIGZvb190eXBlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDMsIGZvb190eXBlXy0+ZmllbGRfY291bnQoKSk7CisgICAgYmFyX2ZpZWxkXyA9IGZvb190eXBlXy0+ZmllbGQoMCk7CisgICAgYmF6X2ZpZWxkXyA9IGZvb190eXBlXy0+ZmllbGQoMSk7CisgICAgcXV4X2ZpZWxkXyA9IGZvb190eXBlXy0+ZmllbGQoMik7CisgIH0KKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmFyX2ZpbGVfOworICBjb25zdCBEZXNjcmlwdG9yKiBiYXJfdHlwZV87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGZvb190eXBlXzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiYXJfZmllbGRfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhel9maWVsZF87CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcXV4X2ZpZWxkXzsKKworICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKK307CisKK1RFU1RfRihBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBQbGFjZWhvbGRlckZpbGUpIHsKKyAgQVNTRVJUX0VRKDIsIGZvb19maWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGJhcl9maWxlXywgZm9vX2ZpbGVfLT5kZXBlbmRlbmN5KDApKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmF6X2ZpbGUgPSBmb29fZmlsZV8tPmRlcGVuZGVuY3koMSk7CisgIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgYmF6X2ZpbGUtPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgwLCBiYXpfZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworCisgIC8vIFBsYWNlaG9sZGVyIGZpbGVzIHNob3VsZCBub3QgYmUgZmluZGFibGUuCisgIEVYUEVDVF9FUShiYXJfZmlsZV8sIHBvb2xfLkZpbmRGaWxlQnlOYW1lKGJhcl9maWxlXy0+bmFtZSgpKSk7CisgIEVYUEVDVF9UUlVFKHBvb2xfLkZpbmRGaWxlQnlOYW1lKGJhel9maWxlLT5uYW1lKCkpID09IE5VTEwpOworfQorCitURVNUX0YoQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdCwgUGxhY2Vob2xkZXJUeXBlcykgeworICBBU1NFUlRfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UsIGJhcl9maWVsZF8tPnR5cGUoKSk7CisgIEVYUEVDVF9FUShiYXJfdHlwZV8sIGJhcl9maWVsZF8tPm1lc3NhZ2VfdHlwZSgpKTsKKworICBBU1NFUlRfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UsIGJhel9maWVsZF8tPnR5cGUoKSk7CisgIGNvbnN0IERlc2NyaXB0b3IqIGJhel90eXBlID0gYmF6X2ZpZWxkXy0+bWVzc2FnZV90eXBlKCk7CisgIEVYUEVDVF9FUSgiQmF6IiwgYmF6X3R5cGUtPm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiQmF6IiwgYmF6X3R5cGUtPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJCYXoucGxhY2Vob2xkZXIucHJvdG8iLCBiYXpfdHlwZS0+ZmlsZSgpLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoMCwgYmF6X3R5cGUtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpKTsKKworICBBU1NFUlRfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU0sIHF1eF9maWVsZF8tPnR5cGUoKSk7CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBxdXhfdHlwZSA9IHF1eF9maWVsZF8tPmVudW1fdHlwZSgpOworICBFWFBFQ1RfRVEoIlF1eCIsIHF1eF90eXBlLT5uYW1lKCkpOworICBFWFBFQ1RfRVEoImNvcmdlLlF1eCIsIHF1eF90eXBlLT5mdWxsX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiY29yZ2UuUXV4LnBsYWNlaG9sZGVyLnByb3RvIiwgcXV4X3R5cGUtPmZpbGUoKS0+bmFtZSgpKTsKKworICAvLyBQbGFjZWhvbGRlciB0eXBlcyBzaG91bGQgbm90IGJlIGZpbmRhYmxlLgorICBFWFBFQ1RfRVEoYmFyX3R5cGVfLCBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoYmFyX3R5cGVfLT5mdWxsX25hbWUoKSkpOworICBFWFBFQ1RfVFJVRShwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoYmF6X3R5cGUtPmZ1bGxfbmFtZSgpKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uRmluZEVudW1UeXBlQnlOYW1lKHF1eF90eXBlLT5mdWxsX25hbWUoKSkgPT0gTlVMTCk7Cit9CisKK1RFU1RfRihBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBDb3B5VG8pIHsKKyAgLy8gRmllbGREZXNjcmlwdG9yOjpDb3B5VG8oKSBzaG91bGQgd3JpdGUgbm9uLWZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWVzCisgIC8vIGZvciBwbGFjZWhvbGRlciB0eXBlcyB3aGljaCB3ZXJlIG5vdCBvcmlnaW5hbGx5IGZ1bGx5LXF1YWxpZmllZC4KKyAgRmllbGREZXNjcmlwdG9yUHJvdG8gcHJvdG87CisKKyAgLy8gQmFyIGlzIG5vdCBhIHBsYWNlaG9sZGVyLCBzbyBpdCBpcyBmdWxseS1xdWFsaWZpZWQuCisgIGJhcl9maWVsZF8tPkNvcHlUbygmcHJvdG8pOworICBFWFBFQ1RfRVEoIi5CYXIiLCBwcm90by50eXBlX25hbWUoKSk7CisgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9NRVNTQUdFLCBwcm90by50eXBlKCkpOworCisgIC8vIEJheiBpcyBhbiB1bnF1YWxpZmllZCBwbGFjZWhvbGRlci4KKyAgcHJvdG8uQ2xlYXIoKTsKKyAgYmF6X2ZpZWxkXy0+Q29weVRvKCZwcm90byk7CisgIEVYUEVDVF9FUSgiQmF6IiwgcHJvdG8udHlwZV9uYW1lKCkpOworICBFWFBFQ1RfRkFMU0UocHJvdG8uaGFzX3R5cGUoKSk7CisKKyAgLy8gUXV4IGlzIGEgZnVsbHktcXVhbGlmaWVkIHBsYWNlaG9sZGVyLgorICBwcm90by5DbGVhcigpOworICBxdXhfZmllbGRfLT5Db3B5VG8oJnByb3RvKTsKKyAgRVhQRUNUX0VRKCIuY29yZ2UuUXV4IiwgcHJvdG8udHlwZV9uYW1lKCkpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTSwgcHJvdG8udHlwZSgpKTsKK30KKworVEVTVF9GKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIEN1c3RvbU9wdGlvbnMpIHsKKyAgLy8gUXV4IHNob3VsZCBzdGlsbCBoYXZlIHRoZSB1bmludGVycHJldGVkIG9wdGlvbiBhdHRhY2hlZC4KKyAgQVNTRVJUX0VRKDEsIHF1eF9maWVsZF8tPm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbl9zaXplKCkpOworICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24gPQorICAgIHF1eF9maWVsZF8tPm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKTsKKyAgQVNTRVJUX0VRKDEsIG9wdGlvbi5uYW1lX3NpemUoKSk7CisgIEVYUEVDVF9FUSgiZ3JhdWx0Iiwgb3B0aW9uLm5hbWUoMCkubmFtZV9wYXJ0KCkpOworfQorCitURVNUX0YoQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdCwgVW5rbm93bkV4dGVuZGVlKSB7CisgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gZXh0ZW5kIGFuIHVua25vd24gdHlwZS4gIFRoaXMgaXMgc2xpZ2h0bHkgdHJpY2t5IGJlY2F1c2UKKyAgLy8gaXQgbWVhbnMgdGhhdCB0aGUgcGxhY2Vob2xkZXIgdHlwZSBtdXN0IGhhdmUgYW4gZXh0ZW5zaW9uIHJhbmdlLgorCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uX3Byb3RvOworCisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAibmFtZTogJ2V4dGVuc2lvbi5wcm90byciCisgICAgImV4dGVuc2lvbiB7IGV4dGVuZGVlOiAnVW5rbm93blR5cGUnIG5hbWU6J3NvbWVfZXh0ZW5zaW9uJyBudW1iZXI6MTIzIgorICAgICIgICAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIsCisgICAgJmV4dGVuc2lvbl9wcm90bykpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2xfLkJ1aWxkRmlsZShleHRlbnNpb25fcHJvdG8pOworCisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7CisKKyAgQVNTRVJUX0VRKDEsIGZpbGUtPmV4dGVuc2lvbl9jb3VudCgpKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUgPSBmaWxlLT5leHRlbnNpb24oMCktPmNvbnRhaW5pbmdfdHlwZSgpOworICBFWFBFQ1RfRVEoIlVua25vd25UeXBlIiwgZXh0ZW5kZWUtPm5hbWUoKSk7CisgIEFTU0VSVF9FUSgxLCBleHRlbmRlZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgZXh0ZW5kZWUtPmV4dGVuc2lvbl9yYW5nZSgwKS0+c3RhcnQpOworICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyICsgMSwgZXh0ZW5kZWUtPmV4dGVuc2lvbl9yYW5nZSgwKS0+ZW5kKTsKK30KKworVEVTVF9GKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIEN1c3RvbU9wdGlvbikgeworICAvLyBUZXN0IHRoYXQgd2UgY2FuIHVzZSBhIGN1c3RvbSBvcHRpb24gd2l0aG91dCBoYXZpbmcgcGFyc2VkCisgIC8vIGRlc2NyaXB0b3IucHJvdG8uCisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBvcHRpb25fcHJvdG87CisKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICJuYW1lOiBcInVua25vd25fY3VzdG9tX29wdGlvbnMucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7ICIKKyAgICAiICBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiAiCisgICAgIiAgbmFtZTogXCJzb21lX29wdGlvblwiICIKKyAgICAiICBudW1iZXI6IDEyMzQ1NiAiCisgICAgIiAgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICB0eXBlOiBUWVBFX0lOVDMyICIKKyAgICAifSAiCisgICAgIm9wdGlvbnMgeyAiCisgICAgIiAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICBuYW1lIHsgIgorICAgICIgICAgICBuYW1lX3BhcnQ6IFwic29tZV9vcHRpb25cIiAiCisgICAgIiAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgIiAgICB9ICIKKyAgICAiICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMTIzNCAiCisgICAgIiAgfSAiCisgICAgIiAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICBuYW1lIHsgIgorICAgICIgICAgICBuYW1lX3BhcnQ6IFwidW5rbm93bl9vcHRpb25cIiAiCisgICAgIiAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgIiAgICB9ICIKKyAgICAiICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMTIzNCAiCisgICAgIiAgfSAiCisgICAgIiAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICBuYW1lIHsgIgorICAgICIgICAgICBuYW1lX3BhcnQ6IFwib3B0aW1pemVfZm9yXCIgIgorICAgICIgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKKyAgICAiICAgIH0gIgorICAgICIgICAgaWRlbnRpZmllcl92YWx1ZTogXCJTUEVFRFwiICIKKyAgICAiICB9ICIKKyAgICAifSIsCisgICAgJm9wdGlvbl9wcm90bykpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbF8uQnVpbGRGaWxlKG9wdGlvbl9wcm90byk7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgbm8gZXh0ZW5zaW9uIG9wdGlvbnMgd2VyZSBzZXQsIGJ1dCB0aGV5IHdlcmUgbGVmdCBhcworICAvLyB1bmludGVycHJldGVkX29wdGlvbnMuCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGZpbGUtPm9wdGlvbnMoKS5HZXRSZWZsZWN0aW9uKCktPkxpc3RGaWVsZHMoZmlsZS0+b3B0aW9ucygpLCAmZmllbGRzKTsKKyAgQVNTRVJUX0VRKDIsIGZpZWxkcy5zaXplKCkpOworICBFWFBFQ1RfVFJVRShmaWxlLT5vcHRpb25zKCkuaGFzX29wdGltaXplX2ZvcigpKTsKKyAgRVhQRUNUX0VRKDIsIGZpbGUtPm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbl9zaXplKCkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1QoQ3VzdG9tT3B0aW9ucywgT3B0aW9uTG9jYXRpb25zKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UgPQorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnM6OmRlc2NyaXB0b3IoKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBtZXNzYWdlLT5maWxlKCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBtZXNzYWdlLT5GaW5kRmllbGRCeU5hbWUoImZpZWxkMSIpOworICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW5tID0gbWVzc2FnZS0+RmluZEVudW1UeXBlQnlOYW1lKCJBbkVudW0iKTsKKyAgLy8gVE9ETyhiZW5qeSk6IFN1cHBvcnQgRW51bVZhbHVlIG9wdGlvbnMsIG9uY2UgdGhlIGNvbXBpbGVyIGRvZXMuCisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlID0KKyAgICAgIGZpbGUtPkZpbmRTZXJ2aWNlQnlOYW1lKCJUZXN0U2VydmljZVdpdGhDdXN0b21PcHRpb25zIik7CisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IHNlcnZpY2UtPkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpOworCisgIEVYUEVDVF9FUShHT09HTEVfTE9OR0xPTkcoOTg3NjU0MzIxMCksCisgICAgICAgICAgICBmaWxlLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaWxlX29wdDEpKTsKKyAgRVhQRUNUX0VRKC01NiwKKyAgICAgICAgICAgIG1lc3NhZ2UtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6Om1lc3NhZ2Vfb3B0MSkpOworICBFWFBFQ1RfRVEoR09PR0xFX0xPTkdMT05HKDg3NjU0MzIxMDkpLAorICAgICAgICAgICAgZmllbGQtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpZWxkX29wdDEpKTsKKyAgRVhQRUNUX0VRKDQyLCAgLy8gQ2hlY2sgdGhhdCB3ZSBnZXQgdGhlIGRlZmF1bHQgZm9yIGFuIG9wdGlvbiB3ZSBkb24ndCBzZXQuCisgICAgICAgICAgICBmaWVsZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmllbGRfb3B0MikpOworICBFWFBFQ1RfRVEoLTc4OSwKKyAgICAgICAgICAgIGVubS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZW51bV9vcHQxKSk7CisgIEVYUEVDVF9FUSgxMjMsCisgICAgICAgICAgICBlbm0tPnZhbHVlKDEpLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKAorICAgICAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6ZW51bV92YWx1ZV9vcHQxKSk7CisgIEVYUEVDVF9FUShHT09HTEVfTE9OR0xPTkcoLTk4NzY1NDMyMTApLAorICAgICAgICAgICAgc2VydmljZS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2VydmljZV9vcHQxKSk7CisgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6TUVUSE9ET1BUMV9WQUwyLAorICAgICAgICAgICAgbWV0aG9kLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjptZXRob2Rfb3B0MSkpOworCisgIC8vIFNlZSB0aGF0IHRoZSByZWd1bGFyIG9wdGlvbnMgd2VudCB0aHJvdWdoIHVuc2NhdGhlZC4KKyAgRVhQRUNUX1RSVUUobWVzc2FnZS0+b3B0aW9ucygpLmhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKTsKKyAgRVhQRUNUX0VRKEZpZWxkT3B0aW9uczo6Q09SRCwgZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKTsKK30KKworVEVTVChDdXN0b21PcHRpb25zLCBPcHRpb25UeXBlcykgeworICBjb25zdCBNZXNzYWdlT3B0aW9ucyogb3B0aW9ucyA9IE5VTEw7CisKKyAgb3B0aW9ucyA9CisgICAgICAmcHJvdG9idWZfdW5pdHRlc3Q6OkN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXM6OmRlc2NyaXB0b3IoKS0+b3B0aW9ucygpOworICBFWFBFQ1RfRVEoZmFsc2UgICAgLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmJvb2xfb3B0KSk7CisgIEVYUEVDVF9FUShraW50MzJtaW4sIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6aW50MzJfb3B0KSk7CisgIEVYUEVDVF9FUShraW50NjRtaW4sIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6aW50NjRfb3B0KSk7CisgIEVYUEVDVF9FUSgwICAgICAgICAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6dWludDMyX29wdCkpOworICBFWFBFQ1RfRVEoMCAgICAgICAgLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnVpbnQ2NF9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQzMm1pbiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzaW50MzJfb3B0KSk7CisgIEVYUEVDVF9FUShraW50NjRtaW4sIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2ludDY0X29wdCkpOworICBFWFBFQ1RfRVEoMCAgICAgICAgLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpeGVkMzJfb3B0KSk7CisgIEVYUEVDVF9FUSgwICAgICAgICAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Zml4ZWQ2NF9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQzMm1pbiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzZml4ZWQzMl9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQ2NG1pbiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzZml4ZWQ2NF9vcHQpKTsKKworICBvcHRpb25zID0KKyAgICAgICZwcm90b2J1Zl91bml0dGVzdDo6Q3VzdG9tT3B0aW9uTWF4SW50ZWdlclZhbHVlczo6ZGVzY3JpcHRvcigpLT5vcHRpb25zKCk7CisgIEVYUEVDVF9FUSh0cnVlICAgICAgLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmJvb2xfb3B0KSk7CisgIEVYUEVDVF9FUShraW50MzJtYXggLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmludDMyX29wdCkpOworICBFWFBFQ1RfRVEoa2ludDY0bWF4ICwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjppbnQ2NF9vcHQpKTsKKyAgRVhQRUNUX0VRKGt1aW50MzJtYXgsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6dWludDMyX29wdCkpOworICBFWFBFQ1RfRVEoa3VpbnQ2NG1heCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojp1aW50NjRfb3B0KSk7CisgIEVYUEVDVF9FUShraW50MzJtYXggLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNpbnQzMl9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQ2NG1heCAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2ludDY0X29wdCkpOworICBFWFBFQ1RfRVEoa3VpbnQzMm1heCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaXhlZDMyX29wdCkpOworICBFWFBFQ1RfRVEoa3VpbnQ2NG1heCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaXhlZDY0X29wdCkpOworICBFWFBFQ1RfRVEoa2ludDMybWF4ICwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzZml4ZWQzMl9vcHQpKTsKKyAgRVhQRUNUX0VRKGtpbnQ2NG1heCAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2ZpeGVkNjRfb3B0KSk7CisKKyAgb3B0aW9ucyA9CisgICAgICAmcHJvdG9idWZfdW5pdHRlc3Q6OkN1c3RvbU9wdGlvbk90aGVyVmFsdWVzOjpkZXNjcmlwdG9yKCktPm9wdGlvbnMoKTsKKyAgRVhQRUNUX0VRKC0xMDAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6aW50MzJfb3B0KSk7CisgIEVYUEVDVF9GTE9BVF9FUSgxMi4zNDU2Nzg5LAorICAgICAgICAgICAgICAgICAgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmbG9hdF9vcHQpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxLjIzNDU2Nzg5MDEyMzQ1Njc4OSwKKyAgICAgICAgICAgICAgICAgICBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmRvdWJsZV9vcHQpKTsKKyAgRVhQRUNUX0VRKCJIZWxsbywgXCJXb3JsZFwiIiwKKyAgICAgICAgICAgIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c3RyaW5nX29wdCkpOworCisgIEVYUEVDVF9FUShzdHJpbmcoIkhlbGxvXDBXb3JsZCIsIDExKSwKKyAgICAgICAgICAgIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Ynl0ZXNfb3B0KSk7CisKKyAgRVhQRUNUX0VRKHByb3RvYnVmX3VuaXR0ZXN0OjpEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bTo6VEVTVF9PUFRJT05fRU5VTV9UWVBFMiwKKyAgICAgICAgICAgIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZW51bV9vcHQpKTsKKworICBvcHRpb25zID0KKyAgICAgICZwcm90b2J1Zl91bml0dGVzdDo6U2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50czo6ZGVzY3JpcHRvcigpLT5vcHRpb25zKCk7CisgIEVYUEVDVF9GTE9BVF9FUSgxMiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmbG9hdF9vcHQpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxNTQsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZG91YmxlX29wdCkpOworCisgIG9wdGlvbnMgPQorICAgICAgJnByb3RvYnVmX3VuaXR0ZXN0OjpTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzOjpkZXNjcmlwdG9yKCktPm9wdGlvbnMoKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0xMiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmbG9hdF9vcHQpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgtMTU0LCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmRvdWJsZV9vcHQpKTsKK30KKworVEVTVChDdXN0b21PcHRpb25zLCBDb21wbGV4RXh0ZW5zaW9uT3B0aW9ucykgeworICBjb25zdCBNZXNzYWdlT3B0aW9ucyogb3B0aW9ucyA9CisgICAgICAmcHJvdG9idWZfdW5pdHRlc3Q6OlZhcmlvdXNDb21wbGV4T3B0aW9uczo6ZGVzY3JpcHRvcigpLT5vcHRpb25zKCk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MSkuZm9vKCksIDQyKTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQxKS4KKyAgICAgICAgICAgIEdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6cXV1eCksIDMyNCk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MSkuCisgICAgICAgICAgICBHZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvcmdlKS5xdXgoKSwgODc2KTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS5iYXooKSwgOTg3KTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS4KKyAgICAgICAgICAgIEdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Z3JhdWx0KSwgNjU0KTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS5iYXIoKS5mb28oKSwKKyAgICAgICAgICAgIDc0Myk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuYmFyKCkuCisgICAgICAgICAgICBHZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnF1dXgpLCAxOTk5KTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS5iYXIoKS4KKyAgICAgICAgICAgIEdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29yZ2UpLnF1eCgpLCAyMDA4KTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS4KKyAgICAgICAgICAgIEdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Z2FycGx5KS5mb28oKSwgNzQxKTsKKyAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS4KKyAgICAgICAgICAgIEdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Z2FycGx5KS4KKyAgICAgICAgICAgIEdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6cXV1eCksIDE5OTgpOworICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLgorICAgICAgICAgICAgR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpnYXJwbHkpLgorICAgICAgICAgICAgR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb3JnZSkucXV4KCksIDIxMjEpOworICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKAorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkNvbXBsZXhPcHRpb25UeXBlMjo6Q29tcGxleE9wdGlvblR5cGU0Ojpjb21wbGV4X29wdDQpLgorICAgICAgICAgICAgd2FsZG8oKSwgMTk3MSk7CisgIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuCisgICAgICAgICAgICBmcmVkKCkud2FsZG8oKSwgMzIxKTsKKyAgRVhQRUNUX0VRKDksIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQzKS5xdXgoKSk7CisgIEVYUEVDVF9FUSgyMiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDMpLgorICAgICAgICAgICAgICAgIGNvbXBsZXhvcHRpb250eXBlNSgpLnBsdWdoKCkpOworICBFWFBFQ1RfRVEoMjQsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleG9wdDYpLnh5enp5KCkpOworfQorCitURVNUKEN1c3RvbU9wdGlvbnMsIE9wdGlvbnNGcm9tT3RoZXJGaWxlKSB7CisgIC8vIFRlc3QgdGhhdCB0byB1c2UgYSBjdXN0b20gb3B0aW9uLCB3ZSBvbmx5IG5lZWQgdG8gaW1wb3J0IHRoZSBmaWxlCisgIC8vIGRlZmluaW5nIHRoZSBvcHRpb247IHdlIGRvIG5vdCBhbHNvIGhhdmUgdG8gaW1wb3J0IGRlc2NyaXB0b3IucHJvdG8uCisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnM6OmRlc2NyaXB0b3IoKQorICAgIC0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKKworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCisgICAgIm5hbWU6IFwiY3VzdG9tX29wdGlvbnNfaW1wb3J0LnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcInByb3RvYnVmX3VuaXR0ZXN0XCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90b1wiICIKKyAgICAib3B0aW9ucyB7ICIKKyAgICAiICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAiICAgIG5hbWUgeyAiCisgICAgIiAgICAgIG5hbWVfcGFydDogXCJmaWxlX29wdDFcIiAiCisgICAgIiAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgIiAgICB9ICIKKyAgICAiICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMTIzNCAiCisgICAgIiAgfSAiCisgICAgLy8gVGVzdCBhIG5vbi1leHRlbnNpb24gb3B0aW9uIHRvby4gIChBdCBvbmUgcG9pbnQgdGhpcyBmYWlsZWQgZHVlIHRvIGEKKyAgICAvLyBidWcuKQorICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICIgICAgbmFtZSB7ICIKKyAgICAiICAgICAgbmFtZV9wYXJ0OiBcImphdmFfcGFja2FnZVwiICIKKyAgICAiICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgIiAgICB9ICIKKyAgICAiICAgIHN0cmluZ192YWx1ZTogXCJmb29cIiAiCisgICAgIiAgfSAiCisgICAgLy8gVGVzdCB0aGF0IGVudW0tdHlwZWQgb3B0aW9ucyBzdGlsbCB3b3JrIHRvby4gIChBdCBvbmUgcG9pbnQgdGhpcyBhbHNvCisgICAgLy8gZmFpbGVkIGR1ZSB0byBhIGJ1Zy4pCisgICAgIiAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICBuYW1lIHsgIgorICAgICIgICAgICBuYW1lX3BhcnQ6IFwib3B0aW1pemVfZm9yXCIgIgorICAgICIgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKKyAgICAiICAgIH0gIgorICAgICIgICAgaWRlbnRpZmllcl92YWx1ZTogXCJTUEVFRFwiICIKKyAgICAiICB9ICIKKyAgICAifSIKKyAgICAsCisgICAgJmZpbGVfcHJvdG8pKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworICBFWFBFQ1RfRVEoMTIzNCwgZmlsZS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmlsZV9vcHQxKSk7CisgIEVYUEVDVF9UUlVFKGZpbGUtPm9wdGlvbnMoKS5oYXNfamF2YV9wYWNrYWdlKCkpOworICBFWFBFQ1RfRVEoImZvbyIsIGZpbGUtPm9wdGlvbnMoKS5qYXZhX3BhY2thZ2UoKSk7CisgIEVYUEVDVF9UUlVFKGZpbGUtPm9wdGlvbnMoKS5oYXNfb3B0aW1pemVfZm9yKCkpOworICBFWFBFQ1RfRVEoRmlsZU9wdGlvbnM6OlNQRUVELCBmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkpOworfQorCitURVNUKEN1c3RvbU9wdGlvbnMsIE1lc3NhZ2VPcHRpb25UaHJlZUZpZWxkc1NldCkgeworICAvLyBUaGlzIHRlc3RzIGEgYnVnIHdoaWNoIHByZXZpb3VzbHkgZXhpc3RlZCBpbiBjdXN0b20gb3B0aW9ucyBwYXJzaW5nLiAgVGhlCisgIC8vIGJ1ZyBvY2N1cnJlZCB3aGVuIHlvdSBkZWZpbmVkIGEgY3VzdG9tIG9wdGlvbiB3aXRoIG1lc3NhZ2UgdHlwZSBhbmQgdGhlbgorICAvLyBzZXQgdGhyZWUgZmllbGRzIG9mIHRoYXQgb3B0aW9uIG9uIGEgc2luZ2xlIGRlZmluaXRpb24gKHNlZSB0aGUgZXhhbXBsZQorICAvLyBiZWxvdykuICBUaGUgYnVnIGlzIGEgYml0IGhhcmQgdG8gZXhwbGFpbiwgc28gY2hlY2sgdGhlIGNoYW5nZSBoaXN0b3J5IGlmCisgIC8vIHlvdSB3YW50IHRvIGtub3cgbW9yZS4KKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uczo6ZGVzY3JpcHRvcigpCisgICAgLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgcmVwcmVzZW50cyB0aGUgZGVmaW5pdGlvbjoKKyAgLy8KKyAgLy8gICBpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byIKKyAgLy8gICBwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG9wdGlvbiAoY29tcGxleF9vcHQxKS5mb28gID0gMTIzNDsKKyAgLy8gICAgIG9wdGlvbiAoY29tcGxleF9vcHQxKS5mb28yID0gMTIzNDsKKyAgLy8gICAgIG9wdGlvbiAoY29tcGxleF9vcHQxKS5mb28zID0gMTIzNDsKKyAgLy8gICB9CisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAibmFtZTogXCJjdXN0b21fb3B0aW9uc19pbXBvcnQucHJvdG9cIiAiCisgICAgInBhY2thZ2U6IFwicHJvdG9idWZfdW5pdHRlc3RcIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgIiAgb3B0aW9ucyB7ICIKKyAgICAiICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICIgICAgICBuYW1lIHsgIgorICAgICIgICAgICAgIG5hbWVfcGFydDogXCJjb21wbGV4X29wdDFcIiAiCisgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlICIKKyAgICAiICAgICAgfSAiCisgICAgIiAgICAgIG5hbWUgeyAiCisgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKKyAgICAiICAgICAgfSAiCisgICAgIiAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMTIzNCAiCisgICAgIiAgICB9ICIKKyAgICAiICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICIgICAgICBuYW1lIHsgIgorICAgICIgICAgICAgIG5hbWVfcGFydDogXCJjb21wbGV4X29wdDFcIiAiCisgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlICIKKyAgICAiICAgICAgfSAiCisgICAgIiAgICAgIG5hbWUgeyAiCisgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImZvbzJcIiAiCisgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgIiAgICAgIH0gIgorICAgICIgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQgIgorICAgICIgICAgfSAiCisgICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAiICAgICAgbmFtZSB7ICIKKyAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiY29tcGxleF9vcHQxXCIgIgorICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgIiAgICAgIH0gIgorICAgICIgICAgICBuYW1lIHsgIgorICAgICIgICAgICAgIG5hbWVfcGFydDogXCJmb28zXCIgIgorICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxMjM0ICIKKyAgICAiICAgIH0gIgorICAgICIgIH0gIgorICAgICJ9IiwKKyAgICAmZmlsZV9wcm90bykpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7CisgIEFTU0VSVF9FUSgxLCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisKKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMmIG9wdGlvbnMgPSBmaWxlLT5tZXNzYWdlX3R5cGUoMCktPm9wdGlvbnMoKTsKKyAgRVhQRUNUX0VRKDEyMzQsIG9wdGlvbnMuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDEpLmZvbygpKTsKK30KKworLy8gQ2hlY2sgdGhhdCBhZ2dyZWdhdGUgb3B0aW9ucyB3ZXJlIHBhcnNlZCBhbmQgc2F2ZWQgY29ycmVjdGx5IGluCisvLyB0aGUgYXBwcm9wcmlhdGUgZGVzY3JpcHRvcnMuCitURVNUKEN1c3RvbU9wdGlvbnMsIEFnZ3JlZ2F0ZU9wdGlvbnMpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogbXNnID0gcHJvdG9idWZfdW5pdHRlc3Q6OkFnZ3JlZ2F0ZU1lc3NhZ2U6OmRlc2NyaXB0b3IoKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBtc2ctPmZpbGUoKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG1zZy0+RmluZEZpZWxkQnlOYW1lKCJmaWVsZG5hbWUiKTsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1kID0gZmlsZS0+RmluZEVudW1UeXBlQnlOYW1lKCJBZ2dyZWdhdGVFbnVtIik7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW12ID0gZW51bWQtPkZpbmRWYWx1ZUJ5TmFtZSgiVkFMVUUiKTsKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UgPSBmaWxlLT5GaW5kU2VydmljZUJ5TmFtZSgKKyAgICAgICJBZ2dyZWdhdGVTZXJ2aWNlIik7CisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IHNlcnZpY2UtPkZpbmRNZXRob2RCeU5hbWUoIk1ldGhvZCIpOworCisgIC8vIFRlc3RzIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgZW1iZWRkZWQgaW4gZmlsZW9wdAorICBjb25zdCBwcm90b2J1Zl91bml0dGVzdDo6QWdncmVnYXRlJiBmaWxlX29wdGlvbnMgPQorICAgICAgZmlsZS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmlsZW9wdCk7CisgIEVYUEVDVF9FUSgxMDAsIGZpbGVfb3B0aW9ucy5pKCkpOworICBFWFBFQ1RfRVEoIkZpbGVBbm5vdGF0aW9uIiwgZmlsZV9vcHRpb25zLnMoKSk7CisgIEVYUEVDVF9FUSgiTmVzdGVkRmlsZUFubm90YXRpb24iLCBmaWxlX29wdGlvbnMuc3ViKCkucygpKTsKKyAgRVhQRUNUX0VRKCJGaWxlRXh0ZW5zaW9uQW5ub3RhdGlvbiIsCisgICAgICAgICAgICBmaWxlX29wdGlvbnMuZmlsZSgpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmlsZW9wdCkucygpKTsKKyAgRVhQRUNUX0VRKCJFbWJlZGRlZE1lc3NhZ2VTZXRFbGVtZW50IiwKKyAgICAgICAgICAgIGZpbGVfb3B0aW9ucy5tc2V0KCkuR2V0RXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudAorICAgICAgICAgICAgICAgIDo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKS5zKCkpOworCisgIC8vIFNpbXBsZSB0ZXN0cyBmb3IgYWxsIHRoZSBvdGhlciB0eXBlcyBvZiBhbm5vdGF0aW9ucworICBFWFBFQ1RfRVEoIk1lc3NhZ2VBbm5vdGF0aW9uIiwKKyAgICAgICAgICAgIG1zZy0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6bXNnb3B0KS5zKCkpOworICBFWFBFQ1RfRVEoIkZpZWxkQW5ub3RhdGlvbiIsCisgICAgICAgICAgICBmaWVsZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmllbGRvcHQpLnMoKSk7CisgIEVYUEVDVF9FUSgiRW51bUFubm90YXRpb24iLAorICAgICAgICAgICAgZW51bWQtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmVudW1vcHQpLnMoKSk7CisgIEVYUEVDVF9FUSgiRW51bVZhbHVlQW5ub3RhdGlvbiIsCisgICAgICAgICAgICBlbnVtdi0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZW51bXZhbG9wdCkucygpKTsKKyAgRVhQRUNUX0VRKCJTZXJ2aWNlQW5ub3RhdGlvbiIsCisgICAgICAgICAgICBzZXJ2aWNlLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzZXJ2aWNlb3B0KS5zKCkpOworICBFWFBFQ1RfRVEoIk1ldGhvZEFubm90YXRpb24iLAorICAgICAgICAgICAgbWV0aG9kLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjptZXRob2RvcHQpLnMoKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVGhlIHRlc3RzIGJlbG93IHRyaWdnZXIgZXZlcnkgdW5pcXVlIGNhbGwgdG8gQWRkRXJyb3IoKSBpbiBkZXNjcmlwdG9yLmNjLAorLy8gaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluIHRoYXQgZmlsZS4gIEknbSB1c2luZyBUZXh0Rm9ybWF0IGhlcmUKKy8vIHRvIHNwZWNpZnkgdGhlIGlucHV0IGRlc2NyaXB0b3JzIGJlY2F1c2UgYnVpbGRpbmcgdGhlbSB1c2luZyBjb2RlIHdvdWxkCisvLyBiZSB0b28gYnVsa3kuCisKK2NsYXNzIE1vY2tFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3IgeworIHB1YmxpYzoKKyAgTW9ja0Vycm9yQ29sbGVjdG9yKCkge30KKyAgfk1vY2tFcnJvckNvbGxlY3RvcigpIHt9CisKKyAgc3RyaW5nIHRleHRfOworCisgIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBjb25zdCBjaGFyKiBsb2NhdGlvbl9uYW1lID0gTlVMTDsKKyAgICBzd2l0Y2ggKGxvY2F0aW9uKSB7CisgICAgICBjYXNlIE5BTUUgICAgICAgICA6IGxvY2F0aW9uX25hbWUgPSAiTkFNRSIgICAgICAgICA7IGJyZWFrOworICAgICAgY2FzZSBOVU1CRVIgICAgICAgOiBsb2NhdGlvbl9uYW1lID0gIk5VTUJFUiIgICAgICAgOyBicmVhazsKKyAgICAgIGNhc2UgVFlQRSAgICAgICAgIDogbG9jYXRpb25fbmFtZSA9ICJUWVBFIiAgICAgICAgIDsgYnJlYWs7CisgICAgICBjYXNlIEVYVEVOREVFICAgICA6IGxvY2F0aW9uX25hbWUgPSAiRVhURU5ERUUiICAgICA7IGJyZWFrOworICAgICAgY2FzZSBERUZBVUxUX1ZBTFVFOiBsb2NhdGlvbl9uYW1lID0gIkRFRkFVTFRfVkFMVUUiOyBicmVhazsKKyAgICAgIGNhc2UgT1BUSU9OX05BTUUgIDogbG9jYXRpb25fbmFtZSA9ICJPUFRJT05fTkFNRSIgIDsgYnJlYWs7CisgICAgICBjYXNlIE9QVElPTl9WQUxVRSA6IGxvY2F0aW9uX25hbWUgPSAiT1BUSU9OX1ZBTFVFIiA7IGJyZWFrOworICAgICAgY2FzZSBJTlBVVF9UWVBFICAgOiBsb2NhdGlvbl9uYW1lID0gIklOUFVUX1RZUEUiICAgOyBicmVhazsKKyAgICAgIGNhc2UgT1VUUFVUX1RZUEUgIDogbG9jYXRpb25fbmFtZSA9ICJPVVRQVVRfVFlQRSIgIDsgYnJlYWs7CisgICAgICBjYXNlIE9USEVSICAgICAgICA6IGxvY2F0aW9uX25hbWUgPSAiT1RIRVIiICAgICAgICA7IGJyZWFrOworICAgIH0KKworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoCisgICAgICAmdGV4dF8sICIkMDogJDE6ICQyOiAkM1xuIiwKKyAgICAgIGZpbGVuYW1lLCBlbGVtZW50X25hbWUsIGxvY2F0aW9uX25hbWUsIG1lc3NhZ2UpOworICB9Cit9OworCitjbGFzcyBWYWxpZGF0aW9uRXJyb3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gUGFyc2UgZmlsZV90ZXh0IGFzIGEgRmlsZURlc2NyaXB0b3JQcm90byBpbiB0ZXh0IGZvcm1hdCBhbmQgYWRkIGl0CisgIC8vIHRvIHRoZSBEZXNjcmlwdG9yUG9vbC4gIEV4cGVjdCBubyBlcnJvcnMuCisgIHZvaWQgQnVpbGRGaWxlKGNvbnN0IHN0cmluZyYgZmlsZV90ZXh0KSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhmaWxlX3RleHQsICZmaWxlX3Byb3RvKSk7CisgICAgQVNTRVJUX1RSVUUocG9vbF8uQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOworICB9CisKKyAgLy8gUGFyc2UgZmlsZV90ZXh0IGFzIGEgRmlsZURlc2NyaXB0b3JQcm90byBpbiB0ZXh0IGZvcm1hdCBhbmQgYWRkIGl0CisgIC8vIHRvIHRoZSBEZXNjcmlwdG9yUG9vbC4gIEV4cGVjdCBlcnJvcnMgdG8gYmUgcHJvZHVjZWQgd2hpY2ggbWF0Y2ggdGhlCisgIC8vIGdpdmVuIGVycm9yIHRleHQuCisgIHZvaWQgQnVpbGRGaWxlV2l0aEVycm9ycyhjb25zdCBzdHJpbmcmIGZpbGVfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfZXJyb3JzKSB7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhmaWxlX3RleHQsICZmaWxlX3Byb3RvKSk7CisKKyAgICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICAgIEVYUEVDVF9UUlVFKAorICAgICAgcG9vbF8uQnVpbGRGaWxlQ29sbGVjdGluZ0Vycm9ycyhmaWxlX3Byb3RvLCAmZXJyb3JfY29sbGVjdG9yKSA9PSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZXJyb3JzLCBlcnJvcl9jb2xsZWN0b3IudGV4dF8pOworICB9CisKKyAgLy8gQnVpbGRzIHNvbWUgYWxyZWFkeS1wYXJzZWQgZmlsZSBpbiBvdXIgdGVzdCBwb29sLgorICB2b2lkIEJ1aWxkRmlsZUluVGVzdFBvb2woY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgICAgZmlsZS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7CisgIH0KKworICAvLyBCdWlsZCBkZXNjcmlwdG9yLnByb3RvIGluIG91ciB0ZXN0IHBvb2wuIFRoaXMgYWxsb3dzIHVzIHRvIGV4dGVuZCBpdCBpbgorICAvLyB0aGUgdGVzdCBwb29sLCBzbyB3ZSBjYW4gdGVzdCBjdXN0b20gb3B0aW9ucy4KKyAgdm9pZCBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKSB7CisgICAgQnVpbGRGaWxlSW5UZXN0UG9vbChEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpKTsKKyAgfQorCisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworfTsKKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEFscmVhZHlEZWZpbmVkKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIsCisKKyAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IFwiRm9vXCIgaXMgYWxyZWFkeSBkZWZpbmVkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBBbHJlYWR5RGVmaW5lZEluUGFja2FnZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAicGFja2FnZTogXCJmb28uYmFyXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28uYmFyLkZvbzogTkFNRTogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgorICAgICAgIlwiZm9vLmJhclwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBBbHJlYWR5RGVmaW5lZEluT3RoZXJGaWxlKSB7CisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iLAorCisgICAgImJhci5wcm90bzogRm9vOiBOQU1FOiBcIkZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBmaWxlICIKKyAgICAgICJcImZvby5wcm90b1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBQYWNrYWdlQWxyZWFkeURlZmluZWQpIHsKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJmb29cIiB9Iik7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcImZvby5iYXJcIiIsCisKKyAgICAiYmFyLnByb3RvOiBmb286IE5BTUU6IFwiZm9vXCIgaXMgYWxyZWFkeSBkZWZpbmVkIChhcyBzb21ldGhpbmcgb3RoZXIgIgorICAgICAgInRoYW4gYSBwYWNrYWdlKSBpbiBmaWxlIFwiZm9vLnByb3RvXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1WYWx1ZUFscmVhZHlEZWZpbmVkSW5QYXJlbnQpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiRm9vXCIgdmFsdWUgeyBuYW1lOiBcIkZPT1wiIG51bWJlcjogMSB9IH0gIgorICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkJhclwiIHZhbHVlIHsgbmFtZTogXCJGT09cIiBudW1iZXI6IDEgfSB9ICIsCisKKyAgICAiZm9vLnByb3RvOiBGT086IE5BTUU6IFwiRk9PXCIgaXMgYWxyZWFkeSBkZWZpbmVkLlxuIgorICAgICJmb28ucHJvdG86IEZPTzogTkFNRTogTm90ZSB0aGF0IGVudW0gdmFsdWVzIHVzZSBDKysgc2NvcGluZyBydWxlcywgIgorICAgICAgIm1lYW5pbmcgdGhhdCBlbnVtIHZhbHVlcyBhcmUgc2libGluZ3Mgb2YgdGhlaXIgdHlwZSwgbm90IGNoaWxkcmVuIG9mICIKKyAgICAgICJpdC4gIFRoZXJlZm9yZSwgXCJGT09cIiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGdsb2JhbCBzY29wZSwgbm90ICIKKyAgICAgICJqdXN0IHdpdGhpbiBcIkJhclwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtVmFsdWVBbHJlYWR5RGVmaW5lZEluUGFyZW50Tm9uR2xvYmFsKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcInBrZ1wiICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJGb29cIiB2YWx1ZSB7IG5hbWU6IFwiRk9PXCIgbnVtYmVyOiAxIH0gfSAiCisgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiQmFyXCIgdmFsdWUgeyBuYW1lOiBcIkZPT1wiIG51bWJlcjogMSB9IH0gIiwKKworICAgICJmb28ucHJvdG86IHBrZy5GT086IE5BTUU6IFwiRk9PXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIFwicGtnXCIuXG4iCisgICAgImZvby5wcm90bzogcGtnLkZPTzogTkFNRTogTm90ZSB0aGF0IGVudW0gdmFsdWVzIHVzZSBDKysgc2NvcGluZyBydWxlcywgIgorICAgICAgIm1lYW5pbmcgdGhhdCBlbnVtIHZhbHVlcyBhcmUgc2libGluZ3Mgb2YgdGhlaXIgdHlwZSwgbm90IGNoaWxkcmVuIG9mICIKKyAgICAgICJpdC4gIFRoZXJlZm9yZSwgXCJGT09cIiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gXCJwa2dcIiwgbm90IGp1c3Qgd2l0aGluICIKKyAgICAgICJcIkJhclwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNaXNzaW5nTmFtZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgfSIsCisKKyAgICAiZm9vLnByb3RvOiA6IE5BTUU6IE1pc3NpbmcgbmFtZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW52YWxpZE5hbWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiJFwiIH0iLAorCisgICAgImZvby5wcm90bzogJDogTkFNRTogXCIkXCIgaXMgbm90IGEgdmFsaWQgaWRlbnRpZmllci5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW52YWxpZFBhY2thZ2VOYW1lKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcImZvby4kXCIiLAorCisgICAgImZvby5wcm90bzogZm9vLiQ6IE5BTUU6IFwiJFwiIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1pc3NpbmdGaWxlTmFtZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICIiLAorCisgICAgIjogOiBPVEhFUjogTWlzc2luZyBmaWVsZDogRmlsZURlc2NyaXB0b3JQcm90by5uYW1lLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBEdXBlRGVwZW5kZW5jeSkgeworICBCdWlsZEZpbGUoIm5hbWU6IFwiZm9vLnByb3RvXCIiKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiICIsCisKKyAgICAiYmFyLnByb3RvOiBiYXIucHJvdG86IE9USEVSOiBJbXBvcnQgXCJmb28ucHJvdG9cIiB3YXMgbGlzdGVkIHR3aWNlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmtub3duRGVwZW5kZW5jeSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJmb28ucHJvdG9cIiAiLAorCisgICAgImJhci5wcm90bzogYmFyLnByb3RvOiBPVEhFUjogSW1wb3J0IFwiZm9vLnByb3RvXCIgaGFzIG5vdCBiZWVuIGxvYWRlZC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRm9yZWlnblVuaW1wb3J0ZWRQYWNrYWdlTm9DcmFzaCkgeworICAvLyBVc2VkIHRvIGNyYXNoOiAgSWYgd2UgZGVwZW5kIG9uIGEgbm9uLWV4aXN0ZW50IGZpbGUgYW5kIHRoZW4gcmVmZXIgdG8gYQorICAvLyBwYWNrYWdlIGRlZmluZWQgaW4gYSBmaWxlIHRoYXQgd2UgZGlkbid0IGltcG9ydCwgYW5kIHRoYXQgcGFja2FnZSBpcworICAvLyBuZXN0ZWQgd2l0aGluIGEgcGFyZW50IHBhY2thZ2Ugd2hpY2ggdGhpcyBmaWxlIGlzIGFsc28gaW4sIGFuZCB3ZSBkb24ndAorICAvLyBpbmNsdWRlIHRoYXQgcGFyZW50IHBhY2thZ2UgaW4gdGhlIG5hbWUgKGkuZS4gd2UgZG8gYSByZWxhdGl2ZSBsb29rdXApLi4uCisgIC8vIFllcywgcmVhbGx5LgorICBCdWlsZEZpbGUoCisgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAicGFja2FnZTogJ291dGVyLmZvbycgIik7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6ICdiYXIucHJvdG8nICIKKyAgICAiZGVwZW5kZW5jeTogJ2Jhei5wcm90bycgIgorICAgICJwYWNrYWdlOiAnb3V0ZXIuYmFyJyAiCisgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAiICBuYW1lOiAnQmFyJyAiCisgICAgIiAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTonZm9vLkZvbycgfSIKKyAgICAifSIsCisKKyAgICAiYmFyLnByb3RvOiBiYXIucHJvdG86IE9USEVSOiBJbXBvcnQgXCJiYXoucHJvdG9cIiBoYXMgbm90IGJlZW4gbG9hZGVkLlxuIgorICAgICJiYXIucHJvdG86IG91dGVyLmJhci5CYXIuYmFyOiBUWVBFOiBcIm91dGVyLmZvb1wiIHNlZW1zIHRvIGJlIGRlZmluZWQgaW4gIgorICAgICAgIlwiZm9vLnByb3RvXCIsIHdoaWNoIGlzIG5vdCBpbXBvcnRlZCBieSBcImJhci5wcm90b1wiLiAgVG8gdXNlIGl0IGhlcmUsICIKKyAgICAgICJwbGVhc2UgYWRkIHRoZSBuZWNlc3NhcnkgaW1wb3J0LlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBEdXBlRmlsZSkgeworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iKTsKKyAgLy8gTm90ZTogIFdlIHNob3VsZCAqbm90KiBnZXQgcmVkdW5kYW50IGVycm9ycyBhYm91dCAiRm9vIiBhbHJlYWR5IGJlaW5nCisgIC8vICAgZGVmaW5lZC4KKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSAiCisgICAgLy8gQWRkIGFub3RoZXIgdHlwZSBzbyB0aGF0IHRoZSBmaWxlcyBhcmVuJ3QgaWRlbnRpY2FsIChpbiB3aGljaCBjYXNlIHRoZXJlCisgICAgLy8gd291bGQgYmUgbm8gZXJyb3IpLgorICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPVEhFUjogQSBmaWxlIHdpdGggdGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdGhlICIKKyAgICAgICJwb29sLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZEluRXh0ZW5zaW9uUmFuZ2UpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogIDkgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImJhclwiIG51bWJlcjogMTAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImJhelwiIG51bWJlcjogMTkgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOiBcInF1eFwiIG51bWJlcjogMjAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogMjAgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uYmFyOiBOVU1CRVI6IEV4dGVuc2lvbiByYW5nZSAxMCB0byAxOSBpbmNsdWRlcyBmaWVsZCAiCisgICAgICAiXCJiYXJcIiAoMTApLlxuIgorICAgICJmb28ucHJvdG86IEZvby5iYXo6IE5VTUJFUjogRXh0ZW5zaW9uIHJhbmdlIDEwIHRvIDE5IGluY2x1ZGVzIGZpZWxkICIKKyAgICAgICJcImJhelwiICgxOSkuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE92ZXJsYXBwaW5nRXh0ZW5zaW9uUmFuZ2VzKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDIwIH0iCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDIwIGVuZDogMzAgfSIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMTkgZW5kOiAyMSB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgMTkgdG8gMjAgb3ZlcmxhcHMgd2l0aCAiCisgICAgICAiYWxyZWFkeS1kZWZpbmVkIHJhbmdlIDEwIHRvIDE5LlxuIgorICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgMTkgdG8gMjAgb3ZlcmxhcHMgd2l0aCAiCisgICAgICAiYWxyZWFkeS1kZWZpbmVkIHJhbmdlIDIwIHRvIDI5LlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnZhbGlkRGVmYXVsdHMpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisKKyAgICAvLyBJbnZhbGlkIG51bWJlci4KKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0lOVDMyIgorICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogXCJhYmNcIiB9IgorCisgICAgLy8gRW1wdHkgZGVmYXVsdCB2YWx1ZS4KKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiYmFyXCIgbnVtYmVyOiAyIGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0lOVDMyIgorICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogXCJcIiB9IgorCisgICAgLy8gSW52YWxpZCBib29sZWFuLgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJiYXpcIiBudW1iZXI6IDMgbGFiZWw6IExBQkVMX09QVElPTkFMIHR5cGU6IFRZUEVfQk9PTCIKKyAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6IFwiYWJjXCIgfSIKKworICAgIC8vIE1lc3NhZ2VzIGNhbid0IGhhdmUgZGVmYXVsdHMuCisgICAgIiAgZmllbGQgeyBuYW1lOiBcInF1eFwiIG51bWJlcjogNCBsYWJlbDogTEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9NRVNTQUdFIgorICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogXCJhYmNcIiB0eXBlX25hbWU6IFwiRm9vXCIgfSIKKworICAgIC8vIFNhbWUgdGhpbmcsIGJ1dCB3ZSBkb24ndCBrbm93IHRoYXQgdGhpcyBmaWVsZCBoYXMgbWVzc2FnZSB0eXBlIHVudGlsCisgICAgLy8gd2UgbG9vayB1cCB0aGUgdHlwZSBuYW1lLgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJxdXV4XCIgbnVtYmVyOiA1IGxhYmVsOiBMQUJFTF9PUFRJT05BTCIKKyAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6IFwiYWJjXCIgdHlwZV9uYW1lOiBcIkZvb1wiIH0iCisKKyAgICAvLyBSZXBlYXRlZHMgY2FuJ3QgaGF2ZSBkZWZhdWx0cy4KKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiY29yZ2VcIiBudW1iZXI6IDYgbGFiZWw6IExBQkVMX1JFUEVBVEVEIHR5cGU6IFRZUEVfSU5UMzIiCisgICAgIiAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBcIjFcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IERFRkFVTFRfVkFMVUU6IENvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWUuXG4iCisgICAgImZvby5wcm90bzogRm9vLmJhcjogREVGQVVMVF9WQUxVRTogQ291bGRuJ3QgcGFyc2UgZGVmYXVsdCB2YWx1ZS5cbiIKKyAgICAiZm9vLnByb3RvOiBGb28uYmF6OiBERUZBVUxUX1ZBTFVFOiBCb29sZWFuIGRlZmF1bHQgbXVzdCBiZSB0cnVlIG9yICIKKyAgICAgICJmYWxzZS5cbiIKKyAgICAiZm9vLnByb3RvOiBGb28ucXV4OiBERUZBVUxUX1ZBTFVFOiBNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzLlxuIgorICAgICJmb28ucHJvdG86IEZvby5jb3JnZTogREVGQVVMVF9WQUxVRTogUmVwZWF0ZWQgZmllbGRzIGNhbid0IGhhdmUgZGVmYXVsdCAiCisgICAgICAidmFsdWVzLlxuIgorICAgIC8vIFRoaXMgZW5kcyB1cCBiZWluZyByZXBvcnRlZCBsYXRlciBiZWNhdXNlIHRoZSBlcnJvciBpcyBkZXRlY3RlZCBhdAorICAgIC8vIGNyb3NzLWxpbmtpbmcgdGltZS4KKyAgICAiZm9vLnByb3RvOiBGb28ucXV1eDogREVGQVVMVF9WQUxVRTogTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0ICIKKyAgICAgICJ2YWx1ZXMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5lZ2F0aXZlRmllbGROdW1iZXIpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogLTEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogTlVNQkVSOiBGaWVsZCBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEh1Z2VGaWVsZE51bWJlcikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAweDcwMDAwMDAwICIKKyAgICAiICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IE5VTUJFUjogRmllbGQgbnVtYmVycyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICIKKyAgICAgICI1MzY4NzA5MTEuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlc2VydmVkRmllbGROdW1iZXIpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQge25hbWU6XCJmb29cIiBudW1iZXI6IDE4OTk5IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICIgIGZpZWxkIHtuYW1lOlwiYmFyXCIgbnVtYmVyOiAxOTAwMCBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAiICBmaWVsZCB7bmFtZTpcImJhelwiIG51bWJlcjogMTk5OTkgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgIiAgZmllbGQge25hbWU6XCJxdXhcIiBudW1iZXI6IDIwMDAwIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5iYXI6IE5VTUJFUjogRmllbGQgbnVtYmVycyAxOTAwMCB0aHJvdWdoIDE5OTk5IGFyZSAiCisgICAgICAicmVzZXJ2ZWQgZm9yIHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi5cbiIKKyAgICAiZm9vLnByb3RvOiBGb28uYmF6OiBOVU1CRVI6IEZpZWxkIG51bWJlcnMgMTkwMDAgdGhyb3VnaCAxOTk5OSBhcmUgIgorICAgICAgInJlc2VydmVkIGZvciB0aGUgcHJvdG9jb2wgYnVmZmVyIGxpYnJhcnkgaW1wbGVtZW50YXRpb24uXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEV4dGVuc2lvbk1pc3NpbmdFeHRlbmRlZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogMSBsYWJlbDogTEFCRUxfT1BUSU9OQUwiCisgICAgIiAgICAgICAgICAgICAgdHlwZV9uYW1lOiBcIkZvb1wiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogRVhURU5ERUU6IEZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlIG5vdCBzZXQgZm9yICIKKyAgICAgICJleHRlbnNpb24gZmllbGQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5vbkV4dGVuc2lvbldpdGhFeHRlbmRlZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJCYXJcIiIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDIgfSIKKyAgICAifSIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOiBMQUJFTF9PUFRJT05BTCIKKyAgICAiICAgICAgICAgIHR5cGVfbmFtZTogXCJGb29cIiBleHRlbmRlZTogXCJCYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IEVYVEVOREVFOiBGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBzZXQgZm9yICIKKyAgICAgICJub24tZXh0ZW5zaW9uIGZpZWxkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZE51bWJlckNvbmZsaWN0KSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImJhclwiIG51bWJlcjogMSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uYmFyOiBOVU1CRVI6IEZpZWxkIG51bWJlciAxIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiAiCisgICAgICAiXCJGb29cIiBieSBmaWVsZCBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBCYWRNZXNzYWdlU2V0RXh0ZW5zaW9uVHlwZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJNZXNzYWdlU2V0XCIiCisgICAgIiAgb3B0aW9ucyB7IG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0OiB0cnVlIH0iCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDQgZW5kOiA1IH0iCisgICAgIn0iCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTpcImZvb1wiIG51bWJlcjo0IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiIKKyAgICAiICAgICAgICAgICAgICBleHRlbmRlZTogXCJNZXNzYWdlU2V0XCIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBFeHRlbnNpb25zIG9mIE1lc3NhZ2VTZXRzIG11c3QgYmUgb3B0aW9uYWwgIgorICAgICAgIm1lc3NhZ2VzLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBCYWRNZXNzYWdlU2V0RXh0ZW5zaW9uTGFiZWwpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiTWVzc2FnZVNldFwiIgorICAgICIgIG9wdGlvbnMgeyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdDogdHJ1ZSB9IgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiA0IGVuZDogNSB9IgorICAgICJ9IgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBudW1iZXI6NCBsYWJlbDpMQUJFTF9SRVBFQVRFRCB0eXBlOlRZUEVfTUVTU0FHRSIKKyAgICAiICAgICAgICAgICAgICB0eXBlX25hbWU6IFwiRm9vXCIgZXh0ZW5kZWU6IFwiTWVzc2FnZVNldFwiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogRXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0cyBtdXN0IGJlIG9wdGlvbmFsICIKKyAgICAgICJtZXNzYWdlcy5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRJbk1lc3NhZ2VTZXQpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgb3B0aW9ucyB7IG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0OiB0cnVlIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogMSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBOQU1FOiBNZXNzYWdlU2V0cyBjYW5ub3QgaGF2ZSBmaWVsZHMsIG9ubHkgIgorICAgICAgImV4dGVuc2lvbnMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5lZ2F0aXZlRXh0ZW5zaW9uUmFuZ2VOdW1iZXIpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IC0xMCBlbmQ6IC0xIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vOiBOVU1CRVI6IEV4dGVuc2lvbiBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEh1Z2VFeHRlbnNpb25SYW5nZU51bWJlcikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDB4NzAwMDAwMDAgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogRXh0ZW5zaW9uIG51bWJlcnMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAiCisgICAgICAiNTM2ODcwOTExLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFeHRlbnNpb25SYW5nZUVuZEJlZm9yZVN0YXJ0KSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDEwIH0iCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogNSB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgZW5kIG51bWJlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAiCisgICAgICAic3RhcnQgbnVtYmVyLlxuIgorICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgZW5kIG51bWJlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAiCisgICAgICAic3RhcnQgbnVtYmVyLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbXB0eUVudW0pIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIKKyAgICAvLyBBbHNvIHVzZSB0aGUgZW1wdHkgZW51bSBpbiBhIG1lc3NhZ2UgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBjcmFzaGVzCisgICAgLy8gZHVyaW5nIHZhbGlkYXRpb24gKHBvc3NpYmxlIGlmIHRoZSBjb2RlIGF0dGVtcHRzIHRvIGRlcml2ZSBhIGRlZmF1bHQKKyAgICAvLyB2YWx1ZSBmb3IgdGhlIGZpZWxkKS4KKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJCYXJcIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkZvb1wiIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOiBcImJhclwiIG51bWJlcjogMiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJGb29cIiAiCisgICAgIiAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBcIk5PX1NVQ0hfVkFMVUVcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvbzogTkFNRTogRW51bXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSB2YWx1ZS5cbiIKKyAgICAiZm9vLnByb3RvOiBCYXIuYmFyOiBERUZBVUxUX1ZBTFVFOiBFbnVtIHR5cGUgXCJGb29cIiBoYXMgbm8gdmFsdWUgbmFtZWQgIgorICAgICAgIlwiTk9fU1VDSF9WQUxVRVwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmRlZmluZWRFeHRlbmRlZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIgorICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiBcIkJhclwiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogRVhURU5ERUU6IFwiQmFyXCIgaXMgbm90IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5vbk1lc3NhZ2VFeHRlbmRlZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIgorICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiBcIkJhclwiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogRVhURU5ERUU6IFwiQmFyXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBOb3RBbkV4dGVuc2lvbk51bWJlcikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJCYXJcIiIKKyAgICAifSIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIgorICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiBcIkJhclwiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogTlVNQkVSOiBcIkJhclwiIGRvZXMgbm90IGRlY2xhcmUgMSBhcyBhbiBleHRlbnNpb24gIgorICAgICAgIm51bWJlci5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVW5kZWZpbmVkRmllbGRUeXBlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJCYXJcIiBpcyBub3QgZGVmaW5lZC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRUeXBlRGVmaW5lZEluVW5kZWNsYXJlZERlcGVuZGVuY3kpIHsKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXJcIiB9ICIpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIH0iCisgICAgIn0iLAorICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyXCIgc2VlbXMgdG8gYmUgZGVmaW5lZCBpbiBcImJhci5wcm90b1wiLCAiCisgICAgICAid2hpY2ggaXMgbm90IGltcG9ydGVkIGJ5IFwiZm9vLnByb3RvXCIuICBUbyB1c2UgaXQgaGVyZSwgcGxlYXNlIGFkZCB0aGUgIgorICAgICAgIm5lY2Vzc2FyeSBpbXBvcnQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFNlYXJjaE1vc3RMb2NhbEZpcnN0KSB7CisgIC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIHByb2R1Y2UgYW4gZXJyb3IgdGhhdCBCYXIuQmF6IGlzIG5vdCBkZWZpbmVkOgorICAvLyAgIG1lc3NhZ2UgQmFyIHsgbWVzc2FnZSBCYXoge30gfQorICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG1lc3NhZ2UgQmFyIHsKKyAgLy8gICAgICAgLy8gUGxhY2luZyAibWVzc2FnZSBCYXp7fSIgaGVyZSwgb3IgcmVtb3ZpbmcgRm9vLkJhciBhbHRvZ2V0aGVyLAorICAvLyAgICAgICAvLyB3b3VsZCBmaXggdGhlIGVycm9yLgorICAvLyAgICAgfQorICAvLyAgICAgb3B0aW9uYWwgQmFyLkJheiBiYXogPSAxOworICAvLyAgIH0KKyAgLy8gQW4gb25lIHBvaW50IHRoZSBsb29rdXAgY29kZSBpbmNvcnJlY3RseSBkaWQgbm90IHByb2R1Y2UgYW4gZXJyb3IgaW4gdGhpcworICAvLyBjYXNlLCBiZWNhdXNlIHdoZW4gbG9va2luZyBmb3IgQmFyLkJheiwgaXQgd291bGQgdHJ5ICJGb28uQmFyLkJheiIgZmlyc3QsCisgIC8vIGZhaWwsIGFuZCB0ZW4gdHJ5ICJCYXIuQmF6IiBhbmQgc3VjY2VlZCwgZXZlbiB0aG91Z2ggIkJhciIgc2hvdWxkIGFjdHVhbGx5CisgIC8vIHJlZmVyIHRvIHRoZSBpbm5lciBCYXIsIG5vdCB0aGUgb3V0ZXIgb25lLgorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJCYXJcIiIKKyAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiQmF6XCIgfSIKKyAgICAifSIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXpcIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCIKKyAgICAiICAgICAgICAgIHR5cGVfbmFtZTpcIkJhci5CYXpcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5iYXo6IFRZUEU6IFwiQmFyLkJhelwiIGlzIG5vdCBkZWZpbmVkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBTZWFyY2hNb3N0TG9jYWxGaXJzdDIpIHsKKyAgLy8gVGhpcyB0ZXN0IHdvdWxkIGZpbmQgdGhlIG1vc3QgbG9jYWwgIkJhciIgZmlyc3QsIGFuZCBkb2VzLCBidXQKKyAgLy8gcHJvY2VlZHMgdG8gZmluZCB0aGUgb3V0ZXIgb25lIGJlY2F1c2UgdGhlIGlubmVyIG9uZSdzIG5vdCBhbgorICAvLyBhZ2dyZWdhdGUuCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiQmFyXCIiCisgICAgIiAgbmVzdGVkX3R5cGUgeyBuYW1lOiBcIkJhelwiIH0iCisgICAgIn0iCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOiBcIkJhclwiIG51bWJlcjoxIHR5cGU6VFlQRV9CWVRFUyB9ICIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXpcIiBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCIKKyAgICAiICAgICAgICAgIHR5cGVfbmFtZTpcIkJhci5CYXpcIiB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBQYWNrYWdlT3JpZ2luYWxseURlY2xhcmVkSW5UcmFuc2l0aXZlRGVwZW5kZW50KSB7CisgIC8vIEltYWdpbmUgd2UgaGF2ZSB0aGUgZm9sbG93aW5nOgorICAvLworICAvLyBmb28ucHJvdG86CisgIC8vICAgcGFja2FnZSBmb28uYmFyOworICAvLyBiYXIucHJvdG86CisgIC8vICAgcGFja2FnZSBmb28uYmFyOworICAvLyAgIGltcG9ydCAiZm9vLnByb3RvIjsKKyAgLy8gICBtZXNzYWdlIEJhciB7fQorICAvLyBiYXoucHJvdG86CisgIC8vICAgcGFja2FnZSBmb287CisgIC8vICAgaW1wb3J0ICJiYXIucHJvdG8iCisgIC8vICAgbWVzc2FnZSBCYXogeyBvcHRpb25hbCBiYXIuQmFyIHF1eCA9IDE7IH0KKyAgLy8KKyAgLy8gV2hlbiB2YWxpZGF0aW5nIGJhei5wcm90bywgd2Ugd2lsbCBsb29rIHVwICJiYXIuQmFyIi4gIEFzIHBhcnQgb2YgdGhpcworICAvLyBsb29rdXAsIHdlIGZpcnN0IGxvb2t1cCAiYmFyIiB0aGVuIHRyeSB0byBmaW5kICJCYXIiIHdpdGhpbiBpdC4gICJiYXIiCisgIC8vIHNob3VsZCByZXNvbHZlIHRvICJmb28uYmFyIi4gIE5vdGUsIHRob3VnaCwgdGhhdCAiZm9vLmJhciIgd2FzIG9yaWdpbmFsbHkKKyAgLy8gZGVmaW5lZCBpbiBmb28ucHJvdG8sIHdoaWNoIGlzIG5vdCBhIGRpcmVjdCBkZXBlbmRlbmN5IG9mIGJhei5wcm90by4gIFRoZQorICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBGaW5kU3ltYm9sKCkgbm9ybWFsbHkgb25seSByZXR1cm5zIHN5bWJvbHMgaW4gZGlyZWN0CisgIC8vIGRlcGVuZGVuY2llcywgbm90IGluZGlyZWN0IG9uZXMuICBUaGlzIHRlc3QgaW5zdXJlcyB0aGF0IHRoaXMgZG9lcyBub3QKKyAgLy8gcHJldmVudCBpdCBmcm9tIGZpbmRpbmcgImZvby5iYXIiLgorCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgInBhY2thZ2U6IFwiZm9vLmJhclwiICIpOworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcImZvby5iYXJcIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iKTsKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImJhei5wcm90b1wiICIKKyAgICAicGFja2FnZTogXCJmb29cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJCYXpcIiAiCisgICAgIiAgZmllbGQgeyBuYW1lOlwicXV4XCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgdHlwZV9uYW1lOlwiYmFyLkJhclwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkVHlwZU5vdEFUeXBlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgIHR5cGVfbmFtZTpcIi5Gb28uYmFyXCIgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXJcIiBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBcIi5Gb28uYmFyXCIgaXMgbm90IGEgdHlwZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVsYXRpdmVGaWVsZFR5cGVOb3RBVHlwZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmVzdGVkX3R5cGUgeyIKKyAgICAiICAgIG5hbWU6IFwiQmFyXCIiCisgICAgIiAgICBmaWVsZCB7IG5hbWU6XCJCYXpcIiBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAiICB9IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgdHlwZV9uYW1lOlwiQmFyLkJhelwiIH0iCisgICAgIn0iLAorICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyLkJhelwiIGlzIG5vdCBhIHR5cGUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkVHlwZU1heUJlSXRzTmFtZSkgeworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkJhclwiIgorICAgICJ9IgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcIkJhclwiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1GaWVsZFR5cGVJc01lc3NhZ2UpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0VOVU0iCisgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyXCIgaXMgbm90IGFuIGVudW0gdHlwZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWVzc2FnZUZpZWxkVHlwZUlzRW51bSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX01FU1NBR0UiCisgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJCYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBCYWRFbnVtRGVmYXVsdFZhbHVlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkJhclwiIHZhbHVlIHsgbmFtZTpcIkRVTU1ZXCIgbnVtYmVyOjAgfSB9ICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJCYXJcIiIKKyAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6XCJOT19TVUNIX1ZBTFVFXCIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBERUZBVUxUX1ZBTFVFOiBFbnVtIHR5cGUgXCJCYXJcIiBoYXMgbm8gdmFsdWUgbmFtZWQgIgorICAgICAgIlwiTk9fU1VDSF9WQUxVRVwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBQcmltaXRpdmVXaXRoVHlwZU5hbWUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIgorICAgICIgICAgICAgICAgdHlwZV9uYW1lOlwiRm9vXCIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBGaWVsZCB3aXRoIHByaW1pdGl2ZSB0eXBlIGhhcyB0eXBlX25hbWUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5vblByaW1pdGl2ZVdpdGhvdXRUeXBlTmFtZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfTUVTU0FHRSB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IEZpZWxkIHdpdGggbWVzc2FnZSBvciBlbnVtIHR5cGUgbWlzc2luZyAiCisgICAgICAidHlwZV9uYW1lLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnB1dFR5cGVOb3REZWZpbmVkKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIgorICAgICJzZXJ2aWNlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgorICAgICIgIG1ldGhvZCB7IG5hbWU6IFwiQVwiIGlucHV0X3R5cGU6IFwiQmFyXCIgb3V0cHV0X3R5cGU6IFwiRm9vXCIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBUZXN0U2VydmljZS5BOiBJTlBVVF9UWVBFOiBcIkJhclwiIGlzIG5vdCBkZWZpbmVkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnB1dFR5cGVOb3RBTWVzc2FnZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9ICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSAiCisgICAgInNlcnZpY2UgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RTZXJ2aWNlXCIiCisgICAgIiAgbWV0aG9kIHsgbmFtZTogXCJBXCIgaW5wdXRfdHlwZTogXCJCYXJcIiBvdXRwdXRfdHlwZTogXCJGb29cIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IFRlc3RTZXJ2aWNlLkE6IElOUFVUX1RZUEU6IFwiQmFyXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBPdXRwdXRUeXBlTm90RGVmaW5lZCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9ICIKKyAgICAic2VydmljZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdFNlcnZpY2VcIiIKKyAgICAiICBtZXRob2QgeyBuYW1lOiBcIkFcIiBpbnB1dF90eXBlOiBcIkZvb1wiIG91dHB1dF90eXBlOiBcIkJhclwiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogVGVzdFNlcnZpY2UuQTogT1VUUFVUX1RZUEU6IFwiQmFyXCIgaXMgbm90IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE91dHB1dFR5cGVOb3RBTWVzc2FnZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9ICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSAiCisgICAgInNlcnZpY2UgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RTZXJ2aWNlXCIiCisgICAgIiAgbWV0aG9kIHsgbmFtZTogXCJBXCIgaW5wdXRfdHlwZTogXCJGb29cIiBvdXRwdXRfdHlwZTogXCJCYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IFRlc3RTZXJ2aWNlLkE6IE9VVFBVVF9UWVBFOiBcIkJhclwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSWxsZWdhbFBhY2tlZEZpZWxkKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUge1xuIgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwicGFja2VkX3N0cmluZ1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX1JFUEVBVEVEICIKKyAgICAiICAgICAgICAgIHR5cGU6VFlQRV9TVFJJTkcgIgorICAgICIgICAgICAgICAgb3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsiCisgICAgIiAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwicGFja2VkXCIgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgorICAgICIgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcInRydWVcIiB9fX1cbiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJwYWNrZWRfbWVzc2FnZVwiIG51bWJlcjozIGxhYmVsOkxBQkVMX1JFUEVBVEVEICIKKyAgICAiICAgICAgICAgIHR5cGVfbmFtZTogXCJGb29cIiIKKyAgICAiICAgICAgICAgIG9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IgorICAgICIgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcInBhY2tlZFwiIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAiICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJ0cnVlXCIgfX19XG4iCisgICAgIiAgZmllbGQgeyBuYW1lOlwib3B0aW9uYWxfaW50MzJcIiBudW1iZXI6IDQgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgIiAgICAgICAgICBvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyIKKyAgICAiICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJwYWNrZWRcIiBpc19leHRlbnNpb246IGZhbHNlIH0iCisgICAgIiAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwidHJ1ZVwiIH19fVxuIgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5wYWNrZWRfc3RyaW5nOiBUWVBFOiBbcGFja2VkID0gdHJ1ZV0gY2FuIG9ubHkgYmUgIgorICAgICAgICAic3BlY2lmaWVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzLlxuIgorICAgICJmb28ucHJvdG86IEZvby5wYWNrZWRfbWVzc2FnZTogVFlQRTogW3BhY2tlZCA9IHRydWVdIGNhbiBvbmx5IGJlICIKKyAgICAgICAgInNwZWNpZmllZCBmb3IgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcy5cbiIKKyAgICAiZm9vLnByb3RvOiBGb28ub3B0aW9uYWxfaW50MzI6IFRZUEU6IFtwYWNrZWQgPSB0cnVlXSBjYW4gb25seSBiZSAiCisgICAgICAgICJzcGVjaWZpZWQgZm9yIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMuXG4iCisgICAgICAgICk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBPcHRpb25Xcm9uZ1R5cGUpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIgIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9TVFJJTkcgIgorICAgICIgICAgICAgICAgb3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJjdHlwZVwiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEgfSIKKyAgICAiICAgICAgICAgIH0iCisgICAgIiAgfSIKKyAgICAifVxuIiwKKworICAgICJmb28ucHJvdG86IFRlc3RNZXNzYWdlLmZvbzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBtdXN0IGJlIGlkZW50aWZpZXIgZm9yICIKKyAgICAiZW51bS12YWx1ZWQgb3B0aW9uIFwiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5jdHlwZVwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBPcHRpb25FeHRlbmRzQXRvbWljVHlwZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiAiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX1NUUklORyAiCisgICAgIiAgICAgICAgICBvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImN0eXBlXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9IgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxIH0iCisgICAgIiAgICAgICAgICB9IgorICAgICIgIH0iCisgICAgIn1cbiIsCisKKyAgICAiZm9vLnByb3RvOiBUZXN0TWVzc2FnZS5mb286IE9QVElPTl9OQU1FOiBPcHRpb24gXCJjdHlwZVwiIGlzIGFuICIKKyAgICAiYXRvbWljIHR5cGUsIG5vdCBhIG1lc3NhZ2UuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIER1cE9wdGlvbikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiAiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX1VJTlQzMiAiCisgICAgIiAgICAgICAgICBvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImN0eXBlXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiQ09SRFwiIH0iCisgICAgIiAgICAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImN0eXBlXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiQ09SRFwiIH0iCisgICAgIiAgICAgICAgICB9IgorICAgICIgIH0iCisgICAgIn1cbiIsCisKKyAgICAiZm9vLnByb3RvOiBUZXN0TWVzc2FnZS5mb286IE9QVElPTl9OQU1FOiBPcHRpb24gXCJjdHlwZVwiIHdhcyAiCisgICAgImFscmVhZHkgc2V0LlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnZhbGlkT3B0aW9uTmFtZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiAiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0JPT0wgIgorICAgICIgICAgICAgICAgb3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJ1bmludGVycHJldGVkX29wdGlvblwiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEgIgorICAgICIgICAgICAgICAgICAgICAgICAgIH0iCisgICAgIiAgICAgICAgICB9IgorICAgICIgIH0iCisgICAgIn1cbiIsCisKKyAgICAiZm9vLnByb3RvOiBUZXN0TWVzc2FnZS5mb286IE9QVElPTl9OQU1FOiBPcHRpb24gbXVzdCBub3QgdXNlICIKKyAgICAicmVzZXJ2ZWQgbmFtZSBcInVuaW50ZXJwcmV0ZWRfb3B0aW9uXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlcGVhdGVkT3B0aW9uKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfUkVQRUFURUQgIgorICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0ZMT0FUIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVfdmFsdWU6IDEuMiB9IH0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fTkFNRTogT3B0aW9uIGZpZWxkIFwiKGZvbylcIiBpcyByZXBlYXRlZC4gIgorICAgICJSZXBlYXRlZCBvcHRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBDdXN0b21PcHRpb25Db25mbGljdGluZ0ZpZWxkTnVtYmVyKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvbzFcIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zXCIgfSIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb28yXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UMzIgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1wiIH0iLAorCisgICAgImZvby5wcm90bzogZm9vMjogTlVNQkVSOiBFeHRlbnNpb24gbnVtYmVyIDc2NzI3NTcgaGFzIGFscmVhZHkgYmVlbiB1c2VkICIKKyAgICAiaW4gXCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zXCIgYnkgZXh0ZW5zaW9uIFwiZm9vMVwiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnQzMk9wdGlvblZhbHVlT3V0T2ZQb3NpdGl2ZVJhbmdlKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0lOVDMyIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDB4ODAwMDAwMDAgfSAiCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG91dCBvZiByYW5nZSAiCisgICAgImZvciBpbnQzMiBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW50MzJPcHRpb25WYWx1ZU91dE9mTmVnYXRpdmVSYW5nZSkgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmVfaW50X3ZhbHVlOiAtMHg4MDAwMDAwMSB9ICIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgb3V0IG9mIHJhbmdlICIKKyAgICAiZm9yIGludDMyIG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnQzMk9wdGlvblZhbHVlSXNOb3RQb3NpdGl2ZUludCkgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlOiBcIjVcIiB9IH0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgaW50ZWdlciAiCisgICAgImZvciBpbnQzMiBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW50NjRPcHRpb25WYWx1ZU91dE9mUmFuZ2UpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UNjQgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMHg4MDAwMDAwMDAwMDAwMDAwIH0gIgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBvdXQgb2YgcmFuZ2UgIgorICAgICJmb3IgaW50NjQgb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEludDY0T3B0aW9uVmFsdWVJc05vdFBvc2l0aXZlSW50KSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0lOVDY0IGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcIjVcIiB9IH0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgaW50ZWdlciAiCisgICAgImZvciBpbnQ2NCBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVUludDMyT3B0aW9uVmFsdWVPdXRPZlJhbmdlKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX1VJTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAweDEwMDAwMDAwMCB9IH0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG91dCBvZiByYW5nZSAiCisgICAgImZvciB1aW50MzIgb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFVJbnQzMk9wdGlvblZhbHVlSXNOb3RQb3NpdGl2ZUludCkgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9VSU5UMzIgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZV92YWx1ZTogLTUuNiB9IH0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGludGVnZXIgIgorICAgICJmb3IgdWludDMyIG9wdGlvbiBcImZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVSW50NjRPcHRpb25WYWx1ZUlzTm90UG9zaXRpdmVJbnQpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfVUlOVDY0IGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZV9pbnRfdmFsdWU6IC01IH0gfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlciAiCisgICAgImZvciB1aW50NjQgb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZsb2F0T3B0aW9uVmFsdWVJc05vdE51bWJlcikgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9GTE9BVCBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlOiBcImJhclwiIH0gfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBudW1iZXIgIgorICAgICJmb3IgZmxvYXQgb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIERvdWJsZU9wdGlvblZhbHVlSXNOb3ROdW1iZXIpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfRE9VQkxFIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWU6IFwiYmFyXCIgfSB9IiwKKworICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBtdXN0IGJlIG51bWJlciAiCisgICAgImZvciBkb3VibGUgb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEJvb2xPcHRpb25WYWx1ZUlzTm90VHJ1ZU9yRmFsc2UpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfQk9PTCBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgorICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJiYXJcIiB9IH0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiICIKKyAgICAiZm9yIGJvb2xlYW4gb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1PcHRpb25WYWx1ZUlzTm90SWRlbnRpZmllcikgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJGb29FbnVtXCIgdmFsdWUgeyBuYW1lOiBcIkJBUlwiIG51bWJlcjogMSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgeyBuYW1lOiBcIkJBWlwiIG51bWJlcjogMiB9IH0iCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfRU5VTSB0eXBlX25hbWU6IFwiRm9vRW51bVwiICIKKyAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZTogXCJRVVVYXCIgfSB9IiwKKworICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBtdXN0IGJlIGlkZW50aWZpZXIgZm9yICIKKyAgICAiZW51bS12YWx1ZWQgb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1PcHRpb25WYWx1ZUlzTm90RW51bVZhbHVlTmFtZSkgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJGb29FbnVtXCIgdmFsdWUgeyBuYW1lOiBcIkJBUlwiIG51bWJlcjogMSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgeyBuYW1lOiBcIkJBWlwiIG51bWJlcjogMiB9IH0iCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfRU5VTSB0eXBlX25hbWU6IFwiRm9vRW51bVwiICIKKyAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiUVVVWFwiIH0gfSIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogRW51bSB0eXBlIFwiRm9vRW51bVwiIGhhcyBubyB2YWx1ZSAiCisgICAgIm5hbWVkIFwiUVVVWFwiIGZvciBvcHRpb24gXCJmb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bU9wdGlvblZhbHVlSXNTaWJsaW5nRW51bVZhbHVlTmFtZSkgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJGb29FbnVtMVwiIHZhbHVlIHsgbmFtZTogXCJCQVJcIiBudW1iZXI6IDEgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB7IG5hbWU6IFwiQkFaXCIgbnVtYmVyOiAyIH0gfSIKKyAgICAiZW51bV90eXBlIHsgbmFtZTogXCJGb29FbnVtMlwiIHZhbHVlIHsgbmFtZTogXCJRVVhcIiBudW1iZXI6IDEgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB7IG5hbWU6IFwiUVVVWFwiIG51bWJlcjogMiB9IH0iCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfRU5VTSB0eXBlX25hbWU6IFwiRm9vRW51bTFcIiAiCisgICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcIlFVVVhcIiB9IH0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IEVudW0gdHlwZSBcIkZvb0VudW0xXCIgaGFzIG5vIHZhbHVlICIKKyAgICAibmFtZWQgXCJRVVVYXCIgZm9yIG9wdGlvbiBcImZvb1wiLiBUaGlzIGFwcGVhcnMgdG8gYmUgYSB2YWx1ZSBmcm9tIGEgIgorICAgICJzaWJsaW5nIHR5cGUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFN0cmluZ09wdGlvblZhbHVlSXNOb3RTdHJpbmcpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfU1RSSU5HIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcIlFVVVhcIiB9IH0iLAorCisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgcXVvdGVkIHN0cmluZyBmb3IgIgorICAgICJzdHJpbmcgb3B0aW9uIFwiZm9vXCIuXG4iKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciB0ZXN0cyB0aGF0IGNoZWNrIGZvciBhZ2dyZWdhdGUgdmFsdWUgcGFyc2luZworLy8gZXJyb3JzLiAgVGhlICJ2YWx1ZSIgYXJndW1lbnQgaXMgZW1iZWRkZWQgaW5zaWRlIHRoZQorLy8gInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiBwb3J0aW9uIG9mIHRoZSByZXN1bHQuCitzdGF0aWMgc3RyaW5nIEVtYmVkQWdncmVnYXRlVmFsdWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9NRVNTQUdFIHR5cGVfbmFtZTogXCJGb29cIiAiCisgICAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKKyAgICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQwIH0gfSIsCisgICAgICB2YWx1ZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBBZ2dyZWdhdGVWYWx1ZU5vdEZvdW5kKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICBFbWJlZEFnZ3JlZ2F0ZVZhbHVlKCJzdHJpbmdfdmFsdWU6IFwiXCIiKSwKKyAgICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBPcHRpb24gXCJmb29cIiBpcyBhIG1lc3NhZ2UuICIKKyAgICAgICJUbyBzZXQgdGhlIGVudGlyZSBtZXNzYWdlLCB1c2Ugc3ludGF4IGxpa2UgIgorICAgICAgIlwiZm9vID0geyA8cHJvdG8gdGV4dCBmb3JtYXQ+IH1cIi4gVG8gc2V0IGZpZWxkcyB3aXRoaW4gaXQsIHVzZSAiCisgICAgICAic3ludGF4IGxpa2UgXCJmb28uZm9vID0gdmFsdWVcIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQWdncmVnYXRlVmFsdWVQYXJzZUVycm9yKSB7CisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICBFbWJlZEFnZ3JlZ2F0ZVZhbHVlKCJhZ2dyZWdhdGVfdmFsdWU6IFwiMSsyXCIiKSwKKyAgICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBFcnJvciB3aGlsZSBwYXJzaW5nIG9wdGlvbiAiCisgICAgICAidmFsdWUgZm9yIFwiZm9vXCI6IEV4cGVjdGVkIGlkZW50aWZpZXIuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEFnZ3JlZ2F0ZVZhbHVlVW5rbm93bkZpZWxkcykgeworICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgRW1iZWRBZ2dyZWdhdGVWYWx1ZSgiYWdncmVnYXRlX3ZhbHVlOiBcIng6MTAwXCIiKSwKKyAgICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBFcnJvciB3aGlsZSBwYXJzaW5nIG9wdGlvbiAiCisgICAgICAidmFsdWUgZm9yIFwiZm9vXCI6IE1lc3NhZ2UgdHlwZSBcIkZvb1wiIGhhcyBubyBmaWVsZCBuYW1lZCBcInhcIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTm90TGl0ZUltcG9ydHNMaXRlKSB7CisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgIm9wdGlvbnMgeyBvcHRpbWl6ZV9mb3I6IExJVEVfUlVOVElNRSB9ICIpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiICIsCisKKyAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9USEVSOiBGaWxlcyB0aGF0IGRvIG5vdCB1c2Ugb3B0aW1pemVfZm9yID0gIgorICAgICAgIkxJVEVfUlVOVElNRSBjYW5ub3QgaW1wb3J0IGZpbGVzIHdoaWNoIGRvIHVzZSB0aGlzIG9wdGlvbi4gIFRoaXMgZmlsZSAiCisgICAgICAiaXMgbm90IGxpdGUsIGJ1dCBpdCBpbXBvcnRzIFwiYmFyLnByb3RvXCIgd2hpY2ggaXMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIExpdGVFeHRlbmRzTm90TGl0ZSkgeworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGU6IHsiCisgICAgIiAgbmFtZTogXCJCYXJcIiIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMDAgfSIKKyAgICAifSIpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiICIKKyAgICAib3B0aW9ucyB7IG9wdGltaXplX2ZvcjogTElURV9SVU5USU1FIH0gIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImV4dFwiIG51bWJlcjogMTIzIGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UMzIgZXh0ZW5kZWU6IFwiQmFyXCIgfSIsCisKKyAgICAiZm9vLnByb3RvOiBleHQ6IEVYVEVOREVFOiBFeHRlbnNpb25zIHRvIG5vbi1saXRlIHR5cGVzIGNhbiBvbmx5IGJlICIKKyAgICAgICJkZWNsYXJlZCBpbiBub24tbGl0ZSBmaWxlcy4gIE5vdGUgdGhhdCB5b3UgY2Fubm90IGV4dGVuZCBhIG5vbi1saXRlICIKKyAgICAgICJ0eXBlIHRvIGNvbnRhaW4gYSBsaXRlIHR5cGUsIGJ1dCB0aGUgcmV2ZXJzZSBpcyBhbGxvd2VkLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBOb0xpdGVTZXJ2aWNlcykgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAib3B0aW9ucyB7IgorICAgICIgIG9wdGltaXplX2ZvcjogTElURV9SVU5USU1FIgorICAgICIgIGNjX2dlbmVyaWNfc2VydmljZXM6IHRydWUiCisgICAgIiAgamF2YV9nZW5lcmljX3NlcnZpY2VzOiB0cnVlIgorICAgICJ9ICIKKyAgICAic2VydmljZSB7IG5hbWU6IFwiRm9vXCIgfSIsCisKKyAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IEZpbGVzIHdpdGggb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FIGNhbm5vdCAiCisgICAgImRlZmluZSBzZXJ2aWNlcyB1bmxlc3MgeW91IHNldCBib3RoIG9wdGlvbnMgY2NfZ2VuZXJpY19zZXJ2aWNlcyBhbmQgIgorICAgICJqYXZhX2dlbmVyaWNfc2V2aWNlcyB0byBmYWxzZS5cbiIpOworCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgIm9wdGlvbnMgeyIKKyAgICAiICBvcHRpbWl6ZV9mb3I6IExJVEVfUlVOVElNRSIKKyAgICAiICBjY19nZW5lcmljX3NlcnZpY2VzOiBmYWxzZSIKKyAgICAiICBqYXZhX2dlbmVyaWNfc2VydmljZXM6IGZhbHNlIgorICAgICJ9ICIKKyAgICAic2VydmljZSB7IG5hbWU6IFwiQmFyXCIgfSIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUm9sbGJhY2tBZnRlckVycm9yKSB7CisgIC8vIEJ1aWxkIGEgZmlsZSB3aGljaCBjb250YWlucyBldmVyeSBraW5kIG9mIGNvbnN0cnVjdCBidXQgcmVmZXJlbmNlcyBhbgorICAvLyB1bmRlZmluZWQgdHlwZS4gIEFsbCB0aGVzZSBjb25zdHJ1Y3RzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHN5bWJvbCB0YWJsZQorICAvLyBiZWZvcmUgdGhlIHVuZGVmaW5lZCB0eXBlIGVycm9yIGlzIG5vdGljZWQuICBUaGUgRGVzY3JpcHRvclBvb2wgd2lsbCB0aGVuCisgIC8vIGhhdmUgdG8gcm9sbCBldmVyeXRoaW5nIGJhY2suCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCisgICAgIn0gIgorICAgICJlbnVtX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RFbnVtXCIiCisgICAgIiAgdmFsdWUgeyBuYW1lOlwiQkFSXCIgbnVtYmVyOjEgfSIKKyAgICAifSAiCisgICAgInNlcnZpY2UgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RTZXJ2aWNlXCIiCisgICAgIiAgbWV0aG9kIHsiCisgICAgIiAgICBuYW1lOiBcIkJhelwiIgorICAgICIgICAgaW5wdXRfdHlwZTogXCJOb1N1Y2hUeXBlXCIiICAgIC8vIGVycm9yCisgICAgIiAgICBvdXRwdXRfdHlwZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogVGVzdFNlcnZpY2UuQmF6OiBJTlBVVF9UWVBFOiBcIk5vU3VjaFR5cGVcIiBpcyBub3QgZGVmaW5lZC5cbiIpOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IGlmIHdlIGJ1aWxkIHRoZSBzYW1lIGZpbGUgYWdhaW4gd2l0aCB0aGUgZXJyb3IgZml4ZWQsCisgIC8vIGl0IHdvcmtzLiAgSWYgdGhlIGFib3ZlIHJvbGxiYWNrIHdhcyBpbmNvbXBsZXRlLCB0aGVuIHNvbWUgc3ltYm9scyB3aWxsCisgIC8vIGJlIGxlZnQgZGVmaW5lZCwgYW5kIHRoaXMgc2Vjb25kIGF0dGVtcHQgd2lsbCBmYWlsIHNpbmNlIGl0IHRyaWVzIHRvCisgIC8vIHJlLWRlZmluZSB0aGUgc2FtZSBzeW1ib2xzLgorICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCisgICAgIn0gIgorICAgICJlbnVtX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RFbnVtXCIiCisgICAgIiAgdmFsdWUgeyBuYW1lOlwiQkFSXCIgbnVtYmVyOjEgfSIKKyAgICAifSAiCisgICAgInNlcnZpY2UgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RTZXJ2aWNlXCIiCisgICAgIiAgbWV0aG9kIHsgbmFtZTpcIkJhelwiIgorICAgICIgICAgICAgICAgIGlucHV0X3R5cGU6XCJUZXN0TWVzc2FnZVwiIgorICAgICIgICAgICAgICAgIG91dHB1dF90eXBlOlwiVGVzdE1lc3NhZ2VcIiB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFcnJvcnNSZXBvcnRlZFRvTG9nRXJyb3IpIHsKKyAgLy8gVGVzdCB0aGF0IGVycm9ycyBhcmUgcmVwb3J0ZWQgdG8gR09PR0xFX0xPRyhFUlJPUikgaWYgbm8gZXJyb3IgY29sbGVjdG9yIGlzCisgIC8vIHByb3ZpZGVkLgorCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9ICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9ICIsCisgICAgJmZpbGVfcHJvdG8pKTsKKworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgRVhQRUNUX1RSVUUocG9vbF8uQnVpbGRGaWxlKGZpbGVfcHJvdG8pID09IE5VTEwpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKworICBBU1NFUlRfRVEoMiwgZXJyb3JzLnNpemUoKSk7CisKKyAgRVhQRUNUX0VRKCJJbnZhbGlkIHByb3RvIGRlc2NyaXB0b3IgZm9yIGZpbGUgXCJmb28ucHJvdG9cIjoiLCBlcnJvcnNbMF0pOworICBFWFBFQ1RfRVEoIiAgRm9vOiBcIkZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZC4iLCBlcnJvcnNbMV0pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZXNjcmlwdG9yRGF0YWJhc2UKKworc3RhdGljIHZvaWQgQWRkVG9EYXRhYmFzZShTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UqIGRhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX3RleHQpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV90ZXh0LCAmZmlsZV9wcm90bykpOworICBkYXRhYmFzZS0+QWRkKGZpbGVfcHJvdG8pOworfQorCitjbGFzcyBEYXRhYmFzZUJhY2tlZFBvb2xUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgRGF0YWJhc2VCYWNrZWRQb29sVGVzdCgpIHt9CisKKyAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlIGRhdGFiYXNlXzsKKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgQWRkVG9EYXRhYmFzZSgmZGF0YWJhc2VfLAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6XCJGb29cIiBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMCB9IH0gIgorICAgICAgImVudW1fdHlwZSB7IG5hbWU6XCJUZXN0RW51bVwiIHZhbHVlIHsgbmFtZTpcIkRVTU1ZXCIgbnVtYmVyOjAgfSB9ICIKKyAgICAgICJzZXJ2aWNlIHsgbmFtZTpcIlRlc3RTZXJ2aWNlXCIgfSAiKTsKKyAgICBBZGRUb0RhdGFiYXNlKCZkYXRhYmFzZV8sCisgICAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgICAiZGVwZW5kZW5jeTogXCJmb28ucHJvdG9cIiAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkJhclwiIH0gIgorICAgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJmb29fZXh0XCIgZXh0ZW5kZWU6IFwiLkZvb1wiIG51bWJlcjo1ICIKKyAgICAgICIgICAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiKTsKKyAgfQorCisgIC8vIFdlIGNhbid0IGluamVjdCBhIGZpbGUgY29udGFpbmluZyBlcnJvcnMgaW50byBhIERlc2NyaXB0b3JQb29sLCBzbyB3ZQorICAvLyBuZWVkIGFuIGFjdHVhbCBtb2NrIERlc2NyaXB0b3JEYXRhYmFzZSB0byB0ZXN0IGVycm9ycy4KKyAgY2xhc3MgRXJyb3JEZXNjcmlwdG9yRGF0YWJhc2UgOiBwdWJsaWMgRGVzY3JpcHRvckRhdGFiYXNlIHsKKyAgIHB1YmxpYzoKKyAgICBFcnJvckRlc2NyaXB0b3JEYXRhYmFzZSgpIHt9CisgICAgfkVycm9yRGVzY3JpcHRvckRhdGFiYXNlKCkge30KKworICAgIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgLy8gZXJyb3IucHJvdG8gYW5kIGVycm9yMi5wcm90byBjeWNsaWNhbGx5IGltcG9ydCBlYWNoIG90aGVyLgorICAgICAgaWYgKGZpbGVuYW1lID09ICJlcnJvci5wcm90byIpIHsKKyAgICAgICAgb3V0cHV0LT5DbGVhcigpOworICAgICAgICBvdXRwdXQtPnNldF9uYW1lKCJlcnJvci5wcm90byIpOworICAgICAgICBvdXRwdXQtPmFkZF9kZXBlbmRlbmN5KCJlcnJvcjIucHJvdG8iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9IGVsc2UgaWYgKGZpbGVuYW1lID09ICJlcnJvcjIucHJvdG8iKSB7CisgICAgICAgIG91dHB1dC0+Q2xlYXIoKTsKKyAgICAgICAgb3V0cHV0LT5zZXRfbmFtZSgiZXJyb3IyLnByb3RvIik7CisgICAgICAgIG91dHB1dC0+YWRkX2RlcGVuZGVuY3koImVycm9yLnByb3RvIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfTsKKworICAvLyBBIERlc2NyaXB0b3JEYXRhYmFzZSB0aGF0IGNvdW50cyBob3cgbWFueSB0aW1lcyBlYWNoIG1ldGhvZCBoYXMgYmVlbgorICAvLyBjYWxsZWQgYW5kIGZvcndhcmRzIHRvIHNvbWUgb3RoZXIgRGVzY3JpcHRvckRhdGFiYXNlLgorICBjbGFzcyBDYWxsQ291bnRpbmdEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworICAgcHVibGljOgorICAgIENhbGxDb3VudGluZ0RhdGFiYXNlKERlc2NyaXB0b3JEYXRhYmFzZSogd3JhcHBlZF9kYikKKyAgICAgIDogd3JhcHBlZF9kYl8od3JhcHBlZF9kYikgeworICAgICAgQ2xlYXIoKTsKKyAgICB9CisgICAgfkNhbGxDb3VudGluZ0RhdGFiYXNlKCkge30KKworICAgIERlc2NyaXB0b3JEYXRhYmFzZSogd3JhcHBlZF9kYl87CisKKyAgICBpbnQgY2FsbF9jb3VudF87CisKKyAgICB2b2lkIENsZWFyKCkgeworICAgICAgY2FsbF9jb3VudF8gPSAwOworICAgIH0KKworICAgIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgKytjYWxsX2NvdW50XzsKKyAgICAgIHJldHVybiB3cmFwcGVkX2RiXy0+RmluZEZpbGVCeU5hbWUoZmlsZW5hbWUsIG91dHB1dCk7CisgICAgfQorICAgIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgICAgICArK2NhbGxfY291bnRfOworICAgICAgcmV0dXJuIHdyYXBwZWRfZGJfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woc3ltYm9sX25hbWUsIG91dHB1dCk7CisgICAgfQorICAgIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgICAgICArK2NhbGxfY291bnRfOworICAgICAgcmV0dXJuIHdyYXBwZWRfZGJfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oCisgICAgICAgIGNvbnRhaW5pbmdfdHlwZSwgZmllbGRfbnVtYmVyLCBvdXRwdXQpOworICAgIH0KKyAgfTsKKworICAvLyBBIERlc2NyaXB0b3JEYXRhYmFzZSB3aGljaCBmYWxzZWx5IGFsd2F5cyByZXR1cm5zIGZvby5wcm90byB3aGVuIHNlYXJjaGluZworICAvLyBmb3IgYW55IHN5bWJvbCBvciBleHRlbnNpb24gbnVtYmVyLiAgVGhpcyBzaG91bGRuJ3QgY2F1c2UgdGhlCisgIC8vIERlc2NyaXB0b3JQb29sIHRvIHJlbG9hZCBmb28ucHJvdG8gaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQuCisgIGNsYXNzIEZhbHNlUG9zaXRpdmVEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgeworICAgcHVibGljOgorICAgIEZhbHNlUG9zaXRpdmVEYXRhYmFzZShEZXNjcmlwdG9yRGF0YWJhc2UqIHdyYXBwZWRfZGIpCisgICAgICA6IHdyYXBwZWRfZGJfKHdyYXBwZWRfZGIpIHt9CisgICAgfkZhbHNlUG9zaXRpdmVEYXRhYmFzZSgpIHt9CisKKyAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIHdyYXBwZWRfZGJfOworCisgICAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgICAgICByZXR1cm4gd3JhcHBlZF9kYl8tPkZpbmRGaWxlQnlOYW1lKGZpbGVuYW1lLCBvdXRwdXQpOworICAgIH0KKyAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgcmV0dXJuIEZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iLCBvdXRwdXQpOworICAgIH0KKyAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgICAgcmV0dXJuIEZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iLCBvdXRwdXQpOworICAgIH0KKyAgfTsKK307CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBGaW5kRmlsZUJ5TmFtZSkgeworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb28gPSBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKTsKKyAgQVNTRVJUX1RSVUUoZm9vICE9IE5VTEwpOworICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZvby0+bmFtZSgpKTsKKyAgQVNTRVJUX0VRKDEsIGZvby0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoIkZvbyIsIGZvby0+bWVzc2FnZV90eXBlKDApLT5uYW1lKCkpOworCisgIEVYUEVDVF9FUShmb28sIHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpKTsKKworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJub19zdWNoX2ZpbGUucHJvdG8iKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmREZXBlbmRlbmN5QmVmb3JlRGVwZW5kZW50KSB7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOworICBBU1NFUlRfVFJVRShmb28gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZm9vLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgZm9vLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9FUSgiRm9vIiwgZm9vLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhciA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImJhci5wcm90byIpOworICBBU1NFUlRfVFJVRShiYXIgIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgYmFyLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgYmFyLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEVYUEVDVF9FUSgiQmFyIiwgYmFyLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgQVNTRVJUX0VRKDEsIGJhci0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGZvbywgYmFyLT5kZXBlbmRlbmN5KDApKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmREZXBlbmRlbnRCZWZvcmVEZXBlbmRlbmN5KSB7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhciA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImJhci5wcm90byIpOworICBBU1NFUlRfVFJVRShiYXIgIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgYmFyLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgYmFyLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEFTU0VSVF9FUSgiQmFyIiwgYmFyLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOworICBBU1NFUlRfVFJVRShmb28gIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZm9vLT5uYW1lKCkpOworICBBU1NFUlRfRVEoMSwgZm9vLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgIEFTU0VSVF9FUSgiRm9vIiwgZm9vLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7CisKKyAgQVNTRVJUX0VRKDEsIGJhci0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKGZvbywgYmFyLT5kZXBlbmRlbmN5KDApKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCkgeworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvbyIpOworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUtPm5hbWUoKSk7CisgIEVYUEVDVF9FUShmaWxlLCBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKSk7CisKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIk5vU3VjaFN5bWJvbCIpID09IE5VTEwpOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRmluZE1lc3NhZ2VUeXBlQnlOYW1lKSB7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7CisKKyAgY29uc3QgRGVzY3JpcHRvciogdHlwZSA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKKyAgQVNTRVJUX1RSVUUodHlwZSAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKCJGb28iLCB0eXBlLT5uYW1lKCkpOworICBFWFBFQ1RfRVEodHlwZS0+ZmlsZSgpLCBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKSk7CisKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIk5vU3VjaFR5cGUiKSA9PSBOVUxMKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmRFeHRlbnNpb25CeU51bWJlcikgeworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOworCisgIGNvbnN0IERlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKKyAgQVNTRVJUX1RSVUUoZm9vICE9IE5VTEwpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uID0gcG9vbC5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZm9vLCA1KTsKKyAgQVNTRVJUX1RSVUUoZXh0ZW5zaW9uICE9IE5VTEwpOworICBFWFBFQ1RfRVEoImZvb19leHQiLCBleHRlbnNpb24tPm5hbWUoKSk7CisgIEVYUEVDVF9FUShleHRlbnNpb24tPmZpbGUoKSwgcG9vbC5GaW5kRmlsZUJ5TmFtZSgiYmFyLnByb3RvIikpOworCisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEV4dGVuc2lvbkJ5TnVtYmVyKGZvbywgMTIpID09IE5VTEwpOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRmluZEFsbEV4dGVuc2lvbnMpIHsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbCgmZGF0YWJhc2VfKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBmb28gPSBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9vIik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAvLyBSZXBlYXQgdGhlIGxvb2t1cCB0d2ljZSwgdG8gY2hlY2sgdGhhdCB3ZSBnZXQgY29uc2lzdGVudAorICAgIC8vIHJlc3VsdHMgZGVzcGl0ZSB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgbG9va3VwIG11dGF0aW5nIHRoZSBwb29sLgorICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBleHRlbnNpb25zOworICAgIHBvb2wuRmluZEFsbEV4dGVuc2lvbnMoZm9vLCAmZXh0ZW5zaW9ucyk7CisgICAgQVNTRVJUX0VRKDEsIGV4dGVuc2lvbnMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoNSwgZXh0ZW5zaW9uc1swXS0+bnVtYmVyKCkpOworICB9Cit9CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBFcnJvcldpdGhvdXRFcnJvckNvbGxlY3RvcikgeworICBFcnJvckRlc2NyaXB0b3JEYXRhYmFzZSBlcnJvcl9kYXRhYmFzZTsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbCgmZXJyb3JfZGF0YWJhc2UpOworCisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJlcnJvci5wcm90byIpID09IE5VTEwpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKworICBFWFBFQ1RfRkFMU0UoZXJyb3JzLmVtcHR5KCkpOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRXJyb3JXaXRoRXJyb3JDb2xsZWN0b3IpIHsKKyAgRXJyb3JEZXNjcmlwdG9yRGF0YWJhc2UgZXJyb3JfZGF0YWJhc2U7CisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmVycm9yX2RhdGFiYXNlLCAmZXJyb3JfY29sbGVjdG9yKTsKKworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJlcnJvci5wcm90byIpID09IE5VTEwpOworICBFWFBFQ1RfRVEoCisgICAgImVycm9yLnByb3RvOiBlcnJvci5wcm90bzogT1RIRVI6IEZpbGUgcmVjdXJzaXZlbHkgaW1wb3J0cyBpdHNlbGY6ICIKKyAgICAgICJlcnJvci5wcm90byAtPiBlcnJvcjIucHJvdG8gLT4gZXJyb3IucHJvdG9cbiIKKyAgICAiZXJyb3IyLnByb3RvOiBlcnJvcjIucHJvdG86IE9USEVSOiBJbXBvcnQgXCJlcnJvci5wcm90b1wiIHdhcyBub3QgIgorICAgICAgImZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iCisgICAgImVycm9yLnByb3RvOiBlcnJvci5wcm90bzogT1RIRVI6IEltcG9ydCBcImVycm9yMi5wcm90b1wiIHdhcyBub3QgIgorICAgICAgImZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iLAorICAgIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7Cit9CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBVbml0dGVzdFByb3RvKSB7CisgIC8vIFRyeSB0byBsb2FkIGFsbCBvZiB1bml0dGVzdC5wcm90byBmcm9tIGEgRGVzY3JpcHRvckRhdGFiYXNlLiAgVGhpcyBzaG91bGQKKyAgLy8gdGhvcm91Z2hseSB0ZXN0IGFsbCBwYXRocyB0aHJvdWdoIERlc2NyaXB0b3JCdWlsZGVyIHRvIGluc3VyZSB0aGF0IHRoZXJlCisgIC8vIGFyZSBubyBkZWFkbG9ja2luZyBwcm9ibGVtcyB3aGVuIHBvb2xfLT5tdXRleF8gaXMgbm9uLU5VTEwuCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBvcmlnaW5hbF9maWxlID0KKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPmZpbGUoKTsKKworICBEZXNjcmlwdG9yUG9vbERhdGFiYXNlIGRhdGFiYXNlKCpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSk7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZnJvbV9kYXRhYmFzZSA9CisgICAgcG9vbC5GaW5kRmlsZUJ5TmFtZShvcmlnaW5hbF9maWxlLT5uYW1lKCkpOworCisgIEFTU0VSVF9UUlVFKGZpbGVfZnJvbV9kYXRhYmFzZSAhPSBOVUxMKTsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIG9yaWdpbmFsX2ZpbGVfcHJvdG87CisgIG9yaWdpbmFsX2ZpbGUtPkNvcHlUbygmb3JpZ2luYWxfZmlsZV9wcm90byk7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX2Zyb21fZGF0YWJhc2VfcHJvdG87CisgIGZpbGVfZnJvbV9kYXRhYmFzZS0+Q29weVRvKCZmaWxlX2Zyb21fZGF0YWJhc2VfcHJvdG8pOworCisgIEVYUEVDVF9FUShvcmlnaW5hbF9maWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCisgICAgICAgICAgICBmaWxlX2Zyb21fZGF0YWJhc2VfcHJvdG8uRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBEb2VzbnRSZXRyeURiVW5uZWNlc3NhcmlseSkgeworICAvLyBTZWFyY2hpbmcgZm9yIGEgY2hpbGQgb2YgYW4gZXhpc3RpbmcgZGVzY3JpcHRvciBzaG91bGQgbmV2ZXIgZmFsbCBiYWNrCisgIC8vIHRvIHRoZSBEZXNjcmlwdG9yRGF0YWJhc2UgZXZlbiBpZiBpdCBpc24ndCBmb3VuZCwgYmVjYXVzZSB3ZSBrbm93IGFsbAorICAvLyBjaGlsZHJlbiBhcmUgYWxyZWFkeSBsb2FkZWQuCisgIENhbGxDb3VudGluZ0RhdGFiYXNlIGNhbGxfY291bnRlcigmZGF0YWJhc2VfKTsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbCgmY2FsbF9jb3VudGVyKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworICBjb25zdCBEZXNjcmlwdG9yKiBmb28gPSBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9vIik7CisgIEFTU0VSVF9UUlVFKGZvbyAhPSBOVUxMKTsKKyAgY29uc3QgRW51bURlc2NyaXB0b3IqIHRlc3RfZW51bSA9IHBvb2wuRmluZEVudW1UeXBlQnlOYW1lKCJUZXN0RW51bSIpOworICBBU1NFUlRfVFJVRSh0ZXN0X2VudW0gIT0gTlVMTCk7CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiB0ZXN0X3NlcnZpY2UgPSBwb29sLkZpbmRTZXJ2aWNlQnlOYW1lKCJUZXN0U2VydmljZSIpOworICBBU1NFUlRfVFJVRSh0ZXN0X3NlcnZpY2UgIT0gTlVMTCk7CisKKyAgRVhQRUNUX05FKDAsIGNhbGxfY291bnRlci5jYWxsX2NvdW50Xyk7CisgIGNhbGxfY291bnRlci5DbGVhcigpOworCisgIEVYUEVDVF9UUlVFKGZvby0+RmluZEZpZWxkQnlOYW1lKCJub19zdWNoX2ZpZWxkIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZvby0+RmluZEV4dGVuc2lvbkJ5TmFtZSgibm9fc3VjaF9leHRlbnNpb24iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9vLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiTm9TdWNoTWVzc2FnZVR5cGUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9vLT5GaW5kRW51bVR5cGVCeU5hbWUoIk5vU3VjaEVudW1UeXBlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZvby0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiTk9fU1VDSF9WQUxVRSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRSh0ZXN0X2VudW0tPkZpbmRWYWx1ZUJ5TmFtZSgiTk9fU1VDSF9WQUxVRSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRSh0ZXN0X3NlcnZpY2UtPkZpbmRNZXRob2RCeU5hbWUoIk5vU3VjaE1ldGhvZCIpID09IE5VTEwpOworCisgIEVYUEVDVF9UUlVFKGZpbGUtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiTm9TdWNoTWVzc2FnZVR5cGUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZmlsZS0+RmluZEVudW1UeXBlQnlOYW1lKCJOb1N1Y2hFbnVtVHlwZSIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShmaWxlLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJOT19TVUNIX1ZBTFVFIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZpbGUtPkZpbmRTZXJ2aWNlQnlOYW1lKCJOT19TVUNIX1ZBTFVFIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZpbGUtPkZpbmRFeHRlbnNpb25CeU5hbWUoIm5vX3N1Y2hfZXh0ZW5zaW9uIikgPT0gTlVMTCk7CisgIEVYUEVDVF9FUSgwLCBjYWxsX2NvdW50ZXIuY2FsbF9jb3VudF8pOworfQorCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRG9lc250UmVsb2FkRmlsZXNVbmNlc2Vzc2FyaWx5KSB7CisgIC8vIElmIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgpIG9yIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigpIHJldHVybiBhCisgIC8vIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGluIHRoZSBEZXNjcmlwdG9yUG9vbCwgaXQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvCisgIC8vIHJlbG9hZCB0aGUgZmlsZS4KKyAgRmFsc2VQb3NpdGl2ZURhdGFiYXNlIGZhbHNlX3Bvc2l0aXZlX2RhdGFiYXNlKCZkYXRhYmFzZV8pOworICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZmYWxzZV9wb3NpdGl2ZV9kYXRhYmFzZSwgJmVycm9yX2NvbGxlY3Rvcik7CisKKyAgLy8gRmlyc3QgbWFrZSBzdXJlIGZvby5wcm90byBpcyBsb2FkZWQuCisgIGNvbnN0IERlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKKyAgQVNTRVJUX1RSVUUoZm9vICE9IE5VTEwpOworCisgIC8vIFRyeSBpbmR1Y2luZyBmYWxzZSBwb3NpdGl2ZXMuCisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJOb1N1Y2hTeW1ib2wiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZm9vLCAyMikgPT0gTlVMTCk7CisKKyAgLy8gTm8gZXJyb3JzIHNob3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQuICAoSWYgZm9vLnByb3RvIHdhcyBpbmNvcnJlY3RseQorICAvLyBsb2FkZWQgbXVsdGlwbGUgdGltZXMsIGVycm9ycyB3b3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQuKQorICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7Cit9CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBEb2VzbnRSZWxvYWRLbm93bkJhZEZpbGVzKSB7CisgIEVycm9yRGVzY3JpcHRvckRhdGFiYXNlIGVycm9yX2RhdGFiYXNlOworICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZlcnJvcl9kYXRhYmFzZSwgJmVycm9yX2NvbGxlY3Rvcik7CisKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUJ5TmFtZSgiZXJyb3IucHJvdG8iKSA9PSBOVUxMKTsKKyAgZXJyb3JfY29sbGVjdG9yLnRleHRfLmNsZWFyKCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEZpbGVCeU5hbWUoImVycm9yLnByb3RvIikgPT0gTlVMTCk7CisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKK30KKworVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIERvZXNudEZhbGxiYWNrT25Xcm9uZ1R5cGUpIHsKKyAgLy8gSWYgYSBsb29rdXAgZmluZHMgYSBzeW1ib2wgb2YgdGhlIHdyb25nIHR5cGUgKGUuZy4gd2UgcGFzcyBhIHR5cGUgbmFtZQorICAvLyB0byBGaW5kRmllbGRCeU5hbWUoKSksIHdlIHNob3VsZCBmYWlsIGZhc3QsIHdpdGhvdXQgY2hlY2tpbmcgdGhlIGZhbGxiYWNrCisgIC8vIGRhdGFiYXNlLgorICBDYWxsQ291bnRpbmdEYXRhYmFzZSBjYWxsX2NvdW50ZXIoJmRhdGFiYXNlXyk7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmNhbGxfY291bnRlcik7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vID0gcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkZvbyIpOworICBBU1NFUlRfVFJVRShmb28gIT0gTlVMTCk7CisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiB0ZXN0X2VudW0gPSBwb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgiVGVzdEVudW0iKTsKKyAgQVNTRVJUX1RSVUUodGVzdF9lbnVtICE9IE5VTEwpOworCisgIEVYUEVDVF9ORSgwLCBjYWxsX2NvdW50ZXIuY2FsbF9jb3VudF8pOworICBjYWxsX2NvdW50ZXIuQ2xlYXIoKTsKKworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiVGVzdEVudW0iKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmllbGRCeU5hbWUoIkZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRFeHRlbnNpb25CeU5hbWUoIkZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEVudW1WYWx1ZUJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZFNlcnZpY2VCeU5hbWUoIkZvbyIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpID09IE5VTEwpOworCisgIEVYUEVDVF9FUSgwLCBjYWxsX2NvdW50ZXIuY2FsbF9jb3VudF8pOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworfSAgLy8gbmFtZXNwYWNlIGRlc2NyaXB0b3JfdW5pdHRlc3QKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTFhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuY2MKQEAgLTAsMCArMSw1NTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIER5bmFtaWNNZXNzYWdlIGlzIGltcGxlbWVudGVkIGJ5IGNvbnN0cnVjdGluZyBhIGRhdGEgc3RydWN0dXJlIHdoaWNoCisvLyBoYXMgcm91Z2hseSB0aGUgc2FtZSBtZW1vcnkgbGF5b3V0IGFzIGEgZ2VuZXJhdGVkIG1lc3NhZ2Ugd291bGQgaGF2ZS4KKy8vIFRoZW4sIHdlIHVzZSBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbiB0byBpbXBsZW1lbnQgb3VyIHJlZmxlY3Rpb24KKy8vIGludGVyZmFjZS4gIEFsbCB0aGUgb3RoZXIgb3BlcmF0aW9ucyB3ZSBuZWVkIHRvIGltcGxlbWVudCAoZS5nLgorLy8gcGFyc2luZywgY29weWluZywgZXRjLikgYXJlIGFscmVhZHkgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YKKy8vIFJlZmxlY3Rpb24sIHNvIHRoZSByZXN0IGlzIGVhc3kuCisvLworLy8gVGhlIHVwIHNpZGUgb2YgdGhpcyBzdHJhdGVneSBpcyB0aGF0IGl0J3MgdmVyeSBlZmZpY2llbnQuICBXZSBkb24ndAorLy8gbmVlZCB0byB1c2UgaGFzaF9tYXBzIG9yIGdlbmVyaWMgcmVwcmVzZW50YXRpb25zIG9mIGZpZWxkcy4gIFRoZQorLy8gZG93biBzaWRlIGlzIHRoYXQgdGhpcyBpcyBhIGxvdy1sZXZlbCBtZW1vcnkgbWFuYWdlbWVudCBoYWNrIHdoaWNoCisvLyBjYW4gYmUgdHJpY2t5IHRvIGdldCByaWdodC4KKy8vCisvLyBBcyBtZW50aW9uZWQgaW4gdGhlIGhlYWRlciwgd2Ugb25seSBleHBvc2UgYSBEeW5hbWljTWVzc2FnZUZhY3RvcnkKKy8vIHB1YmxpY2x5LCBub3QgdGhlIER5bmFtaWNNZXNzYWdlIGNsYXNzIGl0c2VsZi4gIFRoaXMgaXMgYmVjYXVzZQorLy8gR2VuZXJpY01lc3NhZ2VSZWZsZWN0aW9uIHdhbnRzIHRvIGhhdmUgYSBwb2ludGVyIHRvIGEgImRlZmF1bHQiCisvLyBjb3B5IG9mIHRoZSBjbGFzcywgd2l0aCBhbGwgZmllbGRzIGluaXRpYWxpemVkIHRvIHRoZWlyIGRlZmF1bHQKKy8vIHZhbHVlcy4gIFdlIG9ubHkgd2FudCB0byBjb25zdHJ1Y3Qgb25lIG9mIHRoZXNlIHBlciBtZXNzYWdlIHR5cGUsCisvLyBzbyBEeW5hbWljTWVzc2FnZUZhY3Rvcnkgc3RvcmVzIGEgY2FjaGUgb2YgZGVmYXVsdCBtZXNzYWdlcyBmb3IKKy8vIGVhY2ggdHlwZSBpdCBzZWVzIChlYWNoIHVuaXF1ZSBEZXNjcmlwdG9yIHBvaW50ZXIpLiAgVGhlIGNvZGUKKy8vIHJlZmVycyB0byB0aGUgImRlZmF1bHQiIGNvcHkgb2YgdGhlIGNsYXNzIGFzIHRoZSAicHJvdG90eXBlIi4KKy8vCisvLyBOb3RlIG9uIG1lbW9yeSBhbGxvY2F0aW9uOiAgVGhpcyBtb2R1bGUgb2Z0ZW4gY2FsbHMgIm9wZXJhdG9yIG5ldygpIgorLy8gdG8gYWxsb2NhdGUgdW50eXBlZCBtZW1vcnksIHJhdGhlciB0aGFuIGNhbGxpbmcgc29tZXRoaW5nIGxpa2UKKy8vICJuZXcgdWludDhbXSIuICBUaGlzIGlzIGJlY2F1c2UgIm9wZXJhdG9yIG5ldygpIiBtZWFucyAiR2l2ZSBtZSBzb21lCisvLyBzcGFjZSB3aGljaCBJIGNhbiB1c2UgYXMgSSBwbGVhc2UuIiB3aGlsZSAibmV3IHVpbnQ4W10iIG1lYW5zICJHaXZlCisvLyBtZSBhbiBhcnJheSBvZiA4LWJpdCBpbnRlZ2Vycy4iLiAgSW4gcHJhY3RpY2UsIHRoZSBsYXRlciBtYXkgcmV0dXJuCisvLyBhIHBvaW50ZXIgdGhhdCBpcyBub3QgYWxpZ25lZCBjb3JyZWN0bHkgZm9yIGdlbmVyYWwgdXNlLiAgSSBiZWxpZXZlCisvLyBJdGVtIDggb2YgIk1vcmUgRWZmZWN0aXZlIEMrKyIgZGlzY3Vzc2VzIHRoaXMgaW4gbW9yZSBkZXRhaWwsIHRob3VnaAorLy8gSSBkb24ndCBoYXZlIHRoZSBib29rIG9uIG1lIHJpZ2h0IG5vdyBzbyBJJ20gbm90IHN1cmUuCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Cit1c2luZyBpbnRlcm5hbDo6RXh0ZW5zaW9uU2V0OwordXNpbmcgaW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFNvbWUgaGVscGVyIHRhYmxlcyBhbmQgZnVuY3Rpb25zLi4uCisKK25hbWVzcGFjZSB7CisKKy8vIENvbXB1dGUgdGhlIGJ5dGUgc2l6ZSBvZiB0aGUgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaWVsZC4KK2ludCBGaWVsZFNwYWNlVXNlZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgbGluZSB3cmFwcGluZworICBpZiAoZmllbGQtPmxhYmVsKCkgPT0gRkQ6OkxBQkVMX1JFUEVBVEVEKSB7CisgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9JTlQzMiAgOiByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8aW50MzIgICA+KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfSU5UNjQgIDogcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGludDY0ICAgPik7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX1VJTlQzMiA6IHJldHVybiBzaXplb2YoUmVwZWF0ZWRGaWVsZDx1aW50MzIgID4pOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9VSU5UNjQgOiByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8dWludDY0ICA+KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfRE9VQkxFIDogcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGRvdWJsZSAgPik7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0ZMT0FUICA6IHJldHVybiBzaXplb2YoUmVwZWF0ZWRGaWVsZDxmbG9hdCAgID4pOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9CT09MICAgOiByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8Ym9vbCAgICA+KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfRU5VTSAgIDogcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGludCAgICAgPik7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX01FU1NBR0U6IHJldHVybiBzaXplb2YoUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPik7CisKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfSU5UMzIgIDogcmV0dXJuIHNpemVvZihpbnQzMiAgICk7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0lOVDY0ICA6IHJldHVybiBzaXplb2YoaW50NjQgICApOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9VSU5UMzIgOiByZXR1cm4gc2l6ZW9mKHVpbnQzMiAgKTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfVUlOVDY0IDogcmV0dXJuIHNpemVvZih1aW50NjQgICk7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0RPVUJMRSA6IHJldHVybiBzaXplb2YoZG91YmxlICApOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9GTE9BVCAgOiByZXR1cm4gc2l6ZW9mKGZsb2F0ICAgKTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfQk9PTCAgIDogcmV0dXJuIHNpemVvZihib29sICAgICk7CisgICAgICBjYXNlIEZEOjpDUFBUWVBFX0VOVU0gICA6IHJldHVybiBzaXplb2YoaW50ICAgICApOworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9NRVNTQUdFOiByZXR1cm4gc2l6ZW9mKE1lc3NhZ2UqKTsKKworICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgIHJldHVybiBzaXplb2Yoc3RyaW5nKik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICByZXR1cm4gMDsKK30KKworaW5saW5lIGludCBEaXZpZGVSb3VuZGluZ1VwKGludCBpLCBpbnQgaikgeworICByZXR1cm4gKGkgKyAoaiAtIDEpKSAvIGo7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQga1NhZmVBbGlnbm1lbnQgPSBzaXplb2YodWludDY0KTsKKworaW5saW5lIGludCBBbGlnblRvKGludCBvZmZzZXQsIGludCBhbGlnbm1lbnQpIHsKKyAgcmV0dXJuIERpdmlkZVJvdW5kaW5nVXAob2Zmc2V0LCBhbGlnbm1lbnQpICogYWxpZ25tZW50OworfQorCisvLyBSb3VuZHMgdGhlIGdpdmVuIGJ5dGUgb2Zmc2V0IHVwIHRvIHRoZSBuZXh0IG9mZnNldCBhbGlnbmVkIHN1Y2ggdGhhdCBhbnkKKy8vIHR5cGUgbWF5IGJlIHN0b3JlZCBhdCBpdC4KK2lubGluZSBpbnQgQWxpZ25PZmZzZXQoaW50IG9mZnNldCkgeworICByZXR1cm4gQWxpZ25UbyhvZmZzZXQsIGtTYWZlQWxpZ25tZW50KTsKK30KKworI2RlZmluZSBiaXRzaXplb2YoVCkgKHNpemVvZihUKSAqIDgpCisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIER5bmFtaWNNZXNzYWdlIDogcHVibGljIE1lc3NhZ2UgeworIHB1YmxpYzoKKyAgc3RydWN0IFR5cGVJbmZvIHsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgaGFzX2JpdHNfb2Zmc2V0OworICAgIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXQ7CisgICAgaW50IGV4dGVuc2lvbnNfb2Zmc2V0OworCisgICAgLy8gTm90IG93bmVkIGJ5IHRoZSBUeXBlSW5mby4KKyAgICBEeW5hbWljTWVzc2FnZUZhY3RvcnkqIGZhY3Rvcnk7ICAvLyBUaGUgZmFjdG9yeSB0aGF0IGNyZWF0ZWQgdGhpcyBvYmplY3QuCisgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2w7ICAgICAgLy8gVGhlIGZhY3RvcnkncyBEZXNjcmlwdG9yUG9vbC4KKyAgICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlOyAgICAgICAgICAvLyBUeXBlIG9mIHRoaXMgRHluYW1pY01lc3NhZ2UuCisKKyAgICAvLyBXYXJuaW5nOiAgVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIGRlZmluZWQgaXMKKyAgICAvLyAgIGltcG9ydGFudCAodGhlIHByb3RvdHlwZSBtdXN0IGJlIGRlbGV0ZWQgKmJlZm9yZSogdGhlIG9mZnNldHMpLgorICAgIHNjb3BlZF9hcnJheTxpbnQ+IG9mZnNldHM7CisgICAgc2NvcGVkX3B0cjxjb25zdCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbj4gcmVmbGVjdGlvbjsKKyAgICBzY29wZWRfcHRyPGNvbnN0IER5bmFtaWNNZXNzYWdlPiBwcm90b3R5cGU7CisgIH07CisKKyAgRHluYW1pY01lc3NhZ2UoY29uc3QgVHlwZUluZm8qIHR5cGVfaW5mbyk7CisgIH5EeW5hbWljTWVzc2FnZSgpOworCisgIC8vIENhbGxlZCBvbiB0aGUgcHJvdG90eXBlIGFmdGVyIGNvbnN0cnVjdGlvbiB0byBpbml0aWFsaXplIG1lc3NhZ2UgZmllbGRzLgorICB2b2lkIENyb3NzTGlua1Byb3RvdHlwZXMoKTsKKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIE1lc3NhZ2UqIE5ldygpIGNvbnN0OworCisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3Q7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisKKyAgTWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEeW5hbWljTWVzc2FnZSk7CisKKyAgaW5saW5lIGJvb2wgaXNfcHJvdG90eXBlKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlX2luZm9fLT5wcm90b3R5cGUgPT0gdGhpcyB8fAorICAgICAgICAgICAvLyBJZiB0eXBlX2luZm9fLT5wcm90b3R5cGUgaXMgTlVMTCwgdGhlbiB3ZSBtdXN0IGJlIGNvbnN0cnVjdGluZworICAgICAgICAgICAvLyB0aGUgcHJvdG90eXBlIG5vdywgd2hpY2ggbWVhbnMgd2UgbXVzdCBiZSB0aGUgcHJvdG90eXBlLgorICAgICAgICAgICB0eXBlX2luZm9fLT5wcm90b3R5cGUgPT0gTlVMTDsKKyAgfQorCisgIGlubGluZSB2b2lkKiBPZmZzZXRUb1BvaW50ZXIoaW50IG9mZnNldCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4odGhpcykgKyBvZmZzZXQ7CisgIH0KKyAgaW5saW5lIGNvbnN0IHZvaWQqIE9mZnNldFRvUG9pbnRlcihpbnQgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPih0aGlzKSArIG9mZnNldDsKKyAgfQorCisgIGNvbnN0IFR5cGVJbmZvKiB0eXBlX2luZm9fOworCisgIC8vIFRPRE8oa2VudG9uKTogIE1ha2UgdGhpcyBhbiBhdG9taWM8aW50PiB3aGVuIEMrKyBzdXBwb3J0cyBpdC4KKyAgbXV0YWJsZSBpbnQgY2FjaGVkX2J5dGVfc2l6ZV87Cit9OworCitEeW5hbWljTWVzc2FnZTo6RHluYW1pY01lc3NhZ2UoY29uc3QgVHlwZUluZm8qIHR5cGVfaW5mbykKKyAgOiB0eXBlX2luZm9fKHR5cGVfaW5mbyksCisgICAgY2FjaGVkX2J5dGVfc2l6ZV8oMCkgeworICAvLyBXZSBuZWVkIHRvIGNhbGwgY29uc3RydWN0b3JzIGZvciB2YXJpb3VzIGZpZWxkcyBtYW51YWxseSBhbmQgc2V0CisgIC8vIGRlZmF1bHQgdmFsdWVzIHdoZXJlIGFwcHJvcHJpYXRlLiAgV2UgdXNlIHBsYWNlbWVudCBuZXcgdG8gY2FsbAorICAvLyBjb25zdHJ1Y3RvcnMuICBJZiB5b3UgaGF2ZW4ndCBoZWFyZCBvZiBwbGFjZW1lbnQgbmV3LCBJIHN1Z2dlc3QgR29vZ2xpbmcKKyAgLy8gaXQgbm93LiAgV2UgdXNlIHBsYWNlbWVudCBuZXcgZXZlbiBmb3IgcHJpbWl0aXZlIHR5cGVzIHRoYXQgZG9uJ3QgaGF2ZQorICAvLyBjb25zdHJ1Y3RvcnMgZm9yIGNvbnNpc3RlbmN5LiAgKEluIHRoZW9yeSwgcGxhY2VtZW50IG5ldyBzaG91bGQgYmUgdXNlZAorICAvLyBhbnkgdGltZSB5b3UgYXJlIHRyeWluZyB0byBjb252ZXJ0IHVudHlwZWQgbWVtb3J5IHRvIHR5cGVkIG1lbW9yeSwgdGhvdWdoCisgIC8vIGluIHByYWN0aWNlIHRoYXQncyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGZvciB0eXBlcyB0aGF0IGRvbid0IGhhdmUgYQorICAvLyBjb25zdHJ1Y3Rvci4pCisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHR5cGVfaW5mb18tPnR5cGU7CisKKyAgbmV3KE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT51bmtub3duX2ZpZWxkc19vZmZzZXQpKSBVbmtub3duRmllbGRTZXQ7CisKKyAgaWYgKHR5cGVfaW5mb18tPmV4dGVuc2lvbnNfb2Zmc2V0ICE9IC0xKSB7CisgICAgbmV3KE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5leHRlbnNpb25zX29mZnNldCkpIEV4dGVuc2lvblNldDsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOworICAgIHZvaWQqIGZpZWxkX3B0ciA9IE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5vZmZzZXRzW2ldKTsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKENQUFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbmV3KGZpZWxkX3B0cikgVFlQRShmaWVsZC0+ZGVmYXVsdF92YWx1ZV8jI1RZUEUoKSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG5ldyhmaWVsZF9wdHIpIFJlcGVhdGVkRmllbGQ8VFlQRT4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIEhBTkRMRV9UWVBFKElOVDMyICwgaW50MzIgKTsKKyAgICAgIEhBTkRMRV9UWVBFKElOVDY0ICwgaW50NjQgKTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKEZMT0FUICwgZmxvYXQgKTsKKyAgICAgIEhBTkRMRV9UWVBFKEJPT0wgICwgYm9vbCAgKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgbmV3KGZpZWxkX3B0cikgaW50KGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bnVtYmVyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5ldyhmaWVsZF9wdHIpIFJlcGVhdGVkRmllbGQ8aW50PigpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICAgICAgaWYgKGlzX3Byb3RvdHlwZSgpKSB7CisgICAgICAgICAgICAgICAgbmV3KGZpZWxkX3B0cikgY29uc3Qgc3RyaW5nKigmZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmluZyogZGVmYXVsdF92YWx1ZSA9CisgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxzdHJpbmcqIGNvbnN0Kj4oCisgICAgICAgICAgICAgICAgICAgIHR5cGVfaW5mb18tPnByb3RvdHlwZS0+T2Zmc2V0VG9Qb2ludGVyKAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVfaW5mb18tPm9mZnNldHNbaV0pKTsKKyAgICAgICAgICAgICAgICBuZXcoZmllbGRfcHRyKSBzdHJpbmcqKGRlZmF1bHRfdmFsdWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBuZXcoZmllbGRfcHRyKSBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiB7CisgICAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBuZXcoZmllbGRfcHRyKSBNZXNzYWdlKihOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuZXcoZmllbGRfcHRyKSBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK0R5bmFtaWNNZXNzYWdlOjp+RHluYW1pY01lc3NhZ2UoKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSB0eXBlX2luZm9fLT50eXBlOworCisgIHJlaW50ZXJwcmV0X2Nhc3Q8VW5rbm93bkZpZWxkU2V0Kj4oCisgICAgT2Zmc2V0VG9Qb2ludGVyKHR5cGVfaW5mb18tPnVua25vd25fZmllbGRzX29mZnNldCkpLT5+VW5rbm93bkZpZWxkU2V0KCk7CisKKyAgaWYgKHR5cGVfaW5mb18tPmV4dGVuc2lvbnNfb2Zmc2V0ICE9IC0xKSB7CisgICAgcmVpbnRlcnByZXRfY2FzdDxFeHRlbnNpb25TZXQqPigKKyAgICAgIE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5leHRlbnNpb25zX29mZnNldCkpLT5+RXh0ZW5zaW9uU2V0KCk7CisgIH0KKworICAvLyBXZSBuZWVkIHRvIG1hbnVhbGx5IHJ1biB0aGUgZGVzdHJ1Y3RvcnMgZm9yIHJlcGVhdGVkIGZpZWxkcyBhbmQgc3RyaW5ncywKKyAgLy8ganVzdCBhcyB3ZSByYW4gdGhlaXIgY29uc3RydWN0b3JzIGluIHRoZSB0aGUgRHluYW1pY01lc3NhZ2UgY29uc3RydWN0b3IuCisgIC8vIEFkZGl0aW9uYWxseSwgaWYgYW55IHNpbmd1bGFyIGVtYmVkZGVkIG1lc3NhZ2VzIGhhdmUgYmVlbiBhbGxvY2F0ZWQsIHdlCisgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZW0sIFVOTEVTUyB3ZSBhcmUgdGhlIHByb3RvdHlwZSBtZXNzYWdlIG9mIHRoaXMgdHlwZSwKKyAgLy8gaW4gd2hpY2ggY2FzZSBhbnkgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIG90aGVyIHByb3RvdHlwZXMgYW5kIHNob3VsZG4ndAorICAvLyBiZSB0b3VjaGVkLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKKyAgICB2b2lkKiBmaWVsZF9wdHIgPSBPZmZzZXRUb1BvaW50ZXIodHlwZV9pbmZvXy0+b2Zmc2V0c1tpXSk7CisKKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNVUFBFUkNBU0UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkRmllbGQ8TE9XRVJDQVNFPio+KGZpZWxkX3B0cikgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgLT5+UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhaworCisgICAgICAgIEhBTkRMRV9UWVBFKCBJTlQzMiwgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRSggRkxPQVQsICBmbG9hdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgQk9PTCwgICBib29sKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgICBpbnQpOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Kj4oZmllbGRfcHRyKQorICAgICAgICAgICAgICAgICAgLT5+UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPio+KGZpZWxkX3B0cikKKyAgICAgICAgICAgICAgLT5+UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPigpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgfSBlbHNlIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzogeworICAgICAgICAgIHN0cmluZyogcHRyID0gKnJlaW50ZXJwcmV0X2Nhc3Q8c3RyaW5nKio+KGZpZWxkX3B0cik7CisgICAgICAgICAgaWYgKHB0ciAhPSAmZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICgoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpICYmCisgICAgICAgICAgICAgICAhaXNfcHJvdG90eXBlKCkpIHsKKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UgPSAqcmVpbnRlcnByZXRfY2FzdDxNZXNzYWdlKio+KGZpZWxkX3B0cik7CisgICAgICBpZiAobWVzc2FnZSAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtZXNzYWdlOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIER5bmFtaWNNZXNzYWdlOjpDcm9zc0xpbmtQcm90b3R5cGVzKCkgeworICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiB0aGUgcHJvdG90eXBlIG1lc3NhZ2UuCisgIEdPT0dMRV9DSEVDSyhpc19wcm90b3R5cGUoKSk7CisKKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gdHlwZV9pbmZvXy0+ZmFjdG9yeTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHR5cGVfaW5mb18tPnR5cGU7CisKKyAgLy8gQ3Jvc3MtbGluayBkZWZhdWx0IG1lc3NhZ2VzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKKyAgICB2b2lkKiBmaWVsZF9wdHIgPSBPZmZzZXRUb1BvaW50ZXIodHlwZV9pbmZvXy0+b2Zmc2V0c1tpXSk7CisKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAvLyBGb3IgZmllbGRzIHdpdGggbWVzc2FnZSB0eXBlcywgd2UgbmVlZCB0byBjcm9zcy1saW5rIHdpdGggdGhlCisgICAgICAvLyBwcm90b3R5cGUgZm9yIHRoZSBmaWVsZCdzIHR5cGUuCisgICAgICAvLyBGb3Igc2luZ3VsYXIgZmllbGRzLCB0aGUgZmllbGQgaXMganVzdCBhIHBvaW50ZXIgd2hpY2ggc2hvdWxkCisgICAgICAvLyBwb2ludCB0byB0aGUgcHJvdG90eXBlLgorICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVzc2FnZSoqPihmaWVsZF9wdHIpID0KKyAgICAgICAgZmFjdG9yeS0+R2V0UHJvdG90eXBlTm9Mb2NrKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgfQorICB9Cit9CisKK01lc3NhZ2UqIER5bmFtaWNNZXNzYWdlOjpOZXcoKSBjb25zdCB7CisgIHZvaWQqIG5ld19iYXNlID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KG9wZXJhdG9yIG5ldyh0eXBlX2luZm9fLT5zaXplKSk7CisgIG1lbXNldChuZXdfYmFzZSwgMCwgdHlwZV9pbmZvXy0+c2l6ZSk7CisgIHJldHVybiBuZXcobmV3X2Jhc2UpIER5bmFtaWNNZXNzYWdlKHR5cGVfaW5mb18pOworfQorCitpbnQgRHluYW1pY01lc3NhZ2U6OkdldENhY2hlZFNpemUoKSBjb25zdCB7CisgIHJldHVybiBjYWNoZWRfYnl0ZV9zaXplXzsKK30KKwordm9pZCBEeW5hbWljTWVzc2FnZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICAvLyBUaGlzIGlzIHRoZW9yZXRpY2FsbHkgbm90IHRocmVhZC1jb21wYXRpYmxlLCBidXQgaW4gcHJhY3RpY2UgaXQgd29ya3MKKyAgLy8gYmVjYXVzZSBpZiBtdWx0aXBsZSB0aHJlYWRzIHdyaXRlIHRoaXMgc2ltdWx0YW5lb3VzbHksIHRoZXkgd2lsbCBiZQorICAvLyB3cml0aW5nIHRoZSBleGFjdCBzYW1lIHZhbHVlLgorICBjYWNoZWRfYnl0ZV9zaXplXyA9IHNpemU7Cit9CisKK01ldGFkYXRhIER5bmFtaWNNZXNzYWdlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgTWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSB0eXBlX2luZm9fLT50eXBlOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gdHlwZV9pbmZvXy0+cmVmbGVjdGlvbi5nZXQoKTsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0cnVjdCBEeW5hbWljTWVzc2FnZUZhY3Rvcnk6OlByb3RvdHlwZU1hcCB7CisgIHR5cGVkZWYgaGFzaF9tYXA8Y29uc3QgRGVzY3JpcHRvciosIGNvbnN0IER5bmFtaWNNZXNzYWdlOjpUeXBlSW5mbyo+IE1hcDsKKyAgTWFwIG1hcF87Cit9OworCitEeW5hbWljTWVzc2FnZUZhY3Rvcnk6OkR5bmFtaWNNZXNzYWdlRmFjdG9yeSgpCisgIDogcG9vbF8oTlVMTCksIGRlbGVnYXRlX3RvX2dlbmVyYXRlZF9mYWN0b3J5XyhmYWxzZSksCisgICAgcHJvdG90eXBlc18obmV3IFByb3RvdHlwZU1hcCkgeworfQorCitEeW5hbWljTWVzc2FnZUZhY3Rvcnk6OkR5bmFtaWNNZXNzYWdlRmFjdG9yeShjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCkKKyAgOiBwb29sXyhwb29sKSwgZGVsZWdhdGVfdG9fZ2VuZXJhdGVkX2ZhY3RvcnlfKGZhbHNlKSwKKyAgICBwcm90b3R5cGVzXyhuZXcgUHJvdG90eXBlTWFwKSB7Cit9CisKK0R5bmFtaWNNZXNzYWdlRmFjdG9yeTo6fkR5bmFtaWNNZXNzYWdlRmFjdG9yeSgpIHsKKyAgZm9yIChQcm90b3R5cGVNYXA6Ok1hcDo6aXRlcmF0b3IgaXRlciA9IHByb3RvdHlwZXNfLT5tYXBfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBwcm90b3R5cGVzXy0+bWFwXy5lbmQoKTsgKytpdGVyKSB7CisgICAgZGVsZXRlIGl0ZXItPnNlY29uZDsKKyAgfQorfQorCitjb25zdCBNZXNzYWdlKiBEeW5hbWljTWVzc2FnZUZhY3Rvcnk6OkdldFByb3RvdHlwZShjb25zdCBEZXNjcmlwdG9yKiB0eXBlKSB7CisgIE11dGV4TG9jayBsb2NrKCZwcm90b3R5cGVzX211dGV4Xyk7CisgIHJldHVybiBHZXRQcm90b3R5cGVOb0xvY2sodHlwZSk7Cit9CisKK2NvbnN0IE1lc3NhZ2UqIER5bmFtaWNNZXNzYWdlRmFjdG9yeTo6R2V0UHJvdG90eXBlTm9Mb2NrKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIHsKKyAgaWYgKGRlbGVnYXRlX3RvX2dlbmVyYXRlZF9mYWN0b3J5XyAmJgorICAgICAgdHlwZS0+ZmlsZSgpLT5wb29sKCkgPT0gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkpIHsKKyAgICByZXR1cm4gTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCktPkdldFByb3RvdHlwZSh0eXBlKTsKKyAgfQorCisgIGNvbnN0IER5bmFtaWNNZXNzYWdlOjpUeXBlSW5mbyoqIHRhcmdldCA9ICZwcm90b3R5cGVzXy0+bWFwX1t0eXBlXTsKKyAgaWYgKCp0YXJnZXQgIT0gTlVMTCkgeworICAgIC8vIEFscmVhZHkgZXhpc3RzLgorICAgIHJldHVybiAoKnRhcmdldCktPnByb3RvdHlwZS5nZXQoKTsKKyAgfQorCisgIER5bmFtaWNNZXNzYWdlOjpUeXBlSW5mbyogdHlwZV9pbmZvID0gbmV3IER5bmFtaWNNZXNzYWdlOjpUeXBlSW5mbzsKKyAgKnRhcmdldCA9IHR5cGVfaW5mbzsKKworICB0eXBlX2luZm8tPnR5cGUgPSB0eXBlOworICB0eXBlX2luZm8tPnBvb2wgPSAocG9vbF8gPT0gTlVMTCkgPyB0eXBlLT5maWxlKCktPnBvb2woKSA6IHBvb2xfOworICB0eXBlX2luZm8tPmZhY3RvcnkgPSB0aGlzOworCisgIC8vIFdlIG5lZWQgdG8gY29uc3RydWN0IGFsbCB0aGUgc3RydWN0dXJlcyBwYXNzZWQgdG8KKyAgLy8gR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24ncyBjb25zdHJ1Y3Rvci4gIFRoaXMgaW5jbHVkZXM6CisgIC8vIC0gQSBibG9jayBvZiBtZW1vcnkgdGhhdCBjb250YWlucyBzcGFjZSBmb3IgYWxsIHRoZSBtZXNzYWdlJ3MgZmllbGRzLgorICAvLyAtIEFuIGFycmF5IG9mIGludGVnZXJzIGluZGljYXRpbmcgdGhlIGJ5dGUgb2Zmc2V0IG9mIGVhY2ggZmllbGQgd2l0aGluCisgIC8vICAgdGhpcyBibG9jay4KKyAgLy8gLSBBIGJpZyBiaXRmaWVsZCBjb250YWluaW5nIGEgYml0IGZvciBlYWNoIGZpZWxkIGluZGljYXRpbmcgd2hldGhlcgorICAvLyAgIG9yIG5vdCB0aGF0IGZpZWxkIGlzIHNldC4KKworICAvLyBDb21wdXRlIHNpemUgYW5kIG9mZnNldHMuCisgIGludCogb2Zmc2V0cyA9IG5ldyBpbnRbdHlwZS0+ZmllbGRfY291bnQoKV07CisgIHR5cGVfaW5mby0+b2Zmc2V0cy5yZXNldChvZmZzZXRzKTsKKworICAvLyBEZWNpZGUgYWxsIGZpZWxkIG9mZnNldHMgYnkgcGFja2luZyBpbiBvcmRlci4KKyAgLy8gV2UgcGxhY2UgdGhlIER5bmFtaWNNZXNzYWdlIG9iamVjdCBpdHNlbGYgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYWxsb2NhdGVkCisgIC8vIHNwYWNlLgorICBpbnQgc2l6ZSA9IHNpemVvZihEeW5hbWljTWVzc2FnZSk7CisgIHNpemUgPSBBbGlnbk9mZnNldChzaXplKTsKKworICAvLyBOZXh0IHRoZSBoYXNfYml0cywgd2hpY2ggaXMgYW4gYXJyYXkgb2YgdWludDMycy4KKyAgdHlwZV9pbmZvLT5oYXNfYml0c19vZmZzZXQgPSBzaXplOworICBpbnQgaGFzX2JpdHNfYXJyYXlfc2l6ZSA9CisgICAgRGl2aWRlUm91bmRpbmdVcCh0eXBlLT5maWVsZF9jb3VudCgpLCBiaXRzaXplb2YodWludDMyKSk7CisgIHNpemUgKz0gaGFzX2JpdHNfYXJyYXlfc2l6ZSAqIHNpemVvZih1aW50MzIpOworICBzaXplID0gQWxpZ25PZmZzZXQoc2l6ZSk7CisKKyAgLy8gVGhlIEV4dGVuc2lvblNldCwgaWYgYW55LgorICBpZiAodHlwZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CisgICAgdHlwZV9pbmZvLT5leHRlbnNpb25zX29mZnNldCA9IHNpemU7CisgICAgc2l6ZSArPSBzaXplb2YoRXh0ZW5zaW9uU2V0KTsKKyAgICBzaXplID0gQWxpZ25PZmZzZXQoc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgLy8gTm8gZXh0ZW5zaW9ucy4KKyAgICB0eXBlX2luZm8tPmV4dGVuc2lvbnNfb2Zmc2V0ID0gLTE7CisgIH0KKworICAvLyBBbGwgdGhlIGZpZWxkcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAvLyBNYWtlIHN1cmUgZmllbGQgaXMgYWxpZ25lZCB0byBhdm9pZCBidXMgZXJyb3JzLgorICAgIGludCBmaWVsZF9zaXplID0gRmllbGRTcGFjZVVzZWQodHlwZS0+ZmllbGQoaSkpOworICAgIHNpemUgPSBBbGlnblRvKHNpemUsIG1pbihrU2FmZUFsaWdubWVudCwgZmllbGRfc2l6ZSkpOworICAgIG9mZnNldHNbaV0gPSBzaXplOworICAgIHNpemUgKz0gZmllbGRfc2l6ZTsKKyAgfQorCisgIC8vIEFkZCB0aGUgVW5rbm93bkZpZWxkU2V0IHRvIHRoZSBlbmQuCisgIHNpemUgPSBBbGlnbk9mZnNldChzaXplKTsKKyAgdHlwZV9pbmZvLT51bmtub3duX2ZpZWxkc19vZmZzZXQgPSBzaXplOworICBzaXplICs9IHNpemVvZihVbmtub3duRmllbGRTZXQpOworCisgIC8vIEFsaWduIHRoZSBmaW5hbCBzaXplIHRvIG1ha2Ugc3VyZSBubyBjbGV2ZXIgYWxsb2NhdG9ycyB0aGluayB0aGF0CisgIC8vIGFsaWdubWVudCBpcyBub3QgbmVjZXNzYXJ5LgorICBzaXplID0gQWxpZ25PZmZzZXQoc2l6ZSk7CisgIHR5cGVfaW5mby0+c2l6ZSA9IHNpemU7CisKKyAgLy8gQWxsb2NhdGUgdGhlIHByb3RvdHlwZS4KKyAgdm9pZCogYmFzZSA9IG9wZXJhdG9yIG5ldyhzaXplKTsKKyAgbWVtc2V0KGJhc2UsIDAsIHNpemUpOworICBEeW5hbWljTWVzc2FnZSogcHJvdG90eXBlID0gbmV3KGJhc2UpIER5bmFtaWNNZXNzYWdlKHR5cGVfaW5mbyk7CisgIHR5cGVfaW5mby0+cHJvdG90eXBlLnJlc2V0KHByb3RvdHlwZSk7CisKKyAgLy8gQ29uc3RydWN0IHRoZSByZWZsZWN0aW9uIG9iamVjdC4KKyAgdHlwZV9pbmZvLT5yZWZsZWN0aW9uLnJlc2V0KAorICAgIG5ldyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIHR5cGVfaW5mby0+dHlwZSwKKyAgICAgIHR5cGVfaW5mby0+cHJvdG90eXBlLmdldCgpLAorICAgICAgdHlwZV9pbmZvLT5vZmZzZXRzLmdldCgpLAorICAgICAgdHlwZV9pbmZvLT5oYXNfYml0c19vZmZzZXQsCisgICAgICB0eXBlX2luZm8tPnVua25vd25fZmllbGRzX29mZnNldCwKKyAgICAgIHR5cGVfaW5mby0+ZXh0ZW5zaW9uc19vZmZzZXQsCisgICAgICB0eXBlX2luZm8tPnBvb2wsCisgICAgICB0aGlzLAorICAgICAgdHlwZV9pbmZvLT5zaXplKSk7CisKKyAgLy8gQ3Jvc3MgbGluayBwcm90b3R5cGVzLgorICBwcm90b3R5cGUtPkNyb3NzTGlua1Byb3RvdHlwZXMoKTsKKworICByZXR1cm4gcHJvdG90eXBlOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkZDJjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oCkBAIC0wLDAgKzEsMTM2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBEZWZpbmVzIGFuIGltcGxlbWVudGF0aW9uIG9mIE1lc3NhZ2Ugd2hpY2ggY2FuIGVtdWxhdGUgdHlwZXMgd2hpY2ggYXJlIG5vdAorLy8ga25vd24gYXQgY29tcGlsZS10aW1lLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9EWU5BTUlDX01FU1NBR0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9EWU5BTUlDX01FU1NBR0VfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBEZWZpbmVkIGluIG90aGVyIGZpbGVzLgorY2xhc3MgRGVzY3JpcHRvcjsgICAgICAgIC8vIGRlc2NyaXB0b3IuaAorY2xhc3MgRGVzY3JpcHRvclBvb2w7ICAgIC8vIGRlc2NyaXB0b3IuaAorCisvLyBDb25zdHJ1Y3RzIGltcGxlbWVudGF0aW9ucyBvZiBNZXNzYWdlIHdoaWNoIGNhbiBlbXVsYXRlIHR5cGVzIHdoaWNoIGFyZSBub3QKKy8vIGtub3duIGF0IGNvbXBpbGUtdGltZS4KKy8vCisvLyBTb21ldGltZXMgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBtYW5pcHVsYXRlIHByb3RvY29sIHR5cGVzIHRoYXQgeW91IGRvbid0CisvLyBrbm93IGFib3V0IGF0IGNvbXBpbGUgdGltZS4gIEl0IHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byBjb25zdHJ1Y3QKKy8vIGEgTWVzc2FnZSBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgbWVzc2FnZSB0eXBlIGdpdmVuIGJ5IGFueSBhcmJpdHJhcnkKKy8vIERlc2NyaXB0b3IuICBEeW5hbWljTWVzc2FnZSBwcm92aWRlcyB0aGlzLgorLy8KKy8vIEFzIGl0IHR1cm5zIG91dCwgYSBEeW5hbWljTWVzc2FnZSBuZWVkcyB0byBjb25zdHJ1Y3QgZXh0cmEKKy8vIGluZm9ybWF0aW9uIGFib3V0IGl0cyB0eXBlIGluIG9yZGVyIHRvIG9wZXJhdGUuICBNb3N0IG9mIHRoaXMgaW5mb3JtYXRpb24KKy8vIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBhbGwgRHluYW1pY01lc3NhZ2VzIG9mIHRoZSBzYW1lIHR5cGUuICBCdXQsIGNhY2hpbmcKKy8vIHRoaXMgaW5mb3JtYXRpb24gaW4gc29tZSBzb3J0IG9mIGdsb2JhbCBtYXAgd291bGQgYmUgYSBiYWQgaWRlYSwgc2luY2UKKy8vIHRoZSBjYWNoZWQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBkZXNjcmlwdG9yIGNvdWxkIG91dGxpdmUgdGhlCisvLyBkZXNjcmlwdG9yIGl0c2VsZi4gIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgRHluYW1pY01lc3NhZ2VGYWN0b3J5CisvLyBlbmNhcHN1bGF0ZXMgdGhpcyAiY2FjaGUiLiAgQWxsIER5bmFtaWNNZXNzYWdlcyBvZiB0aGUgc2FtZSB0eXBlIGNyZWF0ZWQKKy8vIGZyb20gdGhlIHNhbWUgZmFjdG9yeSB3aWxsIHNoYXJlIHRoZSBzYW1lIHN1cHBvcnQgZGF0YS4gIEFueSBEZXNjcmlwdG9ycworLy8gdXNlZCB3aXRoIGEgcGFydGljdWxhciBmYWN0b3J5IG11c3Qgb3V0bGl2ZSB0aGUgZmFjdG9yeS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBEeW5hbWljTWVzc2FnZUZhY3RvcnkgOiBwdWJsaWMgTWVzc2FnZUZhY3RvcnkgeworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0IGEgRHluYW1pY01lc3NhZ2VGYWN0b3J5IHRoYXQgd2lsbCBzZWFyY2ggZm9yIGV4dGVuc2lvbnMgaW4KKyAgLy8gdGhlIERlc2NyaXB0b3JQb29sIGluIHdoaWNoIHRoZSBleGVuZGVlIGlzIGRlZmluZWQuCisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSgpOworCisgIC8vIENvbnN0cnVjdCBhIER5bmFtaWNNZXNzYWdlRmFjdG9yeSB0aGF0IHdpbGwgc2VhcmNoIGZvciBleHRlbnNpb25zIGluCisgIC8vIHRoZSBnaXZlbiBEZXNjcmlwdG9yUG9vbC4KKyAgLy8KKyAgLy8gREVQUkVDQVRFRDogIFVzZSBDb2RlZElucHV0U3RyZWFtOjpTZXRFeHRlbnNpb25SZWdpc3RyeSgpIHRvIHRlbGwgdGhlCisgIC8vICAgcGFyc2VyIHRvIGxvb2sgZm9yIGV4dGVuc2lvbnMgaW4gYW4gYWx0ZXJuYXRlIHBvb2wuICBIb3dldmVyLCBub3RlIHRoYXQKKyAgLy8gICB0aGlzIGlzIGFsbW9zdCBuZXZlciB3aGF0IHlvdSB3YW50IHRvIGRvLiAgQWxtb3N0IGFsbCB1c2VycyBzaG91bGQgdXNlCisgIC8vICAgdGhlIHplcm8tYXJnIGNvbnN0cnVjdG9yLgorICBEeW5hbWljTWVzc2FnZUZhY3RvcnkoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpOworCisgIH5EeW5hbWljTWVzc2FnZUZhY3RvcnkoKTsKKworICAvLyBDYWxsIHRoaXMgdG8gdGVsbCB0aGUgRHluYW1pY01lc3NhZ2VGYWN0b3J5IHRoYXQgaWYgaXQgaXMgZ2l2ZW4gYQorICAvLyBEZXNjcmlwdG9yIGQgZm9yIHdoaWNoOgorICAvLyAgIGQtPmZpbGUoKS0+cG9vbCgpID09IERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAvLyB0aGVuIGl0IHNob3VsZCBkZWxlZ2F0ZSB0byBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSBpbnN0ZWFkCisgIC8vIG9mIGNvbnN0cnVjdGluZyBhIGR5bmFtaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UuICBJbiB0aGVvcnkgdGhlcmUKKyAgLy8gaXMgbm8gZG93biBzaWRlIHRvIGRvaW5nIHRoaXMsIHNvIGl0IG1heSBiZWNvbWUgdGhlIGRlZmF1bHQgaW4gdGhlIGZ1dHVyZS4KKyAgdm9pZCBTZXREZWxlZ2F0ZVRvR2VuZXJhdGVkRmFjdG9yeShib29sIGVuYWJsZSkgeworICAgIGRlbGVnYXRlX3RvX2dlbmVyYXRlZF9mYWN0b3J5XyA9IGVuYWJsZTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZUZhY3RvcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gR2l2ZW4gYSBEZXNjcmlwdG9yLCBjb25zdHJ1Y3RzIHRoZSBkZWZhdWx0IChwcm90b3R5cGUpIE1lc3NhZ2Ugb2YgdGhhdAorICAvLyB0eXBlLiAgWW91IGNhbiB0aGVuIGNhbGwgdGhhdCBtZXNzYWdlJ3MgTmV3KCkgbWV0aG9kIHRvIGNvbnN0cnVjdCBhCisgIC8vIG11dGFibGUgbWVzc2FnZSBvZiB0aGF0IHR5cGUuCisgIC8vCisgIC8vIENhbGxpbmcgdGhpcyBtZXRob2QgdHdpY2Ugd2l0aCB0aGUgc2FtZSBEZXNjcmlwdG9yIHJldHVybnMgdGhlIHNhbWUKKyAgLy8gb2JqZWN0LiAgVGhlIHJldHVybmVkIG9iamVjdCByZW1haW5zIHByb3BlcnR5IG9mIHRoZSBmYWN0b3J5IGFuZCB3aWxsCisgIC8vIGJlIGRlc3Ryb3llZCB3aGVuIHRoZSBmYWN0b3J5IGlzIGRlc3Ryb3llZC4gIEFsc28sIGFueSBvYmplY3RzIGNyZWF0ZWQKKyAgLy8gYnkgY2FsbGluZyB0aGUgcHJvdG90eXBlJ3MgTmV3KCkgbWV0aG9kIHNoYXJlIHNvbWUgZGF0YSB3aXRoIHRoZQorICAvLyBwcm90b3R5cGUsIHNvIHRoZXNlIG11c3QgYmUgZGVzdG95ZWQgYmVmb3JlIHRoZSBEeW5hbWljTWVzc2FnZUZhY3RvcnkKKyAgLy8gaXMgZGVzdHJveWVkLgorICAvLworICAvLyBUaGUgZ2l2ZW4gZGVzY3JpcHRvciBtdXN0IG91dGxpdmUgdGhlIHJldHVybmVkIG1lc3NhZ2UsIGFuZCBoZW5jZSBtdXN0CisgIC8vIG91dGxpdmUgdGhlIER5bmFtaWNNZXNzYWdlRmFjdG9yeS4KKyAgLy8KKyAgLy8gVGhlIG1ldGhvZCBpcyB0aHJlYWQtc2FmZS4KKyAgY29uc3QgTWVzc2FnZSogR2V0UHJvdG90eXBlKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpOworCisgcHJpdmF0ZToKKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2xfOworICBib29sIGRlbGVnYXRlX3RvX2dlbmVyYXRlZF9mYWN0b3J5XzsKKworICAvLyBUaGlzIHN0cnVjdCBqdXN0IGNvbnRhaW5zIGEgaGFzaF9tYXAuICBXZSBjYW4ndCAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4gZnJvbQorICAvLyB0aGlzIGhlYWRlciBkdWUgdG8gaGFja3MgbmVlZGVkIGZvciBoYXNoX21hcCBwb3J0YWJpbGl0eSBpbiB0aGUgb3BlbiBzb3VyY2UKKyAgLy8gcmVsZWFzZS4gIE5hbWVseSwgc3R1YnMvaGFzaC5oLCB3aGljaCBkZWZpbmVzIGhhc2hfbWFwIHBvcnRhYmx5LCBpcyBub3QgYQorICAvLyBwdWJsaWMgaGVhZGVyIChmb3IgZ29vZCByZWFzb24pLCBidXQgZHluYW1pY19tZXNzYWdlLmggaXMsIGFuZCBwdWJsaWMKKyAgLy8gaGVhZGVycyBtYXkgb25seSAjaW5jbHVkZSBvdGhlciBwdWJsaWMgaGVhZGVycy4KKyAgc3RydWN0IFByb3RvdHlwZU1hcDsKKyAgc2NvcGVkX3B0cjxQcm90b3R5cGVNYXA+IHByb3RvdHlwZXNfOworICBtdXRhYmxlIE11dGV4IHByb3RvdHlwZXNfbXV0ZXhfOworCisgIGZyaWVuZCBjbGFzcyBEeW5hbWljTWVzc2FnZTsKKyAgY29uc3QgTWVzc2FnZSogR2V0UHJvdG90eXBlTm9Mb2NrKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEeW5hbWljTWVzc2FnZUZhY3RvcnkpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0RZTkFNSUNfTUVTU0FHRV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWI4OWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTYyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBTaW5jZSB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UgZm9yIER5bmFtaWNNZXNzYWdlIGlzIGltcGxlbWVudGVkIGJ5CisvLyBHZW5lcmljTWVzc2FnZVJlZmxlY3Rpb24sIHRoZSBvbmx5IHRoaW5nIHdlIHJlYWxseSBoYXZlIHRvIHRlc3QgaXMKKy8vIHRoYXQgRHluYW1pY01lc3NhZ2UgY29ycmVjdGx5IHNldHMgdXAgdGhlIGluZm9ybWF0aW9uIHRoYXQKKy8vIEdlbmVyaWNNZXNzYWdlUmVmbGVjdGlvbiBuZWVkcyB0byB1c2UuICBTbywgd2UgZm9jdXMgb24gdGhhdCBpbiB0aGlzCisvLyB0ZXN0LiAgT3RoZXIgdGVzdHMsIHN1Y2ggYXMgZ2VuZXJpY19tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QgYW5kCisvLyByZWZsZWN0aW9uX29wc191bml0dGVzdCwgY292ZXIgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgdXNlZCBieQorLy8gRHluYW1pY01lc3NhZ2UuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBEeW5hbWljTWVzc2FnZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKKyAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3RvcnlfOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgY29uc3QgTWVzc2FnZSogcHJvdG90eXBlXzsKKyAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5zaW9uc19kZXNjcmlwdG9yXzsKKyAgY29uc3QgTWVzc2FnZSogZXh0ZW5zaW9uc19wcm90b3R5cGVfOworICBjb25zdCBEZXNjcmlwdG9yKiBwYWNrZWRfZGVzY3JpcHRvcl87CisgIGNvbnN0IE1lc3NhZ2UqIHBhY2tlZF9wcm90b3R5cGVfOworCisgIER5bmFtaWNNZXNzYWdlVGVzdCgpOiBmYWN0b3J5XygmcG9vbF8pIHt9CisKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgRHluYW1pY01lc3NhZ2Ugd29ya3MgKHBhcnRpY3VsYXJseSB3aXRoCisgICAgLy8gZXh0ZW5zaW9ucykgZXZlbiBpZiB3ZSB1c2UgZGVzY3JpcHRvcnMgdGhhdCBhcmUgKm5vdCogZnJvbSBjb21waWxlZC1pbgorICAgIC8vIHR5cGVzLCBzbyB3ZSBtYWtlIGNvcGllcyBvZiB0aGUgZGVzY3JpcHRvcnMgZm9yIHVuaXR0ZXN0LnByb3RvIGFuZAorICAgIC8vIHVuaXR0ZXN0X2ltcG9ydC5wcm90by4KKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIHVuaXR0ZXN0X2ZpbGU7CisgICAgRmlsZURlc2NyaXB0b3JQcm90byB1bml0dGVzdF9pbXBvcnRfZmlsZTsKKworICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJnVuaXR0ZXN0X2ZpbGUpOworICAgIHVuaXR0ZXN0X2ltcG9ydDo6SW1wb3J0TWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygKKyAgICAgICZ1bml0dGVzdF9pbXBvcnRfZmlsZSk7CisKKyAgICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUodW5pdHRlc3RfaW1wb3J0X2ZpbGUpICE9IE5VTEwpOworICAgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZSh1bml0dGVzdF9maWxlKSAhPSBOVUxMKTsKKworICAgIGRlc2NyaXB0b3JfID0gcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiKTsKKyAgICBBU1NFUlRfVFJVRShkZXNjcmlwdG9yXyAhPSBOVUxMKTsKKyAgICBwcm90b3R5cGVfID0gZmFjdG9yeV8uR2V0UHJvdG90eXBlKGRlc2NyaXB0b3JfKTsKKworICAgIGV4dGVuc2lvbnNfZGVzY3JpcHRvcl8gPQorICAgICAgcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucyIpOworICAgIEFTU0VSVF9UUlVFKGV4dGVuc2lvbnNfZGVzY3JpcHRvcl8gIT0gTlVMTCk7CisgICAgZXh0ZW5zaW9uc19wcm90b3R5cGVfID0gZmFjdG9yeV8uR2V0UHJvdG90eXBlKGV4dGVuc2lvbnNfZGVzY3JpcHRvcl8pOworCisgICAgcGFja2VkX2Rlc2NyaXB0b3JfID0KKyAgICAgIHBvb2xfLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdFBhY2tlZFR5cGVzIik7CisgICAgQVNTRVJUX1RSVUUocGFja2VkX2Rlc2NyaXB0b3JfICE9IE5VTEwpOworICAgIHBhY2tlZF9wcm90b3R5cGVfID0gZmFjdG9yeV8uR2V0UHJvdG90eXBlKHBhY2tlZF9kZXNjcmlwdG9yXyk7CisgIH0KK307CisKK1RFU1RfRihEeW5hbWljTWVzc2FnZVRlc3QsIERlc2NyaXB0b3IpIHsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgZGVzY3JpcHRvciBvbiB0aGUgRHluYW1pY01lc3NhZ2UgbWF0Y2hlcyB0aGUgZGVzY3JpcHRvcgorICAvLyBwYXNzZWQgdG8gR2V0UHJvdG90eXBlKCkuCisgIEVYUEVDVF9FUShwcm90b3R5cGVfLT5HZXREZXNjcmlwdG9yKCksIGRlc2NyaXB0b3JfKTsKK30KKworVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgT25lUHJvdG90eXBlKSB7CisgIC8vIENoZWNrIHRoYXQgcmVxdWVzdGluZyB0aGUgc2FtZSBwcm90b3R5cGUgdHdpY2UgcHJvZHVjZXMgdGhlIHNhbWUgb2JqZWN0LgorICBFWFBFQ1RfRVEocHJvdG90eXBlXywgZmFjdG9yeV8uR2V0UHJvdG90eXBlKGRlc2NyaXB0b3JfKSk7Cit9CisKK1RFU1RfRihEeW5hbWljTWVzc2FnZVRlc3QsIERlZmF1bHRzKSB7CisgIC8vIENoZWNrIHRoYXQgYWxsIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBpbml0aWFsIG1lc3NhZ2UuCisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGRlc2NyaXB0b3JfKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0Q2xlYXJWaWFSZWZsZWN0aW9uKCpwcm90b3R5cGVfKTsKK30KKworVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgSW5kZXBlbmRlbnRPZmZzZXRzKSB7CisgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBoYXZlIGluZGVwZW5kZW50IG9mZnNldHMgYnkgc2V0dGluZyBlYWNoCisgIC8vIG9uZSB0byBhIHVuaXF1ZSB2YWx1ZSB0aGVuIGNoZWNraW5nIHRoYXQgdGhleSBhbGwgc3RpbGwgaGF2ZSB0aG9zZQorICAvLyB1bmlxdWUgdmFsdWVzIChpLmUuIHRoZXkgZG9uJ3Qgc3RvbXAgZWFjaCBvdGhlcikuCisgIHNjb3BlZF9wdHI8TWVzc2FnZT4gbWVzc2FnZShwcm90b3R5cGVfLT5OZXcoKSk7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGRlc2NyaXB0b3JfKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UuZ2V0KCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKCptZXNzYWdlKTsKK30KKworVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgRXh0ZW5zaW9ucykgeworICAvLyBDaGVjayB0aGF0IGV4dGVuc2lvbnMgd29yay4KKyAgc2NvcGVkX3B0cjxNZXNzYWdlPiBtZXNzYWdlKGV4dGVuc2lvbnNfcHJvdG90eXBlXy0+TmV3KCkpOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihleHRlbnNpb25zX2Rlc2NyaXB0b3JfKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UuZ2V0KCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKCptZXNzYWdlKTsKK30KKworVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgUGFja2VkRmllbGRzKSB7CisgIC8vIENoZWNrIHRoYXQgcGFja2VkIGZpZWxkcyB3b3JrIHByb3Blcmx5LgorICBzY29wZWRfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UocGFja2VkX3Byb3RvdHlwZV8tPk5ldygpKTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIocGFja2VkX2Rlc2NyaXB0b3JfKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRQYWNrZWRGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UuZ2V0KCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RQYWNrZWRGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKCptZXNzYWdlKTsKK30KKworVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgU3BhY2VVc2VkKSB7CisgIC8vIFRlc3QgdGhhdCBTcGFjZVVzZWQoKSB3b3JrcyBwcm9wZXJseQorCisgIC8vIFNpbmNlIHdlIHNoYXJlIHRoZSBpbXBsZW1lbnRhdGlvbiB3aXRoIGdlbmVyYXRlZCBtZXNzYWdlcywgd2UgZG9uJ3QgbmVlZAorICAvLyB0byB0ZXN0IHZlcnkgbXVjaCBoZXJlLiAgSnVzdCBtYWtlIHN1cmUgaXQgYXBwZWFycyB0byBiZSB3b3JraW5nLgorCisgIHNjb3BlZF9wdHI8TWVzc2FnZT4gbWVzc2FnZShwcm90b3R5cGVfLT5OZXcoKSk7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGRlc2NyaXB0b3JfKTsKKworICBpbnQgaW5pdGlhbF9zcGFjZV91c2VkID0gbWVzc2FnZS0+U3BhY2VVc2VkKCk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihtZXNzYWdlLmdldCgpKTsKKyAgRVhQRUNUX0xUKGluaXRpYWxfc3BhY2VfdXNlZCwgbWVzc2FnZS0+U3BhY2VVc2VkKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjA5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmNjCkBAIC0wLDAgKzEsMTQ2NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK25hbWVzcGFjZSB7CisKK2lubGluZSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIHJlYWxfdHlwZShGaWVsZFR5cGUgdHlwZSkgeworICBHT09HTEVfRENIRUNLKHR5cGUgPiAwICYmIHR5cGUgPD0gV2lyZUZvcm1hdExpdGU6Ok1BWF9GSUVMRF9UWVBFKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGU+KHR5cGUpOworfQorCitpbmxpbmUgV2lyZUZvcm1hdExpdGU6OkNwcFR5cGUgY3BwX3R5cGUoRmllbGRUeXBlIHR5cGUpIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGVUb0NwcFR5cGUocmVhbF90eXBlKHR5cGUpKTsKK30KKworLy8gUmVnaXN0cnkgc3R1ZmYuCit0eXBlZGVmIGhhc2hfbWFwPHBhaXI8Y29uc3QgTWVzc2FnZUxpdGUqLCBpbnQ+LAorICAgICAgICAgICAgICAgICBFeHRlbnNpb25JbmZvPiBFeHRlbnNpb25SZWdpc3RyeTsKK0V4dGVuc2lvblJlZ2lzdHJ5KiByZWdpc3RyeV8gPSBOVUxMOworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShyZWdpc3RyeV9pbml0Xyk7CisKK3ZvaWQgRGVsZXRlUmVnaXN0cnkoKSB7CisgIGRlbGV0ZSByZWdpc3RyeV87CisgIHJlZ2lzdHJ5XyA9IE5VTEw7Cit9CisKK3ZvaWQgSW5pdFJlZ2lzdHJ5KCkgeworICByZWdpc3RyeV8gPSBuZXcgRXh0ZW5zaW9uUmVnaXN0cnk7CisgIGludGVybmFsOjpPblNodXRkb3duKCZEZWxldGVSZWdpc3RyeSk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYXQgc3RhcnR1cCwgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhyZWFkLQorLy8gc2FmZXR5Lgordm9pZCBSZWdpc3Rlcihjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICBpbnQgbnVtYmVyLCBFeHRlbnNpb25JbmZvIGluZm8pIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgmcmVnaXN0cnlfaW5pdF8sICZJbml0UmVnaXN0cnkpOworCisgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KHJlZ2lzdHJ5XywgbWFrZV9wYWlyKGNvbnRhaW5pbmdfdHlwZSwgbnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbykpIHsKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTXVsdGlwbGUgZXh0ZW5zaW9uIHJlZ2lzdHJhdGlvbnMgZm9yIHR5cGUgXCIiCisgICAgICAgICAgICAgICA8PCBjb250YWluaW5nX3R5cGUtPkdldFR5cGVOYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgZmllbGQgbnVtYmVyICIgPDwgbnVtYmVyIDw8ICIuIjsKKyAgfQorfQorCitjb25zdCBFeHRlbnNpb25JbmZvKiBGaW5kUmVnaXN0ZXJlZEV4dGVuc2lvbigKKyAgICBjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLCBpbnQgbnVtYmVyKSB7CisgIHJldHVybiAocmVnaXN0cnlfID09IE5VTEwpID8gTlVMTCA6CisgICAgICAgICBGaW5kT3JOdWxsKCpyZWdpc3RyeV8sIG1ha2VfcGFpcihjb250YWluaW5nX3R5cGUsIG51bWJlcikpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworRXh0ZW5zaW9uRmluZGVyOjp+RXh0ZW5zaW9uRmluZGVyKCkge30KKworYm9vbCBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXI6OkZpbmQoaW50IG51bWJlciwgRXh0ZW5zaW9uSW5mbyogb3V0cHV0KSB7CisgIGNvbnN0IEV4dGVuc2lvbkluZm8qIGV4dGVuc2lvbiA9CisgICAgICBGaW5kUmVnaXN0ZXJlZEV4dGVuc2lvbihjb250YWluaW5nX3R5cGVfLCBudW1iZXIpOworICBpZiAoZXh0ZW5zaW9uID09IE5VTEwpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgKm91dHB1dCA9ICpleHRlbnNpb247CisgICAgcmV0dXJuIHRydWU7CisgIH0KK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OlJlZ2lzdGVyRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXBlYXRlZCwgYm9vbCBpc19wYWNrZWQpIHsKKyAgR09PR0xFX0NIRUNLX05FKHR5cGUsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0pOworICBHT09HTEVfQ0hFQ0tfTkUodHlwZSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSk7CisgIEdPT0dMRV9DSEVDS19ORSh0eXBlLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUCk7CisgIEV4dGVuc2lvbkluZm8gaW5mbyh0eXBlLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKTsKKyAgUmVnaXN0ZXIoY29udGFpbmluZ190eXBlLCBudW1iZXIsIGluZm8pOworfQorCitzdGF0aWMgYm9vbCBDYWxsTm9BcmdWYWxpZGl0eUZ1bmMoY29uc3Qgdm9pZCogYXJnLCBpbnQgbnVtYmVyKSB7CisgIC8vIE5vdGU6ICBNdXN0IHVzZSBDLXN0eWxlIGNhc3QgaGVyZSByYXRoZXIgdGhhbiByZWludGVycHJldF9jYXN0IGJlY2F1c2UKKyAgLy8gICB0aGUgQysrIHN0YW5kYXJkIGF0IG9uZSBwb2ludCBkaWQgbm90IGFsbG93IGNhc3RzIGJldHdlZW4gZnVuY3Rpb24gYW5kCisgIC8vICAgZGF0YSBwb2ludGVycyBhbmQgc29tZSBjb21waWxlcnMgZW5mb3JjZSB0aGlzIGZvciBDKystc3R5bGUgY2FzdHMuICBObworICAvLyAgIGNvbXBpbGVyIGVuZm9yY2VzIGl0IGZvciBDLXN0eWxlIGNhc3RzIHNpbmNlIGxvdHMgb2YgQy1zdHlsZSBjb2RlIGhhcworICAvLyAgIHJlbGllZCBvbiB0aGVzZSBraW5kcyBvZiBjYXN0cyBmb3IgYSBsb25nIHRpbWUsIGRlc3BpdGUgYmVpbmcKKyAgLy8gICB0ZWNobmljYWxseSB1bmRlZmluZWQuICBTZWU6CisgIC8vICAgICBodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTk1CisgIC8vIEFsc28gbm90ZTogIFNvbWUgY29tcGlsZXJzIGRvIG5vdCBhbGxvdyBmdW5jdGlvbiBwb2ludGVycyB0byBiZSAiY29uc3QiLgorICAvLyAgIFdoaWNoIG1ha2VzIHNlbnNlLCBJIHN1cHBvc2UsIGJlY2F1c2UgaXQncyBtZWFuaW5nbGVzcy4KKyAgcmV0dXJuICgoRW51bVZhbGlkaXR5RnVuYyopYXJnKShudW1iZXIpOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6UmVnaXN0ZXJFbnVtRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcGVhdGVkLCBib29sIGlzX3BhY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVZhbGlkaXR5RnVuYyogaXNfdmFsaWQpIHsKKyAgR09PR0xFX0NIRUNLX0VRKHR5cGUsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0pOworICBFeHRlbnNpb25JbmZvIGluZm8odHlwZSwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk7CisgIGluZm8uZW51bV92YWxpZGl0eV9jaGVjay5mdW5jID0gQ2FsbE5vQXJnVmFsaWRpdHlGdW5jOworICAvLyBTZWUgY29tbWVudCBpbiBDYWxsTm9BcmdWYWxpZGl0eUZ1bmMoKSBhYm91dCB3aHkgd2UgdXNlIGEgYy1zdHlsZSBjYXN0LgorICBpbmZvLmVudW1fdmFsaWRpdHlfY2hlY2suYXJnID0gKHZvaWQqKWlzX3ZhbGlkOworICBSZWdpc3Rlcihjb250YWluaW5nX3R5cGUsIG51bWJlciwgaW5mbyk7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpSZWdpc3Rlck1lc3NhZ2VFeHRlbnNpb24oY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVwZWF0ZWQsIGJvb2wgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogcHJvdG90eXBlKSB7CisgIEdPT0dMRV9DSEVDSyh0eXBlID09IFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UgfHwKKyAgICAgICAgdHlwZSA9PSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUCk7CisgIEV4dGVuc2lvbkluZm8gaW5mbyh0eXBlLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKTsKKyAgaW5mby5tZXNzYWdlX3Byb3RvdHlwZSA9IHByb3RvdHlwZTsKKyAgUmVnaXN0ZXIoY29udGFpbmluZ190eXBlLCBudW1iZXIsIGluZm8pOworfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvbnN0cnVjdG9ycyBhbmQgYmFzaWMgbWV0aG9kcy4KKworRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb25TZXQoKSB7fQorCitFeHRlbnNpb25TZXQ6On5FeHRlbnNpb25TZXQoKSB7CisgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgaXRlci0+c2Vjb25kLkZyZWUoKTsKKyAgfQorfQorCisvLyBEZWZpbmVkIGluIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MuCisvLyB2b2lkIEV4dGVuc2lvblNldDo6QXBwZW5kVG9MaXN0KGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0cHV0KSBjb25zdAorCitib29sIEV4dGVuc2lvblNldDo6SGFzKGludCBudW1iZXIpIGNvbnN0IHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgaWYgKGl0ZXIgPT0gZXh0ZW5zaW9uc18uZW5kKCkpIHJldHVybiBmYWxzZTsKKyAgR09PR0xFX0RDSEVDSyghaXRlci0+c2Vjb25kLmlzX3JlcGVhdGVkKTsKKyAgcmV0dXJuICFpdGVyLT5zZWNvbmQuaXNfY2xlYXJlZDsKK30KKworaW50IEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uU2l6ZShpbnQgbnVtYmVyKSBjb25zdCB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIGlmIChpdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiBpdGVyLT5zZWNvbmQuR2V0U2l6ZSgpOworfQorCitGaWVsZFR5cGUgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb25UeXBlKGludCBudW1iZXIpIGNvbnN0IHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgaWYgKGl0ZXIgPT0gZXh0ZW5zaW9uc18uZW5kKCkpIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkRvbid0IGxvb2t1cCBleHRlbnNpb24gdHlwZXMgaWYgdGhleSBhcmVuJ3QgcHJlc2VudCAoMSkuICI7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGl0ZXItPnNlY29uZC5pc19jbGVhcmVkKSB7CisgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJEb24ndCBsb29rdXAgZXh0ZW5zaW9uIHR5cGVzIGlmIHRoZXkgYXJlbid0IHByZXNlbnQgKDIpLiAiOworICB9CisgIHJldHVybiBpdGVyLT5zZWNvbmQudHlwZTsKK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OkNsZWFyRXh0ZW5zaW9uKGludCBudW1iZXIpIHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgaWYgKGl0ZXIgPT0gZXh0ZW5zaW9uc18uZW5kKCkpIHJldHVybjsKKyAgaXRlci0+c2Vjb25kLkNsZWFyKCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZpZWxkIGFjY2Vzc29ycworCituYW1lc3BhY2UgeworCitlbnVtIENhcmRpbmFsaXR5IHsKKyAgUkVQRUFURUQsCisgIE9QVElPTkFMCit9OworCit9ICAvLyBuYW1lc3BhY2UKKworI2RlZmluZSBHT09HTEVfRENIRUNLX1RZUEUoRVhURU5TSU9OLCBMQUJFTCwgQ1BQVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR09PR0xFX0RDSEVDS19FUSgoRVhURU5TSU9OKS5pc19yZXBlYXRlZCA/IFJFUEVBVEVEIDogT1BUSU9OQUwsIExBQkVMKTsgICAgICAgICBcCisgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoKEVYVEVOU0lPTikudHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFXyMjQ1BQVFlQRSkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJpbWl0aXZlcworCisjZGVmaW5lIFBSSU1JVElWRV9BQ0NFU1NPUlMoVVBQRVJDQVNFLCBMT1dFUkNBU0UsIENBTUVMQ0FTRSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0xPV0VSQ0FTRSBFeHRlbnNpb25TZXQ6OkdldCMjQ0FNRUxDQVNFKGludCBudW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT1dFUkNBU0UgZGVmYXVsdF92YWx1ZSkgY29uc3QgeyAgICAgICAgXAorICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOyAgICAgICAgIFwKKyAgaWYgKGl0ZXIgPT0gZXh0ZW5zaW9uc18uZW5kKCkgfHwgaXRlci0+c2Vjb25kLmlzX2NsZWFyZWQpIHsgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBPUFRJT05BTCwgVVBQRVJDQVNFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBpdGVyLT5zZWNvbmQuTE9XRVJDQVNFIyNfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpTZXQjI0NBTUVMQ0FTRShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9XRVJDQVNFIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeyAgICAgICAgIFwKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFXyMjVVBQRVJDQVNFKTsgXAorICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIE9QVElPTkFMLCBVUFBFUkNBU0UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBleHRlbnNpb24tPkxPV0VSQ0FTRSMjX3ZhbHVlID0gdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorTE9XRVJDQVNFIEV4dGVuc2lvblNldDo6R2V0UmVwZWF0ZWQjI0NBTUVMQ0FTRShpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0IHsgIFwKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsgICAgICAgICBcCisgIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7IFwKKyAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgUkVQRUFURUQsIFVQUEVSQ0FTRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gaXRlci0+c2Vjb25kLnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkdldChpbmRleCk7ICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBFeHRlbnNpb25TZXQ6OlNldFJlcGVhdGVkIyNDQU1FTENBU0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIExPV0VSQ0FTRSB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7ICAgICAgICAgICAgICAgXAorICBHT09HTEVfQ0hFQ0soaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSkgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOyBcCisgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIFJFUEVBVEVELCBVUFBFUkNBU0UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaXRlci0+c2Vjb25kLnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPlNldChpbmRleCwgdmFsdWUpOyAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpBZGQjI0NBTUVMQ0FTRShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwYWNrZWQsIExPV0VSQ0FTRSB2YWx1ZSwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeyAgICAgICAgIFwKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFXyMjVVBQRVJDQVNFKTsgXAorICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IHBhY2tlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlID0gbmV3IFJlcGVhdGVkRmllbGQ8TE9XRVJDQVNFPigpOyAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIFVQUEVSQ0FTRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT5pc19wYWNrZWQsIHBhY2tlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBleHRlbnNpb24tPnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkFkZCh2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworUFJJTUlUSVZFX0FDQ0VTU09SUyggSU5UMzIsICBpbnQzMiwgIEludDMyKQorUFJJTUlUSVZFX0FDQ0VTU09SUyggSU5UNjQsICBpbnQ2NCwgIEludDY0KQorUFJJTUlUSVZFX0FDQ0VTU09SUyhVSU5UMzIsIHVpbnQzMiwgVUludDMyKQorUFJJTUlUSVZFX0FDQ0VTU09SUyhVSU5UNjQsIHVpbnQ2NCwgVUludDY0KQorUFJJTUlUSVZFX0FDQ0VTU09SUyggRkxPQVQsICBmbG9hdCwgIEZsb2F0KQorUFJJTUlUSVZFX0FDQ0VTU09SUyhET1VCTEUsIGRvdWJsZSwgRG91YmxlKQorUFJJTUlUSVZFX0FDQ0VTU09SUyggIEJPT0wsICAgYm9vbCwgICBCb29sKQorCisjdW5kZWYgUFJJTUlUSVZFX0FDQ0VTU09SUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnVtcworCitpbnQgRXh0ZW5zaW9uU2V0OjpHZXRFbnVtKGludCBudW1iZXIsIGludCBkZWZhdWx0X3ZhbHVlKSBjb25zdCB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIGlmIChpdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpIHx8IGl0ZXItPnNlY29uZC5pc19jbGVhcmVkKSB7CisgICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgT1BUSU9OQUwsIEVOVU0pOworICAgIHJldHVybiBpdGVyLT5zZWNvbmQuZW51bV92YWx1ZTsKKyAgfQorfQorCit2b2lkIEV4dGVuc2lvblNldDo6U2V0RW51bShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgaW50IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgeworICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7CisgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9FTlVNKTsKKyAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIE9QVElPTkFMLCBFTlVNKTsKKyAgfQorICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKKyAgZXh0ZW5zaW9uLT5lbnVtX3ZhbHVlID0gdmFsdWU7Cit9CisKK2ludCBFeHRlbnNpb25TZXQ6OkdldFJlcGVhdGVkRW51bShpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKyAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgUkVQRUFURUQsIEVOVU0pOworICByZXR1cm4gaXRlci0+c2Vjb25kLnJlcGVhdGVkX2VudW1fdmFsdWUtPkdldChpbmRleCk7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpTZXRSZXBlYXRlZEVudW0oaW50IG51bWJlciwgaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKyAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgUkVQRUFURUQsIEVOVU0pOworICBpdGVyLT5zZWNvbmQucmVwZWF0ZWRfZW51bV92YWx1ZS0+U2V0KGluZGV4LCB2YWx1ZSk7Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpBZGRFbnVtKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwYWNrZWQsIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKKyAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsKKyAgICBleHRlbnNpb24tPnR5cGUgPSB0eXBlOworICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRU5VTSk7CisgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IHRydWU7CisgICAgZXh0ZW5zaW9uLT5pc19wYWNrZWQgPSBwYWNrZWQ7CisgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9lbnVtX3ZhbHVlID0gbmV3IFJlcGVhdGVkRmllbGQ8aW50PigpOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBSRVBFQVRFRCwgRU5VTSk7CisgICAgR09PR0xFX0RDSEVDS19FUShleHRlbnNpb24tPmlzX3BhY2tlZCwgcGFja2VkKTsKKyAgfQorICBleHRlbnNpb24tPnJlcGVhdGVkX2VudW1fdmFsdWUtPkFkZCh2YWx1ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0cmluZ3MKKworY29uc3Qgc3RyaW5nJiBFeHRlbnNpb25TZXQ6OkdldFN0cmluZyhpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRlZmF1bHRfdmFsdWUpIGNvbnN0IHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgaWYgKGl0ZXIgPT0gZXh0ZW5zaW9uc18uZW5kKCkgfHwgaXRlci0+c2Vjb25kLmlzX2NsZWFyZWQpIHsKKyAgICAvLyBOb3QgcHJlc2VudC4gIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBPUFRJT05BTCwgU1RSSU5HKTsKKyAgICByZXR1cm4gKml0ZXItPnNlY29uZC5zdHJpbmdfdmFsdWU7CisgIH0KK30KKworc3RyaW5nKiBFeHRlbnNpb25TZXQ6Ok11dGFibGVTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1NUUklORyk7CisgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IGZhbHNlOworICAgIGV4dGVuc2lvbi0+c3RyaW5nX3ZhbHVlID0gbmV3IHN0cmluZzsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIFNUUklORyk7CisgIH0KKyAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7CisgIHJldHVybiBleHRlbnNpb24tPnN0cmluZ192YWx1ZTsKK30KKworY29uc3Qgc3RyaW5nJiBFeHRlbnNpb25TZXQ6OkdldFJlcGVhdGVkU3RyaW5nKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3QgeworICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSkgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOworICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBSRVBFQVRFRCwgU1RSSU5HKTsKKyAgcmV0dXJuIGl0ZXItPnNlY29uZC5yZXBlYXRlZF9zdHJpbmdfdmFsdWUtPkdldChpbmRleCk7Cit9CisKK3N0cmluZyogRXh0ZW5zaW9uU2V0OjpNdXRhYmxlUmVwZWF0ZWRTdHJpbmcoaW50IG51bWJlciwgaW50IGluZGV4KSB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7CisgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIFJFUEVBVEVELCBTVFJJTkcpOworICByZXR1cm4gaXRlci0+c2Vjb25kLnJlcGVhdGVkX3N0cmluZ192YWx1ZS0+TXV0YWJsZShpbmRleCk7Cit9CisKK3N0cmluZyogRXh0ZW5zaW9uU2V0OjpBZGRTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKKyAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsKKyAgICBleHRlbnNpb24tPnR5cGUgPSB0eXBlOworICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfU1RSSU5HKTsKKyAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKKyAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IGZhbHNlOworICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlID0gbmV3IFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPigpOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBSRVBFQVRFRCwgU1RSSU5HKTsKKyAgfQorICByZXR1cm4gZXh0ZW5zaW9uLT5yZXBlYXRlZF9zdHJpbmdfdmFsdWUtPkFkZCgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXNzYWdlcworCitjb25zdCBNZXNzYWdlTGl0ZSYgRXh0ZW5zaW9uU2V0OjpHZXRNZXNzYWdlKAorICAgIGludCBudW1iZXIsIGNvbnN0IE1lc3NhZ2VMaXRlJiBkZWZhdWx0X3ZhbHVlKSBjb25zdCB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIGlmIChpdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpKSB7CisgICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgT1BUSU9OQUwsIE1FU1NBR0UpOworICAgIHJldHVybiAqaXRlci0+c2Vjb25kLm1lc3NhZ2VfdmFsdWU7CisgIH0KK30KKworLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorLy8gY29uc3QgTWVzc2FnZUxpdGUmIEV4dGVuc2lvblNldDo6R2V0TWVzc2FnZShpbnQgbnVtYmVyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSBjb25zdAorCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpNdXRhYmxlTWVzc2FnZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0UpOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKKyAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBwcm90b3R5cGUuTmV3KCk7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIE9QVElPTkFMLCBNRVNTQUdFKTsKKyAgfQorICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKKyAgcmV0dXJuIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKK30KKworLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorLy8gTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6TXV0YWJsZU1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkKKworY29uc3QgTWVzc2FnZUxpdGUmIEV4dGVuc2lvblNldDo6R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgIGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3QgeworICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSkgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOworICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBSRVBFQVRFRCwgTUVTU0FHRSk7CisgIHJldHVybiBpdGVyLT5zZWNvbmQucmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+R2V0KGluZGV4KTsKK30KKworTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKyAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgUkVQRUFURUQsIE1FU1NBR0UpOworICByZXR1cm4gaXRlci0+c2Vjb25kLnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPk11dGFibGUoaW5kZXgpOworfQorCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpBZGRNZXNzYWdlKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0UpOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSB0cnVlOworICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZSA9CisgICAgICBuZXcgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4oKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIE1FU1NBR0UpOworICB9CisKKyAgLy8gUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4gZG9lcyBub3Qga25vdyBob3cgdG8gQWRkKCkgc2luY2UgaXQgY2Fubm90CisgIC8vIGFsbG9jYXRlIGFuIGFic3RyYWN0IG9iamVjdCwgc28gd2UgaGF2ZSB0byBiZSB0cmlja3kuCisgIE1lc3NhZ2VMaXRlKiByZXN1bHQgPSBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUKKyAgICAgIC0+QWRkRnJvbUNsZWFyZWQ8aW50ZXJuYWw6OkdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT4gPigpOworICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICByZXN1bHQgPSBwcm90b3R5cGUuTmV3KCk7CisgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5BZGRBbGxvY2F0ZWQocmVzdWx0KTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBEZWZpbmVkIGluIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MuCisvLyBNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpBZGRNZXNzYWdlKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KQorCisjdW5kZWYgR09PR0xFX0RDSEVDS19UWVBFCisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpSZW1vdmVMYXN0KGludCBudW1iZXIpIHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKworICBFeHRlbnNpb24qIGV4dGVuc2lvbiA9ICZpdGVyLT5zZWNvbmQ7CisgIEdPT0dMRV9EQ0hFQ0soZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCk7CisKKyAgc3dpdGNoKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSkpIHsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0lOVDMyOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9pbnQzMl92YWx1ZS0+UmVtb3ZlTGFzdCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfaW50NjRfdmFsdWUtPlJlbW92ZUxhc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF91aW50MzJfdmFsdWUtPlJlbW92ZUxhc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF91aW50NjRfdmFsdWUtPlJlbW92ZUxhc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRkxPQVQ6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2Zsb2F0X3ZhbHVlLT5SZW1vdmVMYXN0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZG91YmxlX3ZhbHVlLT5SZW1vdmVMYXN0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0JPT0w6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2Jvb2xfdmFsdWUtPlJlbW92ZUxhc3QoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRU5VTToKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZS0+UmVtb3ZlTGFzdCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX3N0cmluZ192YWx1ZS0+UmVtb3ZlTGFzdCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5SZW1vdmVMYXN0KCk7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIEV4dGVuc2lvblNldDo6U3dhcEVsZW1lbnRzKGludCBudW1iZXIsIGludCBpbmRleDEsIGludCBpbmRleDIpIHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKKworICBFeHRlbnNpb24qIGV4dGVuc2lvbiA9ICZpdGVyLT5zZWNvbmQ7CisgIEdPT0dMRV9EQ0hFQ0soZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCk7CisKKyAgc3dpdGNoKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSkpIHsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0lOVDMyOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9pbnQzMl92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfSU5UNjQ6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2ludDY0X3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX3VpbnQzMl92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfVUlOVDY0OgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF91aW50NjRfdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9mbG9hdF92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9kb3VibGVfdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0JPT0w6CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2Jvb2xfdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0VOVU06CisgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2VudW1fdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1NUUklORzoKKyAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2b2lkIEV4dGVuc2lvblNldDo6Q2xlYXIoKSB7CisgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgaXRlci0+c2Vjb25kLkNsZWFyKCk7CisgIH0KK30KKwordm9pZCBFeHRlbnNpb25TZXQ6Ok1lcmdlRnJvbShjb25zdCBFeHRlbnNpb25TZXQmIG90aGVyKSB7CisgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IG90aGVyLmV4dGVuc2lvbnNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBvdGhlci5leHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgY29uc3QgRXh0ZW5zaW9uJiBvdGhlcl9leHRlbnNpb24gPSBpdGVyLT5zZWNvbmQ7CisKKyAgICBpZiAob3RoZXJfZXh0ZW5zaW9uLmlzX3JlcGVhdGVkKSB7CisgICAgICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKKyAgICAgIGJvb2wgaXNfbmV3ID0gTWF5YmVOZXdFeHRlbnNpb24oaXRlci0+Zmlyc3QsIG90aGVyX2V4dGVuc2lvbi5kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uKTsKKyAgICAgIGlmIChpc19uZXcpIHsKKyAgICAgICAgLy8gRXh0ZW5zaW9uIGRpZCBub3QgYWxyZWFkeSBleGlzdCBpbiBzZXQuCisgICAgICAgIGV4dGVuc2lvbi0+dHlwZSA9IG90aGVyX2V4dGVuc2lvbi50eXBlOworICAgICAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT50eXBlLCBvdGhlcl9leHRlbnNpb24udHlwZSk7CisgICAgICAgIEdPT0dMRV9EQ0hFQ0soZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCk7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoY3BwX3R5cGUob3RoZXJfZXh0ZW5zaW9uLnR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFLCBSRVBFQVRFRF9UWVBFKSAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaWYgKGlzX25ldykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUgPSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIG5ldyBSRVBFQVRFRF9UWVBFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5NZXJnZUZyb20oICAgICAgICBcCisgICAgICAgICAgICAqb3RoZXJfZXh0ZW5zaW9uLnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUpOyAgICAgICAgICBcCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgSEFORExFX1RZUEUoICBJTlQzMiwgICBpbnQzMiwgUmVwZWF0ZWRGaWVsZCAgIDwgIGludDMyPik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgSU5UNjQsICAgaW50NjQsIFJlcGVhdGVkRmllbGQgICA8ICBpbnQ2ND4pOworICAgICAgICBIQU5ETEVfVFlQRSggVUlOVDMyLCAgdWludDMyLCBSZXBlYXRlZEZpZWxkICAgPCB1aW50MzI+KTsKKyAgICAgICAgSEFORExFX1RZUEUoIFVJTlQ2NCwgIHVpbnQ2NCwgUmVwZWF0ZWRGaWVsZCAgIDwgdWludDY0Pik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgRkxPQVQsICAgZmxvYXQsIFJlcGVhdGVkRmllbGQgICA8ICBmbG9hdD4pOworICAgICAgICBIQU5ETEVfVFlQRSggRE9VQkxFLCAgZG91YmxlLCBSZXBlYXRlZEZpZWxkICAgPCBkb3VibGU+KTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgQk9PTCwgICAgYm9vbCwgUmVwZWF0ZWRGaWVsZCAgIDwgICBib29sPik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgIEVOVU0sICAgIGVudW0sIFJlcGVhdGVkRmllbGQgICA8ICAgIGludD4pOworICAgICAgICBIQU5ETEVfVFlQRSggU1RSSU5HLCAgc3RyaW5nLCBSZXBlYXRlZFB0ckZpZWxkPCBzdHJpbmc+KTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICBpZiAoaXNfbmV3KSB7CisgICAgICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUgPQorICAgICAgICAgICAgICBuZXcgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4oKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gV2UgY2FuJ3QgY2FsbCBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPjo6TWVyZ2VGcm9tKCkgYmVjYXVzZQorICAgICAgICAgIC8vIGl0IHdvdWxkIGF0dGVtcHQgdG8gYWxsb2NhdGUgbmV3IG9iamVjdHMuCisgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4qIG90aGVyX3JlcGVhdGVkX21lc3NhZ2UgPQorICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24ucmVwZWF0ZWRfbWVzc2FnZV92YWx1ZTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG90aGVyX3JlcGVhdGVkX21lc3NhZ2UtPnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgb3RoZXJfbWVzc2FnZSA9IG90aGVyX3JlcGVhdGVkX21lc3NhZ2UtPkdldChpKTsKKyAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiB0YXJnZXQgPSBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgIC0+QWRkRnJvbUNsZWFyZWQ8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPiA+KCk7CisgICAgICAgICAgICBpZiAodGFyZ2V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgdGFyZ2V0ID0gb3RoZXJfbWVzc2FnZS5OZXcoKTsKKyAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5BZGRBbGxvY2F0ZWQodGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhcmdldC0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKG90aGVyX21lc3NhZ2UpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFvdGhlcl9leHRlbnNpb24uaXNfY2xlYXJlZCkgeworICAgICAgICBzd2l0Y2ggKGNwcF90eXBlKG90aGVyX2V4dGVuc2lvbi50eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSwgQ0FNRUxDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFNldCMjQ0FNRUxDQVNFKGl0ZXItPmZpcnN0LCBvdGhlcl9leHRlbnNpb24udHlwZSwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLkxPV0VSQ0FTRSMjX3ZhbHVlLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgSEFORExFX1RZUEUoIElOVDMyLCAgaW50MzIsICBJbnQzMik7CisgICAgICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQsICBJbnQ2NCk7CisgICAgICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzIsIFVJbnQzMik7CisgICAgICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjQsIFVJbnQ2NCk7CisgICAgICAgICAgSEFORExFX1RZUEUoIEZMT0FULCAgZmxvYXQsICBGbG9hdCk7CisgICAgICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUsIERvdWJsZSk7CisgICAgICAgICAgSEFORExFX1RZUEUoICBCT09MLCAgIGJvb2wsICAgQm9vbCk7CisgICAgICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgIGVudW0sICAgRW51bSk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgICAgIFNldFN0cmluZyhpdGVyLT5maXJzdCwgb3RoZXJfZXh0ZW5zaW9uLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgKm90aGVyX2V4dGVuc2lvbi5zdHJpbmdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAgICAgTXV0YWJsZU1lc3NhZ2UoaXRlci0+Zmlyc3QsIG90aGVyX2V4dGVuc2lvbi50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKm90aGVyX2V4dGVuc2lvbi5tZXNzYWdlX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLmRlc2NyaXB0b3IpCisgICAgICAgICAgICAgIC0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKCpvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIEV4dGVuc2lvblNldDo6U3dhcChFeHRlbnNpb25TZXQqIHgpIHsKKyAgZXh0ZW5zaW9uc18uc3dhcCh4LT5leHRlbnNpb25zXyk7Cit9CisKK2Jvb2wgRXh0ZW5zaW9uU2V0OjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworICAvLyBFeHRlbnNpb25zIGFyZSBuZXZlciByZXF1aXJlZC4gIEhvd2V2ZXIsIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCBhbGwKKyAgLy8gZW1iZWRkZWQgbWVzc2FnZXMgYXJlIGluaXRpYWxpemVkLgorICBmb3IgKG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgeworICAgIGNvbnN0IEV4dGVuc2lvbiYgZXh0ZW5zaW9uID0gaXRlci0+c2Vjb25kOworICAgIGlmIChjcHBfdHlwZShleHRlbnNpb24udHlwZSkgPT0gV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgaWYgKGV4dGVuc2lvbi5pc19yZXBlYXRlZCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbi5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5zaXplKCk7IGkrKykgeworICAgICAgICAgIGlmICghZXh0ZW5zaW9uLnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkdldChpKS5Jc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghZXh0ZW5zaW9uLmlzX2NsZWFyZWQpIHsKKyAgICAgICAgICBpZiAoIWV4dGVuc2lvbi5tZXNzYWdlX3ZhbHVlLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZCh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNraXBwZXIqIGZpZWxkX3NraXBwZXIpIHsKKyAgaW50IG51bWJlciA9IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpOworICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZyk7CisKKyAgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb247CisgIGJvb2wgaXNfdW5rbm93bjsKKyAgaWYgKCFleHRlbnNpb25fZmluZGVyLT5GaW5kKG51bWJlciwgJmV4dGVuc2lvbikpIHsKKyAgICBpc191bmtub3duID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChleHRlbnNpb24uaXNfcGFja2VkKSB7CisgICAgaXNfdW5rbm93biA9ICh3aXJlX3R5cGUgIT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICB9IGVsc2UgeworICAgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBleHBlY3RlZF93aXJlX3R5cGUgPQorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGVGb3JGaWVsZFR5cGUocmVhbF90eXBlKGV4dGVuc2lvbi50eXBlKSk7CisgICAgaXNfdW5rbm93biA9ICh3aXJlX3R5cGUgIT0gZXhwZWN0ZWRfd2lyZV90eXBlKTsKKyAgfQorCisgIGlmIChpc191bmtub3duKSB7CisgICAgZmllbGRfc2tpcHBlci0+U2tpcEZpZWxkKGlucHV0LCB0YWcpOworICB9IGVsc2UgaWYgKGV4dGVuc2lvbi5pc19wYWNrZWQpIHsKKyAgICB1aW50MzIgc2l6ZTsKKyAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnNpemUpKSByZXR1cm4gZmFsc2U7CisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gaW5wdXQtPlB1c2hMaW1pdChzaXplKTsKKworICAgIHN3aXRjaCAoZXh0ZW5zaW9uLnR5cGUpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDUFBfQ0FNRUxDQVNFLCBDUFBfTE9XRVJDQVNFKSAgICAgICAgXAorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKGlucHV0LT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgQ1BQX0xPV0VSQ0FTRSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIENQUF9MT1dFUkNBU0UsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFPiggICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEFkZCMjQ1BQX0NBTUVMQ0FTRShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgdmFsdWUsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhaworCisgICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgIEludDMyLCAgIGludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgSW50NjQsICAgaW50NjQpOworICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsIFVJbnQzMiwgIHVpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgVUludDY0LCAgdWludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgSW50MzIsICAgaW50MzIpOworICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICBJbnQ2NCwgICBpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgVUludDMyLCAgdWludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCBVSW50NjQsICB1aW50NjQpOworICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsICBJbnQzMiwgICBpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgIEludDY0LCAgIGludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEZMT0FULCAgRmxvYXQsICAgZmxvYXQpOworICAgICAgSEFORExFX1RZUEUoICBET1VCTEUsIERvdWJsZSwgIGRvdWJsZSk7CisgICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICBCb29sLCAgICBib29sKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU06CisgICAgICAgIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7CisgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgaWYgKGV4dGVuc2lvbi5lbnVtX3ZhbGlkaXR5X2NoZWNrLmZ1bmMoCisgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZW51bV92YWxpZGl0eV9jaGVjay5hcmcsIHZhbHVlKSkgeworICAgICAgICAgICAgQWRkRW51bShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0sIHRydWUsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORzoKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfQllURVM6CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQOgorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFOgorICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTm9uLXByaW1pdGl2ZSB0eXBlcyBjYW4ndCBiZSBwYWNrZWQuIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaW5wdXQtPlBvcExpbWl0KGxpbWl0KTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGV4dGVuc2lvbi50eXBlKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ1BQX0NBTUVMQ0FTRSwgQ1BQX0xPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1BQX0xPV0VSQ0FTRSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENQUF9MT1dFUkNBU0UsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFPiggICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChleHRlbnNpb24uaXNfcmVwZWF0ZWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgQWRkIyNDUFBfQ0FNRUxDQVNFKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0UsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdmFsdWUsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgU2V0IyNDUFBfQ0FNRUxDQVNFKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0UsIHZhbHVlLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9IGJyZWFrCisKKyAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDMyLCAgSW50MzIsICAgaW50MzIpOworICAgICAgSEFORExFX1RZUEUoICAgSU5UNjQsICBJbnQ2NCwgICBpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRSggIFVJTlQzMiwgVUludDMyLCAgdWludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDY0LCBVSW50NjQsICB1aW50NjQpOworICAgICAgSEFORExFX1RZUEUoICBTSU5UMzIsICBJbnQzMiwgICBpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRSggIFNJTlQ2NCwgIEludDY0LCAgIGludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDMyLCBVSW50MzIsICB1aW50MzIpOworICAgICAgSEFORExFX1RZUEUoIEZJWEVENjQsIFVJbnQ2NCwgIHVpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgIEludDMyLCAgIGludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCAgSW50NjQsICAgaW50NjQpOworICAgICAgSEFORExFX1RZUEUoICAgRkxPQVQsICBGbG9hdCwgICBmbG9hdCk7CisgICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgRG91YmxlLCAgZG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgICBCT09MLCAgIEJvb2wsICAgIGJvb2wpOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTTogeworICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICghZXh0ZW5zaW9uLmVudW1fdmFsaWRpdHlfY2hlY2suZnVuYygKKyAgICAgICAgICAgICAgICBleHRlbnNpb24uZW51bV92YWxpZGl0eV9jaGVjay5hcmcsIHZhbHVlKSkgeworICAgICAgICAgIC8vIEludmFsaWQgdmFsdWUuICBUcmVhdCBhcyB1bmtub3duLgorICAgICAgICAgIGZpZWxkX3NraXBwZXItPlNraXBVbmtub3duRW51bShudW1iZXIsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChleHRlbnNpb24uaXNfcmVwZWF0ZWQpIHsKKyAgICAgICAgICBBZGRFbnVtKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTSwgZmFsc2UsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNldEVudW0obnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkc6ICB7CisgICAgICAgIHN0cmluZyogdmFsdWUgPSBleHRlbnNpb24uaXNfcmVwZWF0ZWQgPworICAgICAgICAgIEFkZFN0cmluZyhudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORywgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpIDoKKyAgICAgICAgICBNdXRhYmxlU3RyaW5nKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKGlucHV0LCB2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfQllURVM6ICB7CisgICAgICAgIHN0cmluZyogdmFsdWUgPSBleHRlbnNpb24uaXNfcmVwZWF0ZWQgPworICAgICAgICAgIEFkZFN0cmluZyhudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORywgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpIDoKKyAgICAgICAgICBNdXRhYmxlU3RyaW5nKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW5wdXQsIHZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUDogeworICAgICAgICBNZXNzYWdlTGl0ZSogdmFsdWUgPSBleHRlbnNpb24uaXNfcmVwZWF0ZWQgPworICAgICAgICAgICAgQWRkTWVzc2FnZShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQLAorICAgICAgICAgICAgICAgICAgICAgICAqZXh0ZW5zaW9uLm1lc3NhZ2VfcHJvdG90eXBlLCBleHRlbnNpb24uZGVzY3JpcHRvcikgOgorICAgICAgICAgICAgTXV0YWJsZU1lc3NhZ2UobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRlbnNpb24ubWVzc2FnZV9wcm90b3R5cGUsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwKG51bWJlciwgaW5wdXQsIHZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFOiB7CisgICAgICAgIE1lc3NhZ2VMaXRlKiB2YWx1ZSA9IGV4dGVuc2lvbi5pc19yZXBlYXRlZCA/CisgICAgICAgICAgICBBZGRNZXNzYWdlKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbi5tZXNzYWdlX3Byb3RvdHlwZSwgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpIDoKKyAgICAgICAgICAgIE11dGFibGVNZXNzYWdlKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRlbnNpb24ubWVzc2FnZV9wcm90b3R5cGUsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKKyAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2UoaW5wdXQsIHZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlRmllbGQodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgRmllbGRTa2lwcGVyIHNraXBwZXIodW5rbm93bl9maWVsZHMpOworICBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIgZmluZGVyKGNvbnRhaW5pbmdfdHlwZSk7CisgIHJldHVybiBQYXJzZUZpZWxkKHRhZywgaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKK30KKworLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorLy8gYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlRmllbGRIZWF2eSh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGNvbnRhaW5pbmdfdHlwZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykKKworYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlTWVzc2FnZVNldChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdWludDMyIHRhZyA9IGlucHV0LT5SZWFkVGFnKCk7CisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZzoKKyAgICAgICAgaWYgKCFQYXJzZU1lc3NhZ2VTZXRJdGVtKGlucHV0LCBleHRlbnNpb25fZmluZGVyLCBmaWVsZF9za2lwcGVyKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICghUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBleHRlbnNpb25fZmluZGVyLCBmaWVsZF9za2lwcGVyKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlTWVzc2FnZVNldChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgRmllbGRTa2lwcGVyIHNraXBwZXIodW5rbm93bl9maWVsZHMpOworICBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIgZmluZGVyKGNvbnRhaW5pbmdfdHlwZSk7CisgIHJldHVybiBQYXJzZU1lc3NhZ2VTZXQoaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKK30KKworLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorLy8gYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlTWVzc2FnZVNldEhlYXZ5KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBjb250YWluaW5nX3R5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisKK2Jvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXRJdGVtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcikgeworICAvLyBUT0RPKGtlbnRvbik6ICBJdCB3b3VsZCBiZSBuaWNlIHRvIHNoYXJlIGNvZGUgYmV0d2VlbiB0aGlzIGFuZAorICAvLyBXaXJlRm9ybWF0TGl0ZTo6UGFyc2VBbmRNZXJnZU1lc3NhZ2VTZXRJdGVtKCksIGJ1dCBJIHRoaW5rIHRoZQorICAvLyBkaWZmZXJlbmNlcyB3b3VsZCBiZSBoYXJkIHRvIGZhY3RvciBvdXQuCisKKyAgLy8gVGhpcyBtZXRob2QgcGFyc2VzIGEgZ3JvdXAgd2hpY2ggc2hvdWxkIGNvbnRhaW4gdHdvIGZpZWxkczoKKyAgLy8gICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKKyAgLy8gICByZXF1aXJlZCBkYXRhIG1lc3NhZ2UgPSAzOworCisgIC8vIE9uY2Ugd2Ugc2VlIGEgdHlwZV9pZCwgd2UnbGwgY29uc3RydWN0IGEgZmFrZSB0YWcgZm9yIHRoaXMgZXh0ZW5zaW9uCisgIC8vIHdoaWNoIGlzIHRoZSB0YWcgaXQgd291bGQgaGF2ZSBoYWQgdW5kZXIgdGhlIHByb3RvMiBleHRlbnNpb25zIHdpcmUKKyAgLy8gZm9ybWF0LgorICB1aW50MzIgZmFrZV90YWcgPSAwOworCisgIC8vIElmIHdlIHNlZSBtZXNzYWdlIGRhdGEgYmVmb3JlIHRoZSB0eXBlX2lkLCB3ZSdsbCBhcHBlbmQgaXQgdG8gdGhpcyBzbworICAvLyB3ZSBjYW4gcGFyc2UgaXQgbGF0ZXIuICBUaGlzIHdpbGwgcHJvYmFibHkgbmV2ZXIgaGFwcGVuIGluIHByYWN0aWNlLAorICAvLyBhcyBubyBNZXNzYWdlU2V0IGVuY29kZXIgSSBrbm93IG9mIHdyaXRlcyB0aGUgbWVzc2FnZSBiZWZvcmUgdGhlIHR5cGUgSUQuCisgIC8vIEJ1dCwgaXQncyB0ZWNobmljYWxseSB2YWxpZCBzbyB3ZSBzaG91bGQgYWxsb3cgaXQuCisgIC8vIFRPRE8oa2VudG9uKTogIFVzZSBhIENvcmQgaW5zdGVhZD8gIERvIEkgY2FyZT8KKyAgc3RyaW5nIG1lc3NhZ2VfZGF0YTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIHVpbnQzMiB0YWcgPSBpbnB1dC0+UmVhZFRhZygpOworICAgIGlmICh0YWcgPT0gMCkgcmV0dXJuIGZhbHNlOworCisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkVGFnOiB7CisgICAgICAgIHVpbnQzMiB0eXBlX2lkOworICAgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnR5cGVfaWQpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGZha2VfdGFnID0gV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcodHlwZV9pZCwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKworICAgICAgICBpZiAoIW1lc3NhZ2VfZGF0YS5lbXB0eSgpKSB7CisgICAgICAgICAgLy8gV2Ugc2F3IHNvbWUgbWVzc2FnZSBkYXRhIGJlZm9yZSB0aGUgdHlwZV9pZC4gIEhhdmUgdG8gcGFyc2UgaXQKKyAgICAgICAgICAvLyBub3cuCisgICAgICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gc3ViX2lucHV0KAorICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4obWVzc2FnZV9kYXRhLmRhdGEoKSksCisgICAgICAgICAgICAgIG1lc3NhZ2VfZGF0YS5zaXplKCkpOworICAgICAgICAgIGlmICghUGFyc2VGaWVsZChmYWtlX3RhZywgJnN1Yl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2ZpbmRlciwgZmllbGRfc2tpcHBlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWVzc2FnZV9kYXRhLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnOiB7CisgICAgICAgIGlmIChmYWtlX3RhZyA9PSAwKSB7CisgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBzZWVuIGEgdHlwZV9pZCB5ZXQuICBBcHBlbmQgdGhpcyBkYXRhIHRvIG1lc3NhZ2VfZGF0YS4KKyAgICAgICAgICBzdHJpbmcgdGVtcDsKKyAgICAgICAgICB1aW50MzIgbGVuZ3RoOworICAgICAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGlmICghaW5wdXQtPlJlYWRTdHJpbmcoJnRlbXAsIGxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBtZXNzYWdlX2RhdGEuYXBwZW5kKHRlbXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEFscmVhZHkgc2F3IHR5cGVfaWQsIHNvIHdlIGNhbiBwYXJzZSB0aGlzIGRpcmVjdGx5LgorICAgICAgICAgIGlmICghUGFyc2VGaWVsZChmYWtlX3RhZywgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9maW5kZXIsIGZpZWxkX3NraXBwZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZzogeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgICBpZiAoIWZpZWxkX3NraXBwZXItPlNraXBGaWVsZChpbnB1dCwgdGFnKSkgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIEV4dGVuc2lvblNldDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIGludCBzdGFydF9maWVsZF9udW1iZXIsIGludCBlbmRfZmllbGRfbnVtYmVyLAorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGV4dGVuc2lvbnNfLmxvd2VyX2JvdW5kKHN0YXJ0X2ZpZWxkX251bWJlcik7CisgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSAmJiBpdGVyLT5maXJzdCA8IGVuZF9maWVsZF9udW1iZXI7CisgICAgICAgKytpdGVyKSB7CisgICAgaXRlci0+c2Vjb25kLlNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKGl0ZXItPmZpcnN0LCBvdXRwdXQpOworICB9Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpTZXJpYWxpemVNZXNzYWdlU2V0V2l0aENhY2hlZFNpemVzKAorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7IGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgeworICAgIGl0ZXItPnNlY29uZC5TZXJpYWxpemVNZXNzYWdlU2V0SXRlbVdpdGhDYWNoZWRTaXplcyhpdGVyLT5maXJzdCwgb3V0cHV0KTsKKyAgfQorfQorCitpbnQgRXh0ZW5zaW9uU2V0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgdG90YWxfc2l6ZSArPSBpdGVyLT5zZWNvbmQuQnl0ZVNpemUoaXRlci0+Zmlyc3QpOworICB9CisKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK2ludCBFeHRlbnNpb25TZXQ6Ok1lc3NhZ2VTZXRCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgdG90YWxfc2l6ZSArPSBpdGVyLT5zZWNvbmQuTWVzc2FnZVNldEl0ZW1CeXRlU2l6ZShpdGVyLT5maXJzdCk7CisgIH0KKworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKworLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorLy8gaW50IEV4dGVuc2lvblNldDo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0CisKK2Jvb2wgRXh0ZW5zaW9uU2V0OjpNYXliZU5ld0V4dGVuc2lvbihpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb24qKiByZXN1bHQpIHsKKyAgcGFpcjxtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciwgYm9vbD4gaW5zZXJ0X3Jlc3VsdCA9CisgICAgICBleHRlbnNpb25zXy5pbnNlcnQobWFrZV9wYWlyKG51bWJlciwgRXh0ZW5zaW9uKCkpKTsKKyAgKnJlc3VsdCA9ICZpbnNlcnRfcmVzdWx0LmZpcnN0LT5zZWNvbmQ7CisgICgqcmVzdWx0KS0+ZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgIHJldHVybiBpbnNlcnRfcmVzdWx0LnNlY29uZDsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTWV0aG9kcyBvZiBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbgorCit2b2lkIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpDbGVhcigpIHsKKyAgaWYgKGlzX3JlcGVhdGVkKSB7CisgICAgc3dpdGNoIChjcHBfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkNsZWFyKCk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhaworCisgICAgICBIQU5ETEVfVFlQRSggIElOVDMyLCAgIGludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgSU5UNjQsICAgaW50NjQpOworICAgICAgSEFORExFX1RZUEUoIFVJTlQzMiwgIHVpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRSggVUlOVDY0LCAgdWludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgRkxPQVQsICAgZmxvYXQpOworICAgICAgSEFORExFX1RZUEUoIERPVUJMRSwgIGRvdWJsZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBCT09MLCAgICBib29sKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEVOVU0sICAgIGVudW0pOworICAgICAgSEFORExFX1RZUEUoIFNUUklORywgIHN0cmluZyk7CisgICAgICBIQU5ETEVfVFlQRShNRVNTQUdFLCBtZXNzYWdlKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIWlzX2NsZWFyZWQpIHsKKyAgICAgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgICAgc3RyaW5nX3ZhbHVlLT5jbGVhcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgbWVzc2FnZV92YWx1ZS0+Q2xlYXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAvLyBObyBuZWVkIHRvIGRvIGFueXRoaW5nLiAgR2V0KigpIHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgLy8gYXMgbG9uZyBhcyBpc19jbGVhcmVkIGlzIHRydWUgYW5kIFNldCooKSB3aWxsIG92ZXJ3cml0ZSB0aGUKKyAgICAgICAgICAvLyBwcmV2aW91cyB2YWx1ZS4KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaXNfY2xlYXJlZCA9IHRydWU7CisgICAgfQorICB9Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OlNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKAorICAgIGludCBudW1iZXIsCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgaWYgKGlzX3JlcGVhdGVkKSB7CisgICAgaWYgKGlzX3BhY2tlZCkgeworICAgICAgaWYgKGNhY2hlZF9zaXplID09IDApIHJldHVybjsKKworICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKG51bWJlciwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKKyAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihjYWNoZWRfc2l6ZSk7CisKKyAgICAgIHN3aXRjaCAocmVhbF90eXBlKHR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKTsgaSsrKSB7ICBcCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGUjI0NBTUVMQ0FTRSMjTm9UYWcoICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5HZXQoaSksIG91dHB1dCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWsKKworICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgICAgSW50NjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQzMiwgICBVSW50MzIsICB1aW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgICBTSW50MzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQ2NCwgICBTSW50NjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgIEZpeGVkMzIsICB1aW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQsICB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQsICAgZmxvYXQpOworICAgICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgICBEb3VibGUsICBkb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICAgIEJvb2wsICAgIGJvb2wpOworICAgICAgICBIQU5ETEVfVFlQRSggICAgRU5VTSwgICAgIEVudW0sICAgIGVudW0pOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfQllURVM6CisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfR1JPVVA6CisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRToKKyAgICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTm9uLXByaW1pdGl2ZSB0eXBlcyBjYW4ndCBiZSBwYWNrZWQuIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChyZWFsX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyBpKyspIHsgIFwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjQ0FNRUxDQVNFKG51bWJlciwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkdldChpKSwgb3V0cHV0KTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhaworCisgICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDMyLCAgICBJbnQzMiwgICBpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgICBJbnQ2NCwgICBpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDMyLCAgIFVJbnQzMiwgIHVpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDY0LCAgIFVJbnQ2NCwgIHVpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgIFNJbnQzMiwgICBpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDY0LCAgIFNJbnQ2NCwgICBpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDMyLCAgRml4ZWQzMiwgIHVpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCAgRml4ZWQ2NCwgIHVpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMiwgICBpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCwgICBpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgIEZMT0FULCAgICBGbG9hdCwgICBmbG9hdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgRE9VQkxFLCAgIERvdWJsZSwgIGRvdWJsZSk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgICBCT09MLCAgICAgQm9vbCwgICAgYm9vbCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgU1RSSU5HLCAgIFN0cmluZywgIHN0cmluZyk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgIEJZVEVTLCAgICBCeXRlcywgIHN0cmluZyk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgICBFTlVNLCAgICAgRW51bSwgICAgZW51bSk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgIEdST1VQLCAgICBHcm91cCwgbWVzc2FnZSk7CisgICAgICAgIEhBTkRMRV9UWVBFKCBNRVNTQUdFLCAgTWVzc2FnZSwgbWVzc2FnZSk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoIWlzX2NsZWFyZWQpIHsKKyAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgVkFMVUUpICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlIyNDQU1FTENBU0UobnVtYmVyLCBWQUxVRSwgb3V0cHV0KTsgXAorICAgICAgICBicmVhaworCisgICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgIGludDMyX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgICBJbnQ2NCwgICAgaW50NjRfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsICAgVUludDMyLCAgIHVpbnQzMl92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICAgdWludDY0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgIFNJbnQzMiwgICAgaW50MzJfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICAgU0ludDY0LCAgICBpbnQ2NF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgIEZpeGVkMzIsICAgdWludDMyX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCAgRml4ZWQ2NCwgICB1aW50NjRfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyLCAgICBpbnQzMl92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsICAgIGludDY0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEZMT0FULCAgICBGbG9hdCwgICAgZmxvYXRfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICBET1VCTEUsICAgRG91YmxlLCAgIGRvdWJsZV92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICAgIEJvb2wsICAgICBib29sX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgU1RSSU5HLCAgIFN0cmluZywgICpzdHJpbmdfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICAgQllURVMsICAgIEJ5dGVzLCAgKnN0cmluZ192YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICAgRU5VTSwgICAgIEVudW0sICAgICBlbnVtX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEdST1VQLCAgICBHcm91cCwgKm1lc3NhZ2VfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoIE1FU1NBR0UsICBNZXNzYWdlLCAqbWVzc2FnZV92YWx1ZSk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICB9CisgIH0KK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6U2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXMoCisgICAgaW50IG51bWJlciwKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICBpZiAodHlwZSAhPSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFIHx8IGlzX3JlcGVhdGVkKSB7CisgICAgLy8gTm90IGEgdmFsaWQgTWVzc2FnZVNldCBleHRlbnNpb24sIGJ1dCBzZXJpYWxpemUgaXQgdGhlIG5vcm1hbCB3YXkuCisgICAgU2VyaWFsaXplRmllbGRXaXRoQ2FjaGVkU2l6ZXMobnVtYmVyLCBvdXRwdXQpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChpc19jbGVhcmVkKSByZXR1cm47CisKKyAgLy8gU3RhcnQgZ3JvdXAuCisgIG91dHB1dC0+V3JpdGVUYWcoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnKTsKKworICAvLyBXcml0ZSB0eXBlIElELgorICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzIoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKKyAgLy8gV3JpdGUgbWVzc2FnZS4KKyAgV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIsCisgICAgICAqbWVzc2FnZV92YWx1ZSwKKyAgICAgIG91dHB1dCk7CisKKyAgLy8gRW5kIGdyb3VwLgorICBvdXRwdXQtPldyaXRlVGFnKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1FbmRUYWcpOworfQorCitpbnQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OkJ5dGVTaXplKGludCBudW1iZXIpIGNvbnN0IHsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgaWYgKGlzX3JlcGVhdGVkKSB7CisgICAgaWYgKGlzX3BhY2tlZCkgeworICAgICAgc3dpdGNoIChyZWFsX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyBpKyspIHsgIFwKKyAgICAgICAgICAgIHJlc3VsdCArPSBXaXJlRm9ybWF0TGl0ZTo6Q0FNRUxDQVNFIyNTaXplKCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkdldChpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhaworCisgICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDMyLCAgICBJbnQzMiwgICBpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgICBJbnQ2NCwgICBpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDMyLCAgIFVJbnQzMiwgIHVpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDY0LCAgIFVJbnQ2NCwgIHVpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgIFNJbnQzMiwgICBpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDY0LCAgIFNJbnQ2NCwgICBpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgICBFTlVNLCAgICAgRW51bSwgICAgZW51bSk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgICAvLyBTdHVmZiB3aXRoIGZpeGVkIHNpemUuCisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZXN1bHQgKz0gV2lyZUZvcm1hdExpdGU6OmsjI0NBTUVMQ0FTRSMjU2l6ZSAqICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrCisgICAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDMyLCAgRml4ZWQzMiwgdWludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoIEZJWEVENjQsICBGaXhlZDY0LCB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIsICBpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCwgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgRkxPQVQsICAgIEZsb2F0LCAgZmxvYXQpOworICAgICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgICBEb3VibGUsIGRvdWJsZSk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgICBCT09MLCAgICAgQm9vbCwgICBib29sKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U6CisgICAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vbi1wcmltaXRpdmUgdHlwZXMgY2FuJ3QgYmUgcGFja2VkLiI7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhY2hlZF9zaXplID0gcmVzdWx0OworICAgICAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICAgICAgcmVzdWx0ICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKG51bWJlciwKKyAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbnQgdGFnX3NpemUgPSBXaXJlRm9ybWF0TGl0ZTo6VGFnU2l6ZShudW1iZXIsIHJlYWxfdHlwZSh0eXBlKSk7CisKKyAgICAgIHN3aXRjaCAocmVhbF90eXBlKHR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZXN1bHQgKz0gdGFnX3NpemUgKiByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5zaXplKCk7ICAgICAgICBcCisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5zaXplKCk7IGkrKykgeyAgXAorICAgICAgICAgICAgcmVzdWx0ICs9IFdpcmVGb3JtYXRMaXRlOjpDQU1FTENBU0UjI1NpemUoICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+R2V0KGkpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgSEFORExFX1RZUEUoICAgSU5UMzIsICAgIEludDMyLCAgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgSU5UNjQsICAgIEludDY0LCAgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsICAgVUludDMyLCAgdWludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBVSU5UNjQsICAgVUludDY0LCAgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBTSU5UMzIsICAgU0ludDMyLCAgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICAgU0ludDY0LCAgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBTVFJJTkcsICAgU3RyaW5nLCAgc3RyaW5nKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgQllURVMsICAgIEJ5dGVzLCAgc3RyaW5nKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICBlbnVtKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgR1JPVVAsICAgIEdyb3VwLCBtZXNzYWdlKTsKKyAgICAgICAgSEFORExFX1RZUEUoIE1FU1NBR0UsICBNZXNzYWdlLCBtZXNzYWdlKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICAgIC8vIFN0dWZmIHdpdGggZml4ZWQgc2l6ZS4KKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHJlc3VsdCArPSAodGFnX3NpemUgKyBXaXJlRm9ybWF0TGl0ZTo6ayMjQ0FNRUxDQVNFIyNTaXplKSAqICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgSEFORExFX1RZUEUoIEZJWEVEMzIsICBGaXhlZDMyLCB1aW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQsIHVpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMiwgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0LCAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQsICBmbG9hdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKCAgRE9VQkxFLCAgIERvdWJsZSwgZG91YmxlKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgIEJPT0wsICAgICBCb29sLCAgIGJvb2wpOworI3VuZGVmIEhBTkRMRV9UWVBFCisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKCFpc19jbGVhcmVkKSB7CisgICAgcmVzdWx0ICs9IFdpcmVGb3JtYXRMaXRlOjpUYWdTaXplKG51bWJlciwgcmVhbF90eXBlKHR5cGUpKTsKKyAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVzdWx0ICs9IFdpcmVGb3JtYXRMaXRlOjpDQU1FTENBU0UjI1NpemUoTE9XRVJDQVNFKTsgICAgICAgICAgICAgXAorICAgICAgICBicmVhaworCisgICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgIGludDMyX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgICBJbnQ2NCwgICAgaW50NjRfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsICAgVUludDMyLCAgIHVpbnQzMl92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICAgdWludDY0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgIFNJbnQzMiwgICAgaW50MzJfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICAgU0ludDY0LCAgICBpbnQ2NF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggIFNUUklORywgICBTdHJpbmcsICAqc3RyaW5nX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEJZVEVTLCAgICBCeXRlcywgICpzdHJpbmdfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICAgZW51bV92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBHUk9VUCwgICAgR3JvdXAsICptZXNzYWdlX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBNRVNTQUdFLCAgTWVzc2FnZSwgKm1lc3NhZ2VfdmFsdWUpOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgIC8vIFN0dWZmIHdpdGggZml4ZWQgc2l6ZS4KKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlc3VsdCArPSBXaXJlRm9ybWF0TGl0ZTo6ayMjQ0FNRUxDQVNFIyNTaXplOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWsKKyAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDMyLCAgRml4ZWQzMik7CisgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQpOworICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCk7CisgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQpOworICAgICAgSEFORExFX1RZUEUoICBET1VCTEUsICAgRG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgICBCT09MLCAgICAgQm9vbCk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246Ok1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoaW50IG51bWJlcikgY29uc3QgeworICBpZiAodHlwZSAhPSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFIHx8IGlzX3JlcGVhdGVkKSB7CisgICAgLy8gTm90IGEgdmFsaWQgTWVzc2FnZVNldCBleHRlbnNpb24sIGJ1dCBjb21wdXRlIHRoZSBieXRlIHNpemUgZm9yIGl0IHRoZQorICAgIC8vIG5vcm1hbCB3YXkuCisgICAgcmV0dXJuIEJ5dGVTaXplKG51bWJlcik7CisgIH0KKworICBpZiAoaXNfY2xlYXJlZCkgcmV0dXJuIDA7CisKKyAgaW50IG91cl9zaXplID0gV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVRhZ3NTaXplOworCisgIC8vIHR5cGVfaWQKKyAgb3VyX3NpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIobnVtYmVyKTsKKworICAvLyBtZXNzYWdlCisgIGludCBtZXNzYWdlX3NpemUgPSBtZXNzYWdlX3ZhbHVlLT5CeXRlU2l6ZSgpOworCisgIG91cl9zaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKG1lc3NhZ2Vfc2l6ZSk7CisgIG91cl9zaXplICs9IG1lc3NhZ2Vfc2l6ZTsKKworICByZXR1cm4gb3VyX3NpemU7Cit9CisKK2ludCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6R2V0U2l6ZSgpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhpc19yZXBlYXRlZCk7CisgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpCisKKyAgICBIQU5ETEVfVFlQRSggIElOVDMyLCAgIGludDMyKTsKKyAgICBIQU5ETEVfVFlQRSggIElOVDY0LCAgIGludDY0KTsKKyAgICBIQU5ETEVfVFlQRSggVUlOVDMyLCAgdWludDMyKTsKKyAgICBIQU5ETEVfVFlQRSggVUlOVDY0LCAgdWludDY0KTsKKyAgICBIQU5ETEVfVFlQRSggIEZMT0FULCAgIGZsb2F0KTsKKyAgICBIQU5ETEVfVFlQRSggRE9VQkxFLCAgZG91YmxlKTsKKyAgICBIQU5ETEVfVFlQRSggICBCT09MLCAgICBib29sKTsKKyAgICBIQU5ETEVfVFlQRSggICBFTlVNLCAgICBlbnVtKTsKKyAgICBIQU5ETEVfVFlQRSggU1RSSU5HLCAgc3RyaW5nKTsKKyAgICBIQU5ETEVfVFlQRShNRVNTQUdFLCBtZXNzYWdlKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiAwOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpGcmVlKCkgeworICBpZiAoaXNfcmVwZWF0ZWQpIHsKKyAgICBzd2l0Y2ggKGNwcF90eXBlKHR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVsZXRlIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrCisKKyAgICAgIEhBTkRMRV9UWVBFKCAgSU5UMzIsICAgaW50MzIpOworICAgICAgSEFORExFX1RZUEUoICBJTlQ2NCwgICBpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRSggVUlOVDMyLCAgdWludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBVSU5UNjQsICB1aW50NjQpOworICAgICAgSEFORExFX1RZUEUoICBGTE9BVCwgICBmbG9hdCk7CisgICAgICBIQU5ETEVfVFlQRSggRE9VQkxFLCAgZG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEJPT0wsICAgIGJvb2wpOworICAgICAgSEFORExFX1RZUEUoICAgRU5VTSwgICAgZW51bSk7CisgICAgICBIQU5ETEVfVFlQRSggU1RSSU5HLCAgc3RyaW5nKTsKKyAgICAgIEhBTkRMRV9UWVBFKE1FU1NBR0UsIG1lc3NhZ2UpOworI3VuZGVmIEhBTkRMRV9UWVBFCisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICBkZWxldGUgc3RyaW5nX3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgZGVsZXRlIG1lc3NhZ2VfdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KKy8vIGludCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjZTQyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaApAQCAtMCwwICsxLDkwNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBoZWFkZXIgaXMgbG9naWNhbGx5IGludGVybmFsLCBidXQgaXMgbWFkZSBwdWJsaWMgYmVjYXVzZSBpdCBpcyB1c2VkCisvLyBmcm9tIHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlLCB3aGljaCBtYXkgcmVzaWRlIGluIG90aGVyIGNvbXBvbmVudHMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9TRVRfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fU0VUX0hfXworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHN0cmluZz4KKworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKKworbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgY2xhc3MgRGVzY3JpcHRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKKyAgY2xhc3MgRmllbGREZXNjcmlwdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKKyAgY2xhc3MgRGVzY3JpcHRvclBvb2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKKyAgY2xhc3MgTWVzc2FnZUxpdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlX2xpdGUuaAorICBjbGFzcyBNZXNzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UuaAorICBjbGFzcyBNZXNzYWdlRmFjdG9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UuaAorICBjbGFzcyBVbmtub3duRmllbGRTZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVua25vd25fZmllbGRfc2V0LmgKKyAgbmFtZXNwYWNlIGlvIHsKKyAgICBjbGFzcyBDb2RlZElucHV0U3RyZWFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGVkX3N0cmVhbS5oCisgICAgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlZF9zdHJlYW0uaAorICB9CisgIG5hbWVzcGFjZSBpbnRlcm5hbCB7CisgICAgY2xhc3MgRmllbGRTa2lwcGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXJlX2Zvcm1hdF9saXRlLmgKKyAgICBjbGFzcyBSZXBlYXRlZFB0ckZpZWxkQmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4gY2xhc3MgUmVwZWF0ZWRGaWVsZDsgICAgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+IGNsYXNzIFJlcGVhdGVkUHRyRmllbGQ7ICAvLyByZXBlYXRlZF9maWVsZC5oCit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBVc2VkIHRvIHN0b3JlIHZhbHVlcyBvZiB0eXBlIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgd2l0aG91dCBoYXZpbmcgdG8KKy8vICNpbmNsdWRlIHdpcmVfZm9ybWF0X2xpdGUuaC4gIEFsc28sIGVuc3VyZXMgdGhhdCB3ZSB1c2Ugb25seSBvbmUgYnl0ZSB0bworLy8gc3RvcmUgdGhlc2UgdmFsdWVzLCB3aGljaCBpcyBpbXBvcnRhbnQgdG8ga2VlcCB0aGUgbGF5b3V0IG9mCisvLyBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbiBzbWFsbC4KK3R5cGVkZWYgdWludDggRmllbGRUeXBlOworCisvLyBBIGZ1bmN0aW9uIHdoaWNoLCBnaXZlbiBhbiBpbnRlZ2VyIHZhbHVlLCByZXR1cm5zIHRydWUgaWYgdGhlIG51bWJlcgorLy8gbWF0Y2hlcyBvbmUgb2YgdGhlIGRlZmluZWQgdmFsdWVzIGZvciB0aGUgY29ycmVzcG9uZGluZyBlbnVtIHR5cGUuICBUaGlzCisvLyBpcyB1c2VkIHdpdGggUmVnaXN0ZXJFbnVtRXh0ZW5zaW9uLCBiZWxvdy4KK3R5cGVkZWYgYm9vbCBFbnVtVmFsaWRpdHlGdW5jKGludCBudW1iZXIpOworCisvLyBWZXJzaW9uIG9mIHRoZSBhYm92ZSB3aGljaCB0YWtlcyBhbiBhcmd1bWVudC4gIFRoaXMgaXMgbmVlZGVkIHRvIGRlYWwgd2l0aAorLy8gZXh0ZW5zaW9ucyB0aGF0IGFyZSBub3QgY29tcGlsZWQgaW4uCit0eXBlZGVmIGJvb2wgRW51bVZhbGlkaXR5RnVuY1dpdGhBcmcoY29uc3Qgdm9pZCogYXJnLCBpbnQgbnVtYmVyKTsKKworLy8gSW5mb3JtYXRpb24gYWJvdXQgYSByZWdpc3RlcmVkIGV4dGVuc2lvbi4KK3N0cnVjdCBFeHRlbnNpb25JbmZvIHsKKyAgaW5saW5lIEV4dGVuc2lvbkluZm8oKSB7fQorICBpbmxpbmUgRXh0ZW5zaW9uSW5mbyhGaWVsZFR5cGUgdHlwZSwgYm9vbCBpc19yZXBlYXRlZCwgYm9vbCBpc19wYWNrZWQpCisgICAgICA6IHR5cGUodHlwZSksIGlzX3JlcGVhdGVkKGlzX3JlcGVhdGVkKSwgaXNfcGFja2VkKGlzX3BhY2tlZCksCisgICAgICAgIGRlc2NyaXB0b3IoTlVMTCkge30KKworICBGaWVsZFR5cGUgdHlwZTsKKyAgYm9vbCBpc19yZXBlYXRlZDsKKyAgYm9vbCBpc19wYWNrZWQ7CisKKyAgc3RydWN0IEVudW1WYWxpZGl0eUNoZWNrIHsKKyAgICBFbnVtVmFsaWRpdHlGdW5jV2l0aEFyZyogZnVuYzsKKyAgICBjb25zdCB2b2lkKiBhcmc7CisgIH07CisKKyAgdW5pb24geworICAgIEVudW1WYWxpZGl0eUNoZWNrIGVudW1fdmFsaWRpdHlfY2hlY2s7CisgICAgY29uc3QgTWVzc2FnZUxpdGUqIG1lc3NhZ2VfcHJvdG90eXBlOworICB9OworCisgIC8vIFRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIGV4dGVuc2lvbiwgaWYgb25lIGV4aXN0cyBhbmQgaXMga25vd24uICBNYXkgYmUKKyAgLy8gTlVMTC4gIE11c3Qgbm90IGJlIE5VTEwgaWYgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBleHRlbnNpb24gZG9lcyBub3QKKyAgLy8gbGl2ZSBpbiB0aGUgc2FtZSBwb29sIGFzIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgY29udGFpbmluZyB0eXBlLgorICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3I7Cit9OworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGFuIG9iamVjdCB3aGljaCBsb29rcyB1cCBleHRlbnNpb24gZGVmaW5pdGlvbnMuICBVc2VkCisvLyB3aGVuIHBhcnNpbmcuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRXh0ZW5zaW9uRmluZGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkV4dGVuc2lvbkZpbmRlcigpOworCisgIC8vIEZpbmQgdGhlIGV4dGVuc2lvbiB3aXRoIHRoZSBnaXZlbiBjb250YWluaW5nIHR5cGUgYW5kIG51bWJlci4KKyAgdmlydHVhbCBib29sIEZpbmQoaW50IG51bWJlciwgRXh0ZW5zaW9uSW5mbyogb3V0cHV0KSA9IDA7Cit9OworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBFeHRlbnNpb25GaW5kZXIgd2hpY2ggZmluZHMgZXh0ZW5zaW9ucyBkZWZpbmVkIGluIC5wcm90bworLy8gZmlsZXMgd2hpY2ggaGF2ZSBiZWVuIGNvbXBpbGVkIGludG8gdGhlIGJpbmFyeS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIgOiBwdWJsaWMgRXh0ZW5zaW9uRmluZGVyIHsKKyBwdWJsaWM6CisgIEdlbmVyYXRlZEV4dGVuc2lvbkZpbmRlcihjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlKQorICAgICAgOiBjb250YWluaW5nX3R5cGVfKGNvbnRhaW5pbmdfdHlwZSkge30KKyAgdmlydHVhbCB+R2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyKCkge30KKworICAvLyBSZXR1cm5zIHRydWUgYW5kIGZpbGxzIGluICpvdXRwdXQgaWYgZm91bmQsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICB2aXJ0dWFsIGJvb2wgRmluZChpbnQgbnVtYmVyLCBFeHRlbnNpb25JbmZvKiBvdXRwdXQpOworCisgcHJpdmF0ZToKKyAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZV87Cit9OworCisvLyBOb3RlOiAgZXh0ZW5zaW9uX3NldF9oZWF2eS5jYyBkZWZpbmVzIERlc2NyaXB0b3JQb29sRXh0ZW5zaW9uRmluZGVyIGZvcgorLy8gZmluZGluZyBleHRlbnNpb25zIGZyb20gYSBEZXNjcmlwdG9yUG9vbC4KKworLy8gVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWxwZXIgY2xhc3MgaW50ZW5kZWQgZm9yIHVzZSB3aXRoaW4gdGhlIHByb3RvY29sIGJ1ZmZlcgorLy8gbGlicmFyeSBhbmQgZ2VuZXJhdGVkIGNsYXNzZXMuICBDbGllbnRzIHNob3VsZCBub3QgdXNlIGl0IGRpcmVjdGx5LiAgSW5zdGVhZCwKKy8vIHVzZSB0aGUgZ2VuZXJhdGVkIGFjY2Vzc29ycyBzdWNoIGFzIEdldEV4dGVuc2lvbigpIG9mIHRoZSBjbGFzcyBiZWluZworLy8gZXh0ZW5kZWQuCisvLworLy8gVGhpcyBjbGFzcyBtYW5hZ2VzIGV4dGVuc2lvbnMgZm9yIGEgcHJvdG9jb2wgbWVzc2FnZSBvYmplY3QuICBUaGUKKy8vIG1lc3NhZ2UncyBIYXNFeHRlbnNpb24oKSwgR2V0RXh0ZW5zaW9uKCksIE11dGFibGVFeHRlbnNpb24oKSwgYW5kCisvLyBDbGVhckV4dGVuc2lvbigpIG1ldGhvZHMgYXJlIGp1c3QgdGhpbiB3cmFwcGVycyBhcm91bmQgdGhlIGVtYmVkZGVkCisvLyBFeHRlbnNpb25TZXQuICBXaGVuIHBhcnNpbmcsIGlmIGEgdGFnIG51bWJlciBpcyBlbmNvdW50ZXJlZCB3aGljaCBpcworLy8gaW5zaWRlIG9uZSBvZiB0aGUgbWVzc2FnZSB0eXBlJ3MgZXh0ZW5zaW9uIHJhbmdlcywgdGhlIHRhZyBpcyBwYXNzZWQKKy8vIG9mZiB0byB0aGUgRXh0ZW5zaW9uU2V0IGZvciBwYXJzaW5nLiAgRXRjLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEV4dGVuc2lvblNldCB7CisgcHVibGljOgorICBFeHRlbnNpb25TZXQoKTsKKyAgfkV4dGVuc2lvblNldCgpOworCisgIC8vIFRoZXNlIGFyZSBjYWxsZWQgYXQgc3RhcnR1cCBieSBwcm90b2NvbC1jb21waWxlci1nZW5lcmF0ZWQgY29kZSB0bworICAvLyByZWdpc3RlciBrbm93biBleHRlbnNpb25zLiAgVGhlIHJlZ2lzdHJhdGlvbnMgYXJlIHVzZWQgYnkgUGFyc2VGaWVsZCgpCisgIC8vIHRvIGxvb2sgdXAgZXh0ZW5zaW9ucyBmb3IgcGFyc2VkIGZpZWxkIG51bWJlcnMuICBOb3RlIHRoYXQgZHluYW1pYyBwYXJzaW5nCisgIC8vIGRvZXMgbm90IHVzZSBQYXJzZUZpZWxkKCk7IG9ubHkgcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkIHBhcnNpbmcKKyAgLy8gbWV0aG9kcyBkby4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRlbnNpb24oY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVwZWF0ZWQsIGJvb2wgaXNfcGFja2VkKTsKKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFbnVtRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVwZWF0ZWQsIGJvb2wgaXNfcGFja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVZhbGlkaXR5RnVuYyogaXNfdmFsaWQpOworICBzdGF0aWMgdm9pZCBSZWdpc3Rlck1lc3NhZ2VFeHRlbnNpb24oY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXBlYXRlZCwgYm9vbCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogcHJvdG90eXBlKTsKKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8vIEFkZCBhbGwgZmllbGRzIHdoaWNoIGFyZSBjdXJyZW50bHkgcHJlc2VudCB0byB0aGUgZ2l2ZW4gdmVjdG9yLiAgVGhpcworICAvLyBpcyB1c2VmdWwgdG8gaW1wbGVtZW50IFJlZmxlY3Rpb246Okxpc3RGaWVsZHMoKS4KKyAgdm9pZCBBcHBlbmRUb0xpc3QoY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXRwdXQpIGNvbnN0OworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEFjY2Vzc29ycworICAvLworICAvLyBHZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzIGluY2x1ZGUgdHlwZS1zYWZlIHRlbXBsYXRlZCB3cmFwcGVycyBhcm91bmQKKyAgLy8gdGhlc2UgbWV0aG9kcy4gIEdlbmVyYWxseSB5b3Ugc2hvdWxkIHVzZSB0aG9zZSByYXRoZXIgdGhhbiBjYWxsIHRoZXNlCisgIC8vIGRpcmVjdGx5LCB1bmxlc3MgeW91IGFyZSBkb2luZyBsb3ctbGV2ZWwgbWVtb3J5IG1hbmFnZW1lbnQuCisgIC8vCisgIC8vIFdoZW4gY2FsbGluZyBhbnkgb2YgdGhlc2UgYWNjZXNzb3JzLCB0aGUgZXh0ZW5zaW9uIG51bWJlciByZXF1ZXN0ZWQKKyAgLy8gTVVTVCBleGlzdCBpbiB0aGUgRGVzY3JpcHRvclBvb2wgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLiAgT3RoZXJpd3NlLAorICAvLyB0aGUgbWV0aG9kIHdpbGwgZmFpbCBhbiBhc3NlcnQuICBOb3JtYWxseSwgdGhvdWdoLCB5b3Ugd291bGQgbm90IGNhbGwKKyAgLy8gdGhlc2UgZGlyZWN0bHk7IHlvdSB3b3VsZCBlaXRoZXIgY2FsbCB0aGUgZ2VuZXJhdGVkIGFjY2Vzc29ycyBvZiB5b3VyCisgIC8vIG1lc3NhZ2UgY2xhc3MgKGUuZy4gR2V0RXh0ZW5zaW9uKCkpIG9yIHlvdSB3b3VsZCBjYWxsIHRoZSBhY2Nlc3NvcnMKKyAgLy8gb2YgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLiAgSW4gYm90aCBjYXNlcywgaXQgaXMgaW1wb3NzaWJsZSB0bworICAvLyB0cmlnZ2VyIHRoaXMgYXNzZXJ0IGZhaWx1cmU6ICB0aGUgZ2VuZXJhdGVkIGFjY2Vzc29ycyBvbmx5IGFjY2VwdAorICAvLyBsaW5rZWQtaW4gZXh0ZW5zaW9uIHR5cGVzIGFzIHBhcmFtZXRlcnMsIHdoaWxlIHRoZSBSZWZsZWN0aW9uIGludGVyZmFjZQorICAvLyByZXF1aXJlcyB5b3UgdG8gcHJvdmlkZSB0aGUgRmllbGREZXNjcmlwdG9yIGRlc2NyaWJpbmcgdGhlIGV4dGVuc2lvbi4KKyAgLy8KKyAgLy8gV2hlbiBjYWxsaW5nIGFueSBvZiB0aGVzZSBhY2Nlc3NvcnMsIGEgcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkCisgIC8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlbnNpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbnVtYmVyIE1VU1QKKyAgLy8gYmUgbGlua2VkIGluLCBhbmQgdGhlIEZpZWxkRGVzY3JpcHRvciB1c2VkIHRvIHJlZmVyIHRvIGl0IE1VU1QgYmUKKyAgLy8gdGhlIG9uZSBnZW5lcmF0ZWQgYnkgdGhhdCBsaW5rZWQtaW4gY29kZS4gIE90aGVyd2lzZSwgdGhlIG1ldGhvZCB3aWxsCisgIC8vIGRpZSBvbiBhbiBhc3NlcnQgZmFpbHVyZS4gIFRoZSBtZXNzYWdlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIG1lc3NhZ2UKKyAgLy8gYWNjZXNzb3JzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9mIHRoZSBjb3JyZWN0IGxpbmtlZC1pbiB0eXBlLgorICAvLworICAvLyBUaGVzZSBtZXRob2RzIHByZXR0eSBtdWNoIG1hdGNoIFJlZmxlY3Rpb24gZXhjZXB0IHRoYXQ6CisgIC8vIC0gVGhleSdyZSBub3QgdmlydHVhbC4KKyAgLy8gLSBUaGV5IGlkZW50aWZ5IGZpZWxkcyBieSBudW1iZXIgcmF0aGVyIHRoYW4gRmllbGREZXNjcmlwdG9ycy4KKyAgLy8gLSBUaGV5IGlkZW50aWZ5IGVudW0gdmFsdWVzIHVzaW5nIGludGVnZXJzIHJhdGhlciB0aGFuIGRlc2NyaXB0b3JzLgorICAvLyAtIFN0cmluZ3MgcHJvdmlkZSBNdXRhYmxlKCkgaW4gYWRkaXRpb24gdG8gU2V0KCkgYWNjZXNzb3JzLgorCisgIGJvb2wgSGFzKGludCBudW1iZXIpIGNvbnN0OworICBpbnQgRXh0ZW5zaW9uU2l6ZShpbnQgbnVtYmVyKSBjb25zdDsgICAvLyBTaXplIG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLgorICBGaWVsZFR5cGUgRXh0ZW5zaW9uVHlwZShpbnQgbnVtYmVyKSBjb25zdDsKKyAgdm9pZCBDbGVhckV4dGVuc2lvbihpbnQgbnVtYmVyKTsKKworICAvLyBzaW5ndWxhciBmaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGludDMyICBHZXRJbnQzMiAoaW50IG51bWJlciwgaW50MzIgIGRlZmF1bHRfdmFsdWUpIGNvbnN0OworICBpbnQ2NCAgR2V0SW50NjQgKGludCBudW1iZXIsIGludDY0ICBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgdWludDMyIEdldFVJbnQzMihpbnQgbnVtYmVyLCB1aW50MzIgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIHVpbnQ2NCBHZXRVSW50NjQoaW50IG51bWJlciwgdWludDY0IGRlZmF1bHRfdmFsdWUpIGNvbnN0OworICBmbG9hdCAgR2V0RmxvYXQgKGludCBudW1iZXIsIGZsb2F0ICBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgZG91YmxlIEdldERvdWJsZShpbnQgbnVtYmVyLCBkb3VibGUgZGVmYXVsdF92YWx1ZSkgY29uc3Q7CisgIGJvb2wgICBHZXRCb29sICAoaW50IG51bWJlciwgYm9vbCAgIGRlZmF1bHRfdmFsdWUpIGNvbnN0OworICBpbnQgICAgR2V0RW51bSAgKGludCBudW1iZXIsIGludCAgICBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgY29uc3Qgc3RyaW5nICYgR2V0U3RyaW5nIChpbnQgbnVtYmVyLCBjb25zdCBzdHJpbmcmICBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgY29uc3QgTWVzc2FnZUxpdGUmIEdldE1lc3NhZ2UoaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIGRlZmF1bHRfdmFsdWUpIGNvbnN0OworICBjb25zdCBNZXNzYWdlTGl0ZSYgR2V0TWVzc2FnZShpbnQgbnVtYmVyLCBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSBjb25zdDsKKworICAvLyB8ZGVzY3JpcHRvcnwgbWF5IGJlIE5VTEwgc28gbG9uZyBhcyBpdCBpcyBrbm93biB0aGF0IHRoZSBkZXNjcmlwdG9yIGZvcgorICAvLyB0aGUgZXh0ZW5zaW9uIGxpdmVzIGluIHRoZSBzYW1lIHBvb2wgYXMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBjb250YWluaW5nCisgIC8vIHR5cGUuCisjZGVmaW5lIGRlc2MgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yICAvLyBhdm9pZCBsaW5lIHdyYXBwaW5nCisgIHZvaWQgU2V0SW50MzIgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBpbnQzMiAgdmFsdWUsIGRlc2MpOworICB2b2lkIFNldEludDY0IChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgaW50NjQgIHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBTZXRVSW50MzIoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIHVpbnQzMiB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgU2V0VUludDY0KGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCB1aW50NjQgdmFsdWUsIGRlc2MpOworICB2b2lkIFNldEZsb2F0IChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgZmxvYXQgIHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBTZXREb3VibGUoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGRvdWJsZSB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgU2V0Qm9vbCAgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sICAgdmFsdWUsIGRlc2MpOworICB2b2lkIFNldEVudW0gIChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgaW50ICAgIHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBTZXRTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGNvbnN0IHN0cmluZyYgdmFsdWUsIGRlc2MpOworICBzdHJpbmcgKiBNdXRhYmxlU3RyaW5nIChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgZGVzYyk7CisgIE1lc3NhZ2VMaXRlKiBNdXRhYmxlTWVzc2FnZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUsIGRlc2MpOworICBNZXNzYWdlTGl0ZSogTXV0YWJsZU1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZWNzcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpOworI3VuZGVmIGRlc2MKKworICAvLyByZXBlYXRlZCBmaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGludDMyICBHZXRSZXBlYXRlZEludDMyIChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OworICBpbnQ2NCAgR2V0UmVwZWF0ZWRJbnQ2NCAoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKyAgdWludDMyIEdldFJlcGVhdGVkVUludDMyKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIHVpbnQ2NCBHZXRSZXBlYXRlZFVJbnQ2NChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OworICBmbG9hdCAgR2V0UmVwZWF0ZWRGbG9hdCAoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKyAgZG91YmxlIEdldFJlcGVhdGVkRG91YmxlKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIGJvb2wgICBHZXRSZXBlYXRlZEJvb2wgIChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OworICBpbnQgICAgR2V0UmVwZWF0ZWRFbnVtICAoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKyAgY29uc3Qgc3RyaW5nICYgR2V0UmVwZWF0ZWRTdHJpbmcgKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CisgIGNvbnN0IE1lc3NhZ2VMaXRlJiBHZXRSZXBlYXRlZE1lc3NhZ2UoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKKworICB2b2lkIFNldFJlcGVhdGVkSW50MzIgKGludCBudW1iZXIsIGludCBpbmRleCwgaW50MzIgIHZhbHVlKTsKKyAgdm9pZCBTZXRSZXBlYXRlZEludDY0IChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIGludDY0ICB2YWx1ZSk7CisgIHZvaWQgU2V0UmVwZWF0ZWRVSW50MzIoaW50IG51bWJlciwgaW50IGluZGV4LCB1aW50MzIgdmFsdWUpOworICB2b2lkIFNldFJlcGVhdGVkVUludDY0KGludCBudW1iZXIsIGludCBpbmRleCwgdWludDY0IHZhbHVlKTsKKyAgdm9pZCBTZXRSZXBlYXRlZEZsb2F0IChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIGZsb2F0ICB2YWx1ZSk7CisgIHZvaWQgU2V0UmVwZWF0ZWREb3VibGUoaW50IG51bWJlciwgaW50IGluZGV4LCBkb3VibGUgdmFsdWUpOworICB2b2lkIFNldFJlcGVhdGVkQm9vbCAgKGludCBudW1iZXIsIGludCBpbmRleCwgYm9vbCAgIHZhbHVlKTsKKyAgdm9pZCBTZXRSZXBlYXRlZEVudW0gIChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIGludCAgICB2YWx1ZSk7CisgIHZvaWQgU2V0UmVwZWF0ZWRTdHJpbmcoaW50IG51bWJlciwgaW50IGluZGV4LCBjb25zdCBzdHJpbmcmIHZhbHVlKTsKKyAgc3RyaW5nICogTXV0YWJsZVJlcGVhdGVkU3RyaW5nIChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpOworICBNZXNzYWdlTGl0ZSogTXV0YWJsZVJlcGVhdGVkTWVzc2FnZShpbnQgbnVtYmVyLCBpbnQgaW5kZXgpOworCisjZGVmaW5lIGRlc2MgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yICAvLyBhdm9pZCBsaW5lIHdyYXBwaW5nCisgIHZvaWQgQWRkSW50MzIgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgaW50MzIgIHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBBZGRJbnQ2NCAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkLCBpbnQ2NCAgdmFsdWUsIGRlc2MpOworICB2b2lkIEFkZFVJbnQzMihpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBwYWNrZWQsIHVpbnQzMiB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgQWRkVUludDY0KGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgdWludDY0IHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBBZGRGbG9hdCAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkLCBmbG9hdCAgdmFsdWUsIGRlc2MpOworICB2b2lkIEFkZERvdWJsZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBwYWNrZWQsIGRvdWJsZSB2YWx1ZSwgZGVzYyk7CisgIHZvaWQgQWRkQm9vbCAgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgYm9vbCAgIHZhbHVlLCBkZXNjKTsKKyAgdm9pZCBBZGRFbnVtICAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkLCBpbnQgICAgdmFsdWUsIGRlc2MpOworICB2b2lkIEFkZFN0cmluZyhpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgZGVzYyk7CisgIHN0cmluZyAqIEFkZFN0cmluZyAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGRlc2MpOworICBNZXNzYWdlTGl0ZSogQWRkTWVzc2FnZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSwgZGVzYyk7CisgIE1lc3NhZ2VMaXRlKiBBZGRNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpOworI3VuZGVmIGRlc2MKKworICB2b2lkIFJlbW92ZUxhc3QoaW50IG51bWJlcik7CisgIHZvaWQgU3dhcEVsZW1lbnRzKGludCBudW1iZXIsIGludCBpbmRleDEsIGludCBpbmRleDIpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRPRE8oa2VudG9uKTogIEhhcmRjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFjY2Vzc29ycworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGltcGxlbWVudGluZyBtZXRob2RzIG9mIE1lc3NhZ2UKKyAgLy8KKyAgLy8gVGhlc2UgY291bGQgYWxsIGJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZSBvdGhlciBtZXRob2RzIG9mIHRoaXMKKyAgLy8gY2xhc3MsIGJ1dCBwcm92aWRpbmcgdGhlbSBoZXJlIGhlbHBzIGtlZXAgdGhlIGdlbmVyYXRlZCBjb2RlIHNpemUgZG93bi4KKworICB2b2lkIENsZWFyKCk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEV4dGVuc2lvblNldCYgb3RoZXIpOworICB2b2lkIFN3YXAoRXh0ZW5zaW9uU2V0KiBvdGhlcik7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworCisgIC8vIFBhcnNlcyBhIHNpbmdsZSBleHRlbnNpb24gZnJvbSB0aGUgaW5wdXQuICBUaGUgaW5wdXQgc2hvdWxkIHN0YXJ0IG91dAorICAvLyBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0YWcuICB8Y29udGFpbmluZ190eXBlfCBpcyB0aGUgZGVmYXVsdAorICAvLyBpbnN0YW5jZSBmb3IgdGhlIGNvbnRhaW5pbmcgbWVzc2FnZTsgaXQgaXMgdXNlZCBvbmx5IHRvIGxvb2sgdXAgdGhlCisgIC8vIGV4dGVuc2lvbiBieSBudW1iZXIuICBTZWUgUmVnaXN0ZXJFeHRlbnNpb24oKSwgYWJvdmUuICBVbmxpa2UgdGhlIG90aGVyCisgIC8vIG1ldGhvZHMgb2YgRXh0ZW5zaW9uU2V0LCB0aGlzIG9ubHkgd29ya3MgZm9yIGdlbmVyYXRlZCBtZXNzYWdlIHR5cGVzIC0tCisgIC8vIGl0IGxvb2tzIHVwIGV4dGVuc2lvbnMgcmVnaXN0ZXJlZCB1c2luZyBSZWdpc3RlckV4dGVuc2lvbigpLgorICBib29sIFBhcnNlRmllbGQodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uRmluZGVyKiBleHRlbnNpb25fZmluZGVyLAorICAgICAgICAgICAgICAgICAgRmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKTsKKworICAvLyBTcGVjaWZpYyB2ZXJzaW9ucyBmb3IgbGl0ZSBvciBmdWxsIG1lc3NhZ2VzIChjb25zdHJ1Y3RzIHRoZSBhcHByb3ByaWF0ZQorICAvLyBGaWVsZFNraXBwZXIgYXV0b21hdGljYWxseSkuCisgIGJvb2wgUGFyc2VGaWVsZCh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisgIGJvb2wgUGFyc2VGaWVsZEhlYXZ5KHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKworICAvLyBQYXJzZSBhbiBlbnRpcmUgbWVzc2FnZSBpbiBNZXNzYWdlU2V0IGZvcm1hdC4gIFN1Y2ggbWVzc2FnZXMgaGF2ZSBubworICAvLyBmaWVsZHMsIG9ubHkgZXh0ZW5zaW9ucy4KKyAgYm9vbCBQYXJzZU1lc3NhZ2VTZXQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcik7CisKKyAgLy8gU3BlY2lmaWMgdmVyc2lvbnMgZm9yIGxpdGUgb3IgZnVsbCBtZXNzYWdlcyAoY29uc3RydWN0cyB0aGUgYXBwcm9wcmlhdGUKKyAgLy8gRmllbGRTa2lwcGVyIGF1dG9tYXRpY2FsbHkpLgorICBib29sIFBhcnNlTWVzc2FnZVNldChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOworICBib29sIFBhcnNlTWVzc2FnZVNldEhlYXZ5KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisKKyAgLy8gV3JpdGUgYWxsIGV4dGVuc2lvbiBmaWVsZHMgd2l0aCBmaWVsZCBudW1iZXJzIGluIHRoZSByYW5nZQorICAvLyAgIFtzdGFydF9maWVsZF9udW1iZXIsIGVuZF9maWVsZF9udW1iZXIpCisgIC8vIHRvIHRoZSBvdXRwdXQgc3RyZWFtLCB1c2luZyB0aGUgY2FjaGVkIHNpemVzIGNvbXB1dGVkIHdoZW4gQnl0ZVNpemUoKSB3YXMKKyAgLy8gbGFzdCBjYWxsZWQuICBOb3RlIHRoYXQgdGhlIHJhbmdlIGJvdW5kcyBhcmUgaW5jbHVzaXZlLWV4Y2x1c2l2ZS4KKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW50IHN0YXJ0X2ZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZF9maWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKworICAvLyBTYW1lIGFzIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcywgYnV0IHdpdGhvdXQgYW55IGJvdW5kcyBjaGVja2luZy4KKyAgLy8gVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRhcmdldCBoYXMgc3VmZmljaWVudCBjYXBhY2l0eSBmb3IgdGhlCisgIC8vIHNlcmlhbGl6ZWQgZXh0ZW5zaW9ucy4KKyAgLy8KKyAgLy8gUmV0dXJucyBhIHBvaW50ZXIgcGFzdCB0aGUgbGFzdCB3cml0dGVuIGJ5dGUuCisgIHVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGludCBzdGFydF9maWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRfZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSBjb25zdDsKKworICAvLyBMaWtlIGFib3ZlIGJ1dCBzZXJpYWxpemVzIGluIE1lc3NhZ2VTZXQgZm9ybWF0LgorICB2b2lkIFNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXRoQ2FjaGVkU2l6ZXMoaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICB1aW50OCogU2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplc1RvQXJyYXkodWludDgqIHRhcmdldCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgdG90YWwgc2VyaWFsaXplZCBzaXplIG9mIGFsbCB0aGUgZXh0ZW5zaW9ucy4KKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisKKyAgLy8gTGlrZSBCeXRlU2l6ZSgpIGJ1dCB1c2VzIE1lc3NhZ2VTZXQgZm9ybWF0LgorICBpbnQgTWVzc2FnZVNldEJ5dGVTaXplKCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyAoYW4gZXN0aW1hdGUgb2YpIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3Igc3RvcmluZyB0aGUKKyAgLy8gZXh0ZW5zaW9ucyBpbiBtZW1vcnksIGV4Y2x1ZGluZyBzaXplb2YoKnRoaXMpLiAgSWYgdGhlIEV4dGVuc2lvblNldCBpcworICAvLyBmb3IgYSBsaXRlIG1lc3NhZ2UgKGFuZCB0aHVzIHBvc3NpYmx5IGNvbnRhaW5zIGxpdGUgbWVzc2FnZXMpLCB0aGUgcmVzdWx0cworICAvLyBhcmUgdW5kZWZpbmVkIChtaWdodCB3b3JrLCBtaWdodCBjcmFzaCwgbWlnaHQgY29ycnVwdCBkYXRhLCBtaWdodCBub3QgZXZlbgorICAvLyBiZSBsaW5rZWQgaW4pLiAgSXQncyB1cCB0byB0aGUgcHJvdG9jb2wgY29tcGlsZXIgdG8gYXZvaWQgY2FsbGluZyB0aGlzIG9uCisgIC8vIHN1Y2ggRXh0ZW5zaW9uU2V0cyAoZWFzeSBlbm91Z2ggc2luY2UgbGl0ZSBtZXNzYWdlcyBkb24ndCBpbXBsZW1lbnQKKyAgLy8gU3BhY2VVc2VkKCkpLgorICBpbnQgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0OworCisgcHJpdmF0ZToKKworICBzdHJ1Y3QgRXh0ZW5zaW9uIHsKKyAgICB1bmlvbiB7CisgICAgICBpbnQzMiAgICAgICAgaW50MzJfdmFsdWU7CisgICAgICBpbnQ2NCAgICAgICAgaW50NjRfdmFsdWU7CisgICAgICB1aW50MzIgICAgICAgdWludDMyX3ZhbHVlOworICAgICAgdWludDY0ICAgICAgIHVpbnQ2NF92YWx1ZTsKKyAgICAgIGZsb2F0ICAgICAgICBmbG9hdF92YWx1ZTsKKyAgICAgIGRvdWJsZSAgICAgICBkb3VibGVfdmFsdWU7CisgICAgICBib29sICAgICAgICAgYm9vbF92YWx1ZTsKKyAgICAgIGludCAgICAgICAgICBlbnVtX3ZhbHVlOworICAgICAgc3RyaW5nKiAgICAgIHN0cmluZ192YWx1ZTsKKyAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlX3ZhbHVlOworCisgICAgICBSZXBlYXRlZEZpZWxkICAgPGludDMyICAgICAgPiogcmVwZWF0ZWRfaW50MzJfdmFsdWU7CisgICAgICBSZXBlYXRlZEZpZWxkICAgPGludDY0ICAgICAgPiogcmVwZWF0ZWRfaW50NjRfdmFsdWU7CisgICAgICBSZXBlYXRlZEZpZWxkICAgPHVpbnQzMiAgICAgPiogcmVwZWF0ZWRfdWludDMyX3ZhbHVlOworICAgICAgUmVwZWF0ZWRGaWVsZCAgIDx1aW50NjQgICAgID4qIHJlcGVhdGVkX3VpbnQ2NF92YWx1ZTsKKyAgICAgIFJlcGVhdGVkRmllbGQgICA8ZmxvYXQgICAgICA+KiByZXBlYXRlZF9mbG9hdF92YWx1ZTsKKyAgICAgIFJlcGVhdGVkRmllbGQgICA8ZG91YmxlICAgICA+KiByZXBlYXRlZF9kb3VibGVfdmFsdWU7CisgICAgICBSZXBlYXRlZEZpZWxkICAgPGJvb2wgICAgICAgPiogcmVwZWF0ZWRfYm9vbF92YWx1ZTsKKyAgICAgIFJlcGVhdGVkRmllbGQgICA8aW50ICAgICAgICA+KiByZXBlYXRlZF9lbnVtX3ZhbHVlOworICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmcgICAgID4qIHJlcGVhdGVkX3N0cmluZ192YWx1ZTsKKyAgICAgIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+KiByZXBlYXRlZF9tZXNzYWdlX3ZhbHVlOworICAgIH07CisKKyAgICBGaWVsZFR5cGUgdHlwZTsKKyAgICBib29sIGlzX3JlcGVhdGVkOworCisgICAgLy8gRm9yIHNpbmd1bGFyIHR5cGVzLCBpbmRpY2F0ZXMgaWYgdGhlIGV4dGVuc2lvbiBpcyAiY2xlYXJlZCIuICBUaGlzCisgICAgLy8gaGFwcGVucyB3aGVuIGFuIGV4dGVuc2lvbiBpcyBzZXQgYW5kIHRoZW4gbGF0ZXIgY2xlYXJlZCBieSB0aGUgY2FsbGVyLgorICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgRXh0ZW5zaW9uIG9iamVjdCBhcm91bmQgZm9yIHJldXNlLCBzbyBpbnN0ZWFkIG9mCisgICAgLy8gcmVtb3ZpbmcgaXQgZnJvbSB0aGUgbWFwLCB3ZSBqdXN0IHNldCBpc19jbGVhcmVkID0gdHJ1ZS4gIFRoaXMgaGFzIG5vCisgICAgLy8gbWVhbmluZyBmb3IgcmVwZWF0ZWQgdHlwZXM7IGZvciB0aG9zZSwgdGhlIHNpemUgb2YgdGhlIFJlcGVhdGVkRmllbGQKKyAgICAvLyBzaW1wbHkgYmVjb21lcyB6ZXJvIHdoZW4gY2xlYXJlZC4KKyAgICBib29sIGlzX2NsZWFyZWQ7CisKKyAgICAvLyBGb3IgcmVwZWF0ZWQgdHlwZXMsIHRoaXMgaW5kaWNhdGVzIGlmIHRoZSBbcGFja2VkPXRydWVdIG9wdGlvbiBpcyBzZXQuCisgICAgYm9vbCBpc19wYWNrZWQ7CisKKyAgICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyBleHRlbnNpb24sIGlmIG9uZSBleGlzdHMgYW5kIGlzIGtub3duLiAgTWF5IGJlCisgICAgLy8gTlVMTC4gIE11c3Qgbm90IGJlIE5VTEwgaWYgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBleHRlbnNpb24gZG9lcyBub3QKKyAgICAvLyBsaXZlIGluIHRoZSBzYW1lIHBvb2wgYXMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBjb250YWluaW5nIHR5cGUuCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yOworCisgICAgLy8gRm9yIHBhY2tlZCBmaWVsZHMsIHRoZSBzaXplIG9mIHRoZSBwYWNrZWQgZGF0YSBpcyByZWNvcmRlZCBoZXJlIHdoZW4KKyAgICAvLyBCeXRlU2l6ZSgpIGlzIGNhbGxlZCB0aGVuIHVzZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24uCisgICAgLy8gVE9ETyhrZW50b24pOiAgVXNlIGF0b21pYzxpbnQ+IHdoZW4gQysrIHN1cHBvcnRzIGl0LgorICAgIG11dGFibGUgaW50IGNhY2hlZF9zaXplOworCisgICAgLy8gU29tZSBoZWxwZXIgbWV0aG9kcyBmb3Igb3BlcmF0aW9ucyBvbiBhIHNpbmdsZSBFeHRlbnNpb24uCisgICAgdm9pZCBTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplcygKKyAgICAgICAgaW50IG51bWJlciwKKyAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICAgIHVpbnQ4KiBTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgICAgIGludCBudW1iZXIsCisgICAgICAgIHVpbnQ4KiB0YXJnZXQpIGNvbnN0OworICAgIHZvaWQgU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXMoCisgICAgICAgIGludCBudW1iZXIsCisgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgICB1aW50OCogU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgICBpbnQgbnVtYmVyLAorICAgICAgICB1aW50OCogdGFyZ2V0KSBjb25zdDsKKyAgICBpbnQgQnl0ZVNpemUoaW50IG51bWJlcikgY29uc3Q7CisgICAgaW50IE1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoaW50IG51bWJlcikgY29uc3Q7CisgICAgdm9pZCBDbGVhcigpOworICAgIGludCBHZXRTaXplKCkgY29uc3Q7CisgICAgdm9pZCBGcmVlKCk7CisgICAgaW50IFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdDsKKyAgfTsKKworCisgIC8vIEdldHMgdGhlIGV4dGVuc2lvbiB3aXRoIHRoZSBnaXZlbiBudW1iZXIsIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90CisgIC8vIGFscmVhZHkgZXhpc3QuICBSZXR1cm5zIHRydWUgaWYgdGhlIGV4dGVuc2lvbiBkaWQgbm90IGFscmVhZHkgZXhpc3QuCisgIGJvb2wgTWF5YmVOZXdFeHRlbnNpb24oaW50IG51bWJlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbioqIHJlc3VsdCk7CisKKyAgLy8gUGFyc2UgYSBzaW5nbGUgTWVzc2FnZVNldCBpdGVtIC0tIGNhbGxlZCBqdXN0IGFmdGVyIHRoZSBpdGVtIGdyb3VwIHN0YXJ0CisgIC8vIHRhZyBoYXMgYmVlbiByZWFkLgorICBib29sIFBhcnNlTWVzc2FnZVNldEl0ZW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uRmluZGVyKiBleHRlbnNpb25fZmluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKTsKKworCisgIC8vIEhhY2s6ICBSZXBlYXRlZFB0ckZpZWxkQmFzZSBkZWNsYXJlcyBFeHRlbnNpb25TZXQgYXMgYSBmcmllbmQuICBUaGlzCisgIC8vICAgZnJpZW5kc2hpcCBzaG91bGQgYXV0b21hdGljYWxseSBleHRlbmQgdG8gRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb24sIGJ1dAorICAvLyAgIHVuZm9ydHVuYXRlbHkgc29tZSBvbGRlciBjb21waWxlcnMgKGUuZy4gR0NDIDMuNC40KSBkbyBub3QgaW1wbGVtZW50IHRoaXMKKyAgLy8gICBjb3JyZWN0bHkuICBTbywgd2UgbXVzdCBwcm92aWRlIGhlbHBlcnMgZm9yIGNhbGxpbmcgbWV0aG9kcyBvZiB0aGF0CisgIC8vICAgY2xhc3MuCisKKyAgLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorICBzdGF0aWMgaW5saW5lIGludCBSZXBlYXRlZE1lc3NhZ2VfU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigKKyAgICAgIFJlcGVhdGVkUHRyRmllbGRCYXNlKiBmaWVsZCk7CisKKyAgLy8gVGhlIEV4dGVuc2lvbiBzdHJ1Y3QgaXMgc21hbGwgZW5vdWdoIHRvIGJlIHBhc3NlZCBieSB2YWx1ZSwgc28gd2UgdXNlIGl0CisgIC8vIGRpcmVjdGx5IGFzIHRoZSB2YWx1ZSB0eXBlIGluIHRoZSBtYXAgcmF0aGVyIHRoYW4gdXNlIHBvaW50ZXJzLiAgV2UgdXNlCisgIC8vIGEgbWFwIHJhdGhlciB0aGFuIGhhc2hfbWFwIGhlcmUgYmVjYXVzZSB3ZSBleHBlY3QgbW9zdCBFeHRlbnNpb25TZXRzIHdpbGwKKyAgLy8gb25seSBjb250YWluIGEgc21hbGwgbnVtYmVyIG9mIGV4dGVuc2lvbnMgd2hlcmVhcyBoYXNoX21hcCBpcyBvcHRpbWl6ZWQKKyAgLy8gZm9yIDEwMCBlbGVtZW50cyBvciBtb3JlLiAgQWxzbywgd2Ugd2FudCBBcHBlbmRUb0xpc3QoKSB0byBvcmRlciBmaWVsZHMKKyAgLy8gYnkgZmllbGQgbnVtYmVyLgorICBtYXA8aW50LCBFeHRlbnNpb24+IGV4dGVuc2lvbnNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFeHRlbnNpb25TZXQpOworfTsKKworLy8gVGhlc2UgYXJlIGp1c3QgZm9yIGNvbnZlbmllbmNlLi4uCitpbmxpbmUgdm9pZCBFeHRlbnNpb25TZXQ6OlNldFN0cmluZyhpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgTXV0YWJsZVN0cmluZyhudW1iZXIsIHR5cGUsIGRlc2NyaXB0b3IpLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRXh0ZW5zaW9uU2V0OjpTZXRSZXBlYXRlZFN0cmluZyhpbnQgbnVtYmVyLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgTXV0YWJsZVJlcGVhdGVkU3RyaW5nKG51bWJlciwgaW5kZXgpLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHZvaWQgRXh0ZW5zaW9uU2V0OjpBZGRTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIEFkZFN0cmluZyhudW1iZXIsIHR5cGUsIGRlc2NyaXB0b3IpLT5hc3NpZ24odmFsdWUpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBHbHVlIGZvciBnZW5lcmF0ZWQgZXh0ZW5zaW9uIGFjY2Vzc29ycworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZW1wbGF0ZSBtYWdpYworCisvLyBGaXJzdCB3ZSBoYXZlIGEgc2V0IG9mIGNsYXNzZXMgcmVwcmVzZW50aW5nICJ0eXBlIHRyYWl0cyIgZm9yIGRpZmZlcmVudAorLy8gZmllbGQgdHlwZXMuICBBIHR5cGUgdHJhaXRzIGNsYXNzIGtub3dzIGhvdyB0byBpbXBsZW1lbnQgYmFzaWMgYWNjZXNzb3JzCisvLyBmb3IgZXh0ZW5zaW9ucyBvZiBhIHBhcnRpY3VsYXIgdHlwZSBnaXZlbiBhbiBFeHRlbnNpb25TZXQuICBUaGUgc2lnbmF0dXJlCisvLyBmb3IgYSB0eXBlIHRyYWl0cyBjbGFzcyBsb29rcyBsaWtlIHRoaXM6CisvLworLy8gICBjbGFzcyBUeXBlVHJhaXRzIHsKKy8vICAgIHB1YmxpYzoKKy8vICAgICB0eXBlZGVmID8gQ29uc3RUeXBlOworLy8gICAgIHR5cGVkZWYgPyBNdXRhYmxlVHlwZTsKKy8vCisvLyAgICAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0KTsKKy8vICAgICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0KGludCBudW1iZXIsIENvbnN0VHlwZSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpOworLy8gICAgIHN0YXRpYyBpbmxpbmUgTXV0YWJsZVR5cGUgTXV0YWJsZShpbnQgbnVtYmVyLCBFeHRlbnNpb25TZXQqIHNldCk7CisvLworLy8gICAgIC8vIFZhcmlhbnRzIGZvciByZXBlYXRlZCBmaWVsZHMuCisvLyAgICAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOworLy8gICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgaW50IGluZGV4LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7CisvLyAgICAgc3RhdGljIGlubGluZSBNdXRhYmxlVHlwZSBNdXRhYmxlKGludCBudW1iZXIsIGludCBpbmRleCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpOworLy8gICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBBZGQoaW50IG51bWJlciwgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7CisvLyAgICAgc3RhdGljIGlubGluZSBNdXRhYmxlVHlwZSBBZGQoaW50IG51bWJlciwgRXh0ZW5zaW9uU2V0KiBzZXQpOworLy8gICB9OworLy8KKy8vIE5vdCBhbGwgb2YgdGhlc2UgbWV0aG9kcyBtYWtlIHNlbnNlIGZvciBhbGwgZmllbGQgdHlwZXMuICBGb3IgZXhhbXBsZSwgdGhlCisvLyAiTXV0YWJsZSIgbWV0aG9kcyBvbmx5IG1ha2Ugc2Vuc2UgZm9yIHN0cmluZ3MgYW5kIG1lc3NhZ2VzLCBhbmQgdGhlCisvLyByZXBlYXRlZCBtZXRob2RzIG9ubHkgbWFrZSBzZW5zZSBmb3IgcmVwZWF0ZWQgdHlwZXMuICBTbywgZWFjaCB0eXBlCisvLyB0cmFpdHMgY2xhc3MgaW1wbGVtZW50cyBvbmx5IHRoZSBzZXQgb2YgbWV0aG9kcyBmcm9tIHRoaXMgc2lnbmF0dXJlIHRoYXQgaXQKKy8vIGFjdHVhbGx5IHN1cHBvcnRzLiAgVGhpcyB3aWxsIGNhdXNlIGEgY29tcGlsZXIgZXJyb3IgaWYgdGhlIHVzZXIgdHJpZXMgdG8KKy8vIGFjY2VzcyBhbiBleHRlbnNpb24gdXNpbmcgYSBtZXRob2QgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIGl0cyB0eXBlLgorLy8gRm9yIGV4YW1wbGUsIGlmICJmb28iIGlzIGFuIGV4dGVuc2lvbiBvZiB0eXBlICJvcHRpb25hbCBpbnQzMiIsIHRoZW4gaWYgeW91CisvLyB0cnkgdG8gd3JpdGUgY29kZSBsaWtlOgorLy8gICBteV9tZXNzYWdlLk11dGFibGVFeHRlbnNpb24oZm9vKQorLy8geW91IHdpbGwgZ2V0IGEgY29tcGlsZSBlcnJvciBiZWNhdXNlIFByaW1pdGl2ZVR5cGVUcmFpdHM8aW50MzI+IGRvZXMgbm90CisvLyBoYXZlIGEgIk11dGFibGUoKSIgbWV0aG9kLgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmltaXRpdmVUeXBlVHJhaXRzCisKKy8vIFNpbmNlIHRoZSBFeHRlbnNpb25TZXQgaGFzIGRpZmZlcmVudCBtZXRob2RzIGZvciBlYWNoIHByaW1pdGl2ZSB0eXBlLAorLy8gd2UgbXVzdCBleHBsaWNpdGx5IGRlZmluZSB0aGUgbWV0aG9kcyBvZiB0aGUgdHlwZSB0cmFpdHMgY2xhc3MgZm9yIGVhY2gKKy8vIGtub3duIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NsYXNzIFByaW1pdGl2ZVR5cGVUcmFpdHMgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUeXBlIENvbnN0VHlwZTsKKworICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFR5cGUgZGVmYXVsdF92YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2NsYXNzIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOworCisgIHN0YXRpYyBpbmxpbmUgVHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsIGludCBpbmRleCk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgaW50IGluZGV4LCBUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBBZGQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQsIFR5cGUgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KTsKK307CisKKyNkZWZpbmUgUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKFRZUEUsIE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIFRZUEUgUHJpbWl0aXZlVHlwZVRyYWl0czxUWVBFPjo6R2V0KCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwgVFlQRSBkZWZhdWx0X3ZhbHVlKSB7ICAgICAgICAgICAgIFwKKyAgcmV0dXJuIHNldC5HZXQjI01FVEhPRChudW1iZXIsIGRlZmF1bHRfdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIHZvaWQgUHJpbWl0aXZlVHlwZVRyYWl0czxUWVBFPjo6U2V0KCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwgVFlQRSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsgICAgIFwKKyAgc2V0LT5TZXQjI01FVEhPRChudW1iZXIsIGZpZWxkX3R5cGUsIHZhbHVlLCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIFRZUEUgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPFRZUEU+OjpHZXQoICAgICAgICAgICAgIFwKKyAgICBpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwgaW50IGluZGV4KSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIHNldC5HZXRSZXBlYXRlZCMjTUVUSE9EKG51bWJlciwgaW5kZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIHZvaWQgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPFRZUEU+OjpTZXQoICAgICAgICAgICAgIFwKKyAgICBpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIFRZUEUgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KSB7ICAgICAgICAgICAgICAgIFwKKyAgc2V0LT5TZXRSZXBlYXRlZCMjTUVUSE9EKG51bWJlciwgaW5kZXgsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIHZvaWQgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPFRZUEU+OjpBZGQoICAgICAgICAgICAgIFwKKyAgICBpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwgYm9vbCBpc19wYWNrZWQsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc2V0LT5BZGQjI01FVEhPRChudW1iZXIsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZCwgdmFsdWUsIE5VTEwpOyAgICAgICAgICAgIFwKK30KKworUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCBpbnQzMiwgIEludDMyKQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCBpbnQ2NCwgIEludDY0KQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKHVpbnQzMiwgVUludDMyKQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKHVpbnQ2NCwgVUludDY0KQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCBmbG9hdCwgIEZsb2F0KQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKGRvdWJsZSwgRG91YmxlKQorUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCAgYm9vbCwgICBCb29sKQorCisjdW5kZWYgUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0cmluZ1R5cGVUcmFpdHMKKworLy8gU3RyaW5ncyBzdXBwb3J0IGJvdGggU2V0KCkgYW5kIE11dGFibGUoKS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTdHJpbmdUeXBlVHJhaXRzIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgY29uc3Qgc3RyaW5nJiBDb25zdFR5cGU7CisgIHR5cGVkZWYgc3RyaW5nKiBNdXRhYmxlVHlwZTsKKworICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0cmluZyYgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VHlwZSBkZWZhdWx0X3ZhbHVlKSB7CisgICAgcmV0dXJuIHNldC5HZXRTdHJpbmcobnVtYmVyLCBkZWZhdWx0X3ZhbHVlKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0KGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgc2V0LT5TZXRTdHJpbmcobnVtYmVyLCBmaWVsZF90eXBlLCB2YWx1ZSwgTlVMTCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBzdHJpbmcqIE11dGFibGUoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgcmV0dXJuIHNldC0+TXV0YWJsZVN0cmluZyhudW1iZXIsIGZpZWxkX3R5cGUsIE5VTEwpOworICB9Cit9OworCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgUmVwZWF0ZWRTdHJpbmdUeXBlVHJhaXRzIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgY29uc3Qgc3RyaW5nJiBDb25zdFR5cGU7CisgIHR5cGVkZWYgc3RyaW5nKiBNdXRhYmxlVHlwZTsKKworICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0cmluZyYgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICAgIHJldHVybiBzZXQuR2V0UmVwZWF0ZWRTdHJpbmcobnVtYmVyLCBpbmRleCk7CisgIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIFNldChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICBzZXQtPlNldFJlcGVhdGVkU3RyaW5nKG51bWJlciwgaW5kZXgsIHZhbHVlKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIHN0cmluZyogTXV0YWJsZShpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgcmV0dXJuIHNldC0+TXV0YWJsZVJlcGVhdGVkU3RyaW5nKG51bWJlciwgaW5kZXgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBBZGQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmlzX3BhY2tlZCovLCBjb25zdCBzdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgc2V0LT5BZGRTdHJpbmcobnVtYmVyLCBmaWVsZF90eXBlLCB2YWx1ZSwgTlVMTCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBzdHJpbmcqIEFkZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIHJldHVybiBzZXQtPkFkZFN0cmluZyhudW1iZXIsIGZpZWxkX3R5cGUsIE5VTEwpOworICB9Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnVtVHlwZVRyYWl0cworCisvLyBFeHRlbnNpb25TZXQgcmVwcmVzZW50cyBlbnVtcyB1c2luZyBpbnRlZ2VycyBpbnRlcm5hbGx5LCBzbyB3ZSBoYXZlIHRvCisvLyBzdGF0aWNfY2FzdCBhcm91bmQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZSwgYm9vbCBJc1ZhbGlkKGludCk+CitjbGFzcyBFbnVtVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOworCisgIHN0YXRpYyBpbmxpbmUgQ29uc3RUeXBlIEdldChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VHlwZSBkZWZhdWx0X3ZhbHVlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KHNldC5HZXRFbnVtKG51bWJlciwgZGVmYXVsdF92YWx1ZSkpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIEdPT0dMRV9EQ0hFQ0soSXNWYWxpZCh2YWx1ZSkpOworICAgIHNldC0+U2V0RW51bShudW1iZXIsIGZpZWxkX3R5cGUsIHZhbHVlLCBOVUxMKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUsIGJvb2wgSXNWYWxpZChpbnQpPgorY2xhc3MgUmVwZWF0ZWRFbnVtVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOworCisgIHN0YXRpYyBpbmxpbmUgQ29uc3RUeXBlIEdldChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwgaW50IGluZGV4KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KHNldC5HZXRSZXBlYXRlZEVudW0obnVtYmVyLCBpbmRleCkpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VHlwZSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICBHT09HTEVfRENIRUNLKElzVmFsaWQodmFsdWUpKTsKKyAgICBzZXQtPlNldFJlcGVhdGVkRW51bShudW1iZXIsIGluZGV4LCB2YWx1ZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIEFkZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BhY2tlZCwgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIEdPT0dMRV9EQ0hFQ0soSXNWYWxpZCh2YWx1ZSkpOworICAgIHNldC0+QWRkRW51bShudW1iZXIsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZCwgdmFsdWUsIE5VTEwpOworICB9Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXNzYWdlVHlwZVRyYWl0cworCisvLyBFeHRlbnNpb25TZXQgZ3VhcmFudGVlcyB0aGF0IHdoZW4gbWFuaXB1bGF0aW5nIGV4dGVuc2lvbnMgd2l0aCBtZXNzYWdlCisvLyB0eXBlcywgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgd2lsbCBiZSB0aGUgY29tcGlsZWQtaW4gY2xhc3MgcmVwcmVzZW50aW5nCisvLyB0aGF0IHR5cGUuICBTbywgd2UgY2FuIHN0YXRpY19jYXN0IGRvd24gdG8gdGhlIGV4YWN0IHR5cGUgd2UgZXhwZWN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitjbGFzcyBNZXNzYWdlVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIGNvbnN0IFR5cGUmIENvbnN0VHlwZTsKKyAgdHlwZWRlZiBUeXBlKiBNdXRhYmxlVHlwZTsKKworICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFR5cGUgZGVmYXVsdF92YWx1ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBUeXBlJj4oCisgICAgICAgIHNldC5HZXRNZXNzYWdlKG51bWJlciwgZGVmYXVsdF92YWx1ZSkpOworICB9CisgIHN0YXRpYyBpbmxpbmUgTXV0YWJsZVR5cGUgTXV0YWJsZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGUqPigKKyAgICAgIHNldC0+TXV0YWJsZU1lc3NhZ2UobnVtYmVyLCBmaWVsZF90eXBlLCBUeXBlOjpkZWZhdWx0X2luc3RhbmNlKCksIE5VTEwpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitjbGFzcyBSZXBlYXRlZE1lc3NhZ2VUeXBlVHJhaXRzIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgY29uc3QgVHlwZSYgQ29uc3RUeXBlOworICB0eXBlZGVmIFR5cGUqIE11dGFibGVUeXBlOworCisgIHN0YXRpYyBpbmxpbmUgQ29uc3RUeXBlIEdldChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwgaW50IGluZGV4KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFR5cGUmPihzZXQuR2V0UmVwZWF0ZWRNZXNzYWdlKG51bWJlciwgaW5kZXgpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIE11dGFibGUoaW50IG51bWJlciwgaW50IGluZGV4LCBFeHRlbnNpb25TZXQqIHNldCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUeXBlKj4oc2V0LT5NdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKG51bWJlciwgaW5kZXgpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIEFkZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZSo+KAorICAgICAgICBzZXQtPkFkZE1lc3NhZ2UobnVtYmVyLCBmaWVsZF90eXBlLCBUeXBlOjpkZWZhdWx0X2luc3RhbmNlKCksIE5VTEwpKTsKKyAgfQorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXh0ZW5zaW9uSWRlbnRpZmllcgorCisvLyBUaGlzIGlzIHRoZSB0eXBlIG9mIGFjdHVhbCBleHRlbnNpb24gb2JqZWN0cy4gIEUuZy4gaWYgeW91IGhhdmU6CisvLyAgIGV4dGVuZHMgRm9vIHdpdGggb3B0aW9uYWwgaW50MzIgYmFyID0gMTIzNDsKKy8vIHRoZW4gImJhciIgd2lsbCBiZSBkZWZpbmVkIGluIEMrKyBhczoKKy8vICAgRXh0ZW5zaW9uSWRlbnRpZmllcjxGb28sIFByaW1pdGl2ZVR5cGVUcmFpdHM8aW50MzI+LCAxLCBmYWxzZT4gYmFyKDEyMzQpOworLy8KKy8vIE5vdGUgdGhhdCB3ZSBjb3VsZCwgaW4gdGhlb3J5LCBzdXBwbHkgdGhlIGZpZWxkIG51bWJlciBhcyBhIHRlbXBsYXRlCisvLyBwYXJhbWV0ZXIsIGFuZCB0aHVzIG1ha2UgYW4gaW5zdGFuY2Ugb2YgRXh0ZW5zaW9uSWRlbnRpZmllciBoYXZlIG5vCisvLyBhY3R1YWwgY29udGVudHMuICBIb3dldmVyLCBpZiB3ZSBkaWQgdGhhdCwgdGhlbiB1c2luZyBhdCBleHRlbnNpb24KKy8vIGlkZW50aWZpZXIgd291bGQgbm90IG5lY2Vzc2FyaWx5IGNhdXNlIHRoZSBjb21waWxlciB0byBvdXRwdXQgYW55IHNvcnQKKy8vIG9mIHJlZmVyZW5jZSB0byBhbnkgc2ltcGxlIGRlZmluZWQgaW4gdGhlIGV4dGVuc2lvbidzIC5wYi5vIGZpbGUuICBTb21lCisvLyBsaW5rZXJzIHdpbGwgYWN0dWFsbHkgZHJvcCBvYmplY3QgZmlsZXMgdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgcmVmZXJlbmNlZCwKKy8vIGJ1dCB0aGF0IHdvdWxkIGJlIGJhZCBiZWNhdXNlIGl0IHdvdWxkIGNhdXNlIHRoaXMgZXh0ZW5zaW9uIHRvIG5vdCBiZQorLy8gcmVnaXN0ZXJlZCBhdCBzdGF0aWMgaW5pdGlhbGl6YXRpb24sIGFuZCB0aGVyZWZvcmUgdXNpbmcgaXQgd291bGQgY3Jhc2guCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFeHRlbmRlZVR5cGUsIHR5cGVuYW1lIFR5cGVUcmFpdHNUeXBlLAorICAgICAgICAgIEZpZWxkVHlwZSBmaWVsZF90eXBlLCBib29sIGlzX3BhY2tlZD4KK2NsYXNzIEV4dGVuc2lvbklkZW50aWZpZXIgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBUeXBlVHJhaXRzVHlwZSBUeXBlVHJhaXRzOworICB0eXBlZGVmIEV4dGVuZGVlVHlwZSBFeHRlbmRlZTsKKworICBFeHRlbnNpb25JZGVudGlmaWVyKGludCBudW1iZXIsIHR5cGVuYW1lIFR5cGVUcmFpdHM6OkNvbnN0VHlwZSBkZWZhdWx0X3ZhbHVlKQorICAgICAgOiBudW1iZXJfKG51bWJlciksIGRlZmF1bHRfdmFsdWVfKGRlZmF1bHRfdmFsdWUpIHt9CisgIGlubGluZSBpbnQgbnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbnVtYmVyXzsgfQorICB0eXBlbmFtZSBUeXBlVHJhaXRzOjpDb25zdFR5cGUgZGVmYXVsdF92YWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZV87CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IGludCBudW1iZXJfOworICB0eXBlbmFtZSBUeXBlVHJhaXRzOjpDb25zdFR5cGUgZGVmYXVsdF92YWx1ZV87Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHZW5lcmF0ZWQgYWNjZXNzb3JzCisKKy8vIFRoaXMgbWFjcm8gc2hvdWxkIGJlIGV4cGFuZGVkIGluIHRoZSBjb250ZXh0IG9mIGEgZ2VuZXJhdGVkIHR5cGUgd2hpY2gKKy8vIGhhcyBleHRlbnNpb25zLgorLy8KKy8vIFdlIHVzZSAiX3Byb3RvX1R5cGVUcmFpdHMiIGFzIGEgdHlwZSBuYW1lIGJlbG93IGJlY2F1c2UgIlR5cGVUcmFpdHMiCisvLyBjYXVzZXMgcHJvYmxlbXMgaWYgdGhlIGNsYXNzIGhhcyBhIG5lc3RlZCBtZXNzYWdlIG9yIGVudW0gdHlwZSB3aXRoIHRoYXQKKy8vIG5hbWUgYW5kICJfVHlwZVRyYWl0cyIgaXMgdGVjaG5pY2FsbHkgcmVzZXJ2ZWQgZm9yIHRoZSBDKysgbGlicmFyeSBzaW5jZQorLy8gaXQgc3RhcnRzIHdpdGggYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieSBhIGNhcGl0YWwgbGV0dGVyLgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhDTEFTU05BTUUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBIYXMsIFNpemUsIENsZWFyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIGZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIGJvb2wgSGFzRXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZD4mIGlkKSBjb25zdCB7ICAgICBcCisgICAgcmV0dXJuIF9leHRlbnNpb25zXy5IYXMoaWQubnVtYmVyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdm9pZCBDbGVhckV4dGVuc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgZmllbGRfdHlwZSwgaXNfcGFja2VkPiYgaWQpIHsgICAgICAgICAgIFwKKyAgICBfZXh0ZW5zaW9uc18uQ2xlYXJFeHRlbnNpb24oaWQubnVtYmVyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBmaWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIGlzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBpbnQgRXh0ZW5zaW9uU2l6ZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBmaWVsZF90eXBlLCBpc19wYWNrZWQ+JiBpZCkgY29uc3QgeyAgICAgXAorICAgIHJldHVybiBfZXh0ZW5zaW9uc18uRXh0ZW5zaW9uU2l6ZShpZC5udW1iZXIoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBTaW5ndWxhciBhY2Nlc3NvcnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIGZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZD4mIGlkKSBjb25zdCB7ICAgICBcCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXQoaWQubnVtYmVyKCksIF9leHRlbnNpb25zXywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuZGVmYXVsdF92YWx1ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oICAgICAgICAgICAgXAorICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgZmllbGRfdHlwZSwgaXNfcGFja2VkPiYgaWQpIHsgICAgICAgICAgIFwKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGUoaWQubnVtYmVyKCksIGZpZWxkX3R5cGUsICZfZXh0ZW5zaW9uc18pO1wKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBmaWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIGlzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBmaWVsZF90eXBlLCBpc19wYWNrZWQ+JiBpZCwgICAgICAgICAgICAgXAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OkNvbnN0VHlwZSB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIGZpZWxkX3R5cGUsIHZhbHVlLCAmX2V4dGVuc2lvbnNfKTsgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBSZXBlYXRlZCBhY2Nlc3NvcnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIGZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZD4mIGlkLCAgICAgICAgICAgICBcCisgICAgICBpbnQgaW5kZXgpIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXQoaWQubnVtYmVyKCksIF9leHRlbnNpb25zXywgaW5kZXgpOyAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oICAgICAgICAgICAgXAorICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgZmllbGRfdHlwZSwgaXNfcGFja2VkPiYgaWQsICAgICAgICAgICAgIFwKKyAgICAgIGludCBpbmRleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGUoaWQubnVtYmVyKCksIGluZGV4LCAmX2V4dGVuc2lvbnNfKTsgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBmaWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIGlzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBmaWVsZF90eXBlLCBpc19wYWNrZWQ+JiBpZCwgICAgICAgICAgICAgXAorICAgICAgaW50IGluZGV4LCB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6Q29uc3RUeXBlIHZhbHVlKSB7ICAgICAgICAgICAgICAgXAorICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIGluZGV4LCB2YWx1ZSwgJl9leHRlbnNpb25zXyk7ICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIGZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlVHlwZSBBZGRFeHRlbnNpb24oICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZD4mIGlkKSB7ICAgICAgICAgICBcCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIGZpZWxkX3R5cGUsICZfZXh0ZW5zaW9uc18pOyAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdm9pZCBBZGRFeHRlbnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgZmllbGRfdHlwZSwgaXNfcGFja2VkPiYgaWQsICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpDb25zdFR5cGUgdmFsdWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBmaWVsZF90eXBlLCBpc19wYWNrZWQsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAmX2V4dGVuc2lvbnNfKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fU0VUX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF9oZWF2eS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwZmQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MKQEAgLTAsMCArMSw0NTcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIENvbnRhaW5zIG1ldGhvZHMgZGVmaW5lZCBpbiBleHRlbnNpb25fc2V0Lmggd2hpY2ggY2Fubm90IGJlIHBhcnQgb2YgdGhlCisvLyBsaXRlIGxpYnJhcnkgYmVjYXVzZSB0aGV5IHVzZSBkZXNjcmlwdG9ycyBvciByZWZsZWN0aW9uLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEltcGxlbWVudGF0aW9uIG9mIEV4dGVuc2lvbkZpbmRlciB3aGljaCBmaW5kcyBleHRlbnNpb25zIGluIGEgZ2l2ZW4KKy8vIERlc2NyaXB0b3JQb29sLCB1c2luZyB0aGUgZ2l2ZW4gTWVzc2FnZUZhY3RvcnkgdG8gY29uc3RydWN0IHN1Yi1vYmplY3RzLgorLy8gVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgorY2xhc3MgRGVzY3JpcHRvclBvb2xFeHRlbnNpb25GaW5kZXIgOiBwdWJsaWMgRXh0ZW5zaW9uRmluZGVyIHsKKyBwdWJsaWM6CisgIERlc2NyaXB0b3JQb29sRXh0ZW5zaW9uRmluZGVyKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlKQorICAgICAgOiBwb29sXyhwb29sKSwgZmFjdG9yeV8oZmFjdG9yeSksIGNvbnRhaW5pbmdfdHlwZV8oY29udGFpbmluZ190eXBlKSB7fQorICB2aXJ0dWFsIH5EZXNjcmlwdG9yUG9vbEV4dGVuc2lvbkZpbmRlcigpIHt9CisKKyAgdmlydHVhbCBib29sIEZpbmQoaW50IG51bWJlciwgRXh0ZW5zaW9uSW5mbyogb3V0cHV0KTsKKworIHByaXZhdGU6CisgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sXzsKKyAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnlfOworICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGVfOworfTsKKwordm9pZCBFeHRlbnNpb25TZXQ6OkFwcGVuZFRvTGlzdChjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3QgeworICBmb3IgKG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgeworICAgIGJvb2wgaGFzID0gZmFsc2U7CisgICAgaWYgKGl0ZXItPnNlY29uZC5pc19yZXBlYXRlZCkgeworICAgICAgaGFzID0gaXRlci0+c2Vjb25kLkdldFNpemUoKSA+IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGhhcyA9ICFpdGVyLT5zZWNvbmQuaXNfY2xlYXJlZDsKKyAgICB9CisKKyAgICBpZiAoaGFzKSB7CisgICAgICAvLyBUT0RPKGtlbnRvbik6IExvb2tpbmcgdXAgZWFjaCBmaWVsZCBieSBudW1iZXIgaXMgc29tZXdoYXQgdW5mb3J0dW5hdGUuCisgICAgICAvLyAgIElzIHRoZXJlIGEgYmV0dGVyIHdheT8gIFRoZSBwcm9ibGVtIGlzIHRoYXQgZGVzY3JpcHRvcnMgYXJlIGxhemlseS0KKyAgICAgIC8vICAgaW5pdGlhbGl6ZWQsIHNvIHRoZXkgbWlnaHQgbm90IGV2ZW4gYmUgY29uc3RydWN0ZWQgdW50aWwKKyAgICAgIC8vICAgQXBwZW5kVG9MaXN0KCkgaXMgY2FsbGVkLgorCisgICAgICBpZiAoaXRlci0+c2Vjb25kLmRlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhwb29sLT5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoCisgICAgICAgICAgICBjb250YWluaW5nX3R5cGUsIGl0ZXItPmZpcnN0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhpdGVyLT5zZWNvbmQuZGVzY3JpcHRvcik7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2lubGluZSBGaWVsZERlc2NyaXB0b3I6OlR5cGUgcmVhbF90eXBlKEZpZWxkVHlwZSB0eXBlKSB7CisgIEdPT0dMRV9EQ0hFQ0sodHlwZSA+IDAgJiYgdHlwZSA8PSBGaWVsZERlc2NyaXB0b3I6Ok1BWF9UWVBFKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4odHlwZSk7Cit9CisKK2lubGluZSBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgY3BwX3R5cGUoRmllbGRUeXBlIHR5cGUpIHsKKyAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvcjo6VHlwZVRvQ3BwVHlwZSgKKyAgICAgIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4odHlwZSkpOworfQorCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfVFlQRShFWFRFTlNJT04sIExBQkVMLCBDUFBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPT0dMRV9EQ0hFQ0tfRVEoKEVYVEVOU0lPTikuaXNfcmVwZWF0ZWQgPyBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMLCAgICAgIFwKKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfIyNMQUJFTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKChFWFRFTlNJT04pLnR5cGUpLCBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFKQorCitjb25zdCBNZXNzYWdlTGl0ZSYgRXh0ZW5zaW9uU2V0OjpHZXRNZXNzYWdlKGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIGNvbnN0IHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgaWYgKGl0ZXIgPT0gZXh0ZW5zaW9uc18uZW5kKCkgfHwgaXRlci0+c2Vjb25kLmlzX2NsZWFyZWQpIHsKKyAgICAvLyBOb3QgcHJlc2VudC4gIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICByZXR1cm4gKmZhY3RvcnktPkdldFByb3RvdHlwZShtZXNzYWdlX3R5cGUpOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIE9QVElPTkFMLCBNRVNTQUdFKTsKKyAgICByZXR1cm4gKml0ZXItPnNlY29uZC5tZXNzYWdlX3ZhbHVlOworICB9Cit9CisKK01lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6Ok11dGFibGVNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24oZGVzY3JpcHRvci0+bnVtYmVyKCksIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7CisgICAgZXh0ZW5zaW9uLT50eXBlID0gZGVzY3JpcHRvci0+dHlwZSgpOworICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpOworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKKyAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IGZhbHNlOworICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUgPQorICAgICAgICBmYWN0b3J5LT5HZXRQcm90b3R5cGUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAgIEdPT0dMRV9DSEVDSyhwcm90b3R5cGUgIT0gTlVMTCk7CisgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlID0gcHJvdG90eXBlLT5OZXcoKTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIE1FU1NBR0UpOworICB9CisgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOworICByZXR1cm4gZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlOworfQorCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpBZGRNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb247CisgIGlmIChNYXliZU5ld0V4dGVuc2lvbihkZXNjcmlwdG9yLT5udW1iZXIoKSwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsKKyAgICBleHRlbnNpb24tPnR5cGUgPSBkZXNjcmlwdG9yLT50eXBlKCk7CisgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSk7CisgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IHRydWU7CisgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlID0KKyAgICAgIG5ldyBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPigpOworICB9IGVsc2UgeworICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBSRVBFQVRFRCwgTUVTU0FHRSk7CisgIH0KKworICAvLyBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+IGRvZXMgbm90IGtub3cgaG93IHRvIEFkZCgpIHNpbmNlIGl0IGNhbm5vdAorICAvLyBhbGxvY2F0ZSBhbiBhYnN0cmFjdCBvYmplY3QsIHNvIHdlIGhhdmUgdG8gYmUgdHJpY2t5LgorICBNZXNzYWdlTGl0ZSogcmVzdWx0ID0gZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlCisgICAgICAtPkFkZEZyb21DbGVhcmVkPGludGVybmFsOjpHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZUxpdGU+ID4oKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgY29uc3QgTWVzc2FnZUxpdGUqIHByb3RvdHlwZTsKKyAgICBpZiAoZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5zaXplKCkgPT0gMCkgeworICAgICAgcHJvdG90eXBlID0gZmFjdG9yeS0+R2V0UHJvdG90eXBlKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICAgIEdPT0dMRV9DSEVDSyhwcm90b3R5cGUgIT0gTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvdHlwZSA9ICZleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkdldCgwKTsKKyAgICB9CisgICAgcmVzdWx0ID0gcHJvdG90eXBlLT5OZXcoKTsKKyAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkFkZEFsbG9jYXRlZChyZXN1bHQpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBib29sIFZhbGlkYXRlRW51bVVzaW5nRGVzY3JpcHRvcihjb25zdCB2b2lkKiBhcmcsIGludCBudW1iZXIpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRW51bURlc2NyaXB0b3IqPihhcmcpCisgICAgICAtPkZpbmRWYWx1ZUJ5TnVtYmVyKG51bWJlcikgIT0gTlVMTDsKK30KKworYm9vbCBEZXNjcmlwdG9yUG9vbEV4dGVuc2lvbkZpbmRlcjo6RmluZChpbnQgbnVtYmVyLCBFeHRlbnNpb25JbmZvKiBvdXRwdXQpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24gPQorICAgICAgcG9vbF8tPkZpbmRFeHRlbnNpb25CeU51bWJlcihjb250YWluaW5nX3R5cGVfLCBudW1iZXIpOworICBpZiAoZXh0ZW5zaW9uID09IE5VTEwpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgb3V0cHV0LT50eXBlID0gZXh0ZW5zaW9uLT50eXBlKCk7CisgICAgb3V0cHV0LT5pc19yZXBlYXRlZCA9IGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQoKTsKKyAgICBvdXRwdXQtPmlzX3BhY2tlZCA9IGV4dGVuc2lvbi0+b3B0aW9ucygpLnBhY2tlZCgpOworICAgIG91dHB1dC0+ZGVzY3JpcHRvciA9IGV4dGVuc2lvbjsKKyAgICBpZiAoZXh0ZW5zaW9uLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICBvdXRwdXQtPm1lc3NhZ2VfcHJvdG90eXBlID0KKyAgICAgICAgICBmYWN0b3J5Xy0+R2V0UHJvdG90eXBlKGV4dGVuc2lvbi0+bWVzc2FnZV90eXBlKCkpOworICAgICAgR09PR0xFX0NIRUNLKG91dHB1dC0+bWVzc2FnZV9wcm90b3R5cGUgIT0gTlVMTCkKKyAgICAgICAgICA8PCAiRXh0ZW5zaW9uIGZhY3RvcnkncyBHZXRQcm90b3R5cGUoKSByZXR1cm5lZCBOVUxMIGZvciBleHRlbnNpb246ICIKKyAgICAgICAgICA8PCBleHRlbnNpb24tPmZ1bGxfbmFtZSgpOworICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7CisgICAgICBvdXRwdXQtPmVudW1fdmFsaWRpdHlfY2hlY2suZnVuYyA9IFZhbGlkYXRlRW51bVVzaW5nRGVzY3JpcHRvcjsKKyAgICAgIG91dHB1dC0+ZW51bV92YWxpZGl0eV9jaGVjay5hcmcgPSBleHRlbnNpb24tPmVudW1fdHlwZSgpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK2Jvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZUZpZWxkSGVhdnkodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgRmllbGRTa2lwcGVyIHNraXBwZXIodW5rbm93bl9maWVsZHMpOworICBpZiAoaW5wdXQtPkdldEV4dGVuc2lvblBvb2woKSA9PSBOVUxMKSB7CisgICAgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihjb250YWluaW5nX3R5cGUpOworICAgIHJldHVybiBQYXJzZUZpZWxkKHRhZywgaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKKyAgfSBlbHNlIHsKKyAgICBEZXNjcmlwdG9yUG9vbEV4dGVuc2lvbkZpbmRlciBmaW5kZXIoaW5wdXQtPkdldEV4dGVuc2lvblBvb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQtPkdldEV4dGVuc2lvbkZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlLT5HZXREZXNjcmlwdG9yKCkpOworICAgIHJldHVybiBQYXJzZUZpZWxkKHRhZywgaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKKyAgfQorfQorCitib29sIEV4dGVuc2lvblNldDo6UGFyc2VNZXNzYWdlU2V0SGVhdnkoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7CisgIEZpZWxkU2tpcHBlciBza2lwcGVyKHVua25vd25fZmllbGRzKTsKKyAgaWYgKGlucHV0LT5HZXRFeHRlbnNpb25Qb29sKCkgPT0gTlVMTCkgeworICAgIEdlbmVyYXRlZEV4dGVuc2lvbkZpbmRlciBmaW5kZXIoY29udGFpbmluZ190eXBlKTsKKyAgICByZXR1cm4gUGFyc2VNZXNzYWdlU2V0KGlucHV0LCAmZmluZGVyLCAmc2tpcHBlcik7CisgIH0gZWxzZSB7CisgICAgRGVzY3JpcHRvclBvb2xFeHRlbnNpb25GaW5kZXIgZmluZGVyKGlucHV0LT5HZXRFeHRlbnNpb25Qb29sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LT5HZXRFeHRlbnNpb25GYWN0b3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZS0+R2V0RGVzY3JpcHRvcigpKTsKKyAgICByZXR1cm4gUGFyc2VNZXNzYWdlU2V0KGlucHV0LCAmZmluZGVyLCAmc2tpcHBlcik7CisgIH0KK30KKworaW50IEV4dGVuc2lvblNldDo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0IHsKKyAgaW50IHRvdGFsX3NpemUgPQorICAgICAgZXh0ZW5zaW9uc18uc2l6ZSgpICogc2l6ZW9mKG1hcDxpbnQsIEV4dGVuc2lvbj46OnZhbHVlX3R5cGUpOworICBmb3IgKG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5iZWdpbigpLAorICAgICAgIGVuZCA9IGV4dGVuc2lvbnNfLmVuZCgpOworICAgICAgIGl0ZXIgIT0gZW5kOworICAgICAgICsraXRlcikgeworICAgIHRvdGFsX3NpemUgKz0gaXRlci0+c2Vjb25kLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKTsKKyAgfQorICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKworaW5saW5lIGludCBFeHRlbnNpb25TZXQ6OlJlcGVhdGVkTWVzc2FnZV9TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKAorICAgIFJlcGVhdGVkUHRyRmllbGRCYXNlKiBmaWVsZCkgeworICByZXR1cm4gZmllbGQtPlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGY8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oKTsKK30KKworaW50IEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgIGlmIChpc19yZXBlYXRlZCkgeworICAgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0b3RhbF9zaXplICs9IHNpemVvZigqcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZSkgKyAgICAgIFwKKyAgICAgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKTtcCisgICAgICAgIGJyZWFrCisKKyAgICAgIEhBTkRMRV9UWVBFKCAgSU5UMzIsICAgaW50MzIpOworICAgICAgSEFORExFX1RZUEUoICBJTlQ2NCwgICBpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRSggVUlOVDMyLCAgdWludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBVSU5UNjQsICB1aW50NjQpOworICAgICAgSEFORExFX1RZUEUoICBGTE9BVCwgICBmbG9hdCk7CisgICAgICBIQU5ETEVfVFlQRSggRE9VQkxFLCAgZG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEJPT0wsICAgIGJvb2wpOworICAgICAgSEFORExFX1RZUEUoICAgRU5VTSwgICAgZW51bSk7CisgICAgICBIQU5ETEVfVFlQRSggU1RSSU5HLCAgc3RyaW5nKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICAvLyByZXBlYXRlZF9tZXNzYWdlX3ZhbHVlIGlzIGFjdHVhbGx5IGEgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4sCisgICAgICAgIC8vIGJ1dCBNZXNzYWdlTGl0ZSBoYXMgbm8gU3BhY2VVc2VkKCksIHNvIHdlIG11c3QgZGlyZWN0bHkgY2FsbAorICAgICAgICAvLyBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIHdpdGggYSBkaWZmZXJlbnQgdHlwZQorICAgICAgICAvLyBoYW5kbGVyLgorICAgICAgICB0b3RhbF9zaXplICs9IHNpemVvZigqcmVwZWF0ZWRfbWVzc2FnZV92YWx1ZSkgKworICAgICAgICAgICAgUmVwZWF0ZWRNZXNzYWdlX1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYocmVwZWF0ZWRfbWVzc2FnZV92YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGNwcF90eXBlKHR5cGUpKSB7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHRvdGFsX3NpemUgKz0gc2l6ZW9mKCpzdHJpbmdfdmFsdWUpICsKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCpzdHJpbmdfdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIHRvdGFsX3NpemUgKz0gZG93bl9jYXN0PE1lc3NhZ2UqPihtZXNzYWdlX3ZhbHVlKS0+U3BhY2VVc2VkKCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gTm8gZXh0cmEgc3RvcmFnZSBjb3N0cyBmb3IgcHJpbWl0aXZlIHR5cGVzLgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKKy8vIFRoZSBTZXJpYWxpemUqVG9BcnJheSBtZXRob2RzIGFyZSBvbmx5IG5lZWRlZCBpbiB0aGUgaGVhdnkgbGlicmFyeSwgYXMKKy8vIHRoZSBsaXRlIGxpYnJhcnkgb25seSBnZW5lcmF0ZXMgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzLgordWludDgqIEV4dGVuc2lvblNldDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICBpbnQgc3RhcnRfZmllbGRfbnVtYmVyLCBpbnQgZW5kX2ZpZWxkX251bWJlciwKKyAgICB1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGV4dGVuc2lvbnNfLmxvd2VyX2JvdW5kKHN0YXJ0X2ZpZWxkX251bWJlcik7CisgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSAmJiBpdGVyLT5maXJzdCA8IGVuZF9maWVsZF9udW1iZXI7CisgICAgICAgKytpdGVyKSB7CisgICAgdGFyZ2V0ID0gaXRlci0+c2Vjb25kLlNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzVG9BcnJheShpdGVyLT5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHRhcmdldDsKK30KKwordWludDgqIEV4dGVuc2lvblNldDo6U2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgdWludDgqIHRhcmdldCkgY29uc3QgeworICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBleHRlbnNpb25zXy5iZWdpbigpOyBpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICB0YXJnZXQgPSBpdGVyLT5zZWNvbmQuU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgICAgICBpdGVyLT5maXJzdCwgdGFyZ2V0KTsKKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCit1aW50OCogRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OlNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICBpbnQgbnVtYmVyLCB1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIGlmIChpc19yZXBlYXRlZCkgeworICAgIGlmIChpc19wYWNrZWQpIHsKKyAgICAgIGlmIChjYWNoZWRfc2l6ZSA9PSAwKSByZXR1cm4gdGFyZ2V0OworCisgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KG51bWJlciwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdGFyZ2V0KTsKKyAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyTm9UYWdUb0FycmF5KGNhY2hlZF9zaXplLCB0YXJnZXQpOworCisgICAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5zaXplKCk7IGkrKykgeyAgXAorICAgICAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlIyNDQU1FTENBU0UjI05vVGFnVG9BcnJheSggICAgICAgIFwKKyAgICAgICAgICAgICAgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+R2V0KGkpLCB0YXJnZXQpOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgSEFORExFX1RZUEUoICAgSU5UMzIsICAgIEludDMyLCAgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgSU5UNjQsICAgIEludDY0LCAgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsICAgVUludDMyLCAgdWludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBVSU5UNjQsICAgVUludDY0LCAgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBTSU5UMzIsICAgU0ludDMyLCAgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICAgU0ludDY0LCAgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoIEZJWEVEMzIsICBGaXhlZDMyLCAgdWludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoIEZJWEVENjQsICBGaXhlZDY0LCAgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyLCAgIGludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0LCAgIGludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgRkxPQVQsICAgIEZsb2F0LCAgIGZsb2F0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBET1VCTEUsICAgRG91YmxlLCAgZG91YmxlKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgIEJPT0wsICAgICBCb29sLCAgICBib29sKTsKKyAgICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICBlbnVtKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQOgorICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U6CisgICAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vbi1wcmltaXRpdmUgdHlwZXMgY2FuJ3QgYmUgcGFja2VkLiI7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAocmVhbF90eXBlKHR5cGUpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKTsgaSsrKSB7ICBcCisgICAgICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGUjI0NBTUVMQ0FTRSMjVG9BcnJheShudW1iZXIsICAgICAgXAorICAgICAgICAgICAgICByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5HZXQoaSksIHRhcmdldCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgYnJlYWsKKworICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgICAgSW50NjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQzMiwgICBVSW50MzIsICB1aW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgICBTSW50MzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQ2NCwgICBTSW50NjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgIEZpeGVkMzIsICB1aW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQsICB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIsICAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsICAgaW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQsICAgZmxvYXQpOworICAgICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgICBEb3VibGUsICBkb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICAgIEJvb2wsICAgIGJvb2wpOworICAgICAgICBIQU5ETEVfVFlQRSggIFNUUklORywgICBTdHJpbmcsICBzdHJpbmcpOworICAgICAgICBIQU5ETEVfVFlQRSggICBCWVRFUywgICAgQnl0ZXMsICBzdHJpbmcpOworICAgICAgICBIQU5ETEVfVFlQRSggICAgRU5VTSwgICAgIEVudW0sICAgIGVudW0pOworICAgICAgICBIQU5ETEVfVFlQRSggICBHUk9VUCwgICAgR3JvdXAsIG1lc3NhZ2UpOworICAgICAgICBIQU5ETEVfVFlQRSggTUVTU0FHRSwgIE1lc3NhZ2UsIG1lc3NhZ2UpOworI3VuZGVmIEhBTkRMRV9UWVBFCisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKCFpc19jbGVhcmVkKSB7CisgICAgc3dpdGNoIChyZWFsX3R5cGUodHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIFZBTFVFKSAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjQ0FNRUxDQVNFIyNUb0FycmF5KCAgICAgIFwKKyAgICAgICAgICAgIG51bWJlciwgVkFMVUUsIHRhcmdldCk7IFwKKyAgICAgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoICAgSU5UMzIsICAgIEludDMyLCAgICBpbnQzMl92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgICAgSW50NjQsICAgIGludDY0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDMyLCAgIFVJbnQzMiwgICB1aW50MzJfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICBVSU5UNjQsICAgVUludDY0LCAgIHVpbnQ2NF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgICBTSW50MzIsICAgIGludDMyX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDY0LCAgIFNJbnQ2NCwgICAgaW50NjRfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoIEZJWEVEMzIsICBGaXhlZDMyLCAgIHVpbnQzMl92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQsICAgdWludDY0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMiwgICAgaW50MzJfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0LCAgICBpbnQ2NF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQsICAgIGZsb2F0X3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgRE9VQkxFLCAgIERvdWJsZSwgICBkb3VibGVfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICAgIEJPT0wsICAgICBCb29sLCAgICAgYm9vbF92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggIFNUUklORywgICBTdHJpbmcsICAqc3RyaW5nX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEJZVEVTLCAgICBCeXRlcywgICpzdHJpbmdfdmFsdWUpOworICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICAgZW51bV92YWx1ZSk7CisgICAgICBIQU5ETEVfVFlQRSggICBHUk9VUCwgICAgR3JvdXAsICptZXNzYWdlX3ZhbHVlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBNRVNTQUdFLCAgTWVzc2FnZSwgKm1lc3NhZ2VfdmFsdWUpOworI3VuZGVmIEhBTkRMRV9UWVBFCisgICAgfQorICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3VpbnQ4KiBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6U2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIGludCBudW1iZXIsCisgICAgdWludDgqIHRhcmdldCkgY29uc3QgeworICBpZiAodHlwZSAhPSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFIHx8IGlzX3JlcGVhdGVkKSB7CisgICAgLy8gTm90IGEgdmFsaWQgTWVzc2FnZVNldCBleHRlbnNpb24sIGJ1dCBzZXJpYWxpemUgaXQgdGhlIG5vcm1hbCB3YXkuCisgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiSW52YWxpZCBtZXNzYWdlIHNldCBleHRlbnNpb24uIjsKKyAgICByZXR1cm4gU2VyaWFsaXplRmllbGRXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KG51bWJlciwgdGFyZ2V0KTsKKyAgfQorCisgIGlmIChpc19jbGVhcmVkKSByZXR1cm4gdGFyZ2V0OworCisgIC8vIFN0YXJ0IGdyb3VwLgorICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZywgdGFyZ2V0KTsKKyAgLy8gV3JpdGUgdHlwZSBJRC4KKyAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyVG9BcnJheSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZE51bWJlciwgbnVtYmVyLCB0YXJnZXQpOworICAvLyBXcml0ZSBtZXNzYWdlLgorICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlVG9BcnJheSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIsICptZXNzYWdlX3ZhbHVlLCB0YXJnZXQpOworICAvLyBFbmQgZ3JvdXAuCisgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZywgdGFyZ2V0KTsKKyAgcmV0dXJuIHRhcmdldDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMGY4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNjQyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSB7CisKKy8vIFRoaXMgdGVzdCBjbG9zZWx5IG1pcnJvcnMgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC91bml0dGVzdC5jYworLy8gZXhjZXB0IHRoYXQgaXQgdXNlcyBleHRlbnNpb25zIHJhdGhlciB0aGFuIHJlZ3VsYXIgZmllbGRzLgorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIERlZmF1bHRzKSB7CisgIC8vIENoZWNrIHRoYXQgYWxsIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBpbml0aWFsIG1lc3NhZ2UuCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7CisKKyAgLy8gTWVzc2FnZXMgc2hvdWxkIHJldHVybiBwb2ludGVycyB0byBkZWZhdWx0IGluc3RhbmNlcyB1bnRpbCBmaXJzdCB1c2UuCisgIC8vIChUaGlzIGlzIG5vdCBjaGVja2VkIGJ5IEV4cGVjdENsZWFyKCkgc2luY2UgaXQgaXMgbm90IGFjdHVhbGx5IHRydWUgYWZ0ZXIKKyAgLy8gdGhlIGZpZWxkcyBoYXZlIGJlZW4gc2V0IGFuZCB0aGVuIGNsZWFyZWQuKQorICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpPcHRpb25hbEdyb3VwX2V4dGVuc2lvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24oCisgICAgICAgICAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIEFjY2Vzc29ycykgeworICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUgdGhlbiBnbyBiYWNrIGFuZCBjaGVjayBhbGwgdGhvc2UKKyAgLy8gdmFsdWVzLgorICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworCisgIFRlc3RVdGlsOjpNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQobWVzc2FnZSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQ2xlYXIpIHsKKyAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlLCBjbGVhciB0aGUgbWVzc2FnZSwgdGhlbiBjaGVjayB0aGF0CisgIC8vIGl0IGlzIGNsZWFyZWQuCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworCisgIC8vIFVubGlrZSB3aXRoIHRoZSBkZWZhdWx0cyB0ZXN0LCB3ZSBkbyBOT1QgZXhwZWN0IHRoYXQgcmVxdWVzdGluZyBlbWJlZGRlZAorICAvLyBtZXNzYWdlcyB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2UuICBJbnN0ZWFkLCB0aGV5CisgIC8vIHNob3VsZCByZXR1cm4gdGhlIG9iamVjdHMgdGhhdCB3ZXJlIGNyZWF0ZWQgd2hlbiBtdXRhYmxlX2JsYWgoKSB3YXMKKyAgLy8gY2FsbGVkLgorICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpPcHRpb25hbEdyb3VwX2V4dGVuc2lvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbikpOworICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24oCisgICAgICAgICAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOworCisgIC8vIE1ha2Ugc3VyZSBzZXR0aW5nIHN0dWZmIGFnYWluIGFmdGVyIGNsZWFyaW5nIHdvcmtzLiAgKFRoaXMgdGFrZXMgc2xpZ2h0bHkKKyAgLy8gZGlmZmVyZW50IGNvZGUgcGF0aHMgc2luY2UgdGhlIG9iamVjdHMgYXJlIHJldXNlZC4pCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQ2xlYXJPbmVGaWVsZCkgeworICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUsIHRoZW4gY2xlYXIgb25lIHZhbHVlIGFuZCBpbnN1cmUgdGhhdAorICAvLyBvbmx5IHRoYXQgb25lIHZhbHVlIGlzIGNsZWFyZWQuCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgaW50NjQgb3JpZ2luYWxfdmFsdWUgPQorICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24pOworCisgIC8vIENsZWFyIHRoZSBmaWVsZCBhbmQgbWFrZSBzdXJlIGl0IHNob3dzIHVwIGFzIGNsZWFyZWQuCisgIG1lc3NhZ2UuQ2xlYXJFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbik7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uKSk7CisKKyAgLy8gT3RoZXIgYWRqYWNlbnQgZmllbGRzIHNob3VsZCBub3QgYmUgY2xlYXJlZC4KKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbikpOworCisgIC8vIE1ha2Ugc3VyZSBpZiB3ZSBzZXQgaXQgYWdhaW4sIHRoZW4gYWxsIGZpZWxkcyBhcmUgc2V0LgorICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uLCBvcmlnaW5hbF92YWx1ZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIENvcHlGcm9tKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIHN0cmluZyBkYXRhOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIENvcHlGcm9tVXBjYXN0ZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgc3RyaW5nIGRhdGE7CisgIGNvbnN0IE1lc3NhZ2UmIHVwY2FzdGVkX21lc3NhZ2UgPSBtZXNzYWdlMTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTEpOworICBtZXNzYWdlMi5Db3B5RnJvbSh1cGNhc3RlZF9tZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFN3YXBXaXRoRW1wdHkpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UxKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZTIpOworICBtZXNzYWdlMS5Td2FwKCZtZXNzYWdlMik7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlMSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU3dhcFdpdGhTZWxmKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7CisgIG1lc3NhZ2UuU3dhcCgmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFNlcmlhbGl6YXRpb25Ub0FycmF5KSB7CisgIC8vIFNlcmlhbGl6ZSBhcyBUZXN0QWxsRXh0ZW5zaW9ucyBhbmQgcGFyc2UgYXMgVGVzdEFsbFR5cGVzIHRvIGluc3VyZSB3aXJlCisgIC8vIGNvbXBhdGliaWxpdHkgb2YgZXh0ZW5zaW9ucy4KKyAgLy8KKyAgLy8gVGhpcyBjaGVja3Mgc2VyaWFsaXphdGlvbiB0byBhIGZsYXQgYXJyYXkgYnkgZXhwbGljaXRseSByZXNlcnZpbmcgc3BhY2UgaW4KKyAgLy8gdGhlIHN0cmluZyBhbmQgY2FsbGluZyB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UncworICAvLyBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5LgorICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgc291cmNlOworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGRlc3RpbmF0aW9uOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmc291cmNlKTsKKyAgaW50IHNpemUgPSBzb3VyY2UuQnl0ZVNpemUoKTsKKyAgc3RyaW5nIGRhdGE7CisgIGRhdGEucmVzaXplKHNpemUpOworICB1aW50OCogdGFyZ2V0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmZGF0YSkpOworICB1aW50OCogZW5kID0gc291cmNlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKKyAgRVhQRUNUX0VRKHNpemUsIGVuZCAtIHRhcmdldCk7CisgIEVYUEVDVF9UUlVFKGRlc3RpbmF0aW9uLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoZGVzdGluYXRpb24pOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFNlcmlhbGl6YXRpb25Ub1N0cmVhbSkgeworICAvLyBTZXJpYWxpemUgYXMgVGVzdEFsbEV4dGVuc2lvbnMgYW5kIHBhcnNlIGFzIFRlc3RBbGxUeXBlcyB0byBpbnN1cmUgd2lyZQorICAvLyBjb21wYXRpYmlsaXR5IG9mIGV4dGVuc2lvbnMuCisgIC8vCisgIC8vIFRoaXMgY2hlY2tzIHNlcmlhbGl6YXRpb24gdG8gYW4gb3V0cHV0IHN0cmVhbSBieSBjcmVhdGluZyBhbiBhcnJheSBvdXRwdXQKKyAgLy8gc3RyZWFtIHRoYXQgY2FuIG9ubHkgYnVmZmVyIDEgYnl0ZSBhdCBhIHRpbWUgLSB0aGlzIHByZXZlbnRzIHRoZSBtZXNzYWdlCisgIC8vIGZyb20gZXZlciBqdW1waW5nIHRvIHRoZSBmYXN0IHBhdGgsIGVuc3VyaW5nIHRoYXQgc2VyaWFsaXphdGlvbiBoYXBwZW5zIHZpYQorICAvLyB0aGUgQ29kZWRPdXRwdXRTdHJlYW0uCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBzb3VyY2U7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgZGVzdGluYXRpb247CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZzb3VyY2UpOworICBpbnQgc2l6ZSA9IHNvdXJjZS5CeXRlU2l6ZSgpOworICBzdHJpbmcgZGF0YTsKKyAgZGF0YS5yZXNpemUoc2l6ZSk7CisgIHsKKyAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKHN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOworICAgIHNvdXJjZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICB9CisgIEVYUEVDVF9UUlVFKGRlc3RpbmF0aW9uLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoZGVzdGluYXRpb24pOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFBhY2tlZFNlcmlhbGl6YXRpb25Ub0FycmF5KSB7CisgIC8vIFNlcmlhbGl6ZSBhcyBUZXN0UGFja2VkRXh0ZW5zaW9ucyBhbmQgcGFyc2UgYXMgVGVzdFBhY2tlZFR5cGVzIHRvIGluc3VyZQorICAvLyB3aXJlIGNvbXBhdGliaWxpdHkgb2YgZXh0ZW5zaW9ucy4KKyAgLy8KKyAgLy8gVGhpcyBjaGVja3Mgc2VyaWFsaXphdGlvbiB0byBhIGZsYXQgYXJyYXkgYnkgZXhwbGljaXRseSByZXNlcnZpbmcgc3BhY2UgaW4KKyAgLy8gdGhlIHN0cmluZyBhbmQgY2FsbGluZyB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UncworICAvLyBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5LgorICB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMgc291cmNlOworICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIGRlc3RpbmF0aW9uOworICBUZXN0VXRpbDo6U2V0UGFja2VkRXh0ZW5zaW9ucygmc291cmNlKTsKKyAgaW50IHNpemUgPSBzb3VyY2UuQnl0ZVNpemUoKTsKKyAgc3RyaW5nIGRhdGE7CisgIGRhdGEucmVzaXplKHNpemUpOworICB1aW50OCogdGFyZ2V0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmZGF0YSkpOworICB1aW50OCogZW5kID0gc291cmNlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKKyAgRVhQRUNUX0VRKHNpemUsIGVuZCAtIHRhcmdldCk7CisgIEVYUEVDVF9UUlVFKGRlc3RpbmF0aW9uLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXQoZGVzdGluYXRpb24pOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFBhY2tlZFNlcmlhbGl6YXRpb25Ub1N0cmVhbSkgeworICAvLyBTZXJpYWxpemUgYXMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgYW5kIHBhcnNlIGFzIFRlc3RQYWNrZWRUeXBlcyB0byBpbnN1cmUKKyAgLy8gd2lyZSBjb21wYXRpYmlsaXR5IG9mIGV4dGVuc2lvbnMuCisgIC8vCisgIC8vIFRoaXMgY2hlY2tzIHNlcmlhbGl6YXRpb24gdG8gYW4gb3V0cHV0IHN0cmVhbSBieSBjcmVhdGluZyBhbiBhcnJheSBvdXRwdXQKKyAgLy8gc3RyZWFtIHRoYXQgY2FuIG9ubHkgYnVmZmVyIDEgYnl0ZSBhdCBhIHRpbWUgLSB0aGlzIHByZXZlbnRzIHRoZSBtZXNzYWdlCisgIC8vIGZyb20gZXZlciBqdW1waW5nIHRvIHRoZSBmYXN0IHBhdGgsIGVuc3VyaW5nIHRoYXQgc2VyaWFsaXphdGlvbiBoYXBwZW5zIHZpYQorICAvLyB0aGUgQ29kZWRPdXRwdXRTdHJlYW0uCisgIHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyBzb3VyY2U7CisgIHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMgZGVzdGluYXRpb247CisgIFRlc3RVdGlsOjpTZXRQYWNrZWRFeHRlbnNpb25zKCZzb3VyY2UpOworICBpbnQgc2l6ZSA9IHNvdXJjZS5CeXRlU2l6ZSgpOworICBzdHJpbmcgZGF0YTsKKyAgZGF0YS5yZXNpemUoc2l6ZSk7CisgIHsKKyAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKHN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOworICAgIHNvdXJjZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICB9CisgIEVYUEVDVF9UUlVFKGRlc3RpbmF0aW9uLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXQoZGVzdGluYXRpb24pOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFBhcnNpbmcpIHsKKyAgLy8gU2VyaWFsaXplIGFzIFRlc3RBbGxUeXBlcyBhbmQgcGFyc2UgYXMgVGVzdEFsbEV4dGVuc2lvbnMuCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgc291cmNlOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgZGVzdGluYXRpb247CisgIHN0cmluZyBkYXRhOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJnNvdXJjZSk7CisgIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisgIEVYUEVDVF9UUlVFKGRlc3RpbmF0aW9uLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KGRlc3RpbmF0aW9uKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBQYWNrZWRQYXJzaW5nKSB7CisgIC8vIFNlcmlhbGl6ZSBhcyBUZXN0UGFja2VkVHlwZXMgYW5kIHBhcnNlIGFzIFRlc3RQYWNrZWRFeHRlbnNpb25zLgorICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIHNvdXJjZTsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIGRlc3RpbmF0aW9uOworICBzdHJpbmcgZGF0YTsKKworICBUZXN0VXRpbDo6U2V0UGFja2VkRmllbGRzKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChkZXN0aW5hdGlvbik7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgSXNJbml0aWFsaXplZCkgeworICAvLyBUZXN0IHRoYXQgSXNJbml0aWFsaXplZCgpIHJldHVybnMgZmFsc2UgaWYgcmVxdWlyZWQgZmllbGRzIGluIG5lc3RlZAorICAvLyBleHRlbnNpb25zIGFyZSBtaXNzaW5nLgorICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSktPnNldF9hKDEpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKS0+c2V0X2IoMik7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpLT5zZXRfYygzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOworCisgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6bXVsdGksIDApLT5zZXRfYSgxKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpLCAwKS0+c2V0X2IoMik7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSwgMCktPnNldF9jKDMpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgTXV0YWJsZVN0cmluZykgeworICAvLyBUZXN0IHRoZSBtdXRhYmxlIHN0cmluZyBhY2Nlc3NvcnMuCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworCisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiktPmFzc2lnbigiZm9vIik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24pKTsKKworICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiktPmFzc2lnbigiYmFyIik7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKCJiYXIiLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24sIDApKTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKSB7CisgIC8vIFNjYWxhciBwcmltaXRpdmUgZXh0ZW5zaW9ucyBzaG91bGQgaW5jcmVhc2UgdGhlIGV4dGVuc2lvbiBzZXQgc2l6ZSBieSBhCisgIC8vIG1pbmltdW0gb2YgdGhlIHNpemUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlLgorI2RlZmluZSBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQodHlwZSwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBiYXNlX3NpemUgPSBtZXNzYWdlLlNwYWNlVXNlZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF8jI3R5cGUjI19leHRlbnNpb24sIHZhbHVlKTsgICAgICAgXAorICAgIGludCBtaW5fZXhwZWN0ZWRfc2l6ZSA9IGJhc2Vfc2l6ZSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzaXplb2YobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsXyMjdHlwZSMjX2V4dGVuc2lvbikpOyAgXAorICAgIEVYUEVDVF9MRShtaW5fZXhwZWN0ZWRfc2l6ZSwgbWVzc2FnZS5TcGFjZVVzZWQoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChpbnQzMiAgICwgMTAxKTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKGludDY0ICAgLCAxMDIpOworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQodWludDMyICAsIDEwMyk7CisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRCh1aW50NjQgICwgMTA0KTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHNpbnQzMiAgLCAxMDUpOworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoc2ludDY0ICAsIDEwNik7CisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmaXhlZDMyICwgMTA3KTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKGZpeGVkNjQgLCAxMDgpOworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoc2ZpeGVkMzIsIDEwOSk7CisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzZml4ZWQ2NCwgMTEwKTsKKyAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKGZsb2F0ICAgLCAxMTEpOworICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoZG91YmxlICAsIDExMik7CisgIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChib29sICAgICwgdHJ1ZSk7CisjdW5kZWYgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VECisgIHsKKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgICBjb25zdCBpbnQgYmFzZV9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWQoKTsKKyAgICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgICAgaW50IG1pbl9leHBlY3RlZF9zaXplID0gYmFzZV9zaXplICsKKyAgICAgICAgc2l6ZW9mKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24pKTsKKyAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpOworICB9CisgIHsKKyAgICAvLyBTdHJpbmdzIG1heSBjYXVzZSBleHRyYSBhbGxvY2F0aW9ucyBkZXBlbmRpbmcgb24gdGhlaXIgbGVuZ3RoOyBlbnN1cmUKKyAgICAvLyB0aGF0IGdldHMgaW5jbHVkZWQgYXMgd2VsbC4KKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgICBjb25zdCBpbnQgYmFzZV9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWQoKTsKKyAgICBjb25zdCBzdHJpbmcgcygidGhpcyBpcyBhIGZhaXJseSBsYXJnZSBzdHJpbmcgdGhhdCB3aWxsIGNhdXNlIHNvbWUgIgorICAgICAgICAgICAgICAgICAgICJhbGxvY2F0aW9uIGluIG9yZGVyIHRvIHN0b3JlIGl0IGluIHRoZSBleHRlbnNpb24iKTsKKyAgICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiwgcyk7CisgICAgaW50IG1pbl9leHBlY3RlZF9zaXplID0gYmFzZV9zaXplICsgcy5sZW5ndGgoKTsKKyAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpOworICB9CisgIHsKKyAgICAvLyBNZXNzYWdlcyBhbHNvIGhhdmUgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHRoYXQgbmVlZCB0byBiZSBjb3VudGVkLgorICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICAgIGNvbnN0IGludCBiYXNlX3NpemUgPSBtZXNzYWdlLlNwYWNlVXNlZCgpOworICAgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSBmb3JlaWduOworICAgIGZvcmVpZ24uc2V0X2MoNDIpOworICAgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiktPgorICAgICAgICBDb3B5RnJvbShmb3JlaWduKTsKKyAgICBpbnQgbWluX2V4cGVjdGVkX3NpemUgPSBiYXNlX3NpemUgKyBmb3JlaWduLlNwYWNlVXNlZCgpOworICAgIEVYUEVDVF9MRShtaW5fZXhwZWN0ZWRfc2l6ZSwgbWVzc2FnZS5TcGFjZVVzZWQoKSk7CisgIH0KKworICAvLyBSZXBlYXRlZCBwcmltaXRpdmUgZXh0ZW5zaW9ucyB3aWxsIGluY3JlYXNlIHNwYWNlIHVzZWQgYnkgYXQgbGVhc3QgYQorICAvLyBSZXBlYXRlZEZpZWxkPFQ+LCBhbmQgd2lsbCBjYXVzZSBhZGRpdGlvbmFsIGFsbG9jYXRpb25zIHdoZW4gdGhlIGFycmF5CisgIC8vIGdldHMgdG9vIGJpZyBmb3IgdGhlIGluaXRpYWwgc3BhY2UuCisgIC8vIFRoaXMgbWFjcm86CisgIC8vICAgLSBBZGRzIGEgdmFsdWUgdG8gdGhlIHJlcGVhdGVkIGV4dGVuc2lvbiwgdGhlbiBjbGVhcnMgaXQsIGVzdGFibGlzaGluZworICAvLyAgICAgdGhlIGJhc2Ugc2l6ZS4KKyAgLy8gICAtIEFkZHMgYSBzbWFsbCBudW1iZXIgb2YgdmFsdWVzLCB0ZXN0aW5nIHRoYXQgaXQgZG9lc24ndCBpbmNyZWFzZSB0aGUKKyAgLy8gICAgIFNwYWNlVXNlZCgpCisgIC8vICAgLSBBZGRzIGEgbGFyZ2UgbnVtYmVyIG9mIHZhbHVlcyAocmVxdWlyaW5nIGFsbG9jYXRpb24gaW4gdGhlIHJlcGVhdGVkCisgIC8vICAgICBmaWVsZCksIGFuZCBlbnN1cmVzIHRoYXQgdGhhdCBhbGxvY2F0aW9uIGlzIGluY2x1ZGVkIGluIFNwYWNlVXNlZCgpCisjZGVmaW5lIFRFU1RfUkVQRUFURURfRVhURU5TSU9OU19TUEFDRV9VU0VEKHR5cGUsIGNwcHR5cGUsIHZhbHVlKSAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGJhc2Vfc2l6ZSA9IG1lc3NhZ2UuU3BhY2VVc2VkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBtaW5fZXhwZWN0ZWRfc2l6ZSA9IHNpemVvZihSZXBlYXRlZEZpZWxkPGNwcHR5cGU+KSArIGJhc2Vfc2l6ZTsgICAgICAgIFwKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfIyN0eXBlIyNfZXh0ZW5zaW9uLCB2YWx1ZSk7ICAgICAgICBcCisgICAgbWVzc2FnZS5DbGVhckV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfIyN0eXBlIyNfZXh0ZW5zaW9uKTsgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBlbXB0eV9yZXBlYXRlZF9maWVsZF9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWQoKTsgICAgICAgICAgICAgICAgIFwKKyAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIGVtcHR5X3JlcGVhdGVkX2ZpZWxkX3NpemUpIDw8ICN0eXBlOyAgICAgICAgICBcCisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkXyMjdHlwZSMjX2V4dGVuc2lvbiwgdmFsdWUpOyAgICAgICAgXAorICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF8jI3R5cGUjI19leHRlbnNpb24sIHZhbHVlKTsgICAgICAgIFwKKyAgICBFWFBFQ1RfRVEoZW1wdHlfcmVwZWF0ZWRfZmllbGRfc2l6ZSwgbWVzc2FnZS5TcGFjZVVzZWQoKSkgPDwgI3R5cGU7ICAgICAgICBcCisgICAgbWVzc2FnZS5DbGVhckV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfIyN0eXBlIyNfZXh0ZW5zaW9uKTsgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF8jI3R5cGUjI19leHRlbnNpb24sIHZhbHVlKTsgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBleHBlY3RlZF9zaXplID0gc2l6ZW9mKGNwcHR5cGUpICogMTYgKyBlbXB0eV9yZXBlYXRlZF9maWVsZF9zaXplOyAgICAgIFwKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc2l6ZSwgbWVzc2FnZS5TcGFjZVVzZWQoKSkgPDwgI3R5cGU7ICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoaW50MzIgICAsIGludDMyICwgMTAxKTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoaW50NjQgICAsIGludDY0ICwgMTAyKTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQodWludDMyICAsIHVpbnQzMiwgMTAzKTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQodWludDY0ICAsIHVpbnQ2NCwgMTA0KTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoc2ludDMyICAsIGludDMyICwgMTA1KTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoc2ludDY0ICAsIGludDY0ICwgMTA2KTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoZml4ZWQzMiAsIHVpbnQzMiwgMTA3KTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoZml4ZWQ2NCAsIHVpbnQ2NCwgMTA4KTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoc2ZpeGVkMzIsIGludDMyICwgMTA5KTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoc2ZpeGVkNjQsIGludDY0ICwgMTEwKTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoZmxvYXQgICAsIGZsb2F0ICwgMTExKTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoZG91YmxlICAsIGRvdWJsZSwgMTEyKTsKKyAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQoYm9vbCAgICAsIGJvb2wgICwgdHJ1ZSk7CisgIFRFU1RfUkVQRUFURURfRVhURU5TSU9OU19TUEFDRV9VU0VEKG5lc3RlZF9lbnVtLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisjdW5kZWYgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQKKyAgLy8gUmVwZWF0ZWQgc3RyaW5ncworICB7CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgICAgY29uc3QgaW50IGJhc2Vfc2l6ZSA9IG1lc3NhZ2UuU3BhY2VVc2VkKCk7CisgICAgaW50IG1pbl9leHBlY3RlZF9zaXplID0gc2l6ZW9mKFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPikgKyBiYXNlX3NpemU7CisgICAgY29uc3Qgc3RyaW5nIHZhbHVlKDI1NiwgJ3gnKTsKKyAgICAvLyBPbmNlIGl0ZW1zIGFyZSBhbGxvY2F0ZWQsIHRoZXkgbWF5IHN0aWNrIGFyb3VuZCBldmVuIHdoZW4gY2xlYXJlZCBzbworICAgIC8vIHdpdGhvdXQgdGhlIGhhcmRjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFjY2Vzc29ycyB0aGVyZSBpc24ndCBhIG5vdGlvbiBvZgorICAgIC8vIHRoZSBlbXB0eSByZXBlYXRlZCBmaWVsZCBtZW1vcnkgdXNhZ2UgYXMgdGhlcmUgaXMgd2l0aCBwcmltaXRpdmUgdHlwZXMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiwgdmFsdWUpOworICAgIH0KKyAgICBtaW5fZXhwZWN0ZWRfc2l6ZSArPSAoc2l6ZW9mKHZhbHVlKSArIHZhbHVlLnNpemUoKSkgKiAxNjsKKyAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpOworICB9CisgIC8vIFJlcGVhdGVkIG1lc3NhZ2VzCisgIHsKKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgICBjb25zdCBpbnQgYmFzZV9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWQoKTsKKyAgICBpbnQgbWluX2V4cGVjdGVkX3NpemUgPSBzaXplb2YoUmVwZWF0ZWRQdHJGaWVsZDx1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U+KSArCisgICAgICAgIGJhc2Vfc2l6ZTsKKyAgICB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UgcHJvdG90eXBlOworICAgIHByb3RvdHlwZS5zZXRfYygyKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKS0+CisgICAgICAgICAgQ29weUZyb20ocHJvdG90eXBlKTsKKyAgICB9CisgICAgbWluX2V4cGVjdGVkX3NpemUgKz0gMTYgKiBwcm90b3R5cGUuU3BhY2VVc2VkKCk7CisgICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZCgpKTsKKyAgfQorfQorCisjaWZkZWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBJbnZhbGlkRW51bURlYXRoKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBFWFBFQ1RfREVCVUdfREVBVEgoCisgICAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5pdHRlc3Q6OkZvcmVpZ25FbnVtPig1MykpLAorICAgICJJc1ZhbGlkIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBEeW5hbWljRXh0ZW5zaW9ucykgeworICAvLyBUZXN0IGFkZGluZyBhIGR5bmFtaWMgZXh0ZW5zaW9uIHRvIGEgY29tcGlsZWQtaW4gbWVzc2FnZSBvYmplY3QuCisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBkeW5hbWljX3Byb3RvOworICBkeW5hbWljX3Byb3RvLnNldF9uYW1lKCJkeW5hbWljX2V4dGVuc2lvbnNfdGVzdC5wcm90byIpOworICBkeW5hbWljX3Byb3RvLmFkZF9kZXBlbmRlbmN5KAorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+bmFtZSgpKTsKKyAgZHluYW1pY19wcm90by5zZXRfcGFja2FnZSgiZHluYW1pY19leHRlbnNpb25zIik7CisKKyAgLy8gQ29weSB0aGUgZmllbGRzIGFuZCBuZXN0ZWQgdHlwZXMgZnJvbSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgaW50byBvdXIgbmV3CisgIC8vIHByb3RvLCBjb252ZXJ0aW5nIHRoZSBmaWVsZHMgaW50byBleHRlbnNpb25zLgorICBjb25zdCBEZXNjcmlwdG9yKiB0ZW1wbGF0ZV9kZXNjcmlwdG9yID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0RHluYW1pY0V4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKTsKKyAgRGVzY3JpcHRvclByb3RvIHRlbXBsYXRlX2Rlc2NyaXB0b3JfcHJvdG87CisgIHRlbXBsYXRlX2Rlc2NyaXB0b3ItPkNvcHlUbygmdGVtcGxhdGVfZGVzY3JpcHRvcl9wcm90byk7CisgIGR5bmFtaWNfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoKS0+TWVyZ2VGcm9tKAorICAgICAgdGVtcGxhdGVfZGVzY3JpcHRvcl9wcm90by5uZXN0ZWRfdHlwZSgpKTsKKyAgZHluYW1pY19wcm90by5tdXRhYmxlX2VudW1fdHlwZSgpLT5NZXJnZUZyb20oCisgICAgICB0ZW1wbGF0ZV9kZXNjcmlwdG9yX3Byb3RvLmVudW1fdHlwZSgpKTsKKyAgZHluYW1pY19wcm90by5tdXRhYmxlX2V4dGVuc2lvbigpLT5NZXJnZUZyb20oCisgICAgICB0ZW1wbGF0ZV9kZXNjcmlwdG9yX3Byb3RvLmZpZWxkKCkpOworCisgIC8vIEZvciBlYWNoIGV4dGVuc2lvbiB0aGF0IHdlIGFkZGVkLi4uCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZHluYW1pY19wcm90by5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKKyAgICAvLyBTZXQgaXRzIGV4dGVuZGVlIHRvIFRlc3RBbGxFeHRlbnNpb25zLgorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBleHRlbnNpb24gPSBkeW5hbWljX3Byb3RvLm11dGFibGVfZXh0ZW5zaW9uKGkpOworICAgIGV4dGVuc2lvbi0+c2V0X2V4dGVuZGVlKAorICAgICAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkpOworCisgICAgLy8gSWYgdGhlIGZpZWxkIHJlZmVycyB0byBvbmUgb2YgdGhlIHR5cGVzIG5lc3RlZCBpbiBUZXN0RHluYW1pY0V4dGVuc2lvbnMsCisgICAgLy8gbWFrZSBpdCByZWZlciB0byB0aGUgdHlwZSBpbiBvdXIgZHluYW1pYyBwcm90byBpbnN0ZWFkLgorICAgIHN0cmluZyBwcmVmaXggPSAiLiIgKyB0ZW1wbGF0ZV9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArICIuIjsKKyAgICBpZiAoZXh0ZW5zaW9uLT5oYXNfdHlwZV9uYW1lKCkpIHsKKyAgICAgIHN0cmluZyogdHlwZV9uYW1lID0gZXh0ZW5zaW9uLT5tdXRhYmxlX3R5cGVfbmFtZSgpOworICAgICAgaWYgKEhhc1ByZWZpeFN0cmluZygqdHlwZV9uYW1lLCBwcmVmaXgpKSB7CisgICAgICAgIHR5cGVfbmFtZS0+cmVwbGFjZSgwLCBwcmVmaXguc2l6ZSgpLCAiLmR5bmFtaWNfZXh0ZW5zaW9ucy4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBOb3cgYnVpbGQgdGhlIGZpbGUsIHVzaW5nIHRoZSBnZW5lcmF0ZWQgcG9vbCBhcyBhbiB1bmRlcmxheS4KKyAgRGVzY3JpcHRvclBvb2wgZHluYW1pY19wb29sKERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBkeW5hbWljX3Bvb2wuQnVpbGRGaWxlKGR5bmFtaWNfcHJvdG8pOworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZHluYW1pY19mYWN0b3J5KCZkeW5hbWljX3Bvb2wpOworICBkeW5hbWljX2ZhY3RvcnkuU2V0RGVsZWdhdGVUb0dlbmVyYXRlZEZhY3RvcnkodHJ1ZSk7CisKKyAgLy8gQ29uc3RydWN0IGEgbWVzc2FnZSB0aGF0IHdlIGNhbiBwYXJzZSB3aXRoIHRoZSBleHRlbnNpb25zIHdlIGRlZmluZWQuCisgIC8vIFNpbmNlIHRoZSBleHRlbnNpb25zIHdlcmUgYmFzZWQgb2ZmIG9mIHRoZSBmaWVsZHMgb2YgVGVzdER5bmFtaWNFeHRlbnNpb25zLAorICAvLyB3ZSBjYW4gdXNlIHRoYXQgbWVzc2FnZSB0byBjcmVhdGUgdGhpcyB0ZXN0IG1lc3NhZ2UuCisgIHN0cmluZyBkYXRhOworICB7CisgICAgdW5pdHRlc3Q6OlRlc3REeW5hbWljRXh0ZW5zaW9ucyBtZXNzYWdlOworICAgIG1lc3NhZ2Uuc2V0X3NjYWxhcl9leHRlbnNpb24oMTIzKTsKKyAgICBtZXNzYWdlLnNldF9lbnVtX2V4dGVuc2lvbih1bml0dGVzdDo6Rk9SRUlHTl9CQVIpOworICAgIG1lc3NhZ2Uuc2V0X2R5bmFtaWNfZW51bV9leHRlbnNpb24oCisgICAgICAgIHVuaXR0ZXN0OjpUZXN0RHluYW1pY0V4dGVuc2lvbnM6OkRZTkFNSUNfQkFaKTsKKyAgICBtZXNzYWdlLm11dGFibGVfbWVzc2FnZV9leHRlbnNpb24oKS0+c2V0X2MoNDU2KTsKKyAgICBtZXNzYWdlLm11dGFibGVfZHluYW1pY19tZXNzYWdlX2V4dGVuc2lvbigpLT5zZXRfZHluYW1pY19maWVsZCg3ODkpOworICAgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2V4dGVuc2lvbigiZm9vIik7CisgICAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZXh0ZW5zaW9uKCJiYXIiKTsKKyAgICBtZXNzYWdlLmFkZF9wYWNrZWRfZXh0ZW5zaW9uKDEyKTsKKyAgICBtZXNzYWdlLmFkZF9wYWNrZWRfZXh0ZW5zaW9uKC0zNCk7CisgICAgbWVzc2FnZS5hZGRfcGFja2VkX2V4dGVuc2lvbig1Nik7CisgICAgbWVzc2FnZS5hZGRfcGFja2VkX2V4dGVuc2lvbigtNzgpOworCisgICAgLy8gQWxzbyBhZGQgc29tZSB1bmtub3duIGZpZWxkcy4KKworICAgIC8vIEFuIHVua25vd24gZW51bSB2YWx1ZSAoZm9yIGEga25vd24gZmllbGQpLgorICAgIG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoCisgICAgICB1bml0dGVzdDo6VGVzdER5bmFtaWNFeHRlbnNpb25zOjprRHluYW1pY0VudW1FeHRlbnNpb25GaWVsZE51bWJlciwKKyAgICAgIDEyMzQ1KTsKKyAgICAvLyBBIHJlZ3VsYXIgdW5rbm93biBmaWVsZC4KKyAgICBtZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkTGVuZ3RoRGVsaW1pdGVkKDU0MzIxLCAidW5rbm93biIpOworCisgICAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisgIH0KKworICAvLyBOb3cgd2UgY2FuIHBhcnNlIHRoaXMgdXNpbmcgb3VyIGR5bmFtaWMgZXh0ZW5zaW9uIGRlZmluaXRpb25zLi4uCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICB7CisgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgICAgaW5wdXQuU2V0RXh0ZW5zaW9uUmVnaXN0cnkoJmR5bmFtaWNfcG9vbCwgJmR5bmFtaWNfZmFjdG9yeSk7CisgICAgQVNTRVJUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKKyAgICBBU1NFUlRfVFJVRShpbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSk7CisgIH0KKworICAvLyBDYW4gd2UgcHJpbnQgaXQ/CisgIEVYUEVDVF9FUSgKKyAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5zY2FsYXJfZXh0ZW5zaW9uXTogMTIzXG4iCisgICAgIltkeW5hbWljX2V4dGVuc2lvbnMuZW51bV9leHRlbnNpb25dOiBGT1JFSUdOX0JBUlxuIgorICAgICJbZHluYW1pY19leHRlbnNpb25zLmR5bmFtaWNfZW51bV9leHRlbnNpb25dOiBEWU5BTUlDX0JBWlxuIgorICAgICJbZHluYW1pY19leHRlbnNpb25zLm1lc3NhZ2VfZXh0ZW5zaW9uXSB7XG4iCisgICAgIiAgYzogNDU2XG4iCisgICAgIn1cbiIKKyAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5keW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uXSB7XG4iCisgICAgIiAgZHluYW1pY19maWVsZDogNzg5XG4iCisgICAgIn1cbiIKKyAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5yZXBlYXRlZF9leHRlbnNpb25dOiBcImZvb1wiXG4iCisgICAgIltkeW5hbWljX2V4dGVuc2lvbnMucmVwZWF0ZWRfZXh0ZW5zaW9uXTogXCJiYXJcIlxuIgorICAgICJbZHluYW1pY19leHRlbnNpb25zLnBhY2tlZF9leHRlbnNpb25dOiAxMlxuIgorICAgICJbZHluYW1pY19leHRlbnNpb25zLnBhY2tlZF9leHRlbnNpb25dOiAtMzRcbiIKKyAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5wYWNrZWRfZXh0ZW5zaW9uXTogNTZcbiIKKyAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5wYWNrZWRfZXh0ZW5zaW9uXTogLTc4XG4iCisgICAgIjIwMDI6IDEyMzQ1XG4iCisgICAgIjU0MzIxOiBcInVua25vd25cIlxuIiwKKyAgICBtZXNzYWdlLkRlYnVnU3RyaW5nKCkpOworCisgIC8vIENhbiB3ZSBzZXJpYWxpemUgaXQ/CisgIC8vIChEb24ndCB1c2UgRVhQRUNUX0VRIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdW1wIHJhdyBiaW5hcnkgZGF0YSB0byB0aGUKKyAgLy8gdGVybWluYWwgb24gZmFpbHVyZS4pCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKSA9PSBkYXRhKTsKKworICAvLyBXaGF0IGlmIHdlIHBhcnNlIHVzaW5nIHRoZSByZWZsZWN0aW9uLWJhc2VkIHBhcnNlcj8KKyAgeworICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMjsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgICBpbnB1dC5TZXRFeHRlbnNpb25SZWdpc3RyeSgmZHluYW1pY19wb29sLCAmZHluYW1pY19mYWN0b3J5KTsKKyAgICBBU1NFUlRfVFJVRShXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZtZXNzYWdlMikpOworICAgIEFTU0VSVF9UUlVFKGlucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZS5EZWJ1Z1N0cmluZygpLCBtZXNzYWdlMi5EZWJ1Z1N0cmluZygpKTsKKyAgfQorCisgIC8vIEFyZSB0aGUgZW1iZWRkZWQgZ2VuZXJhdGVkIHR5cGVzIGFjdHVhbGx5IHVzaW5nIHRoZSBnZW5lcmF0ZWQgb2JqZWN0cz8KKyAgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWVzc2FnZV9leHRlbnNpb24gPQorICAgICAgICBmaWxlLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJtZXNzYWdlX2V4dGVuc2lvbiIpOworICAgIEFTU0VSVF9UUlVFKG1lc3NhZ2VfZXh0ZW5zaW9uICE9IE5VTEwpOworICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0KKyAgICAgICAgbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldE1lc3NhZ2UobWVzc2FnZSwgbWVzc2FnZV9leHRlbnNpb24pOworICAgIGNvbnN0IHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSogdHlwZWRfc3ViX21lc3NhZ2UgPQorICAgICAgICBkeW5hbWljX2Nhc3Q8Y29uc3QgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKj4oJnN1Yl9tZXNzYWdlKTsKKyAgICBBU1NFUlRfVFJVRSh0eXBlZF9zdWJfbWVzc2FnZSAhPSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoNDU2LCB0eXBlZF9zdWJfbWVzc2FnZS0+YygpKTsKKyAgfQorCisgIC8vIFdoYXQgZG9lcyBHZXRNZXNzYWdlKCkgcmV0dXJuIGZvciB0aGUgZW1iZWRkZWQgZHluYW1pYyB0eXBlIGlmIGl0IGlzbid0CisgIC8vIHByZXNlbnQ/CisgIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24gPQorICAgICAgICBmaWxlLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uIik7CisgICAgQVNTRVJUX1RSVUUoZHluYW1pY19tZXNzYWdlX2V4dGVuc2lvbiAhPSBOVUxMKTsKKyAgICBjb25zdCBNZXNzYWdlJiBwYXJlbnQgPSB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9CisgICAgICAgIHBhcmVudC5HZXRSZWZsZWN0aW9uKCktPkdldE1lc3NhZ2UocGFyZW50LCBkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkeW5hbWljX2ZhY3RvcnkpOworICAgIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZSA9CisgICAgICAgIGR5bmFtaWNfZmFjdG9yeS5HZXRQcm90b3R5cGUoZHluYW1pY19tZXNzYWdlX2V4dGVuc2lvbi0+bWVzc2FnZV90eXBlKCkpOworICAgIEVYUEVDVF9FUShwcm90b3R5cGUsICZzdWJfbWVzc2FnZSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2ZTk1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MKQEAgLTAsMCArMSwxMjE2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitib29sIFBhcnNlTmFtZWRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGludCogdmFsdWUpIHsKKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZCA9IGRlc2NyaXB0b3ItPkZpbmRWYWx1ZUJ5TmFtZShuYW1lKTsKKyAgaWYgKGQgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBkLT5udW1iZXIoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IHN0cmluZyYgTmFtZU9mRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IHZhbHVlKSB7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGQgPSBkZXNjcmlwdG9yLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgIHJldHVybiAoZCA9PSBOVUxMID8ga0VtcHR5U3RyaW5nIDogZC0+bmFtZSgpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSGVscGVycyBmb3IgcmVwb3J0aW5nIHVzYWdlIGVycm9ycyAoZS5nLiB0cnlpbmcgdG8gdXNlIEdldEludDMyKCkgb24KKy8vIGEgc3RyaW5nIGZpZWxkKS4KKworbmFtZXNwYWNlIHsKKwordm9pZCBSZXBvcnRSZWZsZWN0aW9uVXNhZ2VFcnJvcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGNvbnN0IGNoYXIqIG1ldGhvZCwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pIHsKKyAgR09PR0xFX0xPRyhGQVRBTCkKKyAgICA8PCAiUHJvdG9jb2wgQnVmZmVyIHJlZmxlY3Rpb24gdXNhZ2UgZXJyb3I6XG4iCisgICAgICAgIiAgTWV0aG9kICAgICAgOiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uOjoiIDw8IG1ldGhvZCA8PCAiXG4iCisgICAgICAgIiAgTWVzc2FnZSB0eXBlOiAiIDw8IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpIDw8ICJcbiIKKyAgICAgICAiICBGaWVsZCAgICAgICA6ICIgPDwgZmllbGQtPmZ1bGxfbmFtZSgpIDw8ICJcbiIKKyAgICAgICAiICBQcm9ibGVtICAgICA6ICIgPDwgZGVzY3JpcHRpb247Cit9CisKK2NvbnN0IGNoYXIqIGNwcHR5cGVfbmFtZXNfW0ZpZWxkRGVzY3JpcHRvcjo6TUFYX0NQUFRZUEUgKyAxXSA9IHsKKyAgIklOVkFMSURfQ1BQVFlQRSIsCisgICJDUFBUWVBFX0lOVDMyIiwKKyAgIkNQUFRZUEVfSU5UNjQiLAorICAiQ1BQVFlQRV9VSU5UMzIiLAorICAiQ1BQVFlQRV9VSU5UNjQiLAorICAiQ1BQVFlQRV9ET1VCTEUiLAorICAiQ1BQVFlQRV9GTE9BVCIsCisgICJDUFBUWVBFX0JPT0wiLAorICAiQ1BQVFlQRV9FTlVNIiwKKyAgIkNQUFRZUEVfU1RSSU5HIiwKKyAgIkNQUFRZUEVfTUVTU0FHRSIKK307CisKK3N0YXRpYyB2b2lkIFJlcG9ydFJlZmxlY3Rpb25Vc2FnZVR5cGVFcnJvcigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGNvbnN0IGNoYXIqIG1ldGhvZCwKKyAgICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgZXhwZWN0ZWRfdHlwZSkgeworICBHT09HTEVfTE9HKEZBVEFMKQorICAgIDw8ICJQcm90b2NvbCBCdWZmZXIgcmVmbGVjdGlvbiB1c2FnZSBlcnJvcjpcbiIKKyAgICAgICAiICBNZXRob2QgICAgICA6IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb246OiIgPDwgbWV0aG9kIDw8ICJcbiIKKyAgICAgICAiICBNZXNzYWdlIHR5cGU6ICIgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgPDwgIlxuIgorICAgICAgICIgIEZpZWxkICAgICAgIDogIiA8PCBmaWVsZC0+ZnVsbF9uYW1lKCkgPDwgIlxuIgorICAgICAgICIgIFByb2JsZW0gICAgIDogRmllbGQgaXMgbm90IHRoZSByaWdodCB0eXBlIGZvciB0aGlzIG1lc3NhZ2U6XG4iCisgICAgICAgIiAgICBFeHBlY3RlZCAgOiAiIDw8IGNwcHR5cGVfbmFtZXNfW2V4cGVjdGVkX3R5cGVdIDw8ICJcbiIKKyAgICAgICAiICAgIEZpZWxkIHR5cGU6ICIgPDwgY3BwdHlwZV9uYW1lc19bZmllbGQtPmNwcF90eXBlKCldOworfQorCitzdGF0aWMgdm9pZCBSZXBvcnRSZWZsZWN0aW9uVXNhZ2VFbnVtVHlwZUVycm9yKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgY2hhciogbWV0aG9kLCBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgeworICBHT09HTEVfTE9HKEZBVEFMKQorICAgIDw8ICJQcm90b2NvbCBCdWZmZXIgcmVmbGVjdGlvbiB1c2FnZSBlcnJvcjpcbiIKKyAgICAgICAiICBNZXRob2QgICAgICA6IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb246OiIgPDwgbWV0aG9kIDw8ICJcbiIKKyAgICAgICAiICBNZXNzYWdlIHR5cGU6ICIgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgPDwgIlxuIgorICAgICAgICIgIEZpZWxkICAgICAgIDogIiA8PCBmaWVsZC0+ZnVsbF9uYW1lKCkgPDwgIlxuIgorICAgICAgICIgIFByb2JsZW0gICAgIDogRW51bSB2YWx1ZSBkaWQgbm90IG1hdGNoIGZpZWxkIHR5cGU6XG4iCisgICAgICAgIiAgICBFeHBlY3RlZCAgOiAiIDw8IGZpZWxkLT5lbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkgPDwgIlxuIgorICAgICAgICIgICAgQWN0dWFsICAgIDogIiA8PCB2YWx1ZS0+ZnVsbF9uYW1lKCk7Cit9CisKKyNkZWZpbmUgVVNBR0VfQ0hFQ0soQ09ORElUSU9OLCBNRVRIT0QsIEVSUk9SX0RFU0NSSVBUSU9OKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKENPTkRJVElPTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJlcG9ydFJlZmxlY3Rpb25Vc2FnZUVycm9yKGRlc2NyaXB0b3JfLCBmaWVsZCwgI01FVEhPRCwgRVJST1JfREVTQ1JJUFRJT04pCisjZGVmaW5lIFVTQUdFX0NIRUNLX0VRKEEsIEIsIE1FVEhPRCwgRVJST1JfREVTQ1JJUFRJT04pICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FHRV9DSEVDSygoQSkgPT0gKEIpLCBNRVRIT0QsIEVSUk9SX0RFU0NSSVBUSU9OKQorI2RlZmluZSBVU0FHRV9DSEVDS19ORShBLCBCLCBNRVRIT0QsIEVSUk9SX0RFU0NSSVBUSU9OKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVVNBR0VfQ0hFQ0soKEEpICE9IChCKSwgTUVUSE9ELCBFUlJPUl9ERVNDUklQVElPTikKKworI2RlZmluZSBVU0FHRV9DSEVDS19UWVBFKE1FVEhPRCwgQ1BQVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEUpICAgICAgICAgICAgICAgICBcCisgICAgUmVwb3J0UmVmbGVjdGlvblVzYWdlVHlwZUVycm9yKGRlc2NyaXB0b3JfLCBmaWVsZCwgI01FVEhPRCwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFKQorCisjZGVmaW5lIFVTQUdFX0NIRUNLX0VOVU1fVkFMVUUoTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAodmFsdWUtPnR5cGUoKSAhPSBmaWVsZC0+ZW51bV90eXBlKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSZXBvcnRSZWZsZWN0aW9uVXNhZ2VFbnVtVHlwZUVycm9yKGRlc2NyaXB0b3JfLCBmaWVsZCwgI01FVEhPRCwgdmFsdWUpCisKKyNkZWZpbmUgVVNBR0VfQ0hFQ0tfTUVTU0FHRV9UWVBFKE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQUdFX0NIRUNLX0VRKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSwgZGVzY3JpcHRvcl8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBNRVRIT0QsICJGaWVsZCBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUuIik7CisjZGVmaW5lIFVTQUdFX0NIRUNLX1NJTkdVTEFSKE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVU0FHRV9DSEVDS19ORShmaWVsZC0+bGFiZWwoKSwgRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCwgTUVUSE9ELCAgICAgIFwKKyAgICAgICAgICAgICAgICAgIkZpZWxkIGlzIHJlcGVhdGVkOyB0aGUgbWV0aG9kIHJlcXVpcmVzIGEgc2luZ3VsYXIgZmllbGQuIikKKyNkZWZpbmUgVVNBR0VfQ0hFQ0tfUkVQRUFURUQoTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVTQUdFX0NIRUNLX0VRKGZpZWxkLT5sYWJlbCgpLCBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVELCBNRVRIT0QsICAgICAgXAorICAgICAgICAgICAgICAgICAiRmllbGQgaXMgc2luZ3VsYXI7IHRoZSBtZXRob2QgcmVxdWlyZXMgYSByZXBlYXRlZCBmaWVsZC4iKQorCisjZGVmaW5lIFVTQUdFX0NIRUNLX0FMTChNRVRIT0QsIExBQkVMLCBDUFBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX01FU1NBR0VfVFlQRShNRVRIT0QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVU0FHRV9DSEVDS18jI0xBQkVMKE1FVEhPRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVNBR0VfQ0hFQ0tfVFlQRShNRVRIT0QsIENQUFRZUEUpCisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2UsCisgICAgY29uc3QgaW50IG9mZnNldHNbXSwKKyAgICBpbnQgaGFzX2JpdHNfb2Zmc2V0LAorICAgIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXQsCisgICAgaW50IGV4dGVuc2lvbnNfb2Zmc2V0LAorICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBkZXNjcmlwdG9yX3Bvb2wsCisgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnksCisgICAgaW50IG9iamVjdF9zaXplKQorICA6IGRlc2NyaXB0b3JfICAgICAgIChkZXNjcmlwdG9yKSwKKyAgICBkZWZhdWx0X2luc3RhbmNlXyAoZGVmYXVsdF9pbnN0YW5jZSksCisgICAgb2Zmc2V0c18gICAgICAgICAgKG9mZnNldHMpLAorICAgIGhhc19iaXRzX29mZnNldF8gIChoYXNfYml0c19vZmZzZXQpLAorICAgIHVua25vd25fZmllbGRzX29mZnNldF8odW5rbm93bl9maWVsZHNfb2Zmc2V0KSwKKyAgICBleHRlbnNpb25zX29mZnNldF8oZXh0ZW5zaW9uc19vZmZzZXQpLAorICAgIG9iamVjdF9zaXplXyAgICAgIChvYmplY3Rfc2l6ZSksCisgICAgZGVzY3JpcHRvcl9wb29sXyAgKChkZXNjcmlwdG9yX3Bvb2wgPT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3Bvb2wpLAorICAgIG1lc3NhZ2VfZmFjdG9yeV8gIChmYWN0b3J5KSB7Cit9CisKK0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjp+R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oKSB7fQorCitjb25zdCBVbmtub3duRmllbGRTZXQmIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRVbmtub3duRmllbGRzKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKKyAgY29uc3Qgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KCZtZXNzYWdlKSArCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGRzX29mZnNldF87CisgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVbmtub3duRmllbGRTZXQqPihwdHIpOworfQorVW5rbm93bkZpZWxkU2V0KiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TXV0YWJsZVVua25vd25GaWVsZHMoCisgICAgTWVzc2FnZSogbWVzc2FnZSkgY29uc3QgeworICB2b2lkKiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obWVzc2FnZSkgKyB1bmtub3duX2ZpZWxkc19vZmZzZXRfOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxVbmtub3duRmllbGRTZXQqPihwdHIpOworfQorCitpbnQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNwYWNlVXNlZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7CisgIC8vIG9iamVjdF9zaXplXyBhbHJlYWR5IGluY2x1ZGVzIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBmaWVsZAorICAvLyBpbiB0aGUgbWVzc2FnZSwgc28gd2Ugb25seSBuZWVkIHRvIGFjY291bnQgZm9yIGFkZGl0aW9uYWwgbWVtb3J5IHVzZWQgYnkKKyAgLy8gdGhlIGZpZWxkcy4KKyAgaW50IHRvdGFsX3NpemUgPSBvYmplY3Rfc2l6ZV87CisKKyAgdG90YWxfc2l6ZSArPSBHZXRVbmtub3duRmllbGRzKG1lc3NhZ2UpLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKTsKKworICBpZiAoZXh0ZW5zaW9uc19vZmZzZXRfICE9IC0xKSB7CisgICAgdG90YWxfc2l6ZSArPSBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI1VQUEVSQ0FTRSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHRvdGFsX3NpemUgKz0gR2V0UmF3PFJlcGVhdGVkRmllbGQ8TE9XRVJDQVNFPiA+KG1lc3NhZ2UsIGZpZWxkKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgSEFORExFX1RZUEUoIElOVDMyLCAgaW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRSggSU5UNjQsICBpbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjQpOworICAgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSk7CisgICAgICAgIEhBTkRMRV9UWVBFKCBGTE9BVCwgIGZsb2F0KTsKKyAgICAgICAgSEFORExFX1RZUEUoICBCT09MLCAgIGJvb2wpOworICAgICAgICBIQU5ETEVfVFlQRSggIEVOVU0sICAgIGludCk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgICAgdG90YWxfc2l6ZSArPSBHZXRSYXc8UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+ID4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoaWNoIHN1YmNsYXNzIG9mIFJlcGVhdGVkUHRyRmllbGRCYXNlIHRoZSB0eXBlIGlzLAorICAgICAgICAgIC8vIHNvIHdlIHVzZSBSZXBlYXRlZFB0ckZpZWxkQmFzZSBkaXJlY3RseS4KKyAgICAgICAgICB0b3RhbF9zaXplICs9CisgICAgICAgICAgICAgIEdldFJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgICAgLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGY8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMiA6CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0IDoKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQgOgorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MICA6CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0gIDoKKyAgICAgICAgICAvLyBGaWVsZCBpcyBpbmxpbmUsIHNvIHdlJ3ZlIGFscmVhZHkgY291bnRlZCBpdC4KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7CisgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyogcHRyID0gR2V0RmllbGQ8Y29uc3Qgc3RyaW5nKj4obWVzc2FnZSwgZmllbGQpOworCisgICAgICAgICAgICAgIC8vIEluaXRpYWxseSwgdGhlIHN0cmluZyBwb2ludHMgdG8gdGhlIGRlZmF1bHQgdmFsdWUgc3RvcmVkIGluCisgICAgICAgICAgICAgIC8vIHRoZSBwcm90b3R5cGUuIE9ubHkgY291bnQgdGhlIHN0cmluZyBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkCisgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyogZGVmYXVsdF9wdHIgPSBEZWZhdWx0UmF3PGNvbnN0IHN0cmluZyo+KGZpZWxkKTsKKworICAgICAgICAgICAgICBpZiAocHRyICE9IGRlZmF1bHRfcHRyKSB7CisgICAgICAgICAgICAgICAgLy8gc3RyaW5nIGZpZWxkcyBhcmUgcmVwcmVzZW50ZWQgYnkganVzdCBhIHBvaW50ZXIsIHNvIGFsc28KKyAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIHNpemVvZihzdHJpbmcpIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgdG90YWxfc2l6ZSArPSBzaXplb2YoKnB0cikgKyBTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCpwdHIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgaWYgKCZtZXNzYWdlID09IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgICAgICAgICAgICAvLyBGb3Igc2luZ3VsYXIgZmllbGRzLCB0aGUgcHJvdG90eXBlIGp1c3Qgc3RvcmVzIGEgcG9pbnRlciB0byB0aGUKKyAgICAgICAgICAgIC8vIGV4dGVybmFsIHR5cGUncyBwcm90b3R5cGUsIHNvIHRoZXJlIGlzIG5vIGV4dHJhIG1lbW9yeSB1c2FnZS4KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogc3ViX21lc3NhZ2UgPSBHZXRSYXc8Y29uc3QgTWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgICAgICAgIGlmIChzdWJfbWVzc2FnZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIHRvdGFsX3NpemUgKz0gc3ViX21lc3NhZ2UtPlNwYWNlVXNlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U3dhcCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlMSwKKyAgICBNZXNzYWdlKiBtZXNzYWdlMikgY29uc3QgeworICBpZiAobWVzc2FnZTEgPT0gbWVzc2FnZTIpIHJldHVybjsKKworICAvLyBUT0RPKGtlbnRvbik6ICBPdGhlciBSZWZsZWN0aW9uIG1ldGhvZHMgc2hvdWxkIHByb2JhYmx5IGNoZWNrIHRoaXMgdG9vLgorICBHT09HTEVfQ0hFQ0tfRVEobWVzc2FnZTEtPkdldFJlZmxlY3Rpb24oKSwgdGhpcykKKyAgICA8PCAiRmlyc3QgYXJndW1lbnQgdG8gU3dhcCgpIChvZiB0eXBlIFwiIgorICAgIDw8IG1lc3NhZ2UxLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCisgICAgPDwgIlwiKSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgcmVmbGVjdGlvbiBvYmplY3QgKHdoaWNoIGlzIGZvciB0eXBlIFwiIgorICAgIDw8IGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKQorICAgIDw8ICJcIikuICBOb3RlIHRoYXQgdGhlIGV4YWN0IHNhbWUgY2xhc3MgaXMgcmVxdWlyZWQ7IG5vdCBqdXN0IHRoZSBzYW1lICIKKyAgICAgICAiZGVzY3JpcHRvci4iOworICBHT09HTEVfQ0hFQ0tfRVEobWVzc2FnZTItPkdldFJlZmxlY3Rpb24oKSwgdGhpcykKKyAgICA8PCAiU2Vjb25kIGFyZ3VtZW50IHRvIFN3YXAoKSAob2YgdHlwZSBcIiIKKyAgICA8PCBtZXNzYWdlMS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKQorICAgIDw8ICJcIikgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHJlZmxlY3Rpb24gb2JqZWN0ICh3aGljaCBpcyBmb3IgdHlwZSBcIiIKKyAgICA8PCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkKKyAgICA8PCAiXCIpLiAgTm90ZSB0aGF0IHRoZSBleGFjdCBzYW1lIGNsYXNzIGlzIHJlcXVpcmVkOyBub3QganVzdCB0aGUgc2FtZSAiCisgICAgICAgImRlc2NyaXB0b3IuIjsKKworICB1aW50MzIqIGhhc19iaXRzMSA9IE11dGFibGVIYXNCaXRzKG1lc3NhZ2UxKTsKKyAgdWludDMyKiBoYXNfYml0czIgPSBNdXRhYmxlSGFzQml0cyhtZXNzYWdlMik7CisgIGludCBoYXNfYml0c19zaXplID0gKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsgMzEpIC8gMzI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYXNfYml0c19zaXplOyBpKyspIHsKKyAgICBzdGQ6OnN3YXAoaGFzX2JpdHMxW2ldLCBoYXNfYml0czJbaV0pOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgU1dBUF9BUlJBWVMoQ1BQVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPFRZUEU+ID4obWVzc2FnZTEsIGZpZWxkKS0+U3dhcCggICAgICAgICAgIFwKKyAgICAgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPFRZUEU+ID4obWVzc2FnZTIsIGZpZWxkKSk7ICAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgU1dBUF9BUlJBWVMoSU5UMzIgLCBpbnQzMiApOworICAgICAgICAgIFNXQVBfQVJSQVlTKElOVDY0ICwgaW50NjQgKTsKKyAgICAgICAgICBTV0FQX0FSUkFZUyhVSU5UMzIsIHVpbnQzMik7CisgICAgICAgICAgU1dBUF9BUlJBWVMoVUlOVDY0LCB1aW50NjQpOworICAgICAgICAgIFNXQVBfQVJSQVlTKEZMT0FUICwgZmxvYXQgKTsKKyAgICAgICAgICBTV0FQX0FSUkFZUyhET1VCTEUsIGRvdWJsZSk7CisgICAgICAgICAgU1dBUF9BUlJBWVMoQk9PTCAgLCBib29sICApOworICAgICAgICAgIFNXQVBfQVJSQVlTKEVOVU0gICwgaW50ICAgKTsKKyN1bmRlZiBTV0FQX0FSUkFZUworCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlMSwgZmllbGQpLT5Td2FwKAorICAgICAgICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlMiwgZmllbGQpKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmltcGxlbWVudGVkIHR5cGU6ICIgPDwgZmllbGQtPmNwcF90eXBlKCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgU1dBUF9WQUxVRVMoQ1BQVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc3RkOjpzd2FwKCpNdXRhYmxlUmF3PFRZUEU+KG1lc3NhZ2UxLCBmaWVsZCksICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKk11dGFibGVSYXc8VFlQRT4obWVzc2FnZTIsIGZpZWxkKSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgU1dBUF9WQUxVRVMoSU5UMzIgLCBpbnQzMiApOworICAgICAgICAgIFNXQVBfVkFMVUVTKElOVDY0ICwgaW50NjQgKTsKKyAgICAgICAgICBTV0FQX1ZBTFVFUyhVSU5UMzIsIHVpbnQzMik7CisgICAgICAgICAgU1dBUF9WQUxVRVMoVUlOVDY0LCB1aW50NjQpOworICAgICAgICAgIFNXQVBfVkFMVUVTKEZMT0FUICwgZmxvYXQgKTsKKyAgICAgICAgICBTV0FQX1ZBTFVFUyhET1VCTEUsIGRvdWJsZSk7CisgICAgICAgICAgU1dBUF9WQUxVRVMoQk9PTCAgLCBib29sICApOworICAgICAgICAgIFNXQVBfVkFMVUVTKEVOVU0gICwgaW50ICAgKTsKKyAgICAgICAgICBTV0FQX1ZBTFVFUyhNRVNTQUdFLCBNZXNzYWdlKik7CisjdW5kZWYgU1dBUF9WQUxVRVMKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgICAgc3RkOjpzd2FwKCpNdXRhYmxlUmF3PHN0cmluZyo+KG1lc3NhZ2UxLCBmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAqTXV0YWJsZVJhdzxzdHJpbmcqPihtZXNzYWdlMiwgZmllbGQpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgdHlwZTogIiA8PCBmaWVsZC0+Y3BwX3R5cGUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoZXh0ZW5zaW9uc19vZmZzZXRfICE9IC0xKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlMSktPlN3YXAoTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlMikpOworICB9CisKKyAgTXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZTEpLT5Td2FwKE11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UyKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6SGFzRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfTUVTU0FHRV9UWVBFKEhhc0ZpZWxkKTsKKyAgVVNBR0VfQ0hFQ0tfU0lOR1VMQVIoSGFzRmllbGQpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkhhcyhmaWVsZC0+bnVtYmVyKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBIYXNCaXQobWVzc2FnZSwgZmllbGQpOworICB9Cit9CisKK2ludCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6RmllbGRTaXplKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX01FU1NBR0VfVFlQRShGaWVsZFNpemUpOworICBVU0FHRV9DSEVDS19SRVBFQVRFRChGaWVsZFNpemUpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkV4dGVuc2lvblNpemUoZmllbGQtPm51bWJlcigpKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI1VQUEVSQ0FTRSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBHZXRSYXc8UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+ID4obWVzc2FnZSwgZmllbGQpLnNpemUoKQorCisgICAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRSggSU5UNjQsICBpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMik7CisgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIHVpbnQ2NCk7CisgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSk7CisgICAgICBIQU5ETEVfVFlQRSggRkxPQVQsICBmbG9hdCk7CisgICAgICBIQU5ETEVfVFlQRSggIEJPT0wsICAgYm9vbCk7CisgICAgICBIQU5ETEVfVFlQRSggIEVOVU0sICAgIGludCk7CisjdW5kZWYgSEFORExFX1RZUEUKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgcmV0dXJuIEdldFJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLnNpemUoKTsKKyAgICB9CisKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpDbGVhckZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfTUVTU0FHRV9UWVBFKENsZWFyRmllbGQpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5DbGVhckV4dGVuc2lvbihmaWVsZC0+bnVtYmVyKCkpOworICB9IGVsc2UgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIGlmIChIYXNCaXQoKm1lc3NhZ2UsIGZpZWxkKSkgeworICAgICAgQ2xlYXJCaXQobWVzc2FnZSwgZmllbGQpOworCisgICAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgZmllbGQgYmFjayB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKyAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgQ0xFQVJfVFlQRShDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKk11dGFibGVSYXc8VFlQRT4obWVzc2FnZSwgZmllbGQpID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlXyMjVFlQRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIENMRUFSX1RZUEUoSU5UMzIgLCBpbnQzMiApOworICAgICAgICBDTEVBUl9UWVBFKElOVDY0ICwgaW50NjQgKTsKKyAgICAgICAgQ0xFQVJfVFlQRShVSU5UMzIsIHVpbnQzMik7CisgICAgICAgIENMRUFSX1RZUEUoVUlOVDY0LCB1aW50NjQpOworICAgICAgICBDTEVBUl9UWVBFKEZMT0FUICwgZmxvYXQgKTsKKyAgICAgICAgQ0xFQVJfVFlQRShET1VCTEUsIGRvdWJsZSk7CisgICAgICAgIENMRUFSX1RZUEUoQk9PTCAgLCBib29sICApOworI3VuZGVmIENMRUFSX1RZUEUKKworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICAgICpNdXRhYmxlUmF3PGludD4obWVzc2FnZSwgZmllbGQpID0KKyAgICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bnVtYmVyKCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nKiBkZWZhdWx0X3B0ciA9IERlZmF1bHRSYXc8Y29uc3Qgc3RyaW5nKj4oZmllbGQpOworICAgICAgICAgICAgICBzdHJpbmcqKiB2YWx1ZSA9IE11dGFibGVSYXc8c3RyaW5nKj4obWVzc2FnZSwgZmllbGQpOworICAgICAgICAgICAgICBpZiAoKnZhbHVlICE9IGRlZmF1bHRfcHRyKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAoKnZhbHVlKS0+YXNzaWduKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgKCp2YWx1ZSktPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgKCpNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCkpLT5DbGVhcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI1VQUEVSQ0FTRSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+ID4obWVzc2FnZSwgZmllbGQpLT5DbGVhcigpOyAgICAgICBcCisgICAgICAgIGJyZWFrCisKKyAgICAgIEhBTkRMRV9UWVBFKCBJTlQzMiwgIGludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBJTlQ2NCwgIGludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyKTsKKyAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0KTsKKyAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlKTsKKyAgICAgIEhBTkRMRV9UWVBFKCBGTE9BVCwgIGZsb2F0KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgQk9PTCwgICBib29sKTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgRU5VTSwgICAgaW50KTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gPihtZXNzYWdlLCBmaWVsZCktPkNsZWFyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoaWNoIHN1YmNsYXNzIG9mIFJlcGVhdGVkUHRyRmllbGRCYXNlIHRoZSB0eXBlIGlzLAorICAgICAgICAvLyBzbyB3ZSB1c2UgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgZGlyZWN0bHkuCisgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgLT5DbGVhcjxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6UmVtb3ZlTGFzdCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfTUVTU0FHRV9UWVBFKFJlbW92ZUxhc3QpOworICBVU0FHRV9DSEVDS19SRVBFQVRFRChSZW1vdmVMYXN0KTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+UmVtb3ZlTGFzdChmaWVsZC0+bnVtYmVyKCkpOworICB9IGVsc2UgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjVVBQRVJDQVNFIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4gPihtZXNzYWdlLCBmaWVsZCktPlJlbW92ZUxhc3QoKTsgIFwKKyAgICAgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoIElOVDMyLCAgaW50MzIpOworICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQpOworICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzIpOworICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjQpOworICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgSEFORExFX1RZUEUoIEZMT0FULCAgZmxvYXQpOworICAgICAgSEFORExFX1RZUEUoICBCT09MLCAgIGJvb2wpOworICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgICBpbnQpOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gPihtZXNzYWdlLCBmaWVsZCktPlJlbW92ZUxhc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICAgIC0+UmVtb3ZlTGFzdDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U3dhcEVsZW1lbnRzKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBpbnQgaW5kZXgxLAorICAgIGludCBpbmRleDIpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfTUVTU0FHRV9UWVBFKFN3YXApOworICBVU0FHRV9DSEVDS19SRVBFQVRFRChTd2FwKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U3dhcEVsZW1lbnRzKGZpZWxkLT5udW1iZXIoKSwgaW5kZXgxLCBpbmRleDIpOworICB9IGVsc2UgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjVVBQRVJDQVNFIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4gPihtZXNzYWdlLCBmaWVsZCkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWsKKworICAgICAgSEFORExFX1RZUEUoIElOVDMyLCAgaW50MzIpOworICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQpOworICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzIpOworICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjQpOworICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgSEFORExFX1RZUEUoIEZMT0FULCAgZmxvYXQpOworICAgICAgSEFORExFX1RZUEUoICBCT09MLCAgIGJvb2wpOworICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgICBpbnQpOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworbmFtZXNwYWNlIHsKKy8vIENvbXBhcmlzb24gZnVuY3RvciBmb3Igc29ydGluZyBGaWVsZERlc2NyaXB0b3JzIGJ5IGZpZWxkIG51bWJlci4KK3N0cnVjdCBGaWVsZE51bWJlclNvcnRlciB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGxlZnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJpZ2h0KSBjb25zdCB7CisgICAgcmV0dXJuIGxlZnQtPm51bWJlcigpIDwgcmlnaHQtPm51bWJlcigpOworICB9Cit9OworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Okxpc3RGaWVsZHMoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3QgeworICBvdXRwdXQtPmNsZWFyKCk7CisKKyAgLy8gT3B0aW1pemF0aW9uOiAgVGhlIGRlZmF1bHQgaW5zdGFuY2UgbmV2ZXIgaGFzIGFueSBmaWVsZHMgc2V0LgorICBpZiAoJm1lc3NhZ2UgPT0gZGVmYXVsdF9pbnN0YW5jZV8pIHJldHVybjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgaWYgKEZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCkgPiAwKSB7CisgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKGZpZWxkKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKEhhc0JpdChtZXNzYWdlLCBmaWVsZCkpIHsKKyAgICAgICAgb3V0cHV0LT5wdXNoX2JhY2soZmllbGQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChleHRlbnNpb25zX29mZnNldF8gIT0gLTEpIHsKKyAgICBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuQXBwZW5kVG9MaXN0KGRlc2NyaXB0b3JfLCBkZXNjcmlwdG9yX3Bvb2xfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKKyAgfQorCisgIC8vIExpc3RGaWVsZHMoKSBtdXN0IHNvcnQgb3V0cHV0IGJ5IGZpZWxkIG51bWJlci4KKyAgc29ydChvdXRwdXQtPmJlZ2luKCksIG91dHB1dC0+ZW5kKCksIEZpZWxkTnVtYmVyU29ydGVyKCkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyN1bmRlZiBERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUworI2RlZmluZSBERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhUWVBFTkFNRSwgVFlQRSwgUEFTU1RZUEUsIENQUFRZUEUpICAgICAgICBcCisgIFBBU1NUWVBFIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX0FMTChHZXQjI1RZUEVOQU1FLCBTSU5HVUxBUiwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0IyNUWVBFTkFNRSggICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT5kZWZhdWx0X3ZhbHVlXyMjUEFTU1RZUEUoKSk7ICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBHZXRGaWVsZDxUWVBFPihtZXNzYWdlLCBmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBBU1NUWVBFIHZhbHVlKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX0FMTChTZXQjI1RZUEVOQU1FLCBTSU5HVUxBUiwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5TZXQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksIHZhbHVlLCBmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNldEZpZWxkPFRZUEU+KG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQQVNTVFlQRSBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX0FMTChHZXRSZXBlYXRlZCMjVFlQRU5BTUUsIFJFUEVBVEVELCBDUFBUWVBFKTsgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0UmVwZWF0ZWQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGluZGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBHZXRSZXBlYXRlZEZpZWxkPFRZUEU+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRSZXBlYXRlZCMjVFlQRU5BTUUoICAgICAgICAgICAgICAgICAgICBcCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCBpbmRleCwgUEFTU1RZUEUgdmFsdWUpIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX0FMTChTZXRSZXBlYXRlZCMjVFlQRU5BTUUsIFJFUEVBVEVELCBDUFBUWVBFKTsgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlNldFJlcGVhdGVkIyNUWVBFTkFNRSggICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGluZGV4LCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNldFJlcGVhdGVkRmllbGQ8VFlQRT4obWVzc2FnZSwgZmllbGQsIGluZGV4LCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpBZGQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBBU1NUWVBFIHZhbHVlKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVTQUdFX0NIRUNLX0FMTChBZGQjI1RZUEVOQU1FLCBSRVBFQVRFRCwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPkFkZCMjVFlQRU5BTUUoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksIGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCksIHZhbHVlLCAgICBcCisgICAgICAgIGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQWRkRmllbGQ8VFlQRT4obWVzc2FnZSwgZmllbGQsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhJbnQzMiAsIGludDMyICwgaW50MzIgLCBJTlQzMiApCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhJbnQ2NCAsIGludDY0ICwgaW50NjQgLCBJTlQ2NCApCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhVSW50MzIsIHVpbnQzMiwgdWludDMyLCBVSU5UMzIpCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhVSW50NjQsIHVpbnQ2NCwgdWludDY0LCBVSU5UNjQpCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhGbG9hdCAsIGZsb2F0ICwgZmxvYXQgLCBGTE9BVCApCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhEb3VibGUsIGRvdWJsZSwgZG91YmxlLCBET1VCTEUpCitERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhCb29sICAsIGJvb2wgICwgYm9vbCAgLCBCT09MICApCisjdW5kZWYgREVGSU5FX1BSSU1JVElWRV9BQ0NFU1NPUlMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJpbmcgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFN0cmluZygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChHZXRTdHJpbmcsIFNJTkdVTEFSLCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRTdHJpbmcoZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICByZXR1cm4gKkdldEZpZWxkPGNvbnN0IHN0cmluZyo+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICB9CisKKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICByZXR1cm4ga0VtcHR5U3RyaW5nOyAgLy8gTWFrZSBjb21waWxlciBoYXBweS4KKyAgfQorfQorCitjb25zdCBzdHJpbmcmIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRTdHJpbmdSZWZlcmVuY2UoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBzdHJpbmcqIHNjcmF0Y2gpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKEdldFN0cmluZ1JlZmVyZW5jZSwgU0lOR1VMQVIsIFNUUklORyk7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkdldFN0cmluZyhmaWVsZC0+bnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICB9IGVsc2UgeworICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KKyAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgIHJldHVybiAqR2V0RmllbGQ8Y29uc3Qgc3RyaW5nKj4obWVzc2FnZSwgZmllbGQpOworICAgIH0KKworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOworICAgIHJldHVybiBrRW1wdHlTdHJpbmc7ICAvLyBNYWtlIGNvbXBpbGVyIGhhcHB5LgorICB9Cit9CisKKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0U3RyaW5nKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoU2V0U3RyaW5nLCBTSU5HVUxBUiwgU1RSSU5HKTsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5TZXRTdHJpbmcoZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPnR5cGUoKSwgdmFsdWUsIGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7CisgICAgICAgIHN0cmluZyoqIHB0ciA9IE11dGFibGVGaWVsZDxzdHJpbmcqPihtZXNzYWdlLCBmaWVsZCk7CisgICAgICAgIGlmICgqcHRyID09IERlZmF1bHRSYXc8Y29uc3Qgc3RyaW5nKj4oZmllbGQpKSB7CisgICAgICAgICAgKnB0ciA9IG5ldyBzdHJpbmcodmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICgqcHRyKS0+YXNzaWduKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitzdHJpbmcgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFJlcGVhdGVkU3RyaW5nKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoR2V0UmVwZWF0ZWRTdHJpbmcsIFJFUEVBVEVELCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZFN0cmluZyhmaWVsZC0+bnVtYmVyKCksIGluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICByZXR1cm4gR2V0UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCk7CisgICAgfQorCisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgICAgcmV0dXJuIGtFbXB0eVN0cmluZzsgIC8vIE1ha2UgY29tcGlsZXIgaGFwcHkuCisgIH0KK30KKworY29uc3Qgc3RyaW5nJiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBpbnQgaW5kZXgsIHN0cmluZyogc2NyYXRjaCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoR2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UsIFJFUEVBVEVELCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZFN0cmluZyhmaWVsZC0+bnVtYmVyKCksIGluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICByZXR1cm4gR2V0UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCk7CisgICAgfQorCisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgICAgcmV0dXJuIGtFbXB0eVN0cmluZzsgIC8vIE1ha2UgY29tcGlsZXIgaGFwcHkuCisgIH0KK30KKworCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRSZXBlYXRlZFN0cmluZygKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGludCBpbmRleCwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoU2V0UmVwZWF0ZWRTdHJpbmcsIFJFUEVBVEVELCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U2V0UmVwZWF0ZWRTdHJpbmcoCisgICAgICBmaWVsZC0+bnVtYmVyKCksIGluZGV4LCB2YWx1ZSk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgKk11dGFibGVSZXBlYXRlZEZpZWxkPHN0cmluZz4obWVzc2FnZSwgZmllbGQsIGluZGV4KSA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpBZGRTdHJpbmcoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBjb25zdCBzdHJpbmcmIHZhbHVlKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChBZGRTdHJpbmcsIFJFUEVBVEVELCBTVFJJTkcpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+QWRkU3RyaW5nKGZpZWxkLT5udW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPnR5cGUoKSwgdmFsdWUsIGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAqQWRkRmllbGQ8c3RyaW5nPihtZXNzYWdlLCBmaWVsZCkgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0RW51bSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChHZXRFbnVtLCBTSU5HVUxBUiwgRU5VTSk7CisKKyAgaW50IHZhbHVlOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgdmFsdWUgPSBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0RW51bSgKKyAgICAgIGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSk7CisgIH0gZWxzZSB7CisgICAgdmFsdWUgPSBHZXRGaWVsZDxpbnQ+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgfQorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQgPQorICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOworICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IE5VTEwpOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRFbnVtKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKFNldEVudW0sIFNJTkdVTEFSLCBFTlVNKTsKKyAgVVNBR0VfQ0hFQ0tfRU5VTV9WQUxVRShTZXRFbnVtKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U2V0RW51bShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+bnVtYmVyKCksIGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICBTZXRGaWVsZDxpbnQ+KG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZS0+bnVtYmVyKCkpOworICB9Cit9CisKK2NvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZEVudW0oCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChHZXRSZXBlYXRlZEVudW0sIFJFUEVBVEVELCBFTlVNKTsKKworICBpbnQgdmFsdWU7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICB2YWx1ZSA9IEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZEVudW0oZmllbGQtPm51bWJlcigpLCBpbmRleCk7CisgIH0gZWxzZSB7CisgICAgdmFsdWUgPSBHZXRSZXBlYXRlZEZpZWxkPGludD4obWVzc2FnZSwgZmllbGQsIGluZGV4KTsKKyAgfQorICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQgPQorICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOworICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IE5VTEwpOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRSZXBlYXRlZEVudW0oCisgICAgTWVzc2FnZSogbWVzc2FnZSwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKFNldFJlcGVhdGVkRW51bSwgUkVQRUFURUQsIEVOVU0pOworICBVU0FHRV9DSEVDS19FTlVNX1ZBTFVFKFNldFJlcGVhdGVkRW51bSk7CisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlNldFJlcGVhdGVkRW51bSgKKyAgICAgIGZpZWxkLT5udW1iZXIoKSwgaW5kZXgsIHZhbHVlLT5udW1iZXIoKSk7CisgIH0gZWxzZSB7CisgICAgU2V0UmVwZWF0ZWRGaWVsZDxpbnQ+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCwgdmFsdWUtPm51bWJlcigpKTsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpBZGRFbnVtKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKEFkZEVudW0sIFJFUEVBVEVELCBFTlVNKTsKKyAgVVNBR0VfQ0hFQ0tfRU5VTV9WQUxVRShBZGRFbnVtKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+QWRkRW51bShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPm51bWJlcigpLCBmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgQWRkRmllbGQ8aW50PihtZXNzYWdlLCBmaWVsZCwgdmFsdWUtPm51bWJlcigpKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IE1lc3NhZ2UmIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRNZXNzYWdlKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKEdldE1lc3NhZ2UsIFNJTkdVTEFSLCBNRVNTQUdFKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IE1lc3NhZ2UmPigKKyAgICAgICAgR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkdldE1lc3NhZ2UoCisgICAgICAgICAgZmllbGQtPm51bWJlcigpLCBmaWVsZC0+bWVzc2FnZV90eXBlKCksCisgICAgICAgICAgZmFjdG9yeSA9PSBOVUxMID8gbWVzc2FnZV9mYWN0b3J5XyA6IGZhY3RvcnkpKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBNZXNzYWdlKiByZXN1bHQgPSBHZXRSYXc8Y29uc3QgTWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgIHJlc3VsdCA9IERlZmF1bHRSYXc8Y29uc3QgTWVzc2FnZSo+KGZpZWxkKTsKKyAgICB9CisgICAgcmV0dXJuICpyZXN1bHQ7CisgIH0KK30KKworTWVzc2FnZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVNZXNzYWdlKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKE11dGFibGVNZXNzYWdlLCBTSU5HVUxBUiwgTUVTU0FHRSk7CisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNZXNzYWdlKj4oCisgICAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPk11dGFibGVNZXNzYWdlKGZpZWxkLAorICAgICAgICAgIGZhY3RvcnkgPT0gTlVMTCA/IG1lc3NhZ2VfZmFjdG9yeV8gOiBmYWN0b3J5KSk7CisgIH0gZWxzZSB7CisgICAgTWVzc2FnZSoqIHJlc3VsdCA9IE11dGFibGVGaWVsZDxNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpOworICAgIGlmICgqcmVzdWx0ID09IE5VTEwpIHsKKyAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfbWVzc2FnZSA9IERlZmF1bHRSYXc8Y29uc3QgTWVzc2FnZSo+KGZpZWxkKTsKKyAgICAgICpyZXN1bHQgPSBkZWZhdWx0X21lc3NhZ2UtPk5ldygpOworICAgIH0KKyAgICByZXR1cm4gKnJlc3VsdDsKKyAgfQorfQorCitjb25zdCBNZXNzYWdlJiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoR2V0UmVwZWF0ZWRNZXNzYWdlLCBSRVBFQVRFRCwgTUVTU0FHRSk7CisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBNZXNzYWdlJj4oCisgICAgICAgIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZE1lc3NhZ2UoZmllbGQtPm51bWJlcigpLCBpbmRleCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBHZXRSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAuR2V0PEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KGluZGV4KTsKKyAgfQorfQorCitNZXNzYWdlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkTWVzc2FnZSgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKE11dGFibGVSZXBlYXRlZE1lc3NhZ2UsIFJFUEVBVEVELCBNRVNTQUdFKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1lc3NhZ2UqPigKKyAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZSgKKyAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGluZGV4KSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAtPk11dGFibGU8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oaW5kZXgpOworICB9Cit9CisKK01lc3NhZ2UqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpBZGRNZXNzYWdlKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKEFkZE1lc3NhZ2UsIFJFUEVBVEVELCBNRVNTQUdFKTsKKworICBpZiAoZmFjdG9yeSA9PSBOVUxMKSBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5XzsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1lc3NhZ2UqPigKKyAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+QWRkTWVzc2FnZShmaWVsZCwgZmFjdG9yeSkpOworICB9IGVsc2UgeworICAgIC8vIFdlIGNhbid0IHVzZSBBZGRGaWVsZDxNZXNzYWdlPigpIGJlY2F1c2UgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgZG9lc24ndAorICAgIC8vIGtub3cgaG93IHRvIGFsbG9jYXRlIG9uZS4KKyAgICBSZXBlYXRlZFB0ckZpZWxkQmFzZSogcmVwZWF0ZWQgPQorICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpOworICAgIE1lc3NhZ2UqIHJlc3VsdCA9IHJlcGVhdGVkLT5BZGRGcm9tQ2xlYXJlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgLy8gV2UgbXVzdCBhbGxvY2F0ZSBhIG5ldyBvYmplY3QuCisgICAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGU7CisgICAgICBpZiAocmVwZWF0ZWQtPnNpemUoKSA9PSAwKSB7CisgICAgICAgIHByb3RvdHlwZSA9IGZhY3RvcnktPkdldFByb3RvdHlwZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvdG90eXBlID0gJnJlcGVhdGVkLT5HZXQ8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oMCk7CisgICAgICB9CisgICAgICByZXN1bHQgPSBwcm90b3R5cGUtPk5ldygpOworICAgICAgcmVwZWF0ZWQtPkFkZEFsbG9jYXRlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgeworICBpZiAoZXh0ZW5zaW9uc19vZmZzZXRfID09IC0xKSByZXR1cm4gTlVMTDsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9IGRlc2NyaXB0b3JfcG9vbF8tPkZpbmRFeHRlbnNpb25CeU5hbWUobmFtZSk7CisgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiByZXN1bHQtPmNvbnRhaW5pbmdfdHlwZSgpID09IGRlc2NyaXB0b3JfKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAvLyBNZXNzYWdlU2V0IGV4dGVuc2lvbnMgbWF5IGJlIGlkZW50aWZpZWQgYnkgdHlwZSBuYW1lLgorICAgIGNvbnN0IERlc2NyaXB0b3IqIHR5cGUgPSBkZXNjcmlwdG9yX3Bvb2xfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUobmFtZSk7CisgICAgaWYgKHR5cGUgIT0gTlVMTCkgeworICAgICAgLy8gTG9vayBmb3IgYSBtYXRjaGluZyBleHRlbnNpb24gaW4gdGhlIGZvcmVpZ24gdHlwZSdzIHNjb3BlLgorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uID0gdHlwZS0+ZXh0ZW5zaW9uKGkpOworICAgICAgICBpZiAoZXh0ZW5zaW9uLT5jb250YWluaW5nX3R5cGUoKSA9PSBkZXNjcmlwdG9yXyAmJgorICAgICAgICAgICAgZXh0ZW5zaW9uLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+aXNfb3B0aW9uYWwoKSAmJgorICAgICAgICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3R5cGUoKSA9PSB0eXBlKSB7CisgICAgICAgICAgLy8gRm91bmQgaXQuCisgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBGaWVsZERlc2NyaXB0b3IqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpGaW5kS25vd25FeHRlbnNpb25CeU51bWJlcigKKyAgICBpbnQgbnVtYmVyKSBjb25zdCB7CisgIGlmIChleHRlbnNpb25zX29mZnNldF8gPT0gLTEpIHJldHVybiBOVUxMOworICByZXR1cm4gZGVzY3JpcHRvcl9wb29sXy0+RmluZEV4dGVuc2lvbkJ5TnVtYmVyKGRlc2NyaXB0b3JfLCBudW1iZXIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBTb21lIHByaXZhdGUgaGVscGVycy4KKworLy8gVGhlc2Ugc2ltcGxlIHRlbXBsYXRlIGFjY2Vzc29ycyBvYnRhaW4gcG9pbnRlcnMgKG9yIHJlZmVyZW5jZXMpIHRvCisvLyB0aGUgZ2l2ZW4gZmllbGQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBjb25zdCBUeXBlJiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmF3KAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgY29uc3Qgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KCZtZXNzYWdlKSArCisgICAgICAgICAgICAgICAgICAgIG9mZnNldHNfW2ZpZWxkLT5pbmRleCgpXTsKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFR5cGUqPihwdHIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBUeXBlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TXV0YWJsZVJhdygKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihtZXNzYWdlKSArIG9mZnNldHNfW2ZpZWxkLT5pbmRleCgpXTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VHlwZSo+KHB0cik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIGNvbnN0IFR5cGUmIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpEZWZhdWx0UmF3KAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgY29uc3Qgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRlZmF1bHRfaW5zdGFuY2VfKSArCisgICAgICAgICAgICAgICAgICAgIG9mZnNldHNfW2ZpZWxkLT5pbmRleCgpXTsKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFR5cGUqPihwdHIpOworfQorCitpbmxpbmUgY29uc3QgdWludDMyKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0SGFzQml0cygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7CisgIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKyBoYXNfYml0c19vZmZzZXRfOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzIqPihwdHIpOworfQoraW5saW5lIHVpbnQzMiogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVIYXNCaXRzKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0IHsKKyAgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KG1lc3NhZ2UpICsgaGFzX2JpdHNfb2Zmc2V0XzsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyKj4ocHRyKTsKK30KKworaW5saW5lIGNvbnN0IEV4dGVuc2lvblNldCYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldEV4dGVuc2lvblNldCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0tfTkUoZXh0ZW5zaW9uc19vZmZzZXRfLCAtMSk7CisgIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKworICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zX29mZnNldF87CisgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHRlbnNpb25TZXQqPihwdHIpOworfQoraW5saW5lIEV4dGVuc2lvblNldCogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVFeHRlbnNpb25TZXQoCisgICAgTWVzc2FnZSogbWVzc2FnZSkgY29uc3QgeworICBHT09HTEVfRENIRUNLX05FKGV4dGVuc2lvbnNfb2Zmc2V0XywgLTEpOworICB2b2lkKiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obWVzc2FnZSkgKyBleHRlbnNpb25zX29mZnNldF87CisgIHJldHVybiByZWludGVycHJldF9jYXN0PEV4dGVuc2lvblNldCo+KHB0cik7Cit9CisKKy8vIFNpbXBsZSBhY2Nlc3NvcnMgZm9yIG1hbmlwdWxhdGluZyBoYXNfYml0c18uCitpbmxpbmUgYm9vbCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6SGFzQml0KAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEhhc0JpdHMobWVzc2FnZSlbZmllbGQtPmluZGV4KCkgLyAzMl0gJgorICAgICgxIDw8IChmaWVsZC0+aW5kZXgoKSAlIDMyKSk7Cit9CisKK2lubGluZSB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRCaXQoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBNdXRhYmxlSGFzQml0cyhtZXNzYWdlKVtmaWVsZC0+aW5kZXgoKSAvIDMyXSB8PSAoMSA8PCAoZmllbGQtPmluZGV4KCkgJSAzMikpOworfQorCitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6Q2xlYXJCaXQoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBNdXRhYmxlSGFzQml0cyhtZXNzYWdlKVtmaWVsZC0+aW5kZXgoKSAvIDMyXSAmPSB+KDEgPDwgKGZpZWxkLT5pbmRleCgpICUgMzIpKTsKK30KKworLy8gVGVtcGxhdGUgaW1wbGVtZW50YXRpb25zIG9mIGJhc2ljIGFjY2Vzc29ycy4gIElubGluZSBiZWNhdXNlIGVhY2gKKy8vIHRlbXBsYXRlIGluc3RhbmNlIGlzIG9ubHkgY2FsbGVkIGZyb20gb25lIGxvY2F0aW9uLiAgVGhlc2UgYXJlCisvLyB1c2VkIGZvciBhbGwgdHlwZXMgZXhjZXB0IG1lc3NhZ2VzLgordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitpbmxpbmUgY29uc3QgVHlwZSYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldEZpZWxkKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFJhdzxUeXBlPihtZXNzYWdlLCBmaWVsZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldEZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IFR5cGUmIHZhbHVlKSBjb25zdCB7CisgICpNdXRhYmxlUmF3PFR5cGU+KG1lc3NhZ2UsIGZpZWxkKSA9IHZhbHVlOworICBTZXRCaXQobWVzc2FnZSwgZmllbGQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBUeXBlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TXV0YWJsZUZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgU2V0Qml0KG1lc3NhZ2UsIGZpZWxkKTsKKyAgcmV0dXJuIE11dGFibGVSYXc8VHlwZT4obWVzc2FnZSwgZmllbGQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBjb25zdCBUeXBlJiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRGaWVsZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFJhdzxSZXBlYXRlZEZpZWxkPFR5cGU+ID4obWVzc2FnZSwgZmllbGQpLkdldChpbmRleCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIGNvbnN0IFR5cGUmIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZFB0ckZpZWxkKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gR2V0UmF3PFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4gPihtZXNzYWdlLCBmaWVsZCkuR2V0KGluZGV4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0UmVwZWF0ZWRGaWVsZCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGludCBpbmRleCwgVHlwZSB2YWx1ZSkgY29uc3QgeworICBNdXRhYmxlUmF3PFJlcGVhdGVkRmllbGQ8VHlwZT4gPihtZXNzYWdlLCBmaWVsZCktPlNldChpbmRleCwgdmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KK2lubGluZSBUeXBlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkRmllbGQoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7CisgIFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4qIHJlcGVhdGVkID0KKyAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4gPihtZXNzYWdlLCBmaWVsZCk7CisgIHJldHVybiByZXBlYXRlZC0+TXV0YWJsZShpbmRleCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgoraW5saW5lIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkFkZEZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IFR5cGUmIHZhbHVlKSBjb25zdCB7CisgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxUeXBlPiA+KG1lc3NhZ2UsIGZpZWxkKS0+QWRkKHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitpbmxpbmUgVHlwZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkFkZEZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxUeXBlPiogcmVwZWF0ZWQgPQorICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZDxUeXBlPiA+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgcmV0dXJuIHJlcGVhdGVkLT5BZGQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTQ1ZmExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oCkBAIC0wLDAgKzEsNDI0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGhlYWRlciBpcyBsb2dpY2FsbHkgaW50ZXJuYWwsIGJ1dCBpcyBtYWRlIHB1YmxpYyBiZWNhdXNlIGl0IGlzIHVzZWQKKy8vIGZyb20gcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUsIHdoaWNoIG1heSByZXNpZGUgaW4gb3RoZXIgY29tcG9uZW50cy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfUkVGTEVDVElPTl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX1JFRkxFQ1RJT05fSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBjbGFzcyBEZXNjcmlwdG9yUG9vbDsKKyAgLy8gR2VuZXJhdGVkIGNvZGUgbmVlZHMgdGhlc2UgdG8gaGF2ZSBiZWVuIGZvcndhcmQtZGVjbGFyZWQuICBFYXNpZXIgdG8gZG8gaXQKKyAgLy8gaGVyZSB0aGFuIHRvIHByaW50IHRoZW0gaW5zaWRlIGV2ZXJ5IC5wYi5oIGZpbGUuCisgIGNsYXNzIEZpbGVEZXNjcmlwdG9yOworICBjbGFzcyBFbnVtRGVzY3JpcHRvcjsKK30KKworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb247CisKKy8vIERlZmluZWQgaW4gb3RoZXIgZmlsZXMuCitjbGFzcyBFeHRlbnNpb25TZXQ7ICAgICAgICAgICAgIC8vIGV4dGVuc2lvbl9zZXQuaAorCisvLyBUSElTIENMQVNTIElTIE5PVCBJTlRFTkRFRCBGT1IgRElSRUNUIFVTRS4gIEl0IGlzIGludGVuZGVkIGZvciB1c2UKKy8vIGJ5IGdlbmVyYXRlZCBjb2RlLiAgVGhpcyBjbGFzcyBpcyBqdXN0IGEgYmlnIGhhY2sgdGhhdCByZWR1Y2VzIGNvZGUKKy8vIHNpemUuCisvLworLy8gQSBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBSZWZsZWN0aW9uCisvLyB3aGljaCBleHBlY3RzIGFsbCBmaWVsZHMgdG8gYmUgYmFja2VkIGJ5IHNpbXBsZSB2YXJpYWJsZXMgbG9jYXRlZCBpbgorLy8gbWVtb3J5LiAgVGhlIGxvY2F0aW9ucyBhcmUgZ2l2ZW4gdXNpbmcgYSBiYXNlIHBvaW50ZXIgYW5kIGEgc2V0IG9mCisvLyBvZmZzZXRzLgorLy8KKy8vIEl0IGlzIHJlcXVpcmVkIHRoYXQgdGhlIHVzZXIgcmVwcmVzZW50cyBmaWVsZHMgb2YgZWFjaCB0eXBlIGluIGEgc3RhbmRhcmQKKy8vIHdheSwgc28gdGhhdCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbiBjYW4gY2FzdCB0aGUgdm9pZCogcG9pbnRlciB0bworLy8gdGhlIGFwcHJvcHJpYXRlIHR5cGUuICBGb3IgcHJpbWl0aXZlIGZpZWxkcyBhbmQgc3RyaW5nIGZpZWxkcywgZWFjaCBmaWVsZAorLy8gc2hvdWxkIGJlIHJlcHJlc2VudGVkIHVzaW5nIHRoZSBvYnZpb3VzIEMrKyBwcmltaXRpdmUgdHlwZS4gIEVudW1zIGFuZAorLy8gTWVzc2FnZXMgYXJlIGRpZmZlcmVudDoKKy8vICAtIFNpbmd1bGFyIE1lc3NhZ2UgZmllbGRzIGFyZSBzdG9yZWQgYXMgYSBwb2ludGVyIHRvIGEgTWVzc2FnZS4gIFRoZXNlCisvLyAgICBzaG91bGQgc3RhcnQgb3V0IE5VTEwsIGV4Y2VwdCBmb3IgaW4gdGhlIGRlZmF1bHQgaW5zdGFuY2Ugd2hlcmUgdGhleQorLy8gICAgc2hvdWxkIHN0YXJ0IG91dCBwb2ludGluZyB0byBvdGhlciBkZWZhdWx0IGluc3RhbmNlcy4KKy8vICAtIEVudW0gZmllbGRzIGFyZSBzdG9yZWQgYXMgYW4gaW50LiAgVGhpcyBpbnQgbXVzdCBhbHdheXMgY29udGFpbgorLy8gICAgYSB2YWxpZCB2YWx1ZSwgc3VjaCB0aGF0IEVudW1EZXNjcmlwdG9yOjpGaW5kVmFsdWVCeU51bWJlcigpIHdvdWxkCisvLyAgICBub3QgcmV0dXJuIE5VTEwuCisvLyAgLSBSZXBlYXRlZCBmaWVsZHMgYXJlIHN0b3JlZCBhcyBSZXBlYXRlZEZpZWxkcyBvciBSZXBlYXRlZFB0ckZpZWxkcworLy8gICAgb2Ygd2hhdGV2ZXIgdHlwZSB0aGUgaW5kaXZpZHVhbCBmaWVsZCB3b3VsZCBiZS4gIFN0cmluZ3MgYW5kCisvLyAgICBNZXNzYWdlcyB1c2UgUmVwZWF0ZWRQdHJGaWVsZHMgd2hpbGUgZXZlcnl0aGluZyBlbHNlIHVzZXMKKy8vICAgIFJlcGVhdGVkRmllbGRzLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uIDogcHVibGljIFJlZmxlY3Rpb24geworIHB1YmxpYzoKKyAgLy8gQ29uc3RydWN0cyBhIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uLgorICAvLyBQYXJhbWV0ZXJzOgorICAvLyAgIGRlc2NyaXB0b3I6ICAgIFRoZSBkZXNjcmlwdG9yIGZvciB0aGUgbWVzc2FnZSB0eXBlIGJlaW5nIGltcGxlbWVudGVkLgorICAvLyAgIGRlZmF1bHRfaW5zdGFuY2U6ICBUaGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgbWVzc2FnZS4gIFRoaXMgaXMgb25seQorICAvLyAgICAgICAgICAgICAgICAgIHVzZWQgdG8gb2J0YWluIHBvaW50ZXJzIHRvIGRlZmF1bHQgaW5zdGFuY2VzIG9mIGVtYmVkZGVkCisgIC8vICAgICAgICAgICAgICAgICAgbWVzc2FnZXMsIHdoaWNoIEdldE1lc3NhZ2UoKSB3aWxsIHJldHVybiBpZiB0aGUgcGFydGljdWxhcgorICAvLyAgICAgICAgICAgICAgICAgIHN1Yi1tZXNzYWdlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuICAoVGh1cywgYWxsCisgIC8vICAgICAgICAgICAgICAgICAgZW1iZWRkZWQgbWVzc2FnZSBmaWVsZHMgKm11c3QqIGhhdmUgbm9uLU5VTEwgcG9pbnRlcnMKKyAgLy8gICAgICAgICAgICAgICAgICBpbiB0aGUgZGVmYXVsdCBpbnN0YW5jZS4pCisgIC8vICAgb2Zmc2V0czogICAgICAgQW4gYXJyYXkgb2YgaW50cyBnaXZpbmcgdGhlIGJ5dGUgb2Zmc2V0cywgcmVsYXRpdmUgdG8KKyAgLy8gICAgICAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgdGhlIG1lc3NhZ2Ugb2JqZWN0LCBvZiBlYWNoIGZpZWxkLiAgVGhlc2UgY2FuCisgIC8vICAgICAgICAgICAgICAgICAgYmUgY29tcHV0ZWQgYXQgY29tcGlsZSB0aW1lIHVzaW5nIHRoZQorICAvLyAgICAgICAgICAgICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoKSBtYWNybywgZGVmaW5lZAorICAvLyAgICAgICAgICAgICAgICAgIGJlbG93LgorICAvLyAgIGhhc19iaXRzX29mZnNldDogIE9mZnNldCBpbiB0aGUgbWVzc2FnZSBvZiBhbiBhcnJheSBvZiB1aW50MzJzIG9mIHNpemUKKyAgLy8gICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpLzMyLCByb3VuZGVkIHVwLiAgVGhpcyBpcyBhCisgIC8vICAgICAgICAgICAgICAgICAgYml0ZmllbGQgd2hlcmUgZWFjaCBiaXQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZQorICAvLyAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgZmllbGQgb2YgdGhlIG1lc3NhZ2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgIC8vICAgICAgICAgICAgICAgICAgVGhlIGJpdCBmb3IgZmllbGQgaW5kZXggaSBpcyBvYnRhaW5lZCBieSB0aGUgZXhwcmVzc2lvbjoKKyAgLy8gICAgICAgICAgICAgICAgICAgIGhhc19iaXRzW2kgLyAzMl0gJiAoMSA8PCAoaSAlIDMyKSkKKyAgLy8gICB1bmtub3duX2ZpZWxkc19vZmZzZXQ6ICBPZmZzZXQgaW4gdGhlIG1lc3NhZ2Ugb2YgdGhlIFVua25vd25GaWVsZFNldCBmb3IKKyAgLy8gICAgICAgICAgICAgICAgICB0aGUgbWVzc2FnZS4KKyAgLy8gICBleHRlbnNpb25zX29mZnNldDogIE9mZnNldCBpbiB0aGUgbWVzc2FnZSBvZiB0aGUgRXh0ZW5zaW9uU2V0IGZvciB0aGUKKyAgLy8gICAgICAgICAgICAgICAgICBtZXNzYWdlLCBvciAtMSBpZiB0aGUgbWVzc2FnZSB0eXBlIGhhcyBubyBleHRlbnNpb24KKyAgLy8gICAgICAgICAgICAgICAgICByYW5nZXMuCisgIC8vICAgcG9vbDogICAgICAgICAgRGVzY3JpcHRvclBvb2wgdG8gc2VhcmNoIGZvciBleHRlbnNpb24gZGVmaW5pdGlvbnMuICBPbmx5CisgIC8vICAgICAgICAgICAgICAgICAgdXNlZCBieSBGaW5kS25vd25FeHRlbnNpb25CeU5hbWUoKSBhbmQKKyAgLy8gICAgICAgICAgICAgICAgICBGaW5kS25vd25FeHRlbnNpb25CeU51bWJlcigpLgorICAvLyAgIGZhY3Rvcnk6ICAgICAgIE1lc3NhZ2VGYWN0b3J5IHRvIHVzZSB0byBjb25zdHJ1Y3QgZXh0ZW5zaW9uIG1lc3NhZ2VzLgorICAvLyAgIG9iamVjdF9zaXplOiAgIFRoZSBzaXplIG9mIGEgbWVzc2FnZSBvYmplY3Qgb2YgdGhpcyB0eXBlLCBhcyBtZWFzdXJlZAorICAvLyAgICAgICAgICAgICAgICAgIGJ5IHNpemVvZigpLgorICBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb2Zmc2V0c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX2JpdHNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdW5rbm93bl9maWVsZHNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0ZW5zaW9uc19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9iamVjdF9zaXplKTsKKyAgfkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKCk7CisKKyAgLy8gaW1wbGVtZW50cyBSZWZsZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBjb25zdCBVbmtub3duRmllbGRTZXQmIEdldFVua25vd25GaWVsZHMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3Q7CisgIFVua25vd25GaWVsZFNldCogTXV0YWJsZVVua25vd25GaWVsZHMoTWVzc2FnZSogbWVzc2FnZSkgY29uc3Q7CisKKyAgaW50IFNwYWNlVXNlZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdDsKKworICBib29sIEhhc0ZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBpbnQgRmllbGRTaXplKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB2b2lkIENsZWFyRmllbGQoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIHZvaWQgUmVtb3ZlTGFzdChNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgdm9pZCBTd2FwKE1lc3NhZ2UqIG1lc3NhZ2UxLCBNZXNzYWdlKiBtZXNzYWdlMikgY29uc3Q7CisgIHZvaWQgU3dhcEVsZW1lbnRzKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKSBjb25zdDsKKyAgdm9pZCBMaXN0RmllbGRzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3Q7CisKKyAgaW50MzIgIEdldEludDMyIChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBpbnQ2NCAgR2V0SW50NjQgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIHVpbnQzMiBHZXRVSW50MzIoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgdWludDY0IEdldFVJbnQ2NChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBmbG9hdCAgR2V0RmxvYXQgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGRvdWJsZSBHZXREb3VibGUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgYm9vbCAgIEdldEJvb2wgIChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBzdHJpbmcgR2V0U3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGNvbnN0IHN0cmluZyYgR2V0U3RyaW5nUmVmZXJlbmNlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogc2NyYXRjaCkgY29uc3Q7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEdldEVudW0oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgY29uc3QgTWVzc2FnZSYgR2V0TWVzc2FnZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSBOVUxMKSBjb25zdDsKKworICB2b2lkIFNldEludDMyIChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQzMiAgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldEludDY0IChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQ2NCAgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFVJbnQzMihNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCB1aW50MzIgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFVJbnQ2NChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCB1aW50NjQgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldEZsb2F0IChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBmbG9hdCAgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldERvdWJsZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBkb3VibGUgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldEJvb2wgIChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sICAgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFN0cmluZyhNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlKSBjb25zdDsKKyAgdm9pZCBTZXRFbnVtICAoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0OworICBNZXNzYWdlKiBNdXRhYmxlTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0OworCisgIGludDMyICBHZXRSZXBlYXRlZEludDMyIChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdDsKKyAgaW50NjQgIEdldFJlcGVhdGVkSW50NjQgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0OworICB1aW50MzIgR2V0UmVwZWF0ZWRVSW50MzIoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7CisgIHVpbnQ2NCBHZXRSZXBlYXRlZFVJbnQ2NChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdDsKKyAgZmxvYXQgIEdldFJlcGVhdGVkRmxvYXQgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0OworICBkb3VibGUgR2V0UmVwZWF0ZWREb3VibGUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7CisgIGJvb2wgICBHZXRSZXBlYXRlZEJvb2wgIChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdDsKKyAgc3RyaW5nIEdldFJlcGVhdGVkU3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0OworICBjb25zdCBzdHJpbmcmIEdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIHN0cmluZyogc2NyYXRjaCkgY29uc3Q7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEdldFJlcGVhdGVkRW51bShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7CisgIGNvbnN0IE1lc3NhZ2UmIEdldFJlcGVhdGVkTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gU2V0IHRoZSB2YWx1ZSBvZiBhIGZpZWxkLgorICB2b2lkIFNldFJlcGVhdGVkSW50MzIgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LCBpbnQzMiAgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFJlcGVhdGVkSW50NjQgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LCBpbnQ2NCAgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFJlcGVhdGVkVUludDMyKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LCB1aW50MzIgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFJlcGVhdGVkVUludDY0KE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LCB1aW50NjQgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFJlcGVhdGVkRmxvYXQgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LCBmbG9hdCAgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFJlcGVhdGVkRG91YmxlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFJlcGVhdGVkQm9vbCAgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LCBib29sICAgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFJlcGVhdGVkU3RyaW5nKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFJlcGVhdGVkRW51bShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSBjb25zdDsKKyAgLy8gR2V0IGEgbXV0YWJsZSBwb2ludGVyIHRvIGEgZmllbGQgd2l0aCBhIG1lc3NhZ2UgdHlwZS4KKyAgTWVzc2FnZSogTXV0YWJsZVJlcGVhdGVkTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKKworICB2b2lkIEFkZEludDMyIChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQzMiAgdmFsdWUpIGNvbnN0OworICB2b2lkIEFkZEludDY0IChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQ2NCAgdmFsdWUpIGNvbnN0OworICB2b2lkIEFkZFVJbnQzMihNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCB1aW50MzIgdmFsdWUpIGNvbnN0OworICB2b2lkIEFkZFVJbnQ2NChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCB1aW50NjQgdmFsdWUpIGNvbnN0OworICB2b2lkIEFkZEZsb2F0IChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBmbG9hdCAgdmFsdWUpIGNvbnN0OworICB2b2lkIEFkZERvdWJsZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBkb3VibGUgdmFsdWUpIGNvbnN0OworICB2b2lkIEFkZEJvb2wgIChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sICAgdmFsdWUpIGNvbnN0OworICB2b2lkIEFkZFN0cmluZyhNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBzdHJpbmcmIHZhbHVlKSBjb25zdDsKKyAgdm9pZCBBZGRFbnVtKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0OworICBNZXNzYWdlKiBBZGRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSBOVUxMKSBjb25zdDsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKGludCBudW1iZXIpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2U7CisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2VfOworICBjb25zdCBpbnQqIG9mZnNldHNfOworCisgIGludCBoYXNfYml0c19vZmZzZXRfOworICBpbnQgdW5rbm93bl9maWVsZHNfb2Zmc2V0XzsKKyAgaW50IGV4dGVuc2lvbnNfb2Zmc2V0XzsKKyAgaW50IG9iamVjdF9zaXplXzsKKworICBjb25zdCBEZXNjcmlwdG9yUG9vbCogZGVzY3JpcHRvcl9wb29sXzsKKyAgTWVzc2FnZUZhY3RvcnkqIG1lc3NhZ2VfZmFjdG9yeV87CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGlubGluZSBjb25zdCBUeXBlJiBHZXRSYXcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGlubGluZSBUeXBlKiBNdXRhYmxlUmF3KE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIGNvbnN0IFR5cGUmIERlZmF1bHRSYXcoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGlubGluZSBjb25zdCBNZXNzYWdlKiBHZXRNZXNzYWdlUHJvdG90eXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIGlubGluZSBjb25zdCB1aW50MzIqIEdldEhhc0JpdHMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3Q7CisgIGlubGluZSB1aW50MzIqIE11dGFibGVIYXNCaXRzKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0OworICBpbmxpbmUgY29uc3QgRXh0ZW5zaW9uU2V0JiBHZXRFeHRlbnNpb25TZXQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3Q7CisgIGlubGluZSBFeHRlbnNpb25TZXQqIE11dGFibGVFeHRlbnNpb25TZXQoTWVzc2FnZSogbWVzc2FnZSkgY29uc3Q7CisKKyAgaW5saW5lIGJvb2wgSGFzQml0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgU2V0Qml0KE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgQ2xlYXJCaXQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGlubGluZSBjb25zdCBUeXBlJiBHZXRGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgdm9pZCBTZXRGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBUeXBlJiB2YWx1ZSkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgVHlwZSogTXV0YWJsZUZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgY29uc3QgVHlwZSYgR2V0UmVwZWF0ZWRGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIGNvbnN0IFR5cGUmIEdldFJlcGVhdGVkUHRyRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CisgIGlubGluZSB2b2lkIFNldFJlcGVhdGVkRmllbGQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB2YWx1ZSkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgorICBpbmxpbmUgVHlwZSogTXV0YWJsZVJlcGVhdGVkRmllbGQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIHZvaWQgQWRkRmllbGQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgVHlwZSYgdmFsdWUpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIFR5cGUqIEFkZEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworICBpbnQgR2V0RXh0ZW5zaW9uTnVtYmVyT3JEaWUoY29uc3QgRGVzY3JpcHRvciogdHlwZSkgY29uc3Q7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKTsKK307CisKKy8vIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgZ2l2ZW4gZmllbGQgd2l0aGluIHRoZSBnaXZlbiBhZ2dyZWdhdGUgdHlwZS4KKy8vIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgQU5TSSBDIG9mZnNldG9mKCkgbWFjcm8uICBIb3dldmVyLCBhY2NvcmRpbmcKKy8vIHRvIHRoZSBDKysgc3RhbmRhcmQsIG9mZnNldG9mKCkgb25seSB3b3JrcyBvbiBQT0QgdHlwZXMsIGFuZCBHQ0MKKy8vIGVuZm9yY2VzIHRoaXMgcmVxdWlyZW1lbnQgd2l0aCBhIHdhcm5pbmcuICBJbiBwcmFjdGljZSwgdGhpcyBydWxlIGlzCisvLyB1bm5lY2Vzc2FyaWx5IHN0cmljdDsgdGhlcmUgaXMgcHJvYmFibHkgbm8gY29tcGlsZXIgb3IgcGxhdGZvcm0gb24KKy8vIHdoaWNoIHRoZSBvZmZzZXRzIG9mIHRoZSBkaXJlY3QgZmllbGRzIG9mIGEgY2xhc3MgYXJlIG5vbi1jb25zdGFudC4KKy8vIEZpZWxkcyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMgKmNhbiogaGF2ZSBub24tY29uc3RhbnQgb2Zmc2V0cywKKy8vIGJ1dCB0aGF0J3Mgbm90IHdoYXQgdGhpcyBtYWNybyB3aWxsIGJlIHVzZWQgZm9yLgorLy8KKy8vIE5vdGUgdGhhdCB3ZSBjYWxjdWxhdGUgcmVsYXRpdmUgdG8gdGhlIHBvaW50ZXIgdmFsdWUgMTYgaGVyZSBzaW5jZSBpZiB3ZQorLy8ganVzdCB1c2UgemVybywgR0NDIGNvbXBsYWlucyBhYm91dCBkZXJlZmVyZW5jaW5nIGEgTlVMTCBwb2ludGVyLiAgV2UKKy8vIGNob29zZSAxNiByYXRoZXIgdGhhbiBzb21lIG90aGVyIG51bWJlciBqdXN0IGluIGNhc2UgdGhlIGNvbXBpbGVyIHdvdWxkCisvLyBiZSBjb25mdXNlZCBieSBhbiB1bmFsaWduZWQgcG9pbnRlci4KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChUWVBFLCBGSUVMRCkgICAgXAorICBzdGF0aWNfY2FzdDxpbnQ+KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICZyZWludGVycHJldF9jYXN0PGNvbnN0IFRZUEUqPigxNiktPkZJRUxEKSAtICAgICAgICAgICAgXAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KDE2KSkKKworLy8gVGhlcmUgYXJlIHNvbWUgcGxhY2VzIGluIHByb3RvMiB3aGVyZSBkeW5hbWljX2Nhc3Qgd291bGQgYmUgdXNlZnVsIGFzIGFuCisvLyBvcHRpbWl6YXRpb24uICBGb3IgZXhhbXBsZSwgdGFrZSBNZXNzYWdlOjpNZXJnZUZyb20oY29uc3QgTWVzc2FnZSYgb3RoZXIpLgorLy8gRm9yIGEgZ2l2ZW4gZ2VuZXJhdGVkIG1lc3NhZ2UgRm9vTWVzc2FnZSwgd2UgZ2VuZXJhdGUgdGhlc2UgdHdvIG1ldGhvZHM6CisvLyAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEZvb01lc3NhZ2UmIG90aGVyKTsKKy8vICAgdm9pZCBNZXJnZUZyb20oY29uc3QgTWVzc2FnZSYgb3RoZXIpOworLy8gVGhlIGZvcm1lciBtZXRob2QgY2FuIGJlIGltcGxlbWVudGVkIGRpcmVjdGx5IGluIHRlcm1zIG9mIEZvb01lc3NhZ2UncworLy8gaW5saW5lIGFjY2Vzc29ycywgYnV0IHRoZSBsYXR0ZXIgbWV0aG9kIG11c3Qgd29yayB3aXRoIHRoZSByZWZsZWN0aW9uCisvLyBpbnRlcmZhY2UuICBIb3dldmVyLCBpZiB0aGUgcGFyYW1ldGVyIHRvIHRoZSBsYXR0ZXIgbWV0aG9kIGlzIGFjdHVhbGx5IG9mCisvLyB0eXBlIEZvb01lc3NhZ2UsIHRoZW4gd2UnZCBsaWtlIHRvIGJlIGFibGUgdG8ganVzdCBjYWxsIHRoZSBvdGhlciBtZXRob2QKKy8vIGFzIGFuIG9wdGltaXphdGlvbi4gIFNvLCB3ZSB1c2UgZHluYW1pY19jYXN0IHRvIGNoZWNrIHRoaXMuCisvLworLy8gVGhhdCBzYWlkLCBkeW5hbWljX2Nhc3QgcmVxdWlyZXMgUlRUSSwgd2hpY2ggbWFueSBwZW9wbGUgbGlrZSB0byBkaXNhYmxlCisvLyBmb3IgcGVyZm9ybWFuY2UgYW5kIGNvZGUgc2l6ZSByZWFzb25zLiAgV2hlbiBSVFRJIGlzIG5vdCBhdmFpbGFibGUsIHdlCisvLyBzdGlsbCBuZWVkIHRvIHByb2R1Y2UgY29ycmVjdCByZXN1bHRzLiAgU28sIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGZhbGwKKy8vIGJhY2sgdG8gdXNpbmcgcmVmbGVjdGlvbiwgd2hpY2ggaXMgd2hhdCB3ZSB3b3VsZCBoYXZlIGRvbmUgYW55d2F5IGlmIHRoZQorLy8gb2JqZWN0cyB3ZXJlIG5vdCBvZiB0aGUgZXhhY3Qgc2FtZSBjbGFzcy4KKy8vCisvLyBkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlKCkgaW1wbGVtZW50cyB0aGlzIGxvZ2ljLiAgSWYgUlRUSSBpcworLy8gZW5hYmxlZCwgaXQgZG9lcyBhIGR5bmFtaWNfY2FzdC4gIElmIFJUVEkgaXMgZGlzYWJsZWQsIGl0IGp1c3QgcmV0dXJucworLy8gTlVMTC4KKy8vCisvLyBJZiB5b3UgbmVlZCB0byBjb21waWxlIHdpdGhvdXQgUlRUSSwgc2ltcGx5ICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX05PX1JUVEkuCisvLyBPbiBNU1ZDLCB0aGlzIHNob3VsZCBiZSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LgordGVtcGxhdGU8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+CitpbmxpbmUgVG8gZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZShGcm9tIGZyb20pIHsKKyNpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9OT19SVFRJKSB8fCAoZGVmaW5lZChfTVNDX1ZFUikmJiFkZWZpbmVkKF9DUFBSVFRJKSkKKyAgcmV0dXJuIE5VTEw7CisjZWxzZQorICByZXR1cm4gZHluYW1pY19jYXN0PFRvPihmcm9tKTsKKyNlbmRpZgorfQorCisvLyBIZWxwZXIgZm9yIEVudW1UeXBlX1BhcnNlIGZ1bmN0aW9uczogdHJ5IHRvIHBhcnNlIHRoZSBzdHJpbmcgJ25hbWUnIGFzIGFuCisvLyBlbnVtIG5hbWUgb2YgdGhlIGdpdmVuIHR5cGUsIHJldHVybmluZyB0cnVlIGFuZCBmaWxsaW5nIGluIHZhbHVlIG9uIHN1Y2Nlc3MsCisvLyBvciByZXR1cm5pbmcgZmFsc2UgYW5kIGxlYXZpbmcgdmFsdWUgdW5jaGFuZ2VkIG9uIGZhaWx1cmUuCitMSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBQYXJzZU5hbWVkRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICBpbnQqIHZhbHVlKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRW51bVR5cGU+Citib29sIFBhcnNlTmFtZWRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIEVudW1UeXBlKiB2YWx1ZSkgeworICBpbnQgdG1wOworICBpZiAoIVBhcnNlTmFtZWRFbnVtKGRlc2NyaXB0b3IsIG5hbWUsICZ0bXApKSByZXR1cm4gZmFsc2U7CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PEVudW1UeXBlPih0bXApOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gSnVzdCBhIHdyYXBwZXIgYXJvdW5kIHByaW50aW5nIHRoZSBuYW1lIG9mIGEgdmFsdWUuIFRoZSBtYWluIHBvaW50IG9mIHRoaXMKKy8vIGZ1bmN0aW9uIGlzIG5vdCB0byBiZSBpbmxpbmVkLCBzbyB0aGF0IHlvdSBjYW4gZG8gdGhpcyB3aXRob3V0IGluY2x1ZGluZworLy8gZGVzY3JpcHRvci5oLgorTElCUFJPVE9CVUZfRVhQT1JUIGNvbnN0IHN0cmluZyYgTmFtZU9mRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IHZhbHVlKTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfUkVGTEVDVElPTl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2JjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMzg0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUbyB0ZXN0IEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uLCB3ZSBhY3R1YWxseSBsZXQgdGhlIHByb3RvY29sIGNvbXBpbGVyCisvLyBnZW5lcmF0ZSBhIGZ1bGwgcHJvdG9jb2wgbWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlbiB0ZXN0IGl0cworLy8gcmVmbGVjdGlvbiBpbnRlcmZhY2UuICBUaGlzIGlzIG11Y2ggZWFzaWVyIGFuZCBtb3JlIG1haW50YWluYWJsZSB0aGFuCisvLyB0cnlpbmcgdG8gY3JlYXRlIG91ciBvd24gTWVzc2FnZSBjbGFzcyBmb3IgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24KKy8vIHRvIHdyYXAuCisvLworLy8gVGhlIHRlc3RzIGhlcmUgY2xvc2VseSBtaXJyb3Igc29tZSBvZiB0aGUgdGVzdHMgaW4KKy8vIGNvbXBpbGVyL2NwcC91bml0dGVzdCwgZXhjZXB0IHVzaW5nIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZQorLy8gcmF0aGVyIHRoYW4gZ2VuZXJhdGVkIGFjY2Vzc29ycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIHsKKworLy8gU2hvcnRoYW5kIHRvIGdldCBhIEZpZWxkRGVzY3JpcHRvciBmb3IgYSBmaWVsZCBvZiB1bml0dGVzdDo6VGVzdEFsbFR5cGVzLgorY29uc3QgRmllbGREZXNjcmlwdG9yKiBGKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUobmFtZSk7CisgIEdPT0dMRV9DSEVDSyhyZXN1bHQgIT0gTlVMTCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBEZWZhdWx0cykgeworICAvLyBDaGVjayB0aGF0IGFsbCBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IGNvcnJlY3RseSBpbiB0aGUgaW5pdGlhbCBtZXNzYWdlLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0Q2xlYXJWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICAvLyBNZXNzYWdlcyBzaG91bGQgcmV0dXJuIHBvaW50ZXJzIHRvIGRlZmF1bHQgaW5zdGFuY2VzIHVudGlsIGZpcnN0IHVzZS4KKyAgLy8gKFRoaXMgaXMgbm90IGNoZWNrZWQgYnkgRXhwZWN0Q2xlYXIoKSBzaW5jZSBpdCBpcyBub3QgYWN0dWFsbHkgdHJ1ZSBhZnRlcgorICAvLyB0aGUgZmllbGRzIGhhdmUgYmVlbiBzZXQgYW5kIHRoZW4gY2xlYXJlZC4pCisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6T3B0aW9uYWxHcm91cDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxncm91cCIpKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkpOworICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX0VRKCZ1bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEFjY2Vzc29ycykgeworICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUgdGhlbiBnbyBiYWNrIGFuZCBjaGVjayBhbGwgdGhvc2UKKyAgLy8gdmFsdWVzLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuTW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRmllbGRzTW9kaWZpZWQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBHZXRTdHJpbmdSZWZlcmVuY2UpIHsKKyAgLy8gVGVzdCB0aGF0IEdldFN0cmluZ1JlZmVyZW5jZSgpIHJldHVybnMgdGhlIHVuZGVybHlpbmcgc3RyaW5nIHdoZW4gaXQgaXMKKyAgLy8gYSBub3JtYWwgc3RyaW5nIGZpZWxkLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygiZm9vIik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiZm9vIik7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBzdHJpbmcgc2NyYXRjaDsKKworICBFWFBFQ1RfRVEoJm1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCksCisgICAgICAmcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZyIpLCAmc2NyYXRjaCkpCisgICAgPDwgIkZvciBzaW1wbGUgc3RyaW5nIGZpZWxkcywgR2V0U3RyaW5nUmVmZXJlbmNlKCkgc2hvdWxkIHJldHVybiBhICIKKyAgICAgICAicmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmluZy4iOworICBFWFBFQ1RfRVEoJm1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDApLAorICAgICAgJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZzY3JhdGNoKSkKKyAgICA8PCAiRm9yIHNpbXBsZSBzdHJpbmcgZmllbGRzLCBHZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgpIHNob3VsZCByZXR1cm4gIgorICAgICAgICJhIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBzdHJpbmcuIjsKK30KKworCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgRGVmYXVsdHNBZnRlckNsZWFyKSB7CisgIC8vIENoZWNrIHRoYXQgYWZ0ZXIgc2V0dGluZyBhbGwgZmllbGRzIGFuZCB0aGVuIGNsZWFyaW5nLCBnZXR0aW5nIGFuCisgIC8vIGVtYmVkZGVkIG1lc3NhZ2UgZG9lcyBOT1QgcmV0dXJuIHRoZSBkZWZhdWx0IGluc3RhbmNlLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSk7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpPcHRpb25hbEdyb3VwOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIikpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpOworICBFWFBFQ1RfTkUoJnVuaXR0ZXN0X2ltcG9ydDo6SW1wb3J0TWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSkpOworfQorCisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPlN3YXAoJm1lc3NhZ2UxLCAmbWVzc2FnZTIpOworCisgIFRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcFdpdGhCb3RoU2V0KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMik7CisgIFRlc3RVdGlsOjpNb2RpZnlSZXBlYXRlZEZpZWxkcygmbWVzc2FnZTIpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPlN3YXAoJm1lc3NhZ2UxLCAmbWVzc2FnZTIpOworCisgIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7CisKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX2ludDMyKDUzMjgxOSk7CisKKyAgcmVmbGVjdGlvbi0+U3dhcCgmbWVzc2FnZTEsICZtZXNzYWdlMik7CisKKyAgRVhQRUNUX0VRKDUzMjgxOSwgbWVzc2FnZTIub3B0aW9uYWxfaW50MzIoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwRXh0ZW5zaW9ucykgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTEpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPlN3YXAoJm1lc3NhZ2UxLCAmbWVzc2FnZTIpOworCisgIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwVW5rbm93bikgeworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgbWVzc2FnZTEubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMTIzNCwgMSk7CisKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlMi51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5Td2FwKCZtZXNzYWdlMSwgJm1lc3NhZ2UyKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlMi51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgUmVtb3ZlTGFzdCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSk7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuUmVtb3ZlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworCisgIFRlc3RVdGlsOjpFeHBlY3RMYXN0UmVwZWF0ZWRzUmVtb3ZlZChtZXNzYWdlKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFJlbW92ZUxhc3RFeHRlbnNpb25zKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKSk7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5SZW1vdmVMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZEV4dGVuc2lvbnNSZW1vdmVkKG1lc3NhZ2UpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcFJlcGVhdGVkRWxlbWVudHMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKKyAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworCisgIC8vIFN3YXAgYW5kIHRlc3QgdGhhdCBmaWVsZHMgYXJlIGFsbCBzd2FwcGVkLgorICByZWZsZWN0aW9uX3Rlc3Rlci5Td2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZHNTd2FwcGVkKG1lc3NhZ2UpOworCisgIC8vIFN3YXAgYmFjayBhbmQgdGVzdCB0aGF0IGZpZWxkcyBhcmUgYWxsIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWVzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5Td2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwUmVwZWF0ZWRFbGVtZW50c0V4dGVuc2lvbikgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCkpOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKworICAvLyBTd2FwIGFuZCB0ZXN0IHRoYXQgZmllbGRzIGFyZSBhbGwgc3dhcHBlZC4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU3dhcFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zU3dhcHBlZChtZXNzYWdlKTsKKworICAvLyBTd2FwIGJhY2sgYW5kIHRlc3QgdGhhdCBmaWVsZHMgYXJlIGFsbCBiYWNrIHRvIG9yaWdpbmFsIHZhbHVlcy4KKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU3dhcFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEV4dGVuc2lvbnMpIHsKKyAgLy8gU2V0IGV2ZXJ5IGV4dGVuc2lvbiB0byBhIHVuaXF1ZSB2YWx1ZSB0aGVuIGdvIGJhY2sgYW5kIGNoZWNrIGFsbCB0aG9zZQorICAvLyB2YWx1ZXMuCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOworCisgIHJlZmxlY3Rpb25fdGVzdGVyLk1vZGlmeVJlcGVhdGVkRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChtZXNzYWdlKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEZpbmRFeHRlbnNpb25UeXBlQnlOdW1iZXIpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0UmVmbGVjdGlvbigpOworCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uMSA9CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgKKyAgICAgICJvcHRpb25hbF9pbnQzMl9leHRlbnNpb24iKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24yID0KKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgInJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24iKTsKKworICBFWFBFQ1RfRVEoZXh0ZW5zaW9uMSwKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKGV4dGVuc2lvbjEtPm51bWJlcigpKSk7CisgIEVYUEVDVF9FUShleHRlbnNpb24yLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoZXh0ZW5zaW9uMi0+bnVtYmVyKCkpKTsKKworICAvLyBOb24tZXhpc3RlbnQgZXh0ZW5zaW9uLgorICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU51bWJlcig2MjM0MSkgPT0gTlVMTCk7CisKKyAgLy8gRXh0ZW5zaW9ucyBvZiBUZXN0QWxsRXh0ZW5zaW9ucyBzaG91bGQgbm90IHNob3cgdXAgYXMgZXh0ZW5zaW9ucyBvZgorICAvLyBvdGhlciB0eXBlcy4KKyAgRVhQRUNUX1RSVUUodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVmYXVsdF9pbnN0YW5jZSgpLkdldFJlZmxlY3Rpb24oKS0+CisgICAgICAgICAgICAgIEZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKGV4dGVuc2lvbjEtPm51bWJlcigpKSA9PSBOVUxMKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0KKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24xID0KKyAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgIm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIpOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbjIgPQorICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkZpbmRFeHRlbnNpb25CeU5hbWUoCisgICAgICAicmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiIpOworCisgIEVYUEVDVF9FUShleHRlbnNpb24xLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKGV4dGVuc2lvbjEtPmZ1bGxfbmFtZSgpKSk7CisgIEVYUEVDVF9FUShleHRlbnNpb24yLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKGV4dGVuc2lvbjItPmZ1bGxfbmFtZSgpKSk7CisKKyAgLy8gTm9uLWV4aXN0ZW50IGV4dGVuc2lvbi4KKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKCJub19zdWNoX2V4dCIpID09IE5VTEwpOworCisgIC8vIEV4dGVuc2lvbnMgb2YgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIG5vdCBzaG93IHVwIGFzIGV4dGVuc2lvbnMgb2YKKyAgLy8gb3RoZXIgdHlwZXMuCisgIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlZmF1bHRfaW5zdGFuY2UoKS5HZXRSZWZsZWN0aW9uKCktPgorICAgICAgICAgICAgICBGaW5kS25vd25FeHRlbnNpb25CeU5hbWUoZXh0ZW5zaW9uMS0+ZnVsbF9uYW1lKCkpID09IE5VTEwpOworfQorCisjaWZkZWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFVzYWdlRXJyb3JzKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisKKyNkZWZpbmUgZihOQU1FKSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoTkFNRSkKKworICAvLyBUZXN0aW5nIGV2ZXJ5IHNpbmdsZSBmYWlsdXJlIG1vZGUgd291bGQgYmUgdG9vIG11Y2ggd29yay4gIExldCdzIGp1c3QKKyAgLy8gY2hlY2sgYSBmZXcuCisgIEVYUEVDVF9ERUFUSCgKKyAgICByZWZsZWN0aW9uLT5HZXRJbnQzMigKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50NjQiKSksCisgICAgIlByb3RvY29sIEJ1ZmZlciByZWZsZWN0aW9uIHVzYWdlIGVycm9yOlxuIgorICAgICIgIE1ldGhvZCAgICAgIDogZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbjo6R2V0SW50MzJcbiIKKyAgICAiICBNZXNzYWdlIHR5cGU6IHByb3RvYnVmX3VuaXR0ZXN0XFwuVGVzdEFsbFR5cGVzXG4iCisgICAgIiAgRmllbGQgICAgICAgOiBwcm90b2J1Zl91bml0dGVzdFxcLlRlc3RBbGxUeXBlc1xcLm9wdGlvbmFsX2ludDY0XG4iCisgICAgIiAgUHJvYmxlbSAgICAgOiBGaWVsZCBpcyBub3QgdGhlIHJpZ2h0IHR5cGUgZm9yIHRoaXMgbWVzc2FnZTpcbiIKKyAgICAiICAgIEV4cGVjdGVkICA6IENQUFRZUEVfSU5UMzJcbiIKKyAgICAiICAgIEZpZWxkIHR5cGU6IENQUFRZUEVfSU5UNjQiKTsKKyAgRVhQRUNUX0RFQVRIKAorICAgIHJlZmxlY3Rpb24tPkdldEludDMyKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpKSwKKyAgICAiUHJvdG9jb2wgQnVmZmVyIHJlZmxlY3Rpb24gdXNhZ2UgZXJyb3I6XG4iCisgICAgIiAgTWV0aG9kICAgICAgOiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uOjpHZXRJbnQzMlxuIgorICAgICIgIE1lc3NhZ2UgdHlwZTogcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXG4iCisgICAgIiAgRmllbGQgICAgICAgOiBwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMucmVwZWF0ZWRfaW50MzJcbiIKKyAgICAiICBQcm9ibGVtICAgICA6IEZpZWxkIGlzIHJlcGVhdGVkOyB0aGUgbWV0aG9kIHJlcXVpcmVzIGEgc2luZ3VsYXIgZmllbGQuIik7CisgIEVYUEVDVF9ERUFUSCgKKyAgICByZWZsZWN0aW9uLT5HZXRJbnQzMigKKyAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoImMiKSksCisgICAgIlByb3RvY29sIEJ1ZmZlciByZWZsZWN0aW9uIHVzYWdlIGVycm9yOlxuIgorICAgICIgIE1ldGhvZCAgICAgIDogZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbjo6R2V0SW50MzJcbiIKKyAgICAiICBNZXNzYWdlIHR5cGU6IHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1xuIgorICAgICIgIEZpZWxkICAgICAgIDogcHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2UuY1xuIgorICAgICIgIFByb2JsZW0gICAgIDogRmllbGQgZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlLiIpOworICBFWFBFQ1RfREVBVEgoCisgICAgcmVmbGVjdGlvbi0+SGFzRmllbGQoCisgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJjIikpLAorICAgICJQcm90b2NvbCBCdWZmZXIgcmVmbGVjdGlvbiB1c2FnZSBlcnJvcjpcbiIKKyAgICAiICBNZXRob2QgICAgICA6IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb246Okhhc0ZpZWxkXG4iCisgICAgIiAgTWVzc2FnZSB0eXBlOiBwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcbiIKKyAgICAiICBGaWVsZCAgICAgICA6IHByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25NZXNzYWdlLmNcbiIKKyAgICAiICBQcm9ibGVtICAgICA6IEZpZWxkIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKKworI3VuZGVmIGYKK30KKworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmU1NDdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYwpAQCAtMCwwICsxLDU1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisKKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2RvdWJsZSBJbmZpbml0eSgpIHsKKyAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKK30KK2RvdWJsZSBOYU4oKSB7CisgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpOworfQorCitjb25zdCA6OnN0ZDo6c3RyaW5nIGtFbXB0eVN0cmluZzsKKworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWUxMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmgKQEAgLTAsMCArMSw4MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG1pc2NlbGxhbmVvdXMgaGVscGVyIGNvZGUgdXNlZCBieSBnZW5lcmF0ZWQgY29kZSAtLQorLy8gaW5jbHVkaW5nIGxpdGUgdHlwZXMgLS0gYnV0IHdoaWNoIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSBieSB1c2Vycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfVVRJTF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX1VUSUxfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIENvZGVkSW5wdXRTdHJlYW07ICAgICAgLy8gY29kZWRfc3RyZWFtLmgKKyAgfQorfQorCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQW5ub3RhdGlvbiBmb3IgdGhlIGNvbXBpbGVyIHRvIGVtaXQgYSBkZXByZWNhdGlvbiBtZXNzYWdlIGlmIGEgZmllbGQgbWFya2VkCisvLyB3aXRoIG9wdGlvbiAnZGVwcmVjYXRlZD10cnVlJyBpcyB1c2VkIGluIHRoZSBjb2RlLCBvciBmb3Igb3RoZXIgdGhpbmdzIGluCisvLyBnZW5lcmF0ZWQgY29kZSB3aGljaCBhcmUgZGVwcmVjYXRlZC4KKy8vCisvLyBGb3IgaW50ZXJuYWwgdXNlIGluIHRoZSBwYi5jYyBmaWxlcywgZGVwcmVjYXRpb24gd2FybmluZ3MgYXJlIHN1cHByZXNzZWQKKy8vIHRoZXJlLgorI3VuZGVmIERFUFJFQ0FURURfUFJPVE9CVUZfRklFTEQKKyNpZiAhZGVmaW5lZChJTlRFUk5BTF9TVVBQUkVTU19QUk9UT0JVRl9GSUVMRF9ERVBSRUNBVElPTikKKyMgIGRlZmluZSBQUk9UT0JVRl9ERVBSRUNBVEVEIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRAorI2Vsc2UKKyMgIGRlZmluZSBQUk9UT0JVRl9ERVBSRUNBVEVECisjZW5kaWYKKworCisvLyBDb25zdGFudHMgZm9yIHNwZWNpYWwgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLgorTElCUFJPVE9CVUZfRVhQT1JUIGRvdWJsZSBJbmZpbml0eSgpOworTElCUFJPVE9CVUZfRVhQT1JUIGRvdWJsZSBOYU4oKTsKKworLy8gQ29uc3RhbnQgdXNlZCBmb3IgZW1wdHkgZGVmYXVsdCBzdHJpbmdzLgorTElCUFJPVE9CVUZfRVhQT1JUIGV4dGVybiBjb25zdCA6OnN0ZDo6c3RyaW5nIGtFbXB0eVN0cmluZzsKKworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9VVElMX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMmEzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uY2MKQEAgLTAsMCArMSw4MzkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaGVhdmlseSBvcHRpbWl6ZWQgdG8gbWFrZSByZWFkcyBhbmQgd3JpdGVzCisvLyBvZiBzbWFsbCB2YWx1ZXMgKGVzcGVjaWFsbHkgdmFyaW50cykgYXMgZmFzdCBhcyBwb3NzaWJsZS4gIEluCisvLyBwYXJ0aWN1bGFyLCB3ZSBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIHRoYXQgYSByZWFkIG9yIGEgd3JpdGUKKy8vIHdpbGwgbm90IGNyb3NzIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgc2luY2Ugd2UgY2FuIGF2b2lkIGEgbG90CisvLyBvZiBicmFuY2hpbmcgaW4gdGhpcyBjYXNlLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV9pbmwuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLWlubC5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBjb25zdCBpbnQga01heFZhcmludEJ5dGVzID0gMTA7CitzdGF0aWMgY29uc3QgaW50IGtNYXhWYXJpbnQzMkJ5dGVzID0gNTsKKworCitpbmxpbmUgYm9vbCBOZXh0Tm9uRW1wdHkoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICBib29sIHN1Y2Nlc3M7CisgIGRvIHsKKyAgICBzdWNjZXNzID0gaW5wdXQtPk5leHQoZGF0YSwgc2l6ZSk7CisgIH0gd2hpbGUgKHN1Y2Nlc3MgJiYgKnNpemUgPT0gMCk7CisgIHJldHVybiBzdWNjZXNzOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gQ29kZWRJbnB1dFN0cmVhbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK3ZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6QmFja1VwSW5wdXRUb0N1cnJlbnRQb3NpdGlvbigpIHsKKyAgaW50IGJhY2t1cF9ieXRlcyA9IEJ1ZmZlclNpemUoKSArIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyArIG92ZXJmbG93X2J5dGVzXzsKKyAgaWYgKGJhY2t1cF9ieXRlcyA+IDApIHsKKyAgICBpbnB1dF8tPkJhY2tVcChiYWNrdXBfYnl0ZXMpOworCisgICAgLy8gdG90YWxfYnl0ZXNfcmVhZF8gZG9lc24ndCBpbmNsdWRlIG92ZXJmbG93X2J5dGVzXy4KKyAgICB0b3RhbF9ieXRlc19yZWFkXyAtPSBCdWZmZXJTaXplKCkgKyBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF87CisgICAgYnVmZmVyX2VuZF8gPSBidWZmZXJfOworICAgIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyA9IDA7CisgICAgb3ZlcmZsb3dfYnl0ZXNfID0gMDsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBDb2RlZElucHV0U3RyZWFtOjpSZWNvbXB1dGVCdWZmZXJMaW1pdHMoKSB7CisgIGJ1ZmZlcl9lbmRfICs9IGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XzsKKyAgaW50IGNsb3Nlc3RfbGltaXQgPSBtaW4oY3VycmVudF9saW1pdF8sIHRvdGFsX2J5dGVzX2xpbWl0Xyk7CisgIGlmIChjbG9zZXN0X2xpbWl0IDwgdG90YWxfYnl0ZXNfcmVhZF8pIHsKKyAgICAvLyBUaGUgbGltaXQgcG9zaXRpb24gaXMgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiAgV2UgbXVzdCBhZGp1c3QKKyAgICAvLyB0aGUgYnVmZmVyIHNpemUgYWNjb3JkaW5nbHkuCisgICAgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID0gdG90YWxfYnl0ZXNfcmVhZF8gLSBjbG9zZXN0X2xpbWl0OworICAgIGJ1ZmZlcl9lbmRfIC09IGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XzsKKyAgfSBlbHNlIHsKKyAgICBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8gPSAwOworICB9Cit9CisKK0NvZGVkSW5wdXRTdHJlYW06OkxpbWl0IENvZGVkSW5wdXRTdHJlYW06OlB1c2hMaW1pdChpbnQgYnl0ZV9saW1pdCkgeworICAvLyBDdXJyZW50IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4KKyAgaW50IGN1cnJlbnRfcG9zaXRpb24gPSB0b3RhbF9ieXRlc19yZWFkXyAtCisgICAgICAoQnVmZmVyU2l6ZSgpICsgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfKTsKKworICBMaW1pdCBvbGRfbGltaXQgPSBjdXJyZW50X2xpbWl0XzsKKworICAvLyBzZWN1cml0eTogYnl0ZV9saW1pdCBpcyBwb3NzaWJseSBldmlsLCBzbyBjaGVjayBmb3IgbmVnYXRpdmUgdmFsdWVzCisgIC8vIGFuZCBvdmVyZmxvdy4KKyAgaWYgKGJ5dGVfbGltaXQgPj0gMCAmJgorICAgICAgYnl0ZV9saW1pdCA8PSBJTlRfTUFYIC0gY3VycmVudF9wb3NpdGlvbikgeworICAgIGN1cnJlbnRfbGltaXRfID0gY3VycmVudF9wb3NpdGlvbiArIGJ5dGVfbGltaXQ7CisgIH0gZWxzZSB7CisgICAgLy8gTmVnYXRpdmUgb3Igb3ZlcmZsb3cuCisgICAgY3VycmVudF9saW1pdF8gPSBJTlRfTUFYOworICB9CisKKyAgLy8gV2UgbmVlZCB0byBlbmZvcmNlIGFsbCBsaW1pdHMsIG5vdCBqdXN0IHRoZSBuZXcgb25lLCBzbyBpZiB0aGUgcHJldmlvdXMKKyAgLy8gbGltaXQgd2FzIGJlZm9yZSB0aGUgbmV3IHJlcXVlc3RlZCBsaW1pdCwgd2UgY29udGludWUgdG8gZW5mb3JjZSB0aGUKKyAgLy8gcHJldmlvdXMgbGltaXQuCisgIGN1cnJlbnRfbGltaXRfID0gbWluKGN1cnJlbnRfbGltaXRfLCBvbGRfbGltaXQpOworCisgIFJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpOworICByZXR1cm4gb2xkX2xpbWl0OworfQorCit2b2lkIENvZGVkSW5wdXRTdHJlYW06OlBvcExpbWl0KExpbWl0IGxpbWl0KSB7CisgIC8vIFRoZSBsaW1pdCBwYXNzZWQgaW4gaXMgYWN0dWFsbHkgdGhlICpvbGQqIGxpbWl0LCB3aGljaCB3ZSByZXR1cm5lZCBmcm9tCisgIC8vIFB1c2hMaW1pdCgpLgorICBjdXJyZW50X2xpbWl0XyA9IGxpbWl0OworICBSZWNvbXB1dGVCdWZmZXJMaW1pdHMoKTsKKworICAvLyBXZSBtYXkgbm8gbG9uZ2VyIGJlIGF0IGEgbGVnaXRpbWF0ZSBtZXNzYWdlIGVuZC4gIFJlYWRUYWcoKSBuZWVkcyB0byBiZQorICAvLyBjYWxsZWQgYWdhaW4gdG8gZmluZCBvdXQuCisgIGxlZ2l0aW1hdGVfbWVzc2FnZV9lbmRfID0gZmFsc2U7Cit9CisKK2ludCBDb2RlZElucHV0U3RyZWFtOjpCeXRlc1VudGlsTGltaXQoKSB7CisgIGlmIChjdXJyZW50X2xpbWl0XyA9PSBJTlRfTUFYKSByZXR1cm4gLTE7CisgIGludCBjdXJyZW50X3Bvc2l0aW9uID0gdG90YWxfYnl0ZXNfcmVhZF8gLQorICAgICAgKEJ1ZmZlclNpemUoKSArIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0Xyk7CisKKyAgcmV0dXJuIGN1cnJlbnRfbGltaXRfIC0gY3VycmVudF9wb3NpdGlvbjsKK30KKwordm9pZCBDb2RlZElucHV0U3RyZWFtOjpTZXRUb3RhbEJ5dGVzTGltaXQoCisgICAgaW50IHRvdGFsX2J5dGVzX2xpbWl0LCBpbnQgd2FybmluZ190aHJlc2hvbGQpIHsKKyAgLy8gTWFrZSBzdXJlIHRoZSBsaW1pdCBpc24ndCBhbHJlYWR5IHBhc3QsIHNpbmNlIHRoaXMgY291bGQgY29uZnVzZSBvdGhlcgorICAvLyBjb2RlLgorICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IHRvdGFsX2J5dGVzX3JlYWRfIC0KKyAgICAgIChCdWZmZXJTaXplKCkgKyBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8pOworICB0b3RhbF9ieXRlc19saW1pdF8gPSBtYXgoY3VycmVudF9wb3NpdGlvbiwgdG90YWxfYnl0ZXNfbGltaXQpOworICB0b3RhbF9ieXRlc193YXJuaW5nX3RocmVzaG9sZF8gPSB3YXJuaW5nX3RocmVzaG9sZDsKKyAgUmVjb21wdXRlQnVmZmVyTGltaXRzKCk7Cit9CisKK3ZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6UHJpbnRUb3RhbEJ5dGVzTGltaXRFcnJvcigpIHsKKyAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkEgcHJvdG9jb2wgbWVzc2FnZSB3YXMgcmVqZWN0ZWQgYmVjYXVzZSBpdCB3YXMgdG9vICIKKyAgICAgICAgICAgICAgICAiYmlnIChtb3JlIHRoYW4gIiA8PCB0b3RhbF9ieXRlc19saW1pdF8KKyAgICAgICAgICAgICA8PCAiIGJ5dGVzKS4gIFRvIGluY3JlYXNlIHRoZSBsaW1pdCAob3IgdG8gZGlzYWJsZSB0aGVzZSAiCisgICAgICAgICAgICAgICAgIndhcm5pbmdzKSwgc2VlIENvZGVkSW5wdXRTdHJlYW06OlNldFRvdGFsQnl0ZXNMaW1pdCgpICIKKyAgICAgICAgICAgICAgICAiaW4gZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oLiI7Cit9CisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6U2tpcChpbnQgY291bnQpIHsKKyAgaWYgKGNvdW50IDwgMCkgcmV0dXJuIGZhbHNlOyAgLy8gc2VjdXJpdHk6IGNvdW50IGlzIG9mdGVuIHVzZXItc3VwcGxpZWQKKworICBjb25zdCBpbnQgb3JpZ2luYWxfYnVmZmVyX3NpemUgPSBCdWZmZXJTaXplKCk7CisKKyAgaWYgKGNvdW50IDw9IG9yaWdpbmFsX2J1ZmZlcl9zaXplKSB7CisgICAgLy8gSnVzdCBza2lwcGluZyB3aXRoaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiAgRWFzeS4KKyAgICBBZHZhbmNlKGNvdW50KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8gPiAwKSB7CisgICAgLy8gV2UgaGl0IGEgbGltaXQgaW5zaWRlIHRoaXMgYnVmZmVyLiAgQWR2YW5jZSB0byB0aGUgbGltaXQgYW5kIGZhaWwuCisgICAgQWR2YW5jZShvcmlnaW5hbF9idWZmZXJfc2l6ZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY291bnQgLT0gb3JpZ2luYWxfYnVmZmVyX3NpemU7CisgIGJ1ZmZlcl8gPSBOVUxMOworICBidWZmZXJfZW5kXyA9IGJ1ZmZlcl87CisKKyAgLy8gTWFrZSBzdXJlIHRoaXMgc2tpcCBkb2Vzbid0IHRyeSB0byBza2lwIHBhc3QgdGhlIGN1cnJlbnQgbGltaXQuCisgIGludCBjbG9zZXN0X2xpbWl0ID0gbWluKGN1cnJlbnRfbGltaXRfLCB0b3RhbF9ieXRlc19saW1pdF8pOworICBpbnQgYnl0ZXNfdW50aWxfbGltaXQgPSBjbG9zZXN0X2xpbWl0IC0gdG90YWxfYnl0ZXNfcmVhZF87CisgIGlmIChieXRlc191bnRpbF9saW1pdCA8IGNvdW50KSB7CisgICAgLy8gV2UgaGl0IHRoZSBsaW1pdC4gIFNraXAgdXAgdG8gaXQgdGhlbiBmYWlsLgorICAgIGlmIChieXRlc191bnRpbF9saW1pdCA+IDApIHsKKyAgICAgIHRvdGFsX2J5dGVzX3JlYWRfID0gY2xvc2VzdF9saW1pdDsKKyAgICAgIGlucHV0Xy0+U2tpcChieXRlc191bnRpbF9saW1pdCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRvdGFsX2J5dGVzX3JlYWRfICs9IGNvdW50OworICByZXR1cm4gaW5wdXRfLT5Ta2lwKGNvdW50KTsKK30KKworYm9vbCBDb2RlZElucHV0U3RyZWFtOjpHZXREaXJlY3RCdWZmZXJQb2ludGVyKGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgaWYgKEJ1ZmZlclNpemUoKSA9PSAwICYmICFSZWZyZXNoKCkpIHJldHVybiBmYWxzZTsKKworICAqZGF0YSA9IGJ1ZmZlcl87CisgICpzaXplID0gQnVmZmVyU2l6ZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkUmF3KHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpIHsKKyAgaW50IGN1cnJlbnRfYnVmZmVyX3NpemU7CisgIHdoaWxlICgoY3VycmVudF9idWZmZXJfc2l6ZSA9IEJ1ZmZlclNpemUoKSkgPCBzaXplKSB7CisgICAgLy8gUmVhZGluZyBwYXN0IGVuZCBvZiBidWZmZXIuICBDb3B5IHdoYXQgd2UgaGF2ZSwgdGhlbiByZWZyZXNoLgorICAgIG1lbWNweShidWZmZXIsIGJ1ZmZlcl8sIGN1cnJlbnRfYnVmZmVyX3NpemUpOworICAgIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihidWZmZXIpICsgY3VycmVudF9idWZmZXJfc2l6ZTsKKyAgICBzaXplIC09IGN1cnJlbnRfYnVmZmVyX3NpemU7CisgICAgQWR2YW5jZShjdXJyZW50X2J1ZmZlcl9zaXplKTsKKyAgICBpZiAoIVJlZnJlc2goKSkgcmV0dXJuIGZhbHNlOworICB9CisKKyAgbWVtY3B5KGJ1ZmZlciwgYnVmZmVyXywgc2l6ZSk7CisgIEFkdmFuY2Uoc2l6ZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFN0cmluZyhzdHJpbmcqIGJ1ZmZlciwgaW50IHNpemUpIHsKKyAgaWYgKHNpemUgPCAwKSByZXR1cm4gZmFsc2U7ICAvLyBzZWN1cml0eTogc2l6ZSBpcyBvZnRlbiB1c2VyLXN1cHBsaWVkCisgIHJldHVybiBJbnRlcm5hbFJlYWRTdHJpbmdJbmxpbmUoYnVmZmVyLCBzaXplKTsKK30KKworYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkU3RyaW5nRmFsbGJhY2soc3RyaW5nKiBidWZmZXIsIGludCBzaXplKSB7CisgIGlmICghYnVmZmVyLT5lbXB0eSgpKSB7CisgICAgYnVmZmVyLT5jbGVhcigpOworICB9CisKKyAgaW50IGN1cnJlbnRfYnVmZmVyX3NpemU7CisgIHdoaWxlICgoY3VycmVudF9idWZmZXJfc2l6ZSA9IEJ1ZmZlclNpemUoKSkgPCBzaXplKSB7CisgICAgLy8gU29tZSBTVEwgaW1wbGVtZW50YXRpb25zICJoZWxwZnVsbHkiIGNyYXNoIG9uIGJ1ZmZlci0+YXBwZW5kKE5VTEwsIDApLgorICAgIGlmIChjdXJyZW50X2J1ZmZlcl9zaXplICE9IDApIHsKKyAgICAgIC8vIE5vdGU6ICBzdHJpbmcxLmFwcGVuZChzdHJpbmcyKSBpcyBPKHN0cmluZzIuc2l6ZSgpKSAoYXMgb3Bwb3NlZCB0bworICAgICAgLy8gICBPKHN0cmluZzEuc2l6ZSgpICsgc3RyaW5nMi5zaXplKCkpLCB3aGljaCB3b3VsZCBiZSBiYWQpLgorICAgICAgYnVmZmVyLT5hcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyXyksCisgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2J1ZmZlcl9zaXplKTsKKyAgICB9CisgICAgc2l6ZSAtPSBjdXJyZW50X2J1ZmZlcl9zaXplOworICAgIEFkdmFuY2UoY3VycmVudF9idWZmZXJfc2l6ZSk7CisgICAgaWYgKCFSZWZyZXNoKCkpIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJ1ZmZlci0+YXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlcl8pLCBzaXplKTsKKyAgQWR2YW5jZShzaXplKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW4zMkZhbGxiYWNrKHVpbnQzMiogdmFsdWUpIHsKKyAgdWludDggYnl0ZXNbc2l6ZW9mKCp2YWx1ZSldOworCisgIGNvbnN0IHVpbnQ4KiBwdHI7CisgIGlmIChCdWZmZXJTaXplKCkgPj0gc2l6ZW9mKCp2YWx1ZSkpIHsKKyAgICAvLyBGYXN0IHBhdGg6ICBFbm91Z2ggYnl0ZXMgaW4gdGhlIGJ1ZmZlciB0byByZWFkIGRpcmVjdGx5LgorICAgIHB0ciA9IGJ1ZmZlcl87CisgICAgQWR2YW5jZShzaXplb2YoKnZhbHVlKSk7CisgIH0gZWxzZSB7CisgICAgLy8gU2xvdyBwYXRoOiAgSGFkIHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgaWYgKCFSZWFkUmF3KGJ5dGVzLCBzaXplb2YoKnZhbHVlKSkpIHJldHVybiBmYWxzZTsKKyAgICBwdHIgPSBieXRlczsKKyAgfQorICBSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkocHRyLCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZhbGxiYWNrKHVpbnQ2NCogdmFsdWUpIHsKKyAgdWludDggYnl0ZXNbc2l6ZW9mKCp2YWx1ZSldOworCisgIGNvbnN0IHVpbnQ4KiBwdHI7CisgIGlmIChCdWZmZXJTaXplKCkgPj0gc2l6ZW9mKCp2YWx1ZSkpIHsKKyAgICAvLyBGYXN0IHBhdGg6ICBFbm91Z2ggYnl0ZXMgaW4gdGhlIGJ1ZmZlciB0byByZWFkIGRpcmVjdGx5LgorICAgIHB0ciA9IGJ1ZmZlcl87CisgICAgQWR2YW5jZShzaXplb2YoKnZhbHVlKSk7CisgIH0gZWxzZSB7CisgICAgLy8gU2xvdyBwYXRoOiAgSGFkIHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgaWYgKCFSZWFkUmF3KGJ5dGVzLCBzaXplb2YoKnZhbHVlKSkpIHJldHVybiBmYWxzZTsKKyAgICBwdHIgPSBieXRlczsKKyAgfQorICBSZWFkTGl0dGxlRW5kaWFuNjRGcm9tQXJyYXkocHRyLCB2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgeworCitpbmxpbmUgY29uc3QgdWludDgqIFJlYWRWYXJpbnQzMkZyb21BcnJheSgKKyAgICBjb25zdCB1aW50OCogYnVmZmVyLCB1aW50MzIqIHZhbHVlKSBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkU7CitpbmxpbmUgY29uc3QgdWludDgqIFJlYWRWYXJpbnQzMkZyb21BcnJheShjb25zdCB1aW50OCogYnVmZmVyLCB1aW50MzIqIHZhbHVlKSB7CisgIC8vIEZhc3QgcGF0aDogIFdlIGhhdmUgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciB0byBndWFyYW50ZWUgdGhhdAorICAvLyB0aGlzIHJlYWQgd29uJ3QgY3Jvc3MgdGhlIGVuZCwgc28gd2UgY2FuIHNraXAgdGhlIGNoZWNrcy4KKyAgY29uc3QgdWludDgqIHB0ciA9IGJ1ZmZlcjsKKyAgdWludDMyIGI7CisgIHVpbnQzMiByZXN1bHQ7CisKKyAgYiA9ICoocHRyKyspOyByZXN1bHQgID0gKGIgJiAweDdGKSAgICAgIDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgIGIgPSAqKHB0cisrKTsgcmVzdWx0IHw9IChiICYgMHg3RikgPDwgIDc7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICBiID0gKihwdHIrKyk7IHJlc3VsdCB8PSAoYiAmIDB4N0YpIDw8IDE0OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgYiA9ICoocHRyKyspOyByZXN1bHQgfD0gKGIgJiAweDdGKSA8PCAyMTsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgIGIgPSAqKHB0cisrKTsgcmVzdWx0IHw9ICBiICAgICAgICAgPDwgMjg7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworCisgIC8vIElmIHRoZSBpbnB1dCBpcyBsYXJnZXIgdGhhbiAzMiBiaXRzLCB3ZSBzdGlsbCBuZWVkIHRvIHJlYWQgaXQgYWxsCisgIC8vIGFuZCBkaXNjYXJkIHRoZSBoaWdoLW9yZGVyIGJpdHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwga01heFZhcmludEJ5dGVzIC0ga01heFZhcmludDMyQnl0ZXM7IGkrKykgeworICAgIGIgPSAqKHB0cisrKTsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgIH0KKworICAvLyBXZSBoYXZlIG92ZXJydW4gdGhlIG1heGltdW0gc2l6ZSBvZiBhIHZhcmludCAoMTAgYnl0ZXMpLiAgQXNzdW1lCisgIC8vIHRoZSBkYXRhIGlzIGNvcnJ1cHQuCisgIHJldHVybiBOVUxMOworCisgZG9uZToKKyAgKnZhbHVlID0gcmVzdWx0OworICByZXR1cm4gcHRyOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVmFyaW50MzJTbG93KHVpbnQzMiogdmFsdWUpIHsKKyAgdWludDY0IHJlc3VsdDsKKyAgLy8gRGlyZWN0bHkgaW52b2tlIFJlYWRWYXJpbnQ2NEZhbGxiYWNrLCBzaW5jZSB3ZSBhbHJlYWR5IHRyaWVkIHRvIG9wdGltaXplCisgIC8vIGZvciBvbmUtYnl0ZSB2YXJpbnRzLgorICBpZiAoIVJlYWRWYXJpbnQ2NEZhbGxiYWNrKCZyZXN1bHQpKSByZXR1cm4gZmFsc2U7CisgICp2YWx1ZSA9ICh1aW50MzIpcmVzdWx0OworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVmFyaW50MzJGYWxsYmFjayh1aW50MzIqIHZhbHVlKSB7CisgIGlmIChCdWZmZXJTaXplKCkgPj0ga01heFZhcmludEJ5dGVzIHx8CisgICAgICAvLyBPcHRpbWl6YXRpb246ICBJZiB0aGUgdmFyaW50IGVuZHMgYXQgZXhhY3RseSB0aGUgZW5kIG9mIHRoZSBidWZmZXIsCisgICAgICAvLyB3ZSBjYW4gZGV0ZWN0IHRoYXQgYW5kIHN0aWxsIHVzZSB0aGUgZmFzdCBwYXRoLgorICAgICAgKGJ1ZmZlcl9lbmRfID4gYnVmZmVyXyAmJiAhKGJ1ZmZlcl9lbmRfWy0xXSAmIDB4ODApKSkgeworICAgIGNvbnN0IHVpbnQ4KiBlbmQgPSBSZWFkVmFyaW50MzJGcm9tQXJyYXkoYnVmZmVyXywgdmFsdWUpOworICAgIGlmIChlbmQgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIGJ1ZmZlcl8gPSBlbmQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgLy8gUmVhbGx5IHNsb3cgY2FzZTogd2Ugd2lsbCBpbmN1ciB0aGUgY29zdCBvZiBhbiBleHRyYSBmdW5jdGlvbiBjYWxsIGhlcmUsCisgICAgLy8gYnV0IG1vdmluZyB0aGlzIG91dCBvZiBsaW5lIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhpcyBmdW5jdGlvbiwgd2hpY2gKKyAgICAvLyBpbXByb3ZlcyB0aGUgY29tbW9uIGNhc2UuIEluIG1pY3JvIGJlbmNobWFya3MsIHRoaXMgaXMgd29ydGggYWJvdXQgMTAtMTUlCisgICAgcmV0dXJuIFJlYWRWYXJpbnQzMlNsb3codmFsdWUpOworICB9Cit9CisKK3VpbnQzMiBDb2RlZElucHV0U3RyZWFtOjpSZWFkVGFnU2xvdygpIHsKKyAgaWYgKGJ1ZmZlcl8gPT0gYnVmZmVyX2VuZF8pIHsKKyAgICAvLyBDYWxsIHJlZnJlc2guCisgICAgaWYgKCFSZWZyZXNoKCkpIHsKKyAgICAgIC8vIFJlZnJlc2ggZmFpbGVkLiAgTWFrZSBzdXJlIHRoYXQgaXQgZmFpbGVkIGR1ZSB0byBFT0YsIG5vdCBiZWNhdXNlCisgICAgICAvLyB3ZSBoaXQgdG90YWxfYnl0ZXNfbGltaXRfLCB3aGljaCwgdW5saWtlIG5vcm1hbCBsaW1pdHMsIGlzIG5vdCBhCisgICAgICAvLyB2YWxpZCBwbGFjZSB0byBlbmQgYSBtZXNzYWdlLgorICAgICAgaW50IGN1cnJlbnRfcG9zaXRpb24gPSB0b3RhbF9ieXRlc19yZWFkXyAtIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XzsKKyAgICAgIGlmIChjdXJyZW50X3Bvc2l0aW9uID49IHRvdGFsX2J5dGVzX2xpbWl0XykgeworICAgICAgICAvLyBIaXQgdG90YWxfYnl0ZXNfbGltaXRfLiAgQnV0IGlmIHdlIGFsc28gaGl0IHRoZSBub3JtYWwgbGltaXQsCisgICAgICAgIC8vIHdlJ3JlIHN0aWxsIE9LLgorICAgICAgICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyA9IGN1cnJlbnRfbGltaXRfID09IHRvdGFsX2J5dGVzX2xpbWl0XzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxlZ2l0aW1hdGVfbWVzc2FnZV9lbmRfID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIC8vIEZvciB0aGUgc2xvdyBwYXRoLCBqdXN0IGRvIGEgNjQtYml0IHJlYWQuIFRyeSB0byBvcHRpbWl6ZSBmb3Igb25lLWJ5dGUgdGFncworICAvLyBhZ2Fpbiwgc2luY2Ugd2UgaGF2ZSBub3cgcmVmcmVzaGVkIHRoZSBidWZmZXIuCisgIHVpbnQ2NCByZXN1bHQ7CisgIGlmICghUmVhZFZhcmludDY0KCZyZXN1bHQpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMj4ocmVzdWx0KTsKK30KKwordWludDMyIENvZGVkSW5wdXRTdHJlYW06OlJlYWRUYWdGYWxsYmFjaygpIHsKKyAgaWYgKEJ1ZmZlclNpemUoKSA+PSBrTWF4VmFyaW50Qnl0ZXMgfHwKKyAgICAgIC8vIE9wdGltaXphdGlvbjogIElmIHRoZSB2YXJpbnQgZW5kcyBhdCBleGFjdGx5IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwKKyAgICAgIC8vIHdlIGNhbiBkZXRlY3QgdGhhdCBhbmQgc3RpbGwgdXNlIHRoZSBmYXN0IHBhdGguCisgICAgICAoYnVmZmVyX2VuZF8gPiBidWZmZXJfICYmICEoYnVmZmVyX2VuZF9bLTFdICYgMHg4MCkpKSB7CisgICAgdWludDMyIHRhZzsKKyAgICBjb25zdCB1aW50OCogZW5kID0gUmVhZFZhcmludDMyRnJvbUFycmF5KGJ1ZmZlcl8sICZ0YWcpOworICAgIGlmIChlbmQgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGJ1ZmZlcl8gPSBlbmQ7CisgICAgcmV0dXJuIHRhZzsKKyAgfSBlbHNlIHsKKyAgICAvLyBXZSBhcmUgY29tbW9ubHkgYXQgYSBsaW1pdCB3aGVuIGF0dGVtcHRpbmcgdG8gcmVhZCB0YWdzLiBUcnkgdG8gcXVpY2tseQorICAgIC8vIGRldGVjdCB0aGlzIGNhc2Ugd2l0aG91dCBtYWtpbmcgYW5vdGhlciBmdW5jdGlvbiBjYWxsLgorICAgIGlmIChidWZmZXJfID09IGJ1ZmZlcl9lbmRfICYmIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyA+IDAgJiYKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGxpbWl0IHdlIGhpdCBpcyBub3QgdG90YWxfYnl0ZXNfbGltaXRfLCBzaW5jZQorICAgICAgICAvLyBpbiB0aGF0IGNhc2Ugd2Ugc3RpbGwgbmVlZCB0byBjYWxsIFJlZnJlc2goKSBzbyB0aGF0IGl0IHByaW50cyBhbgorICAgICAgICAvLyBlcnJvci4KKyAgICAgICAgdG90YWxfYnl0ZXNfcmVhZF8gLSBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8gPCB0b3RhbF9ieXRlc19saW1pdF8pIHsKKyAgICAgIC8vIFdlIGhpdCBhIGJ5dGUgbGltaXQuCisgICAgICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyA9IHRydWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIFJlYWRUYWdTbG93KCk7CisgIH0KK30KKworYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVmFyaW50NjRTbG93KHVpbnQ2NCogdmFsdWUpIHsKKyAgLy8gU2xvdyBwYXRoOiAgVGhpcyByZWFkIG1pZ2h0IGNyb3NzIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgc28gd2UKKyAgLy8gbmVlZCB0byBjaGVjayBhbmQgcmVmcmVzaCB0aGUgYnVmZmVyIGlmIGFuZCB3aGVuIGl0IGRvZXMuCisKKyAgdWludDY0IHJlc3VsdCA9IDA7CisgIGludCBjb3VudCA9IDA7CisgIHVpbnQzMiBiOworCisgIGRvIHsKKyAgICBpZiAoY291bnQgPT0ga01heFZhcmludEJ5dGVzKSByZXR1cm4gZmFsc2U7CisgICAgd2hpbGUgKGJ1ZmZlcl8gPT0gYnVmZmVyX2VuZF8pIHsKKyAgICAgIGlmICghUmVmcmVzaCgpKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGIgPSAqYnVmZmVyXzsKKyAgICByZXN1bHQgfD0gc3RhdGljX2Nhc3Q8dWludDY0PihiICYgMHg3RikgPDwgKDcgKiBjb3VudCk7CisgICAgQWR2YW5jZSgxKTsKKyAgICArK2NvdW50OworICB9IHdoaWxlIChiICYgMHg4MCk7CisKKyAgKnZhbHVlID0gcmVzdWx0OworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVmFyaW50NjRGYWxsYmFjayh1aW50NjQqIHZhbHVlKSB7CisgIGlmIChCdWZmZXJTaXplKCkgPj0ga01heFZhcmludEJ5dGVzIHx8CisgICAgICAvLyBPcHRpbWl6YXRpb246ICBJZiB0aGUgdmFyaW50IGVuZHMgYXQgZXhhY3RseSB0aGUgZW5kIG9mIHRoZSBidWZmZXIsCisgICAgICAvLyB3ZSBjYW4gZGV0ZWN0IHRoYXQgYW5kIHN0aWxsIHVzZSB0aGUgZmFzdCBwYXRoLgorICAgICAgKGJ1ZmZlcl9lbmRfID4gYnVmZmVyXyAmJiAhKGJ1ZmZlcl9lbmRfWy0xXSAmIDB4ODApKSkgeworICAgIC8vIEZhc3QgcGF0aDogIFdlIGhhdmUgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciB0byBndWFyYW50ZWUgdGhhdAorICAgIC8vIHRoaXMgcmVhZCB3b24ndCBjcm9zcyB0aGUgZW5kLCBzbyB3ZSBjYW4gc2tpcCB0aGUgY2hlY2tzLgorCisgICAgY29uc3QgdWludDgqIHB0ciA9IGJ1ZmZlcl87CisgICAgdWludDMyIGI7CisKKyAgICAvLyBTcGxpdHRpbmcgaW50byAzMi1iaXQgcGllY2VzIGdpdmVzIGJldHRlciBwZXJmb3JtYW5jZSBvbiAzMi1iaXQKKyAgICAvLyBwcm9jZXNzb3JzLgorICAgIHVpbnQzMiBwYXJ0MCA9IDAsIHBhcnQxID0gMCwgcGFydDIgPSAwOworCisgICAgYiA9ICoocHRyKyspOyBwYXJ0MCAgPSAoYiAmIDB4N0YpICAgICAgOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICBiID0gKihwdHIrKyk7IHBhcnQwIHw9IChiICYgMHg3RikgPDwgIDc7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICAgIGIgPSAqKHB0cisrKTsgcGFydDAgfD0gKGIgJiAweDdGKSA8PCAxNDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgICAgYiA9ICoocHRyKyspOyBwYXJ0MCB8PSAoYiAmIDB4N0YpIDw8IDIxOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICBiID0gKihwdHIrKyk7IHBhcnQxICA9IChiICYgMHg3RikgICAgICA7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICAgIGIgPSAqKHB0cisrKTsgcGFydDEgfD0gKGIgJiAweDdGKSA8PCAgNzsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgICAgYiA9ICoocHRyKyspOyBwYXJ0MSB8PSAoYiAmIDB4N0YpIDw8IDE0OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICBiID0gKihwdHIrKyk7IHBhcnQxIHw9IChiICYgMHg3RikgPDwgMjE7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICAgIGIgPSAqKHB0cisrKTsgcGFydDIgID0gKGIgJiAweDdGKSAgICAgIDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgICAgYiA9ICoocHRyKyspOyBwYXJ0MiB8PSAoYiAmIDB4N0YpIDw8ICA3OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKworICAgIC8vIFdlIGhhdmUgb3ZlcnJ1biB0aGUgbWF4aW11bSBzaXplIG9mIGEgdmFyaW50ICgxMCBieXRlcykuICBUaGUgZGF0YQorICAgIC8vIG11c3QgYmUgY29ycnVwdC4KKyAgICByZXR1cm4gZmFsc2U7CisKKyAgIGRvbmU6CisgICAgQWR2YW5jZShwdHIgLSBidWZmZXJfKTsKKyAgICAqdmFsdWUgPSAoc3RhdGljX2Nhc3Q8dWludDY0PihwYXJ0MCkgICAgICApIHwKKyAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0PihwYXJ0MSkgPDwgMjgpIHwKKyAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0PihwYXJ0MikgPDwgNTYpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBSZWFkVmFyaW50NjRTbG93KHZhbHVlKTsKKyAgfQorfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OlJlZnJlc2goKSB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoMCwgQnVmZmVyU2l6ZSgpKTsKKworICBpZiAoYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCB8fCBvdmVyZmxvd19ieXRlc18gPiAwIHx8CisgICAgICB0b3RhbF9ieXRlc19yZWFkXyA9PSBjdXJyZW50X2xpbWl0XykgeworICAgIC8vIFdlJ3ZlIGhpdCBhIGxpbWl0LiAgU3RvcC4KKyAgICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IHRvdGFsX2J5dGVzX3JlYWRfIC0gYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfOworCisgICAgaWYgKGN1cnJlbnRfcG9zaXRpb24gPj0gdG90YWxfYnl0ZXNfbGltaXRfICYmCisgICAgICAgIHRvdGFsX2J5dGVzX2xpbWl0XyAhPSBjdXJyZW50X2xpbWl0XykgeworICAgICAgLy8gSGl0IHRvdGFsX2J5dGVzX2xpbWl0Xy4KKyAgICAgIFByaW50VG90YWxCeXRlc0xpbWl0RXJyb3IoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAodG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfID49IDAgJiYKKyAgICAgIHRvdGFsX2J5dGVzX3JlYWRfID49IHRvdGFsX2J5dGVzX3dhcm5pbmdfdGhyZXNob2xkXykgeworICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiUmVhZGluZyBkYW5nZXJvdXNseSBsYXJnZSBwcm90b2NvbCBtZXNzYWdlLiAgSWYgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSB0dXJucyBvdXQgdG8gYmUgbGFyZ2VyIHRoYW4gIgorICAgICAgICAgICAgICAgICAgIDw8IHRvdGFsX2J5dGVzX2xpbWl0XyA8PCAiIGJ5dGVzLCBwYXJzaW5nIHdpbGwgYmUgaGFsdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAiZm9yIHNlY3VyaXR5IHJlYXNvbnMuICBUbyBpbmNyZWFzZSB0aGUgbGltaXQgKG9yIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZSB0aGVzZSB3YXJuaW5ncyksIHNlZSAiCisgICAgICAgICAgICAgICAgICAgICAgIkNvZGVkSW5wdXRTdHJlYW06OlNldFRvdGFsQnl0ZXNMaW1pdCgpIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oLiI7CisKKyAgICAvLyBEb24ndCB3YXJuIGFnYWluIGZvciB0aGlzIHN0cmVhbS4KKyAgICB0b3RhbF9ieXRlc193YXJuaW5nX3RocmVzaG9sZF8gPSAtMTsKKyAgfQorCisgIGNvbnN0IHZvaWQqIHZvaWRfYnVmZmVyOworICBpbnQgYnVmZmVyX3NpemU7CisgIGlmIChOZXh0Tm9uRW1wdHkoaW5wdXRfLCAmdm9pZF9idWZmZXIsICZidWZmZXJfc2l6ZSkpIHsKKyAgICBidWZmZXJfID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KHZvaWRfYnVmZmVyKTsKKyAgICBidWZmZXJfZW5kXyA9IGJ1ZmZlcl8gKyBidWZmZXJfc2l6ZTsKKyAgICBHT09HTEVfQ0hFQ0tfR0UoYnVmZmVyX3NpemUsIDApOworCisgICAgaWYgKHRvdGFsX2J5dGVzX3JlYWRfIDw9IElOVF9NQVggLSBidWZmZXJfc2l6ZSkgeworICAgICAgdG90YWxfYnl0ZXNfcmVhZF8gKz0gYnVmZmVyX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE92ZXJmbG93LiAgUmVzZXQgYnVmZmVyX2VuZF8gdG8gbm90IGluY2x1ZGUgdGhlIGJ5dGVzIGJleW9uZCBJTlRfTUFYLgorICAgICAgLy8gV2UgY2FuJ3QgZ2V0IHRoYXQgZmFyIGFueXdheSwgYmVjYXVzZSB0b3RhbF9ieXRlc19saW1pdF8gaXMgZ3VhcmFudGVlZAorICAgICAgLy8gdG8gYmUgbGVzcyB0aGFuIGl0LiAgV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICAgIC8vIHdlIGRpc2NhcmRlZCwgdGhvdWdoLCBzbyB0aGF0IHdlIGNhbiBjYWxsIGlucHV0Xy0+QmFja1VwKCkgdG8gYmFjaworICAgICAgLy8gdXAgb3ZlciB0aGVtIG9uIGRlc3RydWN0aW9uLgorCisgICAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgZXF1aXZhbGVudCB0bzoKKyAgICAgIC8vICAgb3ZlcmZsb3dfYnl0ZXNfID0gdG90YWxfYnl0ZXNfcmVhZF8gKyBidWZmZXJfc2l6ZSAtIElOVF9NQVg7CisgICAgICAvLyBleGNlcHQgdGhhdCBpdCBhdm9pZHMgb3ZlcmZsb3dzLiAgU2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgaGFzCisgICAgICAvLyB1bmRlZmluZWQgcmVzdWx0cyBhY2NvcmRpbmcgdG8gdGhlIEMgc3RhbmRhcmQuCisgICAgICBvdmVyZmxvd19ieXRlc18gPSB0b3RhbF9ieXRlc19yZWFkXyAtIChJTlRfTUFYIC0gYnVmZmVyX3NpemUpOworICAgICAgYnVmZmVyX2VuZF8gLT0gb3ZlcmZsb3dfYnl0ZXNfOworICAgICAgdG90YWxfYnl0ZXNfcmVhZF8gPSBJTlRfTUFYOworICAgIH0KKworICAgIFJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIGJ1ZmZlcl8gPSBOVUxMOworICAgIGJ1ZmZlcl9lbmRfID0gTlVMTDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8gQ29kZWRPdXRwdXRTdHJlYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb2RlZE91dHB1dFN0cmVhbTo6Q29kZWRPdXRwdXRTdHJlYW0oWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkKKyAgOiBvdXRwdXRfKG91dHB1dCksCisgICAgYnVmZmVyXyhOVUxMKSwKKyAgICBidWZmZXJfc2l6ZV8oMCksCisgICAgdG90YWxfYnl0ZXNfKDApLAorICAgIGhhZF9lcnJvcl8oZmFsc2UpIHsKKyAgLy8gRWFnZXJseSBSZWZyZXNoKCkgc28gYnVmZmVyIHNwYWNlIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KKyAgUmVmcmVzaCgpOworICAvLyBUaGUgUmVmcmVzaCgpIG1heSBoYXZlIGZhaWxlZC4gSWYgdGhlIGNsaWVudCBkb2Vzbid0IHdyaXRlIGFueSBkYXRhLAorICAvLyB0aG91Z2gsIGRvbid0IGNvbnNpZGVyIHRoaXMgYW4gZXJyb3IuIElmIHRoZSBjbGllbnQgZG9lcyB3cml0ZSBkYXRhLCB0aGVuCisgIC8vIGFub3RoZXIgUmVmcmVzaCgpIHdpbGwgYmUgYXR0ZW1wdGVkIGFuZCBpdCB3aWxsIHNldCB0aGUgZXJyb3Igb25jZSBhZ2Fpbi4KKyAgaGFkX2Vycm9yXyA9IGZhbHNlOworfQorCitDb2RlZE91dHB1dFN0cmVhbTo6fkNvZGVkT3V0cHV0U3RyZWFtKCkgeworICBpZiAoYnVmZmVyX3NpemVfID4gMCkgeworICAgIG91dHB1dF8tPkJhY2tVcChidWZmZXJfc2l6ZV8pOworICB9Cit9CisKK2Jvb2wgQ29kZWRPdXRwdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIGlmIChjb3VudCA8IDApIHJldHVybiBmYWxzZTsKKworICB3aGlsZSAoY291bnQgPiBidWZmZXJfc2l6ZV8pIHsKKyAgICBjb3VudCAtPSBidWZmZXJfc2l6ZV87CisgICAgaWYgKCFSZWZyZXNoKCkpIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEFkdmFuY2UoY291bnQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2RlZE91dHB1dFN0cmVhbTo6R2V0RGlyZWN0QnVmZmVyUG9pbnRlcih2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIGlmIChidWZmZXJfc2l6ZV8gPT0gMCAmJiAhUmVmcmVzaCgpKSByZXR1cm4gZmFsc2U7CisKKyAgKmRhdGEgPSBidWZmZXJfOworICAqc2l6ZSA9IGJ1ZmZlcl9zaXplXzsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlUmF3KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKSB7CisgIHdoaWxlIChidWZmZXJfc2l6ZV8gPCBzaXplKSB7CisgICAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIGJ1ZmZlcl9zaXplXyk7CisgICAgc2l6ZSAtPSBidWZmZXJfc2l6ZV87CisgICAgZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhKSArIGJ1ZmZlcl9zaXplXzsKKyAgICBpZiAoIVJlZnJlc2goKSkgcmV0dXJuOworICB9CisKKyAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIHNpemUpOworICBBZHZhbmNlKHNpemUpOworfQorCit1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlUmF3VG9BcnJheSgKKyAgICBjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgdWludDgqIHRhcmdldCkgeworICBtZW1jcHkodGFyZ2V0LCBkYXRhLCBzaXplKTsKKyAgcmV0dXJuIHRhcmdldCArIHNpemU7Cit9CisKKwordm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW4zMih1aW50MzIgdmFsdWUpIHsKKyAgdWludDggYnl0ZXNbc2l6ZW9mKHZhbHVlKV07CisKKyAgYm9vbCB1c2VfZmFzdCA9IGJ1ZmZlcl9zaXplXyA+PSBzaXplb2YodmFsdWUpOworICB1aW50OCogcHRyID0gdXNlX2Zhc3QgPyBidWZmZXJfIDogYnl0ZXM7CisKKyAgV3JpdGVMaXR0bGVFbmRpYW4zMlRvQXJyYXkodmFsdWUsIHB0cik7CisKKyAgaWYgKHVzZV9mYXN0KSB7CisgICAgQWR2YW5jZShzaXplb2YodmFsdWUpKTsKKyAgfSBlbHNlIHsKKyAgICBXcml0ZVJhdyhieXRlcywgc2l6ZW9mKHZhbHVlKSk7CisgIH0KK30KKwordm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW42NCh1aW50NjQgdmFsdWUpIHsKKyAgdWludDggYnl0ZXNbc2l6ZW9mKHZhbHVlKV07CisKKyAgYm9vbCB1c2VfZmFzdCA9IGJ1ZmZlcl9zaXplXyA+PSBzaXplb2YodmFsdWUpOworICB1aW50OCogcHRyID0gdXNlX2Zhc3QgPyBidWZmZXJfIDogYnl0ZXM7CisKKyAgV3JpdGVMaXR0bGVFbmRpYW42NFRvQXJyYXkodmFsdWUsIHB0cik7CisKKyAgaWYgKHVzZV9mYXN0KSB7CisgICAgQWR2YW5jZShzaXplb2YodmFsdWUpKTsKKyAgfSBlbHNlIHsKKyAgICBXcml0ZVJhdyhieXRlcywgc2l6ZW9mKHZhbHVlKSk7CisgIH0KK30KKworaW5saW5lIHVpbnQ4KiBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMkZhbGxiYWNrVG9BcnJheUlubGluZSgKKyAgICB1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIHsKKyAgdGFyZ2V0WzBdID0gc3RhdGljX2Nhc3Q8dWludDg+KHZhbHVlIHwgMHg4MCk7CisgIGlmICh2YWx1ZSA+PSAoMSA8PCA3KSkgeworICAgIHRhcmdldFsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4PigodmFsdWUgPj4gIDcpIHwgMHg4MCk7CisgICAgaWYgKHZhbHVlID49ICgxIDw8IDE0KSkgeworICAgICAgdGFyZ2V0WzJdID0gc3RhdGljX2Nhc3Q8dWludDg+KCh2YWx1ZSA+PiAxNCkgfCAweDgwKTsKKyAgICAgIGlmICh2YWx1ZSA+PSAoMSA8PCAyMSkpIHsKKyAgICAgICAgdGFyZ2V0WzNdID0gc3RhdGljX2Nhc3Q8dWludDg+KCh2YWx1ZSA+PiAyMSkgfCAweDgwKTsKKyAgICAgICAgaWYgKHZhbHVlID49ICgxIDw8IDI4KSkgeworICAgICAgICAgIHRhcmdldFs0XSA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSA+PiAyOCk7CisgICAgICAgICAgcmV0dXJuIHRhcmdldCArIDU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGFyZ2V0WzNdICY9IDB4N0Y7CisgICAgICAgICAgcmV0dXJuIHRhcmdldCArIDQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRhcmdldFsyXSAmPSAweDdGOworICAgICAgICByZXR1cm4gdGFyZ2V0ICsgMzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGFyZ2V0WzFdICY9IDB4N0Y7CisgICAgICByZXR1cm4gdGFyZ2V0ICsgMjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGFyZ2V0WzBdICY9IDB4N0Y7CisgICAgcmV0dXJuIHRhcmdldCArIDE7CisgIH0KK30KKwordm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMih1aW50MzIgdmFsdWUpIHsKKyAgaWYgKGJ1ZmZlcl9zaXplXyA+PSBrTWF4VmFyaW50MzJCeXRlcykgeworICAgIC8vIEZhc3QgcGF0aDogIFdlIGhhdmUgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciB0byBndWFyYW50ZWUgdGhhdAorICAgIC8vIHRoaXMgd3JpdGUgd29uJ3QgY3Jvc3MgdGhlIGVuZCwgc28gd2UgY2FuIHNraXAgdGhlIGNoZWNrcy4KKyAgICB1aW50OCogdGFyZ2V0ID0gYnVmZmVyXzsKKyAgICB1aW50OCogZW5kID0gV3JpdGVWYXJpbnQzMkZhbGxiYWNrVG9BcnJheUlubGluZSh2YWx1ZSwgdGFyZ2V0KTsKKyAgICBpbnQgc2l6ZSA9IGVuZCAtIHRhcmdldDsKKyAgICBBZHZhbmNlKHNpemUpOworICB9IGVsc2UgeworICAgIC8vIFNsb3cgcGF0aDogIFRoaXMgd3JpdGUgbWlnaHQgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBzbyB3ZQorICAgIC8vIGNvbXBvc2UgdGhlIGJ5dGVzIGZpcnN0IHRoZW4gdXNlIFdyaXRlUmF3KCkuCisgICAgdWludDggYnl0ZXNba01heFZhcmludDMyQnl0ZXNdOworICAgIGludCBzaXplID0gMDsKKyAgICB3aGlsZSAodmFsdWUgPiAweDdGKSB7CisgICAgICBieXRlc1tzaXplKytdID0gKHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSkgJiAweDdGKSB8IDB4ODA7CisgICAgICB2YWx1ZSA+Pj0gNzsKKyAgICB9CisgICAgYnl0ZXNbc2l6ZSsrXSA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSkgJiAweDdGOworICAgIFdyaXRlUmF3KGJ5dGVzLCBzaXplKTsKKyAgfQorfQorCit1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJGYWxsYmFja1RvQXJyYXkoCisgICAgdWludDMyIHZhbHVlLCB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBXcml0ZVZhcmludDMyRmFsbGJhY2tUb0FycmF5SW5saW5lKHZhbHVlLCB0YXJnZXQpOworfQorCitpbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0VG9BcnJheUlubGluZSgKKyAgICB1aW50NjQgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIHsKKyAgLy8gU3BsaXR0aW5nIGludG8gMzItYml0IHBpZWNlcyBnaXZlcyBiZXR0ZXIgcGVyZm9ybWFuY2Ugb24gMzItYml0CisgIC8vIHByb2Nlc3NvcnMuCisgIHVpbnQzMiBwYXJ0MCA9IHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUgICAgICApOworICB1aW50MzIgcGFydDEgPSBzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlID4+IDI4KTsKKyAgdWludDMyIHBhcnQyID0gc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSA+PiA1Nik7CisKKyAgaW50IHNpemU7CisKKyAgLy8gSGVyZSB3ZSBjYW4ndCByZWFsbHkgb3B0aW1pemUgZm9yIHNtYWxsIG51bWJlcnMsIHNpbmNlIHRoZSB2YWx1ZSBpcworICAvLyBzcGxpdCBpbnRvIHRocmVlIHBhcnRzLiAgQ2hla2luZyBmb3IgbnVtYmVycyA8IDEyOCwgZm9yIGluc3RhbmNlLAorICAvLyB3b3VsZCByZXF1aXJlIHRocmVlIGNvbXBhcmlzb25zLCBzaW5jZSB5b3UnZCBoYXZlIHRvIG1ha2Ugc3VyZSBwYXJ0MQorICAvLyBhbmQgcGFydDIgYXJlIHplcm8uICBIb3dldmVyLCBpZiB0aGUgY2FsbGVyIGlzIHVzaW5nIDY0LWJpdCBpbnRlZ2VycywKKyAgLy8gaXQgaXMgbGlrZWx5IHRoYXQgdGhleSBleHBlY3QgdGhlIG51bWJlcnMgdG8gb2Z0ZW4gYmUgdmVyeSBsYXJnZSwgc28KKyAgLy8gd2UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBvcHRpbWl6ZSBmb3Igc21hbGwgbnVtYmVycyBhbnl3YXkuICBUaHVzLAorICAvLyB3ZSBlbmQgdXAgd2l0aCBhIGhhcmRjb2RlZCBiaW5hcnkgc2VhcmNoIHRyZWUuLi4KKyAgaWYgKHBhcnQyID09IDApIHsKKyAgICBpZiAocGFydDEgPT0gMCkgeworICAgICAgaWYgKHBhcnQwIDwgKDEgPDwgMTQpKSB7CisgICAgICAgIGlmIChwYXJ0MCA8ICgxIDw8IDcpKSB7CisgICAgICAgICAgc2l6ZSA9IDE7IGdvdG8gc2l6ZTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2l6ZSA9IDI7IGdvdG8gc2l6ZTI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwYXJ0MCA8ICgxIDw8IDIxKSkgeworICAgICAgICAgIHNpemUgPSAzOyBnb3RvIHNpemUzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNpemUgPSA0OyBnb3RvIHNpemU0OworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChwYXJ0MSA8ICgxIDw8IDE0KSkgeworICAgICAgICBpZiAocGFydDEgPCAoMSA8PCA3KSkgeworICAgICAgICAgIHNpemUgPSA1OyBnb3RvIHNpemU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNpemUgPSA2OyBnb3RvIHNpemU2OworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocGFydDEgPCAoMSA8PCAyMSkpIHsKKyAgICAgICAgICBzaXplID0gNzsgZ290byBzaXplNzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzaXplID0gODsgZ290byBzaXplODsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocGFydDIgPCAoMSA8PCA3KSkgeworICAgICAgc2l6ZSA9IDk7IGdvdG8gc2l6ZTk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNpemUgPSAxMDsgZ290byBzaXplMTA7CisgICAgfQorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisKKyAgc2l6ZTEwOiB0YXJnZXRbOV0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQyID4+ICA3KSB8IDB4ODApOworICBzaXplOSA6IHRhcmdldFs4XSA9IHN0YXRpY19jYXN0PHVpbnQ4PigocGFydDIgICAgICApIHwgMHg4MCk7CisgIHNpemU4IDogdGFyZ2V0WzddID0gc3RhdGljX2Nhc3Q8dWludDg+KChwYXJ0MSA+PiAyMSkgfCAweDgwKTsKKyAgc2l6ZTcgOiB0YXJnZXRbNl0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQxID4+IDE0KSB8IDB4ODApOworICBzaXplNiA6IHRhcmdldFs1XSA9IHN0YXRpY19jYXN0PHVpbnQ4PigocGFydDEgPj4gIDcpIHwgMHg4MCk7CisgIHNpemU1IDogdGFyZ2V0WzRdID0gc3RhdGljX2Nhc3Q8dWludDg+KChwYXJ0MSAgICAgICkgfCAweDgwKTsKKyAgc2l6ZTQgOiB0YXJnZXRbM10gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQwID4+IDIxKSB8IDB4ODApOworICBzaXplMyA6IHRhcmdldFsyXSA9IHN0YXRpY19jYXN0PHVpbnQ4PigocGFydDAgPj4gMTQpIHwgMHg4MCk7CisgIHNpemUyIDogdGFyZ2V0WzFdID0gc3RhdGljX2Nhc3Q8dWludDg+KChwYXJ0MCA+PiAgNykgfCAweDgwKTsKKyAgc2l6ZTEgOiB0YXJnZXRbMF0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQwICAgICAgKSB8IDB4ODApOworCisgIHRhcmdldFtzaXplLTFdICY9IDB4N0Y7CisgIHJldHVybiB0YXJnZXQgKyBzaXplOworfQorCit2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0KHVpbnQ2NCB2YWx1ZSkgeworICBpZiAoYnVmZmVyX3NpemVfID49IGtNYXhWYXJpbnRCeXRlcykgeworICAgIC8vIEZhc3QgcGF0aDogIFdlIGhhdmUgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciB0byBndWFyYW50ZWUgdGhhdAorICAgIC8vIHRoaXMgd3JpdGUgd29uJ3QgY3Jvc3MgdGhlIGVuZCwgc28gd2UgY2FuIHNraXAgdGhlIGNoZWNrcy4KKyAgICB1aW50OCogdGFyZ2V0ID0gYnVmZmVyXzsKKworICAgIHVpbnQ4KiBlbmQgPSBXcml0ZVZhcmludDY0VG9BcnJheUlubGluZSh2YWx1ZSwgdGFyZ2V0KTsKKyAgICBpbnQgc2l6ZSA9IGVuZCAtIHRhcmdldDsKKyAgICBBZHZhbmNlKHNpemUpOworICB9IGVsc2UgeworICAgIC8vIFNsb3cgcGF0aDogIFRoaXMgd3JpdGUgbWlnaHQgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBzbyB3ZQorICAgIC8vIGNvbXBvc2UgdGhlIGJ5dGVzIGZpcnN0IHRoZW4gdXNlIFdyaXRlUmF3KCkuCisgICAgdWludDggYnl0ZXNba01heFZhcmludEJ5dGVzXTsKKyAgICBpbnQgc2l6ZSA9IDA7CisgICAgd2hpbGUgKHZhbHVlID4gMHg3RikgeworICAgICAgYnl0ZXNbc2l6ZSsrXSA9IChzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpICYgMHg3RikgfCAweDgwOworICAgICAgdmFsdWUgPj49IDc7CisgICAgfQorICAgIGJ5dGVzW3NpemUrK10gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpICYgMHg3RjsKKyAgICBXcml0ZVJhdyhieXRlcywgc2l6ZSk7CisgIH0KK30KKwordWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0VG9BcnJheSgKKyAgICB1aW50NjQgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIHsKKyAgcmV0dXJuIFdyaXRlVmFyaW50NjRUb0FycmF5SW5saW5lKHZhbHVlLCB0YXJnZXQpOworfQorCitib29sIENvZGVkT3V0cHV0U3RyZWFtOjpSZWZyZXNoKCkgeworICB2b2lkKiB2b2lkX2J1ZmZlcjsKKyAgaWYgKG91dHB1dF8tPk5leHQoJnZvaWRfYnVmZmVyLCAmYnVmZmVyX3NpemVfKSkgeworICAgIGJ1ZmZlcl8gPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4odm9pZF9idWZmZXIpOworICAgIHRvdGFsX2J5dGVzXyArPSBidWZmZXJfc2l6ZV87CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgYnVmZmVyXyA9IE5VTEw7CisgICAgYnVmZmVyX3NpemVfID0gMDsKKyAgICBoYWRfZXJyb3JfID0gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworaW50IENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzJGYWxsYmFjayh1aW50MzIgdmFsdWUpIHsKKyAgaWYgKHZhbHVlIDwgKDEgPDwgNykpIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIGlmICh2YWx1ZSA8ICgxIDw8IDE0KSkgeworICAgIHJldHVybiAyOworICB9IGVsc2UgaWYgKHZhbHVlIDwgKDEgPDwgMjEpKSB7CisgICAgcmV0dXJuIDM7CisgIH0gZWxzZSBpZiAodmFsdWUgPCAoMSA8PCAyOCkpIHsKKyAgICByZXR1cm4gNDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gNTsKKyAgfQorfQorCitpbnQgQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NCh1aW50NjQgdmFsdWUpIHsKKyAgaWYgKHZhbHVlIDwgKDF1bGwgPDwgMzUpKSB7CisgICAgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNykpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAodmFsdWUgPCAoMXVsbCA8PCAxNCkpIHsKKyAgICAgIHJldHVybiAyOworICAgIH0gZWxzZSBpZiAodmFsdWUgPCAoMXVsbCA8PCAyMSkpIHsKKyAgICAgIHJldHVybiAzOworICAgIH0gZWxzZSBpZiAodmFsdWUgPCAoMXVsbCA8PCAyOCkpIHsKKyAgICAgIHJldHVybiA0OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gNTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNDIpKSB7CisgICAgICByZXR1cm4gNjsKKyAgICB9IGVsc2UgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNDkpKSB7CisgICAgICByZXR1cm4gNzsKKyAgICB9IGVsc2UgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNTYpKSB7CisgICAgICByZXR1cm4gODsKKyAgICB9IGVsc2UgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNjMpKSB7CisgICAgICByZXR1cm4gOTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIDEwOworICAgIH0KKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjI0ODlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmgKQEAgLTAsMCArMSwxMTE4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIENvZGVkSW5wdXRTdHJlYW0gYW5kIENvZGVkT3V0cHV0U3RyZWFtIGNsYXNzZXMsCisvLyB3aGljaCB3cmFwIGEgWmVyb0NvcHlJbnB1dFN0cmVhbSBvciBaZXJvQ29weU91dHB1dFN0cmVhbSwgcmVzcGVjdGl2ZWx5LAorLy8gYW5kIGFsbG93IHlvdSB0byByZWFkIG9yIHdyaXRlIGluZGl2aWR1YWwgcGllY2VzIG9mIGRhdGEgaW4gdmFyaW91cworLy8gZm9ybWF0cy4gIEluIHBhcnRpY3VsYXIsIHRoZXNlIGltcGxlbWVudCB0aGUgdmFyaW50IGVuY29kaW5nIGZvcgorLy8gaW50ZWdlcnMsIGEgc2ltcGxlIHZhcmlhYmxlLWxlbmd0aCBlbmNvZGluZyBpbiB3aGljaCBzbWFsbGVyIG51bWJlcnMKKy8vIHRha2UgZmV3ZXIgYnl0ZXMuCisvLworLy8gVHlwaWNhbGx5IHRoZXNlIGNsYXNzZXMgd2lsbCBvbmx5IGJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgcHJvdG9jb2wKKy8vIGJ1ZmZlciBsaWJyYXJ5IGluIG9yZGVyIHRvIGVuY29kZSBhbmQgZGVjb2RlIHByb3RvY29sIGJ1ZmZlcnMuICBDbGllbnRzCisvLyBvZiB0aGUgbGlicmFyeSBvbmx5IG5lZWQgdG8ga25vdyBhYm91dCB0aGlzIGNsYXNzIGlmIHRoZXkgd2lzaCB0byB3cml0ZQorLy8gY3VzdG9tIG1lc3NhZ2UgcGFyc2luZyBvciBzZXJpYWxpemF0aW9uIHByb2NlZHVyZXMuCisvLworLy8gQ29kZWRPdXRwdXRTdHJlYW0gZXhhbXBsZToKKy8vICAgLy8gV3JpdGUgc29tZSBkYXRhIHRvICJteWZpbGUiLiAgRmlyc3Qgd2Ugd3JpdGUgYSA0LWJ5dGUgIm1hZ2ljIG51bWJlciIKKy8vICAgLy8gdG8gaWRlbnRpZnkgdGhlIGZpbGUgdHlwZSwgdGhlbiB3cml0ZSBhIGxlbmd0aC1kZWxpbWl0ZWQgc3RyaW5nLiAgVGhlCisvLyAgIC8vIHN0cmluZyBpcyBjb21wb3NlZCBvZiBhIHZhcmludCBnaXZpbmcgdGhlIGxlbmd0aCBmb2xsb3dlZCBieSB0aGUgcmF3CisvLyAgIC8vIGJ5dGVzLgorLy8gICBpbnQgZmQgPSBvcGVuKCJteWZpbGUiLCBPX1dST05MWSk7CisvLyAgIFplcm9Db3B5T3V0cHV0U3RyZWFtKiByYXdfb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmQpOworLy8gICBDb2RlZE91dHB1dFN0cmVhbSogY29kZWRfb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHJhd19vdXRwdXQpOworLy8KKy8vICAgaW50IG1hZ2ljX251bWJlciA9IDEyMzQ7CisvLyAgIGNoYXIgdGV4dFtdID0gIkhlbGxvIHdvcmxkISI7CisvLyAgIGNvZGVkX291dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW4zMihtYWdpY19udW1iZXIpOworLy8gICBjb2RlZF9vdXRwdXQtPldyaXRlVmFyaW50MzIoc3RybGVuKHRleHQpKTsKKy8vICAgY29kZWRfb3V0cHV0LT5Xcml0ZVJhdyh0ZXh0LCBzdHJsZW4odGV4dCkpOworLy8KKy8vICAgZGVsZXRlIGNvZGVkX291dHB1dDsKKy8vICAgZGVsZXRlIHJhd19vdXRwdXQ7CisvLyAgIGNsb3NlKGZkKTsKKy8vCisvLyBDb2RlZElucHV0U3RyZWFtIGV4YW1wbGU6CisvLyAgIC8vIFJlYWQgYSBmaWxlIGNyZWF0ZWQgYnkgdGhlIGFib3ZlIGNvZGUuCisvLyAgIGludCBmZCA9IG9wZW4oIm15ZmlsZSIsIE9fUkRPTkxZKTsKKy8vICAgWmVyb0NvcHlJbnB1dFN0cmVhbSogcmF3X2lucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmZCk7CisvLyAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShyYXdfaW5wdXQpOworLy8KKy8vICAgY29kZWRfaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmbWFnaWNfbnVtYmVyKTsKKy8vICAgaWYgKG1hZ2ljX251bWJlciAhPSAxMjM0KSB7CisvLyAgICAgY2VyciA8PCAiRmlsZSBub3QgaW4gZXhwZWN0ZWQgZm9ybWF0LiIgPDwgZW5kbDsKKy8vICAgICByZXR1cm47CisvLyAgIH0KKy8vCisvLyAgIHVpbnQzMiBzaXplOworLy8gICBjb2RlZF9pbnB1dC0+UmVhZFZhcmludDMyKCZzaXplKTsKKy8vCisvLyAgIGNoYXIqIHRleHQgPSBuZXcgY2hhcltzaXplICsgMV07CisvLyAgIGNvZGVkX2lucHV0LT5SZWFkUmF3KGJ1ZmZlciwgc2l6ZSk7CisvLyAgIHRleHRbc2l6ZV0gPSAnXDAnOworLy8KKy8vICAgZGVsZXRlIGNvZGVkX2lucHV0OworLy8gICBkZWxldGUgcmF3X2lucHV0OworLy8gICBjbG9zZShmZCk7CisvLworLy8gICBjb3V0IDw8ICJUZXh0IGlzOiAiIDw8IHRleHQgPDwgZW5kbDsKKy8vICAgZGVsZXRlIFtdIHRleHQ7CisvLworLy8gRm9yIHRob3NlIHdobyBhcmUgaW50ZXJlc3RlZCwgdmFyaW50IGVuY29kaW5nIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKy8vCisvLyBUaGUgZW5jb2Rpbmcgb3BlcmF0ZXMgb24gdW5zaWduZWQgaW50ZWdlcnMgb2YgdXAgdG8gNjQgYml0cyBpbiBsZW5ndGguCisvLyBFYWNoIGJ5dGUgb2YgdGhlIGVuY29kZWQgdmFsdWUgaGFzIHRoZSBmb3JtYXQ6CisvLyAqIGJpdHMgMC02OiBTZXZlbiBiaXRzIG9mIHRoZSBudW1iZXIgYmVpbmcgZW5jb2RlZC4KKy8vICogYml0IDc6IFplcm8gaWYgdGhpcyBpcyB0aGUgbGFzdCBieXRlIGluIHRoZSBlbmNvZGluZyAoaW4gd2hpY2gKKy8vICAgY2FzZSBhbGwgcmVtYWluaW5nIGJpdHMgb2YgdGhlIG51bWJlciBhcmUgemVybykgb3IgMSBpZgorLy8gICBtb3JlIGJ5dGVzIGZvbGxvdy4KKy8vIFRoZSBmaXJzdCBieXRlIGNvbnRhaW5zIHRoZSBsZWFzdC1zaWduaWZpY2FudCA3IGJpdHMgb2YgdGhlIG51bWJlciwgdGhlCisvLyBzZWNvbmQgYnl0ZSAoaWYgcHJlc2VudCkgY29udGFpbnMgdGhlIG5leHQtbGVhc3Qtc2lnbmlmaWNhbnQgNyBiaXRzLAorLy8gYW5kIHNvIG9uLiAgU28sIHRoZSBiaW5hcnkgbnVtYmVyIDEwMTEwMDAxMDEwMTEgd291bGQgYmUgZW5jb2RlZCBpbiB0d28KKy8vIGJ5dGVzIGFzICIxMDEwMTAxMSAwMDEwMTEwMCIuCisvLworLy8gSW4gdGhlb3J5LCB2YXJpbnQgY291bGQgYmUgdXNlZCB0byBlbmNvZGUgaW50ZWdlcnMgb2YgYW55IGxlbmd0aC4KKy8vIEhvd2V2ZXIsIGZvciBwcmFjdGljYWxpdHkgd2Ugc2V0IGEgbGltaXQgYXQgNjQgYml0cy4gIFRoZSBtYXhpbXVtIGVuY29kZWQKKy8vIGxlbmd0aCBvZiBhIG51bWJlciBpcyB0aHVzIDEwIGJ5dGVzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaWZkZWYgX01TQ19WRVIKKyAgI2lmIGRlZmluZWQoX01fSVg4NikgJiYgXAorICAgICAgIWRlZmluZWQoUFJPVE9CVUZfRElTQUJMRV9MSVRUTEVfRU5ESUFOX09QVF9GT1JfVEVTVCkKKyAgICAjZGVmaW5lIFBST1RPQlVGX0xJVFRMRV9FTkRJQU4gMQorICAjZW5kaWYKKyAgI2lmIF9NU0NfVkVSID49IDEzMDAKKyAgICAvLyBJZiBNU1ZDIGhhcyAiL1JUQ2MiIHNldCwgaXQgd2lsbCBjb21wbGFpbiBhYm91dCB0cnVuY2F0aW5nIGNhc3RzIGF0CisgICAgLy8gcnVudGltZS4gIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGludGVudGlvbmFsIHRydW5jYXRpbmcgY2FzdHMuCisgICAgI3ByYWdtYSBydW50aW1lX2NoZWNrcygiYyIsIG9mZikKKyAgI2VuZGlmCisjZWxzZQorICAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+ICAgLy8gX19CWVRFX09SREVSCisgICNpZiBkZWZpbmVkKF9fQllURV9PUkRFUikgJiYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTiAmJiBcCisgICAgICAhZGVmaW5lZChQUk9UT0JVRl9ESVNBQkxFX0xJVFRMRV9FTkRJQU5fT1BUX0ZPUl9URVNUKQorICAgICNkZWZpbmUgUFJPVE9CVUZfTElUVExFX0VORElBTiAxCisgICNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBEZXNjcmlwdG9yUG9vbDsKK2NsYXNzIE1lc3NhZ2VGYWN0b3J5OworCituYW1lc3BhY2UgaW8geworCisvLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KK2NsYXNzIENvZGVkSW5wdXRTdHJlYW07CitjbGFzcyBDb2RlZE91dHB1dFN0cmVhbTsKKworLy8gRGVmaW5lZCBpbiBvdGhlciBmaWxlcy4KK2NsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07ICAgICAgICAgICAvLyB6ZXJvX2NvcHlfc3RyZWFtLmgKK2NsYXNzIFplcm9Db3B5T3V0cHV0U3RyZWFtOyAgICAgICAgICAvLyB6ZXJvX2NvcHlfc3RyZWFtLmgKKworLy8gQ2xhc3Mgd2hpY2ggcmVhZHMgYW5kIGRlY29kZXMgYmluYXJ5IGRhdGEgd2hpY2ggaXMgY29tcG9zZWQgb2YgdmFyaW50LQorLy8gZW5jb2RlZCBpbnRlZ2VycyBhbmQgZml4ZWQtd2lkdGggcGllY2VzLiAgV3JhcHMgYSBaZXJvQ29weUlucHV0U3RyZWFtLgorLy8gTW9zdCB1c2VycyB3aWxsIG5vdCBuZWVkIHRvIGRlYWwgd2l0aCBDb2RlZElucHV0U3RyZWFtLgorLy8KKy8vIE1vc3QgbWV0aG9kcyBvZiBDb2RlZElucHV0U3RyZWFtIHRoYXQgcmV0dXJuIGEgYm9vbCByZXR1cm4gZmFsc2UgaWYgYW4KKy8vIHVuZGVybHlpbmcgSS9PIGVycm9yIG9jY3VycyBvciBpZiB0aGUgZGF0YSBpcyBtYWxmb3JtZWQuICBPbmNlIHN1Y2ggYQorLy8gZmFpbHVyZSBvY2N1cnMsIHRoZSBDb2RlZElucHV0U3RyZWFtIGlzIGJyb2tlbiBhbmQgaXMgbm8gbG9uZ2VyIHVzZWZ1bC4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb2RlZElucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSBhIENvZGVkSW5wdXRTdHJlYW0gdGhhdCByZWFkcyBmcm9tIHRoZSBnaXZlbiBaZXJvQ29weUlucHV0U3RyZWFtLgorICBleHBsaWNpdCBDb2RlZElucHV0U3RyZWFtKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KTsKKworICAvLyBDcmVhdGUgYSBDb2RlZElucHV0U3RyZWFtIHRoYXQgcmVhZHMgZnJvbSB0aGUgZ2l2ZW4gZmxhdCBhcnJheS4gIFRoaXMgaXMKKyAgLy8gZmFzdGVyIHRoYW4gdXNpbmcgYW4gQXJyYXlJbnB1dFN0cmVhbS4gIFB1c2hMaW1pdChzaXplKSBpcyBpbXBsaWVkIGJ5CisgIC8vIHRoaXMgY29uc3RydWN0b3IuCisgIGV4cGxpY2l0IENvZGVkSW5wdXRTdHJlYW0oY29uc3QgdWludDgqIGJ1ZmZlciwgaW50IHNpemUpOworCisgIC8vIERlc3Ryb3kgdGhlIENvZGVkSW5wdXRTdHJlYW0gYW5kIHBvc2l0aW9uIHRoZSB1bmRlcmx5aW5nCisgIC8vIFplcm9Db3B5SW5wdXRTdHJlYW0gYXQgdGhlIGZpcnN0IHVucmVhZCBieXRlLiAgSWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUKKyAgLy8gcmVhZGluZyAoY2F1c2luZyBhIG1ldGhvZCB0byByZXR1cm4gZmFsc2UpLCB0aGVuIHRoZSBleGFjdCBwb3NpdGlvbiBvZgorICAvLyB0aGUgaW5wdXQgc3RyZWFtIG1heSBiZSBhbnl3aGVyZSBiZXR3ZWVuIHRoZSBsYXN0IHZhbHVlIHRoYXQgd2FzIHJlYWQKKyAgLy8gc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgc3RyZWFtJ3MgYnl0ZSBsaW1pdC4KKyAgfkNvZGVkSW5wdXRTdHJlYW0oKTsKKworCisgIC8vIFNraXBzIGEgbnVtYmVyIG9mIGJ5dGVzLiAgUmV0dXJucyBmYWxzZSBpZiBhbiB1bmRlcmx5aW5nIHJlYWQgZXJyb3IKKyAgLy8gb2NjdXJzLgorICBib29sIFNraXAoaW50IGNvdW50KTsKKworICAvLyBTZXRzICpkYXRhIHRvIHBvaW50IGRpcmVjdGx5IGF0IHRoZSB1bnJlYWQgcGFydCBvZiB0aGUgQ29kZWRJbnB1dFN0cmVhbSdzCisgIC8vIHVuZGVybHlpbmcgYnVmZmVyLCBhbmQgKnNpemUgdG8gdGhlIHNpemUgb2YgdGhhdCBidWZmZXIsIGJ1dCBkb2VzIG5vdAorICAvLyBhZHZhbmNlIHRoZSBzdHJlYW0ncyBjdXJyZW50IHBvc2l0aW9uLiAgVGhpcyB3aWxsIGFsd2F5cyBlaXRoZXIgcHJvZHVjZQorICAvLyBhIG5vbi1lbXB0eSBidWZmZXIgb3IgcmV0dXJuIGZhbHNlLiAgSWYgdGhlIGNhbGxlciBjb25zdW1lcyBhbnkgb2YKKyAgLy8gdGhpcyBkYXRhLCBpdCBzaG91bGQgdGhlbiBjYWxsIFNraXAoKSB0byBza2lwIG92ZXIgdGhlIGNvbnN1bWVkIGJ5dGVzLgorICAvLyBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBleHRlcm5hbCBmYXN0IHBhcnNpbmcgcm91dGluZXMgZm9yCisgIC8vIHR5cGVzIG9mIGRhdGEgbm90IGNvdmVyZWQgYnkgdGhlIENvZGVkSW5wdXRTdHJlYW0gaW50ZXJmYWNlLgorICBib29sIEdldERpcmVjdEJ1ZmZlclBvaW50ZXIoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisKKyAgLy8gTGlrZSBHZXREaXJlY3RCdWZmZXJQb2ludGVyLCBidXQgdGhpcyBtZXRob2QgaXMgaW5saW5lZCwgYW5kIGRvZXMgbm90CisgIC8vIGF0dGVtcHQgdG8gUmVmcmVzaCgpIGlmIHRoZSBidWZmZXIgaXMgY3VycmVudGx5IGVtcHR5LgorICBpbmxpbmUgdm9pZCBHZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKGNvbnN0IHZvaWQqKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc2l6ZSkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworCisgIC8vIFJlYWQgcmF3IGJ5dGVzLCBjb3B5aW5nIHRoZW0gaW50byB0aGUgZ2l2ZW4gYnVmZmVyLgorICBib29sIFJlYWRSYXcodm9pZCogYnVmZmVyLCBpbnQgc2l6ZSk7CisKKyAgLy8gTGlrZSBSZWFkUmF3LCBidXQgcmVhZHMgaW50byBhIHN0cmluZy4KKyAgLy8KKyAgLy8gSW1wbGVtZW50YXRpb24gTm90ZTogIFJlYWRTdHJpbmcoKSBncm93cyB0aGUgc3RyaW5nIGdyYWR1YWxseSBhcyBpdAorICAvLyByZWFkcyBpbiB0aGUgZGF0YSwgcmF0aGVyIHRoYW4gYWxsb2NhdGluZyB0aGUgZW50aXJlIHJlcXVlc3RlZCBzaXplCisgIC8vIHVwZnJvbnQuICBUaGlzIHByZXZlbnRzIGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFja3MgaW4gd2hpY2ggYSBjbGllbnQKKyAgLy8gY291bGQgY2xhaW0gdGhhdCBhIHN0cmluZyBpcyBnb2luZyB0byBiZSBNQVhfSU5UIGJ5dGVzIGxvbmcgaW4gb3JkZXIgdG8KKyAgLy8gY3Jhc2ggdGhlIHNlcnZlciBiZWNhdXNlIGl0IGNhbid0IGFsbG9jYXRlIHRoaXMgbXVjaCBzcGFjZSBhdCBvbmNlLgorICBib29sIFJlYWRTdHJpbmcoc3RyaW5nKiBidWZmZXIsIGludCBzaXplKTsKKyAgLy8gTGlrZSB0aGUgYWJvdmUsIHdpdGggaW5saW5lZCBvcHRpbWl6YXRpb25zLiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQKKyAgLy8gYnkgdGhlIHByb3RvYnVmIGltcGxlbWVudGF0aW9uLgorICBpbmxpbmUgYm9vbCBJbnRlcm5hbFJlYWRTdHJpbmdJbmxpbmUoc3RyaW5nKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworCisKKyAgLy8gUmVhZCBhIDMyLWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIuCisgIGJvb2wgUmVhZExpdHRsZUVuZGlhbjMyKHVpbnQzMiogdmFsdWUpOworICAvLyBSZWFkIGEgNjQtYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlci4KKyAgYm9vbCBSZWFkTGl0dGxlRW5kaWFuNjQodWludDY0KiB2YWx1ZSk7CisKKyAgLy8gVGhlc2UgbWV0aG9kcyByZWFkIGZyb20gYW4gZXh0ZXJuYWxseSBwcm92aWRlZCBidWZmZXIuIFRoZSBjYWxsZXIgaXMKKyAgLy8gcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIGJ1ZmZlciBoYXMgc3VmZmljaWVudCBzcGFjZS4KKyAgLy8gUmVhZCBhIDMyLWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIuCisgIHN0YXRpYyBjb25zdCB1aW50OCogUmVhZExpdHRsZUVuZGlhbjMyRnJvbUFycmF5KGNvbnN0IHVpbnQ4KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIqIHZhbHVlKTsKKyAgLy8gUmVhZCBhIDY0LWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIuCisgIHN0YXRpYyBjb25zdCB1aW50OCogUmVhZExpdHRsZUVuZGlhbjY0RnJvbUFycmF5KGNvbnN0IHVpbnQ4KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjQqIHZhbHVlKTsKKworICAvLyBSZWFkIGFuIHVuc2lnbmVkIGludGVnZXIgd2l0aCBWYXJpbnQgZW5jb2RpbmcsIHRydW5jYXRpbmcgdG8gMzIgYml0cy4KKyAgLy8gUmVhZGluZyBhIDMyLWJpdCB2YWx1ZSBpcyBlcXVpdmFsZW50IHRvIHJlYWRpbmcgYSA2NC1iaXQgb25lIGFuZCBjYXN0aW5nCisgIC8vIGl0IHRvIHVpbnQzMiwgYnV0IG1heSBiZSBtb3JlIGVmZmljaWVudC4KKyAgYm9vbCBSZWFkVmFyaW50MzIodWludDMyKiB2YWx1ZSk7CisgIC8vIFJlYWQgYW4gdW5zaWduZWQgaW50ZWdlciB3aXRoIFZhcmludCBlbmNvZGluZy4KKyAgYm9vbCBSZWFkVmFyaW50NjQodWludDY0KiB2YWx1ZSk7CisKKyAgLy8gUmVhZCBhIHRhZy4gIFRoaXMgY2FsbHMgUmVhZFZhcmludDMyKCkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCwgb3IgcmV0dXJucworICAvLyB6ZXJvICh3aGljaCBpcyBub3QgYSB2YWxpZCB0YWcpIGlmIFJlYWRWYXJpbnQzMigpIGZhaWxzLiAgQWxzbywgaXQgdXBkYXRlcworICAvLyB0aGUgbGFzdCB0YWcgdmFsdWUsIHdoaWNoIGNhbiBiZSBjaGVja2VkIHdpdGggTGFzdFRhZ1dhcygpLgorICAvLyBBbHdheXMgaW5saW5lIGJlY2F1c2UgdGhpcyBpcyBvbmx5IGNhbGxlZCBpbiBvbmNlIHBsYWNlIHBlciBwYXJzZSBsb29wCisgIC8vIGJ1dCBpdCBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGl0ZXJhdGlvbiBvZiBzYWlkIGxvb3AsIHNvIGl0IHNob3VsZCBiZSBmYXN0LgorICAvLyBHQ0MgZG9lc24ndCB3YW50IHRvIGlubGluZSB0aGlzIGJ5IGRlZmF1bHQuCisgIHVpbnQzMiBSZWFkVGFnKCkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworCisgIC8vIFVzdWFsbHkgcmV0dXJucyB0cnVlIGlmIGNhbGxpbmcgUmVhZFZhcmludDMyKCkgbm93IHdvdWxkIHByb2R1Y2UgdGhlIGdpdmVuCisgIC8vIHZhbHVlLiAgV2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlIGlmIFJlYWRWYXJpbnQzMigpIHdvdWxkIG5vdCByZXR1cm4gdGhlCisgIC8vIGdpdmVuIHZhbHVlLiAgSWYgRXhwZWN0VGFnKCkgcmV0dXJucyB0cnVlLCBpdCBhbHNvIGFkdmFuY2VzIHBhc3QKKyAgLy8gdGhlIHZhcmludC4gIEZvciBiZXN0IHBlcmZvcm1hbmNlLCB1c2UgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgYXMgdGhlCisgIC8vIHBhcmFtZXRlci4KKyAgLy8gQWx3YXlzIGlubGluZSBiZWNhdXNlIHRoaXMgY29sbGFwc2VzIHRvIGEgc21hbGwgbnVtYmVyIG9mIGluc3RydWN0aW9ucworICAvLyB3aGVuIGdpdmVuIGEgY29uc3RhbnQgcGFyYW1ldGVyLCBidXQgR0NDIGRvZXNuJ3Qgd2FudCB0byBpbmxpbmUgYnkgZGVmYXVsdC4KKyAgYm9vbCBFeHBlY3RUYWcodWludDMyIGV4cGVjdGVkKSBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkU7CisKKyAgLy8gTGlrZSBhYm92ZSwgZXhjZXB0IHRoaXMgcmVhZHMgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4gVGhlIGNhbGxlciBpcworICAvLyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byByZWFkIGEgdmFyaW50CisgIC8vIG9mIHRoZSBleHBlY3RlZCBzaXplLiBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgdXNlIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IGFzCisgIC8vIHRoZSBleHBlY3RlZCB0YWcgcGFyYW1ldGVyLgorICAvLworICAvLyBSZXR1cm5zIGEgcG9pbnRlciBiZXlvbmQgdGhlIGV4cGVjdGVkIHRhZyBpZiBpdCB3YXMgZm91bmQsIG9yIE5VTEwgaWYgaXQKKyAgLy8gd2FzIG5vdC4KKyAgc3RhdGljIGNvbnN0IHVpbnQ4KiBFeHBlY3RUYWdGcm9tQXJyYXkoCisgICAgICBjb25zdCB1aW50OCogYnVmZmVyLAorICAgICAgdWludDMyIGV4cGVjdGVkKSBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkU7CisKKyAgLy8gVXN1YWxseSByZXR1cm5zIHRydWUgaWYgbm8gbW9yZSBieXRlcyBjYW4gYmUgcmVhZC4gIEFsd2F5cyByZXR1cm5zIGZhbHNlCisgIC8vIGlmIG1vcmUgYnl0ZXMgY2FuIGJlIHJlYWQuICBJZiBFeHBlY3RBdEVuZCgpIHJldHVybnMgdHJ1ZSwgYSBzdWJzZXF1ZW50CisgIC8vIGNhbGwgdG8gTGFzdFRhZ1dhcygpIHdpbGwgYWN0IGFzIGlmIFJlYWRUYWcoKSBoYWQgYmVlbiBjYWxsZWQgYW5kIHJldHVybmVkCisgIC8vIHplcm8sIGFuZCBDb25zdW1lZEVudGlyZU1lc3NhZ2UoKSB3aWxsIHJldHVybiB0cnVlLgorICBib29sIEV4cGVjdEF0RW5kKCk7CisKKyAgLy8gSWYgdGhlIGxhc3QgY2FsbCB0byBSZWFkVGFnKCkgcmV0dXJuZWQgdGhlIGdpdmVuIHZhbHVlLCByZXR1cm5zIHRydWUuCisgIC8vIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZTsKKyAgLy8KKyAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBwYXJzZXJzIGZvciBzb21lIHR5cGVzIG9mIGVtYmVkZGVkIG1lc3NhZ2VzCisgIC8vICh3aXRoIGZpZWxkIHR5cGUgVFlQRV9HUk9VUCkgZG9uJ3QgYWN0dWFsbHkga25vdyB0aGF0IHRoZXkndmUgcmVhY2hlZCB0aGUKKyAgLy8gZW5kIG9mIGEgbWVzc2FnZSB1bnRpbCB0aGV5IHNlZSBhbiBFTkRHUk9VUCB0YWcsIHdoaWNoIHdhcyBhY3R1YWxseSBwYXJ0CisgIC8vIG9mIHRoZSBlbmNsb3NpbmcgbWVzc2FnZS4gIFRoZSBlbmNsb3NpbmcgbWVzc2FnZSB3b3VsZCBsaWtlIHRvIGNoZWNrIHRoYXQKKyAgLy8gdGFnIHRvIG1ha2Ugc3VyZSBpdCBoYWQgdGhlIHJpZ2h0IG51bWJlciwgc28gaXQgY2FsbHMgTGFzdFRhZ1dhcygpIG9uCisgIC8vIHJldHVybiBmcm9tIHRoZSBlbWJlZGRlZCBwYXJzZXIgdG8gY2hlY2suCisgIGJvb2wgTGFzdFRhZ1dhcyh1aW50MzIgZXhwZWN0ZWQpOworCisgIC8vIFdoZW4gcGFyc2luZyBtZXNzYWdlIChidXQgTk9UIGEgZ3JvdXApLCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZAorICAvLyBpbW1lZGlhdGVseSBhZnRlciBNZXJnZUZyb21Db2RlZFN0cmVhbSgpIHJldHVybnMgKGlmIGl0IHJldHVybnMgdHJ1ZSkKKyAgLy8gdG8gZnVydGhlciB2ZXJpZnkgdGhhdCB0aGUgbWVzc2FnZSBlbmRlZCBpbiBhIGxlZ2l0aW1hdGUgd2F5LiAgRm9yCisgIC8vIGV4YW1wbGUsIHRoaXMgdmVyaWZpZXMgdGhhdCBwYXJzaW5nIGRpZCBub3QgZW5kIG9uIGFuIGVuZC1ncm91cCB0YWcuCisgIC8vIEl0IGFsc28gY2hlY2tzIGZvciBzb21lIGNhc2VzIHdoZXJlLCBkdWUgdG8gb3B0aW1pemF0aW9ucywKKyAgLy8gTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSBjYW4gaW5jb3JyZWN0bHkgcmV0dXJuIHRydWUuCisgIGJvb2wgQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCk7CisKKyAgLy8gTGltaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gTGltaXRzIGFyZSB1c2VkIHdoZW4gcGFyc2luZyBsZW5ndGgtZGVsaW1pdGVkIGVtYmVkZGVkIG1lc3NhZ2VzLgorICAvLyBBZnRlciB0aGUgbWVzc2FnZSdzIGxlbmd0aCBpcyByZWFkLCBQdXNoTGltaXQoKSBpcyB1c2VkIHRvIHByZXZlbnQKKyAgLy8gdGhlIENvZGVkSW5wdXRTdHJlYW0gZnJvbSByZWFkaW5nIGJleW9uZCB0aGF0IGxlbmd0aC4gIE9uY2UgdGhlCisgIC8vIGVtYmVkZGVkIG1lc3NhZ2UgaGFzIGJlZW4gcGFyc2VkLCBQb3BMaW1pdCgpIGlzIGNhbGxlZCB0byB1bmRvIHRoZQorICAvLyBsaW1pdC4KKworICAvLyBPcGFxdWUgdHlwZSB1c2VkIHdpdGggUHVzaExpbWl0KCkgYW5kIFBvcExpbWl0KCkuICBEbyBub3QgbW9kaWZ5CisgIC8vIHZhbHVlcyBvZiB0aGlzIHR5cGUgeW91cnNlbGYuICBUaGUgb25seSByZWFzb24gdGhhdCB0aGlzIGlzbid0IGEKKyAgLy8gc3RydWN0IHdpdGggcHJpdmF0ZSBpbnRlcm5hbHMgaXMgZm9yIGVmZmljaWVuY3kuCisgIHR5cGVkZWYgaW50IExpbWl0OworCisgIC8vIFBsYWNlcyBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGUgc3RyZWFtIG1heSByZWFkLAorICAvLyBzdGFydGluZyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLiAgT25jZSB0aGUgc3RyZWFtIGhpdHMgdGhpcyBsaW1pdCwKKyAgLy8gaXQgd2lsbCBhY3QgbGlrZSB0aGUgZW5kIG9mIHRoZSBpbnB1dCBoYXMgYmVlbiByZWFjaGVkIHVudGlsIFBvcExpbWl0KCkKKyAgLy8gaXMgY2FsbGVkLgorICAvLworICAvLyBBcyB0aGUgbmFtZXMgaW1wbHksIHRoZSBzdHJlYW0gY29uY2VwdHVhbGx5IGhhcyBhIHN0YWNrIG9mIGxpbWl0cy4gIFRoZQorICAvLyBzaG9ydGVzdCBsaW1pdCBvbiB0aGUgc3RhY2sgaXMgYWx3YXlzIGVuZm9yY2VkLCBldmVuIGlmIGl0IGlzIG5vdCB0aGUKKyAgLy8gdG9wIGxpbWl0LgorICAvLworICAvLyBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgUHVzaExpbWl0KCkgaXMgb3BhcXVlIHRvIHRoZSBjYWxsZXIsIGFuZCBtdXN0CisgIC8vIGJlIHBhc3NlZCB1bmNoYW5nZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY2FsbCB0byBQb3BMaW1pdCgpLgorICBMaW1pdCBQdXNoTGltaXQoaW50IGJ5dGVfbGltaXQpOworCisgIC8vIFBvcHMgdGhlIGxhc3QgbGltaXQgcHVzaGVkIGJ5IFB1c2hMaW1pdCgpLiAgVGhlIGlucHV0IG11c3QgYmUgdGhlIHZhbHVlCisgIC8vIHJldHVybmVkIGJ5IHRoYXQgY2FsbCB0byBQdXNoTGltaXQoKS4KKyAgdm9pZCBQb3BMaW1pdChMaW1pdCBsaW1pdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdW50aWwgdGhlIG5lYXJlc3QgbGltaXQgb24gdGhlCisgIC8vIHN0YWNrIGlzIGhpdCwgb3IgLTEgaWYgbm8gbGltaXRzIGFyZSBpbiBwbGFjZS4KKyAgaW50IEJ5dGVzVW50aWxMaW1pdCgpOworCisgIC8vIFRvdGFsIEJ5dGVzIExpbWl0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRvIHByZXZlbnQgbWFsaWNpb3VzIHVzZXJzIGZyb20gc2VuZGluZyBleGNlc3NpdmVseSBsYXJnZSBtZXNzYWdlcworICAvLyBhbmQgY2F1c2luZyBpbnRlZ2VyIG92ZXJmbG93cyBvciBtZW1vcnkgZXhoYXVzdGlvbiwgQ29kZWRJbnB1dFN0cmVhbQorICAvLyBpbXBvc2VzIGEgaGFyZCBsaW1pdCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGl0IHdpbGwgcmVhZC4KKworICAvLyBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHRoaXMgQ29kZWRJbnB1dFN0cmVhbSB3aWxsIHJlYWQKKyAgLy8gYmVmb3JlIHJlZnVzaW5nIHRvIGNvbnRpbnVlLiAgVG8gcHJldmVudCBpbnRlZ2VyIG92ZXJmbG93cyBpbiB0aGUKKyAgLy8gcHJvdG9jb2wgYnVmZmVycyBpbXBsZW1lbnRhdGlvbiwgYXMgd2VsbCBhcyB0byBwcmV2ZW50IHNlcnZlcnMgZnJvbQorICAvLyBhbGxvY2F0aW5nIGVub3Jtb3VzIGFtb3VudHMgb2YgbWVtb3J5IHRvIGhvbGQgcGFyc2VkIG1lc3NhZ2VzLCB0aGUKKyAgLy8gbWF4aW11bSBtZXNzYWdlIGxlbmd0aCBzaG91bGQgYmUgbGltaXRlZCB0byB0aGUgc2hvcnRlc3QgbGVuZ3RoIHRoYXQKKyAgLy8gd2lsbCBub3QgaGFybSB1c2FiaWxpdHkuICBUaGUgdGhlb3JldGljYWwgc2hvcnRlc3QgbWVzc2FnZSB0aGF0IGNvdWxkCisgIC8vIGNhdXNlIGludGVnZXIgb3ZlcmZsb3dzIGlzIDUxMk1CLiAgVGhlIGRlZmF1bHQgbGltaXQgaXMgNjRNQi4gIEFwcHMKKyAgLy8gc2hvdWxkIHNldCBzaG9ydGVyIGxpbWl0cyBpZiBwb3NzaWJsZS4gIElmIHdhcm5pbmdfdGhyZXNob2xkIGlzIG5vdCAtMSwKKyAgLy8gYSB3YXJuaW5nIHdpbGwgYmUgcHJpbnRlZCB0byBzdGRlcnIgYWZ0ZXIgd2FybmluZ190aHJlc2hvbGQgYnl0ZXMgYXJlCisgIC8vIHJlYWQuICBBbiBlcnJvciB3aWxsIGFsd2F5cyBiZSBwcmludGVkIHRvIHN0ZGVyciBpZiB0aGUgbGltaXQgaXMKKyAgLy8gcmVhY2hlZC4KKyAgLy8KKyAgLy8gVGhpcyBpcyB1bnJlbGF0ZWQgdG8gUHVzaExpbWl0KCkvUG9wTGltaXQoKS4KKyAgLy8KKyAgLy8gSGludDogIElmIHlvdSBhcmUgcmVhZGluZyB0aGlzIGJlY2F1c2UgeW91ciBwcm9ncmFtIGlzIHByaW50aW5nIGEKKyAgLy8gICB3YXJuaW5nIGFib3V0IGRhbmdlcm91c2x5IGxhcmdlIHByb3RvY29sIG1lc3NhZ2VzLCB5b3UgbWF5IGJlCisgIC8vICAgY29uZnVzZWQgYWJvdXQgd2hhdCB0byBkbyBuZXh0LiAgVGhlIGJlc3Qgb3B0aW9uIGlzIHRvIGNoYW5nZSB5b3VyCisgIC8vICAgZGVzaWduIHN1Y2ggdGhhdCBleGNlc3NpdmVseSBsYXJnZSBtZXNzYWdlcyBhcmUgbm90IG5lY2Vzc2FyeS4KKyAgLy8gICBGb3IgZXhhbXBsZSwgdHJ5IHRvIGRlc2lnbiBmaWxlIGZvcm1hdHMgdG8gY29uc2lzdCBvZiBtYW55IHNtYWxsCisgIC8vICAgbWVzc2FnZXMgcmF0aGVyIHRoYW4gYSBzaW5nbGUgbGFyZ2Ugb25lLiAgSWYgdGhpcyBpcyBpbmZlYXNpYmxlLAorICAvLyAgIHlvdSB3aWxsIG5lZWQgdG8gaW5jcmVhc2UgdGhlIGxpbWl0LiAgQ2hhbmNlcyBhcmUsIHRob3VnaCwgdGhhdAorICAvLyAgIHlvdXIgY29kZSBuZXZlciBjb25zdHJ1Y3RzIGEgQ29kZWRJbnB1dFN0cmVhbSBvbiB3aGljaCB0aGUgbGltaXQKKyAgLy8gICBjYW4gYmUgc2V0LiAgWW91IHByb2JhYmx5IHBhcnNlIG1lc3NhZ2VzIGJ5IGNhbGxpbmcgdGhpbmdzIGxpa2UKKyAgLy8gICBNZXNzYWdlOjpQYXJzZUZyb21TdHJpbmcoKS4gIEluIHRoaXMgY2FzZSwgeW91IHdpbGwgbmVlZCB0byBjaGFuZ2UKKyAgLy8gICB5b3VyIGNvZGUgdG8gaW5zdGVhZCBjb25zdHJ1Y3Qgc29tZSBzb3J0IG9mIFplcm9Db3B5SW5wdXRTdHJlYW0KKyAgLy8gICAoZS5nLiBhbiBBcnJheUlucHV0U3RyZWFtKSwgY29uc3RydWN0IGEgQ29kZWRJbnB1dFN0cmVhbSBhcm91bmQKKyAgLy8gICB0aGF0LCB0aGVuIGNhbGwgTWVzc2FnZTo6UGFyc2VGcm9tQ29kZWRTdHJlYW0oKSBpbnN0ZWFkLiAgVGhlbgorICAvLyAgIHlvdSBjYW4gYWRqdXN0IHRoZSBsaW1pdC4gIFllcywgaXQncyBtb3JlIHdvcmssIGJ1dCB5b3UncmUgZG9pbmcKKyAgLy8gICBzb21ldGhpbmcgdW51c3VhbC4KKyAgdm9pZCBTZXRUb3RhbEJ5dGVzTGltaXQoaW50IHRvdGFsX2J5dGVzX2xpbWl0LCBpbnQgd2FybmluZ190aHJlc2hvbGQpOworCisgIC8vIFJlY3Vyc2lvbiBMaW1pdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRvIHByZXZlbnQgY29ycnVwdCBvciBtYWxpY2lvdXMgbWVzc2FnZXMgZnJvbSBjYXVzaW5nIHN0YWNrIG92ZXJmbG93cywKKyAgLy8gd2UgbXVzdCBrZWVwIHRyYWNrIG9mIHRoZSBkZXB0aCBvZiByZWN1cnNpb24gd2hlbiBwYXJzaW5nIGVtYmVkZGVkCisgIC8vIG1lc3NhZ2VzIGFuZCBncm91cHMuICBDb2RlZElucHV0U3RyZWFtIGtlZXBzIHRyYWNrIG9mIHRoaXMgYmVjYXVzZSBpdAorICAvLyBpcyB0aGUgb25seSBvYmplY3QgdGhhdCBpcyBwYXNzZWQgZG93biB0aGUgc3RhY2sgZHVyaW5nIHBhcnNpbmcuCisKKyAgLy8gU2V0cyB0aGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguICBUaGUgZGVmYXVsdCBpcyA2NC4KKyAgdm9pZCBTZXRSZWN1cnNpb25MaW1pdChpbnQgbGltaXQpOworCisgIC8vIEluY3JlbWVudHMgdGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBkZXB0aCBpcworICAvLyB1bmRlciB0aGUgbGltaXQsIGZhbHNlIGlmIGl0IGhhcyBnb25lIG92ZXIuCisgIGJvb2wgSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKworICAvLyBEZWNyZW1lbnRzIHRoZSByZWN1cnNpb24gZGVwdGguCisgIHZvaWQgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKworICAvLyBFeHRlbnNpb24gUmVnaXN0cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBBRFZBTkNFRCBVU0FHRTogIDk5LjklIG9mIHBlb3BsZSBjYW4gaWdub3JlIHRoaXMgc2VjdGlvbi4KKyAgLy8KKyAgLy8gQnkgZGVmYXVsdCwgd2hlbiBwYXJzaW5nIGV4dGVuc2lvbnMsIHRoZSBwYXJzZXIgbG9va3MgZm9yIGV4dGVuc2lvbgorICAvLyBkZWZpbml0aW9ucyBpbiB0aGUgcG9vbCB3aGljaCBvd25zIHRoZSBvdXRlciBtZXNzYWdlJ3MgRGVzY3JpcHRvci4KKyAgLy8gSG93ZXZlciwgeW91IG1heSBjYWxsIFNldEV4dGVuc2lvblJlZ2lzdHJ5KCkgdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZQorICAvLyBwb29sIGluc3RlYWQuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlLCBmb3IgZXhhbXBsZSwgdG8gcGFyc2UgYSBtZXNzYWdlCisgIC8vIHVzaW5nIGEgZ2VuZXJhdGVkIGNsYXNzLCBidXQgcmVwcmVzZW50IHNvbWUgZXh0ZW5zaW9ucyB1c2luZworICAvLyBEeW5hbWljTWVzc2FnZS4KKworICAvLyBTZXQgdGhlIHBvb2wgdXNlZCB0byBsb29rIHVwIGV4dGVuc2lvbnMuICBNb3N0IHVzZXJzIGRvIG5vdCBuZWVkIHRvIGNhbGwKKyAgLy8gdGhpcyBhcyB0aGUgY29ycmVjdCBwb29sIHdpbGwgYmUgY2hvc2VuIGF1dG9tYXRpY2FsbHkuCisgIC8vCisgIC8vIFdBUk5JTkc6ICBJdCBpcyB2ZXJ5IGVhc3kgdG8gbWlzdXNlIHRoaXMuICBDYXJlZnVsbHkgcmVhZCB0aGUgcmVxdWlyZW1lbnRzCisgIC8vICAgYmVsb3cuICBEbyBub3QgdXNlIHRoaXMgdW5sZXNzIHlvdSBhcmUgc3VyZSB5b3UgbmVlZCBpdC4gIEFsbW9zdCBubyBvbmUKKyAgLy8gICBkb2VzLgorICAvLworICAvLyBMZXQncyBzYXkgeW91IGFyZSBwYXJzaW5nIGEgbWVzc2FnZSBpbnRvIG1lc3NhZ2Ugb2JqZWN0IG0sIGFuZCB5b3Ugd2FudAorICAvLyB0byB0YWtlIGFkdmFudGFnZSBvZiBTZXRFeHRlbnNpb25SZWdpc3RyeSgpLiAgWW91IG11c3QgZm9sbG93IHRoZXNlCisgIC8vIHJlcXVpcmVtZW50czoKKyAgLy8KKyAgLy8gVGhlIGdpdmVuIERlc2NyaXB0b3JQb29sIG11c3QgY29udGFpbiBtLT5HZXREZXNjcmlwdG9yKCkuICBJdCBpcyBub3QKKyAgLy8gc3VmZmljaWVudCBmb3IgaXQgdG8gc2ltcGx5IGNvbnRhaW4gYSBkZXNjcmlwdG9yIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUKKyAgLy8gYW5kIGNvbnRlbnQgLS0gaXQgbXVzdCBiZSB0aGUgKmV4YWN0IG9iamVjdCouICBJbiBvdGhlciB3b3JkczoKKyAgLy8gICBhc3NlcnQocG9vbC0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKG0tPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkpID09CisgIC8vICAgICAgICAgIG0tPkdldERlc2NyaXB0b3IoKSk7CisgIC8vIFRoZXJlIGFyZSB0d28gd2F5cyB0byBzYXRpc2Z5IHRoaXMgcmVxdWlyZW1lbnQ6CisgIC8vIDEpIFVzZSBtLT5HZXREZXNjcmlwdG9yKCktPnBvb2woKSBhcyB0aGUgcG9vbC4gIFRoaXMgaXMgZ2VuZXJhbGx5IHVzZWxlc3MKKyAgLy8gICAgYmVjYXVzZSB0aGlzIGlzIHRoZSBwb29sIHRoYXQgd291bGQgYmUgdXNlZCBhbnl3YXkgaWYgeW91IGRpZG4ndCBjYWxsCisgIC8vICAgIFNldEV4dGVuc2lvblJlZ2lzdHJ5KCkgYXQgYWxsLgorICAvLyAyKSBVc2UgYSBEZXNjcmlwdG9yUG9vbCB3aGljaCBoYXMgbS0+R2V0RGVzY3JpcHRvcigpLT5wb29sKCkgYXMgYW4KKyAgLy8gICAgInVuZGVybGF5Ii4gIFJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIERlc2NyaXB0b3JQb29sIGZvciBtb3JlCisgIC8vICAgIGluZm9ybWF0aW9uIGFib3V0IHVuZGVybGF5cy4KKyAgLy8KKyAgLy8gWW91IG11c3QgYWxzbyBwcm92aWRlIGEgTWVzc2FnZUZhY3RvcnkuICBUaGlzIGZhY3Rvcnkgd2lsbCBiZSB1c2VkIHRvCisgIC8vIGNvbnN0cnVjdCBNZXNzYWdlIG9iamVjdHMgcmVwcmVzZW50aW5nIGV4dGVuc2lvbnMuICBUaGUgZmFjdG9yeSdzCisgIC8vIEdldFByb3RvdHlwZSgpIE1VU1QgcmV0dXJuIG5vbi1OVUxMIGZvciBhbnkgRGVzY3JpcHRvciB3aGljaCBjYW4gYmUgZm91bmQKKyAgLy8gdGhyb3VnaCB0aGUgcHJvdmlkZWQgcG9vbC4KKyAgLy8KKyAgLy8gSWYgdGhlIHByb3ZpZGVkIGZhY3RvcnkgbWlnaHQgcmV0dXJuIGluc3RhbmNlcyBvZiBwcm90b2NvbC1jb21waWxlci0KKyAgLy8gZ2VuZXJhdGVkIChpLmUuIGNvbXBpbGVkLWluKSB0eXBlcywgb3IgaWYgdGhlIG91dGVyIG1lc3NhZ2Ugb2JqZWN0IG0gaXMKKyAgLy8gYSBnZW5lcmF0ZWQgdHlwZSwgdGhlbiB0aGUgZ2l2ZW4gZmFjdG9yeSBNVVNUIGhhdmUgdGhpcyBwcm9wZXJ0eTogIElmCisgIC8vIEdldFByb3RvdHlwZSgpIGlzIGdpdmVuIGEgRGVzY3JpcHRvciB3aGljaCByZXNpZGVzIGluCisgIC8vIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLCB0aGUgZmFjdG9yeSBNVVNUIHJldHVybiB0aGUgc2FtZQorICAvLyBwcm90b3R5cGUgd2hpY2ggTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCkgd291bGQgcmV0dXJuLiAgVGhhdAorICAvLyBpcywgZ2l2ZW4gYSBkZXNjcmlwdG9yIGZvciBhIGdlbmVyYXRlZCB0eXBlLCB0aGUgZmFjdG9yeSBtdXN0IHJldHVybiBhbgorICAvLyBpbnN0YW5jZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzIChOT1QgRHluYW1pY01lc3NhZ2UpLiAgSG93ZXZlciwgd2hlbgorICAvLyBnaXZlbiBhIGRlc2NyaXB0b3IgZm9yIGEgdHlwZSB0aGF0IGlzIE5PVCBpbiBnZW5lcmF0ZWRfcG9vbCwgdGhlIGZhY3RvcnkKKyAgLy8gaXMgZnJlZSB0byByZXR1cm4gYW55IGltcGxlbWVudGF0aW9uLgorICAvLworICAvLyBUaGUgcmVhc29uIGZvciB0aGlzIHJlcXVpcmVtZW50IGlzIHRoYXQgZ2VuZXJhdGVkIHN1Yi1vYmplY3RzIG1heSBiZQorICAvLyBhY2Nlc3NlZCB2aWEgdGhlIHN0YW5kYXJkIChub24tcmVmbGVjdGlvbikgZXh0ZW5zaW9uIGFjY2Vzc29yIG1ldGhvZHMsCisgIC8vIGFuZCB0aGVzZSBtZXRob2RzIHdpbGwgZG93bi1jYXN0IHRoZSBvYmplY3QgdG8gdGhlIGdlbmVyYXRlZCBjbGFzcyB0eXBlLgorICAvLyBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhY3R1YWxseSBvZiB0aGF0IHR5cGUsIHRoZSByZXN1bHRzIHdvdWxkIGJlIHVuZGVmaW5lZC4KKyAgLy8gT24gdGhlIG90aGVyIGhhbmQsIGlmIGFuIGV4dGVuc2lvbiBpcyBub3QgY29tcGlsZWQgaW4sIHRoZW4gdGhlcmUgaXMgbm8KKyAgLy8gd2F5IHRoZSBjb2RlIGNvdWxkIGVuZCB1cCBhY2Nlc3NpbmcgaXQgdmlhIHRoZSBzdGFuZGFyZCBhY2Nlc3NvcnMgLS0gdGhlCisgIC8vIG9ubHkgd2F5IHRvIGFjY2VzcyB0aGUgZXh0ZW5zaW9uIGlzIHZpYSByZWZsZWN0aW9uLiAgV2hlbiB1c2luZyByZWZsZWN0aW9uLAorICAvLyBEeW5hbWljTWVzc2FnZSBhbmQgZ2VuZXJhdGVkIG1lc3NhZ2VzIGFyZSBpbmRpc3Rpbmd1aXNoYWJsZSwgc28gaXQncyBmaW5lCisgIC8vIGlmIHRoZXNlIG9iamVjdHMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIER5bmFtaWNNZXNzYWdlLgorICAvLworICAvLyBVc2luZyBEeW5hbWljTWVzc2FnZUZhY3Rvcnkgb24gd2hpY2ggeW91IGhhdmUgY2FsbGVkCisgIC8vIFNldERlbGVnYXRlVG9HZW5lcmF0ZWRGYWN0b3J5KHRydWUpIHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIHNhdGlzZnkgdGhlCisgIC8vIGFib3ZlIHJlcXVpcmVtZW50LgorICAvLworICAvLyBJZiBlaXRoZXIgcG9vbCBvciBmYWN0b3J5IGlzIE5VTEwsIGJvdGggbXVzdCBiZSBOVUxMLgorICAvLworICAvLyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIGlnbm9yZWQgd2hlbiBwYXJzaW5nICJsaXRlIiBtZXNzYWdlcyBhcyB0aGV5IGRvCisgIC8vIG5vdCBoYXZlIGRlc2NyaXB0b3JzLgorICB2b2lkIFNldEV4dGVuc2lvblJlZ2lzdHJ5KERlc2NyaXB0b3JQb29sKiBwb29sLCBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSk7CisKKyAgLy8gR2V0IHRoZSBEZXNjcmlwdG9yUG9vbCBzZXQgdmlhIFNldEV4dGVuc2lvblJlZ2lzdHJ5KCksIG9yIE5VTEwgaWYgbm8gcG9vbAorICAvLyBoYXMgYmVlbiBwcm92aWRlZC4KKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIEdldEV4dGVuc2lvblBvb2woKTsKKworICAvLyBHZXQgdGhlIE1lc3NhZ2VGYWN0b3J5IHNldCB2aWEgU2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSwgb3IgTlVMTCBpZiBubworICAvLyBmYWN0b3J5IGhhcyBiZWVuIHByb3ZpZGVkLgorICBNZXNzYWdlRmFjdG9yeSogR2V0RXh0ZW5zaW9uRmFjdG9yeSgpOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvZGVkSW5wdXRTdHJlYW0pOworCisgIFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0XzsKKyAgY29uc3QgdWludDgqIGJ1ZmZlcl87CisgIGNvbnN0IHVpbnQ4KiBidWZmZXJfZW5kXzsgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICBpbnQgdG90YWxfYnl0ZXNfcmVhZF87ICAvLyB0b3RhbCBieXRlcyByZWFkIGZyb20gaW5wdXRfLCBpbmNsdWRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgYnVmZmVyCisKKyAgLy8gSWYgdG90YWxfYnl0ZXNfcmVhZF8gc3VycGFzc2VzIElOVF9NQVgsIHdlIHJlY29yZCB0aGUgZXh0cmEgYnl0ZXMgaGVyZQorICAvLyBzbyB0aGF0IHdlIGNhbiBCYWNrVXAoKSBvbiBkZXN0cnVjdGlvbi4KKyAgaW50IG92ZXJmbG93X2J5dGVzXzsKKworICAvLyBMYXN0VGFnV2FzKCkgc3R1ZmYuCisgIHVpbnQzMiBsYXN0X3RhZ187ICAgICAgICAgLy8gcmVzdWx0IG9mIGxhc3QgUmVhZFRhZygpLgorCisgIC8vIFRoaXMgaXMgc2V0IHRydWUgYnkgUmVhZFRhZ3tGYWxsYmFjay9TbG93fSgpIGlmIGl0IGlzIGNhbGxlZCB3aGVuIGV4YWN0bHkKKyAgLy8gYXQgRU9GLCBvciBieSBFeHBlY3RBdEVuZCgpIHdoZW4gaXQgcmV0dXJucyB0cnVlLiAgVGhpcyBoYXBwZW5zIHdoZW4gd2UKKyAgLy8gcmVhY2ggdGhlIGVuZCBvZiBhIG1lc3NhZ2UgYW5kIGF0dGVtcHQgdG8gcmVhZCBhbm90aGVyIHRhZy4KKyAgYm9vbCBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXzsKKworICAvLyBTZWUgRW5hYmxlQWxpYXNpbmcoKS4KKyAgYm9vbCBhbGlhc2luZ19lbmFibGVkXzsKKworICAvLyBMaW1pdHMKKyAgTGltaXQgY3VycmVudF9saW1pdF87ICAgLy8gaWYgcG9zaXRpb24gPSAtMSwgbm8gbGltaXQgaXMgYXBwbGllZAorCisgIC8vIEZvciBzaW1wbGljaXR5LCBpZiB0aGUgY3VycmVudCBidWZmZXIgY3Jvc3NlcyBhIGxpbWl0IChlaXRoZXIgYSBub3JtYWwKKyAgLy8gbGltaXQgY3JlYXRlZCBieSBQdXNoTGltaXQoKSBvciB0aGUgdG90YWwgYnl0ZXMgbGltaXQpLCBidWZmZXJfc2l6ZV8KKyAgLy8gb25seSB0cmFja3MgdGhlIG51bWJlciBvZiBieXRlcyBiZWZvcmUgdGhhdCBsaW1pdC4gIFRoaXMgZmllbGQKKyAgLy8gY29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyBhZnRlciBpdC4gIE5vdGUgdGhhdCB0aGlzIGltcGxpZXMgdGhhdCBpZgorICAvLyBidWZmZXJfc2l6ZV8gPT0gMCBhbmQgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCwgd2Uga25vdyB3ZSd2ZQorICAvLyBoaXQgYSBsaW1pdC4gIEhvd2V2ZXIsIGlmIGJvdGggYXJlIHplcm8sIGl0IGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhbgorICAvLyB3ZSBhcmVuJ3QgYXQgYSBsaW1pdCAtLSB0aGUgYnVmZmVyIG1heSBoYXZlIGVuZGVkIGV4YWN0bHkgYXQgdGhlIGxpbWl0LgorICBpbnQgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfOworCisgIC8vIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQsIHBlcmlvZC4gIFRoaXMgaXMgdW5yZWxhdGVkIHRvCisgIC8vIGN1cnJlbnRfbGltaXRfLiAgU2V0IHVzaW5nIFNldFRvdGFsQnl0ZXNMaW1pdCgpLgorICBpbnQgdG90YWxfYnl0ZXNfbGltaXRfOworICBpbnQgdG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfOworCisgIC8vIEN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLCBjb250cm9sbGVkIGJ5IEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgYW5kCisgIC8vIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkuCisgIGludCByZWN1cnNpb25fZGVwdGhfOworICAvLyBSZWN1cnNpb24gZGVwdGggbGltaXQsIHNldCBieSBTZXRSZWN1cnNpb25MaW1pdCgpLgorICBpbnQgcmVjdXJzaW9uX2xpbWl0XzsKKworICAvLyBTZWUgU2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS4KKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIGV4dGVuc2lvbl9wb29sXzsKKyAgTWVzc2FnZUZhY3RvcnkqIGV4dGVuc2lvbl9mYWN0b3J5XzsKKworICAvLyBQcml2YXRlIG1lbWJlciBmdW5jdGlvbnMuCisKKyAgLy8gQWR2YW5jZSB0aGUgYnVmZmVyIGJ5IGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICB2b2lkIEFkdmFuY2UoaW50IGFtb3VudCk7CisKKyAgLy8gQmFjayB1cCBpbnB1dF8gdG8gdGhlIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uLgorICB2b2lkIEJhY2tVcElucHV0VG9DdXJyZW50UG9zaXRpb24oKTsKKworICAvLyBSZWNvbXB1dGVzIHRoZSB2YWx1ZSBvZiBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8uICBNdXN0IGJlIGNhbGxlZCBhZnRlcgorICAvLyBjdXJyZW50X2xpbWl0XyBvciB0b3RhbF9ieXRlc19saW1pdF8gY2hhbmdlcy4KKyAgdm9pZCBSZWNvbXB1dGVCdWZmZXJMaW1pdHMoKTsKKworICAvLyBXcml0ZXMgYW4gZXJyb3IgbWVzc2FnZSBzYXlpbmcgdGhhdCB3ZSBoaXQgdG90YWxfYnl0ZXNfbGltaXRfLgorICB2b2lkIFByaW50VG90YWxCeXRlc0xpbWl0RXJyb3IoKTsKKworICAvLyBDYWxsZWQgd2hlbiB0aGUgYnVmZmVyIHJ1bnMgb3V0IHRvIHJlcXVlc3QgbW9yZSBkYXRhLiAgSW1wbGllcyBhbgorICAvLyBBZHZhbmNlKEJ1ZmZlclNpemUoKSkuCisgIGJvb2wgUmVmcmVzaCgpOworCisgIC8vIFdoZW4gcGFyc2luZyB2YXJpbnRzLCB3ZSBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIHNtYWxsIHZhbHVlcywgYW5kCisgIC8vIHRoZW4gb3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZW4gdGhlIHZhcmludCBmaXRzIHdpdGhpbiB0aGUgY3VycmVudCBidWZmZXIKKyAgLy8gcGllY2UuIFRoZSBGYWxsYmFjayBtZXRob2QgaXMgdXNlZCB3aGVuIHdlIGNhbid0IHVzZSB0aGUgb25lLWJ5dGUKKyAgLy8gb3B0aW1pemF0aW9uLiBUaGUgU2xvdyBtZXRob2QgaXMgeWV0IGFub3RoZXIgZmFsbGJhY2sgd2hlbiB0aGUgYnVmZmVyIGlzCisgIC8vIG5vdCBsYXJnZSBlbm91Z2guIE1ha2luZyB0aGUgc2xvdyBwYXRoIG91dC1vZi1saW5lIHNwZWVkcyB1cCB0aGUgY29tbW9uCisgIC8vIGNhc2UgYnkgMTAtMTUlLiBUaGUgc2xvdyBwYXRoIGlzIGZhaXJseSB1bmNvbW1vbjogaXQgb25seSB0cmlnZ2VycyB3aGVuIGEKKyAgLy8gbWVzc2FnZSBjcm9zc2VzIG11bHRpcGxlIGJ1ZmZlcnMuCisgIGJvb2wgUmVhZFZhcmludDMyRmFsbGJhY2sodWludDMyKiB2YWx1ZSk7CisgIGJvb2wgUmVhZFZhcmludDY0RmFsbGJhY2sodWludDY0KiB2YWx1ZSk7CisgIGJvb2wgUmVhZFZhcmludDMyU2xvdyh1aW50MzIqIHZhbHVlKTsKKyAgYm9vbCBSZWFkVmFyaW50NjRTbG93KHVpbnQ2NCogdmFsdWUpOworICBib29sIFJlYWRMaXR0bGVFbmRpYW4zMkZhbGxiYWNrKHVpbnQzMiogdmFsdWUpOworICBib29sIFJlYWRMaXR0bGVFbmRpYW42NEZhbGxiYWNrKHVpbnQ2NCogdmFsdWUpOworICAvLyBGYWxsYmFjay9zbG93IG1ldGhvZHMgZm9yIHJlYWRpbmcgdGFncy4gVGhlc2UgZG8gbm90IHVwZGF0ZSBsYXN0X3RhZ18sCisgIC8vIGJ1dCB3aWxsIHNldCBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQKKyAgLy8gc3RyZWFtLgorICB1aW50MzIgUmVhZFRhZ0ZhbGxiYWNrKCk7CisgIHVpbnQzMiBSZWFkVGFnU2xvdygpOworICBib29sIFJlYWRTdHJpbmdGYWxsYmFjayhzdHJpbmcqIGJ1ZmZlciwgaW50IHNpemUpOworCisgIC8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgorICBpbnQgQnVmZmVyU2l6ZSgpIGNvbnN0OworCisgIHN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRUb3RhbEJ5dGVzTGltaXQgPSA2NCA8PCAyMDsgIC8vIDY0TUIKKworICBzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0VG90YWxCeXRlc1dhcm5pbmdUaHJlc2hvbGQgPSAzMiA8PCAyMDsgIC8vIDMyTUIKKyAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdFJlY3Vyc2lvbkxpbWl0ID0gNjQ7Cit9OworCisvLyBDbGFzcyB3aGljaCBlbmNvZGVzIGFuZCB3cml0ZXMgYmluYXJ5IGRhdGEgd2hpY2ggaXMgY29tcG9zZWQgb2YgdmFyaW50LQorLy8gZW5jb2RlZCBpbnRlZ2VycyBhbmQgZml4ZWQtd2lkdGggcGllY2VzLiAgV3JhcHMgYSBaZXJvQ29weU91dHB1dFN0cmVhbS4KKy8vIE1vc3QgdXNlcnMgd2lsbCBub3QgbmVlZCB0byBkZWFsIHdpdGggQ29kZWRPdXRwdXRTdHJlYW0uCisvLworLy8gTW9zdCBtZXRob2RzIG9mIENvZGVkT3V0cHV0U3RyZWFtIHdoaWNoIHJldHVybiBhIGJvb2wgcmV0dXJuIGZhbHNlIGlmIGFuCisvLyB1bmRlcmx5aW5nIEkvTyBlcnJvciBvY2N1cnMuICBPbmNlIHN1Y2ggYSBmYWlsdXJlIG9jY3VycywgdGhlCisvLyBDb2RlZE91dHB1dFN0cmVhbSBpcyBicm9rZW4gYW5kIGlzIG5vIGxvbmdlciB1c2VmdWwuIFRoZSBXcml0ZSogbWV0aG9kcyBkbworLy8gbm90IHJldHVybiB0aGUgc3RyZWFtIHN0YXR1cywgYnV0IHdpbGwgaW52YWxpZGF0ZSB0aGUgc3RyZWFtIGlmIGFuIGVycm9yCisvLyBvY2N1cnMuIFRoZSBjbGllbnQgY2FuIHByb2JlIEhhZEVycm9yKCkgdG8gZGV0ZXJtaW5lIHRoZSBzdGF0dXMuCisvLworLy8gTm90ZSB0aGF0IGV2ZXJ5IG1ldGhvZCBvZiBDb2RlZE91dHB1dFN0cmVhbSB3aGljaCB3cml0ZXMgc29tZSBkYXRhIGhhcworLy8gYSBjb3JyZXNwb25kaW5nIHN0YXRpYyAiVG9BcnJheSIgdmVyc2lvbi4gVGhlc2UgdmVyc2lvbnMgd3JpdGUgZGlyZWN0bHkKKy8vIHRvIHRoZSBwcm92aWRlZCBidWZmZXIsIHJldHVybmluZyBhIHBvaW50ZXIgcGFzdCB0aGUgbGFzdCB3cml0dGVuIGJ5dGUuCisvLyBUaGV5IHJlcXVpcmUgdGhhdCB0aGUgYnVmZmVyIGhhcyBzdWZmaWNpZW50IGNhcGFjaXR5IGZvciB0aGUgZW5jb2RlZCBkYXRhLgorLy8gVGhpcyBhbGxvd3MgYW4gb3B0aW1pemF0aW9uIHdoZXJlIHdlIGNoZWNrIGlmIGFuIG91dHB1dCBzdHJlYW0gaGFzIGVub3VnaAorLy8gc3BhY2UgZm9yIGFuIGVudGlyZSBtZXNzYWdlIGJlZm9yZSB3ZSBzdGFydCB3cml0aW5nIGFuZCwgaWYgdGhlcmUgaXMsIHdlCisvLyBjYWxsIG9ubHkgdGhlIFRvQXJyYXkgbWV0aG9kcyB0byBhdm9pZCBkb2luZyBib3VuZCBjaGVja3MgZm9yIGVhY2gKKy8vIGluZGl2aWR1YWwgdmFsdWUuCisvLyBpLmUuLCBpbiB0aGUgZXhhbXBsZSBhYm92ZToKKy8vCisvLyAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShyYXdfb3V0cHV0KTsKKy8vICAgaW50IG1hZ2ljX251bWJlciA9IDEyMzQ7CisvLyAgIGNoYXIgdGV4dFtdID0gIkhlbGxvIHdvcmxkISI7CisvLworLy8gICBpbnQgY29kZWRfc2l6ZSA9IHNpemVvZihtYWdpY19udW1iZXIpICsKKy8vICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHN0cmxlbih0ZXh0KSkgKworLy8gICAgICAgICAgICAgICAgICAgIHN0cmxlbih0ZXh0KTsKKy8vCisvLyAgIHVpbnQ4KiBidWZmZXIgPQorLy8gICAgICAgY29kZWRfb3V0cHV0LT5HZXREaXJlY3RCdWZmZXJGb3JOQnl0ZXNBbmRBZHZhbmNlKGNvZGVkX3NpemUpOworLy8gICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKKy8vICAgICAvLyBUaGUgb3V0cHV0IHN0cmVhbSBoYXMgZW5vdWdoIHNwYWNlIGluIHRoZSBidWZmZXI6IHdyaXRlIGRpcmVjdGx5IHRvCisvLyAgICAgLy8gdGhlIGFycmF5LgorLy8gICAgIGJ1ZmZlciA9IENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheShtYWdpY19udW1iZXIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisvLyAgICAgYnVmZmVyID0gQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KHN0cmxlbih0ZXh0KSwgYnVmZmVyKTsKKy8vICAgICBidWZmZXIgPSBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVSYXdUb0FycmF5KHRleHQsIHN0cmxlbih0ZXh0KSwgYnVmZmVyKTsKKy8vICAgfSBlbHNlIHsKKy8vICAgICAvLyBNYWtlIGJvdW5kLWNoZWNrZWQgd3JpdGVzLCB3aGljaCB3aWxsIGFzayB0aGUgdW5kZXJseWluZyBzdHJlYW0gZm9yCisvLyAgICAgLy8gbW9yZSBzcGFjZSBhcyBuZWVkZWQuCisvLyAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjMyKG1hZ2ljX251bWJlcik7CisvLyAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDMyKHN0cmxlbih0ZXh0KSk7CisvLyAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVJhdyh0ZXh0LCBzdHJsZW4odGV4dCkpOworLy8gICB9CisvLworLy8gICBkZWxldGUgY29kZWRfb3V0cHV0OworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIENvZGVkT3V0cHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZSBhbiBDb2RlZE91dHB1dFN0cmVhbSB0aGF0IHdyaXRlcyB0byB0aGUgZ2l2ZW4gWmVyb0NvcHlPdXRwdXRTdHJlYW0uCisgIGV4cGxpY2l0IENvZGVkT3V0cHV0U3RyZWFtKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpOworCisgIC8vIERlc3Ryb3kgdGhlIENvZGVkT3V0cHV0U3RyZWFtIGFuZCBwb3NpdGlvbiB0aGUgdW5kZXJseWluZworICAvLyBaZXJvQ29weU91dHB1dFN0cmVhbSBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBieXRlIHdyaXR0ZW4uCisgIH5Db2RlZE91dHB1dFN0cmVhbSgpOworCisgIC8vIFNraXBzIGEgbnVtYmVyIG9mIGJ5dGVzLCBsZWF2aW5nIHRoZSBieXRlcyB1bm1vZGlmaWVkIGluIHRoZSB1bmRlcmx5aW5nCisgIC8vIGJ1ZmZlci4gIFJldHVybnMgZmFsc2UgaWYgYW4gdW5kZXJseWluZyB3cml0ZSBlcnJvciBvY2N1cnMuICBUaGlzIGlzCisgIC8vIG1haW5seSB1c2VmdWwgd2l0aCBHZXREaXJlY3RCdWZmZXJQb2ludGVyKCkuCisgIGJvb2wgU2tpcChpbnQgY291bnQpOworCisgIC8vIFNldHMgKmRhdGEgdG8gcG9pbnQgZGlyZWN0bHkgYXQgdGhlIHVud3JpdHRlbiBwYXJ0IG9mIHRoZQorICAvLyBDb2RlZE91dHB1dFN0cmVhbSdzIHVuZGVybHlpbmcgYnVmZmVyLCBhbmQgKnNpemUgdG8gdGhlIHNpemUgb2YgdGhhdAorICAvLyBidWZmZXIsIGJ1dCBkb2VzIG5vdCBhZHZhbmNlIHRoZSBzdHJlYW0ncyBjdXJyZW50IHBvc2l0aW9uLiAgVGhpcyB3aWxsCisgIC8vIGFsd2F5cyBlaXRoZXIgcHJvZHVjZSBhIG5vbi1lbXB0eSBidWZmZXIgb3IgcmV0dXJuIGZhbHNlLiAgSWYgdGhlIGNhbGxlcgorICAvLyB3cml0ZXMgYW55IGRhdGEgdG8gdGhpcyBidWZmZXIsIGl0IHNob3VsZCB0aGVuIGNhbGwgU2tpcCgpIHRvIHNraXAgb3ZlcgorICAvLyB0aGUgY29uc3VtZWQgYnl0ZXMuICBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBleHRlcm5hbCBmYXN0CisgIC8vIHNlcmlhbGl6YXRpb24gcm91dGluZXMgZm9yIHR5cGVzIG9mIGRhdGEgbm90IGNvdmVyZWQgYnkgdGhlCisgIC8vIENvZGVkT3V0cHV0U3RyZWFtIGludGVyZmFjZS4KKyAgYm9vbCBHZXREaXJlY3RCdWZmZXJQb2ludGVyKHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOworCisgIC8vIElmIHRoZXJlIGFyZSBhdCBsZWFzdCAic2l6ZSIgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGJ1ZmZlciwKKyAgLy8gcmV0dXJucyBhIHBvaW50ZXIgZGlyZWN0bHkgaW50byB0aGUgYnVmZmVyIGFuZCBhZHZhbmNlcyBvdmVyIHRoZXNlIGJ5dGVzLgorICAvLyBUaGUgY2FsbGVyIG1heSB0aGVuIHdyaXRlIGRpcmVjdGx5IGludG8gdGhpcyBidWZmZXIgKGUuZy4gdXNpbmcgdGhlCisgIC8vICpUb0FycmF5IHN0YXRpYyBtZXRob2RzKSByYXRoZXIgdGhhbiBnbyB0aHJvdWdoIENvZGVkT3V0cHV0U3RyZWFtLiAgSWYKKyAgLy8gdGhlcmUgYXJlIG5vdCBlbm91Z2ggYnl0ZXMgYXZhaWxhYmxlLCByZXR1cm5zIE5VTEwuICBUaGUgcmV0dXJuIHBvaW50ZXIgaXMKKyAgLy8gaW52YWxpZGF0ZWQgYXMgc29vbiBhcyBhbnkgb3RoZXIgbm9uLWNvbnN0IG1ldGhvZCBvZiBDb2RlZE91dHB1dFN0cmVhbQorICAvLyBpcyBjYWxsZWQuCisgIGlubGluZSB1aW50OCogR2V0RGlyZWN0QnVmZmVyRm9yTkJ5dGVzQW5kQWR2YW5jZShpbnQgc2l6ZSk7CisKKyAgLy8gV3JpdGUgcmF3IGJ5dGVzLCBjb3B5aW5nIHRoZW0gZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLgorICB2b2lkIFdyaXRlUmF3KGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpOworICAvLyBMaWtlIFdyaXRlUmF3KCkgIGJ1dCB3cml0aW5nIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgYXJyYXkuCisgIC8vIFRoaXMgaXMgX25vdF8gaW5saW5lZCwgYXMgdGhlIGNvbXBpbGVyIG9mdGVuIG9wdGltaXplcyBtZW1jcHkgaW50byBpbmxpbmUKKyAgLy8gY29weSBsb29wcy4gU2luY2UgdGhpcyBnZXRzIGNhbGxlZCBieSBldmVyeSBmaWVsZCB3aXRoIHN0cmluZyBvciBieXRlcworICAvLyB0eXBlLCBpbmxpbmluZyBtYXkgbGVhZCB0byBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBjb2RlIGJsb2F0LCB3aXRoIG9ubHkgYQorICAvLyBtaW5vciBwZXJmb3JtYW5jZSBnYWluLgorICBzdGF0aWMgdWludDgqIFdyaXRlUmF3VG9BcnJheShjb25zdCB2b2lkKiBidWZmZXIsIGludCBzaXplLCB1aW50OCogdGFyZ2V0KTsKKworICAvLyBFcXVpdmFsZW50IHRvIFdyaXRlUmF3KHN0ci5kYXRhKCksIHN0ci5zaXplKCkpLgorICB2b2lkIFdyaXRlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyKTsKKyAgLy8gTGlrZSBXcml0ZVN0cmluZygpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgorICBzdGF0aWMgdWludDgqIFdyaXRlU3RyaW5nVG9BcnJheShjb25zdCBzdHJpbmcmIHN0ciwgdWludDgqIHRhcmdldCk7CisKKworICAvLyBXcml0ZSBhIDMyLWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIuCisgIHZvaWQgV3JpdGVMaXR0bGVFbmRpYW4zMih1aW50MzIgdmFsdWUpOworICAvLyBMaWtlIFdyaXRlTGl0dGxlRW5kaWFuMzIoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KKyAgc3RhdGljIHVpbnQ4KiBXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheSh1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpOworICAvLyBXcml0ZSBhIDY0LWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIuCisgIHZvaWQgV3JpdGVMaXR0bGVFbmRpYW42NCh1aW50NjQgdmFsdWUpOworICAvLyBMaWtlIFdyaXRlTGl0dGxlRW5kaWFuNjQoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KKyAgc3RhdGljIHVpbnQ4KiBXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheSh1aW50NjQgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpOworCisgIC8vIFdyaXRlIGFuIHVuc2lnbmVkIGludGVnZXIgd2l0aCBWYXJpbnQgZW5jb2RpbmcuICBXcml0aW5nIGEgMzItYml0IHZhbHVlCisgIC8vIGlzIGVxdWl2YWxlbnQgdG8gY2FzdGluZyBpdCB0byB1aW50NjQgYW5kIHdyaXRpbmcgaXQgYXMgYSA2NC1iaXQgdmFsdWUsCisgIC8vIGJ1dCBtYXkgYmUgbW9yZSBlZmZpY2llbnQuCisgIHZvaWQgV3JpdGVWYXJpbnQzMih1aW50MzIgdmFsdWUpOworICAvLyBMaWtlIFdyaXRlVmFyaW50MzIoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KKyAgc3RhdGljIHVpbnQ4KiBXcml0ZVZhcmludDMyVG9BcnJheSh1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpOworICAvLyBXcml0ZSBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggVmFyaW50IGVuY29kaW5nLgorICB2b2lkIFdyaXRlVmFyaW50NjQodWludDY0IHZhbHVlKTsKKyAgLy8gTGlrZSBXcml0ZVZhcmludDY0KCkgIGJ1dCB3cml0aW5nIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgYXJyYXkuCisgIHN0YXRpYyB1aW50OCogV3JpdGVWYXJpbnQ2NFRvQXJyYXkodWludDY0IHZhbHVlLCB1aW50OCogdGFyZ2V0KTsKKworICAvLyBFcXVpdmFsZW50IHRvIFdyaXRlVmFyaW50MzIoKSBleGNlcHQgd2hlbiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUsCisgIC8vIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBzaWduLWV4dGVuZGVkIHRvIGEgZnVsbCAxMCBieXRlcy4KKyAgdm9pZCBXcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkKGludDMyIHZhbHVlKTsKKyAgLy8gTGlrZSBXcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkKCkgIGJ1dCB3cml0aW5nIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgYXJyYXkuCisgIHN0YXRpYyB1aW50OCogV3JpdGVWYXJpbnQzMlNpZ25FeHRlbmRlZFRvQXJyYXkoaW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpOworCisgIC8vIFRoaXMgaXMgaWRlbnRpY2FsIHRvIFdyaXRlVmFyaW50MzIoKSwgYnV0IG9wdGltaXplZCBmb3Igd3JpdGluZyB0YWdzLgorICAvLyBJbiBwYXJ0aWN1bGFyLCBpZiB0aGUgaW5wdXQgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQsIHRoaXMgbWV0aG9kCisgIC8vIGNvbXBpbGVzIGRvd24gdG8gYSBjb3VwbGUgaW5zdHJ1Y3Rpb25zLgorICAvLyBBbHdheXMgaW5saW5lIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBhZm9ybWVudGlvbmVkIG9wdGltaXphdGlvbiBjYW4ndCB3b3JrLAorICAvLyBidXQgR0NDIGJ5IGRlZmF1bHQgZG9lc24ndCB3YW50IHRvIGlubGluZSB0aGlzLgorICB2b2lkIFdyaXRlVGFnKHVpbnQzMiB2YWx1ZSk7CisgIC8vIExpa2UgV3JpdGVUYWcoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KKyAgc3RhdGljIHVpbnQ4KiBXcml0ZVRhZ1RvQXJyYXkoCisgICAgICB1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGVuY29kZSB0aGUgZ2l2ZW4gdmFsdWUgYXMgYSB2YXJpbnQuCisgIHN0YXRpYyBpbnQgVmFyaW50U2l6ZTMyKHVpbnQzMiB2YWx1ZSk7CisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gZW5jb2RlIHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHZhcmludC4KKyAgc3RhdGljIGludCBWYXJpbnRTaXplNjQodWludDY0IHZhbHVlKTsKKworICAvLyBJZiBuZWdhdGl2ZSwgMTAgYnl0ZXMuICBPdGhlcml3c2UsIHNhbWUgYXMgVmFyaW50U2l6ZTMyKCkuCisgIHN0YXRpYyBpbnQgVmFyaW50U2l6ZTMyU2lnbkV4dGVuZGVkKGludDMyIHZhbHVlKTsKKworICAvLyBDb21waWxlLXRpbWUgZXF1aXZhbGVudCBvZiBWYXJpbnRTaXplMzIoKS4KKyAgdGVtcGxhdGUgPHVpbnQzMiBWYWx1ZT4KKyAgc3RydWN0IFN0YXRpY1ZhcmludFNpemUzMiB7CisgICAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9CisgICAgICAgIChWYWx1ZSA8ICgxIDw8IDcpKQorICAgICAgICAgICAgPyAxCisgICAgICAgICAgICA6IChWYWx1ZSA8ICgxIDw8IDE0KSkKKyAgICAgICAgICAgICAgICA/IDIKKyAgICAgICAgICAgICAgICA6IChWYWx1ZSA8ICgxIDw8IDIxKSkKKyAgICAgICAgICAgICAgICAgICAgPyAzCisgICAgICAgICAgICAgICAgICAgIDogKFZhbHVlIDwgKDEgPDwgMjgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPyA0CisgICAgICAgICAgICAgICAgICAgICAgICA6IDU7CisgIH07CisKKyAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc2luY2UgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQuCisgIGlubGluZSBpbnQgQnl0ZUNvdW50KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhbiB1bmRlcmx5aW5nIEkvTyBlcnJvciBzaW5jZSB0aGlzIG9iamVjdCB3YXMKKyAgLy8gY3JlYXRlZC4KKyAgYm9vbCBIYWRFcnJvcigpIGNvbnN0IHsgcmV0dXJuIGhhZF9lcnJvcl87IH0KKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlZE91dHB1dFN0cmVhbSk7CisKKyAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dF87CisgIHVpbnQ4KiBidWZmZXJfOworICBpbnQgYnVmZmVyX3NpemVfOworICBpbnQgdG90YWxfYnl0ZXNfOyAgLy8gU3VtIG9mIHNpemVzIG9mIGFsbCBidWZmZXJzIHNlZW4gc28gZmFyLgorICBib29sIGhhZF9lcnJvcl87ICAgLy8gV2hldGhlciBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgb3V0cHV0LgorCisgIC8vIEFkdmFuY2UgdGhlIGJ1ZmZlciBieSBhIGdpdmVuIG51bWJlciBvZiBieXRlcy4KKyAgdm9pZCBBZHZhbmNlKGludCBhbW91bnQpOworCisgIC8vIENhbGxlZCB3aGVuIHRoZSBidWZmZXIgcnVucyBvdXQgdG8gcmVxdWVzdCBtb3JlIGRhdGEuICBJbXBsaWVzIGFuCisgIC8vIEFkdmFuY2UoYnVmZmVyX3NpemVfKS4KKyAgYm9vbCBSZWZyZXNoKCk7CisKKyAgc3RhdGljIHVpbnQ4KiBXcml0ZVZhcmludDMyRmFsbGJhY2tUb0FycmF5KHVpbnQzMiB2YWx1ZSwgdWludDgqIHRhcmdldCk7CisKKyAgLy8gQWx3YXlzLWlubGluZWQgdmVyc2lvbnMgb2YgV3JpdGVWYXJpbnQqIGZ1bmN0aW9ucyBzbyB0aGF0IGNvZGUgY2FuIGJlCisgIC8vIHJldXNlZCwgd2hpbGUgc3RpbGwgY29udHJvbGxpbmcgc2l6ZS4gRm9yIGluc3RhbmNlLCBXcml0ZVZhcmludDMyVG9BcnJheSgpCisgIC8vIHNob3VsZCBub3QgZGlyZWN0bHkgY2FsbCB0aGlzOiBzaW5jZSBpdCBpcyBpbmxpbmVkIGl0c2VsZiwgZG9pbmcgc28KKyAgLy8gd291bGQgZ3JlYXRseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiBnZW5lcmF0ZWQgY29kZS4gSW5zdGVhZCwgaXQgc2hvdWxkIGNhbGwKKyAgLy8gV3JpdGVWYXJpbnQzMkZhbGxiYWNrVG9BcnJheS4gIE1lYW53aGlsZSwgV3JpdGVWYXJpbnQzMigpIGlzIGFscmVhZHkKKyAgLy8gb3V0LW9mLWxpbmUsIHNvIGl0IHNob3VsZCBqdXN0IGludm9rZSB0aGlzIGRpcmVjdGx5IHRvIGF2b2lkIGFueSBleHRyYQorICAvLyBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgorICBzdGF0aWMgdWludDgqIFdyaXRlVmFyaW50MzJGYWxsYmFja1RvQXJyYXlJbmxpbmUoCisgICAgICB1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKKyAgc3RhdGljIHVpbnQ4KiBXcml0ZVZhcmludDY0VG9BcnJheUlubGluZSgKKyAgICAgIHVpbnQ2NCB2YWx1ZSwgdWludDgqIHRhcmdldCkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworCisgIHN0YXRpYyBpbnQgVmFyaW50U2l6ZTMyRmFsbGJhY2sodWludDMyIHZhbHVlKTsKK307CisKKy8vIGlubGluZSBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRoZSB2YXN0IG1ham9yaXR5IG9mIHZhcmludHMgYXJlIG9ubHkgb25lIGJ5dGUuICBUaGVzZSBpbmxpbmUKKy8vIG1ldGhvZHMgb3B0aW1pemUgZm9yIHRoYXQgY2FzZS4KKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDMyKHVpbnQzMiogdmFsdWUpIHsKKyAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSAmJiAqYnVmZmVyXyA8IDB4ODApIHsKKyAgICAqdmFsdWUgPSAqYnVmZmVyXzsKKyAgICBBZHZhbmNlKDEpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBSZWFkVmFyaW50MzJGYWxsYmFjayh2YWx1ZSk7CisgIH0KK30KKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDY0KHVpbnQ2NCogdmFsdWUpIHsKKyAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSAmJiAqYnVmZmVyXyA8IDB4ODApIHsKKyAgICAqdmFsdWUgPSAqYnVmZmVyXzsKKyAgICBBZHZhbmNlKDEpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBSZWFkVmFyaW50NjRGYWxsYmFjayh2YWx1ZSk7CisgIH0KK30KKworLy8gc3RhdGljCitpbmxpbmUgY29uc3QgdWludDgqIENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW4zMkZyb21BcnJheSgKKyAgICBjb25zdCB1aW50OCogYnVmZmVyLAorICAgIHVpbnQzMiogdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pCisgIG1lbWNweSh2YWx1ZSwgYnVmZmVyLCBzaXplb2YoKnZhbHVlKSk7CisgIHJldHVybiBidWZmZXIgKyBzaXplb2YoKnZhbHVlKTsKKyNlbHNlCisgICp2YWx1ZSA9IChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlclswXSkgICAgICApIHwKKyAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzFdKSA8PCAgOCkgfAorICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbMl0pIDw8IDE2KSB8CisgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlclszXSkgPDwgMjQpOworICByZXR1cm4gYnVmZmVyICsgc2l6ZW9mKCp2YWx1ZSk7CisjZW5kaWYKK30KKy8vIHN0YXRpYworaW5saW5lIGNvbnN0IHVpbnQ4KiBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuNjRGcm9tQXJyYXkoCisgICAgY29uc3QgdWludDgqIGJ1ZmZlciwKKyAgICB1aW50NjQqIHZhbHVlKSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKQorICBtZW1jcHkodmFsdWUsIGJ1ZmZlciwgc2l6ZW9mKCp2YWx1ZSkpOworICByZXR1cm4gYnVmZmVyICsgc2l6ZW9mKCp2YWx1ZSk7CisjZWxzZQorICB1aW50MzIgcGFydDAgPSAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbMF0pICAgICAgKSB8CisgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlclsxXSkgPDwgIDgpIHwKKyAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzJdKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbM10pIDw8IDI0KTsKKyAgdWludDMyIHBhcnQxID0gKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzRdKSAgICAgICkgfAorICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbNV0pIDw8ICA4KSB8CisgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlcls2XSkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzddKSA8PCAyNCk7CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQ2ND4ocGFydDApIHwKKyAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0PihwYXJ0MSkgPDwgMzIpOworICByZXR1cm4gYnVmZmVyICsgc2l6ZW9mKCp2YWx1ZSk7CisjZW5kaWYKK30KKworaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjMyKHVpbnQzMiogdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pCisgIGlmIChHT09HTEVfUFJFRElDVF9UUlVFKEJ1ZmZlclNpemUoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZigqdmFsdWUpKSkpIHsKKyAgICBtZW1jcHkodmFsdWUsIGJ1ZmZlcl8sIHNpemVvZigqdmFsdWUpKTsKKyAgICBBZHZhbmNlKHNpemVvZigqdmFsdWUpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gUmVhZExpdHRsZUVuZGlhbjMyRmFsbGJhY2sodmFsdWUpOworICB9CisjZWxzZQorICByZXR1cm4gUmVhZExpdHRsZUVuZGlhbjMyRmFsbGJhY2sodmFsdWUpOworI2VuZGlmCit9CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NCh1aW50NjQqIHZhbHVlKSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKQorICBpZiAoR09PR0xFX1BSRURJQ1RfVFJVRShCdWZmZXJTaXplKCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoKnZhbHVlKSkpKSB7CisgICAgbWVtY3B5KHZhbHVlLCBidWZmZXJfLCBzaXplb2YoKnZhbHVlKSk7CisgICAgQWR2YW5jZShzaXplb2YoKnZhbHVlKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFJlYWRMaXR0bGVFbmRpYW42NEZhbGxiYWNrKHZhbHVlKTsKKyAgfQorI2Vsc2UKKyAgcmV0dXJuIFJlYWRMaXR0bGVFbmRpYW42NEZhbGxiYWNrKHZhbHVlKTsKKyNlbmRpZgorfQorCitpbmxpbmUgdWludDMyIENvZGVkSW5wdXRTdHJlYW06OlJlYWRUYWcoKSB7CisgIGlmIChHT09HTEVfUFJFRElDVF9UUlVFKGJ1ZmZlcl8gPCBidWZmZXJfZW5kXykgJiYgYnVmZmVyX1swXSA8IDB4ODApIHsKKyAgICBsYXN0X3RhZ18gPSBidWZmZXJfWzBdOworICAgIEFkdmFuY2UoMSk7CisgICAgcmV0dXJuIGxhc3RfdGFnXzsKKyAgfSBlbHNlIHsKKyAgICBsYXN0X3RhZ18gPSBSZWFkVGFnRmFsbGJhY2soKTsKKyAgICByZXR1cm4gbGFzdF90YWdfOworICB9Cit9CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06Okxhc3RUYWdXYXModWludDMyIGV4cGVjdGVkKSB7CisgIHJldHVybiBsYXN0X3RhZ18gPT0gZXhwZWN0ZWQ7Cit9CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpIHsKKyAgcmV0dXJuIGxlZ2l0aW1hdGVfbWVzc2FnZV9lbmRfOworfQorCitpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpFeHBlY3RUYWcodWludDMyIGV4cGVjdGVkKSB7CisgIGlmIChleHBlY3RlZCA8ICgxIDw8IDcpKSB7CisgICAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSAmJiBidWZmZXJfWzBdID09IGV4cGVjdGVkKSB7CisgICAgICBBZHZhbmNlKDEpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZXhwZWN0ZWQgPCAoMSA8PCAxNCkpIHsKKyAgICBpZiAoR09PR0xFX1BSRURJQ1RfVFJVRShCdWZmZXJTaXplKCkgPj0gMikgJiYKKyAgICAgICAgYnVmZmVyX1swXSA9PSBzdGF0aWNfY2FzdDx1aW50OD4oZXhwZWN0ZWQgfCAweDgwKSAmJgorICAgICAgICBidWZmZXJfWzFdID09IHN0YXRpY19jYXN0PHVpbnQ4PihleHBlY3RlZCA+PiA3KSkgeworICAgICAgQWR2YW5jZSgyKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIERvbid0IGJvdGhlciBvcHRpbWl6aW5nIGZvciBsYXJnZXIgdmFsdWVzLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitpbmxpbmUgY29uc3QgdWludDgqIENvZGVkSW5wdXRTdHJlYW06OkV4cGVjdFRhZ0Zyb21BcnJheSgKKyAgICBjb25zdCB1aW50OCogYnVmZmVyLCB1aW50MzIgZXhwZWN0ZWQpIHsKKyAgaWYgKGV4cGVjdGVkIDwgKDEgPDwgNykpIHsKKyAgICBpZiAoYnVmZmVyWzBdID09IGV4cGVjdGVkKSB7CisgICAgICByZXR1cm4gYnVmZmVyICsgMTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZXhwZWN0ZWQgPCAoMSA8PCAxNCkpIHsKKyAgICBpZiAoYnVmZmVyWzBdID09IHN0YXRpY19jYXN0PHVpbnQ4PihleHBlY3RlZCB8IDB4ODApICYmCisgICAgICAgIGJ1ZmZlclsxXSA9PSBzdGF0aWNfY2FzdDx1aW50OD4oZXhwZWN0ZWQgPj4gNykpIHsKKyAgICAgIHJldHVybiBidWZmZXIgKyAyOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6R2V0RGlyZWN0QnVmZmVyUG9pbnRlcklubGluZShjb25zdCB2b2lkKiogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzaXplKSB7CisgICpkYXRhID0gYnVmZmVyXzsKKyAgKnNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZmZlcl9lbmRfIC0gYnVmZmVyXyk7Cit9CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OkV4cGVjdEF0RW5kKCkgeworICAvLyBJZiB3ZSBhcmUgYXQgYSBsaW1pdCB3ZSBrbm93IG5vIG1vcmUgYnl0ZXMgY2FuIGJlIHJlYWQuICBPdGhlcndpc2UsIGl0J3MKKyAgLy8gaGFyZCB0byBzYXkgd2l0aG91dCBjYWxsaW5nIFJlZnJlc2goKSwgYW5kIHdlJ2QgcmF0aGVyIG5vdCBkbyB0aGF0LgorCisgIGlmIChidWZmZXJfID09IGJ1ZmZlcl9lbmRfICYmIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyAhPSAwKSB7CisgICAgbGFzdF90YWdfID0gMDsgICAgICAgICAgICAgICAgICAgLy8gUHJldGVuZCB3ZSBjYWxsZWQgUmVhZFRhZygpLi4uCisgICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8gPSB0cnVlOyAgLy8gLi4uIGFuZCBpdCBoaXQgRU9GLgorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitpbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpHZXREaXJlY3RCdWZmZXJGb3JOQnl0ZXNBbmRBZHZhbmNlKGludCBzaXplKSB7CisgIGlmIChidWZmZXJfc2l6ZV8gPCBzaXplKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgdWludDgqIHJlc3VsdCA9IGJ1ZmZlcl87CisgICAgQWR2YW5jZShzaXplKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK2lubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KHVpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICBpZiAodmFsdWUgPCAweDgwKSB7CisgICAgKnRhcmdldCA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSk7CisgICAgcmV0dXJuIHRhcmdldCArIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFdyaXRlVmFyaW50MzJGYWxsYmFja1RvQXJyYXkodmFsdWUsIHRhcmdldCk7CisgIH0KK30KKworaW5saW5lIHZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQoaW50MzIgdmFsdWUpIHsKKyAgaWYgKHZhbHVlIDwgMCkgeworICAgIFdyaXRlVmFyaW50NjQoc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSkpOworICB9IGVsc2UgeworICAgIFdyaXRlVmFyaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSkpOworICB9Cit9CisKK2lubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWRUb0FycmF5KAorICAgIGludDMyIHZhbHVlLCB1aW50OCogdGFyZ2V0KSB7CisgIGlmICh2YWx1ZSA8IDApIHsKKyAgICByZXR1cm4gV3JpdGVWYXJpbnQ2NFRvQXJyYXkoc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSksIHRhcmdldCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFdyaXRlVmFyaW50MzJUb0FycmF5KHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUpLCB0YXJnZXQpOworICB9Cit9CisKK2lubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuMzJUb0FycmF5KHVpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pCisgIG1lbWNweSh0YXJnZXQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CisjZWxzZQorICB0YXJnZXRbMF0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpOworICB0YXJnZXRbMV0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgPj4gIDgpOworICB0YXJnZXRbMl0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgPj4gMTYpOworICB0YXJnZXRbM10gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgPj4gMjQpOworI2VuZGlmCisgIHJldHVybiB0YXJnZXQgKyBzaXplb2YodmFsdWUpOworfQorCitpbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheSh1aW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisjaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKQorICBtZW1jcHkodGFyZ2V0LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworI2Vsc2UKKyAgdWludDMyIHBhcnQwID0gc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSk7CisgIHVpbnQzMiBwYXJ0MSA9IHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUgPj4gMzIpOworCisgIHRhcmdldFswXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCk7CisgIHRhcmdldFsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCA+PiAgOCk7CisgIHRhcmdldFsyXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCA+PiAxNik7CisgIHRhcmdldFszXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCA+PiAyNCk7CisgIHRhcmdldFs0XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSk7CisgIHRhcmdldFs1XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSA+PiAgOCk7CisgIHRhcmdldFs2XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSA+PiAxNik7CisgIHRhcmdldFs3XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSA+PiAyNCk7CisjZW5kaWYKKyAgcmV0dXJuIHRhcmdldCArIHNpemVvZih2YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVRhZyh1aW50MzIgdmFsdWUpIHsKKyAgV3JpdGVWYXJpbnQzMih2YWx1ZSk7Cit9CisKK2lubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICB1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIHsKKyAgaWYgKHZhbHVlIDwgKDEgPDwgNykpIHsKKyAgICB0YXJnZXRbMF0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpOworICAgIHJldHVybiB0YXJnZXQgKyAxOworICB9IGVsc2UgaWYgKHZhbHVlIDwgKDEgPDwgMTQpKSB7CisgICAgdGFyZ2V0WzBdID0gc3RhdGljX2Nhc3Q8dWludDg+KHZhbHVlIHwgMHg4MCk7CisgICAgdGFyZ2V0WzFdID0gc3RhdGljX2Nhc3Q8dWludDg+KHZhbHVlID4+IDcpOworICAgIHJldHVybiB0YXJnZXQgKyAyOworICB9IGVsc2UgeworICAgIHJldHVybiBXcml0ZVZhcmludDMyRmFsbGJhY2tUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworICB9Cit9CisKK2lubGluZSBpbnQgQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMih1aW50MzIgdmFsdWUpIHsKKyAgaWYgKHZhbHVlIDwgKDEgPDwgNykpIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlICB7CisgICAgcmV0dXJuIFZhcmludFNpemUzMkZhbGxiYWNrKHZhbHVlKTsKKyAgfQorfQorCitpbmxpbmUgaW50IENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzJTaWduRXh0ZW5kZWQoaW50MzIgdmFsdWUpIHsKKyAgaWYgKHZhbHVlIDwgMCkgeworICAgIHJldHVybiAxMDsgICAgIC8vIFRPRE8oa2VudG9uKTogIE1ha2UgdGhpcyBhIHN5bWJvbGljIGNvbnN0YW50LgorICB9IGVsc2UgeworICAgIHJldHVybiBWYXJpbnRTaXplMzIoc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSkpOworICB9Cit9CisKK2lubGluZSB2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVN0cmluZyhjb25zdCBzdHJpbmcmIHN0cikgeworICBXcml0ZVJhdyhzdHIuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHN0ci5zaXplKCkpKTsKK30KKworaW5saW5lIHVpbnQ4KiBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgIGNvbnN0IHN0cmluZyYgc3RyLCB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBXcml0ZVJhd1RvQXJyYXkoc3RyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihzdHIuc2l6ZSgpKSwgdGFyZ2V0KTsKK30KKworaW5saW5lIGludCBDb2RlZE91dHB1dFN0cmVhbTo6Qnl0ZUNvdW50KCkgY29uc3QgeworICByZXR1cm4gdG90YWxfYnl0ZXNfIC0gYnVmZmVyX3NpemVfOworfQorCitpbmxpbmUgdm9pZCBDb2RlZElucHV0U3RyZWFtOjpBZHZhbmNlKGludCBhbW91bnQpIHsKKyAgYnVmZmVyXyArPSBhbW91bnQ7Cit9CisKK2lubGluZSB2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpBZHZhbmNlKGludCBhbW91bnQpIHsKKyAgYnVmZmVyXyArPSBhbW91bnQ7CisgIGJ1ZmZlcl9zaXplXyAtPSBhbW91bnQ7Cit9CisKK2lubGluZSB2b2lkIENvZGVkSW5wdXRTdHJlYW06OlNldFJlY3Vyc2lvbkxpbWl0KGludCBsaW1pdCkgeworICByZWN1cnNpb25fbGltaXRfID0gbGltaXQ7Cit9CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgeworICArK3JlY3Vyc2lvbl9kZXB0aF87CisgIHJldHVybiByZWN1cnNpb25fZGVwdGhfIDw9IHJlY3Vyc2lvbl9saW1pdF87Cit9CisKK2lubGluZSB2b2lkIENvZGVkSW5wdXRTdHJlYW06OkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgeworICBpZiAocmVjdXJzaW9uX2RlcHRoXyA+IDApIC0tcmVjdXJzaW9uX2RlcHRoXzsKK30KKworaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6U2V0RXh0ZW5zaW9uUmVnaXN0cnkoRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgeworICBleHRlbnNpb25fcG9vbF8gPSBwb29sOworICBleHRlbnNpb25fZmFjdG9yeV8gPSBmYWN0b3J5OworfQorCitpbmxpbmUgY29uc3QgRGVzY3JpcHRvclBvb2wqIENvZGVkSW5wdXRTdHJlYW06OkdldEV4dGVuc2lvblBvb2woKSB7CisgIHJldHVybiBleHRlbnNpb25fcG9vbF87Cit9CisKK2lubGluZSBNZXNzYWdlRmFjdG9yeSogQ29kZWRJbnB1dFN0cmVhbTo6R2V0RXh0ZW5zaW9uRmFjdG9yeSgpIHsKKyAgcmV0dXJuIGV4dGVuc2lvbl9mYWN0b3J5XzsKK30KKworaW5saW5lIGludCBDb2RlZElucHV0U3RyZWFtOjpCdWZmZXJTaXplKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihidWZmZXJfZW5kXyAtIGJ1ZmZlcl8pOworfQorCitpbmxpbmUgQ29kZWRJbnB1dFN0cmVhbTo6Q29kZWRJbnB1dFN0cmVhbShaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCkKKyAgOiBpbnB1dF8oaW5wdXQpLAorICAgIGJ1ZmZlcl8oTlVMTCksCisgICAgYnVmZmVyX2VuZF8oTlVMTCksCisgICAgdG90YWxfYnl0ZXNfcmVhZF8oMCksCisgICAgb3ZlcmZsb3dfYnl0ZXNfKDApLAorICAgIGxhc3RfdGFnXygwKSwKKyAgICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyhmYWxzZSksCisgICAgYWxpYXNpbmdfZW5hYmxlZF8oZmFsc2UpLAorICAgIGN1cnJlbnRfbGltaXRfKGtpbnQzMm1heCksCisgICAgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfKDApLAorICAgIHRvdGFsX2J5dGVzX2xpbWl0XyhrRGVmYXVsdFRvdGFsQnl0ZXNMaW1pdCksCisgICAgdG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfKGtEZWZhdWx0VG90YWxCeXRlc1dhcm5pbmdUaHJlc2hvbGQpLAorICAgIHJlY3Vyc2lvbl9kZXB0aF8oMCksCisgICAgcmVjdXJzaW9uX2xpbWl0XyhrRGVmYXVsdFJlY3Vyc2lvbkxpbWl0KSwKKyAgICBleHRlbnNpb25fcG9vbF8oTlVMTCksCisgICAgZXh0ZW5zaW9uX2ZhY3RvcnlfKE5VTEwpIHsKKyAgLy8gRWFnZXJseSBSZWZyZXNoKCkgc28gYnVmZmVyIHNwYWNlIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KKyAgUmVmcmVzaCgpOworfQorCitpbmxpbmUgQ29kZWRJbnB1dFN0cmVhbTo6Q29kZWRJbnB1dFN0cmVhbShjb25zdCB1aW50OCogYnVmZmVyLCBpbnQgc2l6ZSkKKyAgOiBpbnB1dF8oTlVMTCksCisgICAgYnVmZmVyXyhidWZmZXIpLAorICAgIGJ1ZmZlcl9lbmRfKGJ1ZmZlciArIHNpemUpLAorICAgIHRvdGFsX2J5dGVzX3JlYWRfKHNpemUpLAorICAgIG92ZXJmbG93X2J5dGVzXygwKSwKKyAgICBsYXN0X3RhZ18oMCksCisgICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8oZmFsc2UpLAorICAgIGFsaWFzaW5nX2VuYWJsZWRfKGZhbHNlKSwKKyAgICBjdXJyZW50X2xpbWl0XyhzaXplKSwKKyAgICBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8oMCksCisgICAgdG90YWxfYnl0ZXNfbGltaXRfKGtEZWZhdWx0VG90YWxCeXRlc0xpbWl0KSwKKyAgICB0b3RhbF9ieXRlc193YXJuaW5nX3RocmVzaG9sZF8oa0RlZmF1bHRUb3RhbEJ5dGVzV2FybmluZ1RocmVzaG9sZCksCisgICAgcmVjdXJzaW9uX2RlcHRoXygwKSwKKyAgICByZWN1cnNpb25fbGltaXRfKGtEZWZhdWx0UmVjdXJzaW9uTGltaXQpLAorICAgIGV4dGVuc2lvbl9wb29sXyhOVUxMKSwKKyAgICBleHRlbnNpb25fZmFjdG9yeV8oTlVMTCkgeworICAvLyBOb3RlIHRoYXQgc2V0dGluZyBjdXJyZW50X2xpbWl0XyA9PSBzaXplIGlzIGltcG9ydGFudCB0byBwcmV2ZW50IHNvbWUKKyAgLy8gY29kZSBwYXRocyBmcm9tIHRyeWluZyB0byBhY2Nlc3MgaW5wdXRfIGFuZCBzZWdmYXVsdGluZy4KK30KKworaW5saW5lIENvZGVkSW5wdXRTdHJlYW06On5Db2RlZElucHV0U3RyZWFtKCkgeworICBpZiAoaW5wdXRfICE9IE5VTEwpIHsKKyAgICBCYWNrVXBJbnB1dFRvQ3VycmVudFBvc2l0aW9uKCk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTMwMAorICAjcHJhZ21hIHJ1bnRpbWVfY2hlY2tzKCJjIiwgcmVzdG9yZSkKKyNlbmRpZiAgLy8gX01TQ19WRVIKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fQ09ERURfU1RSRUFNX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX2lubC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX2lubC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Nzk5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1faW5sLmgKQEAgLTAsMCArMSw2NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBqYXNvbmhAZ29vZ2xlLmNvbSAoSmFzb24gSHN1ZWgpCisvLworLy8gSW1wbGVtZW50cyBtZXRob2RzIG9mIGNvZGVkX3N0cmVhbS5oIHRoYXQgbmVlZCB0byBiZSBpbmxpbmVkIGZvciBwZXJmb3JtYW5jZQorLy8gcmVhc29ucywgYnV0IHNob3VsZCBub3QgYmUgZGVmaW5lZCBpbiBhIHB1YmxpYyBoZWFkZXIuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX0NPREVEX1NUUkVBTV9JTkxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSU5MX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKK2lubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OkludGVybmFsUmVhZFN0cmluZ0lubGluZShzdHJpbmcqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgeworICBpZiAoc2l6ZSA8IDApIHJldHVybiBmYWxzZTsgIC8vIHNlY3VyaXR5OiBzaXplIGlzIG9mdGVuIHVzZXItc3VwcGxpZWQKKworICBpZiAoQnVmZmVyU2l6ZSgpID49IHNpemUpIHsKKyAgICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKGJ1ZmZlciwgc2l6ZSk7CisgICAgbWVtY3B5KHN0cmluZ19hc19hcnJheShidWZmZXIpLCBidWZmZXJfLCBzaXplKTsKKyAgICBBZHZhbmNlKHNpemUpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIFJlYWRTdHJpbmdGYWxsYmFjayhidWZmZXIsIHNpemUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fQ09ERURfU1RSRUFNX0lOTF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjI2OGFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMTEzMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRlc3RzIGFuZCBiZW5jaG1hcmtzLgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKKworLy8gVGhpcyBkZWNsYXJlcyBhbiB1bnNpZ25lZCBsb25nIGxvbmcgaW50ZWdlciBsaXRlcmFsIGluIGEgcG9ydGFibGUgd2F5LgorLy8gKFRoZSBvcmlnaW5hbCBtYWNybyBpcyB3YXkgdG9vIGJpZyBhbmQgcnVpbnMgbXkgZm9ybWF0dGluZy4pCisjdW5kZWYgVUxMCisjZGVmaW5lIFVMTCh4KSBHT09HTEVfVUxPTkdMT05HKHgpCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CituYW1lc3BhY2UgeworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEYXRhLURyaXZlbiBUZXN0IEluZnJhc3RydWN0dXJlCisKKy8vIFRFU1RfMUQgYW5kIFRFU1RfMkQgYXJlIG1hY3JvcyBJJ2QgZXZlbnR1YWxseSBsaWtlIHRvIHNlZSBhZGRlZCB0bworLy8gZ1Rlc3QuICBUaGVzZSBtYWNyb3MgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZSB0ZXN0cyB3aGljaCBzaG91bGQgYmUKKy8vIHJ1biBtdWx0aXBsZSB0aW1lcywgb25jZSBmb3IgZWFjaCBpdGVtIGluIHNvbWUgaW5wdXQgYXJyYXkuICBURVNUXzFECisvLyB0ZXN0cyBhbGwgY2FzZXMgaW4gYSBzaW5nbGUgaW5wdXQgYXJyYXkuICBURVNUXzJEIHRlc3RzIGFsbAorLy8gY29tYmluYXRpb25zIG9mIGNhc2VzIGZyb20gdHdvIGFycmF5cy4gIFRoZSBhcnJheXMgbXVzdCBiZSBzdGF0aWNhbGx5CisvLyBkZWZpbmVkIHN1Y2ggdGhhdCB0aGUgR09PR0xFX0FSUkFZU0laRSgpIG1hY3JvIHdvcmtzIG9uIHRoZW0uICBFeGFtcGxlOgorLy8KKy8vIGludCBrQ2FzZXNbXSA9IHsxLCAyLCAzLCA0fQorLy8gVEVTVF8xRChNeUZpeHR1cmUsIE15VGVzdCwga0Nhc2VzKSB7CisvLyAgIEVYUEVDVF9HVChrQ2FzZXNfY2FzZSwgMCk7CisvLyB9CisvLworLy8gVGhpcyB0ZXN0IGl0ZXJhdGVzIHRocm91Z2ggdGhlIG51bWJlcnMgMSwgMiwgMywgYW5kIDQgYW5kIHRlc3RzIHRoYXQKKy8vIHRoZXkgYXJlIGFsbCBncmF0ZXIgdGhhbiB6ZXJvLiAgSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgZXhhY3QgY2FzZQorLy8gd2hpY2ggZmFpbGVkIHdpbGwgYmUgcHJpbnRlZC4gIFRoZSBjYXNlIHR5cGUgbXVzdCBiZSBwcmludGFibGUgdXNpbmcKKy8vIG9zdHJlYW06Om9wZXJhdG9yPDwuCisKKy8vIFRPRE8oa2VudG9uKTogIGdUZXN0IG5vdyBzdXBwb3J0cyAicGFyYW1ldGVyaXplZCB0ZXN0cyIgd2hpY2ggd291bGQgYmUKKy8vICAgYSBiZXR0ZXIgd2F5IHRvIGFjY29tcGxpc2ggdGhpcy4gIFJld3JpdGUgd2hlbiB0aW1lIHBlcm1pdHMuCisKKyNkZWZpbmUgVEVTVF8xRChGSVhUVVJFLCBOQU1FLCBDQVNFUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgRklYVFVSRSMjXyMjTkFNRSMjX0REIDogcHVibGljIEZJWFRVUkUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2b2lkIERvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZSYgQ0FTRVMjI19jYXNlKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEVTVF9GKEZJWFRVUkUjI18jI05BTUUjI19ERCwgTkFNRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoQ0FTRVMpOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDw8ICNDQVNFUyAiIGNhc2UgIyIgPDwgaSA8PCAiOiAiIDw8IENBU0VTW2ldKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBEb1NpbmdsZUNhc2UoQ0FTRVNbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYXNlVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgRklYVFVSRSMjXyMjTkFNRSMjX0REOjpEb1NpbmdsZUNhc2UoY29uc3QgQ2FzZVR5cGUmIENBU0VTIyNfY2FzZSkKKworI2RlZmluZSBURVNUXzJEKEZJWFRVUkUsIE5BTUUsIENBU0VTMSwgQ0FTRVMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBGSVhUVVJFIyNfIyNOQU1FIyNfREQgOiBwdWJsaWMgRklYVFVSRSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYXNlVHlwZTEsIHR5cGVuYW1lIENhc2VUeXBlMj4gICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgRG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlMSYgQ0FTRVMxIyNfY2FzZSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhc2VUeXBlMiYgQ0FTRVMyIyNfY2FzZSk7ICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBURVNUX0YoRklYVFVSRSMjXyMjTkFNRSMjX0RELCBOQU1FKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShDQVNFUzEpOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgR09PR0xFX0FSUkFZU0laRShDQVNFUzIpOyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgPDwgI0NBU0VTMSAiIGNhc2UgIyIgPDwgaSA8PCAiOiAiIDw8IENBU0VTMVtpXSA8PCAiLCAiICAgICAgICAgICBcCisgICAgICAgICAgPDwgI0NBU0VTMiAiIGNhc2UgIyIgPDwgaiA8PCAiOiAiIDw8IENBU0VTMltqXSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIERvU2luZ2xlQ2FzZShDQVNFUzFbaV0sIENBU0VTMltqXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYXNlVHlwZTEsIHR5cGVuYW1lIENhc2VUeXBlMj4gICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgRklYVFVSRSMjXyMjTkFNRSMjX0REOjpEb1NpbmdsZUNhc2UoY29uc3QgQ2FzZVR5cGUxJiBDQVNFUzEjI19jYXNlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FzZVR5cGUyJiBDQVNFUzIjI19jYXNlKQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIENvZGVkU3RyZWFtVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAxMDI0ICogNjQ7CisgIHN0YXRpYyB1aW50OCBidWZmZXJfW2tCdWZmZXJTaXplXTsKK307CisKK3VpbnQ4IENvZGVkU3RyZWFtVGVzdDo6YnVmZmVyX1tDb2RlZFN0cmVhbVRlc3Q6OmtCdWZmZXJTaXplXTsKKworLy8gV2UgdGVzdCBlYWNoIG9wZXJhdGlvbiBvdmVyIGEgdmFyaWV0eSBvZiBibG9jayBzaXplcyB0byBpbnN1cmUgdGhhdAorLy8gd2UgdGVzdCBjYXNlcyB3aGVyZSByZWFkcyBvciB3cml0ZXMgY3Jvc3MgYnVmZmVyIGJvdW5kYXJpZXMsIGNhc2VzCisvLyB3aGVyZSB0aGV5IGRvbid0LCBhbmQgY2FzZXMgd2hlcmUgdGhlcmUgaXMgc28gbXVjaCBidWZmZXIgbGVmdCB0aGF0CisvLyB3ZSBjYW4gdXNlIHNwZWNpYWwgb3B0aW1pemVkIHBhdGhzIHRoYXQgZG9uJ3Qgd29ycnkgYWJvdXQgYm91bmRzCisvLyBjaGVja3MuCitjb25zdCBpbnQga0Jsb2NrU2l6ZXNbXSA9IHsxLCAyLCAzLCA1LCA3LCAxMywgMzIsIDEwMjR9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWYXJpbnQgdGVzdHMuCisKK3N0cnVjdCBWYXJpbnRDYXNlIHsKKyAgdWludDggYnl0ZXNbMTBdOyAgICAgICAgICAvLyBFbmNvZGVkIGJ5dGVzLgorICBpbnQgc2l6ZTsgICAgICAgICAgICAgICAgIC8vIEVuY29kZWQgc2l6ZSwgaW4gYnl0ZXMuCisgIHVpbnQ2NCB2YWx1ZTsgICAgICAgICAgICAgLy8gUGFyc2VkIHZhbHVlLgorfTsKKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBWYXJpbnRDYXNlJiBjKSB7CisgIHJldHVybiBvcyA8PCBjLnZhbHVlOworfQorCitWYXJpbnRDYXNlIGtWYXJpbnRDYXNlc1tdID0geworICAvLyAzMi1iaXQgdmFsdWVzCisgIHt7MHgwMH0gICAgICAsIDEsIDB9LAorICB7ezB4MDF9ICAgICAgLCAxLCAxfSwKKyAge3sweDdmfSAgICAgICwgMSwgMTI3fSwKKyAge3sweGEyLCAweDc0fSwgMiwgKDB4MjIgPDwgMCkgfCAoMHg3NCA8PCA3KX0sICAgICAgICAgIC8vIDE0ODgyCisgIHt7MHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgwYn0sIDUsICAgICAgICAgICAgICAgICAgICAvLyAyOTYxNDg4ODMwCisgICAgKDB4M2UgPDwgMCkgfCAoMHg3NyA8PCA3KSB8ICgweDEyIDw8IDE0KSB8ICgweDA0IDw8IDIxKSB8CisgICAgKFVMTCgweDBiKSA8PCAyOCl9LAorCisgIC8vIDY0LWJpdAorICB7ezB4YmUsIDB4ZjcsIDB4OTIsIDB4ODQsIDB4MWJ9LCA1LCAgICAgICAgICAgICAgICAgICAgLy8gNzI1NjQ1NjEyNgorICAgICgweDNlIDw8IDApIHwgKDB4NzcgPDwgNykgfCAoMHgxMiA8PCAxNCkgfCAoMHgwNCA8PCAyMSkgfAorICAgIChVTEwoMHgxYikgPDwgMjgpfSwKKyAge3sweDgwLCAweGU2LCAweGViLCAweDljLCAweGMzLCAweGM5LCAweGE0LCAweDQ5fSwgOCwgIC8vIDQxMjU2MjAyNTgwNzE4MzM2CisgICAgKDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8ICgweDFjIDw8IDIxKSB8CisgICAgKFVMTCgweDQzKSA8PCAyOCkgfCAoVUxMKDB4NDkpIDw8IDM1KSB8IChVTEwoMHgyNCkgPDwgNDIpIHwKKyAgICAoVUxMKDB4NDkpIDw8IDQ5KX0sCisgIC8vIDExOTY0Mzc4MzMwOTc4NzM1MTMxCisgIHt7MHg5YiwgMHhhOCwgMHhmOSwgMHhjMiwgMHhiYiwgMHhkNiwgMHg4MCwgMHg4NSwgMHhhNiwgMHgwMX0sIDEwLAorICAgICgweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfAorICAgIChVTEwoMHgzYikgPDwgMjgpIHwgKFVMTCgweDU2KSA8PCAzNSkgfCAoVUxMKDB4MDApIDw8IDQyKSB8CisgICAgKFVMTCgweDA1KSA8PCA0OSkgfCAoVUxMKDB4MjYpIDw8IDU2KSB8IChVTEwoMHgwMSkgPDwgNjMpfSwKK307CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkVmFyaW50MzIsIGtWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICB1aW50MzIgdmFsdWU7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFZhcmludDMyKCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50MzI+KGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlKSwgdmFsdWUpOworICB9CisKKyAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUsIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRUYWcsIGtWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICB1aW50MzIgZXhwZWN0ZWRfdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzI+KGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfdmFsdWUsIGNvZGVkX2lucHV0LlJlYWRUYWcoKSk7CisKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5MYXN0VGFnV2FzKGV4cGVjdGVkX3ZhbHVlKSk7CisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0Lkxhc3RUYWdXYXMoZXhwZWN0ZWRfdmFsdWUgKyAxKSk7CisgIH0KKworICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCisvLyBUaGlzIGlzIHRoZSByZWdyZXNzaW9uIHRlc3QgdGhhdCB2ZXJpZmllcyB0aGF0IHRoZXJlIGlzIG5vIGlzc3VlcworLy8gd2l0aCB0aGUgZW1wdHkgaW5wdXQgYnVmZmVycyBoYW5kbGluZy4KK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIEVtcHR5SW5wdXRCZWZvcmVFb3MpIHsKKyAgY2xhc3MgSW4gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgICBwdWJsaWM6CisgICAgSW4oKSA6IGNvdW50XygwKSB7fQorICAgcHJpdmF0ZToKKyAgICB2aXJ0dWFsIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgICAgICAqZGF0YSA9IE5VTEw7CisgICAgICAqc2l6ZSA9IDA7CisgICAgICByZXR1cm4gY291bnRfKysgPCAyOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgQmFja1VwKGludCBjb3VudCkgIHsKKyAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJUZXN0cyBuZXZlciBjYWxsIHRoaXMuIjsKKyAgICB9CisgICAgdmlydHVhbCBib29sIFNraXAoaW50IGNvdW50KSB7CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGVzdHMgbmV2ZXIgY2FsbCB0aGlzLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZpcnR1YWwgaW50NjQgQnl0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIGludCBjb3VudF87CisgIH0gaW47CisgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJmluKTsKKyAgaW5wdXQuUmVhZFRhZygpOworICBFWFBFQ1RfVFJVRShpbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSk7Cit9CisKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBFeHBlY3RUYWcsIGtWYXJpbnRDYXNlcykgeworICAvLyBMZWF2ZSBvbmUgYnl0ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgc28gd2UgY2FuIHJlYWQgaXQKKyAgLy8gdG8gZm9yY2UgdGhlIGZpcnN0IGJ1ZmZlciB0byBiZSBsb2FkZWQuCisgIGJ1ZmZlcl9bMF0gPSAnXDAnOworICBtZW1jcHkoYnVmZmVyXyArIDEsIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICAvLyBSZWFkIG9uZSBieXRlIHRvIGZvcmNlIGNvZGVkX2lucHV0LlJlZmlsbCgpIHRvIGJlIGNhbGxlZC4gIE90aGVyd2lzZSwKKyAgICAvLyBFeHBlY3RUYWcoKSB3aWxsIHJldHVybiBhIGZhbHNlIG5lZ2F0aXZlLgorICAgIHVpbnQ4IGR1bW15OworICAgIGNvZGVkX2lucHV0LlJlYWRSYXcoJmR1bW15LCAxKTsKKyAgICBFWFBFQ1RfRVEoKHVpbnQpJ1wwJywgKHVpbnQpZHVtbXkpOworCisgICAgdWludDMyIGV4cGVjdGVkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDMyPihrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSk7CisKKyAgICAvLyBFeHBlY3RUYWcoKSBwcm9kdWNlcyBmYWxzZSBuZWdhdGl2ZXMgZm9yIGxhcmdlIHZhbHVlcy4KKyAgICBpZiAoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSA8PSAyKSB7CisgICAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuRXhwZWN0VGFnKGV4cGVjdGVkX3ZhbHVlICsgMSkpOworICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuRXhwZWN0VGFnKGV4cGVjdGVkX3ZhbHVlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5FeHBlY3RUYWcoZXhwZWN0ZWRfdmFsdWUpKTsKKyAgICB9CisgIH0KKworICBpZiAoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSA8PSAyKSB7CisgICAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUgKyAxLCBpbnB1dC5CeXRlQ291bnQoKSk7CisgIH0gZWxzZSB7CisgICAgRVhQRUNUX0VRKDEsIGlucHV0LkJ5dGVDb3VudCgpKTsKKyAgfQorfQorCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgRXhwZWN0VGFnRnJvbUFycmF5LCBrVmFyaW50Q2FzZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKTsKKworICBjb25zdCB1aW50MzIgZXhwZWN0ZWRfdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzI+KGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlKTsKKworICAvLyBJZiB0aGUgZXhwZWN0YXRpb24gc3VjY2VlZHMsIGl0IHNob3VsZCByZXR1cm4gYSBwb2ludGVyIHBhc3QgdGhlIHRhZy4KKyAgaWYgKGtWYXJpbnRDYXNlc19jYXNlLnNpemUgPD0gMikgeworICAgIEVYUEVDVF9UUlVFKE5VTEwgPT0KKyAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtOjpFeHBlY3RUYWdGcm9tQXJyYXkoYnVmZmVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfdmFsdWUgKyAxKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyXyArIGtWYXJpbnRDYXNlc19jYXNlLnNpemUgPT0KKyAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtOjpFeHBlY3RUYWdGcm9tQXJyYXkoYnVmZmVyXywgZXhwZWN0ZWRfdmFsdWUpKTsKKyAgfSBlbHNlIHsKKyAgICBFWFBFQ1RfVFJVRShOVUxMID09CisgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbTo6RXhwZWN0VGFnRnJvbUFycmF5KGJ1ZmZlcl8sIGV4cGVjdGVkX3ZhbHVlKSk7CisgIH0KK30KKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRWYXJpbnQ2NCwga1ZhcmludENhc2VzLCBrQmxvY2tTaXplcykgeworICBtZW1jcHkoYnVmZmVyXywga1ZhcmludENhc2VzX2Nhc2UuYnl0ZXMsIGtWYXJpbnRDYXNlc19jYXNlLnNpemUpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkVmFyaW50NjQoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlLCB2YWx1ZSk7CisgIH0KKworICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgV3JpdGVWYXJpbnQzMiwga1ZhcmludENhc2VzLCBrQmxvY2tTaXplcykgeworICBpZiAoa1ZhcmludENhc2VzX2Nhc2UudmFsdWUgPiBVTEwoMHgwMDAwMDAwMEZGRkZGRkZGKSkgeworICAgIC8vIFNraXAgdGhpcyB0ZXN0IGZvciB0aGUgNjQtYml0IHZhbHVlcy4KKyAgICByZXR1cm47CisgIH0KKworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXQpOworCisgICAgY29kZWRfb3V0cHV0LldyaXRlVmFyaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyPihrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSkpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9vdXRwdXQuSGFkRXJyb3IoKSk7CisKKyAgICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSwgY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgfQorCisgIEVYUEVDVF9FUShrVmFyaW50Q2FzZXNfY2FzZS5zaXplLCBvdXRwdXQuQnl0ZUNvdW50KCkpOworICBFWFBFQ1RfRVEoMCwKKyAgICBtZW1jbXAoYnVmZmVyXywga1ZhcmludENhc2VzX2Nhc2UuYnl0ZXMsIGtWYXJpbnRDYXNlc19jYXNlLnNpemUpKTsKK30KKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFdyaXRlVmFyaW50NjQsIGtWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0KTsKKworICAgIGNvZGVkX291dHB1dC5Xcml0ZVZhcmludDY0KGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfb3V0cHV0LkhhZEVycm9yKCkpOworCisgICAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUsIGNvZGVkX291dHB1dC5CeXRlQ291bnQoKSk7CisgIH0KKworICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSwgb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsCisgICAgbWVtY21wKGJ1ZmZlcl8sIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKSk7Cit9CisKKy8vIFRoaXMgdGVzdCBjYXVzZXMgZ2NjIDMuMy41IChhbmQgZWFybGllcj8pIHRvIGdpdmUgdGhlIGNyeXB0aWMgZXJyb3I6CisvLyAgICJzb3JyeSwgdW5pbXBsZW1lbnRlZDogYG1ldGhvZF9jYWxsX2V4cHInIG5vdCBzdXBwb3J0ZWQgYnkgZHVtcF9leHByIgorI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPiAzKQorCitpbnQzMiBrU2lnbkV4dGVuZGVkVmFyaW50Q2FzZXNbXSA9IHsKKyAgMCwgMSwgLTEsIDEyMzc4OTQsIC0zNzg5NTEzOAorfTsKKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFdyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQsCisgICAgICAgIGtTaWduRXh0ZW5kZWRWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0KTsKKworICAgIGNvZGVkX291dHB1dC5Xcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkKGtTaWduRXh0ZW5kZWRWYXJpbnRDYXNlc19jYXNlKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfb3V0cHV0LkhhZEVycm9yKCkpOworCisgICAgaWYgKGtTaWduRXh0ZW5kZWRWYXJpbnRDYXNlc19jYXNlIDwgMCkgeworICAgICAgRVhQRUNUX0VRKDEwLCBjb2RlZF9vdXRwdXQuQnl0ZUNvdW50KCkpOworICAgIH0gZWxzZSB7CisgICAgICBFWFBFQ1RfTEUoY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpLCA1KTsKKyAgICB9CisgIH0KKworICBpZiAoa1NpZ25FeHRlbmRlZFZhcmludENhc2VzX2Nhc2UgPCAwKSB7CisgICAgRVhQRUNUX0VRKDEwLCBvdXRwdXQuQnl0ZUNvdW50KCkpOworICB9IGVsc2UgeworICAgIEVYUEVDVF9MRShvdXRwdXQuQnl0ZUNvdW50KCksIDUpOworICB9CisKKyAgLy8gUmVhZCB2YWx1ZSBiYWNrIGluIGFzIGEgdmFyaW50NjQgYW5kIGluc3VyZSBpdCBtYXRjaGVzLgorICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkVmFyaW50NjQoJnZhbHVlKSk7CisKKyAgICBFWFBFQ1RfRVEoa1NpZ25FeHRlbmRlZFZhcmludENhc2VzX2Nhc2UsIHN0YXRpY19jYXN0PGludDY0Pih2YWx1ZSkpOworICB9CisKKyAgRVhQRUNUX0VRKG91dHB1dC5CeXRlQ291bnQoKSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCisjZW5kaWYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWYXJpbnQgZmFpbHVyZSB0ZXN0LgorCitzdHJ1Y3QgVmFyaW50RXJyb3JDYXNlIHsKKyAgdWludDggYnl0ZXNbMTJdOworICBpbnQgc2l6ZTsKKyAgYm9vbCBjYW5fcGFyc2U7Cit9OworCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFZhcmludEVycm9yQ2FzZSYgYykgeworICByZXR1cm4gb3MgPDwgInNpemUgIiA8PCBjLnNpemU7Cit9CisKK2NvbnN0IFZhcmludEVycm9yQ2FzZSBrVmFyaW50RXJyb3JDYXNlc1tdID0geworICAvLyBDb250cm9sIGNhc2UuICAoSW5zdXJlcyB0aGF0IHRoZXJlIGlzbid0IHNvbWV0aGluZyBlbHNlIHdyb25nIHRoYXQKKyAgLy8gbWFrZXMgcGFyc2luZyBhbHdheXMgZmFpbC4pCisgIHt7MHgwMH0sIDEsIHRydWV9LAorCisgIC8vIE5vIGlucHV0IGRhdGEuCisgIHt7fSwgMCwgZmFsc2V9LAorCisgIC8vIElucHV0IGVuZHMgdW5leHBlY3RlZGx5LgorICB7ezB4ZjAsIDB4YWJ9LCAyLCBmYWxzZX0sCisKKyAgLy8gSW5wdXQgZW5kcyB1bmV4cGVjdGVkbHkgYWZ0ZXIgMzIgYml0cy4KKyAge3sweGYwLCAweGFiLCAweGM5LCAweDlhLCAweGY4LCAweGIyfSwgNiwgZmFsc2V9LAorCisgIC8vIExvbmdlciB0aGFuIDEwIGJ5dGVzLgorICB7ezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDF9LAorICAgMTEsIGZhbHNlfSwKK307CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkVmFyaW50MzJFcnJvciwga1ZhcmludEVycm9yQ2FzZXMsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLnNpemUpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIGtWYXJpbnRFcnJvckNhc2VzX2Nhc2Uuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgIHVpbnQzMiB2YWx1ZTsKKyAgRVhQRUNUX0VRKGtWYXJpbnRFcnJvckNhc2VzX2Nhc2UuY2FuX3BhcnNlLCBjb2RlZF9pbnB1dC5SZWFkVmFyaW50MzIoJnZhbHVlKSk7Cit9CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkVmFyaW50NjRFcnJvciwga1ZhcmludEVycm9yQ2FzZXMsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLnNpemUpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIGtWYXJpbnRFcnJvckNhc2VzX2Nhc2Uuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgIHVpbnQ2NCB2YWx1ZTsKKyAgRVhQRUNUX0VRKGtWYXJpbnRFcnJvckNhc2VzX2Nhc2UuY2FuX3BhcnNlLCBjb2RlZF9pbnB1dC5SZWFkVmFyaW50NjQoJnZhbHVlKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhcmludFNpemUKKworc3RydWN0IFZhcmludFNpemVDYXNlIHsKKyAgdWludDY0IHZhbHVlOworICBpbnQgc2l6ZTsKK307CisKK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVmFyaW50U2l6ZUNhc2UmIGMpIHsKKyAgcmV0dXJuIG9zIDw8IGMudmFsdWU7Cit9CisKK1ZhcmludFNpemVDYXNlIGtWYXJpbnRTaXplQ2FzZXNbXSA9IHsKKyAgezB1LCAxfSwKKyAgezF1LCAxfSwKKyAgezEyN3UsIDF9LAorICB7MTI4dSwgMn0sCisgIHs3NTg5MjN1LCAzfSwKKyAgezQwMDAwMDAwMDB1LCA1fSwKKyAge1VMTCg0MTI1NjIwMjU4MDcxODMzNiksIDh9LAorICB7VUxMKDExOTY0Mzc4MzMwOTc4NzM1MTMxKSwgMTB9LAorfTsKKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFZhcmludFNpemUzMiwga1ZhcmludFNpemVDYXNlcykgeworICBpZiAoa1ZhcmludFNpemVDYXNlc19jYXNlLnZhbHVlID4gMHhmZmZmZmZmZnUpIHsKKyAgICAvLyBTa2lwIDY0LWJpdCB2YWx1ZXMuCisgICAgcmV0dXJuOworICB9CisKKyAgRVhQRUNUX0VRKGtWYXJpbnRTaXplQ2FzZXNfY2FzZS5zaXplLAorICAgIENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICBzdGF0aWNfY2FzdDx1aW50MzI+KGtWYXJpbnRTaXplQ2FzZXNfY2FzZS52YWx1ZSkpKTsKK30KKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFZhcmludFNpemU2NCwga1ZhcmludFNpemVDYXNlcykgeworICBFWFBFQ1RfRVEoa1ZhcmludFNpemVDYXNlc19jYXNlLnNpemUsCisgICAgQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NChrVmFyaW50U2l6ZUNhc2VzX2Nhc2UudmFsdWUpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRml4ZWQtc2l6ZSBpbnQgdGVzdHMKKworc3RydWN0IEZpeGVkMzJDYXNlIHsKKyAgdWludDggYnl0ZXNbc2l6ZW9mKHVpbnQzMildOyAgICAgICAgICAvLyBFbmNvZGVkIGJ5dGVzLgorICB1aW50MzIgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlZCB2YWx1ZS4KK307CisKK3N0cnVjdCBGaXhlZDY0Q2FzZSB7CisgIHVpbnQ4IGJ5dGVzW3NpemVvZih1aW50NjQpXTsgICAgICAgICAgLy8gRW5jb2RlZCBieXRlcy4KKyAgdWludDY0IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZWQgdmFsdWUuCit9OworCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEZpeGVkMzJDYXNlJiBjKSB7CisgIHJldHVybiBvcyA8PCAiMHgiIDw8IGhleCA8PCBjLnZhbHVlIDw8IGRlYzsKK30KKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBGaXhlZDY0Q2FzZSYgYykgeworICByZXR1cm4gb3MgPDwgIjB4IiA8PCBoZXggPDwgYy52YWx1ZSA8PCBkZWM7Cit9CisKK0ZpeGVkMzJDYXNlIGtGaXhlZDMyQ2FzZXNbXSA9IHsKKyAge3sweGVmLCAweGNkLCAweGFiLCAweDkwfSwgMHg5MGFiY2RlZnV9LAorICB7ezB4MTIsIDB4MzQsIDB4NTYsIDB4Nzh9LCAweDc4NTYzNDEydX0sCit9OworCitGaXhlZDY0Q2FzZSBrRml4ZWQ2NENhc2VzW10gPSB7CisgIHt7MHhlZiwgMHhjZCwgMHhhYiwgMHg5MCwgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OH0sIFVMTCgweDc4NTYzNDEyOTBhYmNkZWYpfSwKKyAge3sweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4fSwgVUxMKDB4ODg3NzY2NTU0NDMzMjIxMSl9LAorfTsKKworVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRMaXR0bGVFbmRpYW4zMiwga0ZpeGVkMzJDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtGaXhlZDMyQ2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKGtGaXhlZDMyQ2FzZXNfY2FzZS5ieXRlcykpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHVpbnQzMiB2YWx1ZTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKGtGaXhlZDMyQ2FzZXNfY2FzZS52YWx1ZSwgdmFsdWUpOworICB9CisKKyAgRVhQRUNUX0VRKHNpemVvZih1aW50MzIpLCBpbnB1dC5CeXRlQ291bnQoKSk7Cit9CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkTGl0dGxlRW5kaWFuNjQsIGtGaXhlZDY0Q2FzZXMsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrRml4ZWQ2NENhc2VzX2Nhc2UuYnl0ZXMsIHNpemVvZihrRml4ZWQ2NENhc2VzX2Nhc2UuYnl0ZXMpKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICB1aW50NjQgdmFsdWU7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjY0KCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUShrRml4ZWQ2NENhc2VzX2Nhc2UudmFsdWUsIHZhbHVlKTsKKyAgfQorCisgIEVYUEVDVF9FUShzaXplb2YodWludDY0KSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgV3JpdGVMaXR0bGVFbmRpYW4zMiwga0ZpeGVkMzJDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0KTsKKworICAgIGNvZGVkX291dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKGtGaXhlZDMyQ2FzZXNfY2FzZS52YWx1ZSk7CisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX291dHB1dC5IYWRFcnJvcigpKTsKKworICAgIEVYUEVDVF9FUShzaXplb2YodWludDMyKSwgY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgfQorCisgIEVYUEVDVF9FUShzaXplb2YodWludDMyKSwgb3V0cHV0LkJ5dGVDb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lbWNtcChidWZmZXJfLCBrRml4ZWQzMkNhc2VzX2Nhc2UuYnl0ZXMsIHNpemVvZih1aW50MzIpKSk7Cit9CisKK1RFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBXcml0ZUxpdHRsZUVuZGlhbjY0LCBrRml4ZWQ2NENhc2VzLCBrQmxvY2tTaXplcykgeworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXQpOworCisgICAgY29kZWRfb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuNjQoa0ZpeGVkNjRDYXNlc19jYXNlLnZhbHVlKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfb3V0cHV0LkhhZEVycm9yKCkpOworCisgICAgRVhQRUNUX0VRKHNpemVvZih1aW50NjQpLCBjb2RlZF9vdXRwdXQuQnl0ZUNvdW50KCkpOworICB9CisKKyAgRVhQRUNUX0VRKHNpemVvZih1aW50NjQpLCBvdXRwdXQuQnl0ZUNvdW50KCkpOworICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJ1ZmZlcl8sIGtGaXhlZDY0Q2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKHVpbnQ2NCkpKTsKK30KKworLy8gVGVzdHMgdXNpbmcgdGhlIHN0YXRpYyBtZXRob2RzIHRvIHJlYWQgZml4ZWQtc2l6ZSB2YWx1ZXMgZnJvbSByYXcgYXJyYXlzLgorCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZExpdHRsZUVuZGlhbjMyRnJvbUFycmF5LCBrRml4ZWQzMkNhc2VzKSB7CisgIG1lbWNweShidWZmZXJfLCBrRml4ZWQzMkNhc2VzX2Nhc2UuYnl0ZXMsIHNpemVvZihrRml4ZWQzMkNhc2VzX2Nhc2UuYnl0ZXMpKTsKKworICB1aW50MzIgdmFsdWU7CisgIGNvbnN0IHVpbnQ4KiBlbmQgPSBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkoCisgICAgICBidWZmZXJfLCAmdmFsdWUpOworICBFWFBFQ1RfRVEoa0ZpeGVkMzJDYXNlc19jYXNlLnZhbHVlLCB2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGVuZCA9PSBidWZmZXJfICsgc2l6ZW9mKHZhbHVlKSk7Cit9CisKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkTGl0dGxlRW5kaWFuNjRGcm9tQXJyYXksIGtGaXhlZDY0Q2FzZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtGaXhlZDY0Q2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKGtGaXhlZDY0Q2FzZXNfY2FzZS5ieXRlcykpOworCisgIHVpbnQ2NCB2YWx1ZTsKKyAgY29uc3QgdWludDgqIGVuZCA9IENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheSgKKyAgICAgIGJ1ZmZlcl8sICZ2YWx1ZSk7CisgIEVYUEVDVF9FUShrRml4ZWQ2NENhc2VzX2Nhc2UudmFsdWUsIHZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoZW5kID09IGJ1ZmZlcl8gKyBzaXplb2YodmFsdWUpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmF3IHJlYWRzIGFuZCB3cml0ZXMKKworY29uc3QgY2hhciBrUmF3Qnl0ZXNbXSA9ICJTb21lIGJ5dGVzIHdoaWNoIHdpbGwgYmUgd3JpdHRlbiBhbmQgcmVhZCByYXcuIjsKKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRSYXcsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworICBjaGFyIHJlYWRfYnVmZmVyW3NpemVvZihrUmF3Qnl0ZXMpXTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFJhdyhyZWFkX2J1ZmZlciwgc2l6ZW9mKGtSYXdCeXRlcykpKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGtSYXdCeXRlcywgcmVhZF9idWZmZXIsIHNpemVvZihrUmF3Qnl0ZXMpKSk7CisgIH0KKworICBFWFBFQ1RfRVEoc2l6ZW9mKGtSYXdCeXRlcyksIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFdyaXRlUmF3LCBrQmxvY2tTaXplcykgeworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXQpOworCisgICAgY29kZWRfb3V0cHV0LldyaXRlUmF3KGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9vdXRwdXQuSGFkRXJyb3IoKSk7CisKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mKGtSYXdCeXRlcyksIGNvZGVkX291dHB1dC5CeXRlQ291bnQoKSk7CisgIH0KKworICBFWFBFQ1RfRVEoc2l6ZW9mKGtSYXdCeXRlcyksIG91dHB1dC5CeXRlQ291bnQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZW1jbXAoYnVmZmVyXywga1Jhd0J5dGVzLCBzaXplb2Yoa1Jhd0J5dGVzKSkpOworfQorCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZywga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIHN0cmluZyBzdHI7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oa1Jhd0J5dGVzKSkpOworICAgIEVYUEVDVF9FUShrUmF3Qnl0ZXMsIHN0cik7CisgIH0KKworICBFWFBFQ1RfRVEoc3RybGVuKGtSYXdCeXRlcyksIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIFJlYWRTdHJpbmcgZG9lc24ndCBjcmFzaCBvbiBpbXBvc3NpYmx5IGxhcmdlIHN0cmluZ3MuCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ0ltcG9zc2libHlMYXJnZSwga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICBzdHJpbmcgc3RyOworICAgIC8vIFRyeSB0byByZWFkIGEgZ2lnYWJ5dGUuCisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMSA8PCAzMCkpOworICB9Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFJlYWRTdHJpbmdJbXBvc3NpYmx5TGFyZ2VGcm9tU3RyaW5nT25TdGFjaykgeworICAvLyBTYW1lIHRlc3QgYXMgYWJvdmUsIGV4Y2VwdCBkaXJlY3RseSB1c2UgYSBidWZmZXIuIFRoaXMgdXNlZCB0byBjYXVzZQorICAvLyBjcmFzaGVzIHdoaWxlIHRoZSBhYm92ZSBkaWQgbm90LgorICB1aW50OCBidWZmZXJbOF07CisgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoYnVmZmVyLCA4KTsKKyAgc3RyaW5nIHN0cjsKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMSA8PCAzMCkpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nSW1wb3NzaWJseUxhcmdlRnJvbVN0cmluZ09uSGVhcCkgeworICBzY29wZWRfYXJyYXk8dWludDg+IGJ1ZmZlcihuZXcgdWludDhbOF0pOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KGJ1ZmZlci5nZXQoKSwgOCk7CisgIHN0cmluZyBzdHI7CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDEgPDwgMzApKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTa2lwCisKK2NvbnN0IGNoYXIga1NraXBUZXN0Qnl0ZXNbXSA9CisgICI8QmVmb3JlIHNraXBwaW5nPjxUbyBiZSBza2lwcGVkPjxBZnRlciBza2lwcGluZz4iOworY29uc3QgY2hhciBrU2tpcE91dHB1dFRlc3RCeXRlc1tdID0KKyAgIi0tLS0tLS0tLS0tLS0tLS0tPFRvIGJlIHNraXBwZWQ+LS0tLS0tLS0tLS0tLS0tLSI7CisKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBTa2lwSW5wdXQsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrU2tpcFRlc3RCeXRlcywgc2l6ZW9mKGtTa2lwVGVzdEJ5dGVzKSk7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgICAgc3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbigiPEJlZm9yZSBza2lwcGluZz4iKSkpOworICAgIEVYUEVDVF9FUSgiPEJlZm9yZSBza2lwcGluZz4iLCBzdHIpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlNraXAoc3RybGVuKCI8VG8gYmUgc2tpcHBlZD4iKSkpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgc3RybGVuKCI8QWZ0ZXIgc2tpcHBpbmc+IikpKTsKKyAgICBFWFBFQ1RfRVEoIjxBZnRlciBza2lwcGluZz4iLCBzdHIpOworICB9CisKKyAgRVhQRUNUX0VRKHN0cmxlbihrU2tpcFRlc3RCeXRlcyksIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR2V0RGlyZWN0QnVmZmVyUG9pbnRlcgorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBHZXREaXJlY3RCdWZmZXJQb2ludGVySW5wdXQpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDgpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgY29uc3Qgdm9pZCogcHRyOworICBpbnQgc2l6ZTsKKworICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVyKCZwdHIsICZzaXplKSk7CisgIEVYUEVDVF9FUShidWZmZXJfLCBwdHIpOworICBFWFBFQ1RfRVEoOCwgc2l6ZSk7CisKKyAgLy8gUGVla2luZyBhZ2FpbiBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHBvaW50ZXIuCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXIoJnB0ciwgJnNpemUpKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8sIHB0cik7CisgIEVYUEVDVF9FUSg4LCBzaXplKTsKKworICAvLyBTa2lwIGZvcndhcmQgaW4gdGhlIHNhbWUgYnVmZmVyIHRoZW4gcGVlayBhZ2Fpbi4KKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuU2tpcCgzKSk7CisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXIoJnB0ciwgJnNpemUpKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8gKyAzLCBwdHIpOworICBFWFBFQ1RfRVEoNSwgc2l6ZSk7CisKKyAgLy8gU2tpcCB0byBlbmQgb2YgYnVmZmVyIGFuZCBwZWVrIC0tIHNob3VsZCBnZXQgbmV4dCBidWZmZXIuCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlNraXAoNSkpOworICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVyKCZwdHIsICZzaXplKSk7CisgIEVYUEVDVF9FUShidWZmZXJfICsgOCwgcHRyKTsKKyAgRVhQRUNUX0VRKDgsIHNpemUpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBHZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lSW5wdXQpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDgpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgY29uc3Qgdm9pZCogcHRyOworICBpbnQgc2l6ZTsKKworICBjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKCZwdHIsICZzaXplKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8sIHB0cik7CisgIEVYUEVDVF9FUSg4LCBzaXplKTsKKworICAvLyBQZWVraW5nIGFnYWluIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcG9pbnRlci4KKyAgY29kZWRfaW5wdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcklubGluZSgmcHRyLCAmc2l6ZSk7CisgIEVYUEVDVF9FUShidWZmZXJfLCBwdHIpOworICBFWFBFQ1RfRVEoOCwgc2l6ZSk7CisKKyAgLy8gU2tpcCBmb3J3YXJkIGluIHRoZSBzYW1lIGJ1ZmZlciB0aGVuIHBlZWsgYWdhaW4uCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlNraXAoMykpOworICBjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKCZwdHIsICZzaXplKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlcl8gKyAzLCBwdHIpOworICBFWFBFQ1RfRVEoNSwgc2l6ZSk7CisKKyAgLy8gU2tpcCB0byBlbmQgb2YgYnVmZmVyIGFuZCBwZWVrIC0tIHNob3VsZCByZXR1cm4gZmFsc2UgYW5kIHByb3ZpZGUgYW4gZW1wdHkKKyAgLy8gYnVmZmVyLiBJdCBkb2VzIG5vdCB0cnkgdG8gUmVmcmVzaCgpLgorICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5Ta2lwKDUpKTsKKyAgY29kZWRfaW5wdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcklubGluZSgmcHRyLCAmc2l6ZSk7CisgIEVYUEVDVF9FUShidWZmZXJfICsgOCwgcHRyKTsKKyAgRVhQRUNUX0VRKDAsIHNpemUpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBHZXREaXJlY3RCdWZmZXJQb2ludGVyT3V0cHV0KSB7CisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDgpOworICBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dCk7CisKKyAgdm9pZCogcHRyOworICBpbnQgc2l6ZTsKKworICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoYnVmZmVyXywgcHRyKTsKKyAgRVhQRUNUX0VRKDgsIHNpemUpOworCisgIC8vIFBlZWtpbmcgYWdhaW4gc2hvdWxkIHJldHVybiB0aGUgc2FtZSBwb2ludGVyLgorICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoYnVmZmVyXywgcHRyKTsKKyAgRVhQRUNUX0VRKDgsIHNpemUpOworCisgIC8vIFNraXAgZm9yd2FyZCBpbiB0aGUgc2FtZSBidWZmZXIgdGhlbiBwZWVrIGFnYWluLgorICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuU2tpcCgzKSk7CisgIEVYUEVDVF9UUlVFKGNvZGVkX291dHB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVyKCZwdHIsICZzaXplKSk7CisgIEVYUEVDVF9FUShidWZmZXJfICsgMywgcHRyKTsKKyAgRVhQRUNUX0VRKDUsIHNpemUpOworCisgIC8vIFNraXAgdG8gZW5kIG9mIGJ1ZmZlciBhbmQgcGVlayAtLSBzaG91bGQgZ2V0IG5leHQgYnVmZmVyLgorICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuU2tpcCg1KSk7CisgIEVYUEVDVF9UUlVFKGNvZGVkX291dHB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVyKCZwdHIsICZzaXplKSk7CisgIEVYUEVDVF9FUShidWZmZXJfICsgOCwgcHRyKTsKKyAgRVhQRUNUX0VRKDgsIHNpemUpOworCisgIC8vIFNraXAgb3ZlciBtdWx0aXBsZSBidWZmZXJzLgorICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuU2tpcCgyMikpOworICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoYnVmZmVyXyArIDMwLCBwdHIpOworICBFWFBFQ1RfRVEoMiwgc2l6ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExpbWl0cworCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgQmFzaWNMaW1pdCwga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCg4KTsKKworICAgIC8vIFJlYWQgdW50aWwgd2UgaGl0IHRoZSBsaW1pdC4KKyAgICB1aW50MzIgdmFsdWU7CisgICAgRVhQRUNUX0VRKDgsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDQsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisKKyAgICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdCk7CisKKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgIH0KKworICBFWFBFQ1RfRVEoMTIsIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworLy8gVGVzdCB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBwdXNoIHR3byBsaW1pdHMgd2hlcmUgdGhlIHNlY29uZCAodG9wKSBvbmUgaXMKKy8vIHNob3J0ZXIuCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgU21hbGxMaW1pdE9uVG9wT2ZCaWdMaW1pdCwga0Jsb2NrU2l6ZXMpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdDEgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoOCk7CisgICAgRVhQRUNUX0VRKDgsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdDIgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoNCk7CisKKyAgICB1aW50MzIgdmFsdWU7CisKKyAgICAvLyBSZWFkIHVudGlsIHdlIGhpdCBsaW1pdDIsIHRoZSB0b3AgYW5kIHNob3J0ZXN0IGxpbWl0LgorICAgIEVYUEVDVF9FUSg0LCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworCisgICAgY29kZWRfaW5wdXQuUG9wTGltaXQobGltaXQyKTsKKworICAgIC8vIFJlYWQgdW50aWwgd2UgaGl0IGxpbWl0MS4KKyAgICBFWFBFQ1RfRVEoNCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKworICAgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0MSk7CisKKyAgICAvLyBObyBtb3JlIGxpbWl0cy4KKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgIH0KKworICBFWFBFQ1RfRVEoMTIsIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworLy8gVGVzdCB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBwdXNoIHR3byBsaW1pdHMgd2hlcmUgdGhlIHNlY29uZCAodG9wKSBvbmUgaXMKKy8vIGxvbmdlci4gIEluIHRoaXMgY2FzZSwgdGhlIHRvcCBsaW1pdCBpcyBzaG9ydGVuZWQgdG8gbWF0Y2ggdGhlIHByZXZpb3VzCisvLyBsaW1pdC4KK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBCaWdMaW1pdE9uVG9wT2ZTbWFsbExpbWl0LCBrQmxvY2tTaXplcykgeworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKworICAgIEVYUEVDVF9FUSgtMSwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0MSA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCg0KTsKKyAgICBFWFBFQ1RfRVEoNCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0MiA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCg4KTsKKworICAgIHVpbnQzMiB2YWx1ZTsKKworICAgIC8vIFJlYWQgdW50aWwgd2UgaGl0IGxpbWl0Mi4gIEV4Y2VwdCwgd2FpdCEgIGxpbWl0MSBpcyBzaG9ydGVyLCBzbworICAgIC8vIHdlIGVuZCB1cCBoaXR0aW5nIHRoYXQgZmlyc3QsIGRlc3BpdGUgaGF2aW5nIDQgYnl0ZXMgdG8gZ28gb24KKyAgICAvLyBsaW1pdDIuCisgICAgRVhQRUNUX0VRKDQsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOworICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7CisKKyAgICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdDIpOworCisgICAgLy8gT0ssIHBvcHBlZCBsaW1pdDIsIG5vdyBsaW1pdDEgaXMgb24gdG9wLCB3aGljaCB3ZSd2ZSBhbHJlYWR5IGhpdC4KKyAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKworICAgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0MSk7CisKKyAgICAvLyBObyBtb3JlIGxpbWl0cy4KKyAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7CisgIH0KKworICBFWFBFQ1RfRVEoOCwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBFeHBlY3RBdEVuZCkgeworICAvLyBUZXN0IEV4cGVjdEF0RW5kKCksIHdoaWNoIGlzIGJhc2VkIG9uIGxpbWl0cy4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkV4cGVjdEF0RW5kKCkpOworCisgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gY29kZWRfaW5wdXQuUHVzaExpbWl0KDQpOworCisgIHVpbnQzMiB2YWx1ZTsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOworICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5FeHBlY3RBdEVuZCgpKTsKKworICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdCk7CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5FeHBlY3RBdEVuZCgpKTsKK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgTmVnYXRpdmVMaW1pdCkgeworICAvLyBDaGVjayB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBwdXNoIGEgbmVnYXRpdmUgbGltaXQuCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gY29kZWRfaW5wdXQuUHVzaExpbWl0KC0xMjM0KTsKKyAgLy8gQnl0ZXNVbnRpbExpbWl0KCkgcmV0dXJucyAtMSB0byBtZWFuICJubyBsaW1pdCIsIHdoaWNoIGFjdHVhbGx5IG1lYW5zCisgIC8vICJ0aGUgbGltaXQgaXMgSU5UX01BWCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0iLgorICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgY29kZWRfaW5wdXQuUG9wTGltaXQobGltaXQpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBOZWdhdGl2ZUxpbWl0QWZ0ZXJSZWFkaW5nKSB7CisgIC8vIENoZWNrIHdoYXQgaGFwcGVucyB3aGVuIHdlIHB1c2ggYSBuZWdhdGl2ZSBsaW1pdC4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOworICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisgIEFTU0VSVF9UUlVFKGNvZGVkX2lucHV0LlNraXAoMTI4KSk7CisKKyAgQ29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoLTY0KTsKKyAgLy8gQnl0ZXNVbnRpbExpbWl0KCkgcmV0dXJucyAtMSB0byBtZWFuICJubyBsaW1pdCIsIHdoaWNoIGFjdHVhbGx5IG1lYW5zCisgIC8vICJ0aGUgbGltaXQgaXMgSU5UX01BWCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0iLgorICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKKyAgY29kZWRfaW5wdXQuUG9wTGltaXQobGltaXQpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBPdmVyZmxvd0xpbWl0KSB7CisgIC8vIENoZWNrIHdoYXQgaGFwcGVucyB3aGVuIHdlIHB1c2ggYSBsaW1pdCBsYXJnZSBlbm91Z2ggdGhhdCBpdHMgYWJzb2x1dGUKKyAgLy8gcG9zaXRpb24gaXMgbW9yZSB0aGFuIDJHQiBpbnRvIHRoZSBzdHJlYW0uCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworICBBU1NFUlRfVFJVRShjb2RlZF9pbnB1dC5Ta2lwKDEyOCkpOworCisgIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gY29kZWRfaW5wdXQuUHVzaExpbWl0KElOVF9NQVgpOworICAvLyBCeXRlc1VudGlsTGltaXQoKSByZXR1cm5zIC0xIHRvIG1lYW4gIm5vIGxpbWl0Iiwgd2hpY2ggYWN0dWFsbHkgbWVhbnMKKyAgLy8gInRoZSBsaW1pdCBpcyBJTlRfTUFYIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSIuCisgIEVYUEVDVF9FUSgtMSwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOworICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdCk7Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFRvdGFsQnl0ZXNMaW1pdCkgeworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7CisgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgY29kZWRfaW5wdXQuU2V0VG90YWxCeXRlc0xpbWl0KDE2LCAtMSk7CisKKyAgc3RyaW5nIHN0cjsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxNikpOworCisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGVycm9yX2xvZzsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxKSk7CisgICAgZXJyb3JzID0gZXJyb3JfbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKyAgfQorCisgIEFTU0VSVF9FUSgxLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywKKyAgICAiQSBwcm90b2NvbCBtZXNzYWdlIHdhcyByZWplY3RlZCBiZWNhdXNlIGl0IHdhcyB0b28gYmlnIiwgZXJyb3JzWzBdKTsKKworICBjb2RlZF9pbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQoMzIsIC0xKTsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxNikpOworfQorCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBUb3RhbEJ5dGVzTGltaXROb3RWYWxpZE1lc3NhZ2VFbmQpIHsKKyAgLy8gdG90YWxfYnl0ZXNfbGltaXRfIGlzIG5vdCBhIHZhbGlkIHBsYWNlIGZvciBhIG1lc3NhZ2UgdG8gZW5kLgorCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pKTsKKyAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworCisgIC8vIFNldCBib3RoIHRvdGFsX2J5dGVzX2xpbWl0IGFuZCBhIHJlZ3VsYXIgbGltaXQgYXQgMTYgYnl0ZXMuCisgIGNvZGVkX2lucHV0LlNldFRvdGFsQnl0ZXNMaW1pdCgxNiwgLTEpOworICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCgxNik7CisKKyAgLy8gUmVhZCAxNiBieXRlcy4KKyAgc3RyaW5nIHN0cjsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxNikpOworCisgIC8vIFJlYWQgYSB0YWcuICBTaG91bGQgZmFpbCwgYnV0IHJlcG9ydCBiZWluZyBhIHZhbGlkIGVuZHBvaW50IHNpbmNlIGl0J3MKKyAgLy8gYSByZWd1bGFyIGxpbWl0LgorICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuUmVhZFRhZygpKTsKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpOworCisgIC8vIFBvcCB0aGUgbGltaXQuCisgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0KTsKKworICAvLyBSZWFkIGEgdGFnLiAgU2hvdWxkIGZhaWwsIGFuZCByZXBvcnQgKm5vdCogYmVpbmcgYSB2YWxpZCBlbmRwb2ludCwgc2luY2UKKyAgLy8gdGhpcyB0aW1lIHdlJ3JlIGhpdHRpbmcgdGhlIHRvdGFsIGJ5dGVzIGxpbWl0LgorICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuUmVhZFRhZygpKTsKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKK30KKworCitURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWN1cnNpb25MaW1pdCkgeworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7CisgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgY29kZWRfaW5wdXQuU2V0UmVjdXJzaW9uTGltaXQoNCk7CisKKyAgLy8gVGhpcyBpcyB3YXkgdG9vIG11Y2ggdGVzdGluZyBmb3IgYSBjb3VudGVyLgorICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgICAvLyAxCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgIC8vIDIKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAgLy8gMworICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgICAvLyA0CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgIC8vIDUKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgLy8gNgorICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAgICAvLyA1CisgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgIC8vIDYKKyAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgICAgLy8gNQorICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAgICAvLyA0CisgIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgICAgIC8vIDMKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAgLy8gNAorICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAvLyA1CisgIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgICAgIC8vIDQKKyAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgICAgLy8gMworICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAgICAvLyAyCisgIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgICAgLy8gMAorICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAgICAvLyAwCisgIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgICAgIC8vIDAKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAgLy8gMQorICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgICAvLyAyCisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgIC8vIDMKKyAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAgLy8gNAorICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAvLyA1CisKKyAgY29kZWRfaW5wdXQuU2V0UmVjdXJzaW9uTGltaXQoNik7CisgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgIC8vIDYKKyAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgLy8gNworfQorCitjbGFzcyBSZWFsbHlCaWdJbnB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIFJlYWxseUJpZ0lucHV0U3RyZWFtKCkgOiBiYWNrdXBfYW1vdW50XygwKSwgYnVmZmVyX2NvdW50XygwKSB7fQorICB+UmVhbGx5QmlnSW5wdXRTdHJlYW0oKSB7fQorCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgICAgLy8gV2Ugb25seSBleHBlY3QgQmFja1VwKCkgdG8gYmUgY2FsbGVkIGF0IHRoZSBlbmQuCisgICAgRVhQRUNUX0VRKDAsIGJhY2t1cF9hbW91bnRfKTsKKworICAgIHN3aXRjaCAoYnVmZmVyX2NvdW50XysrKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgICpkYXRhID0gYnVmZmVyXzsKKyAgICAgICAgKnNpemUgPSBzaXplb2YoYnVmZmVyXyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSAxOgorICAgICAgICAvLyBSZXR1cm4gYW4gZW5vcm1vdXNseSBsYXJnZSBidWZmZXIgdGhhdCwgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSAxaworICAgICAgICAvLyByZXR1cm5lZCBhbHJlYWR5LCBzaG91bGQgb3ZlcmZsb3cgdGhlIHRvdGFsX2J5dGVzX3JlYWRfIGNvdW50ZXIgaW4KKyAgICAgICAgLy8gQ29kZWRJbnB1dFN0cmVhbS4gIE5vdGUgdGhhdCB3ZSdsbCBvbmx5IHJlYWQgdGhlIGZpcnN0IDEwMjQgYnl0ZXMKKyAgICAgICAgLy8gb2YgdGhpcyBidWZmZXIgc28gaXQncyBPSyB0aGF0IHdlIGhhdmUgaXQgcG9pbnQgYXQgYnVmZmVyXy4KKyAgICAgICAgKmRhdGEgPSBidWZmZXJfOworICAgICAgICAqc2l6ZSA9IElOVF9NQVg7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHZvaWQgQmFja1VwKGludCBjb3VudCkgeworICAgIGJhY2t1cF9hbW91bnRfID0gY291bnQ7CisgIH0KKworICBib29sIFNraXAoaW50IGNvdW50KSAgICB7IEdPT0dMRV9MT0coRkFUQUwpIDw8ICJOb3QgaW1wbGVtZW50ZWQuIjsgcmV0dXJuIGZhbHNlOyB9CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0IHsgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vdCBpbXBsZW1lbnRlZC4iOyByZXR1cm4gMDsgfQorCisgIGludCBiYWNrdXBfYW1vdW50XzsKKworIHByaXZhdGU6CisgIGNoYXIgYnVmZmVyX1sxMDI0XTsKKyAgaW50NjQgYnVmZmVyX2NvdW50XzsKK307CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIElucHV0T3ZlcjJHKSB7CisgIC8vIENvZGVkSW5wdXRTdHJlYW0gc2hvdWxkIGdyYWNlZnVsbHkgaGFuZGxlIGlucHV0IG92ZXIgMkcgYW5kIGNhbGwKKyAgLy8gaW5wdXQuQmFja1VwKCkgd2l0aCB0aGUgY29ycmVjdCBudW1iZXIgb2YgYnl0ZXMgb24gZGVzdHJ1Y3Rpb24uCisgIFJlYWxseUJpZ0lucHV0U3RyZWFtIGlucHV0OworCisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGVycm9yX2xvZzsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisgICAgc3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDUxMikpOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMTAyNCkpOworICAgIGVycm9ycyA9IGVycm9yX2xvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKworICBFWFBFQ1RfRVEoSU5UX01BWCAtIDUxMiwgaW5wdXQuYmFja3VwX2Ftb3VudF8pOworICBFWFBFQ1RfRVEoMCwgZXJyb3JzLnNpemUoKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWZmODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5jYwpAQCAtMCwwICsxLDMzNSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBicmlhbm9sc29uQGdvb2dsZS5jb20gKEJyaWFuIE9sc29uKQorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgY2xhc3NlcyBHemlwSW5wdXRTdHJlYW0gYW5kCisvLyBHemlwT3V0cHV0U3RyZWFtLgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX1pMSUIKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdEJ1ZmZlclNpemUgPSA2NTUzNjsKKworR3ppcElucHV0U3RyZWFtOjpHemlwSW5wdXRTdHJlYW0oCisgICAgWmVyb0NvcHlJbnB1dFN0cmVhbSogc3ViX3N0cmVhbSwgRm9ybWF0IGZvcm1hdCwgaW50IGJ1ZmZlcl9zaXplKQorICAgIDogZm9ybWF0Xyhmb3JtYXQpLCBzdWJfc3RyZWFtXyhzdWJfc3RyZWFtKSwgemVycm9yXyhaX09LKSB7CisgIHpjb250ZXh0Xy56YWxsb2MgPSBaX05VTEw7CisgIHpjb250ZXh0Xy56ZnJlZSA9IFpfTlVMTDsKKyAgemNvbnRleHRfLm9wYXF1ZSA9IFpfTlVMTDsKKyAgemNvbnRleHRfLnRvdGFsX291dCA9IDA7CisgIHpjb250ZXh0Xy5uZXh0X2luID0gTlVMTDsKKyAgemNvbnRleHRfLmF2YWlsX2luID0gMDsKKyAgemNvbnRleHRfLnRvdGFsX2luID0gMDsKKyAgemNvbnRleHRfLm1zZyA9IE5VTEw7CisgIGlmIChidWZmZXJfc2l6ZSA9PSAtMSkgeworICAgIG91dHB1dF9idWZmZXJfbGVuZ3RoXyA9IGtEZWZhdWx0QnVmZmVyU2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBvdXRwdXRfYnVmZmVyX2xlbmd0aF8gPSBidWZmZXJfc2l6ZTsKKyAgfQorICBvdXRwdXRfYnVmZmVyXyA9IG9wZXJhdG9yIG5ldyhvdXRwdXRfYnVmZmVyX2xlbmd0aF8pOworICBHT09HTEVfQ0hFQ0sob3V0cHV0X2J1ZmZlcl8gIT0gTlVMTCk7CisgIHpjb250ZXh0Xy5uZXh0X291dCA9IHN0YXRpY19jYXN0PEJ5dGVmKj4ob3V0cHV0X2J1ZmZlcl8pOworICB6Y29udGV4dF8uYXZhaWxfb3V0ID0gb3V0cHV0X2J1ZmZlcl9sZW5ndGhfOworICBvdXRwdXRfcG9zaXRpb25fID0gb3V0cHV0X2J1ZmZlcl87Cit9CitHemlwSW5wdXRTdHJlYW06On5HemlwSW5wdXRTdHJlYW0oKSB7CisgIG9wZXJhdG9yIGRlbGV0ZShvdXRwdXRfYnVmZmVyXyk7CisgIHplcnJvcl8gPSBpbmZsYXRlRW5kKCZ6Y29udGV4dF8pOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbnRlcm5hbEluZmxhdGVJbml0MigKKyAgICB6X3N0cmVhbSogemNvbnRleHQsIEd6aXBJbnB1dFN0cmVhbTo6Rm9ybWF0IGZvcm1hdCkgeworICBpbnQgd2luZG93Qml0c0Zvcm1hdCA9IDA7CisgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBHemlwSW5wdXRTdHJlYW06OkdaSVA6IHdpbmRvd0JpdHNGb3JtYXQgPSAxNjsgYnJlYWs7CisgICAgY2FzZSBHemlwSW5wdXRTdHJlYW06OkFVVE86IHdpbmRvd0JpdHNGb3JtYXQgPSAzMjsgYnJlYWs7CisgICAgY2FzZSBHemlwSW5wdXRTdHJlYW06OlpMSUI6IHdpbmRvd0JpdHNGb3JtYXQgPSAwOyBicmVhazsKKyAgfQorICByZXR1cm4gaW5mbGF0ZUluaXQyKHpjb250ZXh0LCAvKiB3aW5kb3dCaXRzICovMTUgfCB3aW5kb3dCaXRzRm9ybWF0KTsKK30KKworaW50IEd6aXBJbnB1dFN0cmVhbTo6SW5mbGF0ZShpbnQgZmx1c2gpIHsKKyAgaWYgKCh6ZXJyb3JfID09IFpfT0spICYmICh6Y29udGV4dF8uYXZhaWxfb3V0ID09IDApKSB7CisgICAgLy8gcHJldmlvdXMgaW5mbGF0ZSBmaWxsZWQgb3V0cHV0IGJ1ZmZlci4gZG9uJ3QgY2hhbmdlIGlucHV0IHBhcmFtcyB5ZXQuCisgIH0gZWxzZSBpZiAoemNvbnRleHRfLmF2YWlsX2luID09IDApIHsKKyAgICBjb25zdCB2b2lkKiBpbjsKKyAgICBpbnQgaW5fc2l6ZTsKKyAgICBib29sIGZpcnN0ID0gemNvbnRleHRfLm5leHRfaW4gPT0gTlVMTDsKKyAgICBib29sIG9rID0gc3ViX3N0cmVhbV8tPk5leHQoJmluLCAmaW5fc2l6ZSk7CisgICAgaWYgKCFvaykgeworICAgICAgemNvbnRleHRfLm5leHRfb3V0ID0gTlVMTDsKKyAgICAgIHpjb250ZXh0Xy5hdmFpbF9vdXQgPSAwOworICAgICAgcmV0dXJuIFpfU1RSRUFNX0VORDsKKyAgICB9CisgICAgemNvbnRleHRfLm5leHRfaW4gPSBzdGF0aWNfY2FzdDxCeXRlZio+KGNvbnN0X2Nhc3Q8dm9pZCo+KGluKSk7CisgICAgemNvbnRleHRfLmF2YWlsX2luID0gaW5fc2l6ZTsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGludCBlcnJvciA9IGludGVybmFsSW5mbGF0ZUluaXQyKCZ6Y29udGV4dF8sIGZvcm1hdF8pOworICAgICAgaWYgKGVycm9yICE9IFpfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgfQorICAgIH0KKyAgfQorICB6Y29udGV4dF8ubmV4dF9vdXQgPSBzdGF0aWNfY2FzdDxCeXRlZio+KG91dHB1dF9idWZmZXJfKTsKKyAgemNvbnRleHRfLmF2YWlsX291dCA9IG91dHB1dF9idWZmZXJfbGVuZ3RoXzsKKyAgb3V0cHV0X3Bvc2l0aW9uXyA9IG91dHB1dF9idWZmZXJfOworICBpbnQgZXJyb3IgPSBpbmZsYXRlKCZ6Y29udGV4dF8sIGZsdXNoKTsKKyAgcmV0dXJuIGVycm9yOworfQorCit2b2lkIEd6aXBJbnB1dFN0cmVhbTo6RG9OZXh0T3V0cHV0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgKmRhdGEgPSBvdXRwdXRfcG9zaXRpb25fOworICAqc2l6ZSA9ICgodWludHB0cl90KXpjb250ZXh0Xy5uZXh0X291dCkgLSAoKHVpbnRwdHJfdClvdXRwdXRfcG9zaXRpb25fKTsKKyAgb3V0cHV0X3Bvc2l0aW9uXyA9IHpjb250ZXh0Xy5uZXh0X291dDsKK30KKworLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Jvb2wgR3ppcElucHV0U3RyZWFtOjpOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgYm9vbCBvayA9ICh6ZXJyb3JfID09IFpfT0spIHx8ICh6ZXJyb3JfID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHx8ICh6ZXJyb3JfID09IFpfQlVGX0VSUk9SKTsKKyAgaWYgKCghb2spIHx8ICh6Y29udGV4dF8ubmV4dF9vdXQgPT0gTlVMTCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHpjb250ZXh0Xy5uZXh0X291dCAhPSBvdXRwdXRfcG9zaXRpb25fKSB7CisgICAgRG9OZXh0T3V0cHV0KGRhdGEsIHNpemUpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmICh6ZXJyb3JfID09IFpfU1RSRUFNX0VORCkgeworICAgIGlmICh6Y29udGV4dF8ubmV4dF9vdXQgIT0gTlVMTCkgeworICAgICAgLy8gc3ViX3N0cmVhbV8gbWF5IGhhdmUgY29uY2F0ZW5hdGVkIHN0cmVhbXMgdG8gZm9sbG93CisgICAgICB6ZXJyb3JfID0gaW5mbGF0ZUVuZCgmemNvbnRleHRfKTsKKyAgICAgIGlmICh6ZXJyb3JfICE9IFpfT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgemVycm9yXyA9IGludGVybmFsSW5mbGF0ZUluaXQyKCZ6Y29udGV4dF8sIGZvcm1hdF8pOworICAgICAgaWYgKHplcnJvcl8gIT0gWl9PSykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICpkYXRhID0gTlVMTDsKKyAgICAgICpzaXplID0gMDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgemVycm9yXyA9IEluZmxhdGUoWl9OT19GTFVTSCk7CisgIGlmICgoemVycm9yXyA9PSBaX1NUUkVBTV9FTkQpICYmICh6Y29udGV4dF8ubmV4dF9vdXQgPT0gTlVMTCkpIHsKKyAgICAvLyBUaGUgdW5kZXJseWluZyBzdHJlYW0ncyBOZXh0IHJldHVybmVkIGZhbHNlIGluc2lkZSBJbmZsYXRlLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBvayA9ICh6ZXJyb3JfID09IFpfT0spIHx8ICh6ZXJyb3JfID09IFpfU1RSRUFNX0VORCkKKyAgICAgIHx8ICh6ZXJyb3JfID09IFpfQlVGX0VSUk9SKTsKKyAgaWYgKCFvaykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBEb05leHRPdXRwdXQoZGF0YSwgc2l6ZSk7CisgIHJldHVybiB0cnVlOworfQordm9pZCBHemlwSW5wdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKKyAgb3V0cHV0X3Bvc2l0aW9uXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG91dHB1dF9wb3NpdGlvbl8pIC0gY291bnQpOworfQorYm9vbCBHemlwSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIGNvbnN0IHZvaWQqIGRhdGE7CisgIGludCBzaXplOworICBib29sIG9rID0gTmV4dCgmZGF0YSwgJnNpemUpOworICB3aGlsZSAob2sgJiYgKHNpemUgPCBjb3VudCkpIHsKKyAgICBjb3VudCAtPSBzaXplOworICAgIG9rID0gTmV4dCgmZGF0YSwgJnNpemUpOworICB9CisgIGlmIChzaXplID4gY291bnQpIHsKKyAgICBCYWNrVXAoc2l6ZSAtIGNvdW50KTsKKyAgfQorICByZXR1cm4gb2s7Cit9CitpbnQ2NCBHemlwSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHpjb250ZXh0Xy50b3RhbF9vdXQgKworICAgICgoKHVpbnRwdHJfdCl6Y29udGV4dF8ubmV4dF9vdXQpIC0gKCh1aW50cHRyX3Qpb3V0cHV0X3Bvc2l0aW9uXykpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0d6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnM6Ok9wdGlvbnMoKQorICAgIDogZm9ybWF0KEdaSVApLAorICAgICAgYnVmZmVyX3NpemUoa0RlZmF1bHRCdWZmZXJTaXplKSwKKyAgICAgIGNvbXByZXNzaW9uX2xldmVsKFpfREVGQVVMVF9DT01QUkVTU0lPTiksCisgICAgICBjb21wcmVzc2lvbl9zdHJhdGVneShaX0RFRkFVTFRfU1RSQVRFR1kpIHt9CisKK0d6aXBPdXRwdXRTdHJlYW06Okd6aXBPdXRwdXRTdHJlYW0oWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN1Yl9zdHJlYW0pIHsKKyAgSW5pdChzdWJfc3RyZWFtLCBPcHRpb25zKCkpOworfQorCitHemlwT3V0cHV0U3RyZWFtOjpHemlwT3V0cHV0U3RyZWFtKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIEluaXQoc3ViX3N0cmVhbSwgb3B0aW9ucyk7Cit9CisKK0d6aXBPdXRwdXRTdHJlYW06Okd6aXBPdXRwdXRTdHJlYW0oCisgICAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN1Yl9zdHJlYW0sIEZvcm1hdCBmb3JtYXQsIGludCBidWZmZXJfc2l6ZSkgeworICBPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMuZm9ybWF0ID0gZm9ybWF0OworICBpZiAoYnVmZmVyX3NpemUgIT0gLTEpIHsKKyAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemU7CisgIH0KKyAgSW5pdChzdWJfc3RyZWFtLCBvcHRpb25zKTsKK30KKwordm9pZCBHemlwT3V0cHV0U3RyZWFtOjpJbml0KFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgc3ViX3N0cmVhbV8gPSBzdWJfc3RyZWFtOworICBzdWJfZGF0YV8gPSBOVUxMOworICBzdWJfZGF0YV9zaXplXyA9IDA7CisKKyAgaW5wdXRfYnVmZmVyX2xlbmd0aF8gPSBvcHRpb25zLmJ1ZmZlcl9zaXplOworICBpbnB1dF9idWZmZXJfID0gb3BlcmF0b3IgbmV3KGlucHV0X2J1ZmZlcl9sZW5ndGhfKTsKKyAgR09PR0xFX0NIRUNLKGlucHV0X2J1ZmZlcl8gIT0gTlVMTCk7CisKKyAgemNvbnRleHRfLnphbGxvYyA9IFpfTlVMTDsKKyAgemNvbnRleHRfLnpmcmVlID0gWl9OVUxMOworICB6Y29udGV4dF8ub3BhcXVlID0gWl9OVUxMOworICB6Y29udGV4dF8ubmV4dF9vdXQgPSBOVUxMOworICB6Y29udGV4dF8uYXZhaWxfb3V0ID0gMDsKKyAgemNvbnRleHRfLnRvdGFsX291dCA9IDA7CisgIHpjb250ZXh0Xy5uZXh0X2luID0gTlVMTDsKKyAgemNvbnRleHRfLmF2YWlsX2luID0gMDsKKyAgemNvbnRleHRfLnRvdGFsX2luID0gMDsKKyAgemNvbnRleHRfLm1zZyA9IE5VTEw7CisgIC8vIGRlZmF1bHQgdG8gR1pJUCBmb3JtYXQKKyAgaW50IHdpbmRvd0JpdHNGb3JtYXQgPSAxNjsKKyAgaWYgKG9wdGlvbnMuZm9ybWF0ID09IFpMSUIpIHsKKyAgICB3aW5kb3dCaXRzRm9ybWF0ID0gMDsKKyAgfQorICB6ZXJyb3JfID0gZGVmbGF0ZUluaXQyKAorICAgICAgJnpjb250ZXh0XywKKyAgICAgIG9wdGlvbnMuY29tcHJlc3Npb25fbGV2ZWwsCisgICAgICBaX0RFRkxBVEVELAorICAgICAgLyogd2luZG93Qml0cyAqLzE1IHwgd2luZG93Qml0c0Zvcm1hdCwKKyAgICAgIC8qIG1lbUxldmVsIChkZWZhdWx0KSAqLzgsCisgICAgICBvcHRpb25zLmNvbXByZXNzaW9uX3N0cmF0ZWd5KTsKK30KKworR3ppcE91dHB1dFN0cmVhbTo6fkd6aXBPdXRwdXRTdHJlYW0oKSB7CisgIENsb3NlKCk7CisgIGlmIChpbnB1dF9idWZmZXJfICE9IE5VTEwpIHsKKyAgICBvcGVyYXRvciBkZWxldGUoaW5wdXRfYnVmZmVyXyk7CisgIH0KK30KKworLy8gcHJpdmF0ZQoraW50IEd6aXBPdXRwdXRTdHJlYW06OkRlZmxhdGUoaW50IGZsdXNoKSB7CisgIGludCBlcnJvciA9IFpfT0s7CisgIGRvIHsKKyAgICBpZiAoKHN1Yl9kYXRhXyA9PSBOVUxMKSB8fCAoemNvbnRleHRfLmF2YWlsX291dCA9PSAwKSkgeworICAgICAgYm9vbCBvayA9IHN1Yl9zdHJlYW1fLT5OZXh0KCZzdWJfZGF0YV8sICZzdWJfZGF0YV9zaXplXyk7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIHN1Yl9kYXRhXyA9IE5VTEw7CisgICAgICAgIHN1Yl9kYXRhX3NpemVfID0gMDsKKyAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOworICAgICAgfQorICAgICAgR09PR0xFX0NIRUNLX0dUKHN1Yl9kYXRhX3NpemVfLCAwKTsKKyAgICAgIHpjb250ZXh0Xy5uZXh0X291dCA9IHN0YXRpY19jYXN0PEJ5dGVmKj4oc3ViX2RhdGFfKTsKKyAgICAgIHpjb250ZXh0Xy5hdmFpbF9vdXQgPSBzdWJfZGF0YV9zaXplXzsKKyAgICB9CisgICAgZXJyb3IgPSBkZWZsYXRlKCZ6Y29udGV4dF8sIGZsdXNoKTsKKyAgfSB3aGlsZSAoZXJyb3IgPT0gWl9PSyAmJiB6Y29udGV4dF8uYXZhaWxfb3V0ID09IDApOworICBpZiAoKGZsdXNoID09IFpfRlVMTF9GTFVTSCkgfHwgKGZsdXNoID09IFpfRklOSVNIKSkgeworICAgIC8vIE5vdGlmeSBsb3dlciBsYXllciBvZiBkYXRhLgorICAgIHN1Yl9zdHJlYW1fLT5CYWNrVXAoemNvbnRleHRfLmF2YWlsX291dCk7CisgICAgLy8gV2UgZG9uJ3Qgb3duIHRoZSBidWZmZXIgYW55bW9yZS4KKyAgICBzdWJfZGF0YV8gPSBOVUxMOworICAgIHN1Yl9kYXRhX3NpemVfID0gMDsKKyAgfQorICByZXR1cm4gZXJyb3I7Cit9CisKKy8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitib29sIEd6aXBPdXRwdXRTdHJlYW06Ok5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICBpZiAoKHplcnJvcl8gIT0gWl9PSykgJiYgKHplcnJvcl8gIT0gWl9CVUZfRVJST1IpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICh6Y29udGV4dF8uYXZhaWxfaW4gIT0gMCkgeworICAgIHplcnJvcl8gPSBEZWZsYXRlKFpfTk9fRkxVU0gpOworICAgIGlmICh6ZXJyb3JfICE9IFpfT0spIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgaWYgKHpjb250ZXh0Xy5hdmFpbF9pbiA9PSAwKSB7CisgICAgLy8gYWxsIGlucHV0IHdhcyBjb25zdW1lZC4gcmVzZXQgdGhlIGJ1ZmZlci4KKyAgICB6Y29udGV4dF8ubmV4dF9pbiA9IHN0YXRpY19jYXN0PEJ5dGVmKj4oaW5wdXRfYnVmZmVyXyk7CisgICAgemNvbnRleHRfLmF2YWlsX2luID0gaW5wdXRfYnVmZmVyX2xlbmd0aF87CisgICAgKmRhdGEgPSBpbnB1dF9idWZmZXJfOworICAgICpzaXplID0gaW5wdXRfYnVmZmVyX2xlbmd0aF87CisgIH0gZWxzZSB7CisgICAgLy8gVGhlIGxvb3AgaW4gRGVmbGF0ZSBzaG91bGQgY29uc3VtZSBhbGwgYXZhaWxfaW4KKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkRlZmxhdGUgbGVmdCBieXRlcyB1bmNvbnN1bWVkIjsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KK3ZvaWQgR3ppcE91dHB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgeworICBHT09HTEVfQ0hFQ0tfR0UoemNvbnRleHRfLmF2YWlsX2luLCBjb3VudCk7CisgIHpjb250ZXh0Xy5hdmFpbF9pbiAtPSBjb3VudDsKK30KK2ludDY0IEd6aXBPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHpjb250ZXh0Xy50b3RhbF9pbiArIHpjb250ZXh0Xy5hdmFpbF9pbjsKK30KKworYm9vbCBHemlwT3V0cHV0U3RyZWFtOjpGbHVzaCgpIHsKKyAgZG8geworICAgIHplcnJvcl8gPSBEZWZsYXRlKFpfRlVMTF9GTFVTSCk7CisgIH0gd2hpbGUgKHplcnJvcl8gPT0gWl9PSyk7CisgIHJldHVybiB6ZXJyb3JfID09IFpfT0s7Cit9CisKK2Jvb2wgR3ppcE91dHB1dFN0cmVhbTo6Q2xvc2UoKSB7CisgIGlmICgoemVycm9yXyAhPSBaX09LKSAmJiAoemVycm9yXyAhPSBaX0JVRl9FUlJPUikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZG8geworICAgIHplcnJvcl8gPSBEZWZsYXRlKFpfRklOSVNIKTsKKyAgfSB3aGlsZSAoemVycm9yXyA9PSBaX09LKTsKKyAgemVycm9yXyA9IGRlZmxhdGVFbmQoJnpjb250ZXh0Xyk7CisgIGJvb2wgb2sgPSB6ZXJyb3JfID09IFpfT0s7CisgIHplcnJvcl8gPSBaX1NUUkVBTV9FTkQ7CisgIHJldHVybiBvazsKK30KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBIQVZFX1pMSUIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZGJjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oCkBAIC0wLDAgKzEsMjA3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGJyaWFub2xzb25AZ29vZ2xlLmNvbSAoQnJpYW4gT2xzb24pCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIGZvciBjbGFzc2VzIEd6aXBJbnB1dFN0cmVhbSBhbmQKKy8vIEd6aXBPdXRwdXRTdHJlYW0uCisvLworLy8gR3ppcElucHV0U3RyZWFtIGRlY29tcHJlc3NlcyBkYXRhIGZyb20gYW4gdW5kZXJseWluZworLy8gWmVyb0NvcHlJbnB1dFN0cmVhbSBhbmQgcHJvdmlkZXMgdGhlIGRlY29tcHJlc3NlZCBkYXRhIGFzIGEKKy8vIFplcm9Db3B5SW5wdXRTdHJlYW0uCisvLworLy8gR3ppcE91dHB1dFN0cmVhbSBpcyBhbiBaZXJvQ29weU91dHB1dFN0cmVhbSB0aGF0IGNvbXByZXNzZXMgZGF0YSB0bworLy8gYW4gdW5kZXJseWluZyBaZXJvQ29weU91dHB1dFN0cmVhbS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSU9fR1pJUF9TVFJFQU1fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19HWklQX1NUUkVBTV9IX18KKworI2luY2x1ZGUgPHpsaWIuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKKy8vIEEgWmVyb0NvcHlJbnB1dFN0cmVhbSB0aGF0IHJlYWRzIGNvbXByZXNzZWQgZGF0YSB0aHJvdWdoIHpsaWIKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBHemlwSW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBGb3JtYXQga2V5IGZvciBjb25zdHJ1Y3RvcgorICBlbnVtIEZvcm1hdCB7CisgICAgLy8gemxpYiB3aWxsIGF1dG9kZXRlY3QgZ3ppcCBoZWFkZXIgb3IgZGVmbGF0ZSBzdHJlYW0KKyAgICBBVVRPID0gMCwKKworICAgIC8vIEdaSVAgc3RyZWFtcyBoYXZlIHNvbWUgZXh0cmEgaGVhZGVyIGRhdGEgZm9yIGZpbGUgYXR0cmlidXRlcy4KKyAgICBHWklQID0gMSwKKworICAgIC8vIFNpbXBsZXIgemxpYiBzdHJlYW0gZm9ybWF0LgorICAgIFpMSUIgPSAyLAorICB9OworCisgIC8vIGJ1ZmZlcl9zaXplIGFuZCBmb3JtYXQgbWF5IGJlIC0xIGZvciBkZWZhdWx0IG9mIDY0a0IgYW5kIEdaSVAgZm9ybWF0CisgIGV4cGxpY2l0IEd6aXBJbnB1dFN0cmVhbSgKKyAgICAgIFplcm9Db3B5SW5wdXRTdHJlYW0qIHN1Yl9zdHJlYW0sCisgICAgICBGb3JtYXQgZm9ybWF0ID0gQVVUTywKKyAgICAgIGludCBidWZmZXJfc2l6ZSA9IC0xKTsKKyAgdmlydHVhbCB+R3ppcElucHV0U3RyZWFtKCk7CisKKyAgLy8gUmV0dXJuIGxhc3QgZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIG5vIGVycm9yLgorICBpbmxpbmUgY29uc3QgY2hhciogWmxpYkVycm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gemNvbnRleHRfLm1zZzsKKyAgfQorICBpbmxpbmUgaW50IFpsaWJFcnJvckNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHplcnJvcl87CisgIH0KKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCk7CisgIGJvb2wgU2tpcChpbnQgY291bnQpOworICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKKworIHByaXZhdGU6CisgIEZvcm1hdCBmb3JtYXRfOworCisgIFplcm9Db3B5SW5wdXRTdHJlYW0qIHN1Yl9zdHJlYW1fOworCisgIHpfc3RyZWFtIHpjb250ZXh0XzsKKyAgaW50IHplcnJvcl87CisKKyAgdm9pZCogb3V0cHV0X2J1ZmZlcl87CisgIHZvaWQqIG91dHB1dF9wb3NpdGlvbl87CisgIHNpemVfdCBvdXRwdXRfYnVmZmVyX2xlbmd0aF87CisKKyAgaW50IEluZmxhdGUoaW50IGZsdXNoKTsKKyAgdm9pZCBEb05leHRPdXRwdXQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEd6aXBJbnB1dFN0cmVhbSk7Cit9OworCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBHemlwT3V0cHV0U3RyZWFtIDogcHVibGljIFplcm9Db3B5T3V0cHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIEZvcm1hdCBrZXkgZm9yIGNvbnN0cnVjdG9yCisgIGVudW0gRm9ybWF0IHsKKyAgICAvLyBHWklQIHN0cmVhbXMgaGF2ZSBzb21lIGV4dHJhIGhlYWRlciBkYXRhIGZvciBmaWxlIGF0dHJpYnV0ZXMuCisgICAgR1pJUCA9IDEsCisKKyAgICAvLyBTaW1wbGVyIHpsaWIgc3RyZWFtIGZvcm1hdC4KKyAgICBaTElCID0gMiwKKyAgfTsKKworICBzdHJ1Y3QgT3B0aW9ucyB7CisgICAgLy8gRGVmYXVsdHMgdG8gR1pJUC4KKyAgICBGb3JtYXQgZm9ybWF0OworCisgICAgLy8gV2hhdCBzaXplIGJ1ZmZlciB0byB1c2UgaW50ZXJuYWxseS4gIERlZmF1bHRzIHRvIDY0a0IuCisgICAgaW50IGJ1ZmZlcl9zaXplOworCisgICAgLy8gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCA5LCB3aGVyZSAwIGlzIG5vIGNvbXByZXNzaW9uIGFuZCA5IGlzIGJlc3QKKyAgICAvLyBjb21wcmVzc2lvbi4gIERlZmF1bHRzIHRvIFpfREVGQVVMVF9DT01QUkVTU0lPTiAoc2VlIHpsaWIuaCkuCisgICAgaW50IGNvbXByZXNzaW9uX2xldmVsOworCisgICAgLy8gRGVmYXVsdHMgdG8gWl9ERUZBVUxUX1NUUkFURUdZLiAgQ2FuIGFsc28gYmUgc2V0IHRvIFpfRklMVEVSRUQsCisgICAgLy8gWl9IVUZGTUFOX09OTFksIG9yIFpfUkxFLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBkZWZsYXRlSW5pdDIgaW4KKyAgICAvLyB6bGliLmggZm9yIGRlZmluaXRpb25zIG9mIHRoZXNlIGNvbnN0YW50cy4KKyAgICBpbnQgY29tcHJlc3Npb25fc3RyYXRlZ3k7CisKKyAgICBPcHRpb25zKCk7ICAvLyBJbml0aWFsaXplcyB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICB9OworCisgIC8vIENyZWF0ZSBhIEd6aXBPdXRwdXRTdHJlYW0gd2l0aCBkZWZhdWx0IG9wdGlvbnMuCisgIGV4cGxpY2l0IEd6aXBPdXRwdXRTdHJlYW0oWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN1Yl9zdHJlYW0pOworCisgIC8vIENyZWF0ZSBhIEd6aXBPdXRwdXRTdHJlYW0gd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy4KKyAgR3ppcE91dHB1dFN0cmVhbSgKKyAgICAgIFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtLAorICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKyAgLy8gREVQUkVDQVRFRDogIFVzZSBvbmUgb2YgdGhlIGFib3ZlIGNvbnN0cnVjdG9ycyBpbnN0ZWFkLgorICBHemlwT3V0cHV0U3RyZWFtKAorICAgICAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN1Yl9zdHJlYW0sCisgICAgICBGb3JtYXQgZm9ybWF0LAorICAgICAgaW50IGJ1ZmZlcl9zaXplID0gLTEpIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRDsKKworICB2aXJ0dWFsIH5HemlwT3V0cHV0U3RyZWFtKCk7CisKKyAgLy8gUmV0dXJuIGxhc3QgZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIG5vIGVycm9yLgorICBpbmxpbmUgY29uc3QgY2hhciogWmxpYkVycm9yTWVzc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gemNvbnRleHRfLm1zZzsKKyAgfQorICBpbmxpbmUgaW50IFpsaWJFcnJvckNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHplcnJvcl87CisgIH0KKworICAvLyBGbHVzaGVzIGRhdGEgd3JpdHRlbiBzbyBmYXIgdG8gemlwcGVkIGRhdGEgaW4gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAvLyBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZmx1c2ggdGhlIHVuZGVybHlpbmcgc3RyZWFtIGlmCisgIC8vIG5lY2Vzc2FyeS4KKyAgLy8gQ29tcHJlc3Npb24gbWF5IGJlIGxlc3MgZWZmaWNpZW50IHN0b3BwaW5nIGFuZCBzdGFydGluZyBhcm91bmQgZmx1c2hlcy4KKyAgLy8gUmV0dXJucyB0cnVlIGlmIG5vIGVycm9yLgorICBib29sIEZsdXNoKCk7CisKKyAgLy8gV3JpdGVzIG91dCBhbGwgZGF0YSBhbmQgY2xvc2VzIHRoZSBnemlwIHN0cmVhbS4KKyAgLy8gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNsb3NlIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBpZgorICAvLyBuZWNlc3NhcnkuCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBubyBlcnJvci4KKyAgYm9vbCBDbG9zZSgpOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBaZXJvQ29weU91dHB1dFN0cmVhbSogc3ViX3N0cmVhbV87CisgIC8vIFJlc3VsdCBmcm9tIGNhbGxpbmcgTmV4dCgpIG9uIHN1Yl9zdHJlYW1fCisgIHZvaWQqIHN1Yl9kYXRhXzsKKyAgaW50IHN1Yl9kYXRhX3NpemVfOworCisgIHpfc3RyZWFtIHpjb250ZXh0XzsKKyAgaW50IHplcnJvcl87CisgIHZvaWQqIGlucHV0X2J1ZmZlcl87CisgIHNpemVfdCBpbnB1dF9idWZmZXJfbGVuZ3RoXzsKKworICAvLyBTaGFyZWQgY29uc3RydWN0b3IgY29kZS4KKyAgdm9pZCBJbml0KFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworICAvLyBEbyBzb21lIGNvbXByZXNzaW9uLgorICAvLyBUYWtlcyB6bGliIGZsdXNoIG1vZGUuCisgIC8vIFJldHVybnMgemxpYiBlcnJvciBjb2RlLgorICBpbnQgRGVmbGF0ZShpbnQgZmx1c2gpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHemlwT3V0cHV0U3RyZWFtKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lPX0daSVBfU1RSRUFNX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZThhMDk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2gKQEAgLTAsMCArMSw0NCBAQAorIyEvYmluL3NoIC14CisjCisjIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorIyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgQXV0aG9yOiBicmlhbm9sc29uQGdvb2dsZS5jb20gKEJyaWFuIE9sc29uKQorIworIyBUZXN0IGNvbXBhdGliaWxpdHkgYmV0d2VlbiBjb21tYW5kIGxpbmUgZ3ppcC9ndW56aXAgYmluYXJpZXMgYW5kCisjIFplcm9Db3B5U3RyZWFtIHZlcnNpb25zLgorCitURVNURklMRT1NYWtlZmlsZQorCisoLi96Y2d6aXAgPCAke1RFU1RGSUxFfSB8IGd1bnppcCB8IGNtcCAtICR7VEVTVEZJTEV9KSAmJiBcCisoZ3ppcCA8ICR7VEVTVEZJTEV9IHwgLi96Y2d1bnppcCB8IGNtcCAtICR7VEVTVEZJTEV9KQorCisjIFJlc3VsdCBvZiAiKGNtZCkgJiYgKGNtZCkiIGltcGxpY2l0bHkgYmVjb21lcyByZXN1bHQgb2YgdGhpcyBzY3JpcHQKKyMgYW5kIHRodXMgdGhlIHRlc3QuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wYWNrYWdlX2luZm8uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3BhY2thZ2VfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhN2E0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wYWNrYWdlX2luZm8uaApAQCAtMCwwICsxLDU0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgZXhpc3RzIHNvbGVseSB0byBkb2N1bWVudCB0aGUgZ29vZ2xlOjpwcm90b2J1Zjo6aW8gbmFtZXNwYWNlLgorLy8gSXQgaXMgbm90IGNvbXBpbGVkIGludG8gYW55dGhpbmcsIGJ1dCBpdCBtYXkgYmUgcmVhZCBieSBhbiBhdXRvbWF0ZWQKKy8vIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yLgorCituYW1lc3BhY2UgZ29vZ2xlIHsKKworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gQXV4aWxpYXJ5IGNsYXNzZXMgdXNlZCBmb3IgSS9PLgorLy8KKy8vIFRoZSBQcm90b2NvbCBCdWZmZXIgbGlicmFyeSB1c2VzIHRoZSBjbGFzc2VzIGluIHRoaXMgcGFja2FnZSB0byBkZWFsIHdpdGgKKy8vIEkvTyBhbmQgZW5jb2RpbmcvZGVjb2RpbmcgcmF3IGJ5dGVzLiAgTW9zdCB1c2VycyB3aWxsIG5vdCBuZWVkIHRvCisvLyBkZWFsIHdpdGggdGhpcyBwYWNrYWdlLiAgSG93ZXZlciwgdXNlcnMgd2hvIHdhbnQgdG8gYWRhcHQgdGhlIHN5c3RlbSB0bworLy8gd29yayB3aXRoIHRoZWlyIG93biBJL08gYWJzdHJhY3Rpb25zIC0tIGUuZy4sIHRvIGFsbG93IFByb3RvY29sIEJ1ZmZlcnMKKy8vIHRvIGJlIHJlYWQgZnJvbSBhIGRpZmZlcmVudCBraW5kIG9mIGlucHV0IHN0cmVhbSB3aXRob3V0IHRoZSBuZWVkIGZvciBhCisvLyB0ZW1wb3JhcnkgYnVmZmVyIC0tIHNob3VsZCB0YWtlIGEgY2xvc2VyIGxvb2suCituYW1lc3BhY2UgaW8ge30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWI5MGRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5jYwpAQCAtMCwwICsxLDE5OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CisKK1ByaW50ZXI6OlByaW50ZXIoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCwgY2hhciB2YXJpYWJsZV9kZWxpbWl0ZXIpCisgIDogdmFyaWFibGVfZGVsaW1pdGVyXyh2YXJpYWJsZV9kZWxpbWl0ZXIpLAorICAgIG91dHB1dF8ob3V0cHV0KSwKKyAgICBidWZmZXJfKE5VTEwpLAorICAgIGJ1ZmZlcl9zaXplXygwKSwKKyAgICBhdF9zdGFydF9vZl9saW5lXyh0cnVlKSwKKyAgICBmYWlsZWRfKGZhbHNlKSB7Cit9CisKK1ByaW50ZXI6On5QcmludGVyKCkgeworICAvLyBPbmx5IEJhY2tVcCgpIGlmIHdlJ3JlIHN1cmUgd2UndmUgc3VjY2Vzc2Z1bGx5IGNhbGxlZCBOZXh0KCkgYXQgbGVhc3Qgb25jZS4KKyAgaWYgKGJ1ZmZlcl9zaXplXyA+IDApIHsKKyAgICBvdXRwdXRfLT5CYWNrVXAoYnVmZmVyX3NpemVfKTsKKyAgfQorfQorCit2b2lkIFByaW50ZXI6OlByaW50KGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcmlhYmxlcywgY29uc3QgY2hhciogdGV4dCkgeworICBpbnQgc2l6ZSA9IHN0cmxlbih0ZXh0KTsKKyAgaW50IHBvcyA9IDA7ICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdlJ3ZlIHdyaXR0ZW4gc28gZmFyLgorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYgKHRleHRbaV0gPT0gJ1xuJykgeworICAgICAgLy8gU2F3IG5ld2xpbmUuICBJZiB0aGVyZSBpcyBtb3JlIHRleHQsIHdlIG1heSBuZWVkIHRvIGluc2VydCBhbiBpbmRlbnQKKyAgICAgIC8vIGhlcmUuICBTbywgd3JpdGUgd2hhdCB3ZSBoYXZlIHNvIGZhciwgaW5jbHVkaW5nIHRoZSAnXG4nLgorICAgICAgV3JpdGVSYXcodGV4dCArIHBvcywgaSAtIHBvcyArIDEpOworICAgICAgcG9zID0gaSArIDE7CisKKyAgICAgIC8vIFNldHRpbmcgdGhpcyB0cnVlIHdpbGwgY2F1c2UgdGhlIG5leHQgV3JpdGVSYXcoKSB0byBpbnNlcnQgYW4gaW5kZW50CisgICAgICAvLyBmaXJzdC4KKyAgICAgIGF0X3N0YXJ0X29mX2xpbmVfID0gdHJ1ZTsKKworICAgIH0gZWxzZSBpZiAodGV4dFtpXSA9PSB2YXJpYWJsZV9kZWxpbWl0ZXJfKSB7CisgICAgICAvLyBTYXcgdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgbmFtZS4KKworICAgICAgLy8gV3JpdGUgd2hhdCB3ZSBoYXZlIHNvIGZhci4KKyAgICAgIFdyaXRlUmF3KHRleHQgKyBwb3MsIGkgLSBwb3MpOworICAgICAgcG9zID0gaSArIDE7CisKKyAgICAgIC8vIEZpbmQgY2xvc2luZyBkZWxpbWl0ZXIuCisgICAgICBjb25zdCBjaGFyKiBlbmQgPSBzdHJjaHIodGV4dCArIHBvcywgdmFyaWFibGVfZGVsaW1pdGVyXyk7CisgICAgICBpZiAoZW5kID09IE5VTEwpIHsKKyAgICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgVW5jbG9zZWQgdmFyaWFibGUgbmFtZS4iOworICAgICAgICBlbmQgPSB0ZXh0ICsgcG9zOworICAgICAgfQorICAgICAgaW50IGVuZHBvcyA9IGVuZCAtIHRleHQ7CisKKyAgICAgIHN0cmluZyB2YXJuYW1lKHRleHQgKyBwb3MsIGVuZHBvcyAtIHBvcyk7CisgICAgICBpZiAodmFybmFtZS5lbXB0eSgpKSB7CisgICAgICAgIC8vIFR3byBkZWxpbWl0ZXJzIGluIGEgcm93IHJlZHVjZSB0byBhIGxpdGVyYWwgZGVsaW1pdGVyIGNoYXJhY3Rlci4KKyAgICAgICAgV3JpdGVSYXcoJnZhcmlhYmxlX2RlbGltaXRlcl8sIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmVwbGFjZSB3aXRoIHRoZSB2YXJpYWJsZSdzIHZhbHVlLgorICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gdmFyaWFibGVzLmZpbmQodmFybmFtZSk7CisgICAgICAgIGlmIChpdGVyID09IHZhcmlhYmxlcy5lbmQoKSkgeworICAgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiIFVuZGVmaW5lZCB2YXJpYWJsZTogIiA8PCB2YXJuYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFdyaXRlUmF3KGl0ZXItPnNlY29uZC5kYXRhKCksIGl0ZXItPnNlY29uZC5zaXplKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEFkdmFuY2UgcGFzdCB0aGlzIHZhcmlhYmxlLgorICAgICAgaSA9IGVuZHBvczsKKyAgICAgIHBvcyA9IGVuZHBvcyArIDE7CisgICAgfQorICB9CisKKyAgLy8gV3JpdGUgdGhlIHJlc3QuCisgIFdyaXRlUmF3KHRleHQgKyBwb3MsIHNpemUgLSBwb3MpOworfQorCit2b2lkIFByaW50ZXI6OlByaW50KGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgc3RhdGljIG1hcDxzdHJpbmcsIHN0cmluZz4gZW1wdHk7CisgIFByaW50KGVtcHR5LCB0ZXh0KTsKK30KKwordm9pZCBQcmludGVyOjpQcmludChjb25zdCBjaGFyKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZSwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbdmFyaWFibGVdID0gdmFsdWU7CisgIFByaW50KHZhcnMsIHRleHQpOworfQorCit2b2lkIFByaW50ZXI6OlByaW50KGNvbnN0IGNoYXIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMSwgY29uc3Qgc3RyaW5nJiB2YWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTIpIHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzW3ZhcmlhYmxlMV0gPSB2YWx1ZTE7CisgIHZhcnNbdmFyaWFibGUyXSA9IHZhbHVlMjsKKyAgUHJpbnQodmFycywgdGV4dCk7Cit9CisKK3ZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMykgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbdmFyaWFibGUxXSA9IHZhbHVlMTsKKyAgdmFyc1t2YXJpYWJsZTJdID0gdmFsdWUyOworICB2YXJzW3ZhcmlhYmxlM10gPSB2YWx1ZTM7CisgIFByaW50KHZhcnMsIHRleHQpOworfQorCit2b2lkIFByaW50ZXI6OkluZGVudCgpIHsKKyAgaW5kZW50XyArPSAiICAiOworfQorCit2b2lkIFByaW50ZXI6Ok91dGRlbnQoKSB7CisgIGlmIChpbmRlbnRfLmVtcHR5KCkpIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIiBPdXRkZW50KCkgd2l0aG91dCBtYXRjaGluZyBJbmRlbnQoKS4iOworICAgIHJldHVybjsKKyAgfQorCisgIGluZGVudF8ucmVzaXplKGluZGVudF8uc2l6ZSgpIC0gMik7Cit9CisKK3ZvaWQgUHJpbnRlcjo6UHJpbnRSYXcoY29uc3Qgc3RyaW5nJiBkYXRhKSB7CisgIFdyaXRlUmF3KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Cit9CisKK3ZvaWQgUHJpbnRlcjo6UHJpbnRSYXcoY29uc3QgY2hhciogZGF0YSkgeworICBpZiAoZmFpbGVkXykgcmV0dXJuOworICBXcml0ZVJhdyhkYXRhLCBzdHJsZW4oZGF0YSkpOworfQorCit2b2lkIFByaW50ZXI6OldyaXRlUmF3KGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKSB7CisgIGlmIChmYWlsZWRfKSByZXR1cm47CisgIGlmIChzaXplID09IDApIHJldHVybjsKKworICBpZiAoYXRfc3RhcnRfb2ZfbGluZV8pIHsKKyAgICAvLyBJbnNlcnQgYW4gaW5kZW50LgorICAgIGF0X3N0YXJ0X29mX2xpbmVfID0gZmFsc2U7CisgICAgV3JpdGVSYXcoaW5kZW50Xy5kYXRhKCksIGluZGVudF8uc2l6ZSgpKTsKKyAgICBpZiAoZmFpbGVkXykgcmV0dXJuOworICB9CisKKyAgd2hpbGUgKHNpemUgPiBidWZmZXJfc2l6ZV8pIHsKKyAgICAvLyBEYXRhIGV4Y2VlZHMgc3BhY2UgaW4gdGhlIGJ1ZmZlci4gIENvcHkgd2hhdCB3ZSBjYW4gYW5kIHJlcXVlc3QgYQorICAgIC8vIG5ldyBidWZmZXIuCisgICAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIGJ1ZmZlcl9zaXplXyk7CisgICAgZGF0YSArPSBidWZmZXJfc2l6ZV87CisgICAgc2l6ZSAtPSBidWZmZXJfc2l6ZV87CisgICAgdm9pZCogdm9pZF9idWZmZXI7CisgICAgZmFpbGVkXyA9ICFvdXRwdXRfLT5OZXh0KCZ2b2lkX2J1ZmZlciwgJmJ1ZmZlcl9zaXplXyk7CisgICAgaWYgKGZhaWxlZF8pIHJldHVybjsKKyAgICBidWZmZXJfID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4odm9pZF9idWZmZXIpOworICB9CisKKyAgLy8gQnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gcmVjZWl2ZSB0aGUgZGF0YTsgY29weSBpdC4KKyAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIHNpemUpOworICBidWZmZXJfICs9IHNpemU7CisgIGJ1ZmZlcl9zaXplXyAtPSBzaXplOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTQ4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFV0aWxpdHkgY2xhc3MgZm9yIHdyaXRpbmcgdGV4dCB0byBhIFplcm9Db3B5T3V0cHV0U3RyZWFtLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19QUklOVEVSX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fUFJJTlRFUl9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCitjbGFzcyBaZXJvQ29weU91dHB1dFN0cmVhbTsgICAgIC8vIHplcm9fY29weV9zdHJlYW0uaAorCisvLyBUaGlzIHNpbXBsZSB1dGlsaXR5IGNsYXNzIGFzc2lzdHMgaW4gY29kZSBnZW5lcmF0aW9uLiAgSXQgYmFzaWNhbGx5CisvLyBhbGxvd3MgdGhlIGNhbGxlciB0byBkZWZpbmUgYSBzZXQgb2YgdmFyaWFibGVzIGFuZCB0aGVuIG91dHB1dCBzb21lCisvLyB0ZXh0IHdpdGggdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4gIEV4YW1wbGUgdXNhZ2U6CisvLworLy8gICBQcmludGVyIHByaW50ZXIob3V0cHV0LCAnJCcpOworLy8gICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisvLyAgIHZhcnNbIm5hbWUiXSA9ICJCb2IiOworLy8gICBwcmludGVyLlByaW50KHZhcnMsICJNeSBuYW1lIGlzICRuYW1lJC4iKTsKKy8vCisvLyBUaGUgYWJvdmUgd3JpdGVzICJNeSBuYW1lIGlzIEJvYi4iIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorLy8KKy8vIFByaW50ZXIgYWdncmVzc2l2ZWx5IGVuZm9yY2VzIGNvcnJlY3QgdXNhZ2UsIGNyYXNoaW5nICh3aXRoIGFzc2VydCBmYWlsdXJlcykKKy8vIGluIHRoZSBjYXNlIG9mIHVuZGVmaW5lZCB2YXJpYWJsZXMgaW4gZGVidWcgYnVpbGRzLiBUaGlzIGhlbHBzIGdyZWF0bHkgaW4KKy8vIGRlYnVnZ2luZyBjb2RlIHdoaWNoIHVzZXMgaXQuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgUHJpbnRlciB7CisgcHVibGljOgorICAvLyBDcmVhdGUgYSBwcmludGVyIHRoYXQgd3JpdGVzIHRleHQgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uICBVc2UgdGhlCisgIC8vIGdpdmVuIGNoYXJhY3RlciBhcyB0aGUgZGVsaW1pdGVyIGZvciB2YXJpYWJsZXMuCisgIFByaW50ZXIoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCwgY2hhciB2YXJpYWJsZV9kZWxpbWl0ZXIpOworICB+UHJpbnRlcigpOworCisgIC8vIFByaW50IHNvbWUgdGV4dCBhZnRlciBhcHBseWluZyB2YXJpYWJsZSBzdWJzdGl0dXRpb25zLiAgSWYgYSBwYXJ0aWN1bGFyCisgIC8vIHZhcmlhYmxlIGluIHRoZSB0ZXh0IGlzIG5vdCBkZWZpbmVkLCB0aGlzIHdpbGwgY3Jhc2guICBWYXJpYWJsZXMgdG8gYmUKKyAgLy8gc3Vic3RpdHV0ZWQgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgbmFtZXMgc3Vycm91bmRlZCBieSBkZWxpbWl0ZXIKKyAgLy8gY2hhcmFjdGVycyAoYXMgZ2l2ZW4gdG8gdGhlIGNvbnN0cnVjdG9yKS4gIFRoZSB2YXJpYWJsZSBiaW5kaW5ncyBhcmUKKyAgLy8gZGVmaW5lZCBieSB0aGUgZ2l2ZW4gbWFwLgorICB2b2lkIFByaW50KGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcmlhYmxlcywgY29uc3QgY2hhciogdGV4dCk7CisKKyAgLy8gTGlrZSB0aGUgZmlyc3QgUHJpbnQoKSwgZXhjZXB0IHRoZSBzdWJzdGl0dXRpb25zIGFyZSBnaXZlbiBhcyBwYXJhbWV0ZXJzLgorICB2b2lkIFByaW50KGNvbnN0IGNoYXIqIHRleHQpOworICAvLyBMaWtlIHRoZSBmaXJzdCBQcmludCgpLCBleGNlcHQgdGhlIHN1YnN0aXR1dGlvbnMgYXJlIGdpdmVuIGFzIHBhcmFtZXRlcnMuCisgIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogdmFyaWFibGUsIGNvbnN0IHN0cmluZyYgdmFsdWUpOworICAvLyBMaWtlIHRoZSBmaXJzdCBQcmludCgpLCBleGNlcHQgdGhlIHN1YnN0aXR1dGlvbnMgYXJlIGdpdmVuIGFzIHBhcmFtZXRlcnMuCisgIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTIsIGNvbnN0IHN0cmluZyYgdmFsdWUyKTsKKyAgLy8gTGlrZSB0aGUgZmlyc3QgUHJpbnQoKSwgZXhjZXB0IHRoZSBzdWJzdGl0dXRpb25zIGFyZSBnaXZlbiBhcyBwYXJhbWV0ZXJzLgorICB2b2lkIFByaW50KGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGNoYXIqIHZhcmlhYmxlMSwgY29uc3Qgc3RyaW5nJiB2YWx1ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTMsIGNvbnN0IHN0cmluZyYgdmFsdWUzKTsKKyAgLy8gVE9ETyhrZW50b24pOiAgT3ZlcmxvYWRlZCB2ZXJzaW9ucyB3aXRoIG1vcmUgdmFyaWFibGVzPyAgVGhyZWUgc2VlbXMKKyAgLy8gICB0byBiZSBlbm91Z2guCisKKyAgLy8gSW5kZW50IHRleHQgYnkgdHdvIHNwYWNlcy4gIEFmdGVyIGNhbGxpbmcgSW5kZW50KCksIHR3byBzcGFjZXMgd2lsbCBiZQorICAvLyBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvZiB0ZXh0LiAgSW5kZW50KCkgbWF5IGJlIGNhbGxlZAorICAvLyBtdWx0aXBsZSB0aW1lcyB0byBwcm9kdWNlIGRlZXBlciBpbmRlbnRzLgorICB2b2lkIEluZGVudCgpOworCisgIC8vIFJlZHVjZXMgdGhlIGN1cnJlbnQgaW5kZW50IGxldmVsIGJ5IHR3byBzcGFjZXMsIG9yIGNyYXNoZXMgaWYgdGhlIGluZGVudAorICAvLyBsZXZlbCBpcyB6ZXJvLgorICB2b2lkIE91dGRlbnQoKTsKKworICAvLyBXcml0ZSBhIHN0cmluZyB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgLy8gVGhpcyBtZXRob2QgZG9lcyBub3QgbG9vayBmb3IgbmV3bGluZXMgdG8gYWRkIGluZGVudGF0aW9uLgorICB2b2lkIFByaW50UmF3KGNvbnN0IHN0cmluZyYgZGF0YSk7CisKKyAgLy8gV3JpdGUgYSB6ZXJvLWRlbGltaXRlZCBzdHJpbmcgdG8gb3V0cHV0IGJ1ZmZlci4KKyAgLy8gVGhpcyBtZXRob2QgZG9lcyBub3QgbG9vayBmb3IgbmV3bGluZXMgdG8gYWRkIGluZGVudGF0aW9uLgorICB2b2lkIFByaW50UmF3KGNvbnN0IGNoYXIqIGRhdGEpOworCisgIC8vIFdyaXRlIHNvbWUgYnl0ZXMgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgIC8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IGxvb2sgZm9yIG5ld2xpbmVzIHRvIGFkZCBpbmRlbnRhdGlvbi4KKyAgdm9pZCBXcml0ZVJhdyhjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSk7CisKKyAgLy8gVHJ1ZSBpZiBhbnkgd3JpdGUgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGZhaWxlZC4gIChXZSBkb24ndCBqdXN0CisgIC8vIGNyYXNoIGluIHRoaXMgY2FzZSBiZWNhdXNlIHRoaXMgaXMgYW4gSS9PIGZhaWx1cmUsIG5vdCBhIHByb2dyYW1taW5nCisgIC8vIGVycm9yLikKKyAgYm9vbCBmYWlsZWQoKSBjb25zdCB7IHJldHVybiBmYWlsZWRfOyB9CisKKyBwcml2YXRlOgorICBjb25zdCBjaGFyIHZhcmlhYmxlX2RlbGltaXRlcl87CisKKyAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIGNvbnN0IG91dHB1dF87CisgIGNoYXIqIGJ1ZmZlcl87CisgIGludCBidWZmZXJfc2l6ZV87CisKKyAgc3RyaW5nIGluZGVudF87CisgIGJvb2wgYXRfc3RhcnRfb2ZfbGluZV87CisgIGJvb2wgZmFpbGVkXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUHJpbnRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JT19QUklOVEVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwYTUzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwyNjEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CituYW1lc3BhY2UgeworCisvLyBFYWNoIHRlc3QgcmVwZWF0cyBvdmVyIHNldmVyYWwgYmxvY2sgc2l6ZXMgaW4gb3JkZXIgdG8gdGVzdCBib3RoIGNhc2VzCisvLyB3aGVyZSBwYXJ0aWN1bGFyIHdyaXRlcyBjcm9zcyBhIGJ1ZmZlciBib3VuZGFyeSBhbmQgY2FzZXMgd2hlcmUgdGhleSBkbworLy8gbm90LgorCitURVNUKFByaW50ZXIsIEVtcHR5UHJpbnRlcikgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKyAgY29uc3QgaW50IGJsb2NrX3NpemUgPSAxMDA7CisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIEdPT0dMRV9BUlJBWVNJWkUoYnVmZmVyKSwgYmxvY2tfc2l6ZSk7CisgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnXDAnKTsKKyAgRVhQRUNUX1RSVUUoIXByaW50ZXIuZmFpbGVkKCkpOworfQorCitURVNUKFByaW50ZXIsIEJhc2ljUHJpbnRpbmcpIHsKKyAgY2hhciBidWZmZXJbODE5Ml07CisKKyAgZm9yIChpbnQgYmxvY2tfc2l6ZSA9IDE7IGJsb2NrX3NpemUgPCA1MTI7IGJsb2NrX3NpemUgKj0gMikgeworICAgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpLCBibG9ja19zaXplKTsKKworICAgIHsKKyAgICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnXDAnKTsKKworICAgICAgcHJpbnRlci5QcmludCgiSGVsbG8gV29ybGQhIik7CisgICAgICBwcmludGVyLlByaW50KCIgIFRoaXMgaXMgdGhlIHNhbWUgbGluZS5cbiIpOworICAgICAgcHJpbnRlci5QcmludCgiQnV0IHRoaXMgaXMgYSBuZXcgb25lLlxuQW5kIHRoaXMgaXMgYW5vdGhlciBvbmUuIik7CisKKyAgICAgIEVYUEVDVF9GQUxTRShwcmludGVyLmZhaWxlZCgpKTsKKyAgICB9CisKKyAgICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisKKyAgICBFWFBFQ1RfU1RSRVEoIkhlbGxvIFdvcmxkISAgVGhpcyBpcyB0aGUgc2FtZSBsaW5lLlxuIgorICAgICAgICAgICAgICAgICAiQnV0IHRoaXMgaXMgYSBuZXcgb25lLlxuIgorICAgICAgICAgICAgICAgICAiQW5kIHRoaXMgaXMgYW5vdGhlciBvbmUuIiwKKyAgICAgICAgICAgICAgICAgYnVmZmVyKTsKKyAgfQorfQorCitURVNUKFByaW50ZXIsIFdyaXRlUmF3KSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworCisgIGZvciAoaW50IGJsb2NrX3NpemUgPSAxOyBibG9ja19zaXplIDwgNTEyOyBibG9ja19zaXplICo9IDIpIHsKKyAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgYmxvY2tfc2l6ZSk7CisKKyAgICB7CisgICAgICBzdHJpbmcgc3RyaW5nX29iaiA9ICJGcm9tIGFuIG9iamVjdFxuIjsKKyAgICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcpOworICAgICAgcHJpbnRlci5Xcml0ZVJhdygiSGVsbG8gV29ybGQhIiwgMTIpOworICAgICAgcHJpbnRlci5QcmludFJhdygiICBUaGlzIGlzIHRoZSBzYW1lIGxpbmUuXG4iKTsKKyAgICAgIHByaW50ZXIuUHJpbnRSYXcoIkJ1dCB0aGlzIGlzIGEgbmV3IG9uZS5cbkFuZCB0aGlzIGlzIGFub3RoZXIgb25lLiIpOworICAgICAgcHJpbnRlci5Xcml0ZVJhdygiXG4iLCAxKTsKKyAgICAgIHByaW50ZXIuUHJpbnRSYXcoc3RyaW5nX29iaik7CisgICAgICBFWFBFQ1RfRkFMU0UocHJpbnRlci5mYWlsZWQoKSk7CisgICAgfQorCisgICAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOworCisgICAgRVhQRUNUX1NUUkVRKCJIZWxsbyBXb3JsZCEgIFRoaXMgaXMgdGhlIHNhbWUgbGluZS5cbiIKKyAgICAgICAgICAgICAgICAgIkJ1dCB0aGlzIGlzIGEgbmV3IG9uZS5cbiIKKyAgICAgICAgICAgICAgICAgIkFuZCB0aGlzIGlzIGFub3RoZXIgb25lLiIKKyAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAiRnJvbSBhbiBvYmplY3RcbiIsCisgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisgIH0KK30KKworVEVTVChQcmludGVyLCBWYXJpYWJsZVN1YnN0aXR1dGlvbikgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKworICBmb3IgKGludCBibG9ja19zaXplID0gMTsgYmxvY2tfc2l6ZSA8IDUxMjsgYmxvY2tfc2l6ZSAqPSAyKSB7CisgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGJsb2NrX3NpemUpOworCisgICAgeworICAgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisKKyAgICAgIHZhcnNbImZvbyJdID0gIldvcmxkIjsKKyAgICAgIHZhcnNbImJhciJdID0gIiRmb28kIjsKKyAgICAgIHZhcnNbImFiY2RlZmciXSA9ICIxMjM0IjsKKworICAgICAgcHJpbnRlci5QcmludCh2YXJzLCAiSGVsbG8gJGZvbyQhXG5iYXIgPSAkYmFyJFxuIik7CisgICAgICBwcmludGVyLlByaW50UmF3KCJSYXdCaXRcbiIpOworICAgICAgcHJpbnRlci5QcmludCh2YXJzLCAiJGFiY2RlZmckXG5BIGxpdGVyYWwgZG9sbGFyIHNpZ246ICAkJCIpOworCisgICAgICB2YXJzWyJmb28iXSA9ICJibGFoIjsKKyAgICAgIHByaW50ZXIuUHJpbnQodmFycywgIlxuTm93IGZvbyA9ICRmb28kLiIpOworCisgICAgICBFWFBFQ1RfRkFMU0UocHJpbnRlci5mYWlsZWQoKSk7CisgICAgfQorCisgICAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOworCisgICAgRVhQRUNUX1NUUkVRKCJIZWxsbyBXb3JsZCFcbiIKKyAgICAgICAgICAgICAgICAgImJhciA9ICRmb28kXG4iCisgICAgICAgICAgICAgICAgICJSYXdCaXRcbiIKKyAgICAgICAgICAgICAgICAgIjEyMzRcbiIKKyAgICAgICAgICAgICAgICAgIkEgbGl0ZXJhbCBkb2xsYXIgc2lnbjogICRcbiIKKyAgICAgICAgICAgICAgICAgIk5vdyBmb28gPSBibGFoLiIsCisgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisgIH0KK30KKworVEVTVChQcmludGVyLCBJbmxpbmVWYXJpYWJsZVN1YnN0aXR1dGlvbikgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisKKyAgeworICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcpOworICAgIHByaW50ZXIuUHJpbnQoIkhlbGxvICRmb28kIVxuIiwgImZvbyIsICJXb3JsZCIpOworICAgIHByaW50ZXIuUHJpbnRSYXcoIlJhd0JpdFxuIik7CisgICAgcHJpbnRlci5QcmludCgiJGZvbyQgJGJhciRcbiIsICJmb28iLCAib25lIiwgImJhciIsICJ0d28iKTsKKyAgICBFWFBFQ1RfRkFMU0UocHJpbnRlci5mYWlsZWQoKSk7CisgIH0KKworICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisKKyAgRVhQRUNUX1NUUkVRKCJIZWxsbyBXb3JsZCFcbiIKKyAgICAgICAgICAgICAgICJSYXdCaXRcbiIKKyAgICAgICAgICAgICAgICJvbmUgdHdvXG4iLAorICAgICAgICAgICAgICAgYnVmZmVyKTsKK30KKworVEVTVChQcmludGVyLCBJbmRlbnRpbmcpIHsKKyAgY2hhciBidWZmZXJbODE5Ml07CisKKyAgZm9yIChpbnQgYmxvY2tfc2l6ZSA9IDE7IGJsb2NrX3NpemUgPCA1MTI7IGJsb2NrX3NpemUgKj0gMikgeworICAgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpLCBibG9ja19zaXplKTsKKworICAgIHsKKyAgICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcpOworICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworCisgICAgICB2YXJzWyJuZXdsaW5lIl0gPSAiXG4iOworCisgICAgICBwcmludGVyLlByaW50KCJUaGlzIGlzIG5vdCBpbmRlbnRlZC5cbiIpOworICAgICAgcHJpbnRlci5JbmRlbnQoKTsKKyAgICAgIHByaW50ZXIuUHJpbnQoIlRoaXMgaXMgaW5kZW50ZWRcbkFuZCBzbyBpcyB0aGlzXG4iKTsKKyAgICAgIHByaW50ZXIuT3V0ZGVudCgpOworICAgICAgcHJpbnRlci5QcmludCgiQnV0IHRoaXMgaXMgbm90LiIpOworICAgICAgcHJpbnRlci5JbmRlbnQoKTsKKyAgICAgIHByaW50ZXIuUHJpbnQoIiAgQW5kIHRoaXMgaXMgc3RpbGwgdGhlIHNhbWUgbGluZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgIkJ1dCB0aGlzIGlzIGluZGVudGVkLlxuIik7CisgICAgICBwcmludGVyLlByaW50UmF3KCJSYXdCaXQgaGFzIGluZGVudCBhdCBzdGFydFxuIik7CisgICAgICBwcmludGVyLlByaW50UmF3KCJidXQgbm90IGFmdGVyIGEgcmF3IG5ld2xpbmVcbiIpOworICAgICAgcHJpbnRlci5QcmludCh2YXJzLCAiTm90ZSB0aGF0IGEgbmV3bGluZSBpbiBhIHZhcmlhYmxlIHdpbGwgYnJlYWsgIgorICAgICAgICAgICAgICAgICAgICAiaW5kZW50aW5nLCBhcyB3ZSBzZWUkbmV3bGluZSRoZXJlLlxuIik7CisgICAgICBwcmludGVyLkluZGVudCgpOworICAgICAgcHJpbnRlci5QcmludCgiQW5kIHRoaXMiKTsKKyAgICAgIHByaW50ZXIuT3V0ZGVudCgpOworICAgICAgcHJpbnRlci5PdXRkZW50KCk7CisgICAgICBwcmludGVyLlByaW50KCIgaXMgZG91YmxlLWluZGVudGVkXG5CYWNrIHRvIG5vcm1hbC4iKTsKKworICAgICAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuZmFpbGVkKCkpOworICAgIH0KKworICAgIGJ1ZmZlcltvdXRwdXQuQnl0ZUNvdW50KCldID0gJ1wwJzsKKworICAgIEVYUEVDVF9TVFJFUSgKKyAgICAgICJUaGlzIGlzIG5vdCBpbmRlbnRlZC5cbiIKKyAgICAgICIgIFRoaXMgaXMgaW5kZW50ZWRcbiIKKyAgICAgICIgIEFuZCBzbyBpcyB0aGlzXG4iCisgICAgICAiQnV0IHRoaXMgaXMgbm90LiAgQW5kIHRoaXMgaXMgc3RpbGwgdGhlIHNhbWUgbGluZS5cbiIKKyAgICAgICIgIEJ1dCB0aGlzIGlzIGluZGVudGVkLlxuIgorICAgICAgIiAgUmF3Qml0IGhhcyBpbmRlbnQgYXQgc3RhcnRcbiIKKyAgICAgICJidXQgbm90IGFmdGVyIGEgcmF3IG5ld2xpbmVcbiIKKyAgICAgICJOb3RlIHRoYXQgYSBuZXdsaW5lIGluIGEgdmFyaWFibGUgd2lsbCBicmVhayBpbmRlbnRpbmcsIGFzIHdlIHNlZVxuIgorICAgICAgImhlcmUuXG4iCisgICAgICAiICAgIEFuZCB0aGlzIGlzIGRvdWJsZS1pbmRlbnRlZFxuIgorICAgICAgIkJhY2sgdG8gbm9ybWFsLiIsCisgICAgICBidWZmZXIpOworICB9Cit9CisKKy8vIERlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgYXMgb2YgeWV0LgorI2lmZGVmIEdURVNUX0hBU19ERUFUSF9URVNUCitURVNUKFByaW50ZXIsIERlYXRoKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworCisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7CisKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKHByaW50ZXIuUHJpbnQoIiRub3N1Y2h2YXIkIiksICJVbmRlZmluZWQgdmFyaWFibGUiKTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKHByaW50ZXIuUHJpbnQoIiR1bmNsb3NlZCIpLCAiVW5jbG9zZWQgdmFyaWFibGUgbmFtZSIpOworICBFWFBFQ1RfREVCVUdfREVBVEgocHJpbnRlci5PdXRkZW50KCksICJ3aXRob3V0IG1hdGNoaW5nIEluZGVudCIpOworfQorI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorCitURVNUKFByaW50ZXIsIFdyaXRlRmFpbHVyZSkgeworICBjaGFyIGJ1ZmZlclsxNl07CisKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKKworICAvLyBQcmludCAxNiBieXRlcyB0byBmaWxsIHRoZSBidWZmZXIgZXhhY3RseSAoc2hvdWxkIG5vdCBmYWlsKS4KKyAgcHJpbnRlci5QcmludCgiMDEyMzQ1Njc4OWFiY2RlZiIpOworICBFWFBFQ1RfRkFMU0UocHJpbnRlci5mYWlsZWQoKSk7CisKKyAgLy8gVHJ5IHRvIHByaW50IG9uZSBtb3JlIGJ5dGUgKHNob3VsZCBmYWlsKS4KKyAgcHJpbnRlci5QcmludCgiICIpOworICBFWFBFQ1RfVFJVRShwcmludGVyLmZhaWxlZCgpKTsKKworICAvLyBTaG91bGQgbm90IGNyYXNoCisgIHByaW50ZXIuUHJpbnQoImJsYWgiKTsKKyAgRVhQRUNUX1RSVUUocHJpbnRlci5mYWlsZWQoKSk7CisKKyAgLy8gQnVmZmVyIHNob3VsZCBjb250YWluIHRoZSBmaXJzdCAxNiBieXRlcyB3cml0dGVuLgorICBFWFBFQ1RfRVEoIjAxMjM0NTY3ODlhYmNkZWYiLCBzdHJpbmcoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzODMxZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYwpAQCAtMCwwICsxLDY5NCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gSGVyZSB3ZSBoYXZlIGEgaGFuZC13cml0dGVuIGxleGVyLiAgQXQgZmlyc3QgeW91IG1pZ2h0IGFzayB5b3Vyc2VsZiwKKy8vICJIYW5kLXdyaXR0ZW4gdGV4dCBwcm9jZXNzaW5nPyAgSXMgS2VudG9uIGNyYXp5PyEiICBXZWxsLCBmaXJzdCBvZiBhbGwsCisvLyB5ZXMgSSBhbSBjcmF6eSwgYnV0IHRoYXQncyBiZXNpZGUgdGhlIHBvaW50LiAgVGhlcmUgYXJlIGFjdHVhbGx5IHJlYXNvbnMKKy8vIHdoeSBJIGVuZGVkIHVwIHdyaXRpbmcgdGhpcyB0aGlzIHdheS4KKy8vCisvLyBUaGUgdHJhZGl0aW9uYWwgYXBwcm9hY2ggdG8gbGV4aW5nIGlzIHRvIHVzZSBsZXggdG8gZ2VuZXJhdGUgYSBsZXhlciBmb3IKKy8vIHlvdS4gIFVuZm9ydHVuYXRlbHksIGxleCdzIG91dHB1dCBpcyByaWRpY3Vsb3VzbHkgdWdseSBhbmQgZGlmZmljdWx0IHRvCisvLyBpbnRlZ3JhdGUgY2xlYW5seSB3aXRoIEMrKyBjb2RlLCBlc3BlY2lhbGx5IGFic3RyYWN0IGNvZGUgb3IgY29kZSBtZWFudAorLy8gYXMgYSBsaWJyYXJ5LiAgQmV0dGVyIHBhcnNlci1nZW5lcmF0b3JzIGV4aXN0IGJ1dCB3b3VsZCBhZGQgZGVwZW5kZW5jaWVzCisvLyB3aGljaCBtb3N0IHVzZXJzIHdvbid0IGFscmVhZHkgaGF2ZSwgd2hpY2ggd2UnZCBsaWtlIHRvIGF2b2lkLiAgKEdOVSBmbGV4CisvLyBoYXMgYSBDKysgb3V0cHV0IG9wdGlvbiwgYnV0IGl0J3Mgc3RpbGwgcmlkaWN1bG91c2x5IHVnbHksIG5vbi1hYnN0cmFjdCwKKy8vIGFuZCBub3QgbGlicmFyeS1mcmllbmRseS4pCisvLworLy8gVGhlIG5leHQgYXBwcm9hY2ggdGhhdCBhbnkgZ29vZCBzb2Z0d2FyZSBlbmdpbmVlciBzaG91bGQgbG9vayBhdCBpcyB0bworLy8gdXNlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBBbmQsIGluZGVlZCwgSSBkaWQuICBJIGhhdmUgY29kZSB3aGljaAorLy8gaW1wbGVtZW50cyB0aGlzIHNhbWUgY2xhc3MgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucy4gIEl0J3MgYWJvdXQgMjAwCisvLyBsaW5lcyBzaG9ydGVyLiAgSG93ZXZlcjoKKy8vIC0gUmF0aGVyIHRoYW4gZXJyb3IgbWVzc2FnZXMgdGVsbGluZyB5b3UgIlRoaXMgc3RyaW5nIGhhcyBhbiBpbnZhbGlkCisvLyAgIGVzY2FwZSBzZXF1ZW5jZSBhdCBsaW5lIDUsIGNvbHVtbiA0NSIsIHlvdSBnZXQgZXJyb3IgbWVzc2FnZXMgbGlrZQorLy8gICAiUGFyc2UgZXJyb3Igb24gbGluZSA1Ii4gIEdpdmluZyBtb3JlIHByZWNpc2UgZXJyb3JzIHJlcXVpcmVzIGFkZGluZworLy8gICBhIGxvdCBvZiBjb2RlIHRoYXQgZW5kcyB1cCBiYXNpY2FsbHkgYXMgY29tcGxleCBhcyB0aGUgaGFuZC1jb2RlZAorLy8gICB2ZXJzaW9uIGFueXdheS4KKy8vIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhIHN0cmluZyBsaXRlcmFsIGxvb2tzIGxpa2UgdGhpczoKKy8vICAgICBrU3RyaW5nICA9IG5ldyBSRSgiKFwiKFteXCJcXFxcXXwiICAgICAgICAgICAgICAvLyBub24tZXNjYXBlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICJcXFxcW2FiZm5ydHY/XCInXFxcXDAtN118IiAgIC8vIG5vcm1hbCBlc2NhcGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAiXFxcXHhbMC05YS1mQS1GXSkqXCJ8IiAgICAgICAvLyBoZXggZXNjYXBlCisvLyAgICAgICAgICAgICAgICAgICAgICAgIlwnKFteXCdcXFxcXXwiICAgICAgICAvLyBBbHNvIHN1cHBvcnQgc2luZ2xlLXF1b3Rlcy4KKy8vICAgICAgICAgICAgICAgICAgICAgICAiXFxcXFthYmZucnR2P1wiJ1xcXFwwLTddfCIKKy8vICAgICAgICAgICAgICAgICAgICAgICAiXFxcXHhbMC05YS1mQS1GXSkqXCcpIik7CisvLyAgIFZlcmlmeWluZyB0aGUgY29ycmVjdG5lc3Mgb2YgdGhpcyBsaW5lIG5vaXNlIGlzIGFjdHVhbGx5IGhhcmRlciB0aGFuCisvLyAgIHZlcmlmeWluZyB0aGUgY29ycmVjdG5lc3Mgb2YgQ29uc3VtZVN0cmluZygpLCBkZWZpbmVkIGJlbG93LiAgSSdtIG5vdAorLy8gICBldmVuIGNvbmZpZGVudCB0aGF0IHRoZSBhYm92ZSBpcyBjb3JyZWN0LCBhZnRlciBzdGFyaW5nIGF0IGl0IGZvciBzb21lCisvLyAgIHRpbWUuCisvLyAtIFBDUkUgaXMgZmFzdCwgYnV0IHRoZXJlJ3Mgc3RpbGwgbW9yZSBvdmVyaGVhZCBpbnZvbHZlZCB0aGFuIHRoZSBjb2RlCisvLyAgIGJlbG93LgorLy8gLSBTYWRseSwgcmVndWxhciBleHByZXNzaW9ucyBhcmUgbm90IHBhcnQgb2YgdGhlIEMgc3RhbmRhcmQgbGlicmFyeSwgc28KKy8vICAgdXNpbmcgdGhlbSB3b3VsZCByZXF1aXJlIGRlcGVuZGluZyBvbiBzb21lIG90aGVyIGxpYnJhcnkuICBGb3IgdGhlCisvLyAgIG9wZW4gc291cmNlIHJlbGVhc2UsIHRoaXMgY291bGQgYmUgcmVhbGx5IGFubm95aW5nLiAgTm9ib2R5IGxpa2VzCisvLyAgIGRvd25sb2FkaW5nIG9uZSBwaWVjZSBvZiBzb2Z0d2FyZSBqdXN0IHRvIGZpbmQgdGhhdCB0aGV5IG5lZWQgdG8KKy8vICAgZG93bmxvYWQgc29tZXRoaW5nIGVsc2UgdG8gbWFrZSBpdCB3b3JrLCBhbmQgaW4gYWxsIGxpa2VsaWhvb2QKKy8vICAgcGVvcGxlIGRvd25sb2FkaW5nIFByb3RvY29sIEJ1ZmZlcnMgd2lsbCBhbHJlYWR5IGJlIGRvaW5nIHNvIGp1c3QKKy8vICAgdG8gbWFrZSBzb21ldGhpbmcgZWxzZSB3b3JrLiAgV2UgY291bGQgaW5jbHVkZSBhIGNvcHkgb2YgUENSRSB3aXRoCisvLyAgIG91ciBjb2RlLCBidXQgdGhhdCBvYmxpZ2F0ZXMgdXMgdG8ga2VlcCBpdCB1cC10by1kYXRlIGFuZCBqdXN0IHNlZW1zCisvLyAgIGxpa2UgYSBiaWcgd2FzdGUganVzdCB0byBzYXZlIDIwMCBsaW5lcyBvZiBjb2RlLgorLy8KKy8vIE9uIGEgc2ltaWxhciBidXQgdW5yZWxhdGVkIG5vdGUsIEknbSBldmVuIHNjYXJlZCB0byB1c2UgY3R5cGUuaC4KKy8vIEFwcGFyZW50bHkgZnVuY3Rpb25zIGxpa2UgaXNhbHBoYSgpIGFyZSBsb2NhbGUtZGVwZW5kZW50LiAgU28sIGlmIHdlIHVzZWQKKy8vIHRoYXQsIHRoZW4gaWYgdGhpcyBjb2RlIGlzIGJlaW5nIGNhbGxlZCBmcm9tIHNvbWUgcHJvZ3JhbSB0aGF0IGRvZXNuJ3QKKy8vIGhhdmUgaXRzIGxvY2FsZSBzZXQgdG8gIkMiLCBpdCB3b3VsZCBiZWhhdmUgc3RyYW5nZWx5LiAgV2UgY2FuJ3QganVzdCBzZXQKKy8vIHRoZSBsb2NhbGUgdG8gIkMiIG91cnNlbHZlcyBzaW5jZSB3ZSBtaWdodCBicmVhayB0aGUgY2FsbGluZyBwcm9ncmFtIHRoYXQKKy8vIHdheSwgcGFydGljdWxhcmx5IGlmIGl0IGlzIG11bHRpLXRocmVhZGVkLiAgV1RGPyAgU29tZW9uZSBwbGVhc2UgbGV0IG1lCisvLyAoS2VudG9uKSBrbm93IGlmIEknbSBtaXNzaW5nIHNvbWV0aGluZyBoZXJlLi4uCisvLworLy8gSSdkIGxvdmUgdG8gaGVhciBhYm91dCBvdGhlciBhbHRlcm5hdGl2ZXMsIHRob3VnaCwgYXMgdGhpcyBjb2RlIGlzbid0CisvLyBleGFjdGx5IHByZXR0eS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbyB7CituYW1lc3BhY2UgeworCisvLyBBcyBtZW50aW9uZWQgYWJvdmUsIEkgZG9uJ3QgdHJ1c3QgY3R5cGUuaCBkdWUgdG8gdGhlIHByZXNlbmNlIG9mICJsb2NhbGVzIi4KKy8vIFNvLCBJIGhhdmUgd3JpdHRlbiByZXBsYWNlbWVudCBmdW5jdGlvbnMgaGVyZS4gIFNvbWVvbmUgcGxlYXNlIHNtYWNrIG1lIGlmCisvLyB0aGlzIGlzIGEgYmFkIGlkZWEgb3IgaWYgdGhlcmUgaXMgc29tZSB3YXkgYXJvdW5kIHRoaXMuCisvLworLy8gVGhlc2UgImNoYXJhY3RlciBjbGFzc2VzIiBhcmUgZGVzaWduZWQgdG8gYmUgdXNlZCBpbiB0ZW1wbGF0ZSBtZXRob2RzLgorLy8gRm9yIGluc3RhbmNlLCBUb2tlbml6ZXI6OkNvbnN1bWVaZXJvT3JNb3JlPFdoaXRlc3BhY2U+KCkgd2lsbCBlYXQKKy8vIHdoaXRlc3BhY2UuCisKKy8vIE5vdGU6ICBObyBjbGFzcyBpcyBhbGxvd2VkIHRvIGNvbnRhaW4gJ1wwJywgc2luY2UgdGhpcyBpcyB1c2VkIHRvIG1hcmsgZW5kLQorLy8gICBvZi1pbnB1dCBhbmQgaXMgaGFuZGxlZCBzcGVjaWFsbHkuCisKKyNkZWZpbmUgQ0hBUkFDVEVSX0NMQVNTKE5BTUUsIEVYUFJFU1NJT04pICAgICAgXAorICBjbGFzcyBOQU1FIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgSW5DbGFzcyhjaGFyIGMpIHsgICAgICAgXAorICAgICAgcmV0dXJuIEVYUFJFU1NJT047ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitDSEFSQUNURVJfQ0xBU1MoV2hpdGVzcGFjZSwgYyA9PSAnICcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1x0JyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJ1xyJyB8fCBjID09ICdcdicgfHwgYyA9PSAnXGYnKTsKKworQ0hBUkFDVEVSX0NMQVNTKFVucHJpbnRhYmxlLCBjIDwgJyAnICYmIGMgPiAnXDAnKTsKKworQ0hBUkFDVEVSX0NMQVNTKERpZ2l0LCAnMCcgPD0gYyAmJiBjIDw9ICc5Jyk7CitDSEFSQUNURVJfQ0xBU1MoT2N0YWxEaWdpdCwgJzAnIDw9IGMgJiYgYyA8PSAnNycpOworQ0hBUkFDVEVSX0NMQVNTKEhleERpZ2l0LCAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICgnYScgPD0gYyAmJiBjIDw9ICdmJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdBJyA8PSBjICYmIGMgPD0gJ0YnKSk7CisKK0NIQVJBQ1RFUl9DTEFTUyhMZXR0ZXIsICgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgnQScgPD0gYyAmJiBjIDw9ICdaJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjID09ICdfJykpOworCitDSEFSQUNURVJfQ0xBU1MoQWxwaGFudW1lcmljLCAoJ2EnIDw9IGMgJiYgYyA8PSAneicpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA9PSAnXycpKTsKKworQ0hBUkFDVEVSX0NMQVNTKEVzY2FwZSwgYyA9PSAnYScgfHwgYyA9PSAnYicgfHwgYyA9PSAnZicgfHwgYyA9PSAnbicgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJ3InIHx8IGMgPT0gJ3QnIHx8IGMgPT0gJ3YnIHx8IGMgPT0gJ1xcJyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnPycgfHwgYyA9PSAnXCcnIHx8IGMgPT0gJ1wiJyk7CisKKyN1bmRlZiBDSEFSQUNURVJfQ0xBU1MKKworLy8gR2l2ZW4gYSBjaGFyLCBpbnRlcnByZXQgaXQgYXMgYSBudW1lcmljIGRpZ2l0IGFuZCByZXR1cm4gaXRzIHZhbHVlLgorLy8gVGhpcyBzdXBwb3J0cyBhbnkgbnVtYmVyIGJhc2UgdXAgdG8gMzYuCitpbmxpbmUgaW50IERpZ2l0VmFsdWUoY2hhciBkaWdpdCkgeworICBpZiAoJzAnIDw9IGRpZ2l0ICYmIGRpZ2l0IDw9ICc5JykgcmV0dXJuIGRpZ2l0IC0gJzAnOworICBpZiAoJ2EnIDw9IGRpZ2l0ICYmIGRpZ2l0IDw9ICd6JykgcmV0dXJuIGRpZ2l0IC0gJ2EnICsgMTA7CisgIGlmICgnQScgPD0gZGlnaXQgJiYgZGlnaXQgPD0gJ1onKSByZXR1cm4gZGlnaXQgLSAnQScgKyAxMDsKKyAgcmV0dXJuIC0xOworfQorCisvLyBJbmxpbmUgYmVjYXVzZSBpdCdzIG9ubHkgdXNlZCBpbiBvbmUgcGxhY2UuCitpbmxpbmUgY2hhciBUcmFuc2xhdGVFc2NhcGUoY2hhciBjKSB7CisgIHN3aXRjaCAoYykgeworICAgIGNhc2UgJ2EnOiAgcmV0dXJuICdcYSc7CisgICAgY2FzZSAnYic6ICByZXR1cm4gJ1xiJzsKKyAgICBjYXNlICdmJzogIHJldHVybiAnXGYnOworICAgIGNhc2UgJ24nOiAgcmV0dXJuICdcbic7CisgICAgY2FzZSAncic6ICByZXR1cm4gJ1xyJzsKKyAgICBjYXNlICd0JzogIHJldHVybiAnXHQnOworICAgIGNhc2UgJ3YnOiAgcmV0dXJuICdcdic7CisgICAgY2FzZSAnXFwnOiByZXR1cm4gJ1xcJzsKKyAgICBjYXNlICc/JzogIHJldHVybiAnXD8nOyAgICAvLyBUcmlncmFwaHMgPSA6KAorICAgIGNhc2UgJ1wnJzogcmV0dXJuICdcJyc7CisgICAgY2FzZSAnIic6ICByZXR1cm4gJ1wiJzsKKworICAgIC8vIFdlIGV4cGVjdCBlc2NhcGUgc2VxdWVuY2VzIHRvIGhhdmUgYmVlbiB2YWxpZGF0ZWQgc2VwYXJhdGVseS4KKyAgICBkZWZhdWx0OiAgIHJldHVybiAnPyc7CisgIH0KK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitFcnJvckNvbGxlY3Rvcjo6fkVycm9yQ29sbGVjdG9yKCkge30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUb2tlbml6ZXI6OlRva2VuaXplcihaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpCisgIDogaW5wdXRfKGlucHV0KSwKKyAgICBlcnJvcl9jb2xsZWN0b3JfKGVycm9yX2NvbGxlY3RvciksCisgICAgYnVmZmVyXyhOVUxMKSwKKyAgICBidWZmZXJfc2l6ZV8oMCksCisgICAgYnVmZmVyX3Bvc18oMCksCisgICAgcmVhZF9lcnJvcl8oZmFsc2UpLAorICAgIGxpbmVfKDApLAorICAgIGNvbHVtbl8oMCksCisgICAgdG9rZW5fc3RhcnRfKC0xKSwKKyAgICBhbGxvd19mX2FmdGVyX2Zsb2F0XyhmYWxzZSksCisgICAgY29tbWVudF9zdHlsZV8oQ1BQX0NPTU1FTlRfU1RZTEUpIHsKKworICBjdXJyZW50Xy5saW5lID0gMDsKKyAgY3VycmVudF8uY29sdW1uID0gMDsKKyAgY3VycmVudF8uZW5kX2NvbHVtbiA9IDA7CisgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NUQVJUOworCisgIFJlZnJlc2goKTsKK30KKworVG9rZW5pemVyOjp+VG9rZW5pemVyKCkgeworICAvLyBJZiB3ZSBoYWQgYW55IGJ1ZmZlciBsZWZ0IHVucmVhZCwgcmV0dXJuIGl0IHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbQorICAvLyBzbyB0aGF0IHNvbWVvbmUgZWxzZSBjYW4gcmVhZCBpdC4KKyAgaWYgKGJ1ZmZlcl9zaXplXyA+IGJ1ZmZlcl9wb3NfKSB7CisgICAgaW5wdXRfLT5CYWNrVXAoYnVmZmVyX3NpemVfIC0gYnVmZmVyX3Bvc18pOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIGhlbHBlcnMuCisKK3ZvaWQgVG9rZW5pemVyOjpOZXh0Q2hhcigpIHsKKyAgLy8gVXBkYXRlIG91ciBsaW5lIGFuZCBjb2x1bW4gY291bnRlcnMgYmFzZWQgb24gdGhlIGNoYXJhY3RlciBiZWluZworICAvLyBjb25zdW1lZC4KKyAgaWYgKGN1cnJlbnRfY2hhcl8gPT0gJ1xuJykgeworICAgICsrbGluZV87CisgICAgY29sdW1uXyA9IDA7CisgIH0gZWxzZSBpZiAoY3VycmVudF9jaGFyXyA9PSAnXHQnKSB7CisgICAgY29sdW1uXyArPSBrVGFiV2lkdGggLSBjb2x1bW5fICUga1RhYldpZHRoOworICB9IGVsc2UgeworICAgICsrY29sdW1uXzsKKyAgfQorCisgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgY2hhcmFjdGVyLgorICArK2J1ZmZlcl9wb3NfOworICBpZiAoYnVmZmVyX3Bvc18gPCBidWZmZXJfc2l6ZV8pIHsKKyAgICBjdXJyZW50X2NoYXJfID0gYnVmZmVyX1tidWZmZXJfcG9zX107CisgIH0gZWxzZSB7CisgICAgUmVmcmVzaCgpOworICB9Cit9CisKK3ZvaWQgVG9rZW5pemVyOjpSZWZyZXNoKCkgeworICBpZiAocmVhZF9lcnJvcl8pIHsKKyAgICBjdXJyZW50X2NoYXJfID0gJ1wwJzsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJZiB3ZSdyZSBpbiBhIHRva2VuLCBhcHBlbmQgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciB0byBpdC4KKyAgaWYgKHRva2VuX3N0YXJ0XyA+PSAwICYmIHRva2VuX3N0YXJ0XyA8IGJ1ZmZlcl9zaXplXykgeworICAgIGN1cnJlbnRfLnRleHQuYXBwZW5kKGJ1ZmZlcl8gKyB0b2tlbl9zdGFydF8sIGJ1ZmZlcl9zaXplXyAtIHRva2VuX3N0YXJ0Xyk7CisgICAgdG9rZW5fc3RhcnRfID0gMDsKKyAgfQorCisgIGNvbnN0IHZvaWQqIGRhdGEgPSBOVUxMOworICBidWZmZXJfID0gTlVMTDsKKyAgYnVmZmVyX3Bvc18gPSAwOworICBkbyB7CisgICAgaWYgKCFpbnB1dF8tPk5leHQoJmRhdGEsICZidWZmZXJfc2l6ZV8pKSB7CisgICAgICAvLyBlbmQgb2Ygc3RyZWFtIChvciByZWFkIGVycm9yKQorICAgICAgYnVmZmVyX3NpemVfID0gMDsKKyAgICAgIHJlYWRfZXJyb3JfID0gdHJ1ZTsKKyAgICAgIGN1cnJlbnRfY2hhcl8gPSAnXDAnOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSB3aGlsZSAoYnVmZmVyX3NpemVfID09IDApOworCisgIGJ1ZmZlcl8gPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSk7CisKKyAgY3VycmVudF9jaGFyXyA9IGJ1ZmZlcl9bMF07Cit9CisKK2lubGluZSB2b2lkIFRva2VuaXplcjo6U3RhcnRUb2tlbigpIHsKKyAgdG9rZW5fc3RhcnRfID0gYnVmZmVyX3Bvc187CisgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NUQVJUOyAgICAvLyBKdXN0IGZvciB0aGUgc2FrZSBvZiBpbml0aWFsaXppbmcgaXQuCisgIGN1cnJlbnRfLnRleHQuY2xlYXIoKTsKKyAgY3VycmVudF8ubGluZSA9IGxpbmVfOworICBjdXJyZW50Xy5jb2x1bW4gPSBjb2x1bW5fOworfQorCitpbmxpbmUgdm9pZCBUb2tlbml6ZXI6OkVuZFRva2VuKCkgeworICAvLyBOb3RlOiAgVGhlIGlmKCkgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSBTVEwgaW1wbGVtZW50YXRpb25zIGNyYXNoIHdoZW4KKyAgLy8gICB5b3UgY2FsbCBzdHJpbmc6OmFwcGVuZChOVUxMLCAwKSwgcHJlc3VtYWJseSBiZWNhdXNlIHRoZXkgYXJlIHRyeWluZyB0bworICAvLyAgIGJlIGhlbHBmdWwgYnkgZGV0ZWN0aW5nIHRoZSBOVUxMIHBvaW50ZXIsIGV2ZW4gdGhvdWdoIHRoZXJlJ3Mgbm90aGluZworICAvLyAgIHdyb25nIHdpdGggcmVhZGluZyB6ZXJvIGJ5dGVzIGZyb20gTlVMTC4KKyAgaWYgKGJ1ZmZlcl9wb3NfICE9IHRva2VuX3N0YXJ0XykgeworICAgIGN1cnJlbnRfLnRleHQuYXBwZW5kKGJ1ZmZlcl8gKyB0b2tlbl9zdGFydF8sIGJ1ZmZlcl9wb3NfIC0gdG9rZW5fc3RhcnRfKTsKKyAgfQorICB0b2tlbl9zdGFydF8gPSAtMTsKKyAgY3VycmVudF8uZW5kX2NvbHVtbiA9IGNvbHVtbl87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBtZXRob2RzIHRoYXQgY29uc3VtZSBjaGFyYWN0ZXJzLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KK2lubGluZSBib29sIFRva2VuaXplcjo6TG9va2luZ0F0KCkgeworICByZXR1cm4gQ2hhcmFjdGVyQ2xhc3M6OkluQ2xhc3MoY3VycmVudF9jaGFyXyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlckNsYXNzPgoraW5saW5lIGJvb2wgVG9rZW5pemVyOjpUcnlDb25zdW1lT25lKCkgeworICBpZiAoQ2hhcmFjdGVyQ2xhc3M6OkluQ2xhc3MoY3VycmVudF9jaGFyXykpIHsKKyAgICBOZXh0Q2hhcigpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitpbmxpbmUgYm9vbCBUb2tlbml6ZXI6OlRyeUNvbnN1bWUoY2hhciBjKSB7CisgIGlmIChjdXJyZW50X2NoYXJfID09IGMpIHsKKyAgICBOZXh0Q2hhcigpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KK2lubGluZSB2b2lkIFRva2VuaXplcjo6Q29uc3VtZVplcm9Pck1vcmUoKSB7CisgIHdoaWxlIChDaGFyYWN0ZXJDbGFzczo6SW5DbGFzcyhjdXJyZW50X2NoYXJfKSkgeworICAgIE5leHRDaGFyKCk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyQ2xhc3M+CitpbmxpbmUgdm9pZCBUb2tlbml6ZXI6OkNvbnN1bWVPbmVPck1vcmUoY29uc3QgY2hhciogZXJyb3IpIHsKKyAgaWYgKCFDaGFyYWN0ZXJDbGFzczo6SW5DbGFzcyhjdXJyZW50X2NoYXJfKSkgeworICAgIEFkZEVycm9yKGVycm9yKTsKKyAgfSBlbHNlIHsKKyAgICBkbyB7CisgICAgICBOZXh0Q2hhcigpOworICAgIH0gd2hpbGUgKENoYXJhY3RlckNsYXNzOjpJbkNsYXNzKGN1cnJlbnRfY2hhcl8pKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRob2RzIHRoYXQgcmVhZCB3aG9sZSBwYXR0ZXJucyBtYXRjaGluZyBjZXJ0YWluIGtpbmRzIG9mIHRva2VucworLy8gb3IgY29tbWVudHMuCisKK3ZvaWQgVG9rZW5pemVyOjpDb25zdW1lU3RyaW5nKGNoYXIgZGVsaW1pdGVyKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgc3dpdGNoIChjdXJyZW50X2NoYXJfKSB7CisgICAgICBjYXNlICdcMCc6CisgICAgICBjYXNlICdcbic6IHsKKyAgICAgICAgQWRkRXJyb3IoIlN0cmluZyBsaXRlcmFscyBjYW5ub3QgY3Jvc3MgbGluZSBib3VuZGFyaWVzLiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGNhc2UgJ1xcJzogeworICAgICAgICAvLyBBbiBlc2NhcGUgc2VxdWVuY2UuCisgICAgICAgIE5leHRDaGFyKCk7CisgICAgICAgIGlmIChUcnlDb25zdW1lT25lPEVzY2FwZT4oKSkgeworICAgICAgICAgIC8vIFZhbGlkIGVzY2FwZSBzZXF1ZW5jZS4KKyAgICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lT25lPE9jdGFsRGlnaXQ+KCkpIHsKKyAgICAgICAgICAvLyBQb3NzaWJseSBmb2xsb3dlZCBieSB0d28gbW9yZSBvY3RhbCBkaWdpdHMsIGJ1dCB0aGVzZSB3aWxsCisgICAgICAgICAgLy8ganVzdCBiZSBjb25zdW1lZCBieSB0aGUgbWFpbiBsb29wIGFueXdheSBzbyB3ZSBkb24ndCBuZWVkCisgICAgICAgICAgLy8gdG8gZG8gc28gZXhwbGljaXRseSBoZXJlLgorICAgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJ3gnKSB8fCBUcnlDb25zdW1lKCdYJykpIHsKKyAgICAgICAgICBpZiAoIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkpIHsKKyAgICAgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBoZXggZGlnaXRzIGZvciBlc2NhcGUgc2VxdWVuY2UuIik7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFBvc3NpYmx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgaGV4IGRpZ2l0LCBidXQgYWdhaW4gd2UgZG9uJ3QgY2FyZS4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBBZGRFcnJvcigiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgaW4gc3RyaW5nIGxpdGVyYWwuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgaWYgKGN1cnJlbnRfY2hhcl8gPT0gZGVsaW1pdGVyKSB7CisgICAgICAgICAgTmV4dENoYXIoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTmV4dENoYXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK1Rva2VuaXplcjo6VG9rZW5UeXBlIFRva2VuaXplcjo6Q29uc3VtZU51bWJlcihib29sIHN0YXJ0ZWRfd2l0aF96ZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhcnRlZF93aXRoX2RvdCkgeworICBib29sIGlzX2Zsb2F0ID0gZmFsc2U7CisKKyAgaWYgKHN0YXJ0ZWRfd2l0aF96ZXJvICYmIChUcnlDb25zdW1lKCd4JykgfHwgVHJ5Q29uc3VtZSgnWCcpKSkgeworICAgIC8vIEEgaGV4IG51bWJlciAoc3RhcnRlZCB3aXRoICIweCIpLgorICAgIENvbnN1bWVPbmVPck1vcmU8SGV4RGlnaXQ+KCJcIjB4XCIgbXVzdCBiZSBmb2xsb3dlZCBieSBoZXggZGlnaXRzLiIpOworCisgIH0gZWxzZSBpZiAoc3RhcnRlZF93aXRoX3plcm8gJiYgTG9va2luZ0F0PERpZ2l0PigpKSB7CisgICAgLy8gQW4gb2N0YWwgbnVtYmVyIChoYWQgYSBsZWFkaW5nIHplcm8pLgorICAgIENvbnN1bWVaZXJvT3JNb3JlPE9jdGFsRGlnaXQ+KCk7CisgICAgaWYgKExvb2tpbmdBdDxEaWdpdD4oKSkgeworICAgICAgQWRkRXJyb3IoIk51bWJlcnMgc3RhcnRpbmcgd2l0aCBsZWFkaW5nIHplcm8gbXVzdCBiZSBpbiBvY3RhbC4iKTsKKyAgICAgIENvbnN1bWVaZXJvT3JNb3JlPERpZ2l0PigpOworICAgIH0KKworICB9IGVsc2UgeworICAgIC8vIEEgZGVjaW1hbCBudW1iZXIuCisgICAgaWYgKHN0YXJ0ZWRfd2l0aF9kb3QpIHsKKyAgICAgIGlzX2Zsb2F0ID0gdHJ1ZTsKKyAgICAgIENvbnN1bWVaZXJvT3JNb3JlPERpZ2l0PigpOworICAgIH0gZWxzZSB7CisgICAgICBDb25zdW1lWmVyb09yTW9yZTxEaWdpdD4oKTsKKworICAgICAgaWYgKFRyeUNvbnN1bWUoJy4nKSkgeworICAgICAgICBpc19mbG9hdCA9IHRydWU7CisgICAgICAgIENvbnN1bWVaZXJvT3JNb3JlPERpZ2l0PigpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChUcnlDb25zdW1lKCdlJykgfHwgVHJ5Q29uc3VtZSgnRScpKSB7CisgICAgICBpc19mbG9hdCA9IHRydWU7CisgICAgICBUcnlDb25zdW1lKCctJykgfHwgVHJ5Q29uc3VtZSgnKycpOworICAgICAgQ29uc3VtZU9uZU9yTW9yZTxEaWdpdD4oIlwiZVwiIG11c3QgYmUgZm9sbG93ZWQgYnkgZXhwb25lbnQuIik7CisgICAgfQorCisgICAgaWYgKGFsbG93X2ZfYWZ0ZXJfZmxvYXRfICYmIChUcnlDb25zdW1lKCdmJykgfHwgVHJ5Q29uc3VtZSgnRicpKSkgeworICAgICAgaXNfZmxvYXQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIGlmIChMb29raW5nQXQ8TGV0dGVyPigpKSB7CisgICAgQWRkRXJyb3IoIk5lZWQgc3BhY2UgYmV0d2VlbiBudW1iZXIgYW5kIGlkZW50aWZpZXIuIik7CisgIH0gZWxzZSBpZiAoY3VycmVudF9jaGFyXyA9PSAnLicpIHsKKyAgICBpZiAoaXNfZmxvYXQpIHsKKyAgICAgIEFkZEVycm9yKAorICAgICAgICAiQWxyZWFkeSBzYXcgZGVjaW1hbCBwb2ludCBvciBleHBvbmVudDsgY2FuJ3QgaGF2ZSBhbm90aGVyIG9uZS4iKTsKKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IoIkhleCBhbmQgb2N0YWwgbnVtYmVycyBtdXN0IGJlIGludGVnZXJzLiIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBpc19mbG9hdCA/IFRZUEVfRkxPQVQgOiBUWVBFX0lOVEVHRVI7Cit9CisKK3ZvaWQgVG9rZW5pemVyOjpDb25zdW1lTGluZUNvbW1lbnQoKSB7CisgIHdoaWxlIChjdXJyZW50X2NoYXJfICE9ICdcMCcgJiYgY3VycmVudF9jaGFyXyAhPSAnXG4nKSB7CisgICAgTmV4dENoYXIoKTsKKyAgfQorICBUcnlDb25zdW1lKCdcbicpOworfQorCit2b2lkIFRva2VuaXplcjo6Q29uc3VtZUJsb2NrQ29tbWVudCgpIHsKKyAgaW50IHN0YXJ0X2xpbmUgPSBsaW5lXzsKKyAgaW50IHN0YXJ0X2NvbHVtbiA9IGNvbHVtbl8gLSAyOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgd2hpbGUgKGN1cnJlbnRfY2hhcl8gIT0gJ1wwJyAmJgorICAgICAgICAgICBjdXJyZW50X2NoYXJfICE9ICcqJyAmJgorICAgICAgICAgICBjdXJyZW50X2NoYXJfICE9ICcvJykgeworICAgICAgTmV4dENoYXIoKTsKKyAgICB9CisKKyAgICBpZiAoVHJ5Q29uc3VtZSgnKicpICYmIFRyeUNvbnN1bWUoJy8nKSkgeworICAgICAgLy8gRW5kIG9mIGNvbW1lbnQuCisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJy8nKSAmJiBjdXJyZW50X2NoYXJfID09ICcqJykgeworICAgICAgLy8gTm90ZTogIFdlIGRpZG4ndCBjb25zdW1lIHRoZSAnKicgYmVjYXVzZSBpZiB0aGVyZSBpcyBhICcvJyBhZnRlciBpdAorICAgICAgLy8gICB3ZSB3YW50IHRvIGludGVycHJldCB0aGF0IGFzIHRoZSBlbmQgb2YgdGhlIGNvbW1lbnQuCisgICAgICBBZGRFcnJvcigKKyAgICAgICAgIlwiLypcIiBpbnNpZGUgYmxvY2sgY29tbWVudC4gIEJsb2NrIGNvbW1lbnRzIGNhbm5vdCBiZSBuZXN0ZWQuIik7CisgICAgfSBlbHNlIGlmIChjdXJyZW50X2NoYXJfID09ICdcMCcpIHsKKyAgICAgIEFkZEVycm9yKCJFbmQtb2YtZmlsZSBpbnNpZGUgYmxvY2sgY29tbWVudC4iKTsKKyAgICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKAorICAgICAgICBzdGFydF9saW5lLCBzdGFydF9jb2x1bW4sICIgIENvbW1lbnQgc3RhcnRlZCBoZXJlLiIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBUb2tlbml6ZXI6Ok5leHQoKSB7CisgIHByZXZpb3VzXyA9IGN1cnJlbnRfOworCisgIC8vIERpZCB3ZSBza2lwIGFueSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBsYXN0IHRva2VuPworICBib29sIHNraXBwZWRfc3R1ZmYgPSBmYWxzZTsKKworICB3aGlsZSAoIXJlYWRfZXJyb3JfKSB7CisgICAgaWYgKFRyeUNvbnN1bWVPbmU8V2hpdGVzcGFjZT4oKSkgeworICAgICAgQ29uc3VtZVplcm9Pck1vcmU8V2hpdGVzcGFjZT4oKTsKKworICAgIH0gZWxzZSBpZiAoY29tbWVudF9zdHlsZV8gPT0gQ1BQX0NPTU1FTlRfU1RZTEUgJiYgVHJ5Q29uc3VtZSgnLycpKSB7CisgICAgICAvLyBTdGFydGluZyBhIGNvbW1lbnQ/CisgICAgICBpZiAoVHJ5Q29uc3VtZSgnLycpKSB7CisgICAgICAgIENvbnN1bWVMaW5lQ29tbWVudCgpOworICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCcqJykpIHsKKyAgICAgICAgQ29uc3VtZUJsb2NrQ29tbWVudCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gT29wcywgaXQgd2FzIGp1c3QgYSBzbGFzaC4gIFJldHVybiBpdC4KKyAgICAgICAgY3VycmVudF8udHlwZSA9IFRZUEVfU1lNQk9MOworICAgICAgICBjdXJyZW50Xy50ZXh0ID0gIi8iOworICAgICAgICBjdXJyZW50Xy5saW5lID0gbGluZV87CisgICAgICAgIGN1cnJlbnRfLmNvbHVtbiA9IGNvbHVtbl8gLSAxOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAoY29tbWVudF9zdHlsZV8gPT0gU0hfQ09NTUVOVF9TVFlMRSAmJiBUcnlDb25zdW1lKCcjJykpIHsKKyAgICAgIENvbnN1bWVMaW5lQ29tbWVudCgpOworCisgICAgfSBlbHNlIGlmIChMb29raW5nQXQ8VW5wcmludGFibGU+KCkgfHwgY3VycmVudF9jaGFyXyA9PSAnXDAnKSB7CisgICAgICBBZGRFcnJvcigiSW52YWxpZCBjb250cm9sIGNoYXJhY3RlcnMgZW5jb3VudGVyZWQgaW4gdGV4dC4iKTsKKyAgICAgIE5leHRDaGFyKCk7CisgICAgICAvLyBTa2lwIG1vcmUgdW5wcmludGFibGUgY2hhcmFjdGVycywgdG9vLiAgQnV0LCByZW1lbWJlciB0aGF0ICdcMCcgaXMKKyAgICAgIC8vIGFsc28gd2hhdCBjdXJyZW50X2NoYXJfIGlzIHNldCB0byBhZnRlciBFT0YgLyByZWFkIGVycm9yLiAgV2UgaGF2ZQorICAgICAgLy8gdG8gYmUgY2FyZWZ1bCBub3QgdG8gZ28gaW50byBhbiBpbmZpbml0ZSBsb29wIG9mIHRyeWluZyB0byBjb25zdW1lCisgICAgICAvLyBpdCwgc28gbWFrZSBzdXJlIHRvIGNoZWNrIHJlYWRfZXJyb3JfIGV4cGxpY2l0bHkgYmVmb3JlIGNvbnN1bWluZworICAgICAgLy8gJ1wwJy4KKyAgICAgIHdoaWxlIChUcnlDb25zdW1lT25lPFVucHJpbnRhYmxlPigpIHx8CisgICAgICAgICAgICAgKCFyZWFkX2Vycm9yXyAmJiBUcnlDb25zdW1lKCdcMCcpKSkgeworICAgICAgICAvLyBJZ25vcmUuCisgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgLy8gUmVhZGluZyBzb21lIHNvcnQgb2YgdG9rZW4uCisgICAgICBTdGFydFRva2VuKCk7CisKKyAgICAgIGlmIChUcnlDb25zdW1lT25lPExldHRlcj4oKSkgeworICAgICAgICBDb25zdW1lWmVyb09yTW9yZTxBbHBoYW51bWVyaWM+KCk7CisgICAgICAgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX0lERU5USUZJRVI7CisgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJzAnKSkgeworICAgICAgICBjdXJyZW50Xy50eXBlID0gQ29uc3VtZU51bWJlcih0cnVlLCBmYWxzZSk7CisgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJy4nKSkgeworICAgICAgICAvLyBUaGlzIGNvdWxkIGJlIHRoZSBiZWdpbm5pbmcgb2YgYSBmbG9hdGluZy1wb2ludCBudW1iZXIsIG9yIGl0IGNvdWxkCisgICAgICAgIC8vIGp1c3QgYmUgYSAnLicgc3ltYm9sLgorCisgICAgICAgIGlmIChUcnlDb25zdW1lT25lPERpZ2l0PigpKSB7CisgICAgICAgICAgLy8gSXQncyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgICAgICAgICBpZiAocHJldmlvdXNfLnR5cGUgPT0gVFlQRV9JREVOVElGSUVSICYmICFza2lwcGVkX3N0dWZmKSB7CisgICAgICAgICAgICAvLyBXZSBkb24ndCBhY2NlcHQgc3ludGF4IGxpa2UgImJsYWguMTIzIi4KKyAgICAgICAgICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGxpbmVfLCBjb2x1bW5fIC0gMiwKKyAgICAgICAgICAgICAgIk5lZWQgc3BhY2UgYmV0d2VlbiBpZGVudGlmaWVyIGFuZCBkZWNpbWFsIHBvaW50LiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjdXJyZW50Xy50eXBlID0gQ29uc3VtZU51bWJlcihmYWxzZSwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY3VycmVudF8udHlwZSA9IFRZUEVfU1lNQk9MOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWVPbmU8RGlnaXQ+KCkpIHsKKyAgICAgICAgY3VycmVudF8udHlwZSA9IENvbnN1bWVOdW1iZXIoZmFsc2UsIGZhbHNlKTsKKyAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgnXCInKSkgeworICAgICAgICBDb25zdW1lU3RyaW5nKCdcIicpOworICAgICAgICBjdXJyZW50Xy50eXBlID0gVFlQRV9TVFJJTkc7CisgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJ1wnJykpIHsKKyAgICAgICAgQ29uc3VtZVN0cmluZygnXCcnKTsKKyAgICAgICAgY3VycmVudF8udHlwZSA9IFRZUEVfU1RSSU5HOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTmV4dENoYXIoKTsKKyAgICAgICAgY3VycmVudF8udHlwZSA9IFRZUEVfU1lNQk9MOworICAgICAgfQorCisgICAgICBFbmRUb2tlbigpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc2tpcHBlZF9zdHVmZiA9IHRydWU7CisgIH0KKworICAvLyBFT0YKKyAgY3VycmVudF8udHlwZSA9IFRZUEVfRU5EOworICBjdXJyZW50Xy50ZXh0LmNsZWFyKCk7CisgIGN1cnJlbnRfLmxpbmUgPSBsaW5lXzsKKyAgY3VycmVudF8uY29sdW1uID0gY29sdW1uXzsKKyAgY3VycmVudF8uZW5kX2NvbHVtbiA9IGNvbHVtbl87CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVG9rZW4tcGFyc2luZyBoZWxwZXJzLiAgUmVtZW1iZXIgdGhhdCB0aGVzZSBkb24ndCBuZWVkIHRvIHJlcG9ydAorLy8gZXJyb3JzIHNpbmNlIGFueSBlcnJvcnMgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIHJlcG9ydGVkIHdoaWxlCisvLyB0b2tlbml6aW5nLiAgQWxzbywgdGhlc2UgY2FuIGFzc3VtZSB0aGF0IHdoYXRldmVyIHRleHQgdGhleQorLy8gYXJlIGdpdmVuIGlzIHRleHQgdGhhdCB0aGUgdG9rZW5pemVyIGFjdHVhbGx5IHBhcnNlZCBhcyBhIHRva2VuCisvLyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKworYm9vbCBUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcihjb25zdCBzdHJpbmcmIHRleHQsIHVpbnQ2NCBtYXhfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NCogb3V0cHV0KSB7CisgIC8vIFNhZGx5LCB3ZSBjYW4ndCBqdXN0IHVzZSBzdHJ0b3VsKCkgc2luY2UgaXQgaXMgb25seSAzMi1iaXQgYW5kIHN0cnRvdWxsKCkKKyAgLy8gaXMgbm9uLXN0YW5kYXJkLiAgSSBoYXRlIHRoZSBDIHN0YW5kYXJkIGxpYnJhcnkuICA6KAorCisvLyAgcmV0dXJuIHN0cnRvdWxsKHRleHQuY19zdHIoKSwgTlVMTCwgMCk7CisKKyAgY29uc3QgY2hhciogcHRyID0gdGV4dC5jX3N0cigpOworICBpbnQgYmFzZSA9IDEwOworICBpZiAocHRyWzBdID09ICcwJykgeworICAgIGlmIChwdHJbMV0gPT0gJ3gnIHx8IHB0clsxXSA9PSAnWCcpIHsKKyAgICAgIC8vIFRoaXMgaXMgaGV4LgorICAgICAgYmFzZSA9IDE2OworICAgICAgcHRyICs9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoaXMgaXMgb2N0YWwuCisgICAgICBiYXNlID0gODsKKyAgICB9CisgIH0KKworICB1aW50NjQgcmVzdWx0ID0gMDsKKyAgZm9yICg7ICpwdHIgIT0gJ1wwJzsgcHRyKyspIHsKKyAgICBpbnQgZGlnaXQgPSBEaWdpdFZhbHVlKCpwdHIpOworICAgIEdPT0dMRV9MT0dfSUYoREZBVEFMLCBkaWdpdCA8IDAgfHwgZGlnaXQgPj0gYmFzZSkKKyAgICAgIDw8ICIgVG9rZW5pemVyOjpQYXJzZUludGVnZXIoKSBwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4iCisgICAgICAgICAiIHRva2VuaXplZCBhcyBhbiBpbnRlZ2VyOiAiIDw8IENFc2NhcGUodGV4dCk7CisgICAgaWYgKGRpZ2l0ID4gbWF4X3ZhbHVlIHx8IHJlc3VsdCA+IChtYXhfdmFsdWUgLSBkaWdpdCkgLyBiYXNlKSB7CisgICAgICAvLyBPdmVyZmxvdy4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIGRpZ2l0OworICB9CisKKyAgKm91dHB1dCA9IHJlc3VsdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2RvdWJsZSBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoY29uc3Qgc3RyaW5nJiB0ZXh0KSB7CisgIGNvbnN0IGNoYXIqIHN0YXJ0ID0gdGV4dC5jX3N0cigpOworICBjaGFyKiBlbmQ7CisgIGRvdWJsZSByZXN1bHQgPSBOb0xvY2FsZVN0cnRvZChzdGFydCwgJmVuZCk7CisKKyAgLy8gIjFlIiBpcyBub3QgYSB2YWxpZCBmbG9hdCwgYnV0IGlmIHRoZSB0b2tlbml6ZXIgcmVhZHMgaXQsIGl0IHdpbGwKKyAgLy8gcmVwb3J0IGFuIGVycm9yIGJ1dCBzdGlsbCByZXR1cm4gaXQgYXMgYSB2YWxpZCB0b2tlbi4gIFdlIG5lZWQgdG8KKyAgLy8gYWNjZXB0IGFueXRoaW5nIHRoZSB0b2tlbml6ZXIgY291bGQgcG9zc2libHkgcmV0dXJuLCBlcnJvciBvciBub3QuCisgIGlmICgqZW5kID09ICdlJyB8fCAqZW5kID09ICdFJykgeworICAgICsrZW5kOworICAgIGlmICgqZW5kID09ICctJyB8fCAqZW5kID09ICcrJykgKytlbmQ7CisgIH0KKworICAvLyBJZiB0aGUgVG9rZW5pemVyIGhhZCBhbGxvd19mX2FmdGVyX2Zsb2F0XyBlbmFibGVkLCB0aGUgZmxvYXQgbWF5IGJlCisgIC8vIHN1ZmZpeGVkIHdpdGggdGhlIGxldHRlciAnZicuCisgIGlmICgqZW5kID09ICdmJyB8fCAqZW5kID09ICdGJykgeworICAgICsrZW5kOworICB9CisKKyAgR09PR0xFX0xPR19JRihERkFUQUwsIGVuZCAtIHN0YXJ0ICE9IHRleHQuc2l6ZSgpIHx8ICpzdGFydCA9PSAnLScpCisgICAgPDwgIiBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoKSBwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4iCisgICAgICAgIiB0b2tlbml6ZWQgYXMgYSBmbG9hdDogIiA8PCBDRXNjYXBlKHRleHQpOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFRva2VuaXplcjo6UGFyc2VTdHJpbmdBcHBlbmQoY29uc3Qgc3RyaW5nJiB0ZXh0LCBzdHJpbmcqIG91dHB1dCkgeworICAvLyBSZW1pbmRlcjogIHRleHRbMF0gaXMgYWx3YXlzIHRoZSBxdW90ZSBjaGFyYWN0ZXIuICAoSWYgdGV4dCBpcworICAvLyAgIGVtcHR5LCBpdCdzIGludmFsaWQsIHNvIHdlJ2xsIGp1c3QgcmV0dXJuLikKKyAgaWYgKHRleHQuZW1wdHkoKSkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKQorICAgICAgPDwgIiBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nQXBwZW5kKCkgcGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QiCisgICAgICAgICAiIGhhdmUgYmVlbiB0b2tlbml6ZWQgYXMgYSBzdHJpbmc6ICIgPDwgQ0VzY2FwZSh0ZXh0KTsKKyAgICByZXR1cm47CisgIH0KKworICBvdXRwdXQtPnJlc2VydmUob3V0cHV0LT5zaXplKCkgKyB0ZXh0LnNpemUoKSk7CisKKyAgLy8gTG9vcCB0aHJvdWdoIHRoZSBzdHJpbmcgY29weWluZyBjaGFyYWN0ZXJzIHRvICJvdXRwdXQiIGFuZAorICAvLyBpbnRlcnByZXRpbmcgZXNjYXBlIHNlcXVlbmNlcy4gIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBlc2NhcGUKKyAgLy8gc2VxdWVuY2VzIG9yIG90aGVyIGVycm9ycyB3ZXJlIGFscmVhZHkgcmVwb3J0ZWQgd2hpbGUgdG9rZW5pemluZy4KKyAgLy8gSW4gdGhpcyBjYXNlIHdlIGRvIG5vdCBuZWVkIHRvIHByb2R1Y2UgdmFsaWQgcmVzdWx0cy4KKyAgZm9yIChjb25zdCBjaGFyKiBwdHIgPSB0ZXh0LmNfc3RyKCkgKyAxOyAqcHRyICE9ICdcMCc7IHB0cisrKSB7CisgICAgaWYgKCpwdHIgPT0gJ1xcJyAmJiBwdHJbMV0gIT0gJ1wwJykgeworICAgICAgLy8gQW4gZXNjYXBlIHNlcXVlbmNlLgorICAgICAgKytwdHI7CisKKyAgICAgIGlmIChPY3RhbERpZ2l0OjpJbkNsYXNzKCpwdHIpKSB7CisgICAgICAgIC8vIEFuIG9jdGFsIGVzY2FwZS4gIE1heSBvbmUsIHR3bywgb3IgdGhyZWUgZGlnaXRzLgorICAgICAgICBpbnQgY29kZSA9IERpZ2l0VmFsdWUoKnB0cik7CisgICAgICAgIGlmIChPY3RhbERpZ2l0OjpJbkNsYXNzKHB0clsxXSkpIHsKKyAgICAgICAgICArK3B0cjsKKyAgICAgICAgICBjb2RlID0gY29kZSAqIDggKyBEaWdpdFZhbHVlKCpwdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChPY3RhbERpZ2l0OjpJbkNsYXNzKHB0clsxXSkpIHsKKyAgICAgICAgICArK3B0cjsKKyAgICAgICAgICBjb2RlID0gY29kZSAqIDggKyBEaWdpdFZhbHVlKCpwdHIpOworICAgICAgICB9CisgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KGNvZGUpKTsKKworICAgICAgfSBlbHNlIGlmICgqcHRyID09ICd4JykgeworICAgICAgICAvLyBBIGhleCBlc2NhcGUuICBNYXkgemVybywgb25lLCBvciB0d28gZGlnaXRzLiAgKFRoZSB6ZXJvIGNhc2UKKyAgICAgICAgLy8gd2lsbCBoYXZlIGJlZW4gY2F1Z2h0IGFzIGFuIGVycm9yIGVhcmxpZXIuKQorICAgICAgICBpbnQgY29kZSA9IDA7CisgICAgICAgIGlmIChIZXhEaWdpdDo6SW5DbGFzcyhwdHJbMV0pKSB7CisgICAgICAgICAgKytwdHI7CisgICAgICAgICAgY29kZSA9IERpZ2l0VmFsdWUoKnB0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEhleERpZ2l0OjpJbkNsYXNzKHB0clsxXSkpIHsKKyAgICAgICAgICArK3B0cjsKKyAgICAgICAgICBjb2RlID0gY29kZSAqIDE2ICsgRGlnaXRWYWx1ZSgqcHRyKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihjb2RlKSk7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNvbWUgb3RoZXIgZXNjYXBlIGNvZGUuCisgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKFRyYW5zbGF0ZUVzY2FwZSgqcHRyKSk7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKCpwdHIgPT0gdGV4dFswXSkgeworICAgICAgLy8gSWdub3JlIHF1b3RlIG1hdGNoaW5nIHRoZSBzdGFydGluZyBxdW90ZS4KKyAgICB9IGVsc2UgeworICAgICAgb3V0cHV0LT5wdXNoX2JhY2soKnB0cik7CisgICAgfQorICB9CisKKyAgcmV0dXJuOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc1OWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIENsYXNzIGZvciBwYXJzaW5nIHRva2VuaXplZCB0ZXh0IGZyb20gYSBaZXJvQ29weUlucHV0U3RyZWFtLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19UT0tFTklaRVJfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19UT0tFTklaRVJfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCitjbGFzcyBaZXJvQ29weUlucHV0U3RyZWFtOyAgICAgLy8gemVyb19jb3B5X3N0cmVhbS5oCisKKy8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgorY2xhc3MgRXJyb3JDb2xsZWN0b3I7CitjbGFzcyBUb2tlbml6ZXI7CisKKy8vIEFic3RyYWN0IGludGVyZmFjZSBmb3IgYW4gb2JqZWN0IHdoaWNoIGNvbGxlY3RzIHRoZSBlcnJvcnMgdGhhdCBvY2N1cgorLy8gZHVyaW5nIHBhcnNpbmcuICBBIHR5cGljYWwgaW1wbGVtZW50YXRpb24gbWlnaHQgc2ltcGx5IHByaW50IHRoZSBlcnJvcnMKKy8vIHRvIHN0ZG91dC4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBpbmxpbmUgRXJyb3JDb2xsZWN0b3IoKSB7fQorICB2aXJ0dWFsIH5FcnJvckNvbGxlY3RvcigpOworCisgIC8vIEluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUgaW5wdXQgYXQgdGhlIGdpdmVuIGxpbmUgYW5kCisgIC8vIGNvbHVtbiBudW1iZXJzLiAgVGhlIG51bWJlcnMgYXJlIHplcm8tYmFzZWQsIHNvIHlvdSBtYXkgd2FudCB0byBhZGQKKyAgLy8gMSB0byBlYWNoIGJlZm9yZSBwcmludGluZyB0aGVtLgorICB2aXJ0dWFsIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgPSAwOworCisgIC8vIEluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBhIHdhcm5pbmcgaW4gdGhlIGlucHV0IGF0IHRoZSBnaXZlbiBsaW5lIGFuZAorICAvLyBjb2x1bW4gbnVtYmVycy4gIFRoZSBudW1iZXJzIGFyZSB6ZXJvLWJhc2VkLCBzbyB5b3UgbWF5IHdhbnQgdG8gYWRkCisgIC8vIDEgdG8gZWFjaCBiZWZvcmUgcHJpbnRpbmcgdGhlbS4KKyAgdmlydHVhbCB2b2lkIEFkZFdhcm5pbmcoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeyB9CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRXJyb3JDb2xsZWN0b3IpOworfTsKKworLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBhIHN0cmVhbSBvZiByYXcgdGV4dCBpbnRvIGEgc3RyZWFtIG9mIHRva2VucyBmb3IKKy8vIHRoZSBwcm90b2NvbCBkZWZpbml0aW9uIHBhcnNlciB0byBwYXJzZS4gIFRoZSB0b2tlbnMgcmVjb2duaXplZCBhcmUKKy8vIHNpbWlsYXIgdG8gdGhvc2UgdGhhdCBtYWtlIHVwIHRoZSBDIGxhbmd1YWdlOyBzZWUgdGhlIFRva2VuVHlwZSBlbnVtIGZvcgorLy8gcHJlY2lzZSBkZXNjcmlwdGlvbnMuICBXaGl0ZXNwYWNlIGFuZCBjb21tZW50cyBhcmUgc2tpcHBlZC4gIEJ5IGRlZmF1bHQsCisvLyBDLSBhbmQgQysrLXN0eWxlIGNvbW1lbnRzIGFyZSByZWNvZ25pemVkLCBidXQgb3RoZXIgc3R5bGVzIGNhbiBiZSB1c2VkIGJ5CisvLyBjYWxsaW5nIHNldF9jb21tZW50X3N0eWxlKCkuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgVG9rZW5pemVyIHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdCBhIFRva2VuaXplciB0aGF0IHJlYWRzIGFuZCB0b2tlbml6ZXMgdGV4dCBmcm9tIHRoZSBnaXZlbgorICAvLyBpbnB1dCBzdHJlYW0gYW5kIHdyaXRlcyBlcnJvcnMgdG8gdGhlIGdpdmVuIGVycm9yX2NvbGxlY3Rvci4KKyAgLy8gVGhlIGNhbGxlciBrZWVwcyBvd25lcnNoaXAgb2YgaW5wdXQgYW5kIGVycm9yX2NvbGxlY3Rvci4KKyAgVG9rZW5pemVyKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKTsKKyAgflRva2VuaXplcigpOworCisgIGVudW0gVG9rZW5UeXBlIHsKKyAgICBUWVBFX1NUQVJULCAgICAgICAvLyBOZXh0KCkgaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQuCisgICAgVFlQRV9FTkQsICAgICAgICAgLy8gRW5kIG9mIGlucHV0IHJlYWNoZWQuICAidGV4dCIgaXMgZW1wdHkuCisKKyAgICBUWVBFX0lERU5USUZJRVIsICAvLyBBIHNlcXVlbmNlIG9mIGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzLCBub3QKKyAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydGluZyB3aXRoIGEgZGlnaXQuICBJdCBpcyBhbiBlcnJvciBmb3IgYSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyIHdpdGggbm8gc3BhY2UgaW4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuLgorICAgIFRZUEVfSU5URUdFUiwgICAgIC8vIEEgc2VxdWVuY2Ugb2YgZGlnaXRzIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyLiAgTm9ybWFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlnaXRzIGFyZSBkZWNpbWFsLCBidXQgYSBwcmVmaXggb2YgIjB4IiBpbmRpY2F0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAvLyBhIGhleCBudW1iZXIgYW5kIGEgbGVhZGluZyB6ZXJvIGluZGljYXRlcyBvY3RhbCwganVzdAorICAgICAgICAgICAgICAgICAgICAgIC8vIGxpa2Ugd2l0aCBDIG51bWVyaWMgbGl0ZXJhbHMuICBBIGxlYWRpbmcgbmVnYXRpdmUgc2lnbgorICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIE5PVCBpbmNsdWRlZCBpbiB0aGUgdG9rZW47IGl0J3MgdXAgdG8gdGhlIHBhcnNlciB0bworICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVycHJldCB0aGUgdW5hcnkgbWludXMgb3BlcmF0b3Igb24gaXRzIG93bi4KKyAgICBUWVBFX0ZMT0FULCAgICAgICAvLyBBIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwsIHdpdGggYSBmcmFjdGlvbmFsIHBhcnQgYW5kL29yCisgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gZXhwb25lbnQuICBBbHdheXMgaW4gZGVjaW1hbC4gIEFnYWluLCBuZXZlcgorICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlLgorICAgIFRZUEVfU1RSSU5HLCAgICAgIC8vIEEgcXVvdGVkIHNlcXVlbmNlIG9mIGVzY2FwZWQgY2hhcmFjdGVycy4gIEVpdGhlciBzaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgICAvLyBvciBkb3VibGUgcXVvdGVzIGNhbiBiZSB1c2VkLCBidXQgdGhleSBtdXN0IG1hdGNoLgorICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IGNyb3NzIGEgbGluZSBicmVhay4KKyAgICBUWVBFX1NZTUJPTCwgICAgICAvLyBBbnkgb3RoZXIgcHJpbnRhYmxlIGNoYXJhY3RlciwgbGlrZSAnIScgb3IgJysnLgorICAgICAgICAgICAgICAgICAgICAgIC8vIFN5bWJvbHMgYXJlIGFsd2F5cyBhIHNpbmdsZSBjaGFyYWN0ZXIsIHNvICIhKyQlIiBpcworICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdXIgdG9rZW5zLgorICB9OworCisgIC8vIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSB0b2tlbiByZWFkIGZyb20gdGhlIHRva2VuIHN0cmVhbS4KKyAgc3RydWN0IFRva2VuIHsKKyAgICBUb2tlblR5cGUgdHlwZTsKKyAgICBzdHJpbmcgdGV4dDsgICAgICAgLy8gVGhlIGV4YWN0IHRleHQgb2YgdGhlIHRva2VuIGFzIGl0IGFwcGVhcmVkIGluCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dC4gIGUuZy4gdG9rZW5zIG9mIFRZUEVfU1RSSU5HIHdpbGwgc3RpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgZXNjYXBlZCBhbmQgaW4gcXVvdGVzLgorCisgICAgLy8gImxpbmUiIGFuZCAiY29sdW1uIiBzcGVjaWZ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mCisgICAgLy8gdGhlIHRva2VuIHdpdGhpbiB0aGUgaW5wdXQgc3RyZWFtLiAgVGhleSBhcmUgemVyby1iYXNlZC4KKyAgICBpbnQgbGluZTsKKyAgICBpbnQgY29sdW1uOworICAgIGludCBlbmRfY29sdW1uOworICB9OworCisgIC8vIEdldCB0aGUgY3VycmVudCB0b2tlbi4gIFRoaXMgaXMgdXBkYXRlZCB3aGVuIE5leHQoKSBpcyBjYWxsZWQuICBCZWZvcmUKKyAgLy8gdGhlIGZpcnN0IGNhbGwgdG8gTmV4dCgpLCBjdXJyZW50KCkgaGFzIHR5cGUgVFlQRV9TVEFSVCBhbmQgbm8gY29udGVudHMuCisgIGNvbnN0IFRva2VuJiBjdXJyZW50KCk7CisKKyAgLy8gUmV0dXJuIHRoZSBwcmV2aW91cyB0b2tlbiAtLSBpLmUuIHdoYXQgY3VycmVudCgpIHJldHVybmVkIGJlZm9yZSB0aGUKKyAgLy8gcHJldmlvdXMgY2FsbCB0byBOZXh0KCkuCisgIGNvbnN0IFRva2VuJiBwcmV2aW91cygpOworCisgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgdG9rZW4uICBSZXR1cm5zIGZhbHNlIGlmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzCisgIC8vIHJlYWNoZWQuCisgIGJvb2wgTmV4dCgpOworCisgIC8vIFBhcnNlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gUGFyc2VzIGEgVFlQRV9GTE9BVCB0b2tlbi4gIFRoaXMgbmV2ZXIgZmFpbHMsIHNvIGxvbmcgYXMgdGhlIHRleHQgYWN0dWFsbHkKKyAgLy8gY29tZXMgZnJvbSBhIFRZUEVfRkxPQVQgdG9rZW4gcGFyc2VkIGJ5IFRva2VuaXplci4gIElmIGl0IGRvZXNuJ3QsIHRoZQorICAvLyByZXN1bHQgaXMgdW5kZWZpbmVkIChwb3NzaWJseSBhbiBhc3NlcnQgZmFpbHVyZSkuCisgIHN0YXRpYyBkb3VibGUgUGFyc2VGbG9hdChjb25zdCBzdHJpbmcmIHRleHQpOworCisgIC8vIFBhcnNlcyBhIFRZUEVfU1RSSU5HIHRva2VuLiAgVGhpcyBuZXZlciBmYWlscywgc28gbG9uZyBhcyB0aGUgdGV4dCBhY3R1YWxseQorICAvLyBjb21lcyBmcm9tIGEgVFlQRV9TVFJJTkcgdG9rZW4gcGFyc2VkIGJ5IFRva2VuaXplci4gIElmIGl0IGRvZXNuJ3QsIHRoZQorICAvLyByZXN1bHQgaXMgdW5kZWZpbmVkIChwb3NzaWJseSBhbiBhc3NlcnQgZmFpbHVyZSkuCisgIHN0YXRpYyB2b2lkIFBhcnNlU3RyaW5nKGNvbnN0IHN0cmluZyYgdGV4dCwgc3RyaW5nKiBvdXRwdXQpOworCisgIC8vIElkZW50aWNhbCB0byBQYXJzZVN0cmluZywgYnV0IGFwcGVuZHMgdG8gb3V0cHV0LgorICBzdGF0aWMgdm9pZCBQYXJzZVN0cmluZ0FwcGVuZChjb25zdCBzdHJpbmcmIHRleHQsIHN0cmluZyogb3V0cHV0KTsKKworICAvLyBQYXJzZXMgYSBUWVBFX0lOVEVHRVIgdG9rZW4uICBSZXR1cm5zIGZhbHNlIGlmIHRoZSByZXN1bHQgd291bGQgYmUKKyAgLy8gZ3JlYXRlciB0aGFuIG1heF92YWx1ZS4gIE90aGVyd2lzZSwgcmV0dXJucyB0cnVlIGFuZCBzZXRzICpvdXRwdXQgdG8gdGhlCisgIC8vIHJlc3VsdC4gIElmIHRoZSB0ZXh0IGlzIG5vdCBmcm9tIGEgVG9rZW4gb2YgdHlwZSBUWVBFX0lOVEVHRVIgb3JpZ2luYWxseQorICAvLyBwYXJzZWQgYnkgYSBUb2tlbml6ZXIsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIChwb3NzaWJseSBhbiBhc3NlcnQKKyAgLy8gZmFpbHVyZSkuCisgIHN0YXRpYyBib29sIFBhcnNlSW50ZWdlcihjb25zdCBzdHJpbmcmIHRleHQsIHVpbnQ2NCBtYXhfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjQqIG91dHB1dCk7CisKKyAgLy8gT3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBTZXQgdHJ1ZSB0byBhbGxvdyBmbG9hdHMgdG8gYmUgc3VmZml4ZWQgd2l0aCB0aGUgbGV0dGVyICdmJy4gIFRva2VucworICAvLyB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUgaW50ZWdlcnMgYnV0IHdoaWNoIGhhdmUgdGhlICdmJyBzdWZmaXggd2lsbCBiZQorICAvLyBmb3JjZWQgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgZmxvYXRzLiAgRm9yIGFsbCBvdGhlciBwdXJwb3NlcywgdGhlICdmJyBpcworICAvLyBpZ25vcmVkLgorICB2b2lkIHNldF9hbGxvd19mX2FmdGVyX2Zsb2F0KGJvb2wgdmFsdWUpIHsgYWxsb3dfZl9hZnRlcl9mbG9hdF8gPSB2YWx1ZTsgfQorCisgIC8vIFZhbGlkIHZhbHVlcyBmb3Igc2V0X2NvbW1lbnRfc3R5bGUoKS4KKyAgZW51bSBDb21tZW50U3R5bGUgeworICAgIC8vIExpbmUgY29tbWVudHMgYmVnaW4gd2l0aCAiLy8iLCBibG9jayBjb21tZW50cyBhcmUgZGVsaW1pdGVkIGJ5ICIvKiIgYW5kCisgICAgLy8gIiovIi4KKyAgICBDUFBfQ09NTUVOVF9TVFlMRSwKKyAgICAvLyBMaW5lIGNvbW1lbnRzIGJlZ2luIHdpdGggIiMiLiAgTm8gd2F5IHRvIHdyaXRlIGJsb2NrIGNvbW1lbnRzLgorICAgIFNIX0NPTU1FTlRfU1RZTEUKKyAgfTsKKworICAvLyBTZXRzIHRoZSBjb21tZW50IHN0eWxlLgorICB2b2lkIHNldF9jb21tZW50X3N0eWxlKENvbW1lbnRTdHlsZSBzdHlsZSkgeyBjb21tZW50X3N0eWxlXyA9IHN0eWxlOyB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVG9rZW5pemVyKTsKKworICBUb2tlbiBjdXJyZW50XzsgICAgICAgICAgIC8vIFJldHVybmVkIGJ5IGN1cnJlbnQoKS4KKyAgVG9rZW4gcHJldmlvdXNfOyAgICAgICAgICAvLyBSZXR1cm5lZCBieSBwcmV2aW91cygpLgorCisgIFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0XzsKKyAgRXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcl87CisKKyAgY2hhciBjdXJyZW50X2NoYXJfOyAgICAgICAvLyA9PSBidWZmZXJfW2J1ZmZlcl9wb3NfXSwgdXBkYXRlZCBieSBOZXh0Q2hhcigpLgorICBjb25zdCBjaGFyKiBidWZmZXJfOyAgICAgIC8vIEN1cnJlbnQgYnVmZmVyIHJldHVybmVkIGZyb20gaW5wdXRfLgorICBpbnQgYnVmZmVyX3NpemVfOyAgICAgICAgIC8vIFNpemUgb2YgYnVmZmVyXy4KKyAgaW50IGJ1ZmZlcl9wb3NfOyAgICAgICAgICAvLyBDdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgYnVmZmVyLgorICBib29sIHJlYWRfZXJyb3JfOyAgICAgICAgIC8vIERpZCB3ZSBwcmV2aW91c2x5IGVuY291bnRlciBhIHJlYWQgZXJyb3I/CisKKyAgLy8gTGluZSBhbmQgY29sdW1uIG51bWJlciBvZiBjdXJyZW50X2NoYXJfIHdpdGhpbiB0aGUgd2hvbGUgaW5wdXQgc3RyZWFtLgorICBpbnQgbGluZV87CisgIGludCBjb2x1bW5fOworCisgIC8vIFBvc2l0aW9uIGluIGJ1ZmZlcl8gd2hlcmUgU3RhcnRUb2tlbigpIHdhcyBjYWxsZWQuICBJZiB0aGUgdG9rZW4KKyAgLy8gc3RhcnRlZCBpbiB0aGUgcHJldmlvdXMgYnVmZmVyLCB0aGlzIGlzIHplcm8sIGFuZCBjdXJyZW50Xy50ZXh0IGFscmVhZHkKKyAgLy8gY29udGFpbnMgdGhlIHBhcnQgb2YgdGhlIHRva2VuIGZyb20gdGhlIHByZXZpb3VzIGJ1ZmZlci4gIElmIG5vdAorICAvLyBjdXJyZW50bHkgcGFyc2luZyBhIHRva2VuLCB0aGlzIGlzIC0xLgorICBpbnQgdG9rZW5fc3RhcnRfOworCisgIC8vIE9wdGlvbnMuCisgIGJvb2wgYWxsb3dfZl9hZnRlcl9mbG9hdF87CisgIENvbW1lbnRTdHlsZSBjb21tZW50X3N0eWxlXzsKKworICAvLyBTaW5jZSB3ZSBjb3VudCBjb2x1bW5zIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRhYnMgc29tZWhvdy4gIFdlJ2xsIHRha2UKKyAgLy8gdGhlIHN0YW5kYXJkIDgtY2hhcmFjdGVyIGRlZmluaXRpb24gZm9yIGxhY2sgb2YgYW55IHdheSB0byBkbyBiZXR0ZXIuCisgIHN0YXRpYyBjb25zdCBpbnQga1RhYldpZHRoID0gODsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBIZWxwZXIgbWV0aG9kcy4KKworICAvLyBDb25zdW1lIHRoaXMgY2hhcmFjdGVyIGFuZCBhZHZhbmNlIHRvIHRoZSBuZXh0IG9uZS4KKyAgdm9pZCBOZXh0Q2hhcigpOworCisgIC8vIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGlucHV0LgorICB2b2lkIFJlZnJlc2goKTsKKworICAvLyBDYWxsZWQgd2hlbiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIG5ldworICAvLyB0b2tlbiAobm90IGluY2x1ZGluZyB3aGl0ZXNwYWNlIG9yIGNvbW1lbnRzKS4KKyAgaW5saW5lIHZvaWQgU3RhcnRUb2tlbigpOworICAvLyBDYWxsZWQgd2hlbiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUKKyAgLy8gZW5kIG9mIHRoZSBsYXN0IHRva2VuLiAgQWZ0ZXIgdGhpcyByZXR1cm5zLCBjdXJyZW50Xy50ZXh0IHdpbGwKKyAgLy8gY29udGFpbiBhbGwgdGV4dCBjb25zdW1lZCBzaW5jZSBTdGFydFRva2VuKCkgd2FzIGNhbGxlZC4KKyAgaW5saW5lIHZvaWQgRW5kVG9rZW4oKTsKKworICAvLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGFuIGVycm9yIGF0IHRoZSBjdXJyZW50IGxpbmUgYW5kIGNvbHVtbi4KKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcihsaW5lXywgY29sdW1uXywgbWVzc2FnZSk7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGUgZm9sbG93aW5nIGZvdXIgbWV0aG9kcyBhcmUgdXNlZCB0byBjb25zdW1lIHRva2VucyBvZiBzcGVjaWZpYworICAvLyB0eXBlcy4gIFRoZXkgYXJlIGFjdHVhbGx5IHVzZWQgdG8gY29uc3VtZSBhbGwgY2hhcmFjdGVycyAqYWZ0ZXIqCisgIC8vIHRoZSBmaXJzdCwgc2luY2UgdGhlIGNhbGxpbmcgZnVuY3Rpb24gY29uc3VtZXMgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAvLyBpbiBvcmRlciB0byBkZWNpZGUgd2hhdCBraW5kIG9mIHRva2VuIGlzIGJlaW5nIHJlYWQuCisKKyAgLy8gUmVhZCBhbmQgY29uc3VtZSBhIHN0cmluZywgZW5kaW5nIHdoZW4gdGhlIGdpdmVuIGRlbGltaXRlciBpcworICAvLyBjb25zdW1lZC4KKyAgdm9pZCBDb25zdW1lU3RyaW5nKGNoYXIgZGVsaW1pdGVyKTsKKworICAvLyBSZWFkIGFuZCBjb25zdW1lIGEgbnVtYmVyLCByZXR1cm5pbmcgVFlQRV9GTE9BVCBvciBUWVBFX0lOVEVHRVIKKyAgLy8gZGVwZW5kaW5nIG9uIHdoYXQgd2FzIHJlYWQuICBUaGlzIG5lZWRzIHRvIGtub3cgaWYgdGhlIGZpcnN0CisgIC8vIGNoYXJhY3RlciB3YXMgYSB6ZXJvIGluIG9yZGVyIHRvIGNvcnJlY3RseSByZWNvZ25pemUgaGV4IGFuZCBvY3RhbAorICAvLyBudW1iZXJzLgorICAvLyBJdCBhbHNvIG5lZWRzIHRvIGtub3cgaWYgdGhlIGZpcnN0IGNoYXJhY3RlZCB3YXMgYSAuIHRvIHBhcnNlIGZsb2F0aW5nCisgIC8vIHBvaW50IGNvcnJlY3RseS4KKyAgVG9rZW5UeXBlIENvbnN1bWVOdW1iZXIoYm9vbCBzdGFydGVkX3dpdGhfemVybywgYm9vbCBzdGFydGVkX3dpdGhfZG90KTsKKworICAvLyBDb25zdW1lIHRoZSByZXN0IG9mIGEgbGluZS4KKyAgdm9pZCBDb25zdW1lTGluZUNvbW1lbnQoKTsKKyAgLy8gQ29uc3VtZSB1bnRpbCAiKi8iLgorICB2b2lkIENvbnN1bWVCbG9ja0NvbW1lbnQoKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBoZWxwZXIgbWV0aG9kcyBtYWtlIHRoZSBwYXJzaW5nIGNvZGUgbW9yZSByZWFkYWJsZS4gIFRoZQorICAvLyAiY2hhcmFjdGVyIGNsYXNzZXMiIHJlZmVyZWQgdG8gYXJlIGRlZmluZWQgYXQgdGhlIHRvcCBvZiB0aGUgLmNjIGZpbGUuCisgIC8vIEJhc2ljYWxseSBpdCBpcyBhIEMrKyBjbGFzcyB3aXRoIG9uZSBtZXRob2Q6CisgIC8vICAgc3RhdGljIGJvb2wgSW5DbGFzcyhjaGFyIGMpOworICAvLyBUaGUgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBjIGlzIGEgbWVtYmVyIG9mIHRoaXMgImNsYXNzIiwgbGlrZSAiTGV0dGVyIgorICAvLyBvciAiRGlnaXQiLgorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgb2YgdGhlIGdpdmVuIGNoYXJhY3RlcgorICAvLyBjbGFzcywgYnV0IGRvZXMgbm90IGNvbnN1bWUgYW55dGhpbmcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlckNsYXNzPgorICBpbmxpbmUgYm9vbCBMb29raW5nQXQoKTsKKworICAvLyBJZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgaW4gdGhlIGdpdmVuIGNsYXNzLCBjb25zdW1lIGl0IGFuZCByZXR1cm4KKyAgLy8gdHJ1ZS4gIE90aGVyd2lzZSByZXR1cm4gZmFsc2UuCisgIC8vIGUuZy4gVHJ5Q29uc3VtZU9uZTxMZXR0ZXI+KCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyQ2xhc3M+CisgIGlubGluZSBib29sIFRyeUNvbnN1bWVPbmUoKTsKKworICAvLyBMaWtlIGFib3ZlLCBidXQgdHJ5IHRvIGNvbnN1bWUgdGhlIHNwZWNpZmljIGNoYXJhY3RlciBpbmRpY2F0ZWQuCisgIGlubGluZSBib29sIFRyeUNvbnN1bWUoY2hhciBjKTsKKworICAvLyBDb25zdW1lIHplcm8gb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGNsYXNzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KKyAgaW5saW5lIHZvaWQgQ29uc3VtZVplcm9Pck1vcmUoKTsKKworICAvLyBDb25zdW1lIG9uZSBvciBtb3JlIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgY2xhc3Mgb3IgbG9nIHRoZSBnaXZlbgorICAvLyBlcnJvciBtZXNzYWdlLgorICAvLyBlLmcuIENvbnN1bWVPbmVPck1vcmU8RGlnaXQ+KCJFeHBlY3RlZCBkaWdpdHMuIik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlckNsYXNzPgorICBpbmxpbmUgdm9pZCBDb25zdW1lT25lT3JNb3JlKGNvbnN0IGNoYXIqIGVycm9yKTsKK307CisKKy8vIGlubGluZSBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2lubGluZSBjb25zdCBUb2tlbml6ZXI6OlRva2VuJiBUb2tlbml6ZXI6OmN1cnJlbnQoKSB7CisgIHJldHVybiBjdXJyZW50XzsKK30KKworaW5saW5lIGNvbnN0IFRva2VuaXplcjo6VG9rZW4mIFRva2VuaXplcjo6cHJldmlvdXMoKSB7CisgIHJldHVybiBwcmV2aW91c187Cit9CisKK2lubGluZSB2b2lkIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoY29uc3Qgc3RyaW5nJiB0ZXh0LCBzdHJpbmcqIG91dHB1dCkgeworICBvdXRwdXQtPmNsZWFyKCk7CisgIFBhcnNlU3RyaW5nQXBwZW5kKHRleHQsIG91dHB1dCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lPX1RPS0VOSVpFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDZkMDgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNzY2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKK25hbWVzcGFjZSB7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIERhdGEtRHJpdmVuIFRlc3QgSW5mcmFzdHJ1Y3R1cmUKKworLy8gVE9ETyhrZW50b24pOiAgVGhpcyBpcyBjb3BpZWQgZnJvbSBjb2RlZF9zdHJlYW1fdW5pdHRlc3QuICBUaGlzIGlzCisvLyAgIHRlbXBvcmFyeSB1bnRpbCB0aGVzZSBmZXRhdXJlcyBhcmUgaW50ZWdyYXRlZCBpbnRvIGdUZXN0IGl0c2VsZi4KKworLy8gVEVTVF8xRCBhbmQgVEVTVF8yRCBhcmUgbWFjcm9zIEknZCBldmVudHVhbGx5IGxpa2UgdG8gc2VlIGFkZGVkIHRvCisvLyBnVGVzdC4gIFRoZXNlIG1hY3JvcyBjYW4gYmUgdXNlZCB0byBkZWNsYXJlIHRlc3RzIHdoaWNoIHNob3VsZCBiZQorLy8gcnVuIG11bHRpcGxlIHRpbWVzLCBvbmNlIGZvciBlYWNoIGl0ZW0gaW4gc29tZSBpbnB1dCBhcnJheS4gIFRFU1RfMUQKKy8vIHRlc3RzIGFsbCBjYXNlcyBpbiBhIHNpbmdsZSBpbnB1dCBhcnJheS4gIFRFU1RfMkQgdGVzdHMgYWxsCisvLyBjb21iaW5hdGlvbnMgb2YgY2FzZXMgZnJvbSB0d28gYXJyYXlzLiAgVGhlIGFycmF5cyBtdXN0IGJlIHN0YXRpY2FsbHkKKy8vIGRlZmluZWQgc3VjaCB0aGF0IHRoZSBHT09HTEVfQVJSQVlTSVpFKCkgbWFjcm8gd29ya3Mgb24gdGhlbS4gIEV4YW1wbGU6CisvLworLy8gaW50IGtDYXNlc1tdID0gezEsIDIsIDMsIDR9CisvLyBURVNUXzFEKE15Rml4dHVyZSwgTXlUZXN0LCBrQ2FzZXMpIHsKKy8vICAgRVhQRUNUX0dUKGtDYXNlc19jYXNlLCAwKTsKKy8vIH0KKy8vCisvLyBUaGlzIHRlc3QgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgbnVtYmVycyAxLCAyLCAzLCBhbmQgNCBhbmQgdGVzdHMgdGhhdAorLy8gdGhleSBhcmUgYWxsIGdyYXRlciB0aGFuIHplcm8uICBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSBleGFjdCBjYXNlCisvLyB3aGljaCBmYWlsZWQgd2lsbCBiZSBwcmludGVkLiAgVGhlIGNhc2UgdHlwZSBtdXN0IGJlIHByaW50YWJsZSB1c2luZworLy8gb3N0cmVhbTo6b3BlcmF0b3I8PC4KKworI2RlZmluZSBURVNUXzFEKEZJWFRVUkUsIE5BTUUsIENBU0VTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBGSVhUVVJFIyNfIyNOQU1FIyNfREQgOiBwdWJsaWMgRklYVFVSRSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcHJvdGVjdGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYXNlVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgRG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlJiBDQVNFUyMjX2Nhc2UpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBURVNUX0YoRklYVFVSRSMjXyMjTkFNRSMjX0RELCBOQU1FKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShDQVNFUyk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPDwgI0NBU0VTICIgY2FzZSAjIiA8PCBpIDw8ICI6ICIgPDwgQ0FTRVNbaV0pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIERvU2luZ2xlQ2FzZShDQVNFU1tpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGSVhUVVJFIyNfIyNOQU1FIyNfREQ6OkRvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZSYgQ0FTRVMjI19jYXNlKQorCisjZGVmaW5lIFRFU1RfMkQoRklYVFVSRSwgTkFNRSwgQ0FTRVMxLCBDQVNFUzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIEZJWFRVUkUjI18jI05BTUUjI19ERCA6IHB1YmxpYyBGSVhUVVJFIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VUeXBlMSwgdHlwZW5hbWUgQ2FzZVR5cGUyPiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBEb1NpbmdsZUNhc2UoY29uc3QgQ2FzZVR5cGUxJiBDQVNFUzEjI19jYXNlLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FzZVR5cGUyJiBDQVNFUzIjI19jYXNlKTsgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRFU1RfRihGSVhUVVJFIyNfIyNOQU1FIyNfREQsIE5BTUUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKENBU0VTMSk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBHT09HTEVfQVJSQVlTSVpFKENBU0VTMik7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICA8PCAjQ0FTRVMxICIgY2FzZSAjIiA8PCBpIDw8ICI6ICIgPDwgQ0FTRVMxW2ldIDw8ICIsICIgICAgICAgICAgIFwKKyAgICAgICAgICA8PCAjQ0FTRVMyICIgY2FzZSAjIiA8PCBqIDw8ICI6ICIgPDwgQ0FTRVMyW2pdKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRG9TaW5nbGVDYXNlKENBU0VTMVtpXSwgQ0FTRVMyW2pdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VUeXBlMSwgdHlwZW5hbWUgQ2FzZVR5cGUyPiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBGSVhUVVJFIyNfIyNOQU1FIyNfREQ6OkRvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZTEmIENBU0VTMSMjX2Nhc2UsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXNlVHlwZTImIENBU0VTMiMjX2Nhc2UpCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQW4gaW5wdXQgc3RyZWFtIHRoYXQgaXMgYmFzaWNhbGx5IGxpa2UgYW4gQXJyYXlJbnB1dFN0cmVhbSBidXQgc29tZXRpbWVzCisvLyByZXR1cm5zIGVtcHR5IGJ1ZmZlcnMsIGp1c3QgdG8gdGhyb3cgdXMgb2ZmLgorY2xhc3MgVGVzdElucHV0U3RyZWFtIDogcHVibGljIFplcm9Db3B5SW5wdXRTdHJlYW0geworIHB1YmxpYzoKKyAgVGVzdElucHV0U3RyZWFtKGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLCBpbnQgYmxvY2tfc2l6ZSkKKyAgICA6IGFycmF5X3N0cmVhbV8oZGF0YSwgc2l6ZSwgYmxvY2tfc2l6ZSksIGNvdW50ZXJfKDApIHt9CisgIH5UZXN0SW5wdXRTdHJlYW0oKSB7fQorCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgICAgLy8gV2UnbGwgcmV0dXJuIGVtcHR5IGJ1ZmZlcnMgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QgYnVmZmVyLCBhbmQgZXZlcnkKKyAgICAvLyAzIGFuZCA1IGJ1ZmZlcnMgYWZ0ZXIgdGhhdC4KKyAgICBpZiAoY291bnRlcl8gJSAzID09IDAgfHwgY291bnRlcl8gJSA1ID09IDApIHsKKyAgICAgICpkYXRhID0gTlVMTDsKKyAgICAgICpzaXplID0gMDsKKyAgICAgICsrY291bnRlcl87CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgKytjb3VudGVyXzsKKyAgICAgIHJldHVybiBhcnJheV9zdHJlYW1fLk5leHQoZGF0YSwgc2l6ZSk7CisgICAgfQorICB9CisKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KSAgeyByZXR1cm4gYXJyYXlfc3RyZWFtXy5CYWNrVXAoY291bnQpOyB9CisgIGJvb2wgU2tpcChpbnQgY291bnQpICAgIHsgcmV0dXJuIGFycmF5X3N0cmVhbV8uU2tpcChjb3VudCk7ICAgfQorICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdCB7IHJldHVybiBhcnJheV9zdHJlYW1fLkJ5dGVDb3VudCgpOyAgIH0KKworIHByaXZhdGU6CisgIEFycmF5SW5wdXRTdHJlYW0gYXJyYXlfc3RyZWFtXzsKKyAgaW50IGNvdW50ZXJfOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBbiBlcnJvciBjb2xsZWN0b3Igd2hpY2ggc2ltcGx5IGNvbmNhdGVuYXRlcyBhbGwgaXRzIGVycm9ycyBpbnRvIGEgYmlnCisvLyBibG9jayBvZiB0ZXh0IHdoaWNoIGNhbiBiZSBjaGVja2VkLgorY2xhc3MgVGVzdEVycm9yQ29sbGVjdG9yIDogcHVibGljIEVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIFRlc3RFcnJvckNvbGxlY3RvcigpIHt9CisgIH5UZXN0RXJyb3JDb2xsZWN0b3IoKSB7fQorCisgIHN0cmluZyB0ZXh0XzsKKworICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiAkMlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7CisgIH0KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gV2UgdGVzdCBlYWNoIG9wZXJhdGlvbiBvdmVyIGEgdmFyaWV0eSBvZiBibG9jayBzaXplcyB0byBpbnN1cmUgdGhhdAorLy8gd2UgdGVzdCBjYXNlcyB3aGVyZSByZWFkcyBjcm9zcyBidWZmZXIgYm91bmRhcmllcyBhcyB3ZWxsIGFzIGNhc2VzCisvLyB3aGVyZSB0aGV5IGRvbid0LiAgVGhpcyBpcyBzb3J0IG9mIGEgYnJ1dGUtZm9yY2UgYXBwcm9hY2ggdG8gdGhpcywKKy8vIGJ1dCBpdCdzIGVhc3kgdG8gd3JpdGUgYW5kIGVhc3kgdG8gdW5kZXJzdGFuZC4KK2NvbnN0IGludCBrQmxvY2tTaXplc1tdID0gezEsIDIsIDMsIDUsIDcsIDEzLCAzMiwgMTAyNH07CisKK2NsYXNzIFRva2VuaXplclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICAvLyBGb3IgZWFzeSB0ZXN0aW5nLgorICB1aW50NjQgUGFyc2VJbnRlZ2VyKGNvbnN0IHN0cmluZyYgdGV4dCkgeworICAgIHVpbnQ2NCByZXN1bHQ7CisgICAgRVhQRUNUX1RSVUUoVG9rZW5pemVyOjpQYXJzZUludGVnZXIodGV4dCwga3VpbnQ2NG1heCwgJnJlc3VsdCkpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gVGhlc2UgdGVzdHMgY2F1c2VzIGdjYyAzLjMuNSAoYW5kIGVhcmxpZXI/KSB0byBnaXZlIHRoZSBjcnlwdGljIGVycm9yOgorLy8gICAic29ycnksIHVuaW1wbGVtZW50ZWQ6IGBtZXRob2RfY2FsbF9leHByJyBub3Qgc3VwcG9ydGVkIGJ5IGR1bXBfZXhwciIKKyNpZiAhZGVmaW5lZChfX0dOVUNfXykgfHwgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID4gMykKKworLy8gSW4gZWFjaCB0ZXN0IGNhc2UsIHRoZSBlbnRpcmUgaW5wdXQgdGV4dCBzaG91bGQgcGFyc2UgYXMgYSBzaW5nbGUgdG9rZW4KKy8vIG9mIHRoZSBnaXZlbiB0eXBlLgorc3RydWN0IFNpbXBsZVRva2VuQ2FzZSB7CisgIHN0cmluZyBpbnB1dDsKKyAgVG9rZW5pemVyOjpUb2tlblR5cGUgdHlwZTsKK307CisKK2lubGluZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsZVRva2VuQ2FzZSYgdGVzdF9jYXNlKSB7CisgIHJldHVybiBvdXQgPDwgQ0VzY2FwZSh0ZXN0X2Nhc2UuaW5wdXQpOworfQorCitTaW1wbGVUb2tlbkNhc2Uga1NpbXBsZVRva2VuQ2FzZXNbXSA9IHsKKyAgLy8gVGVzdCBpZGVudGlmaWVycy4KKyAgeyAiaGVsbG8iLCAgICAgICBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiB9LAorCisgIC8vIFRlc3QgaW50ZWdlcnMuCisgIHsgIjEyMyIsICAgICAgICAgVG9rZW5pemVyOjpUWVBFX0lOVEVHRVIgfSwKKyAgeyAiMHhhYjYiLCAgICAgICBUb2tlbml6ZXI6OlRZUEVfSU5URUdFUiB9LAorICB7ICIwWEFCNiIsICAgICAgIFRva2VuaXplcjo6VFlQRV9JTlRFR0VSIH0sCisgIHsgIjBYMTIzNDU2NyIsICAgVG9rZW5pemVyOjpUWVBFX0lOVEVHRVIgfSwKKyAgeyAiMHg4OWFiY2RlZiIsICBUb2tlbml6ZXI6OlRZUEVfSU5URUdFUiB9LAorICB7ICIweDg5QUJDREVGIiwgIFRva2VuaXplcjo6VFlQRV9JTlRFR0VSIH0sCisgIHsgIjAxMjM0NTY3IiwgICAgVG9rZW5pemVyOjpUWVBFX0lOVEVHRVIgfSwKKworICAvLyBUZXN0IGZsb2F0cy4KKyAgeyAiMTIzLjQ1IiwgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKyAgeyAiMS4iLCAgICAgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKyAgeyAiMWUzIiwgICAgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKyAgeyAiMUUzIiwgICAgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKyAgeyAiMWUtMyIsICAgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKyAgeyAiMWUrMyIsICAgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKyAgeyAiMS5lMyIsICAgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKyAgeyAiMS4yZTMiLCAgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKyAgeyAiLjEiLCAgICAgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKyAgeyAiLjFlMyIsICAgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKyAgeyAiLjFlLTMiLCAgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKyAgeyAiLjFlKzMiLCAgICAgICBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgfSwKKworICAvLyBUZXN0IHN0cmluZ3MuCisgIHsgIidoZWxsbyciLCAgICAgVG9rZW5pemVyOjpUWVBFX1NUUklORyB9LAorICB7ICJcImZvb1wiIiwgICAgIFRva2VuaXplcjo6VFlQRV9TVFJJTkcgfSwKKyAgeyAiJ2FcImInIiwgICAgICBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HIH0sCisgIHsgIlwiYSdiXCIiLCAgICAgVG9rZW5pemVyOjpUWVBFX1NUUklORyB9LAorICB7ICInYVxcJ2InIiwgICAgIFRva2VuaXplcjo6VFlQRV9TVFJJTkcgfSwKKyAgeyAiXCJhXFxcImJcIiIsICBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HIH0sCisgIHsgIidcXHhmJyIsICAgICAgVG9rZW5pemVyOjpUWVBFX1NUUklORyB9LAorICB7ICInXFwwJyIsICAgICAgIFRva2VuaXplcjo6VFlQRV9TVFJJTkcgfSwKKworICAvLyBUZXN0IHN5bWJvbHMuCisgIHsgIisiLCAgICAgICAgICAgVG9rZW5pemVyOjpUWVBFX1NZTUJPTCB9LAorICB7ICIuIiwgICAgICAgICAgIFRva2VuaXplcjo6VFlQRV9TWU1CT0wgfSwKK307CisKK1RFU1RfMkQoVG9rZW5pemVyVGVzdCwgU2ltcGxlVG9rZW5zLCBrU2ltcGxlVG9rZW5DYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIuCisgIFRlc3RJbnB1dFN0cmVhbSBpbnB1dChrU2ltcGxlVG9rZW5DYXNlc19jYXNlLmlucHV0LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtTaW1wbGVUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZXNfY2FzZSk7CisgIFRlc3RFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIFRva2VuaXplciB0b2tlbml6ZXIoJmlucHV0LCAmZXJyb3JfY29sbGVjdG9yKTsKKworICAvLyBCZWZvcmUgTmV4dCgpIGlzIGNhbGxlZCwgdGhlIGluaXRpYWwgdG9rZW4gc2hvdWxkIGFsd2F5cyBiZSBUWVBFX1NUQVJULgorICBFWFBFQ1RfRVEoVG9rZW5pemVyOjpUWVBFX1NUQVJULCB0b2tlbml6ZXIuY3VycmVudCgpLnR5cGUpOworICBFWFBFQ1RfRVEoIiIsIHRva2VuaXplci5jdXJyZW50KCkudGV4dCk7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmxpbmUpOworICBFWFBFQ1RfRVEoMCwgdG9rZW5pemVyLmN1cnJlbnQoKS5jb2x1bW4pOworICBFWFBFQ1RfRVEoMCwgdG9rZW5pemVyLmN1cnJlbnQoKS5lbmRfY29sdW1uKTsKKworICAvLyBQYXJzZSB0aGUgdG9rZW4uCisgIEFTU0VSVF9UUlVFKHRva2VuaXplci5OZXh0KCkpOworCisgIC8vIENoZWNrIHRoYXQgaXQgaGFzIHRoZSByaWdodCB0eXBlLgorICBFWFBFQ1RfRVEoa1NpbXBsZVRva2VuQ2FzZXNfY2FzZS50eXBlLCB0b2tlbml6ZXIuY3VycmVudCgpLnR5cGUpOworICAvLyBDaGVjayB0aGF0IGl0IGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBpbnB1dCB0ZXh0LgorICBFWFBFQ1RfRVEoa1NpbXBsZVRva2VuQ2FzZXNfY2FzZS5pbnB1dCwgdG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0KTsKKyAgLy8gQ2hlY2sgdGhhdCBpdCBpcyBsb2NhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmxpbmUpOworICBFWFBFQ1RfRVEoMCwgdG9rZW5pemVyLmN1cnJlbnQoKS5jb2x1bW4pOworICBFWFBFQ1RfRVEoa1NpbXBsZVRva2VuQ2FzZXNfY2FzZS5pbnB1dC5zaXplKCksCisgICAgICAgICAgICB0b2tlbml6ZXIuY3VycmVudCgpLmVuZF9jb2x1bW4pOworCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIGlucHV0LgorICBFWFBFQ1RfRkFMU0UodG9rZW5pemVyLk5leHQoKSk7CisKKyAgLy8gQWZ0ZXIgTmV4dCgpIHJldHVybnMgZmFsc2UsIHRoZSB0b2tlbiBzaG91bGQgaGF2ZSB0eXBlIFRZUEVfRU5ELgorICBFWFBFQ1RfRVEoVG9rZW5pemVyOjpUWVBFX0VORCwgdG9rZW5pemVyLmN1cnJlbnQoKS50eXBlKTsKKyAgRVhQRUNUX0VRKCIiLCB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQpOworICBFWFBFQ1RfRVEoMCwgdG9rZW5pemVyLmN1cnJlbnQoKS5saW5lKTsKKyAgRVhQRUNUX0VRKGtTaW1wbGVUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7CisgIEVYUEVDVF9FUShrU2ltcGxlVG9rZW5DYXNlc19jYXNlLmlucHV0LnNpemUoKSwKKyAgICAgICAgICAgIHRva2VuaXplci5jdXJyZW50KCkuZW5kX2NvbHVtbik7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGVycm9ycy4KKyAgRVhQRUNUX1RSVUUoZXJyb3JfY29sbGVjdG9yLnRleHRfLmVtcHR5KCkpOworfQorCitURVNUXzFEKFRva2VuaXplclRlc3QsIEZsb2F0U3VmZml4LCBrQmxvY2tTaXplcykgeworICAvLyBUZXN0IHRoZSAiYWxsb3dfZl9hZnRlcl9mbG9hdCIgb3B0aW9uLgorCisgIC8vIFNldCB1cCB0aGUgdG9rZW5pemVyLgorICBjb25zdCBjaGFyKiB0ZXh0ID0gIjFmIDIuNWYgNmUzZiA3RiI7CisgIFRlc3RJbnB1dFN0cmVhbSBpbnB1dCh0ZXh0LCBzdHJsZW4odGV4dCksIGtCbG9ja1NpemVzX2Nhc2UpOworICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBUb2tlbml6ZXIgdG9rZW5pemVyKCZpbnB1dCwgJmVycm9yX2NvbGxlY3Rvcik7CisgIHRva2VuaXplci5zZXRfYWxsb3dfZl9hZnRlcl9mbG9hdCh0cnVlKTsKKworICAvLyBBZHZhbmNlIHRocm91Z2ggdG9rZW5zIGFuZCBjaGVjayB0aGF0IHRoZXkgYXJlIHBhcnNlZCBhcyBleHBlY3RlZC4KKyAgQVNTRVJUX1RSVUUodG9rZW5pemVyLk5leHQoKSk7CisgIEVYUEVDVF9FUSh0b2tlbml6ZXIuY3VycmVudCgpLnRleHQsICIxZiIpOworICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50eXBlLCBUb2tlbml6ZXI6OlRZUEVfRkxPQVQpOworICBBU1NFUlRfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKKyAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudGV4dCwgIjIuNWYiKTsKKyAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudHlwZSwgVG9rZW5pemVyOjpUWVBFX0ZMT0FUKTsKKyAgQVNTRVJUX1RSVUUodG9rZW5pemVyLk5leHQoKSk7CisgIEVYUEVDVF9FUSh0b2tlbml6ZXIuY3VycmVudCgpLnRleHQsICI2ZTNmIik7CisgIEVYUEVDVF9FUSh0b2tlbml6ZXIuY3VycmVudCgpLnR5cGUsIFRva2VuaXplcjo6VFlQRV9GTE9BVCk7CisgIEFTU0VSVF9UUlVFKHRva2VuaXplci5OZXh0KCkpOworICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0LCAiN0YiKTsKKyAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudHlwZSwgVG9rZW5pemVyOjpUWVBFX0ZMT0FUKTsKKworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gbW9yZSBpbnB1dC4KKyAgRVhQRUNUX0ZBTFNFKHRva2VuaXplci5OZXh0KCkpOworICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXJyb3JzLgorICBFWFBFQ1RfVFJVRShlcnJvcl9jb2xsZWN0b3IudGV4dF8uZW1wdHkoKSk7Cit9CisKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEluIGVhY2ggY2FzZSwgdGhlIGlucHV0IGlzIHBhcnNlZCB0byBwcm9kdWNlIGEgbGlzdCBvZiB0b2tlbnMuICBUaGUKKy8vIGxhc3QgdG9rZW4gaW4gIm91dHB1dCIgbXVzdCBoYXZlIHR5cGUgVFlQRV9FTkQuCitzdHJ1Y3QgTXVsdGlUb2tlbkNhc2UgeworICBzdHJpbmcgaW5wdXQ7CisgIFRva2VuaXplcjo6VG9rZW4gb3V0cHV0WzEwXTsgIC8vIFRoZSBjb21waWxlciB3YW50cyBhIGNvbnN0YW50IGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgZm9yIGluaXRpYWxpemF0aW9uIHRvIHdvcmsuICBUaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyByZWFzb24gdGhpcyBjYW4ndCBiZSBpbmNyZWFzZWQgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZGVkLgorfTsKKworaW5saW5lIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlUb2tlbkNhc2UmIHRlc3RfY2FzZSkgeworICByZXR1cm4gb3V0IDw8IENFc2NhcGUodGVzdF9jYXNlLmlucHV0KTsKK30KKworTXVsdGlUb2tlbkNhc2Uga011bHRpVG9rZW5DYXNlc1tdID0geworICAvLyBUZXN0IGVtcHR5IGlucHV0LgorICB7ICIiLCB7CisgICAgeyBUb2tlbml6ZXI6OlRZUEVfRU5EICAgICAgICwgIiIgICAgICwgMCwgIDAgfSwKKyAgfX0sCisKKyAgLy8gVGVzdCBhbGwgdG9rZW4gdHlwZXMgYXQgdGhlIHNhbWUgdGltZS4KKyAgeyAiZm9vIDEgMS4yICsgJ2JhciciLCB7CisgICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImZvbyIgICwgMCwgIDAsICAzIH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfSU5URUdFUiAgICwgIjEiICAgICwgMCwgIDQsICA1IH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfRkxPQVQgICAgICwgIjEuMiIgICwgMCwgIDYsICA5IH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MICAgICwgIisiICAgICwgMCwgMTAsIDExIH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HICAgICwgIidiYXInIiwgMCwgMTIsIDE3IH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfRU5EICAgICAgICwgIiIgICAgICwgMCwgMTcsIDE3IH0sCisgIH19LAorCisgIC8vIFRlc3QgdGhhdCBjb25zZWN1dGl2ZSBzeW1ib2xzIGFyZSBwYXJzZWQgYXMgc2VwYXJhdGUgdG9rZW5zLgorICB7ICIhQCslIiwgeworICAgIHsgVG9rZW5pemVyOjpUWVBFX1NZTUJPTCAgICAsICIhIiAgICAsIDAsIDAsIDEgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9TWU1CT0wgICAgLCAiQCIgICAgLCAwLCAxLCAyIH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MICAgICwgIisiICAgICwgMCwgMiwgMyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX1NZTUJPTCAgICAsICIlIiAgICAsIDAsIDMsIDQgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAgICAgLCAiIiAgICAgLCAwLCA0LCA0IH0sCisgIH19LAorCisgIC8vIFRlc3QgdGhhdCBuZXdsaW5lcyBhZmZlY3QgbGluZSBudW1iZXJzIGNvcnJlY3RseS4KKyAgeyAiZm9vIGJhclxucmFiIG9vZiIsIHsKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiZm9vIiwgMCwgIDAsIDMgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmFyIiwgMCwgIDQsIDcgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAicmFiIiwgMSwgIDAsIDMgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAib29mIiwgMSwgIDQsIDcgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAgICAgLCAiIiAgICwgMSwgIDcsIDcgfSwKKyAgfX0sCisKKyAgLy8gVGVzdCB0aGF0IHRhYnMgYWZmZWN0IGNvbHVtbiBudW1iZXJzIGNvcnJlY3RseS4KKyAgeyAiZm9vXHRiYXIgIFx0YmF6IiwgeworICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAgMCwgIDMgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmFyIiwgMCwgIDgsIDExIH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImJheiIsIDAsIDE2LCAxOSB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0VORCAgICAgICAsICIiICAgLCAwLCAxOSwgMTkgfSwKKyAgfX0sCisKKyAgLy8gVGVzdCB0aGF0IHRhYnMgaW4gc3RyaW5nIGxpdGVyYWxzIGFmZmVjdCBjb2x1bW4gbnVtYmVycyBjb3JyZWN0bHkuCisgIHsgIlwiZm9vXHRiYXJcIiBiYXoiLCB7CisgICAgeyBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HICAgICwgIlwiZm9vXHRiYXJcIiIsIDAsICAwLCAxMiB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXoiICAgICAgICAgLCAwLCAxMywgMTYgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAgICAgLCAiIiAgICAgICAgICAgICwgMCwgMTYsIDE2IH0sCisgIH19LAorCisgIC8vIFRlc3QgdGhhdCBsaW5lIGNvbW1lbnRzIGFyZSBpZ25vcmVkLgorICB7ICJmb28gLy8gVGhpcyBpcyBhIGNvbW1lbnRcbiIKKyAgICAiYmFyIC8vIFRoaXMgaXMgYW5vdGhlciBjb21tZW50IiwgeworICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAgMCwgIDMgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmFyIiwgMSwgIDAsICAzIH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfRU5EICAgICAgICwgIiIgICAsIDEsIDMwLCAzMCB9LAorICB9fSwKKworICAvLyBUZXN0IHRoYXQgYmxvY2sgY29tbWVudHMgYXJlIGlnbm9yZWQuCisgIHsgImZvbyAvKiBUaGlzIGlzIGEgYmxvY2sgY29tbWVudCAqLyBiYXIiLCB7CisgICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImZvbyIsIDAsICAwLCAgMyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXIiLCAwLCAzNCwgMzcgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAgICAgLCAiIiAgICwgMCwgMzcsIDM3IH0sCisgIH19LAorCisgIC8vIFRlc3QgdGhhdCBzaC1zdHlsZSBjb21tZW50cyBhcmUgbm90IGlnbm9yZWQgYnkgZGVmYXVsdC4KKyAgeyAiZm9vICMgYmFyXG4iCisgICAgImJheiIsIHsKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiZm9vIiwgMCwgMCwgMyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX1NZTUJPTCAgICAsICIjIiAgLCAwLCA0LCA1IH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImJhciIsIDAsIDYsIDkgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmF6IiwgMSwgMCwgMyB9LAorICAgIHsgVG9rZW5pemVyOjpUWVBFX0VORCAgICAgICAsICIiICAgLCAxLCAzLCAzIH0sCisgIH19LAorCisgIC8vIEJ5dGVzIHdpdGggdGhlIGhpZ2gtb3JkZXIgYml0IHNldCBzaG91bGQgbm90IGJlIHNlZW4gYXMgY29udHJvbCBjaGFyYWN0ZXJzLgorICB7ICJcMzAwIiwgeworICAgIHsgVG9rZW5pemVyOjpUWVBFX1NZTUJPTCwgIlwzMDAiLCAwLCAwLCAxIH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfRU5EICAgLCAiIiAgICAsIDAsIDEsIDEgfSwKKyAgfX0sCisKKyAgLy8gVGVzdCBhbGwgd2hpdGVzcGFjZSBjaGFycworICB7ICJmb29cblx0XHJcdlxmYmFyIiwgeworICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAgMCwgIDMgfSwKKyAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmFyIiwgMSwgMTEsIDE0IH0sCisgICAgeyBUb2tlbml6ZXI6OlRZUEVfRU5EICAgICAgICwgIiIgICAsIDEsIDE0LCAxNCB9LAorICB9fSwKK307CisKK1RFU1RfMkQoVG9rZW5pemVyVGVzdCwgTXVsdGlwbGVUb2tlbnMsIGtNdWx0aVRva2VuQ2FzZXMsIGtCbG9ja1NpemVzKSB7CisgIC8vIFNldCB1cCB0aGUgdG9rZW5pemVyLgorICBUZXN0SW5wdXRTdHJlYW0gaW5wdXQoa011bHRpVG9rZW5DYXNlc19jYXNlLmlucHV0LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtNdWx0aVRva2VuQ2FzZXNfY2FzZS5pbnB1dC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKKyAgVGVzdEVycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgVG9rZW5pemVyIHRva2VuaXplcigmaW5wdXQsICZlcnJvcl9jb2xsZWN0b3IpOworCisgIC8vIEJlZm9yZSBOZXh0KCkgaXMgY2FsbGVkLCB0aGUgaW5pdGlhbCB0b2tlbiBzaG91bGQgYWx3YXlzIGJlIFRZUEVfU1RBUlQuCisgIEVYUEVDVF9FUShUb2tlbml6ZXI6OlRZUEVfU1RBUlQsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7CisgIEVYUEVDVF9FUSgiIiwgdG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0KTsKKyAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7CisgIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmVuZF9jb2x1bW4pOworCisgIC8vIExvb3AgdGhyb3VnaCBhbGwgZXhwZWN0ZWQgdG9rZW5zLgorICBpbnQgaSA9IDA7CisgIFRva2VuaXplcjo6VG9rZW4gdG9rZW47CisgIGRvIHsKKyAgICB0b2tlbiA9IGtNdWx0aVRva2VuQ2FzZXNfY2FzZS5vdXRwdXRbaSsrXTsKKworICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIlRva2VuICMiIDw8IGkgPDwgIjogIiA8PCB0b2tlbi50ZXh0KTsKKworICAgIFRva2VuaXplcjo6VG9rZW4gcHJldmlvdXMgPSB0b2tlbml6ZXIuY3VycmVudCgpOworCisgICAgLy8gTmV4dCgpIHNob3VsZCBvbmx5IHJldHVybiBmYWxzZSB3aGVuIGl0IGhpdHMgdGhlIGVuZCB0b2tlbi4KKyAgICBpZiAodG9rZW4udHlwZSAhPSBUb2tlbml6ZXI6OlRZUEVfRU5EKSB7CisgICAgICBBU1NFUlRfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgQVNTRVJUX0ZBTFNFKHRva2VuaXplci5OZXh0KCkpOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgdGhlIHByZXZpb3VzIHRva2VuIGlzIHNldCBjb3JyZWN0bHkuCisgICAgRVhQRUNUX0VRKHByZXZpb3VzLnR5cGUsIHRva2VuaXplci5wcmV2aW91cygpLnR5cGUpOworICAgIEVYUEVDVF9FUShwcmV2aW91cy50ZXh0LCB0b2tlbml6ZXIucHJldmlvdXMoKS50ZXh0KTsKKyAgICBFWFBFQ1RfRVEocHJldmlvdXMubGluZSwgdG9rZW5pemVyLnByZXZpb3VzKCkubGluZSk7CisgICAgRVhQRUNUX0VRKHByZXZpb3VzLmNvbHVtbiwgdG9rZW5pemVyLnByZXZpb3VzKCkuY29sdW1uKTsKKyAgICBFWFBFQ1RfRVEocHJldmlvdXMuZW5kX2NvbHVtbiwgdG9rZW5pemVyLnByZXZpb3VzKCkuZW5kX2NvbHVtbik7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSB0b2tlbiBtYXRjaGVzIHRoZSBleHBlY3RlZCBvbmUuCisgICAgRVhQRUNUX0VRKHRva2VuLnR5cGUsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7CisgICAgRVhQRUNUX0VRKHRva2VuLnRleHQsIHRva2VuaXplci5jdXJyZW50KCkudGV4dCk7CisgICAgRVhQRUNUX0VRKHRva2VuLmxpbmUsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7CisgICAgRVhQRUNUX0VRKHRva2VuLmNvbHVtbiwgdG9rZW5pemVyLmN1cnJlbnQoKS5jb2x1bW4pOworICAgIEVYUEVDVF9FUSh0b2tlbi5lbmRfY29sdW1uLCB0b2tlbml6ZXIuY3VycmVudCgpLmVuZF9jb2x1bW4pOworCisgIH0gd2hpbGUgKHRva2VuLnR5cGUgIT0gVG9rZW5pemVyOjpUWVBFX0VORCk7CisKKyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGVycm9ycy4KKyAgRVhQRUNUX1RSVUUoZXJyb3JfY29sbGVjdG9yLnRleHRfLmVtcHR5KCkpOworfQorCisvLyBUaGlzIHRlc3QgY2F1c2VzIGdjYyAzLjMuNSAoYW5kIGVhcmxpZXI/KSB0byBnaXZlIHRoZSBjcnlwdGljIGVycm9yOgorLy8gICAic29ycnksIHVuaW1wbGVtZW50ZWQ6IGBtZXRob2RfY2FsbF9leHByJyBub3Qgc3VwcG9ydGVkIGJ5IGR1bXBfZXhwciIKKyNpZiAhZGVmaW5lZChfX0dOVUNfXykgfHwgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID4gMykKKworVEVTVF8xRChUb2tlbml6ZXJUZXN0LCBTaENvbW1lbnRTdHlsZSwga0Jsb2NrU2l6ZXMpIHsKKyAgLy8gVGVzdCB0aGUgImNvbW1lbnRfc3R5bGUiIG9wdGlvbi4KKworICBjb25zdCBjaGFyKiB0ZXh0ID0gImZvbyAjIGJhclxuIgorICAgICAgICAgICAgICAgICAgICAgImJheiAvLyBxdXhcbiIKKyAgICAgICAgICAgICAgICAgICAgICJjb3JnZSAvKiBncmF1bHQgKi9cbiIKKyAgICAgICAgICAgICAgICAgICAgICJnYXJwbHkiOworICBjb25zdCBjaGFyKiBjb25zdCBrVG9rZW5zW10gPSB7ImZvbyIsICAvLyAiIyBiYXIiIGlzIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXoiLCAiLyIsICIvIiwgInF1eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29yZ2UiLCAiLyIsICIqIiwgImdyYXVsdCIsICIqIiwgIi8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdhcnBseSJ9OworCisgIC8vIFNldCB1cCB0aGUgdG9rZW5pemVyLgorICBUZXN0SW5wdXRTdHJlYW0gaW5wdXQodGV4dCwgc3RybGVuKHRleHQpLCBrQmxvY2tTaXplc19jYXNlKTsKKyAgVGVzdEVycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgVG9rZW5pemVyIHRva2VuaXplcigmaW5wdXQsICZlcnJvcl9jb2xsZWN0b3IpOworICB0b2tlbml6ZXIuc2V0X2NvbW1lbnRfc3R5bGUoVG9rZW5pemVyOjpTSF9DT01NRU5UX1NUWUxFKTsKKworICAvLyBBZHZhbmNlIHRocm91Z2ggdG9rZW5zIGFuZCBjaGVjayB0aGF0IHRoZXkgYXJlIHBhcnNlZCBhcyBleHBlY3RlZC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKGtUb2tlbnMpOyBpKyspIHsKKyAgICBFWFBFQ1RfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKKyAgICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0LCBrVG9rZW5zW2ldKTsKKyAgfQorCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIGlucHV0LgorICBFWFBFQ1RfRkFMU0UodG9rZW5pemVyLk5leHQoKSk7CisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBlcnJvcnMuCisgIEVYUEVDVF9UUlVFKGVycm9yX2NvbGxlY3Rvci50ZXh0Xy5lbXB0eSgpKTsKK30KKworI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGVzdCBwYXJzZSBoZWxwZXJzLiAgSXQncyBub3QgcmVhbGx5IHdvcnRoIHNldHRpbmcgdXAgYSBmdWxsIGRhdGEtZHJpdmVuCisvLyB0ZXN0IGhlcmUuCitURVNUX0YoVG9rZW5pemVyVGVzdCwgUGFyc2VJbnRlZ2VyKSB7CisgIEVYUEVDVF9FUSgwLCBQYXJzZUludGVnZXIoIjAiKSk7CisgIEVYUEVDVF9FUSgxMjMsIFBhcnNlSW50ZWdlcigiMTIzIikpOworICBFWFBFQ1RfRVEoMHhhYmNkZWYxMnUsIFBhcnNlSW50ZWdlcigiMHhhYmNkZWYxMiIpKTsKKyAgRVhQRUNUX0VRKDB4YWJjZGVmMTJ1LCBQYXJzZUludGVnZXIoIjB4QUJDREVGMTIiKSk7CisgIEVYUEVDVF9FUShrdWludDY0bWF4LCBQYXJzZUludGVnZXIoIjB4RkZGRkZGRkZGRkZGRkZGRiIpKTsKKyAgRVhQRUNUX0VRKDAxMjM0NTY3LCBQYXJzZUludGVnZXIoIjAxMjM0NTY3IikpOworICBFWFBFQ1RfRVEoMFgxMjMsIFBhcnNlSW50ZWdlcigiMFgxMjMiKSk7CisKKyAgLy8gVGVzdCBpbnZhbGlkIGludGVnZXJzIHRoYXQgbWF5IHN0aWxsIGJlIHRva2VuaXplZCBhcyBpbnRlZ2Vycy4KKyAgRVhQRUNUX0VRKDAsIFBhcnNlSW50ZWdlcigiMHgiKSk7CisKKyAgdWludDY0IGk7CisjaWZkZWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QgIC8vIGRlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgeWV0CisgIC8vIFRlc3QgaW52YWxpZCBpbnRlZ2VycyB0aGF0IHdpbGwgbmV2ZXIgYmUgdG9rZW5pemVkIGFzIGludGVnZXJzLgorICBFWFBFQ1RfREVCVUdfREVBVEgoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoInp4eSIsIGt1aW50NjRtYXgsICZpKSwKKyAgICAicGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhbiBpbnRlZ2VyIik7CisgIEVYUEVDVF9ERUJVR19ERUFUSChUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMS4yIiwga3VpbnQ2NG1heCwgJmkpLAorICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGFuIGludGVnZXIiKTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIwOCIsIGt1aW50NjRtYXgsICZpKSwKKyAgICAicGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhbiBpbnRlZ2VyIik7CisgIEVYUEVDVF9ERUJVR19ERUFUSChUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMHhnIiwga3VpbnQ2NG1heCwgJmkpLAorICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGFuIGludGVnZXIiKTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCItMSIsIGt1aW50NjRtYXgsICZpKSwKKyAgICAicGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhbiBpbnRlZ2VyIik7CisjZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisKKyAgLy8gVGVzdCBvdmVyZmxvd3MuCisgIEVYUEVDVF9UUlVFIChUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMCIsIDAsICZpKSk7CisgIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMSIsIDAsICZpKSk7CisgIEVYUEVDVF9UUlVFIChUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMSIsIDEsICZpKSk7CisgIEVYUEVDVF9UUlVFIChUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMTIzNDUiLCAxMjM0NSwgJmkpKTsKKyAgRVhQRUNUX0ZBTFNFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIxMjM0NiIsIDEyMzQ1LCAmaSkpOworICBFWFBFQ1RfVFJVRSAoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjB4RkZGRkZGRkZGRkZGRkZGRiIgLCBrdWludDY0bWF4LCAmaSkpOworICBFWFBFQ1RfRkFMU0UoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjB4MTAwMDAwMDAwMDAwMDAwMDAiLCBrdWludDY0bWF4LCAmaSkpOworfQorCitURVNUX0YoVG9rZW5pemVyVGVzdCwgUGFyc2VGbG9hdCkgeworICBFWFBFQ1RfRE9VQkxFX0VRKDEgICAgLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjEuIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKDFlMyAgLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjFlMyIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxZTMgICwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxRTMiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMS41ZTMsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS41ZTMiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLjEgICAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiLjEiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLjI1ICAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiLjI1IikpOworICBFWFBFQ1RfRE9VQkxFX0VRKC4xZTMgLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIi4xZTMiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLjI1ZTMsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiLjI1ZTMiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLjFlKzMsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiLjFlKzMiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLjFlLTMsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiLjFlLTMiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoNSAgICAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiNSIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSg2ZS0xMiwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCI2ZS0xMiIpKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgxLjIgICwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxLjIiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMS5lMiAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS5lMiIpKTsKKworICAvLyBUZXN0IGludmFsaWQgaW50ZWdlcnMgdGhhdCBtYXkgc3RpbGwgYmUgdG9rZW5pemVkIGFzIGludGVnZXJzLgorICBFWFBFQ1RfRE9VQkxFX0VRKDEsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMWUiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMSwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxZS0iKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMSwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxLmUiKSk7CisKKyAgLy8gVGVzdCAnZicgc3VmZml4LgorICBFWFBFQ1RfRE9VQkxFX0VRKDEsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMWYiKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMSwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxLjBmIikpOworICBFWFBFQ1RfRE9VQkxFX0VRKDEsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMUYiKSk7CisKKyAgLy8gVGhlc2Ugc2hvdWxkIHBhcnNlIHN1Y2Nlc3NmdWxseSBldmVuIHRob3VnaCB0aGV5IGFyZSBvdXQgb2YgcmFuZ2UuCisgIC8vIE92ZXJmbG93cyBiZWNvbWUgaW5maW5pdHkgYW5kIHVuZGVyZmxvd3MgYmVjb21lIHplcm8uCisgIEVYUEVDVF9FUSggICAgIDAuMCwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxZS05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IikpOworICBFWFBFQ1RfRVEoSFVHRV9WQUwsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMWUrOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpKTsKKworI2lmZGVmIEdURVNUX0hBU19ERUFUSF9URVNUICAvLyBkZWF0aCB0ZXN0cyBkbyBub3Qgd29yayBvbiBXaW5kb3dzIHlldAorICAvLyBUZXN0IGludmFsaWQgaW50ZWdlcnMgdGhhdCB3aWxsIG5ldmVyIGJlIHRva2VuaXplZCBhcyBpbnRlZ2Vycy4KKyAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VGbG9hdCgienh5IiksCisgICAgInBhc3NlZCB0ZXh0IHRoYXQgY291bGQgbm90IGhhdmUgYmVlbiB0b2tlbml6ZWQgYXMgYSBmbG9hdCIpOworICBFWFBFQ1RfREVCVUdfREVBVEgoVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxLWUwIiksCisgICAgInBhc3NlZCB0ZXh0IHRoYXQgY291bGQgbm90IGhhdmUgYmVlbiB0b2tlbml6ZWQgYXMgYSBmbG9hdCIpOworICBFWFBFQ1RfREVCVUdfREVBVEgoVG9rZW5pemVyOjpQYXJzZUZsb2F0KCItMS4wIiksCisgICAgInBhc3NlZCB0ZXh0IHRoYXQgY291bGQgbm90IGhhdmUgYmVlbiB0b2tlbml6ZWQgYXMgYSBmbG9hdCIpOworI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorfQorCitURVNUX0YoVG9rZW5pemVyVGVzdCwgUGFyc2VTdHJpbmcpIHsKKyAgc3RyaW5nIG91dHB1dDsKKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ2hlbGxvJyIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgb3V0cHV0KTsKKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiXCJibGFoXFxuYmxhaDJcIiIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoImJsYWhcbmJsYWgyIiwgb3V0cHV0KTsKKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ1xcMXhcXDFcXDEyM1xcNzM5XFw1MlxcMzM0blxcMyciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJcMXhcMVwxMjNcNzM5XDUyXDMzNG5cMyIsIG91dHB1dCk7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidcXHgyMFxceDQnIiwgJm91dHB1dCk7CisgIEVYUEVDVF9FUSgiXHgyMFx4NCIsIG91dHB1dCk7CisKKyAgLy8gVGVzdCBpbnZhbGlkIHN0cmluZ3MgdGhhdCBtYXkgc3RpbGwgYmUgdG9rZW5pemVkIGFzIHN0cmluZ3MuCisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIlwiXFxhXFxsXFx2XFx0IiwgJm91dHB1dCk7ICAvLyBcbCBpcyBpbnZhbGlkCisgIEVYUEVDVF9FUSgiXGE/XHZcdCIsIG91dHB1dCk7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIiciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCIiLCBvdXRwdXQpOworICBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKCInXFwiLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJcXCIsIG91dHB1dCk7CisKKyAgLy8gVGVzdCBpbnZhbGlkIHN0cmluZ3MgdGhhdCB3aWxsIG5ldmVyIGJlIHRva2VuaXplZCBhcyBzdHJpbmdzLgorI2lmZGVmIEdURVNUX0hBU19ERUFUSF9URVNUICAvLyBkZWF0aCB0ZXN0cyBkbyBub3Qgd29yayBvbiBXaW5kb3dzIHlldAorICBFWFBFQ1RfREVCVUdfREVBVEgoVG9rZW5pemVyOjpQYXJzZVN0cmluZygiIiwgJm91dHB1dCksCisgICAgInBhc3NlZCB0ZXh0IHRoYXQgY291bGQgbm90IGhhdmUgYmVlbiB0b2tlbml6ZWQgYXMgYSBzdHJpbmciKTsKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKK30KKworVEVTVF9GKFRva2VuaXplclRlc3QsIFBhcnNlU3RyaW5nQXBwZW5kKSB7CisgIC8vIENoZWNrIHRoYXQgUGFyc2VTdHJpbmcgYW5kIFBhcnNlU3RyaW5nQXBwZW5kIGRpZmZlci4KKyAgc3RyaW5nIG91dHB1dCgic3R1ZmYrIik7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmdBcHBlbmQoIidoZWxsbyciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJzdHVmZitoZWxsbyIsIG91dHB1dCk7CisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidoZWxsbyciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIG91dHB1dCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRWFjaCBjYXNlIHBhcnNlcyBzb21lIGlucHV0IHRleHQsIGlnbm9yaW5nIHRoZSB0b2tlbnMgcHJvZHVjZWQsIGFuZAorLy8gY2hlY2tzIHRoYXQgdGhlIGVycm9yIG91dHB1dCBtYXRjaGVzIHdoYXQgaXMgZXhwZWN0ZWQuCitzdHJ1Y3QgRXJyb3JDYXNlIHsKKyAgc3RyaW5nIGlucHV0OworICBib29sIHJlY292ZXJhYmxlOyAgLy8gVHJ1ZSBpZiB0aGUgdG9rZW5pemVyIHNob3VsZCBiZSBhYmxlIHRvIHJlY292ZXIgYW5kCisgICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb3JlIHRva2VucyBhZnRlciBzZWVpbmcgdGhpcyBlcnJvci4gIENhc2VzCisgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igd2hpY2ggdGhpcyBpcyB0cnVlIG11c3QgZW5kIHdpdGggImZvbyIgYXMKKyAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IHRva2VuLCB3aGljaCB0aGUgdGVzdCB3aWxsIGNoZWNrIGZvci4KKyAgY29uc3QgY2hhciogZXJyb3JzOworfTsKKworaW5saW5lIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXJyb3JDYXNlJiB0ZXN0X2Nhc2UpIHsKKyAgcmV0dXJuIG91dCA8PCBDRXNjYXBlKHRlc3RfY2FzZS5pbnB1dCk7Cit9CisKK0Vycm9yQ2FzZSBrRXJyb3JDYXNlc1tdID0geworICAvLyBTdHJpbmcgZXJyb3JzLgorICB7ICInXFxsJyBmb28iLCB0cnVlLAorICAgICIwOjI6IEludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsLlxuIiB9LAorICB7ICInXFx4JyBmb28iLCB0cnVlLAorICAgICIwOjM6IEV4cGVjdGVkIGhleCBkaWdpdHMgZm9yIGVzY2FwZSBzZXF1ZW5jZS5cbiIgfSwKKyAgeyAiJ2ZvbyIsIGZhbHNlLAorICAgICIwOjQ6IFN0cmluZyBsaXRlcmFscyBjYW5ub3QgY3Jvc3MgbGluZSBib3VuZGFyaWVzLlxuIiB9LAorICB7ICInYmFyXG5mb28iLCB0cnVlLAorICAgICIwOjQ6IFN0cmluZyBsaXRlcmFscyBjYW5ub3QgY3Jvc3MgbGluZSBib3VuZGFyaWVzLlxuIiB9LAorCisgIC8vIEludGVnZXIgZXJyb3JzLgorICB7ICIxMjNmb28iLCB0cnVlLAorICAgICIwOjM6IE5lZWQgc3BhY2UgYmV0d2VlbiBudW1iZXIgYW5kIGlkZW50aWZpZXIuXG4iIH0sCisKKyAgLy8gSGV4L29jdGFsIGVycm9ycy4KKyAgeyAiMHggZm9vIiwgdHJ1ZSwKKyAgICAiMDoyOiBcIjB4XCIgbXVzdCBiZSBmb2xsb3dlZCBieSBoZXggZGlnaXRzLlxuIiB9LAorICB7ICIwNTQxODIzIGZvbyIsIHRydWUsCisgICAgIjA6NDogTnVtYmVycyBzdGFydGluZyB3aXRoIGxlYWRpbmcgemVybyBtdXN0IGJlIGluIG9jdGFsLlxuIiB9LAorICB7ICIweDEyM3ogZm9vIiwgdHJ1ZSwKKyAgICAiMDo1OiBOZWVkIHNwYWNlIGJldHdlZW4gbnVtYmVyIGFuZCBpZGVudGlmaWVyLlxuIiB9LAorICB7ICIweDEyMy40IGZvbyIsIHRydWUsCisgICAgIjA6NTogSGV4IGFuZCBvY3RhbCBudW1iZXJzIG11c3QgYmUgaW50ZWdlcnMuXG4iIH0sCisgIHsgIjAxMjMuNCBmb28iLCB0cnVlLAorICAgICIwOjQ6IEhleCBhbmQgb2N0YWwgbnVtYmVycyBtdXN0IGJlIGludGVnZXJzLlxuIiB9LAorCisgIC8vIEZsb2F0IGVycm9ycy4KKyAgeyAiMWUgZm9vIiwgdHJ1ZSwKKyAgICAiMDoyOiBcImVcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGV4cG9uZW50LlxuIiB9LAorICB7ICIxZS0gZm9vIiwgdHJ1ZSwKKyAgICAiMDozOiBcImVcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGV4cG9uZW50LlxuIiB9LAorICB7ICIxLjIuMyBmb28iLCB0cnVlLAorICAgICIwOjM6IEFscmVhZHkgc2F3IGRlY2ltYWwgcG9pbnQgb3IgZXhwb25lbnQ7IGNhbid0IGhhdmUgYW5vdGhlciBvbmUuXG4iIH0sCisgIHsgIjFlMi4zIGZvbyIsIHRydWUsCisgICAgIjA6MzogQWxyZWFkeSBzYXcgZGVjaW1hbCBwb2ludCBvciBleHBvbmVudDsgY2FuJ3QgaGF2ZSBhbm90aGVyIG9uZS5cbiIgfSwKKyAgeyAiYS4xIGZvbyIsIHRydWUsCisgICAgIjA6MTogTmVlZCBzcGFjZSBiZXR3ZWVuIGlkZW50aWZpZXIgYW5kIGRlY2ltYWwgcG9pbnQuXG4iIH0sCisgIC8vIGFsbG93X2ZfYWZ0ZXJfZmxvYXQgbm90IGVuYWJsZWQsIHNvIHRoaXMgc2hvdWxkIGJlIGFuIGVycm9yLgorICB7ICIxLjBmIGZvbyIsIHRydWUsCisgICAgIjA6MzogTmVlZCBzcGFjZSBiZXR3ZWVuIG51bWJlciBhbmQgaWRlbnRpZmllci5cbiIgfSwKKworICAvLyBCbG9jayBjb21tZW50IGVycm9ycy4KKyAgeyAiLyoiLCBmYWxzZSwKKyAgICAiMDoyOiBFbmQtb2YtZmlsZSBpbnNpZGUgYmxvY2sgY29tbWVudC5cbiIKKyAgICAiMDowOiAgIENvbW1lbnQgc3RhcnRlZCBoZXJlLlxuIn0sCisgIHsgIi8qLyovIGZvbyIsIHRydWUsCisgICAgIjA6MzogXCIvKlwiIGluc2lkZSBibG9jayBjb21tZW50LiAgQmxvY2sgY29tbWVudHMgY2Fubm90IGJlIG5lc3RlZC5cbiJ9LAorCisgIC8vIENvbnRyb2wgY2hhcmFjdGVycy4gIE11bHRpcGxlIGNvbnNlY3V0aXZlIGNvbnRyb2wgY2hhcmFjdGVycyBzaG91bGQgb25seQorICAvLyBwcm9kdWNlIG9uZSBlcnJvci4KKyAgeyAiXGIgZm9vIiwgdHJ1ZSwKKyAgICAiMDowOiBJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiB0ZXh0LlxuIiB9LAorICB7ICJcYlxiIGZvbyIsIHRydWUsCisgICAgIjA6MDogSW52YWxpZCBjb250cm9sIGNoYXJhY3RlcnMgZW5jb3VudGVyZWQgaW4gdGV4dC5cbiIgfSwKKworICAvLyBDaGVjayB0aGF0IGNvbnRyb2wgY2hhcmFjdGVycyBhdCBlbmQgb2YgaW5wdXQgZG9uJ3QgcmVzdWx0IGluIGFuCisgIC8vIGluZmluaXRlIGxvb3AuCisgIHsgIlxiIiwgZmFsc2UsCisgICAgIjA6MDogSW52YWxpZCBjb250cm9sIGNoYXJhY3RlcnMgZW5jb3VudGVyZWQgaW4gdGV4dC5cbiIgfSwKKworICAvLyBDaGVjayByZWNvdmVyeSBmcm9tICdcMCcuICBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgbGVuZ3RoIG9mCisgIC8vIHRoZXNlIHN0cmluZ3MgYmVjYXVzZSBvdGhlcndpc2UgdGhlIHN0cmluZyBjb25zdHJ1Y3RvciB3aWxsIGp1c3QgY2FsbAorICAvLyBzdHJsZW4oKSB3aGljaCB3aWxsIHNlZSB0aGUgZmlyc3QgJ1wwJyBhbmQgdGhpbmsgdGhhdCBpcyB0aGUgZW5kIG9mIHRoZQorICAvLyBzdHJpbmcuCisgIHsgc3RyaW5nKCJcMGZvbyIsIDQpLCB0cnVlLAorICAgICIwOjA6IEludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRleHQuXG4iIH0sCisgIHsgc3RyaW5nKCJcMFwwZm9vIiwgNSksIHRydWUsCisgICAgIjA6MDogSW52YWxpZCBjb250cm9sIGNoYXJhY3RlcnMgZW5jb3VudGVyZWQgaW4gdGV4dC5cbiIgfSwKK307CisKK1RFU1RfMkQoVG9rZW5pemVyVGVzdCwgRXJyb3JzLCBrRXJyb3JDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIuCisgIFRlc3RJbnB1dFN0cmVhbSBpbnB1dChrRXJyb3JDYXNlc19jYXNlLmlucHV0LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtFcnJvckNhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZXNfY2FzZSk7CisgIFRlc3RFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIFRva2VuaXplciB0b2tlbml6ZXIoJmlucHV0LCAmZXJyb3JfY29sbGVjdG9yKTsKKworICAvLyBJZ25vcmUgYWxsIGlucHV0LCBleGNlcHQgcmVtZW1iZXIgaWYgdGhlIGxhc3QgdG9rZW4gd2FzICJmb28iLgorICBib29sIGxhc3Rfd2FzX2ZvbyA9IGZhbHNlOworICB3aGlsZSAodG9rZW5pemVyLk5leHQoKSkgeworICAgIGxhc3Rfd2FzX2ZvbyA9IHRva2VuaXplci5jdXJyZW50KCkudGV4dCA9PSAiZm9vIjsKKyAgfQorCisgIC8vIENoZWNrIHRoYXQgdGhlIGVycm9ycyBtYXRjaCB3aGF0IHdhcyBleHBlY3RlZC4KKyAgRVhQRUNUX0VRKGVycm9yX2NvbGxlY3Rvci50ZXh0Xywga0Vycm9yQ2FzZXNfY2FzZS5lcnJvcnMpOworCisgIC8vIElmIHRoZSBlcnJvciB3YXMgcmVjb3ZlcmFibGUsIG1ha2Ugc3VyZSB3ZSBzYXcgImZvbyIgYWZ0ZXIgaXQuCisgIGlmIChrRXJyb3JDYXNlc19jYXNlLnJlY292ZXJhYmxlKSB7CisgICAgRVhQRUNUX1RSVUUobGFzdF93YXNfZm9vKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RFU1RfMUQoVG9rZW5pemVyVGVzdCwgQmFja1VwT25EZXN0cnVjdGlvbiwga0Jsb2NrU2l6ZXMpIHsKKyAgc3RyaW5nIHRleHQgPSAiZm9vIGJhciI7CisgIFRlc3RJbnB1dFN0cmVhbSBpbnB1dCh0ZXh0LmRhdGEoKSwgdGV4dC5zaXplKCksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIC8vIENyZWF0ZSBhIHRva2VuaXplciwgcmVhZCBvbmUgdG9rZW4sIHRoZW4gZGVzdHJveSBpdC4KKyAgeworICAgIFRlc3RFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgICAgVG9rZW5pemVyIHRva2VuaXplcigmaW5wdXQsICZlcnJvcl9jb2xsZWN0b3IpOworCisgICAgdG9rZW5pemVyLk5leHQoKTsKKyAgfQorCisgIC8vIE9ubHkgImZvbyIgc2hvdWxkIGhhdmUgYmVlbiByZWFkLgorICBFWFBFQ1RfRVEoc3RybGVuKCJmb28iKSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQ2ZmYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYwpAQCAtMCwwICsxLDQ4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworWmVyb0NvcHlJbnB1dFN0cmVhbTo6flplcm9Db3B5SW5wdXRTdHJlYW0oKSB7fQorWmVyb0NvcHlPdXRwdXRTdHJlYW06On5aZXJvQ29weU91dHB1dFN0cmVhbSgpIHt9CisKKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjUzMjZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oCkBAIC0wLDAgKzEsMjM4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFplcm9Db3B5SW5wdXRTdHJlYW0gYW5kIFplcm9Db3B5T3V0cHV0U3RyZWFtCisvLyBpbnRlcmZhY2VzLCB3aGljaCByZXByZXNlbnQgYWJzdHJhY3QgSS9PIHN0cmVhbXMgdG8gYW5kIGZyb20gd2hpY2gKKy8vIHByb3RvY29sIGJ1ZmZlcnMgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4uICBGb3IgYSBmZXcgc2ltcGxlCisvLyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlc2UgaW50ZXJmYWNlcywgc2VlIHplcm9fY29weV9zdHJlYW1faW1wbC5oLgorLy8KKy8vIFRoZXNlIGludGVyZmFjZXMgYXJlIGRpZmZlcmVudCBmcm9tIGNsYXNzaWMgSS9PIHN0cmVhbXMgaW4gdGhhdCB0aGV5CisvLyB0cnkgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiBkYXRhIGNvcHlpbmcgdGhhdCBuZWVkcyB0byBiZSBkb25lLgorLy8gVG8gYWNjb21wbGlzaCB0aGlzLCByZXNwb25zaWJpbGl0eSBmb3IgYWxsb2NhdGluZyBidWZmZXJzIGlzIG1vdmVkIHRvCisvLyB0aGUgc3RyZWFtIG9iamVjdCwgcmF0aGVyIHRoYW4gYmVpbmcgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIuCisvLyBTbywgdGhlIHN0cmVhbSBjYW4gcmV0dXJuIGEgYnVmZmVyIHdoaWNoIGFjdHVhbGx5IHBvaW50cyBkaXJlY3RseSBpbnRvCisvLyB0aGUgZmluYWwgZGF0YSBzdHJ1Y3R1cmUgd2hlcmUgdGhlIGJ5dGVzIGFyZSB0byBiZSBzdG9yZWQsIGFuZCB0aGUgY2FsbGVyCisvLyBjYW4gaW50ZXJhY3QgZGlyZWN0bHkgd2l0aCB0aGF0IGJ1ZmZlciwgZWxpbWluYXRpbmcgYW4gaW50ZXJtZWRpYXRlIGNvcHkKKy8vIG9wZXJhdGlvbi4KKy8vCisvLyBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgY29tbW9uIGNhc2UgaW4gd2hpY2ggeW91IGFyZSByZWFkaW5nIGJ5dGVzCisvLyBmcm9tIGFuIGFycmF5IHRoYXQgaXMgYWxyZWFkeSBpbiBtZW1vcnkgKG9yIHBlcmhhcHMgYW4gbW1hcCgpZWQgZmlsZSkuCisvLyBXaXRoIGNsYXNzaWMgSS9PIHN0cmVhbXMsIHlvdSB3b3VsZCBkbyBzb21ldGhpbmcgbGlrZToKKy8vICAgY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdOworLy8gICBpbnB1dC0+UmVhZChidWZmZXIsIEJVRkZFUl9TSVpFKTsKKy8vICAgRG9Tb21ldGhpbmcoYnVmZmVyLCBCVUZGRVJfU0laRSk7CisvLyBUaGVuLCB0aGUgc3RyZWFtIGJhc2ljYWxseSBqdXN0IGNhbGxzIG1lbWNweSgpIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQorLy8gdGhlIGFycmF5IGludG8geW91ciBidWZmZXIuICBXaXRoIGEgWmVyb0NvcHlJbnB1dFN0cmVhbSwgeW91IHdvdWxkIGRvCisvLyB0aGlzIGluc3RlYWQ6CisvLyAgIGNvbnN0IHZvaWQqIGJ1ZmZlcjsKKy8vICAgaW50IHNpemU7CisvLyAgIGlucHV0LT5OZXh0KCZidWZmZXIsICZzaXplKTsKKy8vICAgRG9Tb21ldGhpbmcoYnVmZmVyLCBzaXplKTsKKy8vIEhlcmUsIG5vIGNvcHkgaXMgcGVyZm9ybWVkLiAgVGhlIGlucHV0IHN0cmVhbSByZXR1cm5zIGEgcG9pbnRlciBkaXJlY3RseQorLy8gaW50byB0aGUgYmFja2luZyBhcnJheSwgYW5kIHRoZSBjYWxsZXIgZW5kcyB1cCByZWFkaW5nIGRpcmVjdGx5IGZyb20gaXQuCisvLworLy8gSWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkIHRoZSBvbGQtZmFzaGlvbiB3YXksIHlvdSBjYW4gY3JlYXRlCisvLyBhIENvZGVkSW5wdXRTdHJlYW0gb3IgQ29kZWRPdXRwdXRTdHJlYW0gd3JhcHBpbmcgdGhlc2Ugb2JqZWN0cyBhbmQgdXNlCisvLyB0aGVpciBSZWFkUmF3KCkvV3JpdGVSYXcoKSBtZXRob2RzLiAgVGhlc2Ugd2lsbCwgb2YgY291cnNlLCBhZGQgYSBjb3B5CisvLyBzdGVwLCBidXQgQ29kZWQqU3RyZWFtIHdpbGwgaGFuZGxlIGJ1ZmZlcmluZyBzbyBhdCBsZWFzdCBpdCB3aWxsIGJlCisvLyByZWFzb25hYmx5IGVmZmljaWVudC4KKy8vCisvLyBaZXJvQ29weUlucHV0U3RyZWFtIGV4YW1wbGU6CisvLyAgIC8vIFJlYWQgaW4gYSBmaWxlIGFuZCBwcmludCBpdHMgY29udGVudHMgdG8gc3Rkb3V0LgorLy8gICBpbnQgZmQgPSBvcGVuKCJteWZpbGUiLCBPX1JET05MWSk7CisvLyAgIFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmZCk7CisvLworLy8gICBjb25zdCB2b2lkKiBidWZmZXI7CisvLyAgIGludCBzaXplOworLy8gICB3aGlsZSAoaW5wdXQtPk5leHQoJmJ1ZmZlciwgJnNpemUpKSB7CisvLyAgICAgY291dC53cml0ZShidWZmZXIsIHNpemUpOworLy8gICB9CisvLworLy8gICBkZWxldGUgaW5wdXQ7CisvLyAgIGNsb3NlKGZkKTsKKy8vCisvLyBaZXJvQ29weU91dHB1dFN0cmVhbSBleGFtcGxlOgorLy8gICAvLyBDb3B5IHRoZSBjb250ZW50cyBvZiAiaW5maWxlIiB0byAib3V0ZmlsZSIsIHVzaW5nIHBsYWluIHJlYWQoKSBmb3IKKy8vICAgLy8gImluZmlsZSIgYnV0IGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gZm9yICJvdXRmaWxlIi4KKy8vICAgaW50IGluZmQgPSBvcGVuKCJpbmZpbGUiLCBPX1JET05MWSk7CisvLyAgIGludCBvdXRmZCA9IG9wZW4oIm91dGZpbGUiLCBPX1dST05MWSk7CisvLyAgIFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRmZCk7CisvLworLy8gICB2b2lkKiBidWZmZXI7CisvLyAgIGludCBzaXplOworLy8gICB3aGlsZSAob3V0cHV0LT5OZXh0KCZidWZmZXIsICZzaXplKSkgeworLy8gICAgIGludCBieXRlcyA9IHJlYWQoaW5mZCwgYnVmZmVyLCBzaXplKTsKKy8vICAgICBpZiAoYnl0ZXMgPCBzaXplKSB7CisvLyAgICAgICAvLyBSZWFjaGVkIEVPRi4KKy8vICAgICAgIG91dHB1dC0+QmFja1VwKHNpemUgLSBieXRlcyk7CisvLyAgICAgICBicmVhazsKKy8vICAgICB9CisvLyAgIH0KKy8vCisvLyAgIGRlbGV0ZSBvdXRwdXQ7CisvLyAgIGNsb3NlKGluZmQpOworLy8gICBjbG9zZShvdXRmZCk7CisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCisvLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KK2NsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07CitjbGFzcyBaZXJvQ29weU91dHB1dFN0cmVhbTsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIHNpbWlsYXIgdG8gYW4gaW5wdXQgc3RyZWFtIGJ1dCBkZXNpZ25lZCB0byBtaW5pbWl6ZQorLy8gY29weWluZy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIGlubGluZSBaZXJvQ29weUlucHV0U3RyZWFtKCkge30KKyAgdmlydHVhbCB+WmVyb0NvcHlJbnB1dFN0cmVhbSgpOworCisgIC8vIE9idGFpbnMgYSBjaHVuayBvZiBkYXRhIGZyb20gdGhlIHN0cmVhbS4KKyAgLy8KKyAgLy8gUHJlY29uZGl0aW9uczoKKyAgLy8gKiAic2l6ZSIgYW5kICJkYXRhIiBhcmUgbm90IE5VTEwuCisgIC8vCisgIC8vIFBvc3Rjb25kaXRpb25zOgorICAvLyAqIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBmYWxzZSwgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHRvIHJldHVybiBvcgorICAvLyAgIGFuIGVycm9yIG9jY3VycmVkLiAgQWxsIGVycm9ycyBhcmUgcGVybWFuZW50LgorICAvLyAqIE90aGVyd2lzZSwgInNpemUiIHBvaW50cyB0byB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWFkIGFuZCAiZGF0YSIKKyAgLy8gICBwb2ludHMgdG8gYSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlc2UgYnl0ZXMuCisgIC8vICogT3duZXJzaGlwIG9mIHRoaXMgYnVmZmVyIHJlbWFpbnMgd2l0aCB0aGUgc3RyZWFtLCBhbmQgdGhlIGJ1ZmZlcgorICAvLyAgIHJlbWFpbnMgdmFsaWQgb25seSB1bnRpbCBzb21lIG90aGVyIG1ldGhvZCBvZiB0aGUgc3RyZWFtIGlzIGNhbGxlZAorICAvLyAgIG9yIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLgorICAvLyAqIEl0IGlzIGxlZ2FsIGZvciB0aGUgcmV0dXJuZWQgYnVmZmVyIHRvIGhhdmUgemVybyBzaXplLCBhcyBsb25nCisgIC8vICAgYXMgcmVwZWF0ZWRseSBjYWxsaW5nIE5leHQoKSBldmVudHVhbGx5IHlpZWxkcyBhIGJ1ZmZlciB3aXRoIG5vbi16ZXJvCisgIC8vICAgc2l6ZS4KKyAgdmlydHVhbCBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgPSAwOworCisgIC8vIEJhY2tzIHVwIGEgbnVtYmVyIG9mIGJ5dGVzLCBzbyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gTmV4dCgpIHJldHVybnMKKyAgLy8gZGF0YSBhZ2FpbiB0aGF0IHdhcyBhbHJlYWR5IHJldHVybmVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8gTmV4dCgpLiAgVGhpcworICAvLyBpcyB1c2VmdWwgd2hlbiB3cml0aW5nIHByb2NlZHVyZXMgdGhhdCBhcmUgb25seSBzdXBwb3NlZCB0byByZWFkIHVwCisgIC8vIHRvIGEgY2VydGFpbiBwb2ludCBpbiB0aGUgaW5wdXQsIHRoZW4gcmV0dXJuLiAgSWYgTmV4dCgpIHJldHVybnMgYQorICAvLyBidWZmZXIgdGhhdCBnb2VzIGJleW9uZCB3aGF0IHlvdSB3YW50ZWQgdG8gcmVhZCwgeW91IGNhbiB1c2UgQmFja1VwKCkKKyAgLy8gdG8gcmV0dXJuIHRvIHRoZSBwb2ludCB3aGVyZSB5b3UgaW50ZW5kZWQgdG8gZmluaXNoLgorICAvLworICAvLyBQcmVjb25kaXRpb25zOgorICAvLyAqIFRoZSBsYXN0IG1ldGhvZCBjYWxsZWQgbXVzdCBoYXZlIGJlZW4gTmV4dCgpLgorICAvLyAqIGNvdW50IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBsYXN0IGJ1ZmZlcgorICAvLyAgIHJldHVybmVkIGJ5IE5leHQoKS4KKyAgLy8KKyAgLy8gUG9zdGNvbmRpdGlvbnM6CisgIC8vICogVGhlIGxhc3QgImNvdW50IiBieXRlcyBvZiB0aGUgbGFzdCBidWZmZXIgcmV0dXJuZWQgYnkgTmV4dCgpIHdpbGwgYmUKKyAgLy8gICBwdXNoZWQgYmFjayBpbnRvIHRoZSBzdHJlYW0uICBTdWJzZXF1ZW50IGNhbGxzIHRvIE5leHQoKSB3aWxsIHJldHVybgorICAvLyAgIHRoZSBzYW1lIGRhdGEgYWdhaW4gYmVmb3JlIHByb2R1Y2luZyBuZXcgZGF0YS4KKyAgdmlydHVhbCB2b2lkIEJhY2tVcChpbnQgY291bnQpID0gMDsKKworICAvLyBTa2lwcyBhIG51bWJlciBvZiBieXRlcy4gIFJldHVybnMgZmFsc2UgaWYgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzCisgIC8vIHJlYWNoZWQgb3Igc29tZSBpbnB1dCBlcnJvciBvY2N1cnJlZC4gIEluIHRoZSBlbmQtb2Ytc3RyZWFtIGNhc2UsIHRoZQorICAvLyBzdHJlYW0gaXMgYWR2YW5jZWQgdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtIChzbyBCeXRlQ291bnQoKSB3aWxsIHJldHVybgorICAvLyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgc3RyZWFtKS4KKyAgdmlydHVhbCBib29sIFNraXAoaW50IGNvdW50KSA9IDA7CisKKyAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgc2luY2UgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQuCisgIHZpcnR1YWwgaW50NjQgQnl0ZUNvdW50KCkgY29uc3QgPSAwOworCisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoWmVyb0NvcHlJbnB1dFN0cmVhbSk7Cit9OworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2Ugc2ltaWxhciB0byBhbiBvdXRwdXQgc3RyZWFtIGJ1dCBkZXNpZ25lZCB0byBtaW5pbWl6ZQorLy8gY29weWluZy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICBpbmxpbmUgWmVyb0NvcHlPdXRwdXRTdHJlYW0oKSB7fQorICB2aXJ0dWFsIH5aZXJvQ29weU91dHB1dFN0cmVhbSgpOworCisgIC8vIE9idGFpbnMgYSBidWZmZXIgaW50byB3aGljaCBkYXRhIGNhbiBiZSB3cml0dGVuLiAgQW55IGRhdGEgd3JpdHRlbgorICAvLyBpbnRvIHRoaXMgYnVmZmVyIHdpbGwgZXZlbnR1YWxseSAobWF5YmUgaW5zdGFudGx5LCBtYXliZSBsYXRlciBvbikKKyAgLy8gYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0LgorICAvLworICAvLyBQcmVjb25kaXRpb25zOgorICAvLyAqICJzaXplIiBhbmQgImRhdGEiIGFyZSBub3QgTlVMTC4KKyAgLy8KKyAgLy8gUG9zdGNvbmRpdGlvbnM6CisgIC8vICogSWYgdGhlIHJldHVybmVkIHZhbHVlIGlzIGZhbHNlLCBhbiBlcnJvciBvY2N1cnJlZC4gIEFsbCBlcnJvcnMgYXJlCisgIC8vICAgcGVybWFuZW50LgorICAvLyAqIE90aGVyd2lzZSwgInNpemUiIHBvaW50cyB0byB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyCisgIC8vICAgYW5kICJkYXRhIiBwb2ludHMgdG8gdGhlIGJ1ZmZlci4KKyAgLy8gKiBPd25lcnNoaXAgb2YgdGhpcyBidWZmZXIgcmVtYWlucyB3aXRoIHRoZSBzdHJlYW0sIGFuZCB0aGUgYnVmZmVyCisgIC8vICAgcmVtYWlucyB2YWxpZCBvbmx5IHVudGlsIHNvbWUgb3RoZXIgbWV0aG9kIG9mIHRoZSBzdHJlYW0gaXMgY2FsbGVkCisgIC8vICAgb3IgdGhlIHN0cmVhbSBpcyBkZXN0cm95ZWQuCisgIC8vICogQW55IGRhdGEgd2hpY2ggdGhlIGNhbGxlciBzdG9yZXMgaW4gdGhpcyBidWZmZXIgd2lsbCBldmVudHVhbGx5IGJlCisgIC8vICAgd3JpdHRlbiB0byB0aGUgb3V0cHV0ICh1bmxlc3MgQmFja1VwKCkgaXMgY2FsbGVkKS4KKyAgLy8gKiBJdCBpcyBsZWdhbCBmb3IgdGhlIHJldHVybmVkIGJ1ZmZlciB0byBoYXZlIHplcm8gc2l6ZSwgYXMgbG9uZworICAvLyAgIGFzIHJlcGVhdGVkbHkgY2FsbGluZyBOZXh0KCkgZXZlbnR1YWxseSB5aWVsZHMgYSBidWZmZXIgd2l0aCBub24temVybworICAvLyAgIHNpemUuCisgIHZpcnR1YWwgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpID0gMDsKKworICAvLyBCYWNrcyB1cCBhIG51bWJlciBvZiBieXRlcywgc28gdGhhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGJ1ZmZlciByZXR1cm5lZAorICAvLyBieSBOZXh0KCkgaXMgbm90IGFjdHVhbGx5IHdyaXR0ZW4uICBUaGlzIGlzIG5lZWRlZCB3aGVuIHlvdSBmaW5pc2gKKyAgLy8gd3JpdGluZyBhbGwgdGhlIGRhdGEgeW91IHdhbnQgdG8gd3JpdGUsIGJ1dCB0aGUgbGFzdCBidWZmZXIgd2FzIGJpZ2dlcgorICAvLyB0aGFuIHlvdSBuZWVkZWQuICBZb3UgZG9uJ3Qgd2FudCB0byB3cml0ZSBhIGJ1bmNoIG9mIGdhcmJhZ2UgYWZ0ZXIgdGhlCisgIC8vIGVuZCBvZiB5b3VyIGRhdGEsIHNvIHlvdSB1c2UgQmFja1VwKCkgdG8gYmFjayB1cC4KKyAgLy8KKyAgLy8gUHJlY29uZGl0aW9uczoKKyAgLy8gKiBUaGUgbGFzdCBtZXRob2QgY2FsbGVkIG11c3QgaGF2ZSBiZWVuIE5leHQoKS4KKyAgLy8gKiBjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBidWZmZXIKKyAgLy8gICByZXR1cm5lZCBieSBOZXh0KCkuCisgIC8vICogVGhlIGNhbGxlciBtdXN0IG5vdCBoYXZlIHdyaXR0ZW4gYW55dGhpbmcgdG8gdGhlIGxhc3QgImNvdW50IiBieXRlcworICAvLyAgIG9mIHRoYXQgYnVmZmVyLgorICAvLworICAvLyBQb3N0Y29uZGl0aW9uczoKKyAgLy8gKiBUaGUgbGFzdCAiY291bnQiIGJ5dGVzIG9mIHRoZSBsYXN0IGJ1ZmZlciByZXR1cm5lZCBieSBOZXh0KCkgd2lsbCBiZQorICAvLyAgIGlnbm9yZWQuCisgIHZpcnR1YWwgdm9pZCBCYWNrVXAoaW50IGNvdW50KSA9IDA7CisKKyAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc2luY2UgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQuCisgIHZpcnR1YWwgaW50NjQgQnl0ZUNvdW50KCkgY29uc3QgPSAwOworCisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoWmVyb0NvcHlPdXRwdXRTdHJlYW0pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzg0Yzc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjCkBAIC0wLDAgKzEsNDcwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworI2lmZGVmIF9XSU4zMgorLy8gV2luMzIgbHNlZWsgaXMgYnJva2VuOiAgSWYgaW52b2tlZCBvbiBhIG5vbi1zZWVrYWJsZSBmaWxlIGRlc2NyaXB0b3IsIGl0cworLy8gcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC4gIFdlIHJlLWRlZmluZSBpdCB0byBhbHdheXMgcHJvZHVjZSBhbiBlcnJvci4KKyNkZWZpbmUgbHNlZWsoZmQsIG9mZnNldCwgb3JpZ2luKSAoKG9mZl90KS0xKQorI2VuZGlmCisKK25hbWVzcGFjZSB7CisKKy8vIEVJTlRSIHN1Y2tzLgoraW50IGNsb3NlX25vX2VpbnRyKGludCBmZCkgeworICBpbnQgcmVzdWx0OworICBkbyB7CisgICAgcmVzdWx0ID0gY2xvc2UoZmQpOworICB9IHdoaWxlIChyZXN1bHQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGaWxlSW5wdXRTdHJlYW06OkZpbGVJbnB1dFN0cmVhbShpbnQgZmlsZV9kZXNjcmlwdG9yLCBpbnQgYmxvY2tfc2l6ZSkKKyAgOiBjb3B5aW5nX2lucHV0XyhmaWxlX2Rlc2NyaXB0b3IpLAorICAgIGltcGxfKCZjb3B5aW5nX2lucHV0XywgYmxvY2tfc2l6ZSkgeworfQorCitGaWxlSW5wdXRTdHJlYW06On5GaWxlSW5wdXRTdHJlYW0oKSB7fQorCitib29sIEZpbGVJbnB1dFN0cmVhbTo6Q2xvc2UoKSB7CisgIHJldHVybiBjb3B5aW5nX2lucHV0Xy5DbG9zZSgpOworfQorCitib29sIEZpbGVJbnB1dFN0cmVhbTo6TmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIHJldHVybiBpbXBsXy5OZXh0KGRhdGEsIHNpemUpOworfQorCit2b2lkIEZpbGVJbnB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgeworICBpbXBsXy5CYWNrVXAoY291bnQpOworfQorCitib29sIEZpbGVJbnB1dFN0cmVhbTo6U2tpcChpbnQgY291bnQpIHsKKyAgcmV0dXJuIGltcGxfLlNraXAoY291bnQpOworfQorCitpbnQ2NCBGaWxlSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLkJ5dGVDb3VudCgpOworfQorCitGaWxlSW5wdXRTdHJlYW06OkNvcHlpbmdGaWxlSW5wdXRTdHJlYW06OkNvcHlpbmdGaWxlSW5wdXRTdHJlYW0oCisgICAgaW50IGZpbGVfZGVzY3JpcHRvcikKKyAgOiBmaWxlXyhmaWxlX2Rlc2NyaXB0b3IpLAorICAgIGNsb3NlX29uX2RlbGV0ZV8oZmFsc2UpLAorICAgIGlzX2Nsb3NlZF8oZmFsc2UpLAorICAgIGVycm5vXygwKSwKKyAgICBwcmV2aW91c19zZWVrX2ZhaWxlZF8oZmFsc2UpIHsKK30KKworRmlsZUlucHV0U3RyZWFtOjpDb3B5aW5nRmlsZUlucHV0U3RyZWFtOjp+Q29weWluZ0ZpbGVJbnB1dFN0cmVhbSgpIHsKKyAgaWYgKGNsb3NlX29uX2RlbGV0ZV8pIHsKKyAgICBpZiAoIUNsb3NlKCkpIHsKKyAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJjbG9zZSgpIGZhaWxlZDogIiA8PCBzdHJlcnJvcihlcnJub18pOworICAgIH0KKyAgfQorfQorCitib29sIEZpbGVJbnB1dFN0cmVhbTo6Q29weWluZ0ZpbGVJbnB1dFN0cmVhbTo6Q2xvc2UoKSB7CisgIEdPT0dMRV9DSEVDSyghaXNfY2xvc2VkXyk7CisKKyAgaXNfY2xvc2VkXyA9IHRydWU7CisgIGlmIChjbG9zZV9ub19laW50cihmaWxlXykgIT0gMCkgeworICAgIC8vIFRoZSBkb2NzIG9uIGNsb3NlKCkgZG8gbm90IHNwZWNpZnkgd2hldGhlciBhIGZpbGUgZGVzY3JpcHRvciBpcyBzdGlsbAorICAgIC8vIG9wZW4gYWZ0ZXIgY2xvc2UoKSBmYWlscyB3aXRoIEVJTy4gIEhvd2V2ZXIsIHRoZSBnbGliYyBzb3VyY2UgY29kZQorICAgIC8vIHNlZW1zIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgbm90LgorICAgIGVycm5vXyA9IGVycm5vOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitpbnQgRmlsZUlucHV0U3RyZWFtOjpDb3B5aW5nRmlsZUlucHV0U3RyZWFtOjpSZWFkKHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpIHsKKyAgR09PR0xFX0NIRUNLKCFpc19jbG9zZWRfKTsKKworICBpbnQgcmVzdWx0OworICBkbyB7CisgICAgcmVzdWx0ID0gcmVhZChmaWxlXywgYnVmZmVyLCBzaXplKTsKKyAgfSB3aGlsZSAocmVzdWx0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAvLyBSZWFkIGVycm9yIChub3QgRU9GKS4KKyAgICBlcnJub18gPSBlcnJubzsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBGaWxlSW5wdXRTdHJlYW06OkNvcHlpbmdGaWxlSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIEdPT0dMRV9DSEVDSyghaXNfY2xvc2VkXyk7CisKKyAgaWYgKCFwcmV2aW91c19zZWVrX2ZhaWxlZF8gJiYKKyAgICAgIGxzZWVrKGZpbGVfLCBjb3VudCwgU0VFS19DVVIpICE9IChvZmZfdCktMSkgeworICAgIC8vIFNlZWsgc3VjY2VlZGVkLgorICAgIHJldHVybiBjb3VudDsKKyAgfSBlbHNlIHsKKyAgICAvLyBGYWlsZWQgdG8gc2Vlay4KKworICAgIC8vIE5vdGUgdG8gc2VsZjogIERvbid0IHNlZWsgYWdhaW4uICBUaGlzIGZpbGUgZGVzY3JpcHRvciBkb2Vzbid0CisgICAgLy8gc3VwcG9ydCBpdC4KKyAgICBwcmV2aW91c19zZWVrX2ZhaWxlZF8gPSB0cnVlOworCisgICAgLy8gVXNlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorICAgIHJldHVybiBDb3B5aW5nSW5wdXRTdHJlYW06OlNraXAoY291bnQpOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRmlsZU91dHB1dFN0cmVhbTo6RmlsZU91dHB1dFN0cmVhbShpbnQgZmlsZV9kZXNjcmlwdG9yLCBpbnQgYmxvY2tfc2l6ZSkKKyAgOiBjb3B5aW5nX291dHB1dF8oZmlsZV9kZXNjcmlwdG9yKSwKKyAgICBpbXBsXygmY29weWluZ19vdXRwdXRfLCBibG9ja19zaXplKSB7Cit9CisKK0ZpbGVPdXRwdXRTdHJlYW06On5GaWxlT3V0cHV0U3RyZWFtKCkgeworICBpbXBsXy5GbHVzaCgpOworfQorCitib29sIEZpbGVPdXRwdXRTdHJlYW06OkNsb3NlKCkgeworICBib29sIGZsdXNoX3N1Y2NlZWRlZCA9IGltcGxfLkZsdXNoKCk7CisgIHJldHVybiBjb3B5aW5nX291dHB1dF8uQ2xvc2UoKSAmJiBmbHVzaF9zdWNjZWVkZWQ7Cit9CisKK2Jvb2wgRmlsZU91dHB1dFN0cmVhbTo6Rmx1c2goKSB7CisgIHJldHVybiBpbXBsXy5GbHVzaCgpOworfQorCitib29sIEZpbGVPdXRwdXRTdHJlYW06Ok5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICByZXR1cm4gaW1wbF8uTmV4dChkYXRhLCBzaXplKTsKK30KKwordm9pZCBGaWxlT3V0cHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIGltcGxfLkJhY2tVcChjb3VudCk7Cit9CisKK2ludDY0IEZpbGVPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLkJ5dGVDb3VudCgpOworfQorCitGaWxlT3V0cHV0U3RyZWFtOjpDb3B5aW5nRmlsZU91dHB1dFN0cmVhbTo6Q29weWluZ0ZpbGVPdXRwdXRTdHJlYW0oCisgICAgaW50IGZpbGVfZGVzY3JpcHRvcikKKyAgOiBmaWxlXyhmaWxlX2Rlc2NyaXB0b3IpLAorICAgIGNsb3NlX29uX2RlbGV0ZV8oZmFsc2UpLAorICAgIGlzX2Nsb3NlZF8oZmFsc2UpLAorICAgIGVycm5vXygwKSB7Cit9CisKK0ZpbGVPdXRwdXRTdHJlYW06OkNvcHlpbmdGaWxlT3V0cHV0U3RyZWFtOjp+Q29weWluZ0ZpbGVPdXRwdXRTdHJlYW0oKSB7CisgIGlmIChjbG9zZV9vbl9kZWxldGVfKSB7CisgICAgaWYgKCFDbG9zZSgpKSB7CisgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiY2xvc2UoKSBmYWlsZWQ6ICIgPDwgc3RyZXJyb3IoZXJybm9fKTsKKyAgICB9CisgIH0KK30KKworYm9vbCBGaWxlT3V0cHV0U3RyZWFtOjpDb3B5aW5nRmlsZU91dHB1dFN0cmVhbTo6Q2xvc2UoKSB7CisgIEdPT0dMRV9DSEVDSyghaXNfY2xvc2VkXyk7CisKKyAgaXNfY2xvc2VkXyA9IHRydWU7CisgIGlmIChjbG9zZV9ub19laW50cihmaWxlXykgIT0gMCkgeworICAgIC8vIFRoZSBkb2NzIG9uIGNsb3NlKCkgZG8gbm90IHNwZWNpZnkgd2hldGhlciBhIGZpbGUgZGVzY3JpcHRvciBpcyBzdGlsbAorICAgIC8vIG9wZW4gYWZ0ZXIgY2xvc2UoKSBmYWlscyB3aXRoIEVJTy4gIEhvd2V2ZXIsIHRoZSBnbGliYyBzb3VyY2UgY29kZQorICAgIC8vIHNlZW1zIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgbm90LgorICAgIGVycm5vXyA9IGVycm5vOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIEZpbGVPdXRwdXRTdHJlYW06OkNvcHlpbmdGaWxlT3V0cHV0U3RyZWFtOjpXcml0ZSgKKyAgICBjb25zdCB2b2lkKiBidWZmZXIsIGludCBzaXplKSB7CisgIEdPT0dMRV9DSEVDSyghaXNfY2xvc2VkXyk7CisgIGludCB0b3RhbF93cml0dGVuID0gMDsKKworICBjb25zdCB1aW50OCogYnVmZmVyX2Jhc2UgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oYnVmZmVyKTsKKworICB3aGlsZSAodG90YWxfd3JpdHRlbiA8IHNpemUpIHsKKyAgICBpbnQgYnl0ZXM7CisgICAgZG8geworICAgICAgYnl0ZXMgPSB3cml0ZShmaWxlXywgYnVmZmVyX2Jhc2UgKyB0b3RhbF93cml0dGVuLCBzaXplIC0gdG90YWxfd3JpdHRlbik7CisgICAgfSB3aGlsZSAoYnl0ZXMgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICAgIGlmIChieXRlcyA8PSAwKSB7CisgICAgICAvLyBXcml0ZSBlcnJvci4KKworICAgICAgLy8gRklYTUUoa2VudG9uKTogIEFjY29yZGluZyB0byB0aGUgbWFuIHBhZ2UsIGlmIHdyaXRlKCkgcmV0dXJucyB6ZXJvLAorICAgICAgLy8gICB0aGVyZSB3YXMgbm8gZXJyb3I7IHdyaXRlKCkgc2ltcGx5IGRpZCBub3Qgd3JpdGUgYW55dGhpbmcuICBJdCdzCisgICAgICAvLyAgIHVuY2xlYXIgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoaXMgbWlnaHQgaGFwcGVuLCBidXQgcHJlc3VtYWJseQorICAgICAgLy8gICBlcnJubyB3b24ndCBiZSBzZXQgaW4gdGhpcyBjYXNlLiAgSSBhbSBjb25mdXNlZCBhcyB0byBob3cgc3VjaCBhbgorICAgICAgLy8gICBldmVudCBzaG91bGQgYmUgaGFuZGxlZC4gIEZvciBub3cgSSdtIHRyZWF0aW5nIGl0IGFzIGFuIGVycm9yLCBzaW5jZQorICAgICAgLy8gICByZXRyeWluZyBzZWVtcyBsaWtlIGl0IGNvdWxkIGxlYWQgdG8gYW4gaW5maW5pdGUgbG9vcC4gIEkgc3VzcGVjdAorICAgICAgLy8gICB0aGlzIG5ldmVyIGFjdHVhbGx5IGhhcHBlbnMgYW55d2F5LgorCisgICAgICBpZiAoYnl0ZXMgPCAwKSB7CisgICAgICAgIGVycm5vXyA9IGVycm5vOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB0b3RhbF93cml0dGVuICs9IGJ5dGVzOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSXN0cmVhbUlucHV0U3RyZWFtOjpJc3RyZWFtSW5wdXRTdHJlYW0oaXN0cmVhbSogaW5wdXQsIGludCBibG9ja19zaXplKQorICA6IGNvcHlpbmdfaW5wdXRfKGlucHV0KSwKKyAgICBpbXBsXygmY29weWluZ19pbnB1dF8sIGJsb2NrX3NpemUpIHsKK30KKworSXN0cmVhbUlucHV0U3RyZWFtOjp+SXN0cmVhbUlucHV0U3RyZWFtKCkge30KKworYm9vbCBJc3RyZWFtSW5wdXRTdHJlYW06Ok5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICByZXR1cm4gaW1wbF8uTmV4dChkYXRhLCBzaXplKTsKK30KKwordm9pZCBJc3RyZWFtSW5wdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKKyAgaW1wbF8uQmFja1VwKGNvdW50KTsKK30KKworYm9vbCBJc3RyZWFtSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIHJldHVybiBpbXBsXy5Ta2lwKGNvdW50KTsKK30KKworaW50NjQgSXN0cmVhbUlucHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy5CeXRlQ291bnQoKTsKK30KKworSXN0cmVhbUlucHV0U3RyZWFtOjpDb3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtOjpDb3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtKAorICAgIGlzdHJlYW0qIGlucHV0KQorICA6IGlucHV0XyhpbnB1dCkgeworfQorCitJc3RyZWFtSW5wdXRTdHJlYW06OkNvcHlpbmdJc3RyZWFtSW5wdXRTdHJlYW06On5Db3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtKCkge30KKworaW50IElzdHJlYW1JbnB1dFN0cmVhbTo6Q29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbTo6UmVhZCgKKyAgICB2b2lkKiBidWZmZXIsIGludCBzaXplKSB7CisgIGlucHV0Xy0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXIpLCBzaXplKTsKKyAgaW50IHJlc3VsdCA9IGlucHV0Xy0+Z2NvdW50KCk7CisgIGlmIChyZXN1bHQgPT0gMCAmJiBpbnB1dF8tPmZhaWwoKSAmJiAhaW5wdXRfLT5lb2YoKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK09zdHJlYW1PdXRwdXRTdHJlYW06Ok9zdHJlYW1PdXRwdXRTdHJlYW0ob3N0cmVhbSogb3V0cHV0LCBpbnQgYmxvY2tfc2l6ZSkKKyAgOiBjb3B5aW5nX291dHB1dF8ob3V0cHV0KSwKKyAgICBpbXBsXygmY29weWluZ19vdXRwdXRfLCBibG9ja19zaXplKSB7Cit9CisKK09zdHJlYW1PdXRwdXRTdHJlYW06On5Pc3RyZWFtT3V0cHV0U3RyZWFtKCkgeworICBpbXBsXy5GbHVzaCgpOworfQorCitib29sIE9zdHJlYW1PdXRwdXRTdHJlYW06Ok5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICByZXR1cm4gaW1wbF8uTmV4dChkYXRhLCBzaXplKTsKK30KKwordm9pZCBPc3RyZWFtT3V0cHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIGltcGxfLkJhY2tVcChjb3VudCk7Cit9CisKK2ludDY0IE9zdHJlYW1PdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLkJ5dGVDb3VudCgpOworfQorCitPc3RyZWFtT3V0cHV0U3RyZWFtOjpDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbTo6Q29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW0oCisgICAgb3N0cmVhbSogb3V0cHV0KQorICA6IG91dHB1dF8ob3V0cHV0KSB7Cit9CisKK09zdHJlYW1PdXRwdXRTdHJlYW06OkNvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtOjp+Q29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW0oKSB7Cit9CisKK2Jvb2wgT3N0cmVhbU91dHB1dFN0cmVhbTo6Q29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW06OldyaXRlKAorICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpIHsKKyAgb3V0cHV0Xy0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyKSwgc2l6ZSk7CisgIHJldHVybiBvdXRwdXRfLT5nb29kKCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtOjpDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0oCisgICAgWmVyb0NvcHlJbnB1dFN0cmVhbSogY29uc3Qgc3RyZWFtc1tdLCBpbnQgY291bnQpCisgIDogc3RyZWFtc18oc3RyZWFtcyksIHN0cmVhbV9jb3VudF8oY291bnQpLCBieXRlc19yZXRpcmVkXygwKSB7Cit9CisKK0NvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbTo6fkNvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbSgpIHsKK30KKworYm9vbCBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW06Ok5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICB3aGlsZSAoc3RyZWFtX2NvdW50XyA+IDApIHsKKyAgICBpZiAoc3RyZWFtc19bMF0tPk5leHQoZGF0YSwgc2l6ZSkpIHJldHVybiB0cnVlOworCisgICAgLy8gVGhhdCBzdHJlYW0gaXMgZG9uZS4gIEFkdmFuY2UgdG8gdGhlIG5leHQgb25lLgorICAgIGJ5dGVzX3JldGlyZWRfICs9IHN0cmVhbXNfWzBdLT5CeXRlQ291bnQoKTsKKyAgICArK3N0cmVhbXNfOworICAgIC0tc3RyZWFtX2NvdW50XzsKKyAgfQorCisgIC8vIE5vIG1vcmUgc3RyZWFtcy4KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgeworICBpZiAoc3RyZWFtX2NvdW50XyA+IDApIHsKKyAgICBzdHJlYW1zX1swXS0+QmFja1VwKGNvdW50KTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkNhbid0IEJhY2tVcCgpIGFmdGVyIGZhaWxlZCBOZXh0KCkuIjsKKyAgfQorfQorCitib29sIENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbTo6U2tpcChpbnQgY291bnQpIHsKKyAgd2hpbGUgKHN0cmVhbV9jb3VudF8gPiAwKSB7CisgICAgLy8gQXNzdW1lIHRoYXQgQnl0ZUNvdW50KCkgY2FuIGJlIHVzZWQgdG8gZmluZCBvdXQgaG93IG11Y2ggd2UgYWN0dWFsbHkKKyAgICAvLyBza2lwcGVkIHdoZW4gU2tpcCgpIGZhaWxzLgorICAgIGludDY0IHRhcmdldF9ieXRlX2NvdW50ID0gc3RyZWFtc19bMF0tPkJ5dGVDb3VudCgpICsgY291bnQ7CisgICAgaWYgKHN0cmVhbXNfWzBdLT5Ta2lwKGNvdW50KSkgcmV0dXJuIHRydWU7CisKKyAgICAvLyBIaXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiAgRmlndXJlIG91dCBob3cgbWFueSBtb3JlIGJ5dGVzIHdlIHN0aWxsIGhhdmUKKyAgICAvLyB0byBza2lwLgorICAgIGludDY0IGZpbmFsX2J5dGVfY291bnQgPSBzdHJlYW1zX1swXS0+Qnl0ZUNvdW50KCk7CisgICAgR09PR0xFX0RDSEVDS19MVChmaW5hbF9ieXRlX2NvdW50LCB0YXJnZXRfYnl0ZV9jb3VudCk7CisgICAgY291bnQgPSB0YXJnZXRfYnl0ZV9jb3VudCAtIGZpbmFsX2J5dGVfY291bnQ7CisKKyAgICAvLyBUaGF0IHN0cmVhbSBpcyBkb25lLiAgQWR2YW5jZSB0byB0aGUgbmV4dCBvbmUuCisgICAgYnl0ZXNfcmV0aXJlZF8gKz0gZmluYWxfYnl0ZV9jb3VudDsKKyAgICArK3N0cmVhbXNfOworICAgIC0tc3RyZWFtX2NvdW50XzsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworaW50NjQgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIGlmIChzdHJlYW1fY291bnRfID09IDApIHsKKyAgICByZXR1cm4gYnl0ZXNfcmV0aXJlZF87CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGJ5dGVzX3JldGlyZWRfICsgc3RyZWFtc19bMF0tPkJ5dGVDb3VudCgpOworICB9Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitMaW1pdGluZ0lucHV0U3RyZWFtOjpMaW1pdGluZ0lucHV0U3RyZWFtKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NCBsaW1pdCkKKyAgOiBpbnB1dF8oaW5wdXQpLCBsaW1pdF8obGltaXQpIHt9CisKK0xpbWl0aW5nSW5wdXRTdHJlYW06On5MaW1pdGluZ0lucHV0U3RyZWFtKCkgeworICAvLyBJZiB3ZSBvdmVyc2hvdCB0aGUgbGltaXQsIGJhY2sgdXAuCisgIGlmIChsaW1pdF8gPCAwKSBpbnB1dF8tPkJhY2tVcCgtbGltaXRfKTsKK30KKworYm9vbCBMaW1pdGluZ0lucHV0U3RyZWFtOjpOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgaWYgKGxpbWl0XyA8PSAwKSByZXR1cm4gZmFsc2U7CisgIGlmICghaW5wdXRfLT5OZXh0KGRhdGEsIHNpemUpKSByZXR1cm4gZmFsc2U7CisKKyAgbGltaXRfIC09ICpzaXplOworICBpZiAobGltaXRfIDwgMCkgeworICAgIC8vIFdlIG92ZXJzaG90IHRoZSBsaW1pdC4gIFJlZHVjZSAqc2l6ZSB0byBoaWRlIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuCisgICAgKnNpemUgKz0gbGltaXRfOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIExpbWl0aW5nSW5wdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKKyAgaWYgKGxpbWl0XyA8IDApIHsKKyAgICBpbnB1dF8tPkJhY2tVcChjb3VudCAtIGxpbWl0Xyk7CisgICAgbGltaXRfID0gY291bnQ7CisgIH0gZWxzZSB7CisgICAgaW5wdXRfLT5CYWNrVXAoY291bnQpOworICAgIGxpbWl0XyArPSBjb3VudDsKKyAgfQorfQorCitib29sIExpbWl0aW5nSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7CisgIGlmIChjb3VudCA+IGxpbWl0XykgeworICAgIGlmIChsaW1pdF8gPCAwKSByZXR1cm4gZmFsc2U7CisgICAgaW5wdXRfLT5Ta2lwKGxpbWl0Xyk7CisgICAgbGltaXRfID0gMDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgaWYgKCFpbnB1dF8tPlNraXAoY291bnQpKSByZXR1cm4gZmFsc2U7CisgICAgbGltaXRfIC09IGNvdW50OworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK2ludDY0IExpbWl0aW5nSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgaWYgKGxpbWl0XyA8IDApIHsKKyAgICByZXR1cm4gaW5wdXRfLT5CeXRlQ291bnQoKSArIGxpbWl0XzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gaW5wdXRfLT5CeXRlQ291bnQoKTsKKyAgfQorfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlZGIwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oCkBAIC0wLDAgKzEsMzU3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY29tbW9uIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgaW50ZXJmYWNlcyBkZWZpbmVkIGluCisvLyB6ZXJvX2NvcHlfc3RyZWFtLmggd2hpY2ggYXJlIG9ubHkgaW5jbHVkZWQgaW4gdGhlIGZ1bGwgKG5vbi1saXRlKQorLy8gcHJvdG9idWYgbGlicmFyeS4gIFRoZXNlIGltcGxlbWVudGF0aW9ucyBpbmNsdWRlIFVuaXggZmlsZSBkZXNjcmlwdG9ycworLy8gYW5kIEMrKyBpb3N0cmVhbXMuICBTZWUgYWxzbzogIHplcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmgKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9JTVBMX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9JTVBMX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBaZXJvQ29weUlucHV0U3RyZWFtIHdoaWNoIHJlYWRzIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IuCisvLworLy8gRmlsZUlucHV0U3RyZWFtIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIGFuIGlmc3RyZWFtIHdpdGggSXN0cmVhbUlucHV0U3RyZWFtLgorLy8gVGhlIGxhdHRlciB3aWxsIGludHJvZHVjZSBhbiBleHRyYSBsYXllciBvZiBidWZmZXJpbmcsIGhhcm1pbmcgcGVyZm9ybWFuY2UuCisvLyBBbHNvLCBpdCdzIGNvbmNlaXZhYmxlIHRoYXQgRmlsZUlucHV0U3RyZWFtIGNvdWxkIHNvbWVkYXkgYmUgZW5oYW5jZWQKKy8vIHRvIHVzZSB6ZXJvLWNvcHkgZmlsZSBkZXNjcmlwdG9ycyBvbiBPU3Mgd2hpY2ggc3VwcG9ydCB0aGVtLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEZpbGVJbnB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIHRoZSBnaXZlbiBVbml4IGZpbGUgZGVzY3JpcHRvci4KKyAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0CisgIC8vIHNob3VsZCBiZSByZWFkIGFuZCByZXR1cm5lZCB3aXRoIGVhY2ggY2FsbCB0byBOZXh0KCkuICBPdGhlcndpc2UsCisgIC8vIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCisgIGV4cGxpY2l0IEZpbGVJbnB1dFN0cmVhbShpbnQgZmlsZV9kZXNjcmlwdG9yLCBpbnQgYmxvY2tfc2l6ZSA9IC0xKTsKKyAgfkZpbGVJbnB1dFN0cmVhbSgpOworCisgIC8vIEZsdXNoZXMgYW55IGJ1ZmZlcnMgYW5kIGNsb3NlcyB0aGUgdW5kZXJseWluZyBmaWxlLiAgUmV0dXJucyBmYWxzZSBpZgorICAvLyBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBwcm9jZXNzOyB1c2UgR2V0RXJybm8oKSB0byBleGFtaW5lIHRoZSBlcnJvci4KKyAgLy8gRXZlbiBpZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkIHdoZW4gdGhpcyByZXR1cm5zLgorICBib29sIENsb3NlKCk7CisKKyAgLy8gQnkgZGVmYXVsdCwgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgY2xvc2VkIHdoZW4gdGhlIHN0cmVhbSBpcworICAvLyBkZXN0cm95ZWQuICBDYWxsIFNldENsb3NlT25EZWxldGUodHJ1ZSkgdG8gY2hhbmdlIHRoYXQuICBXQVJOSU5HOgorICAvLyBUaGlzIGxlYXZlcyBubyB3YXkgZm9yIHRoZSBjYWxsZXIgdG8gZGV0ZWN0IGlmIGNsb3NlKCkgZmFpbHMuICBJZgorICAvLyBkZXRlY3RpbmcgY2xvc2UoKSBlcnJvcnMgaXMgaW1wb3J0YW50IHRvIHlvdSwgeW91IHNob3VsZCBhcnJhbmdlCisgIC8vIHRvIGNsb3NlIHRoZSBkZXNjcmlwdG9yIHlvdXJzZWxmLgorICB2b2lkIFNldENsb3NlT25EZWxldGUoYm9vbCB2YWx1ZSkgeyBjb3B5aW5nX2lucHV0Xy5TZXRDbG9zZU9uRGVsZXRlKHZhbHVlKTsgfQorCisgIC8vIElmIGFuIEkvTyBlcnJvciBoYXMgb2NjdXJyZWQgb24gdGhpcyBmaWxlIGRlc2NyaXB0b3IsIHRoaXMgaXMgdGhlCisgIC8vIGVycm5vIGZyb20gdGhhdCBlcnJvci4gIE90aGVyd2lzZSwgdGhpcyBpcyB6ZXJvLiAgT25jZSBhbiBlcnJvcgorICAvLyBvY2N1cnMsIHRoZSBzdHJlYW0gaXMgYnJva2VuIGFuZCBhbGwgc3Vic2VxdWVudCBvcGVyYXRpb25zIHdpbGwKKyAgLy8gZmFpbC4KKyAgaW50IEdldEVycm5vKCkgeyByZXR1cm4gY29weWluZ19pbnB1dF8uR2V0RXJybm8oKTsgfQorCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgYm9vbCBTa2lwKGludCBjb3VudCk7CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIENvcHlpbmdGaWxlSW5wdXRTdHJlYW0gOiBwdWJsaWMgQ29weWluZ0lucHV0U3RyZWFtIHsKKyAgIHB1YmxpYzoKKyAgICBDb3B5aW5nRmlsZUlucHV0U3RyZWFtKGludCBmaWxlX2Rlc2NyaXB0b3IpOworICAgIH5Db3B5aW5nRmlsZUlucHV0U3RyZWFtKCk7CisKKyAgICBib29sIENsb3NlKCk7CisgICAgdm9pZCBTZXRDbG9zZU9uRGVsZXRlKGJvb2wgdmFsdWUpIHsgY2xvc2Vfb25fZGVsZXRlXyA9IHZhbHVlOyB9CisgICAgaW50IEdldEVycm5vKCkgeyByZXR1cm4gZXJybm9fOyB9CisKKyAgICAvLyBpbXBsZW1lbnRzIENvcHlpbmdJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBpbnQgUmVhZCh2b2lkKiBidWZmZXIsIGludCBzaXplKTsKKyAgICBpbnQgU2tpcChpbnQgY291bnQpOworCisgICBwcml2YXRlOgorICAgIC8vIFRoZSBmaWxlIGRlc2NyaXB0b3IuCisgICAgY29uc3QgaW50IGZpbGVfOworICAgIGJvb2wgY2xvc2Vfb25fZGVsZXRlXzsKKyAgICBib29sIGlzX2Nsb3NlZF87CisKKyAgICAvLyBUaGUgZXJybm8gb2YgdGhlIEkvTyBlcnJvciwgaWYgb25lIGhhcyBvY2N1cnJlZC4gIE90aGVyd2lzZSwgemVyby4KKyAgICBpbnQgZXJybm9fOworCisgICAgLy8gRGlkIHdlIHRyeSB0byBzZWVrIG9uY2UgYW5kIGZhaWw/ICBJZiBzbywgd2UgYXNzdW1lIHRoaXMgZmlsZSBkZXNjcmlwdG9yCisgICAgLy8gZG9lc24ndCBzdXBwb3J0IHNlZWtpbmcgYW5kIHdvbid0IHRyeSBhZ2Fpbi4KKyAgICBib29sIHByZXZpb3VzX3NlZWtfZmFpbGVkXzsKKworICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb3B5aW5nRmlsZUlucHV0U3RyZWFtKTsKKyAgfTsKKworICBDb3B5aW5nRmlsZUlucHV0U3RyZWFtIGNvcHlpbmdfaW5wdXRfOworICBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yIGltcGxfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWxlSW5wdXRTdHJlYW0pOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIFplcm9Db3B5T3V0cHV0U3RyZWFtIHdoaWNoIHdyaXRlcyB0byBhIGZpbGUgZGVzY3JpcHRvci4KKy8vCisvLyBGaWxlT3V0cHV0U3RyZWFtIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIGFuIG9mc3RyZWFtIHdpdGgKKy8vIE9zdHJlYW1PdXRwdXRTdHJlYW0uICBUaGUgbGF0dGVyIHdpbGwgaW50cm9kdWNlIGFuIGV4dHJhIGxheWVyIG9mIGJ1ZmZlcmluZywKKy8vIGhhcm1pbmcgcGVyZm9ybWFuY2UuICBBbHNvLCBpdCdzIGNvbmNlaXZhYmxlIHRoYXQgRmlsZU91dHB1dFN0cmVhbSBjb3VsZAorLy8gc29tZWRheSBiZSBlbmhhbmNlZCB0byB1c2UgemVyby1jb3B5IGZpbGUgZGVzY3JpcHRvcnMgb24gT1NzIHdoaWNoCisvLyBzdXBwb3J0IHRoZW0uCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmlsZU91dHB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgc3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSBnaXZlbiBVbml4IGZpbGUgZGVzY3JpcHRvci4KKyAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcnMKKyAgLy8gdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgYnkgTmV4dCgpLiAgT3RoZXJ3aXNlLCBhIHJlYXNvbmFibGUgZGVmYXVsdAorICAvLyBpcyB1c2VkLgorICBleHBsaWNpdCBGaWxlT3V0cHV0U3RyZWFtKGludCBmaWxlX2Rlc2NyaXB0b3IsIGludCBibG9ja19zaXplID0gLTEpOworICB+RmlsZU91dHB1dFN0cmVhbSgpOworCisgIC8vIEZsdXNoZXMgYW55IGJ1ZmZlcnMgYW5kIGNsb3NlcyB0aGUgdW5kZXJseWluZyBmaWxlLiAgUmV0dXJucyBmYWxzZSBpZgorICAvLyBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBwcm9jZXNzOyB1c2UgR2V0RXJybm8oKSB0byBleGFtaW5lIHRoZSBlcnJvci4KKyAgLy8gRXZlbiBpZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkIHdoZW4gdGhpcyByZXR1cm5zLgorICBib29sIENsb3NlKCk7CisKKyAgLy8gRmx1c2hlcyBGaWxlT3V0cHV0U3RyZWFtJ3MgYnVmZmVycyBidXQgZG9lcyBub3QgY2xvc2UgdGhlCisgIC8vIHVuZGVybHlpbmcgZmlsZS4gTm8gc3BlY2lhbCBtZWFzdXJlcyBhcmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQKKyAgLy8gdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtIGZpbGUgb2JqZWN0IGlzIHN5bmNocm9uaXplZCB0byBkaXNrLgorICBib29sIEZsdXNoKCk7CisKKyAgLy8gQnkgZGVmYXVsdCwgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgY2xvc2VkIHdoZW4gdGhlIHN0cmVhbSBpcworICAvLyBkZXN0cm95ZWQuICBDYWxsIFNldENsb3NlT25EZWxldGUodHJ1ZSkgdG8gY2hhbmdlIHRoYXQuICBXQVJOSU5HOgorICAvLyBUaGlzIGxlYXZlcyBubyB3YXkgZm9yIHRoZSBjYWxsZXIgdG8gZGV0ZWN0IGlmIGNsb3NlKCkgZmFpbHMuICBJZgorICAvLyBkZXRlY3RpbmcgY2xvc2UoKSBlcnJvcnMgaXMgaW1wb3J0YW50IHRvIHlvdSwgeW91IHNob3VsZCBhcnJhbmdlCisgIC8vIHRvIGNsb3NlIHRoZSBkZXNjcmlwdG9yIHlvdXJzZWxmLgorICB2b2lkIFNldENsb3NlT25EZWxldGUoYm9vbCB2YWx1ZSkgeyBjb3B5aW5nX291dHB1dF8uU2V0Q2xvc2VPbkRlbGV0ZSh2YWx1ZSk7IH0KKworICAvLyBJZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkIG9uIHRoaXMgZmlsZSBkZXNjcmlwdG9yLCB0aGlzIGlzIHRoZQorICAvLyBlcnJubyBmcm9tIHRoYXQgZXJyb3IuICBPdGhlcndpc2UsIHRoaXMgaXMgemVyby4gIE9uY2UgYW4gZXJyb3IKKyAgLy8gb2NjdXJzLCB0aGUgc3RyZWFtIGlzIGJyb2tlbiBhbmQgYWxsIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyB3aWxsCisgIC8vIGZhaWwuCisgIGludCBHZXRFcnJubygpIHsgcmV0dXJuIGNvcHlpbmdfb3V0cHV0Xy5HZXRFcnJubygpOyB9CisKKyAgLy8gaW1wbGVtZW50cyBaZXJvQ29weU91dHB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOworICB2b2lkIEJhY2tVcChpbnQgY291bnQpOworICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb3B5aW5nRmlsZU91dHB1dFN0cmVhbSA6IHB1YmxpYyBDb3B5aW5nT3V0cHV0U3RyZWFtIHsKKyAgIHB1YmxpYzoKKyAgICBDb3B5aW5nRmlsZU91dHB1dFN0cmVhbShpbnQgZmlsZV9kZXNjcmlwdG9yKTsKKyAgICB+Q29weWluZ0ZpbGVPdXRwdXRTdHJlYW0oKTsKKworICAgIGJvb2wgQ2xvc2UoKTsKKyAgICB2b2lkIFNldENsb3NlT25EZWxldGUoYm9vbCB2YWx1ZSkgeyBjbG9zZV9vbl9kZWxldGVfID0gdmFsdWU7IH0KKyAgICBpbnQgR2V0RXJybm8oKSB7IHJldHVybiBlcnJub187IH0KKworICAgIC8vIGltcGxlbWVudHMgQ29weWluZ091dHB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGJvb2wgV3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBpbnQgc2l6ZSk7CisKKyAgIHByaXZhdGU6CisgICAgLy8gVGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICBjb25zdCBpbnQgZmlsZV87CisgICAgYm9vbCBjbG9zZV9vbl9kZWxldGVfOworICAgIGJvb2wgaXNfY2xvc2VkXzsKKworICAgIC8vIFRoZSBlcnJubyBvZiB0aGUgSS9PIGVycm9yLCBpZiBvbmUgaGFzIG9jY3VycmVkLiAgT3RoZXJ3aXNlLCB6ZXJvLgorICAgIGludCBlcnJub187CisKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29weWluZ0ZpbGVPdXRwdXRTdHJlYW0pOworICB9OworCisgIENvcHlpbmdGaWxlT3V0cHV0U3RyZWFtIGNvcHlpbmdfb3V0cHV0XzsKKyAgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IgaW1wbF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVPdXRwdXRTdHJlYW0pOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIFplcm9Db3B5SW5wdXRTdHJlYW0gd2hpY2ggcmVhZHMgZnJvbSBhIEMrKyBpc3RyZWFtLgorLy8KKy8vIE5vdGUgdGhhdCBmb3IgcmVhZGluZyBmaWxlcyAob3IgYW55dGhpbmcgcmVwcmVzZW50ZWQgYnkgYSBmaWxlIGRlc2NyaXB0b3IpLAorLy8gRmlsZUlucHV0U3RyZWFtIGlzIG1vcmUgZWZmaWNpZW50LgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIElzdHJlYW1JbnB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIHRoZSBnaXZlbiBDKysgaXN0cmVhbS4KKyAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0CisgIC8vIHNob3VsZCBiZSByZWFkIGFuZCByZXR1cm5lZCB3aXRoIGVhY2ggY2FsbCB0byBOZXh0KCkuICBPdGhlcndpc2UsCisgIC8vIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCisgIGV4cGxpY2l0IElzdHJlYW1JbnB1dFN0cmVhbShpc3RyZWFtKiBzdHJlYW0sIGludCBibG9ja19zaXplID0gLTEpOworICB+SXN0cmVhbUlucHV0U3RyZWFtKCk7CisKKyAgLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOworICB2b2lkIEJhY2tVcChpbnQgY291bnQpOworICBib29sIFNraXAoaW50IGNvdW50KTsKKyAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQ29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbSA6IHB1YmxpYyBDb3B5aW5nSW5wdXRTdHJlYW0geworICAgcHVibGljOgorICAgIENvcHlpbmdJc3RyZWFtSW5wdXRTdHJlYW0oaXN0cmVhbSogaW5wdXQpOworICAgIH5Db3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtKCk7CisKKyAgICAvLyBpbXBsZW1lbnRzIENvcHlpbmdJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBpbnQgUmVhZCh2b2lkKiBidWZmZXIsIGludCBzaXplKTsKKyAgICAvLyAoV2UgdXNlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFNraXAoKS4pCisKKyAgIHByaXZhdGU6CisgICAgLy8gVGhlIHN0cmVhbS4KKyAgICBpc3RyZWFtKiBpbnB1dF87CisKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbSk7CisgIH07CisKKyAgQ29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbSBjb3B5aW5nX2lucHV0XzsKKyAgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvciBpbXBsXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXN0cmVhbUlucHV0U3RyZWFtKTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBaZXJvQ29weU91dHB1dFN0cmVhbSB3aGljaCB3cml0ZXMgdG8gYSBDKysgb3N0cmVhbS4KKy8vCisvLyBOb3RlIHRoYXQgZm9yIHdyaXRpbmcgZmlsZXMgKG9yIGFueXRoaW5nIHJlcHJlc2VudGVkIGJ5IGEgZmlsZSBkZXNjcmlwdG9yKSwKKy8vIEZpbGVPdXRwdXRTdHJlYW0gaXMgbW9yZSBlZmZpY2llbnQuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgT3N0cmVhbU91dHB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgc3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSBnaXZlbiBDKysgb3N0cmVhbS4KKyAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcnMKKyAgLy8gdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgYnkgTmV4dCgpLiAgT3RoZXJ3aXNlLCBhIHJlYXNvbmFibGUgZGVmYXVsdAorICAvLyBpcyB1c2VkLgorICBleHBsaWNpdCBPc3RyZWFtT3V0cHV0U3RyZWFtKG9zdHJlYW0qIHN0cmVhbSwgaW50IGJsb2NrX3NpemUgPSAtMSk7CisgIH5Pc3RyZWFtT3V0cHV0U3RyZWFtKCk7CisKKyAgLy8gaW1wbGVtZW50cyBaZXJvQ29weU91dHB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOworICB2b2lkIEJhY2tVcChpbnQgY291bnQpOworICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKKworIHByaXZhdGU6CisgIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbSA6IHB1YmxpYyBDb3B5aW5nT3V0cHV0U3RyZWFtIHsKKyAgIHB1YmxpYzoKKyAgICBDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbShvc3RyZWFtKiBvdXRwdXQpOworICAgIH5Db3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbSgpOworCisgICAgLy8gaW1wbGVtZW50cyBDb3B5aW5nT3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgYm9vbCBXcml0ZShjb25zdCB2b2lkKiBidWZmZXIsIGludCBzaXplKTsKKworICAgcHJpdmF0ZToKKyAgICAvLyBUaGUgc3RyZWFtLgorICAgIG9zdHJlYW0qIG91dHB1dF87CisKKyAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW0pOworICB9OworCisgIENvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtIGNvcHlpbmdfb3V0cHV0XzsKKyAgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IgaW1wbF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE9zdHJlYW1PdXRwdXRTdHJlYW0pOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIFplcm9Db3B5SW5wdXRTdHJlYW0gd2hpY2ggcmVhZHMgZnJvbSBzZXZlcmFsIG90aGVyIHN0cmVhbXMgaW4gc2VxdWVuY2UuCisvLyBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gaXMgdW5hYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZW5kLW9mLXN0cmVhbQorLy8gYW5kIHJlYWQgZXJyb3JzIGluIHRoZSB1bmRlcmx5aW5nIHN0cmVhbXMsIHNvIGl0IGFzc3VtZXMgYW55IGVycm9ycyBtZWFuCisvLyBlbmQtb2Ytc3RyZWFtLiAgU28sIGlmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbXMgZmFpbCBmb3IgYW55IG90aGVyIHJlYXNvbiwKKy8vIENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbSBtYXkgZG8gb2RkIHRoaW5ncy4gIEl0IGlzIHN1Z2dlc3RlZCB0aGF0IHlvdSBkbworLy8gbm90IHVzZSBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gb24gc3RyZWFtcyB0aGF0IG1pZ2h0IHByb2R1Y2UgcmVhZCBlcnJvcnMKKy8vIG90aGVyIHRoYW4gZW5kLW9mLXN0cmVhbS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBBbGwgc3RyZWFtcyBwYXNzZWQgaW4gYXMgd2VsbCBhcyB0aGUgYXJyYXkgaXRzZWxmIG11c3QgcmVtYWluIHZhbGlkCisgIC8vIHVudGlsIHRoZSBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gaXMgZGVzdHJveWVkLgorICBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0oWmVyb0NvcHlJbnB1dFN0cmVhbSogY29uc3Qgc3RyZWFtc1tdLCBpbnQgY291bnQpOworICB+Q29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtKCk7CisKKyAgLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOworICB2b2lkIEJhY2tVcChpbnQgY291bnQpOworICBib29sIFNraXAoaW50IGNvdW50KTsKKyAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7CisKKworIHByaXZhdGU6CisgIC8vIEFzIHN0cmVhbXMgYXJlIHJldGlyZWQsIHN0cmVhbXNfIGlzIGluY3JlbWVudGVkIGFuZCBjb3VudF8gaXMKKyAgLy8gZGVjcmVtZW50ZWQuCisgIFplcm9Db3B5SW5wdXRTdHJlYW0qIGNvbnN0KiBzdHJlYW1zXzsKKyAgaW50IHN0cmVhbV9jb3VudF87CisgIGludDY0IGJ5dGVzX3JldGlyZWRfOyAgLy8gQnl0ZXMgcmVhZCBmcm9tIHByZXZpb3VzIHN0cmVhbXMuCisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbSk7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEEgWmVyb0NvcHlJbnB1dFN0cmVhbSB3aGljaCB3cmFwcyBzb21lIG90aGVyIHN0cmVhbSBhbmQgbGltaXRzIGl0IHRvCisvLyBhIHBhcnRpY3VsYXIgYnl0ZSBjb3VudC4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBMaW1pdGluZ0lucHV0U3RyZWFtIDogcHVibGljIFplcm9Db3B5SW5wdXRTdHJlYW0geworIHB1YmxpYzoKKyAgTGltaXRpbmdJbnB1dFN0cmVhbShaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgaW50NjQgbGltaXQpOworICB+TGltaXRpbmdJbnB1dFN0cmVhbSgpOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgYm9vbCBTa2lwKGludCBjb3VudCk7CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OworCisKKyBwcml2YXRlOgorICBaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dF87CisgIGludDY0IGxpbWl0XzsgIC8vIERlY3JlYXNlcyBhcyB3ZSBnbywgYmVjb21lcyBuZWdhdGl2ZSBpZiB3ZSBvdmVyc2hvb3QuCisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExpbWl0aW5nSW5wdXRTdHJlYW0pOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit9ICAvLyBuYW1lc3BhY2UgaW8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0lNUExfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDEyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5jYwpAQCAtMCwwICsxLDM5MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKKworbmFtZXNwYWNlIHsKKworLy8gRGVmYXVsdCBibG9jayBzaXplIGZvciBDb3B5aW5ne0luLE91dH1wdXRTdHJlYW1BZGFwdG9yLgorc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdEJsb2NrU2l6ZSA9IDgxOTI7CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FycmF5SW5wdXRTdHJlYW06OkFycmF5SW5wdXRTdHJlYW0oY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19zaXplKQorICA6IGRhdGFfKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhKSksCisgICAgc2l6ZV8oc2l6ZSksCisgICAgYmxvY2tfc2l6ZV8oYmxvY2tfc2l6ZSA+IDAgPyBibG9ja19zaXplIDogc2l6ZSksCisgICAgcG9zaXRpb25fKDApLAorICAgIGxhc3RfcmV0dXJuZWRfc2l6ZV8oMCkgeworfQorCitBcnJheUlucHV0U3RyZWFtOjp+QXJyYXlJbnB1dFN0cmVhbSgpIHsKK30KKworYm9vbCBBcnJheUlucHV0U3RyZWFtOjpOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgaWYgKHBvc2l0aW9uXyA8IHNpemVfKSB7CisgICAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IG1pbihibG9ja19zaXplXywgc2l6ZV8gLSBwb3NpdGlvbl8pOworICAgICpkYXRhID0gZGF0YV8gKyBwb3NpdGlvbl87CisgICAgKnNpemUgPSBsYXN0X3JldHVybmVkX3NpemVfOworICAgIHBvc2l0aW9uXyArPSBsYXN0X3JldHVybmVkX3NpemVfOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIC8vIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICAgIGxhc3RfcmV0dXJuZWRfc2l6ZV8gPSAwOyAgIC8vIERvbid0IGxldCBjYWxsZXIgYmFjayB1cC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKwordm9pZCBBcnJheUlucHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7CisgIEdPT0dMRV9DSEVDS19HVChsYXN0X3JldHVybmVkX3NpemVfLCAwKQorICAgICAgPDwgIkJhY2tVcCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgTmV4dCgpLiI7CisgIEdPT0dMRV9DSEVDS19MRShjb3VudCwgbGFzdF9yZXR1cm5lZF9zaXplXyk7CisgIEdPT0dMRV9DSEVDS19HRShjb3VudCwgMCk7CisgIHBvc2l0aW9uXyAtPSBjb3VudDsKKyAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IDA7ICAvLyBEb24ndCBsZXQgY2FsbGVyIGJhY2sgdXAgZnVydGhlci4KK30KKworYm9vbCBBcnJheUlucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgeworICBHT09HTEVfQ0hFQ0tfR0UoY291bnQsIDApOworICBsYXN0X3JldHVybmVkX3NpemVfID0gMDsgICAvLyBEb24ndCBsZXQgY2FsbGVyIGJhY2sgdXAuCisgIGlmIChjb3VudCA+IHNpemVfIC0gcG9zaXRpb25fKSB7CisgICAgcG9zaXRpb25fID0gc2l6ZV87CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIHBvc2l0aW9uXyArPSBjb3VudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitpbnQ2NCBBcnJheUlucHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBwb3NpdGlvbl87Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBcnJheU91dHB1dFN0cmVhbTo6QXJyYXlPdXRwdXRTdHJlYW0odm9pZCogZGF0YSwgaW50IHNpemUsIGludCBibG9ja19zaXplKQorICA6IGRhdGFfKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihkYXRhKSksCisgICAgc2l6ZV8oc2l6ZSksCisgICAgYmxvY2tfc2l6ZV8oYmxvY2tfc2l6ZSA+IDAgPyBibG9ja19zaXplIDogc2l6ZSksCisgICAgcG9zaXRpb25fKDApLAorICAgIGxhc3RfcmV0dXJuZWRfc2l6ZV8oMCkgeworfQorCitBcnJheU91dHB1dFN0cmVhbTo6fkFycmF5T3V0cHV0U3RyZWFtKCkgeworfQorCitib29sIEFycmF5T3V0cHV0U3RyZWFtOjpOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgaWYgKHBvc2l0aW9uXyA8IHNpemVfKSB7CisgICAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IG1pbihibG9ja19zaXplXywgc2l6ZV8gLSBwb3NpdGlvbl8pOworICAgICpkYXRhID0gZGF0YV8gKyBwb3NpdGlvbl87CisgICAgKnNpemUgPSBsYXN0X3JldHVybmVkX3NpemVfOworICAgIHBvc2l0aW9uXyArPSBsYXN0X3JldHVybmVkX3NpemVfOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIC8vIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgorICAgIGxhc3RfcmV0dXJuZWRfc2l6ZV8gPSAwOyAgIC8vIERvbid0IGxldCBjYWxsZXIgYmFjayB1cC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKwordm9pZCBBcnJheU91dHB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgeworICBHT09HTEVfQ0hFQ0tfR1QobGFzdF9yZXR1cm5lZF9zaXplXywgMCkKKyAgICAgIDw8ICJCYWNrVXAoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIE5leHQoKS4iOworICBHT09HTEVfQ0hFQ0tfTEUoY291bnQsIGxhc3RfcmV0dXJuZWRfc2l6ZV8pOworICBHT09HTEVfQ0hFQ0tfR0UoY291bnQsIDApOworICBwb3NpdGlvbl8gLT0gY291bnQ7CisgIGxhc3RfcmV0dXJuZWRfc2l6ZV8gPSAwOyAgLy8gRG9uJ3QgbGV0IGNhbGxlciBiYWNrIHVwIGZ1cnRoZXIuCit9CisKK2ludDY0IEFycmF5T3V0cHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBwb3NpdGlvbl87Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU3RyaW5nT3V0cHV0U3RyZWFtOjpTdHJpbmdPdXRwdXRTdHJlYW0oc3RyaW5nKiB0YXJnZXQpCisgIDogdGFyZ2V0Xyh0YXJnZXQpIHsKK30KKworU3RyaW5nT3V0cHV0U3RyZWFtOjp+U3RyaW5nT3V0cHV0U3RyZWFtKCkgeworfQorCitib29sIFN0cmluZ091dHB1dFN0cmVhbTo6TmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIGludCBvbGRfc2l6ZSA9IHRhcmdldF8tPnNpemUoKTsKKworICAvLyBHcm93IHRoZSBzdHJpbmcuCisgIGlmIChvbGRfc2l6ZSA8IHRhcmdldF8tPmNhcGFjaXR5KCkpIHsKKyAgICAvLyBSZXNpemUgdGhlIHN0cmluZyB0byBtYXRjaCBpdHMgY2FwYWNpdHksIHNpbmNlIHdlIGNhbiBnZXQgYXdheQorICAgIC8vIHdpdGhvdXQgYSBtZW1vcnkgYWxsb2NhdGlvbiB0aGlzIHdheS4KKyAgICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKHRhcmdldF8sIHRhcmdldF8tPmNhcGFjaXR5KCkpOworICB9IGVsc2UgeworICAgIC8vIFNpemUgaGFzIHJlYWNoZWQgY2FwYWNpdHksIHNvIGRvdWJsZSB0aGUgc2l6ZS4gIEFsc28gbWFrZSBzdXJlCisgICAgLy8gdGhhdCB0aGUgbmV3IHNpemUgaXMgYXQgbGVhc3Qga01pbmltdW1TaXplLgorICAgIFNUTFN0cmluZ1Jlc2l6ZVVuaW5pdGlhbGl6ZWQoCisgICAgICB0YXJnZXRfLAorICAgICAgbWF4KG9sZF9zaXplICogMiwKKyAgICAgICAgICBrTWluaW11bVNpemUgKyAwKSk7ICAvLyAiKyAwIiB3b3JrcyBhcm91bmQgR0NDNCB3ZWlyZG5lc3MuCisgIH0KKworICAqZGF0YSA9IHN0cmluZ19hc19hcnJheSh0YXJnZXRfKSArIG9sZF9zaXplOworICAqc2l6ZSA9IHRhcmdldF8tPnNpemUoKSAtIG9sZF9zaXplOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTdHJpbmdPdXRwdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKKyAgR09PR0xFX0NIRUNLX0dFKGNvdW50LCAwKTsKKyAgR09PR0xFX0NIRUNLX0xFKGNvdW50LCB0YXJnZXRfLT5zaXplKCkpOworICB0YXJnZXRfLT5yZXNpemUodGFyZ2V0Xy0+c2l6ZSgpIC0gY291bnQpOworfQorCitpbnQ2NCBTdHJpbmdPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRhcmdldF8tPnNpemUoKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb3B5aW5nSW5wdXRTdHJlYW06On5Db3B5aW5nSW5wdXRTdHJlYW0oKSB7fQorCitpbnQgQ29weWluZ0lucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgeworICBjaGFyIGp1bmtbNDA5Nl07CisgIGludCBza2lwcGVkID0gMDsKKyAgd2hpbGUgKHNraXBwZWQgPCBjb3VudCkgeworICAgIGludCBieXRlcyA9IFJlYWQoanVuaywgbWluKGNvdW50IC0gc2tpcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4oc2l6ZW9mKGp1bmspKSkpOworICAgIGlmIChieXRlcyA8PSAwKSB7CisgICAgICAvLyBFT0Ygb3IgcmVhZCBlcnJvci4KKyAgICAgIHJldHVybiBza2lwcGVkOworICAgIH0KKyAgICBza2lwcGVkICs9IGJ5dGVzOworICB9CisgIHJldHVybiBza2lwcGVkOworfQorCitDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yOjpDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yKAorICAgIENvcHlpbmdJbnB1dFN0cmVhbSogY29weWluZ19zdHJlYW0sIGludCBibG9ja19zaXplKQorICA6IGNvcHlpbmdfc3RyZWFtXyhjb3B5aW5nX3N0cmVhbSksCisgICAgb3duc19jb3B5aW5nX3N0cmVhbV8oZmFsc2UpLAorICAgIGZhaWxlZF8oZmFsc2UpLAorICAgIHBvc2l0aW9uXygwKSwKKyAgICBidWZmZXJfc2l6ZV8oYmxvY2tfc2l6ZSA+IDAgPyBibG9ja19zaXplIDoga0RlZmF1bHRCbG9ja1NpemUpLAorICAgIGJ1ZmZlcl91c2VkXygwKSwKKyAgICBiYWNrdXBfYnl0ZXNfKDApIHsKK30KKworQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcjo6fkNvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IoKSB7CisgIGlmIChvd25zX2NvcHlpbmdfc3RyZWFtXykgeworICAgIGRlbGV0ZSBjb3B5aW5nX3N0cmVhbV87CisgIH0KK30KKworYm9vbCBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yOjpOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKKyAgaWYgKGZhaWxlZF8pIHsKKyAgICAvLyBBbHJlYWR5IGZhaWxlZCBvbiBhIHByZXZpb3VzIHJlYWQuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQWxsb2NhdGVCdWZmZXJJZk5lZWRlZCgpOworCisgIGlmIChiYWNrdXBfYnl0ZXNfID4gMCkgeworICAgIC8vIFdlIGhhdmUgZGF0YSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIEJhY2tVcCgpLCBzbyBqdXN0IHJldHVybiB0aGF0LgorICAgICpkYXRhID0gYnVmZmVyXy5nZXQoKSArIGJ1ZmZlcl91c2VkXyAtIGJhY2t1cF9ieXRlc187CisgICAgKnNpemUgPSBiYWNrdXBfYnl0ZXNfOworICAgIGJhY2t1cF9ieXRlc18gPSAwOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gUmVhZCBuZXcgZGF0YSBpbnRvIHRoZSBidWZmZXIuCisgIGJ1ZmZlcl91c2VkXyA9IGNvcHlpbmdfc3RyZWFtXy0+UmVhZChidWZmZXJfLmdldCgpLCBidWZmZXJfc2l6ZV8pOworICBpZiAoYnVmZmVyX3VzZWRfIDw9IDApIHsKKyAgICAvLyBFT0Ygb3IgcmVhZCBlcnJvci4gIFdlIGRvbid0IG5lZWQgdGhlIGJ1ZmZlciBhbnltb3JlLgorICAgIGlmIChidWZmZXJfdXNlZF8gPCAwKSB7CisgICAgICAvLyBSZWFkIGVycm9yIChub3QgRU9GKS4KKyAgICAgIGZhaWxlZF8gPSB0cnVlOworICAgIH0KKyAgICBGcmVlQnVmZmVyKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHBvc2l0aW9uXyArPSBidWZmZXJfdXNlZF87CisKKyAgKnNpemUgPSBidWZmZXJfdXNlZF87CisgICpkYXRhID0gYnVmZmVyXy5nZXQoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcjo6QmFja1VwKGludCBjb3VudCkgeworICBHT09HTEVfQ0hFQ0soYmFja3VwX2J5dGVzXyA9PSAwICYmIGJ1ZmZlcl8uZ2V0KCkgIT0gTlVMTCkKKyAgICA8PCAiIEJhY2tVcCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBOZXh0KCkuIjsKKyAgR09PR0xFX0NIRUNLX0xFKGNvdW50LCBidWZmZXJfdXNlZF8pCisgICAgPDwgIiBDYW4ndCBiYWNrIHVwIG92ZXIgbW9yZSBieXRlcyB0aGFuIHdlcmUgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2FsbCIKKyAgICAgICAiIHRvIE5leHQoKS4iOworICBHT09HTEVfQ0hFQ0tfR0UoY291bnQsIDApCisgICAgPDwgIiBQYXJhbWV0ZXIgdG8gQmFja1VwKCkgY2FuJ3QgYmUgbmVnYXRpdmUuIjsKKworICBiYWNrdXBfYnl0ZXNfID0gY291bnQ7Cit9CisKK2Jvb2wgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcjo6U2tpcChpbnQgY291bnQpIHsKKyAgR09PR0xFX0NIRUNLX0dFKGNvdW50LCAwKTsKKworICBpZiAoZmFpbGVkXykgeworICAgIC8vIEFscmVhZHkgZmFpbGVkIG9uIGEgcHJldmlvdXMgcmVhZC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBGaXJzdCBza2lwIGFueSBieXRlcyBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIEJhY2tVcCgpLgorICBpZiAoYmFja3VwX2J5dGVzXyA+PSBjb3VudCkgeworICAgIC8vIFdlIGhhdmUgbW9yZSBkYXRhIGxlZnQgb3ZlciB0aGFuIHdlJ3JlIHRyeWluZyB0byBza2lwLiAgSnVzdCBjaG9wIGl0LgorICAgIGJhY2t1cF9ieXRlc18gLT0gY291bnQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb3VudCAtPSBiYWNrdXBfYnl0ZXNfOworICBiYWNrdXBfYnl0ZXNfID0gMDsKKworICBpbnQgc2tpcHBlZCA9IGNvcHlpbmdfc3RyZWFtXy0+U2tpcChjb3VudCk7CisgIHBvc2l0aW9uXyArPSBza2lwcGVkOworICByZXR1cm4gc2tpcHBlZCA9PSBjb3VudDsKK30KKworaW50NjQgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcjo6Qnl0ZUNvdW50KCkgY29uc3QgeworICByZXR1cm4gcG9zaXRpb25fIC0gYmFja3VwX2J5dGVzXzsKK30KKwordm9pZCBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yOjpBbGxvY2F0ZUJ1ZmZlcklmTmVlZGVkKCkgeworICBpZiAoYnVmZmVyXy5nZXQoKSA9PSBOVUxMKSB7CisgICAgYnVmZmVyXy5yZXNldChuZXcgdWludDhbYnVmZmVyX3NpemVfXSk7CisgIH0KK30KKwordm9pZCBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yOjpGcmVlQnVmZmVyKCkgeworICBHT09HTEVfQ0hFQ0tfRVEoYmFja3VwX2J5dGVzXywgMCk7CisgIGJ1ZmZlcl91c2VkXyA9IDA7CisgIGJ1ZmZlcl8ucmVzZXQoKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb3B5aW5nT3V0cHV0U3RyZWFtOjp+Q29weWluZ091dHB1dFN0cmVhbSgpIHt9CisKK0NvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yOjpDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcigKKyAgICBDb3B5aW5nT3V0cHV0U3RyZWFtKiBjb3B5aW5nX3N0cmVhbSwgaW50IGJsb2NrX3NpemUpCisgIDogY29weWluZ19zdHJlYW1fKGNvcHlpbmdfc3RyZWFtKSwKKyAgICBvd25zX2NvcHlpbmdfc3RyZWFtXyhmYWxzZSksCisgICAgZmFpbGVkXyhmYWxzZSksCisgICAgcG9zaXRpb25fKDApLAorICAgIGJ1ZmZlcl9zaXplXyhibG9ja19zaXplID4gMCA/IGJsb2NrX3NpemUgOiBrRGVmYXVsdEJsb2NrU2l6ZSksCisgICAgYnVmZmVyX3VzZWRfKDApIHsKK30KKworQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6On5Db3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcigpIHsKKyAgV3JpdGVCdWZmZXIoKTsKKyAgaWYgKG93bnNfY29weWluZ19zdHJlYW1fKSB7CisgICAgZGVsZXRlIGNvcHlpbmdfc3RyZWFtXzsKKyAgfQorfQorCitib29sIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yOjpGbHVzaCgpIHsKKyAgcmV0dXJuIFdyaXRlQnVmZmVyKCk7Cit9CisKK2Jvb2wgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6Ok5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICBpZiAoYnVmZmVyX3VzZWRfID09IGJ1ZmZlcl9zaXplXykgeworICAgIGlmICghV3JpdGVCdWZmZXIoKSkgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQWxsb2NhdGVCdWZmZXJJZk5lZWRlZCgpOworCisgICpkYXRhID0gYnVmZmVyXy5nZXQoKSArIGJ1ZmZlcl91c2VkXzsKKyAgKnNpemUgPSBidWZmZXJfc2l6ZV8gLSBidWZmZXJfdXNlZF87CisgIGJ1ZmZlcl91c2VkXyA9IGJ1ZmZlcl9zaXplXzsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6OkJhY2tVcChpbnQgY291bnQpIHsKKyAgR09PR0xFX0NIRUNLX0dFKGNvdW50LCAwKTsKKyAgR09PR0xFX0NIRUNLX0VRKGJ1ZmZlcl91c2VkXywgYnVmZmVyX3NpemVfKQorICAgIDw8ICIgQmFja1VwKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIE5leHQoKS4iOworICBHT09HTEVfQ0hFQ0tfTEUoY291bnQsIGJ1ZmZlcl91c2VkXykKKyAgICA8PCAiIENhbid0IGJhY2sgdXAgb3ZlciBtb3JlIGJ5dGVzIHRoYW4gd2VyZSByZXR1cm5lZCBieSB0aGUgbGFzdCBjYWxsIgorICAgICAgICIgdG8gTmV4dCgpLiI7CisKKyAgYnVmZmVyX3VzZWRfIC09IGNvdW50OworfQorCitpbnQ2NCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6Qnl0ZUNvdW50KCkgY29uc3QgeworICByZXR1cm4gcG9zaXRpb25fICsgYnVmZmVyX3VzZWRfOworfQorCitib29sIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yOjpXcml0ZUJ1ZmZlcigpIHsKKyAgaWYgKGZhaWxlZF8pIHsKKyAgICAvLyBBbHJlYWR5IGZhaWxlZCBvbiBhIHByZXZpb3VzIHdyaXRlLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChidWZmZXJfdXNlZF8gPT0gMCkgcmV0dXJuIHRydWU7CisKKyAgaWYgKGNvcHlpbmdfc3RyZWFtXy0+V3JpdGUoYnVmZmVyXy5nZXQoKSwgYnVmZmVyX3VzZWRfKSkgeworICAgIHBvc2l0aW9uXyArPSBidWZmZXJfdXNlZF87CisgICAgYnVmZmVyX3VzZWRfID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBmYWlsZWRfID0gdHJ1ZTsKKyAgICBGcmVlQnVmZmVyKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3ZvaWQgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6OkFsbG9jYXRlQnVmZmVySWZOZWVkZWQoKSB7CisgIGlmIChidWZmZXJfID09IE5VTEwpIHsKKyAgICBidWZmZXJfLnJlc2V0KG5ldyB1aW50OFtidWZmZXJfc2l6ZV9dKTsKKyAgfQorfQorCit2b2lkIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yOjpGcmVlQnVmZmVyKCkgeworICBidWZmZXJfdXNlZF8gPSAwOworICBidWZmZXJfLnJlc2V0KCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2Y1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oCkBAIC0wLDAgKzEsMzQwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgY29tbW9uIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgaW50ZXJmYWNlcyBkZWZpbmVkIGluCisvLyB6ZXJvX2NvcHlfc3RyZWFtLmggd2hpY2ggYXJlIGluY2x1ZGVkIGluIHRoZSAibGl0ZSIgcHJvdG9idWYgbGlicmFyeS4KKy8vIFRoZXNlIGltcGxlbWVudGF0aW9ucyBjb3ZlciBJL08gb24gcmF3IGFycmF5cyBhbmQgc3RyaW5ncywgYXMgd2VsbCBhcworLy8gYWRhcHRvcnMgd2hpY2ggbWFrZSBpdCBlYXN5IHRvIGltcGxlbWVudCBzdHJlYW1zIGJhc2VkIG9uIHRyYWRpdGlvbmFsCisvLyBzdHJlYW1zLiAgT2YgY291cnNlLCBtYW55IHVzZXJzIHdpbGwgcHJvYmFibHkgd2FudCB0byB3cml0ZSB0aGVpciBvd24KKy8vIGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBpbnRlcmZhY2VzIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIEkvTworLy8gYWJzdHJhY3Rpb25zIHRoZXkgcHJlZmVyIHRvIHVzZSwgYnV0IHRoZXNlIHNob3VsZCBjb3ZlciB0aGUgbW9zdCBjb21tb24KKy8vIGNhc2VzLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0lNUExfTElURV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSU1QTF9MSVRFX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW8geworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEEgWmVyb0NvcHlJbnB1dFN0cmVhbSBiYWNrZWQgYnkgYW4gaW4tbWVtb3J5IGFycmF5IG9mIGJ5dGVzLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEFycmF5SW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGUgYW4gSW5wdXRTdHJlYW0gdGhhdCByZXR1cm5zIHRoZSBieXRlcyBwb2ludGVkIHRvIGJ5ICJkYXRhIi4KKyAgLy8gImRhdGEiIHJlbWFpbnMgdGhlIHByb3BlcnR5IG9mIHRoZSBjYWxsZXIgYnV0IG11c3QgcmVtYWluIHZhbGlkIHVudGlsCisgIC8vIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLiAgSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBjYWxscyB0byBOZXh0KCkKKyAgLy8gd2lsbCByZXR1cm4gZGF0YSBibG9ja3Mgbm8gbGFyZ2VyIHRoYW4gdGhlIGdpdmVuIHNpemUuICBPdGhlcndpc2UsIHRoZQorICAvLyBmaXJzdCBjYWxsIHRvIE5leHQoKSByZXR1cm5zIHRoZSBlbnRpcmUgYXJyYXkuICBibG9ja19zaXplIGlzIG1haW5seQorICAvLyB1c2VmdWwgZm9yIHRlc3Rpbmc7IGluIHByb2R1Y3Rpb24geW91IHdvdWxkIHByb2JhYmx5IG5ldmVyIHdhbnQgdG8gc2V0CisgIC8vIGl0LgorICBBcnJheUlucHV0U3RyZWFtKGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLCBpbnQgYmxvY2tfc2l6ZSA9IC0xKTsKKyAgfkFycmF5SW5wdXRTdHJlYW0oKTsKKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCk7CisgIGJvb2wgU2tpcChpbnQgY291bnQpOworICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKKworCisgcHJpdmF0ZToKKyAgY29uc3QgdWludDgqIGNvbnN0IGRhdGFfOyAgLy8gVGhlIGJ5dGUgYXJyYXkuCisgIGNvbnN0IGludCBzaXplXzsgICAgICAgICAgIC8vIFRvdGFsIHNpemUgb2YgdGhlIGFycmF5LgorICBjb25zdCBpbnQgYmxvY2tfc2l6ZV87ICAgICAvLyBIb3cgbWFueSBieXRlcyB0byByZXR1cm4gYXQgYSB0aW1lLgorCisgIGludCBwb3NpdGlvbl87CisgIGludCBsYXN0X3JldHVybmVkX3NpemVfOyAgIC8vIEhvdyBtYW55IGJ5dGVzIHdlIHJldHVybmVkIGxhc3QgdGltZSBOZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGNhbGxlZCAodXNlZCBmb3IgZXJyb3IgY2hlY2tpbmcgb25seSkuCisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFycmF5SW5wdXRTdHJlYW0pOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIFplcm9Db3B5T3V0cHV0U3RyZWFtIGJhY2tlZCBieSBhbiBpbi1tZW1vcnkgYXJyYXkgb2YgYnl0ZXMuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQXJyYXlPdXRwdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlPdXRwdXRTdHJlYW0geworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIGFuIE91dHB1dFN0cmVhbSB0aGF0IHdyaXRlcyB0byB0aGUgYnl0ZXMgcG9pbnRlZCB0byBieSAiZGF0YSIuCisgIC8vICJkYXRhIiByZW1haW5zIHRoZSBwcm9wZXJ0eSBvZiB0aGUgY2FsbGVyIGJ1dCBtdXN0IHJlbWFpbiB2YWxpZCB1bnRpbAorICAvLyB0aGUgc3RyZWFtIGlzIGRlc3Ryb3llZC4gIElmIGEgYmxvY2tfc2l6ZSBpcyBnaXZlbiwgY2FsbHMgdG8gTmV4dCgpCisgIC8vIHdpbGwgcmV0dXJuIGRhdGEgYmxvY2tzIG5vIGxhcmdlciB0aGFuIHRoZSBnaXZlbiBzaXplLiAgT3RoZXJ3aXNlLCB0aGUKKyAgLy8gZmlyc3QgY2FsbCB0byBOZXh0KCkgcmV0dXJucyB0aGUgZW50aXJlIGFycmF5LiAgYmxvY2tfc2l6ZSBpcyBtYWlubHkKKyAgLy8gdXNlZnVsIGZvciB0ZXN0aW5nOyBpbiBwcm9kdWN0aW9uIHlvdSB3b3VsZCBwcm9iYWJseSBuZXZlciB3YW50IHRvIHNldAorICAvLyBpdC4KKyAgQXJyYXlPdXRwdXRTdHJlYW0odm9pZCogZGF0YSwgaW50IHNpemUsIGludCBibG9ja19zaXplID0gLTEpOworICB+QXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5T3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCk7CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdWludDgqIGNvbnN0IGRhdGFfOyAgICAgICAgLy8gVGhlIGJ5dGUgYXJyYXkuCisgIGNvbnN0IGludCBzaXplXzsgICAgICAgICAgIC8vIFRvdGFsIHNpemUgb2YgdGhlIGFycmF5LgorICBjb25zdCBpbnQgYmxvY2tfc2l6ZV87ICAgICAvLyBIb3cgbWFueSBieXRlcyB0byByZXR1cm4gYXQgYSB0aW1lLgorCisgIGludCBwb3NpdGlvbl87CisgIGludCBsYXN0X3JldHVybmVkX3NpemVfOyAgIC8vIEhvdyBtYW55IGJ5dGVzIHdlIHJldHVybmVkIGxhc3QgdGltZSBOZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGNhbGxlZCAodXNlZCBmb3IgZXJyb3IgY2hlY2tpbmcgb25seSkuCisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFycmF5T3V0cHV0U3RyZWFtKTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQSBaZXJvQ29weU91dHB1dFN0cmVhbSB3aGljaCBhcHBlbmRzIGJ5dGVzIHRvIGEgc3RyaW5nLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFN0cmluZ091dHB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGUgYSBTdHJpbmdPdXRwdXRTdHJlYW0gd2hpY2ggYXBwZW5kcyBieXRlcyB0byB0aGUgZ2l2ZW4gc3RyaW5nLgorICAvLyBUaGUgc3RyaW5nIHJlbWFpbnMgcHJvcGVydHkgb2YgdGhlIGNhbGxlciwgYnV0IGl0IE1VU1QgTk9UIGJlIGFjY2Vzc2VkCisgIC8vIGluIGFueSB3YXkgdW50aWwgdGhlIHN0cmVhbSBpcyBkZXN0cm95ZWQuCisgIC8vCisgIC8vIEhpbnQ6ICBJZiB5b3UgY2FsbCB0YXJnZXQtPnJlc2VydmUobikgYmVmb3JlIGNyZWF0aW5nIHRoZSBzdHJlYW0sCisgIC8vICAgdGhlIGZpcnN0IGNhbGwgdG8gTmV4dCgpIHdpbGwgcmV0dXJuIGF0IGxlYXN0IG4gYnl0ZXMgb2YgYnVmZmVyCisgIC8vICAgc3BhY2UuCisgIGV4cGxpY2l0IFN0cmluZ091dHB1dFN0cmVhbShzdHJpbmcqIHRhcmdldCk7CisgIH5TdHJpbmdPdXRwdXRTdHJlYW0oKTsKKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5T3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCk7CisgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IGludCBrTWluaW11bVNpemUgPSAxNjsKKworICBzdHJpbmcqIHRhcmdldF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN0cmluZ091dHB1dFN0cmVhbSk7Cit9OworCisvLyBOb3RlOiAgVGhlcmUgaXMgbm8gU3RyaW5nSW5wdXRTdHJlYW0uICBJbnN0ZWFkLCBqdXN0IGNyZWF0ZSBhbgorLy8gQXJyYXlJbnB1dFN0cmVhbSBhcyBmb2xsb3dzOgorLy8gICBBcnJheUlucHV0U3RyZWFtIGlucHV0KHN0ci5kYXRhKCksIHN0ci5zaXplKCkpOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEEgZ2VuZXJpYyB0cmFkaXRpb25hbCBpbnB1dCBzdHJlYW0gaW50ZXJmYWNlLgorLy8KKy8vIExvdHMgb2YgdHJhZGl0aW9uYWwgaW5wdXQgc3RyZWFtcyAoZS5nLiBmaWxlIGRlc2NyaXB0b3JzLCBDIHN0ZGlvCisvLyBzdHJlYW1zLCBhbmQgQysrIGlvc3RyZWFtcykgZXhwb3NlIGFuIGludGVyZmFjZSB3aGVyZSBldmVyeSByZWFkCisvLyBpbnZvbHZlcyBjb3B5aW5nIGJ5dGVzIGludG8gYSBidWZmZXIuICBJZiB5b3Ugd2FudCB0byB0YWtlIHN1Y2ggYW4KKy8vIGludGVyZmFjZSBhbmQgbWFrZSBhIFplcm9Db3B5SW5wdXRTdHJlYW0gYmFzZWQgb24gaXQsIHNpbXBseSBpbXBsZW1lbnQKKy8vIENvcHlpbmdJbnB1dFN0cmVhbSBhbmQgdGhlbiB1c2UgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvci4KKy8vCisvLyBDb3B5aW5nSW5wdXRTdHJlYW0gaW1wbGVtZW50YXRpb25zIHNob3VsZCBhdm9pZCBidWZmZXJpbmcgaWYgcG9zc2libGUuCisvLyBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yIGRvZXMgaXRzIG93biBidWZmZXJpbmcgYW5kIHdpbGwgcmVhZCBkYXRhCisvLyBpbiBsYXJnZSBibG9ja3MuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQ29weWluZ0lucHV0U3RyZWFtIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNvcHlpbmdJbnB1dFN0cmVhbSgpOworCisgIC8vIFJlYWRzIHVwIHRvICJzaXplIiBieXRlcyBpbnRvIHRoZSBnaXZlbiBidWZmZXIuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgLy8gYnl0ZXMgcmVhZC4gIFJlYWQoKSB3YWl0cyB1bnRpbCBhdCBsZWFzdCBvbmUgYnl0ZSBpcyBhdmFpbGFibGUsIG9yCisgIC8vIHJldHVybnMgemVybyBpZiBubyBieXRlcyB3aWxsIGV2ZXIgYmVjb21lIGF2YWlsYWJsZSAoRU9GKSwgb3IgLTEgaWYgYQorICAvLyBwZXJtYW5lbnQgcmVhZCBlcnJvciBvY2N1cnJlZC4KKyAgdmlydHVhbCBpbnQgUmVhZCh2b2lkKiBidWZmZXIsIGludCBzaXplKSA9IDA7CisKKyAgLy8gU2tpcHMgdGhlIG5leHQgImNvdW50IiBieXRlcyBvZiBpbnB1dC4gIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcworICAvLyBhY3R1YWxseSBza2lwcGVkLiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBleGFjdGx5IGVxdWFsIHRvICJjb3VudCIgdW5sZXNzCisgIC8vIEVPRiB3YXMgcmVhY2hlZCBvciBhIHBlcm1hbmVudCByZWFkIGVycm9yIG9jY3VycmVkLgorICAvLworICAvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IHJlcGVhdGVkbHkgY2FsbHMgUmVhZCgpIGludG8gYSBzY3JhdGNoCisgIC8vIGJ1ZmZlci4KKyAgdmlydHVhbCBpbnQgU2tpcChpbnQgY291bnQpOworfTsKKworLy8gQSBaZXJvQ29weUlucHV0U3RyZWFtIHdoaWNoIHJlYWRzIGZyb20gYSBDb3B5aW5nSW5wdXRTdHJlYW0uICBUaGlzIGlzCisvLyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBaZXJvQ29weUlucHV0U3RyZWFtcyB0aGF0IHJlYWQgZnJvbSB0cmFkaXRpb25hbAorLy8gc3RyZWFtcy4gIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIG5vdCByZWFsbHkgemVyby1jb3B5LgorLy8KKy8vIElmIHlvdSB3YW50IHRvIHJlYWQgZnJvbSBmaWxlIGRlc2NyaXB0b3JzIG9yIEMrKyBpc3RyZWFtcywgdGhpcyBpcworLy8gYWxyZWFkeSBpbXBsZW1lbnRlZCBmb3IgeW91OiAgdXNlIEZpbGVJbnB1dFN0cmVhbSBvciBJc3RyZWFtSW5wdXRTdHJlYW0KKy8vIHJlc3BlY3RpdmVseS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yIDogcHVibGljIFplcm9Db3B5SW5wdXRTdHJlYW0geworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlcyBhIHN0cmVhbSB0aGF0IHJlYWRzIGZyb20gdGhlIGdpdmVuIENvcHlpbmdJbnB1dFN0cmVhbS4KKyAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0CisgIC8vIHNob3VsZCBiZSByZWFkIGFuZCByZXR1cm5lZCB3aXRoIGVhY2ggY2FsbCB0byBOZXh0KCkuICBPdGhlcndpc2UsCisgIC8vIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuICBUaGUgY2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mCisgIC8vIGNvcHlpbmdfc3RyZWFtIHVubGVzcyBTZXRPd25zQ29weWluZ1N0cmVhbSh0cnVlKSBpcyBjYWxsZWQuCisgIGV4cGxpY2l0IENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IoQ29weWluZ0lucHV0U3RyZWFtKiBjb3B5aW5nX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfc2l6ZSA9IC0xKTsKKyAgfkNvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IoKTsKKworICAvLyBDYWxsIFNldE93bnNDb3B5aW5nU3RyZWFtKHRydWUpIHRvIHRlbGwgdGhlIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IgdG8KKyAgLy8gZGVsZXRlIHRoZSB1bmRlcmx5aW5nIENvcHlpbmdJbnB1dFN0cmVhbSB3aGVuIGl0IGlzIGRlc3Ryb3llZC4KKyAgdm9pZCBTZXRPd25zQ29weWluZ1N0cmVhbShib29sIHZhbHVlKSB7IG93bnNfY29weWluZ19zdHJlYW1fID0gdmFsdWU7IH0KKworICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7CisgIHZvaWQgQmFja1VwKGludCBjb3VudCk7CisgIGJvb2wgU2tpcChpbnQgY291bnQpOworICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKKworIHByaXZhdGU6CisgIC8vIEluc3VyZXMgdGhhdCBidWZmZXJfIGlzIG5vdCBOVUxMLgorICB2b2lkIEFsbG9jYXRlQnVmZmVySWZOZWVkZWQoKTsKKyAgLy8gRnJlZXMgdGhlIGJ1ZmZlciBhbmQgcmVzZXRzIGJ1ZmZlcl91c2VkXy4KKyAgdm9pZCBGcmVlQnVmZmVyKCk7CisKKyAgLy8gVGhlIHVuZGVybHlpbmcgY29weWluZyBzdHJlYW0uCisgIENvcHlpbmdJbnB1dFN0cmVhbSogY29weWluZ19zdHJlYW1fOworICBib29sIG93bnNfY29weWluZ19zdHJlYW1fOworCisgIC8vIFRydWUgaWYgd2UgaGF2ZSBzZWVuIGEgcGVybWVuYW50IGVycm9yIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICBib29sIGZhaWxlZF87CisKKyAgLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgY29weWluZ19zdHJlYW1fLCByZWxhdGl2ZSB0byB0aGUgcG9pbnQgd2hlcmUKKyAgLy8gd2Ugc3RhcnRlZCByZWFkaW5nLgorICBpbnQ2NCBwb3NpdGlvbl87CisKKyAgLy8gRGF0YSBpcyByZWFkIGludG8gdGhpcyBidWZmZXIuICBJdCBtYXkgYmUgTlVMTCBpZiBubyBidWZmZXIgaXMgY3VycmVudGx5CisgIC8vIGluIHVzZS4gIE90aGVyd2lzZSwgaXQgcG9pbnRzIHRvIGFuIGFycmF5IG9mIHNpemUgYnVmZmVyX3NpemVfLgorICBzY29wZWRfYXJyYXk8dWludDg+IGJ1ZmZlcl87CisgIGNvbnN0IGludCBidWZmZXJfc2l6ZV87CisKKyAgLy8gTnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyIChpLmUuIHRoZSBzaXplIGxhc3QKKyAgLy8gcmV0dXJuZWQgYnkgTmV4dCgpKS4gIDAgPD0gYnVmZmVyX3VzZWRfIDw9IGJ1ZmZlcl9zaXplXy4KKyAgaW50IGJ1ZmZlcl91c2VkXzsKKworICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciB3aGljaCB3ZXJlIGJhY2tlZCB1cCBvdmVyIGJ5IGEgY2FsbCB0bworICAvLyBCYWNrVXAoKS4gIFRoZXNlIG5lZWQgdG8gYmUgcmV0dXJuZWQgYWdhaW4uCisgIC8vIDAgPD0gYmFja3VwX2J5dGVzXyA8PSBidWZmZXJfdXNlZF8KKyAgaW50IGJhY2t1cF9ieXRlc187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IpOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBBIGdlbmVyaWMgdHJhZGl0aW9uYWwgb3V0cHV0IHN0cmVhbSBpbnRlcmZhY2UuCisvLworLy8gTG90cyBvZiB0cmFkaXRpb25hbCBvdXRwdXQgc3RyZWFtcyAoZS5nLiBmaWxlIGRlc2NyaXB0b3JzLCBDIHN0ZGlvCisvLyBzdHJlYW1zLCBhbmQgQysrIGlvc3RyZWFtcykgZXhwb3NlIGFuIGludGVyZmFjZSB3aGVyZSBldmVyeSB3cml0ZQorLy8gaW52b2x2ZXMgY29weWluZyBieXRlcyBmcm9tIGEgYnVmZmVyLiAgSWYgeW91IHdhbnQgdG8gdGFrZSBzdWNoIGFuCisvLyBpbnRlcmZhY2UgYW5kIG1ha2UgYSBaZXJvQ29weU91dHB1dFN0cmVhbSBiYXNlZCBvbiBpdCwgc2ltcGx5IGltcGxlbWVudAorLy8gQ29weWluZ091dHB1dFN0cmVhbSBhbmQgdGhlbiB1c2UgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IuCisvLworLy8gQ29weWluZ091dHB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGF2b2lkIGJ1ZmZlcmluZyBpZiBwb3NzaWJsZS4KKy8vIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yIGRvZXMgaXRzIG93biBidWZmZXJpbmcgYW5kIHdpbGwgd3JpdGUgZGF0YQorLy8gaW4gbGFyZ2UgYmxvY2tzLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIENvcHlpbmdPdXRwdXRTdHJlYW0geworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q29weWluZ091dHB1dFN0cmVhbSgpOworCisgIC8vIFdyaXRlcyAic2l6ZSIgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIHRvIHRoZSBvdXRwdXQuICBSZXR1cm5zIHRydWUKKyAgLy8gaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb24gYSB3cml0ZSBlcnJvci4KKyAgdmlydHVhbCBib29sIFdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpID0gMDsKK307CisKKy8vIEEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gd2hpY2ggd3JpdGVzIHRvIGEgQ29weWluZ091dHB1dFN0cmVhbS4gIFRoaXMgaXMKKy8vIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIFplcm9Db3B5T3V0cHV0U3RyZWFtcyB0aGF0IHdyaXRlIHRvIHRyYWRpdGlvbmFsCisvLyBzdHJlYW1zLiAgTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgbm90IHJlYWxseSB6ZXJvLWNvcHkuCisvLworLy8gSWYgeW91IHdhbnQgdG8gd3JpdGUgdG8gZmlsZSBkZXNjcmlwdG9ycyBvciBDKysgb3N0cmVhbXMsIHRoaXMgaXMKKy8vIGFscmVhZHkgaW1wbGVtZW50ZWQgZm9yIHlvdTogIHVzZSBGaWxlT3V0cHV0U3RyZWFtIG9yIE9zdHJlYW1PdXRwdXRTdHJlYW0KKy8vIHJlc3BlY3RpdmVseS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvciA6IHB1YmxpYyBaZXJvQ29weU91dHB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDcmVhdGVzIGEgc3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSBnaXZlbiBVbml4IGZpbGUgZGVzY3JpcHRvci4KKyAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcnMKKyAgLy8gdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgYnkgTmV4dCgpLiAgT3RoZXJ3aXNlLCBhIHJlYXNvbmFibGUgZGVmYXVsdAorICAvLyBpcyB1c2VkLgorICBleHBsaWNpdCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcihDb3B5aW5nT3V0cHV0U3RyZWFtKiBjb3B5aW5nX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3NpemUgPSAtMSk7CisgIH5Db3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcigpOworCisgIC8vIFdyaXRlcyBhbGwgcGVuZGluZyBkYXRhIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4gIFJldHVybnMgZmFsc2UgaWYgYQorICAvLyB3cml0ZSBlcnJvciBvY2N1cnJlZCBvbiB0aGUgdW5kZXJseWluZyBzdHJlYW0uICAoVGhlIHVuZGVybHlpbmcKKyAgLy8gc3RyZWFtIGl0c2VsZiBpcyBub3QgbmVjZXNzYXJpbHkgZmx1c2hlZC4pCisgIGJvb2wgRmx1c2goKTsKKworICAvLyBDYWxsIFNldE93bnNDb3B5aW5nU3RyZWFtKHRydWUpIHRvIHRlbGwgdGhlIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yIHRvCisgIC8vIGRlbGV0ZSB0aGUgdW5kZXJseWluZyBDb3B5aW5nT3V0cHV0U3RyZWFtIHdoZW4gaXQgaXMgZGVzdHJveWVkLgorICB2b2lkIFNldE93bnNDb3B5aW5nU3RyZWFtKGJvb2wgdmFsdWUpIHsgb3duc19jb3B5aW5nX3N0cmVhbV8gPSB2YWx1ZTsgfQorCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKKyAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7CisKKyBwcml2YXRlOgorICAvLyBXcml0ZSB0aGUgY3VycmVudCBidWZmZXIsIGlmIGl0IGlzIHByZXNlbnQuCisgIGJvb2wgV3JpdGVCdWZmZXIoKTsKKyAgLy8gSW5zdXJlcyB0aGF0IGJ1ZmZlcl8gaXMgbm90IE5VTEwuCisgIHZvaWQgQWxsb2NhdGVCdWZmZXJJZk5lZWRlZCgpOworICAvLyBGcmVlcyB0aGUgYnVmZmVyLgorICB2b2lkIEZyZWVCdWZmZXIoKTsKKworICAvLyBUaGUgdW5kZXJseWluZyBjb3B5aW5nIHN0cmVhbS4KKyAgQ29weWluZ091dHB1dFN0cmVhbSogY29weWluZ19zdHJlYW1fOworICBib29sIG93bnNfY29weWluZ19zdHJlYW1fOworCisgIC8vIFRydWUgaWYgd2UgaGF2ZSBzZWVuIGEgcGVybWVuYW50IGVycm9yIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICBib29sIGZhaWxlZF87CisKKyAgLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgY29weWluZ19zdHJlYW1fLCByZWxhdGl2ZSB0byB0aGUgcG9pbnQgd2hlcmUKKyAgLy8gd2Ugc3RhcnRlZCB3cml0aW5nLgorICBpbnQ2NCBwb3NpdGlvbl87CisKKyAgLy8gRGF0YSBpcyB3cml0dGVuIGZyb20gdGhpcyBidWZmZXIuICBJdCBtYXkgYmUgTlVMTCBpZiBubyBidWZmZXIgaXMKKyAgLy8gY3VycmVudGx5IGluIHVzZS4gIE90aGVyd2lzZSwgaXQgcG9pbnRzIHRvIGFuIGFycmF5IG9mIHNpemUgYnVmZmVyX3NpemVfLgorICBzY29wZWRfYXJyYXk8dWludDg+IGJ1ZmZlcl87CisgIGNvbnN0IGludCBidWZmZXJfc2l6ZV87CisKKyAgLy8gTnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyIChpLmUuIHRoZSBzaXplIGxhc3QKKyAgLy8gcmV0dXJuZWQgYnkgTmV4dCgpKS4gIFdoZW4gQmFja1VwKCkgaXMgY2FsbGVkLCB3ZSBqdXN0IHJlZHVjZSB0aGlzLgorICAvLyAwIDw9IGJ1ZmZlcl91c2VkXyA8PSBidWZmZXJfc2l6ZV8uCisgIGludCBidWZmZXJfdXNlZF87CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yKTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworfSAgLy8gbmFtZXNwYWNlIGlvCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9JTVBMX0xJVEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTk2ZDkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDg1MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGVzdGluZyBzdHJhdGVneTogIEZvciBlYWNoIHR5cGUgb2YgSS9PIChhcnJheSwgc3RyaW5nLCBmaWxlLCBldGMuKSB3ZQorLy8gY3JlYXRlIGFuIG91dHB1dCBzdHJlYW0gYW5kIHdyaXRlIHNvbWUgZGF0YSB0byBpdCwgdGhlbiBjcmVhdGUgYQorLy8gY29ycmVzcG9uZGluZyBpbnB1dCBzdHJlYW0gdG8gcmVhZCB0aGUgc2FtZSBkYXRhIGJhY2sgYW5kIGV4cGVjdCBpdCB0bworLy8gbWF0Y2guICBXaGVuIHRoZSBkYXRhIGlzIHdyaXR0ZW4sIGl0IGlzIHdyaXR0ZW4gaW4gc2V2ZXJhbCBzbWFsbCBjaHVua3MKKy8vIG9mIHZhcnlpbmcgc2l6ZXMsIHdpdGggYSBCYWNrVXAoKSBhZnRlciBlYWNoIGNodW5rLiAgSXQgaXMgcmVhZCBiYWNrCisvLyBzaW1pbGFybHksIGJ1dCB3aXRoIGNodW5rcyBzZXBhcmF0ZWQgYXQgZGlmZmVyZW50IHBvaW50cy4gIFRoZSB3aG9sZQorLy8gcHJvY2VzcyBpcyBydW4gd2l0aCBhIHZhcmlldHkgb2YgYmxvY2sgc2l6ZXMgZm9yIGJvdGggdGhlIGlucHV0IGFuZAorLy8gdGhlIG91dHB1dC4KKy8vCisvLyBUT0RPKGtlbnRvbik6ICBSZXdyaXRlIHRoaXMgdGVzdCB0byBicmluZyBpdCB1cCB0byB0aGUgc3RhbmRhcmRzIG9mIGFsbAorLy8gICB0aGUgb3RoZXIgcHJvdG8yIHRlc3RzLiAgTWF5IHdhbnQgdG8gd2FpdCBmb3IgZ1Rlc3QgdG8gaW1wbGVtZW50CisvLyAgICJwYXJhbWV0aXplZCB0ZXN0cyIgc28gdGhhdCBvbmUgc2V0IG9mIHRlc3RzIGNhbiBiZSB1c2VkIG9uIGFsbCB0aGUKKy8vICAgaW1wbGVtZW50YXRpb25zLgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGlvLmg+CisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisKKyNpZiBIQVZFX1pMSUIKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGlvIHsKK25hbWVzcGFjZSB7CisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgcGlwZShmZHMpIF9waXBlKGZkcywgNDA5NiwgT19CSU5BUlkpCisjZW5kaWYKKworI2lmbmRlZiBPX0JJTkFSWQorI2lmZGVmIF9PX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSBfT19CSU5BUlkKKyNlbHNlCisjZGVmaW5lIE9fQklOQVJZIDAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIHBsYXRmb3JtIGRvZXNuJ3QgbmVlZCBpdC4KKyNlbmRpZgorI2VuZGlmCisKK2NsYXNzIElvVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFRlc3QgaGVscGVycy4KKworICAvLyBIZWxwZXIgdG8gd3JpdGUgYW4gYXJyYXkgb2YgZGF0YSB0byBhbiBvdXRwdXQgc3RyZWFtLgorICBib29sIFdyaXRlVG9PdXRwdXQoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCwgY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpOworICAvLyBIZWxwZXIgdG8gcmVhZCBhIGZpeGVkLWxlbmd0aCBhcnJheSBvZiBkYXRhIGZyb20gYW4gaW5wdXQgc3RyZWFtLgorICBpbnQgUmVhZEZyb21JbnB1dChaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgdm9pZCogZGF0YSwgaW50IHNpemUpOworICAvLyBXcml0ZSBhIHN0cmluZyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBXcml0ZVN0cmluZyhaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjb25zdCBzdHJpbmcmIHN0cik7CisgIC8vIFJlYWQgYSBudW1iZXIgb2YgYnl0ZXMgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGdpdmVuIHN0cmluZyBhbmQgY2hlY2tzCisgIC8vIHRoYXQgaXQgbWF0Y2hlcyB0aGUgc3RyaW5nLgorICB2b2lkIFJlYWRTdHJpbmcoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGNvbnN0IHN0cmluZyYgc3RyKTsKKyAgLy8gV3JpdGVzIHNvbWUgdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBhIHBhcnRpY3VsYXIgb3JkZXIuICBSZXR1cm5zCisgIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgaW5jYXNlIHRoZSBjYWxsZXIgbmVlZHMgdGhhdCB0byBzZXQgdXAgYW4KKyAgLy8gaW5wdXQgc3RyZWFtLgorICBpbnQgV3JpdGVTdHVmZihaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgLy8gUmVhZHMgdGV4dCBmcm9tIGFuIGlucHV0IHN0cmVhbSBhbmQgZXhwZWN0cyBpdCB0byBtYXRjaCB3aGF0CisgIC8vIFdyaXRlU3R1ZmYoKSB3cml0ZXMuCisgIHZvaWQgUmVhZFN0dWZmKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KTsKKworICAvLyBTaW1pbGFyIHRvIFdyaXRlU3R1ZmYsIGJ1dCBwZXJmb3JtcyBtb3JlIHNvcGhpc3RpY2F0ZWQgdGVzdGluZy4KKyAgaW50IFdyaXRlU3R1ZmZMYXJnZShaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KTsKKyAgLy8gUmVhZHMgYW5kIHRlc3RzIGEgc3RyZWFtIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiB3cml0dGVuIHRvCisgIC8vIHZpYSBXcml0ZVN0dWZmTGFyZ2UoKS4KKyAgdm9pZCBSZWFkU3R1ZmZMYXJnZShaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCk7CisKKyNpZiBIQVZFX1pMSUIKKyAgc3RyaW5nIENvbXByZXNzKGNvbnN0IHN0cmluZyYgZGF0YSwgY29uc3QgR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9ucyYgb3B0aW9ucyk7CisgIHN0cmluZyBVbmNvbXByZXNzKGNvbnN0IHN0cmluZyYgZGF0YSk7CisjZW5kaWYKKworICBzdGF0aWMgY29uc3QgaW50IGtCbG9ja1NpemVzW107CisgIHN0YXRpYyBjb25zdCBpbnQga0Jsb2NrU2l6ZUNvdW50OworfTsKKworY29uc3QgaW50IElvVGVzdDo6a0Jsb2NrU2l6ZXNbXSA9IHstMSwgMSwgMiwgNSwgNywgMTAsIDIzLCA2NH07Citjb25zdCBpbnQgSW9UZXN0OjprQmxvY2tTaXplQ291bnQgPSBHT09HTEVfQVJSQVlTSVpFKElvVGVzdDo6a0Jsb2NrU2l6ZXMpOworCitib29sIElvVGVzdDo6V3JpdGVUb091dHB1dChaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpIHsKKyAgY29uc3QgdWludDgqIGluID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRhdGEpOworICBpbnQgaW5fc2l6ZSA9IHNpemU7CisKKyAgdm9pZCogb3V0OworICBpbnQgb3V0X3NpemU7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoIW91dHB1dC0+TmV4dCgmb3V0LCAmb3V0X3NpemUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEVYUEVDVF9HVChvdXRfc2l6ZSwgMCk7CisKKyAgICBpZiAoaW5fc2l6ZSA8PSBvdXRfc2l6ZSkgeworICAgICAgbWVtY3B5KG91dCwgaW4sIGluX3NpemUpOworICAgICAgb3V0cHV0LT5CYWNrVXAob3V0X3NpemUgLSBpbl9zaXplKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIG1lbWNweShvdXQsIGluLCBvdXRfc2l6ZSk7CisgICAgaW4gKz0gb3V0X3NpemU7CisgICAgaW5fc2l6ZSAtPSBvdXRfc2l6ZTsKKyAgfQorfQorCisjZGVmaW5lIE1BWF9SRVBFQVRFRF9aRVJPUyAxMDAKKworaW50IElvVGVzdDo6UmVhZEZyb21JbnB1dChaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgdm9pZCogZGF0YSwgaW50IHNpemUpIHsKKyAgdWludDgqIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihkYXRhKTsKKyAgaW50IG91dF9zaXplID0gc2l6ZTsKKworICBjb25zdCB2b2lkKiBpbjsKKyAgaW50IGluX3NpemUgPSAwOworCisgIGludCByZXBlYXRlZF96ZXJvcyA9IDA7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoIWlucHV0LT5OZXh0KCZpbiwgJmluX3NpemUpKSB7CisgICAgICByZXR1cm4gc2l6ZSAtIG91dF9zaXplOworICAgIH0KKyAgICBFWFBFQ1RfR1QoaW5fc2l6ZSwgLTEpOworICAgIGlmIChpbl9zaXplID09IDApIHsKKyAgICAgIHJlcGVhdGVkX3plcm9zKys7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlcGVhdGVkX3plcm9zID0gMDsKKyAgICB9CisgICAgRVhQRUNUX0xUKHJlcGVhdGVkX3plcm9zLCBNQVhfUkVQRUFURURfWkVST1MpOworCisgICAgaWYgKG91dF9zaXplIDw9IGluX3NpemUpIHsKKyAgICAgIG1lbWNweShvdXQsIGluLCBvdXRfc2l6ZSk7CisgICAgICBpZiAoaW5fc2l6ZSA+IG91dF9zaXplKSB7CisgICAgICAgIGlucHV0LT5CYWNrVXAoaW5fc2l6ZSAtIG91dF9zaXplKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzaXplOyAgLy8gQ29waWVkIGFsbCBvZiBpdC4KKyAgICB9CisKKyAgICBtZW1jcHkob3V0LCBpbiwgaW5fc2l6ZSk7CisgICAgb3V0ICs9IGluX3NpemU7CisgICAgb3V0X3NpemUgLT0gaW5fc2l6ZTsKKyAgfQorfQorCit2b2lkIElvVGVzdDo6V3JpdGVTdHJpbmcoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCwgY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgRVhQRUNUX1RSVUUoV3JpdGVUb091dHB1dChvdXRwdXQsIHN0ci5jX3N0cigpLCBzdHIuc2l6ZSgpKSk7Cit9CisKK3ZvaWQgSW9UZXN0OjpSZWFkU3RyaW5nKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBjb25zdCBzdHJpbmcmIHN0cikgeworICBzY29wZWRfYXJyYXk8Y2hhcj4gYnVmZmVyKG5ldyBjaGFyW3N0ci5zaXplKCkgKyAxXSk7CisgIGJ1ZmZlcltzdHIuc2l6ZSgpXSA9ICdcMCc7CisgIEVYUEVDVF9FUShSZWFkRnJvbUlucHV0KGlucHV0LCBidWZmZXIuZ2V0KCksIHN0ci5zaXplKCkpLCBzdHIuc2l6ZSgpKTsKKyAgRVhQRUNUX1NUUkVRKHN0ci5jX3N0cigpLCBidWZmZXIuZ2V0KCkpOworfQorCitpbnQgSW9UZXN0OjpXcml0ZVN0dWZmKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVTdHJpbmcob3V0cHV0LCAiSGVsbG8gd29ybGQhXG4iKTsKKyAgV3JpdGVTdHJpbmcob3V0cHV0LCAiU29tZSB0ZSIpOworICBXcml0ZVN0cmluZyhvdXRwdXQsICJ4dC4gIEJsYWggYmxhaC4iKTsKKyAgV3JpdGVTdHJpbmcob3V0cHV0LCAiYWJjZGVmZyIpOworICBXcml0ZVN0cmluZyhvdXRwdXQsICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOworICBXcml0ZVN0cmluZyhvdXRwdXQsICJmb29iYXIiKTsKKworICBFWFBFQ1RfRVEob3V0cHV0LT5CeXRlQ291bnQoKSwgNjgpOworCisgIGludCByZXN1bHQgPSBvdXRwdXQtPkJ5dGVDb3VudCgpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBSZWFkcyB0ZXh0IGZyb20gYW4gaW5wdXQgc3RyZWFtIGFuZCBleHBlY3RzIGl0IHRvIG1hdGNoIHdoYXQgV3JpdGVTdHVmZigpCisvLyB3cml0ZXMuCit2b2lkIElvVGVzdDo6UmVhZFN0dWZmKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIFJlYWRTdHJpbmcoaW5wdXQsICJIZWxsbyB3b3JsZCFcbiIpOworICBSZWFkU3RyaW5nKGlucHV0LCAiU29tZSB0ZXh0LiAgIik7CisgIFJlYWRTdHJpbmcoaW5wdXQsICJCbGFoICIpOworICBSZWFkU3RyaW5nKGlucHV0LCAiYmxhaC4iKTsKKyAgUmVhZFN0cmluZyhpbnB1dCwgImFiY2RlZmciKTsKKyAgRVhQRUNUX1RSVUUoaW5wdXQtPlNraXAoMjApKTsKKyAgUmVhZFN0cmluZyhpbnB1dCwgImZvbyIpOworICBSZWFkU3RyaW5nKGlucHV0LCAiYmFyIik7CisKKyAgRVhQRUNUX0VRKGlucHV0LT5CeXRlQ291bnQoKSwgNjgpOworCisgIHVpbnQ4IGJ5dGU7CisgIEVYUEVDVF9FUShSZWFkRnJvbUlucHV0KGlucHV0LCAmYnl0ZSwgMSksIDApOworfQorCitpbnQgSW9UZXN0OjpXcml0ZVN0dWZmTGFyZ2UoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVN0cmluZyhvdXRwdXQsICJIZWxsbyB3b3JsZCFcbiIpOworICBXcml0ZVN0cmluZyhvdXRwdXQsICJTb21lIHRlIik7CisgIFdyaXRlU3RyaW5nKG91dHB1dCwgInh0LiAgQmxhaCBibGFoLiIpOworICBXcml0ZVN0cmluZyhvdXRwdXQsIHN0cmluZygxMDAwMDAsICd4JykpOyAgLy8gQSB2ZXJ5IGxvbmcgc3RyaW5nCisgIFdyaXRlU3RyaW5nKG91dHB1dCwgc3RyaW5nKDEwMDAwMCwgJ3knKSk7ICAvLyBBIHZlcnkgbG9uZyBzdHJpbmcKKyAgV3JpdGVTdHJpbmcob3V0cHV0LCAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKKworICBFWFBFQ1RfRVEob3V0cHV0LT5CeXRlQ291bnQoKSwgMjAwMDU1KTsKKworICBpbnQgcmVzdWx0ID0gb3V0cHV0LT5CeXRlQ291bnQoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gUmVhZHMgdGV4dCBmcm9tIGFuIGlucHV0IHN0cmVhbSBhbmQgZXhwZWN0cyBpdCB0byBtYXRjaCB3aGF0IFdyaXRlU3R1ZmYoKQorLy8gd3JpdGVzLgordm9pZCBJb1Rlc3Q6OlJlYWRTdHVmZkxhcmdlKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIFJlYWRTdHJpbmcoaW5wdXQsICJIZWxsbyB3b3JsZCFcblNvbWUgdGV4dC4gICIpOworICBFWFBFQ1RfVFJVRShpbnB1dC0+U2tpcCg1KSk7CisgIFJlYWRTdHJpbmcoaW5wdXQsICJibGFoLiIpOworICBFWFBFQ1RfVFJVRShpbnB1dC0+U2tpcCgxMDAwMDAgLSAxMCkpOworICBSZWFkU3RyaW5nKGlucHV0LCBzdHJpbmcoMTAsICd4JykgKyBzdHJpbmcoMTAwMDAwIC0gMjAwMDAsICd5JykpOworICBFWFBFQ1RfVFJVRShpbnB1dC0+U2tpcCgyMDAwMCAtIDEwKSk7CisgIFJlYWRTdHJpbmcoaW5wdXQsICJ5eXl5eXl5eXl5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKKworICBFWFBFQ1RfRVEoaW5wdXQtPkJ5dGVDb3VudCgpLCAyMDAwNTUpOworCisgIHVpbnQ4IGJ5dGU7CisgIEVYUEVDVF9FUShSZWFkRnJvbUlucHV0KGlucHV0LCAmYnl0ZSwgMSksIDApOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1RfRihJb1Rlc3QsIEFycmF5SW8pIHsKKyAgY29uc3QgaW50IGtCdWZmZXJTaXplID0gMjU2OworICB1aW50OCBidWZmZXJba0J1ZmZlclNpemVdOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICBpbnQgc2l6ZTsKKyAgICAgIHsKKyAgICAgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgICAgc2l6ZSA9IFdyaXRlU3R1ZmYoJm91dHB1dCk7CisgICAgICB9CisgICAgICB7CisgICAgICAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyLCBzaXplLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICAgIFJlYWRTdHVmZigmaW5wdXQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitURVNUX0YoSW9UZXN0LCBUd29TZXNzaW9uV3JpdGUpIHsKKyAgLy8gVGVzdCB0aGF0IHR3byBjb25jYXRlbmF0ZWQgd3JpdGUgc2Vzc2lvbnMgcmVhZCBjb3JyZWN0bHkKKworICBzdGF0aWMgY29uc3QgY2hhciogc3RyQSA9ICIwMTIzNDU2Nzg5IjsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIHN0ckIgPSAiV2hpcmxlZFBlYXMiOworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyKjEwMjQ7CisgIHVpbnQ4KiBidWZmZXIgPSBuZXcgdWludDhba0J1ZmZlclNpemVdOworICBjaGFyKiB0ZW1wX2J1ZmZlciA9IG5ldyBjaGFyWzQwXTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgeworICAgICAgQXJyYXlPdXRwdXRTdHJlYW0qIG91dHB1dCA9CisgICAgICAgICAgbmV3IEFycmF5T3V0cHV0U3RyZWFtKGJ1ZmZlciwga0J1ZmZlclNpemUsIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgIENvZGVkT3V0cHV0U3RyZWFtKiBjb2RlZF9vdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ob3V0cHV0KTsKKyAgICAgIGNvZGVkX291dHB1dC0+V3JpdGVWYXJpbnQzMihzdHJsZW4oc3RyQSkpOworICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVJhdyhzdHJBLCBzdHJsZW4oc3RyQSkpOworICAgICAgZGVsZXRlIGNvZGVkX291dHB1dDsgIC8vIGZsdXNoCisgICAgICBpbnQ2NCBwb3MgPSBvdXRwdXQtPkJ5dGVDb3VudCgpOworICAgICAgZGVsZXRlIG91dHB1dDsKKyAgICAgIG91dHB1dCA9IG5ldyBBcnJheU91dHB1dFN0cmVhbSgKKyAgICAgICAgICBidWZmZXIgKyBwb3MsIGtCdWZmZXJTaXplIC0gcG9zLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICBjb2RlZF9vdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ob3V0cHV0KTsKKyAgICAgIGNvZGVkX291dHB1dC0+V3JpdGVWYXJpbnQzMihzdHJsZW4oc3RyQikpOworICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVJhdyhzdHJCLCBzdHJsZW4oc3RyQikpOworICAgICAgZGVsZXRlIGNvZGVkX291dHB1dDsgIC8vIGZsdXNoCisgICAgICBpbnQ2NCBzaXplID0gcG9zICsgb3V0cHV0LT5CeXRlQ291bnQoKTsKKyAgICAgIGRlbGV0ZSBvdXRwdXQ7CisKKyAgICAgIEFycmF5SW5wdXRTdHJlYW0qIGlucHV0ID0KKyAgICAgICAgICBuZXcgQXJyYXlJbnB1dFN0cmVhbShidWZmZXIsIHNpemUsIGtCbG9ja1NpemVzW2pdKTsKKyAgICAgIENvZGVkSW5wdXRTdHJlYW0qIGNvZGVkX2lucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oaW5wdXQpOworICAgICAgdWludDMyIGluc2l6ZTsKKyAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkVmFyaW50MzIoJmluc2l6ZSkpOworICAgICAgRVhQRUNUX0VRKHN0cmxlbihzdHJBKSwgaW5zaXplKTsKKyAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkUmF3KHRlbXBfYnVmZmVyLCBpbnNpemUpKTsKKyAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAodGVtcF9idWZmZXIsIHN0ckEsIGluc2l6ZSkpOworCisgICAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC0+UmVhZFZhcmludDMyKCZpbnNpemUpKTsKKyAgICAgIEVYUEVDVF9FUShzdHJsZW4oc3RyQiksIGluc2l6ZSk7CisgICAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC0+UmVhZFJhdyh0ZW1wX2J1ZmZlciwgaW5zaXplKSk7CisgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHRlbXBfYnVmZmVyLCBzdHJCLCBpbnNpemUpKTsKKworICAgICAgZGVsZXRlIGNvZGVkX2lucHV0OworICAgICAgZGVsZXRlIGlucHV0OworICAgIH0KKyAgfQorCisgIGRlbGV0ZSBbXSB0ZW1wX2J1ZmZlcjsKKyAgZGVsZXRlIFtdIGJ1ZmZlcjsKK30KKworI2lmIEhBVkVfWkxJQgorVEVTVF9GKElvVGVzdCwgR3ppcElvKSB7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIqMTAyNDsKKyAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICBmb3IgKGludCB6ID0gMDsgeiA8IGtCbG9ja1NpemVDb3VudDsgeisrKSB7CisgICAgICAgIGludCBnemlwX2J1ZmZlcl9zaXplID0ga0Jsb2NrU2l6ZXNbel07CisgICAgICAgIGludCBzaXplOworICAgICAgICB7CisgICAgICAgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgICAgICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgICAgICAgICAgb3B0aW9ucy5mb3JtYXQgPSBHemlwT3V0cHV0U3RyZWFtOjpHWklQOworICAgICAgICAgIGlmIChnemlwX2J1ZmZlcl9zaXplICE9IC0xKSB7CisgICAgICAgICAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKKyAgICAgICAgICBXcml0ZVN0dWZmKCZnem91dCk7CisgICAgICAgICAgZ3pvdXQuQ2xvc2UoKTsKKyAgICAgICAgICBzaXplID0gb3V0cHV0LkJ5dGVDb3VudCgpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSwga0Jsb2NrU2l6ZXNbal0pOworICAgICAgICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKAorICAgICAgICAgICAgICAmaW5wdXQsIEd6aXBJbnB1dFN0cmVhbTo6R1pJUCwgZ3ppcF9idWZmZXJfc2l6ZSk7CisgICAgICAgICAgUmVhZFN0dWZmKCZnemluKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBkZWxldGUgW10gYnVmZmVyOworfQorCitURVNUX0YoSW9UZXN0LCBabGliSW8pIHsKKyAgY29uc3QgaW50IGtCdWZmZXJTaXplID0gMioxMDI0OworICB1aW50OCogYnVmZmVyID0gbmV3IHVpbnQ4W2tCdWZmZXJTaXplXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKKyAgICAgIGZvciAoaW50IHogPSAwOyB6IDwga0Jsb2NrU2l6ZUNvdW50OyB6KyspIHsKKyAgICAgICAgaW50IGd6aXBfYnVmZmVyX3NpemUgPSBrQmxvY2tTaXplc1t6XTsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIHsKKyAgICAgICAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSwga0Jsb2NrU2l6ZXNbaV0pOworICAgICAgICAgIEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMgb3B0aW9uczsKKyAgICAgICAgICBvcHRpb25zLmZvcm1hdCA9IEd6aXBPdXRwdXRTdHJlYW06OlpMSUI7CisgICAgICAgICAgaWYgKGd6aXBfYnVmZmVyX3NpemUgIT0gLTEpIHsKKyAgICAgICAgICAgIG9wdGlvbnMuYnVmZmVyX3NpemUgPSBnemlwX2J1ZmZlcl9zaXplOworICAgICAgICAgIH0KKyAgICAgICAgICBHemlwT3V0cHV0U3RyZWFtIGd6b3V0KCZvdXRwdXQsIG9wdGlvbnMpOworICAgICAgICAgIFdyaXRlU3R1ZmYoJmd6b3V0KTsKKyAgICAgICAgICBnem91dC5DbG9zZSgpOworICAgICAgICAgIHNpemUgPSBvdXRwdXQuQnl0ZUNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyLCBzaXplLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICAgICAgR3ppcElucHV0U3RyZWFtIGd6aW4oCisgICAgICAgICAgICAgICZpbnB1dCwgR3ppcElucHV0U3RyZWFtOjpaTElCLCBnemlwX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgICBSZWFkU3R1ZmYoJmd6aW4pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGRlbGV0ZSBbXSBidWZmZXI7Cit9CisKK1RFU1RfRihJb1Rlc3QsIFpsaWJJb0lucHV0QXV0b2RldGVjdCkgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyKjEwMjQ7CisgIHVpbnQ4KiBidWZmZXIgPSBuZXcgdWludDhba0J1ZmZlclNpemVdOworICBpbnQgc2l6ZTsKKyAgeworICAgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIGtCdWZmZXJTaXplKTsKKyAgICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5mb3JtYXQgPSBHemlwT3V0cHV0U3RyZWFtOjpaTElCOworICAgIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCwgb3B0aW9ucyk7CisgICAgV3JpdGVTdHVmZigmZ3pvdXQpOworICAgIGd6b3V0LkNsb3NlKCk7CisgICAgc2l6ZSA9IG91dHB1dC5CeXRlQ291bnQoKTsKKyAgfQorICB7CisgICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUpOworICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKCZpbnB1dCwgR3ppcElucHV0U3RyZWFtOjpBVVRPKTsKKyAgICBSZWFkU3R1ZmYoJmd6aW4pOworICB9CisgIHsKKyAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSk7CisgICAgR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6R1pJUDsKKyAgICBHemlwT3V0cHV0U3RyZWFtIGd6b3V0KCZvdXRwdXQsIG9wdGlvbnMpOworICAgIFdyaXRlU3R1ZmYoJmd6b3V0KTsKKyAgICBnem91dC5DbG9zZSgpOworICAgIHNpemUgPSBvdXRwdXQuQnl0ZUNvdW50KCk7CisgIH0KKyAgeworICAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyLCBzaXplKTsKKyAgICBHemlwSW5wdXRTdHJlYW0gZ3ppbigmaW5wdXQsIEd6aXBJbnB1dFN0cmVhbTo6QVVUTyk7CisgICAgUmVhZFN0dWZmKCZnemluKTsKKyAgfQorICBkZWxldGUgW10gYnVmZmVyOworfQorCitzdHJpbmcgSW9UZXN0OjpDb21wcmVzcyhjb25zdCBzdHJpbmcmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zJiBvcHRpb25zKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIHsKKyAgICBTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0KCZyZXN1bHQpOworICAgIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCwgb3B0aW9ucyk7CisgICAgV3JpdGVUb091dHB1dCgmZ3pvdXQsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIElvVGVzdDo6VW5jb21wcmVzcyhjb25zdCBzdHJpbmcmIGRhdGEpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgeworICAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBHemlwSW5wdXRTdHJlYW0gZ3ppbigmaW5wdXQpOworICAgIGNvbnN0IHZvaWQqIGJ1ZmZlcjsKKyAgICBpbnQgc2l6ZTsKKyAgICB3aGlsZSAoZ3ppbi5OZXh0KCZidWZmZXIsICZzaXplKSkgeworICAgICAgcmVzdWx0LmFwcGVuZChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihidWZmZXIpLCBzaXplKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworVEVTVF9GKElvVGVzdCwgQ29tcHJlc3Npb25PcHRpb25zKSB7CisgIC8vIFNvbWUgYWQtaG9jIHRlc3Rpbmcgb2YgY29tcHJlc3Npb24gb3B0aW9ucy4KKworICBzdHJpbmcgZ29sZGVuOworICBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nT3JEaWUoCisgICAgVGVzdFNvdXJjZURpcigpICsgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UiLAorICAgICZnb2xkZW4pOworCisgIEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMgb3B0aW9uczsKKyAgc3RyaW5nIGd6aXBfY29tcHJlc3NlZCA9IENvbXByZXNzKGdvbGRlbiwgb3B0aW9ucyk7CisKKyAgb3B0aW9ucy5jb21wcmVzc2lvbl9sZXZlbCA9IDA7CisgIHN0cmluZyBub3RfY29tcHJlc3NlZCA9IENvbXByZXNzKGdvbGRlbiwgb3B0aW9ucyk7CisKKyAgLy8gVHJ5IHpsaWIgY29tcHJlc3Npb24gZm9yIGZ1bi4KKyAgb3B0aW9ucyA9IEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMoKTsKKyAgb3B0aW9ucy5mb3JtYXQgPSBHemlwT3V0cHV0U3RyZWFtOjpaTElCOworICBzdHJpbmcgemxpYl9jb21wcmVzc2VkID0gQ29tcHJlc3MoZ29sZGVuLCBvcHRpb25zKTsKKworICAvLyBVbmNvbXByZXNzZWQgc2hvdWxkIGJlIGJpZ2dlciB0aGFuIHRoZSBvcmlnaW5hbCBzaW5jZSBpdCBzaG91bGQgaGF2ZSBzb21lCisgIC8vIHNvcnQgb2YgaGVhZGVyLgorICBFWFBFQ1RfR1Qobm90X2NvbXByZXNzZWQuc2l6ZSgpLCBnb2xkZW4uc2l6ZSgpKTsKKworICAvLyBIaWdoZXIgY29tcHJlc3Npb24gbGV2ZWxzIHNob3VsZCByZXN1bHQgaW4gc21hbGxlciBzaXplcy4KKyAgRVhQRUNUX0xUKHpsaWJfY29tcHJlc3NlZC5zaXplKCksIG5vdF9jb21wcmVzc2VkLnNpemUoKSk7CisKKyAgLy8gWkxJQiBmb3JtYXQgc2hvdWxkIGRpZmZlciBmcm9tIEdaSVAgZm9ybWF0LgorICBFWFBFQ1RfVFJVRSh6bGliX2NvbXByZXNzZWQgIT0gZ3ppcF9jb21wcmVzc2VkKTsKKworICAvLyBFdmVyeXRoaW5nIHNob3VsZCBkZWNvbXByZXNzIGNvcnJlY3RseS4KKyAgRVhQRUNUX1RSVUUoVW5jb21wcmVzcyhub3RfY29tcHJlc3NlZCkgPT0gZ29sZGVuKTsKKyAgRVhQRUNUX1RSVUUoVW5jb21wcmVzcyhnemlwX2NvbXByZXNzZWQpID09IGdvbGRlbik7CisgIEVYUEVDVF9UUlVFKFVuY29tcHJlc3MoemxpYl9jb21wcmVzc2VkKSA9PSBnb2xkZW4pOworfQorCitURVNUX0YoSW9UZXN0LCBUd29TZXNzaW9uV3JpdGVHemlwKSB7CisgIC8vIFRlc3QgdGhhdCB0d28gY29uY2F0ZW5hdGVkIGd6aXAgc3RyZWFtcyBjYW4gYmUgcmVhZCBjb3JyZWN0bHkKKworICBzdGF0aWMgY29uc3QgY2hhciogc3RyQSA9ICIwMTIzNDU2Nzg5IjsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIHN0ckIgPSAiUXVpY2tCcm93bkZveCI7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIqMTAyNDsKKyAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07CisgIGNoYXIqIHRlbXBfYnVmZmVyID0gbmV3IGNoYXJbNDBdOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICBBcnJheU91dHB1dFN0cmVhbSogb3V0cHV0ID0KKyAgICAgICAgICBuZXcgQXJyYXlPdXRwdXRTdHJlYW0oYnVmZmVyLCBrQnVmZmVyU2l6ZSwga0Jsb2NrU2l6ZXNbaV0pOworICAgICAgR3ppcE91dHB1dFN0cmVhbSogZ3pvdXQgPSBuZXcgR3ppcE91dHB1dFN0cmVhbShvdXRwdXQpOworICAgICAgQ29kZWRPdXRwdXRTdHJlYW0qIGNvZGVkX291dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShnem91dCk7CisgICAgICBpbnQzMiBvdXRsZW4gPSBzdHJsZW4oc3RyQSkgKyAxOworICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDMyKG91dGxlbik7CisgICAgICBjb2RlZF9vdXRwdXQtPldyaXRlUmF3KHN0ckEsIG91dGxlbik7CisgICAgICBkZWxldGUgY29kZWRfb3V0cHV0OyAgLy8gZmx1c2gKKyAgICAgIGRlbGV0ZSBnem91dDsgIC8vIGZsdXNoCisgICAgICBpbnQ2NCBwb3MgPSBvdXRwdXQtPkJ5dGVDb3VudCgpOworICAgICAgZGVsZXRlIG91dHB1dDsKKyAgICAgIG91dHB1dCA9IG5ldyBBcnJheU91dHB1dFN0cmVhbSgKKyAgICAgICAgICBidWZmZXIgKyBwb3MsIGtCdWZmZXJTaXplIC0gcG9zLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICBnem91dCA9IG5ldyBHemlwT3V0cHV0U3RyZWFtKG91dHB1dCk7CisgICAgICBjb2RlZF9vdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0oZ3pvdXQpOworICAgICAgb3V0bGVuID0gc3RybGVuKHN0ckIpICsgMTsKKyAgICAgIGNvZGVkX291dHB1dC0+V3JpdGVWYXJpbnQzMihvdXRsZW4pOworICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVJhdyhzdHJCLCBvdXRsZW4pOworICAgICAgZGVsZXRlIGNvZGVkX291dHB1dDsgIC8vIGZsdXNoCisgICAgICBkZWxldGUgZ3pvdXQ7ICAvLyBmbHVzaAorICAgICAgaW50NjQgc2l6ZSA9IHBvcyArIG91dHB1dC0+Qnl0ZUNvdW50KCk7CisgICAgICBkZWxldGUgb3V0cHV0OworCisgICAgICBBcnJheUlucHV0U3RyZWFtKiBpbnB1dCA9CisgICAgICAgICAgbmV3IEFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLCBzaXplLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICBHemlwSW5wdXRTdHJlYW0qIGd6aW4gPSBuZXcgR3ppcElucHV0U3RyZWFtKGlucHV0KTsKKyAgICAgIENvZGVkSW5wdXRTdHJlYW0qIGNvZGVkX2lucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oZ3ppbik7CisgICAgICB1aW50MzIgaW5zaXplOworICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRWYXJpbnQzMigmaW5zaXplKSk7CisgICAgICBFWFBFQ1RfRVEoc3RybGVuKHN0ckEpICsgMSwgaW5zaXplKTsKKyAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkUmF3KHRlbXBfYnVmZmVyLCBpbnNpemUpKTsKKyAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAodGVtcF9idWZmZXIsIHN0ckEsIGluc2l6ZSkpCisgICAgICAgICAgPDwgInN0ckE9IiA8PCBzdHJBIDw8ICIgaW49IiA8PCB0ZW1wX2J1ZmZlcjsKKworICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRWYXJpbnQzMigmaW5zaXplKSk7CisgICAgICBFWFBFQ1RfRVEoc3RybGVuKHN0ckIpICsgMSwgaW5zaXplKTsKKyAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkUmF3KHRlbXBfYnVmZmVyLCBpbnNpemUpKTsKKyAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAodGVtcF9idWZmZXIsIHN0ckIsIGluc2l6ZSkpCisgICAgICAgICAgPDwgIiBvdXRfYmxvY2tfc2l6ZT0iIDw8IGtCbG9ja1NpemVzW2ldCisgICAgICAgICAgPDwgIiBpbl9ibG9ja19zaXplPSIgPDwga0Jsb2NrU2l6ZXNbal0KKyAgICAgICAgICA8PCAiIHBvcz0iIDw8IHBvcworICAgICAgICAgIDw8ICIgc2l6ZT0iIDw8IHNpemUKKyAgICAgICAgICA8PCAiIHN0ckI9IiA8PCBzdHJCIDw8ICIgaW49IiA8PCB0ZW1wX2J1ZmZlcjsKKworICAgICAgZGVsZXRlIGNvZGVkX2lucHV0OworICAgICAgZGVsZXRlIGd6aW47CisgICAgICBkZWxldGUgaW5wdXQ7CisgICAgfQorICB9CisKKyAgZGVsZXRlIFtdIHRlbXBfYnVmZmVyOworICBkZWxldGUgW10gYnVmZmVyOworfQorI2VuZGlmCisKKy8vIFRoZXJlIGlzIG5vIHN0cmluZyBpbnB1dCwgb25seSBzdHJpbmcgb3V0cHV0LiAgQWxzbywgaXQgZG9lc24ndCBzdXBwb3J0CisvLyBleHBsaWNpdCBibG9jayBzaXplcy4gIFNvLCB3ZSdsbCBvbmx5IHJ1biBvbmUgdGVzdCBhbmQgd2UnbGwgdXNlCisvLyBBcnJheUlucHV0IHRvIHJlYWQgYmFjayB0aGUgcmVzdWx0cy4KK1RFU1RfRihJb1Rlc3QsIFN0cmluZ0lvKSB7CisgIHN0cmluZyBzdHI7CisgIHsKKyAgICBTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0KCZzdHIpOworICAgIFdyaXRlU3R1ZmYoJm91dHB1dCk7CisgIH0KKyAgeworICAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoc3RyLmRhdGEoKSwgc3RyLnNpemUoKSk7CisgICAgUmVhZFN0dWZmKCZpbnB1dCk7CisgIH0KK30KKworCisvLyBUbyB0ZXN0IGZpbGVzLCB3ZSBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSwgd3JpdGUsIHJlYWQsIHRydW5jYXRlLCByZXBlYXQuCitURVNUX0YoSW9UZXN0LCBGaWxlSW8pIHsKKyAgc3RyaW5nIGZpbGVuYW1lID0gVGVzdFRlbXBEaXIoKSArICIvemVyb19jb3B5X3N0cmVhbV90ZXN0X2ZpbGUiOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICAvLyBNYWtlIGEgdGVtcG9yYXJ5IGZpbGUuCisgICAgICBpbnQgZmlsZSA9CisgICAgICAgIG9wZW4oZmlsZW5hbWUuY19zdHIoKSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwgMDc3Nyk7CisgICAgICBBU1NFUlRfR0UoZmlsZSwgMCk7CisKKyAgICAgIHsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQoZmlsZSwga0Jsb2NrU2l6ZXNbaV0pOworICAgICAgICBXcml0ZVN0dWZmKCZvdXRwdXQpOworICAgICAgICBFWFBFQ1RfRVEoMCwgb3V0cHV0LkdldEVycm5vKCkpOworICAgICAgfQorCisgICAgICAvLyBSZXdpbmQuCisgICAgICBBU1NFUlRfTkUobHNlZWsoZmlsZSwgMCwgU0VFS19TRVQpLCAob2ZmX3QpLTEpOworCisgICAgICB7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dChmaWxlLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICAgIFJlYWRTdHVmZigmaW5wdXQpOworICAgICAgICBFWFBFQ1RfRVEoMCwgaW5wdXQuR2V0RXJybm8oKSk7CisgICAgICB9CisKKyAgICAgIGNsb3NlKGZpbGUpOworICAgIH0KKyAgfQorfQorCisjaWYgSEFWRV9aTElCCitURVNUX0YoSW9UZXN0LCBHemlwRmlsZUlvKSB7CisgIHN0cmluZyBmaWxlbmFtZSA9IFRlc3RUZW1wRGlyKCkgKyAiL3plcm9fY29weV9zdHJlYW1fdGVzdF9maWxlIjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgeworICAgICAgLy8gTWFrZSBhIHRlbXBvcmFyeSBmaWxlLgorICAgICAgaW50IGZpbGUgPQorICAgICAgICBvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksIDA3NzcpOworICAgICAgQVNTRVJUX0dFKGZpbGUsIDApOworICAgICAgeworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dChmaWxlLCBrQmxvY2tTaXplc1tpXSk7CisgICAgICAgIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCk7CisgICAgICAgIFdyaXRlU3R1ZmZMYXJnZSgmZ3pvdXQpOworICAgICAgICBnem91dC5DbG9zZSgpOworICAgICAgICBvdXRwdXQuRmx1c2goKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG91dHB1dC5HZXRFcnJubygpKTsKKyAgICAgIH0KKworICAgICAgLy8gUmV3aW5kLgorICAgICAgQVNTRVJUX05FKGxzZWVrKGZpbGUsIDAsIFNFRUtfU0VUKSwgKG9mZl90KS0xKTsKKworICAgICAgeworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXQoZmlsZSwga0Jsb2NrU2l6ZXNbal0pOworICAgICAgICBHemlwSW5wdXRTdHJlYW0gZ3ppbigmaW5wdXQpOworICAgICAgICBSZWFkU3R1ZmZMYXJnZSgmZ3ppbik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBpbnB1dC5HZXRFcnJubygpKTsKKyAgICAgIH0KKworICAgICAgY2xvc2UoZmlsZSk7CisgICAgfQorICB9Cit9CisjZW5kaWYKKworLy8gTVNWQyByYWlzZXMgdmFyaW91cyBkZWJ1Z2dpbmcgZXhjZXB0aW9ucyBpZiB3ZSB0cnkgdG8gdXNlIGEgZmlsZQorLy8gZGVzY3JpcHRvciBvZiAtMSwgZGVmZWF0aW5nIG91ciB0ZXN0cyBiZWxvdy4gIFRoaXMgY2xhc3Mgd2lsbCBkaXNhYmxlCisvLyB0aGVzZSBkZWJ1ZyBhc3NlcnRpb25zIHdoaWxlIGluIHNjb3BlLgorY2xhc3MgTXN2Y0RlYnVnRGlzYWJsZXIgeworIHB1YmxpYzoKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNDAwCisgIE1zdmNEZWJ1Z0Rpc2FibGVyKCkgeworICAgIG9sZF9oYW5kbGVyXyA9IF9zZXRfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlcihNeUhhbmRsZXIpOworICAgIG9sZF9tb2RlXyA9IF9DcnRTZXRSZXBvcnRNb2RlKF9DUlRfQVNTRVJULCAwKTsKKyAgfQorICB+TXN2Y0RlYnVnRGlzYWJsZXIoKSB7CisgICAgb2xkX2hhbmRsZXJfID0gX3NldF9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyKG9sZF9oYW5kbGVyXyk7CisgICAgb2xkX21vZGVfID0gX0NydFNldFJlcG9ydE1vZGUoX0NSVF9BU1NFUlQsIG9sZF9tb2RlXyk7CisgIH0KKworICBzdGF0aWMgdm9pZCBNeUhhbmRsZXIoY29uc3Qgd2NoYXJfdCAqZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90ICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgcFJlc2VydmVkKSB7CisgICAgLy8gZG8gbm90aGluZworICB9CisKKyAgX2ludmFsaWRfcGFyYW1ldGVyX2hhbmRsZXIgb2xkX2hhbmRsZXJfOworICBpbnQgb2xkX21vZGVfOworI2Vsc2UKKyAgLy8gRHVtbXkgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdG8gZW5zdXJlIHRoYXQgR0NDIGRvZXNuJ3QgY29tcGxhaW4KKyAgLy8gdGhhdCBkZWJ1Z19kaXNhYmxlciBpcyBhbiB1bnVzZWQgdmFyaWFibGUuCisgIE1zdmNEZWJ1Z0Rpc2FibGVyKCkge30KKyAgfk1zdmNEZWJ1Z0Rpc2FibGVyKCkge30KKyNlbmRpZgorfTsKKworLy8gVGVzdCB0aGF0IEZpbGVJbnB1dFN0cmVhbXMgcmVwb3J0IGVycm9ycyBjb3JyZWN0bHkuCitURVNUX0YoSW9UZXN0LCBGaWxlUmVhZEVycm9yKSB7CisgIE1zdmNEZWJ1Z0Rpc2FibGVyIGRlYnVnX2Rpc2FibGVyOworCisgIC8vIC0xID0gaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IuCisgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dCgtMSk7CisKKyAgY29uc3Qgdm9pZCogYnVmZmVyOworICBpbnQgc2l6ZTsKKyAgRVhQRUNUX0ZBTFNFKGlucHV0Lk5leHQoJmJ1ZmZlciwgJnNpemUpKTsKKyAgRVhQRUNUX0VRKEVCQURGLCBpbnB1dC5HZXRFcnJubygpKTsKK30KKworLy8gVGVzdCB0aGF0IEZpbGVPdXRwdXRTdHJlYW1zIHJlcG9ydCBlcnJvcnMgY29ycmVjdGx5LgorVEVTVF9GKElvVGVzdCwgRmlsZVdyaXRlRXJyb3IpIHsKKyAgTXN2Y0RlYnVnRGlzYWJsZXIgZGVidWdfZGlzYWJsZXI7CisKKyAgLy8gLTEgPSBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvci4KKyAgRmlsZU91dHB1dFN0cmVhbSBpbnB1dCgtMSk7CisKKyAgdm9pZCogYnVmZmVyOworICBpbnQgc2l6ZTsKKworICAvLyBUaGUgZmlyc3QgY2FsbCB0byBOZXh0KCkgc3VjY2VlZHMgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8KKyAgLy8gd3JpdGUgeWV0LgorICBFWFBFQ1RfVFJVRShpbnB1dC5OZXh0KCZidWZmZXIsICZzaXplKSk7CisKKyAgLy8gU2Vjb25kIGNhbGwgZmFpbHMuCisgIEVYUEVDVF9GQUxTRShpbnB1dC5OZXh0KCZidWZmZXIsICZzaXplKSk7CisKKyAgRVhQRUNUX0VRKEVCQURGLCBpbnB1dC5HZXRFcnJubygpKTsKK30KKworLy8gUGlwZXMgYXJlIG5vdCBzZWVrYWJsZSwgc28gRmlsZXtJbnB1dCxPdXRwdXR9U3RyZWFtIGVuZHMgdXAgZG9pbmcgc29tZQorLy8gZGlmZmVyZW50IHRoaW5ncyB0byBoYW5kbGUgdGhlbS4gIFdlJ2xsIHRlc3QgYnkgd3JpdGluZyB0byBhIHBpcGUgYW5kCisvLyByZWFkaW5nIGJhY2sgZnJvbSBpdC4KK1RFU1RfRihJb1Rlc3QsIFBpcGVJbykgeworICBpbnQgZmlsZXNbMl07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKKyAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHBpcGUgZWFjaCB0aW1lIGJlY2F1c2UgUmVhZFN0dWZmKCkgZXhwZWN0cworICAgICAgLy8gdG8gc2VlIEVPRiBhdCB0aGUgZW5kLgorICAgICAgQVNTRVJUX0VRKHBpcGUoZmlsZXMpLCAwKTsKKworICAgICAgeworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dChmaWxlc1sxXSwga0Jsb2NrU2l6ZXNbaV0pOworICAgICAgICBXcml0ZVN0dWZmKCZvdXRwdXQpOworICAgICAgICBFWFBFQ1RfRVEoMCwgb3V0cHV0LkdldEVycm5vKCkpOworICAgICAgfQorICAgICAgY2xvc2UoZmlsZXNbMV0pOyAgLy8gU2VuZCBFT0YuCisKKyAgICAgIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0KGZpbGVzWzBdLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICAgIFJlYWRTdHVmZigmaW5wdXQpOworICAgICAgICBFWFBFQ1RfRVEoMCwgaW5wdXQuR2V0RXJybm8oKSk7CisgICAgICB9CisgICAgICBjbG9zZShmaWxlc1swXSk7CisgICAgfQorICB9Cit9CisKKy8vIFRlc3QgdXNpbmcgQysrIGlvc3RyZWFtcy4KK1RFU1RfRihJb1Rlc3QsIElvc3RyZWFtSW8pIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKKyAgICAgIHsKKyAgICAgICAgc3RyaW5nc3RyZWFtIHN0cmVhbTsKKworICAgICAgICB7CisgICAgICAgICAgT3N0cmVhbU91dHB1dFN0cmVhbSBvdXRwdXQoJnN0cmVhbSwga0Jsb2NrU2l6ZXNbaV0pOworICAgICAgICAgIFdyaXRlU3R1ZmYoJm91dHB1dCk7CisgICAgICAgICAgRVhQRUNUX0ZBTFNFKHN0cmVhbS5mYWlsKCkpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgIElzdHJlYW1JbnB1dFN0cmVhbSBpbnB1dCgmc3RyZWFtLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICAgICAgUmVhZFN0dWZmKCZpbnB1dCk7CisgICAgICAgICAgRVhQRUNUX1RSVUUoc3RyZWFtLmVvZigpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB7CisgICAgICAgIHN0cmluZ3N0cmVhbSBzdHJlYW07CisKKyAgICAgICAgeworICAgICAgICAgIE9zdHJlYW1PdXRwdXRTdHJlYW0gb3V0cHV0KCZzdHJlYW0sIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgICAgICBXcml0ZVN0dWZmTGFyZ2UoJm91dHB1dCk7CisgICAgICAgICAgRVhQRUNUX0ZBTFNFKHN0cmVhbS5mYWlsKCkpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgIElzdHJlYW1JbnB1dFN0cmVhbSBpbnB1dCgmc3RyZWFtLCBrQmxvY2tTaXplc1tqXSk7CisgICAgICAgICAgUmVhZFN0dWZmTGFyZ2UoJmlucHV0KTsKKyAgICAgICAgICBFWFBFQ1RfVFJVRShzdHJlYW0uZW9mKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIFRvIHRlc3QgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtLCB3ZSBjcmVhdGUgc2V2ZXJhbCBBcnJheUlucHV0U3RyZWFtcworLy8gY292ZXJpbmcgYSBidWZmZXIgYW5kIHRoZW4gY29uY2F0ZW5hdGUgdGhlbS4KK1RFU1RfRihJb1Rlc3QsIENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbSkgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyNTY7CisgIHVpbnQ4IGJ1ZmZlcltrQnVmZmVyU2l6ZV07CisKKyAgLy8gRmlsbCB0aGUgYnVmZmVyLgorICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSk7CisgIFdyaXRlU3R1ZmYoJm91dHB1dCk7CisKKyAgLy8gTm93IHNwbGl0IGl0IHVwIGludG8gbXVsdGlwbGUgc3RyZWFtcyBvZiB2YXJ5aW5nIHNpemVzLgorICBBU1NFUlRfRVEoNjgsIG91dHB1dC5CeXRlQ291bnQoKSk7ICAvLyBUZXN0IGRlcGVuZHMgb24gdGhpcy4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dDEoYnVmZmVyICAgICAsIDEyKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dDIoYnVmZmVyICsgMTIsICA3KTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dDMoYnVmZmVyICsgMTksICA2KTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dDQoYnVmZmVyICsgMjUsIDE1KTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dDUoYnVmZmVyICsgNDAsICAwKTsKKyAgLy8gTm90ZTogIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSBzdHJlYW0gYm91bmRhcnkgc29tZXdoZXJlIGJldHdlZW4KKyAgLy8gYnl0ZXMgNDIgYW5kIDYyLCB3aGljaCBpcyB0aGUgcmFuZ2UgdGhhdCBpdCBTa2lwKCllZCBieSBSZWFkU3R1ZmYoKS4gIFRoaXMKKyAgLy8gdGVzdHMgdGhhdCBhIGJ1ZyB0aGF0IGV4aXN0ZWQgaW4gdGhlIG9yaWdpbmFsIGNvZGUgZm9yIFNraXAoKSBpcyBmaXhlZC4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dDYoYnVmZmVyICsgNDAsIDEwKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dDcoYnVmZmVyICsgNTAsIDE4KTsgIC8vIFRvdGFsID0gNjggYnl0ZXMuCisKKyAgWmVyb0NvcHlJbnB1dFN0cmVhbSogc3RyZWFtc1tdID0KKyAgICB7JmlucHV0MSwgJmlucHV0MiwgJmlucHV0MywgJmlucHV0NCwgJmlucHV0NSwgJmlucHV0NiwgJmlucHV0N307CisKKyAgLy8gQ3JlYXRlIHRoZSBjb25jYXRlbmF0aW5nIHN0cmVhbSBhbmQgcmVhZC4KKyAgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtIGlucHV0KHN0cmVhbXMsIEdPT0dMRV9BUlJBWVNJWkUoc3RyZWFtcykpOworICBSZWFkU3R1ZmYoJmlucHV0KTsKK30KKworLy8gVG8gdGVzdCBMaW1pdGluZ0lucHV0U3RyZWFtLCB3ZSB3cml0ZSBvdXIgZ29sZGVuIHRleHQgdG8gYSBidWZmZXIsIHRoZW4KKy8vIGNyZWF0ZSBhbiBBcnJheUlucHV0U3RyZWFtIHRoYXQgY29udGFpbnMgdGhlIHdob2xlIGJ1ZmZlciAobm90IGp1c3QgdGhlCisvLyBieXRlcyB3cml0dGVuKSwgdGhlbiB1c2UgYSBMaW1pdGluZ0lucHV0U3RyZWFtIHRvIGxpbWl0IGl0IGp1c3QgdG8gdGhlCisvLyBieXRlcyB3cml0dGVuLgorVEVTVF9GKElvVGVzdCwgTGltaXRpbmdJbnB1dFN0cmVhbSkgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyNTY7CisgIHVpbnQ4IGJ1ZmZlcltrQnVmZmVyU2l6ZV07CisKKyAgLy8gRmlsbCB0aGUgYnVmZmVyLgorICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSk7CisgIFdyaXRlU3R1ZmYoJm91dHB1dCk7CisKKyAgLy8gU2V0IHVwIGlucHV0LgorICBBcnJheUlucHV0U3RyZWFtIGFycmF5X2lucHV0KGJ1ZmZlciwga0J1ZmZlclNpemUpOworICBMaW1pdGluZ0lucHV0U3RyZWFtIGlucHV0KCZhcnJheV9pbnB1dCwgb3V0cHV0LkJ5dGVDb3VudCgpKTsKKworICBSZWFkU3R1ZmYoJmlucHV0KTsKK30KKworLy8gQ2hlY2sgdGhhdCBhIHplcm8tc2l6ZSBhcnJheSBkb2Vzbid0IGNvbmZ1c2UgdGhlIGNvZGUuCitURVNUKFplcm9TaXplQXJyYXksIElucHV0KSB7CisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoTlVMTCwgMCk7CisgIGNvbnN0IHZvaWQqIGRhdGE7CisgIGludCBzaXplOworICBFWFBFQ1RfRkFMU0UoaW5wdXQuTmV4dCgmZGF0YSwgJnNpemUpKTsKK30KKworVEVTVChaZXJvU2l6ZUFycmF5LCBPdXRwdXQpIHsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KE5VTEwsIDApOworICB2b2lkKiBkYXRhOworICBpbnQgc2l6ZTsKKyAgRVhQRUNUX0ZBTFNFKG91dHB1dC5OZXh0KCZkYXRhLCAmc2l6ZSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVlYzNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDExMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIHN0cmluZyBkYXRhLCBwYWNrZWRfZGF0YTsKKworICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTIsIG1lc3NhZ2UzOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICAgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UpOworICAgIGRhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgbWVzc2FnZTMuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMyk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpNb2RpZnlSZXBlYXRlZEZpZWxkcygmbWVzc2FnZSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UpOworICAgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOworICB9CisKKyAgeworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTIsIG1lc3NhZ2UzOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgICAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZSk7CisgICAgc3RyaW5nIGV4dGVuc2lvbnNfZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBHT09HTEVfQ0hFQ0soZXh0ZW5zaW9uc19kYXRhID09IGRhdGEpOworICAgIG1lc3NhZ2UzLlBhcnNlRnJvbVN0cmluZyhleHRlbnNpb25zX2RhdGEpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMyk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQobWVzc2FnZSk7CisgICAgbWVzc2FnZS5DbGVhcigpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworICB9CisKKyAgeworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlIG1lc3NhZ2UsIG1lc3NhZ2UyLCBtZXNzYWdlMzsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZENsZWFyKG1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6U2V0UGFja2VkRmllbGRzKCZtZXNzYWdlKTsKKyAgICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlKTsKKyAgICBwYWNrZWRfZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBtZXNzYWdlMy5QYXJzZUZyb21TdHJpbmcocGFja2VkX2RhdGEpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRmllbGRzU2V0KG1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMyk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpNb2RpZnlQYWNrZWRGaWVsZHMoJm1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRmllbGRzTW9kaWZpZWQobWVzc2FnZSk7CisgICAgbWVzc2FnZS5DbGVhcigpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkQ2xlYXIobWVzc2FnZSk7CisgIH0KKworICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBtZXNzYWdlLCBtZXNzYWdlMiwgbWVzc2FnZTM7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpTZXRQYWNrZWRFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlKTsKKyAgICBzdHJpbmcgcGFja2VkX2V4dGVuc2lvbnNfZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBHT09HTEVfQ0hFQ0socGFja2VkX2V4dGVuc2lvbnNfZGF0YSA9PSBwYWNrZWRfZGF0YSk7CisgICAgbWVzc2FnZTMuUGFyc2VGcm9tU3RyaW5nKHBhY2tlZF9leHRlbnNpb25zX2RhdGEpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlMyk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpNb2RpZnlQYWNrZWRFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNNb2RpZmllZChtZXNzYWdlKTsKKyAgICBtZXNzYWdlLkNsZWFyKCk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7CisgIH0KKworICBjb3V0IDw8ICJQQVNTIiA8PCBlbmRsOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTY4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjCkBAIC0wLDAgKzEsMzE4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Cit1c2luZyBpbnRlcm5hbDo6UmVmbGVjdGlvbk9wczsKKworTWVzc2FnZTo6fk1lc3NhZ2UoKSB7fQorCit2b2lkIE1lc3NhZ2U6Ok1lcmdlRnJvbShjb25zdCBNZXNzYWdlJiBmcm9tKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBHZXREZXNjcmlwdG9yKCk7CisgIEdPT0dMRV9DSEVDS19FUShmcm9tLkdldERlc2NyaXB0b3IoKSwgZGVzY3JpcHRvcikKKyAgICA8PCAiOiBUcmllZCB0byBtZXJnZSBmcm9tIGEgbWVzc2FnZSB3aXRoIGEgZGlmZmVyZW50IHR5cGUuICAiCisgICAgICAgInRvOiAiIDw8IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpIDw8ICIsICIKKyAgICAgICAiZnJvbToiIDw8IGZyb20uR2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKKyAgUmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Cit9CisKK3ZvaWQgTWVzc2FnZTo6Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2VMaXRlJiBvdGhlcikgeworICBNZXJnZUZyb20oKmRvd25fY2FzdDxjb25zdCBNZXNzYWdlKj4oJm90aGVyKSk7Cit9CisKK3ZvaWQgTWVzc2FnZTo6Q29weUZyb20oY29uc3QgTWVzc2FnZSYgZnJvbSkgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gR2V0RGVzY3JpcHRvcigpOworICBHT09HTEVfQ0hFQ0tfRVEoZnJvbS5HZXREZXNjcmlwdG9yKCksIGRlc2NyaXB0b3IpCisgICAgPDwgIjogVHJpZWQgdG8gY29weSBmcm9tIGEgbWVzc2FnZSB3aXRoIGEgZGlmZmVyZW50IHR5cGUuIgorICAgICAgICJ0bzogIiA8PCBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSA8PCAiLCAiCisgICAgICAgImZyb206IiA8PCBmcm9tLkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCk7CisgIFJlZmxlY3Rpb25PcHM6OkNvcHkoZnJvbSwgdGhpcyk7Cit9CisKK3N0cmluZyBNZXNzYWdlOjpHZXRUeXBlTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCk7Cit9CisKK3ZvaWQgTWVzc2FnZTo6Q2xlYXIoKSB7CisgIFJlZmxlY3Rpb25PcHM6OkNsZWFyKHRoaXMpOworfQorCitib29sIE1lc3NhZ2U6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisgIHJldHVybiBSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKCp0aGlzKTsKK30KKwordm9pZCBNZXNzYWdlOjpGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnModmVjdG9yPHN0cmluZz4qIGVycm9ycykgY29uc3QgeworICByZXR1cm4gUmVmbGVjdGlvbk9wczo6RmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCp0aGlzLCAiIiwgZXJyb3JzKTsKK30KKworc3RyaW5nIE1lc3NhZ2U6OkluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSBjb25zdCB7CisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKyAgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCZlcnJvcnMpOworICByZXR1cm4gSm9pblN0cmluZ3MoZXJyb3JzLCAiLCAiKTsKK30KKwordm9pZCBNZXNzYWdlOjpDaGVja0luaXRpYWxpemVkKCkgY29uc3QgeworICBHT09HTEVfQ0hFQ0soSXNJbml0aWFsaXplZCgpKQorICAgIDw8ICJNZXNzYWdlIG9mIHR5cGUgXCIiIDw8IEdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkKKyAgICA8PCAiXCIgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICIgPDwgSW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpOworfQorCit2b2lkIE1lc3NhZ2U6OkRpc2NhcmRVbmtub3duRmllbGRzKCkgeworICByZXR1cm4gUmVmbGVjdGlvbk9wczo6RGlzY2FyZFVua25vd25GaWVsZHModGhpcyk7Cit9CisKK2Jvb2wgTWVzc2FnZTo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICByZXR1cm4gV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoaW5wdXQsIHRoaXMpOworfQorCitib29sIE1lc3NhZ2U6OlBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpIHsKKyAgaW86OkZpbGVJbnB1dFN0cmVhbSBpbnB1dChmaWxlX2Rlc2NyaXB0b3IpOworICByZXR1cm4gUGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oJmlucHV0KSAmJiBpbnB1dC5HZXRFcnJubygpID09IDA7Cit9CisKK2Jvb2wgTWVzc2FnZTo6UGFyc2VQYXJ0aWFsRnJvbUZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpIHsKKyAgaW86OkZpbGVJbnB1dFN0cmVhbSBpbnB1dChmaWxlX2Rlc2NyaXB0b3IpOworICByZXR1cm4gUGFyc2VQYXJ0aWFsRnJvbVplcm9Db3B5U3RyZWFtKCZpbnB1dCkgJiYgaW5wdXQuR2V0RXJybm8oKSA9PSAwOworfQorCitib29sIE1lc3NhZ2U6OlBhcnNlRnJvbUlzdHJlYW0oaXN0cmVhbSogaW5wdXQpIHsKKyAgaW86OklzdHJlYW1JbnB1dFN0cmVhbSB6ZXJvX2NvcHlfaW5wdXQoaW5wdXQpOworICByZXR1cm4gUGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oJnplcm9fY29weV9pbnB1dCkgJiYgaW5wdXQtPmVvZigpOworfQorCitib29sIE1lc3NhZ2U6OlBhcnNlUGFydGlhbEZyb21Jc3RyZWFtKGlzdHJlYW0qIGlucHV0KSB7CisgIGlvOjpJc3RyZWFtSW5wdXRTdHJlYW0gemVyb19jb3B5X2lucHV0KGlucHV0KTsKKyAgcmV0dXJuIFBhcnNlUGFydGlhbEZyb21aZXJvQ29weVN0cmVhbSgmemVyb19jb3B5X2lucHV0KSAmJiBpbnB1dC0+ZW9mKCk7Cit9CisKKwordm9pZCBNZXNzYWdlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCp0aGlzLCBHZXRDYWNoZWRTaXplKCksIG91dHB1dCk7Cit9CisKK2ludCBNZXNzYWdlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgaW50IHNpemUgPSBXaXJlRm9ybWF0OjpCeXRlU2l6ZSgqdGhpcyk7CisgIFNldENhY2hlZFNpemUoc2l6ZSk7CisgIHJldHVybiBzaXplOworfQorCit2b2lkIE1lc3NhZ2U6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk1lc3NhZ2UgY2xhc3MgXCIiIDw8IEdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIgaW1wbGVtZW50cyBuZWl0aGVyIFNldENhY2hlZFNpemUoKSBub3IgQnl0ZVNpemUoKS4gICIKKyAgICAgICAgICAgICAgICAiTXVzdCBpbXBsZW1lbnQgb25lIG9yIHRoZSBvdGhlci4iOworfQorCitpbnQgTWVzc2FnZTo6U3BhY2VVc2VkKCkgY29uc3QgeworICByZXR1cm4gR2V0UmVmbGVjdGlvbigpLT5TcGFjZVVzZWQoKnRoaXMpOworfQorCitib29sIE1lc3NhZ2U6OlNlcmlhbGl6ZVRvRmlsZURlc2NyaXB0b3IoaW50IGZpbGVfZGVzY3JpcHRvcikgY29uc3QgeworICBpbzo6RmlsZU91dHB1dFN0cmVhbSBvdXRwdXQoZmlsZV9kZXNjcmlwdG9yKTsKKyAgcmV0dXJuIFNlcmlhbGl6ZVRvWmVyb0NvcHlTdHJlYW0oJm91dHB1dCk7Cit9CisKK2Jvb2wgTWVzc2FnZTo6U2VyaWFsaXplUGFydGlhbFRvRmlsZURlc2NyaXB0b3IoaW50IGZpbGVfZGVzY3JpcHRvcikgY29uc3QgeworICBpbzo6RmlsZU91dHB1dFN0cmVhbSBvdXRwdXQoZmlsZV9kZXNjcmlwdG9yKTsKKyAgcmV0dXJuIFNlcmlhbGl6ZVBhcnRpYWxUb1plcm9Db3B5U3RyZWFtKCZvdXRwdXQpOworfQorCitib29sIE1lc3NhZ2U6OlNlcmlhbGl6ZVRvT3N0cmVhbShvc3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgeworICAgIGlvOjpPc3RyZWFtT3V0cHV0U3RyZWFtIHplcm9fY29weV9vdXRwdXQob3V0cHV0KTsKKyAgICBpZiAoIVNlcmlhbGl6ZVRvWmVyb0NvcHlTdHJlYW0oJnplcm9fY29weV9vdXRwdXQpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIG91dHB1dC0+Z29vZCgpOworfQorCitib29sIE1lc3NhZ2U6OlNlcmlhbGl6ZVBhcnRpYWxUb09zdHJlYW0ob3N0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIGlvOjpPc3RyZWFtT3V0cHV0U3RyZWFtIHplcm9fY29weV9vdXRwdXQob3V0cHV0KTsKKyAgcmV0dXJuIFNlcmlhbGl6ZVBhcnRpYWxUb1plcm9Db3B5U3RyZWFtKCZ6ZXJvX2NvcHlfb3V0cHV0KTsKK30KKworCitSZWZsZWN0aW9uOjp+UmVmbGVjdGlvbigpIHt9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE1lc3NhZ2VGYWN0b3J5CisKK01lc3NhZ2VGYWN0b3J5Ojp+TWVzc2FnZUZhY3RvcnkoKSB7fQorCituYW1lc3BhY2UgeworCitjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSA6IHB1YmxpYyBNZXNzYWdlRmFjdG9yeSB7CisgcHVibGljOgorICBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSgpOworICB+R2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkoKTsKKworICBzdGF0aWMgR2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkqIHNpbmdsZXRvbigpOworCisgIHR5cGVkZWYgdm9pZCBSZWdpc3RyYXRpb25GdW5jKGNvbnN0IHN0cmluZyYpOworICB2b2lkIFJlZ2lzdGVyRmlsZShjb25zdCBjaGFyKiBmaWxlLCBSZWdpc3RyYXRpb25GdW5jKiByZWdpc3RyYXRpb25fZnVuYyk7CisgIHZvaWQgUmVnaXN0ZXJUeXBlKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZSk7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlRmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgY29uc3QgTWVzc2FnZSogR2V0UHJvdG90eXBlKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpOworCisgcHJpdmF0ZToKKyAgLy8gT25seSB3cml0dGVuIGF0IHN0YXRpYyBpbml0IHRpbWUsIHNvIGRvZXMgbm90IHJlcXVpcmUgbG9ja2luZy4KKyAgaGFzaF9tYXA8Y29uc3QgY2hhciosIFJlZ2lzdHJhdGlvbkZ1bmMqLAorICAgICAgICAgICBoYXNoPGNvbnN0IGNoYXIqPiwgc3RyZXE+IGZpbGVfbWFwXzsKKworICAvLyBJbml0aWFsaXplZCBsYXppbHksIHNvIHJlcXVpcmVzIGxvY2tpbmcuCisgIE11dGV4IG11dGV4XzsKKyAgaGFzaF9tYXA8Y29uc3QgRGVzY3JpcHRvciosIGNvbnN0IE1lc3NhZ2UqPiB0eXBlX21hcF87Cit9OworCitHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSogZ2VuZXJhdGVkX21lc3NhZ2VfZmFjdG9yeV8gPSBOVUxMOworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShnZW5lcmF0ZWRfbWVzc2FnZV9mYWN0b3J5X29uY2VfaW5pdF8pOworCit2b2lkIFNodXRkb3duR2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkoKSB7CisgIGRlbGV0ZSBnZW5lcmF0ZWRfbWVzc2FnZV9mYWN0b3J5XzsKK30KKwordm9pZCBJbml0R2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkoKSB7CisgIGdlbmVyYXRlZF9tZXNzYWdlX2ZhY3RvcnlfID0gbmV3IEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OworICBpbnRlcm5hbDo6T25TaHV0ZG93bigmU2h1dGRvd25HZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSk7Cit9CisKK0dlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSgpIHt9CitHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6fkdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KCkge30KKworR2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkqIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpzaW5nbGV0b24oKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJmdlbmVyYXRlZF9tZXNzYWdlX2ZhY3Rvcnlfb25jZV9pbml0XywKKyAgICAgICAgICAgICAgICAgJkluaXRHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSk7CisgIHJldHVybiBnZW5lcmF0ZWRfbWVzc2FnZV9mYWN0b3J5XzsKK30KKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6UmVnaXN0ZXJGaWxlKAorICAgIGNvbnN0IGNoYXIqIGZpbGUsIFJlZ2lzdHJhdGlvbkZ1bmMqIHJlZ2lzdHJhdGlvbl9mdW5jKSB7CisgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KCZmaWxlX21hcF8sIGZpbGUsIHJlZ2lzdHJhdGlvbl9mdW5jKSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJGaWxlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZDogIiA8PCBmaWxlOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVkTWVzc2FnZUZhY3Rvcnk6OlJlZ2lzdGVyVHlwZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZSkgeworICBHT09HTEVfRENIRUNLX0VRKGRlc2NyaXB0b3ItPmZpbGUoKS0+cG9vbCgpLCBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSkKKyAgICA8PCAiVHJpZWQgdG8gcmVnaXN0ZXIgYSBub24tZ2VuZXJhdGVkIHR5cGUgd2l0aCB0aGUgZ2VuZXJhdGVkICIKKyAgICAgICAidHlwZSByZWdpc3RyeS4iOworCisgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgYSBmaWxlIHJlZ2lzdHJhdGlvbgorICAvLyBmdW5jdGlvbiBkdXJpbmcgR2V0UHJvdG90eXBlKCksIGluIHdoaWNoIGNhc2Ugd2UgYWxyZWFkeSBoYXZlIGxvY2tlZAorICAvLyB0aGUgbXV0ZXguCisgIG11dGV4Xy5Bc3NlcnRIZWxkKCk7CisgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KCZ0eXBlX21hcF8sIGRlc2NyaXB0b3IsIHByb3RvdHlwZSkpIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIlR5cGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkOiAiIDw8IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpOworICB9Cit9CisKK2NvbnN0IE1lc3NhZ2UqIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpHZXRQcm90b3R5cGUoY29uc3QgRGVzY3JpcHRvciogdHlwZSkgeworICB7CisgICAgUmVhZGVyTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgICAgY29uc3QgTWVzc2FnZSogcmVzdWx0ID0gRmluZFB0ck9yTnVsbCh0eXBlX21hcF8sIHR5cGUpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIElmIHRoZSB0eXBlIGlzIG5vdCBpbiB0aGUgZ2VuZXJhdGVkIHBvb2wsIHRoZW4gd2UgY2FuJ3QgcG9zc2libHkgaGFuZGxlCisgIC8vIGl0LgorICBpZiAodHlwZS0+ZmlsZSgpLT5wb29sKCkgIT0gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkpIHJldHVybiBOVUxMOworCisgIC8vIEFwcGFyZW50bHkgdGhlIGZpbGUgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZCB5ZXQuICBMZXQncyBkbyB0aGF0IG5vdy4KKyAgUmVnaXN0cmF0aW9uRnVuYyogcmVnaXN0cmF0aW9uX2Z1bmMgPQorICAgICAgRmluZFB0ck9yTnVsbChmaWxlX21hcF8sIHR5cGUtPmZpbGUoKS0+bmFtZSgpLmNfc3RyKCkpOworICBpZiAocmVnaXN0cmF0aW9uX2Z1bmMgPT0gTlVMTCkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiRmlsZSBhcHBlYXJzIHRvIGJlIGluIGdlbmVyYXRlZCBwb29sIGJ1dCB3YXNuJ3QgIgorICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkOiAiIDw8IHR5cGUtPmZpbGUoKS0+bmFtZSgpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgV3JpdGVyTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisKKyAgLy8gQ2hlY2sgaWYgYW5vdGhlciB0aHJlYWQgcHJlZW1wdGVkIHVzLgorICBjb25zdCBNZXNzYWdlKiByZXN1bHQgPSBGaW5kUHRyT3JOdWxsKHR5cGVfbWFwXywgdHlwZSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIC8vIE5vcGUuICBPSywgcmVnaXN0ZXIgZXZlcnl0aGluZy4KKyAgICByZWdpc3RyYXRpb25fZnVuYyh0eXBlLT5maWxlKCktPm5hbWUoKSk7CisgICAgLy8gU2hvdWxkIGJlIGhlcmUgbm93LgorICAgIHJlc3VsdCA9IEZpbmRQdHJPck51bGwodHlwZV9tYXBfLCB0eXBlKTsKKyAgfQorCisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiVHlwZSBhcHBlYXJzIHRvIGJlIGluIGdlbmVyYXRlZCBwb29sIGJ1dCB3YXNuJ3QgIgorICAgICAgICAgICAgICAgIDw8ICJyZWdpc3RlcmVkOiAiIDw8IHR5cGUtPmZ1bGxfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK01lc3NhZ2VGYWN0b3J5KiBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSB7CisgIHJldHVybiBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6c2luZ2xldG9uKCk7Cit9CisKK3ZvaWQgTWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRGaWxlKAorICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCB2b2lkICgqcmVnaXN0ZXJfbWVzc2FnZXMpKGNvbnN0IHN0cmluZyYpKSB7CisgIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpzaW5nbGV0b24oKS0+UmVnaXN0ZXJGaWxlKGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9tZXNzYWdlcyk7Cit9CisKK3ZvaWQgTWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZSkgeworICBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6c2luZ2xldG9uKCktPlJlZ2lzdGVyVHlwZShkZXNjcmlwdG9yLCBwcm90b3R5cGUpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYmM2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmgKQEAgLTAsMCArMSw2OTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIERlZmluZXMgTWVzc2FnZSwgdGhlIGFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBub24tbGl0ZQorLy8gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3RzLiAgQWx0aG91Z2ggaXQncyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdGhpcworLy8gaW50ZXJmYWNlIG1hbnVhbGx5LCBtb3N0IHVzZXJzIHdpbGwgdXNlIHRoZSBwcm90b2NvbCBjb21waWxlciB0bworLy8gZ2VuZXJhdGUgaW1wbGVtZW50YXRpb25zLgorLy8KKy8vIEV4YW1wbGUgdXNhZ2U6CisvLworLy8gU2F5IHlvdSBoYXZlIGEgbWVzc2FnZSBkZWZpbmVkIGFzOgorLy8KKy8vICAgbWVzc2FnZSBGb28geworLy8gICAgIG9wdGlvbmFsIHN0cmluZyB0ZXh0ID0gMTsKKy8vICAgICByZXBlYXRlZCBpbnQzMiBudW1iZXJzID0gMjsKKy8vICAgfQorLy8KKy8vIFRoZW4sIGlmIHlvdSB1c2VkIHRoZSBwcm90b2NvbCBjb21waWxlciB0byBnZW5lcmF0ZSBhIGNsYXNzIGZyb20gdGhlIGFib3ZlCisvLyBkZWZpbml0aW9uLCB5b3UgY291bGQgdXNlIGl0IGxpa2Ugc286CisvLworLy8gICBzdHJpbmcgZGF0YTsgIC8vIFdpbGwgc3RvcmUgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UuCisvLworLy8gICB7CisvLyAgICAgLy8gQ3JlYXRlIGEgbWVzc2FnZSBhbmQgc2VyaWFsaXplIGl0LgorLy8gICAgIEZvbyBmb287CisvLyAgICAgZm9vLnNldF90ZXh0KCJIZWxsbyBXb3JsZCEiKTsKKy8vICAgICBmb28uYWRkX251bWJlcnMoMSk7CisvLyAgICAgZm9vLmFkZF9udW1iZXJzKDUpOworLy8gICAgIGZvby5hZGRfbnVtYmVycyg0Mik7CisvLworLy8gICAgIGZvby5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisvLyAgIH0KKy8vCisvLyAgIHsKKy8vICAgICAvLyBQYXJzZSB0aGUgc2VyaWFsaXplZCBtZXNzYWdlIGFuZCBjaGVjayB0aGF0IGl0IGNvbnRhaW5zIHRoZQorLy8gICAgIC8vIGNvcnJlY3QgZGF0YS4KKy8vICAgICBGb28gZm9vOworLy8gICAgIGZvby5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisvLworLy8gICAgIGFzc2VydChmb28udGV4dCgpID09ICJIZWxsbyBXb3JsZCEiKTsKKy8vICAgICBhc3NlcnQoZm9vLm51bWJlcnNfc2l6ZSgpID09IDMpOworLy8gICAgIGFzc2VydChmb28ubnVtYmVycygwKSA9PSAxKTsKKy8vICAgICBhc3NlcnQoZm9vLm51bWJlcnMoMSkgPT0gNSk7CisvLyAgICAgYXNzZXJ0KGZvby5udW1iZXJzKDIpID09IDQyKTsKKy8vICAgfQorLy8KKy8vICAgeworLy8gICAgIC8vIFNhbWUgYXMgdGhlIGxhc3QgYmxvY2ssIGJ1dCBkbyBpdCBkeW5hbWljYWxseSB2aWEgdGhlIE1lc3NhZ2UKKy8vICAgICAvLyByZWZsZWN0aW9uIGludGVyZmFjZS4KKy8vICAgICBNZXNzYWdlKiBmb28gPSBuZXcgRm9vOworLy8gICAgIERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBmb28tPkdldERlc2NyaXB0b3IoKTsKKy8vCisvLyAgICAgLy8gR2V0IHRoZSBkZXNjcmlwdG9ycyBmb3IgdGhlIGZpZWxkcyB3ZSdyZSBpbnRlcmVzdGVkIGluIGFuZCB2ZXJpZnkKKy8vICAgICAvLyB0aGVpciB0eXBlcy4KKy8vICAgICBGaWVsZERlc2NyaXB0b3IqIHRleHRfZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoInRleHQiKTsKKy8vICAgICBhc3NlcnQodGV4dF9maWVsZCAhPSBOVUxMKTsKKy8vICAgICBhc3NlcnQodGV4dF9maWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpOworLy8gICAgIGFzc2VydCh0ZXh0X2ZpZWxkLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9PUFRJT05BTCk7CisvLyAgICAgRmllbGREZXNjcmlwdG9yKiBudW1iZXJzX2ZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJudW1iZXJzIik7CisvLyAgICAgYXNzZXJ0KG51bWJlcnNfZmllbGQgIT0gTlVMTCk7CisvLyAgICAgYXNzZXJ0KG51bWJlcnNfZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzIpOworLy8gICAgIGFzc2VydChudW1iZXJzX2ZpZWxkLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9SRVBFQVRFRCk7CisvLworLy8gICAgIC8vIFBhcnNlIHRoZSBtZXNzYWdlLgorLy8gICAgIGZvby0+UGFyc2VGcm9tU3RyaW5nKGRhdGEpOworLy8KKy8vICAgICAvLyBVc2UgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlIHRvIGV4YW1pbmUgdGhlIGNvbnRlbnRzLgorLy8gICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBmb28tPkdldFJlZmxlY3Rpb24oKTsKKy8vICAgICBhc3NlcnQocmVmbGVjdGlvbi0+R2V0U3RyaW5nKGZvbywgdGV4dF9maWVsZCkgPT0gIkhlbGxvIFdvcmxkISIpOworLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5GaWVsZFNpemUoZm9vLCBudW1iZXJzX2ZpZWxkKSA9PSAzKTsKKy8vICAgICBhc3NlcnQocmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMihmb28sIG51bWJlcnNfZmllbGQsIDApID09IDEpOworLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKGZvbywgbnVtYmVyc19maWVsZCwgMSkgPT0gNSk7CisvLyAgICAgYXNzZXJ0KHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoZm9vLCBudW1iZXJzX2ZpZWxkLCAyKSA9PSA0Mik7CisvLworLy8gICAgIGRlbGV0ZSBmb287CisvLyAgIH0KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTUVTU0FHRV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX01FU1NBR0VfSF9fCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaWZkZWYgX19ERUNDWFgKKy8vIEhQIEMrKydzIGlvc2Z3ZCBkb2Vzbid0IHdvcmsuCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZWxzZQorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCitjbGFzcyBNZXNzYWdlOworY2xhc3MgUmVmbGVjdGlvbjsKK2NsYXNzIE1lc3NhZ2VGYWN0b3J5OworCisvLyBEZWZpbmVkIGluIG90aGVyIGZpbGVzLgorY2xhc3MgRGVzY3JpcHRvcjsgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKK2NsYXNzIEZpZWxkRGVzY3JpcHRvcjsgICAgICAgLy8gZGVzY3JpcHRvci5oCitjbGFzcyBFbnVtRGVzY3JpcHRvcjsgICAgICAgIC8vIGRlc2NyaXB0b3IuaAorY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcjsgICAvLyBkZXNjcmlwdG9yLmgKK25hbWVzcGFjZSBpbyB7CisgIGNsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07ICAgLy8gemVyb19jb3B5X3N0cmVhbS5oCisgIGNsYXNzIFplcm9Db3B5T3V0cHV0U3RyZWFtOyAgLy8gemVyb19jb3B5X3N0cmVhbS5oCisgIGNsYXNzIENvZGVkSW5wdXRTdHJlYW07ICAgICAgLy8gY29kZWRfc3RyZWFtLmgKKyAgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07ICAgICAvLyBjb2RlZF9zdHJlYW0uaAorfQorY2xhc3MgVW5rbm93bkZpZWxkU2V0OyAgICAgICAvLyB1bmtub3duX2ZpZWxkX3NldC5oCisKKy8vIEEgY29udGFpbmVyIHRvIGhvbGQgbWVzc2FnZSBtZXRhZGF0YS4KK3N0cnVjdCBNZXRhZGF0YSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3I7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb247Cit9OworCisvLyBSZXR1cm5zIHRoZSBFbnVtRGVzY3JpcHRvciBmb3IgZW51bSB0eXBlIEUsIHdoaWNoIG11c3QgYmUgYQorLy8gcHJvdG8tZGVjbGFyZWQgZW51bSB0eXBlLiAgQ29kZSBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyCisvLyB3aWxsIGluY2x1ZGUgc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgdGVtcGxhdGUgZm9yIGVhY2ggZW51bSB0eXBlIGRlY2xhcmVkLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+Citjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3IoKTsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBwcm90b2NvbCBtZXNzYWdlcy4KKy8vCisvLyBTZWUgYWxzbyBNZXNzYWdlTGl0ZSwgd2hpY2ggY29udGFpbnMgbW9zdCBldmVyeS1kYXkgb3BlcmF0aW9ucy4gIE1lc3NhZ2UKKy8vIGFkZHMgZGVzY3JpcHRvcnMgYW5kIHJlZmxlY3Rpb24gb24gdG9wIG9mIHRoYXQuCisvLworLy8gVGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB0aGF0IGFyZSB2aXJ0dWFsIGJ1dCBub3QgcHVyZS12aXJ0dWFsIGhhdmUKKy8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGJhc2VkIG9uIHJlZmxlY3Rpb24uICBNZXNzYWdlIGNsYXNzZXMgd2hpY2ggYXJlCisvLyBvcHRpbWl6ZWQgZm9yIHNwZWVkIHdpbGwgd2FudCB0byBvdmVycmlkZSB0aGVzZSB3aXRoIGZhc3RlciBpbXBsZW1lbnRhdGlvbnMsCisvLyBidXQgY2xhc3NlcyBvcHRpbWl6ZWQgZm9yIGNvZGUgc2l6ZSBtYXkgYmUgaGFwcHkgd2l0aCBrZWVwaW5nIHRoZW0uICBTZWUKKy8vIHRoZSBvcHRpbWl6ZV9mb3Igb3B0aW9uIGluIGRlc2NyaXB0b3IucHJvdG8uCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTWVzc2FnZSA6IHB1YmxpYyBNZXNzYWdlTGl0ZSB7CisgcHVibGljOgorICBpbmxpbmUgTWVzc2FnZSgpIHt9CisgIHZpcnR1YWwgfk1lc3NhZ2UoKTsKKworICAvLyBCYXNpYyBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc2FtZSB0eXBlLiAgT3duZXJzaGlwIGlzIHBhc3NlZCB0byB0aGUKKyAgLy8gY2FsbGVyLiAgKFRoaXMgaXMgYWxzbyBkZWZpbmVkIGluIE1lc3NhZ2VMaXRlLCBidXQgaXMgZGVmaW5lZCBhZ2FpbiBoZXJlCisgIC8vIGZvciByZXR1cm4tdHlwZSBjb3ZhcmlhbmNlLikKKyAgdmlydHVhbCBNZXNzYWdlKiBOZXcoKSBjb25zdCA9IDA7CisKKyAgLy8gTWFrZSB0aGlzIG1lc3NhZ2UgaW50byBhIGNvcHkgb2YgdGhlIGdpdmVuIG1lc3NhZ2UuICBUaGUgZ2l2ZW4gbWVzc2FnZQorICAvLyBtdXN0IGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvciwgYnV0IG5lZWQgbm90IG5lY2Vzc2FyaWx5IGJlIHRoZSBzYW1lIGNsYXNzLgorICAvLyBCeSBkZWZhdWx0IHRoaXMgaXMganVzdCBpbXBsZW1lbnRlZCBhcyAiQ2xlYXIoKTsgTWVyZ2VGcm9tKGZyb20pOyIuCisgIHZpcnR1YWwgdm9pZCBDb3B5RnJvbShjb25zdCBNZXNzYWdlJiBmcm9tKTsKKworICAvLyBNZXJnZSB0aGUgZmllbGRzIGZyb20gdGhlIGdpdmVuIG1lc3NhZ2UgaW50byB0aGlzIG1lc3NhZ2UuICBTaW5ndWxhcgorICAvLyBmaWVsZHMgd2lsbCBiZSBvdmVyd3JpdHRlbiwgZXhjZXB0IGZvciBlbWJlZGRlZCBtZXNzYWdlcyB3aGljaCB3aWxsCisgIC8vIGJlIG1lcmdlZC4gIFJlcGVhdGVkIGZpZWxkcyB3aWxsIGJlIGNvbmNhdGVuYXRlZC4gIFRoZSBnaXZlbiBtZXNzYWdlCisgIC8vIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIG1lc3NhZ2UgKGkuZS4gdGhlIGV4YWN0IHNhbWUgY2xhc3MpLgorICB2aXJ0dWFsIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2UmIGZyb20pOworCisgIC8vIFZlcmlmaWVzIHRoYXQgSXNJbml0aWFsaXplZCgpIHJldHVybnMgdHJ1ZS4gIEdPT0dMRV9DSEVDSy1mYWlscyBvdGhlcndpc2UsIHdpdGgKKyAgLy8gYSBuaWNlIGVycm9yIG1lc3NhZ2UuCisgIHZvaWQgQ2hlY2tJbml0aWFsaXplZCgpIGNvbnN0OworCisgIC8vIFNsb3dseSBidWlsZCBhIGxpc3Qgb2YgYWxsIHJlcXVpcmVkIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0LgorICAvLyBUaGlzIGlzIG11Y2gsIG11Y2ggc2xvd2VyIHRoYW4gSXNJbml0aWFsaXplZCgpIGFzIGl0IGlzIGltcGxlbWVudGVkCisgIC8vIHB1cmVseSB2aWEgcmVmbGVjdGlvbi4gIEdlbmVyYWxseSwgeW91IHNob3VsZCBub3QgY2FsbCB0aGlzIHVubGVzcyB5b3UKKyAgLy8gaGF2ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdCBhbiBlcnJvciBleGlzdHMgYnkgY2FsbGluZyBJc0luaXRpYWxpemVkKCkuCisgIHZvaWQgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKHZlY3RvcjxzdHJpbmc+KiBlcnJvcnMpIGNvbnN0OworCisgIC8vIExpa2UgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzLCBidXQgam9pbnMgYWxsIHRoZSBzdHJpbmdzLCBkZWxpbWl0ZWQgYnkKKyAgLy8gY29tbWFzLCBhbmQgcmV0dXJucyB0aGVtLgorICBzdHJpbmcgSW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpIGNvbnN0OworCisgIC8vIENsZWFycyBhbGwgdW5rbm93biBmaWVsZHMgZnJvbSB0aGlzIG1lc3NhZ2UgYW5kIGFsbCBlbWJlZGRlZCBtZXNzYWdlcy4KKyAgLy8gTm9ybWFsbHksIGlmIHVua25vd24gdGFnIG51bWJlcnMgYXJlIGVuY291bnRlcmVkIHdoZW4gcGFyc2luZyBhIG1lc3NhZ2UsCisgIC8vIHRoZSB0YWcgYW5kIHZhbHVlIGFyZSBzdG9yZWQgaW4gdGhlIG1lc3NhZ2UncyBVbmtub3duRmllbGRTZXQgYW5kCisgIC8vIHRoZW4gd3JpdHRlbiBiYWNrIG91dCB3aGVuIHRoZSBtZXNzYWdlIGlzIHNlcmlhbGl6ZWQuICBUaGlzIGFsbG93cyBzZXJ2ZXJzCisgIC8vIHdoaWNoIHNpbXBseSByb3V0ZSBtZXNzYWdlcyB0byBvdGhlciBzZXJ2ZXJzIHRvIHBhc3MgdGhyb3VnaCBtZXNzYWdlcworICAvLyB0aGF0IGhhdmUgbmV3IGZpZWxkIGRlZmluaXRpb25zIHdoaWNoIHRoZXkgZG9uJ3QgeWV0IGtub3cgYWJvdXQuICBIb3dldmVyLAorICAvLyB0aGlzIGJlaGF2aW9yIGNhbiBoYXZlIHNlY3VyaXR5IGltcGxpY2F0aW9ucy4gIFRvIGF2b2lkIGl0LCBjYWxsIHRoaXMKKyAgLy8gbWV0aG9kIGFmdGVyIHBhcnNpbmcuCisgIC8vCisgIC8vIFNlZSBSZWZsZWN0aW9uOjpHZXRVbmtub3duRmllbGRzKCkgZm9yIG1vcmUgb24gdW5rbm93biBmaWVsZHMuCisgIHZpcnR1YWwgdm9pZCBEaXNjYXJkVW5rbm93bkZpZWxkcygpOworCisgIC8vIENvbXB1dGVzIChhbiBlc3RpbWF0ZSBvZikgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgdXNlZCBmb3IKKyAgLy8gc3RvcmluZyB0aGUgbWVzc2FnZSBpbiBtZW1vcnkuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB0aGUKKyAgLy8gUmVmbGVjdGlvbiBvYmplY3QncyBTcGFjZVVzZWQoKSBtZXRob2QuCisgIHZpcnR1YWwgaW50IFNwYWNlVXNlZCgpIGNvbnN0OworCisgIC8vIERlYnVnZ2luZyAmIFRlc3RpbmctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gR2VuZXJhdGVzIGEgaHVtYW4gcmVhZGFibGUgZm9ybSBvZiB0aGlzIG1lc3NhZ2UsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisgIC8vIGFuZCBvdGhlciBwdXJwb3Nlcy4KKyAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CisgIC8vIExpa2UgRGVidWdTdHJpbmcoKSwgYnV0IHdpdGggbGVzcyB3aGl0ZXNwYWNlLgorICBzdHJpbmcgU2hvcnREZWJ1Z1N0cmluZygpIGNvbnN0OworICAvLyBMaWtlIERlYnVnU3RyaW5nKCksIGJ1dCBkbyBub3QgZXNjYXBlIFVURi04IGJ5dGUgc2VxdWVuY2VzLgorICBzdHJpbmcgVXRmOERlYnVnU3RyaW5nKCkgY29uc3Q7CisgIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHVzZWZ1bCBpbiBHREIuICBQcmludHMgRGVidWdTdHJpbmcoKSB0byBzdGRvdXQuCisgIHZvaWQgUHJpbnREZWJ1Z1N0cmluZygpIGNvbnN0OworCisgIC8vIEhlYXZ5IEkvTyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEFkZGl0aW9uYWwgcGFyc2luZyBhbmQgc2VyaWFsaXphdGlvbiBtZXRob2RzIG5vdCBpbXBsZW1lbnRlZCBieQorICAvLyBNZXNzYWdlTGl0ZSBiZWNhdXNlIHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxpdGUgbGlicmFyeS4KKworICAvLyBQYXJzZSBhIHByb3RvY29sIGJ1ZmZlciBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGVudGlyZQorICAvLyBpbnB1dCB3aWxsIGJlIGNvbnN1bWVkLgorICBib29sIFBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpOworICAvLyBMaWtlIFBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKCksIGJ1dCBhY2NlcHRzIG1lc3NhZ2VzIHRoYXQgYXJlIG1pc3NpbmcKKyAgLy8gcmVxdWlyZWQgZmllbGRzLgorICBib29sIFBhcnNlUGFydGlhbEZyb21GaWxlRGVzY3JpcHRvcihpbnQgZmlsZV9kZXNjcmlwdG9yKTsKKyAgLy8gUGFyc2UgYSBwcm90b2NvbCBidWZmZXIgZnJvbSBhIEMrKyBpc3RyZWFtLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGVudGlyZQorICAvLyBpbnB1dCB3aWxsIGJlIGNvbnN1bWVkLgorICBib29sIFBhcnNlRnJvbUlzdHJlYW0oaXN0cmVhbSogaW5wdXQpOworICAvLyBMaWtlIFBhcnNlRnJvbUlzdHJlYW0oKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZworICAvLyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUlzdHJlYW0oaXN0cmVhbSogaW5wdXQpOworCisgIC8vIFNlcmlhbGl6ZSB0aGUgbWVzc2FnZSBhbmQgd3JpdGUgaXQgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4gIEFsbAorICAvLyByZXF1aXJlZCBmaWVsZHMgbXVzdCBiZSBzZXQuCisgIGJvb2wgU2VyaWFsaXplVG9GaWxlRGVzY3JpcHRvcihpbnQgZmlsZV9kZXNjcmlwdG9yKSBjb25zdDsKKyAgLy8gTGlrZSBTZXJpYWxpemVUb0ZpbGVEZXNjcmlwdG9yKCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgU2VyaWFsaXplUGFydGlhbFRvRmlsZURlc2NyaXB0b3IoaW50IGZpbGVfZGVzY3JpcHRvcikgY29uc3Q7CisgIC8vIFNlcmlhbGl6ZSB0aGUgbWVzc2FnZSBhbmQgd3JpdGUgaXQgdG8gdGhlIGdpdmVuIEMrKyBvc3RyZWFtLiAgQWxsCisgIC8vIHJlcXVpcmVkIGZpZWxkcyBtdXN0IGJlIHNldC4KKyAgYm9vbCBTZXJpYWxpemVUb09zdHJlYW0ob3N0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgLy8gTGlrZSBTZXJpYWxpemVUb09zdHJlYW0oKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBTZXJpYWxpemVQYXJ0aWFsVG9Pc3RyZWFtKG9zdHJlYW0qIG91dHB1dCkgY29uc3Q7CisKKworICAvLyBSZWZsZWN0aW9uLWJhc2VkIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBtZXRob2RzIGFyZSBwdXJlLXZpcnR1YWwgaW4gTWVzc2FnZUxpdGUsIGJ1dCBNZXNzYWdlIHByb3ZpZGVzCisgIC8vIHJlZmxlY3Rpb24tYmFzZWQgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMuCisKKyAgdmlydHVhbCBzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIENsZWFyKCk7CisgIHZpcnR1YWwgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgTWVzc2FnZUxpdGUmIG90aGVyKTsKKyAgdmlydHVhbCBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2aXJ0dWFsIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKworIHByaXZhdGU6CisgIC8vIFRoaXMgaXMgY2FsbGVkIG9ubHkgYnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQnl0ZVNpemUoKSwgdG8KKyAgLy8gdXBkYXRlIHRoZSBjYWNoZWQgc2l6ZS4gIElmIHlvdSBvdmVycmlkZSBCeXRlU2l6ZSgpLCB5b3UgZG8gbm90IG5lZWQKKyAgLy8gdG8gb3ZlcnJpZGUgdGhpcy4gIElmIHlvdSBkbyBub3Qgb3ZlcnJpZGUgQnl0ZVNpemUoKSwgeW91IE1VU1Qgb3ZlcnJpZGUKKyAgLy8gdGhpczsgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2lsbCBjcmFzaC4KKyAgLy8KKyAgLy8gVGhlIG1ldGhvZCBpcyBwcml2YXRlIGJlY2F1c2Ugc3ViY2xhc3NlcyBzaG91bGQgbmV2ZXIgY2FsbCBpdDsgb25seQorICAvLyBvdmVycmlkZSBpdC4gIFllcywgQysrIGxldHMgeW91IGRvIHRoYXQuICBDcmF6eSwgaHVoPworICB2aXJ0dWFsIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisKKyBwdWJsaWM6CisKKyAgLy8gSW50cm9zcGVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBUeXBlZGVmIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4KKyAgdHlwZWRlZiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uIFJlZmxlY3Rpb247CisKKyAgLy8gR2V0IGEgRGVzY3JpcHRvciBmb3IgdGhpcyBtZXNzYWdlJ3MgdHlwZS4gIFRoaXMgZGVzY3JpYmVzIHdoYXQKKyAgLy8gZmllbGRzIHRoZSBtZXNzYWdlIGNvbnRhaW5zLCB0aGUgdHlwZXMgb2YgdGhvc2UgZmllbGRzLCBldGMuCisgIGNvbnN0IERlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBHZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7IH0KKworICAvLyBHZXQgdGhlIFJlZmxlY3Rpb24gaW50ZXJmYWNlIGZvciB0aGlzIE1lc3NhZ2UsIHdoaWNoIGNhbiBiZSB1c2VkIHRvCisgIC8vIHJlYWQgYW5kIG1vZGlmeSB0aGUgZmllbGRzIG9mIHRoZSBNZXNzYWdlIGR5bmFtaWNhbGx5IChpbiBvdGhlciB3b3JkcywKKyAgLy8gd2l0aG91dCBrbm93aW5nIHRoZSBtZXNzYWdlIHR5cGUgYXQgY29tcGlsZSB0aW1lKS4gIFRoaXMgb2JqZWN0IHJlbWFpbnMKKyAgLy8gcHJvcGVydHkgb2YgdGhlIE1lc3NhZ2UuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIHJlbWFpbnMgdmlydHVhbCBpbiBjYXNlIGEgc3ViY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50CisgIC8vIHJlZmxlY3Rpb24gYW5kIHdhbnRzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLgorICB2aXJ0dWFsIGNvbnN0IFJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKKyAgfQorCisgcHJvdGVjdGVkOgorICAvLyBHZXQgYSBzdHJ1Y3QgY29udGFpbmluZyB0aGUgbWV0YWRhdGEgZm9yIHRoZSBNZXNzYWdlLiBNb3N0IHN1YmNsYXNzZXMgb25seQorICAvLyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZCwgcmF0aGVyIHRoYW4gdGhlIEdldERlc2NyaXB0b3IoKSBhbmQKKyAgLy8gR2V0UmVmbGVjdGlvbigpIHdyYXBwZXJzLgorICB2aXJ0dWFsIE1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgID0gMDsKKworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2UpOworfTsKKworLy8gVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgbWV0aG9kcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGFjY2VzcworLy8gYW5kIG1vZGlmeSB0aGUgZmllbGRzIG9mIGEgcHJvdG9jb2wgbWVzc2FnZS4gIFRoZWlyIHNlbWFudGljcyBhcmUKKy8vIHNpbWlsYXIgdG8gdGhlIGFjY2Vzc29ycyB0aGUgcHJvdG9jb2wgY29tcGlsZXIgZ2VuZXJhdGVzLgorLy8KKy8vIFRvIGdldCB0aGUgUmVmbGVjdGlvbiBmb3IgYSBnaXZlbiBNZXNzYWdlLCBjYWxsIE1lc3NhZ2U6OkdldFJlZmxlY3Rpb24oKS4KKy8vCisvLyBUaGlzIGludGVyZmFjZSBpcyBzZXBhcmF0ZSBmcm9tIE1lc3NhZ2Ugb25seSBmb3IgZWZmaWNpZW5jeSByZWFzb25zOworLy8gdGhlIHZhc3QgbWFqb3JpdHkgb2YgaW1wbGVtZW50YXRpb25zIG9mIE1lc3NhZ2Ugd2lsbCBzaGFyZSB0aGUgc2FtZQorLy8gaW1wbGVtZW50YXRpb24gb2YgUmVmbGVjdGlvbiAoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24sCisvLyBkZWZpbmVkIGluIGdlbmVyYXRlZF9tZXNzYWdlLmgpLCBhbmQgYWxsIE1lc3NhZ2VzIG9mIGEgcGFydGljdWxhciBjbGFzcworLy8gc2hvdWxkIHNoYXJlIHRoZSBzYW1lIFJlZmxlY3Rpb24gb2JqZWN0ICh0aG91Z2ggeW91IHNob3VsZCBub3QgcmVseSBvbgorLy8gdGhlIGxhdHRlciBmYWN0KS4KKy8vCisvLyBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRoYXQgdGhlc2UgbWV0aG9kcyBjYW4gYmUgdXNlZCBpbmNvcnJlY3RseS4gIEZvcgorLy8gZXhhbXBsZSwgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyB3aWxsIGxlYWQgdG8gdW5kZWZpbmVkCisvLyByZXN1bHRzIChwcm9iYWJseSBhc3NlcnRpb24gZmFpbHVyZXMpOgorLy8gLSBUaGUgRmllbGREZXNjcmlwdG9yIGlzIG5vdCBhIGZpZWxkIG9mIHRoaXMgbWVzc2FnZSB0eXBlLgorLy8gLSBUaGUgbWV0aG9kIGNhbGxlZCBpcyBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBmaWVsZCdzIHR5cGUuICBGb3IKKy8vICAgZWFjaCBmaWVsZCB0eXBlIGluIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8qLCB0aGVyZSBpcyBvbmx5IG9uZQorLy8gICBHZXQqKCkgbWV0aG9kLCBvbmUgU2V0KigpIG1ldGhvZCwgYW5kIG9uZSBBZGQqKCkgbWV0aG9kIHRoYXQgaXMKKy8vICAgdmFsaWQgZm9yIHRoYXQgdHlwZS4gIEl0IHNob3VsZCBiZSBvYnZpb3VzIHdoaWNoIChleGNlcHQgbWF5YmUKKy8vICAgZm9yIFRZUEVfQllURVMsIHdoaWNoIGFyZSByZXByZXNlbnRlZCB1c2luZyBzdHJpbmdzIGluIEMrKykuCisvLyAtIEEgR2V0KigpIG9yIFNldCooKSBtZXRob2QgZm9yIHNpbmd1bGFyIGZpZWxkcyBpcyBjYWxsZWQgb24gYSByZXBlYXRlZAorLy8gICBmaWVsZC4KKy8vIC0gR2V0UmVwZWF0ZWQqKCksIFNldFJlcGVhdGVkKigpLCBvciBBZGQqKCkgaXMgY2FsbGVkIG9uIGEgbm9uLXJlcGVhdGVkCisvLyAgIGZpZWxkLgorLy8gLSBUaGUgTWVzc2FnZSBvYmplY3QgcGFzc2VkIHRvIGFueSBtZXRob2QgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlIGZvcgorLy8gICB0aGlzIFJlZmxlY3Rpb24gb2JqZWN0IChpLmUuIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpICE9IHJlZmxlY3Rpb24pLgorLy8KKy8vIFlvdSBtaWdodCB3b25kZXIgd2h5IHRoZXJlIGlzIG5vdCBhbnkgYWJzdHJhY3QgcmVwcmVzZW50YXRpb24gZm9yIGEgZmllbGQKKy8vIG9mIGFyYml0cmFyeSB0eXBlLiAgRS5nLiwgd2h5IGlzbid0IHRoZXJlIGp1c3QgYSAiR2V0RmllbGQoKSIgbWV0aG9kIHRoYXQKKy8vIHJldHVybnMgImNvbnN0IEZpZWxkJiIsIHdoZXJlICJGaWVsZCIgaXMgc29tZSBjbGFzcyB3aXRoIGFjY2Vzc29ycyBsaWtlCisvLyAiR2V0SW50MzJWYWx1ZSgpIi4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgc29tZW9uZSB3b3VsZCBoYXZlIHRvIGRlYWwgd2l0aAorLy8gYWxsb2NhdGluZyB0aGVzZSBGaWVsZCBvYmplY3RzLiAgRm9yIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMsIGhhdmluZyB0bworLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGFuIGFkZGl0aW9uYWwgb2JqZWN0IHRvIHdyYXAgZXZlcnkgZmllbGQgd291bGQgYXQgbGVhc3QKKy8vIGRvdWJsZSB0aGUgbWVzc2FnZSdzIG1lbW9yeSBmb290cHJpbnQsIHByb2JhYmx5IHdvcnNlLiAgQWxsb2NhdGluZyB0aGUKKy8vIG9iamVjdHMgb24tZGVtYW5kLCBvbiB0aGUgb3RoZXIgaGFuZCwgd291bGQgYmUgZXhwZW5zaXZlIGFuZCBwcm9uZSB0bworLy8gbWVtb3J5IGxlYWtzLiAgU28sIGluc3RlYWQgd2UgZW5kZWQgdXAgd2l0aCB0aGlzIGZsYXQgaW50ZXJmYWNlLgorLy8KKy8vIFRPRE8oa2VudG9uKTogIENyZWF0ZSBhIHV0aWxpdHkgY2xhc3Mgd2hpY2ggY2FsbGVycyBjYW4gdXNlIHRvIHJlYWQgYW5kCisvLyAgIHdyaXRlIGZpZWxkcyBmcm9tIGEgUmVmbGVjdGlvbiB3aXRob3V0IHBheWluZyBhdHRlbnRpb24gdG8gdGhlIHR5cGUuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgUmVmbGVjdGlvbiB7CisgcHVibGljOgorICAvLyBUT0RPKGtlbnRvbik6ICBSZW1vdmUgcGFyYW1ldGVyLgorICBpbmxpbmUgUmVmbGVjdGlvbigpIHt9CisgIHZpcnR1YWwgflJlZmxlY3Rpb24oKTsKKworICAvLyBHZXQgdGhlIFVua25vd25GaWVsZFNldCBmb3IgdGhlIG1lc3NhZ2UuICBUaGlzIGNvbnRhaW5zIGZpZWxkcyB3aGljaAorICAvLyB3ZXJlIHNlZW4gd2hlbiB0aGUgTWVzc2FnZSB3YXMgcGFyc2VkIGJ1dCB3ZXJlIG5vdCByZWNvZ25pemVkIGFjY29yZGluZworICAvLyB0byB0aGUgTWVzc2FnZSdzIGRlZmluaXRpb24uCisgIHZpcnR1YWwgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBHZXRVbmtub3duRmllbGRzKAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgPSAwOworICAvLyBHZXQgYSBtdXRhYmxlIHBvaW50ZXIgdG8gdGhlIFVua25vd25GaWVsZFNldCBmb3IgdGhlIG1lc3NhZ2UuICBUaGlzCisgIC8vIGNvbnRhaW5zIGZpZWxkcyB3aGljaCB3ZXJlIHNlZW4gd2hlbiB0aGUgTWVzc2FnZSB3YXMgcGFyc2VkIGJ1dCB3ZXJlIG5vdAorICAvLyByZWNvZ25pemVkIGFjY29yZGluZyB0byB0aGUgTWVzc2FnZSdzIGRlZmluaXRpb24uCisgIHZpcnR1YWwgVW5rbm93bkZpZWxkU2V0KiBNdXRhYmxlVW5rbm93bkZpZWxkcyhNZXNzYWdlKiBtZXNzYWdlKSBjb25zdCA9IDA7CisKKyAgLy8gRXN0aW1hdGUgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB0aGUgbWVzc2FnZSBvYmplY3QuCisgIHZpcnR1YWwgaW50IFNwYWNlVXNlZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCA9IDA7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIGdpdmVuIG5vbi1yZXBlYXRlZCBmaWVsZCBpcyBzZXQuCisgIHZpcnR1YWwgYm9vbCBIYXNGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOworCisgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGEgcmVwZWF0ZWQgZmllbGQuCisgIHZpcnR1YWwgaW50IEZpZWxkU2l6ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOworCisgIC8vIENsZWFyIHRoZSB2YWx1ZSBvZiBhIGZpZWxkLCBzbyB0aGF0IEhhc0ZpZWxkKCkgcmV0dXJucyBmYWxzZSBvcgorICAvLyBGaWVsZFNpemUoKSByZXR1cm5zIHplcm8uCisgIHZpcnR1YWwgdm9pZCBDbGVhckZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKKworICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLgorICAvLyBXZSBkb24ndCBwcm92aWRlIGEgd2F5IHRvIHJlbW92ZSBhbnkgZWxlbWVudCBvdGhlciB0aGFuIHRoZSBsYXN0CisgIC8vIGJlY2F1c2UgaXQgaW52aXRlcyBpbmVmZmljaWVudCB1c2UsIHN1Y2ggYXMgTyhuXjIpIGZpbHRlcmluZyBsb29wcworICAvLyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gTyhuKS4gIElmIHlvdSB3YW50IHRvIHJlbW92ZSBhbiBlbGVtZW50IG90aGVyCisgIC8vIHRoYW4gdGhlIGxhc3QsIHRoZSBiZXN0IHdheSB0byBkbyBpdCBpcyB0byByZS1hcnJhbmdlIHRoZSBlbGVtZW50cworICAvLyAodXNpbmcgU3dhcCgpKSBzbyB0aGF0IHRoZSBvbmUgeW91IHdhbnQgcmVtb3ZlZCBpcyBhdCB0aGUgZW5kLCB0aGVuCisgIC8vIGNhbGwgUmVtb3ZlTGFzdCgpLgorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlTGFzdChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisKKyAgLy8gU3dhcCB0aGUgY29tcGxldGUgY29udGVudHMgb2YgdHdvIG1lc3NhZ2VzLgorICB2aXJ0dWFsIHZvaWQgU3dhcChNZXNzYWdlKiBtZXNzYWdlMSwgTWVzc2FnZSogbWVzc2FnZTIpIGNvbnN0ID0gMDsKKworICAvLyBTd2FwIHR3byBlbGVtZW50cyBvZiBhIHJlcGVhdGVkIGZpZWxkLgorICB2aXJ0dWFsIHZvaWQgU3dhcEVsZW1lbnRzKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEsCisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIpIGNvbnN0ID0gMDsKKworICAvLyBMaXN0IGFsbCBmaWVsZHMgb2YgdGhlIG1lc3NhZ2Ugd2hpY2ggYXJlIGN1cnJlbnRseSBzZXQuICBUaGlzIGluY2x1ZGVzCisgIC8vIGV4dGVuc2lvbnMuICBTaW5ndWxhciBmaWVsZHMgd2lsbCBvbmx5IGJlIGxpc3RlZCBpZiBIYXNGaWVsZChmaWVsZCkgd291bGQKKyAgLy8gcmV0dXJuIHRydWUgYW5kIHJlcGVhdGVkIGZpZWxkcyB3aWxsIG9ubHkgYmUgbGlzdGVkIGlmIEZpZWxkU2l6ZShmaWVsZCkKKyAgLy8gd291bGQgcmV0dXJuIG5vbi16ZXJvLiAgRmllbGRzIChib3RoIG5vcm1hbCBmaWVsZHMgYW5kIGV4dGVuc2lvbiBmaWVsZHMpCisgIC8vIHdpbGwgYmUgbGlzdGVkIG9yZGVyZWQgYnkgZmllbGQgbnVtYmVyLgorICB2aXJ0dWFsIHZvaWQgTGlzdEZpZWxkcyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3QgPSAwOworCisgIC8vIFNpbmd1bGFyIGZpZWxkIGdldHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIGdldCB0aGUgdmFsdWUgb2YgYSBub24tcmVwZWF0ZWQgZmllbGQuICBUaGV5IHJldHVybiB0aGUgZGVmYXVsdAorICAvLyB2YWx1ZSBmb3IgZmllbGRzIHRoYXQgYXJlbid0IHNldC4KKworICB2aXJ0dWFsIGludDMyICBHZXRJbnQzMiAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQ2NCAgR2V0SW50NjQgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyIEdldFVJbnQzMihjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NCBHZXRVSW50NjQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBmbG9hdCAgR2V0RmxvYXQgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgZG91YmxlIEdldERvdWJsZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgICBHZXRCb29sICAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdHJpbmcgR2V0U3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogR2V0RW51bSgKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKKyAgLy8gU2VlIE11dGFibGVNZXNzYWdlKCkgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZSAiZmFjdG9yeSIgcGFyYW1ldGVyLgorICB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UmIEdldE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0ID0gMDsKKworICAvLyBHZXQgYSBzdHJpbmcgdmFsdWUgd2l0aG91dCBjb3B5aW5nLCBpZiBwb3NzaWJsZS4KKyAgLy8KKyAgLy8gR2V0U3RyaW5nKCkgbmVjZXNzYXJpbHkgcmV0dXJucyBhIGNvcHkgb2YgdGhlIHN0cmluZy4gIFRoaXMgY2FuIGJlCisgIC8vIGluZWZmaWNpZW50IHdoZW4gdGhlIHN0cmluZyBpcyBhbHJlYWR5IHN0b3JlZCBpbiBhIHN0cmluZyBvYmplY3QgaW4gdGhlCisgIC8vIHVuZGVybHlpbmcgbWVzc2FnZS4gIEdldFN0cmluZ1JlZmVyZW5jZSgpIHdpbGwgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZQorICAvLyB1bmRlcmx5aW5nIHN0cmluZyBpbiB0aGlzIGNhc2UuICBPdGhlcndpc2UsIGl0IHdpbGwgY29weSB0aGUgc3RyaW5nIGludG8KKyAgLy8gKnNjcmF0Y2ggYW5kIHJldHVybiB0aGF0LgorICAvLworICAvLyBOb3RlOiAgSXQgaXMgcGVyZmVjdGx5IHJlYXNvbmFibGUgYW5kIHVzZWZ1bCB0byB3cml0ZSBjb2RlIGxpa2U6CisgIC8vICAgICBzdHIgPSByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UoZmllbGQsICZzdHIpOworICAvLyAgIFRoaXMgbGluZSB3b3VsZCBlbnN1cmUgdGhhdCBvbmx5IG9uZSBjb3B5IG9mIHRoZSBzdHJpbmcgaXMgbWFkZQorICAvLyAgIHJlZ2FyZGxlc3Mgb2YgdGhlIGZpZWxkJ3MgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbi4gIFdoZW4gaW5pdGlhbGl6aW5nCisgIC8vICAgYSBuZXdseS1jb25zdHJ1Y3RlZCBzdHJpbmcsIHRob3VnaCwgaXQncyBqdXN0IGFzIGZhc3QgYW5kIG1vcmUgcmVhZGFibGUKKyAgLy8gICB0byB1c2UgY29kZSBsaWtlOgorICAvLyAgICAgc3RyaW5nIHN0ciA9IHJlZmxlY3Rpb24tPkdldFN0cmluZyhmaWVsZCk7CisgIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRTdHJpbmdSZWZlcmVuY2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogc2NyYXRjaCkgY29uc3QgPSAwOworCisKKyAgLy8gU2luZ3VsYXIgZmllbGQgbXV0YXRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgbXV0YXRlIHRoZSB2YWx1ZSBvZiBhIG5vbi1yZXBlYXRlZCBmaWVsZC4KKworICB2aXJ0dWFsIHZvaWQgU2V0SW50MzIgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50MzIgIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRJbnQ2NCAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQ2NCAgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFVJbnQzMihNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHVpbnQzMiB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0VUludDY0KE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgdWludDY0IHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRGbG9hdCAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBmbG9hdCAgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldERvdWJsZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGRvdWJsZSB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0Qm9vbCAgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgYm9vbCAgIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRTdHJpbmcoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldEVudW0gIChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0ID0gMDsKKyAgLy8gR2V0IGEgbXV0YWJsZSBwb2ludGVyIHRvIGEgZmllbGQgd2l0aCBhIG1lc3NhZ2UgdHlwZS4gIElmIGEgTWVzc2FnZUZhY3RvcnkKKyAgLy8gaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBjb25zdHJ1Y3QgaW5zdGFuY2VzIG9mIHRoZSBzdWItbWVzc2FnZTsKKyAgLy8gb3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBmYWN0b3J5IGlzIHVzZWQuICBJZiB0aGUgZmllbGQgaXMgYW4gZXh0ZW5zaW9uIHRoYXQKKyAgLy8gZG9lcyBub3QgbGl2ZSBpbiB0aGUgc2FtZSBwb29sIGFzIHRoZSBjb250YWluaW5nIG1lc3NhZ2UncyBkZXNjcmlwdG9yIChlLmcuCisgIC8vIGl0IGxpdmVzIGluIGFuIG92ZXJsYXkgcG9vbCksIHRoZW4gYSBNZXNzYWdlRmFjdG9yeSBtdXN0IGJlIHByb3ZpZGVkLgorICAvLyBJZiB5b3UgaGF2ZSBubyBpZGVhIHdoYXQgdGhhdCBtZWFudCwgdGhlbiB5b3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byB3b3JyeQorICAvLyBhYm91dCBpdCAoZG9uJ3QgcHJvdmlkZSBhIE1lc3NhZ2VGYWN0b3J5KS4gIFdBUk5JTkc6ICBJZiB0aGUKKyAgLy8gRmllbGREZXNjcmlwdG9yIGlzIGZvciBhIGNvbXBpbGVkLWluIGV4dGVuc2lvbiwgdGhlbgorICAvLyBmYWN0b3J5LT5HZXRQcm90b3R5cGUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpIE1VU1QgcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZQorICAvLyBjb21waWxlZC1pbiBjbGFzcyBmb3IgdGhpcyB0eXBlLCBOT1QgRHluYW1pY01lc3NhZ2UuCisgIHZpcnR1YWwgTWVzc2FnZSogTXV0YWJsZU1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gTlVMTCkgY29uc3QgPSAwOworCisKKyAgLy8gUmVwZWF0ZWQgZmllbGQgZ2V0dGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgZ2V0IHRoZSB2YWx1ZSBvZiBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLgorCisgIHZpcnR1YWwgaW50MzIgIEdldFJlcGVhdGVkSW50MzIgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDY0ICBHZXRSZXBlYXRlZEludDY0IChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzIgR2V0UmVwZWF0ZWRVSW50MzIoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0IEdldFJlcGVhdGVkVUludDY0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGZsb2F0ICBHZXRSZXBlYXRlZEZsb2F0IChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBkb3VibGUgR2V0UmVwZWF0ZWREb3VibGUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCAgIEdldFJlcGVhdGVkQm9vbCAgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0cmluZyBHZXRSZXBlYXRlZFN0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBHZXRSZXBlYXRlZEVudW0oCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgY29uc3QgTWVzc2FnZSYgR2V0UmVwZWF0ZWRNZXNzYWdlKAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgPSAwOworCisgIC8vIFNlZSBHZXRTdHJpbmdSZWZlcmVuY2UoKSwgYWJvdmUuCisgIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICBpbnQgaW5kZXgsIHN0cmluZyogc2NyYXRjaCkgY29uc3QgPSAwOworCisKKyAgLy8gUmVwZWF0ZWQgZmllbGQgbXV0YXRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlc2UgbXV0YXRlIHRoZSB2YWx1ZSBvZiBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLgorCisgIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZEludDMyIChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50MzIgIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZEludDY0IChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50NjQgIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZFVJbnQzMihNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgdWludDMyIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZFVJbnQ2NChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgdWludDY0IHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZEZsb2F0IChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgZmxvYXQgIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZERvdWJsZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgZG91YmxlIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZEJvb2wgIChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgYm9vbCAgIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZFN0cmluZyhNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0UmVwZWF0ZWRFbnVtKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSBjb25zdCA9IDA7CisgIC8vIEdldCBhIG11dGFibGUgcG9pbnRlciB0byBhbiBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZmllbGQgd2l0aCBhIG1lc3NhZ2UKKyAgLy8gdHlwZS4KKyAgdmlydHVhbCBNZXNzYWdlKiBNdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKAorICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCA9IDA7CisKKworICAvLyBSZXBlYXRlZCBmaWVsZCBhZGRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBhZGQgYW4gZWxlbWVudCB0byBhIHJlcGVhdGVkIGZpZWxkLgorCisgIHZpcnR1YWwgdm9pZCBBZGRJbnQzMiAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQzMiAgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEFkZEludDY0IChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludDY0ICB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgQWRkVUludDMyKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgdWludDMyIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBBZGRVSW50NjQoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCB1aW50NjQgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEFkZEZsb2F0IChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGZsb2F0ICB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgQWRkRG91YmxlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgZG91YmxlIHZhbHVlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBBZGRCb29sICAoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sICAgdmFsdWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEFkZFN0cmluZyhNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgQWRkRW51bSAgKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3QgPSAwOworICAvLyBTZWUgTXV0YWJsZU1lc3NhZ2UoKSBmb3IgY29tbWVudHMgb24gdGhlICJmYWN0b3J5IiBwYXJhbWV0ZXIuCisgIHZpcnR1YWwgTWVzc2FnZSogQWRkTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gTlVMTCkgY29uc3QgPSAwOworCisKKyAgLy8gRXh0ZW5zaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBUcnkgdG8gZmluZCBhbiBleHRlbnNpb24gb2YgdGhpcyBtZXNzYWdlIHR5cGUgYnkgZnVsbHktcXVhbGlmaWVkIGZpZWxkCisgIC8vIG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm8gZXh0ZW5zaW9uIGlzIGtub3duIGZvciB0aGlzIG5hbWUgb3IgbnVtYmVyLgorICB2aXJ0dWFsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKAorICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCA9IDA7CisKKyAgLy8gVHJ5IHRvIGZpbmQgYW4gZXh0ZW5zaW9uIG9mIHRoaXMgbWVzc2FnZSB0eXBlIGJ5IGZpZWxkIG51bWJlci4KKyAgLy8gUmV0dXJucyBOVUxMIGlmIG5vIGV4dGVuc2lvbiBpcyBrbm93biBmb3IgdGhpcyBuYW1lIG9yIG51bWJlci4KKyAgdmlydHVhbCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKAorICAgICAgaW50IG51bWJlcikgY29uc3QgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlZmxlY3Rpb24pOworfTsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhIGZhY3RvcnkgZm9yIG1lc3NhZ2Ugb2JqZWN0cy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNZXNzYWdlRmFjdG9yeSB7CisgcHVibGljOgorICBpbmxpbmUgTWVzc2FnZUZhY3RvcnkoKSB7fQorICB2aXJ0dWFsIH5NZXNzYWdlRmFjdG9yeSgpOworCisgIC8vIEdpdmVuIGEgRGVzY3JpcHRvciwgZ2V0cyBvciBjb25zdHJ1Y3RzIHRoZSBkZWZhdWx0IChwcm90b3R5cGUpIE1lc3NhZ2UKKyAgLy8gb2YgdGhhdCB0eXBlLiAgWW91IGNhbiB0aGVuIGNhbGwgdGhhdCBtZXNzYWdlJ3MgTmV3KCkgbWV0aG9kIHRvIGNvbnN0cnVjdAorICAvLyBhIG11dGFibGUgbWVzc2FnZSBvZiB0aGF0IHR5cGUuCisgIC8vCisgIC8vIENhbGxpbmcgdGhpcyBtZXRob2QgdHdpY2Ugd2l0aCB0aGUgc2FtZSBEZXNjcmlwdG9yIHJldHVybnMgdGhlIHNhbWUKKyAgLy8gb2JqZWN0LiAgVGhlIHJldHVybmVkIG9iamVjdCByZW1haW5zIHByb3BlcnR5IG9mIHRoZSBmYWN0b3J5LiAgQWxzbywgYW55CisgIC8vIG9iamVjdHMgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBwcm90b3R5cGUncyBOZXcoKSBtZXRob2Qgc2hhcmUgc29tZSBkYXRhCisgIC8vIHdpdGggdGhlIHByb3RvdHlwZSwgc28gdGhlc2UgbXVzdCBiZSBkZXN0b3llZCBiZWZvcmUgdGhlIE1lc3NhZ2VGYWN0b3J5CisgIC8vIGlzIGRlc3Ryb3llZC4KKyAgLy8KKyAgLy8gVGhlIGdpdmVuIGRlc2NyaXB0b3IgbXVzdCBvdXRsaXZlIHRoZSByZXR1cm5lZCBtZXNzYWdlLCBhbmQgaGVuY2UgbXVzdAorICAvLyBvdXRsaXZlIHRoZSBNZXNzYWdlRmFjdG9yeS4KKyAgLy8KKyAgLy8gU29tZSBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IHN1cHBvcnQgYWxsIHR5cGVzLiAgR2V0UHJvdG90eXBlKCkgd2lsbAorICAvLyByZXR1cm4gTlVMTCBpZiB0aGUgZGVzY3JpcHRvciBwYXNzZWQgaW4gaXMgbm90IHN1cHBvcnRlZC4KKyAgLy8KKyAgLy8gVGhpcyBtZXRob2QgbWF5IG9yIG1heSBub3QgYmUgdGhyZWFkLXNhZmUgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gRWFjaCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZG9jdW1lbnQgaXRzIG93biBkZWdyZWUgdGhyZWFkLXNhZmV0eS4KKyAgdmlydHVhbCBjb25zdCBNZXNzYWdlKiBHZXRQcm90b3R5cGUoY29uc3QgRGVzY3JpcHRvciogdHlwZSkgPSAwOworCisgIC8vIEdldHMgYSBNZXNzYWdlRmFjdG9yeSB3aGljaCBzdXBwb3J0cyBhbGwgZ2VuZXJhdGVkLCBjb21waWxlZC1pbiBtZXNzYWdlcy4KKyAgLy8gSW4gb3RoZXIgd29yZHMsIGZvciBhbnkgY29tcGlsZWQtaW4gdHlwZSBGb29NZXNzYWdlLCB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisgIC8vICAgTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCktPkdldFByb3RvdHlwZSgKKyAgLy8gICAgIEZvb01lc3NhZ2U6OmRlc2NyaXB0b3IoKSkgPT0gRm9vTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpCisgIC8vIFRoaXMgZmFjdG9yeSBzdXBwb3J0cyBhbGwgdHlwZXMgd2hpY2ggYXJlIGZvdW5kIGluCisgIC8vIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLiAgSWYgZ2l2ZW4gYSBkZXNjcmlwdG9yIGZyb20gYW55IG90aGVyCisgIC8vIHBvb2wsIEdldFByb3RvdHlwZSgpIHdpbGwgcmV0dXJuIE5VTEwuICAoWW91IGNhbiBhbHNvIGNoZWNrIGlmIGEKKyAgLy8gZGVzY3JpcHRvciBpcyBmb3IgYSBnZW5lcmF0ZWQgbWVzc2FnZSBieSBjaGVja2luZyBpZgorICAvLyBkZXNjcmlwdG9yLT5maWxlKCktPnBvb2woKSA9PSBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS4pCisgIC8vCisgIC8vIFRoaXMgZmFjdG9yeSBpcyAxMDAlIHRocmVhZC1zYWZlOyBjYWxsaW5nIEdldFByb3RvdHlwZSgpIGRvZXMgbm90IG1vZGlmeQorICAvLyBhbnkgc2hhcmVkIGRhdGEuCisgIC8vCisgIC8vIFRoaXMgZmFjdG9yeSBpcyBhIHNpbmdsZXRvbi4gIFRoZSBjYWxsZXIgbXVzdCBub3QgZGVsZXRlIHRoZSBvYmplY3QuCisgIHN0YXRpYyBNZXNzYWdlRmFjdG9yeSogZ2VuZXJhdGVkX2ZhY3RvcnkoKTsKKworICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHk6ICBSZWdpc3RlcnMgYSAucHJvdG8gZmlsZSBhdCBzdGF0aWMgaW5pdGlhbGl6YXRpb24KKyAgLy8gdGltZSwgdG8gYmUgcGxhY2VkIGluIGdlbmVyYXRlZF9mYWN0b3J5LiAgVGhlIGZpcnN0IHRpbWUgR2V0UHJvdG90eXBlKCkKKyAgLy8gaXMgY2FsbGVkIHdpdGggYSBkZXNjcmlwdG9yIGZyb20gdGhpcyBmaWxlLCB8cmVnaXN0ZXJfbWVzc2FnZXN8IHdpbGwgYmUKKyAgLy8gY2FsbGVkLCB3aXRoIHRoZSBmaWxlIG5hbWUgYXMgdGhlIHBhcmFtZXRlci4gIEl0IG11c3QgY2FsbAorICAvLyBJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgpIChiZWxvdykgdG8gcmVnaXN0ZXIgZWFjaCBtZXNzYWdlIHR5cGUKKyAgLy8gaW4gdGhlIGZpbGUuICBUaGlzIHN0cmFuZ2UgbWVjaGFuaXNtIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGRlc2NyaXB0b3JzIGFyZQorICAvLyBidWlsdCBsYXppbHksIHNvIHdlIGNhbid0IHJlZ2lzdGVyIHR5cGVzIGJ5IHRoZWlyIGRlc2NyaXB0b3IgdW50aWwgd2UKKyAgLy8ga25vdyB0aGF0IHRoZSBkZXNjcmlwdG9yIGV4aXN0cy4gIHxmaWxlbmFtZXwgbXVzdCBiZSBhIHBlcm1hbmVudCBzdHJpbmcuCisgIHN0YXRpYyB2b2lkIEludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRGaWxlKAorICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUsIHZvaWQgKCpyZWdpc3Rlcl9tZXNzYWdlcykoY29uc3Qgc3RyaW5nJikpOworCisgIC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seTogIFJlZ2lzdGVycyBhIG1lc3NhZ2UgdHlwZS4gIENhbGxlZCBvbmx5IGJ5IHRoZQorICAvLyBmdW5jdGlvbnMgd2hpY2ggYXJlIHJlZ2lzdGVyZWQgd2l0aCBJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkRmlsZSgpLAorICAvLyBhYm92ZS4KKyAgc3RhdGljIHZvaWQgSW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogcHJvdG90eXBlKTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXNzYWdlRmFjdG9yeSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTUVTU0FHRV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhmMzdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmNjCkBAIC0wLDAgKzEsMzM0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3JzOiB3aW5rQGdvb2dsZS5jb20gKFdpbmsgU2F2aWxsZSksCisvLyAgICAgICAgICBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitNZXNzYWdlTGl0ZTo6fk1lc3NhZ2VMaXRlKCkge30KKworc3RyaW5nIE1lc3NhZ2VMaXRlOjpJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gIihjYW5ub3QgZGV0ZXJtaW5lIG1pc3NpbmcgZmllbGRzIGZvciBsaXRlIG1lc3NhZ2UpIjsKK30KKworbmFtZXNwYWNlIHsKKworLy8gV2hlbiBzZXJpYWxpemluZywgd2UgZmlyc3QgY29tcHV0ZSB0aGUgYnl0ZSBzaXplLCB0aGVuIHNlcmlhbGl6ZSB0aGUgbWVzc2FnZS4KKy8vIElmIHNlcmlhbGl6YXRpb24gcHJvZHVjZXMgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGJ5dGVzIHRoYW4gZXhwZWN0ZWQsIHdlCisvLyBjYWxsIHRoaXMgZnVuY3Rpb24sIHdoaWNoIGNyYXNoZXMuICBUaGUgcHJvYmxlbSBjb3VsZCBiZSBkdWUgdG8gYSBidWcgaW4gdGhlCisvLyBwcm90b2J1ZiBpbXBsZW1lbnRhdGlvbiBidXQgaXMgbW9yZSBsaWtlbHkgY2F1c2VkIGJ5IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCisvLyBvZiB0aGUgbWVzc2FnZS4gIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvIGFuZAorLy8gcHJvdmlkZSBhIHVzZWZ1bCBlcnJvciBtZXNzYWdlLgordm9pZCBCeXRlU2l6ZUNvbnNpc3RlbmN5RXJyb3IoaW50IGJ5dGVfc2l6ZV9iZWZvcmVfc2VyaWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlX3NpemVfYWZ0ZXJfc2VyaWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc19wcm9kdWNlZF9ieV9zZXJpYWxpemF0aW9uKSB7CisgIEdPT0dMRV9DSEVDS19FUShieXRlX3NpemVfYmVmb3JlX3NlcmlhbGl6YXRpb24sIGJ5dGVfc2l6ZV9hZnRlcl9zZXJpYWxpemF0aW9uKQorICAgICAgPDwgIlByb3RvY29sIG1lc3NhZ2Ugd2FzIG1vZGlmaWVkIGNvbmN1cnJlbnRseSBkdXJpbmcgc2VyaWFsaXphdGlvbi4iOworICBHT09HTEVfQ0hFQ0tfRVEoYnl0ZXNfcHJvZHVjZWRfYnlfc2VyaWFsaXphdGlvbiwgYnl0ZV9zaXplX2JlZm9yZV9zZXJpYWxpemF0aW9uKQorICAgICAgPDwgIkJ5dGUgc2l6ZSBjYWxjdWxhdGlvbiBhbmQgc2VyaWFsaXphdGlvbiB3ZXJlIGluY29uc2lzdGVudC4gIFRoaXMgIgorICAgICAgICAgIm1heSBpbmRpY2F0ZSBhIGJ1ZyBpbiBwcm90b2NvbCBidWZmZXJzIG9yIGl0IG1heSBiZSBjYXVzZWQgYnkgIgorICAgICAgICAgImNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZSBtZXNzYWdlLiI7CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJUaGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgaWYgYWxsIHRoZSBzaXplcyBhcmUgZXF1YWwuIjsKK30KKworc3RyaW5nIEluaXRpYWxpemF0aW9uRXJyb3JNZXNzYWdlKGNvbnN0IGNoYXIqIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgbWVzc2FnZSkgeworICAvLyBOb3RlOiAgV2Ugd2FudCB0byBhdm9pZCBkZXBlbmRpbmcgb24gc3RydXRpbCBpbiB0aGUgbGl0ZSBsaWJyYXJ5LCBvdGhlcndpc2UKKyAgLy8gICB3ZSdkIHVzZToKKyAgLy8KKyAgLy8gcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgIC8vICAgIkNhbid0ICQwIG1lc3NhZ2Ugb2YgdHlwZSBcIiQxXCIgYmVjYXVzZSBpdCBpcyBtaXNzaW5nIHJlcXVpcmVkICIKKyAgLy8gICAiZmllbGRzOiAkMiIsCisgIC8vICAgYWN0aW9uLCBtZXNzYWdlLkdldFR5cGVOYW1lKCksCisgIC8vICAgbWVzc2FnZS5Jbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkpOworCisgIHN0cmluZyByZXN1bHQ7CisgIHJlc3VsdCArPSAiQ2FuJ3QgIjsKKyAgcmVzdWx0ICs9IGFjdGlvbjsKKyAgcmVzdWx0ICs9ICIgbWVzc2FnZSBvZiB0eXBlIFwiIjsKKyAgcmVzdWx0ICs9IG1lc3NhZ2UuR2V0VHlwZU5hbWUoKTsKKyAgcmVzdWx0ICs9ICJcIiBiZWNhdXNlIGl0IGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiOworICByZXN1bHQgKz0gbWVzc2FnZS5Jbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIFNldmVyYWwgb2YgdGhlIFBhcnNlIG1ldGhvZHMgYmVsb3cganVzdCBkbyBvbmUgdGhpbmcgYW5kIHRoZW4gY2FsbCBhbm90aGVyCisvLyBtZXRob2QuICBJbiBhIG5haXZlIGltcGxlbWVudGF0aW9uLCB3ZSBtaWdodCBoYXZlIFBhcnNlRnJvbVN0cmluZygpIGNhbGwKKy8vIFBhcnNlRnJvbUFycmF5KCkgd2hpY2ggd291bGQgY2FsbCBQYXJzZUZyb21aZXJvQ29weVN0cmVhbSgpIHdoaWNoIHdvdWxkIGNhbGwKKy8vIFBhcnNlRnJvbUNvZGVkU3RyZWFtKCkgd2hpY2ggd291bGQgY2FsbCBNZXJnZUZyb21Db2RlZFN0cmVhbSgpIHdoaWNoIHdvdWxkCisvLyBjYWxsIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgpLiAgSG93ZXZlciwgd2hlbiBwYXJzaW5nIHZlcnkgc21hbGwKKy8vIG1lc3NhZ2VzLCBldmVyeSBmdW5jdGlvbiBjYWxsIGludHJvZHVjZXMgc2lnbmlmaWNhbnQgb3ZlcmhlYWQuICBUbyBhdm9pZAorLy8gdGhpcyB3aXRob3V0IHJlcHJvZHVjaW5nIGNvZGUsIHdlIHVzZSB0aGVzZSBmb3JjZWQtaW5saW5lIGhlbHBlcnMuCisvLworLy8gTm90ZTogIEdDQyBvbmx5IGFsbG93cyBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgb24gZGVjbGFyYXRpb25zLCBub3QKKy8vICAgZGVmaW5pdGlvbnMuCitpbmxpbmUgYm9vbCBJbmxpbmVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKK2lubGluZSBib29sIElubGluZVBhcnNlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworaW5saW5lIGJvb2wgSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkU7CitpbmxpbmUgYm9vbCBJbmxpbmVQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworaW5saW5lIGJvb2wgSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKKworYm9vbCBJbmxpbmVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKSB7CisgIGlmICghbWVzc2FnZS0+TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KSkgcmV0dXJuIGZhbHNlOworICBpZiAoIW1lc3NhZ2UtPklzSW5pdGlhbGl6ZWQoKSkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8IEluaXRpYWxpemF0aW9uRXJyb3JNZXNzYWdlKCJwYXJzZSIsICptZXNzYWdlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSW5saW5lUGFyc2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgeworICBtZXNzYWdlLT5DbGVhcigpOworICByZXR1cm4gSW5saW5lTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW5wdXQsIG1lc3NhZ2UpOworfQorCitib29sIElubGluZVBhcnNlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgeworICBtZXNzYWdlLT5DbGVhcigpOworICByZXR1cm4gbWVzc2FnZS0+TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KTsKK30KKworYm9vbCBJbmxpbmVQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRhdGEpLCBzaXplKTsKKyAgcmV0dXJuIElubGluZVBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCwgbWVzc2FnZSkgJiYKKyAgICAgICAgIGlucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpOworfQorCitib29sIElubGluZVBhcnNlUGFydGlhbEZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKSB7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhKSwgc2l6ZSk7CisgIHJldHVybiBJbmxpbmVQYXJzZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmlucHV0LCBtZXNzYWdlKSAmJgorICAgICAgICAgaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIE1lc3NhZ2VMaXRlOjpNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgcmV0dXJuIElubGluZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlucHV0LCB0aGlzKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIHJldHVybiBJbmxpbmVQYXJzZUZyb21Db2RlZFN0cmVhbShpbnB1dCwgdGhpcyk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlBhcnNlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgcmV0dXJuIElubGluZVBhcnNlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbnB1dCwgdGhpcyk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCkgeworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBkZWNvZGVyKGlucHV0KTsKKyAgcmV0dXJuIFBhcnNlRnJvbUNvZGVkU3RyZWFtKCZkZWNvZGVyKSAmJiBkZWNvZGVyLkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpQYXJzZVBhcnRpYWxGcm9tWmVyb0NvcHlTdHJlYW0oCisgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGRlY29kZXIoaW5wdXQpOworICByZXR1cm4gUGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKCZkZWNvZGVyKSAmJgorICAgICAgICAgZGVjb2Rlci5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKAorICAgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgaW50IHNpemUpIHsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gZGVjb2RlcihpbnB1dCk7CisgIGRlY29kZXIuUHVzaExpbWl0KHNpemUpOworICByZXR1cm4gUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmRlY29kZXIpICYmCisgICAgICAgICBkZWNvZGVyLkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpICYmCisgICAgICAgICBkZWNvZGVyLkJ5dGVzVW50aWxMaW1pdCgpID09IDA7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlBhcnNlUGFydGlhbEZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oCisgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBpbnQgc2l6ZSkgeworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBkZWNvZGVyKGlucHV0KTsKKyAgZGVjb2Rlci5QdXNoTGltaXQoc2l6ZSk7CisgIHJldHVybiBQYXJzZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmRlY29kZXIpICYmCisgICAgICAgICBkZWNvZGVyLkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpICYmCisgICAgICAgICBkZWNvZGVyLkJ5dGVzVW50aWxMaW1pdCgpID09IDA7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlBhcnNlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGRhdGEpIHsKKyAgcmV0dXJuIElubGluZVBhcnNlRnJvbUFycmF5KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSwgdGhpcyk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlBhcnNlUGFydGlhbEZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBkYXRhKSB7CisgIHJldHVybiBJbmxpbmVQYXJzZVBhcnRpYWxGcm9tQXJyYXkoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpLCB0aGlzKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpIHsKKyAgcmV0dXJuIElubGluZVBhcnNlRnJvbUFycmF5KGRhdGEsIHNpemUsIHRoaXMpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpQYXJzZVBhcnRpYWxGcm9tQXJyYXkoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpIHsKKyAgcmV0dXJuIElubGluZVBhcnNlUGFydGlhbEZyb21BcnJheShkYXRhLCBzaXplLCB0aGlzKTsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3VpbnQ4KiBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIFdlIG9ubHkgb3B0aW1pemUgdGhpcyB3aGVuIHVzaW5nIG9wdGltaXplX2ZvciA9IFNQRUVELiAgSW4gb3RoZXIgY2FzZXMKKyAgLy8gd2UganVzdCB1c2UgdGhlIENvZGVkT3V0cHV0U3RyZWFtIHBhdGguCisgIGludCBzaXplID0gR2V0Q2FjaGVkU2l6ZSgpOworICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gb3V0KHRhcmdldCwgc2l6ZSk7CisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXQoJm91dCk7CisgIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmY29kZWRfb3V0KTsKKyAgR09PR0xFX0NIRUNLKCFjb2RlZF9vdXQuSGFkRXJyb3IoKSk7CisgIHJldHVybiB0YXJnZXQgKyBzaXplOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVUb0NvZGVkU3RyZWFtKGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0soSXNJbml0aWFsaXplZCgpKSA8PCBJbml0aWFsaXphdGlvbkVycm9yTWVzc2FnZSgic2VyaWFsaXplIiwgKnRoaXMpOworICByZXR1cm4gU2VyaWFsaXplUGFydGlhbFRvQ29kZWRTdHJlYW0ob3V0cHV0KTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplUGFydGlhbFRvQ29kZWRTdHJlYW0oCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgY29uc3QgaW50IHNpemUgPSBCeXRlU2l6ZSgpOyAgLy8gRm9yY2Ugc2l6ZSB0byBiZSBjYWNoZWQuCisgIHVpbnQ4KiBidWZmZXIgPSBvdXRwdXQtPkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2Uoc2l6ZSk7CisgIGlmIChidWZmZXIgIT0gTlVMTCkgeworICAgIHVpbnQ4KiBlbmQgPSBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGJ1ZmZlcik7CisgICAgaWYgKGVuZCAtIGJ1ZmZlciAhPSBzaXplKSB7CisgICAgICBCeXRlU2l6ZUNvbnNpc3RlbmN5RXJyb3Ioc2l6ZSwgQnl0ZVNpemUoKSwgZW5kIC0gYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgaW50IG9yaWdpbmFsX2J5dGVfY291bnQgPSBvdXRwdXQtPkJ5dGVDb3VudCgpOworICAgIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhvdXRwdXQpOworICAgIGlmIChvdXRwdXQtPkhhZEVycm9yKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaW50IGZpbmFsX2J5dGVfY291bnQgPSBvdXRwdXQtPkJ5dGVDb3VudCgpOworCisgICAgaWYgKGZpbmFsX2J5dGVfY291bnQgLSBvcmlnaW5hbF9ieXRlX2NvdW50ICE9IHNpemUpIHsKKyAgICAgIEJ5dGVTaXplQ29uc2lzdGVuY3lFcnJvcihzaXplLCBCeXRlU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX2J5dGVfY291bnQgLSBvcmlnaW5hbF9ieXRlX2NvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitib29sIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKAorICAgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBlbmNvZGVyKG91dHB1dCk7CisgIHJldHVybiBTZXJpYWxpemVUb0NvZGVkU3RyZWFtKCZlbmNvZGVyKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplUGFydGlhbFRvWmVyb0NvcHlTdHJlYW0oCisgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIGVuY29kZXIob3V0cHV0KTsKKyAgcmV0dXJuIFNlcmlhbGl6ZVBhcnRpYWxUb0NvZGVkU3RyZWFtKCZlbmNvZGVyKTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6QXBwZW5kVG9TdHJpbmcoc3RyaW5nKiBvdXRwdXQpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhJc0luaXRpYWxpemVkKCkpIDw8IEluaXRpYWxpemF0aW9uRXJyb3JNZXNzYWdlKCJzZXJpYWxpemUiLCAqdGhpcyk7CisgIHJldHVybiBBcHBlbmRQYXJ0aWFsVG9TdHJpbmcob3V0cHV0KTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6QXBwZW5kUGFydGlhbFRvU3RyaW5nKHN0cmluZyogb3V0cHV0KSBjb25zdCB7CisgIGludCBvbGRfc2l6ZSA9IG91dHB1dC0+c2l6ZSgpOworICBpbnQgYnl0ZV9zaXplID0gQnl0ZVNpemUoKTsKKyAgU1RMU3RyaW5nUmVzaXplVW5pbml0aWFsaXplZChvdXRwdXQsIG9sZF9zaXplICsgYnl0ZV9zaXplKTsKKyAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheShvdXRwdXQpICsgb2xkX3NpemUpOworICB1aW50OCogZW5kID0gU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7CisgIGlmIChlbmQgLSBzdGFydCAhPSBieXRlX3NpemUpIHsKKyAgICBCeXRlU2l6ZUNvbnNpc3RlbmN5RXJyb3IoYnl0ZV9zaXplLCBCeXRlU2l6ZSgpLCBlbmQgLSBzdGFydCk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVRvU3RyaW5nKHN0cmluZyogb3V0cHV0KSBjb25zdCB7CisgIG91dHB1dC0+Y2xlYXIoKTsKKyAgcmV0dXJuIEFwcGVuZFRvU3RyaW5nKG91dHB1dCk7Cit9CisKK2Jvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyhzdHJpbmcqIG91dHB1dCkgY29uc3QgeworICBvdXRwdXQtPmNsZWFyKCk7CisgIHJldHVybiBBcHBlbmRQYXJ0aWFsVG9TdHJpbmcob3V0cHV0KTsKK30KKworYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplVG9BcnJheSh2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfRENIRUNLKElzSW5pdGlhbGl6ZWQoKSkgPDwgSW5pdGlhbGl6YXRpb25FcnJvck1lc3NhZ2UoInNlcmlhbGl6ZSIsICp0aGlzKTsKKyAgcmV0dXJuIFNlcmlhbGl6ZVBhcnRpYWxUb0FycmF5KGRhdGEsIHNpemUpOworfQorCitib29sIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVQYXJ0aWFsVG9BcnJheSh2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgY29uc3QgeworICBpbnQgYnl0ZV9zaXplID0gQnl0ZVNpemUoKTsKKyAgaWYgKHNpemUgPCBieXRlX3NpemUpIHJldHVybiBmYWxzZTsKKyAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGRhdGEpOworICB1aW50OCogZW5kID0gU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7CisgIGlmIChlbmQgLSBzdGFydCAhPSBieXRlX3NpemUpIHsKKyAgICBCeXRlU2l6ZUNvbnNpc3RlbmN5RXJyb3IoYnl0ZV9zaXplLCBCeXRlU2l6ZSgpLCBlbmQgLSBzdGFydCk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0cmluZyBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplQXNTdHJpbmcoKSBjb25zdCB7CisgIC8vIElmIHRoZSBjb21waWxlciBpbXBsZW1lbnRzIHRoZSAoTmFtZWQpIFJldHVybiBWYWx1ZSBPcHRpbWl6YXRpb24sCisgIC8vIHRoZSBsb2NhbCB2YXJpYWJsZSAncmVzdWx0JyB3aWxsIG5vdCBhY3R1YWxseSByZXNpZGUgb24gdGhlIHN0YWNrCisgIC8vIG9mIHRoaXMgZnVuY3Rpb24sIGJ1dCB3aWxsIGJlIG92ZXJsYWlkIHdpdGggdGhlIG9iamVjdCB0aGF0IHRoZQorICAvLyBjYWxsZXIgc3VwcGxpZWQgZm9yIHRoZSByZXR1cm4gdmFsdWUgdG8gYmUgY29uc3RydWN0ZWQgaW4uCisgIHN0cmluZyBvdXRwdXQ7CisgIGlmICghQXBwZW5kVG9TdHJpbmcoJm91dHB1dCkpCisgICAgb3V0cHV0LmNsZWFyKCk7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0cmluZyBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplUGFydGlhbEFzU3RyaW5nKCkgY29uc3QgeworICBzdHJpbmcgb3V0cHV0OworICBpZiAoIUFwcGVuZFBhcnRpYWxUb1N0cmluZygmb3V0cHV0KSkKKyAgICBvdXRwdXQuY2xlYXIoKTsKKyAgcmV0dXJuIG91dHB1dDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjRiYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaApAQCAtMCwwICsxLDIzOSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yczogd2lua0Bnb29nbGUuY29tIChXaW5rIFNhdmlsbGUpLAorLy8gICAgICAgICAga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIERlZmluZXMgTWVzc2FnZUxpdGUsIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYWxsIChsaXRlCisvLyBhbmQgbm9uLWxpdGUpIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0cy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTUVTU0FHRV9MSVRFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUVTU0FHRV9MSVRFX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBJbnRlcmZhY2UgdG8gbGlnaHQgd2VpZ2h0IHByb3RvY29sIG1lc3NhZ2VzLgorLy8KKy8vIFRoaXMgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGFsbCBwcm90b2NvbCBtZXNzYWdlIG9iamVjdHMuICBOb24tbGl0ZQorLy8gbWVzc2FnZXMgYWRkaXRpb25hbGx5IGltcGxlbWVudCB0aGUgTWVzc2FnZSBpbnRlcmZhY2UsIHdoaWNoIGlzIGEKKy8vIHN1YmNsYXNzIG9mIE1lc3NhZ2VMaXRlLiAgVXNlIE1lc3NhZ2VMaXRlIGluc3RlYWQgd2hlbiB5b3Ugb25seSBuZWVkCisvLyB0aGUgc3Vic2V0IG9mIGZlYXR1cmVzIHdoaWNoIGl0IHN1cHBvcnRzIC0tIG5hbWVseSwgbm90aGluZyB0aGF0IHVzZXMKKy8vIGRlc2NyaXB0b3JzIG9yIHJlZmxlY3Rpb24uICBZb3UgY2FuIGluc3RydWN0IHRoZSBwcm90b2NvbCBjb21waWxlcgorLy8gdG8gZ2VuZXJhdGUgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgb25seSBNZXNzYWdlTGl0ZSwgbm90IHRoZSBmdWxsCisvLyBNZXNzYWdlIGludGVyZmFjZSwgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgbGluZSB0byB0aGUgLnByb3RvIGZpbGU6CisvLworLy8gICBvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworLy8KKy8vIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBvbiByZXNvdXJjZS1jb25zdHJhaW5lZCBzeXN0ZW1zIHdoZXJlCisvLyB0aGUgZnVsbCBwcm90b2NvbCBidWZmZXJzIHJ1bnRpbWUgbGlicmFyeSBpcyB0b28gYmlnLgorLy8KKy8vIE5vdGUgdGhhdCBvbiBub24tY29uc3RyYWluZWQgc3lzdGVtcyAoZS5nLiBzZXJ2ZXJzKSB3aGVuIHlvdSBuZWVkCisvLyB0byBsaW5rIGluIGxvdHMgb2YgcHJvdG9jb2wgZGVmaW5pdGlvbnMsIGEgYmV0dGVyIHdheSB0byByZWR1Y2UKKy8vIHRvdGFsIGNvZGUgZm9vdHByaW50IGlzIHRvIHVzZSBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkUuICBUaGlzCisvLyB3aWxsIG1ha2UgdGhlIGdlbmVyYXRlZCBjb2RlIHNtYWxsZXIgd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBhbGwgdGhlCisvLyBzYW1lIGZlYXR1cmVzIChhdCB0aGUgZXhwZW5zZSBvZiBzcGVlZCkuICBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUKKy8vIGlzIGJlc3Qgd2hlbiB5b3Ugb25seSBoYXZlIGEgc21hbGwgbnVtYmVyIG9mIG1lc3NhZ2UgdHlwZXMgbGlua2VkCisvLyBpbnRvIHlvdXIgYmluYXJ5LCBpbiB3aGljaCBjYXNlIHRoZSBzaXplIG9mIHRoZSBwcm90b2NvbCBidWZmZXJzCisvLyBydW50aW1lIGl0c2VsZiBpcyB0aGUgYmlnZ2VzdCBwcm9ibGVtLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE1lc3NhZ2VMaXRlIHsKKyBwdWJsaWM6CisgIGlubGluZSBNZXNzYWdlTGl0ZSgpIHt9CisgIHZpcnR1YWwgfk1lc3NhZ2VMaXRlKCk7CisKKyAgLy8gQmFzaWMgT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhpcyBtZXNzYWdlIHR5cGUsIGUuZy4gImZvby5iYXIuQmF6UHJvdG8iLgorICB2aXJ0dWFsIHN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0ID0gMDsKKworICAvLyBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgdHlwZS4gIE93bmVyc2hpcCBpcyBwYXNzZWQgdG8gdGhlCisgIC8vIGNhbGxlci4KKyAgdmlydHVhbCBNZXNzYWdlTGl0ZSogTmV3KCkgY29uc3QgPSAwOworCisgIC8vIENsZWFyIGFsbCBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgYW5kIHNldCB0aGVtIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAvLyBDbGVhcigpIGF2b2lkcyBmcmVlaW5nIG1lbW9yeSwgYXNzdW1pbmcgdGhhdCBhbnkgbWVtb3J5IGFsbG9jYXRlZAorICAvLyB0byBob2xkIHBhcnRzIG9mIHRoZSBtZXNzYWdlIHdpbGwgYmUgbmVlZGVkIGFnYWluIHRvIGhvbGQgdGhlIG5leHQKKyAgLy8gbWVzc2FnZS4gIElmIHlvdSBhY3R1YWxseSB3YW50IHRvIGZyZWUgdGhlIG1lbW9yeSB1c2VkIGJ5IGEgTWVzc2FnZSwKKyAgLy8geW91IG11c3QgZGVsZXRlIGl0LgorICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKSA9IDA7CisKKyAgLy8gUXVpY2tseSBjaGVjayBpZiBhbGwgcmVxdWlyZWQgZmllbGRzIGhhdmUgdmFsdWVzIHNldC4KKyAgdmlydHVhbCBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCA9IDA7CisKKyAgLy8gVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIExpdGUgbWVzc2FnZXMgLS0gaXQganVzdCByZXR1cm5zICIoY2Fubm90CisgIC8vIGRldGVybWluZSBtaXNzaW5nIGZpZWxkcyBmb3IgbGl0ZSBtZXNzYWdlKSIuICBIb3dldmVyLCBpdCBpcyBpbXBsZW1lbnRlZAorICAvLyBmb3IgZnVsbCBtZXNzYWdlcy4gIFNlZSBtZXNzYWdlLmguCisgIHZpcnR1YWwgc3RyaW5nIEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSBjb25zdDsKKworICAvLyBJZiB8b3RoZXJ8IGlzIHRoZSBleGFjdCBzYW1lIGNsYXNzIGFzIHRoaXMsIGNhbGxzIE1lcmdlRnJvbSgpLiAgT3RoZXJ3aXNlLAorICAvLyByZXN1bHRzIGFyZSB1bmRlZmluZWQgKHByb2JhYmx5IGNyYXNoKS4KKyAgdmlydHVhbCB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCBNZXNzYWdlTGl0ZSYgb3RoZXIpID0gMDsKKworICAvLyBQYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBNZXRob2RzIGZvciBwYXJzaW5nIGluIHByb3RvY29sIGJ1ZmZlciBmb3JtYXQuICBNb3N0IG9mIHRoZXNlIGFyZQorICAvLyBqdXN0IHNpbXBsZSB3cmFwcGVycyBhcm91bmQgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKS4KKworICAvLyBGaWxsIHRoZSBtZXNzYWdlIHdpdGggYSBwcm90b2NvbCBidWZmZXIgcGFyc2VkIGZyb20gdGhlIGdpdmVuIGlucHV0CisgIC8vIHN0cmVhbS4gIFJldHVybnMgZmFsc2Ugb24gYSByZWFkIGVycm9yIG9yIGlmIHRoZSBpbnB1dCBpcyBpbiB0aGUKKyAgLy8gd3JvbmcgZm9ybWF0LgorICBib29sIFBhcnNlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIC8vIExpa2UgUGFyc2VGcm9tQ29kZWRTdHJlYW0oKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZworICAvLyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIC8vIFJlYWQgYSBwcm90b2NvbCBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gemVyby1jb3B5IGlucHV0IHN0cmVhbS4gIElmCisgIC8vIHN1Y2Nlc3NmdWwsIHRoZSBlbnRpcmUgaW5wdXQgd2lsbCBiZSBjb25zdW1lZC4KKyAgYm9vbCBQYXJzZUZyb21aZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOworICAvLyBMaWtlIFBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKCksIGJ1dCBhY2NlcHRzIG1lc3NhZ2VzIHRoYXQgYXJlIG1pc3NpbmcKKyAgLy8gcmVxdWlyZWQgZmllbGRzLgorICBib29sIFBhcnNlUGFydGlhbEZyb21aZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOworICAvLyBSZWFkIGEgcHJvdG9jb2wgYnVmZmVyIGZyb20gdGhlIGdpdmVuIHplcm8tY29weSBpbnB1dCBzdHJlYW0sIGV4cGVjdGluZworICAvLyB0aGUgbWVzc2FnZSB0byBiZSBleGFjdGx5ICJzaXplIiBieXRlcyBsb25nLiAgSWYgc3VjY2Vzc2Z1bCwgZXhhY3RseQorICAvLyB0aGlzIG1hbnkgYnl0ZXMgd2lsbCBoYXZlIGJlZW4gY29uc3VtZWQgZnJvbSB0aGUgaW5wdXQuCisgIGJvb2wgUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgaW50IHNpemUpOworICAvLyBMaWtlIFBhcnNlRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbSgpLCBidXQgYWNjZXB0cyBtZXNzYWdlcyB0aGF0IGFyZQorICAvLyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBQYXJzZVBhcnRpYWxGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKTsKKyAgLy8gUGFyc2UgYSBwcm90b2NvbCBidWZmZXIgY29udGFpbmVkIGluIGEgc3RyaW5nLgorICBib29sIFBhcnNlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGRhdGEpOworICAvLyBMaWtlIFBhcnNlRnJvbVN0cmluZygpLCBidXQgYWNjZXB0cyBtZXNzYWdlcyB0aGF0IGFyZSBtaXNzaW5nCisgIC8vIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBQYXJzZVBhcnRpYWxGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgZGF0YSk7CisgIC8vIFBhcnNlIGEgcHJvdG9jb2wgYnVmZmVyIGNvbnRhaW5lZCBpbiBhbiBhcnJheSBvZiBieXRlcy4KKyAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSk7CisgIC8vIExpa2UgUGFyc2VGcm9tQXJyYXkoKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZworICAvLyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKTsKKworCisgIC8vIFJlYWRzIGEgcHJvdG9jb2wgYnVmZmVyIGZyb20gdGhlIHN0cmVhbSBhbmQgbWVyZ2VzIGl0IGludG8gdGhpcworICAvLyBNZXNzYWdlLiAgU2luZ3VsYXIgZmllbGRzIHJlYWQgZnJvbSB0aGUgaW5wdXQgb3ZlcndyaXRlIHdoYXQgaXMKKyAgLy8gYWxyZWFkeSBpbiB0aGUgTWVzc2FnZSBhbmQgcmVwZWF0ZWQgZmllbGRzIGFyZSBhcHBlbmRlZCB0byB0aG9zZQorICAvLyBhbHJlYWR5IHByZXNlbnQuCisgIC8vCisgIC8vIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGNhbGwgaW5wdXQtPkxhc3RUYWdXYXMoKQorICAvLyAoZm9yIGdyb3Vwcykgb3IgaW5wdXQtPkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpIChmb3Igbm9uLWdyb3VwcykgYWZ0ZXIKKyAgLy8gdGhpcyByZXR1cm5zIHRvIHZlcmlmeSB0aGF0IHRoZSBtZXNzYWdlJ3MgZW5kIHdhcyBkZWxpbWl0ZWQgY29ycmVjdGx5LgorICAvLworICAvLyBQYXJzZWZyb21Db2RlZFN0cmVhbSgpIGlzIGltcGxlbWVudGVkIGFzIENsZWFyKCkgZm9sbG93ZWQgYnkKKyAgLy8gTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKS4KKyAgYm9vbCBNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworCisgIC8vIExpa2UgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSwgYnV0IHN1Y2NlZWRzIGV2ZW4gaWYgcmVxdWlyZWQgZmllbGRzIGFyZQorICAvLyBtaXNzaW5nIGluIHRoZSBpbnB1dC4KKyAgLy8KKyAgLy8gTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSBpcyBqdXN0IGltcGxlbWVudGVkIGFzIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgpCisgIC8vIGZvbGxvd2VkIGJ5IElzSW5pdGlhbGl6ZWQoKS4KKyAgdmlydHVhbCBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpID0gMDsKKworICAvLyBTZXJpYWxpemF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBNZXRob2RzIGZvciBzZXJpYWxpemluZyBpbiBwcm90b2NvbCBidWZmZXIgZm9ybWF0LiAgTW9zdCBvZiB0aGVzZQorICAvLyBhcmUganVzdCBzaW1wbGUgd3JhcHBlcnMgYXJvdW5kIEJ5dGVTaXplKCkgYW5kIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpLgorCisgIC8vIFdyaXRlIGEgcHJvdG9jb2wgYnVmZmVyIG9mIHRoaXMgbWVzc2FnZSB0byB0aGUgZ2l2ZW4gb3V0cHV0LiAgUmV0dXJucworICAvLyBmYWxzZSBvbiBhIHdyaXRlIGVycm9yLiAgSWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMsCisgIC8vIHRoaXMgbWF5IEdPT0dMRV9DSEVDSy1mYWlsLgorICBib29sIFNlcmlhbGl6ZVRvQ29kZWRTdHJlYW0oaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICAvLyBMaWtlIFNlcmlhbGl6ZVRvQ29kZWRTdHJlYW0oKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBTZXJpYWxpemVQYXJ0aWFsVG9Db2RlZFN0cmVhbShpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIC8vIFdyaXRlIHRoZSBtZXNzYWdlIHRvIHRoZSBnaXZlbiB6ZXJvLWNvcHkgb3V0cHV0IHN0cmVhbS4gIEFsbCByZXF1aXJlZAorICAvLyBmaWVsZHMgbXVzdCBiZSBzZXQuCisgIGJvb2wgU2VyaWFsaXplVG9aZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIC8vIExpa2UgU2VyaWFsaXplVG9aZXJvQ29weVN0cmVhbSgpLCBidXQgYWxsb3dzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgorICBib29sIFNlcmlhbGl6ZVBhcnRpYWxUb1plcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgLy8gU2VyaWFsaXplIHRoZSBtZXNzYWdlIGFuZCBzdG9yZSBpdCBpbiB0aGUgZ2l2ZW4gc3RyaW5nLiAgQWxsIHJlcXVpcmVkCisgIC8vIGZpZWxkcyBtdXN0IGJlIHNldC4KKyAgYm9vbCBTZXJpYWxpemVUb1N0cmluZyhzdHJpbmcqIG91dHB1dCkgY29uc3Q7CisgIC8vIExpa2UgU2VyaWFsaXplVG9TdHJpbmcoKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgYm9vbCBTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoc3RyaW5nKiBvdXRwdXQpIGNvbnN0OworICAvLyBTZXJpYWxpemUgdGhlIG1lc3NhZ2UgYW5kIHN0b3JlIGl0IGluIHRoZSBnaXZlbiBieXRlIGFycmF5LiAgQWxsIHJlcXVpcmVkCisgIC8vIGZpZWxkcyBtdXN0IGJlIHNldC4KKyAgYm9vbCBTZXJpYWxpemVUb0FycmF5KHZvaWQqIGRhdGEsIGludCBzaXplKSBjb25zdDsKKyAgLy8gTGlrZSBTZXJpYWxpemVUb0FycmF5KCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgU2VyaWFsaXplUGFydGlhbFRvQXJyYXkodm9pZCogZGF0YSwgaW50IHNpemUpIGNvbnN0OworCisgIC8vIE1ha2UgYSBzdHJpbmcgZW5jb2RpbmcgdGhlIG1lc3NhZ2UuIElzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworICAvLyBTZXJpYWxpemVUb1N0cmluZygpIG9uIGEgc3RyaW5nIGFuZCB1c2luZyB0aGF0LiAgUmV0dXJucyB0aGUgZW1wdHkKKyAgLy8gc3RyaW5nIGlmIFNlcmlhbGl6ZVRvU3RyaW5nKCkgd291bGQgaGF2ZSByZXR1cm5lZCBhbiBlcnJvci4KKyAgLy8gTm90ZTogSWYgeW91IGludGVuZCB0byBnZW5lcmF0ZSBtYW55IHN1Y2ggc3RyaW5ncywgeW91IG1heQorICAvLyByZWR1Y2UgaGVhcCBmcmFnbWVudGF0aW9uIGJ5IGluc3RlYWQgcmUtdXNpbmcgdGhlIHNhbWUgc3RyaW5nCisgIC8vIG9iamVjdCB3aXRoIGNhbGxzIHRvIFNlcmlhbGl6ZVRvU3RyaW5nKCkuCisgIHN0cmluZyBTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0OworICAvLyBMaWtlIFNlcmlhbGl6ZUFzU3RyaW5nKCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIHN0cmluZyBTZXJpYWxpemVQYXJ0aWFsQXNTdHJpbmcoKSBjb25zdDsKKworICAvLyBMaWtlIFNlcmlhbGl6ZVRvU3RyaW5nKCksIGJ1dCBhcHBlbmRzIHRvIHRoZSBkYXRhIHRvIHRoZSBzdHJpbmcncyBleGlzdGluZworICAvLyBjb250ZW50cy4gIEFsbCByZXF1aXJlZCBmaWVsZHMgbXVzdCBiZSBzZXQuCisgIGJvb2wgQXBwZW5kVG9TdHJpbmcoc3RyaW5nKiBvdXRwdXQpIGNvbnN0OworICAvLyBMaWtlIEFwcGVuZFRvU3RyaW5nKCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgIGJvb2wgQXBwZW5kUGFydGlhbFRvU3RyaW5nKHN0cmluZyogb3V0cHV0KSBjb25zdDsKKworICAvLyBDb21wdXRlcyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIHRoZSBtZXNzYWdlLiAgVGhpcyByZWN1cnNpdmVseSBjYWxscworICAvLyBCeXRlU2l6ZSgpIG9uIGFsbCBlbWJlZGRlZCBtZXNzYWdlcy4gIElmIGEgc3ViY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUKKyAgLy8gdGhpcywgaXQgTVVTVCBvdmVycmlkZSBTZXRDYWNoZWRTaXplKCkuCisgIHZpcnR1YWwgaW50IEJ5dGVTaXplKCkgY29uc3QgPSAwOworCisgIC8vIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2Ugd2l0aG91dCByZWNvbXB1dGluZyB0aGUgc2l6ZS4gIFRoZSBtZXNzYWdlIG11c3QKKyAgLy8gbm90IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIEJ5dGVTaXplKCk7IGlmIGl0IGhhcywgdGhlIHJlc3VsdHMKKyAgLy8gYXJlIHVuZGVmaW5lZC4KKyAgdmlydHVhbCB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCA9IDA7CisKKyAgLy8gTGlrZSBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMsIGJ1dCB3cml0ZXMgZGlyZWN0bHkgdG8gKnRhcmdldCwgcmV0dXJuaW5nCisgIC8vIGEgcG9pbnRlciB0byB0aGUgYnl0ZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBieXRlIHdyaXR0ZW4uICAidGFyZ2V0IgorICAvLyBtdXN0IHBvaW50IGF0IGEgYnl0ZSBhcnJheSBvZiBhdCBsZWFzdCBCeXRlU2l6ZSgpIGJ5dGVzLgorICB2aXJ0dWFsIHVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHVpbnQ4KiB0YXJnZXQpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBjYWxsIHRvIEJ5dGVTaXplKCkuICBBbiBlbWJlZGRlZCBtZXNzYWdlJ3MKKyAgLy8gc2l6ZSBpcyBuZWVkZWQgYm90aCB0byBzZXJpYWxpemUgaXQgKGJlY2F1c2UgZW1iZWRkZWQgbWVzc2FnZXMgYXJlCisgIC8vIGxlbmd0aC1kZWxpbWl0ZWQpIGFuZCB0byBjb21wdXRlIHRoZSBvdXRlciBtZXNzYWdlJ3Mgc2l6ZS4gIENhY2hpbmcKKyAgLy8gdGhlIHNpemUgYXZvaWRzIGNvbXB1dGluZyBpdCBtdWx0aXBsZSB0aW1lcy4KKyAgLy8KKyAgLy8gQnl0ZVNpemUoKSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHVzZSB0aGUgY2FjaGVkIHNpemUgd2hlbiBhdmFpbGFibGUKKyAgLy8gYmVjYXVzZSB0aGlzIHdvdWxkIHJlcXVpcmUgaW52YWxpZGF0aW5nIGl0IGV2ZXJ5IHRpbWUgdGhlIG1lc3NhZ2Ugd2FzCisgIC8vIG1vZGlmaWVkLCB3aGljaCB3b3VsZCBiZSB0b28gaGFyZCBhbmQgZXhwZW5zaXZlLiAgKEUuZy4gaWYgYSBkZWVwbHktbmVzdGVkCisgIC8vIHN1Yi1tZXNzYWdlIGlzIGNoYW5nZWQsIGFsbCBvZiBpdHMgcGFyZW50cycgY2FjaGVkIHNpemVzIHdvdWxkIG5lZWQgdG8gYmUKKyAgLy8gaW52YWxpZGF0ZWQsIHdoaWNoIGlzIHRvbyBtdWNoIHdvcmsgZm9yIGFuIG90aGVyd2lzZSBpbmxpbmVkIHNldHRlcgorICAvLyBtZXRob2QuKQorICB2aXJ0dWFsIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VMaXRlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9NRVNTQUdFX0xJVEVfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I5ZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYwpAQCAtMCwwICsxLDI4MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworI2lmbmRlZiBPX0JJTkFSWQorI2lmZGVmIF9PX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSBfT19CSU5BUlkKKyNlbHNlCisjZGVmaW5lIE9fQklOQVJZIDAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIHBsYXRmb3JtIGRvZXNuJ3QgbmVlZCBpdC4KKyNlbmRpZgorI2VuZGlmCisKK1RFU1QoTWVzc2FnZVRlc3QsIFNlcmlhbGl6ZUhlbHBlcnMpIHsKKyAgLy8gVE9ETyhrZW50b24pOiAgVGVzdCBtb3JlIGhlbHBlcnM/ICBUaGV5J3JlIGFsbCB0d28tbGluZXJzIHNvIGl0IHNlZW1zCisgIC8vICAgbGlrZSBhIHdhc3RlIG9mIHRpbWUuCisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKyAgc3RyaW5nc3RyZWFtIHN0cmVhbTsKKworICBzdHJpbmcgc3RyMSgiZm9vIik7CisgIHN0cmluZyBzdHIyKCJiYXIiKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzdHIxKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuQXBwZW5kVG9TdHJpbmcoJnN0cjIpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5TZXJpYWxpemVUb09zdHJlYW0oJnN0cmVhbSkpOworCisgIEVYUEVDVF9FUShzdHIxLnNpemUoKSArIDMsIHN0cjIuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCBzdHIyLnN1YnN0cigwLCAzKSk7CisgIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGR1bXAgcmF3IGJpbmFyeSBkYXRhIHRvCisgIC8vIHN0ZG91dC4KKyAgRVhQRUNUX1RSVUUoc3RyMi5zdWJzdHIoMykgPT0gc3RyMSk7CisKKyAgLy8gR0NDIGdpdmVzIHNvbWUgc29ydCBvZiBlcnJvciBpZiB3ZSB0cnkgdG8ganVzdCBkbyBzdHJlYW0uc3RyKCkgPT0gc3RyMS4KKyAgc3RyaW5nIHRlbXAgPSBzdHJlYW0uc3RyKCk7CisgIEVYUEVDVF9UUlVFKHRlbXAgPT0gc3RyMSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpID09IHN0cjEpOworCit9CisKK1RFU1QoTWVzc2FnZVRlc3QsIFNlcmlhbGl6ZVRvQnJva2VuT3N0cmVhbSkgeworICBvZnN0cmVhbSBvdXQ7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50MzIoMTIzKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5TZXJpYWxpemVUb09zdHJlYW0oJm91dCkpOworfQorCitURVNUKE1lc3NhZ2VUZXN0LCBQYXJzZUZyb21GaWxlRGVzY3JpcHRvcikgeworICBzdHJpbmcgZmlsZW5hbWUgPSBUZXN0U291cmNlRGlyKCkgKworICAgICAgICAgICAgICAgICAgICAiL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZSI7CisgIGludCBmaWxlID0gb3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1JET05MWSB8IE9fQklOQVJZKTsKKworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tRmlsZURlc2NyaXB0b3IoZmlsZSkpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworCisgIEVYUEVDVF9HRShjbG9zZShmaWxlKSwgMCk7Cit9CisKK1RFU1QoTWVzc2FnZVRlc3QsIFBhcnNlUGFja2VkRnJvbUZpbGVEZXNjcmlwdG9yKSB7CisgIHN0cmluZyBmaWxlbmFtZSA9CisgICAgICBUZXN0U291cmNlRGlyKCkgKworICAgICAgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZSI7CisgIGludCBmaWxlID0gb3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1JET05MWSB8IE9fQklOQVJZKTsKKworICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2U7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tRmlsZURlc2NyaXB0b3IoZmlsZSkpOworICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KG1lc3NhZ2UpOworCisgIEVYUEVDVF9HRShjbG9zZShmaWxlKSwgMCk7Cit9CisKK1RFU1QoTWVzc2FnZVRlc3QsIFBhcnNlSGVscGVycykgeworICAvLyBUT0RPKGtlbnRvbik6ICBUZXN0IG1vcmUgaGVscGVycz8gIFRoZXkncmUgYWxsIHR3by1saW5lcnMgc28gaXQgc2VlbXMKKyAgLy8gICBsaWtlIGEgd2FzdGUgb2YgdGltZS4KKyAgc3RyaW5nIGRhdGE7CisKKyAgeworICAgIC8vIFNldCB1cC4KKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgICAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgICAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisgIH0KKworICB7CisgICAgLy8gVGVzdCBQYXJzZUZyb21TdHJpbmcuCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOworICB9CisKKyAgeworICAgIC8vIFRlc3QgUGFyc2VGcm9tSXN0cmVhbS4KKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgICAgc3RyaW5nc3RyZWFtIHN0cmVhbShkYXRhKTsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbUlzdHJlYW0oJnN0cmVhbSkpOworICAgIEVYUEVDVF9UUlVFKHN0cmVhbS5lb2YoKSk7CisgICAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICAvLyBUZXN0IFBhcnNlRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbS4KKyAgICBzdHJpbmcgZGF0YV93aXRoX2p1bmsoZGF0YSk7CisgICAgZGF0YV93aXRoX2p1bmsuYXBwZW5kKCJzb21lIGp1bmsgb24gdGhlIGVuZCIpOworICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHN0cmVhbShkYXRhX3dpdGhfanVuay5kYXRhKCksIGRhdGFfd2l0aF9qdW5rLnNpemUoKSk7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKCZzdHJlYW0sIGRhdGEuc2l6ZSgpKSk7CisgICAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICAvLyBUZXN0IHRoYXQgUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtIGZhaWxzIChidXQgZG9lc24ndCBjcmFzaCkgaWYKKyAgICAvLyBFT0YgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBieXRlcy4KKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0oZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgICAgRVhQRUNUX0ZBTFNFKAorICAgICAgbWVzc2FnZS5QYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oJnN0cmVhbSwgZGF0YS5zaXplKCkgKyAxKSk7CisgIH0KK30KKworVEVTVChNZXNzYWdlVGVzdCwgUGFyc2VGYWlsc0lmTm90SW5pdGlhbGl6ZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKCIiKSk7CisgICAgZXJyb3JzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKyAgfQorCisgIEFTU0VSVF9FUSgxLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJDYW4ndCBwYXJzZSBtZXNzYWdlIG9mIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWRcIiAiCisgICAgICAgICAgICAiYmVjYXVzZSBpdCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIsCisgICAgICAgICAgICBlcnJvcnNbMF0pOworfQorCitURVNUKE1lc3NhZ2VUZXN0LCBCeXBhc3NJbml0aWFsaXphdGlvbkNoZWNrT25QYXJzZSkgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChOVUxMLCAwKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCkpOworfQorCitURVNUKE1lc3NhZ2VUZXN0LCBJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgRVhQRUNUX0VRKCJhLCBiLCBjIiwgbWVzc2FnZS5Jbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkpOworfQorCisjaWZkZWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QgIC8vIGRlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgeWV0LgorCitURVNUKE1lc3NhZ2VUZXN0LCBTZXJpYWxpemVGYWlsc0lmTm90SW5pdGlhbGl6ZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOworICBzdHJpbmcgZGF0YTsKKyAgRVhQRUNUX0RFQlVHX0RFQVRIKEVYUEVDVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpKSwKKyAgICAiQ2FuJ3Qgc2VyaWFsaXplIG1lc3NhZ2Ugb2YgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZFwiIGJlY2F1c2UgIgorICAgICJpdCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIpOworfQorCitURVNUKE1lc3NhZ2VUZXN0LCBDaGVja0luaXRpYWxpemVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgRVhQRUNUX0RFQVRIKG1lc3NhZ2UuQ2hlY2tJbml0aWFsaXplZCgpLAorICAgICJNZXNzYWdlIG9mIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWRcIiBpcyBtaXNzaW5nIHJlcXVpcmVkICIKKyAgICAiZmllbGRzOiBhLCBiLCBjIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworVEVTVChNZXNzYWdlVGVzdCwgQnlwYXNzSW5pdGlhbGl6YXRpb25DaGVja09uU2VyaWFsaXplKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgaW86OkFycmF5T3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoTlVMTCwgMCk7CisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLlNlcmlhbGl6ZVBhcnRpYWxUb0NvZGVkU3RyZWFtKCZvdXRwdXQpKTsKK30KKworVEVTVChNZXNzYWdlVGVzdCwgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOworICBtZXNzYWdlLkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygmZXJyb3JzKTsKKyAgQVNTRVJUX0VRKDMsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoImEiLCBlcnJvcnNbMF0pOworICBFWFBFQ1RfRVEoImIiLCBlcnJvcnNbMV0pOworICBFWFBFQ1RfRVEoImMiLCBlcnJvcnNbMl0pOworfQorCitURVNUKE1lc3NhZ2VUZXN0LCBQYXJzZUZhaWxzT25JbnZhbGlkTWVzc2FnZUVuZCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgLy8gQ29udHJvbCBjYXNlLgorICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbUFycmF5KCIiLCAwKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQsIGJ1dCBub3QgYSB2YWxpZCB0YWcgKHplcm8pLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21BcnJheSgiXDAiLCAxKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSBtYWxmb3JtZWQgdmFyaW50LgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21BcnJheSgiXDIwMCIsIDEpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhbiBlbmRncm91cCB0YWcsIGJ1dCB3ZSBhcmVuJ3QgcGFyc2luZyBhIGdyb3VwLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21BcnJheSgiXDAxNCIsIDEpKTsKK30KKworVEVTVChNZXNzYWdlRmFjdG9yeVRlc3QsIEdlbmVyYXRlZEZhY3RvcnlMb29rdXApIHsKKyAgRVhQRUNUX0VRKAorICAgIE1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLT5HZXRQcm90b3R5cGUoCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpLAorICAgICZwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZWZhdWx0X2luc3RhbmNlKCkpOworfQorCitURVNUKE1lc3NhZ2VGYWN0b3J5VGVzdCwgR2VuZXJhdGVkRmFjdG9yeVVua25vd25UeXBlKSB7CisgIC8vIENvbnN0cnVjdCBhIG5ldyBkZXNjcmlwdG9yLgorICBEZXNjcmlwdG9yUG9vbCBwb29sOworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CisgIGZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworICBmaWxlLmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoIkZvbyIpOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gcG9vbC5CdWlsZEZpbGUoZmlsZSktPm1lc3NhZ2VfdHlwZSgwKTsKKworICAvLyBUcnlpbmcgdG8gY29uc3RydWN0IGl0IHNob3VsZCByZXR1cm4gTlVMTC4KKyAgRVhQRUNUX1RSVUUoCisgICAgTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCktPkdldFByb3RvdHlwZShkZXNjcmlwdG9yKSA9PSBOVUxMKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9wYWNrYWdlX2luZm8uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3BhY2thZ2VfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwY2QzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9wYWNrYWdlX2luZm8uaApAQCAtMCwwICsxLDY0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGZpbGUgZXhpc3RzIHNvbGVseSB0byBkb2N1bWVudCB0aGUgZ29vZ2xlOjpwcm90b2J1ZiBuYW1lc3BhY2UuCisvLyBJdCBpcyBub3QgY29tcGlsZWQgaW50byBhbnl0aGluZywgYnV0IGl0IG1heSBiZSByZWFkIGJ5IGFuIGF1dG9tYXRlZAorLy8gZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IuCisKK25hbWVzcGFjZSBnb29nbGUgeworCisvLyBDb3JlIGNvbXBvbmVudHMgb2YgdGhlIFByb3RvY29sIEJ1ZmZlcnMgcnVudGltZSBsaWJyYXJ5LgorLy8KKy8vIFRoZSBmaWxlcyBpbiB0aGlzIHBhY2thZ2UgcmVwcmVzZW50IHRoZSBjb3JlIG9mIHRoZSBQcm90b2NvbCBCdWZmZXIKKy8vIHN5c3RlbS4gIEFsbCBvZiB0aGVtIGFyZSBwYXJ0IG9mIHRoZSBsaWJwcm90b2J1ZiBsaWJyYXJ5LgorLy8KKy8vIEEgbm90ZSBvbiB0aHJlYWQtc2FmZXR5OgorLy8KKy8vIFRocmVhZC1zYWZldHkgaW4gdGhlIFByb3RvY29sIEJ1ZmZlciBsaWJyYXJ5IGZvbGxvd3MgYSBzaW1wbGUgcnVsZToKKy8vIHVubGVzcyBleHBsaWNpdGx5IG5vdGVkIG90aGVyd2lzZSwgaXQgaXMgYWx3YXlzIHNhZmUgdG8gdXNlIGFuIG9iamVjdAorLy8gZnJvbSBtdWx0aXBsZSB0aHJlYWRzIHNpbXVsdGFuZW91c2x5IGFzIGxvbmcgYXMgdGhlIG9iamVjdCBpcyBkZWNsYXJlZAorLy8gY29uc3QgaW4gYWxsIHRocmVhZHMgKG9yLCBpdCBpcyBvbmx5IHVzZWQgaW4gd2F5cyB0aGF0IHdvdWxkIGJlIGFsbG93ZWQKKy8vIGlmIGl0IHdlcmUgZGVjbGFyZWQgY29uc3QpLiAgSG93ZXZlciwgaWYgYW4gb2JqZWN0IGlzIGFjY2Vzc2VkIGluIG9uZQorLy8gdGhyZWFkIGluIGEgd2F5IHRoYXQgd291bGQgbm90IGJlIGFsbG93ZWQgaWYgaXQgd2VyZSBjb25zdCwgdGhlbiBpdCBpcworLy8gbm90IHNhZmUgdG8gYWNjZXNzIHRoYXQgb2JqZWN0IGluIGFueSBvdGhlciB0aHJlYWQgc2ltdWx0YW5lb3VzbHkuCisvLworLy8gUHV0IHNpbXBseSwgcmVhZC1vbmx5IGFjY2VzcyB0byBhbiBvYmplY3QgY2FuIGhhcHBlbiBpbiBtdWx0aXBsZSB0aHJlYWRzCisvLyBzaW11bHRhbmVvdXNseSwgYnV0IHdyaXRlIGFjY2VzcyBjYW4gb25seSBoYXBwZW4gaW4gYSBzaW5nbGUgdGhyZWFkIGF0CisvLyBhIHRpbWUuCisvLworLy8gVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgY29udGFpbiBzb21lICJjb25zdCIgbWV0aG9kcyB3aGljaCBhY3R1YWxseSBtb2RpZnkKKy8vIHRoZSBvYmplY3QgYmVoaW5kIHRoZSBzY2VuZXMgLS0gZS5nLiwgdG8gY2FjaGUgcmVzdWx0cyAtLSBidXQgaW4gdGhlc2UgY2FzZXMKKy8vIG11dGV4IGxvY2tpbmcgaXMgdXNlZCB0byBtYWtlIHRoZSBhY2Nlc3MgdGhyZWFkLXNhZmUuCituYW1lc3BhY2UgcHJvdG9idWYge30KK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3YzBkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjCkBAIC0wLDAgKzEsMjYyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordm9pZCBSZWZsZWN0aW9uT3BzOjpDb3B5KGNvbnN0IE1lc3NhZ2UmIGZyb20sIE1lc3NhZ2UqIHRvKSB7CisgIGlmICgmZnJvbSA9PSB0bykgcmV0dXJuOworICBDbGVhcih0byk7CisgIE1lcmdlKGZyb20sIHRvKTsKK30KKwordm9pZCBSZWZsZWN0aW9uT3BzOjpNZXJnZShjb25zdCBNZXNzYWdlJiBmcm9tLCBNZXNzYWdlKiB0bykgeworICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRvKTsKKworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gZnJvbS5HZXREZXNjcmlwdG9yKCk7CisgIEdPT0dMRV9DSEVDS19FUSh0by0+R2V0RGVzY3JpcHRvcigpLCBkZXNjcmlwdG9yKQorICAgIDw8ICJUcmllZCB0byBtZXJnZSBtZXNzYWdlcyBvZiBkaWZmZXJlbnQgdHlwZXMuIjsKKworICBjb25zdCBSZWZsZWN0aW9uKiBmcm9tX3JlZmxlY3Rpb24gPSBmcm9tLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogdG9fcmVmbGVjdGlvbiA9IHRvLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgZnJvbV9yZWZsZWN0aW9uLT5MaXN0RmllbGRzKGZyb20sICZmaWVsZHMpOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBmaWVsZHNbaV07CisKKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIGludCBjb3VudCA9IGZyb21fcmVmbGVjdGlvbi0+RmllbGRTaXplKGZyb20sIGZpZWxkKTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgeworICAgICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKENQUFRZUEUsIE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRvX3JlZmxlY3Rpb24tPkFkZCMjTUVUSE9EKHRvLCBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIGZyb21fcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWQjI01FVEhPRChmcm9tLCBmaWVsZCwgaikpOyAgICAgXAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBIQU5ETEVfVFlQRShJTlQzMiAsIEludDMyICk7CisgICAgICAgICAgSEFORExFX1RZUEUoSU5UNjQgLCBJbnQ2NCApOworICAgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgVUludDMyKTsKKyAgICAgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIFVJbnQ2NCk7CisgICAgICAgICAgSEFORExFX1RZUEUoRkxPQVQgLCBGbG9hdCApOworICAgICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgRG91YmxlKTsKKyAgICAgICAgICBIQU5ETEVfVFlQRShCT09MICAsIEJvb2wgICk7CisgICAgICAgICAgSEFORExFX1RZUEUoU1RSSU5HLCBTdHJpbmcpOworICAgICAgICAgIEhBTkRMRV9UWVBFKEVOVU0gICwgRW51bSAgKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICAgIHRvX3JlZmxlY3Rpb24tPkFkZE1lc3NhZ2UodG8sIGZpZWxkKS0+TWVyZ2VGcm9tKAorICAgICAgICAgICAgICBmcm9tX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShmcm9tLCBmaWVsZCwgaikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShDUFBUWVBFLCBNRVRIT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdG9fcmVmbGVjdGlvbi0+U2V0IyNNRVRIT0QodG8sIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZnJvbV9yZWZsZWN0aW9uLT5HZXQjI01FVEhPRChmcm9tLCBmaWVsZCkpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBIQU5ETEVfVFlQRShJTlQzMiAsIEludDMyICk7CisgICAgICAgIEhBTkRMRV9UWVBFKElOVDY0ICwgSW50NjQgKTsKKyAgICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCBVSW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIFVJbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKEZMT0FUICwgRmxvYXQgKTsKKyAgICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBEb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRShCT09MICAsIEJvb2wgICk7CisgICAgICAgIEhBTkRMRV9UWVBFKFNUUklORywgU3RyaW5nKTsKKyAgICAgICAgSEFORExFX1RZUEUoRU5VTSAgLCBFbnVtICApOworI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICB0b19yZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSh0bywgZmllbGQpLT5NZXJnZUZyb20oCisgICAgICAgICAgICBmcm9tX3JlZmxlY3Rpb24tPkdldE1lc3NhZ2UoZnJvbSwgZmllbGQpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0b19yZWZsZWN0aW9uLT5NdXRhYmxlVW5rbm93bkZpZWxkcyh0byktPk1lcmdlRnJvbSgKKyAgICBmcm9tX3JlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMoZnJvbSkpOworfQorCit2b2lkIFJlZmxlY3Rpb25PcHM6OkNsZWFyKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlLCAmZmllbGRzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKKyAgICByZWZsZWN0aW9uLT5DbGVhckZpZWxkKG1lc3NhZ2UsIGZpZWxkc1tpXSk7CisgIH0KKworICByZWZsZWN0aW9uLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlKS0+Q2xlYXIoKTsKK30KKworYm9vbCBSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgLy8gQ2hlY2sgcmVxdWlyZWQgZmllbGRzIG9mIHRoaXMgbWVzc2FnZS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZGVzY3JpcHRvci0+ZmllbGQoaSktPmlzX3JlcXVpcmVkKCkpIHsKKyAgICAgIGlmICghcmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgZGVzY3JpcHRvci0+ZmllbGQoaSkpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDaGVjayB0aGF0IHN1Yi1tZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJmZpZWxkcyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGZpZWxkc1tpXTsKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICBpbnQgc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICBpZiAoIXJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLklzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkKS5Jc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZWZsZWN0aW9uT3BzOjpEaXNjYXJkVW5rbm93bkZpZWxkcyhNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSktPkNsZWFyKCk7CisKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJmZpZWxkcyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGZpZWxkc1tpXTsKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgICBpbnQgc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGkpCisgICAgICAgICAgICAgICAgICAgIC0+RGlzY2FyZFVua25vd25GaWVsZHMoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLT5EaXNjYXJkVW5rbm93bkZpZWxkcygpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgc3RyaW5nIFN1Yk1lc3NhZ2VQcmVmaXgoY29uc3Qgc3RyaW5nJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgc3RyaW5nIHJlc3VsdChwcmVmaXgpOworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiKCIpOworICAgIHJlc3VsdC5hcHBlbmQoZmllbGQtPmZ1bGxfbmFtZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKCIpIik7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0LmFwcGVuZChmaWVsZC0+bmFtZSgpKTsKKyAgfQorICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICByZXN1bHQuYXBwZW5kKCJbIik7CisgICAgcmVzdWx0LmFwcGVuZChTaW1wbGVJdG9hKGluZGV4KSk7CisgICAgcmVzdWx0LmFwcGVuZCgiXSIpOworICB9CisgIHJlc3VsdC5hcHBlbmQoIi4iKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBSZWZsZWN0aW9uT3BzOjpGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICBjb25zdCBzdHJpbmcmIHByZWZpeCwKKyAgICB2ZWN0b3I8c3RyaW5nPiogZXJyb3JzKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIC8vIENoZWNrIHJlcXVpcmVkIGZpZWxkcyBvZiB0aGlzIG1lc3NhZ2UuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGRlc2NyaXB0b3ItPmZpZWxkKGkpLT5pc19yZXF1aXJlZCgpKSB7CisgICAgICBpZiAoIXJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGRlc2NyaXB0b3ItPmZpZWxkKGkpKSkgeworICAgICAgICBlcnJvcnMtPnB1c2hfYmFjayhwcmVmaXggKyBkZXNjcmlwdG9yLT5maWVsZChpKS0+bmFtZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDaGVjayBzdWItbWVzc2FnZXMuCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJmZpZWxkcyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGZpZWxkc1tpXTsKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKworICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0KKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgaSk7CisgICAgICAgICAgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKHN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJNZXNzYWdlUHJlZml4KHByZWZpeCwgZmllbGQsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpOworICAgICAgICBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoc3ViX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJNZXNzYWdlUHJlZml4KHByZWZpeCwgZmllbGQsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTVhMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaApAQCAtMCwwICsxLDgwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIGhlYWRlciBpcyBsb2dpY2FsbHkgaW50ZXJuYWwsIGJ1dCBpcyBtYWRlIHB1YmxpYyBiZWNhdXNlIGl0IGlzIHVzZWQKKy8vIGZyb20gcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUsIHdoaWNoIG1heSByZXNpZGUgaW4gb3RoZXIgY29tcG9uZW50cy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUkVGTEVDVElPTl9PUFNfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9SRUZMRUNUSU9OX09QU19IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEJhc2ljIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIHJlZmxlY3Rpb24uCisvLyBUaGVzZSBjYW4gYmUgdXNlZCBhcyBhIGNoZWFwIHdheSB0byBpbXBsZW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcKKy8vIG1ldGhvZHMgb2YgdGhlIE1lc3NhZ2UgaW50ZXJmYWNlLCB0aG91Z2ggdGhleSBhcmUgbGlrZWx5IHRvIGJlCisvLyBzbG93ZXIgdGhhbiBpbXBsZW1lbnRhdGlvbnMgdGFpbG9yZWQgZm9yIHRoZSBzcGVjaWZpYyBtZXNzYWdlIHR5cGUuCisvLworLy8gVGhpcyBjbGFzcyBzaG91bGQgc3RheSBsaW1pdGVkIHRvIG9wZXJhdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorLy8gdGhlIE1lc3NhZ2UgaW50ZXJmYWNlLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgcmVhbGx5IGEgbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgb25seSBzdGF0aWMgbWV0aG9kcy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBSZWZsZWN0aW9uT3BzIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIENvcHkoY29uc3QgTWVzc2FnZSYgZnJvbSwgTWVzc2FnZSogdG8pOworICBzdGF0aWMgdm9pZCBNZXJnZShjb25zdCBNZXNzYWdlJiBmcm9tLCBNZXNzYWdlKiB0byk7CisgIHN0YXRpYyB2b2lkIENsZWFyKE1lc3NhZ2UqIG1lc3NhZ2UpOworICBzdGF0aWMgYm9vbCBJc0luaXRpYWxpemVkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBEaXNjYXJkVW5rbm93bkZpZWxkcyhNZXNzYWdlKiBtZXNzYWdlKTsKKworICAvLyBGaW5kcyBhbGwgdW5zZXQgcmVxdWlyZWQgZmllbGRzIGluIHRoZSBtZXNzYWdlIGFuZCBhZGRzIHRoZWlyIGZ1bGwKKyAgLy8gcGF0aHMgKGUuZy4gImZvby5iYXJbNV0uYmF6IikgdG8gKm5hbWVzLiAgInByZWZpeCIgd2lsbCBiZSBhdHRhY2hlZCB0bworICAvLyB0aGUgZnJvbnQgb2YgZWFjaCBuYW1lLgorICBzdGF0aWMgdm9pZCBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIGVycm9ycyk7CisKKyBwcml2YXRlOgorICAvLyBBbGwgbWV0aG9kcyBhcmUgc3RhdGljLiAgTm8gbmVlZCB0byBjb25zdHJ1Y3QuCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZWZsZWN0aW9uT3BzKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1JFRkxFQ1RJT05fT1BTX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Q1NmYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw0MDUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIFNhbml0eUNoZWNrKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgQ29weSkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UsIG1lc3NhZ2UyOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworCisgIFJlZmxlY3Rpb25PcHM6OkNvcHkobWVzc2FnZSwgJm1lc3NhZ2UyKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKworICAvLyBDb3B5aW5nIGZyb20gc2VsZiBzaG91bGQgYmUgYSBuby1vcC4KKyAgUmVmbGVjdGlvbk9wczo6Q29weShtZXNzYWdlMiwgJm1lc3NhZ2UyKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIENvcHlFeHRlbnNpb25zKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlLCBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisKKyAgUmVmbGVjdGlvbk9wczo6Q29weShtZXNzYWdlLCAmbWVzc2FnZTIpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgTWVyZ2UpIHsKKyAgLy8gTm90ZTogIENvcHkgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgTWVyZ2UoKSBzbyB0ZWNobmljYWxseSB0aGUgQ29weQorICAvLyAgIHRlc3QgYWxyZWFkeSB0ZXN0ZWQgbW9zdCBvZiB0aGlzLgorCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZSwgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisKKyAgLy8gVGhpcyBmaWVsZCB3aWxsIHRlc3QgbWVyZ2luZyBpbnRvIGFuIGVtcHR5IHNwb3QuCisgIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9pbnQzMihtZXNzYWdlLm9wdGlvbmFsX2ludDMyKCkpOworICBtZXNzYWdlLmNsZWFyX29wdGlvbmFsX2ludDMyKCk7CisKKyAgLy8gVGhpcyB0ZXN0cyBvdmVyd3JpdGluZy4KKyAgbWVzc2FnZTIuc2V0X29wdGlvbmFsX3N0cmluZyhtZXNzYWdlLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKCJzb21ldGhpbmcgZWxzZSIpOworCisgIC8vIFRoaXMgdGVzdHMgY29uY2F0ZW5hdGluZy4KKyAgbWVzc2FnZTIuYWRkX3JlcGVhdGVkX2ludDMyKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMSkpOworICBpbnQzMiBpID0gbWVzc2FnZS5yZXBlYXRlZF9pbnQzMigwKTsKKyAgbWVzc2FnZS5jbGVhcl9yZXBlYXRlZF9pbnQzMigpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9pbnQzMihpKTsKKworICBSZWZsZWN0aW9uT3BzOjpNZXJnZShtZXNzYWdlMiwgJm1lc3NhZ2UpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIE1lcmdlRXh0ZW5zaW9ucykgeworICAvLyBOb3RlOiAgQ29weSBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBNZXJnZSgpIHNvIHRlY2huaWNhbGx5IHRoZSBDb3B5CisgIC8vICAgdGVzdCBhbHJlYWR5IHRlc3RlZCBtb3N0IG9mIHRoaXMuCisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UsIG1lc3NhZ2UyOworCisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKworICAvLyBUaGlzIGZpZWxkIHdpbGwgdGVzdCBtZXJnaW5nIGludG8gYW4gZW1wdHkgc3BvdC4KKyAgbWVzc2FnZTIuU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24sCisgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikpOworICBtZXNzYWdlLkNsZWFyRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24pOworCisgIC8vIFRoaXMgdGVzdHMgb3ZlcndyaXRpbmcuCisgIG1lc3NhZ2UyLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiwKKyAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbikpOworICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiwgInNvbWV0aGluZyBlbHNlIik7CisKKyAgLy8gVGhpcyB0ZXN0cyBjb25jYXRlbmF0aW5nLgorICBtZXNzYWdlMi5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwKKyAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAxKSk7CisgIGludDMyIGkgPSBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAwKTsKKyAgbWVzc2FnZS5DbGVhckV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uKTsKKyAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgaSk7CisKKyAgUmVmbGVjdGlvbk9wczo6TWVyZ2UobWVzc2FnZTIsICZtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgTWVyZ2VVbmtub3duKSB7CisgIC8vIFRlc3QgdGhhdCB0aGUgbWVzc2FnZXMnIFVua25vd25GaWVsZFNldHMgYXJlIGNvcnJlY3RseSBtZXJnZWQuCisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgbWVzc2FnZTEubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMTIzNCwgMSk7CisgIG1lc3NhZ2UyLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEyMzQsIDIpOworCisgIFJlZmxlY3Rpb25PcHM6Ok1lcmdlKG1lc3NhZ2UyLCAmbWVzc2FnZTEpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlMS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwKKyAgICAgICAgICAgIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudHlwZSgpKTsKKyAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudmFyaW50KCkpOworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwKKyAgICAgICAgICAgIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMSkudHlwZSgpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMSkudmFyaW50KCkpOworfQorCisjaWZkZWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgTWVyZ2VGcm9tU2VsZikgeworICAvLyBOb3RlOiAgQ29weSBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBNZXJnZSgpIHNvIHRlY2huaWNhbGx5IHRoZSBDb3B5CisgIC8vICAgdGVzdCBhbHJlYWR5IHRlc3RlZCBtb3N0IG9mIHRoaXMuCisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIEVYUEVDVF9ERUFUSCgKKyAgICBSZWZsZWN0aW9uT3BzOjpNZXJnZShtZXNzYWdlLCAmbWVzc2FnZSksCisgICAgIiZmcm9tIik7Cit9CisKKyNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgQ2xlYXIpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworCisgIFJlZmxlY3Rpb25PcHM6OkNsZWFyKCZtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBnZXR0aW5nIGVtYmVkZGVkIG1lc3NhZ2VzIHJldHVybnMgdGhlIG9iamVjdHMgY3JlYXRlZCBkdXJpbmcKKyAgLy8gU2V0QWxsRmllbGRzKCkgcmF0aGVyIHRoYW4gZGVmYXVsdCBpbnN0YW5jZXMuCisgIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6T3B0aW9uYWxHcm91cDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxncm91cCgpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCkpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBDbGVhckV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworCisgIFJlZmxlY3Rpb25PcHM6OkNsZWFyKCZtZXNzYWdlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgZ2V0dGluZyBlbWJlZGRlZCBtZXNzYWdlcyByZXR1cm5zIHRoZSBvYmplY3RzIGNyZWF0ZWQgZHVyaW5nCisgIC8vIFNldEFsbEV4dGVuc2lvbnMoKSByYXRoZXIgdGhhbiBkZWZhdWx0IGluc3RhbmNlcy4KKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6T3B0aW9uYWxHcm91cF9leHRlbnNpb246OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKAorICAgICAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfTkUoJnVuaXR0ZXN0X2ltcG9ydDo6SW1wb3J0TWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgQ2xlYXJVbmtub3duKSB7CisgIC8vIFRlc3QgdGhhdCB0aGUgbWVzc2FnZSdzIFVua25vd25GaWVsZFNldCBpcyBjb3JyZWN0bHkgY2xlYXJlZC4KKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZTsKKyAgbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgxMjM0LCAxKTsKKworICBSZWZsZWN0aW9uT3BzOjpDbGVhcigmbWVzc2FnZSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRGlzY2FyZFVua25vd25GaWVsZHMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKworICAvLyBTZXQgc29tZSB1bmtub3duIGZpZWxkcyBpbiBtZXNzYWdlLgorICBtZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKQorICAgICAgICAtPkFkZFZhcmludCgxMjM0NTYsIDY1NDMyMSk7CisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpCisgICAgICAgIC0+bXV0YWJsZV91bmtub3duX2ZpZWxkcygpCisgICAgICAgIC0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKKyAgbWVzc2FnZS5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApCisgICAgICAgIC0+bXV0YWJsZV91bmtub3duX2ZpZWxkcygpCisgICAgICAgIC0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKKworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApCisgICAgICAgICAgICAgICAgICAgICAgLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisKKyAgLy8gRGlzY2FyZCB0aGVtLgorICBSZWZsZWN0aW9uT3BzOjpEaXNjYXJkVW5rbm93bkZpZWxkcygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKQorICAgICAgICAgICAgICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBEaXNjYXJkVW5rbm93bkV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKKworICAvLyBTZXQgc29tZSB1bmtub3duIGZpZWxkcy4KKyAgbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCkKKyAgICAgICAgLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCkKKyAgICAgICAgLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiwgMCkKKyAgICAgICAgLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCkKKyAgICAgICAgLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOworCisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLAorICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pCisgICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwKKyAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKQorICAgICAgICAgICAudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKworICAvLyBEaXNjYXJkIHRoZW0uCisgIFJlZmxlY3Rpb25PcHM6OkRpc2NhcmRVbmtub3duRmllbGRzKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsCisgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgICAgICAgLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUSgwLAorICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApCisgICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBJc0luaXRpYWxpemVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisgIG1lc3NhZ2Uuc2V0X2EoMSk7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgbWVzc2FnZS5zZXRfYigyKTsKKyAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworICBtZXNzYWdlLnNldF9jKDMpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRm9yZWlnbklzSW5pdGlhbGl6ZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZEZvcmVpZ24gbWVzc2FnZTsKKworICAvLyBTdGFydHMgb3V0IGluaXRpYWxpemVkIGJlY2F1c2UgdGhlIGZvcmVpZ24gbWVzc2FnZSBpcyBpdHNlbGYgYW4gb3B0aW9uYWwKKyAgLy8gZmllbGQuCisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworCisgIC8vIE9uY2Ugd2UgY3JlYXRlIHRoYXQgZmllbGQsIHRoZSBtZXNzYWdlIGlzIG5vIGxvbmdlciBpbml0aWFsaXplZC4KKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKTsKKyAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworCisgIC8vIEluaXRpYWxpemUgaXQuICBOb3cgd2UncmUgaW5pdGlhbGl6ZWQuCisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9hKDEpOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpLT5zZXRfYigyKTsKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2MoMyk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworCisgIC8vIEFkZCBhIHJlcGVhdGVkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UuICBObyBsb25nZXIgaW5pdGlhbGl6ZWQuCisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQqIHN1Yl9tZXNzYWdlID0gbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbWVzc2FnZSgpOworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisKKyAgLy8gSW5pdGlhbGl6ZSB0aGF0IHJlcGVhdGVkIHZlcnNpb24uCisgIHN1Yl9tZXNzYWdlLT5zZXRfYSgxKTsKKyAgc3ViX21lc3NhZ2UtPnNldF9iKDIpOworICBzdWJfbWVzc2FnZS0+c2V0X2MoMyk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBFeHRlbnNpb25Jc0luaXRpYWxpemVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworCisgIC8vIFN0YXJ0cyBvdXQgaW5pdGlhbGl6ZWQgYmVjYXVzZSB0aGUgZm9yZWlnbiBtZXNzYWdlIGlzIGl0c2VsZiBhbiBvcHRpb25hbAorICAvLyBmaWVsZC4KKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisKKyAgLy8gT25jZSB3ZSBjcmVhdGUgdGhhdCBmaWVsZCwgdGhlIG1lc3NhZ2UgaXMgbm8gbG9uZ2VyIGluaXRpYWxpemVkLgorICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKTsKKyAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworCisgIC8vIEluaXRpYWxpemUgaXQuICBOb3cgd2UncmUgaW5pdGlhbGl6ZWQuCisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpLT5zZXRfYSgxKTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSktPnNldF9iKDIpOworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKS0+c2V0X2MoMyk7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworCisgIC8vIEFkZCBhIHJlcGVhdGVkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UuICBObyBsb25nZXIgaW5pdGlhbGl6ZWQuCisgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpKTsKKyAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworCisgIC8vIEluaXRpYWxpemUgdGhhdCByZXBlYXRlZCB2ZXJzaW9uLgorICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6bXVsdGksIDApLT5zZXRfYSgxKTsKKyAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpLCAwKS0+c2V0X2IoMik7CisgIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSwgMCktPnNldF9jKDMpOworICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKK30KKworc3RhdGljIHN0cmluZyBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisgIFJlZmxlY3Rpb25PcHM6OkZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhtZXNzYWdlLCAiIiwgJmVycm9ycyk7CisgIHJldHVybiBKb2luU3RyaW5ncyhlcnJvcnMsICIsIik7Cit9CisKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycykgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIEVYUEVDVF9FUSgiYSxiLGMiLCBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMobWVzc2FnZSkpOworfQorCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBGaW5kRm9yZWlnbkluaXRpYWxpemF0aW9uRXJyb3JzKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWRGb3JlaWduIG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX21lc3NhZ2UoKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbWVzc2FnZSgpOworICBFWFBFQ1RfRVEoIm9wdGlvbmFsX21lc3NhZ2UuYSwiCisgICAgICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5iLCIKKyAgICAgICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmMsIgorICAgICAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYSwiCisgICAgICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5iLCIKKyAgICAgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmMsIgorICAgICAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYSwiCisgICAgICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5iLCIKKyAgICAgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmMiLAorICAgICAgICAgICAgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKG1lc3NhZ2UpKTsKK30KKworVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRmluZEV4dGVuc2lvbkluaXRpYWxpemF0aW9uRXJyb3JzKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKTsKKyAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6bXVsdGkpOworICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSk7CisgIEVYUEVDVF9FUSgiKHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5zaW5nbGUpLmEsIgorICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQuc2luZ2xlKS5iLCIKKyAgICAgICAgICAgICIocHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkLnNpbmdsZSkuYywiCisgICAgICAgICAgICAiKHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5tdWx0aSlbMF0uYSwiCisgICAgICAgICAgICAiKHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5tdWx0aSlbMF0uYiwiCisgICAgICAgICAgICAiKHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5tdWx0aSlbMF0uYywiCisgICAgICAgICAgICAiKHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5tdWx0aSlbMV0uYSwiCisgICAgICAgICAgICAiKHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5tdWx0aSlbMV0uYiwiCisgICAgICAgICAgICAiKHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5tdWx0aSlbMV0uYyIsCisgICAgICAgICAgICBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMobWVzc2FnZSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Mzc3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5jYwpAQCAtMCwwICsxLDk4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZXNlcnZlKGludCBuZXdfc2l6ZSkgeworICBpZiAodG90YWxfc2l6ZV8gPj0gbmV3X3NpemUpIHJldHVybjsKKworICB2b2lkKiogb2xkX2VsZW1lbnRzID0gZWxlbWVudHNfOworICB0b3RhbF9zaXplXyA9IG1heCh0b3RhbF9zaXplXyAqIDIsIG5ld19zaXplKTsKKyAgZWxlbWVudHNfID0gbmV3IHZvaWQqW3RvdGFsX3NpemVfXTsKKyAgbWVtY3B5KGVsZW1lbnRzXywgb2xkX2VsZW1lbnRzLCBhbGxvY2F0ZWRfc2l6ZV8gKiBzaXplb2YoZWxlbWVudHNfWzBdKSk7CisgIGlmIChvbGRfZWxlbWVudHMgIT0gaW5pdGlhbF9zcGFjZV8pIHsKKyAgICBkZWxldGUgW10gb2xkX2VsZW1lbnRzOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlN3YXAoUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKSB7CisgIHZvaWQqKiBzd2FwX2VsZW1lbnRzICAgICAgID0gZWxlbWVudHNfOworICBpbnQgICAgc3dhcF9jdXJyZW50X3NpemUgICA9IGN1cnJlbnRfc2l6ZV87CisgIGludCAgICBzd2FwX2FsbG9jYXRlZF9zaXplID0gYWxsb2NhdGVkX3NpemVfOworICBpbnQgICAgc3dhcF90b3RhbF9zaXplICAgICA9IHRvdGFsX3NpemVfOworICAvLyBXZSBtYXkgbm90IGJlIHVzaW5nIGluaXRpYWxfc3BhY2VfIGJ1dCBpdCdzIG5vdCB3b3J0aCBjaGVja2luZy4gIEp1c3QKKyAgLy8gY29weSBpdCBhbnl3YXkuCisgIHZvaWQqIHN3YXBfaW5pdGlhbF9zcGFjZVtrSW5pdGlhbFNpemVdOworICBtZW1jcHkoc3dhcF9pbml0aWFsX3NwYWNlLCBpbml0aWFsX3NwYWNlXywgc2l6ZW9mKGluaXRpYWxfc3BhY2VfKSk7CisKKyAgZWxlbWVudHNfICAgICAgID0gb3RoZXItPmVsZW1lbnRzXzsKKyAgY3VycmVudF9zaXplXyAgID0gb3RoZXItPmN1cnJlbnRfc2l6ZV87CisgIGFsbG9jYXRlZF9zaXplXyA9IG90aGVyLT5hbGxvY2F0ZWRfc2l6ZV87CisgIHRvdGFsX3NpemVfICAgICA9IG90aGVyLT50b3RhbF9zaXplXzsKKyAgbWVtY3B5KGluaXRpYWxfc3BhY2VfLCBvdGhlci0+aW5pdGlhbF9zcGFjZV8sIHNpemVvZihpbml0aWFsX3NwYWNlXykpOworCisgIG90aGVyLT5lbGVtZW50c18gICAgICAgPSBzd2FwX2VsZW1lbnRzOworICBvdGhlci0+Y3VycmVudF9zaXplXyAgID0gc3dhcF9jdXJyZW50X3NpemU7CisgIG90aGVyLT5hbGxvY2F0ZWRfc2l6ZV8gPSBzd2FwX2FsbG9jYXRlZF9zaXplOworICBvdGhlci0+dG90YWxfc2l6ZV8gICAgID0gc3dhcF90b3RhbF9zaXplOworICBtZW1jcHkob3RoZXItPmluaXRpYWxfc3BhY2VfLCBzd2FwX2luaXRpYWxfc3BhY2UsIHNpemVvZihzd2FwX2luaXRpYWxfc3BhY2UpKTsKKworICBpZiAoZWxlbWVudHNfID09IG90aGVyLT5pbml0aWFsX3NwYWNlXykgeworICAgIGVsZW1lbnRzXyA9IGluaXRpYWxfc3BhY2VfOworICB9CisgIGlmIChvdGhlci0+ZWxlbWVudHNfID09IGluaXRpYWxfc3BhY2VfKSB7CisgICAgb3RoZXItPmVsZW1lbnRzXyA9IG90aGVyLT5pbml0aWFsX3NwYWNlXzsKKyAgfQorfQorCitzdHJpbmcqIFN0cmluZ1R5cGVIYW5kbGVyQmFzZTo6TmV3KCkgeworICByZXR1cm4gbmV3IHN0cmluZzsKK30KK3ZvaWQgU3RyaW5nVHlwZUhhbmRsZXJCYXNlOjpEZWxldGUoc3RyaW5nKiB2YWx1ZSkgeworICBkZWxldGUgdmFsdWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2YWU2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmgKQEAgLTAsMCArMSwxMjk5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBSZXBlYXRlZEZpZWxkIGFuZCBSZXBlYXRlZFB0ckZpZWxkIGFyZSB1c2VkIGJ5IGdlbmVyYXRlZCBwcm90b2NvbCBtZXNzYWdlCisvLyBjbGFzc2VzIHRvIG1hbmlwdWxhdGUgcmVwZWF0ZWQgZmllbGRzLiAgVGhlc2UgY2xhc3NlcyBhcmUgdmVyeSBzaW1pbGFyIHRvCisvLyBTVEwncyB2ZWN0b3IsIGJ1dCBpbmNsdWRlIGEgbnVtYmVyIG9mIG9wdGltaXphdGlvbnMgZm91bmQgdG8gYmUgdXNlZnVsCisvLyBzcGVjaWZpY2FsbHkgaW4gdGhlIGNhc2Ugb2YgUHJvdG9jb2wgQnVmZmVycy4gIFJlcGVhdGVkUHRyRmllbGQgaXMKKy8vIHBhcnRpY3VsYXJseSBkaWZmZXJlbnQgZnJvbSBTVEwgdmVjdG9yIGFzIGl0IG1hbmFnZXMgb3duZXJzaGlwIG9mIHRoZQorLy8gcG9pbnRlcnMgdGhhdCBpdCBjb250YWlucy4KKy8vCisvLyBUeXBpY2FsbHksIGNsaWVudHMgc2hvdWxkIG5vdCBuZWVkIHRvIGFjY2VzcyBSZXBlYXRlZEZpZWxkIG9iamVjdHMgZGlyZWN0bHksCisvLyBidXQgc2hvdWxkIGluc3RlYWQgdXNlIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlCisvLyBwcm90b2NvbCBjb21waWxlci4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUkVQRUFURURfRklFTERfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9SRVBFQVRFRF9GSUVMRF9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpZm5kZWYgU1RBUkJPQVJECisjaW5jbHVkZSA8aXRlcmF0b3I+CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIE1lc3NhZ2U7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFdlIG5lZWQgdGhpcyAoZnJvbSBnZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjKS4KK0xJQlBST1RPQlVGX0VYUE9SVCBpbnQgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZihjb25zdCBzdHJpbmcmIHN0cik7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBSZXBlYXRlZEZpZWxkIGlzIHVzZWQgdG8gcmVwcmVzZW50IHJlcGVhdGVkIGZpZWxkcyBvZiBhIHByaW1pdGl2ZSB0eXBlIChpbgorLy8gb3RoZXIgd29yZHMsIGV2ZXJ5dGhpbmcgZXhjZXB0IHN0cmluZ3MgYW5kIG5lc3RlZCBNZXNzYWdlcykuICBNb3N0IHVzZXJzIHdpbGwKKy8vIG5vdCBldmVyIHVzZSBhIFJlcGVhdGVkRmllbGQgZGlyZWN0bHk7IHRoZXkgd2lsbCB1c2UgdGhlIGdldC1ieS1pbmRleCwKKy8vIHNldC1ieS1pbmRleCwgYW5kIGFkZCBhY2Nlc3NvcnMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZvciBhbGwgcmVwZWF0ZWQgZmllbGRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBSZXBlYXRlZEZpZWxkIHsKKyBwdWJsaWM6CisgIFJlcGVhdGVkRmllbGQoKTsKKyAgUmVwZWF0ZWRGaWVsZChjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcik7CisgIH5SZXBlYXRlZEZpZWxkKCk7CisKKyAgUmVwZWF0ZWRGaWVsZCYgb3BlcmF0b3I9KGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKTsKKworICBpbnQgc2l6ZSgpIGNvbnN0OworCisgIGNvbnN0IEVsZW1lbnQmIEdldChpbnQgaW5kZXgpIGNvbnN0OworICBFbGVtZW50KiBNdXRhYmxlKGludCBpbmRleCk7CisgIHZvaWQgU2V0KGludCBpbmRleCwgY29uc3QgRWxlbWVudCYgdmFsdWUpOworICB2b2lkIEFkZChjb25zdCBFbGVtZW50JiB2YWx1ZSk7CisgIEVsZW1lbnQqIEFkZCgpOworICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisgIC8vIFdlIGRvbid0IHByb3ZpZGUgYSB3YXkgdG8gcmVtb3ZlIGFueSBlbGVtZW50IG90aGVyIHRoYW4gdGhlIGxhc3QKKyAgLy8gYmVjYXVzZSBpdCBpbnZpdGVzIGluZWZmaWNpZW50IHVzZSwgc3VjaCBhcyBPKG5eMikgZmlsdGVyaW5nIGxvb3BzCisgIC8vIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBPKG4pLiAgSWYgeW91IHdhbnQgdG8gcmVtb3ZlIGFuIGVsZW1lbnQgb3RoZXIKKyAgLy8gdGhhbiB0aGUgbGFzdCwgdGhlIGJlc3Qgd2F5IHRvIGRvIGl0IGlzIHRvIHJlLWFycmFuZ2UgdGhlIGVsZW1lbnRzCisgIC8vIHNvIHRoYXQgdGhlIG9uZSB5b3Ugd2FudCByZW1vdmVkIGlzIGF0IHRoZSBlbmQsIHRoZW4gY2FsbCBSZW1vdmVMYXN0KCkuCisgIHZvaWQgUmVtb3ZlTGFzdCgpOworICB2b2lkIENsZWFyKCk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcik7CisKKyAgLy8gUmVzZXJ2ZSBzcGFjZSB0byBleHBhbmQgdGhlIGZpZWxkIHRvIGF0IGxlYXN0IHRoZSBnaXZlbiBzaXplLiAgSWYgdGhlCisgIC8vIGFycmF5IGlzIGdyb3duLCBpdCB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBkb3VibGVkIGluIHNpemUuCisgIHZvaWQgUmVzZXJ2ZShpbnQgbmV3X3NpemUpOworCisgIC8vIFJlc2l6ZSB0aGUgUmVwZWF0ZWRGaWVsZCB0byBhIG5ldywgc21hbGxlciBzaXplLiAgVGhpcyBpcyBPKDEpLgorICB2b2lkIFRydW5jYXRlKGludCBuZXdfc2l6ZSk7CisKKyAgdm9pZCBBZGRBbHJlYWR5UmVzZXJ2ZWQoY29uc3QgRWxlbWVudCYgdmFsdWUpOworICBFbGVtZW50KiBBZGRBbHJlYWR5UmVzZXJ2ZWQoKTsKKyAgaW50IENhcGFjaXR5KCkgY29uc3Q7CisKKyAgLy8gR2V0cyB0aGUgdW5kZXJseWluZyBhcnJheS4gIFRoaXMgcG9pbnRlciBpcyBwb3NzaWJseSBpbnZhbGlkYXRlZCBieQorICAvLyBhbnkgYWRkIG9yIHJlbW92ZSBvcGVyYXRpb24uCisgIEVsZW1lbnQqIG11dGFibGVfZGF0YSgpOworICBjb25zdCBFbGVtZW50KiBkYXRhKCkgY29uc3Q7CisKKyAgLy8gU3dhcCBlbnRpcmUgY29udGVudHMgd2l0aCAib3RoZXIiLgorICB2b2lkIFN3YXAoUmVwZWF0ZWRGaWVsZCogb3RoZXIpOworCisgIC8vIFN3YXAgdHdvIGVsZW1lbnRzLgorICB2b2lkIFN3YXBFbGVtZW50cyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTsKKworICAvLyBTVEwtbGlrZSBpdGVyYXRvciBzdXBwb3J0CisgIHR5cGVkZWYgRWxlbWVudCogaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3QgRWxlbWVudCogY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgRWxlbWVudCB2YWx1ZV90eXBlOworCisgIGl0ZXJhdG9yIGJlZ2luKCk7CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisgIGl0ZXJhdG9yIGVuZCgpOworICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBieSB0aGUgcmVwZWF0ZWQgZmllbGQsIGV4Y2x1ZGluZworICAvLyBzaXplb2YoKnRoaXMpCisgIGludCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgaW50IGtJbml0aWFsU2l6ZSA9IDQ7CisKKyAgRWxlbWVudCogZWxlbWVudHNfOworICBpbnQgICAgICBjdXJyZW50X3NpemVfOworICBpbnQgICAgICB0b3RhbF9zaXplXzsKKworICBFbGVtZW50ICBpbml0aWFsX3NwYWNlX1trSW5pdGlhbFNpemVdOworCisgIC8vIE1vdmUgdGhlIGNvbnRlbnRzIG9mIHxmcm9tfCBpbnRvIHx0b3wsIHBvc3NpYmx5IGNsb2JiZXJpbmcgfGZyb218IGluIHRoZQorICAvLyBwcm9jZXNzLiAgRm9yIHByaW1pdGl2ZSB0eXBlcyB0aGlzIGlzIGp1c3QgYSBtZW1jcHkoKSwgYnV0IGl0IGNvdWxkIGJlCisgIC8vIHNwZWNpYWxpemVkIGZvciBub24tcHJpbWl0aXZlIHR5cGVzIHRvLCBzYXksIHN3YXAgZWFjaCBlbGVtZW50IGluc3RlYWQuCisgIHZvaWQgTW92ZUFycmF5KEVsZW1lbnQgdG9bXSwgRWxlbWVudCBmcm9tW10sIGludCBzaXplKTsKKworICAvLyBDb3B5IHRoZSBlbGVtZW50cyBvZiB8ZnJvbXwgaW50byB8dG98LgorICB2b2lkIENvcHlBcnJheShFbGVtZW50IHRvW10sIGNvbnN0IEVsZW1lbnQgZnJvbVtdLCBpbnQgc2l6ZSk7Cit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGUgPHR5cGVuYW1lIEl0PiBjbGFzcyBSZXBlYXRlZFB0ckl0ZXJhdG9yOwordGVtcGxhdGUgPHR5cGVuYW1lIEl0PiBjbGFzcyBSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3I7Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIFJlcGVhdGVkUHRyRmllbGRzLiAgSXQgZGVhbHMgb25seSBpbiB2b2lkKgorLy8gcG9pbnRlcnMuICBVc2VycyBzaG91bGQgbm90IHVzZSB0aGlzIGludGVyZmFjZSBkaXJlY3RseS4KKy8vCisvLyBUaGUgbWV0aG9kcyBvZiB0aGlzIGludGVyZmFjZSBjb3JyZXNwb25kIHRvIHRoZSBtZXRob2RzIG9mIFJlcGVhdGVkUHRyRmllbGQsCisvLyBidXQgbWF5IGhhdmUgYSB0ZW1wbGF0ZSBhcmd1bWVudCBjYWxsZWQgVHlwZUhhbmRsZXIuICBJdHMgc2lnbmF0dXJlIGlzOgorLy8gICBjbGFzcyBUeXBlSGFuZGxlciB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgdHlwZWRlZiBNeVR5cGUgVHlwZTsKKy8vICAgICBzdGF0aWMgVHlwZSogTmV3KCk7CisvLyAgICAgc3RhdGljIHZvaWQgRGVsZXRlKFR5cGUqKTsKKy8vICAgICBzdGF0aWMgdm9pZCBDbGVhcihUeXBlKik7CisvLyAgICAgc3RhdGljIHZvaWQgTWVyZ2UoY29uc3QgVHlwZSYgZnJvbSwgVHlwZSogdG8pOworLy8KKy8vICAgICAvLyBPbmx5IG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGlmIFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBpcyBjYWxsZWQuCisvLyAgICAgc3RhdGljIGludCBTcGFjZVVzZWQoY29uc3QgVHlwZSYpOworLy8gICB9OworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFJlcGVhdGVkUHRyRmllbGRCYXNlIHsKKyBwcm90ZWN0ZWQ6CisgIC8vIFRoZSByZWZsZWN0aW9uIGltcGxlbWVudGF0aW9uIG5lZWRzIHRvIGNhbGwgcHJvdGVjdGVkIG1ldGhvZHMgZGlyZWN0bHksCisgIC8vIHJlaW50ZXJwcmV0aW5nIHBvaW50ZXJzIGFzIGJlaW5nIHRvIE1lc3NhZ2UgaW5zdGVhZCBvZiBhIHNwZWNpZmljIE1lc3NhZ2UKKyAgLy8gc3ViY2xhc3MuCisgIGZyaWVuZCBjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjsKKworICAvLyBFeHRlbnNpb25TZXQgc3RvcmVzIHJlcGVhdGVkIG1lc3NhZ2UgZXh0ZW5zaW9ucyBhcworICAvLyBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPiwgYnV0IG5vbi1saXRlIEV4dGVuc2lvblNldHMgbmVlZCB0bworICAvLyBpbXBsZW1lbnQgU3BhY2VVc2VkKCksIGFuZCB0aHVzIG5lZWQgdG8gY2FsbCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkKKyAgLy8gcmVpbnRlcnByZXRpbmcgTWVzc2FnZUxpdGUgYXMgTWVzc2FnZS4gIEV4dGVuc2lvblNldCBhbHNvIG5lZWRzIHRvIG1ha2UKKyAgLy8gdXNlIG9mIEFkZEZyb21DbGVhcmVkKCksIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgorICBmcmllbmQgY2xhc3MgRXh0ZW5zaW9uU2V0OworCisgIFJlcGVhdGVkUHRyRmllbGRCYXNlKCk7CisKKyAgLy8gTXVzdCBiZSBjYWxsZWQgZnJvbSBkZXN0cnVjdG9yLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgRGVzdHJveSgpOworCisgIGludCBzaXplKCkgY29uc3Q7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICBjb25zdCB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSYgR2V0KGludCBpbmRleCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIE11dGFibGUoaW50IGluZGV4KTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogQWRkKCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdm9pZCBSZW1vdmVMYXN0KCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdm9pZCBDbGVhcigpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkUHRyRmllbGRCYXNlJiBvdGhlcik7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdm9pZCBDb3B5RnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkQmFzZSYgb3RoZXIpOworCisgIHZvaWQgUmVzZXJ2ZShpbnQgbmV3X3NpemUpOworCisgIGludCBDYXBhY2l0eSgpIGNvbnN0OworCisgIC8vIFVzZWQgZm9yIGNvbnN0cnVjdGluZyBpdGVyYXRvcnMuCisgIHZvaWQqIGNvbnN0KiByYXdfZGF0YSgpIGNvbnN0OworICB2b2lkKiogcmF3X211dGFibGVfZGF0YSgpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqKiBtdXRhYmxlX2RhdGEoKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICBjb25zdCB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogY29uc3QqIGRhdGEoKSBjb25zdDsKKworICB2b2lkIFN3YXAoUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKTsKKworICB2b2lkIFN3YXBFbGVtZW50cyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIGludCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3Q7CisKKworICAvLyBBZHZhbmNlZCBtZW1vcnkgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIExpa2UgQWRkKCksIGJ1dCBpZiB0aGVyZSBhcmUgbm8gY2xlYXJlZCBvYmplY3RzIHRvIHVzZSwgcmV0dXJucyBOVUxMLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBBZGRGcm9tQ2xlYXJlZCgpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdm9pZCBBZGRBbGxvY2F0ZWQodHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogUmVsZWFzZUxhc3QoKTsKKworICBpbnQgQ2xlYXJlZENvdW50KCkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdm9pZCBBZGRDbGVhcmVkKHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFJlbGVhc2VDbGVhcmVkKCk7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRQdHJGaWVsZEJhc2UpOworCisgIHN0YXRpYyBjb25zdCBpbnQga0luaXRpYWxTaXplID0gNDsKKworICB2b2lkKiogZWxlbWVudHNfOworICBpbnQgICAgY3VycmVudF9zaXplXzsKKyAgaW50ICAgIGFsbG9jYXRlZF9zaXplXzsKKyAgaW50ICAgIHRvdGFsX3NpemVfOworCisgIHZvaWQqICBpbml0aWFsX3NwYWNlX1trSW5pdGlhbFNpemVdOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogY2FzdCh2b2lkKiBlbGVtZW50KSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqPihlbGVtZW50KTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIGNhc3QoY29uc3Qgdm9pZCogZWxlbWVudCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKj4oZWxlbWVudCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmljVHlwZT4KK2NsYXNzIEdlbmVyaWNUeXBlSGFuZGxlciB7CisgcHVibGljOgorICB0eXBlZGVmIEdlbmVyaWNUeXBlIFR5cGU7CisgIHN0YXRpYyBHZW5lcmljVHlwZSogTmV3KCkgeyByZXR1cm4gbmV3IEdlbmVyaWNUeXBlOyB9CisgIHN0YXRpYyB2b2lkIERlbGV0ZShHZW5lcmljVHlwZSogdmFsdWUpIHsgZGVsZXRlIHZhbHVlOyB9CisgIHN0YXRpYyB2b2lkIENsZWFyKEdlbmVyaWNUeXBlKiB2YWx1ZSkgeyB2YWx1ZS0+Q2xlYXIoKTsgfQorICBzdGF0aWMgdm9pZCBNZXJnZShjb25zdCBHZW5lcmljVHlwZSYgZnJvbSwgR2VuZXJpY1R5cGUqIHRvKSB7CisgICAgdG8tPk1lcmdlRnJvbShmcm9tKTsKKyAgfQorICBzdGF0aWMgaW50IFNwYWNlVXNlZChjb25zdCBHZW5lcmljVHlwZSYgdmFsdWUpIHsgcmV0dXJuIHZhbHVlLlNwYWNlVXNlZCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPjo6TWVyZ2UoCisgICAgY29uc3QgTWVzc2FnZUxpdGUmIGZyb20sIE1lc3NhZ2VMaXRlKiB0bykgeworICB0by0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGZyb20pOworfQorCisvLyBIQUNLOiAgSWYgYSBjbGFzcyBpcyBkZWNsYXJlZCBhcyBETEwtZXhwb3J0ZWQgaW4gTVNWQywgaXQgaW5zaXN0cyBvbgorLy8gICBnZW5lcmF0aW5nIGNvcGllcyBvZiBhbGwgaXRzIG1ldGhvZHMgLS0gZXZlbiBpbmxpbmUgb25lcyAtLSB0byBpbmNsdWRlCisvLyAgIGluIHRoZSBETEwuICBCdXQgU3BhY2VVc2VkKCkgY2FsbHMgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIHdoaWNoCisvLyAgIGlzbid0IGluIHRoZSBsaXRlIGxpYnJhcnksIHRoZXJlZm9yZSB0aGUgbGl0ZSBsaWJyYXJ5IGNhbm5vdCBsaW5rIGlmCisvLyAgIFN0cmluZ1R5cGVIYW5kbGVyIGlzIGV4cG9ydGVkLiAgU28sIHdlIGZhY3RvciBvdXQgU3RyaW5nVHlwZUhhbmRsZXJCYXNlLAorLy8gICBleHBvcnQgdGhhdCwgdGhlbiBtYWtlIFN0cmluZ1R5cGVIYW5kbGVyIGJlIGEgc3ViY2xhc3Mgd2hpY2ggaXMgTk9UCisvLyAgIGV4cG9ydGVkLgorLy8gVE9ETyhrZW50b24pOiAgVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTdHJpbmdUeXBlSGFuZGxlckJhc2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBzdHJpbmcgVHlwZTsKKyAgc3RhdGljIHN0cmluZyogTmV3KCk7CisgIHN0YXRpYyB2b2lkIERlbGV0ZShzdHJpbmcqIHZhbHVlKTsKKyAgc3RhdGljIHZvaWQgQ2xlYXIoc3RyaW5nKiB2YWx1ZSkgeyB2YWx1ZS0+Y2xlYXIoKTsgfQorICBzdGF0aWMgdm9pZCBNZXJnZShjb25zdCBzdHJpbmcmIGZyb20sIHN0cmluZyogdG8pIHsgKnRvID0gZnJvbTsgfQorfTsKKworY2xhc3MgU3RyaW5nVHlwZUhhbmRsZXIgOiBwdWJsaWMgU3RyaW5nVHlwZUhhbmRsZXJCYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbnQgU3BhY2VVc2VkKGNvbnN0IHN0cmluZyYgdmFsdWUpICB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oCisgICAgICAgIHNpemVvZih2YWx1ZSkgKyBTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKHZhbHVlKSk7CisgIH0KK307CisKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFJlcGVhdGVkUHRyRmllbGQgaXMgbGlrZSBSZXBlYXRlZEZpZWxkLCBidXQgdXNlZCBmb3IgcmVwZWF0ZWQgc3RyaW5ncyBvcgorLy8gTWVzc2FnZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2NsYXNzIFJlcGVhdGVkUHRyRmllbGQgOiBwdWJsaWMgaW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRCYXNlIHsKKyBwdWJsaWM6CisgIFJlcGVhdGVkUHRyRmllbGQoKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZChjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcik7CisgIH5SZXBlYXRlZFB0ckZpZWxkKCk7CisKKyAgUmVwZWF0ZWRQdHJGaWVsZCYgb3BlcmF0b3I9KGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKTsKKworICBpbnQgc2l6ZSgpIGNvbnN0OworCisgIGNvbnN0IEVsZW1lbnQmIEdldChpbnQgaW5kZXgpIGNvbnN0OworICBFbGVtZW50KiBNdXRhYmxlKGludCBpbmRleCk7CisgIEVsZW1lbnQqIEFkZCgpOworICB2b2lkIFJlbW92ZUxhc3QoKTsgIC8vIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheS4KKyAgdm9pZCBDbGVhcigpOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcik7CisgIHZvaWQgQ29weUZyb20oY29uc3QgUmVwZWF0ZWRQdHJGaWVsZCYgb3RoZXIpOworCisgIC8vIFJlc2VydmUgc3BhY2UgdG8gZXhwYW5kIHRoZSBmaWVsZCB0byBhdCBsZWFzdCB0aGUgZ2l2ZW4gc2l6ZS4gIFRoaXMgb25seQorICAvLyByZXNpemVzIHRoZSBwb2ludGVyIGFycmF5OyBpdCBkb2Vzbid0IGFsbG9jYXRlIGFueSBvYmplY3RzLiAgSWYgdGhlCisgIC8vIGFycmF5IGlzIGdyb3duLCBpdCB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBkb3VibGVkIGluIHNpemUuCisgIHZvaWQgUmVzZXJ2ZShpbnQgbmV3X3NpemUpOworCisgIGludCBDYXBhY2l0eSgpIGNvbnN0OworCisgIC8vIEdldHMgdGhlIHVuZGVybHlpbmcgYXJyYXkuICBUaGlzIHBvaW50ZXIgaXMgcG9zc2libHkgaW52YWxpZGF0ZWQgYnkKKyAgLy8gYW55IGFkZCBvciByZW1vdmUgb3BlcmF0aW9uLgorICBFbGVtZW50KiogbXV0YWJsZV9kYXRhKCk7CisgIGNvbnN0IEVsZW1lbnQqIGNvbnN0KiBkYXRhKCkgY29uc3Q7CisKKyAgLy8gU3dhcCBlbnRpcmUgY29udGVudHMgd2l0aCAib3RoZXIiLgorICB2b2lkIFN3YXAoUmVwZWF0ZWRQdHJGaWVsZCogb3RoZXIpOworCisgIC8vIFN3YXAgdHdvIGVsZW1lbnRzLgorICB2b2lkIFN3YXBFbGVtZW50cyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTsKKworICAvLyBTVEwtbGlrZSBpdGVyYXRvciBzdXBwb3J0CisgIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkUHRySXRlcmF0b3I8RWxlbWVudD4gaXRlcmF0b3I7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkUHRySXRlcmF0b3I8Y29uc3QgRWxlbWVudD4gY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgRWxlbWVudCB2YWx1ZV90eXBlOworCisgIGl0ZXJhdG9yIGJlZ2luKCk7CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisgIGl0ZXJhdG9yIGVuZCgpOworICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdDsKKworICAvLyBDdXN0b20gU1RMLWxpa2UgaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIGFuZCByZXR1cm5zIHRoZSB1bmRlcmx5aW5nCisgIC8vIHBvaW50ZXJzIHRvIEVsZW1lbnQgcmF0aGVyIHRoYW4gRWxlbWVudCBpdHNlbGYuCisgIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjxFbGVtZW50PiBwb2ludGVyX2l0ZXJhdG9yOworICBwb2ludGVyX2l0ZXJhdG9yIHBvaW50ZXJfYmVnaW4oKTsKKyAgcG9pbnRlcl9pdGVyYXRvciBwb2ludGVyX2VuZCgpOworCisgIC8vIFJldHVybnMgKGFuIGVzdGltYXRlIG9mKSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYnkgdGhlIHJlcGVhdGVkIGZpZWxkLAorICAvLyBleGNsdWRpbmcgc2l6ZW9mKCp0aGlzKS4KKyAgaW50IFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdDsKKworICAvLyBBZHZhbmNlZCBtZW1vcnkgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBXaGVuIGhhcmRjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGJlY29tZXMgbmVjZXNzYXJ5IC0tIGFzIGl0IG9mdGVuCisgIC8vIGRvZXMgaGVyZSBhdCBHb29nbGUgLS0gdGhlIGZvbGxvd2luZyBtZXRob2RzIG1heSBiZSB1c2VmdWwuCisKKyAgLy8gQWRkIGFuIGFscmVhZHktYWxsb2NhdGVkIG9iamVjdCwgcGFzc2luZyBvd25lcnNoaXAgdG8gdGhlCisgIC8vIFJlcGVhdGVkUHRyRmllbGQuCisgIHZvaWQgQWRkQWxsb2NhdGVkKEVsZW1lbnQqIHZhbHVlKTsKKyAgLy8gUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgYW5kIHJldHVybiBpdCwgcGFzc2luZyBvd25lcnNoaXAgdG8gdGhlCisgIC8vIGNhbGxlci4KKyAgLy8gUmVxdWlyZXM6ICBzaXplKCkgPiAwCisgIEVsZW1lbnQqIFJlbGVhc2VMYXN0KCk7CisKKyAgLy8gV2hlbiBlbGVtZW50cyBhcmUgcmVtb3ZlZCBieSBjYWxscyB0byBSZW1vdmVMYXN0KCkgb3IgQ2xlYXIoKSwgdGhleQorICAvLyBhcmUgbm90IGFjdHVhbGx5IGZyZWVkLiAgSW5zdGVhZCwgdGhleSBhcmUgY2xlYXJlZCBhbmQga2VwdCBzbyB0aGF0CisgIC8vIHRoZXkgY2FuIGJlIHJldXNlZCBsYXRlci4gIFRoaXMgY2FuIHNhdmUgbG90cyBvZiBDUFUgdGltZSB3aGVuCisgIC8vIHJlcGVhdGVkbHkgcmV1c2luZyBhIHByb3RvY29sIG1lc3NhZ2UgZm9yIHNpbWlsYXIgcHVycG9zZXMuCisgIC8vCisgIC8vIFJlYWxseSwgZXh0cmVtZWx5IGhhcmRjb3JlIHByb2dyYW1zIG1heSBhY3R1YWxseSB3YW50IHRvIG1hbmlwdWxhdGUKKyAgLy8gdGhlc2Ugb2JqZWN0cyB0byBiZXR0ZXItb3B0aW1pemUgbWVtb3J5IG1hbmFnZW1lbnQuICBUaGVzZSBtZXRob2RzCisgIC8vIGFsbG93IHRoYXQuCisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgY2xlYXJlZCBvYmplY3RzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBrZXB0CisgIC8vIGFyb3VuZCBmb3IgcmV1c2UuCisgIGludCBDbGVhcmVkQ291bnQoKSBjb25zdDsKKyAgLy8gQWRkIGFuIGVsZW1lbnQgdG8gdGhlIHBvb2wgb2YgY2xlYXJlZCBvYmplY3RzLCBwYXNzaW5nIG93bmVyc2hpcCB0bworICAvLyB0aGUgUmVwZWF0ZWRQdHJGaWVsZC4gIFRoZSBlbGVtZW50IG11c3QgYmUgY2xlYXJlZCBwcmlvciB0byBjYWxsaW5nCisgIC8vIHRoaXMgbWV0aG9kLgorICB2b2lkIEFkZENsZWFyZWQoRWxlbWVudCogdmFsdWUpOworICAvLyBSZW1vdmUgYSBzaW5nbGUgZWxlbWVudCBmcm9tIHRoZSBjbGVhcmVkIHBvb2wgYW5kIHJldHVybiBpdCwgcGFzc2luZworICAvLyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlci4gIFRoZSBlbGVtZW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgY2xlYXJlZC4KKyAgLy8gUmVxdWlyZXM6ICBDbGVhcmVkQ291bnQoKSA+IDAKKyAgRWxlbWVudCogUmVsZWFzZUNsZWFyZWQoKTsKKworIHByb3RlY3RlZDoKKyAgLy8gTm90ZTogIFJlcGVhdGVkUHRyRmllbGQgU0hPVUxEIE5PVCBiZSBzdWJjbGFzc2VkIGJ5IHVzZXJzLiAgV2Ugb25seQorICAvLyAgIHN1YmNsYXNzIGl0IGluIG9uZSBwbGFjZSBhcyBhIGhhY2sgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcm90bzEuICBUaGUKKyAgLy8gICBzdWJjbGFzcyBuZWVkcyB0byBrbm93IGFib3V0IFR5cGVIYW5kbGVyIGluIG9yZGVyIHRvIGNhbGwgcHJvdGVjdGVkCisgIC8vICAgbWV0aG9kcyBvbiBSZXBlYXRlZFB0ckZpZWxkQmFzZS4KKyAgY2xhc3MgVHlwZUhhbmRsZXI7CisKK307CisKKy8vIGltcGxlbWVudGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRGaWVsZCgpCisgIDogZWxlbWVudHNfKGluaXRpYWxfc3BhY2VfKSwKKyAgICBjdXJyZW50X3NpemVfKDApLAorICAgIHRvdGFsX3NpemVfKGtJbml0aWFsU2l6ZSkgeworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpSZXBlYXRlZEZpZWxkKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKQorICA6IGVsZW1lbnRzXyhpbml0aWFsX3NwYWNlXyksCisgICAgY3VycmVudF9zaXplXygwKSwKKyAgICB0b3RhbF9zaXplXyhrSW5pdGlhbFNpemUpIHsKKyAgQ29weUZyb20ob3RoZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK1JlcGVhdGVkRmllbGQ8RWxlbWVudD46On5SZXBlYXRlZEZpZWxkKCkgeworICBpZiAoZWxlbWVudHNfICE9IGluaXRpYWxfc3BhY2VfKSB7CisgICAgZGVsZXRlIFtdIGVsZW1lbnRzXzsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+JgorUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6b3BlcmF0b3I9KGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKSB7CisgIENvcHlGcm9tKG90aGVyKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBpbnQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6c2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGN1cnJlbnRfc2l6ZV87Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGludCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpDYXBhY2l0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIHRvdGFsX3NpemVfOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6QWRkQWxyZWFkeVJlc2VydmVkKGNvbnN0IEVsZW1lbnQmIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTFQoc2l6ZSgpLCBDYXBhY2l0eSgpKTsKKyAgZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV8rK10gPSB2YWx1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBFbGVtZW50KiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpBZGRBbHJlYWR5UmVzZXJ2ZWQoKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTFQoc2l6ZSgpLCBDYXBhY2l0eSgpKTsKKyAgcmV0dXJuICZlbGVtZW50c19bY3VycmVudF9zaXplXysrXTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgY29uc3QgRWxlbWVudCYgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6R2V0KGludCBpbmRleCkgY29uc3QgeworICBHT09HTEVfRENIRUNLX0xUKGluZGV4LCBzaXplKCkpOworICByZXR1cm4gZWxlbWVudHNfW2luZGV4XTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6TXV0YWJsZShpbnQgaW5kZXgpIHsKKyAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgc2l6ZSgpKTsKKyAgcmV0dXJuIGVsZW1lbnRzXyArIGluZGV4OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlNldChpbnQgaW5kZXgsIGNvbnN0IEVsZW1lbnQmIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTFQoaW5kZXgsIHNpemUoKSk7CisgIGVsZW1lbnRzX1tpbmRleF0gPSB2YWx1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpBZGQoY29uc3QgRWxlbWVudCYgdmFsdWUpIHsKKyAgaWYgKGN1cnJlbnRfc2l6ZV8gPT0gdG90YWxfc2l6ZV8pIFJlc2VydmUodG90YWxfc2l6ZV8gKyAxKTsKKyAgZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV8rK10gPSB2YWx1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6QWRkKCkgeworICBpZiAoY3VycmVudF9zaXplXyA9PSB0b3RhbF9zaXplXykgUmVzZXJ2ZSh0b3RhbF9zaXplXyArIDEpOworICByZXR1cm4gJmVsZW1lbnRzX1tjdXJyZW50X3NpemVfKytdOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlJlbW92ZUxhc3QoKSB7CisgIEdPT0dMRV9EQ0hFQ0tfR1QoY3VycmVudF9zaXplXywgMCk7CisgIC0tY3VycmVudF9zaXplXzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpDbGVhcigpIHsKKyAgY3VycmVudF9zaXplXyA9IDA7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6TWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKSB7CisgIFJlc2VydmUoY3VycmVudF9zaXplXyArIG90aGVyLmN1cnJlbnRfc2l6ZV8pOworICBDb3B5QXJyYXkoZWxlbWVudHNfICsgY3VycmVudF9zaXplXywgb3RoZXIuZWxlbWVudHNfLCBvdGhlci5jdXJyZW50X3NpemVfKTsKKyAgY3VycmVudF9zaXplXyArPSBvdGhlci5jdXJyZW50X3NpemVfOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkNvcHlGcm9tKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKSB7CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShvdGhlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Om11dGFibGVfZGF0YSgpIHsKKyAgcmV0dXJuIGVsZW1lbnRzXzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgY29uc3QgRWxlbWVudCogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6ZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIGVsZW1lbnRzXzsKK30KKworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3ZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6U3dhcChSZXBlYXRlZEZpZWxkKiBvdGhlcikgeworICBFbGVtZW50KiBzd2FwX2VsZW1lbnRzICAgICA9IGVsZW1lbnRzXzsKKyAgaW50ICAgICAgc3dhcF9jdXJyZW50X3NpemUgPSBjdXJyZW50X3NpemVfOworICBpbnQgICAgICBzd2FwX3RvdGFsX3NpemUgICA9IHRvdGFsX3NpemVfOworICAvLyBXZSBtYXkgbm90IGJlIHVzaW5nIGluaXRpYWxfc3BhY2VfIGJ1dCBpdCdzIG5vdCB3b3J0aCBjaGVja2luZy4gIEp1c3QKKyAgLy8gY29weSBpdCBhbnl3YXkuCisgIEVsZW1lbnQgc3dhcF9pbml0aWFsX3NwYWNlW2tJbml0aWFsU2l6ZV07CisgIE1vdmVBcnJheShzd2FwX2luaXRpYWxfc3BhY2UsIGluaXRpYWxfc3BhY2VfLCBrSW5pdGlhbFNpemUpOworCisgIGVsZW1lbnRzXyAgICAgPSBvdGhlci0+ZWxlbWVudHNfOworICBjdXJyZW50X3NpemVfID0gb3RoZXItPmN1cnJlbnRfc2l6ZV87CisgIHRvdGFsX3NpemVfICAgPSBvdGhlci0+dG90YWxfc2l6ZV87CisgIE1vdmVBcnJheShpbml0aWFsX3NwYWNlXywgb3RoZXItPmluaXRpYWxfc3BhY2VfLCBrSW5pdGlhbFNpemUpOworCisgIG90aGVyLT5lbGVtZW50c18gICAgID0gc3dhcF9lbGVtZW50czsKKyAgb3RoZXItPmN1cnJlbnRfc2l6ZV8gPSBzd2FwX2N1cnJlbnRfc2l6ZTsKKyAgb3RoZXItPnRvdGFsX3NpemVfICAgPSBzd2FwX3RvdGFsX3NpemU7CisgIE1vdmVBcnJheShvdGhlci0+aW5pdGlhbF9zcGFjZV8sIHN3YXBfaW5pdGlhbF9zcGFjZSwga0luaXRpYWxTaXplKTsKKworICBpZiAoZWxlbWVudHNfID09IG90aGVyLT5pbml0aWFsX3NwYWNlXykgeworICAgIGVsZW1lbnRzXyA9IGluaXRpYWxfc3BhY2VfOworICB9CisgIGlmIChvdGhlci0+ZWxlbWVudHNfID09IGluaXRpYWxfc3BhY2VfKSB7CisgICAgb3RoZXItPmVsZW1lbnRzXyA9IG90aGVyLT5pbml0aWFsX3NwYWNlXzsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3ZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6U3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpIHsKKyAgc3RkOjpzd2FwKGVsZW1lbnRzX1tpbmRleDFdLCBlbGVtZW50c19baW5kZXgyXSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCitSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpiZWdpbigpIHsKKyAgcmV0dXJuIGVsZW1lbnRzXzsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCitSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpiZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIGVsZW1lbnRzXzsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCitSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjplbmQoKSB7CisgIHJldHVybiBlbGVtZW50c18gKyBjdXJyZW50X3NpemVfOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IKK1JlcGVhdGVkRmllbGQ8RWxlbWVudD46OmVuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGVsZW1lbnRzXyArIGN1cnJlbnRfc2l6ZV87Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGludCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QgeworICByZXR1cm4gKGVsZW1lbnRzXyAhPSBpbml0aWFsX3NwYWNlXykgPyB0b3RhbF9zaXplXyAqIHNpemVvZihlbGVtZW50c19bMF0pIDogMDsKK30KKworLy8gQXZvaWQgaW5saW5pbmcgb2YgUmVzZXJ2ZSgpOiBuZXcsIG1lbWNweSwgYW5kIGRlbGV0ZVtdIGxlYWQgdG8gYSBzaWduaWZpY2FudAorLy8gYW1vdW50IG9mIGNvZGUgYmxvYXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3ZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVzZXJ2ZShpbnQgbmV3X3NpemUpIHsKKyAgaWYgKHRvdGFsX3NpemVfID49IG5ld19zaXplKSByZXR1cm47CisKKyAgRWxlbWVudCogb2xkX2VsZW1lbnRzID0gZWxlbWVudHNfOworICB0b3RhbF9zaXplXyA9IG1heCh0b3RhbF9zaXplXyAqIDIsIG5ld19zaXplKTsKKyAgZWxlbWVudHNfID0gbmV3IEVsZW1lbnRbc3RhdGljX2Nhc3Q8c2l6ZV90Pih0b3RhbF9zaXplXyldOworICBNb3ZlQXJyYXkoZWxlbWVudHNfLCBvbGRfZWxlbWVudHMsIGN1cnJlbnRfc2l6ZV8pOworICBpZiAob2xkX2VsZW1lbnRzICE9IGluaXRpYWxfc3BhY2VfKSB7CisgICAgZGVsZXRlIFtdIG9sZF9lbGVtZW50czsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlRydW5jYXRlKGludCBuZXdfc2l6ZSkgeworICBHT09HTEVfRENIRUNLX0xFKG5ld19zaXplLCBjdXJyZW50X3NpemVfKTsKKyAgY3VycmVudF9zaXplXyA9IG5ld19zaXplOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Ok1vdmVBcnJheSgKKyAgICBFbGVtZW50IHRvW10sIEVsZW1lbnQgZnJvbVtdLCBpbnQgYXJyYXlfc2l6ZSkgeworICBtZW1jcHkodG8sIGZyb20sIGFycmF5X3NpemUgKiBzaXplb2YoRWxlbWVudCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkNvcHlBcnJheSgKKyAgICBFbGVtZW50IHRvW10sIGNvbnN0IEVsZW1lbnQgZnJvbVtdLCBpbnQgYXJyYXlfc2l6ZSkgeworICBtZW1jcHkodG8sIGZyb20sIGFycmF5X3NpemUgKiBzaXplb2YoRWxlbWVudCkpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIGludGVybmFsIHsKKworaW5saW5lIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZXBlYXRlZFB0ckZpZWxkQmFzZSgpCisgIDogZWxlbWVudHNfKGluaXRpYWxfc3BhY2VfKSwKKyAgICBjdXJyZW50X3NpemVfKDApLAorICAgIGFsbG9jYXRlZF9zaXplXygwKSwKKyAgICB0b3RhbF9zaXplXyhrSW5pdGlhbFNpemUpIHsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgordm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6RGVzdHJveSgpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxvY2F0ZWRfc2l6ZV87IGkrKykgeworICAgIFR5cGVIYW5kbGVyOjpEZWxldGUoY2FzdDxUeXBlSGFuZGxlcj4oZWxlbWVudHNfW2ldKSk7CisgIH0KKyAgaWYgKGVsZW1lbnRzXyAhPSBpbml0aWFsX3NwYWNlXykgeworICAgIGRlbGV0ZSBbXSBlbGVtZW50c187CisgIH0KK30KKworaW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6c2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGN1cnJlbnRfc2l6ZV87Cit9CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlJgorUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkdldChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgc2l6ZSgpKTsKKyAgcmV0dXJuICpjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c19baW5kZXhdKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKgorUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok11dGFibGUoaW50IGluZGV4KSB7CisgIEdPT0dMRV9EQ0hFQ0tfTFQoaW5kZXgsIHNpemUoKSk7CisgIHJldHVybiBjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c19baW5kZXhdKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkKCkgeworICBpZiAoY3VycmVudF9zaXplXyA8IGFsbG9jYXRlZF9zaXplXykgeworICAgIHJldHVybiBjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c19bY3VycmVudF9zaXplXysrXSk7CisgIH0KKyAgaWYgKGFsbG9jYXRlZF9zaXplXyA9PSB0b3RhbF9zaXplXykgUmVzZXJ2ZSh0b3RhbF9zaXplXyArIDEpOworICArK2FsbG9jYXRlZF9zaXplXzsKKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHJlc3VsdCA9IFR5cGVIYW5kbGVyOjpOZXcoKTsKKyAgZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV8rK10gPSByZXN1bHQ7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZW1vdmVMYXN0KCkgeworICBHT09HTEVfRENIRUNLX0dUKGN1cnJlbnRfc2l6ZV8sIDApOworICBUeXBlSGFuZGxlcjo6Q2xlYXIoY2FzdDxUeXBlSGFuZGxlcj4oZWxlbWVudHNfWy0tY3VycmVudF9zaXplX10pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgordm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6Q2xlYXIoKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudF9zaXplXzsgaSsrKSB7CisgICAgVHlwZUhhbmRsZXI6OkNsZWFyKGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1tpXSkpOworICB9CisgIGN1cnJlbnRfc2l6ZV8gPSAwOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkUHRyRmllbGRCYXNlJiBvdGhlcikgeworICBSZXNlcnZlKGN1cnJlbnRfc2l6ZV8gKyBvdGhlci5jdXJyZW50X3NpemVfKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlci5jdXJyZW50X3NpemVfOyBpKyspIHsKKyAgICBUeXBlSGFuZGxlcjo6TWVyZ2Uob3RoZXIudGVtcGxhdGUgR2V0PFR5cGVIYW5kbGVyPihpKSwgQWRkPFR5cGVIYW5kbGVyPigpKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6Q29weUZyb20oY29uc3QgUmVwZWF0ZWRQdHJGaWVsZEJhc2UmIG90aGVyKSB7CisgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDbGVhcjxUeXBlSGFuZGxlcj4oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok1lcmdlRnJvbTxUeXBlSGFuZGxlcj4ob3RoZXIpOworfQorCitpbmxpbmUgaW50IFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDYXBhY2l0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIHRvdGFsX3NpemVfOworfQorCitpbmxpbmUgdm9pZCogY29uc3QqIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpyYXdfZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIGVsZW1lbnRzXzsKK30KKworaW5saW5lIHZvaWQqKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6cmF3X211dGFibGVfZGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIGVsZW1lbnRzXzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiogUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Om11dGFibGVfZGF0YSgpIHsKKyAgLy8gVE9ETyhrZW50b24pOiAgQnJlYWtzIEMrKyBhbGlhc2luZyBydWxlcy4gIFdlIHNob3VsZCBwcm9iYWJseSByZW1vdmUgdGhpcworICAvLyAgIG1ldGhvZCBlbnRpcmVseS4KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqKj4oZWxlbWVudHNfKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBjb25zdCoKK1JlcGVhdGVkUHRyRmllbGRCYXNlOjpkYXRhKCkgY29uc3QgeworICAvLyBUT0RPKGtlbnRvbik6ICBCcmVha3MgQysrIGFsaWFzaW5nIHJ1bGVzLiAgV2Ugc2hvdWxkIHByb2JhYmx5IHJlbW92ZSB0aGlzCisgIC8vICAgbWV0aG9kIGVudGlyZWx5LgorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogY29uc3QqPihlbGVtZW50c18pOworfQorCitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6U3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpIHsKKyAgc3RkOjpzd2FwKGVsZW1lbnRzX1tpbmRleDFdLCBlbGVtZW50c19baW5kZXgyXSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KK2lubGluZSBpbnQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdCB7CisgIGludCBhbGxvY2F0ZWRfYnl0ZXMgPQorICAgICAgKGVsZW1lbnRzXyAhPSBpbml0aWFsX3NwYWNlXykgPyB0b3RhbF9zaXplXyAqIHNpemVvZihlbGVtZW50c19bMF0pIDogMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxvY2F0ZWRfc2l6ZV87ICsraSkgeworICAgIGFsbG9jYXRlZF9ieXRlcyArPSBUeXBlSGFuZGxlcjo6U3BhY2VVc2VkKCpjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c19baV0pKTsKKyAgfQorICByZXR1cm4gYWxsb2NhdGVkX2J5dGVzOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CitpbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGRGcm9tQ2xlYXJlZCgpIHsKKyAgaWYgKGN1cnJlbnRfc2l6ZV8gPCBhbGxvY2F0ZWRfc2l6ZV8pIHsKKyAgICByZXR1cm4gY2FzdDxUeXBlSGFuZGxlcj4oZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV8rK10pOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KK3ZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkFkZEFsbG9jYXRlZCgKKyAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUpIHsKKyAgLy8gTWFrZSByb29tIGZvciB0aGUgbmV3IHBvaW50ZXIuCisgIGlmIChjdXJyZW50X3NpemVfID09IHRvdGFsX3NpemVfKSB7CisgICAgLy8gVGhlIGFycmF5IGlzIGNvbXBsZXRlbHkgZnVsbCB3aXRoIG5vIGNsZWFyZWQgb2JqZWN0cywgc28gZ3JvdyBpdC4KKyAgICBSZXNlcnZlKHRvdGFsX3NpemVfICsgMSk7CisgICAgKythbGxvY2F0ZWRfc2l6ZV87CisgIH0gZWxzZSBpZiAoYWxsb2NhdGVkX3NpemVfID09IHRvdGFsX3NpemVfKSB7CisgICAgLy8gVGhlcmUgaXMgbm8gbW9yZSBzcGFjZSBpbiB0aGUgcG9pbnRlciBhcnJheSBiZWNhdXNlIGl0IGNvbnRhaW5zIHNvbWUKKyAgICAvLyBjbGVhcmVkIG9iamVjdHMgYXdhaXRpbmcgcmV1c2UuICBXZSBkb24ndCB3YW50IHRvIGdyb3cgdGhlIGFycmF5IGluIHRoaXMKKyAgICAvLyBjYXNlIGJlY2F1c2Ugb3RoZXJ3aXNlIGEgbG9vcCBjYWxsaW5nIEFkZEFsbG9jYXRlZCgpIGZvbGxvd2VkIGJ5IENsZWFyKCkKKyAgICAvLyB3b3VsZCBsZWFrIG1lbW9yeS4KKyAgICBUeXBlSGFuZGxlcjo6RGVsZXRlKGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1tjdXJyZW50X3NpemVfXSkpOworICB9IGVsc2UgaWYgKGN1cnJlbnRfc2l6ZV8gPCBhbGxvY2F0ZWRfc2l6ZV8pIHsKKyAgICAvLyBXZSBoYXZlIHNvbWUgY2xlYXJlZCBvYmplY3RzLiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVpciBvcmRlciwgc28gd2UKKyAgICAvLyBjYW4ganVzdCBtb3ZlIHRoZSBmaXJzdCBvbmUgdG8gdGhlIGVuZCB0byBtYWtlIHNwYWNlLgorICAgIGVsZW1lbnRzX1thbGxvY2F0ZWRfc2l6ZV9dID0gZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV9dOworICAgICsrYWxsb2NhdGVkX3NpemVfOworICB9IGVsc2UgeworICAgIC8vIFRoZXJlIGFyZSBubyBjbGVhcmVkIG9iamVjdHMuCisgICAgKythbGxvY2F0ZWRfc2l6ZV87CisgIH0KKworICBlbGVtZW50c19bY3VycmVudF9zaXplXysrXSA9IHZhbHVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CitpbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZWxlYXNlTGFzdCgpIHsKKyAgR09PR0xFX0RDSEVDS19HVChjdXJyZW50X3NpemVfLCAwKTsKKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHJlc3VsdCA9CisgICAgICBjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c19bLS1jdXJyZW50X3NpemVfXSk7CisgIC0tYWxsb2NhdGVkX3NpemVfOworICBpZiAoY3VycmVudF9zaXplXyA8IGFsbG9jYXRlZF9zaXplXykgeworICAgIC8vIFRoZXJlIGFyZSBjbGVhcmVkIGVsZW1lbnRzIG9uIHRoZSBlbmQ7IHJlcGxhY2UgdGhlIHJlbW92ZWQgZWxlbWVudAorICAgIC8vIHdpdGggdGhlIGxhc3QgYWxsb2NhdGVkIGVsZW1lbnQuCisgICAgZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV9dID0gZWxlbWVudHNfW2FsbG9jYXRlZF9zaXplX107CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitpbmxpbmUgaW50IFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDbGVhcmVkQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBhbGxvY2F0ZWRfc2l6ZV8gLSBjdXJyZW50X3NpemVfOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkQ2xlYXJlZCgKKyAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUpIHsKKyAgaWYgKGFsbG9jYXRlZF9zaXplXyA9PSB0b3RhbF9zaXplXykgUmVzZXJ2ZSh0b3RhbF9zaXplXyArIDEpOworICBlbGVtZW50c19bYWxsb2NhdGVkX3NpemVfKytdID0gdmFsdWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KK2lubGluZSB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlbGVhc2VDbGVhcmVkKCkgeworICBHT09HTEVfRENIRUNLX0dUKGFsbG9jYXRlZF9zaXplXywgY3VycmVudF9zaXplXyk7CisgIHJldHVybiBjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c19bLS1hbGxvY2F0ZWRfc2l6ZV9dKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpUeXBlSGFuZGxlcgorICAgIDogcHVibGljIGludGVybmFsOjpHZW5lcmljVHlwZUhhbmRsZXI8RWxlbWVudD4ge307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OlR5cGVIYW5kbGVyCisgICAgOiBwdWJsaWMgaW50ZXJuYWw6OlN0cmluZ1R5cGVIYW5kbGVyIHt9OworCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlcGVhdGVkUHRyRmllbGQoKSB7fQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpSZXBlYXRlZFB0ckZpZWxkKAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKSB7CisgIENvcHlGcm9tKG90aGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojp+UmVwZWF0ZWRQdHJGaWVsZCgpIHsKKyAgRGVzdHJveTxUeXBlSGFuZGxlcj4oKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50PiYgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6b3BlcmF0b3I9KAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKSB7CisgIENvcHlGcm9tKG90aGVyKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBpbnQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6c2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpzaXplKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGNvbnN0IEVsZW1lbnQmIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkdldChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpHZXQ8VHlwZUhhbmRsZXI+KGluZGV4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6TXV0YWJsZShpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpNdXRhYmxlPFR5cGVIYW5kbGVyPihpbmRleCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkFkZCgpIHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGQ8VHlwZUhhbmRsZXI+KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVtb3ZlTGFzdCgpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlbW92ZUxhc3Q8VHlwZUhhbmRsZXI+KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Q2xlYXIoKSB7CisgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDbGVhcjxUeXBlSGFuZGxlcj4oKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpNZXJnZUZyb20oCisgICAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZCYgb3RoZXIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok1lcmdlRnJvbTxUeXBlSGFuZGxlcj4ob3RoZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkNvcHlGcm9tKAorICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKSB7CisgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDb3B5RnJvbTxUeXBlSGFuZGxlcj4ob3RoZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBFbGVtZW50KiogUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6bXV0YWJsZV9kYXRhKCkgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Om11dGFibGVfZGF0YTxUeXBlSGFuZGxlcj4oKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgY29uc3QgRWxlbWVudCogY29uc3QqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmRhdGEoKSBjb25zdCB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6ZGF0YTxUeXBlSGFuZGxlcj4oKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Cit2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlN3YXAoUmVwZWF0ZWRQdHJGaWVsZCogb3RoZXIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlN3YXAob3RoZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3ZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6U3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGY8VHlwZUhhbmRsZXI+KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6QWRkQWxsb2NhdGVkKEVsZW1lbnQqIHZhbHVlKSB7CisgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGRBbGxvY2F0ZWQ8VHlwZUhhbmRsZXI+KHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVsZWFzZUxhc3QoKSB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVsZWFzZUxhc3Q8VHlwZUhhbmRsZXI+KCk7Cit9CisKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgaW50IFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkNsZWFyZWRDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDbGVhcmVkQ291bnQoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpBZGRDbGVhcmVkKEVsZW1lbnQqIHZhbHVlKSB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkQ2xlYXJlZDxUeXBlSGFuZGxlcj4odmFsdWUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBFbGVtZW50KiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpSZWxlYXNlQ2xlYXJlZCgpIHsKKyAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZWxlYXNlQ2xlYXJlZDxUeXBlSGFuZGxlcj4oKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpSZXNlcnZlKGludCBuZXdfc2l6ZSkgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlc2VydmUobmV3X3NpemUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBpbnQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Q2FwYWNpdHkoKSBjb25zdCB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6Q2FwYWNpdHkoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBTVEwtbGlrZSBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgUmVwZWF0ZWRQdHJGaWVsZC4gIFlvdSBzaG91bGQgbm90CisvLyByZWZlciB0byB0aGlzIGNsYXNzIGRpcmVjdGx5OyB1c2UgUmVwZWF0ZWRQdHJGaWVsZDxUPjo6aXRlcmF0b3IgaW5zdGVhZC4KKy8vCisvLyBUaGUgaXRlcmF0b3IgZm9yIFJlcGVhdGVkUHRyRmllbGQ8VD4sIFJlcGVhdGVkUHRySXRlcmF0b3I8VD4sIGlzCisvLyB2ZXJ5IHNpbWlsYXIgdG8gaXRlcmF0b3JfcHRyPFQqKj4gaW4gdXRpbC9ndGwvaXRlcmF0b3JfYWRhcHRvcnMtaW5sLmgsCisvLyBidXQgYWRkcyByYW5kb20tYWNjZXNzIG9wZXJhdG9ycyBhbmQgaXMgbW9kaWZpZWQgdG8gd3JhcCBhIHZvaWQqKiBiYXNlCisvLyBpdGVyYXRvciAoc2luY2UgUmVwZWF0ZWRQdHJGaWVsZCBzdG9yZXMgaXRzIGFycmF5IGFzIGEgdm9pZCogYXJyYXkgYW5kCisvLyBjYXN0aW5nIHZvaWQqKiB0byBUKiogd291bGQgdmlvbGF0ZSBDKysgYWxpYXNpbmcgcnVsZXMpLgorLy8KKy8vIFRoaXMgY29kZSBiYXNlZCBvbiBuZXQvcHJvdG8vcHJvdG8tYXJyYXktaW50ZXJuYWwuaCBieSBKZWZmcmV5IFlhc3NraW4KKy8vIChqeWFzc2tpbkBnb29nbGUuY29tKS4KK3RlbXBsYXRlPHR5cGVuYW1lIEVsZW1lbnQ+CitjbGFzcyBSZXBlYXRlZFB0ckl0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjwKKyAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBFbGVtZW50PiB7CisgcHVibGljOgorICB0eXBlZGVmIFJlcGVhdGVkUHRySXRlcmF0b3I8RWxlbWVudD4gaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjppdGVyYXRvcjwKKyAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBFbGVtZW50PiBzdXBlcmNsYXNzOworCisgIC8vIExldCB0aGUgY29tcGlsZXIga25vdyB0aGF0IHRoZXNlIGFyZSB0eXBlIG5hbWVzLCBzbyB3ZSBkb24ndCBoYXZlIHRvCisgIC8vIHdyaXRlICJ0eXBlbmFtZSIgaW4gZnJvbnQgb2YgdGhlbSBldmVyeXdoZXJlLgorICB0eXBlZGVmIHR5cGVuYW1lIHN1cGVyY2xhc3M6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXJjbGFzczo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIHN1cGVyY2xhc3M6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgUmVwZWF0ZWRQdHJJdGVyYXRvcigpIDogaXRfKE5VTEwpIHt9CisgIGV4cGxpY2l0IFJlcGVhdGVkUHRySXRlcmF0b3Iodm9pZCogY29uc3QqIGl0KSA6IGl0XyhpdCkge30KKworICAvLyBBbGxvdyAidXBjYXN0aW5nIiBmcm9tIFJlcGVhdGVkUHRySXRlcmF0b3I8VCoqPiB0bworICAvLyBSZXBlYXRlZFB0ckl0ZXJhdG9yPGNvbnN0IFQqY29uc3QqPi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJFbGVtZW50PgorICBSZXBlYXRlZFB0ckl0ZXJhdG9yKGNvbnN0IFJlcGVhdGVkUHRySXRlcmF0b3I8T3RoZXJFbGVtZW50PiYgb3RoZXIpCisgICAgICA6IGl0XyhvdGhlci5pdF8pIHsKKyAgICAvLyBGb3JjZSBhIGNvbXBpbGVyIGVycm9yIGlmIHRoZSBvdGhlciB0eXBlIGlzIG5vdCBjb252ZXJ0aWJsZSB0byBvdXJzLgorICAgIGlmIChmYWxzZSkgeworICAgICAgaW1wbGljaXRfY2FzdDxFbGVtZW50KiwgT3RoZXJFbGVtZW50Kj4oMCk7CisgICAgfQorICB9CisKKyAgLy8gZGVyZWZlcmVuY2VhYmxlCisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxFbGVtZW50Kj4oKml0Xyk7IH0KKyAgcG9pbnRlciAgIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQorCisgIC8vIHtpbmMsZGVjfXJlbWVudGFibGUKKyAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICsraXRfOyByZXR1cm4gKnRoaXM7IH0KKyAgaXRlcmF0b3IgIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiBpdGVyYXRvcihpdF8rKyk7IH0KKyAgaXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7IC0taXRfOyByZXR1cm4gKnRoaXM7IH0KKyAgaXRlcmF0b3IgIG9wZXJhdG9yLS0oaW50KSB7IHJldHVybiBpdGVyYXRvcihpdF8tLSk7IH0KKworICAvLyBlcXVhbGl0eV9jb21wYXJhYmxlCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfID09IHguaXRfOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfICE9IHguaXRfOyB9CisKKyAgLy8gbGVzc190aGFuX2NvbXBhcmFibGUKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA8IHguaXRfOyB9CisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfIDw9IHguaXRfOyB9CisgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gPiB4Lml0XzsgfQorICBib29sIG9wZXJhdG9yPj0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA+PSB4Lml0XzsgfQorCisgIC8vIGFkZGFibGUsIHN1YnRyYWN0YWJsZQorICBpdGVyYXRvciYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgZCkgeworICAgIGl0XyArPSBkOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBmcmllbmQgaXRlcmF0b3Igb3BlcmF0b3IrKGl0ZXJhdG9yIGl0LCBkaWZmZXJlbmNlX3R5cGUgZCkgeworICAgIGl0ICs9IGQ7CisgICAgcmV0dXJuIGl0OworICB9CisgIGZyaWVuZCBpdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIGQsIGl0ZXJhdG9yIGl0KSB7CisgICAgaXQgKz0gZDsKKyAgICByZXR1cm4gaXQ7CisgIH0KKyAgaXRlcmF0b3ImIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIGQpIHsKKyAgICBpdF8gLT0gZDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgZnJpZW5kIGl0ZXJhdG9yIG9wZXJhdG9yLShpdGVyYXRvciBpdCwgZGlmZmVyZW5jZV90eXBlIGQpIHsKKyAgICBpdCAtPSBkOworICAgIHJldHVybiBpdDsKKyAgfQorCisgIC8vIGluZGV4YWJsZQorICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgZCkgY29uc3QgeyByZXR1cm4gKigqdGhpcyArIGQpOyB9CisKKyAgLy8gcmFuZG9tIGFjY2VzcyBpdGVyYXRvcgorICBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gLSB4Lml0XzsgfQorCisgcHJpdmF0ZToKKyAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJFbGVtZW50PgorICBmcmllbmQgY2xhc3MgUmVwZWF0ZWRQdHJJdGVyYXRvcjsKKworICAvLyBUaGUgaW50ZXJuYWwgaXRlcmF0b3IuCisgIHZvaWQqIGNvbnN0KiBpdF87Cit9OworCisvLyBQcm92aWRlIGFuIGl0ZXJhdG9yIHRoYXQgb3BlcmF0ZXMgb24gcG9pbnRlcnMgdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0cworLy8gcmF0aGVyIHRoYW4gdGhlIG9iamVjdHMgdGhlbXNlbHZlcyBhcyBSZXBlYXRlZFB0ckl0ZXJhdG9yIGRvZXMuCisvLyBDb25zaWRlciB1c2luZyB0aGlzIHdoZW4gd29ya2luZyB3aXRoIHN0bCBhbGdvcml0aG1zIHRoYXQgY2hhbmdlCisvLyB0aGUgYXJyYXkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBFbGVtZW50PgorY2xhc3MgUmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBFbGVtZW50Kj4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3I8RWxlbWVudD4gaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjppdGVyYXRvcjwKKyAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBFbGVtZW50Kj4gc3VwZXJjbGFzczsKKworICAvLyBMZXQgdGhlIGNvbXBpbGVyIGtub3cgdGhhdCB0aGVzZSBhcmUgdHlwZSBuYW1lcywgc28gd2UgZG9uJ3QgaGF2ZSB0bworICAvLyB3cml0ZSAidHlwZW5hbWUiIGluIGZyb250IG9mIHRoZW0gZXZlcnl3aGVyZS4KKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcmNsYXNzOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICB0eXBlZGVmIHR5cGVuYW1lIHN1cGVyY2xhc3M6OnBvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcmNsYXNzOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgIFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcigpIDogaXRfKE5VTEwpIHt9CisgIGV4cGxpY2l0IFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcih2b2lkKiogaXQpIDogaXRfKGl0KSB7fQorCisgIC8vIGRlcmVmZXJlbmNlYWJsZQorICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8RWxlbWVudCoqPihpdF8pOyB9CisgIHBvaW50ZXIgICBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KKworICAvLyB7aW5jLGRlY31yZW1lbnRhYmxlCisgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyArK2l0XzsgcmV0dXJuICp0aGlzOyB9CisgIGl0ZXJhdG9yICBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gaXRlcmF0b3IoaXRfKyspOyB9CisgIGl0ZXJhdG9yJiBvcGVyYXRvci0tKCkgeyAtLWl0XzsgcmV0dXJuICp0aGlzOyB9CisgIGl0ZXJhdG9yICBvcGVyYXRvci0tKGludCkgeyByZXR1cm4gaXRlcmF0b3IoaXRfLS0pOyB9CisKKyAgLy8gZXF1YWxpdHlfY29tcGFyYWJsZQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA9PSB4Lml0XzsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyAhPSB4Lml0XzsgfQorCisgIC8vIGxlc3NfdGhhbl9jb21wYXJhYmxlCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gPCB4Lml0XzsgfQorICBib29sIG9wZXJhdG9yPD0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA8PSB4Lml0XzsgfQorICBib29sIG9wZXJhdG9yPihjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfID4geC5pdF87IH0KKyAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gPj0geC5pdF87IH0KKworICAvLyBhZGRhYmxlLCBzdWJ0cmFjdGFibGUKKyAgaXRlcmF0b3ImIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIGQpIHsKKyAgICBpdF8gKz0gZDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgZnJpZW5kIGl0ZXJhdG9yIG9wZXJhdG9yKyhpdGVyYXRvciBpdCwgZGlmZmVyZW5jZV90eXBlIGQpIHsKKyAgICBpdCArPSBkOworICAgIHJldHVybiBpdDsKKyAgfQorICBmcmllbmQgaXRlcmF0b3Igb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBkLCBpdGVyYXRvciBpdCkgeworICAgIGl0ICs9IGQ7CisgICAgcmV0dXJuIGl0OworICB9CisgIGl0ZXJhdG9yJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBkKSB7CisgICAgaXRfIC09IGQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGZyaWVuZCBpdGVyYXRvciBvcGVyYXRvci0oaXRlcmF0b3IgaXQsIGRpZmZlcmVuY2VfdHlwZSBkKSB7CisgICAgaXQgLT0gZDsKKyAgICByZXR1cm4gaXQ7CisgIH0KKworICAvLyBpbmRleGFibGUKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIGQpIGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBkKTsgfQorCisgIC8vIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IKKyAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfIC0geC5pdF87IH0KKworIHByaXZhdGU6CisgIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRWxlbWVudD4KKyAgZnJpZW5kIGNsYXNzIFJlcGVhdGVkUHRySXRlcmF0b3I7CisKKyAgLy8gVGhlIGludGVybmFsIGl0ZXJhdG9yLgorICB2b2lkKiogaXRfOworfTsKKworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6aXRlcmF0b3IKK1JlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmJlZ2luKCkgeworICByZXR1cm4gaXRlcmF0b3IocmF3X2RhdGEoKSk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9pdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6YmVnaW4oKSBjb25zdCB7CisgIHJldHVybiBpdGVyYXRvcihyYXdfZGF0YSgpKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjplbmQoKSB7CisgIHJldHVybiBpdGVyYXRvcihyYXdfZGF0YSgpICsgc2l6ZSgpKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjplbmQoKSBjb25zdCB7CisgIHJldHVybiBpdGVyYXRvcihyYXdfZGF0YSgpICsgc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6cG9pbnRlcl9pdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6cG9pbnRlcl9iZWdpbigpIHsKKyAgcmV0dXJuIHBvaW50ZXJfaXRlcmF0b3IocmF3X211dGFibGVfZGF0YSgpKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OnBvaW50ZXJfaXRlcmF0b3IKK1JlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OnBvaW50ZXJfZW5kKCkgeworICByZXR1cm4gcG9pbnRlcl9pdGVyYXRvcihyYXdfbXV0YWJsZV9kYXRhKCkgKyBzaXplKCkpOworfQorCisKKy8vIEl0ZXJhdG9ycyBhbmQgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IGZvbGxvdyB0aGUgc3Bpcml0IG9mIHRoZSBTVEwKKy8vIHN0ZDo6YmFja19pbnNlcnRfaXRlcmF0b3IgYW5kIHN0ZDo6YmFja19pbnNlcnRlciBidXQgYXJlIHRhaWxvci1tYWRlCisvLyBmb3IgUmVwZWF0ZWRGaWVsZCBhbmQgUmVwYXRlZFB0ckZpZWxkLiBUeXBpY2FsIHVzYWdlIHdvdWxkIGJlOgorLy8KKy8vICAgc3RkOjpjb3B5KHNvbWVfc2VxdWVuY2UuYmVnaW4oKSwgc29tZV9zZXF1ZW5jZS5lbmQoKSwKKy8vICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIocHJvdG8ubXV0YWJsZV9zZXF1ZW5jZSgpKSk7CisvLworLy8gUG9ydGVkIGJ5IGpvaGFubmVzIGZyb20gdXRpbC9ndGwvcHJvdG8tYXJyYXktaXRlcmF0b3JzLWlubC5oCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLyBBIGJhY2sgaW5zZXJ0ZXIgZm9yIFJlcGVhdGVkRmllbGQgb2JqZWN0cy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6b3V0cHV0X2l0ZXJhdG9yX3RhZywgVD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcigKKyAgICAgIFJlcGVhdGVkRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpCisgICAgICA6IGZpZWxkXyhtdXRhYmxlX2ZpZWxkKSB7CisgIH0KKyAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3I9KGNvbnN0IFQmIHZhbHVlKSB7CisgICAgZmllbGRfLT5BZGQodmFsdWUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvciooKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKysoKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKysoaW50IC8qaWdub3Jlc19wYXJhbWV0ZXIqLykgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgUmVwZWF0ZWRGaWVsZDxUPiogZmllbGRfOworfTsKKworLy8gQSBiYWNrIGluc2VydGVyIGZvciBSZXBlYXRlZFB0ckZpZWxkIG9iamVjdHMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWcsIFQ+IHsKKyBwdWJsaWM6CisgIFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IoCisgICAgICBSZXBlYXRlZFB0ckZpZWxkPFQ+KiBjb25zdCBtdXRhYmxlX2ZpZWxkKQorICAgICAgOiBmaWVsZF8obXV0YWJsZV9maWVsZCkgeworICB9CisgIFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yPShjb25zdCBUJiB2YWx1ZSkgeworICAgICpmaWVsZF8tPkFkZCgpID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yPSgKKyAgICAgIGNvbnN0IFQqIGNvbnN0IHB0cl90b192YWx1ZSkgeworICAgICpmaWVsZF8tPkFkZCgpID0gKnB0cl90b192YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IqKCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKGludCAvKmlnbm9yZXNfcGFyYW1ldGVyKi8pIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIFJlcGVhdGVkUHRyRmllbGQ8VD4qIGZpZWxkXzsKK307CisKKy8vIEEgYmFjayBpbnNlcnRlciBmb3IgUmVwZWF0ZWRQdHJGaWVsZHMgdGhhdCBpbnNlcnRzIGJ5IHRyYW5zZmVyaW5nIG93bmVyc2hpcAorLy8gb2YgYSBwb2ludGVyLgordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpvdXRwdXRfaXRlcmF0b3JfdGFnLCBUPiB7CisgcHVibGljOgorICBleHBsaWNpdCBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yKAorICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkKKyAgICAgIDogZmllbGRfKG11dGFibGVfZmllbGQpIHsKKyAgfQorICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcj0oCisgICAgICBUKiBjb25zdCBwdHJfdG9fdmFsdWUpIHsKKyAgICBmaWVsZF8tPkFkZEFsbG9jYXRlZChwdHJfdG9fdmFsdWUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvciooKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKysoKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKysoCisgICAgICBpbnQgLyppZ25vcmVzX3BhcmFtZXRlciovKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyBwcml2YXRlOgorICBSZXBlYXRlZFB0ckZpZWxkPFQ+KiBmaWVsZF87Cit9OworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFByb3ZpZGVzIGEgYmFjayBpbnNlcnQgaXRlcmF0b3IgZm9yIFJlcGVhdGVkRmllbGQgaW5zdGFuY2VzLAorLy8gc2ltaWxhciB0byBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKS4gTm90ZSB0aGUgaWRlbnRpY2FsbHkgbmFtZWQKKy8vIGZ1bmN0aW9uIGZvciBSZXBlYXRlZFB0ckZpZWxkIGluc3RhbmNlcy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGludGVybmFsOjpSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+CitSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKFJlcGVhdGVkRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+KG11dGFibGVfZmllbGQpOworfQorCisvLyBQcm92aWRlcyBhIGJhY2sgaW5zZXJ0IGl0ZXJhdG9yIGZvciBSZXBlYXRlZFB0ckZpZWxkIGluc3RhbmNlcywKKy8vIHNpbWlsYXIgdG8gc3RkOjpiYWNrX2luc2VydGVyKCkuIE5vdGUgdGhlIGlkZW50aWNhbGx5IG5hbWVkCisvLyBmdW5jdGlvbiBmb3IgUmVwZWF0ZWRGaWVsZCBpbnN0YW5jZXMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPgorUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlcihSZXBlYXRlZFB0ckZpZWxkPFQ+KiBjb25zdCBtdXRhYmxlX2ZpZWxkKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPihtdXRhYmxlX2ZpZWxkKTsKK30KKworLy8gUHJvdmlkZXMgYSBiYWNrIGluc2VydCBpdGVyYXRvciBmb3IgUmVwZWF0ZWRQdHJGaWVsZCBpbnN0YW5jZXMKKy8vIHNpbWlsYXIgdG8gc3RkOjpiYWNrX2luc2VydGVyKCkgd2hpY2ggdHJhbnNmZXJzIHRoZSBvd25lcnNoaXAgd2hpbGUKKy8vIGNvcHlpbmcgZWxlbWVudHMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnRlcm5hbDo6QWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPgorQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICBSZXBlYXRlZFB0ckZpZWxkPFQ+KiBjb25zdCBtdXRhYmxlX2ZpZWxkKSB7CisgIHJldHVybiBpbnRlcm5hbDo6QWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPigKKyAgICAgIG11dGFibGVfZmllbGQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUkVQRUFURURfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTFlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDEwODYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRPRE8oa2VudG9uKTogIEltcHJvdmUgdGhpcyB1bml0dGVzdCB0byBicmluZyBpdCB1cCB0byB0aGUgc3RhbmRhcmRzIG9mCisvLyAgIG90aGVyIHByb3RvMiB1bml0dGVzdHMuCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7Cit1c2luZyBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzOworCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHsKKworLy8gVGVzdCBvcGVyYXRpb25zIG9uIGEgUmVwZWF0ZWRGaWVsZCB3aGljaCBpcyBzbWFsbCBlbm91Z2ggdGhhdCBpdCBkb2VzCisvLyBub3QgYWxsb2NhdGUgYSBzZXBhcmF0ZSBhcnJheSBmb3Igc3RvcmFnZS4KK1RFU1QoUmVwZWF0ZWRGaWVsZCwgU21hbGwpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworCisgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDApOworCisgIGZpZWxkLkFkZCg1KTsKKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAxKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgNSk7CisKKyAgZmllbGQuQWRkKDQyKTsKKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAyKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgNSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMSksIDQyKTsKKworICBmaWVsZC5TZXQoMSwgMjMpOworCisgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCA1KTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgxKSwgMjMpOworICBFWFBFQ1RfRVEoZmllbGQuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpLCAwKTsKKworICBmaWVsZC5SZW1vdmVMYXN0KCk7CisKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksIDUpOworCisgIGZpZWxkLkNsZWFyKCk7CisKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMCk7CisgIEVYUEVDVF9FUShmaWVsZC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCksIDApOworfQorCisvLyBUZXN0IG9wZXJhdGlvbnMgb24gYSBSZXBlYXRlZEZpZWxkIHdoaWNoIGlzIGxhcmdlIGVub3VnaCB0byBhbGxvY2F0ZSBhCisvLyBzZXBhcmF0ZSBhcnJheS4KK1RFU1QoUmVwZWF0ZWRGaWVsZCwgTGFyZ2UpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIGZpZWxkLkFkZChpICogaSk7CisgIH0KKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAxNik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGZpZWxkLkdldChpKSwgaSAqIGkpOworICB9CisKKyAgaW50IGV4cGVjdGVkX3VzYWdlID0gMTYgKiBzaXplb2YoaW50KTsKKyAgRVhQRUNUX0dFKGZpZWxkLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSwgZXhwZWN0ZWRfdXNhZ2UpOworfQorCisvLyBUZXN0IHN3YXBwaW5nIGJldHdlZW4gdmFyaW91cyB0eXBlcyBvZiBSZXBlYXRlZEZpZWxkcy4KK1RFU1QoUmVwZWF0ZWRGaWVsZCwgU3dhcFNtYWxsU21hbGwpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkMTsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkMjsKKworICBmaWVsZDEuQWRkKDUpOworICBmaWVsZDEuQWRkKDQyKTsKKworICBmaWVsZDEuU3dhcCgmZmllbGQyKTsKKworICBFWFBFQ1RfRVEoZmllbGQxLnNpemUoKSwgMCk7CisgIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAyKTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoMCksIDUpOworICBFWFBFQ1RfRVEoZmllbGQyLkdldCgxKSwgNDIpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIFN3YXBMYXJnZVNtYWxsKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDE7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDI7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgZmllbGQxLkFkZChpICogaSk7CisgIH0KKyAgZmllbGQyLkFkZCg1KTsKKyAgZmllbGQyLkFkZCg0Mik7CisgIGZpZWxkMS5Td2FwKCZmaWVsZDIpOworCisgIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAyKTsKKyAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoMCksIDUpOworICBFWFBFQ1RfRVEoZmllbGQxLkdldCgxKSwgNDIpOworICBFWFBFQ1RfRVEoZmllbGQyLnNpemUoKSwgMTYpOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZmllbGQyLkdldChpKSwgaSAqIGkpOworICB9Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgU3dhcExhcmdlTGFyZ2UpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkMTsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkMjsKKworICBmaWVsZDEuQWRkKDUpOworICBmaWVsZDEuQWRkKDQyKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgZmllbGQxLkFkZChpKTsKKyAgICBmaWVsZDIuQWRkKGkgKiBpKTsKKyAgfQorICBmaWVsZDIuU3dhcCgmZmllbGQxKTsKKworICBFWFBFQ1RfRVEoZmllbGQxLnNpemUoKSwgMTYpOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZmllbGQxLkdldChpKSwgaSAqIGkpOworICB9CisgIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAxOCk7CisgIEVYUEVDVF9FUShmaWVsZDIuR2V0KDApLCA1KTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoMSksIDQyKTsKKyAgZm9yIChpbnQgaSA9IDI7IGkgPCAxODsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoaSksIGkgLSAyKTsKKyAgfQorfQorCisvLyBEZXRlcm1pbmVzIGhvdyBtdWNoIHNwYWNlIHdhcyByZXNlcnZlZCBieSB0aGUgZ2l2ZW4gZmllbGQgYnkgYWRkaW5nIGVsZW1lbnRzCisvLyB0byBpdCB1bnRpbCBpdCByZS1hbGxvY2F0ZXMgaXRzIHNwYWNlLgorc3RhdGljIGludCBSZXNlcnZlZFNwYWNlKFJlcGVhdGVkRmllbGQ8aW50PiogZmllbGQpIHsKKyAgY29uc3QgaW50KiBwdHIgPSBmaWVsZC0+ZGF0YSgpOworICBkbyB7CisgICAgZmllbGQtPkFkZCgwKTsKKyAgfSB3aGlsZSAoZmllbGQtPmRhdGEoKSA9PSBwdHIpOworCisgIHJldHVybiBmaWVsZC0+c2l6ZSgpIC0gMTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBSZXNlcnZlTW9yZVRoYW5Eb3VibGUpIHsKKyAgLy8gUmVzZXJ2ZSBtb3JlIHRoYW4gZG91YmxlIHRoZSBwcmV2aW91cyBzcGFjZSBpbiB0aGUgZmllbGQgYW5kIGV4cGVjdCB0aGUKKyAgLy8gZmllbGQgdG8gcmVzZXJ2ZSBleGFjdGx5IHRoZSBhbW91bnQgc3BlY2lmaWVkLgorICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7CisgIGZpZWxkLlJlc2VydmUoMjApOworCisgIEVYUEVDVF9FUSgyMCwgUmVzZXJ2ZWRTcGFjZSgmZmllbGQpKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBSZXNlcnZlTGVzc1RoYW5Eb3VibGUpIHsKKyAgLy8gUmVzZXJ2ZSBsZXNzIHRoYW4gZG91YmxlIHRoZSBwcmV2aW91cyBzcGFjZSBpbiB0aGUgZmllbGQgYW5kIGV4cGVjdCB0aGUKKyAgLy8gZmllbGQgdG8gZ3JvdyBieSBkb3VibGUgaW5zdGVhZC4KKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworICBmaWVsZC5SZXNlcnZlKDIwKTsKKyAgZmllbGQuUmVzZXJ2ZSgzMCk7CisKKyAgRVhQRUNUX0VRKDQwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIFJlc2VydmVMZXNzVGhhbkV4aXN0aW5nKSB7CisgIC8vIFJlc2VydmUgbGVzcyB0aGFuIHRoZSBwcmV2aW91cyBzcGFjZSBpbiB0aGUgZmllbGQgYW5kIGV4cGVjdCB0aGUKKyAgLy8gZmllbGQgdG8gbm90IHJlLWFsbG9jYXRlIGF0IGFsbC4KKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworICBmaWVsZC5SZXNlcnZlKDIwKTsKKyAgY29uc3QgaW50KiBwcmV2aW91c19wdHIgPSBmaWVsZC5kYXRhKCk7CisgIGZpZWxkLlJlc2VydmUoMTApOworCisgIEVYUEVDVF9FUShwcmV2aW91c19wdHIsIGZpZWxkLmRhdGEoKSk7CisgIEVYUEVDVF9FUSgyMCwgUmVzZXJ2ZWRTcGFjZSgmZmllbGQpKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBNZXJnZUZyb20pIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IHNvdXJjZSwgZGVzdGluYXRpb247CisKKyAgc291cmNlLkFkZCg0KTsKKyAgc291cmNlLkFkZCg1KTsKKworICBkZXN0aW5hdGlvbi5BZGQoMSk7CisgIGRlc3RpbmF0aW9uLkFkZCgyKTsKKyAgZGVzdGluYXRpb24uQWRkKDMpOworCisgIGRlc3RpbmF0aW9uLk1lcmdlRnJvbShzb3VyY2UpOworCisgIEFTU0VSVF9FUSg1LCBkZXN0aW5hdGlvbi5zaXplKCkpOworCisgIEVYUEVDVF9FUSgxLCBkZXN0aW5hdGlvbi5HZXQoMCkpOworICBFWFBFQ1RfRVEoMiwgZGVzdGluYXRpb24uR2V0KDEpKTsKKyAgRVhQRUNUX0VRKDMsIGRlc3RpbmF0aW9uLkdldCgyKSk7CisgIEVYUEVDVF9FUSg0LCBkZXN0aW5hdGlvbi5HZXQoMykpOworICBFWFBFQ1RfRVEoNSwgZGVzdGluYXRpb24uR2V0KDQpKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBDb3B5RnJvbSkgeworICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlLCBkZXN0aW5hdGlvbjsKKworICBzb3VyY2UuQWRkKDQpOworICBzb3VyY2UuQWRkKDUpOworCisgIGRlc3RpbmF0aW9uLkFkZCgxKTsKKyAgZGVzdGluYXRpb24uQWRkKDIpOworICBkZXN0aW5hdGlvbi5BZGQoMyk7CisKKyAgZGVzdGluYXRpb24uQ29weUZyb20oc291cmNlKTsKKworICBBU1NFUlRfRVEoMiwgZGVzdGluYXRpb24uc2l6ZSgpKTsKKworICBFWFBFQ1RfRVEoNCwgZGVzdGluYXRpb24uR2V0KDApKTsKKyAgRVhQRUNUX0VRKDUsIGRlc3RpbmF0aW9uLkdldCgxKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgQ29weUNvbnN0cnVjdCkgeworICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlOworICBzb3VyY2UuQWRkKDEpOworICBzb3VyY2UuQWRkKDIpOworCisgIFJlcGVhdGVkRmllbGQ8aW50PiBkZXN0aW5hdGlvbihzb3VyY2UpOworCisgIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgZGVzdGluYXRpb24uR2V0KDApKTsKKyAgRVhQRUNUX0VRKDIsIGRlc3RpbmF0aW9uLkdldCgxKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgQ29weUFzc2lnbikgeworICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlLCBkZXN0aW5hdGlvbjsKKworICBzb3VyY2UuQWRkKDQpOworICBzb3VyY2UuQWRkKDUpOworCisgIGRlc3RpbmF0aW9uLkFkZCgxKTsKKyAgZGVzdGluYXRpb24uQWRkKDIpOworICBkZXN0aW5hdGlvbi5BZGQoMyk7CisKKyAgZGVzdGluYXRpb24gPSBzb3VyY2U7CisKKyAgQVNTRVJUX0VRKDIsIGRlc3RpbmF0aW9uLnNpemUoKSk7CisKKyAgRVhQRUNUX0VRKDQsIGRlc3RpbmF0aW9uLkdldCgwKSk7CisgIEVYUEVDVF9FUSg1LCBkZXN0aW5hdGlvbi5HZXQoMSkpOworfQorCitURVNUKFJlcGVhdGVkRmllbGQsIE11dGFibGVEYXRhSXNNdXRhYmxlKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKKyAgZmllbGQuQWRkKDEpOworICBFWFBFQ1RfRVEoMSwgZmllbGQuR2V0KDApKTsKKyAgLy8gVGhlIGZhY3QgdGhhdCB0aGlzIGxpbmUgY29tcGlsZXMgd291bGQgYmUgZW5vdWdoLCBidXQgd2UnbGwgY2hlY2sgdGhlCisgIC8vIHZhbHVlIGFueXdheS4KKyAgKmZpZWxkLm11dGFibGVfZGF0YSgpID0gMjsKKyAgRVhQRUNUX0VRKDIsIGZpZWxkLkdldCgwKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgVHJ1bmNhdGUpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworCisgIGZpZWxkLkFkZCgxMik7CisgIGZpZWxkLkFkZCgzNCk7CisgIGZpZWxkLkFkZCg1Nik7CisgIGZpZWxkLkFkZCg3OCk7CisgIEVYUEVDVF9FUSg0LCBmaWVsZC5zaXplKCkpOworCisgIGZpZWxkLlRydW5jYXRlKDMpOworICBFWFBFQ1RfRVEoMywgZmllbGQuc2l6ZSgpKTsKKworICBmaWVsZC5BZGQoOTApOworICBFWFBFQ1RfRVEoNCwgZmllbGQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDkwLCBmaWVsZC5HZXQoMykpOworCisgIC8vIFRydW5jYXRpb25zIHRoYXQgZG9uJ3QgY2hhbmdlIHRoZSBzaXplIGFyZSBhbGxvd2VkLCBidXQgZ3Jvd2luZyBpcyBub3QKKyAgLy8gYWxsb3dlZC4KKyAgZmllbGQuVHJ1bmNhdGUoZmllbGQuc2l6ZSgpKTsKKyNpZmRlZiBHVEVTVF9IQVNfREVBVEhfVEVTVAorICBFWFBFQ1RfREVCVUdfREVBVEgoZmllbGQuVHJ1bmNhdGUoZmllbGQuc2l6ZSgpICsgMSksICJuZXdfc2l6ZSIpOworI2VuZGlmCit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUmVwZWF0ZWRQdHJGaWVsZCB0ZXN0cy4gIFRoZXNlIHByZXR0eSBtdWNoIGp1c3QgbWlycm9yIHRoZSBSZXBlYXRlZEZpZWxkCisvLyB0ZXN0cyBhYm92ZS4KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBTbWFsbCkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7CisKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMCk7CisKKyAgZmllbGQuQWRkKCktPmFzc2lnbigiZm9vIik7CisKKyAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMSk7CisgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksICJmb28iKTsKKworICBmaWVsZC5BZGQoKS0+YXNzaWduKCJiYXIiKTsKKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAyKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgImZvbyIpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDEpLCAiYmFyIik7CisKKyAgZmllbGQuTXV0YWJsZSgxKS0+YXNzaWduKCJiYXoiKTsKKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAyKTsKKyAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgImZvbyIpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDEpLCAiYmF6Iik7CisKKyAgZmllbGQuUmVtb3ZlTGFzdCgpOworCisgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDEpOworICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCAiZm9vIik7CisKKyAgZmllbGQuQ2xlYXIoKTsKKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAwKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBMYXJnZSkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgKmZpZWxkLkFkZCgpICs9ICdhJyArIGk7CisgIH0KKworICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAxNik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGZpZWxkLkdldChpKS5zaXplKCksIDEpOworICAgIEVYUEVDVF9FUShmaWVsZC5HZXQoaSlbMF0sICdhJyArIGkpOworICB9CisKKyAgaW50IG1pbl9leHBlY3RlZF91c2FnZSA9IDE2ICogc2l6ZW9mKHN0cmluZyk7CisgIEVYUEVDVF9HRShmaWVsZC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCksIG1pbl9leHBlY3RlZF91c2FnZSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgU3dhcFNtYWxsU21hbGwpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkMTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkMjsKKworICBmaWVsZDEuQWRkKCktPmFzc2lnbigiZm9vIik7CisgIGZpZWxkMS5BZGQoKS0+YXNzaWduKCJiYXIiKTsKKyAgZmllbGQxLlN3YXAoJmZpZWxkMik7CisKKyAgRVhQRUNUX0VRKGZpZWxkMS5zaXplKCksIDApOworICBFWFBFQ1RfRVEoZmllbGQyLnNpemUoKSwgMik7CisgIEVYUEVDVF9FUShmaWVsZDIuR2V0KDApLCAiZm9vIik7CisgIEVYUEVDVF9FUShmaWVsZDIuR2V0KDEpLCAiYmFyIik7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgU3dhcExhcmdlU21hbGwpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkMTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkMjsKKworICBmaWVsZDIuQWRkKCktPmFzc2lnbigiZm9vIik7CisgIGZpZWxkMi5BZGQoKS0+YXNzaWduKCJiYXIiKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgKmZpZWxkMS5BZGQoKSArPSAnYScgKyBpOworICB9CisgIGZpZWxkMS5Td2FwKCZmaWVsZDIpOworCisgIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAyKTsKKyAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoMCksICJmb28iKTsKKyAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoMSksICJiYXIiKTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDE2KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoaSkuc2l6ZSgpLCAxKTsKKyAgICBFWFBFQ1RfRVEoZmllbGQyLkdldChpKVswXSwgJ2EnICsgaSk7CisgIH0KK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBTd2FwTGFyZ2VMYXJnZSkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQxOworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQyOworCisgIGZpZWxkMS5BZGQoKS0+YXNzaWduKCJmb28iKTsKKyAgZmllbGQxLkFkZCgpLT5hc3NpZ24oImJhciIpOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAqZmllbGQxLkFkZCgpICs9ICdBJyArIGk7CisgICAgKmZpZWxkMi5BZGQoKSArPSAnYScgKyBpOworICB9CisgIGZpZWxkMi5Td2FwKCZmaWVsZDEpOworCisgIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAxNik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgIEVYUEVDVF9FUShmaWVsZDEuR2V0KGkpLnNpemUoKSwgMSk7CisgICAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoaSlbMF0sICdhJyArIGkpOworICB9CisgIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAxOCk7CisgIEVYUEVDVF9FUShmaWVsZDIuR2V0KDApLCAiZm9vIik7CisgIEVYUEVDVF9FUShmaWVsZDIuR2V0KDEpLCAiYmFyIik7CisgIGZvciAoaW50IGkgPSAyOyBpIDwgMTg7IGkrKykgeworICAgIEVYUEVDVF9FUShmaWVsZDIuR2V0KGkpLnNpemUoKSwgMSk7CisgICAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoaSlbMF0sICdBJyArIGkgLSAyKTsKKyAgfQorfQorCitzdGF0aWMgaW50IFJlc2VydmVkU3BhY2UoUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KiBmaWVsZCkgeworICBjb25zdCBzdHJpbmcqIGNvbnN0KiBwdHIgPSBmaWVsZC0+ZGF0YSgpOworICBkbyB7CisgICAgZmllbGQtPkFkZCgpOworICB9IHdoaWxlIChmaWVsZC0+ZGF0YSgpID09IHB0cik7CisKKyAgcmV0dXJuIGZpZWxkLT5zaXplKCkgLSAxOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIFJlc2VydmVNb3JlVGhhbkRvdWJsZSkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7CisgIGZpZWxkLlJlc2VydmUoMjApOworCisgIEVYUEVDVF9FUSgyMCwgUmVzZXJ2ZWRTcGFjZSgmZmllbGQpKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBSZXNlcnZlTGVzc1RoYW5Eb3VibGUpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkOworICBmaWVsZC5SZXNlcnZlKDIwKTsKKyAgZmllbGQuUmVzZXJ2ZSgzMCk7CisKKyAgRVhQRUNUX0VRKDQwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIFJlc2VydmVMZXNzVGhhbkV4aXN0aW5nKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDsKKyAgZmllbGQuUmVzZXJ2ZSgyMCk7CisgIGNvbnN0IHN0cmluZyogY29uc3QqIHByZXZpb3VzX3B0ciA9IGZpZWxkLmRhdGEoKTsKKyAgZmllbGQuUmVzZXJ2ZSgxMCk7CisKKyAgRVhQRUNUX0VRKHByZXZpb3VzX3B0ciwgZmllbGQuZGF0YSgpKTsKKyAgRVhQRUNUX0VRKDIwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIFJlc2VydmVEb2VzbnRMb3NlQWxsb2NhdGVkKSB7CisgIC8vIENoZWNrIHRoYXQgYSBidWcgaXMgZml4ZWQ6ICBBbiBlYXJsaWVyIGltcGxlbWVudGF0aW9uIG9mIFJlc2VydmUoKQorICAvLyBmYWlsZWQgdG8gY29weSBwb2ludGVycyB0byBhbGxvY2F0ZWQtYnV0LWNsZWFyZWQgb2JqZWN0cywgcG9zc2libHkKKyAgLy8gbGVhZGluZyB0byBzZWdmYXVsdHMuCisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDsKKyAgc3RyaW5nKiBmaXJzdCA9IGZpZWxkLkFkZCgpOworICBmaWVsZC5SZW1vdmVMYXN0KCk7CisKKyAgZmllbGQuUmVzZXJ2ZSgyMCk7CisgIEVYUEVDVF9FUShmaXJzdCwgZmllbGQuQWRkKCkpOworfQorCisvLyBDbGVhcmluZyBlbGVtZW50cyBpcyB0cmlja3kgd2l0aCBSZXBlYXRlZFB0ckZpZWxkcyBzaW5jZSB0aGUgbWVtb3J5IGZvcgorLy8gdGhlIGVsZW1lbnRzIGlzIHJldGFpbmVkIGFuZCByZXVzZWQuCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIENsZWFyZWRFbGVtZW50cykgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7CisKKyAgc3RyaW5nKiBvcmlnaW5hbCA9IGZpZWxkLkFkZCgpOworICAqb3JpZ2luYWwgPSAiZm9vIjsKKworICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOworCisgIGZpZWxkLlJlbW92ZUxhc3QoKTsKKyAgRVhQRUNUX1RSVUUob3JpZ2luYWwtPmVtcHR5KCkpOworICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDEpOworCisgIEVYUEVDVF9FUShmaWVsZC5BZGQoKSwgb3JpZ2luYWwpOyAgLy8gU2hvdWxkIHJldHVybiBzYW1lIHN0cmluZyBmb3IgcmV1c2UuCisKKyAgRVhQRUNUX0VRKGZpZWxkLlJlbGVhc2VMYXN0KCksIG9yaWdpbmFsKTsgIC8vIFdlIHRha2Ugb3duZXJzaGlwLgorICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOworCisgIEVYUEVDVF9ORShmaWVsZC5BZGQoKSwgb3JpZ2luYWwpOyAgLy8gU2hvdWxkIE5PVCByZXR1cm4gdGhlIHNhbWUgc3RyaW5nLgorICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOworCisgIGZpZWxkLkFkZEFsbG9jYXRlZChvcmlnaW5hbCk7ICAvLyBHaXZlIG93bmVyc2hpcCBiYWNrLgorICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOworICBFWFBFQ1RfRVEoZmllbGQuTXV0YWJsZSgxKSwgb3JpZ2luYWwpOworCisgIGZpZWxkLkNsZWFyKCk7CisgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMik7CisgIEVYUEVDVF9FUShmaWVsZC5SZWxlYXNlQ2xlYXJlZCgpLCBvcmlnaW5hbCk7ICAvLyBUYWtlIG93bmVyc2hpcCBhZ2Fpbi4KKyAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAxKTsKKyAgRVhQRUNUX05FKGZpZWxkLkFkZCgpLCBvcmlnaW5hbCk7CisgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMCk7CisgIEVYUEVDVF9ORShmaWVsZC5BZGQoKSwgb3JpZ2luYWwpOworICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOworCisgIGZpZWxkLkFkZENsZWFyZWQob3JpZ2luYWwpOyAgLy8gR2l2ZSBvd25lcnNoaXAgYmFjaywgYnV0IGFzIGEgY2xlYXJlZCBvYmplY3QuCisgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMSk7CisgIEVYUEVDVF9FUShmaWVsZC5BZGQoKSwgb3JpZ2luYWwpOworICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOworfQorCisvLyBUZXN0IGFsbCBjb2RlIHBhdGhzIGluIEFkZEFsbG9jYXRlZCgpLgorVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBBZGRBbG9jYXRlZCkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7CisgIHdoaWxlIChmaWVsZC5zaXplKCkgPCBmaWVsZC5DYXBhY2l0eSgpKSB7CisgICAgZmllbGQuQWRkKCktPmFzc2lnbigiZmlsbGVyIik7CisgIH0KKworICBpbnQgaW5kZXggPSBmaWVsZC5zaXplKCk7CisKKyAgLy8gRmlyc3QgYnJhbmNoOiAgRmllbGQgaXMgYXQgY2FwYWNpdHkgd2l0aCBubyBjbGVhcmVkIG9iamVjdHMuCisgIHN0cmluZyogZm9vID0gbmV3IHN0cmluZygiZm9vIik7CisgIGZpZWxkLkFkZEFsbG9jYXRlZChmb28pOworICBFWFBFQ1RfRVEoaW5kZXggKyAxLCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgZmllbGQuQ2xlYXJlZENvdW50KCkpOworICBFWFBFQ1RfRVEoZm9vLCAmZmllbGQuR2V0KGluZGV4KSk7CisKKyAgLy8gTGFzdCBicmFuY2g6ICBGaWVsZCBpcyBub3QgYXQgY2FwYWNpdHkgYW5kIHRoZXJlIGFyZSBubyBjbGVhcmVkIG9iamVjdHMuCisgIHN0cmluZyogYmFyID0gbmV3IHN0cmluZygiYmFyIik7CisgIGZpZWxkLkFkZEFsbG9jYXRlZChiYXIpOworICArK2luZGV4OworICBFWFBFQ1RfRVEoaW5kZXggKyAxLCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgZmllbGQuQ2xlYXJlZENvdW50KCkpOworICBFWFBFQ1RfRVEoYmFyLCAmZmllbGQuR2V0KGluZGV4KSk7CisKKyAgLy8gVGhpcmQgYnJhbmNoOiAgRmllbGQgaXMgbm90IGF0IGNhcGFjaXR5IGFuZCB0aGVyZSBhcmUgbm8gY2xlYXJlZCBvYmplY3RzLgorICBmaWVsZC5SZW1vdmVMYXN0KCk7CisgIHN0cmluZyogYmF6ID0gbmV3IHN0cmluZygiYmF6Iik7CisgIGZpZWxkLkFkZEFsbG9jYXRlZChiYXopOworICBFWFBFQ1RfRVEoaW5kZXggKyAxLCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgZmllbGQuQ2xlYXJlZENvdW50KCkpOworICBFWFBFQ1RfRVEoYmF6LCAmZmllbGQuR2V0KGluZGV4KSk7CisKKyAgLy8gU2Vjb25kIGJyYW5jaDogIEZpZWxkIGlzIGF0IGNhcGFjaXR5IGJ1dCBoYXMgc29tZSBjbGVhcmVkIG9iamVjdHMuCisgIHdoaWxlIChmaWVsZC5zaXplKCkgPCBmaWVsZC5DYXBhY2l0eSgpKSB7CisgICAgZmllbGQuQWRkKCktPmFzc2lnbigiZmlsbGVyMiIpOworICB9CisgIGZpZWxkLlJlbW92ZUxhc3QoKTsKKyAgaW5kZXggPSBmaWVsZC5zaXplKCk7CisgIHN0cmluZyogcXV4ID0gbmV3IHN0cmluZygicXV4Iik7CisgIGZpZWxkLkFkZEFsbG9jYXRlZChxdXgpOworICBFWFBFQ1RfRVEoaW5kZXggKyAxLCBmaWVsZC5zaXplKCkpOworICAvLyBXZSBzaG91bGQgaGF2ZSBkaXNjYXJkZWQgdGhlIGNsZWFyZWQgb2JqZWN0LgorICBFWFBFQ1RfRVEoMCwgZmllbGQuQ2xlYXJlZENvdW50KCkpOworICBFWFBFQ1RfRVEocXV4LCAmZmllbGQuR2V0KGluZGV4KSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgTWVyZ2VGcm9tKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBzb3VyY2UsIGRlc3RpbmF0aW9uOworCisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI0Iik7CisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI1Iik7CisKKyAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMSIpOworICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIyIik7CisgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjMiKTsKKworICBkZXN0aW5hdGlvbi5NZXJnZUZyb20oc291cmNlKTsKKworICBBU1NFUlRfRVEoNSwgZGVzdGluYXRpb24uc2l6ZSgpKTsKKworICBFWFBFQ1RfRVEoIjEiLCBkZXN0aW5hdGlvbi5HZXQoMCkpOworICBFWFBFQ1RfRVEoIjIiLCBkZXN0aW5hdGlvbi5HZXQoMSkpOworICBFWFBFQ1RfRVEoIjMiLCBkZXN0aW5hdGlvbi5HZXQoMikpOworICBFWFBFQ1RfRVEoIjQiLCBkZXN0aW5hdGlvbi5HZXQoMykpOworICBFWFBFQ1RfRVEoIjUiLCBkZXN0aW5hdGlvbi5HZXQoNCkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIENvcHlGcm9tKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBzb3VyY2UsIGRlc3RpbmF0aW9uOworCisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI0Iik7CisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI1Iik7CisKKyAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMSIpOworICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIyIik7CisgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjMiKTsKKworICBkZXN0aW5hdGlvbi5Db3B5RnJvbShzb3VyY2UpOworCisgIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOworCisgIEVYUEVDVF9FUSgiNCIsIGRlc3RpbmF0aW9uLkdldCgwKSk7CisgIEVYUEVDVF9FUSgiNSIsIGRlc3RpbmF0aW9uLkdldCgxKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgQ29weUNvbnN0cnVjdCkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gc291cmNlOworCisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCIxIik7CisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCIyIik7CisKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGRlc3RpbmF0aW9uKHNvdXJjZSk7CisKKyAgQVNTRVJUX0VRKDIsIGRlc3RpbmF0aW9uLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiMSIsIGRlc3RpbmF0aW9uLkdldCgwKSk7CisgIEVYUEVDVF9FUSgiMiIsIGRlc3RpbmF0aW9uLkdldCgxKSk7Cit9CisKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgQ29weUFzc2lnbikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gc291cmNlLCBkZXN0aW5hdGlvbjsKKworICBzb3VyY2UuQWRkKCktPmFzc2lnbigiNCIpOworICBzb3VyY2UuQWRkKCktPmFzc2lnbigiNSIpOworCisgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjEiKTsKKyAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMiIpOworICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIzIik7CisKKyAgZGVzdGluYXRpb24gPSBzb3VyY2U7CisKKyAgQVNTRVJUX0VRKDIsIGRlc3RpbmF0aW9uLnNpemUoKSk7CisKKyAgRVhQRUNUX0VRKCI0IiwgZGVzdGluYXRpb24uR2V0KDApKTsKKyAgRVhQRUNUX0VRKCI1IiwgZGVzdGluYXRpb24uR2V0KDEpKTsKK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBNdXRhYmxlRGF0YUlzTXV0YWJsZSkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7CisgICpmaWVsZC5BZGQoKSA9ICIxIjsKKyAgRVhQRUNUX0VRKCIxIiwgZmllbGQuR2V0KDApKTsKKyAgLy8gVGhlIGZhY3QgdGhhdCB0aGlzIGxpbmUgY29tcGlsZXMgd291bGQgYmUgZW5vdWdoLCBidXQgd2UnbGwgY2hlY2sgdGhlCisgIC8vIHZhbHVlIGFueXdheS4KKyAgc3RyaW5nKiogZGF0YSA9IGZpZWxkLm11dGFibGVfZGF0YSgpOworICAqKmRhdGEgPSAiMiI7CisgIEVYUEVDVF9FUSgiMiIsIGZpZWxkLkdldCgwKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gSXRlcmF0b3IgdGVzdHMgc3RvbGVuIGZyb20gbmV0L3Byb3RvL3Byb3RvLWFycmF5X3VuaXR0ZXN0LgorY2xhc3MgUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgcHJvdG9fYXJyYXlfLkFkZChpKTsKKyAgICB9CisgIH0KKworICBSZXBlYXRlZEZpZWxkPGludD4gcHJvdG9fYXJyYXlfOworfTsKKworVEVTVF9GKFJlcGVhdGVkRmllbGRJdGVyYXRvclRlc3QsIENvbnZlcnRpYmxlKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50Pjo6aXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5iZWdpbigpOworICBSZXBlYXRlZEZpZWxkPGludD46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlciA9IGl0ZXI7CisgIFJlcGVhdGVkRmllbGQ8aW50Pjo6dmFsdWVfdHlwZSB2YWx1ZSA9ICpjX2l0ZXI7CisgIEVYUEVDVF9FUSgwLCB2YWx1ZSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhYmxlSXRlcmF0aW9uKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50Pjo6aXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5iZWdpbigpOworICBFWFBFQ1RfRVEoMCwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9FUSgxLCAqaXRlcisrKTsKKyAgRVhQRUNUX0VRKDIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfVFJVRShwcm90b19hcnJheV8uZW5kKCkgPT0gaXRlcik7CisKKyAgRVhQRUNUX0VRKDIsICoocHJvdG9fYXJyYXlfLmVuZCgpIC0gMSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yVGVzdCwgQ29uc3RJdGVyYXRpb24pIHsKKyAgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ+JiBjb25zdF9wcm90b19hcnJheSA9IHByb3RvX2FycmF5XzsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gY29uc3RfcHJvdG9fYXJyYXkuYmVnaW4oKTsKKyAgRVhQRUNUX0VRKDAsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfRVEoMSwgKml0ZXIrKyk7CisgIEVYUEVDVF9FUSgyLCAqaXRlcik7CisgICsraXRlcjsKKyAgRVhQRUNUX1RSVUUocHJvdG9fYXJyYXlfLmVuZCgpID09IGl0ZXIpOworICBFWFBFQ1RfRVEoMiwgKihwcm90b19hcnJheV8uZW5kKCkgLSAxKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhdGlvbikgeworICBSZXBlYXRlZEZpZWxkPGludD46Oml0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8uYmVnaW4oKTsKKyAgKml0ZXIgPSA3OworICBFWFBFQ1RfRVEoNywgcHJvdG9fYXJyYXlfLkdldCgwKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiZm9vIik7CisgICAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImJhciIpOworICAgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJiYXoiKTsKKyAgfQorCisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBwcm90b19hcnJheV87Cit9OworCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgQ29udmVydGlibGUpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyID0gaXRlcjsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojp2YWx1ZV90eXBlIHZhbHVlID0gKmNfaXRlcjsKKyAgRVhQRUNUX0VRKCJmb28iLCB2YWx1ZSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhYmxlSXRlcmF0aW9uKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5iZWdpbigpOworICBFWFBFQ1RfRVEoImZvbyIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfRVEoImJhciIsICooaXRlcisrKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9UUlVFKHByb3RvX2FycmF5Xy5lbmQoKSA9PSBpdGVyKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqKC0tcHJvdG9fYXJyYXlfLmVuZCgpKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBDb25zdEl0ZXJhdGlvbikgeworICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4mIGNvbnN0X3Byb3RvX2FycmF5ID0gcHJvdG9fYXJyYXlfOworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBjb25zdF9wcm90b19hcnJheS5iZWdpbigpOworICBFWFBFQ1RfRVEoImZvbyIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfRVEoImJhciIsICooaXRlcisrKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9UUlVFKGNvbnN0X3Byb3RvX2FycmF5LmVuZCgpID09IGl0ZXIpOworICBFWFBFQ1RfRVEoImJheiIsICooLS1jb25zdF9wcm90b19hcnJheS5lbmQoKSkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgUmFuZG9tQWNjZXNzKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5iZWdpbigpOworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIyID0gaXRlcjsKKyAgKytpdGVyMjsKKyAgKytpdGVyMjsKKyAgRVhQRUNUX1RSVUUoaXRlciArIDIgPT0gaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyID09IGl0ZXIyIC0gMik7CisgIEVYUEVDVF9FUSgiYmF6IiwgaXRlclsyXSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKihpdGVyICsgMikpOworICBFWFBFQ1RfRVEoMywgcHJvdG9fYXJyYXlfLmVuZCgpIC0gcHJvdG9fYXJyYXlfLmJlZ2luKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgQ29tcGFyYWJsZSkgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8uYmVnaW4oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyMiA9IGl0ZXIgKyAxOworICBFWFBFQ1RfVFJVRShpdGVyID09IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8PSBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPD0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIyID4gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIyID49IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyID49IGl0ZXIpOworfQorCisvLyBVbmluaXRpYWxpemVkIGl0ZXJhdG9yIGRvZXMgbm90IHBvaW50IHRvIGFueSBvZiB0aGUgUmVwZWF0ZWRQdHJGaWVsZC4KK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBVbmluaXRpYWxpemVkSXRlcmF0b3IpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjppdGVyYXRvciBpdGVyOworICBFWFBFQ1RfVFJVRShpdGVyICE9IHByb3RvX2FycmF5Xy5iZWdpbigpKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8uYmVnaW4oKSArIDEpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IHByb3RvX2FycmF5Xy5iZWdpbigpICsgMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLmJlZ2luKCkgKyAzKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8uZW5kKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgU1RMQWxnb3JpdGhtc19sb3dlcl9ib3VuZCkgeworICBwcm90b19hcnJheV8uQ2xlYXIoKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImEiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImMiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImQiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oIm4iKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oInAiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oIngiKTsKKyAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oInkiKTsKKworICBzdHJpbmcgdiA9ICJmIjsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICBsb3dlcl9ib3VuZChwcm90b19hcnJheV8uYmVnaW4oKSwgcHJvdG9fYXJyYXlfLmVuZCgpLCB2KTsKKworICBFWFBFQ1RfRVEoKml0LCAibiIpOworICBFWFBFQ1RfVFJVRShpdCA9PSBwcm90b19hcnJheV8uYmVnaW4oKSArIDMpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgTXV0YXRpb24pIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7CisgICppdGVyID0gInF1eCI7CisgIEVYUEVDVF9FUSgicXV4IiwgcHJvdG9fYXJyYXlfLkdldCgwKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImZvbyIpOworICAgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJiYXIiKTsKKyAgICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYmF6Iik7CisgIH0KKworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gcHJvdG9fYXJyYXlfOworfTsKKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBDb252ZXJ0aWJsZVB0cikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXRlciA9CisgICAgICBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIE11dGFibGVQdHJJdGVyYXRpb24pIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKTsKKyAgRVhQRUNUX0VRKCJmb28iLCAqKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9FUSgiYmFyIiwgKiooaXRlcisrKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKippdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfVFJVRShwcm90b19hcnJheV8ucG9pbnRlcl9lbmQoKSA9PSBpdGVyKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqKigtLXByb3RvX2FycmF5Xy5wb2ludGVyX2VuZCgpKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgUmFuZG9tUHRyQWNjZXNzKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyID0KKyAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCk7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyMiA9IGl0ZXI7CisgICsraXRlcjI7CisgICsraXRlcjI7CisgIEVYUEVDVF9UUlVFKGl0ZXIgKyAyID09IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBpdGVyMiAtIDIpOworICBFWFBFQ1RfRVEoImJheiIsICppdGVyWzJdKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqKihpdGVyICsgMikpOworICBFWFBFQ1RfRVEoMywgcHJvdG9fYXJyYXlfLmVuZCgpIC0gcHJvdG9fYXJyYXlfLmJlZ2luKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIENvbXBhcmFibGVQdHIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIyID0gaXRlciArIDE7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyIDwgaXRlcjIpOworICBFWFBFQ1RfVFJVRShpdGVyIDw9IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8PSBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlcjIgPiBpdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlcjIgPj0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPj0gaXRlcik7Cit9CisKKy8vIFVuaW5pdGlhbGl6ZWQgaXRlcmF0b3IgZG9lcyBub3QgcG9pbnQgdG8gYW55IG9mIHRoZSBSZXBlYXRlZFB0ck92ZXJQdHJzLgorLy8gRGVyZWZlcmVuY2luZyBhbiB1bmluaXRpYWxpemVkIGl0ZXJhdG9yIGNyYXNoZXMgdGhlIHByb2Nlc3MuCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIFVuaW5pdGlhbGl6ZWRQdHJJdGVyYXRvcikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXRlcjsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpICsgMSk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSArIDIpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCkgKyAzKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8ucG9pbnRlcl9lbmQoKSk7Cit9CisKKworLy8gVGhpcyBjb21wYXJpc29uIGZ1bmN0b3IgaXMgcmVxdWlyZWQgYnkgdGhlIHRlc3RzIGZvciBSZXBlYXRlZFB0ck92ZXJQdHJzLgorLy8gVGhleSBvcGVyYXRlIG9uIHN0cmluZ3MgYW5kIG5lZWQgdG8gY29tcGFyZSBzdHJpbmdzIGFzIHN0cmluZ3MgaW4KKy8vIGFueSBzdGwgYWxnb3JpdGhtLCBldmVuIHRob3VnaCB0aGUgaXRlcmF0b3IgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcKKy8vIC0gaS5lLiAqaXRlciBoYXMgdHlwZSBzdHJpbmcqLgorc3RydWN0IFN0cmluZ0xlc3NUaGFuIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0cmluZyogeiwgY29uc3Qgc3RyaW5nJiB5KSB7CisgICAgcmV0dXJuICp6IDwgeTsKKyAgfQorICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nKiB6LCBjb25zdCBzdHJpbmcqIHkpIHsKKyAgICByZXR1cm4gKnogPCAqeTsKKyAgfQorfTsKKworVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBQdHJTVExBbGdvcml0aG1zX2xvd2VyX2JvdW5kKSB7CisgIHByb3RvX2FycmF5Xy5DbGVhcigpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYSIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYyIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiZCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigibiIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigicCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieSIpOworCisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyID0KKyAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCk7CisgIHN0cmluZyB2ID0gImYiOworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXQgPQorICAgICAgbG93ZXJfYm91bmQocHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSwgcHJvdG9fYXJyYXlfLnBvaW50ZXJfZW5kKCksCisgICAgICAgICAgICAgICAgICAmdiwgU3RyaW5nTGVzc1RoYW4oKSk7CisKKyAgR09PR0xFX0NIRUNLKCppdCAhPSBOVUxMKTsKKworICBFWFBFQ1RfRVEoKippdCwgIm4iKTsKKyAgRVhQRUNUX1RSVUUoaXQgPT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSArIDMpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIFB0ck11dGF0aW9uKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyID0KKyAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCk7CisgICoqaXRlciA9ICJxdXgiOworICBFWFBFQ1RfRVEoInF1eCIsIHByb3RvX2FycmF5Xy5HZXQoMCkpOworCisgIEVYUEVDVF9FUSgiYmFyIiwgcHJvdG9fYXJyYXlfLkdldCgxKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgcHJvdG9fYXJyYXlfLkdldCgyKSk7CisgICsraXRlcjsKKyAgZGVsZXRlICppdGVyOworICAqaXRlciA9IG5ldyBzdHJpbmcoImEiKTsKKyAgKytpdGVyOworICBkZWxldGUgKml0ZXI7CisgICppdGVyID0gbmV3IHN0cmluZygiYiIpOworICBFWFBFQ1RfRVEoImEiLCBwcm90b19hcnJheV8uR2V0KDEpKTsKKyAgRVhQRUNUX0VRKCJiIiwgcHJvdG9fYXJyYXlfLkdldCgyKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgU29ydCkgeworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYyIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiZCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigibiIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigicCIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYSIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieSIpOworICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieCIpOworICBFWFBFQ1RfRVEoImZvbyIsIHByb3RvX2FycmF5Xy5HZXQoMCkpOworICBFWFBFQ1RfRVEoIm4iLCBwcm90b19hcnJheV8uR2V0KDUpKTsKKyAgRVhQRUNUX0VRKCJ4IiwgcHJvdG9fYXJyYXlfLkdldCg5KSk7CisgIHNvcnQocHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSwKKyAgICAgICBwcm90b19hcnJheV8ucG9pbnRlcl9lbmQoKSwKKyAgICAgICBTdHJpbmdMZXNzVGhhbigpKTsKKyAgRVhQRUNUX0VRKCJhIiwgcHJvdG9fYXJyYXlfLkdldCgwKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgcHJvdG9fYXJyYXlfLkdldCgyKSk7CisgIEVYUEVDVF9FUSgieSIsIHByb3RvX2FycmF5Xy5HZXQoOSkpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbml0LXRlc3RzIGZvciB0aGUgaW5zZXJ0IGl0ZXJhdG9ycworLy8gZ29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlciwKKy8vIGdvb2dsZTo6cHJvdG9idWY6OkFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIKKy8vIFBvcnRlZCBmcm9tIHV0aWwvZ3RsL3Byb3RvLWFycmF5LWl0ZXJhdG9yc191bml0dGVzdC4KKworY2xhc3MgUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBzdGQ6Omxpc3Q8ZG91YmxlPiBoYWx2ZXM7CisgIHN0ZDo6bGlzdDxpbnQ+IGZpYm9uYWNjaTsKKyAgc3RkOjp2ZWN0b3I8c3RyaW5nPiB3b3JkczsKKyAgdHlwZWRlZiBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UgTmVzdGVkOworICBOZXN0ZWQgbmVzdGVkc1syXTsKKyAgc3RkOjp2ZWN0b3I8TmVzdGVkKj4gbmVzdGVkX3B0cnM7CisgIFRlc3RBbGxUeXBlcyBwcm90b2J1ZmZlcjsKKworICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgZmlib25hY2NpLnB1c2hfYmFjaygxKTsKKyAgICBmaWJvbmFjY2kucHVzaF9iYWNrKDEpOworICAgIGZpYm9uYWNjaS5wdXNoX2JhY2soMik7CisgICAgZmlib25hY2NpLnB1c2hfYmFjaygzKTsKKyAgICBmaWJvbmFjY2kucHVzaF9iYWNrKDUpOworICAgIGZpYm9uYWNjaS5wdXNoX2JhY2soOCk7CisgICAgc3RkOjpjb3B5KGZpYm9uYWNjaS5iZWdpbigpLCBmaWJvbmFjY2kuZW5kKCksCisgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIocHJvdG9idWZmZXIubXV0YWJsZV9yZXBlYXRlZF9pbnQzMigpKSk7CisKKyAgICBoYWx2ZXMucHVzaF9iYWNrKDEuMCk7CisgICAgaGFsdmVzLnB1c2hfYmFjaygwLjUpOworICAgIGhhbHZlcy5wdXNoX2JhY2soMC4yNSk7CisgICAgaGFsdmVzLnB1c2hfYmFjaygwLjEyNSk7CisgICAgaGFsdmVzLnB1c2hfYmFjaygwLjA2MjUpOworICAgIHN0ZDo6Y29weShoYWx2ZXMuYmVnaW4oKSwgaGFsdmVzLmVuZCgpLAorICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfZG91YmxlKCkpKTsKKworICAgIHdvcmRzLnB1c2hfYmFjaygiQWJsZSIpOworICAgIHdvcmRzLnB1c2hfYmFjaygid2FzIik7CisgICAgd29yZHMucHVzaF9iYWNrKCJJIik7CisgICAgd29yZHMucHVzaF9iYWNrKCJlcmUiKTsKKyAgICB3b3Jkcy5wdXNoX2JhY2soIkkiKTsKKyAgICB3b3Jkcy5wdXNoX2JhY2soInNhdyIpOworICAgIHdvcmRzLnB1c2hfYmFjaygiRWxiYSIpOworICAgIHN0ZDo6Y29weSh3b3Jkcy5iZWdpbigpLCB3b3Jkcy5lbmQoKSwKKyAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlcihwcm90b2J1ZmZlci5tdXRhYmxlX3JlcGVhdGVkX3N0cmluZygpKSk7CisKKyAgICBuZXN0ZWRzWzBdLnNldF9iYigxNyk7CisgICAgbmVzdGVkc1sxXS5zZXRfYmIoNDcxMSk7CisgICAgc3RkOjpjb3B5KCZuZXN0ZWRzWzBdLCAmbmVzdGVkc1syXSwKKyAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgICAgICAgICAgICAgIHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKSkpOworCisgICAgbmVzdGVkX3B0cnMucHVzaF9iYWNrKG5ldyBOZXN0ZWQpOworICAgIG5lc3RlZF9wdHJzLmJhY2soKS0+c2V0X2JiKDE3MCk7CisgICAgbmVzdGVkX3B0cnMucHVzaF9iYWNrKG5ldyBOZXN0ZWQpOworICAgIG5lc3RlZF9wdHJzLmJhY2soKS0+c2V0X2JiKDQ3MTEwKTsKKyAgICBzdGQ6OmNvcHkobmVzdGVkX3B0cnMuYmVnaW4oKSwgbmVzdGVkX3B0cnMuZW5kKCksCisgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIoCisgICAgICAgICAgICAgICAgICBwcm90b2J1ZmZlci5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCkpKTsKKworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIFNUTERlbGV0ZUNvbnRhaW5lclBvaW50ZXJzKG5lc3RlZF9wdHJzLmJlZ2luKCksIG5lc3RlZF9wdHJzLmVuZCgpKTsKKyAgfQorfTsKKworVEVTVF9GKFJlcGVhdGVkRmllbGRJbnNlcnRpb25JdGVyYXRvcnNUZXN0LCBGaWJvbmFjY2kpIHsKKyAgRVhQRUNUX1RSVUUoc3RkOjplcXVhbChmaWJvbmFjY2kuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWJvbmFjY2kuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZmZXIucmVwZWF0ZWRfaW50MzIoKS5iZWdpbigpKSk7CisgIEVYUEVDVF9UUlVFKHN0ZDo6ZXF1YWwocHJvdG9idWZmZXIucmVwZWF0ZWRfaW50MzIoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvYnVmZmVyLnJlcGVhdGVkX2ludDMyKCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlib25hY2NpLmJlZ2luKCkpKTsKK30KKworVEVTVF9GKFJlcGVhdGVkRmllbGRJbnNlcnRpb25JdGVyYXRvcnNUZXN0LCBIYWx2ZXMpIHsKKyAgRVhQRUNUX1RSVUUoc3RkOjplcXVhbChoYWx2ZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoYWx2ZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZmZXIucmVwZWF0ZWRfZG91YmxlKCkuYmVnaW4oKSkpOworICBFWFBFQ1RfVFJVRShzdGQ6OmVxdWFsKHByb3RvYnVmZmVyLnJlcGVhdGVkX2RvdWJsZSgpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZmZXIucmVwZWF0ZWRfZG91YmxlKCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFsdmVzLmJlZ2luKCkpKTsKK30KKworVEVTVF9GKFJlcGVhdGVkRmllbGRJbnNlcnRpb25JdGVyYXRvcnNUZXN0LCBXb3JkcykgeworICBBU1NFUlRfRVEod29yZHMuc2l6ZSgpLCBwcm90b2J1ZmZlci5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHdvcmRzLmF0KDApLCBwcm90b2J1ZmZlci5yZXBlYXRlZF9zdHJpbmcoMCkpOworICBFWFBFQ1RfRVEod29yZHMuYXQoMSksIHByb3RvYnVmZmVyLnJlcGVhdGVkX3N0cmluZygxKSk7CisgIEVYUEVDVF9FUSh3b3Jkcy5hdCgyKSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nKDIpKTsKKyAgRVhQRUNUX0VRKHdvcmRzLmF0KDMpLCBwcm90b2J1ZmZlci5yZXBlYXRlZF9zdHJpbmcoMykpOworICBFWFBFQ1RfRVEod29yZHMuYXQoNCksIHByb3RvYnVmZmVyLnJlcGVhdGVkX3N0cmluZyg0KSk7CisgIEVYUEVDVF9FUSh3b3Jkcy5hdCg1KSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nKDUpKTsKKyAgRVhQRUNUX0VRKHdvcmRzLmF0KDYpLCBwcm90b2J1ZmZlci5yZXBlYXRlZF9zdHJpbmcoNikpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIE5lc3RlZHMpIHsKKyAgQVNTRVJUX0VRKHByb3RvYnVmZmVyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSwgNCk7CisgIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKS5iYigpLCAxNyk7CisgIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgxKS5iYigpLCA0NzExKTsKKyAgRVhQRUNUX0VRKHByb3RvYnVmZmVyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDIpLmJiKCksIDE3MCk7CisgIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgzKS5iYigpLCA0NzExMCk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwKKyAgICAgICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkV2l0aFN0cmluZ0ludERhdGEpIHsKKyAgdmVjdG9yPE5lc3RlZCo+IGRhdGE7CisgIFRlc3RBbGxUeXBlcyBnb2xkZW5wcm90bzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgTmVzdGVkKiBuZXdfZGF0YSA9IG5ldyBOZXN0ZWQ7CisgICAgbmV3X2RhdGEtPnNldF9iYihpKTsKKyAgICBkYXRhLnB1c2hfYmFjayhuZXdfZGF0YSk7CisKKyAgICBuZXdfZGF0YSA9IGdvbGRlbnByb3RvLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpOworICAgIG5ld19kYXRhLT5zZXRfYmIoaSk7CisgIH0KKyAgVGVzdEFsbFR5cGVzIHRlc3Rwcm90bzsKKyAgY29weShkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCksCisgICAgICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgICAgICAgdGVzdHByb3RvLm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKSkpOworICBFWFBFQ1RfRVEodGVzdHByb3RvLkRlYnVnU3RyaW5nKCksIGdvbGRlbnByb3RvLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsCisgICAgICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZFdpdGhTdHJpbmcpIHsKKyAgdmVjdG9yPHN0cmluZyo+IGRhdGE7CisgIFRlc3RBbGxUeXBlcyBnb2xkZW5wcm90bzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgc3RyaW5nKiBuZXdfZGF0YSA9IG5ldyBzdHJpbmc7CisgICAgKm5ld19kYXRhID0gIm5hbWUtIiArIFNpbXBsZUl0b2EoaSk7CisgICAgZGF0YS5wdXNoX2JhY2sobmV3X2RhdGEpOworCisgICAgbmV3X2RhdGEgPSBnb2xkZW5wcm90by5hZGRfcmVwZWF0ZWRfc3RyaW5nKCk7CisgICAgKm5ld19kYXRhID0gIm5hbWUtIiArIFNpbXBsZUl0b2EoaSk7CisgIH0KKyAgVGVzdEFsbFR5cGVzIHRlc3Rwcm90bzsKKyAgY29weShkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCksCisgICAgICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgICAgICAgdGVzdHByb3RvLm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCkpKTsKKyAgRVhQRUNUX0VRKHRlc3Rwcm90by5EZWJ1Z1N0cmluZygpLCBnb2xkZW5wcm90by5EZWJ1Z1N0cmluZygpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmOTY4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MKQEAgLTAsMCArMSw0NiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc2VydmljZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK1NlcnZpY2U6On5TZXJ2aWNlKCkge30KK1JwY0NoYW5uZWw6On5ScGNDaGFubmVsKCkge30KK1JwY0NvbnRyb2xsZXI6On5ScGNDb250cm9sbGVyKCkge30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmE3ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5oCkBAIC0wLDAgKzEsMjkxIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBERVBSRUNBVEVEOiAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGFic3RyYWN0IGludGVyZmFjZXMgdW5kZXJseWluZyBwcm90bzIKKy8vIFJQQyBzZXJ2aWNlcy4gIFRoZXNlIGFyZSBpbnRlbnRlZCB0byBiZSBpbmRlcGVuZGVudCBvZiBhbnkgcGFydGljdWxhciBSUEMKKy8vIGltcGxlbWVudGF0aW9uLCBzbyB0aGF0IHByb3RvMiBzZXJ2aWNlcyBjYW4gYmUgdXNlZCBvbiB0b3Agb2YgYSB2YXJpZXR5CisvLyBvZiBpbXBsZW1lbnRhdGlvbnMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMi4zLjAsIFJQQyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkCisvLyBub3QgdHJ5IHRvIGJ1aWxkIG9uIHRoZXNlLCBidXQgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBjb2RlIGdlbmVyYXRvciBwbHVnaW5zCisvLyB3aGljaCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIFJQQyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgd2F5CisvLyB0aGUgZ2VuZXJhdGVkIGNvZGUgY2FuIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UKKy8vIGFuZCBjYW4gYXZvaWQgdW5uZWNlc3NhcnkgbGF5ZXJzIG9mIGluZGlyZWN0aW9uLgorLy8KKy8vCisvLyBXaGVuIHlvdSB1c2UgdGhlIHByb3RvY29sIGNvbXBpbGVyIHRvIGNvbXBpbGUgYSBzZXJ2aWNlIGRlZmluaXRpb24sIGl0CisvLyBnZW5lcmF0ZXMgdHdvIGNsYXNzZXM6ICBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHRoZSBzZXJ2aWNlICh3aXRoCisvLyBtZXRob2RzIG1hdGNoaW5nIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24pIGFuZCBhICJzdHViIiBpbXBsZW1lbnRhdGlvbi4KKy8vIEEgc3R1YiBpcyBqdXN0IGEgdHlwZS1zYWZlIHdyYXBwZXIgYXJvdW5kIGFuIFJwY0NoYW5uZWwgd2hpY2ggZW11bGF0ZXMgYQorLy8gbG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCisvLworLy8gRm9yIGV4YW1wbGUsIHRoZSBzZXJ2aWNlIGRlZmluaXRpb246CisvLyAgIHNlcnZpY2UgTXlTZXJ2aWNlIHsKKy8vICAgICBycGMgRm9vKE15UmVxdWVzdCkgcmV0dXJucyhNeVJlc3BvbnNlKTsKKy8vICAgfQorLy8gd2lsbCBnZW5lcmF0ZSBhYnN0cmFjdCBpbnRlcmZhY2UgIk15U2VydmljZSIgYW5kIGNsYXNzICJNeVNlcnZpY2U6OlN0dWIiLgorLy8gWW91IGNvdWxkIGltcGxlbWVudCBhIE15U2VydmljZSBhcyBmb2xsb3dzOgorLy8gICBjbGFzcyBNeVNlcnZpY2VJbXBsIDogcHVibGljIE15U2VydmljZSB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgTXlTZXJ2aWNlSW1wbCgpIHt9CisvLyAgICAgfk15U2VydmljZUltcGwoKSB7fQorLy8KKy8vICAgICAvLyBpbXBsZW1lbnRzIE15U2VydmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgICAgdm9pZCBGb28oZ29vZ2xlOjpwcm90b2J1Zjo6UnBjQ29udHJvbGxlciogY29udHJvbGxlciwKKy8vICAgICAgICAgICAgICBjb25zdCBNeVJlcXVlc3QqIHJlcXVlc3QsCisvLyAgICAgICAgICAgICAgTXlSZXNwb25zZSogcmVzcG9uc2UsCisvLyAgICAgICAgICAgICAgQ2xvc3VyZSogZG9uZSkgeworLy8gICAgICAgLy8gLi4uIHJlYWQgcmVxdWVzdCBhbmQgZmlsbCBpbiByZXNwb25zZSAuLi4KKy8vICAgICAgIGRvbmUtPlJ1bigpOworLy8gICAgIH0KKy8vICAgfTsKKy8vIFlvdSB3b3VsZCB0aGVuIHJlZ2lzdGVyIGFuIGluc3RhbmNlIG9mIE15U2VydmljZUltcGwgd2l0aCB5b3VyIFJQQyBzZXJ2ZXIKKy8vIGltcGxlbWVudGF0aW9uLiAgKEhvdyB0byBkbyB0aGF0IGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uLikKKy8vCisvLyBUbyBjYWxsIGEgcmVtb3RlIE15U2VydmljZUltcGwsIGZpcnN0IHlvdSBuZWVkIGFuIFJwY0NoYW5uZWwgY29ubmVjdGVkIHRvIGl0LgorLy8gSG93IHRvIGNvbnN0cnVjdCBhIGNoYW5uZWwgZGVwZW5kcywgYWdhaW4sIG9uIHlvdXIgUlBDIGltcGxlbWVudGF0aW9uLgorLy8gSGVyZSB3ZSB1c2UgYSBoeXBvdGhlbnRpY2FsICJNeVJwY0NoYW5uZWwiIGFzIGFuIGV4YW1wbGU6CisvLyAgIE15UnBjQ2hhbm5lbCBjaGFubmVsKCJycGM6aG9zdG5hbWU6MTIzNC9teXNlcnZpY2UiKTsKKy8vICAgTXlScGNDb250cm9sbGVyIGNvbnRyb2xsZXI7CisvLyAgIE15U2VydmljZUltcGw6OlN0dWIgc3R1YigmY2hhbm5lbCk7CisvLyAgIEZvb1JlcXVlc3QgcmVxdWVzdDsKKy8vICAgRm9vUmVzcG5vc2UgcmVzcG9uc2U7CisvLworLy8gICAvLyAuLi4gZmlsbCBpbiByZXF1ZXN0IC4uLgorLy8KKy8vICAgc3R1Yi5Gb28oJmNvbnRyb2xsZXIsIHJlcXVlc3QsICZyZXNwb25zZSwgTmV3Q2FsbGJhY2soSGFuZGxlUmVzcG9uc2UpKTsKKy8vCisvLyBPbiBUaHJlYWQtU2FmZXR5OgorLy8KKy8vIERpZmZlcmVudCBSUEMgaW1wbGVtZW50YXRpb25zIG1heSBtYWtlIGRpZmZlcmVudCBndWFyYW50ZWVzIGFib3V0IHdoYXQKKy8vIHRocmVhZHMgdGhleSBtYXkgcnVuIGNhbGxiYWNrcyBvbiwgYW5kIHdoYXQgdGhyZWFkcyB0aGUgYXBwbGljYXRpb24gaXMKKy8vIGFsbG93ZWQgdG8gdXNlIHRvIGNhbGwgdGhlIFJQQyBzeXN0ZW0uICBQb3J0YWJsZSBzb2Z0d2FyZSBzaG91bGQgYmUgcmVhZHkKKy8vIGZvciBjYWxsYmFja3MgdG8gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQsIGJ1dCBzaG91bGQgbm90IHRyeSB0byBjYWxsIHRoZQorLy8gUlBDIHN5c3RlbSBmcm9tIGFueSB0aHJlYWQgZXhjZXB0IGZvciB0aGUgb25lcyBvbiB3aGljaCBpdCByZWNlaXZlZCB0aGUKKy8vIGNhbGxiYWNrcy4gIFJlYWxpc3RpY2FsbHksIHRob3VnaCwgc2ltcGxlIHNvZnR3YXJlIHdpbGwgcHJvYmFibHkgd2FudCB0bworLy8gdXNlIGEgc2luZ2xlLXRocmVhZGVkIFJQQyBzeXN0ZW0gd2hpbGUgaGlnaC1lbmQgc29mdHdhcmUgd2lsbCB3YW50IHRvCisvLyB1c2UgbXVsdGlwbGUgdGhyZWFkcy4gIFJQQyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHByb3ZpZGUgbXVsdGlwbGUKKy8vIGNob2ljZXMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NFUlZJQ0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TRVJWSUNFX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KK2NsYXNzIFNlcnZpY2U7CitjbGFzcyBScGNDb250cm9sbGVyOworY2xhc3MgUnBjQ2hhbm5lbDsKKworLy8gRGVmaW5lZCBpbiBvdGhlciBmaWxlcy4KK2NsYXNzIERlc2NyaXB0b3I7ICAgICAgICAgICAgLy8gZGVzY3JpcHRvci5oCitjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsgICAgIC8vIGRlc2NyaXB0b3IuaAorY2xhc3MgTWV0aG9kRGVzY3JpcHRvcjsgICAgICAvLyBkZXNjcmlwdG9yLmgKK2NsYXNzIE1lc3NhZ2U7ICAgICAgICAgICAgICAgLy8gbWVzc2FnZS5oCisKKy8vIEFic3RyYWN0IGJhc2UgaW50ZXJmYWNlIGZvciBwcm90b2NvbC1idWZmZXItYmFzZWQgUlBDIHNlcnZpY2VzLiAgU2VydmljZXMKKy8vIHRoZW1zZWx2ZXMgYXJlIGFic3RyYWN0IGludGVyZmFjZXMgKGltcGxlbWVudGVkIGVpdGhlciBieSBzZXJ2ZXJzIG9yIGFzCisvLyBzdHVicyksIGJ1dCB0aGV5IHN1YmNsYXNzIHRoaXMgYmFzZSBpbnRlcmZhY2UuICBUaGUgbWV0aG9kcyBvZiB0aGlzCisvLyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgbWV0aG9kcyBvZiB0aGUgU2VydmljZSB3aXRob3V0IGtub3dpbmcKKy8vIGl0cyBleGFjdCB0eXBlIGF0IGNvbXBpbGUgdGltZSAoYW5hbG9nb3VzIHRvIFJlZmxlY3Rpb24pLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFNlcnZpY2UgeworIHB1YmxpYzoKKyAgaW5saW5lIFNlcnZpY2UoKSB7fQorICB2aXJ0dWFsIH5TZXJ2aWNlKCk7CisKKyAgLy8gV2hlbiBjb25zdHJ1Y3RpbmcgYSBzdHViLCB5b3UgbWF5IHBhc3MgU1RVQl9PV05TX0NIQU5ORUwgYXMgdGhlIHNlY29uZAorICAvLyBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yIHRvIHRlbGwgaXQgdG8gZGVsZXRlIGl0cyBScGNDaGFubmVsIHdoZW4KKyAgLy8gZGVzdHJveWVkLgorICBlbnVtIENoYW5uZWxPd25lcnNoaXAgeworICAgIFNUVUJfT1dOU19DSEFOTkVMLAorICAgIFNUVUJfRE9FU05UX09XTl9DSEFOTkVMCisgIH07CisKKyAgLy8gR2V0IHRoZSBTZXJ2aWNlRGVzY3JpcHRvciBkZXNjcmliaW5nIHRoaXMgc2VydmljZSBhbmQgaXRzIG1ldGhvZHMuCisgIHZpcnR1YWwgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSA9IDA7CisKKyAgLy8gQ2FsbCBhIG1ldGhvZCBvZiB0aGUgc2VydmljZSBzcGVjaWZpZWQgYnkgTWV0aG9kRGVzY3JpcHRvci4gIFRoaXMgaXMKKyAgLy8gbm9ybWFsbHkgaW1wbGVtZW50ZWQgYXMgYSBzaW1wbGUgc3dpdGNoKCkgdGhhdCBjYWxscyB0aGUgc3RhbmRhcmQKKyAgLy8gZGVmaW5pdGlvbnMgb2YgdGhlIHNlcnZpY2UncyBtZXRob2RzLgorICAvLworICAvLyBQcmVjb25kaXRpb25zOgorICAvLyAqIG1ldGhvZC0+c2VydmljZSgpID09IEdldERlc2NyaXB0b3IoKQorICAvLyAqIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGFyZSBvZiB0aGUgZXhhY3Qgc2FtZSBjbGFzc2VzIGFzIHRoZSBvYmplY3RzCisgIC8vICAgcmV0dXJuZWQgYnkgR2V0UmVxdWVzdFByb3RvdHlwZShtZXRob2QpIGFuZAorICAvLyAgIEdldFJlc3BvbnNlUHJvdG90eXBlKG1ldGhvZCkuCisgIC8vICogQWZ0ZXIgdGhlIGNhbGwgaGFzIHN0YXJ0ZWQsIHRoZSByZXF1ZXN0IG11c3Qgbm90IGJlIG1vZGlmaWVkIGFuZCB0aGUKKyAgLy8gICByZXNwb25zZSBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBhdCBhbGwgdW50aWwgImRvbmUiIGlzIGNhbGxlZC4KKyAgLy8gKiAiY29udHJvbGxlciIgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhlIFJQQyBpbXBsZW1lbnRhdGlvbiBiZWluZworICAvLyAgIHVzZWQgYnkgdGhpcyBTZXJ2aWNlLiAgRm9yIHN0dWJzLCB0aGUgImNvcnJlY3QgdHlwZSIgZGVwZW5kcyBvbiB0aGUKKyAgLy8gICBScGNDaGFubmVsIHdoaWNoIHRoZSBzdHViIGlzIHVzaW5nLiAgU2VydmVyLXNpZGUgU2VydmljZQorICAvLyAgIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYWNjZXB0IHdoYXRldmVyIHR5cGUgb2YgUnBjQ29udHJvbGxlcgorICAvLyAgIHRoZSBzZXJ2ZXItc2lkZSBSUEMgaW1wbGVtZW50YXRpb24gdXNlcy4KKyAgLy8KKyAgLy8gUG9zdGNvbmRpdGlvbnM6CisgIC8vICogImRvbmUiIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1ldGhvZCBpcyBjb21wbGV0ZS4gIFRoaXMgbWF5IGJlCisgIC8vICAgYmVmb3JlIENhbGxNZXRob2QoKSByZXR1cm5zIG9yIGl0IG1heSBiZSBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCisgIC8vICogSWYgdGhlIFJQQyBzdWNjZWVkZWQsICJyZXNwb25zZSIgY29udGFpbnMgdGhlIHJlc3BvbnNlIHJldHVybmVkIGJ5CisgIC8vICAgdGhlIHNlcnZlci4KKyAgLy8gKiBJZiB0aGUgUlBDIGZhaWxlZCwgInJlc3BvbnNlIidzIGNvbnRlbnRzIGFyZSB1bmRlZmluZWQuICBUaGUKKyAgLy8gICBScGNDb250cm9sbGVyIGNhbiBiZSBxdWVyaWVkIHRvIGRldGVybWluZSBpZiBhbiBlcnJvciBvY2N1cnJlZCBhbmQKKyAgLy8gICBwb3NzaWJseSB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuCisgIHZpcnR1YWwgdm9pZCBDYWxsTWV0aG9kKGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUnBjQ29udHJvbGxlciogY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENsb3N1cmUqIGRvbmUpID0gMDsKKworICAvLyBDYWxsTWV0aG9kKCkgcmVxdWlyZXMgdGhhdCB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcGFzc2VkIGluIGFyZSBvZiBhCisgIC8vIHBhcnRpY3VsYXIgc3ViY2xhc3Mgb2YgTWVzc2FnZS4gIEdldFJlcXVlc3RQcm90b3R5cGUoKSBhbmQKKyAgLy8gR2V0UmVzcG9uc2VQcm90b3R5cGUoKSBnZXQgdGhlIGRlZmF1bHQgaW5zdGFuY2VzIG9mIHRoZXNlIHJlcXVpcmVkIHR5cGVzLgorICAvLyBZb3UgY2FuIHRoZW4gY2FsbCBNZXNzYWdlOjpOZXcoKSBvbiB0aGVzZSBpbnN0YW5jZXMgdG8gY29uc3RydWN0IG11dGFibGUKKyAgLy8gb2JqZWN0cyB3aGljaCB5b3UgY2FuIHRoZW4gcGFzcyB0byBDYWxsTWV0aG9kKCkuCisgIC8vCisgIC8vIEV4YW1wbGU6CisgIC8vICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0KKyAgLy8gICAgIHNlcnZpY2UtPkdldERlc2NyaXB0b3IoKS0+RmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7CisgIC8vICAgTWVzc2FnZSogcmVxdWVzdCAgPSBzdHViLT5HZXRSZXF1ZXN0UHJvdG90eXBlIChtZXRob2QpLT5OZXcoKTsKKyAgLy8gICBNZXNzYWdlKiByZXNwb25zZSA9IHN0dWItPkdldFJlc3BvbnNlUHJvdG90eXBlKG1ldGhvZCktPk5ldygpOworICAvLyAgIHJlcXVlc3QtPlBhcnNlRnJvbVN0cmluZyhpbnB1dCk7CisgIC8vICAgc2VydmljZS0+Q2FsbE1ldGhvZChtZXRob2QsICpyZXF1ZXN0LCByZXNwb25zZSwgY2FsbGJhY2spOworICB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UmIEdldFJlcXVlc3RQcm90b3R5cGUoCisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgY29uc3QgTWVzc2FnZSYgR2V0UmVzcG9uc2VQcm90b3R5cGUoCisgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSBjb25zdCA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2VydmljZSk7Cit9OworCisvLyBBbiBScGNDb250cm9sbGVyIG1lZGlhdGVzIGEgc2luZ2xlIG1ldGhvZCBjYWxsLiAgVGhlIHByaW1hcnkgcHVycG9zZSBvZgorLy8gdGhlIGNvbnRyb2xsZXIgaXMgdG8gcHJvdmlkZSBhIHdheSB0byBtYW5pcHVsYXRlIHNldHRpbmdzIHNwZWNpZmljIHRvIHRoZQorLy8gUlBDIGltcGxlbWVudGF0aW9uIGFuZCB0byBmaW5kIG91dCBhYm91dCBSUEMtbGV2ZWwgZXJyb3JzLgorLy8KKy8vIFRoZSBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZSBScGNDb250cm9sbGVyIGludGVyZmFjZSBhcmUgaW50ZW5kZWQgdG8gYmUgYQorLy8gImxlYXN0IGNvbW1vbiBkZW5vbWluYXRvciIgc2V0IG9mIGZlYXR1cmVzIHdoaWNoIHdlIGV4cGVjdCBhbGwKKy8vIGltcGxlbWVudGF0aW9ucyB0byBzdXBwb3J0LiAgU3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG1heSBwcm92aWRlIG1vcmUKKy8vIGFkdmFuY2VkIGZlYXR1cmVzIChlLmcuIGRlYWRsaW5lIHByb3BhZ2F0aW9uKS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBScGNDb250cm9sbGVyIHsKKyBwdWJsaWM6CisgIGlubGluZSBScGNDb250cm9sbGVyKCkge30KKyAgdmlydHVhbCB+UnBjQ29udHJvbGxlcigpOworCisgIC8vIENsaWVudC1zaWRlIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRoZXNlIGNhbGxzIG1heSBiZSBtYWRlIGZyb20gdGhlIGNsaWVudCBzaWRlIG9ubHkuICBUaGVpciByZXN1bHRzCisgIC8vIGFyZSB1bmRlZmluZWQgb24gdGhlIHNlcnZlciBzaWRlIChtYXkgY3Jhc2gpLgorCisgIC8vIFJlc2V0cyB0aGUgUnBjQ29udHJvbGxlciB0byBpdHMgaW5pdGlhbCBzdGF0ZSBzbyB0aGF0IGl0IG1heSBiZSByZXVzZWQgaW4KKyAgLy8gYSBuZXcgY2FsbC4gIE11c3Qgbm90IGJlIGNhbGxlZCB3aGlsZSBhbiBSUEMgaXMgaW4gcHJvZ3Jlc3MuCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsKKworICAvLyBBZnRlciBhIGNhbGwgaGFzIGZpbmlzaGVkLCByZXR1cm5zIHRydWUgaWYgdGhlIGNhbGwgZmFpbGVkLiAgVGhlIHBvc3NpYmxlCisgIC8vIHJlYXNvbnMgZm9yIGZhaWx1cmUgZGVwZW5kIG9uIHRoZSBSUEMgaW1wbGVtZW50YXRpb24uICBGYWlsZWQoKSBtdXN0IG5vdAorICAvLyBiZSBjYWxsZWQgYmVmb3JlIGEgY2FsbCBoYXMgZmluaXNoZWQuICBJZiBGYWlsZWQoKSByZXR1cm5zIHRydWUsIHRoZQorICAvLyBjb250ZW50cyBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBhcmUgdW5kZWZpbmVkLgorICB2aXJ0dWFsIGJvb2wgRmFpbGVkKCkgY29uc3QgPSAwOworCisgIC8vIElmIEZhaWxlZCgpIGlzIHRydWUsIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCisgIHZpcnR1YWwgc3RyaW5nIEVycm9yVGV4dCgpIGNvbnN0ID0gMDsKKworICAvLyBBZHZpc2VzIHRoZSBSUEMgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhlIFJQQyBjYWxsIGJlCisgIC8vIGNhbmNlbGVkLiAgVGhlIFJQQyBzeXN0ZW0gbWF5IGNhbmNlbCBpdCBpbW1lZGlhdGVseSwgbWF5IHdhaXQgYXdoaWxlIGFuZAorICAvLyB0aGVuIGNhbmNlbCBpdCwgb3IgbWF5IG5vdCBldmVuIGNhbmNlbCB0aGUgY2FsbCBhdCBhbGwuICBJZiB0aGUgY2FsbCBpcworICAvLyBjYW5jZWxlZCwgdGhlICJkb25lIiBjYWxsYmFjayB3aWxsIHN0aWxsIGJlIGNhbGxlZCBhbmQgdGhlIFJwY0NvbnRyb2xsZXIKKyAgLy8gd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsIGZhaWxlZCBhdCB0aGF0IHRpbWUuCisgIHZpcnR1YWwgdm9pZCBTdGFydENhbmNlbCgpID0gMDsKKworICAvLyBTZXJ2ZXItc2lkZSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSBjYWxscyBtYXkgYmUgbWFkZSBmcm9tIHRoZSBzZXJ2ZXIgc2lkZSBvbmx5LiAgVGhlaXIgcmVzdWx0cworICAvLyBhcmUgdW5kZWZpbmVkIG9uIHRoZSBjbGllbnQgc2lkZSAobWF5IGNyYXNoKS4KKworICAvLyBDYXVzZXMgRmFpbGVkKCkgdG8gcmV0dXJuIHRydWUgb24gdGhlIGNsaWVudCBzaWRlLiAgInJlYXNvbiIgd2lsbCBiZQorICAvLyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbWVzc2FnZSByZXR1cm5lZCBieSBFcnJvclRleHQoKS4gIElmIHlvdSBmaW5kCisgIC8vIHlvdSBuZWVkIHRvIHJldHVybiBtYWNoaW5lLXJlYWRhYmxlIGluZm9ybWF0aW9uIGFib3V0IGZhaWx1cmVzLCB5b3UKKyAgLy8gc2hvdWxkIGluY29ycG9yYXRlIGl0IGludG8geW91ciByZXNwb25zZSBwcm90b2NvbCBidWZmZXIgYW5kIHNob3VsZAorICAvLyBOT1QgY2FsbCBTZXRGYWlsZWQoKS4KKyAgdmlydHVhbCB2b2lkIFNldEZhaWxlZChjb25zdCBzdHJpbmcmIHJlYXNvbikgPSAwOworCisgIC8vIElmIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgY2FuY2VsZWQgdGhlIFJQQywgc28gdGhlIHNlcnZlciBtYXkKKyAgLy8gYXMgd2VsbCBnaXZlIHVwIG9uIHJlcGx5aW5nIHRvIGl0LiAgVGhlIHNlcnZlciBzaG91bGQgc3RpbGwgY2FsbCB0aGUKKyAgLy8gZmluYWwgImRvbmUiIGNhbGxiYWNrLgorICB2aXJ0dWFsIGJvb2wgSXNDYW5jZWxlZCgpIGNvbnN0ID0gMDsKKworICAvLyBBc2tzIHRoYXQgdGhlIGdpdmVuIGNhbGxiYWNrIGJlIGNhbGxlZCB3aGVuIHRoZSBSUEMgaXMgY2FuY2VsZWQuICBUaGUKKyAgLy8gY2FsbGJhY2sgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4gIElmIHRoZSBSUEMgY29tcGxldGVzIHdpdGhvdXQKKyAgLy8gYmVpbmcgY2FuY2VsZWQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhZnRlciBjb21wbGV0aW9uLiAgSWYgdGhlIFJQQworICAvLyBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGVkIHdoZW4gTm90aWZ5T25DYW5jZWwoKSBpcyBjYWxsZWQsIHRoZSBjYWxsYmFjaworICAvLyB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseS4KKyAgLy8KKyAgLy8gTm90aWZ5T25DYW5jZWwoKSBtdXN0IGJlIGNhbGxlZCBubyBtb3JlIHRoYW4gb25jZSBwZXIgcmVxdWVzdC4KKyAgdmlydHVhbCB2b2lkIE5vdGlmeU9uQ2FuY2VsKENsb3N1cmUqIGNhbGxiYWNrKSA9IDA7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUnBjQ29udHJvbGxlcik7Cit9OworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGFuIFJQQyBjaGFubmVsLiAgQW4gUnBjQ2hhbm5lbCByZXByZXNlbnRzIGEKKy8vIGNvbW11bmljYXRpb24gbGluZSB0byBhIFNlcnZpY2Ugd2hpY2ggY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGF0IFNlcnZpY2UncworLy8gbWV0aG9kcy4gIFRoZSBTZXJ2aWNlIG1heSBiZSBydW5uaW5nIG9uIGFub3RoZXIgbWFjaGluZS4gIE5vcm1hbGx5LCB5b3UKKy8vIHNob3VsZCBub3QgY2FsbCBhbiBScGNDaGFubmVsIGRpcmVjdGx5LCBidXQgaW5zdGVhZCBjb25zdHJ1Y3QgYSBzdHViIFNlcnZpY2UKKy8vIHdyYXBwaW5nIGl0LiAgRXhhbXBsZToKKy8vICAgUnBjQ2hhbm5lbCogY2hhbm5lbCA9IG5ldyBNeVJwY0NoYW5uZWwoInJlbW90ZWhvc3QuZXhhbXBsZS5jb206MTIzNCIpOworLy8gICBNeVNlcnZpY2UqIHNlcnZpY2UgPSBuZXcgTXlTZXJ2aWNlOjpTdHViKGNoYW5uZWwpOworLy8gICBzZXJ2aWNlLT5NeU1ldGhvZChyZXF1ZXN0LCAmcmVzcG9uc2UsIGNhbGxiYWNrKTsKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBScGNDaGFubmVsIHsKKyBwdWJsaWM6CisgIGlubGluZSBScGNDaGFubmVsKCkge30KKyAgdmlydHVhbCB+UnBjQ2hhbm5lbCgpOworCisgIC8vIENhbGwgdGhlIGdpdmVuIG1ldGhvZCBvZiB0aGUgcmVtb3RlIHNlcnZpY2UuICBUaGUgc2lnbmF0dXJlIG9mIHRoaXMKKyAgLy8gcHJvY2VkdXJlIGxvb2tzIHRoZSBzYW1lIGFzIFNlcnZpY2U6OkNhbGxNZXRob2QoKSwgYnV0IHRoZSByZXF1aXJlbWVudHMKKyAgLy8gYXJlIGxlc3Mgc3RyaWN0IGluIG9uZSBpbXBvcnRhbnQgd2F5OiAgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG9iamVjdHMKKyAgLy8gbmVlZCBub3QgYmUgb2YgYW55IHNwZWNpZmljIGNsYXNzIGFzIGxvbmcgYXMgdGhlaXIgZGVzY3JpcHRvcnMgYXJlCisgIC8vIG1ldGhvZC0+aW5wdXRfdHlwZSgpIGFuZCBtZXRob2QtPm91dHB1dF90eXBlKCkuCisgIHZpcnR1YWwgdm9pZCBDYWxsTWV0aG9kKGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUnBjQ29udHJvbGxlciogY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENsb3N1cmUqIGRvbmUpID0gMDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhScGNDaGFubmVsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TRVJWSUNFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWNlNzY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmgKQEAgLTAsMCArMSwyMDggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoZSByb3V0aW5lcyBleHBvcnRlZCBieSB0aGlzIG1vZHVsZSBhcmUgc3VidGxlLiAgSWYgeW91IHVzZSB0aGVtLCBldmVuIGlmCisvLyB5b3UgZ2V0IHRoZSBjb2RlIHJpZ2h0LCBpdCB3aWxsIGRlcGVuZCBvbiBjYXJlZnVsIHJlYXNvbmluZyBhYm91dCBhdG9taWNpdHkKKy8vIGFuZCBtZW1vcnkgb3JkZXJpbmc7IGl0IHdpbGwgYmUgbGVzcyByZWFkYWJsZSwgYW5kIGhhcmRlciB0byBtYWludGFpbi4gIElmCisvLyB5b3UgcGxhbiB0byB1c2UgdGhlc2Ugcm91dGluZXMsIHlvdSBzaG91bGQgaGF2ZSBhIGdvb2QgcmVhc29uLCBzdWNoIGFzIHNvbGlkCisvLyBldmlkZW5jZSB0aGF0IHBlcmZvcm1hbmNlIHdvdWxkIG90aGVyd2lzZSBzdWZmZXIsIG9yIHRoZXJlIGJlaW5nIG5vCisvLyBhbHRlcm5hdGl2ZS4gIFlvdSBzaG91bGQgYXNzdW1lIG9ubHkgcHJvcGVydGllcyBleHBsaWNpdGx5IGd1YXJhbnRlZWQgYnkgdGhlCisvLyBzcGVjaWZpY2F0aW9ucyBpbiB0aGlzIGZpbGUuICBZb3UgYXJlIGFsbW9zdCBjZXJ0YWlubHkgX25vdF8gd3JpdGluZyBjb2RlCisvLyBqdXN0IGZvciB0aGUgeDg2OyBpZiB5b3UgYXNzdW1lIHg4NiBzZW1hbnRpY3MsIHg4NiBoYXJkd2FyZSBidWdzIGFuZAorLy8gaW1wbGVtZW50YXRpb25zIG9uIG90aGVyIGFyY2h0ZWN0dXJlcyB3aWxsIGNhdXNlIHlvdXIgY29kZSB0byBicmVhay4gIElmIHlvdQorLy8gZG8gbm90IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCBhdm9pZCB0aGVzZSByb3V0aW5lcywgYW5kIHVzZSBhIE11dGV4LgorLy8KKy8vIEl0IGlzIGluY29ycmVjdCB0byBtYWtlIGRpcmVjdCBhc3NpZ25tZW50cyB0by9mcm9tIGFuIGF0b21pYyB2YXJpYWJsZS4KKy8vIFlvdSBzaG91bGQgdXNlIG9uZSBvZiB0aGUgTG9hZCBvciBTdG9yZSByb3V0aW5lcy4gIFRoZSBOb0JhcnJpZXIKKy8vIHZlcnNpb25zIGFyZSBwcm92aWRlZCB3aGVuIG5vIGJhcnJpZXJzIGFyZSBuZWVkZWQ6CisvLyAgIE5vQmFycmllcl9TdG9yZSgpCisvLyAgIE5vQmFycmllcl9Mb2FkKCkKKy8vIEFsdGhvdWdoIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gY29tcGlsZXIgZW5mb3JjZW1lbnQsIHlvdSBhcmUgZW5jb3VyYWdlZAorLy8gdG8gdXNlIHRoZXNlLgorCisvLyBUaGlzIGhlYWRlciBhbmQgdGhlIGltcGxlbWVudGF0aW9ucyBmb3IgZWFjaCBwbGF0Zm9ybSAobG9jYXRlZCBpbgorLy8gYXRvbWljb3BzX2ludGVybmFsc18qKSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB1cHN0cmVhbSBjb2RlIChWOCkuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0hfCisKKy8vIERvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGZvciBwZW9wbGUgbm90IGNvbmNlcm5lZCBhYm91dCB0aHJlYWQgc2FmZXR5LgorI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEU0FGRVRZCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3R5cGVkZWYgaW50MzIgQXRvbWljMzI7CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUCisvLyBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZ28gYmV0d2VlbiBBdG9taWM2NCBhbmQgQXRvbWljV29yZCBpbXBsaWNpdGx5LiAgVGhpcworLy8gbWVhbnMgQXRvbWljNjQgYW5kIEF0b21pY1dvcmQgc2hvdWxkIGJlIHRoZSBzYW1lIHR5cGUgb24gNjQtYml0LgorI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX05BQ0wpCisvLyBOYUNsJ3MgaW50cHRyX3QgaXMgbm90IGFjdHVhbGx5IDY0LWJpdHMgb24gNjQtYml0IQorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL25hdGl2ZWNsaWVudC9pc3N1ZXMvZGV0YWlsP2lkPTExNjIKK3R5cGVkZWYgaW50NjQgQXRvbWljNjQ7CisjZWxzZQordHlwZWRlZiBpbnRwdHJfdCBBdG9taWM2NDsKKyNlbmRpZgorI2VuZGlmCisKKy8vIFVzZSBBdG9taWNXb3JkIGZvciBhIG1hY2hpbmUtc2l6ZWQgcG9pbnRlci4gIEl0IHdpbGwgdXNlIHRoZSBBdG9taWMzMiBvcgorLy8gQXRvbWljNjQgcm91dGluZXMgYmVsb3csIGRlcGVuZGluZyBvbiB5b3VyIGFyY2hpdGVjdHVyZS4KK3R5cGVkZWYgaW50cHRyX3QgQXRvbWljV29yZDsKKworLy8gQXRvbWljYWxseSBleGVjdXRlOgorLy8gICAgICByZXN1bHQgPSAqcHRyOworLy8gICAgICBpZiAoKnB0ciA9PSBvbGRfdmFsdWUpCisvLyAgICAgICAgKnB0ciA9IG5ld192YWx1ZTsKKy8vICAgICAgcmV0dXJuIHJlc3VsdDsKKy8vCisvLyBJLmUuLCByZXBsYWNlICIqcHRyIiB3aXRoICJuZXdfdmFsdWUiIGlmICIqcHRyIiB1c2VkIHRvIGJlICJvbGRfdmFsdWUiLgorLy8gQWx3YXlzIHJldHVybiB0aGUgb2xkIHZhbHVlIG9mICIqcHRyIgorLy8KKy8vIFRoaXMgcm91dGluZSBpbXBsaWVzIG5vIG1lbW9yeSBiYXJyaWVycy4KK0F0b21pYzMyIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpOworCisvLyBBdG9taWNhbGx5IHN0b3JlIG5ld192YWx1ZSBpbnRvICpwdHIsIHJldHVybmluZyB0aGUgcHJldmlvdXMgdmFsdWUgaGVsZCBpbgorLy8gKnB0ci4gIFRoaXMgcm91dGluZSBpbXBsaWVzIG5vIG1lbW9yeSBiYXJyaWVycy4KK0F0b21pYzMyIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiBuZXdfdmFsdWUpOworCisvLyBBdG9taWNhbGx5IGluY3JlbWVudCAqcHRyIGJ5ICJpbmNyZW1lbnQiLiAgUmV0dXJucyB0aGUgbmV3IHZhbHVlIG9mCisvLyAqcHRyIHdpdGggdGhlIGluY3JlbWVudCBhcHBsaWVkLiAgVGhpcyByb3V0aW5lIGltcGxpZXMgbm8gbWVtb3J5IGJhcnJpZXJzLgorQXRvbWljMzIgTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiBpbmNyZW1lbnQpOworCitBdG9taWMzMiBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgaW5jcmVtZW50KTsKKworLy8gVGhlc2UgZm9sbG93aW5nIGxvd2VyLWxldmVsIG9wZXJhdGlvbnMgYXJlIHR5cGljYWxseSB1c2VmdWwgb25seSB0byBwZW9wbGUKKy8vIGltcGxlbWVudGluZyBoaWdoZXItbGV2ZWwgc3luY2hyb25pemF0aW9uIG9wZXJhdGlvbnMgbGlrZSBzcGlubG9ja3MsCisvLyBtdXRleGVzLCBhbmQgY29uZGl0aW9uLXZhcmlhYmxlcy4gIFRoZXkgY29tYmluZSBDb21wYXJlQW5kU3dhcCgpLCBhIGxvYWQsIG9yCisvLyBhIHN0b3JlIHdpdGggYXBwcm9wcmlhdGUgbWVtb3J5LW9yZGVyaW5nIGluc3RydWN0aW9ucy4gICJBY3F1aXJlIiBvcGVyYXRpb25zCisvLyBlbnN1cmUgdGhhdCBubyBsYXRlciBtZW1vcnkgYWNjZXNzIGNhbiBiZSByZW9yZGVyZWQgYWhlYWQgb2YgdGhlIG9wZXJhdGlvbi4KKy8vICJSZWxlYXNlIiBvcGVyYXRpb25zIGVuc3VyZSB0aGF0IG5vIHByZXZpb3VzIG1lbW9yeSBhY2Nlc3MgY2FuIGJlIHJlb3JkZXJlZAorLy8gYWZ0ZXIgdGhlIG9wZXJhdGlvbi4gICJCYXJyaWVyIiBvcGVyYXRpb25zIGhhdmUgYm90aCAiQWNxdWlyZSIgYW5kICJSZWxlYXNlIgorLy8gc2VtYW50aWNzLiAgIEEgTWVtb3J5QmFycmllcigpIGhhcyAiQmFycmllciIgc2VtYW50aWNzLCBidXQgZG9lcyBubyBtZW1vcnkKKy8vIGFjY2Vzcy4KK0F0b21pYzMyIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpOworQXRvbWljMzIgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSk7CisKK3ZvaWQgTWVtb3J5QmFycmllcigpOwordm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpOwordm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKTsKK3ZvaWQgUmVsZWFzZV9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSk7CisKK0F0b21pYzMyIE5vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpOworQXRvbWljMzIgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpOworQXRvbWljMzIgUmVsZWFzZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpOworCisvLyA2NC1iaXQgYXRvbWljIG9wZXJhdGlvbnMgKG9ubHkgYXZhaWxhYmxlIG9uIDY0LWJpdCBwcm9jZXNzb3JzKS4KKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQKK0F0b21pYzY0IE5vQmFycmllcl9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpOworQXRvbWljNjQgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IG5ld192YWx1ZSk7CitBdG9taWM2NCBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IGluY3JlbWVudCk7CitBdG9taWM2NCBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCBpbmNyZW1lbnQpOworCitBdG9taWM2NCBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKTsKK0F0b21pYzY0IFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpOwordm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpOwordm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKTsKK3ZvaWQgUmVsZWFzZV9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSk7CitBdG9taWM2NCBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKTsKK0F0b21pYzY0IEFjcXVpcmVfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKTsKK0F0b21pYzY0IFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKTsKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKy8vIEluY2x1ZGUgb3VyIHBsYXRmb3JtIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0VSUk9SIFwKKyNlcnJvciAiQXRvbWljIG9wZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24geW91ciBwbGF0Zm9ybSIKKworLy8gTVNWQy4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfSUEzMikgfHwgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9YNjQpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaD4KKyNlbHNlCitHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0VSUk9SCisjZW5kaWYKKworLy8gQXBwbGUuCisjZWxpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19BUFBMRSkKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19tYWNvc3guaD4KKworLy8gTEIgc2hlbGwgcGxhdGZvcm1zIHRoYXQgZG9uJ3QgZml0IGFueSBvZiB0aGUgZXhpc3RpbmcgYXRvbWljb3BzX2ludGVybmFsc19YWFgKKyNlbGlmIChkZWZpbmVkKF9fTEJfUFMzX18pIHx8IGRlZmluZWQoX19MQl9XSUlVX18pKSAmJiAhZGVmaW5lZChfX0xCX0hPU1RfXykKKyNkZWZpbmUgU0hFTExfQkVHSU5fQVRPTUlDT1BTX05BTUVTUEFDRVMgbmFtZXNwYWNlIGdvb2dsZSB7IG5hbWVzcGFjZSBwcm90b2J1ZiB7IG5hbWVzcGFjZSBpbnRlcm5hbCB7CisjZGVmaW5lIFNIRUxMX0VORF9BVE9NSUNPUFNfTkFNRVNQQUNFUyB9IH0gfQorI2luY2x1ZGUgImF0b21pY29wc19pbnRlcm5hbHNfc2hlbGwuaCIgIC8vIGZyb20gdGhlIHBsYXRmb3JtIGxpYgorCisvLyBHQ0MuCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfSUEzMikgfHwgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9YNjQpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oPgorI2VsaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9BUk0pCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX2djYy5oPgorI2VsaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9NSVBTKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21pcHNfZ2NjLmg+CisjZWxzZQorR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19FUlJPUgorI2VuZGlmCisKKy8vIFVua25vd24uCisjZWxzZQorR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19FUlJPUgorI2VuZGlmCisKKy8vIE9uIHNvbWUgcGxhdGZvcm1zIHdlIG5lZWQgYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgdG8gbWFrZSBBdG9taWNXb3JkCisvLyBjb21wYXRpYmxlIHdpdGggb3VyIG90aGVyIEF0b21pYyogdHlwZXMuCisjaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfQVBQTEUpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXRvbWljd29yZF9jb21wYXQuaD4KKyNlbmRpZgorCisjdW5kZWYgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19FUlJPUgorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9OT19USFJFQURTQUZFVFkKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9nY2MuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX2djYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNGRlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9nY2MuaApAQCAtMCwwICsxLDE1MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gVGhpcyBmaWxlIGlzIGFuIGludGVybmFsIGF0b21pYyBpbXBsZW1lbnRhdGlvbiwgdXNlIGF0b21pY29wcy5oIGluc3RlYWQuCisvLworLy8gTGludXhLZXJuZWxDbXB4Y2hnIGFuZCBCYXJyaWVyX0F0b21pY0luY3JlbWVudCBhcmUgZnJvbSBHb29nbGUgR2VhcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfQVJNX0dDQ19IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19BUk1fR0NDX0hfCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIDB4ZmZmZjBmYzAgaXMgdGhlIGhhcmQgY29kZWQgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5CisvLyB0aGUga2VybmVsIHdoaWNoIGltcGxlbWVudHMgYW4gYXRvbWljIGNvbXBhcmUtZXhjaGFuZ2UuIE9uIG9sZGVyCisvLyBBUk0gYXJjaGl0ZWN0dXJlIHJldmlzaW9ucyAocHJlLXY2KSB0aGlzIG1heSBiZSBpbXBsZW1lbnRlZCB1c2luZworLy8gYSBzeXNjYWxsLiBUaGlzIGFkZHJlc3MgaXMgc3RhYmxlLCBhbmQgaW4gYWN0aXZlIHVzZSAoaGFyZCBjb2RlZCkKKy8vIGJ5IGF0IGxlYXN0IGdsaWJjLTIuNyBhbmQgdGhlIEFuZHJvaWQgQyBsaWJyYXJ5LgordHlwZWRlZiBBdG9taWMzMiAoKkxpbnV4S2VybmVsQ21weGNoZ0Z1bmMpKEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgQXRvbWljMzIqIHB0cik7CitMaW51eEtlcm5lbENtcHhjaGdGdW5jIHBMaW51eEtlcm5lbENtcHhjaGcgX19hdHRyaWJ1dGVfXygod2VhaykpID0KKyAgICAoTGludXhLZXJuZWxDbXB4Y2hnRnVuYykgMHhmZmZmMGZjMDsKKwordHlwZWRlZiB2b2lkICgqTGludXhLZXJuZWxNZW1vcnlCYXJyaWVyRnVuYykodm9pZCk7CitMaW51eEtlcm5lbE1lbW9yeUJhcnJpZXJGdW5jIHBMaW51eEtlcm5lbE1lbW9yeUJhcnJpZXIgX19hdHRyaWJ1dGVfXygod2VhaykpID0KKyAgICAoTGludXhLZXJuZWxNZW1vcnlCYXJyaWVyRnVuYykgMHhmZmZmMGZhMDsKKworCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIEF0b21pYzMyIHByZXZfdmFsdWUgPSAqcHRyOworICBkbyB7CisgICAgaWYgKCFwTGludXhLZXJuZWxDbXB4Y2hnKG9sZF92YWx1ZSwgbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEF0b21pYzMyKj4ocHRyKSkpIHsKKyAgICAgIHJldHVybiBvbGRfdmFsdWU7CisgICAgfQorICAgIHByZXZfdmFsdWUgPSAqcHRyOworICB9IHdoaWxlIChwcmV2X3ZhbHVlID09IG9sZF92YWx1ZSk7CisgIHJldHVybiBwcmV2X3ZhbHVlOworfQorCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICBBdG9taWMzMiBvbGRfdmFsdWU7CisgIGRvIHsKKyAgICBvbGRfdmFsdWUgPSAqcHRyOworICB9IHdoaWxlIChwTGludXhLZXJuZWxDbXB4Y2hnKG9sZF92YWx1ZSwgbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKSk7CisgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyAgcmV0dXJuIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHB0ciwgaW5jcmVtZW50KTsKK30KKworaW5saW5lIEF0b21pYzMyIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgaW5jcmVtZW50KSB7CisgIGZvciAoOzspIHsKKyAgICAvLyBBdG9taWMgZXhjaGFuZ2UgdGhlIG9sZCB2YWx1ZSB3aXRoIGFuIGluY3JlbWVudGVkIG9uZS4KKyAgICBBdG9taWMzMiBvbGRfdmFsdWUgPSAqcHRyOworICAgIEF0b21pYzMyIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGluY3JlbWVudDsKKyAgICBpZiAocExpbnV4S2VybmVsQ21weGNoZyhvbGRfdmFsdWUsIG5ld192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEF0b21pYzMyKj4ocHRyKSkgPT0gMCkgeworICAgICAgLy8gVGhlIGV4Y2hhbmdlIHRvb2sgcGxhY2UgYXMgZXhwZWN0ZWQuCisgICAgICByZXR1cm4gbmV3X3ZhbHVlOworICAgIH0KKyAgICAvLyBPdGhlcndpc2UsICpwdHIgY2hhbmdlZCBtaWQtbG9vcCBhbmQgd2UgbmVlZCB0byByZXRyeS4KKyAgfQorfQorCitpbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIHJldHVybiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSBBdG9taWMzMiBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgcmV0dXJuIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKK30KKworaW5saW5lIHZvaWQgTm9CYXJyaWVyX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsKK30KKworaW5saW5lIHZvaWQgTWVtb3J5QmFycmllcigpIHsKKyAgcExpbnV4S2VybmVsTWVtb3J5QmFycmllcigpOworfQorCitpbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsKKyAgTWVtb3J5QmFycmllcigpOworfQorCitpbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgKnB0ciA9IHZhbHVlOworfQorCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgeworICByZXR1cm4gKnB0cjsKK30KKworaW5saW5lIEF0b21pYzMyIEFjcXVpcmVfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIEF0b21pYzMyIHZhbHVlID0gKnB0cjsKKyAgTWVtb3J5QmFycmllcigpOworICByZXR1cm4gdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBSZWxlYXNlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgeworICBNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiAqcHRyOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX0FSTV9HQ0NfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXRvbWljd29yZF9jb21wYXQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXRvbWljd29yZF9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWQ4Njc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hdG9taWN3b3JkX2NvbXBhdC5oCkBAIC0wLDAgKzEsMTIyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgYW4gaW50ZXJuYWwgYXRvbWljIGltcGxlbWVudGF0aW9uLCB1c2UgYXRvbWljb3BzLmggaW5zdGVhZC4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19BVE9NSUNXT1JEX0NPTVBBVF9IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19BVE9NSUNXT1JEX0NPTVBBVF9IXworCisvLyBBdG9taWNXb3JkIGlzIGEgc3lub255bSBmb3IgaW50cHRyX3QsIGFuZCBBdG9taWMzMiBpcyBhIHN5bm9ueW0gZm9yIGludDMyLAorLy8gd2hpY2ggaW4gdHVybiBtZWFucyBpbnQuIE9uIHNvbWUgTFAzMiBwbGF0Zm9ybXMsIGludHB0cl90IGlzIGFuIGludCwgYnV0CisvLyBvbiBvdGhlcnMsIGl0J3MgYSBsb25nLiBXaGVuIEF0b21pY1dvcmQgYW5kIEF0b21pYzMyIGFyZSBiYXNlZCBvbiBkaWZmZXJlbnQKKy8vIGZ1bmRhbWVudGFsIHR5cGVzLCB0aGVpciBwb2ludGVycyBhcmUgaW5jb21wYXRpYmxlLgorLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9uIG92ZXJsb2FkcyB0byBhbGxvdyBib3RoIEF0b21pY1dvcmQgYW5kIEF0b21pYzMyCisvLyBkYXRhIHRvIGJlIHVzZWQgd2l0aCB0aGlzIGludGVyZmFjZS4KKy8vCisvLyBPbiBMUDY0IHBsYXRmb3JtcywgQXRvbWljV29yZCBhbmQgQXRvbWljNjQgYXJlIGJvdGggYWx3YXlzIGxvbmcsCisvLyBzbyB0aGlzIHByb2JsZW0gZG9lc24ndCBvY2N1ci4KKworI2lmICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIXzY0X0JJVCkKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworaW5saW5lIEF0b21pY1dvcmQgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pY1dvcmQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBBdG9taWMzMio+KHB0ciksIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKK30KKworaW5saW5lIEF0b21pY1dvcmQgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pY1dvcmQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBBdG9taWMzMio+KHB0ciksIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSBBdG9taWNXb3JkIE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljV29yZCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIGluY3JlbWVudCkgeworICByZXR1cm4gTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudCgKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgQXRvbWljMzIqPihwdHIpLCBpbmNyZW1lbnQpOworfQorCitpbmxpbmUgQXRvbWljV29yZCBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWNXb3JkKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIGluY3JlbWVudCkgeworICByZXR1cm4gQmFycmllcl9BdG9taWNJbmNyZW1lbnQoCisgICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgaW5jcmVtZW50KTsKK30KKworaW5saW5lIEF0b21pY1dvcmQgQWNxdWlyZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWNXb3JkKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY1dvcmQgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIG5ld192YWx1ZSkgeworICByZXR1cm4gQWNxdWlyZV9Db21wYXJlQW5kU3dhcCgKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgQXRvbWljMzIqPihwdHIpLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSBBdG9taWNXb3JkIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljV29yZCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljV29yZCBuZXdfdmFsdWUpIHsKKyAgcmV0dXJuIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAoCisgICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljV29yZCAqcHRyLCBBdG9taWNXb3JkIHZhbHVlKSB7CisgIE5vQmFycmllcl9TdG9yZShyZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgdmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pY1dvcmQqIHB0ciwgQXRvbWljV29yZCB2YWx1ZSkgeworICByZXR1cm4gQWNxdWlyZV9TdG9yZShyZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgdmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pY1dvcmQqIHB0ciwgQXRvbWljV29yZCB2YWx1ZSkgeworICByZXR1cm4gUmVsZWFzZV9TdG9yZShyZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgdmFsdWUpOworfQorCitpbmxpbmUgQXRvbWljV29yZCBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWNXb3JkICpwdHIpIHsKKyAgcmV0dXJuIE5vQmFycmllcl9Mb2FkKHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgY29uc3QgQXRvbWljMzIqPihwdHIpKTsKK30KKworaW5saW5lIEF0b21pY1dvcmQgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pY1dvcmQqIHB0cikgeworICByZXR1cm4gQWNxdWlyZV9Mb2FkKHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgY29uc3QgQXRvbWljMzIqPihwdHIpKTsKK30KKworaW5saW5lIEF0b21pY1dvcmQgUmVsZWFzZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pY1dvcmQqIHB0cikgeworICByZXR1cm4gUmVsZWFzZV9Mb2FkKHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgY29uc3QgQXRvbWljMzIqPihwdHIpKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQpCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfQVRPTUlDV09SRF9DT01QQVRfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWFjb3N4LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21hY29zeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Yjc1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21hY29zeC5oCkBAIC0wLDAgKzEsMjI1IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgYW4gaW50ZXJuYWwgYXRvbWljIGltcGxlbWVudGF0aW9uLCB1c2UgYXRvbWljb3BzLmggaW5zdGVhZC4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19NQUNPU1hfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfTUFDT1NYX0hfCisKKyNpbmNsdWRlIDxsaWJrZXJuL09TQXRvbWljLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQXRvbWljMzIgcHJldl92YWx1ZTsKKyAgZG8geworICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwMzIob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEF0b21pYzMyKj4ocHRyKSkpIHsKKyAgICAgIHJldHVybiBvbGRfdmFsdWU7CisgICAgfQorICAgIHByZXZfdmFsdWUgPSAqcHRyOworICB9IHdoaWxlIChwcmV2X3ZhbHVlID09IG9sZF92YWx1ZSk7CisgIHJldHVybiBwcmV2X3ZhbHVlOworfQorCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICBBdG9taWMzMiBvbGRfdmFsdWU7CisgIGRvIHsKKyAgICBvbGRfdmFsdWUgPSAqcHRyOworICB9IHdoaWxlICghT1NBdG9taWNDb21wYXJlQW5kU3dhcDMyKG9sZF92YWx1ZSwgbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKSk7CisgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyAgcmV0dXJuIE9TQXRvbWljQWRkMzIoaW5jcmVtZW50LCBjb25zdF9jYXN0PEF0b21pYzMyKj4ocHRyKSk7Cit9CisKK2lubGluZSBBdG9taWMzMiBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgaW5jcmVtZW50KSB7CisgIHJldHVybiBPU0F0b21pY0FkZDMyQmFycmllcihpbmNyZW1lbnQsIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKTsKK30KKworaW5saW5lIHZvaWQgTWVtb3J5QmFycmllcigpIHsKKyAgT1NNZW1vcnlCYXJyaWVyKCk7Cit9CisKK2lubGluZSBBdG9taWMzMiBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQXRvbWljMzIgcHJldl92YWx1ZTsKKyAgZG8geworICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwMzJCYXJyaWVyKG9sZF92YWx1ZSwgbmV3X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKSkgeworICAgICAgcmV0dXJuIG9sZF92YWx1ZTsKKyAgICB9CisgICAgcHJldl92YWx1ZSA9ICpwdHI7CisgIH0gd2hpbGUgKHByZXZfdmFsdWUgPT0gb2xkX3ZhbHVlKTsKKyAgcmV0dXJuIHByZXZfdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgcmV0dXJuIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworICBNZW1vcnlCYXJyaWVyKCk7Cit9CisKK2lubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgTWVtb3J5QmFycmllcigpOworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIHJldHVybiAqcHRyOworfQorCitpbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyAgQXRvbWljMzIgdmFsdWUgPSAqcHRyOworICBNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKKyNpZmRlZiBfX0xQNjRfXworCisvLyA2NC1iaXQgaW1wbGVtZW50YXRpb24gb24gNjQtYml0IHBsYXRmb3JtCisKK2lubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgQXRvbWljNjQgcHJldl92YWx1ZTsKKyAgZG8geworICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwNjQob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIGludDY0X3QqPihwdHIpKSkgeworICAgICAgcmV0dXJuIG9sZF92YWx1ZTsKKyAgICB9CisgICAgcHJldl92YWx1ZSA9ICpwdHI7CisgIH0gd2hpbGUgKHByZXZfdmFsdWUgPT0gb2xkX3ZhbHVlKTsKKyAgcmV0dXJuIHByZXZfdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7CisgIEF0b21pYzY0IG9sZF92YWx1ZTsKKyAgZG8geworICAgIG9sZF92YWx1ZSA9ICpwdHI7CisgIH0gd2hpbGUgKCFPU0F0b21pY0NvbXBhcmVBbmRTd2FwNjQob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSkpOworICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitpbmxpbmUgQXRvbWljNjQgTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgaW5jcmVtZW50KSB7CisgIHJldHVybiBPU0F0b21pY0FkZDY0KGluY3JlbWVudCwgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSk7Cit9CisKK2lubGluZSBBdG9taWM2NCBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgeworICByZXR1cm4gT1NBdG9taWNBZGQ2NEJhcnJpZXIoaW5jcmVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSk7Cit9CisKK2lubGluZSBBdG9taWM2NCBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgQXRvbWljNjQgcHJldl92YWx1ZTsKKyAgZG8geworICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwNjRCYXJyaWVyKAorICAgICAgICBvbGRfdmFsdWUsIG5ld192YWx1ZSwgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSkpIHsKKyAgICAgIHJldHVybiBvbGRfdmFsdWU7CisgICAgfQorICAgIHByZXZfdmFsdWUgPSAqcHRyOworICB9IHdoaWxlIChwcmV2X3ZhbHVlID09IG9sZF92YWx1ZSk7CisgIHJldHVybiBwcmV2X3ZhbHVlOworfQorCitpbmxpbmUgQXRvbWljNjQgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7CisgIC8vIFRoZSBsaWIga2VybiBpbnRlcmZhY2UgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAvLyBBY3F1aXJlIGFuZCBSZWxlYXNlIG1lbW9yeSBiYXJyaWVyczsgdGhleSBhcmUgZXF1aXZhbGVudC4KKyAgcmV0dXJuIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworICBNZW1vcnlCYXJyaWVyKCk7Cit9CisKK2lubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKKyAgTWVtb3J5QmFycmllcigpOworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7CisgIHJldHVybiAqcHRyOworfQorCitpbmxpbmUgQXRvbWljNjQgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpIHsKKyAgQXRvbWljNjQgdmFsdWUgPSAqcHRyOworICBNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKKyNlbmRpZiAgLy8gZGVmaW5lZChfX0xQNjRfXykKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19NQUNPU1hfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWlwc19nY2MuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWlwc19nY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQ2ODUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19taXBzX2djYy5oCkBAIC0wLDAgKzEsMTg3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgYW4gaW50ZXJuYWwgYXRvbWljIGltcGxlbWVudGF0aW9uLCB1c2UgYXRvbWljb3BzLmggaW5zdGVhZC4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19NSVBTX0dDQ19IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19NSVBTX0dDQ19IXworCisjZGVmaW5lIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCkgX19hc21fXyBfX3ZvbGF0aWxlX18oIiIgOiA6IDogIm1lbW9yeSIpCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEF0b21pY2FsbHkgZXhlY3V0ZToKKy8vICAgICAgcmVzdWx0ID0gKnB0cjsKKy8vICAgICAgaWYgKCpwdHIgPT0gb2xkX3ZhbHVlKQorLy8gICAgICAgICpwdHIgPSBuZXdfdmFsdWU7CisvLyAgICAgIHJldHVybiByZXN1bHQ7CisvLworLy8gSS5lLiwgcmVwbGFjZSAiKnB0ciIgd2l0aCAibmV3X3ZhbHVlIiBpZiAiKnB0ciIgdXNlZCB0byBiZSAib2xkX3ZhbHVlIi4KKy8vIEFsd2F5cyByZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiAiKnB0ciIKKy8vCisvLyBUaGlzIHJvdXRpbmUgaW1wbGllcyBubyBtZW1vcnkgYmFycmllcnMuCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIEF0b21pYzMyIHByZXYsIHRtcDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oIi5zZXQgcHVzaFxuIgorICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIjE6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICJsbCAlMCwgJTVcbiIgIC8vIHByZXYgPSAqcHRyCisgICAgICAgICAgICAgICAgICAgICAgICJibmUgJTAsICUzLCAyZlxuIiAgLy8gaWYgKHByZXYgIT0gb2xkX3ZhbHVlKSBnb3RvIDIKKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdmUgJTIsICU0XG4iICAvLyB0bXAgPSBuZXdfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgInNjICUyLCAlMVxuIiAgLy8gKnB0ciA9IHRtcCAod2l0aCBhdG9taWMgY2hlY2spCisgICAgICAgICAgICAgICAgICAgICAgICJiZXF6ICUyLCAxYlxuIiAgLy8gc3RhcnQgYWdhaW4gb24gYXRvbWljIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICJub3BcbiIgIC8vIGRlbGF5IHNsb3Qgbm9wCisgICAgICAgICAgICAgICAgICAgICAgICIyOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBwb3BcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAocHJldiksICI9bSIgKCpwdHIpLCAiPSZyIiAodG1wKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJJciIgKG9sZF92YWx1ZSksICJyIiAobmV3X3ZhbHVlKSwgIm0iICgqcHRyKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgcmV0dXJuIHByZXY7Cit9CisKKy8vIEF0b21pY2FsbHkgc3RvcmUgbmV3X3ZhbHVlIGludG8gKnB0ciwgcmV0dXJuaW5nIHRoZSBwcmV2aW91cyB2YWx1ZSBoZWxkIGluCisvLyAqcHRyLiAgVGhpcyByb3V0aW5lIGltcGxpZXMgbm8gbWVtb3J5IGJhcnJpZXJzLgoraW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQXRvbWljMzIgdGVtcCwgb2xkOworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLnNldCBwdXNoXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlclxuIgorICAgICAgICAgICAgICAgICAgICAgICAiMTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgImxsICUxLCAlMlxuIiAgLy8gb2xkID0gKnB0cgorICAgICAgICAgICAgICAgICAgICAgICAibW92ZSAlMCwgJTNcbiIgIC8vIHRlbXAgPSBuZXdfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgInNjICUwLCAlMlxuIiAgLy8gKnB0ciA9IHRlbXAgKHdpdGggYXRvbWljIGNoZWNrKQorICAgICAgICAgICAgICAgICAgICAgICAiYmVxeiAlMCwgMWJcbiIgIC8vIHN0YXJ0IGFnYWluIG9uIGF0b21pYyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAibm9wXG4iICAvLyBkZWxheSBzbG90IG5vcAorICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBwb3BcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAodGVtcCksICI9JnIiIChvbGQpLCAiPW0iICgqcHRyKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAobmV3X3ZhbHVlKSwgIm0iICgqcHRyKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKworICByZXR1cm4gb2xkOworfQorCisvLyBBdG9taWNhbGx5IGluY3JlbWVudCAqcHRyIGJ5ICJpbmNyZW1lbnQiLiAgUmV0dXJucyB0aGUgbmV3IHZhbHVlIG9mCisvLyAqcHRyIHdpdGggdGhlIGluY3JlbWVudCBhcHBsaWVkLiAgVGhpcyByb3V0aW5lIGltcGxpZXMgbm8gbWVtb3J5IGJhcnJpZXJzLgoraW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIGluY3JlbWVudCkgeworICBBdG9taWMzMiB0ZW1wLCB0ZW1wMjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLnNldCBwdXNoXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlclxuIgorICAgICAgICAgICAgICAgICAgICAgICAiMTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgImxsICUwLCAlMlxuIiAgLy8gdGVtcCA9ICpwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgImFkZHUgJTEsICUwLCAlM1xuIiAgLy8gdGVtcDIgPSB0ZW1wICsgaW5jcmVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICJzYyAlMSwgJTJcbiIgIC8vICpwdHIgPSB0ZW1wMiAod2l0aCBhdG9taWMgY2hlY2spCisgICAgICAgICAgICAgICAgICAgICAgICJiZXF6ICUxLCAxYlxuIiAgLy8gc3RhcnQgYWdhaW4gb24gYXRvbWljIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICJhZGR1ICUxLCAlMCwgJTNcbiIgIC8vIHRlbXAyID0gdGVtcCArIGluY3JlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBwb3BcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAodGVtcCksICI9JnIiICh0ZW1wMiksICI9bSIgKCpwdHIpCisgICAgICAgICAgICAgICAgICAgICAgIDogIklyIiAoaW5jcmVtZW50KSwgIm0iICgqcHRyKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgLy8gdGVtcDIgbm93IGhvbGRzIHRoZSBmaW5hbCB2YWx1ZS4KKyAgcmV0dXJuIHRlbXAyOworfQorCitpbmxpbmUgQXRvbWljMzIgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyAgQVRPTUlDT1BTX0NPTVBJTEVSX0JBUlJJRVIoKTsKKyAgQXRvbWljMzIgcmVzID0gTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudChwdHIsIGluY3JlbWVudCk7CisgIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7CisgIHJldHVybiByZXM7Cit9CisKKy8vICJBY3F1aXJlIiBvcGVyYXRpb25zCisvLyBlbnN1cmUgdGhhdCBubyBsYXRlciBtZW1vcnkgYWNjZXNzIGNhbiBiZSByZW9yZGVyZWQgYWhlYWQgb2YgdGhlIG9wZXJhdGlvbi4KKy8vICJSZWxlYXNlIiBvcGVyYXRpb25zIGVuc3VyZSB0aGF0IG5vIHByZXZpb3VzIG1lbW9yeSBhY2Nlc3MgY2FuIGJlIHJlb3JkZXJlZAorLy8gYWZ0ZXIgdGhlIG9wZXJhdGlvbi4gICJCYXJyaWVyIiBvcGVyYXRpb25zIGhhdmUgYm90aCAiQWNxdWlyZSIgYW5kICJSZWxlYXNlIgorLy8gc2VtYW50aWNzLiAgIEEgTWVtb3J5QmFycmllcigpIGhhcyAiQmFycmllciIgc2VtYW50aWNzLCBidXQgZG9lcyBubyBtZW1vcnkKKy8vIGFjY2Vzcy4KK2lubGluZSBBdG9taWMzMiBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQVRPTUlDT1BTX0NPTVBJTEVSX0JBUlJJRVIoKTsKKyAgQXRvbWljMzIgcmVzID0gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworICBBVE9NSUNPUFNfQ09NUElMRVJfQkFSUklFUigpOworICByZXR1cm4gcmVzOworfQorCitpbmxpbmUgQXRvbWljMzIgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7CisgIEF0b21pYzMyIHJlcyA9IE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKKyAgQVRPTUlDT1BTX0NPTVBJTEVSX0JBUlJJRVIoKTsKKyAgcmV0dXJuIHJlczsKK30KKworaW5saW5lIHZvaWQgTm9CYXJyaWVyX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsKK30KKworaW5saW5lIHZvaWQgTWVtb3J5QmFycmllcigpIHsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKK30KKworaW5saW5lIHZvaWQgQWNxdWlyZV9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7CisgIE1lbW9yeUJhcnJpZXIoKTsKK30KKworaW5saW5lIHZvaWQgUmVsZWFzZV9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgeworICBNZW1vcnlCYXJyaWVyKCk7CisgICpwdHIgPSB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyAgcmV0dXJuICpwdHI7Cit9CisKK2lubGluZSBBdG9taWMzMiBBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgeworICBBdG9taWMzMiB2YWx1ZSA9ICpwdHI7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCitpbmxpbmUgQXRvbWljMzIgUmVsZWFzZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyAgTWVtb3J5QmFycmllcigpOworICByZXR1cm4gKnB0cjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI3VuZGVmIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfTUlQU19HQ0NfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzc0ODcyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmNjCkBAIC0wLDAgKzEsMTM3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIG1vZHVsZSBnZXRzIGVub3VnaCBDUFUgaW5mb3JtYXRpb24gdG8gb3B0aW1pemUgdGhlCisvLyBhdG9taWNvcHMgbW9kdWxlIG9uIHg4Ni4KKworI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmg+CisKKy8vIFRoaXMgZmlsZSBvbmx5IG1ha2VzIHNlbnNlIHdpdGggYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmggLS0gaXQKKy8vIGRlcGVuZHMgb24gc3RydWN0cyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoYXQgZmlsZS4gIElmIGF0b21pY29wcy5oCisvLyBkb2Vzbid0IHN1Yi1pbmNsdWRlIHRoYXQgZmlsZSwgdGhlbiB3ZSBhcmVuJ3QgbmVlZGVkLCBhbmQgc2hvdWxkbid0CisvLyB0cnkgdG8gZG8gYW55dGhpbmcuCisjaWZkZWYgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfWDg2X0dDQ19IXworCisvLyBJbmxpbmUgY3B1aWQgaW5zdHJ1Y3Rpb24uICBJbiBQSUMgY29tcGlsYXRpb25zLCAlZWJ4IGNvbnRhaW5zIHRoZSBhZGRyZXNzCisvLyBvZiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFRvIGF2b2lkIGJyZWFraW5nIHN1Y2ggZXhlY3V0YWJsZXMsIHRoaXMgY29kZQorLy8gbXVzdCBwcmVzZXJ2ZSB0aGF0IHJlZ2lzdGVyJ3MgdmFsdWUgYWNyb3NzIGNwdWlkIGluc3RydWN0aW9ucy4KKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBjcHVpZChhLCBiLCBjLCBkLCBpbnApIFwKKyAgYXNtKCJtb3YgJSVlYngsICUlZWRpXG4iICAgICBcCisgICAgICAiY3B1aWRcbiIgICAgICAgICAgICAgICAgXAorICAgICAgInhjaGcgJSVlZGksICUlZWJ4XG4iICAgIFwKKyAgICAgIDogIj1hIiAoYSksICI9RCIgKGIpLCAiPWMiIChjKSwgIj1kIiAoZCkgOiAiYSIgKGlucCkpCisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisjZGVmaW5lIGNwdWlkKGEsIGIsIGMsIGQsIGlucCkgXAorICBhc20oIm1vdiAlJXJieCwgJSVyZGlcbiIgICAgIFwKKyAgICAgICJjcHVpZFxuIiAgICAgICAgICAgICAgICBcCisgICAgICAieGNoZyAlJXJkaSwgJSVyYnhcbiIgICAgXAorICAgICAgOiAiPWEiIChhKSwgIj1EIiAoYiksICI9YyIgKGMpLCAiPWQiIChkKSA6ICJhIiAoaW5wKSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChjcHVpZCkgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHN0cnVjdCBvbmx5IG9uIHg4NgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBTZXQgdGhlIGZsYWdzIHNvIHRoYXQgY29kZSB3aWxsIHJ1biBjb3JyZWN0bHkgYW5kIGNvbnNlcnZhdGl2ZWx5LCBzbyBldmVuCisvLyBpZiB3ZSBoYXZlbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LCB3ZSdyZSBwcm9iYWJseSBzaW5nbGUgdGhyZWFkZWQsIGFuZCBvdXIKKy8vIGRlZmF1bHQgdmFsdWVzIHNob3VsZCBob3BlZnVsbHkgYmUgcHJldHR5IHNhZmUuCitzdHJ1Y3QgQXRvbWljT3BzX3g4NkNQVUZlYXR1cmVTdHJ1Y3QgQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMgPSB7CisgIGZhbHNlLCAgICAgICAgICAvLyBidWcgY2FuJ3QgZXhpc3QgYmVmb3JlIHByb2Nlc3Mgc3Bhd25zIG11bHRpcGxlIHRocmVhZHMKKyAgZmFsc2UsICAgICAgICAgIC8vIG5vIFNTRTIKK307CisKK25hbWVzcGFjZSB7CisKKy8vIEluaXRpYWxpemUgdGhlIEF0b21pY09wc19JbnRlcm5hbHg4NkNQVUZlYXR1cmVzIHN0cnVjdC4KK3ZvaWQgQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXNJbml0KCkgeworICB1aW50MzJfdCBlYXg7CisgIHVpbnQzMl90IGVieDsKKyAgdWludDMyX3QgZWN4OworICB1aW50MzJfdCBlZHg7CisKKyAgLy8gR2V0IHZlbmRvciBzdHJpbmcgKGlzc3VlIENQVUlEIHdpdGggZWF4ID0gMCkKKyAgY3B1aWQoZWF4LCBlYngsIGVjeCwgZWR4LCAwKTsKKyAgY2hhciB2ZW5kb3JbMTNdOworICBtZW1jcHkodmVuZG9yLCAmZWJ4LCA0KTsKKyAgbWVtY3B5KHZlbmRvciArIDQsICZlZHgsIDQpOworICBtZW1jcHkodmVuZG9yICsgOCwgJmVjeCwgNCk7CisgIHZlbmRvclsxMl0gPSAwOworCisgIC8vIGdldCBmZWF0dXJlIGZsYWdzIGluIGVjeC9lZHgsIGFuZCBmYW1pbHkvbW9kZWwgaW4gZWF4CisgIGNwdWlkKGVheCwgZWJ4LCBlY3gsIGVkeCwgMSk7CisKKyAgaW50IGZhbWlseSA9IChlYXggPj4gOCkgJiAweGY7ICAgICAgICAvLyBmYW1pbHkgYW5kIG1vZGVsIGZpZWxkcworICBpbnQgbW9kZWwgPSAoZWF4ID4+IDQpICYgMHhmOworICBpZiAoZmFtaWx5ID09IDB4ZikgeyAgICAgICAgICAgICAgICAgIC8vIHVzZSBleHRlbmRlZCBmYW1pbHkgYW5kIG1vZGVsIGZpZWxkcworICAgIGZhbWlseSArPSAoZWF4ID4+IDIwKSAmIDB4ZmY7CisgICAgbW9kZWwgKz0gKChlYXggPj4gMTYpICYgMHhmKSA8PCA0OworICB9CisKKyAgLy8gT3B0ZXJvbiBSZXYgRSBoYXMgYSBidWcgaW4gd2hpY2ggb24gdmVyeSByYXJlIG9jY2FzaW9ucyBhIGxvY2tlZAorICAvLyBpbnN0cnVjdGlvbiBkb2Vzbid0IGFjdCBhcyBhIHJlYWQtYWNxdWlyZSBiYXJyaWVyIGlmIGZvbGxvd2VkIGJ5IGEKKyAgLy8gbm9uLWxvY2tlZCByZWFkLW1vZGlmeS13cml0ZSBpbnN0cnVjdGlvbi4gIFJldiBGIGhhcyB0aGlzIGJ1ZyBpbgorICAvLyBwcmUtcmVsZWFzZSB2ZXJzaW9ucywgYnV0IG5vdCBpbiB2ZXJzaW9ucyByZWxlYXNlZCB0byBjdXN0b21lcnMsCisgIC8vIHNvIHdlIHRlc3Qgb25seSBmb3IgUmV2IEUsIHdoaWNoIGlzIGZhbWlseSAxNSwgbW9kZWwgMzIuLjYzIGluY2x1c2l2ZS4KKyAgaWYgKHN0cmNtcCh2ZW5kb3IsICJBdXRoZW50aWNBTUQiKSA9PSAwICYmICAgICAgIC8vIEFNRAorICAgICAgZmFtaWx5ID09IDE1ICYmCisgICAgICAzMiA8PSBtb2RlbCAmJiBtb2RlbCA8PSA2MykgeworICAgIEF0b21pY09wc19JbnRlcm5hbHg4NkNQVUZlYXR1cmVzLmhhc19hbWRfbG9ja19tYl9idWcgPSB0cnVlOworICB9IGVsc2UgeworICAgIEF0b21pY09wc19JbnRlcm5hbHg4NkNQVUZlYXR1cmVzLmhhc19hbWRfbG9ja19tYl9idWcgPSBmYWxzZTsKKyAgfQorCisgIC8vIGVkeCBiaXQgMjYgaXMgU1NFMiB3aGljaCB3ZSB1c2UgdG8gdGVsbCB1c2Ugd2hldGhlciB3ZSBjYW4gdXNlIG1mZW5jZQorICBBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlcy5oYXNfc3NlMiA9ICgoZWR4ID4+IDI2KSAmIDEpOworfQorCitjbGFzcyBBdG9taWNPcHN4ODZJbml0aWFsaXplciB7CisgcHVibGljOgorICBBdG9taWNPcHN4ODZJbml0aWFsaXplcigpIHsKKyAgICBBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlc0luaXQoKTsKKyAgfQorfTsKKworLy8gQSBnbG9iYWwgdG8gZ2V0IHVzZSBpbml0aWFsaXplZCBvbiBzdGFydHVwIHZpYSBzdGF0aWMgaW5pdGlhbGl6YXRpb24gOi8KK0F0b21pY09wc3g4NkluaXRpYWxpemVyIGdfaW5pdGVyOworCit9ICAvLyBuYW1lc3BhY2UKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBfX2kzODZfXworCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9HQ0NfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyNGRmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oCkBAIC0wLDAgKzEsMjkzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBUaGlzIGZpbGUgaXMgYW4gaW50ZXJuYWwgYXRvbWljIGltcGxlbWVudGF0aW9uLCB1c2UgYXRvbWljb3BzLmggaW5zdGVhZC4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19YODZfR0NDX0hfCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9HQ0NfSF8KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBzdHJ1Y3QgaXMgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgb2YgdGhpcyBtb2R1bGU7IGNsaWVudHMgbWF5IG5vdAorLy8gdXNlIGl0LgorLy8gRmVhdHVyZXMgb2YgdGhpcyB4ODYuICBWYWx1ZXMgbWF5IG5vdCBiZSBjb3JyZWN0IGJlZm9yZSBtYWluKCkgaXMgcnVuLAorLy8gYnV0IGFyZSBzZXQgY29uc2VydmF0aXZlbHkuCitzdHJ1Y3QgQXRvbWljT3BzX3g4NkNQVUZlYXR1cmVTdHJ1Y3QgeworICBib29sIGhhc19hbWRfbG9ja19tYl9idWc7ICAvLyBQcm9jZXNzb3IgaGFzIEFNRCBtZW1vcnktYmFycmllciBidWc7IGRvIGxmZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciBhY3F1aXJlIGNvbXBhcmUtYW5kLXN3YXAuCisgIGJvb2wgaGFzX3NzZTI7ICAgICAgICAgICAgIC8vIFByb2Nlc3NvciBoYXMgU1NFMi4KK307CitleHRlcm4gc3RydWN0IEF0b21pY09wc194ODZDUFVGZWF0dXJlU3RydWN0IEF0b21pY09wc19JbnRlcm5hbHg4NkNQVUZlYXR1cmVzOworCisjZGVmaW5lIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCkgX19hc21fXyBfX3ZvbGF0aWxlX18oIiIgOiA6IDogIm1lbW9yeSIpCisKKy8vIDMyLWJpdCBsb3ctbGV2ZWwgb3BlcmF0aW9ucyBvbiBhbnkgcGxhdGZvcm0uCisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgQXRvbWljMzIgcHJldjsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxvY2s7IGNtcHhjaGdsICUxLCUyIgorICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKHByZXYpCisgICAgICAgICAgICAgICAgICAgICAgIDogInEiIChuZXdfdmFsdWUpLCAibSIgKCpwdHIpLCAiMCIgKG9sZF92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgIHJldHVybiBwcmV2OworfQorCitpbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygieGNoZ2wgJTEsJTAiICAvLyBUaGUgbG9jayBwcmVmaXggaXMgaW1wbGljaXQgZm9yIHhjaGcuCisgICAgICAgICAgICAgICAgICAgICAgIDogIj1yIiAobmV3X3ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJtIiAoKnB0ciksICIwIiAobmV3X3ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgcmV0dXJuIG5ld192YWx1ZTsgIC8vIE5vdyBpdCdzIHRoZSBwcmV2aW91cyB2YWx1ZS4KK30KKworaW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIGluY3JlbWVudCkgeworICBBdG9taWMzMiB0ZW1wID0gaW5jcmVtZW50OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibG9jazsgeGFkZGwgJTAsJTEiCisgICAgICAgICAgICAgICAgICAgICAgIDogIityIiAodGVtcCksICIrbSIgKCpwdHIpCisgICAgICAgICAgICAgICAgICAgICAgIDogOiAibWVtb3J5Iik7CisgIC8vIHRlbXAgbm93IGhvbGRzIHRoZSBvbGQgdmFsdWUgb2YgKnB0cgorICByZXR1cm4gdGVtcCArIGluY3JlbWVudDsKK30KKworaW5saW5lIEF0b21pYzMyIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgaW5jcmVtZW50KSB7CisgIEF0b21pYzMyIHRlbXAgPSBpbmNyZW1lbnQ7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsb2NrOyB4YWRkbCAlMCwlMSIKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiK3IiICh0ZW1wKSwgIittIiAoKnB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgOiA6ICJtZW1vcnkiKTsKKyAgLy8gdGVtcCBub3cgaG9sZHMgdGhlIG9sZCB2YWx1ZSBvZiAqcHRyCisgIGlmIChBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlcy5oYXNfYW1kX2xvY2tfbWJfYnVnKSB7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworICB9CisgIHJldHVybiB0ZW1wICsgaW5jcmVtZW50OworfQorCitpbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIEF0b21pYzMyIHggPSBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7CisgIGlmIChBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlcy5oYXNfYW1kX2xvY2tfbWJfYnVnKSB7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworICB9CisgIHJldHVybiB4OworfQorCitpbmxpbmUgQXRvbWljMzIgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIHJldHVybiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7Cit9CisKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisKKy8vIDY0LWJpdCBpbXBsZW1lbnRhdGlvbnMgb2YgbWVtb3J5IGJhcnJpZXIgY2FuIGJlIHNpbXBsZXIsIGJlY2F1c2UgaXQKKy8vICJtZmVuY2UiIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3QuCitpbmxpbmUgdm9pZCBNZW1vcnlCYXJyaWVyKCkgeworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibWZlbmNlIiA6IDogOiAibWVtb3J5Iik7Cit9CisKK2lubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworICBNZW1vcnlCYXJyaWVyKCk7Cit9CisKKyNlbHNlCisKK2lubGluZSB2b2lkIE1lbW9yeUJhcnJpZXIoKSB7CisgIGlmIChBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlcy5oYXNfc3NlMikgeworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKKyAgfSBlbHNlIHsgIC8vIG1mZW5jZSBpcyBmYXN0ZXIgYnV0IG5vdCBwcmVzZW50IG9uIFBJSUkKKyAgICBBdG9taWMzMiB4ID0gMDsKKyAgICBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2UoJngsIDApOyAgLy8gYWN0cyBhcyBhIGJhcnJpZXIgb24gUElJSQorICB9Cit9CisKK2lubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgaWYgKEF0b21pY09wc19JbnRlcm5hbHg4NkNQVUZlYXR1cmVzLmhhc19zc2UyKSB7CisgICAgKnB0ciA9IHZhbHVlOworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKKyAgfSBlbHNlIHsKKyAgICBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2UocHRyLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdHMgYXMgYSBiYXJyaWVyIG9uIFBJSUkKKyAgfQorfQorI2VuZGlmCisKK2lubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgQVRPTUlDT1BTX0NPTVBJTEVSX0JBUlJJRVIoKTsKKyAgKnB0ciA9IHZhbHVlOyAgLy8gQW4geDg2IHN0b3JlIGFjdHMgYXMgYSByZWxlYXNlIGJhcnJpZXIuCisgIC8vIFNlZSBjb21tZW50cyBpbiBBdG9taWM2NCB2ZXJzaW9uIG9mIFJlbGVhc2VfU3RvcmUoKSwgYmVsb3cuCit9CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIHJldHVybiAqcHRyOworfQorCitpbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyAgQXRvbWljMzIgdmFsdWUgPSAqcHRyOyAgLy8gQW4geDg2IGxvYWQgYWN0cyBhcyBhIGFjcXVpcmUgYmFycmllci4KKyAgLy8gU2VlIGNvbW1lbnRzIGluIEF0b21pYzY0IHZlcnNpb24gb2YgUmVsZWFzZV9TdG9yZSgpLCBiZWxvdy4KKyAgQVRPTUlDT1BTX0NPTVBJTEVSX0JBUlJJRVIoKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCitpbmxpbmUgQXRvbWljMzIgUmVsZWFzZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyAgTWVtb3J5QmFycmllcigpOworICByZXR1cm4gKnB0cjsKK30KKworI2lmIGRlZmluZWQoX194ODZfNjRfXykKKworLy8gNjQtYml0IGxvdy1sZXZlbCBvcGVyYXRpb25zIG9uIDY0LWJpdCBwbGF0Zm9ybS4KKworaW5saW5lIEF0b21pYzY0IE5vQmFycmllcl9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgeworICBBdG9taWM2NCBwcmV2OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibG9jazsgY21weGNoZ3EgJTEsJTIiCisgICAgICAgICAgICAgICAgICAgICAgIDogIj1hIiAocHJldikKKyAgICAgICAgICAgICAgICAgICAgICAgOiAicSIgKG5ld192YWx1ZSksICJtIiAoKnB0ciksICIwIiAob2xkX3ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgcmV0dXJuIHByZXY7Cit9CisKK2lubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJ4Y2hncSAlMSwlMCIgIC8vIFRoZSBsb2NrIHByZWZpeCBpcyBpbXBsaWNpdCBmb3IgeGNoZy4KKyAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiIChuZXdfdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgIDogIm0iICgqcHRyKSwgIjAiIChuZXdfdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIpOworICByZXR1cm4gbmV3X3ZhbHVlOyAgLy8gTm93IGl0J3MgdGhlIHByZXZpb3VzIHZhbHVlLgorfQorCitpbmxpbmUgQXRvbWljNjQgTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgaW5jcmVtZW50KSB7CisgIEF0b21pYzY0IHRlbXAgPSBpbmNyZW1lbnQ7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsb2NrOyB4YWRkcSAlMCwlMSIKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiK3IiICh0ZW1wKSwgIittIiAoKnB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgOiA6ICJtZW1vcnkiKTsKKyAgLy8gdGVtcCBub3cgY29udGFpbnMgdGhlIHByZXZpb3VzIHZhbHVlIG9mICpwdHIKKyAgcmV0dXJuIHRlbXAgKyBpbmNyZW1lbnQ7Cit9CisKK2lubGluZSBBdG9taWM2NCBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgeworICBBdG9taWM2NCB0ZW1wID0gaW5jcmVtZW50OworICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibG9jazsgeGFkZHEgJTAsJTEiCisgICAgICAgICAgICAgICAgICAgICAgIDogIityIiAodGVtcCksICIrbSIgKCpwdHIpCisgICAgICAgICAgICAgICAgICAgICAgIDogOiAibWVtb3J5Iik7CisgIC8vIHRlbXAgbm93IGNvbnRhaW5zIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiAqcHRyCisgIGlmIChBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlcy5oYXNfYW1kX2xvY2tfbWJfYnVnKSB7CisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworICB9CisgIHJldHVybiB0ZW1wICsgaW5jcmVtZW50OworfQorCitpbmxpbmUgdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworfQorCitpbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsKKyAgTWVtb3J5QmFycmllcigpOworfQorCitpbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKSB7CisgIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7CisKKyAgKnB0ciA9IHZhbHVlOyAgLy8gQW4geDg2IHN0b3JlIGFjdHMgYXMgYSByZWxlYXNlIGJhcnJpZXIKKyAgICAgICAgICAgICAgICAgLy8gZm9yIGN1cnJlbnQgQU1EL0ludGVsIGNoaXBzIGFzIG9mIEphbiAyMDA4LgorICAgICAgICAgICAgICAgICAvLyBTZWUgYWxzbyBBY3F1aXJlX0xvYWQoKSwgYmVsb3cuCisKKyAgLy8gV2hlbiBuZXcgY2hpcHMgY29tZSBvdXQsIGNoZWNrOgorICAvLyAgSUEtMzIgSW50ZWwgQXJjaGl0ZWN0dXJlIFNvZnR3YXJlIERldmVsb3BlcidzIE1hbnVhbCwgVm9sdW1lIDM6CisgIC8vICBTeXN0ZW0gUHJvZ3JhbW1pbmcgR3VpZGUsIENoYXRwZXIgNzogTXVsdGlwbGUtcHJvY2Vzc29yIG1hbmFnZW1lbnQsCisgIC8vICBTZWN0aW9uIDcuMiwgTWVtb3J5IE9yZGVyaW5nLgorICAvLyBMYXN0IHNlZW4gYXQ6CisgIC8vICAgaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vZGVzaWduL3BlbnRpdW00L21hbnVhbHMvaW5kZXhfbmV3Lmh0bQorICAvLworICAvLyB4ODYgc3RvcmVzL2xvYWRzIGZhaWwgdG8gYWN0IGFzIGJhcnJpZXJzIGZvciBhIGZldyBpbnN0cnVjdGlvbnMgKGNsZmx1c2gKKyAgLy8gbWFza21vdmRxdSBtYXNrbW92cSBtb3ZudGRxIG1vdm50aSBtb3ZudHBkIG1vdm50cHMgbW92bnRxKSBidXQgdGhlc2UgYXJlCisgIC8vIG5vdCBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLCBhbmQgYXJlIHJhcmUuICBVc2VycyBvZiB0aGVzZSBpbnN0cnVjdGlvbnMKKyAgLy8gbmVlZCB0byBrbm93IGFib3V0IGNhY2hlIGJlaGF2aW91ciBpbiBhbnkgY2FzZSBzaW5jZSBhbGwgb2YgdGhlc2UgaW52b2x2ZQorICAvLyBlaXRoZXIgZmx1c2hpbmcgY2FjaGUgbGluZXMgb3Igbm9uLXRlbXBvcmFsIGNhY2hlIGhpbnRzLgorfQorCitpbmxpbmUgQXRvbWljNjQgTm9CYXJyaWVyX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljNjQqIHB0cikgeworICByZXR1cm4gKnB0cjsKK30KKworaW5saW5lIEF0b21pYzY0IEFjcXVpcmVfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7CisgIEF0b21pYzY0IHZhbHVlID0gKnB0cjsgIC8vIEFuIHg4NiBsb2FkIGFjdHMgYXMgYSBhY3F1aXJlIGJhcnJpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBjdXJyZW50IEFNRC9JbnRlbCBjaGlwcyBhcyBvZiBKYW4gMjAwOC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGFsc28gUmVsZWFzZV9TdG9yZSgpLCBhYm92ZS4KKyAgQVRPTUlDT1BTX0NPTVBJTEVSX0JBUlJJRVIoKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCitpbmxpbmUgQXRvbWljNjQgUmVsZWFzZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpIHsKKyAgTWVtb3J5QmFycmllcigpOworICByZXR1cm4gKnB0cjsKK30KKworaW5saW5lIEF0b21pYzY0IEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgeworICBBdG9taWM2NCB4ID0gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworICBpZiAoQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX2FtZF9sb2NrX21iX2J1ZykgeworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKKyAgfQorICByZXR1cm4geDsKK30KKworaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCisjZW5kaWYgIC8vIGRlZmluZWQoX194ODZfNjRfXykKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI3VuZGVmIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfWDg2X0dDQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2NmE4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MKQEAgLTAsMCArMSwxMTIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoZSBjb21waWxhdGlvbiBvZiBleHRlbnNpb25fc2V0LmNjIGZhaWxzIHdoZW4gd2luZG93cy5oIGlzIGluY2x1ZGVkLgorLy8gVGhlcmVmb3JlIHdlIG1vdmUgdGhlIGNvZGUgZGVwZW5kaW5nIG9uIHdpbmRvd3MuaCB0byB0aGlzIHNlcGFyYXRlIGNjIGZpbGUuCisKKy8vIERvbid0IGNvbXBpbGUgdGhpcyBmaWxlIGZvciBwZW9wbGUgbm90IGNvbmNlcm5lZCBhYm91dCB0aHJlYWQgc2FmZXR5LgorI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEU0FGRVRZCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmg+CisKKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19YODZfTVNWQ19IXworCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitpbmxpbmUgdm9pZCBNZW1vcnlCYXJyaWVyKCkgeworICAvLyBXZSB1c2UgTWVtb3J5QmFycmllciBmcm9tIFdpbk5ULmgKKyAgOjpNZW1vcnlCYXJyaWVyKCk7Cit9CisKK0F0b21pYzMyIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyAgTE9ORyByZXN1bHQgPSBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgTE9ORyo+KHB0ciksCisgICAgICBzdGF0aWNfY2FzdDxMT05HPihuZXdfdmFsdWUpLAorICAgICAgc3RhdGljX2Nhc3Q8TE9ORz4ob2xkX3ZhbHVlKSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxBdG9taWMzMj4ocmVzdWx0KTsKK30KKworQXRvbWljMzIgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIExPTkcgcmVzdWx0ID0gSW50ZXJsb2NrZWRFeGNoYW5nZSgKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgTE9ORyo+KHB0ciksCisgICAgICBzdGF0aWNfY2FzdDxMT05HPihuZXdfdmFsdWUpKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pYzMyPihyZXN1bHQpOworfQorCitBdG9taWMzMiBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgaW5jcmVtZW50KSB7CisgIHJldHVybiBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBMT05HKj4ocHRyKSwKKyAgICAgIHN0YXRpY19jYXN0PExPTkc+KGluY3JlbWVudCkpICsgaW5jcmVtZW50OworfQorCisjaWYgZGVmaW5lZChfV0lONjQpCisKKy8vIDY0LWJpdCBsb3ctbGV2ZWwgb3BlcmF0aW9ucyBvbiA2NC1iaXQgcGxhdGZvcm0uCisKK0F0b21pYzY0IE5vQmFycmllcl9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgUFZPSUQgcmVzdWx0ID0gSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgUFZPSUQqPihwdHIpLAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UFZPSUQ+KG5ld192YWx1ZSksIHJlaW50ZXJwcmV0X2Nhc3Q8UFZPSUQ+KG9sZF92YWx1ZSkpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxBdG9taWM2ND4ocmVzdWx0KTsKK30KKworQXRvbWljNjQgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7CisgIFBWT0lEIHJlc3VsdCA9IEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgUFZPSUQqPihwdHIpLAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UFZPSUQ+KG5ld192YWx1ZSkpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxBdG9taWM2ND4ocmVzdWx0KTsKK30KKworQXRvbWljNjQgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgeworICByZXR1cm4gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBMT05HTE9ORyo+KHB0ciksCisgICAgICBzdGF0aWNfY2FzdDxMT05HTE9ORz4oaW5jcmVtZW50KSkgKyBpbmNyZW1lbnQ7Cit9CisKKyNlbmRpZiAgLy8gZGVmaW5lZChfV0lONjQpCisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfWDg2X01TVkNfSF8KKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRFNBRkVUWQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOTg2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIFRoaXMgZmlsZSBpcyBhbiBpbnRlcm5hbCBhdG9taWMgaW1wbGVtZW50YXRpb24sIHVzZSBhdG9taWNvcHMuaCBpbnN0ZWFkLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9NU1ZDX0hfCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9NU1ZDX0hfCisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2lubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyAgcmV0dXJuIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHB0ciwgaW5jcmVtZW50KTsKK30KKworI2lmICEoZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTQwMCkKKyNlcnJvciAiV2UgcmVxdWlyZSBhdCBsZWFzdCB2czIwMDUgZm9yIE1lbW9yeUJhcnJpZXIiCisjZW5kaWYKKworaW5saW5lIEF0b21pYzMyIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCitpbmxpbmUgQXRvbWljMzIgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisgIHJldHVybiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgeworICAqcHRyID0gdmFsdWU7Cit9CisKK2lubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHB0ciwgdmFsdWUpOworICAgICAgICAgICAgICAvLyBhY3RzIGFzIGEgYmFycmllciBpbiB0aGlzIGltcGxlbWVudGF0aW9uCit9CisKK2lubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOyAgLy8gd29ya3Mgdy9vIGJhcnJpZXIgZm9yIGN1cnJlbnQgSW50ZWwgY2hpcHMgYXMgb2YgSnVuZSAyMDA1CisgIC8vIFNlZSBjb21tZW50cyBpbiBBdG9taWM2NCB2ZXJzaW9uIG9mIFJlbGVhc2VfU3RvcmUoKSBiZWxvdy4KK30KKworaW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyAgcmV0dXJuICpwdHI7Cit9CisKK2lubGluZSBBdG9taWMzMiBBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgeworICBBdG9taWMzMiB2YWx1ZSA9ICpwdHI7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKKyNpZiBkZWZpbmVkKF9XSU42NCkKKworLy8gNjQtYml0IGxvdy1sZXZlbCBvcGVyYXRpb25zIG9uIDY0LWJpdCBwbGF0Zm9ybS4KKworaW5saW5lIEF0b21pYzY0IE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgeworICByZXR1cm4gQmFycmllcl9BdG9taWNJbmNyZW1lbnQocHRyLCBpbmNyZW1lbnQpOworfQorCitpbmxpbmUgdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworfQorCitpbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKSB7CisgIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZShwdHIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgLy8gYWN0cyBhcyBhIGJhcnJpZXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgorfQorCitpbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsgIC8vIHdvcmtzIHcvbyBiYXJyaWVyIGZvciBjdXJyZW50IEludGVsIGNoaXBzIGFzIG9mIEp1bmUgMjAwNQorCisgIC8vIFdoZW4gbmV3IGNoaXBzIGNvbWUgb3V0LCBjaGVjazoKKyAgLy8gIElBLTMyIEludGVsIEFyY2hpdGVjdHVyZSBTb2Z0d2FyZSBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzOgorICAvLyAgU3lzdGVtIFByb2dyYW1taW5nIEd1aWRlLCBDaGF0cGVyIDc6IE11bHRpcGxlLXByb2Nlc3NvciBtYW5hZ2VtZW50LAorICAvLyAgU2VjdGlvbiA3LjIsIE1lbW9yeSBPcmRlcmluZy4KKyAgLy8gTGFzdCBzZWVuIGF0OgorICAvLyAgIGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9wZW50aXVtNC9tYW51YWxzL2luZGV4X25ldy5odG0KK30KKworaW5saW5lIEF0b21pYzY0IE5vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpIHsKKyAgcmV0dXJuICpwdHI7Cit9CisKK2lubGluZSBBdG9taWM2NCBBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljNjQqIHB0cikgeworICBBdG9taWM2NCB2YWx1ZSA9ICpwdHI7CisgIHJldHVybiB2YWx1ZTsKK30KKworaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgcmV0dXJuICpwdHI7Cit9CisKK2lubGluZSBBdG9taWM2NCBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgcmV0dXJuIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKK30KKworaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgeworICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCisjZW5kaWYgIC8vIGRlZmluZWQoX1dJTjY0KQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9NU1ZDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxNWJlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYwpAQCAtMCwwICsxLDM3NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gIC8vIFdlIG9ubHkgbmVlZCBtaW5pbWFsIGluY2x1ZGVzCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYgICAgLy8gc2VlIGNvbW1lbnQgaW4gc3RydXRpbC5jYworI2VsaWYgZGVmaW5lZChIQVZFX1BUSFJFQUQpCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2Vsc2UKKyNlcnJvciAiTm8gc3VpdGFibGUgdGhyZWFkaW5nIGxpYnJhcnkgYXZhaWxhYmxlLiIKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3ZvaWQgVmVyaWZ5VmVyc2lvbihpbnQgaGVhZGVyVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICBpbnQgbWluTGlicmFyeVZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgaWYgKEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDwgbWluTGlicmFyeVZlcnNpb24pIHsKKyAgICAvLyBMaWJyYXJ5IGlzIHRvbyBvbGQgZm9yIGhlYWRlcnMuCisgICAgR09PR0xFX0xPRyhGQVRBTCkKKyAgICAgIDw8ICJUaGlzIHByb2dyYW0gcmVxdWlyZXMgdmVyc2lvbiAiIDw8IFZlcnNpb25TdHJpbmcobWluTGlicmFyeVZlcnNpb24pCisgICAgICA8PCAiIG9mIHRoZSBQcm90b2NvbCBCdWZmZXIgcnVudGltZSBsaWJyYXJ5LCBidXQgdGhlIGluc3RhbGxlZCB2ZXJzaW9uICIKKyAgICAgICAgICJpcyAiIDw8IFZlcnNpb25TdHJpbmcoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04pIDw8ICIuICBQbGVhc2UgdXBkYXRlICIKKyAgICAgICAgICJ5b3VyIGxpYnJhcnkuICBJZiB5b3UgY29tcGlsZWQgdGhlIHByb2dyYW0geW91cnNlbGYsIG1ha2Ugc3VyZSB0aGF0ICIKKyAgICAgICAgICJ5b3VyIGhlYWRlcnMgYXJlIGZyb20gdGhlIHNhbWUgdmVyc2lvbiBvZiBQcm90b2NvbCBCdWZmZXJzIGFzIHlvdXIgIgorICAgICAgICAgImxpbmstdGltZSBsaWJyYXJ5LiAgKFZlcnNpb24gdmVyaWZpY2F0aW9uIGZhaWxlZCBpbiBcIiIKKyAgICAgIDw8IGZpbGVuYW1lIDw8ICJcIi4pIjsKKyAgfQorICBpZiAoaGVhZGVyVmVyc2lvbiA8IGtNaW5IZWFkZXJWZXJzaW9uRm9yTGlicmFyeSkgeworICAgIC8vIEhlYWRlcnMgYXJlIHRvbyBvbGQgZm9yIGxpYnJhcnkuCisgICAgR09PR0xFX0xPRyhGQVRBTCkKKyAgICAgIDw8ICJUaGlzIHByb2dyYW0gd2FzIGNvbXBpbGVkIGFnYWluc3QgdmVyc2lvbiAiCisgICAgICA8PCBWZXJzaW9uU3RyaW5nKGhlYWRlclZlcnNpb24pIDw8ICIgb2YgdGhlIFByb3RvY29sIEJ1ZmZlciBydW50aW1lICIKKyAgICAgICAgICJsaWJyYXJ5LCB3aGljaCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiAoIgorICAgICAgPDwgVmVyc2lvblN0cmluZyhHT09HTEVfUFJPVE9CVUZfVkVSU0lPTikgPDwgICIpLiAgQ29udGFjdCB0aGUgcHJvZ3JhbSAiCisgICAgICAgICAiYXV0aG9yIGZvciBhbiB1cGRhdGUuICBJZiB5b3UgY29tcGlsZWQgdGhlIHByb2dyYW0geW91cnNlbGYsIG1ha2UgIgorICAgICAgICAgInN1cmUgdGhhdCB5b3VyIGhlYWRlcnMgYXJlIGZyb20gdGhlIHNhbWUgdmVyc2lvbiBvZiBQcm90b2NvbCBCdWZmZXJzICIKKyAgICAgICAgICJhcyB5b3VyIGxpbmstdGltZSBsaWJyYXJ5LiAgKFZlcnNpb24gdmVyaWZpY2F0aW9uIGZhaWxlZCBpbiBcIiIKKyAgICAgIDw8IGZpbGVuYW1lIDw8ICJcIi4pIjsKKyAgfQorfQorCitzdHJpbmcgVmVyc2lvblN0cmluZyhpbnQgdmVyc2lvbikgeworICBpbnQgbWFqb3IgPSB2ZXJzaW9uIC8gMTAwMDAwMDsKKyAgaW50IG1pbm9yID0gKHZlcnNpb24gLyAxMDAwKSAlIDEwMDA7CisgIGludCBtaWNybyA9IHZlcnNpb24gJSAxMDAwOworCisgIC8vIDEyOCBieXRlcyBzaG91bGQgYWx3YXlzIGJlIGVub3VnaCwgYnV0IHdlIHVzZSBzbnByaW50ZigpIGFueXdheSB0byBiZQorICAvLyBzYWZlLgorICBjaGFyIGJ1ZmZlclsxMjhdOworICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWQuJWQuJWQiLCBtYWpvciwgbWlub3IsIG1pY3JvKTsKKworICAvLyBHdWFyZCBhZ2FpbnN0IGJyb2tlbiBNU1ZDIHNucHJpbnRmKCkuCisgIGJ1ZmZlcltzaXplb2YoYnVmZmVyKS0xXSA9ICdcMCc7CisKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGVtdWxhdGVzIGdvb2dsZTMvYmFzZS9sb2dnaW5nLmNjCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3ZvaWQgRGVmYXVsdExvZ0hhbmRsZXIoTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBsZXZlbF9uYW1lc1tdID0geyAiSU5GTyIsICJXQVJOSU5HIiwgIkVSUk9SIiwgIkZBVEFMIiB9OworCisgIC8vIFdlIHVzZSBmcHJpbnRmKCkgaW5zdGVhZCBvZiBjZXJyIGJlY2F1c2Ugd2Ugd2FudCB0aGlzIHRvIHdvcmsgYXQgc3RhdGljCisgIC8vIGluaXRpYWxpemF0aW9uIHRpbWUuCisgIGZwcmludGYoc3RkZXJyLCAibGlicHJvdG9idWYgJXMgJXM6JWRdICVzXG4iLAorICAgICAgICAgIGxldmVsX25hbWVzW2xldmVsXSwgZmlsZW5hbWUsIGxpbmUsIG1lc3NhZ2UuY19zdHIoKSk7CisgIGZmbHVzaChzdGRlcnIpOyAgLy8gTmVlZGVkIG9uIE1TVkMuCit9CisKK3ZvaWQgTnVsbExvZ0hhbmRsZXIoTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgIC8vIE5vdGhpbmcuCit9CisKK3N0YXRpYyBMb2dIYW5kbGVyKiBsb2dfaGFuZGxlcl8gPSAmRGVmYXVsdExvZ0hhbmRsZXI7CitzdGF0aWMgaW50IGxvZ19zaWxlbmNlcl9jb3VudF8gPSAwOworCitzdGF0aWMgTXV0ZXgqIGxvZ19zaWxlbmNlcl9jb3VudF9tdXRleF8gPSBOVUxMOworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShsb2dfc2lsZW5jZXJfY291bnRfaW5pdF8pOworCit2b2lkIERlbGV0ZUxvZ1NpbGVuY2VyQ291bnQoKSB7CisgIGRlbGV0ZSBsb2dfc2lsZW5jZXJfY291bnRfbXV0ZXhfOworICBsb2dfc2lsZW5jZXJfY291bnRfbXV0ZXhfID0gTlVMTDsKK30KK3ZvaWQgSW5pdExvZ1NpbGVuY2VyQ291bnQoKSB7CisgIGxvZ19zaWxlbmNlcl9jb3VudF9tdXRleF8gPSBuZXcgTXV0ZXg7CisgIE9uU2h1dGRvd24oJkRlbGV0ZUxvZ1NpbGVuY2VyQ291bnQpOworfQordm9pZCBJbml0TG9nU2lsZW5jZXJDb3VudE9uY2UoKSB7CisgIEdvb2dsZU9uY2VJbml0KCZsb2dfc2lsZW5jZXJfY291bnRfaW5pdF8sICZJbml0TG9nU2lsZW5jZXJDb3VudCk7Cit9CisKK0xvZ01lc3NhZ2UmIExvZ01lc3NhZ2U6Om9wZXJhdG9yPDwoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICBtZXNzYWdlXyArPSB2YWx1ZTsKKyAgcmV0dXJuICp0aGlzOworfQorCitMb2dNZXNzYWdlJiBMb2dNZXNzYWdlOjpvcGVyYXRvcjw8KGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIG1lc3NhZ2VfICs9IHZhbHVlOworICByZXR1cm4gKnRoaXM7Cit9CisKKy8vIFNpbmNlIHRoaXMgaXMganVzdCBmb3IgbG9nZ2luZywgd2UgZG9uJ3QgY2FyZSBpZiB0aGUgY3VycmVudCBsb2NhbGUgY2hhbmdlcworLy8gdGhlIHJlc3VsdHMgLS0gaW4gZmFjdCwgd2UgcHJvYmFibHkgcHJlZmVyIHRoYXQuICBTbyB3ZSB1c2Ugc25wcmludGYoKQorLy8gaW5zdGVhZCBvZiBTaW1wbGUqdG9hKCkuCisjdW5kZWYgREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IKKyNkZWZpbmUgREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IoVFlQRSwgRk9STUFUKSAgICAgICAgICAgICAgICAgICAgICAgXAorICBMb2dNZXNzYWdlJiBMb2dNZXNzYWdlOjpvcGVyYXRvcjw8KFRZUEUgdmFsdWUpIHsgICAgICAgICAgICAgICAgICBcCisgICAgLyogMTI4IGJ5dGVzIHNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciBhbnkgb2YgdGhlIHByaW1pdGl2ZSAqLyAgIFwKKyAgICAvKiB2YWx1ZXMgd2hpY2ggd2UgcHJpbnQgd2l0aCB0aGlzLCBidXQgd2VsbCB1c2Ugc25wcmludGYoKSAqLyAgXAorICAgIC8qIGFueXdheSB0byBiZSBleHRyYSBzYWZlLiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhciBidWZmZXJbMTI4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBGT1JNQVQsIHZhbHVlKTsgICAgICAgICAgICAgICAgXAorICAgIC8qIEd1YXJkIGFnYWluc3QgYnJva2VuIE1TVkMgc25wcmludGYoKS4gKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgYnVmZmVyW3NpemVvZihidWZmZXIpLTFdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZXNzYWdlXyArPSBidWZmZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAqdGhpczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IoY2hhciAgICAgICAgICwgIiVjIiApCitERUNMQVJFX1NUUkVBTV9PUEVSQVRPUihpbnQgICAgICAgICAgLCAiJWQiICkKK0RFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKHVpbnQgICAgICAgICAsICIldSIgKQorREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IobG9uZyAgICAgICAgICwgIiVsZCIpCitERUNMQVJFX1NUUkVBTV9PUEVSQVRPUih1bnNpZ25lZCBsb25nLCAiJWx1IikKK0RFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKGRvdWJsZSAgICAgICAsICIlZyIgKQorI3VuZGVmIERFQ0xBUkVfU1RSRUFNX09QRVJBVE9SCisKK0xvZ01lc3NhZ2U6OkxvZ01lc3NhZ2UoTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbGluZSkKKyAgOiBsZXZlbF8obGV2ZWwpLCBmaWxlbmFtZV8oZmlsZW5hbWUpLCBsaW5lXyhsaW5lKSB7fQorTG9nTWVzc2FnZTo6fkxvZ01lc3NhZ2UoKSB7fQorCit2b2lkIExvZ01lc3NhZ2U6OkZpbmlzaCgpIHsKKyAgYm9vbCBzdXBwcmVzcyA9IGZhbHNlOworCisgIGlmIChsZXZlbF8gIT0gTE9HTEVWRUxfRkFUQUwpIHsKKyAgICBJbml0TG9nU2lsZW5jZXJDb3VudE9uY2UoKTsKKyAgICBNdXRleExvY2sgbG9jayhsb2dfc2lsZW5jZXJfY291bnRfbXV0ZXhfKTsKKyAgICBzdXBwcmVzcyA9IGludGVybmFsOjpsb2dfc2lsZW5jZXJfY291bnRfID4gMDsKKyAgfQorCisgIGlmICghc3VwcHJlc3MpIHsKKyAgICBpbnRlcm5hbDo6bG9nX2hhbmRsZXJfKGxldmVsXywgZmlsZW5hbWVfLCBsaW5lXywgbWVzc2FnZV8pOworICB9CisKKyAgaWYgKGxldmVsXyA9PSBMT0dMRVZFTF9GQVRBTCkgeworI2lmZGVmIFBST1RPQlVGX1VTRV9FWENFUFRJT05TCisgICAgdGhyb3cgRmF0YWxFeGNlcHRpb24oZmlsZW5hbWVfLCBsaW5lXywgbWVzc2FnZV8pOworI2Vsc2UKKyAgICBhYm9ydCgpOworI2VuZGlmCisgIH0KK30KKwordm9pZCBMb2dGaW5pc2hlcjo6b3BlcmF0b3I9KExvZ01lc3NhZ2UmIG90aGVyKSB7CisgIG90aGVyLkZpbmlzaCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworTG9nSGFuZGxlciogU2V0TG9nSGFuZGxlcihMb2dIYW5kbGVyKiBuZXdfZnVuYykgeworICBMb2dIYW5kbGVyKiBvbGQgPSBpbnRlcm5hbDo6bG9nX2hhbmRsZXJfOworICBpZiAob2xkID09ICZpbnRlcm5hbDo6TnVsbExvZ0hhbmRsZXIpIHsKKyAgICBvbGQgPSBOVUxMOworICB9CisgIGlmIChuZXdfZnVuYyA9PSBOVUxMKSB7CisgICAgaW50ZXJuYWw6OmxvZ19oYW5kbGVyXyA9ICZpbnRlcm5hbDo6TnVsbExvZ0hhbmRsZXI7CisgIH0gZWxzZSB7CisgICAgaW50ZXJuYWw6OmxvZ19oYW5kbGVyXyA9IG5ld19mdW5jOworICB9CisgIHJldHVybiBvbGQ7Cit9CisKK0xvZ1NpbGVuY2VyOjpMb2dTaWxlbmNlcigpIHsKKyAgaW50ZXJuYWw6OkluaXRMb2dTaWxlbmNlckNvdW50T25jZSgpOworICBNdXRleExvY2sgbG9jayhpbnRlcm5hbDo6bG9nX3NpbGVuY2VyX2NvdW50X211dGV4Xyk7CisgICsraW50ZXJuYWw6OmxvZ19zaWxlbmNlcl9jb3VudF87Cit9OworCitMb2dTaWxlbmNlcjo6fkxvZ1NpbGVuY2VyKCkgeworICBpbnRlcm5hbDo6SW5pdExvZ1NpbGVuY2VyQ291bnRPbmNlKCk7CisgIE11dGV4TG9jayBsb2NrKGludGVybmFsOjpsb2dfc2lsZW5jZXJfY291bnRfbXV0ZXhfKTsKKyAgLS1pbnRlcm5hbDo6bG9nX3NpbGVuY2VyX2NvdW50XzsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGVtdWxhdGVzIGdvb2dsZTMvYmFzZS9jYWxsYmFjay5jYworCitDbG9zdXJlOjp+Q2xvc3VyZSgpIHt9CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7IEZ1bmN0aW9uQ2xvc3VyZTA6On5GdW5jdGlvbkNsb3N1cmUwKCkge30gfQorCit2b2lkIERvTm90aGluZygpIHt9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGVtdWxhdGVzIGdvb2dsZTMvYmFzZS9tdXRleC5jYworCisjaWZkZWYgX1dJTjMyCisKK3N0cnVjdCBNdXRleDo6SW50ZXJuYWwgeworICBDUklUSUNBTF9TRUNUSU9OIG11dGV4OworI2lmbmRlZiBOREVCVUcKKyAgLy8gVXNlZCBvbmx5IHRvIGltcGxlbWVudCBBc3NlcnRIZWxkKCkuCisgIERXT1JEIHRocmVhZF9pZDsKKyNlbmRpZgorfTsKKworTXV0ZXg6Ok11dGV4KCkKKyAgOiBtSW50ZXJuYWwobmV3IEludGVybmFsKSB7CisgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJm1JbnRlcm5hbC0+bXV0ZXgpOworfQorCitNdXRleDo6fk11dGV4KCkgeworICBEZWxldGVDcml0aWNhbFNlY3Rpb24oJm1JbnRlcm5hbC0+bXV0ZXgpOworICBkZWxldGUgbUludGVybmFsOworfQorCit2b2lkIE11dGV4OjpMb2NrKCkgeworICBFbnRlckNyaXRpY2FsU2VjdGlvbigmbUludGVybmFsLT5tdXRleCk7CisjaWZuZGVmIE5ERUJVRworICBtSW50ZXJuYWwtPnRocmVhZF9pZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworI2VuZGlmCit9CisKK3ZvaWQgTXV0ZXg6OlVubG9jaygpIHsKKyNpZm5kZWYgTkRFQlVHCisgIG1JbnRlcm5hbC0+dGhyZWFkX2lkID0gMDsKKyNlbmRpZgorICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbUludGVybmFsLT5tdXRleCk7Cit9CisKK3ZvaWQgTXV0ZXg6OkFzc2VydEhlbGQoKSB7CisjaWZuZGVmIE5ERUJVRworICBHT09HTEVfRENIRUNLX0VRKG1JbnRlcm5hbC0+dGhyZWFkX2lkLCBHZXRDdXJyZW50VGhyZWFkSWQoKSk7CisjZW5kaWYKK30KKworI2VsaWYgZGVmaW5lZChIQVZFX1BUSFJFQUQpCisKK3N0cnVjdCBNdXRleDo6SW50ZXJuYWwgeworICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Cit9OworCitNdXRleDo6TXV0ZXgoKQorICA6IG1JbnRlcm5hbChuZXcgSW50ZXJuYWwpIHsKKyAgcHRocmVhZF9tdXRleF9pbml0KCZtSW50ZXJuYWwtPm11dGV4LCBOVUxMKTsKK30KKworTXV0ZXg6On5NdXRleCgpIHsKKyAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtSW50ZXJuYWwtPm11dGV4KTsKKyAgZGVsZXRlIG1JbnRlcm5hbDsKK30KKwordm9pZCBNdXRleDo6TG9jaygpIHsKKyAgaW50IHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbUludGVybmFsLT5tdXRleCk7CisgIGlmIChyZXN1bHQgIT0gMCkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJwdGhyZWFkX211dGV4X2xvY2s6ICIgPDwgc3RyZXJyb3IocmVzdWx0KTsKKyAgfQorfQorCit2b2lkIE11dGV4OjpVbmxvY2soKSB7CisgIGludCByZXN1bHQgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbUludGVybmFsLT5tdXRleCk7CisgIGlmIChyZXN1bHQgIT0gMCkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJwdGhyZWFkX211dGV4X3VubG9jazogIiA8PCBzdHJlcnJvcihyZXN1bHQpOworICB9Cit9CisKK3ZvaWQgTXV0ZXg6OkFzc2VydEhlbGQoKSB7CisgIC8vIHB0aHJlYWRzIGRvc24ndCBwcm92aWRlIGEgd2F5IHRvIGNoZWNrIHdoaWNoIHRocmVhZCBob2xkcyB0aGUgbXV0ZXguCisgIC8vIFRPRE8oa2VudG9uKTogIE1heWJlIGtlZXAgdHJhY2sgb2YgbG9ja2luZyB0aHJlYWQgSUQgbGlrZSB3aXRoIFdJTjMyPworfQorCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gU2h1dGRvd24gc3VwcG9ydC4KKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordHlwZWRlZiB2b2lkIE9uU2h1dGRvd25GdW5jKCk7Cit2ZWN0b3I8dm9pZCAoKikoKT4qIHNodXRkb3duX2Z1bmN0aW9ucyA9IE5VTEw7CitNdXRleCogc2h1dGRvd25fZnVuY3Rpb25zX211dGV4ID0gTlVMTDsKK0dPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0Uoc2h1dGRvd25fZnVuY3Rpb25zX2luaXQpOworCit2b2lkIEluaXRTaHV0ZG93bkZ1bmN0aW9ucygpIHsKKyAgc2h1dGRvd25fZnVuY3Rpb25zID0gbmV3IHZlY3Rvcjx2b2lkICgqKSgpPjsKKyAgc2h1dGRvd25fZnVuY3Rpb25zX211dGV4ID0gbmV3IE11dGV4OworfQorCitpbmxpbmUgdm9pZCBJbml0U2h1dGRvd25GdW5jdGlvbnNPbmNlKCkgeworICBHb29nbGVPbmNlSW5pdCgmc2h1dGRvd25fZnVuY3Rpb25zX2luaXQsICZJbml0U2h1dGRvd25GdW5jdGlvbnMpOworfQorCit2b2lkIE9uU2h1dGRvd24odm9pZCAoKmZ1bmMpKCkpIHsKKyAgSW5pdFNodXRkb3duRnVuY3Rpb25zT25jZSgpOworICBNdXRleExvY2sgbG9jayhzaHV0ZG93bl9mdW5jdGlvbnNfbXV0ZXgpOworICBzaHV0ZG93bl9mdW5jdGlvbnMtPnB1c2hfYmFjayhmdW5jKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK3ZvaWQgU2h1dGRvd25Qcm90b2J1ZkxpYnJhcnkoKSB7CisgIGludGVybmFsOjpJbml0U2h1dGRvd25GdW5jdGlvbnNPbmNlKCk7CisKKyAgLy8gV2UgZG9uJ3QgbmVlZCB0byBsb2NrIHNodXRkb3duX2Z1bmN0aW9uc19tdXRleCBiZWNhdXNlIGl0J3MgdXAgdG8gdGhlCisgIC8vIGNhbGxlciB0byBtYWtlIHN1cmUgdGhhdCBubyBvbmUgaXMgdXNpbmcgdGhlIGxpYnJhcnkgYmVmb3JlIHRoaXMgaXMKKyAgLy8gY2FsbGVkLgorCisgIC8vIE1ha2UgaXQgc2FmZSB0byBjYWxsIHRoaXMgbXVsdGlwbGUgdGltZXMuCisgIGlmIChpbnRlcm5hbDo6c2h1dGRvd25fZnVuY3Rpb25zID09IE5VTEwpIHJldHVybjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGludGVybmFsOjpzaHV0ZG93bl9mdW5jdGlvbnMtPnNpemUoKTsgaSsrKSB7CisgICAgaW50ZXJuYWw6OnNodXRkb3duX2Z1bmN0aW9ucy0+YXQoaSkoKTsKKyAgfQorICBkZWxldGUgaW50ZXJuYWw6OnNodXRkb3duX2Z1bmN0aW9uczsKKyAgaW50ZXJuYWw6OnNodXRkb3duX2Z1bmN0aW9ucyA9IE5VTEw7CisgIGRlbGV0ZSBpbnRlcm5hbDo6c2h1dGRvd25fZnVuY3Rpb25zX211dGV4OworICBpbnRlcm5hbDo6c2h1dGRvd25fZnVuY3Rpb25zX211dGV4ID0gTlVMTDsKK30KKworI2lmZGVmIFBST1RPQlVGX1VTRV9FWENFUFRJT05TCitGYXRhbEV4Y2VwdGlvbjo6fkZhdGFsRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorCitjb25zdCBjaGFyKiBGYXRhbEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IHRocm93KCkgeworICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmZDE3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oCkBAIC0wLDAgKzEsMTIxNiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKSBhbmQgb3RoZXJzCisvLworLy8gQ29udGFpbnMgYmFzaWMgdHlwZXMgYW5kIHV0aWxpdGllcyB1c2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBsaWJyYXJ5LgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01NT05fSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01NT05fSF9fCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZm5kZWYgU1RBUkJPQVJECisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBkZWZpbmVkKF9fb3NmX18pCisvLyBUcnU2NCBsYWNrcyBzdGRpbnQuaCwgYnV0IGhhcyBpbnR0eXBlcy5oIHdoaWNoIGRlZmluZXMgYSBzdXBlcnNldCBvZgorLy8gd2hhdCBzdGRpbnQuaCB3b3VsZCBkZWZpbmUuCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmICFkZWZpbmVkKF9NU0NfVkVSKQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjZWxzZQorI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgorI2VuZGlmICAvLyBTVEFSQk9BUkQKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX0NQUFVOV0lORCkKKyAgI2RlZmluZSBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUworI2VsaWYgZGVmaW5lZChfX0VYQ0VQVElPTlMpCisgICNkZWZpbmUgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKKyNlbmRpZgorI2lmZGVmIFBST1RPQlVGX1VTRV9FWENFUFRJT05TCisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChHZXRNZXNzYWdlKQorLy8gQWxsb3cgR2V0TWVzc2FnZSB0byBiZSB1c2VkIGFzIGEgdmFsaWQgbWV0aG9kIG5hbWUgaW4gcHJvdG9idWYgY2xhc3Nlcy4KKy8vIHdpbmRvd3MuaCBkZWZpbmVzIEdldE1lc3NhZ2UoKSBhcyBhIG1hY3JvLiAgTGV0J3MgcmUtZGVmaW5lIGl0IGFzIGFuIGlubGluZQorLy8gZnVuY3Rpb24uICBUaGUgaW5saW5lIGZ1bmN0aW9uIHNob3VsZCBiZSBlcXVpdmFsZW50IGZvciBDKysgdXNlcnMuCitpbmxpbmUgQk9PTCBHZXRNZXNzYWdlX1dpbjMyKAorICAgIExQTVNHIGxwTXNnLCBIV05EIGhXbmQsCisgICAgVUlOVCB3TXNnRmlsdGVyTWluLCBVSU5UIHdNc2dGaWx0ZXJNYXgpIHsKKyAgcmV0dXJuIEdldE1lc3NhZ2UobHBNc2csIGhXbmQsIHdNc2dGaWx0ZXJNaW4sIHdNc2dGaWx0ZXJNYXgpOworfQorI3VuZGVmIEdldE1lc3NhZ2UKK2lubGluZSBCT09MIEdldE1lc3NhZ2UoCisgICAgTFBNU0cgbHBNc2csIEhXTkQgaFduZCwKKyAgICBVSU5UIHdNc2dGaWx0ZXJNaW4sIFVJTlQgd01zZ0ZpbHRlck1heCkgeworICByZXR1cm4gR2V0TWVzc2FnZV9XaW4zMihscE1zZywgaFduZCwgd01zZ0ZpbHRlck1pbiwgd01zZ0ZpbHRlck1heCk7Cit9CisjZW5kaWYKKworCituYW1lc3BhY2Ugc3RkIHt9CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworI3VuZGVmIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUworI2RlZmluZSBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHlwZU5hbWUpICAgIFwKKyAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoUFJPVE9CVUZfVVNFX0RMTFMpCisgICNpZmRlZiBMSUJQUk9UT0JVRl9FWFBPUlRTCisgICAgI2RlZmluZSBMSUJQUk9UT0JVRl9FWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisgICNlbHNlCisgICAgI2RlZmluZSBMSUJQUk9UT0JVRl9FWFBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisgICNlbmRpZgorICAjaWZkZWYgTElCUFJPVE9DX0VYUE9SVFMKKyAgICAjZGVmaW5lIExJQlBST1RPQ19FWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIExJQlBST1RPQ19FWFBPUlQgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyAgI2VuZGlmCisjZWxzZQorICAjZGVmaW5lIExJQlBST1RPQlVGX0VYUE9SVAorICAjZGVmaW5lIExJQlBST1RPQ19FWFBPUlQKKyNlbmRpZgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBTb21lIG9mIHRoZXNlIGNvbnN0YW50cyBhcmUgbWFjcm9zIHJhdGhlciB0aGFuIGNvbnN0IGludHMgc28gdGhhdCB0aGV5IGNhbgorLy8gYmUgdXNlZCBpbiAjaWYgZGlyZWN0aXZlcy4KKworLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiwgcmVwcmVzZW50ZWQgYXMgYSBzaW5nbGUgaW50ZWdlciB0byBtYWtlIGNvbXBhcmlzb24KKy8vIGVhc2llcjogIG1ham9yICogMTBeNiArIG1pbm9yICogMTBeMyArIG1pY3JvCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDIwMDQwMDIKKworLy8gVGhlIG1pbmltdW0gbGlicmFyeSB2ZXJzaW9uIHdoaWNoIHdvcmtzIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUKKy8vIGhlYWRlcnMuCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9NSU5fTElCUkFSWV9WRVJTSU9OIDIwMDQwMDAKKworLy8gVGhlIG1pbmltdW0gaGVhZGVyIHZlcnNpb24gd2hpY2ggd29ya3Mgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mCisvLyB0aGUgbGlicmFyeS4gIFRoaXMgY29uc3RhbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBwcm90b2MncyBDKysgY29kZQorLy8gZ2VuZXJhdG9yLgorc3RhdGljIGNvbnN0IGludCBrTWluSGVhZGVyVmVyc2lvbkZvckxpYnJhcnkgPSAyMDA0MDAwOworCisvLyBUaGUgbWluaW11bSBwcm90b2MgdmVyc2lvbiB3aGljaCB3b3JrcyB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlCisvLyBoZWFkZXJzLgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OIDIwMDQwMDAKKworLy8gVGhlIG1pbmltdW0gaGVhZGVyIHZlcnNpb24gd2hpY2ggd29ya3Mgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mCisvLyBwcm90b2MuICBUaGlzIGNvbnN0YW50IHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gVmVyaWZ5VmVyc2lvbigpLgorc3RhdGljIGNvbnN0IGludCBrTWluSGVhZGVyVmVyc2lvbkZvclByb3RvYyA9IDIwMDQwMDA7CisKKy8vIFZlcmlmaWVzIHRoYXQgdGhlIGhlYWRlcnMgYW5kIGxpYnJhcmllcyBhcmUgY29tcGF0aWJsZS4gIFVzZSB0aGUgbWFjcm8KKy8vIGJlbG93IHRvIGNhbGwgdGhpcy4KK3ZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIFZlcmlmeVZlcnNpb24oaW50IGhlYWRlclZlcnNpb24sIGludCBtaW5MaWJyYXJ5VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUpOworCisvLyBDb252ZXJ0cyBhIG51bWVyaWMgdmVyc2lvbiBudW1iZXIgdG8gYSBzdHJpbmcuCitzdGQ6OnN0cmluZyBMSUJQUk9UT0JVRl9FWFBPUlQgVmVyc2lvblN0cmluZyhpbnQgdmVyc2lvbik7CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisvLyBQbGFjZSB0aGlzIG1hY3JvIGluIHlvdXIgbWFpbigpIGZ1bmN0aW9uIChvciBzb21ld2hlcmUgYmVmb3JlIHlvdSBhdHRlbXB0CisvLyB0byB1c2UgdGhlIHByb3RvYnVmIGxpYnJhcnkpIHRvIHZlcmlmeSB0aGF0IHRoZSB2ZXJzaW9uIHlvdSBsaW5rIGFnYWluc3QKKy8vIG1hdGNoZXMgdGhlIGhlYWRlcnMgeW91IGNvbXBpbGVkIGFnYWluc3QuICBJZiBhIHZlcnNpb24gbWlzbWF0Y2ggaXMKKy8vIGRldGVjdGVkLCB0aGUgcHJvY2VzcyB3aWxsIGFib3J0LgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlZlcmlmeVZlcnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiwgR09PR0xFX1BST1RPQlVGX01JTl9MSUJSQVJZX1ZFUlNJT04sICAgICAgICAgXAorICAgIF9fRklMRV9fKQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBmcm9tIGdvb2dsZTMvYmFzZS9wb3J0LmgKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKKworI2lmZGVmIF9NU0NfVkVSCit0eXBlZGVmIF9faW50OCAgaW50ODsKK3R5cGVkZWYgX19pbnQxNiBpbnQxNjsKK3R5cGVkZWYgX19pbnQzMiBpbnQzMjsKK3R5cGVkZWYgX19pbnQ2NCBpbnQ2NDsKKwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDggIHVpbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDE2IHVpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiB1aW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0OworI2Vsc2UKK3R5cGVkZWYgaW50OF90ICBpbnQ4OwordHlwZWRlZiBpbnQxNl90IGludDE2OwordHlwZWRlZiBpbnQzMl90IGludDMyOwordHlwZWRlZiBpbnQ2NF90IGludDY0OworCit0eXBlZGVmIHVpbnQ4X3QgIHVpbnQ4OwordHlwZWRlZiB1aW50MTZfdCB1aW50MTY7Cit0eXBlZGVmIHVpbnQzMl90IHVpbnQzMjsKK3R5cGVkZWYgdWludDY0X3QgdWludDY0OworI2VuZGlmCisKKy8vIGxvbmcgbG9uZyBtYWNyb3MgdG8gYmUgdXNlZCBiZWNhdXNlIGdjYyBhbmQgdmMrKyB1c2UgZGlmZmVyZW50IHN1ZmZpeGVzLAorLy8gYW5kIGRpZmZlcmVudCBzaXplIHNwZWNpZmllcnMgaW4gZm9ybWF0IHN0cmluZ3MKKyN1bmRlZiBHT09HTEVfTE9OR0xPTkcKKyN1bmRlZiBHT09HTEVfVUxPTkdMT05HCisjdW5kZWYgR09PR0xFX0xMX0ZPUk1BVAorCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgR09PR0xFX0xPTkdMT05HKHgpIHgjI0k2NAorI2RlZmluZSBHT09HTEVfVUxPTkdMT05HKHgpIHgjI1VJNjQKKyNkZWZpbmUgR09PR0xFX0xMX0ZPUk1BVCAiSTY0IiAgLy8gQXMgaW4gcHJpbnRmKCIlSTY0ZCIsIC4uLikKKyNlbHNlCisjZGVmaW5lIEdPT0dMRV9MT05HTE9ORyh4KSB4IyNMTAorI2RlZmluZSBHT09HTEVfVUxPTkdMT05HKHgpIHgjI1VMTAorI2RlZmluZSBHT09HTEVfTExfRk9STUFUICJsbCIgIC8vIEFzIGluICIlbGxkIi4gTm90ZSB0aGF0ICJxIiBpcyBwb29yIGZvcm0gYWxzby4KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgaW50MzIga2ludDMybWF4ID0gMHg3RkZGRkZGRjsKK3N0YXRpYyBjb25zdCBpbnQzMiBraW50MzJtaW4gPSAta2ludDMybWF4IC0gMTsKK3N0YXRpYyBjb25zdCBpbnQ2NCBraW50NjRtYXggPSBHT09HTEVfTE9OR0xPTkcoMHg3RkZGRkZGRkZGRkZGRkZGKTsKK3N0YXRpYyBjb25zdCBpbnQ2NCBraW50NjRtaW4gPSAta2ludDY0bWF4IC0gMTsKK3N0YXRpYyBjb25zdCB1aW50MzIga3VpbnQzMm1heCA9IDB4RkZGRkZGRkZ1Oworc3RhdGljIGNvbnN0IHVpbnQ2NCBrdWludDY0bWF4ID0gR09PR0xFX1VMT05HTE9ORygweEZGRkZGRkZGRkZGRkZGRkYpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbm5vdGF0aW9uczogIFNvbWUgcGFydHMgb2YgdGhlIGNvZGUgaGF2ZSBiZWVuIGFubm90YXRlZCBpbiB3YXlzIHRoYXQgbWlnaHQKKy8vICAgYmUgdXNlZnVsIHRvIHNvbWUgY29tcGlsZXJzIG9yIHRvb2xzLCBidXQgYXJlIG5vdCBzdXBwb3J0ZWQgdW5pdmVyc2FsbHkuCisvLyAgIFlvdSBjYW4gI2RlZmluZSB0aGVzZSBhbm5vdGF0aW9ucyB5b3Vyc2VsZiBpZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorLy8gICBpcyBub3QgcmlnaHQgZm9yIHlvdS4KKworI2lmbmRlZiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPiAzIHx8KF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMSkpCisvLyBGb3IgZnVuY3Rpb25zIHdlIHdhbnQgdG8gZm9yY2UgaW5saW5lLgorLy8gSW50cm9kdWNlZCBpbiBnY2MgMy4xLgorI2RlZmluZSBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKQorI2Vsc2UKKy8vIE90aGVyIGNvbXBpbGVycyB3aWxsIGhhdmUgdG8gZmlndXJlIGl0IG91dCBmb3IgdGhlbXNlbHZlcy4KKyNkZWZpbmUgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRAorI2lmZGVmIF9fR05VQ19fCisvLyBJZiB0aGUgbWV0aG9kL3ZhcmlhYmxlL3R5cGUgaXMgdXNlZCBhbnl3aGVyZSwgcHJvZHVjZSBhIHdhcm5pbmcuCisjZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKKyNlbHNlCisjZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBHT09HTEVfUFJFRElDVF9UUlVFCisjaWZkZWYgX19HTlVDX18KKy8vIFByb3ZpZGVkIGF0IGxlYXN0IHNpbmNlIEdDQyAzLjAuCisjZGVmaW5lIEdPT0dMRV9QUkVESUNUX1RSVUUoeCkgKF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpKQorI2Vsc2UKKyNkZWZpbmUgR09PR0xFX1BSRURJQ1RfVFJVRQorI2VuZGlmCisjZW5kaWYKKworLy8gRGVsaW1pdHMgYSBibG9jayBvZiBjb2RlIHdoaWNoIG1heSB3cml0ZSB0byBtZW1vcnkgd2hpY2ggaXMgc2ltdWx0YW5lb3VzbHkKKy8vIHdyaXR0ZW4gYnkgb3RoZXIgdGhyZWFkcywgYnV0IHdoaWNoIGhhcyBiZWVuIGRldGVybWluZWQgdG8gYmUgdGhyZWFkLXNhZmUKKy8vIChlLmcuIGJlY2F1c2UgaXQgaXMgYW4gaWRlbXBvdGVudCB3cml0ZSkuCisjaWZuZGVmIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOCisjZGVmaW5lIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCkKKyNlbmRpZgorI2lmbmRlZiBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQKKyNkZWZpbmUgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCkKKyNlbmRpZgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBmcm9tIGdvb2dsZTMvYmFzZS9iYXNpY3R5cGVzLmgKKworLy8gVGhlIEdPT0dMRV9BUlJBWVNJWkUoYXJyKSBtYWNybyByZXR1cm5zIHRoZSAjIG9mIGVsZW1lbnRzIGluIGFuIGFycmF5IGFyci4KKy8vIFRoZSBleHByZXNzaW9uIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LCBhbmQgdGhlcmVmb3JlIGNhbiBiZQorLy8gdXNlZCBpbiBkZWZpbmluZyBuZXcgYXJyYXlzLCBmb3IgZXhhbXBsZS4KKy8vCisvLyBHT09HTEVfQVJSQVlTSVpFIGNhdGNoZXMgYSBmZXcgdHlwZSBlcnJvcnMuICBJZiB5b3Ugc2VlIGEgY29tcGlsZXIgZXJyb3IKKy8vCisvLyAgICJ3YXJuaW5nOiBkaXZpc2lvbiBieSB6ZXJvIGluIC4uLiIKKy8vCisvLyB3aGVuIHVzaW5nIEdPT0dMRV9BUlJBWVNJWkUsIHlvdSBhcmUgKHdyb25nZnVsbHkpIGdpdmluZyBpdCBhIHBvaW50ZXIuCisvLyBZb3Ugc2hvdWxkIG9ubHkgdXNlIEdPT0dMRV9BUlJBWVNJWkUgb24gc3RhdGljYWxseSBhbGxvY2F0ZWQgYXJyYXlzLgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgY29tbWVudHMgYXJlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCBhbmQgY2FuCisvLyBiZSBpZ25vcmVkIGJ5IHRoZSB1c2Vycy4KKy8vCisvLyBBUlJBWVNJWkUoYXJyKSB3b3JrcyBieSBpbnNwZWN0aW5nIHNpemVvZihhcnIpICh0aGUgIyBvZiBieXRlcyBpbgorLy8gdGhlIGFycmF5KSBhbmQgc2l6ZW9mKCooYXJyKSkgKHRoZSAjIG9mIGJ5dGVzIGluIG9uZSBhcnJheQorLy8gZWxlbWVudCkuICBJZiB0aGUgZm9ybWVyIGlzIGRpdmlzaWJsZSBieSB0aGUgbGF0dGVyLCBwZXJoYXBzIGFyciBpcworLy8gaW5kZWVkIGFuIGFycmF5LCBpbiB3aGljaCBjYXNlIHRoZSBkaXZpc2lvbiByZXN1bHQgaXMgdGhlICMgb2YKKy8vIGVsZW1lbnRzIGluIHRoZSBhcnJheS4gIE90aGVyd2lzZSwgYXJyIGNhbm5vdCBwb3NzaWJseSBiZSBhbiBhcnJheSwKKy8vIGFuZCB3ZSBnZW5lcmF0ZSBhIGNvbXBpbGVyIGVycm9yIHRvIHByZXZlbnQgdGhlIGNvZGUgZnJvbQorLy8gY29tcGlsaW5nLgorLy8KKy8vIFNpbmNlIHRoZSBzaXplIG9mIGJvb2wgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCwgd2UgbmVlZCB0byBjYXN0CisvLyAhKHNpemVvZihhKSAmIHNpemVvZigqKGEpKSkgdG8gc2l6ZV90IGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgZmluYWwKKy8vIHJlc3VsdCBoYXMgdHlwZSBzaXplX3QuCisvLworLy8gVGhpcyBtYWNybyBpcyBub3QgcGVyZmVjdCBhcyBpdCB3cm9uZ2Z1bGx5IGFjY2VwdHMgY2VydGFpbgorLy8gcG9pbnRlcnMsIG5hbWVseSB3aGVyZSB0aGUgcG9pbnRlciBzaXplIGlzIGRpdmlzaWJsZSBieSB0aGUgcG9pbnRlZQorLy8gc2l6ZS4gIFNpbmNlIGFsbCBvdXIgY29kZSBoYXMgdG8gZ28gdGhyb3VnaCBhIDMyLWJpdCBjb21waWxlciwKKy8vIHdoZXJlIGEgcG9pbnRlciBpcyA0IGJ5dGVzLCB0aGlzIG1lYW5zIGFsbCBwb2ludGVycyB0byBhIHR5cGUgd2hvc2UKKy8vIHNpemUgaXMgMyBvciBncmVhdGVyIHRoYW4gNCB3aWxsIGJlIChyaWdodGVvdXNseSkgcmVqZWN0ZWQuCisvLworLy8gS3Vkb3MgdG8gSm9yZyBCcm93biBmb3IgdGhpcyBzaW1wbGUgYW5kIGVsZWdhbnQgaW1wbGVtZW50YXRpb24uCisKKyN1bmRlZiBHT09HTEVfQVJSQVlTSVpFCisjZGVmaW5lIEdPT0dMRV9BUlJBWVNJWkUoYSkgXAorICAoKHNpemVvZihhKSAvIHNpemVvZigqKGEpKSkgLyBcCisgICBzdGF0aWNfY2FzdDxzaXplX3Q+KCEoc2l6ZW9mKGEpICUgc2l6ZW9mKCooYSkpKSkpCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIFVzZSBpbXBsaWNpdF9jYXN0IGFzIGEgc2FmZSB2ZXJzaW9uIG9mIHN0YXRpY19jYXN0IG9yIGNvbnN0X2Nhc3QKKy8vIGZvciB1cGNhc3RpbmcgaW4gdGhlIHR5cGUgaGllcmFyY2h5IChpLmUuIGNhc3RpbmcgYSBwb2ludGVyIHRvIEZvbworLy8gdG8gYSBwb2ludGVyIHRvIFN1cGVyY2xhc3NPZkZvbyBvciBjYXN0aW5nIGEgcG9pbnRlciB0byBGb28gdG8KKy8vIGEgY29uc3QgcG9pbnRlciB0byBGb28pLgorLy8gV2hlbiB5b3UgdXNlIGltcGxpY2l0X2Nhc3QsIHRoZSBjb21waWxlciBjaGVja3MgdGhhdCB0aGUgY2FzdCBpcyBzYWZlLgorLy8gU3VjaCBleHBsaWNpdCBpbXBsaWNpdF9jYXN0cyBhcmUgbmVjZXNzYXJ5IGluIHN1cnByaXNpbmdseSBtYW55CisvLyBzaXR1YXRpb25zIHdoZXJlIEMrKyBkZW1hbmRzIGFuIGV4YWN0IHR5cGUgbWF0Y2ggaW5zdGVhZCBvZiBhbgorLy8gYXJndW1lbnQgdHlwZSBjb252ZXJ0YWJsZSB0byBhIHRhcmdldCB0eXBlLgorLy8KKy8vIFRoZSBGcm9tIHR5cGUgY2FuIGJlIGluZmVycmVkLCBzbyB0aGUgcHJlZmVycmVkIHN5bnRheCBmb3IgdXNpbmcKKy8vIGltcGxpY2l0X2Nhc3QgaXMgdGhlIHNhbWUgYXMgZm9yIHN0YXRpY19jYXN0IGV0Yy46CisvLworLy8gICBpbXBsaWNpdF9jYXN0PFRvVHlwZT4oZXhwcikKKy8vCisvLyBpbXBsaWNpdF9jYXN0IHdvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQgbGlicmFyeSwKKy8vIGJ1dCB0aGUgcHJvcG9zYWwgd2FzIHN1Ym1pdHRlZCB0b28gbGF0ZS4gIEl0IHdpbGwgcHJvYmFibHkgbWFrZQorLy8gaXRzIHdheSBpbnRvIHRoZSBsYW5ndWFnZSBpbiB0aGUgZnV0dXJlLgordGVtcGxhdGU8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+CitpbmxpbmUgVG8gaW1wbGljaXRfY2FzdChGcm9tIGNvbnN0ICZmKSB7CisgIHJldHVybiBmOworfQorCisvLyBXaGVuIHlvdSB1cGNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20gdHlwZSBGb28gdG8gdHlwZQorLy8gU3VwZXJjbGFzc09mRm9vKSwgaXQncyBmaW5lIHRvIHVzZSBpbXBsaWNpdF9jYXN0PD4sIHNpbmNlIHVwY2FzdHMKKy8vIGFsd2F5cyBzdWNjZWVkLiAgV2hlbiB5b3UgZG93bmNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20KKy8vIHR5cGUgRm9vIHRvIHR5cGUgU3ViY2xhc3NPZkZvbyksIHN0YXRpY19jYXN0PD4gaXNuJ3Qgc2FmZSwgYmVjYXVzZQorLy8gaG93IGRvIHlvdSBrbm93IHRoZSBwb2ludGVyIGlzIHJlYWxseSBvZiB0eXBlIFN1YmNsYXNzT2ZGb28/ICBJdAorLy8gY291bGQgYmUgYSBiYXJlIEZvbywgb3Igb2YgdHlwZSBEaWZmZXJlbnRTdWJjbGFzc09mRm9vLiAgVGh1cywKKy8vIHdoZW4geW91IGRvd25jYXN0LCB5b3Ugc2hvdWxkIHVzZSB0aGlzIG1hY3JvLiAgSW4gZGVidWcgbW9kZSwgd2UKKy8vIHVzZSBkeW5hbWljX2Nhc3Q8PiB0byBkb3VibGUtY2hlY2sgdGhlIGRvd25jYXN0IGlzIGxlZ2FsICh3ZSBkaWUKKy8vIGlmIGl0J3Mgbm90KS4gIEluIG5vcm1hbCBtb2RlLCB3ZSBkbyB0aGUgZWZmaWNpZW50IHN0YXRpY19jYXN0PD4KKy8vIGluc3RlYWQuICBUaHVzLCBpdCdzIGltcG9ydGFudCB0byB0ZXN0IGluIGRlYnVnIG1vZGUgdG8gbWFrZSBzdXJlCisvLyB0aGUgY2FzdCBpcyBsZWdhbCEKKy8vICAgIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgaW4gdGhlIGNvZGUgd2Ugc2hvdWxkIHVzZSBkeW5hbWljX2Nhc3Q8Pi4KKy8vIEluIHBhcnRpY3VsYXIsIHlvdSBTSE9VTEROJ1QgYmUgdXNpbmcgZHluYW1pY19jYXN0PD4gaW4gb3JkZXIgdG8KKy8vIGRvIFJUVEkgKGVnIGNvZGUgbGlrZSB0aGlzOgorLy8gICAgaWYgKGR5bmFtaWNfY2FzdDxTdWJjbGFzczE+KGZvbykpIEhhbmRsZUFTdWJjbGFzczFPYmplY3QoZm9vKTsKKy8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MyPihmb28pKSBIYW5kbGVBU3ViY2xhc3MyT2JqZWN0KGZvbyk7CisvLyBZb3Ugc2hvdWxkIGRlc2lnbiB0aGUgY29kZSBzb21lIG90aGVyIHdheSBub3QgdG8gbmVlZCB0aGlzLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gICAgIC8vIHVzZSBsaWtlIHRoaXM6IGRvd25fY2FzdDxUKj4oZm9vKTsKK2lubGluZSBUbyBkb3duX2Nhc3QoRnJvbSogZikgeyAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBvbmx5IGFjY2VwdCBwb2ludGVycworICAvLyBFbnN1cmVzIHRoYXQgVG8gaXMgYSBzdWItdHlwZSBvZiBGcm9tICouICBUaGlzIHRlc3QgaXMgaGVyZSBvbmx5CisgIC8vIGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZywgYW5kIGhhcyBubyBvdmVyaGVhZCBpbiBhbgorICAvLyBvcHRpbWl6ZWQgYnVpbGQgYXQgcnVuLXRpbWUsIGFzIGl0IHdpbGwgYmUgb3B0aW1pemVkIGF3YXkKKyAgLy8gY29tcGxldGVseS4KKyAgaWYgKGZhbHNlKSB7CisgICAgaW1wbGljaXRfY2FzdDxGcm9tKiwgVG8+KDApOworICB9CisKKyNpZiAhZGVmaW5lZChOREVCVUcpICYmICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9OT19SVFRJKQorICBhc3NlcnQoZiA9PSBOVUxMIHx8IGR5bmFtaWNfY2FzdDxUbz4oZikgIT0gTlVMTCk7ICAvLyBSVFRJOiBkZWJ1ZyBtb2RlIG9ubHkhCisjZW5kaWYKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFRvPihmKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFdlIG1hZGUgdGhlc2UgaW50ZXJuYWwgc28gdGhhdCB0aGV5IHdvdWxkIHNob3cgdXAgYXMgc3VjaCBpbiB0aGUgZG9jcywKKy8vIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHN0aWNrICJpbnRlcm5hbDo6IiBpbiBmcm9udCBvZiB0aGVtIGV2ZXJ5d2hlcmUuCit1c2luZyBpbnRlcm5hbDo6aW1wbGljaXRfY2FzdDsKK3VzaW5nIGludGVybmFsOjpkb3duX2Nhc3Q7CisKKy8vIFRoZSBDT01QSUxFX0FTU0VSVCBtYWNybyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIGNvbXBpbGUgdGltZQorLy8gZXhwcmVzc2lvbiBpcyB0cnVlLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSBpdCB0byB2ZXJpZnkgdGhlCisvLyBzaXplIG9mIGEgc3RhdGljIGFycmF5OgorLy8KKy8vICAgQ09NUElMRV9BU1NFUlQoQVJSQVlTSVpFKGNvbnRlbnRfdHlwZV9uYW1lcykgPT0gQ09OVEVOVF9OVU1fVFlQRVMsCisvLyAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZV9uYW1lc19pbmNvcnJlY3Rfc2l6ZSk7CisvLworLy8gb3IgdG8gbWFrZSBzdXJlIGEgc3RydWN0IGlzIHNtYWxsZXIgdGhhbiBhIGNlcnRhaW4gc2l6ZToKKy8vCisvLyAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihmb28pIDwgMTI4LCBmb29fdG9vX2xhcmdlKTsKKy8vCisvLyBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBtYWNybyBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuIElmCisvLyB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSwgbW9zdCBjb21waWxlcnMgd2lsbCBpc3N1ZSBhIHdhcm5pbmcvZXJyb3IKKy8vIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgorCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8Ym9vbD4KK3N0cnVjdCBDb21waWxlQXNzZXJ0IHsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCisjdW5kZWYgR09PR0xFX0NPTVBJTEVfQVNTRVJUCisjZGVmaW5lIEdPT0dMRV9DT01QSUxFX0FTU0VSVChleHByLCBtc2cpIFwKKyAgdHlwZWRlZiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4gXAorICAgICAgICAgIG1zZ1tib29sKGV4cHIpID8gMSA6IC0xXQorCisKKy8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgQ09NUElMRV9BU1NFUlQ6CisvLworLy8gLSBDT01QSUxFX0FTU0VSVCB3b3JrcyBieSBkZWZpbmluZyBhbiBhcnJheSB0eXBlIHRoYXQgaGFzIC0xCisvLyAgIGVsZW1lbnRzIChhbmQgdGh1cyBpcyBpbnZhbGlkKSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlLgorLy8KKy8vIC0gVGhlIHNpbXBsZXIgZGVmaW5pdGlvbgorLy8KKy8vICAgICAjZGVmaW5lIENPTVBJTEVfQVNTRVJUKGV4cHIsIG1zZykgdHlwZWRlZiBjaGFyIG1zZ1soZXhwcikgPyAxIDogLTFdCisvLworLy8gICBkb2VzIG5vdCB3b3JrLCBhcyBnY2Mgc3VwcG9ydHMgdmFyaWFibGUtbGVuZ3RoIGFycmF5cyB3aG9zZSBzaXplcworLy8gICBhcmUgZGV0ZXJtaW5lZCBhdCBydW4tdGltZSAodGhpcyBpcyBnY2MncyBleHRlbnNpb24gYW5kIG5vdCBwYXJ0CisvLyAgIG9mIHRoZSBDKysgc3RhbmRhcmQpLiAgQXMgYSByZXN1bHQsIGdjYyBmYWlscyB0byByZWplY3QgdGhlCisvLyAgIGZvbGxvd2luZyBjb2RlIHdpdGggdGhlIHNpbXBsZSBkZWZpbml0aW9uOgorLy8KKy8vICAgICBpbnQgZm9vOworLy8gICAgIENPTVBJTEVfQVNTRVJUKGZvbywgbXNnKTsgLy8gbm90IHN1cHBvc2VkIHRvIGNvbXBpbGUgYXMgZm9vIGlzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCisvLworLy8gLSBCeSB1c2luZyB0aGUgdHlwZSBDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4sIHdlIGVuc3VyZXMgdGhhdAorLy8gICBleHByIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LiAgKFRlbXBsYXRlIGFyZ3VtZW50cyBtdXN0IGJlCisvLyAgIGRldGVybWluZWQgYXQgY29tcGlsZS10aW1lLikKKy8vCisvLyAtIFRoZSBvdXR0ZXIgcGFyZW50aGVzZXMgaW4gQ29tcGlsZUFzc2VydDwoYm9vbChleHByKSk+IGFyZSBuZWNlc3NhcnkKKy8vICAgdG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDMuNC40IGFuZCA0LjAuMS4gIElmIHdlIGhhZCB3cml0dGVuCisvLworLy8gICAgIENvbXBpbGVBc3NlcnQ8Ym9vbChleHByKT4KKy8vCisvLyAgIGluc3RlYWQsIHRoZXNlIGNvbXBpbGVycyB3aWxsIHJlZnVzZSB0byBjb21waWxlCisvLworLy8gICAgIENPTVBJTEVfQVNTRVJUKDUgPiAwLCBzb21lX21lc3NhZ2UpOworLy8KKy8vICAgKFRoZXkgc2VlbSB0byB0aGluayB0aGUgIj4iIGluICI1ID4gMCIgbWFya3MgdGhlIGVuZCBvZiB0aGUKKy8vICAgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4pCisvLworLy8gLSBUaGUgYXJyYXkgc2l6ZSBpcyAoYm9vbChleHByKSA/IDEgOiAtMSksIGluc3RlYWQgb2Ygc2ltcGx5CisvLworLy8gICAgICgoZXhwcikgPyAxIDogLTEpLgorLy8KKy8vICAgVGhpcyBpcyB0byBhdm9pZCBydW5uaW5nIGludG8gYSBidWcgaW4gTVMgVkMgNy4xLCB3aGljaAorLy8gICBjYXVzZXMgKCgwLjApID8gMSA6IC0xKSB0byBpbmNvcnJlY3RseSBldmFsdWF0ZSB0byAxLgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBmcm9tIGdvb2dsZTMvYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRlc2lnbmVkIHRvIG1hdGNoIHRoZSBhbnRpY2lwYXRlZCBmdXR1cmUgVFIyCisvLyAgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNjb3BlZF9wdHIgY2xhc3MsIGFuZCBpdHMgY2xvc2VseS1yZWxhdGVkIGJyZXRocmVuLAorLy8gIHNjb3BlZF9hcnJheSwgc2NvcGVkX3B0cl9tYWxsb2MsIGFuZCBtYWtlX3Njb3BlZF9wdHIuCisKK3RlbXBsYXRlIDxjbGFzcyBDPiBjbGFzcyBzY29wZWRfcHRyOwordGVtcGxhdGUgPGNsYXNzIEM+IGNsYXNzIHNjb3BlZF9hcnJheTsKKworLy8gQSBzY29wZWRfcHRyPFQ+IGlzIGxpa2UgYSBUKiwgZXhjZXB0IHRoYXQgdGhlIGRlc3RydWN0b3Igb2Ygc2NvcGVkX3B0cjxUPgorLy8gYXV0b21hdGljYWxseSBkZWxldGVzIHRoZSBwb2ludGVyIGl0IGhvbGRzIChpZiBhbnkpLgorLy8gVGhhdCBpcywgc2NvcGVkX3B0cjxUPiBvd25zIHRoZSBUIG9iamVjdCB0aGF0IGl0IHBvaW50cyB0by4KKy8vIExpa2UgYSBUKiwgYSBzY29wZWRfcHRyPFQ+IG1heSBob2xkIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIFQgb2JqZWN0LgorLy8KKy8vIFRoZSBzaXplIG9mIGEgc2NvcGVkX3B0ciBpcyBzbWFsbDoKKy8vIHNpemVvZihzY29wZWRfcHRyPEM+KSA9PSBzaXplb2YoQyopCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK2NsYXNzIHNjb3BlZF9wdHIgeworIHB1YmxpYzoKKworICAvLyBUaGUgZWxlbWVudCB0eXBlCisgIHR5cGVkZWYgQyBlbGVtZW50X3R5cGU7CisKKyAgLy8gQ29uc3RydWN0b3IuICBEZWZhdWx0cyB0byBpbnRpYWxpemluZyB3aXRoIE5VTEwuCisgIC8vIFRoZXJlIGlzIG5vIHdheSB0byBjcmVhdGUgYW4gdW5pbml0aWFsaXplZCBzY29wZWRfcHRyLgorICAvLyBUaGUgaW5wdXQgcGFyYW1ldGVyIG11c3QgYmUgYWxsb2NhdGVkIHdpdGggbmV3LgorICBleHBsaWNpdCBzY29wZWRfcHRyKEMqIHAgPSBOVUxMKSA6IHB0cl8ocCkgeyB9CisKKyAgLy8gRGVzdHJ1Y3Rvci4gIElmIHRoZXJlIGlzIGEgQyBvYmplY3QsIGRlbGV0ZSBpdC4KKyAgLy8gV2UgZG9uJ3QgbmVlZCB0byB0ZXN0IHB0cl8gPT0gTlVMTCBiZWNhdXNlIEMrKyBkb2VzIHRoYXQgZm9yIHVzLgorICB+c2NvcGVkX3B0cigpIHsKKyAgICBlbnVtIHsgdHlwZV9tdXN0X2JlX2NvbXBsZXRlID0gc2l6ZW9mKEMpIH07CisgICAgZGVsZXRlIHB0cl87CisgIH0KKworICAvLyBSZXNldC4gIERlbGV0ZXMgdGhlIGN1cnJlbnQgb3duZWQgb2JqZWN0LCBpZiBhbnkuCisgIC8vIFRoZW4gdGFrZXMgb3duZXJzaGlwIG9mIGEgbmV3IG9iamVjdCwgaWYgZ2l2ZW4uCisgIC8vIHRoaXMtPnJlc2V0KHRoaXMtPmdldCgpKSB3b3Jrcy4KKyAgdm9pZCByZXNldChDKiBwID0gTlVMTCkgeworICAgIGlmIChwICE9IHB0cl8pIHsKKyAgICAgIGVudW0geyB0eXBlX211c3RfYmVfY29tcGxldGUgPSBzaXplb2YoQykgfTsKKyAgICAgIGRlbGV0ZSBwdHJfOworICAgICAgcHRyXyA9IHA7CisgICAgfQorICB9CisKKyAgLy8gQWNjZXNzb3JzIHRvIGdldCB0aGUgb3duZWQgb2JqZWN0LgorICAvLyBvcGVyYXRvciogYW5kIG9wZXJhdG9yLT4gd2lsbCBhc3NlcnQoKSBpZiB0aGVyZSBpcyBubyBjdXJyZW50IG9iamVjdC4KKyAgQyYgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChwdHJfICE9IE5VTEwpOworICAgIHJldHVybiAqcHRyXzsKKyAgfQorICBDKiBvcGVyYXRvci0+KCkgY29uc3QgIHsKKyAgICBhc3NlcnQocHRyXyAhPSBOVUxMKTsKKyAgICByZXR1cm4gcHRyXzsKKyAgfQorICBDKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisKKyAgLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMuCisgIC8vIFRoZXNlIHJldHVybiB3aGV0aGVyIHR3byBzY29wZWRfcHRyIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCwgbm90IGp1c3QgdG8KKyAgLy8gdHdvIGRpZmZlcmVudCBidXQgZXF1YWwgb2JqZWN0cy4KKyAgYm9vbCBvcGVyYXRvcj09KEMqIHApIGNvbnN0IHsgcmV0dXJuIHB0cl8gPT0gcDsgfQorICBib29sIG9wZXJhdG9yIT0oQyogcCkgY29uc3QgeyByZXR1cm4gcHRyXyAhPSBwOyB9CisKKyAgLy8gU3dhcCB0d28gc2NvcGVkIHBvaW50ZXJzLgorICB2b2lkIHN3YXAoc2NvcGVkX3B0ciYgcDIpIHsKKyAgICBDKiB0bXAgPSBwdHJfOworICAgIHB0cl8gPSBwMi5wdHJfOworICAgIHAyLnB0cl8gPSB0bXA7CisgIH0KKworICAvLyBSZWxlYXNlIGEgcG9pbnRlci4KKyAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgY3VycmVudCBwb2ludGVyIGhlbGQgYnkgdGhpcyBvYmplY3QuCisgIC8vIElmIHRoaXMgb2JqZWN0IGhvbGRzIGEgTlVMTCBwb2ludGVyLCB0aGUgcmV0dXJuIHZhbHVlIGlzIE5VTEwuCisgIC8vIEFmdGVyIHRoaXMgb3BlcmF0aW9uLCB0aGlzIG9iamVjdCB3aWxsIGhvbGQgYSBOVUxMIHBvaW50ZXIsCisgIC8vIGFuZCB3aWxsIG5vdCBvd24gdGhlIG9iamVjdCBhbnkgbW9yZS4KKyAgQyogcmVsZWFzZSgpIHsKKyAgICBDKiByZXRWYWwgPSBwdHJfOworICAgIHB0cl8gPSBOVUxMOworICAgIHJldHVybiByZXRWYWw7CisgIH0KKworIHByaXZhdGU6CisgIEMqIHB0cl87CisKKyAgLy8gRm9yYmlkIGNvbXBhcmlzb24gb2Ygc2NvcGVkX3B0ciB0eXBlcy4gIElmIEMyICE9IEMsIGl0IHRvdGFsbHkgZG9lc24ndAorICAvLyBtYWtlIHNlbnNlLCBhbmQgaWYgQzIgPT0gQywgaXQgc3RpbGwgZG9lc24ndCBtYWtlIHNlbnNlIGJlY2F1c2UgeW91IHNob3VsZAorICAvLyBuZXZlciBoYXZlIHRoZSBzYW1lIG9iamVjdCBvd25lZCBieSB0d28gZGlmZmVyZW50IHNjb3BlZF9wdHJzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgQzI+IGJvb2wgb3BlcmF0b3I9PShzY29wZWRfcHRyPEMyPiBjb25zdCYgcDIpIGNvbnN0OworICB0ZW1wbGF0ZSA8Y2xhc3MgQzI+IGJvb2wgb3BlcmF0b3IhPShzY29wZWRfcHRyPEMyPiBjb25zdCYgcDIpIGNvbnN0OworCisgIC8vIERpc2FsbG93IGV2aWwgY29uc3RydWN0b3JzCisgIHNjb3BlZF9wdHIoY29uc3Qgc2NvcGVkX3B0ciYpOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBzY29wZWRfcHRyJik7Cit9OworCisvLyBzY29wZWRfYXJyYXk8Qz4gaXMgbGlrZSBzY29wZWRfcHRyPEM+LCBleGNlcHQgdGhhdCB0aGUgY2FsbGVyIG11c3QgYWxsb2NhdGUKKy8vIHdpdGggbmV3IFtdIGFuZCB0aGUgZGVzdHJ1Y3RvciBkZWxldGVzIG9iamVjdHMgd2l0aCBkZWxldGUgW10uCisvLworLy8gQXMgd2l0aCBzY29wZWRfcHRyPEM+LCBhIHNjb3BlZF9hcnJheTxDPiBlaXRoZXIgcG9pbnRzIHRvIGFuIG9iamVjdAorLy8gb3IgaXMgTlVMTC4gIEEgc2NvcGVkX2FycmF5PEM+IG93bnMgdGhlIG9iamVjdCB0aGF0IGl0IHBvaW50cyB0by4KKy8vCisvLyBTaXplOiBzaXplb2Yoc2NvcGVkX2FycmF5PEM+KSA9PSBzaXplb2YoQyopCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK2NsYXNzIHNjb3BlZF9hcnJheSB7CisgcHVibGljOgorCisgIC8vIFRoZSBlbGVtZW50IHR5cGUKKyAgdHlwZWRlZiBDIGVsZW1lbnRfdHlwZTsKKworICAvLyBDb25zdHJ1Y3Rvci4gIERlZmF1bHRzIHRvIGludGlhbGl6aW5nIHdpdGggTlVMTC4KKyAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIGNyZWF0ZSBhbiB1bmluaXRpYWxpemVkIHNjb3BlZF9hcnJheS4KKyAgLy8gVGhlIGlucHV0IHBhcmFtZXRlciBtdXN0IGJlIGFsbG9jYXRlZCB3aXRoIG5ldyBbXS4KKyAgZXhwbGljaXQgc2NvcGVkX2FycmF5KEMqIHAgPSBOVUxMKSA6IGFycmF5XyhwKSB7IH0KKworICAvLyBEZXN0cnVjdG9yLiAgSWYgdGhlcmUgaXMgYSBDIG9iamVjdCwgZGVsZXRlIGl0LgorICAvLyBXZSBkb24ndCBuZWVkIHRvIHRlc3QgcHRyXyA9PSBOVUxMIGJlY2F1c2UgQysrIGRvZXMgdGhhdCBmb3IgdXMuCisgIH5zY29wZWRfYXJyYXkoKSB7CisgICAgZW51bSB7IHR5cGVfbXVzdF9iZV9jb21wbGV0ZSA9IHNpemVvZihDKSB9OworICAgIGRlbGV0ZVtdIGFycmF5XzsKKyAgfQorCisgIC8vIFJlc2V0LiAgRGVsZXRlcyB0aGUgY3VycmVudCBvd25lZCBvYmplY3QsIGlmIGFueS4KKyAgLy8gVGhlbiB0YWtlcyBvd25lcnNoaXAgb2YgYSBuZXcgb2JqZWN0LCBpZiBnaXZlbi4KKyAgLy8gdGhpcy0+cmVzZXQodGhpcy0+Z2V0KCkpIHdvcmtzLgorICB2b2lkIHJlc2V0KEMqIHAgPSBOVUxMKSB7CisgICAgaWYgKHAgIT0gYXJyYXlfKSB7CisgICAgICBlbnVtIHsgdHlwZV9tdXN0X2JlX2NvbXBsZXRlID0gc2l6ZW9mKEMpIH07CisgICAgICBkZWxldGVbXSBhcnJheV87CisgICAgICBhcnJheV8gPSBwOworICAgIH0KKyAgfQorCisgIC8vIEdldCBvbmUgZWxlbWVudCBvZiB0aGUgY3VycmVudCBvYmplY3QuCisgIC8vIFdpbGwgYXNzZXJ0KCkgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBvYmplY3QsIG9yIGluZGV4IGkgaXMgbmVnYXRpdmUuCisgIEMmIG9wZXJhdG9yW10oc3RkOjpwdHJkaWZmX3QgaSkgY29uc3QgeworICAgIGFzc2VydChpID49IDApOworICAgIGFzc2VydChhcnJheV8gIT0gTlVMTCk7CisgICAgcmV0dXJuIGFycmF5X1tpXTsKKyAgfQorCisgIC8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIHplcm90aCBlbGVtZW50IG9mIHRoZSBjdXJyZW50IG9iamVjdC4KKyAgLy8gSWYgdGhlcmUgaXMgbm8gY3VycmVudCBvYmplY3QsIHJldHVybiBOVUxMLgorICBDKiBnZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGFycmF5XzsKKyAgfQorCisgIC8vIENvbXBhcmlzb24gb3BlcmF0b3JzLgorICAvLyBUaGVzZSByZXR1cm4gd2hldGhlciB0d28gc2NvcGVkX2FycmF5IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCwgbm90IGp1c3QgdG8KKyAgLy8gdHdvIGRpZmZlcmVudCBidXQgZXF1YWwgb2JqZWN0cy4KKyAgYm9vbCBvcGVyYXRvcj09KEMqIHApIGNvbnN0IHsgcmV0dXJuIGFycmF5XyA9PSBwOyB9CisgIGJvb2wgb3BlcmF0b3IhPShDKiBwKSBjb25zdCB7IHJldHVybiBhcnJheV8gIT0gcDsgfQorCisgIC8vIFN3YXAgdHdvIHNjb3BlZCBhcnJheXMuCisgIHZvaWQgc3dhcChzY29wZWRfYXJyYXkmIHAyKSB7CisgICAgQyogdG1wID0gYXJyYXlfOworICAgIGFycmF5XyA9IHAyLmFycmF5XzsKKyAgICBwMi5hcnJheV8gPSB0bXA7CisgIH0KKworICAvLyBSZWxlYXNlIGFuIGFycmF5LgorICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBjdXJyZW50IHBvaW50ZXIgaGVsZCBieSB0aGlzIG9iamVjdC4KKyAgLy8gSWYgdGhpcyBvYmplY3QgaG9sZHMgYSBOVUxMIHBvaW50ZXIsIHRoZSByZXR1cm4gdmFsdWUgaXMgTlVMTC4KKyAgLy8gQWZ0ZXIgdGhpcyBvcGVyYXRpb24sIHRoaXMgb2JqZWN0IHdpbGwgaG9sZCBhIE5VTEwgcG9pbnRlciwKKyAgLy8gYW5kIHdpbGwgbm90IG93biB0aGUgb2JqZWN0IGFueSBtb3JlLgorICBDKiByZWxlYXNlKCkgeworICAgIEMqIHJldFZhbCA9IGFycmF5XzsKKyAgICBhcnJheV8gPSBOVUxMOworICAgIHJldHVybiByZXRWYWw7CisgIH0KKworIHByaXZhdGU6CisgIEMqIGFycmF5XzsKKworICAvLyBGb3JiaWQgY29tcGFyaXNvbiBvZiBkaWZmZXJlbnQgc2NvcGVkX2FycmF5IHR5cGVzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgQzI+IGJvb2wgb3BlcmF0b3I9PShzY29wZWRfYXJyYXk8QzI+IGNvbnN0JiBwMikgY29uc3Q7CisgIHRlbXBsYXRlIDxjbGFzcyBDMj4gYm9vbCBvcGVyYXRvciE9KHNjb3BlZF9hcnJheTxDMj4gY29uc3QmIHAyKSBjb25zdDsKKworICAvLyBEaXNhbGxvdyBldmlsIGNvbnN0cnVjdG9ycworICBzY29wZWRfYXJyYXkoY29uc3Qgc2NvcGVkX2FycmF5Jik7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHNjb3BlZF9hcnJheSYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFdlIG1hZGUgdGhlc2UgaW50ZXJuYWwgc28gdGhhdCB0aGV5IHdvdWxkIHNob3cgdXAgYXMgc3VjaCBpbiB0aGUgZG9jcywKKy8vIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHN0aWNrICJpbnRlcm5hbDo6IiBpbiBmcm9udCBvZiB0aGVtIGV2ZXJ5d2hlcmUuCit1c2luZyBpbnRlcm5hbDo6c2NvcGVkX3B0cjsKK3VzaW5nIGludGVybmFsOjpzY29wZWRfYXJyYXk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGVtdWxhdGVzIGdvb2dsZTMvYmFzZS9sb2dnaW5nLmgKKworZW51bSBMb2dMZXZlbCB7CisgIExPR0xFVkVMX0lORk8sICAgICAvLyBJbmZvcm1hdGlvbmFsLiAgVGhpcyBpcyBuZXZlciBhY3R1YWxseSB1c2VkIGJ5CisgICAgICAgICAgICAgICAgICAgICAvLyBsaWJwcm90b2J1Zi4KKyAgTE9HTEVWRUxfV0FSTklORywgIC8vIFdhcm5zIGFib3V0IGlzc3VlcyB0aGF0LCBhbHRob3VnaCBub3QgdGVjaG5pY2FsbHkgYQorICAgICAgICAgICAgICAgICAgICAgLy8gcHJvYmxlbSBub3csIGNvdWxkIGNhdXNlIHByb2JsZW1zIGluIHRoZSBmdXR1cmUuICBGb3IKKyAgICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGUsIGEgLy8gd2FybmluZyB3aWxsIGJlIHByaW50ZWQgd2hlbiBwYXJzaW5nIGEKKyAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgdGhhdCBpcyBuZWFyIHRoZSBtZXNzYWdlIHNpemUgbGltaXQuCisgIExPR0xFVkVMX0VSUk9SLCAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsIHVzZS4KKyAgTE9HTEVWRUxfRkFUQUwsICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIGZyb20gd2hpY2ggdGhlIGxpYnJhcnkgY2Fubm90CisgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyLiAgVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIHByb2dyYW1taW5nIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgY29kZSB3aGljaCBjYWxscyB0aGUgbGlicmFyeSwgZXNwZWNpYWxseSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAvLyBjb21waWxlZCBpbiBkZWJ1ZyBtb2RlLgorCisjaWZkZWYgTkRFQlVHCisgIExPR0xFVkVMX0RGQVRBTCA9IExPR0xFVkVMX0VSUk9SCisjZWxzZQorICBMT0dMRVZFTF9ERkFUQUwgPSBMT0dMRVZFTF9GQVRBTAorI2VuZGlmCit9OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBMb2dGaW5pc2hlcjsKKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIExvZ01lc3NhZ2UgeworIHB1YmxpYzoKKyAgTG9nTWVzc2FnZShMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lKTsKKyAgfkxvZ01lc3NhZ2UoKTsKKworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwoY29uc3QgY2hhciogdmFsdWUpOworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGNoYXIgdmFsdWUpOworICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGludCB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwodWludCB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwobG9uZyB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyB2YWx1ZSk7CisgIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwoZG91YmxlIHZhbHVlKTsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBMb2dGaW5pc2hlcjsKKyAgdm9pZCBGaW5pc2goKTsKKworICBMb2dMZXZlbCBsZXZlbF87CisgIGNvbnN0IGNoYXIqIGZpbGVuYW1lXzsKKyAgaW50IGxpbmVfOworICBzdGQ6OnN0cmluZyBtZXNzYWdlXzsKK307CisKKy8vIFVzZWQgdG8gbWFrZSB0aGUgZW50aXJlICJMT0coQkxBSCkgPDwgZXRjLiIgZXhwcmVzc2lvbiBoYXZlIGEgdm9pZCByZXR1cm4KKy8vIHR5cGUgYW5kIHByaW50IGEgbmV3bGluZSBhZnRlciBlYWNoIG1lc3NhZ2UuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTG9nRmluaXNoZXIgeworIHB1YmxpYzoKKyAgdm9pZCBvcGVyYXRvcj0oTG9nTWVzc2FnZSYgb3RoZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFVuZGVmIGV2ZXJ5dGhpbmcgaW4gY2FzZSB3ZSdyZSBiZWluZyBtaXhlZCB3aXRoIHNvbWUgb3RoZXIgR29vZ2xlIGxpYnJhcnkKKy8vIHdoaWNoIGFscmVhZHkgZGVmaW5lZCB0aGVtIGl0c2VsZi4gIFByZXN1bWFibHkgYWxsIEdvb2dsZSBsaWJyYXJpZXMgd2lsbAorLy8gc3VwcG9ydCB0aGUgc2FtZSBzeW50YXggZm9yIHRoZXNlIHNvIGl0IHNob3VsZCBub3QgYmUgYSBiaWcgZGVhbCBpZiB0aGV5CisvLyBlbmQgdXAgdXNpbmcgb3VyIGRlZmluaXRpb25zIGluc3RlYWQuCisjdW5kZWYgR09PR0xFX0xPRworI3VuZGVmIEdPT0dMRV9MT0dfSUYKKworI3VuZGVmIEdPT0dMRV9DSEVDSworI3VuZGVmIEdPT0dMRV9DSEVDS19FUQorI3VuZGVmIEdPT0dMRV9DSEVDS19ORQorI3VuZGVmIEdPT0dMRV9DSEVDS19MVAorI3VuZGVmIEdPT0dMRV9DSEVDS19MRQorI3VuZGVmIEdPT0dMRV9DSEVDS19HVAorI3VuZGVmIEdPT0dMRV9DSEVDS19HRQorCisjdW5kZWYgR09PR0xFX0RMT0cKKyN1bmRlZiBHT09HTEVfRENIRUNLCisjdW5kZWYgR09PR0xFX0RDSEVDS19FUQorI3VuZGVmIEdPT0dMRV9EQ0hFQ0tfTkUKKyN1bmRlZiBHT09HTEVfRENIRUNLX0xUCisjdW5kZWYgR09PR0xFX0RDSEVDS19MRQorI3VuZGVmIEdPT0dMRV9EQ0hFQ0tfR1QKKyN1bmRlZiBHT09HTEVfRENIRUNLX0dFCisKKyNkZWZpbmUgR09PR0xFX0xPRyhMRVZFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpMb2dGaW5pc2hlcigpID0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TG9nTWVzc2FnZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TE9HTEVWRUxfIyNMRVZFTCwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBHT09HTEVfTE9HX0lGKExFVkVMLCBDT05ESVRJT04pIFwKKyAgIShDT05ESVRJT04pID8gKHZvaWQpMCA6IEdPT0dMRV9MT0coTEVWRUwpCisKKyNkZWZpbmUgR09PR0xFX0NIRUNLKEVYUFJFU1NJT04pIFwKKyAgR09PR0xFX0xPR19JRihGQVRBTCwgIShFWFBSRVNTSU9OKSkgPDwgIkNIRUNLIGZhaWxlZDogIiAjRVhQUkVTU0lPTiAiOiAiCisjZGVmaW5lIEdPT0dMRV9DSEVDS19FUShBLCBCKSBHT09HTEVfQ0hFQ0soKEEpID09IChCKSkKKyNkZWZpbmUgR09PR0xFX0NIRUNLX05FKEEsIEIpIEdPT0dMRV9DSEVDSygoQSkgIT0gKEIpKQorI2RlZmluZSBHT09HTEVfQ0hFQ0tfTFQoQSwgQikgR09PR0xFX0NIRUNLKChBKSA8ICAoQikpCisjZGVmaW5lIEdPT0dMRV9DSEVDS19MRShBLCBCKSBHT09HTEVfQ0hFQ0soKEEpIDw9IChCKSkKKyNkZWZpbmUgR09PR0xFX0NIRUNLX0dUKEEsIEIpIEdPT0dMRV9DSEVDSygoQSkgPiAgKEIpKQorI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0UoQSwgQikgR09PR0xFX0NIRUNLKChBKSA+PSAoQikpCisKKyNpZmRlZiBOREVCVUcKKworI2RlZmluZSBHT09HTEVfRExPRyBHT09HTEVfTE9HX0lGKElORk8sIGZhbHNlKQorCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0soRVhQUkVTU0lPTikgd2hpbGUoZmFsc2UpIEdPT0dMRV9DSEVDSyhFWFBSRVNTSU9OKQorI2RlZmluZSBHT09HTEVfRENIRUNLX0VRKEEsIEIpIEdPT0dMRV9EQ0hFQ0soKEEpID09IChCKSkKKyNkZWZpbmUgR09PR0xFX0RDSEVDS19ORShBLCBCKSBHT09HTEVfRENIRUNLKChBKSAhPSAoQikpCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTFQoQSwgQikgR09PR0xFX0RDSEVDSygoQSkgPCAgKEIpKQorI2RlZmluZSBHT09HTEVfRENIRUNLX0xFKEEsIEIpIEdPT0dMRV9EQ0hFQ0soKEEpIDw9IChCKSkKKyNkZWZpbmUgR09PR0xFX0RDSEVDS19HVChBLCBCKSBHT09HTEVfRENIRUNLKChBKSA+ICAoQikpCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfR0UoQSwgQikgR09PR0xFX0RDSEVDSygoQSkgPj0gKEIpKQorCisjZWxzZSAgLy8gTkRFQlVHCisKKyNkZWZpbmUgR09PR0xFX0RMT0cgR09PR0xFX0xPRworCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0sgICAgR09PR0xFX0NIRUNLCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfRVEgR09PR0xFX0NIRUNLX0VRCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTkUgR09PR0xFX0NIRUNLX05FCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTFQgR09PR0xFX0NIRUNLX0xUCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTEUgR09PR0xFX0NIRUNLX0xFCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfR1QgR09PR0xFX0NIRUNLX0dUCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfR0UgR09PR0xFX0NIRUNLX0dFCisKKyNlbmRpZiAgLy8gIU5ERUJVRworCit0eXBlZGVmIHZvaWQgTG9nSGFuZGxlcihMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworCisvLyBUaGUgcHJvdG9idWYgbGlicmFyeSBzb21ldGltZXMgd3JpdGVzIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzIHRvCisvLyBzdGRlcnIuICBUaGVzZSBtZXNzYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgZGV2ZWxvcGVycywgYnV0IG1heQorLy8gYWxzbyBoZWxwIGVuZCB1c2VycyBmaWd1cmUgb3V0IGEgcHJvYmxlbS4gIElmIHlvdSB3b3VsZCBwcmVmZXIgdGhhdAorLy8gdGhlc2UgbWVzc2FnZXMgYmUgc2VudCBzb21ld2hlcmUgb3RoZXIgdGhhbiBzdGRlcnIsIGNhbGwgU2V0TG9nSGFuZGxlcigpCisvLyB0byBzZXQgeW91ciBvd24gaGFuZGxlci4gIFRoaXMgcmV0dXJucyB0aGUgb2xkIGhhbmRsZXIuICBTZXQgdGhlIGhhbmRsZXIKKy8vIHRvIE5VTEwgdG8gaWdub3JlIGxvZyBtZXNzYWdlcyAoYnV0IHNlZSBhbHNvIExvZ1NpbGVuY2VyLCBiZWxvdykuCisvLworLy8gT2J2aW91c2x5LCBTZXRMb2dIYW5kbGVyIGlzIG5vdCB0aHJlYWQtc2FmZS4gIFlvdSBzaG91bGQgb25seSBjYWxsIGl0CisvLyBhdCBpbml0aWFsaXphdGlvbiB0aW1lLCBhbmQgcHJvYmFibHkgbm90IGZyb20gbGlicmFyeSBjb2RlLiAgSWYgeW91CisvLyBzaW1wbHkgd2FudCB0byBzdXBwcmVzcyBsb2cgbWVzc2FnZXMgdGVtcG9yYXJpbHkgKGUuZy4gYmVjYXVzZSB5b3UKKy8vIGhhdmUgc29tZSBjb2RlIHRoYXQgdGVuZHMgdG8gdHJpZ2dlciB0aGVtIGZyZXF1ZW50bHkgYW5kIHlvdSBrbm93CisvLyB0aGUgd2FybmluZ3MgYXJlIG5vdCBpbXBvcnRhbnQgdG8geW91KSwgdXNlIHRoZSBMb2dTaWxlbmNlciBjbGFzcworLy8gYmVsb3cuCitMSUJQUk9UT0JVRl9FWFBPUlQgTG9nSGFuZGxlciogU2V0TG9nSGFuZGxlcihMb2dIYW5kbGVyKiBuZXdfZnVuYyk7CisKKy8vIENyZWF0ZSBhIExvZ1NpbGVuY2VyIGlmIHlvdSB3YW50IHRvIHRlbXBvcmFyaWx5IHN1cHByZXNzIGFsbCBsb2cKKy8vIG1lc3NhZ2VzLiAgQXMgbG9uZyBhcyBhbnkgTG9nU2lsZW5jZXIgb2JqZWN0cyBleGlzdCwgbm9uLWZhdGFsCisvLyBsb2cgbWVzc2FnZXMgd2lsbCBiZSBkaXNjYXJkZWQgKHRoZSBjdXJyZW50IExvZ0hhbmRsZXIgd2lsbCAqbm90KgorLy8gYmUgY2FsbGVkKS4gIENvbnN0cnVjdGluZyBhIExvZ1NpbGVuY2VyIGlzIHRocmVhZC1zYWZlLiAgWW91IG1heQorLy8gYWNjaWRlbnRhbGx5IHN1cHByZXNzIGxvZyBtZXNzYWdlcyBvY2N1cnJpbmcgaW4gYW5vdGhlciB0aHJlYWQsIGJ1dAorLy8gc2luY2UgbWVzc2FnZXMgYXJlIGdlbmVyYWxseSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHksIHRoaXMgaXNuJ3QKKy8vIGEgYmlnIGRlYWwuICBJZiB5b3Ugd2FudCB0byBpbnRlcmNlcHQgbG9nIG1lc3NhZ2VzLCB1c2UgU2V0TG9nSGFuZGxlcigpLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIExvZ1NpbGVuY2VyIHsKKyBwdWJsaWM6CisgIExvZ1NpbGVuY2VyKCk7CisgIH5Mb2dTaWxlbmNlcigpOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL2NhbGxiYWNrLmgKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhIGNhbGxiYWNrLiAgV2hlbiBjYWxsaW5nIGFuIFJQQywgeW91IG11c3QgcHJvdmlkZQorLy8gYSBDbG9zdXJlIHRvIGNhbGwgd2hlbiB0aGUgcHJvY2VkdXJlIGNvbXBsZXRlcy4gIFNlZSB0aGUgU2VydmljZSBpbnRlcmZhY2UKKy8vIGluIHNlcnZpY2UuaC4KKy8vCisvLyBUbyBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdCBhIENsb3N1cmUgd2hpY2ggY2FsbHMgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIG9yCisvLyBtZXRob2Qgd2l0aCBhIHBhcnRpY3VsYXIgc2V0IG9mIHBhcmFtZXRlcnMsIHVzZSB0aGUgTmV3Q2FsbGJhY2soKSBmdW5jdGlvbi4KKy8vIEV4YW1wbGU6CisvLyAgIHZvaWQgRm9vRG9uZShjb25zdCBGb29SZXNwb25zZSogcmVzcG9uc2UpIHsKKy8vICAgICAuLi4KKy8vICAgfQorLy8KKy8vICAgdm9pZCBDYWxsRm9vKCkgeworLy8gICAgIC4uLgorLy8gICAgIC8vIFdoZW4gZG9uZSwgY2FsbCBGb29Eb25lKCkgYW5kIHBhc3MgaXQgYSBwb2ludGVyIHRvIHRoZSByZXNwb25zZS4KKy8vICAgICBDbG9zdXJlKiBjYWxsYmFjayA9IE5ld0NhbGxiYWNrKCZGb29Eb25lLCByZXNwb25zZSk7CisvLyAgICAgLy8gTWFrZSB0aGUgY2FsbC4KKy8vICAgICBzZXJ2aWNlLT5Gb28oY29udHJvbGxlciwgcmVxdWVzdCwgcmVzcG9uc2UsIGNhbGxiYWNrKTsKKy8vICAgfQorLy8KKy8vIEV4YW1wbGUgdGhhdCBjYWxscyBhIG1ldGhvZDoKKy8vICAgY2xhc3MgSGFuZGxlciB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgLi4uCisvLworLy8gICAgIHZvaWQgRm9vRG9uZShjb25zdCBGb29SZXNwb25zZSogcmVzcG9uc2UpIHsKKy8vICAgICAgIC4uLgorLy8gICAgIH0KKy8vCisvLyAgICAgdm9pZCBDYWxsRm9vKCkgeworLy8gICAgICAgLi4uCisvLyAgICAgICAvLyBXaGVuIGRvbmUsIGNhbGwgRm9vRG9uZSgpIGFuZCBwYXNzIGl0IGEgcG9pbnRlciB0byB0aGUgcmVzcG9uc2UuCisvLyAgICAgICBDbG9zdXJlKiBjYWxsYmFjayA9IE5ld0NhbGxiYWNrKHRoaXMsICZIYW5kbGVyOjpGb29Eb25lLCByZXNwb25zZSk7CisvLyAgICAgICAvLyBNYWtlIHRoZSBjYWxsLgorLy8gICAgICAgc2VydmljZS0+Rm9vKGNvbnRyb2xsZXIsIHJlcXVlc3QsIHJlc3BvbnNlLCBjYWxsYmFjayk7CisvLyAgICAgfQorLy8gICB9OworLy8KKy8vIEN1cnJlbnRseSBOZXdDYWxsYmFjaygpIHN1cHBvcnRzIGJpbmRpbmcgemVybywgb25lLCBvciB0d28gYXJndW1lbnRzLgorLy8KKy8vIENhbGxiYWNrcyBjcmVhdGVkIHdpdGggTmV3Q2FsbGJhY2soKSBhdXRvbWF0aWNhbGx5IGRlbGV0ZSB0aGVtc2VsdmVzIHdoZW4KKy8vIGV4ZWN1dGVkLiAgVGhleSBzaG91bGQgYmUgdXNlZCB3aGVuIGEgY2FsbGJhY2sgaXMgdG8gYmUgY2FsbGVkIGV4YWN0bHkKKy8vIG9uY2UgKHVzdWFsbHkgdGhlIGNhc2Ugd2l0aCBSUEMgY2FsbGJhY2tzKS4gIElmIGEgY2FsbGJhY2sgbWF5IGJlIGNhbGxlZAorLy8gYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHRpbWVzIChpbmNsdWRpbmcgemVybyksIGNyZWF0ZSBpdCB3aXRoCisvLyBOZXdQZXJtYW5lbnRDYWxsYmFjaygpIGluc3RlYWQuICBZb3UgYXJlIHRoZW4gcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQorLy8gY2FsbGJhY2sgKHVzaW5nIHRoZSAiZGVsZXRlIiBrZXl3b3JkIGFzIG5vcm1hbCkuCisvLworLy8gTm90ZSB0aGF0IE5ld0NhbGxiYWNrKCkgaXMgYSBiaXQgdG91Y2h5IHJlZ2FyZGluZyBhcmd1bWVudCB0eXBlcy4gIEdlbmVyYWxseSwKKy8vIHRoZSB2YWx1ZXMgeW91IHByb3ZpZGUgZm9yIHRoZSBwYXJhbWV0ZXIgYmluZGluZ3MgbXVzdCBleGFjdGx5IG1hdGNoIHRoZQorLy8gdHlwZXMgYWNjZXB0ZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CisvLyAgIHZvaWQgRm9vKHN0cmluZyBzKTsKKy8vICAgTmV3Q2FsbGJhY2soJkZvbywgImZvbyIpOyAgICAgICAgICAvLyBXT04nVCBXT1JLOiAgY29uc3QgY2hhciogIT0gc3RyaW5nCisvLyAgIE5ld0NhbGxiYWNrKCZGb28sIHN0cmluZygiZm9vIikpOyAgLy8gV09SS1MKKy8vIEFsc28gbm90ZSB0aGF0IHRoZSBhcmd1bWVudHMgY2Fubm90IGJlIHJlZmVyZW5jZXM6CisvLyAgIHZvaWQgRm9vKGNvbnN0IHN0cmluZyYgcyk7CisvLyAgIHN0cmluZyBteV9zdHI7CisvLyAgIE5ld0NhbGxiYWNrKCZGb28sIG15X3N0cik7ICAvLyBXT04nVCBXT1JLOiAgQ2FuJ3QgdXNlIHJlZmVyZWNuZXMuCisvLyBIb3dldmVyLCBjb3JyZWN0bHktdHlwZWQgcG9pbnRlcnMgd2lsbCB3b3JrIGp1c3QgZmluZS4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDbG9zdXJlIHsKKyBwdWJsaWM6CisgIENsb3N1cmUoKSB7fQorICB2aXJ0dWFsIH5DbG9zdXJlKCk7CisKKyAgdmlydHVhbCB2b2lkIFJ1bigpID0gMDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDbG9zdXJlKTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGdW5jdGlvbkNsb3N1cmUwIDogcHVibGljIENsb3N1cmUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB2b2lkICgqRnVuY3Rpb25UeXBlKSgpOworCisgIEZ1bmN0aW9uQ2xvc3VyZTAoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcpCisgICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pLCBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSB7fQorICB+RnVuY3Rpb25DbG9zdXJlMCgpOworCisgIHZvaWQgUnVuKCkgeworICAgIGJvb2wgbmVlZHNfZGVsZXRlID0gc2VsZl9kZWxldGluZ187ICAvLyByZWFkIGluIGNhc2UgY2FsbGJhY2sgZGVsZXRlcworICAgIGZ1bmN0aW9uXygpOworICAgIGlmIChuZWVkc19kZWxldGUpIGRlbGV0ZSB0aGlzOworICB9CisKKyBwcml2YXRlOgorICBGdW5jdGlvblR5cGUgZnVuY3Rpb25fOworICBib29sIHNlbGZfZGVsZXRpbmdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzPgorY2xhc3MgTWV0aG9kQ2xvc3VyZTAgOiBwdWJsaWMgQ2xvc3VyZSB7CisgcHVibGljOgorICB0eXBlZGVmIHZvaWQgKENsYXNzOjoqTWV0aG9kVHlwZSkoKTsKKworICBNZXRob2RDbG9zdXJlMChDbGFzcyogb2JqZWN0LCBNZXRob2RUeXBlIG1ldGhvZCwgYm9vbCBzZWxmX2RlbGV0aW5nKQorICAgIDogb2JqZWN0XyhvYmplY3QpLCBtZXRob2RfKG1ldGhvZCksIHNlbGZfZGVsZXRpbmdfKHNlbGZfZGVsZXRpbmcpIHt9CisgIH5NZXRob2RDbG9zdXJlMCgpIHt9CisKKyAgdm9pZCBSdW4oKSB7CisgICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCisgICAgKG9iamVjdF8tPiptZXRob2RfKSgpOworICAgIGlmIChuZWVkc19kZWxldGUpIGRlbGV0ZSB0aGlzOworICB9CisKKyBwcml2YXRlOgorICBDbGFzcyogb2JqZWN0XzsKKyAgTWV0aG9kVHlwZSBtZXRob2RfOworICBib29sIHNlbGZfZGVsZXRpbmdfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEFyZzE+CitjbGFzcyBGdW5jdGlvbkNsb3N1cmUxIDogcHVibGljIENsb3N1cmUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB2b2lkICgqRnVuY3Rpb25UeXBlKShBcmcxIGFyZzEpOworCisgIEZ1bmN0aW9uQ2xvc3VyZTEoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcsCisgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxKQorICAgIDogZnVuY3Rpb25fKGZ1bmN0aW9uKSwgc2VsZl9kZWxldGluZ18oc2VsZl9kZWxldGluZyksCisgICAgICBhcmcxXyhhcmcxKSB7fQorICB+RnVuY3Rpb25DbG9zdXJlMSgpIHt9CisKKyAgdm9pZCBSdW4oKSB7CisgICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCisgICAgZnVuY3Rpb25fKGFyZzFfKTsKKyAgICBpZiAobmVlZHNfZGVsZXRlKSBkZWxldGUgdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uXzsKKyAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKKyAgQXJnMSBhcmcxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgQXJnMT4KK2NsYXNzIE1ldGhvZENsb3N1cmUxIDogcHVibGljIENsb3N1cmUgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB2b2lkIChDbGFzczo6Kk1ldGhvZFR5cGUpKEFyZzEgYXJnMSk7CisKKyAgTWV0aG9kQ2xvc3VyZTEoQ2xhc3MqIG9iamVjdCwgTWV0aG9kVHlwZSBtZXRob2QsIGJvb2wgc2VsZl9kZWxldGluZywKKyAgICAgICAgICAgICAgICAgQXJnMSBhcmcxKQorICAgIDogb2JqZWN0XyhvYmplY3QpLCBtZXRob2RfKG1ldGhvZCksIHNlbGZfZGVsZXRpbmdfKHNlbGZfZGVsZXRpbmcpLAorICAgICAgYXJnMV8oYXJnMSkge30KKyAgfk1ldGhvZENsb3N1cmUxKCkge30KKworICB2b2lkIFJ1bigpIHsKKyAgICBib29sIG5lZWRzX2RlbGV0ZSA9IHNlbGZfZGVsZXRpbmdfOyAgLy8gcmVhZCBpbiBjYXNlIGNhbGxiYWNrIGRlbGV0ZXMKKyAgICAob2JqZWN0Xy0+Km1ldGhvZF8pKGFyZzFfKTsKKyAgICBpZiAobmVlZHNfZGVsZXRlKSBkZWxldGUgdGhpczsKKyAgfQorCisgcHJpdmF0ZToKKyAgQ2xhc3MqIG9iamVjdF87CisgIE1ldGhvZFR5cGUgbWV0aG9kXzsKKyAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKKyAgQXJnMSBhcmcxXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgorY2xhc3MgRnVuY3Rpb25DbG9zdXJlMiA6IHB1YmxpYyBDbG9zdXJlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCAoKkZ1bmN0aW9uVHlwZSkoQXJnMSBhcmcxLCBBcmcyIGFyZzIpOworCisgIEZ1bmN0aW9uQ2xvc3VyZTIoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcsCisgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpCisgICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pLCBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSwKKyAgICAgIGFyZzFfKGFyZzEpLCBhcmcyXyhhcmcyKSB7fQorICB+RnVuY3Rpb25DbG9zdXJlMigpIHt9CisKKyAgdm9pZCBSdW4oKSB7CisgICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCisgICAgZnVuY3Rpb25fKGFyZzFfLCBhcmcyXyk7CisgICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIEZ1bmN0aW9uVHlwZSBmdW5jdGlvbl87CisgIGJvb2wgc2VsZl9kZWxldGluZ187CisgIEFyZzEgYXJnMV87CisgIEFyZzIgYXJnMl87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+CitjbGFzcyBNZXRob2RDbG9zdXJlMiA6IHB1YmxpYyBDbG9zdXJlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgdm9pZCAoQ2xhc3M6OipNZXRob2RUeXBlKShBcmcxIGFyZzEsIEFyZzIgYXJnMik7CisKKyAgTWV0aG9kQ2xvc3VyZTIoQ2xhc3MqIG9iamVjdCwgTWV0aG9kVHlwZSBtZXRob2QsIGJvb2wgc2VsZl9kZWxldGluZywKKyAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpCisgICAgOiBvYmplY3RfKG9iamVjdCksIG1ldGhvZF8obWV0aG9kKSwgc2VsZl9kZWxldGluZ18oc2VsZl9kZWxldGluZyksCisgICAgICBhcmcxXyhhcmcxKSwgYXJnMl8oYXJnMikge30KKyAgfk1ldGhvZENsb3N1cmUyKCkge30KKworICB2b2lkIFJ1bigpIHsKKyAgICBib29sIG5lZWRzX2RlbGV0ZSA9IHNlbGZfZGVsZXRpbmdfOyAgLy8gcmVhZCBpbiBjYXNlIGNhbGxiYWNrIGRlbGV0ZXMKKyAgICAob2JqZWN0Xy0+Km1ldGhvZF8pKGFyZzFfLCBhcmcyXyk7CisgICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7CisgIH0KKworIHByaXZhdGU6CisgIENsYXNzKiBvYmplY3RfOworICBNZXRob2RUeXBlIG1ldGhvZF87CisgIGJvb2wgc2VsZl9kZWxldGluZ187CisgIEFyZzEgYXJnMV87CisgIEFyZzIgYXJnMl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gU2VlIENsb3N1cmUuCitpbmxpbmUgQ2xvc3VyZSogTmV3Q2FsbGJhY2sodm9pZCAoKmZ1bmN0aW9uKSgpKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTAoZnVuY3Rpb24sIHRydWUpOworfQorCisvLyBTZWUgQ2xvc3VyZS4KK2lubGluZSBDbG9zdXJlKiBOZXdQZXJtYW5lbnRDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKCkpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6RnVuY3Rpb25DbG9zdXJlMChmdW5jdGlvbiwgZmFsc2UpOworfQorCisvLyBTZWUgQ2xvc3VyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcz4KK2lubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayhDbGFzcyogb2JqZWN0LCB2b2lkIChDbGFzczo6Km1ldGhvZCkoKSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RDbG9zdXJlMDxDbGFzcz4ob2JqZWN0LCBtZXRob2QsIHRydWUpOworfQorCisvLyBTZWUgQ2xvc3VyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcz4KK2lubGluZSBDbG9zdXJlKiBOZXdQZXJtYW5lbnRDYWxsYmFjayhDbGFzcyogb2JqZWN0LCB2b2lkIChDbGFzczo6Km1ldGhvZCkoKSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RDbG9zdXJlMDxDbGFzcz4ob2JqZWN0LCBtZXRob2QsIGZhbHNlKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMT4KK2lubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKEFyZzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpGdW5jdGlvbkNsb3N1cmUxPEFyZzE+KGZ1bmN0aW9uLCB0cnVlLCBhcmcxKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMT4KK2lubGluZSBDbG9zdXJlKiBOZXdQZXJtYW5lbnRDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKEFyZzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpGdW5jdGlvbkNsb3N1cmUxPEFyZzE+KGZ1bmN0aW9uLCBmYWxzZSwgYXJnMSk7Cit9CisKKy8vIFNlZSBDbG9zdXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBBcmcxPgoraW5saW5lIENsb3N1cmUqIE5ld0NhbGxiYWNrKENsYXNzKiBvYmplY3QsIHZvaWQgKENsYXNzOjoqbWV0aG9kKShBcmcxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcxIGFyZzEpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6TWV0aG9kQ2xvc3VyZTE8Q2xhc3MsIEFyZzE+KG9iamVjdCwgbWV0aG9kLCB0cnVlLCBhcmcxKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEFyZzE+CitpbmxpbmUgQ2xvc3VyZSogTmV3UGVybWFuZW50Q2FsbGJhY2soQ2xhc3MqIG9iamVjdCwgdm9pZCAoQ2xhc3M6OiptZXRob2QpKEFyZzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSkgeworICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RDbG9zdXJlMTxDbGFzcywgQXJnMT4ob2JqZWN0LCBtZXRob2QsIGZhbHNlLCBhcmcxKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4KK2lubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKEFyZzEsIEFyZzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSwgQXJnMiBhcmcyKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTI8QXJnMSwgQXJnMj4oCisgICAgZnVuY3Rpb24sIHRydWUsIGFyZzEsIGFyZzIpOworfQorCisvLyBTZWUgQ2xvc3VyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgoraW5saW5lIENsb3N1cmUqIE5ld1Blcm1hbmVudENhbGxiYWNrKHZvaWQgKCpmdW5jdGlvbikoQXJnMSwgQXJnMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6RnVuY3Rpb25DbG9zdXJlMjxBcmcxLCBBcmcyPigKKyAgICBmdW5jdGlvbiwgZmFsc2UsIGFyZzEsIGFyZzIpOworfQorCisvLyBTZWUgQ2xvc3VyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4KK2lubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayhDbGFzcyogb2JqZWN0LCB2b2lkIChDbGFzczo6Km1ldGhvZCkoQXJnMSwgQXJnMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpIHsKKyAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6TWV0aG9kQ2xvc3VyZTI8Q2xhc3MsIEFyZzEsIEFyZzI+KAorICAgIG9iamVjdCwgbWV0aG9kLCB0cnVlLCBhcmcxLCBhcmcyKTsKK30KKworLy8gU2VlIENsb3N1cmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+CitpbmxpbmUgQ2xvc3VyZSogTmV3UGVybWFuZW50Q2FsbGJhY2soCisgICAgQ2xhc3MqIG9iamVjdCwgdm9pZCAoQ2xhc3M6OiptZXRob2QpKEFyZzEsIEFyZzIpLAorICAgIEFyZzEgYXJnMSwgQXJnMiBhcmcyKSB7CisgIHJldHVybiBuZXcgaW50ZXJuYWw6Ok1ldGhvZENsb3N1cmUyPENsYXNzLCBBcmcxLCBBcmcyPigKKyAgICBvYmplY3QsIG1ldGhvZCwgZmFsc2UsIGFyZzEsIGFyZzIpOworfQorCisvLyBBIGZ1bmN0aW9uIHdoaWNoIGRvZXMgbm90aGluZy4gIFVzZWZ1bCBmb3IgY3JlYXRpbmcgbm8tb3AgY2FsbGJhY2tzLCBlLmcuOgorLy8gICBDbG9zdXJlKiBub3RoaW5nID0gTmV3Q2FsbGJhY2soJkRvTm90aGluZyk7Cit2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBEb05vdGhpbmcoKTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL211dGV4LmgKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQSBNdXRleCBpcyBhIG5vbi1yZWVudHJhbnQgKGFrYSBub24tcmVjdXJzaXZlKSBtdXRleC4gIEF0IG1vc3Qgb25lIHRocmVhZCBUCisvLyBtYXkgaG9sZCBhIG11dGV4IGF0IGEgZ2l2ZW4gdGltZS4gIElmIFQgYXR0ZW1wdHMgdG8gTG9jaygpIHRoZSBzYW1lIE11dGV4CisvLyB3aGlsZSBob2xkaW5nIGl0LCBUIHdpbGwgZGVhZGxvY2suCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTXV0ZXggeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIGEgTXV0ZXggdGhhdCBpcyBub3QgaGVsZCBieSBhbnlib2R5LgorICBNdXRleCgpOworCisgIC8vIERlc3RydWN0b3IKKyAgfk11dGV4KCk7CisKKyAgLy8gQmxvY2sgaWYgbmVjZXNzYXJ5IHVudGlsIHRoaXMgTXV0ZXggaXMgZnJlZSwgdGhlbiBhY3F1aXJlIGl0IGV4Y2x1c2l2ZWx5LgorICB2b2lkIExvY2soKTsKKworICAvLyBSZWxlYXNlIHRoaXMgTXV0ZXguICBDYWxsZXIgbXVzdCBob2xkIGl0IGV4Y2x1c2l2ZWx5LgorICB2b2lkIFVubG9jaygpOworCisgIC8vIENyYXNoIGlmIHRoaXMgTXV0ZXggaXMgbm90IGhlbGQgZXhjbHVzaXZlbHkgYnkgdGhpcyB0aHJlYWQuCisgIC8vIE1heSBmYWlsIHRvIGNyYXNoIHdoZW4gaXQgc2hvdWxkOyB3aWxsIG5ldmVyIGNyYXNoIHdoZW4gaXQgc2hvdWxkIG5vdC4KKyAgdm9pZCBBc3NlcnRIZWxkKCk7CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgSW50ZXJuYWw7CisgIEludGVybmFsKiBtSW50ZXJuYWw7CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE11dGV4KTsKK307CisKKy8vIE11dGV4TG9jayhtdSkgYWNxdWlyZXMgbXUgd2hlbiBjb25zdHJ1Y3RlZCBhbmQgcmVsZWFzZXMgaXQgd2hlbiBkZXN0cm95ZWQuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTXV0ZXhMb2NrIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE11dGV4TG9jayhNdXRleCAqbXUpIDogbXVfKG11KSB7IHRoaXMtPm11Xy0+TG9jaygpOyB9CisgIH5NdXRleExvY2soKSB7IHRoaXMtPm11Xy0+VW5sb2NrKCk7IH0KKyBwcml2YXRlOgorICBNdXRleCAqY29uc3QgbXVfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXV0ZXhMb2NrKTsKK307CisKKy8vIFRPRE8oa2VudG9uKTogIEltcGxlbWVudCB0aGVzZT8gIEhhcmQgdG8gaW1wbGVtZW50IHBvcnRhYmx5LgordHlwZWRlZiBNdXRleExvY2sgUmVhZGVyTXV0ZXhMb2NrOwordHlwZWRlZiBNdXRleExvY2sgV3JpdGVyTXV0ZXhMb2NrOworCisvLyBNdXRleExvY2tNYXliZSBpcyBsaWtlIE11dGV4TG9jaywgYnV0IGlzIGEgbm8tb3Agd2hlbiBtdSBpcyBOVUxMLgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE11dGV4TG9ja01heWJlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE11dGV4TG9ja01heWJlKE11dGV4ICptdSkgOgorICAgIG11XyhtdSkgeyBpZiAodGhpcy0+bXVfICE9IE5VTEwpIHsgdGhpcy0+bXVfLT5Mb2NrKCk7IH0gfQorICB+TXV0ZXhMb2NrTWF5YmUoKSB7IGlmICh0aGlzLT5tdV8gIT0gTlVMTCkgeyB0aGlzLT5tdV8tPlVubG9jaygpOyB9IH0KKyBwcml2YXRlOgorICBNdXRleCAqY29uc3QgbXVfOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXV0ZXhMb2NrTWF5YmUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFdlIG1hZGUgdGhlc2UgaW50ZXJuYWwgc28gdGhhdCB0aGV5IHdvdWxkIHNob3cgdXAgYXMgc3VjaCBpbiB0aGUgZG9jcywKKy8vIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHN0aWNrICJpbnRlcm5hbDo6IiBpbiBmcm9udCBvZiB0aGVtIGV2ZXJ5d2hlcmUuCit1c2luZyBpbnRlcm5hbDo6TXV0ZXg7Cit1c2luZyBpbnRlcm5hbDo6TXV0ZXhMb2NrOwordXNpbmcgaW50ZXJuYWw6OlJlYWRlck11dGV4TG9jazsKK3VzaW5nIGludGVybmFsOjpXcml0ZXJNdXRleExvY2s7Cit1c2luZyBpbnRlcm5hbDo6TXV0ZXhMb2NrTWF5YmU7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGZyb20gZ29vZ2xlMy9iYXNlL3R5cGVfdHJhaXRzLmgKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gU3BlY2lmaWVkIGJ5IFRSMSBbNC43LjRdIFBvaW50ZXIgbW9kaWZpY2F0aW9ucy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcG9pbnRlciB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqPiB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqIGNvbnN0PiB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqIHZvbGF0aWxlPiB7IHR5cGVkZWYgVCB0eXBlOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqIGNvbnN0IHZvbGF0aWxlPiB7CisgIHR5cGVkZWYgVCB0eXBlOyB9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIENoZWNrcyBpZiB0aGUgYnVmZmVyIGNvbnRhaW5zIHN0cnVjdHVyYWxseS12YWxpZCBVVEYtOC4gIEltcGxlbWVudGVkIGluCisvLyBzdHJ1Y3R1cmFsbHlfdmFsaWQuY2MuCitMSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChjb25zdCBjaGFyKiBidWYsIGludCBsZW4pOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gU2h1dGRvd24gc3VwcG9ydC4KKworLy8gU2h1dCBkb3duIHRoZSBlbnRpcmUgcHJvdG9jb2wgYnVmZmVycyBsaWJyYXJ5LCBkZWxldGluZyBhbGwgc3RhdGljLWR1cmF0aW9uCisvLyBvYmplY3RzIGFsbG9jYXRlZCBieSB0aGUgbGlicmFyeSBvciBieSBnZW5lcmF0ZWQgLnBiLmNjIGZpbGVzLgorLy8KKy8vIFRoZXJlIGFyZSB0d28gcmVhc29ucyB5b3UgbWlnaHQgd2FudCB0byBjYWxsIHRoaXM6CisvLyAqIFlvdSB1c2UgYSBkcmFjb25pYW4gZGVmaW5pdGlvbiBvZiAibWVtb3J5IGxlYWsiIGluIHdoaWNoIHlvdSBleHBlY3QKKy8vICAgZXZlcnkgc2luZ2xlIG1hbGxvYygpIHRvIGhhdmUgYSBjb3JyZXNwb25kaW5nIGZyZWUoKSwgZXZlbiBmb3Igb2JqZWN0cworLy8gICB3aGljaCBsaXZlIHVudGlsIHByb2dyYW0gZXhpdC4KKy8vICogWW91IGFyZSB3cml0aW5nIGEgZHluYW1pY2FsbHktbG9hZGVkIGxpYnJhcnkgd2hpY2ggbmVlZHMgdG8gY2xlYW4gdXAKKy8vICAgYWZ0ZXIgaXRzZWxmIHdoZW4gdGhlIGxpYnJhcnkgaXMgdW5sb2FkZWQuCisvLworLy8gSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgbXVsdGlwbGUgdGltZXMuICBIb3dldmVyLCBpdCBpcyBub3Qgc2FmZSB0byB1c2UKKy8vIGFueSBvdGhlciBwYXJ0IG9mIHRoZSBwcm90b2NvbCBidWZmZXJzIGxpYnJhcnkgYWZ0ZXIKKy8vIFNodXRkb3duUHJvdG9idWZMaWJyYXJ5KCkgaGFzIGJlZW4gY2FsbGVkLgorTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgU2h1dGRvd25Qcm90b2J1ZkxpYnJhcnkoKTsKKworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBTaHV0ZG93blByb3RvY29sQnVmZmVycygpIGlzIGNhbGxlZC4KK0xJQlBST1RPQlVGX0VYUE9SVCB2b2lkIE9uU2h1dGRvd24odm9pZCAoKmZ1bmMpKCkpOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworI2lmZGVmIFBST1RPQlVGX1VTRV9FWENFUFRJT05TCitjbGFzcyBGYXRhbEV4Y2VwdGlvbiA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7CisgcHVibGljOgorICBGYXRhbEV4Y2VwdGlvbihjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGxpbmUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgICAgOiBmaWxlbmFtZV8oZmlsZW5hbWUpLCBsaW5lXyhsaW5lKSwgbWVzc2FnZV8obWVzc2FnZSkge30KKyAgdmlydHVhbCB+RmF0YWxFeGNlcHRpb24oKSB0aHJvdygpOworCisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCk7CisKKyAgY29uc3QgY2hhciogZmlsZW5hbWUoKSBjb25zdCB7IHJldHVybiBmaWxlbmFtZV87IH0KKyAgaW50IGxpbmUoKSBjb25zdCB7IHJldHVybiBsaW5lXzsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1lc3NhZ2VfOyB9CisKKyBwcml2YXRlOgorICBjb25zdCBjaGFyKiBmaWxlbmFtZV87CisgIGNvbnN0IGludCBsaW5lXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgbWVzc2FnZV87Cit9OworI2VuZGlmCisKKy8vIFRoaXMgaXMgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBpbnN0ZWFkIG9mIHRoZSBiZWdpbm5pbmcgdG8gd29yayBhcm91bmQgYSBidWcKKy8vIGluIHNvbWUgdmVyc2lvbnMgb2YgTVNWQy4KK3VzaW5nIG5hbWVzcGFjZSBzdGQ7ICAvLyBEb24ndCBkbyB0aGlzIGF0IGhvbWUsIGtpZHMuCisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01NT05fSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwOWE1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYwpAQCAtMCwwICsxLDM1NyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgeworCisvLyBUT0RPKGtlbnRvbik6ICBNb3JlIHRlc3RzLgorCisjaWZkZWYgUEFDS0FHRV9WRVJTSU9OICAvLyBvbmx5IGRlZmluZWQgd2hlbiB1c2luZyBhdXRvbWFrZSwgbm90IE1TVkMKKworVEVTVChWZXJzaW9uVGVzdCwgVmVyc2lvbk1hdGNoZXNDb25maWcpIHsKKyAgLy8gVmVyaWZ5IHRoYXQgdGhlIHZlcnNpb24gc3RyaW5nIHNwZWNpZmllZCBpbiBjb25maWcuaCBtYXRjaGVzIHRoZSBvbmUKKyAgLy8gaW4gY29tbW9uLmguICBUaGUgY29uZmlnLmggdmVyc2lvbiBpcyBhIHN0cmluZyB3aGljaCBtYXkgaGF2ZSBhIHN1ZmZpeAorICAvLyBsaWtlICJiZXRhIiBvciAicmMxIiwgc28gd2UgcmVtb3ZlIHRoYXQuCisgIHN0cmluZyB2ZXJzaW9uID0gUEFDS0FHRV9WRVJTSU9OOworICBpbnQgcG9zID0gMDsKKyAgd2hpbGUgKHBvcyA8IHZlcnNpb24uc2l6ZSgpICYmCisgICAgICAgICAoYXNjaWlfaXNkaWdpdCh2ZXJzaW9uW3Bvc10pIHx8IHZlcnNpb25bcG9zXSA9PSAnLicpKSB7CisgICAgKytwb3M7CisgIH0KKyAgdmVyc2lvbi5lcmFzZShwb3MpOworCisgIEVYUEVDVF9FUSh2ZXJzaW9uLCBpbnRlcm5hbDo6VmVyc2lvblN0cmluZyhHT09HTEVfUFJPVE9CVUZfVkVSU0lPTikpOworfQorCisjZW5kaWYgIC8vIFBBQ0tBR0VfVkVSU0lPTgorCitURVNUKENvbW1vblRlc3QsIEludE1pbk1heENvbnN0YW50cykgeworICAvLyBraW50MzJtaW4gd2FzIGRlY2xhcmVkIGluY29ycmVjdGx5IGluIHRoZSBmaXJzdCByZWxlYXNlIG9mIHByb3RvYnVmcy4KKyAgLy8gVWdoLgorICBFWFBFQ1RfTFQoa2ludDMybWluLCBraW50MzJtYXgpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dWludDMyPihraW50MzJtaW4pLCBzdGF0aWNfY2FzdDx1aW50MzI+KGtpbnQzMm1heCkgKyAxKTsKKyAgRVhQRUNUX0xUKGtpbnQ2NG1pbiwga2ludDY0bWF4KTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHVpbnQ2ND4oa2ludDY0bWluKSwgc3RhdGljX2Nhc3Q8dWludDY0PihraW50NjRtYXgpICsgMSk7CisgIEVYUEVDVF9FUSgwLCBrdWludDMybWF4ICsgMSk7CisgIEVYUEVDVF9FUSgwLCBrdWludDY0bWF4ICsgMSk7Cit9CisKK3ZlY3RvcjxzdHJpbmc+IGNhcHR1cmVkX21lc3NhZ2VzXzsKKwordm9pZCBDYXB0dXJlTG9nKExvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgIGNhcHR1cmVkX21lc3NhZ2VzXy5wdXNoX2JhY2soCisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiJDAgJDE6JDI6ICQzIiwKKyAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihsZXZlbCksIGZpbGVuYW1lLCBsaW5lLCBtZXNzYWdlKSk7Cit9CisKK1RFU1QoTG9nZ2luZ1Rlc3QsIERlZmF1bHRMb2dnaW5nKSB7CisgIENhcHR1cmVUZXN0U3RkZXJyKCk7CisgIGludCBsaW5lID0gX19MSU5FX187CisgIEdPT0dMRV9MT0coSU5GTyAgICkgPDwgIkEgbWVzc2FnZS4iOworICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJBIHdhcm5pbmcuIjsKKyAgR09PR0xFX0xPRyhFUlJPUiAgKSA8PCAiQW4gZXJyb3IuIjsKKworICBzdHJpbmcgdGV4dCA9IEdldENhcHR1cmVkVGVzdFN0ZGVycigpOworICBFWFBFQ1RfRVEoCisgICAgImxpYnByb3RvYnVmIElORk8gIl9fRklMRV9fIjoiICsgU2ltcGxlSXRvYShsaW5lICsgMSkgKyAiXSBBIG1lc3NhZ2UuXG4iCisgICAgImxpYnByb3RvYnVmIFdBUk5JTkcgIl9fRklMRV9fIjoiICsgU2ltcGxlSXRvYShsaW5lICsgMikgKyAiXSBBIHdhcm5pbmcuXG4iCisgICAgImxpYnByb3RvYnVmIEVSUk9SICJfX0ZJTEVfXyI6IiArIFNpbXBsZUl0b2EobGluZSArIDMpICsgIl0gQW4gZXJyb3IuXG4iLAorICAgIHRleHQpOworfQorCitURVNUKExvZ2dpbmdUZXN0LCBOdWxsTG9nZ2luZykgeworICBMb2dIYW5kbGVyKiBvbGRfaGFuZGxlciA9IFNldExvZ0hhbmRsZXIoTlVMTCk7CisKKyAgQ2FwdHVyZVRlc3RTdGRlcnIoKTsKKyAgR09PR0xFX0xPRyhJTkZPICAgKSA8PCAiQSBtZXNzYWdlLiI7CisgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIkEgd2FybmluZy4iOworICBHT09HTEVfTE9HKEVSUk9SICApIDw8ICJBbiBlcnJvci4iOworCisgIEVYUEVDVF9UUlVFKFNldExvZ0hhbmRsZXIob2xkX2hhbmRsZXIpID09IE5VTEwpOworCisgIHN0cmluZyB0ZXh0ID0gR2V0Q2FwdHVyZWRUZXN0U3RkZXJyKCk7CisgIEVYUEVDVF9FUSgiIiwgdGV4dCk7Cit9CisKK1RFU1QoTG9nZ2luZ1Rlc3QsIENhcHR1cmVMb2dnaW5nKSB7CisgIGNhcHR1cmVkX21lc3NhZ2VzXy5jbGVhcigpOworCisgIExvZ0hhbmRsZXIqIG9sZF9oYW5kbGVyID0gU2V0TG9nSGFuZGxlcigmQ2FwdHVyZUxvZyk7CisKKyAgaW50IHN0YXJ0X2xpbmUgPSBfX0xJTkVfXzsKKyAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkFuIGVycm9yLiI7CisgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIkEgd2FybmluZy4iOworCisgIEVYUEVDVF9UUlVFKFNldExvZ0hhbmRsZXIob2xkX2hhbmRsZXIpID09ICZDYXB0dXJlTG9nKTsKKworICBBU1NFUlRfRVEoMiwgY2FwdHVyZWRfbWVzc2FnZXNfLnNpemUoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAiMiAiX19GSUxFX18iOiIgKyBTaW1wbGVJdG9hKHN0YXJ0X2xpbmUgKyAxKSArICI6IEFuIGVycm9yLiIsCisgICAgY2FwdHVyZWRfbWVzc2FnZXNfWzBdKTsKKyAgRVhQRUNUX0VRKAorICAgICIxICJfX0ZJTEVfXyI6IiArIFNpbXBsZUl0b2Eoc3RhcnRfbGluZSArIDIpICsgIjogQSB3YXJuaW5nLiIsCisgICAgY2FwdHVyZWRfbWVzc2FnZXNfWzFdKTsKK30KKworVEVTVChMb2dnaW5nVGVzdCwgU2lsZW5jZUxvZ2dpbmcpIHsKKyAgY2FwdHVyZWRfbWVzc2FnZXNfLmNsZWFyKCk7CisKKyAgTG9nSGFuZGxlciogb2xkX2hhbmRsZXIgPSBTZXRMb2dIYW5kbGVyKCZDYXB0dXJlTG9nKTsKKworICBpbnQgbGluZTEgPSBfX0xJTkVfXzsgR09PR0xFX0xPRyhJTkZPKSA8PCAiVmlzaWJsZTEiOworICBMb2dTaWxlbmNlciogc2lsZW5jZXIxID0gbmV3IExvZ1NpbGVuY2VyOworICBHT09HTEVfTE9HKElORk8pIDw8ICJOb3QgdmlzaWJsZS4iOworICBMb2dTaWxlbmNlciogc2lsZW5jZXIyID0gbmV3IExvZ1NpbGVuY2VyOworICBHT09HTEVfTE9HKElORk8pIDw8ICJOb3QgdmlzaWJsZS4iOworICBkZWxldGUgc2lsZW5jZXIxOworICBHT09HTEVfTE9HKElORk8pIDw8ICJOb3QgdmlzaWJsZS4iOworICBkZWxldGUgc2lsZW5jZXIyOworICBpbnQgbGluZTIgPSBfX0xJTkVfXzsgR09PR0xFX0xPRyhJTkZPKSA8PCAiVmlzaWJsZTIiOworCisgIEVYUEVDVF9UUlVFKFNldExvZ0hhbmRsZXIob2xkX2hhbmRsZXIpID09ICZDYXB0dXJlTG9nKTsKKworICBBU1NFUlRfRVEoMiwgY2FwdHVyZWRfbWVzc2FnZXNfLnNpemUoKSk7CisgIEVYUEVDVF9FUSgKKyAgICAiMCAiX19GSUxFX18iOiIgKyBTaW1wbGVJdG9hKGxpbmUxKSArICI6IFZpc2libGUxIiwKKyAgICBjYXB0dXJlZF9tZXNzYWdlc19bMF0pOworICBFWFBFQ1RfRVEoCisgICAgIjAgIl9fRklMRV9fIjoiICsgU2ltcGxlSXRvYShsaW5lMikgKyAiOiBWaXNpYmxlMiIsCisgICAgY2FwdHVyZWRfbWVzc2FnZXNfWzFdKTsKK30KKworY2xhc3MgQ2xvc3VyZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2b2lkIFNldEExMjNNZXRob2QoKSAgIHsgYV8gPSAxMjM7IH0KKyAgc3RhdGljIHZvaWQgU2V0QTEyM0Z1bmN0aW9uKCkgeyBjdXJyZW50X2luc3RhbmNlXy0+YV8gPSAxMjM7IH0KKworICB2b2lkIFNldEFNZXRob2QoaW50IGEpICAgICAgICAgeyBhXyA9IGE7IH0KKyAgdm9pZCBTZXRDTWV0aG9kKHN0cmluZyBjKSAgICAgIHsgY18gPSBjOyB9CisKKyAgc3RhdGljIHZvaWQgU2V0QUZ1bmN0aW9uKGludCBhKSAgICAgICAgIHsgY3VycmVudF9pbnN0YW5jZV8tPmFfID0gYTsgfQorICBzdGF0aWMgdm9pZCBTZXRDRnVuY3Rpb24oc3RyaW5nIGMpICAgICAgeyBjdXJyZW50X2luc3RhbmNlXy0+Y18gPSBjOyB9CisKKyAgdm9pZCBTZXRBQk1ldGhvZChpbnQgYSwgY29uc3QgY2hhciogYikgIHsgYV8gPSBhOyBiXyA9IGI7IH0KKyAgc3RhdGljIHZvaWQgU2V0QUJGdW5jdGlvbihpbnQgYSwgY29uc3QgY2hhciogYikgeworICAgIGN1cnJlbnRfaW5zdGFuY2VfLT5hXyA9IGE7CisgICAgY3VycmVudF9pbnN0YW5jZV8tPmJfID0gYjsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgICBjdXJyZW50X2luc3RhbmNlXyA9IHRoaXM7CisgICAgYV8gPSAwOworICAgIGJfID0gTlVMTDsKKyAgICBjXy5jbGVhcigpOworICAgIHBlcm1hbmVudF9jbG9zdXJlXyA9IE5VTEw7CisgIH0KKworICB2b2lkIERlbGV0ZUNsb3N1cmVJbkNhbGxiYWNrKCkgeworICAgIGRlbGV0ZSBwZXJtYW5lbnRfY2xvc3VyZV87CisgIH0KKworICBpbnQgYV87CisgIGNvbnN0IGNoYXIqIGJfOworICBzdHJpbmcgY187CisgIENsb3N1cmUqIHBlcm1hbmVudF9jbG9zdXJlXzsKKworICBzdGF0aWMgQ2xvc3VyZVRlc3QqIGN1cnJlbnRfaW5zdGFuY2VfOworfTsKKworQ2xvc3VyZVRlc3QqIENsb3N1cmVUZXN0OjpjdXJyZW50X2luc3RhbmNlXyA9IE5VTEw7CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVGdW5jdGlvbjApIHsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld0NhbGxiYWNrKCZTZXRBMTIzRnVuY3Rpb24pOworICBFWFBFQ1RfTkUoMTIzLCBhXyk7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoMTIzLCBhXyk7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVNZXRob2QwKSB7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjayhjdXJyZW50X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbG9zdXJlVGVzdDo6U2V0QTEyM01ldGhvZCk7CisgIEVYUEVDVF9ORSgxMjMsIGFfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSgxMjMsIGFfKTsKK30KKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0Q2xvc3VyZUZ1bmN0aW9uMSkgeworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3Q2FsbGJhY2soJlNldEFGdW5jdGlvbiwgNDU2KTsKKyAgRVhQRUNUX05FKDQ1NiwgYV8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDQ1NiwgYV8pOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlTWV0aG9kMSkgeworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3Q2FsbGJhY2soY3VycmVudF9pbnN0YW5jZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2xvc3VyZVRlc3Q6OlNldEFNZXRob2QsIDQ1Nik7CisgIEVYUEVDVF9ORSg0NTYsIGFfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg0NTYsIGFfKTsKK30KKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0Q2xvc3VyZUZ1bmN0aW9uMVN0cmluZykgeworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3Q2FsbGJhY2soJlNldENGdW5jdGlvbiwgc3RyaW5nKCJ0ZXN0IikpOworICBFWFBFQ1RfTkUoInRlc3QiLCBjXyk7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoInRlc3QiLCBjXyk7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVNZXRob2QxU3RyaW5nKSB7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjayhjdXJyZW50X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbG9zdXJlVGVzdDo6U2V0Q01ldGhvZCwgc3RyaW5nKCJ0ZXN0IikpOworICBFWFBFQ1RfTkUoInRlc3QiLCBjXyk7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoInRlc3QiLCBjXyk7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVGdW5jdGlvbjIpIHsKKyAgY29uc3QgY2hhciogY3N0ciA9ICJoZWxsbyI7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjaygmU2V0QUJGdW5jdGlvbiwgNzg5LCBjc3RyKTsKKyAgRVhQRUNUX05FKDc4OSwgYV8pOworICBFWFBFQ1RfTkUoY3N0ciwgYl8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDc4OSwgYV8pOworICBFWFBFQ1RfRVEoY3N0ciwgYl8pOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlTWV0aG9kMikgeworICBjb25zdCBjaGFyKiBjc3RyID0gImhlbGxvIjsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld0NhbGxiYWNrKGN1cnJlbnRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsb3N1cmVUZXN0OjpTZXRBQk1ldGhvZCwgNzg5LCBjc3RyKTsKKyAgRVhQRUNUX05FKDc4OSwgYV8pOworICBFWFBFQ1RfTkUoY3N0ciwgYl8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDc4OSwgYV8pOworICBFWFBFQ1RfRVEoY3N0ciwgYl8pOworfQorCisvLyBSZXBlYXQgYWxsIG9mIHRoZSBhYm92ZSB3aXRoIE5ld1Blcm1hbmVudENhbGxiYWNrKCkKKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0UGVybWFuZW50Q2xvc3VyZUZ1bmN0aW9uMCkgeworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3UGVybWFuZW50Q2FsbGJhY2soJlNldEExMjNGdW5jdGlvbik7CisgIEVYUEVDVF9ORSgxMjMsIGFfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSgxMjMsIGFfKTsKKyAgYV8gPSAwOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDEyMywgYV8pOworICBkZWxldGUgY2xvc3VyZTsKK30KKworVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0UGVybWFuZW50Q2xvc3VyZU1ldGhvZDApIHsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld1Blcm1hbmVudENhbGxiYWNrKGN1cnJlbnRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsb3N1cmVUZXN0OjpTZXRBMTIzTWV0aG9kKTsKKyAgRVhQRUNUX05FKDEyMywgYV8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDEyMywgYV8pOworICBhXyA9IDA7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoMTIzLCBhXyk7CisgIGRlbGV0ZSBjbG9zdXJlOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RQZXJtYW5lbnRDbG9zdXJlRnVuY3Rpb24xKSB7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdQZXJtYW5lbnRDYWxsYmFjaygmU2V0QUZ1bmN0aW9uLCA0NTYpOworICBFWFBFQ1RfTkUoNDU2LCBhXyk7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoNDU2LCBhXyk7CisgIGFfID0gMDsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg0NTYsIGFfKTsKKyAgZGVsZXRlIGNsb3N1cmU7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdFBlcm1hbmVudENsb3N1cmVNZXRob2QxKSB7CisgIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdQZXJtYW5lbnRDYWxsYmFjayhjdXJyZW50X2luc3RhbmNlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbG9zdXJlVGVzdDo6U2V0QU1ldGhvZCwgNDU2KTsKKyAgRVhQRUNUX05FKDQ1NiwgYV8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDQ1NiwgYV8pOworICBhXyA9IDA7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoNDU2LCBhXyk7CisgIGRlbGV0ZSBjbG9zdXJlOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RQZXJtYW5lbnRDbG9zdXJlRnVuY3Rpb24yKSB7CisgIGNvbnN0IGNoYXIqIGNzdHIgPSAiaGVsbG8iOworICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3UGVybWFuZW50Q2FsbGJhY2soJlNldEFCRnVuY3Rpb24sIDc4OSwgY3N0cik7CisgIEVYUEVDVF9ORSg3ODksIGFfKTsKKyAgRVhQRUNUX05FKGNzdHIsIGJfKTsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg3ODksIGFfKTsKKyAgRVhQRUNUX0VRKGNzdHIsIGJfKTsKKyAgYV8gPSAwOworICBiXyA9IE5VTEw7CisgIGNsb3N1cmUtPlJ1bigpOworICBFWFBFQ1RfRVEoNzg5LCBhXyk7CisgIEVYUEVDVF9FUShjc3RyLCBiXyk7CisgIGRlbGV0ZSBjbG9zdXJlOworfQorCitURVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RQZXJtYW5lbnRDbG9zdXJlTWV0aG9kMikgeworICBjb25zdCBjaGFyKiBjc3RyID0gImhlbGxvIjsKKyAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld1Blcm1hbmVudENhbGxiYWNrKGN1cnJlbnRfaW5zdGFuY2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsb3N1cmVUZXN0OjpTZXRBQk1ldGhvZCwgNzg5LCBjc3RyKTsKKyAgRVhQRUNUX05FKDc4OSwgYV8pOworICBFWFBFQ1RfTkUoY3N0ciwgYl8pOworICBjbG9zdXJlLT5SdW4oKTsKKyAgRVhQRUNUX0VRKDc4OSwgYV8pOworICBFWFBFQ1RfRVEoY3N0ciwgYl8pOworICBhXyA9IDA7CisgIGJfID0gTlVMTDsKKyAgY2xvc3VyZS0+UnVuKCk7CisgIEVYUEVDVF9FUSg3ODksIGFfKTsKKyAgRVhQRUNUX0VRKGNzdHIsIGJfKTsKKyAgZGVsZXRlIGNsb3N1cmU7Cit9CisKK1RFU1RfRihDbG9zdXJlVGVzdCwgVGVzdFBlcm1hbmVudENsb3N1cmVEZWxldGVJbkNhbGxiYWNrKSB7CisgIHBlcm1hbmVudF9jbG9zdXJlXyA9IE5ld1Blcm1hbmVudENhbGxiYWNrKChDbG9zdXJlVGVzdCopIHRoaXMsCisgICAgICAmQ2xvc3VyZVRlc3Q6OkRlbGV0ZUNsb3N1cmVJbkNhbGxiYWNrKTsKKyAgcGVybWFuZW50X2Nsb3N1cmVfLT5SdW4oKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIyZDYwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaApAQCAtMCwwICsxLDIyMCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIERlYWxzIHdpdGggdGhlIGZhY3QgdGhhdCBoYXNoX21hcCBpcyBub3QgZGVmaW5lZCBldmVyeXdoZXJlLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19IQVNIX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfSEFTSF9IX18KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIGRlZmluZWQoSEFWRV9IQVNIX01BUCkgJiYgZGVmaW5lZChIQVZFX0hBU0hfU0VUKQorI2luY2x1ZGUgSEFTSF9NQVBfSAorI2luY2x1ZGUgSEFTSF9TRVRfSAorI2Vsc2UKKyNkZWZpbmUgTUlTU0lOR19IQVNICisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKyNpZmRlZiBNSVNTSU5HX0hBU0gKKworLy8gVGhpcyBzeXN0ZW0gZG9lc24ndCBoYXZlIGhhc2hfbWFwIG9yIGhhc2hfc2V0LiAgRW11bGF0ZSB0aGVtIHVzaW5nIG1hcCBhbmQKKy8vIHNldC4KKworLy8gTWFrZSBoYXNoPFQ+IGJlIHRoZSBzYW1lIGFzIGxlc3M8VD4uICBOb3RlIHRoYXQgZXZlcnl3aGVyZSB3aGVyZSBjdXN0b20KKy8vIGhhc2ggZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBwcm90b2J1ZiBjb2RlLCB0aGV5IGFyZSBhbHNvIGRlZmluZWQgc3VjaAorLy8gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFzICJsZXNzIiBmdW5jdGlvbnMsIHdoaWNoIGlzIHJlcXVpcmVkIGJ5IE1TVkMgYW55d2F5LgordGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KK3N0cnVjdCBoYXNoIHsKKyAgLy8gRHVtbXksIGp1c3QgdG8gbWFrZSBkZXJpdmF0aXZlIGhhc2ggZnVuY3Rpb25zIGNvbXBpbGUuCisgIGludCBvcGVyYXRvcigpKGNvbnN0IEtleSYga2V5KSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlNob3VsZCBuZXZlciBiZSBjYWxsZWQuIjsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgS2V5JiBhLCBjb25zdCBLZXkmIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYSA8IGI7CisgIH0KK307CisKKy8vIE1ha2Ugc3VyZSBjaGFyKiBpcyBjb21wYXJlZCBieSB2YWx1ZS4KK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxjb25zdCBjaGFyKj4geworICAvLyBEdW1teSwganVzdCB0byBtYWtlIGRlcml2YXRpdmUgaGFzaCBmdW5jdGlvbnMgY29tcGlsZS4KKyAgaW50IG9wZXJhdG9yKCkoY29uc3QgY2hhcioga2V5KSB7CisgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlNob3VsZCBuZXZlciBiZSBjYWxsZWQuIjsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogYSwgY29uc3QgY2hhciogYikgY29uc3QgeworICAgIHJldHVybiBzdHJjbXAoYSwgYikgPCAwOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBEYXRhLAorICAgICAgICAgIHR5cGVuYW1lIEhhc2hGY24gPSBoYXNoPEtleT4sCisgICAgICAgICAgdHlwZW5hbWUgRXF1YWxLZXkgPSBpbnQgPgorY2xhc3MgaGFzaF9tYXAgOiBwdWJsaWMgc3RkOjptYXA8S2V5LCBEYXRhLCBIYXNoRmNuPiB7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LAorICAgICAgICAgIHR5cGVuYW1lIEhhc2hGY24gPSBoYXNoPEtleT4sCisgICAgICAgICAgdHlwZW5hbWUgRXF1YWxLZXkgPSBpbnQgPgorY2xhc3MgaGFzaF9zZXQgOiBwdWJsaWMgc3RkOjpzZXQ8S2V5LCBIYXNoRmNuPiB7Cit9OworCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfU1RMUE9SVF9WRVJTSU9OKQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5Pgorc3RydWN0IGhhc2ggOiBwdWJsaWMgSEFTSF9OQU1FU1BBQ0U6Omhhc2hfY29tcGFyZTxLZXk+IHsKK307CisKKy8vIE1TVkMncyBoYXNoX2NvbXBhcmU8Y29uc3QgY2hhcio+IGhhc2hlcyBiYXNlZCBvbiB0aGUgc3RyaW5nIGNvbnRlbnRzIGJ1dAorLy8gY29tcGFyZXMgYmFzZWQgb24gdGhlIHN0cmluZyBwb2ludGVyLiAgV1RGPworY2xhc3MgQ3N0cmluZ0xlc3MgeworIHB1YmxpYzoKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBhLCBjb25zdCBjaGFyKiBiKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmNtcChhLCBiKSA8IDA7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxjb25zdCBjaGFyKj4KKyAgOiBwdWJsaWMgSEFTSF9OQU1FU1BBQ0U6Omhhc2hfY29tcGFyZTxjb25zdCBjaGFyKiwgQ3N0cmluZ0xlc3M+IHsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIERhdGEsCisgICAgICAgICAgdHlwZW5hbWUgSGFzaEZjbiA9IGhhc2g8S2V5PiwKKyAgICAgICAgICB0eXBlbmFtZSBFcXVhbEtleSA9IGludCA+CitjbGFzcyBoYXNoX21hcCA6IHB1YmxpYyBIQVNIX05BTUVTUEFDRTo6aGFzaF9tYXA8CisgICAgS2V5LCBEYXRhLCBIYXNoRmNuPiB7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LAorICAgICAgICAgIHR5cGVuYW1lIEhhc2hGY24gPSBoYXNoPEtleT4sCisgICAgICAgICAgdHlwZW5hbWUgRXF1YWxLZXkgPSBpbnQgPgorY2xhc3MgaGFzaF9zZXQgOiBwdWJsaWMgSEFTSF9OQU1FU1BBQ0U6Omhhc2hfc2V0PAorICAgIEtleSwgSGFzaEZjbj4geworfTsKKworI2Vsc2UKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KK3N0cnVjdCBoYXNoIDogcHVibGljIEhBU0hfTkFNRVNQQUNFOjpoYXNoPEtleT4geworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KK3N0cnVjdCBoYXNoPGNvbnN0IEtleSo+IHsKKyAgaW5saW5lIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IEtleSoga2V5KSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihrZXkpOworICB9Cit9OworCisvLyBVbmxpa2UgdGhlIG9sZCBTR0kgdmVyc2lvbiwgdGhlIFRSMSAiaGFzaCIgZG9lcyBub3Qgc3BlY2lhbC1jYXNlIGNoYXIqLiAgU28sCisvLyB3ZSBnbyBhaGVhZCBhbmQgcHJvdmlkZSBvdXIgb3duIGltcGxlbWVudGF0aW9uLgordGVtcGxhdGUgPD4KK3N0cnVjdCBoYXNoPGNvbnN0IGNoYXIqPiB7CisgIGlubGluZSBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBzdHIpIGNvbnN0IHsKKyAgICBzaXplX3QgcmVzdWx0ID0gMDsKKyAgICBmb3IgKDsgKnN0ciAhPSAnXDAnOyBzdHIrKykgeworICAgICAgcmVzdWx0ID0gNSAqIHJlc3VsdCArICpzdHI7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIERhdGEsCisgICAgICAgICAgdHlwZW5hbWUgSGFzaEZjbiA9IGhhc2g8S2V5PiwKKyAgICAgICAgICB0eXBlbmFtZSBFcXVhbEtleSA9IHN0ZDo6ZXF1YWxfdG88S2V5PiA+CitjbGFzcyBoYXNoX21hcCA6IHB1YmxpYyBIQVNIX05BTUVTUEFDRTo6SEFTSF9NQVBfQ0xBU1M8CisgICAgS2V5LCBEYXRhLCBIYXNoRmNuLCBFcXVhbEtleT4geworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleSwKKyAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAorICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+ID4KK2NsYXNzIGhhc2hfc2V0IDogcHVibGljIEhBU0hfTkFNRVNQQUNFOjpIQVNIX1NFVF9DTEFTUzwKKyAgICBLZXksIEhhc2hGY24sIEVxdWFsS2V5PiB7Cit9OworCisjZW5kaWYKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBoYXNoPHN0cmluZz4geworICBpbmxpbmUgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzaDxjb25zdCBjaGFyKj4oKShrZXkuY19zdHIoKSk7CisgIH0KKworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGJ1Y2tldF9zaXplID0gNDsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBtaW5fYnVja2V0cyA9IDg7CisgIGlubGluZSBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcmIGEsIGNvbnN0IHN0cmluZyYgYikgY29uc3QgeworICAgIHJldHVybiBhIDwgYjsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0LCB0eXBlbmFtZSBTZWNvbmQ+CitzdHJ1Y3QgaGFzaDxwYWlyPEZpcnN0LCBTZWNvbmQ+ID4geworICBpbmxpbmUgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgcGFpcjxGaXJzdCwgU2Vjb25kPiYga2V5KSBjb25zdCB7CisgICAgc2l6ZV90IGZpcnN0X2hhc2ggPSBoYXNoPEZpcnN0PigpKGtleS5maXJzdCk7CisgICAgc2l6ZV90IHNlY29uZF9oYXNoID0gaGFzaDxTZWNvbmQ+KCkoa2V5LnNlY29uZCk7CisKKyAgICAvLyBGSVhNRShrZW50b24pOiAgV2hhdCBpcyB0aGUgYmVzdCB3YXkgdG8gY29tcHV0ZSB0aGlzIGhhc2g/ICBJIGhhdmUKKyAgICAvLyBubyBpZGVhISAgVGhpcyBzZWVtcyBhIGJpdCBiZXR0ZXIgdGhhbiBhbiBYT1IuCisgICAgcmV0dXJuIGZpcnN0X2hhc2ggKiAoKDEgPDwgMTYpIC0gMSkgKyBzZWNvbmRfaGFzaDsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBzaXplX3QgYnVja2V0X3NpemUgPSA0OworICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbl9idWNrZXRzID0gODsKKyAgaW5saW5lIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHBhaXI8Rmlyc3QsIFNlY29uZD4mIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyPEZpcnN0LCBTZWNvbmQ+JiBiKSBjb25zdCB7CisgICAgcmV0dXJuIGEgPCBiOworICB9Cit9OworCisvLyBVc2VkIGJ5IEdDQy9TR0kgU1RMIG9ubHkuICAoV2h5IGlzbid0IHRoaXMgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkCisvLyBsaWJyYXJ5PyAgOiggKQorc3RydWN0IHN0cmVxIHsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBhLCBjb25zdCBjaGFyKiBiKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmNtcChhLCBiKSA9PSAwOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfU1RVQlNfSEFTSF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YzlkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oCkBAIC0wLDAgKzEsMTE5IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBmcm9tIGdvb2dsZTMvdXRpbC9ndGwvbWFwLXV0aWwuaAorLy8gQXV0aG9yOiBBbnRvbiBDYXJ2ZXIKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfTUFQX1VUSUxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19NQVBfVVRJTF9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBQZXJmb3JtIGEgbG9va3VwIGluIGEgbWFwIG9yIGhhc2hfbWFwLgorLy8gSWYgdGhlIGtleSBpcyBwcmVzZW50IGluIHRoZSBtYXAgdGhlbiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQKKy8vIGtleSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBwYXNzZWQgYXMgYSBkZWZhdWx0IGlzIHJldHVybmVkLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Citjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYKK0ZpbmRXaXRoRGVmYXVsdChjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSwKKyAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYgdmFsdWUpIHsKKyAgdHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmZpbmQoa2V5KTsKKyAgaWYgKGl0ID09IGNvbGxlY3Rpb24uZW5kKCkpIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKyAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKKy8vIFBlcmZvcm0gYSBsb29rdXAgaW4gYSBtYXAgb3IgaGFzaF9tYXAuCisvLyBJZiB0aGUga2V5IGlzIHByZXNlbnQgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHJldHVybmVkLAorLy8gb3RoZXJ3aXNlIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Citjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSoKK0ZpbmRPck51bGwoY29uc3QgQ29sbGVjdGlvbiYgY29sbGVjdGlvbiwKKyAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZSYga2V5KSB7CisgIHR5cGVuYW1lIENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi5maW5kKGtleSk7CisgIGlmIChpdCA9PSBjb2xsZWN0aW9uLmVuZCgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuICZpdC0+c2Vjb25kOworfQorCisvLyBQZXJmb3JtIGEgbG9va3VwIGluIGEgbWFwIG9yIGhhc2hfbWFwIHdob3NlIHZhbHVlcyBhcmUgcG9pbnRlcnMuCisvLyBJZiB0aGUga2V5IGlzIHByZXNlbnQgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHJldHVybmVkLAorLy8gb3RoZXJ3aXNlIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgorLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbWlzc2luZyBrZXkgYW5kIGEga2V5IG1hcHBlZAorLy8gdG8gYSBOVUxMIHZhbHVlLgordGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Citjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZQorRmluZFB0ck9yTnVsbChjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXkpIHsKKyAgdHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmZpbmQoa2V5KTsKKyAgaWYgKGl0ID09IGNvbGxlY3Rpb24uZW5kKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gaXQtPnNlY29uZDsKK30KKworLy8gQ2hhbmdlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGtleSBpbiBhIG1hcCBvciBoYXNoX21hcC4KKy8vIElmIHRoZSBrZXkgaXMgbm90IHByZXNlbnQgaW4gdGhlIG1hcCB0aGUga2V5IGFuZCB2YWx1ZSBhcmUgaW5zZXJ0ZWQsCisvLyBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHVwZGF0ZWQgdG8gYmUgYSBjb3B5IG9mIHRoZSB2YWx1ZSBwcm92aWRlZC4KKy8vIFRydWUgaW5kaWNhdGVzIHRoYXQgYW4gaW5zZXJ0IHRvb2sgcGxhY2UsIGZhbHNlIGluZGljYXRlcyBhbiB1cGRhdGUuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbiwgY2xhc3MgS2V5LCBjbGFzcyBWYWx1ZT4KK2Jvb2wgSW5zZXJ0T3JVcGRhdGUoQ29sbGVjdGlvbiAqIGNvbnN0IGNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5JiBrZXksIGNvbnN0IFZhbHVlJiB2YWx1ZSkgeworICBwYWlyPHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yLCBib29sPiByZXQgPQorICAgIGNvbGxlY3Rpb24tPmluc2VydCh0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlKGtleSwgdmFsdWUpKTsKKyAgaWYgKCFyZXQuc2Vjb25kKSB7CisgICAgLy8gdXBkYXRlCisgICAgcmV0LmZpcnN0LT5zZWNvbmQgPSB2YWx1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEluc2VydCBhIG5ldyBrZXkgYW5kIHZhbHVlIGludG8gYSBtYXAgb3IgaGFzaF9tYXAuCisvLyBJZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50IGluIHRoZSBtYXAgdGhlIGtleSBhbmQgdmFsdWUgYXJlCisvLyBpbnNlcnRlZCwgb3RoZXJ3aXNlIG5vdGhpbmcgaGFwcGVucy4gVHJ1ZSBpbmRpY2F0ZXMgdGhhdCBhbiBpbnNlcnQKKy8vIHRvb2sgcGxhY2UsIGZhbHNlIGluZGljYXRlcyB0aGUga2V5IHdhcyBhbHJlYWR5IHByZXNlbnQuCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbiwgY2xhc3MgS2V5LCBjbGFzcyBWYWx1ZT4KK2Jvb2wgSW5zZXJ0SWZOb3RQcmVzZW50KENvbGxlY3Rpb24gKiBjb25zdCBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5JiBrZXksIGNvbnN0IFZhbHVlJiB2YWx1ZSkgeworICBwYWlyPHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yLCBib29sPiByZXQgPQorICAgIGNvbGxlY3Rpb24tPmluc2VydCh0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlKGtleSwgdmFsdWUpKTsKKyAgcmV0dXJuIHJldC5zZWNvbmQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19NQVBfVVRJTF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjRiODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmNjCkBAIC0wLDAgKzEsOTkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBlbXVsYXRlcyBnb29nbGUzL2Jhc2Uvb25jZS5oCisvLworLy8gVGhpcyBoZWFkZXIgaXMgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgb25seSBieSBpbnRlcm5hbCAuY2MgZmlsZXMgYW5kCisvLyBnZW5lcmF0ZWQgLnBiLmNjIGZpbGVzLiAgVXNlcnMgc2hvdWxkIG5vdCB1c2UgdGhpcyBkaXJlY3RseS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRF9TQUZFVFkKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgU2NoZWRZaWVsZCgpIHsKKyNpZmRlZiBfV0lOMzIKKyAgU2xlZXAoMCk7CisjZWxzZSAgLy8gUE9TSVgKKyAgc2NoZWRfeWllbGQoKTsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBHb29nbGVPbmNlSW5pdEltcGwoUHJvdG9idWZPbmNlVHlwZSogb25jZSwgQ2xvc3VyZSogY2xvc3VyZSkgeworICBpbnRlcm5hbDo6QXRvbWljV29yZCBzdGF0ZSA9IGludGVybmFsOjpBY3F1aXJlX0xvYWQob25jZSk7CisgIC8vIEZhc3QgcGF0aC4gVGhlIHByb3ZpZGVkIGNsb3N1cmUgd2FzIGFscmVhZHkgZXhlY3V0ZWQuCisgIGlmIChzdGF0ZSA9PSBPTkNFX1NUQVRFX0RPTkUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gVGhlIGNsb3N1cmUgZXhlY3V0aW9uIGRpZCBub3QgY29tcGxldGUgeWV0LiBUaGUgb25jZSBvYmplY3QgY2FuIGJlIGluIG9uZQorICAvLyBvZiB0aGUgdHdvIGZvbGxvd2luZyBzdGF0ZXM6CisgIC8vICAgLSBVTklOSVRJQUxJWkVEOiBXZSBhcmUgdGhlIGZpcnN0IHRocmVhZCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgIC8vICAgLSBFWEVDVVRJTkdfQ0xPU1VSRTogQW5vdGhlciB0aHJlYWQgaXMgYWxyZWFkeSBleGVjdXRpbmcgdGhlIGNsb3N1cmUuCisgIC8vCisgIC8vIEZpcnN0LCB0cnkgdG8gY2hhbmdlIHRoZSBzdGF0ZSBmcm9tIFVOSU5JVElBTElaRUQgdG8gRVhFQ1VUSU5HX0NMT1NVUkUKKyAgLy8gYXRvbWljYWxseS4KKyAgc3RhdGUgPSBpbnRlcm5hbDo6QWNxdWlyZV9Db21wYXJlQW5kU3dhcCgKKyAgICAgIG9uY2UsIE9OQ0VfU1RBVEVfVU5JTklUSUFMSVpFRCwgT05DRV9TVEFURV9FWEVDVVRJTkdfQ0xPU1VSRSk7CisgIGlmIChzdGF0ZSA9PSBPTkNFX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAvLyBXZSBhcmUgdGhlIGZpcnN0IHRocmVhZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gY2FsbCB0aGUKKyAgICAvLyBjbG9zdXJlLgorICAgIGNsb3N1cmUtPlJ1bigpOworICAgIGludGVybmFsOjpSZWxlYXNlX1N0b3JlKG9uY2UsIE9OQ0VfU1RBVEVfRE9ORSk7CisgIH0gZWxzZSB7CisgICAgLy8gQW5vdGhlciB0aHJlYWQgaGFzIGFscmVhZHkgc3RhcnRlZCBleGVjdXRpbmcgdGhlIGNsb3N1cmUuIFdlIG5lZWQgdG8KKyAgICAvLyB3YWl0IHVudGlsIGl0IGNvbXBsZXRlcyB0aGUgaW5pdGlhbGl6YXRpb24uCisgICAgd2hpbGUgKHN0YXRlID09IE9OQ0VfU1RBVEVfRVhFQ1VUSU5HX0NMT1NVUkUpIHsKKyAgICAgIC8vIE5vdGUgdGhhdCBmdXRleCgpIGNvdWxkIGJlIHVzZWQgaGVyZSBvbiBMaW51eCBhcyBhbiBpbXByb3ZlbWVudC4KKyAgICAgIFNjaGVkWWllbGQoKTsKKyAgICAgIHN0YXRlID0gaW50ZXJuYWw6OkFjcXVpcmVfTG9hZChvbmNlKTsKKyAgICB9CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRF9TQUZFVFkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGNiZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oCkBAIC0wLDAgKzEsMTQ3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLworLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL29uY2UuaAorLy8KKy8vIFRoaXMgaGVhZGVyIGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIG9ubHkgYnkgaW50ZXJuYWwgLmNjIGZpbGVzIGFuZAorLy8gZ2VuZXJhdGVkIC5wYi5jYyBmaWxlcy4gIFVzZXJzIHNob3VsZCBub3QgdXNlIHRoaXMgZGlyZWN0bHkuCisvLworLy8gVGhpcyBpcyBiYXNpY2FsbHkgYSBwb3J0YWJsZSB2ZXJzaW9uIG9mIHB0aHJlYWRfb25jZSgpLgorLy8KKy8vIFRoaXMgaGVhZGVyIGRlY2xhcmVzOgorLy8gKiBBIHR5cGUgY2FsbGVkIFByb3RvYnVmT25jZVR5cGUuCisvLyAqIEEgbWFjcm8gR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRSgpIHdoaWNoIGRlY2xhcmVzIGEgdmFyaWFibGUgb2YgdHlwZQorLy8gICBQcm90b2J1Zk9uY2VUeXBlLiAgVGhpcyBpcyB0aGUgb25seSBsZWdhbCB3YXkgdG8gZGVjbGFyZSBzdWNoIGEgdmFyaWFibGUuCisvLyAgIFRoZSBtYWNybyBtYXkgb25seSBiZSB1c2VkIGF0IHRoZSBnbG9iYWwgc2NvcGUgKHlvdSBjYW5ub3QgY3JlYXRlIGxvY2FsIG9yCisvLyAgIGNsYXNzIG1lbWJlciB2YXJpYWJsZXMgb2YgdGhpcyB0eXBlKS4KKy8vICogQSBmdW5jdGlvbiBHb29nbGVPbmNlSW5pdChQcm90b2J1Zk9uY2VUeXBlKiBvbmNlLCB2b2lkICgqaW5pdF9mdW5jKSgpKS4KKy8vICAgVGhpcyBmdW5jdGlvbiwgd2hlbiBpbnZva2VkIG11bHRpcGxlIHRpbWVzIGdpdmVuIHRoZSBzYW1lIFByb3RvYnVmT25jZVR5cGUKKy8vICAgb2JqZWN0LCB3aWxsIGludm9rZSBpbml0X2Z1bmMgb24gdGhlIGZpcnN0IGNhbGwgb25seSwgYW5kIHdpbGwgbWFrZSBzdXJlCisvLyAgIG5vbmUgb2YgdGhlIGNhbGxzIHJldHVybiBiZWZvcmUgdGhhdCBmaXJzdCBjYWxsIHRvIGluaXRfZnVuYyBoYXMgZmluaXNoZWQuCisvLyAqIFRoZSB1c2VyIGNhbiBwcm92aWRlIGEgcGFyYW1ldGVyIHdoaWNoIEdvb2dsZU9uY2VJbml0KCkgZm9yd2FyZHMgdG8gdGhlCisvLyAgIHVzZXItcHJvdmlkZWQgZnVuY3Rpb24gd2hlbiBpdCBpcyBjYWxsZWQuIFVzYWdlIGV4YW1wbGU6CisvLyAgICAgaW50IGEgPSAxMDsKKy8vICAgICBHb29nbGVPbmNlSW5pdCgmbXlfb25jZSwgJk15RnVuY3Rpb25FeHBlY3RpbmdJbnRBcmd1bWVudCwgJmEpOworLy8gKiBUaGlzIGltcGxlbWVudGF0aW9uIGd1YXJhbnRlZXMgdGhhdCBQcm90b2J1Zk9uY2VUeXBlIGlzIGEgUE9EIChpLmUuIG5vCisvLyAgIHN0YXRpYyBpbml0aWFsaXplciBnZW5lcmF0ZWQpLgorLy8KKy8vIFRoaXMgaW1wbGVtZW50cyBhIHdheSB0byBwZXJmb3JtIGxhenkgaW5pdGlhbGl6YXRpb24uICBJdCdzIG1vcmUgZWZmaWNpZW50CisvLyB0aGFuIHVzaW5nIG11dGV4ZXMgYXMgbm8gbG9jayBpcyBuZWVkZWQgaWYgaW5pdGlhbGl6YXRpb24gaGFzIGFscmVhZHkKKy8vIGhhcHBlbmVkLgorLy8KKy8vIEV4YW1wbGUgdXNhZ2U6CisvLyAgIHZvaWQgSW5pdCgpOworLy8gICBHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKG9uY2VfaW5pdCk7CisvLworLy8gICAvLyBDYWxscyBJbml0KCkgZXhhY3RseSBvbmNlLgorLy8gICB2b2lkIEluaXRPbmNlKCkgeworLy8gICAgIEdvb2dsZU9uY2VJbml0KCZvbmNlX2luaXQsICZJbml0KTsKKy8vICAgfQorLy8KKy8vIE5vdGUgdGhhdCBpZiBHb29nbGVPbmNlSW5pdCgpIGlzIGNhbGxlZCBiZWZvcmUgbWFpbigpIGhhcyBiZWd1biwgaXQgbXVzdAorLy8gb25seSBiZSBjYWxsZWQgYnkgdGhlIHRocmVhZCB0aGF0IHdpbGwgZXZlbnR1YWxseSBjYWxsIG1haW4oKSAtLSB0aGF0IGlzLAorLy8gdGhlIHRocmVhZCB0aGF0IHBlcmZvcm1zIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24uICBJbiBnZW5lcmFsIHRoaXMgaXMgYSBzYWZlCisvLyBhc3N1bXB0aW9uIHNpbmNlIHBlb3BsZSBkb24ndCB1c3VhbGx5IGNvbnN0cnVjdCB0aHJlYWRzIGJlZm9yZSBtYWluKCkgc3RhcnRzLAorLy8gYnV0IGl0IGlzIHRlY2huaWNhbGx5IG5vdCBndWFyYW50ZWVkLiAgVW5mb3J0dW5hdGVseSwgV2luMzIgcHJvdmlkZXMgbm8gd2F5CisvLyB3aGF0c29ldmVyIHRvIHN0YXRpY2FsbHktaW5pdGlhbGl6ZSBpdHMgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMsIHNvIG91cgorLy8gb25seSBjaG9pY2UgaXMgdG8gYXNzdW1lIHRoYXQgZHluYW1pYyBpbml0aWFsaXphdGlvbiBpcyBzaW5nbGUtdGhyZWFkZWQuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX09OQ0VfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19PTkNFX0hfXworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRF9TQUZFVFkKKwordHlwZWRlZiBib29sIFByb3RvYnVmT25jZVR5cGU7CisKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX09OQ0VfSU5JVCBmYWxzZQorCitpbmxpbmUgdm9pZCBHb29nbGVPbmNlSW5pdChQcm90b2J1Zk9uY2VUeXBlKiBvbmNlLCB2b2lkICgqaW5pdF9mdW5jKSgpKSB7CisgIGlmICghKm9uY2UpIHsKKyAgICAqb25jZSA9IHRydWU7CisgICAgaW5pdF9mdW5jKCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEFyZz4KK2lubGluZSB2b2lkIEdvb2dsZU9uY2VJbml0KFByb3RvYnVmT25jZVR5cGUqIG9uY2UsIHZvaWQgKCppbml0X2Z1bmMpKEFyZyksCisgICAgQXJnIGFyZykgeworICBpZiAoISpvbmNlKSB7CisgICAgKm9uY2UgPSB0cnVlOworICAgIGluaXRfZnVuYyhhcmcpOworICB9Cit9CisKKyNlbHNlCisKK2VudW0geworICBPTkNFX1NUQVRFX1VOSU5JVElBTElaRUQgPSAwLAorICBPTkNFX1NUQVRFX0VYRUNVVElOR19DTE9TVVJFID0gMSwKKyAgT05DRV9TVEFURV9ET05FID0gMgorfTsKKwordHlwZWRlZiBpbnRlcm5hbDo6QXRvbWljV29yZCBQcm90b2J1Zk9uY2VUeXBlOworCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PTkNFX0lOSVQgOjpnb29nbGU6OnByb3RvYnVmOjpPTkNFX1NUQVRFX1VOSU5JVElBTElaRUQKKwordm9pZCBHb29nbGVPbmNlSW5pdEltcGwoUHJvdG9idWZPbmNlVHlwZSogb25jZSwgQ2xvc3VyZSogY2xvc3VyZSk7CisKK2lubGluZSB2b2lkIEdvb2dsZU9uY2VJbml0KFByb3RvYnVmT25jZVR5cGUqIG9uY2UsIHZvaWQgKCppbml0X2Z1bmMpKCkpIHsKKyAgaWYgKGludGVybmFsOjpBY3F1aXJlX0xvYWQob25jZSkgIT0gT05DRV9TVEFURV9ET05FKSB7CisgICAgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTAgZnVuYyhpbml0X2Z1bmMsIGZhbHNlKTsKKyAgICBHb29nbGVPbmNlSW5pdEltcGwob25jZSwgJmZ1bmMpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmc+CitpbmxpbmUgdm9pZCBHb29nbGVPbmNlSW5pdChQcm90b2J1Zk9uY2VUeXBlKiBvbmNlLCB2b2lkICgqaW5pdF9mdW5jKShBcmcqKSwKKyAgICBBcmcqIGFyZykgeworICBpZiAoaW50ZXJuYWw6OkFjcXVpcmVfTG9hZChvbmNlKSAhPSBPTkNFX1NUQVRFX0RPTkUpIHsKKyAgICBpbnRlcm5hbDo6RnVuY3Rpb25DbG9zdXJlMTxBcmcqPiBmdW5jKGluaXRfZnVuYywgZmFsc2UsIGFyZyk7CisgICAgR29vZ2xlT25jZUluaXRJbXBsKG9uY2UsICZmdW5jKTsKKyAgfQorfQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9OT19USFJFQURfU0FGRVRZCisKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShOQU1FKSBcCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UHJvdG9idWZPbmNlVHlwZSBOQU1FID0gR09PR0xFX1BST1RPQlVGX09OQ0VfSU5JVAorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfU1RVQlNfT05DRV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2VfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Zjg2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsMjUzIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHsKKworY2xhc3MgT25jZUluaXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRVcCgpIHsKKyAgICBzdGF0ZV8gPSBJTklUX05PVF9TVEFSVEVEOworICAgIGN1cnJlbnRfdGVzdF8gPSB0aGlzOworICB9CisKKyAgLy8gU2luY2UgUHJvdG9idWZPbmNlVHlwZSBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgYWxsb2NhdGVkIGluIHN0YXRpYyBzdG9yYWdlLAorICAvLyBlYWNoIHRlc3QgbXVzdCB1c2UgYSBkaWZmZXJlbnQgcGFpciBvZiBQcm90b2J1Zk9uY2VUeXBlIG9iamVjdHMgd2hpY2ggaXQKKyAgLy8gbXVzdCBkZWNsYXJlIGl0c2VsZi4KKyAgdm9pZCBTZXRPbmNlcyhQcm90b2J1Zk9uY2VUeXBlKiBvbmNlLCBQcm90b2J1Zk9uY2VUeXBlKiByZWN1cnNpdmVfb25jZSkgeworICAgIG9uY2VfID0gb25jZTsKKyAgICByZWN1cnNpdmVfb25jZV8gPSByZWN1cnNpdmVfb25jZTsKKyAgfQorCisgIHZvaWQgSW5pdE9uY2UoKSB7CisgICAgR29vZ2xlT25jZUluaXQob25jZV8sICZJbml0U3RhdGljKTsKKyAgfQorICB2b2lkIEluaXRSZWN1cnNpdmVPbmNlKCkgeworICAgIEdvb2dsZU9uY2VJbml0KHJlY3Vyc2l2ZV9vbmNlXywgJkluaXRSZWN1cnNpdmVTdGF0aWMpOworICB9CisKKyAgdm9pZCBCbG9ja0luaXQoKSB7IGluaXRfYmxvY2tlcl8uTG9jaygpOyB9CisgIHZvaWQgVW5ibG9ja0luaXQoKSB7IGluaXRfYmxvY2tlcl8uVW5sb2NrKCk7IH0KKworICBjbGFzcyBUZXN0VGhyZWFkIHsKKyAgIHB1YmxpYzoKKyAgICBUZXN0VGhyZWFkKENsb3N1cmUqIGNhbGxiYWNrKQorICAgICAgICA6IGRvbmVfKGZhbHNlKSwgam9pbmVkXyhmYWxzZSksIGNhbGxiYWNrXyhjYWxsYmFjaykgeworI2lmZGVmIF9XSU4zMgorICAgICAgdGhyZWFkXyA9IENyZWF0ZVRocmVhZChOVUxMLCAwLCAmU3RhcnQsIHRoaXMsIDAsIE5VTEwpOworI2Vsc2UKKyAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWRfLCBOVUxMLCAmU3RhcnQsIHRoaXMpOworI2VuZGlmCisgICAgfQorICAgIH5UZXN0VGhyZWFkKCkgeworICAgICAgaWYgKCFqb2luZWRfKSBKb2luKCk7CisgICAgfQorCisgICAgYm9vbCBJc0RvbmUoKSB7CisgICAgICBNdXRleExvY2sgbG9jaygmZG9uZV9tdXRleF8pOworICAgICAgcmV0dXJuIGRvbmVfOworICAgIH0KKyAgICB2b2lkIEpvaW4oKSB7CisgICAgICBqb2luZWRfID0gdHJ1ZTsKKyNpZmRlZiBfV0lOMzIKKyAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkXywgSU5GSU5JVEUpOworICAgICAgQ2xvc2VIYW5kbGUodGhyZWFkXyk7CisjZWxzZQorICAgICAgcHRocmVhZF9qb2luKHRocmVhZF8sIE5VTEwpOworI2VuZGlmCisgICAgfQorCisgICBwcml2YXRlOgorI2lmZGVmIF9XSU4zMgorICAgIEhBTkRMRSB0aHJlYWRfOworI2Vsc2UKKyAgICBwdGhyZWFkX3QgdGhyZWFkXzsKKyNlbmRpZgorCisgICAgTXV0ZXggZG9uZV9tdXRleF87CisgICAgYm9vbCBkb25lXzsKKyAgICBib29sIGpvaW5lZF87CisgICAgQ2xvc3VyZSogY2FsbGJhY2tfOworCisjaWZkZWYgX1dJTjMyCisgICAgc3RhdGljIERXT1JEIFdJTkFQSSBTdGFydChMUFZPSUQgYXJnKSB7CisjZWxzZQorICAgIHN0YXRpYyB2b2lkKiBTdGFydCh2b2lkKiBhcmcpIHsKKyNlbmRpZgorICAgICAgcmVpbnRlcnByZXRfY2FzdDxUZXN0VGhyZWFkKj4oYXJnKS0+UnVuKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2b2lkIFJ1bigpIHsKKyAgICAgIGNhbGxiYWNrXy0+UnVuKCk7CisgICAgICBNdXRleExvY2sgbG9jaygmZG9uZV9tdXRleF8pOworICAgICAgZG9uZV8gPSB0cnVlOworICAgIH0KKyAgfTsKKworICBUZXN0VGhyZWFkKiBSdW5Jbml0T25jZUluTmV3VGhyZWFkKCkgeworICAgIHJldHVybiBuZXcgVGVzdFRocmVhZChOZXdDYWxsYmFjayh0aGlzLCAmT25jZUluaXRUZXN0OjpJbml0T25jZSkpOworICB9CisgIFRlc3RUaHJlYWQqIFJ1bkluaXRSZWN1cnNpdmVPbmNlSW5OZXdUaHJlYWQoKSB7CisgICAgcmV0dXJuIG5ldyBUZXN0VGhyZWFkKE5ld0NhbGxiYWNrKHRoaXMsICZPbmNlSW5pdFRlc3Q6OkluaXRSZWN1cnNpdmVPbmNlKSk7CisgIH0KKworICBlbnVtIFN0YXRlIHsKKyAgICBJTklUX05PVF9TVEFSVEVELAorICAgIElOSVRfU1RBUlRFRCwKKyAgICBJTklUX0RPTkUKKyAgfTsKKyAgU3RhdGUgQ3VycmVudFN0YXRlKCkgeworICAgIE11dGV4TG9jayBsb2NrKCZtdXRleF8pOworICAgIHJldHVybiBzdGF0ZV87CisgIH0KKworICB2b2lkIFdhaXRBQml0KCkgeworI2lmZGVmIF9XSU4zMgorICAgIFNsZWVwKDEwMDApOworI2Vsc2UKKyAgICBzbGVlcCgxKTsKKyNlbmRpZgorICB9CisKKyBwcml2YXRlOgorICBNdXRleCBtdXRleF87CisgIE11dGV4IGluaXRfYmxvY2tlcl87CisgIFN0YXRlIHN0YXRlXzsKKyAgUHJvdG9idWZPbmNlVHlwZSogb25jZV87CisgIFByb3RvYnVmT25jZVR5cGUqIHJlY3Vyc2l2ZV9vbmNlXzsKKworICB2b2lkIEluaXQoKSB7CisgICAgTXV0ZXhMb2NrIGxvY2soJm11dGV4Xyk7CisgICAgRVhQRUNUX0VRKElOSVRfTk9UX1NUQVJURUQsIHN0YXRlXyk7CisgICAgc3RhdGVfID0gSU5JVF9TVEFSVEVEOworICAgIG11dGV4Xy5VbmxvY2soKTsKKyAgICBpbml0X2Jsb2NrZXJfLkxvY2soKTsKKyAgICBpbml0X2Jsb2NrZXJfLlVubG9jaygpOworICAgIG11dGV4Xy5Mb2NrKCk7CisgICAgc3RhdGVfID0gSU5JVF9ET05FOworICB9CisKKyAgc3RhdGljIE9uY2VJbml0VGVzdCogY3VycmVudF90ZXN0XzsKKyAgc3RhdGljIHZvaWQgSW5pdFN0YXRpYygpIHsgY3VycmVudF90ZXN0Xy0+SW5pdCgpOyB9CisgIHN0YXRpYyB2b2lkIEluaXRSZWN1cnNpdmVTdGF0aWMoKSB7IGN1cnJlbnRfdGVzdF8tPkluaXRPbmNlKCk7IH0KK307CisKK09uY2VJbml0VGVzdCogT25jZUluaXRUZXN0OjpjdXJyZW50X3Rlc3RfID0gTlVMTDsKKworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShzaW1wbGVfb25jZSk7CisKK1RFU1RfRihPbmNlSW5pdFRlc3QsIFNpbXBsZSkgeworICBTZXRPbmNlcygmc2ltcGxlX29uY2UsIE5VTEwpOworCisgIEVYUEVDVF9FUShJTklUX05PVF9TVEFSVEVELCBDdXJyZW50U3RhdGUoKSk7CisgIEluaXRPbmNlKCk7CisgIEVYUEVDVF9FUShJTklUX0RPTkUsIEN1cnJlbnRTdGF0ZSgpKTsKKworICAvLyBDYWxsaW5nIGFnYWluIGhhcyBubyBlZmZlY3QuCisgIEluaXRPbmNlKCk7CisgIEVYUEVDVF9FUShJTklUX0RPTkUsIEN1cnJlbnRTdGF0ZSgpKTsKK30KKworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShyZWN1cnNpdmVfb25jZTEpOworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShyZWN1cnNpdmVfb25jZTIpOworCitURVNUX0YoT25jZUluaXRUZXN0LCBSZWN1cnNpdmUpIHsKKyAgU2V0T25jZXMoJnJlY3Vyc2l2ZV9vbmNlMSwgJnJlY3Vyc2l2ZV9vbmNlMik7CisKKyAgRVhQRUNUX0VRKElOSVRfTk9UX1NUQVJURUQsIEN1cnJlbnRTdGF0ZSgpKTsKKyAgSW5pdFJlY3Vyc2l2ZU9uY2UoKTsKKyAgRVhQRUNUX0VRKElOSVRfRE9ORSwgQ3VycmVudFN0YXRlKCkpOworfQorCitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKG11bHRpcGxlX3RocmVhZHNfb25jZSk7CisKK1RFU1RfRihPbmNlSW5pdFRlc3QsIE11bHRpcGxlVGhyZWFkcykgeworICBTZXRPbmNlcygmbXVsdGlwbGVfdGhyZWFkc19vbmNlLCBOVUxMKTsKKworICBzY29wZWRfcHRyPFRlc3RUaHJlYWQ+IHRocmVhZHNbNF07CisgIEVYUEVDVF9FUShJTklUX05PVF9TVEFSVEVELCBDdXJyZW50U3RhdGUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgdGhyZWFkc1tpXS5yZXNldChSdW5Jbml0T25jZUluTmV3VGhyZWFkKCkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgdGhyZWFkc1tpXS0+Sm9pbigpOworICB9CisgIEVYUEVDVF9FUShJTklUX0RPTkUsIEN1cnJlbnRTdGF0ZSgpKTsKK30KKworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShtdWx0aXBsZV90aHJlYWRzX2Jsb2NrZWRfb25jZTEpOworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShtdWx0aXBsZV90aHJlYWRzX2Jsb2NrZWRfb25jZTIpOworCitURVNUX0YoT25jZUluaXRUZXN0LCBNdWx0aXBsZVRocmVhZHNCbG9ja2VkKSB7CisgIFNldE9uY2VzKCZtdWx0aXBsZV90aHJlYWRzX2Jsb2NrZWRfb25jZTEsICZtdWx0aXBsZV90aHJlYWRzX2Jsb2NrZWRfb25jZTIpOworCisgIHNjb3BlZF9wdHI8VGVzdFRocmVhZD4gdGhyZWFkc1s4XTsKKyAgRVhQRUNUX0VRKElOSVRfTk9UX1NUQVJURUQsIEN1cnJlbnRTdGF0ZSgpKTsKKworICBCbG9ja0luaXQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICB0aHJlYWRzW2ldLnJlc2V0KFJ1bkluaXRPbmNlSW5OZXdUaHJlYWQoKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDQ7IGkgPCA4OyBpKyspIHsKKyAgICB0aHJlYWRzW2ldLnJlc2V0KFJ1bkluaXRSZWN1cnNpdmVPbmNlSW5OZXdUaHJlYWQoKSk7CisgIH0KKworICBXYWl0QUJpdCgpOworCisgIC8vIFdlIHNob3VsZCBub3cgaGF2ZSBvbmUgdGhyZWFkIGJsb2NrZWQgaW5zaWRlIEluaXQoKSwgZm91ciBibG9ja2VkIHdhaXRpbmcKKyAgLy8gZm9yIEluaXQoKSB0byBjb21wbGV0ZSwgYW5kIHRocmVlIGJsb2NrZWQgd2FpdGluZyBmb3IgSW5pdFJlY3Vyc2l2ZSgpIHRvCisgIC8vIGNvbXBsZXRlLgorICBFWFBFQ1RfRVEoSU5JVF9TVEFSVEVELCBDdXJyZW50U3RhdGUoKSk7CisgIFVuYmxvY2tJbml0KCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICB0aHJlYWRzW2ldLT5Kb2luKCk7CisgIH0KKyAgRVhQRUNUX0VRKElOSVRfRE9ORSwgQ3VycmVudFN0YXRlKCkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1ZWQxOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BMQVRGT1JNX01BQ1JPU19IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUExBVEZPUk1fTUFDUk9TX0hfCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKy8vIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgZGV0ZWN0aW9uLiAgRm9yIG1vcmUgaW5mbyBvbiB3aGF0J3MgZGVmaW5lZCwgc2VlOgorLy8gICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYjAwODRrYXkuYXNweAorLy8gICBodHRwOi8vd3d3LmFnbmVyLm9yZy9vcHRpbWl6ZS9jYWxsaW5nX2NvbnZlbnRpb25zLnBkZgorLy8gICBvciB3aXRoIGdjYywgcnVuOiAiZWNobyB8IGdjYyAtRSAtZE0gLSIKKyNpZiBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9YNjQgMQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQgMQorI2VsaWYgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9JQTMyIDEKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKKyNlbGlmIGRlZmluZWQoX19BUk1FTF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9BUk0gMQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQorI2VsaWYgZGVmaW5lZChfX01JUFNFTF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9NSVBTIDEKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKKyNlbGlmIGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChfX1BQQ19fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9QUEMgMQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9iaXQgMQorI2VsaWYgZGVmaW5lZChfX3BuYWNsX18pCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzMyX0JJVCAxCisjZWxzZQorI2Vycm9yIEhvc3QgYXJjaGl0ZWN0dXJlIHdhcyBub3QgZGV0ZWN0ZWQgYXMgc3VwcG9ydGVkIGJ5IHByb3RvYnVmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfT1NfQVBQTEUKKyNlbGlmIGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PU19OQUNMCisjZW5kaWYKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUExBVEZPUk1fTUFDUk9TX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLWlubC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTY3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaApAQCAtMCwwICsxLDEyMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gZnJvbSBnb29nbGUzL3V0aWwvZ3RsL3N0bF91dGlsLWlubC5oCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUTF9VVElMX0lOTF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUTF9VVElMX0lOTF9IX18KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisvLyBTVExEZWxldGVDb250YWluZXJQb2ludGVycygpCisvLyAgRm9yIGEgcmFuZ2Ugd2l0aGluIGEgY29udGFpbmVyIG9mIHBvaW50ZXJzLCBjYWxscyBkZWxldGUKKy8vICAobm9uLWFycmF5IHZlcnNpb24pIG9uIHRoZXNlIHBvaW50ZXJzLgorLy8gTk9URTogZm9yIHRoZXNlIHRocmVlIGZ1bmN0aW9ucywgd2UgY291bGQganVzdCBpbXBsZW1lbnQgYSBEZWxldGVPYmplY3QKKy8vIGZ1bmN0b3IgYW5kIHRoZW4gY2FsbCBmb3JfZWFjaCgpIG9uIHRoZSByYW5nZSBhbmQgZnVuY3RvciwgYnV0IHRoaXMKKy8vIHJlcXVpcmVzIHVzIHRvIHB1bGwgaW4gYWxsIG9mIGFsZ29yaXRobS5oLCB3aGljaCBzZWVtcyBleHBlbnNpdmUuCisvLyBGb3IgaGFzaF9bbXVsdGldc2V0LCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIGRlbGV0ZXMgYmVoaW5kIHRoZSBpdGVyYXRvcgorLy8gYmVjYXVzZSB0aGUgaGFzaF9zZXQgbWF5IGNhbGwgdGhlIGhhc2ggZnVuY3Rpb24gb24gdGhlIGl0ZXJhdG9yIHdoZW4gaXQgaXMKKy8vIGFkdmFuY2VkLCB3aGljaCBjb3VsZCByZXN1bHQgaW4gdGhlIGhhc2ggZnVuY3Rpb24gdHJ5aW5nIHRvIGRlZmVyZW5jZSBhCisvLyBzdGFsZSBwb2ludGVyLgordGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvcj4KK3ZvaWQgU1RMRGVsZXRlQ29udGFpbmVyUG9pbnRlcnMoRm9yd2FyZEl0ZXJhdG9yIGJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3J3YXJkSXRlcmF0b3IgZW5kKSB7CisgIHdoaWxlIChiZWdpbiAhPSBlbmQpIHsKKyAgICBGb3J3YXJkSXRlcmF0b3IgdGVtcCA9IGJlZ2luOworICAgICsrYmVnaW47CisgICAgZGVsZXRlICp0ZW1wOworICB9Cit9CisKKy8vIEluc2lkZSBHb29nbGUsIHRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBhIGhvcnJpYmxlLCBkaXNndXN0aW5nIGhhY2sgaW4gd2hpY2gKKy8vIHdlIHJlYWNoIGludG8gdGhlIHN0cmluZydzIHByaXZhdGUgaW1wbGVtZW50YXRpb24gYW5kIHJlc2l6ZSBpdCB3aXRob3V0CisvLyBpbml0aWFsaXppbmcgdGhlIG5ldyBieXRlcy4gIEluIHNvbWUgY2FzZXMgZG9pbmcgdGhpcyBjYW4gc2lnbmlmaWNhbnRseQorLy8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gIEhvd2V2ZXIsIHNpbmNlIGl0J3MgdG90YWxseSBub24tcG9ydGFibGUgaXQgaGFzIG5vCisvLyBwbGFjZSBpbiBvcGVuIHNvdXJjZSBjb2RlLiAgRmVlbCBmcmVlIHRvIGZpbGwgdGhpcyBmdW5jdGlvbiBpbiB3aXRoIHlvdXIKKy8vIG93biBkaXNndXN0aW5nIGhhY2sgaWYgeW91IHdhbnQgdGhlIHBlcmYgYm9vc3QuCitpbmxpbmUgdm9pZCBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKHN0cmluZyogcywgc2l6ZV90IG5ld19zaXplKSB7CisgIHMtPnJlc2l6ZShuZXdfc2l6ZSk7Cit9CisKKy8vIFJldHVybiBhIG11dGFibGUgY2hhciogcG9pbnRpbmcgdG8gYSBzdHJpbmcncyBpbnRlcm5hbCBidWZmZXIsCisvLyB3aGljaCBtYXkgbm90IGJlIG51bGwtdGVybWluYXRlZC4gV3JpdGluZyB0aHJvdWdoIHRoaXMgcG9pbnRlciB3aWxsCisvLyBtb2RpZnkgdGhlIHN0cmluZy4KKy8vCisvLyBzdHJpbmdfYXNfYXJyYXkoJnN0cilbaV0gaXMgdmFsaWQgZm9yIDAgPD0gaSA8IHN0ci5zaXplKCkgdW50aWwgdGhlCisvLyBuZXh0IGNhbGwgdG8gYSBzdHJpbmcgbWV0aG9kIHRoYXQgaW52YWxpZGF0ZXMgaXRlcmF0b3JzLgorLy8KKy8vIEFzIG9mIDIwMDYtMDQsIHRoZXJlIGlzIG5vIHN0YW5kYXJkLWJsZXNzZWQgd2F5IG9mIGdldHRpbmcgYQorLy8gbXV0YWJsZSByZWZlcmVuY2UgdG8gYSBzdHJpbmcncyBpbnRlcm5hbCBidWZmZXIuIEhvd2V2ZXIsIGlzc3VlIDUzMAorLy8gKGh0dHA6Ly93d3cub3Blbi1zdGQub3JnL0pUQzEvU0MyMi9XRzIxL2RvY3MvbHdnLWFjdGl2ZS5odG1sIzUzMCkKKy8vIHByb3Bvc2VzIHRoaXMgYXMgdGhlIG1ldGhvZC4gQWNjb3JkaW5nIHRvIE1hdHQgQXVzdGVybiwgdGhpcyBzaG91bGQKKy8vIGFscmVhZHkgd29yayBvbiBhbGwgY3VycmVudCBpbXBsZW1lbnRhdGlvbnMuCitpbmxpbmUgY2hhciogc3RyaW5nX2FzX2FycmF5KHN0cmluZyogc3RyKSB7CisgIC8vIERPIE5PVCBVU0UgY29uc3RfY2FzdDxjaGFyKj4oc3RyLT5kYXRhKCkpISBTZWUgdGhlIHVuaXR0ZXN0IGZvciB3aHkuCisgIHJldHVybiBzdHItPmVtcHR5KCkgPyBOVUxMIDogJipzdHItPmJlZ2luKCk7Cit9CisKKy8vIFNUTERlbGV0ZUVsZW1lbnRzKCkgZGVsZXRlcyBhbGwgdGhlIGVsZW1lbnRzIGluIGFuIFNUTCBjb250YWluZXIgYW5kIGNsZWFycworLy8gdGhlIGNvbnRhaW5lci4gIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgZm9yIHVzZSB3aXRoIGEgdmVjdG9yLCBzZXQsCisvLyBoYXNoX3NldCwgb3IgYW55IG90aGVyIFNUTCBjb250YWluZXIgd2hpY2ggZGVmaW5lcyBzZW5zaWJsZSBiZWdpbigpLCBlbmQoKSwKKy8vIGFuZCBjbGVhcigpIG1ldGhvZHMuCisvLworLy8gSWYgY29udGFpbmVyIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcC4KKy8vCisvLyBBcyBhbiBhbHRlcm5hdGl2ZSB0byBjYWxsaW5nIFNUTERlbGV0ZUVsZW1lbnRzKCkgZGlyZWN0bHksIGNvbnNpZGVyCisvLyBFbGVtZW50RGVsZXRlciAoZGVmaW5lZCBiZWxvdyksIHdoaWNoIGVuc3VyZXMgdGhhdCB5b3VyIGNvbnRhaW5lcidzIGVsZW1lbnRzCisvLyBhcmUgZGVsZXRlZCB3aGVuIHRoZSBFbGVtZW50RGVsZXRlciBnb2VzIG91dCBvZiBzY29wZS4KK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBTVExEZWxldGVFbGVtZW50cyhUICpjb250YWluZXIpIHsKKyAgaWYgKCFjb250YWluZXIpIHJldHVybjsKKyAgU1RMRGVsZXRlQ29udGFpbmVyUG9pbnRlcnMoY29udGFpbmVyLT5iZWdpbigpLCBjb250YWluZXItPmVuZCgpKTsKKyAgY29udGFpbmVyLT5jbGVhcigpOworfQorCisvLyBHaXZlbiBhbiBTVEwgY29udGFpbmVyIGNvbnNpc3Rpbmcgb2YgKGtleSwgdmFsdWUpIHBhaXJzLCBTVExEZWxldGVWYWx1ZXMKKy8vIGRlbGV0ZXMgYWxsIHRoZSAidmFsdWUiIGNvbXBvbmVudHMgYW5kIGNsZWFycyB0aGUgY29udGFpbmVyLiAgRG9lcyBub3RoaW5nCisvLyBpbiB0aGUgY2FzZSBpdCdzIGdpdmVuIGEgTlVMTCBwb2ludGVyLgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgU1RMRGVsZXRlVmFsdWVzKFQgKnYpIHsKKyAgaWYgKCF2KSByZXR1cm47CisgIGZvciAodHlwZW5hbWUgVDo6aXRlcmF0b3IgaSA9IHYtPmJlZ2luKCk7IGkgIT0gdi0+ZW5kKCk7ICsraSkgeworICAgIGRlbGV0ZSBpLT5zZWNvbmQ7CisgIH0KKyAgdi0+Y2xlYXIoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUTF9VVElMX0lOTF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjZhZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmNjCkBAIC0wLDAgKzEsNTM2IEBACisvLyBDb3B5cmlnaHQgMjAwNS0yMDA4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLyBBdXRob3I6IGpybUBnb29nbGUuY29tIChKaW0gTWVlaGFuKQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBUaGVzZSBmb3VyLWJ5dGUgZW50cmllcyBjb21wYWN0bHkgZW5jb2RlIGhvdyBtYW55IGJ5dGVzIDAuLjI1NSB0byBkZWxldGUKKy8vIGluIG1ha2luZyBhIHN0cmluZyByZXBsYWNlbWVudCwgaG93IG1hbnkgYnl0ZXMgdG8gYWRkIDAuLjI1NSwgYW5kIHRoZSBvZmZzZXQKKy8vIDAuLjY0ay0xIG9mIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgaW4gcmVtYXBfc3RyaW5nLgorc3RydWN0IFJlbWFwRW50cnkgeworICB1aW50OCBkZWxldGVfYnl0ZXM7CisgIHVpbnQ4IGFkZF9ieXRlczsKKyAgdWludDE2IGJ5dGVzX29mZnNldDsKK307CisKKy8vIEV4aXQgdHlwZSBjb2RlcyBmb3Igc3RhdGUgdGFibGVzLiBBbGwgYnV0IHRoZSBmaXJzdCBnZXQgc3R1ZmZlZCBpbnRvCisvLyBzaWduZWQgb25lLWJ5dGUgZW50cmllcy4gVGhlIGZpcnN0IGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IGV4ZWN1dGFibGUgY29kZS4KKy8vIFRvIGRpc3Rpbmd1aXNoIGZyb20gbmV4dC1zdGF0ZSBlbnRyaWVzLCB0aGVzZSBtdXN0IGJlIGNvbnRpZ3VvdXMgYW5kCisvLyBhbGwgPD0ga0V4aXROb25lCit0eXBlZGVmIGVudW0geworICBrRXhpdERzdFNwYWNlRnVsbCA9IDIzOSwKKyAga0V4aXRJbGxlZ2FsU3RydWN0dXJlLCAgLy8gMjQwCisgIGtFeGl0T0ssICAgICAgICAgICAgICAgIC8vIDI0MQorICBrRXhpdFJlamVjdCwgICAgICAgICAgICAvLyAuLi4KKyAga0V4aXRSZXBsYWNlMSwKKyAga0V4aXRSZXBsYWNlMiwKKyAga0V4aXRSZXBsYWNlMywKKyAga0V4aXRSZXBsYWNlMjEsCisgIGtFeGl0UmVwbGFjZTMxLAorICBrRXhpdFJlcGxhY2UzMiwKKyAga0V4aXRSZXBsYWNlT2Zmc2V0MSwKKyAga0V4aXRSZXBsYWNlT2Zmc2V0MiwKKyAga0V4aXRSZXBsYWNlMVMwLAorICBrRXhpdFNwZWNpYWwsCisgIGtFeGl0RG9BZ2FpbiwKKyAga0V4aXRSZWplY3RBbHQsCisgIGtFeGl0Tm9uZSAgICAgICAgICAgICAgIC8vIDI1NQorfSBFeGl0UmVhc29uOworCisKKy8vIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgb25lIGVudGlyZSBzdGF0ZSB0YWJsZS4gVGhlIHRocmVlIGluaXRpYWxpemVkIGJ5dGUKKy8vIGFyZWFzIGFyZSBzdGF0ZV90YWJsZSwgcmVtYXBfYmFzZSwgYW5kIHJlbWFwX3N0cmluZy4gc3RhdGUwIGFuZCBzdGF0ZTBfc2l6ZQorLy8gZ2l2ZSB0aGUgYnl0ZSBvZmZzZXQgYW5kIGxlbmd0aCB3aXRoaW4gc3RhdGVfdGFibGUgb2YgdGhlIGluaXRpYWwgc3RhdGUgLS0KKy8vIHRhYmxlIGxvb2t1cHMgYXJlIGV4cGVjdGVkIHRvIHN0YXJ0IGFuZCBlbmQgaW4gdGhpcyBzdGF0ZSwgYnV0IGZvcgorLy8gdHJ1bmNhdGVkIFVURi04IHN0cmluZ3MsIG1heSBlbmQgaW4gYSBkaWZmZXJlbnQgc3RhdGUuIFRoZXNlIGFsbG93IGEgcXVpY2sKKy8vIHRlc3QgZm9yIHRoYXQgY29uZGl0aW9uLiBlbnRyeV9zaGlmdCBpcyA4IGZvciB0YWJsZXMgc3Vic2NyaXB0ZWQgYnkgYSBmdWxsCisvLyBieXRlIHZhbHVlIGFuZCA2IGZvciBzcGFjZS1vcHRpbWl6ZWQgdGFibGVzIHN1YnNjcmlwdGVkIGJ5IG9ubHkgc2l4CisvLyBzaWduaWZpY2FudCBiaXRzIGluIFVURi04IGNvbnRpbnVhdGlvbiBieXRlcy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgdWludDMyIHN0YXRlMDsKKyAgY29uc3QgdWludDMyIHN0YXRlMF9zaXplOworICBjb25zdCB1aW50MzIgdG90YWxfc2l6ZTsKKyAgY29uc3QgaW50IG1heF9leHBhbmQ7CisgIGNvbnN0IGludCBlbnRyeV9zaGlmdDsKKyAgY29uc3QgaW50IGJ5dGVzX3Blcl9lbnRyeTsKKyAgY29uc3QgdWludDMyIGxvc3ViOworICBjb25zdCB1aW50MzIgaGlhZGQ7CisgIGNvbnN0IHVpbnQ4KiBzdGF0ZV90YWJsZTsKKyAgY29uc3QgUmVtYXBFbnRyeSogcmVtYXBfYmFzZTsKKyAgY29uc3QgdWludDgqIHJlbWFwX3N0cmluZzsKKyAgY29uc3QgdWludDgqIGZhc3Rfc3RhdGU7Cit9IFVURjhTdGF0ZU1hY2hpbmVPYmo7CisKK3R5cGVkZWYgVVRGOFN0YXRlTWFjaGluZU9iaiBVVEY4U2Nhbk9iajsKKworI2RlZmluZSBYX18gKGtFeGl0SWxsZWdhbFN0cnVjdHVyZSkKKyNkZWZpbmUgUkpfIChrRXhpdFJlamVjdCkKKyNkZWZpbmUgUzFfIChrRXhpdFJlcGxhY2UxKQorI2RlZmluZSBTMl8gKGtFeGl0UmVwbGFjZTIpCisjZGVmaW5lIFMzXyAoa0V4aXRSZXBsYWNlMykKKyNkZWZpbmUgUzIxIChrRXhpdFJlcGxhY2UyMSkKKyNkZWZpbmUgUzMxIChrRXhpdFJlcGxhY2UzMSkKKyNkZWZpbmUgUzMyIChrRXhpdFJlcGxhY2UzMikKKyNkZWZpbmUgVDFfIChrRXhpdFJlcGxhY2VPZmZzZXQxKQorI2RlZmluZSBUMl8gKGtFeGl0UmVwbGFjZU9mZnNldDIpCisjZGVmaW5lIFMxMSAoa0V4aXRSZXBsYWNlMVMwKQorI2RlZmluZSBTUF8gKGtFeGl0U3BlY2lhbCkKKyNkZWZpbmUgRF9fIChrRXhpdERvQWdhaW4pCisjZGVmaW5lIFJKQSAoa0V4aXRSZWplY3RBbHQpCisKKy8vICBFbnRpcmUgdGFibGUgaGFzIDkgc3RhdGUgYmxvY2tzIG9mIDI1NiBlbnRyaWVzIGVhY2gKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfU1RBVEUwID0gMDsgICAgIC8vIHN0YXRlWzBdCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX1NUQVRFMF9TSVpFID0gMjU2OyAgLy8gPVsxXQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19UT1RBTF9TSVpFID0gMjMwNDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfTUFYX0VYUEFORF9YNCA9IDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX1NISUZUID0gODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfQllURVMgPSAxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19MT1NVQiA9IDB4MjAyMDIwMjA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX0hJQUREID0gMHgwMDAwMDAwMDsKKworc3RhdGljIGNvbnN0IHVpbnQ4IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzW10gPSB7CisvLyBzdGF0ZVswXSAweDAwMDAwMCBCeXRlIDEKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCisgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAorICAyLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICA3LCAgIDMsICAgMywKKyAgNCwgICA1LCAgIDUsICAgNSwgICA2LCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKy8vIHN0YXRlWzFdIDB4MDAwMDgwIEJ5dGUgMiBvZiAyCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisvLyBzdGF0ZVsyXSAweDAwMDAwMCBCeXRlIDIgb2YgMworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAorICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworLy8gc3RhdGVbM10gMHgwMDEwMDAgQnl0ZSAyIG9mIDMKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKyAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCisgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAorICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKy8vIHN0YXRlWzRdIDB4MDAwMDAwIEJ5dGUgMiBvZiA0CitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKKyAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsCisgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisvLyBzdGF0ZVs1XSAweDA0MDAwMCBCeXRlIDIgb2YgNAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKKyAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsCisgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLAorICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworLy8gc3RhdGVbNl0gMHgxMDAwMDAgQnl0ZSAyIG9mIDQKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKyAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCisKKy8vIHN0YXRlWzddIDB4MDBkMDAwIEJ5dGUgMiBvZiAzCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAorICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKKyAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsCisgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LAorCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorCisvLyBzdGF0ZVs4XSAweDAwZDgwMCBCeXRlIDMgb2YgMworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKKworUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sICBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywKK1JKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCAgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sCitSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLAorUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sICBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywKKworWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK1hfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCitYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAorWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKK307CisKKy8vIFJlbWFwIGJhc2VbMF0gPSAoZGVsLCBhZGQsIHN0cmluZ19vZmZzZXQpCitzdGF0aWMgY29uc3QgUmVtYXBFbnRyeSB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19yZW1hcF9iYXNlW10gPSB7Cit7MCwgMCwgMH0gfTsKKworLy8gUmVtYXAgc3RyaW5nWzBdCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19yZW1hcF9zdHJpbmdbXSA9IHsKKzAgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfZmFzdFsyNTZdID0geworMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCisxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKworMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCit9OworCitzdGF0aWMgY29uc3QgVVRGOFNjYW5PYmogdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfb2JqID0geworICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19TVEFURTAsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX1NUQVRFMF9TSVpFLAorICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19UT1RBTF9TSVpFLAorICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19NQVhfRVhQQU5EX1g0LAorICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19TSElGVCwKKyAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfQllURVMsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX0xPU1VCLAorICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19ISUFERCwKKyAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXMsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX3JlbWFwX2Jhc2UsCisgIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX3JlbWFwX3N0cmluZywKKyAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfZmFzdAorfTsKKworCisjdW5kZWYgWF9fCisjdW5kZWYgUkpfCisjdW5kZWYgUzFfCisjdW5kZWYgUzJfCisjdW5kZWYgUzNfCisjdW5kZWYgUzIxCisjdW5kZWYgUzMxCisjdW5kZWYgUzMyCisjdW5kZWYgVDFfCisjdW5kZWYgVDJfCisjdW5kZWYgUzExCisjdW5kZWYgU1BfCisjdW5kZWYgRF9fCisjdW5kZWYgUkpBCisKKy8vIFJldHVybiB0cnVlIGlmIGN1cnJlbnQgVGJsIHBvaW50ZXIgaXMgd2l0aGluIHN0YXRlMCByYW5nZQorLy8gTm90ZSB0aGF0IHVuc2lnbmVkIGNvbXBhcmUgY2hlY2tzIGJvdGggZW5kcyBvZiByYW5nZSBzaW11bHRhbmVvdXNseQorc3RhdGljIGlubGluZSBib29sIEluU3RhdGVaZXJvKGNvbnN0IFVURjhTY2FuT2JqKiBzdCwgY29uc3QgdWludDgqIFRibCkgeworICBjb25zdCB1aW50OCogVGJsMCA9ICZzdC0+c3RhdGVfdGFibGVbc3QtPnN0YXRlMF07CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDMyPihUYmwgLSBUYmwwKSA8IHN0LT5zdGF0ZTBfc2l6ZSk7Cit9CisKKy8vIFNjYW4gYSBVVEYtOCBzdHJpbmcgYmFzZWQgb24gc3RhdGUgdGFibGUuCisvLyBBbHdheXMgc2NhbiBjb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXJzCisvLyBTZXQgbnVtYmVyIG9mIGJ5dGVzIHNjYW5uZWQuIFJldHVybiByZWFzb24gZm9yIGV4aXRpbmcKK2ludCBVVEY4R2VuZXJpY1NjYW4oY29uc3QgVVRGOFNjYW5PYmoqIHN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogc3RyLAorICAgICAgICAgICAgICAgICAgICBpbnQgc3RyX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgaW50KiBieXRlc19jb25zdW1lZCkgeworICAqYnl0ZXNfY29uc3VtZWQgPSAwOworICBpZiAoc3RyX2xlbmd0aCA9PSAwKSByZXR1cm4ga0V4aXRPSzsKKworICBpbnQgZXNoaWZ0ID0gc3QtPmVudHJ5X3NoaWZ0OworICBjb25zdCB1aW50OCogaXNyYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihzdHIpOworICBjb25zdCB1aW50OCogc3JjID0gaXNyYzsKKyAgY29uc3QgdWludDgqIHNyY2xpbWl0ID0gaXNyYyArIHN0cl9sZW5ndGg7CisgIGNvbnN0IHVpbnQ4KiBzcmNsaW1pdDggPSBzcmNsaW1pdCAtIDc7CisgIGNvbnN0IHVpbnQ4KiBUYmxfMCA9ICZzdC0+c3RhdGVfdGFibGVbc3QtPnN0YXRlMF07CisKKyBEb0FnYWluOgorICAvLyBEbyBzdGF0ZS10YWJsZSBzY2FuCisgIGludCBlID0gMDsKKyAgdWludDggYzsKKyAgY29uc3QgdWludDgqIFRibDIgPSAmc3QtPmZhc3Rfc3RhdGVbMF07CisgIGNvbnN0IHVpbnQzMiBsb3N1YiA9IHN0LT5sb3N1YjsKKyAgY29uc3QgdWludDMyIGhpYWRkID0gc3QtPmhpYWRkOworICAvLyBDaGVjayBpbml0aWFsIGZldyBieXRlcyBvbmUgYXQgYSB0aW1lIHVudGlsIDgtYnl0ZSBhbGlnbmVkCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB3aGlsZSAoKCgodWludHB0cl90KXNyYyAmIDB4MDcpICE9IDApICYmCisgICAgICAgICAoc3JjIDwgc3JjbGltaXQpICYmCisgICAgICAgICBUYmwyW3NyY1swXV0gPT0gMCkgeworICAgIHNyYysrOworICB9CisgIGlmICgoKHVpbnRwdHJfdClzcmMgJiAweDA3KSA9PSAwKSB7CisgICAgLy8gRG8gZmFzdCBmb3IgZ3JvdXBzIG9mIDggaWRlbnRpdHkgYnl0ZXMuCisgICAgLy8gVGhpcyBjb3ZlcnMgYSBsb3Qgb2YgNy1iaXQgQVNDSUkgfjh4IGZhc3RlciB0aGVuIHRoZSAxLWJ5dGUgbG9vcCwKKyAgICAvLyBpbmNsdWRpbmcgc2xvd2luZyBzbGlnaHRseSBvbiBjci9sZi9odAorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHdoaWxlIChzcmMgPCBzcmNsaW1pdDgpIHsKKyAgICAgIHVpbnQzMiBzMDEyMyA9IChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMiAqPihzcmMpKVswXTsKKyAgICAgIHVpbnQzMiBzNDU2NyA9IChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMiAqPihzcmMpKVsxXTsKKyAgICAgIHNyYyArPSA4OworICAgICAgLy8gVGhpcyBpcyBhIGZhc3QgcmFuZ2UgY2hlY2sgZm9yIGFsbCBieXRlcyBpbiBbbG93c3ViLi4weDgwLWhpYWRkKQorICAgICAgdWludDMyIHRlbXAgPSAoczAxMjMgLSBsb3N1YikgfCAoczAxMjMgKyBoaWFkZCkgfAorICAgICAgICAgICAgICAgICAgICAoczQ1NjcgLSBsb3N1YikgfCAoczQ1NjcgKyBoaWFkZCk7CisgICAgICBpZiAoKHRlbXAgJiAweDgwODA4MDgwKSAhPSAwKSB7CisgICAgICAgIC8vIFdlIHR5cGljYWxseSBlbmQgdXAgaGVyZSBvbiBjci9sZi9odDsgc3JjIHdhcyBpbmNyZW1lbnRlZAorICAgICAgICBpbnQgZTAxMjMgPSAoVGJsMltzcmNbLThdXSB8IFRibDJbc3JjWy03XV0pIHwKKyAgICAgICAgICAgICAgICAgICAgKFRibDJbc3JjWy02XV0gfCBUYmwyW3NyY1stNV1dKTsKKyAgICAgICAgaWYgKGUwMTIzICE9IDApIHsKKyAgICAgICAgICBzcmMgLT0gODsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAgICAvLyBFeGl0IG9uIE5vbi1pbnRlcmNoYW5nZQorICAgICAgICBlMDEyMyA9IChUYmwyW3NyY1stNF1dIHwgVGJsMltzcmNbLTNdXSkgfAorICAgICAgICAgICAgICAgIChUYmwyW3NyY1stMl1dIHwgVGJsMltzcmNbLTFdXSk7CisgICAgICAgIGlmIChlMDEyMyAhPSAwKSB7CisgICAgICAgICAgc3JjIC09IDQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gICAgLy8gRXhpdCBvbiBOb24taW50ZXJjaGFuZ2UKKyAgICAgICAgLy8gRWxzZSBPSywgZ28gYXJvdW5kIGFnYWluCisgICAgICB9CisgICAgfQorICB9CisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIEJ5dGUtYXQtYS10aW1lIHNjYW4KKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGNvbnN0IHVpbnQ4KiBUYmwgPSBUYmxfMDsKKyAgd2hpbGUgKHNyYyA8IHNyY2xpbWl0KSB7CisgICAgYyA9ICpzcmM7CisgICAgZSA9IFRibFtjXTsKKyAgICBzcmMrKzsKKyAgICBpZiAoZSA+PSBrRXhpdElsbGVnYWxTdHJ1Y3R1cmUpIHticmVhazt9CisgICAgVGJsID0gJlRibF8wW2UgPDwgZXNoaWZ0XTsKKyAgfQorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgIC8vIEV4aXQgcG9zaWJpbGl0aWVzOgorICAvLyAgU29tZSBleGl0IGNvZGUsICFzdGF0ZTAsIGJhY2sgdXAgb3ZlciBsYXN0IGNoYXIKKyAgLy8gIFNvbWUgZXhpdCBjb2RlLCBzdGF0ZTAsIGJhY2sgdXAgb25lIGJ5dGUgZXhhY3RseQorICAvLyAgc291cmNlIGNvbnN1bWVkLCAhc3RhdGUwLCBiYWNrIHVwIG92ZXIgcGFydGlhbCBjaGFyCisgIC8vICBzb3VyY2UgY29uc3VtZWQsIHN0YXRlMCwgZXhpdCBPSworICAvLyBGb3IgaWxsZWdhbCBieXRlIGluIHN0YXRlMCwgYXZvaWQgYmFja3VwIHVwIG92ZXIgUFJFVklPVVMgY2hhcgorICAvLyBGb3IgdHJ1bmNhdGVkIGxhc3QgY2hhciwgYmFjayB1cCB0byBiZWdpbm5pbmcgb2YgaXQKKworICBpZiAoZSA+PSBrRXhpdElsbGVnYWxTdHJ1Y3R1cmUpIHsKKyAgICAvLyBCYWNrIHVwIG92ZXIgZXhhY3RseSBvbmUgYnl0ZSBvZiByZWplY3RlZC9pbGxlZ2FsIFVURi04IGNoYXJhY3RlcgorICAgIHNyYy0tOworICAgIC8vIEJhY2sgdXAgbW9yZSBpZiBuZWVkZWQKKyAgICBpZiAoIUluU3RhdGVaZXJvKHN0LCBUYmwpKSB7CisgICAgICBkbyB7CisgICAgICAgIHNyYy0tOworICAgICAgfSB3aGlsZSAoKHNyYyA+IGlzcmMpICYmICgoc3JjWzBdICYgMHhjMCkgPT0gMHg4MCkpOworICAgIH0KKyAgfSBlbHNlIGlmICghSW5TdGF0ZVplcm8oc3QsIFRibCkpIHsKKyAgICAvLyBCYWNrIHVwIG92ZXIgdHJ1bmNhdGVkIFVURi04IGNoYXJhY3RlcgorICAgIGUgPSBrRXhpdElsbGVnYWxTdHJ1Y3R1cmU7CisgICAgZG8geworICAgICAgc3JjLS07CisgICAgfSB3aGlsZSAoKHNyYyA+IGlzcmMpICYmICgoc3JjWzBdICYgMHhjMCkgPT0gMHg4MCkpOworICB9IGVsc2UgeworICAgIC8vIE5vcm1hbCB0ZXJtaW5hdGlvbiwgc291cmNlIGZ1bGx5IGNvbnN1bWVkCisgICAgZSA9IGtFeGl0T0s7CisgIH0KKworICBpZiAoZSA9PSBrRXhpdERvQWdhaW4pIHsKKyAgICAvLyBMb29wIGJhY2sgdXAgdG8gdGhlIGZhc3Qgc2NhbgorICAgIGdvdG8gRG9BZ2FpbjsKKyAgfQorCisgICpieXRlc19jb25zdW1lZCA9IHNyYyAtIGlzcmM7CisgIHJldHVybiBlOworfQorCitpbnQgVVRGOEdlbmVyaWNTY2FuRmFzdEFzY2lpKGNvbnN0IFVURjhTY2FuT2JqKiBzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0cl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIGludCogYnl0ZXNfY29uc3VtZWQpIHsKKyAgKmJ5dGVzX2NvbnN1bWVkID0gMDsKKyAgaWYgKHN0cl9sZW5ndGggPT0gMCkgcmV0dXJuIGtFeGl0T0s7CisKKyAgY29uc3QgdWludDgqIGlzcmMgPSAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KHN0cik7CisgIGNvbnN0IHVpbnQ4KiBzcmMgPSBpc3JjOworICBjb25zdCB1aW50OCogc3JjbGltaXQgPSBpc3JjICsgc3RyX2xlbmd0aDsKKyAgY29uc3QgdWludDgqIHNyY2xpbWl0OCA9IHNyY2xpbWl0IC0gNzsKKyAgaW50IG47CisgIGludCByZXN0X2NvbnN1bWVkOworICBpbnQgZXhpdF9yZWFzb247CisgIGRvIHsKKyAgICAvLyBDaGVjayBpbml0aWFsIGZldyBieXRlcyBvbmUgYXQgYSB0aW1lIHVudGlsIDgtYnl0ZSBhbGlnbmVkCisgICAgd2hpbGUgKCgoKHVpbnRwdHJfdClzcmMgJiAweDA3KSAhPSAwKSAmJgorICAgICAgICAgICAoc3JjIDwgc3JjbGltaXQpICYmIChzcmNbMF0gPCAweDgwKSkgeworICAgICAgc3JjKys7CisgICAgfQorICAgIGlmICgoKHVpbnRwdHJfdClzcmMgJiAweDA3KSA9PSAwKSB7CisgICAgICB3aGlsZSAoKHNyYyA8IHNyY2xpbWl0OCkgJiYKKyAgICAgICAgICAgICAoKChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMio+KHNyYylbMF0gfAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyKj4oc3JjKVsxXSkgJiAweDgwODA4MDgwKSA9PSAwKSkgeworICAgICAgICBzcmMgKz0gODsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKChzcmMgPCBzcmNsaW1pdCkgJiYgKHNyY1swXSA8IDB4ODApKSB7CisgICAgICBzcmMrKzsKKyAgICB9CisgICAgLy8gUnVuIHN0YXRlIHRhYmxlIG9uIHRoZSByZXN0CisgICAgbiA9IHNyYyAtIGlzcmM7CisgICAgZXhpdF9yZWFzb24gPSBVVEY4R2VuZXJpY1NjYW4oc3QsIHN0ciArIG4sIHN0cl9sZW5ndGggLSBuLCAmcmVzdF9jb25zdW1lZCk7CisgICAgc3JjICs9IHJlc3RfY29uc3VtZWQ7CisgIH0gd2hpbGUgKCBleGl0X3JlYXNvbiA9PSBrRXhpdERvQWdhaW4gKTsKKworICAqYnl0ZXNfY29uc3VtZWQgPSBzcmMgLSBpc3JjOworICByZXR1cm4gZXhpdF9yZWFzb247Cit9CisKKy8vIEhhY2s6ICBPbiBzb21lIGNvbXBpbGVycyB0aGUgc3RhdGljIHRhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgYXQgc3RhcnR1cC4KKy8vICAgV2UgY2FuJ3QgdXNlIHRoZW0gdW50aWwgdGhleSBhcmUgaW5pdGlhbGl6ZWQuICBIb3dldmVyLCBzb21lIFByb3RvY29sCisvLyAgIEJ1ZmZlciBwYXJzaW5nIGhhcHBlbnMgYXQgc3RhdGljIGluaXQgdGltZSBhbmQgbWF5IHRyeSB0byB2YWxpZGF0ZQorLy8gICBVVEYtOCBzdHJpbmdzLiAgU2luY2UgVVRGLTggdmFsaWRhdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZworLy8gICBhbnl3YXksIHdlIHNpbXBseSBhbHdheXMgcmV0dXJuIHN1Y2Nlc3MgaWYgaW5pdGlhbGl6YXRpb24gaGFzbid0CisvLyAgIG9jY3VycmVkIHlldC4KK25hbWVzcGFjZSB7CisKK2Jvb2wgbW9kdWxlX2luaXRpYWxpemVkXyA9IGZhbHNlOworCitzdHJ1Y3QgSW5pdERldGVjdG9yIHsKKyAgSW5pdERldGVjdG9yKCkgeworICAgIG1vZHVsZV9pbml0aWFsaXplZF8gPSB0cnVlOworICB9Cit9OworSW5pdERldGVjdG9yIGluaXRfZGV0ZWN0b3I7CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIElzU3RydWN0dXJhbGx5VmFsaWRVVEY4KGNvbnN0IGNoYXIqIGJ1ZiwgaW50IGxlbikgeworICBpZiAoIW1vZHVsZV9pbml0aWFsaXplZF8pIHJldHVybiB0cnVlOworICAKKyAgaW50IGJ5dGVzX2NvbnN1bWVkID0gMDsKKyAgVVRGOEdlbmVyaWNTY2FuRmFzdEFzY2lpKCZ1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGxlbiwgJmJ5dGVzX2NvbnN1bWVkKTsKKyAgcmV0dXJuIChieXRlc19jb25zdW1lZCA9PSBsZW4pOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwODg4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIEF1dGhvcjogeHBlbmdAZ29vZ2xlLmNvbSAoUGV0ZXIgUGVuZykKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworbmFtZXNwYWNlIHsKKworVEVTVChTdHJ1Y3R1cmFsbHlWYWxpZFRlc3QsIFZhbGlkVVRGOFN0cmluZykgeworICAvLyBPbiBHQ0MsIHRoaXMgc3RyaW5nIGNhbiBiZSB3cml0dGVuIGFzOgorICAvLyAgICJhYmNkIDEyMzQgLSBcdTIwMTRcdTIwMTNcdTIyMTIiCisgIC8vIE1TVkMgc2VlbXMgdG8gaW50ZXJwcmV0IFx1IGRpZmZlcmVudGx5LgorICBzdHJpbmcgdmFsaWRfc3RyKCJhYmNkIDEyMzQgLSBcMzQyXDIwMFwyMjRcMzQyXDIwMFwyMjNcMzQyXDIxMFwyMjIgLSB4eXo3ODkiKTsKKyAgRVhQRUNUX1RSVUUoSXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgodmFsaWRfc3RyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfc3RyLnNpemUoKSkpOworICAvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBwb2ludGVyIGFsaWdubWVudAorICBmb3IgKGludCBpID0gMTsgaSA8IDg7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKElzU3RydWN0dXJhbGx5VmFsaWRVVEY4KHZhbGlkX3N0ci5kYXRhKCkgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkX3N0ci5zaXplKCkgLSBpKSk7CisgIH0KK30KKworVEVTVChTdHJ1Y3R1cmFsbHlWYWxpZFRlc3QsIEludmFsaWRVVEY4U3RyaW5nKSB7CisgIGNvbnN0IHN0cmluZyBpbnZhbGlkX3N0cigiYWJjZFx4QTBceEIwXHhBMFx4QjBceEEwXHhCMCAtIHh5ejc4OSIpOworICBFWFBFQ1RfRkFMU0UoSXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgoaW52YWxpZF9zdHIuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZF9zdHIuc2l6ZSgpKSk7CisgIC8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIHBvaW50ZXIgYWxpZ25tZW50CisgIGZvciAoaW50IGkgPSAxOyBpIDwgODsgKytpKSB7CisgICAgRVhQRUNUX0ZBTFNFKElzU3RydWN0dXJhbGx5VmFsaWRVVEY4KGludmFsaWRfc3RyLmRhdGEoKSArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRfc3RyLnNpemUoKSAtIGkpKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTA3Y2U3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYwpAQCAtMCwwICsxLDExNzMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIGZyb20gZ29vZ2xlMy9zdHJpbmdzL3N0cnV0aWwuY2MKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmbG9hdC5oPiAgICAvLyBGTFRfRElHIGFuZCBEQkxfRElHCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKKyNpZmRlZiBfV0lOMzIKKy8vIE1TVkMgaGFzIG9ubHkgX3NucHJpbnRmLCBub3Qgc25wcmludGYuCisvLworLy8gTWluR1cgaGFzIGJvdGggc25wcmludGYgYW5kIF9zbnByaW50ZiwgYnV0IHRoZXkgYXBwZWFyIHRvIGJlIGRpZmZlcmVudAorLy8gZnVuY3Rpb25zLiAgVGhlIGZvcm1lciBpcyBidWdneS4gIFdoZW4gaW52b2tlZCBsaWtlIHNvOgorLy8gICBjaGFyIGJ1ZmZlclszMl07CisvLyAgIHNucHJpbnRmKGJ1ZmZlciwgMzIsICIlLipnXG4iLCBGTFRfRElHLCAxLjIzZTEwZik7CisvLyBpdCBwcmludHMgIjEuMjMwMDBlKzEwIi4gIFRoaXMgaXMgcGxhaW5seSB3cm9uZzogICVnIHNob3VsZCBuZXZlciBwcmludAorLy8gdHJhaWxpbmcgemVyb3MgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuICBGb3Igc29tZSByZWFzb24gdGhpcyBidWcgb25seQorLy8gb2NjdXJzIHdpdGggc29tZSBpbnB1dCB2YWx1ZXMsIG5vdCBhbGwuICBJbiBhbnkgY2FzZSwgX3NucHJpbnRmIGRvZXMgdGhlCisvLyByaWdodCB0aGluZywgc28gd2UgdXNlIGl0LgorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2lubGluZSBib29sIElzTmFOKGRvdWJsZSB2YWx1ZSkgeworICAvLyBOYU4gaXMgbmV2ZXIgZXF1YWwgdG8gYW55dGhpbmcsIGV2ZW4gaXRzZWxmLgorICByZXR1cm4gdmFsdWUgIT0gdmFsdWU7Cit9CisKKy8vIFRoZXNlIGFyZSBkZWZpbmVkIGFzIG1hY3JvcyBvbiBzb21lIHBsYXRmb3Jtcy4gICN1bmRlZiB0aGVtIHNvIHRoYXQgd2UgY2FuCisvLyByZWRlZmluZSB0aGVtLgorI3VuZGVmIGlzeGRpZ2l0CisjdW5kZWYgaXNwcmludAorCisvLyBUaGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgaW4gY3R5cGUuaCBjaGFuZ2UgYmFzZWQgb24gbG9jYWxlLiAgU2luY2Ugb3VyCisvLyBzdHJpbmcgbWFuaXB1bGF0aW9uIGlzIGFsbCBpbiByZWxhdGlvbiB0byB0aGUgcHJvdG9jb2wgYnVmZmVyIGFuZCBDKysKKy8vIGxhbmd1YWdlcywgd2UgYWx3YXlzIHdhbnQgdG8gdXNlIHRoZSBDIGxvY2FsZS4gIFNvLCB3ZSByZS1kZWZpbmUgdGhlc2UKKy8vIGV4YWN0bHkgYXMgd2Ugd2FudCB0aGVtLgoraW5saW5lIGJvb2wgaXN4ZGlnaXQoY2hhciBjKSB7CisgIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8CisgICAgICAgICAoJ2EnIDw9IGMgJiYgYyA8PSAnZicpIHx8CisgICAgICAgICAoJ0EnIDw9IGMgJiYgYyA8PSAnRicpOworfQorCitpbmxpbmUgYm9vbCBpc3ByaW50KGNoYXIgYykgeworICByZXR1cm4gYyA+PSAweDIwICYmIGMgPD0gMHg3RTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RyaXBTdHJpbmcKKy8vICAgIFJlcGxhY2VzIGFueSBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgJ3JlbW92ZScgKG9yIHRoZSBjaGFyYWN0ZXJzCisvLyAgICBpbiAncmVtb3ZlJykgd2l0aCB0aGUgY2hhcmFjdGVyICdyZXBsYWNld2l0aCcuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFN0cmlwU3RyaW5nKHN0cmluZyogcywgY29uc3QgY2hhciogcmVtb3ZlLCBjaGFyIHJlcGxhY2V3aXRoKSB7CisgIGNvbnN0IGNoYXIgKiBzdHJfc3RhcnQgPSBzLT5jX3N0cigpOworICBjb25zdCBjaGFyICogc3RyID0gc3RyX3N0YXJ0OworICBmb3IgKHN0ciA9IHN0cnBicmsoc3RyLCByZW1vdmUpOworICAgICAgIHN0ciAhPSBOVUxMOworICAgICAgIHN0ciA9IHN0cnBicmsoc3RyICsgMSwgcmVtb3ZlKSkgeworICAgICgqcylbc3RyIC0gc3RyX3N0YXJ0XSA9IHJlcGxhY2V3aXRoOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0cmluZ1JlcGxhY2UoKQorLy8gICAgUmVwbGFjZSB0aGUgIm9sZCIgcGF0dGVybiB3aXRoIHRoZSAibmV3IiBwYXR0ZXJuIGluIGEgc3RyaW5nLAorLy8gICAgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvICJyZXMiLiAgSWYgcmVwbGFjZV9hbGwgaXMgZmFsc2UsCisvLyAgICBpdCBvbmx5IHJlcGxhY2VzIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAib2xkLiIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBTdHJpbmdSZXBsYWNlKGNvbnN0IHN0cmluZyYgcywgY29uc3Qgc3RyaW5nJiBvbGRzdWIsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuZXdzdWIsIGJvb2wgcmVwbGFjZV9hbGwsCisgICAgICAgICAgICAgICAgICAgc3RyaW5nKiByZXMpIHsKKyAgaWYgKG9sZHN1Yi5lbXB0eSgpKSB7CisgICAgcmVzLT5hcHBlbmQocyk7ICAvLyBpZiBlbXB0eSwgYXBwZW5kIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nOjpzaXplX3R5cGUgc3RhcnRfcG9zID0gMDsKKyAgc3RyaW5nOjpzaXplX3R5cGUgcG9zOworICBkbyB7CisgICAgcG9zID0gcy5maW5kKG9sZHN1Yiwgc3RhcnRfcG9zKTsKKyAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHJlcy0+YXBwZW5kKHMsIHN0YXJ0X3BvcywgcG9zIC0gc3RhcnRfcG9zKTsKKyAgICByZXMtPmFwcGVuZChuZXdzdWIpOworICAgIHN0YXJ0X3BvcyA9IHBvcyArIG9sZHN1Yi5zaXplKCk7ICAvLyBzdGFydCBzZWFyY2hpbmcgYWdhaW4gYWZ0ZXIgdGhlICJvbGQiCisgIH0gd2hpbGUgKHJlcGxhY2VfYWxsKTsKKyAgcmVzLT5hcHBlbmQocywgc3RhcnRfcG9zLCBzLmxlbmd0aCgpIC0gc3RhcnRfcG9zKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RyaW5nUmVwbGFjZSgpCisvLyAgICBHaXZlIG1lIGEgc3RyaW5nIGFuZCB0d28gcGF0dGVybnMgIm9sZCIgYW5kICJuZXciLCBhbmQgSSByZXBsYWNlCisvLyAgICB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgIm9sZCIgaW4gdGhlIHN0cmluZyB3aXRoICJuZXciLCBpZiBpdAorLy8gICAgZXhpc3RzLiAgSWYgImdsb2JhbCIgaXMgdHJ1ZTsgY2FsbCB0aGlzIHJlcGVhdGVkbHkgdW50aWwgaXQKKy8vICAgIGZhaWxzLiAgUkVUVVJOIGEgbmV3IHN0cmluZywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSByZXBsYWNlbWVudAorLy8gICAgaGFwcGVuZWQgb3Igbm90LgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJpbmcgU3RyaW5nUmVwbGFjZShjb25zdCBzdHJpbmcmIHMsIGNvbnN0IHN0cmluZyYgb2xkc3ViLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuZXdzdWIsIGJvb2wgcmVwbGFjZV9hbGwpIHsKKyAgc3RyaW5nIHJldDsKKyAgU3RyaW5nUmVwbGFjZShzLCBvbGRzdWIsIG5ld3N1YiwgcmVwbGFjZV9hbGwsICZyZXQpOworICByZXR1cm4gcmV0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTcGxpdFN0cmluZ1VzaW5nKCkKKy8vICAgIFNwbGl0IGEgc3RyaW5nIHVzaW5nIGEgY2hhcmFjdGVyIGRlbGltaXRlci4gQXBwZW5kIHRoZSBjb21wb25lbnRzCisvLyAgICB0byAncmVzdWx0Jy4KKy8vCisvLyBOb3RlOiBGb3IgbXVsdGktY2hhcmFjdGVyIGRlbGltaXRlcnMsIHRoaXMgcm91dGluZSB3aWxsIHNwbGl0IG9uICpBTlkqIG9mCisvLyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBub3QgdGhlIGVudGlyZSBzdHJpbmcgYXMgYSBzaW5nbGUgZGVsaW1pdGVyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordGVtcGxhdGUgPHR5cGVuYW1lIElUUj4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgU3BsaXRTdHJpbmdUb0l0ZXJhdG9yVXNpbmcoY29uc3Qgc3RyaW5nJiBmdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRSJiByZXN1bHQpIHsKKyAgLy8gT3B0aW1pemUgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIGRlbGltIGlzIGEgc2luZ2xlIGNoYXJhY3Rlci4KKyAgaWYgKGRlbGltWzBdICE9ICdcMCcgJiYgZGVsaW1bMV0gPT0gJ1wwJykgeworICAgIGNoYXIgYyA9IGRlbGltWzBdOworICAgIGNvbnN0IGNoYXIqIHAgPSBmdWxsLmRhdGEoKTsKKyAgICBjb25zdCBjaGFyKiBlbmQgPSBwICsgZnVsbC5zaXplKCk7CisgICAgd2hpbGUgKHAgIT0gZW5kKSB7CisgICAgICBpZiAoKnAgPT0gYykgeworICAgICAgICArK3A7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBjaGFyKiBzdGFydCA9IHA7CisgICAgICAgIHdoaWxlICgrK3AgIT0gZW5kICYmICpwICE9IGMpOworICAgICAgICAqcmVzdWx0KysgPSBzdHJpbmcoc3RhcnQsIHAgLSBzdGFydCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZzo6c2l6ZV90eXBlIGJlZ2luX2luZGV4LCBlbmRfaW5kZXg7CisgIGJlZ2luX2luZGV4ID0gZnVsbC5maW5kX2ZpcnN0X25vdF9vZihkZWxpbSk7CisgIHdoaWxlIChiZWdpbl9pbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBlbmRfaW5kZXggPSBmdWxsLmZpbmRfZmlyc3Rfb2YoZGVsaW0sIGJlZ2luX2luZGV4KTsKKyAgICBpZiAoZW5kX2luZGV4ID09IHN0cmluZzo6bnBvcykgeworICAgICAgKnJlc3VsdCsrID0gZnVsbC5zdWJzdHIoYmVnaW5faW5kZXgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqcmVzdWx0KysgPSBmdWxsLnN1YnN0cihiZWdpbl9pbmRleCwgKGVuZF9pbmRleCAtIGJlZ2luX2luZGV4KSk7CisgICAgYmVnaW5faW5kZXggPSBmdWxsLmZpbmRfZmlyc3Rfbm90X29mKGRlbGltLCBlbmRfaW5kZXgpOworICB9Cit9CisKK3ZvaWQgU3BsaXRTdHJpbmdVc2luZyhjb25zdCBzdHJpbmcmIGZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIHJlc3VsdCkgeworICBiYWNrX2luc2VydF9pdGVyYXRvcjwgdmVjdG9yPHN0cmluZz4gPiBpdCgqcmVzdWx0KTsKKyAgU3BsaXRTdHJpbmdUb0l0ZXJhdG9yVXNpbmcoZnVsbCwgZGVsaW0sIGl0KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSm9pblN0cmluZ3MoKQorLy8gICAgVGhpcyBtZXJnZXMgYSB2ZWN0b3Igb2Ygc3RyaW5nIGNvbXBvbmVudHMgd2l0aCBkZWxpbSBpbnNlcnRlZAorLy8gICAgYXMgc2VwYXJhdGVycyBiZXR3ZWVuIGNvbXBvbmVudHMuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordGVtcGxhdGUgPGNsYXNzIElURVJBVE9SPgorc3RhdGljIHZvaWQgSm9pblN0cmluZ3NJdGVyYXRvcihjb25zdCBJVEVSQVRPUiYgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElURVJBVE9SJiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHJlc3VsdCkgeworICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IE5VTEwpOworICByZXN1bHQtPmNsZWFyKCk7CisgIGludCBkZWxpbV9sZW5ndGggPSBzdHJsZW4oZGVsaW0pOworCisgIC8vIFByZWNvbXB1dGUgcmVzdWx0aW5nIGxlbmd0aCBzbyB3ZSBjYW4gcmVzZXJ2ZSgpIG1lbW9yeSBpbiBvbmUgc2hvdC4KKyAgaW50IGxlbmd0aCA9IDA7CisgIGZvciAoSVRFUkFUT1IgaXRlciA9IHN0YXJ0OyBpdGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgaWYgKGl0ZXIgIT0gc3RhcnQpIHsKKyAgICAgIGxlbmd0aCArPSBkZWxpbV9sZW5ndGg7CisgICAgfQorICAgIGxlbmd0aCArPSBpdGVyLT5zaXplKCk7CisgIH0KKyAgcmVzdWx0LT5yZXNlcnZlKGxlbmd0aCk7CisKKyAgLy8gTm93IGNvbWJpbmUgZXZlcnl0aGluZy4KKyAgZm9yIChJVEVSQVRPUiBpdGVyID0gc3RhcnQ7IGl0ZXIgIT0gZW5kOyArK2l0ZXIpIHsKKyAgICBpZiAoaXRlciAhPSBzdGFydCkgeworICAgICAgcmVzdWx0LT5hcHBlbmQoZGVsaW0sIGRlbGltX2xlbmd0aCk7CisgICAgfQorICAgIHJlc3VsdC0+YXBwZW5kKGl0ZXItPmRhdGEoKSwgaXRlci0+c2l6ZSgpKTsKKyAgfQorfQorCit2b2lkIEpvaW5TdHJpbmdzKGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjb21wb25lbnRzLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWxpbSwKKyAgICAgICAgICAgICAgICAgc3RyaW5nICogcmVzdWx0KSB7CisgIEpvaW5TdHJpbmdzSXRlcmF0b3IoY29tcG9uZW50cy5iZWdpbigpLCBjb21wb25lbnRzLmVuZCgpLCBkZWxpbSwgcmVzdWx0KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKCkKKy8vICAgIFRoaXMgZG9lcyBhbGwgdGhlIHVuZXNjYXBpbmcgdGhhdCBDIGRvZXM6IFxvb28sIFxyLCBcbiwgZXRjCisvLyAgICBSZXR1cm5zIGxlbmd0aCBvZiByZXN1bHRpbmcgc3RyaW5nLgorLy8gICAgVGhlIGltcGxlbWVudGF0aW9uIG9mIFx4IHBhcnNlcyBhbnkgcG9zaXRpdmUgbnVtYmVyIG9mIGhleCBkaWdpdHMsCisvLyAgICBidXQgaXQgaXMgYW4gZXJyb3IgaWYgdGhlIHZhbHVlIHJlcXVpcmVzIG1vcmUgdGhhbiA4IGJpdHMsIGFuZCB0aGUKKy8vICAgIHJlc3VsdCBpcyB0cnVuY2F0ZWQgdG8gOCBiaXRzLgorLy8KKy8vICAgIFRoZSBzZWNvbmQgY2FsbCBzdG9yZXMgaXRzIGVycm9ycyBpbiBhIHN1cHBsaWVkIHN0cmluZyB2ZWN0b3IuCisvLyAgICBJZiB0aGUgc3RyaW5nIHZlY3RvciBwb2ludGVyIGlzIE5VTEwsIGl0IHJlcG9ydHMgdGhlIGVycm9ycyB3aXRoIExPRygpLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIElTX09DVEFMX0RJR0lUKGMpICgoKGMpID49ICcwJykgJiYgKChjKSA8PSAnNycpKQorCitpbmxpbmUgaW50IGhleF9kaWdpdF90b19pbnQoY2hhciBjKSB7CisgIC8qIEFzc3VtZSBBU0NJSS4gKi8KKyAgYXNzZXJ0KCcwJyA9PSAweDMwICYmICdBJyA9PSAweDQxICYmICdhJyA9PSAweDYxKTsKKyAgYXNzZXJ0KGlzeGRpZ2l0KGMpKTsKKyAgaW50IHggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKTsKKyAgaWYgKHggPiAnOScpIHsKKyAgICB4ICs9IDk7CisgIH0KKyAgcmV0dXJuIHggJiAweGY7Cit9CisKKy8vIFByb3RvY29sIGJ1ZmZlcnMgZG9lc24ndCBldmVyIGNhcmUgYWJvdXQgZXJyb3JzLCBidXQgSSBkb24ndCB3YW50IHRvIHJlbW92ZQorLy8gdGhlIGNvZGUuCisjZGVmaW5lIExPR19TVFJJTkcoTEVWRUwsIFZFQ1RPUikgR09PR0xFX0xPR19JRihMRVZFTCwgZmFsc2UpCisKK2ludCBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoY29uc3QgY2hhciogc291cmNlLCBjaGFyKiBkZXN0KSB7CisgIHJldHVybiBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoc291cmNlLCBkZXN0LCBOVUxMKTsKK30KKworaW50IFVuZXNjYXBlQ0VzY2FwZVNlcXVlbmNlcyhjb25zdCBjaGFyKiBzb3VyY2UsIGNoYXIqIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+ICplcnJvcnMpIHsKKyAgR09PR0xFX0RDSEVDSyhlcnJvcnMgPT0gTlVMTCkgPDwgIkVycm9yIHJlcG9ydGluZyBub3QgaW1wbGVtZW50ZWQuIjsKKworICBjaGFyKiBkID0gZGVzdDsKKyAgY29uc3QgY2hhciogcCA9IHNvdXJjZTsKKworICAvLyBTbWFsbCBvcHRpbWl6YXRpb24gZm9yIGNhc2Ugd2hlcmUgc291cmNlID0gZGVzdCBhbmQgdGhlcmUncyBubyBlc2NhcGluZworICB3aGlsZSAoIHAgPT0gZCAmJiAqcCAhPSAnXDAnICYmICpwICE9ICdcXCcgKQorICAgIHArKywgZCsrOworCisgIHdoaWxlICgqcCAhPSAnXDAnKSB7CisgICAgaWYgKCpwICE9ICdcXCcpIHsKKyAgICAgICpkKysgPSAqcCsrOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKCAqKytwICkgeyAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBwYXN0IHRoZSAnXFwnCisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICBMT0dfU1RSSU5HKEVSUk9SLCBlcnJvcnMpIDw8ICJTdHJpbmcgY2Fubm90IGVuZCB3aXRoIFxcIjsKKyAgICAgICAgICAqZCA9ICdcMCc7CisgICAgICAgICAgcmV0dXJuIGQgLSBkZXN0OyAgIC8vIHdlJ3JlIGRvbmUgd2l0aCBwCisgICAgICAgIGNhc2UgJ2EnOiAgKmQrKyA9ICdcYSc7ICBicmVhazsKKyAgICAgICAgY2FzZSAnYic6ICAqZCsrID0gJ1xiJzsgIGJyZWFrOworICAgICAgICBjYXNlICdmJzogICpkKysgPSAnXGYnOyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ24nOiAgKmQrKyA9ICdcbic7ICBicmVhazsKKyAgICAgICAgY2FzZSAncic6ICAqZCsrID0gJ1xyJzsgIGJyZWFrOworICAgICAgICBjYXNlICd0JzogICpkKysgPSAnXHQnOyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3YnOiAgKmQrKyA9ICdcdic7ICBicmVhazsKKyAgICAgICAgY2FzZSAnXFwnOiAqZCsrID0gJ1xcJzsgIGJyZWFrOworICAgICAgICBjYXNlICc/JzogICpkKysgPSAnXD8nOyAgYnJlYWs7ICAgIC8vIFw/ICBXaG8ga25ldz8KKyAgICAgICAgY2FzZSAnXCcnOiAqZCsrID0gJ1wnJzsgIGJyZWFrOworICAgICAgICBjYXNlICciJzogICpkKysgPSAnXCInOyAgYnJlYWs7CisgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiAgLy8gb2N0YWwgZGlnaXQ6IDEgdG8gMyBkaWdpdHMKKyAgICAgICAgY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IHsKKyAgICAgICAgICBjaGFyIGNoID0gKnAgLSAnMCc7CisgICAgICAgICAgaWYgKCBJU19PQ1RBTF9ESUdJVChwWzFdKSApCisgICAgICAgICAgICBjaCA9IGNoICogOCArICorK3AgLSAnMCc7CisgICAgICAgICAgaWYgKCBJU19PQ1RBTF9ESUdJVChwWzFdKSApICAgICAgLy8gc2FmZSAoYW5kIGVhc3kpIHRvIGRvIHRoaXMgdHdpY2UKKyAgICAgICAgICAgIGNoID0gY2ggKiA4ICsgKisrcCAtICcwJzsgICAgICAvLyBub3cgcG9pbnRzIGF0IGxhc3QgZGlnaXQKKyAgICAgICAgICAqZCsrID0gY2g7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAneCc6IGNhc2UgJ1gnOiB7CisgICAgICAgICAgaWYgKCFpc3hkaWdpdChwWzFdKSkgeworICAgICAgICAgICAgaWYgKHBbMV0gPT0gJ1wwJykgeworICAgICAgICAgICAgICBMT0dfU1RSSU5HKEVSUk9SLCBlcnJvcnMpIDw8ICJTdHJpbmcgY2Fubm90IGVuZCB3aXRoIFxceCI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBMT0dfU1RSSU5HKEVSUk9SLCBlcnJvcnMpIDw8CisgICAgICAgICAgICAgICAgIlxceCBjYW5ub3QgYmUgZm9sbG93ZWQgYnkgbm9uLWhleCBkaWdpdDogXFwiIDw8ICpwIDw8IHBbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgdW5zaWduZWQgaW50IGNoID0gMDsKKyAgICAgICAgICBjb25zdCBjaGFyICpoZXhfc3RhcnQgPSBwOworICAgICAgICAgIHdoaWxlIChpc3hkaWdpdChwWzFdKSkgIC8vIGFyYml0cmFyaWx5IG1hbnkgaGV4IGRpZ2l0cworICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyBoZXhfZGlnaXRfdG9faW50KCorK3ApOworICAgICAgICAgIGlmIChjaCA+IDB4RkYpCisgICAgICAgICAgICBMT0dfU1RSSU5HKEVSUk9SLCBlcnJvcnMpIDw8ICJWYWx1ZSBvZiAiIDw8CisgICAgICAgICAgICAgICJcXCIgPDwgc3RyaW5nKGhleF9zdGFydCwgcCsxLWhleF9zdGFydCkgPDwgIiBleGNlZWRzIDggYml0cyI7CisgICAgICAgICAgKmQrKyA9IGNoOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjaWYgMCAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBcdSBhbmQgXFU/ICBSZXF1aXJlcyBydW5ldG9jaGFyKCkuCisgICAgICAgIGNhc2UgJ3UnOiB7CisgICAgICAgICAgLy8gXHVoaGhoID0+IGNvbnZlcnQgNCBoZXggZGlnaXRzIHRvIFVURi04CisgICAgICAgICAgY2hhcjMyIHJ1bmUgPSAwOworICAgICAgICAgIGNvbnN0IGNoYXIgKmhleF9zdGFydCA9IHA7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChpc3hkaWdpdChwWzFdKSkgeyAgLy8gTG9vayBvbmUgY2hhciBhaGVhZC4KKyAgICAgICAgICAgICAgcnVuZSA9IChydW5lIDw8IDQpICsgaGV4X2RpZ2l0X3RvX2ludCgqKytwKTsgIC8vIEFkdmFuY2UgcC4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIExPR19TVFJJTkcoRVJST1IsIGVycm9ycykKKyAgICAgICAgICAgICAgICA8PCAiXFx1IG11c3QgYmUgZm9sbG93ZWQgYnkgNCBoZXggZGlnaXRzOiBcXCIKKyAgICAgICAgICAgICAgICA8PCAgc3RyaW5nKGhleF9zdGFydCwgcCsxLWhleF9zdGFydCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBkICs9IHJ1bmV0b2NoYXIoZCwgJnJ1bmUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgJ1UnOiB7CisgICAgICAgICAgLy8gXFVoaGhoaGhoaCA9PiBjb252ZXJ0IDggaGV4IGRpZ2l0cyB0byBVVEYtOAorICAgICAgICAgIGNoYXIzMiBydW5lID0gMDsKKyAgICAgICAgICBjb25zdCBjaGFyICpoZXhfc3RhcnQgPSBwOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICAgICAgICBpZiAoaXN4ZGlnaXQocFsxXSkpIHsgIC8vIExvb2sgb25lIGNoYXIgYWhlYWQuCisgICAgICAgICAgICAgIC8vIERvbid0IGNoYW5nZSBydW5lIHVudGlsIHdlJ3JlIHN1cmUgdGhpcworICAgICAgICAgICAgICAvLyBpcyB3aXRoaW4gdGhlIFVuaWNvZGUgbGltaXQsIGJ1dCBkbyBhZHZhbmNlIHAuCisgICAgICAgICAgICAgIGNoYXIzMiBuZXdydW5lID0gKHJ1bmUgPDwgNCkgKyBoZXhfZGlnaXRfdG9faW50KCorK3ApOworICAgICAgICAgICAgICBpZiAobmV3cnVuZSA+IDB4MTBGRkZGKSB7CisgICAgICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKQorICAgICAgICAgICAgICAgICAgPDwgIlZhbHVlIG9mIFxcIgorICAgICAgICAgICAgICAgICAgPDwgc3RyaW5nKGhleF9zdGFydCwgcCArIDEgLSBoZXhfc3RhcnQpCisgICAgICAgICAgICAgICAgICA8PCAiIGV4Y2VlZHMgVW5pY29kZSBsaW1pdCAoMHgxMEZGRkYpIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW5lID0gbmV3cnVuZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKQorICAgICAgICAgICAgICAgIDw8ICJcXFUgbXVzdCBiZSBmb2xsb3dlZCBieSA4IGhleCBkaWdpdHM6IFxcIgorICAgICAgICAgICAgICAgIDw8ICBzdHJpbmcoaGV4X3N0YXJ0LCBwKzEtaGV4X3N0YXJ0KTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGQgKz0gcnVuZXRvY2hhcihkLCAmcnVuZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIExPR19TVFJJTkcoRVJST1IsIGVycm9ycykgPDwgIlVua25vd24gZXNjYXBlIHNlcXVlbmNlOiBcXCIgPDwgKnA7CisgICAgICB9CisgICAgICBwKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCBwYXN0IGxldHRlciB3ZSBlc2NhcGVkCisgICAgfQorICB9CisgICpkID0gJ1wwJzsKKyAgcmV0dXJuIGQgLSBkZXN0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbmVzY2FwZUNFc2NhcGVTdHJpbmcoKQorLy8gICAgVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIFVuZXNjYXBlQ0VzY2FwZVNlcXVlbmNlcywgYnV0IGNyZWF0ZXMKKy8vICAgIGEgbmV3IHN0cmluZy4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IGFsbG9jYXRpbmcKKy8vICAgIGEgZGVzdCBidWZmZXIuIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIG5vbiBwZXJmb3JtYW5jZSBjcml0aWNhbAorLy8gICAgdGFza3Mgc3VjaCBhcyBwcmludGluZyBkZWJ1ZyBtZXNzYWdlcy4gSXQgaXMgc2FmZSBmb3Igc3JjIGFuZCBkZXN0CisvLyAgICB0byBiZSB0aGUgc2FtZS4KKy8vCisvLyAgICBUaGUgc2Vjb25kIGNhbGwgc3RvcmVzIGl0cyBlcnJvcnMgaW4gYSBzdXBwbGllZCBzdHJpbmcgdmVjdG9yLgorLy8gICAgSWYgdGhlIHN0cmluZyB2ZWN0b3IgcG9pbnRlciBpcyBOVUxMLCBpdCByZXBvcnRzIHRoZSBlcnJvcnMgd2l0aCBMT0coKS4KKy8vCisvLyAgICBJbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxscywgdGhlIGxlbmd0aCBvZiBkZXN0IGlzIHJldHVybmVkLiBJbiB0aGUKKy8vICAgIHRoZSB0aGlyZCBjYWxsLCB0aGUgbmV3IHN0cmluZyBpcyByZXR1cm5lZC4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBVbmVzY2FwZUNFc2NhcGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzcmMsIHN0cmluZyogZGVzdCkgeworICByZXR1cm4gVW5lc2NhcGVDRXNjYXBlU3RyaW5nKHNyYywgZGVzdCwgTlVMTCk7Cit9CisKK2ludCBVbmVzY2FwZUNFc2NhcGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzcmMsIHN0cmluZyogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4gKmVycm9ycykgeworICBzY29wZWRfYXJyYXk8Y2hhcj4gdW5lc2NhcGVkKG5ldyBjaGFyW3NyYy5zaXplKCkgKyAxXSk7CisgIGludCBsZW4gPSBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoc3JjLmNfc3RyKCksIHVuZXNjYXBlZC5nZXQoKSwgZXJyb3JzKTsKKyAgR09PR0xFX0NIRUNLKGRlc3QpOworICBkZXN0LT5hc3NpZ24odW5lc2NhcGVkLmdldCgpLCBsZW4pOworICByZXR1cm4gbGVuOworfQorCitzdHJpbmcgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3JjKSB7CisgIHNjb3BlZF9hcnJheTxjaGFyPiB1bmVzY2FwZWQobmV3IGNoYXJbc3JjLnNpemUoKSArIDFdKTsKKyAgaW50IGxlbiA9IFVuZXNjYXBlQ0VzY2FwZVNlcXVlbmNlcyhzcmMuY19zdHIoKSwgdW5lc2NhcGVkLmdldCgpLCBOVUxMKTsKKyAgcmV0dXJuIHN0cmluZyh1bmVzY2FwZWQuZ2V0KCksIGxlbik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENFc2NhcGVTdHJpbmcoKQorLy8gQ0hleEVzY2FwZVN0cmluZygpCisvLyAgICBDb3BpZXMgJ3NyYycgdG8gJ2Rlc3QnLCBlc2NhcGluZyBkYW5nZXJvdXMgY2hhcmFjdGVycyB1c2luZworLy8gICAgQy1zdHlsZSBlc2NhcGUgc2VxdWVuY2VzLiBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvciBwcmVwYXJpbmcgcXVlcnkKKy8vICAgIGZsYWdzLiAnc3JjJyBhbmQgJ2Rlc3QnIHNob3VsZCBub3Qgb3ZlcmxhcC4gVGhlICdIZXgnIHZlcnNpb24gdXNlcworLy8gICAgaGV4YWRlY2ltYWwgcmF0aGVyIHRoYW4gb2N0YWwgc2VxdWVuY2VzLgorLy8gICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gJ2Rlc3QnIChub3QgaW5jbHVkaW5nIHRoZSBcMCkKKy8vICAgIG9yIC0xIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgc3BhY2UuCisvLworLy8gICAgQ3VycmVudGx5IG9ubHkgXG4sIFxyLCBcdCwgIiwgJywgXCBhbmQgIWlzcHJpbnQoKSBjaGFycyBhcmUgZXNjYXBlZC4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBDRXNjYXBlSW50ZXJuYWwoY29uc3QgY2hhciogc3JjLCBpbnQgc3JjX2xlbiwgY2hhciogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVuLCBib29sIHVzZV9oZXgsIGJvb2wgdXRmOF9zYWZlKSB7CisgIGNvbnN0IGNoYXIqIHNyY19lbmQgPSBzcmMgKyBzcmNfbGVuOworICBpbnQgdXNlZCA9IDA7CisgIGJvb2wgbGFzdF9oZXhfZXNjYXBlID0gZmFsc2U7IC8vIHRydWUgaWYgbGFzdCBvdXRwdXQgY2hhciB3YXMgXHhOTgorCisgIGZvciAoOyBzcmMgPCBzcmNfZW5kOyBzcmMrKykgeworICAgIGlmIChkZXN0X2xlbiAtIHVzZWQgPCAyKSAgIC8vIE5lZWQgc3BhY2UgZm9yIHR3byBsZXR0ZXIgZXNjYXBlCisgICAgICByZXR1cm4gLTE7CisKKyAgICBib29sIGlzX2hleF9lc2NhcGUgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKCpzcmMpIHsKKyAgICAgIGNhc2UgJ1xuJzogZGVzdFt1c2VkKytdID0gJ1xcJzsgZGVzdFt1c2VkKytdID0gJ24nOyAgYnJlYWs7CisgICAgICBjYXNlICdccic6IGRlc3RbdXNlZCsrXSA9ICdcXCc7IGRlc3RbdXNlZCsrXSA9ICdyJzsgIGJyZWFrOworICAgICAgY2FzZSAnXHQnOiBkZXN0W3VzZWQrK10gPSAnXFwnOyBkZXN0W3VzZWQrK10gPSAndCc7ICBicmVhazsKKyAgICAgIGNhc2UgJ1wiJzogZGVzdFt1c2VkKytdID0gJ1xcJzsgZGVzdFt1c2VkKytdID0gJ1wiJzsgYnJlYWs7CisgICAgICBjYXNlICdcJyc6IGRlc3RbdXNlZCsrXSA9ICdcXCc7IGRlc3RbdXNlZCsrXSA9ICdcJyc7IGJyZWFrOworICAgICAgY2FzZSAnXFwnOiBkZXN0W3VzZWQrK10gPSAnXFwnOyBkZXN0W3VzZWQrK10gPSAnXFwnOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIE5vdGUgdGhhdCBpZiB3ZSBlbWl0IFx4Tk4gYW5kIHRoZSBzcmMgY2hhcmFjdGVyIGFmdGVyIHRoYXQgaXMgYSBoZXgKKyAgICAgICAgLy8gZGlnaXQgdGhlbiB0aGF0IGRpZ2l0IG11c3QgYmUgZXNjYXBlZCB0b28gdG8gcHJldmVudCBpdCBiZWluZworICAgICAgICAvLyBpbnRlcnByZXRlZCBhcyBwYXJ0IG9mIHRoZSBjaGFyYWN0ZXIgY29kZSBieSBDLgorICAgICAgICBpZiAoKCF1dGY4X3NhZmUgfHwgc3RhdGljX2Nhc3Q8dWludDg+KCpzcmMpIDwgMHg4MCkgJiYKKyAgICAgICAgICAgICghaXNwcmludCgqc3JjKSB8fAorICAgICAgICAgICAgIChsYXN0X2hleF9lc2NhcGUgJiYgaXN4ZGlnaXQoKnNyYykpKSkgeworICAgICAgICAgIGlmIChkZXN0X2xlbiAtIHVzZWQgPCA0KSAvLyBuZWVkIHNwYWNlIGZvciA0IGxldHRlciBlc2NhcGUKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICBzcHJpbnRmKGRlc3QgKyB1c2VkLCAodXNlX2hleCA/ICJcXHglMDJ4IiA6ICJcXCUwM28iKSwKKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4Pigqc3JjKSk7CisgICAgICAgICAgaXNfaGV4X2VzY2FwZSA9IHVzZV9oZXg7CisgICAgICAgICAgdXNlZCArPSA0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlc3RbdXNlZCsrXSA9ICpzcmM7IGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGxhc3RfaGV4X2VzY2FwZSA9IGlzX2hleF9lc2NhcGU7CisgIH0KKworICBpZiAoZGVzdF9sZW4gLSB1c2VkIDwgMSkgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyByb29tIGZvciBcMAorICAgIHJldHVybiAtMTsKKworICBkZXN0W3VzZWRdID0gJ1wwJzsgICAvLyBkb2Vzbid0IGNvdW50IHRvd2FyZHMgcmV0dXJuIHZhbHVlIHRob3VnaAorICByZXR1cm4gdXNlZDsKK30KKworaW50IENFc2NhcGVTdHJpbmcoY29uc3QgY2hhciogc3JjLCBpbnQgc3JjX2xlbiwgY2hhciogZGVzdCwgaW50IGRlc3RfbGVuKSB7CisgIHJldHVybiBDRXNjYXBlSW50ZXJuYWwoc3JjLCBzcmNfbGVuLCBkZXN0LCBkZXN0X2xlbiwgZmFsc2UsIGZhbHNlKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ0VzY2FwZSgpCisvLyBDSGV4RXNjYXBlKCkKKy8vICAgIENvcGllcyAnc3JjJyB0byByZXN1bHQsIGVzY2FwaW5nIGRhbmdlcm91cyBjaGFyYWN0ZXJzIHVzaW5nCisvLyAgICBDLXN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMuIFRoaXMgaXMgdmVyeSB1c2VmdWwgZm9yIHByZXBhcmluZyBxdWVyeQorLy8gICAgZmxhZ3MuICdzcmMnIGFuZCAnZGVzdCcgc2hvdWxkIG5vdCBvdmVybGFwLiBUaGUgJ0hleCcgdmVyc2lvbgorLy8gICAgaGV4YWRlY2ltYWwgcmF0aGVyIHRoYW4gb2N0YWwgc2VxdWVuY2VzLgorLy8KKy8vICAgIEN1cnJlbnRseSBvbmx5IFxuLCBcciwgXHQsICIsICcsIFwgYW5kICFpc3ByaW50KCkgY2hhcnMgYXJlIGVzY2FwZWQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgQ0VzY2FwZShjb25zdCBzdHJpbmcmIHNyYykgeworICBjb25zdCBpbnQgZGVzdF9sZW5ndGggPSBzcmMuc2l6ZSgpICogNCArIDE7IC8vIE1heGltdW0gcG9zc2libGUgZXhwYW5zaW9uCisgIHNjb3BlZF9hcnJheTxjaGFyPiBkZXN0KG5ldyBjaGFyW2Rlc3RfbGVuZ3RoXSk7CisgIGNvbnN0IGludCBsZW4gPSBDRXNjYXBlSW50ZXJuYWwoc3JjLmRhdGEoKSwgc3JjLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LmdldCgpLCBkZXN0X2xlbmd0aCwgZmFsc2UsIGZhbHNlKTsKKyAgR09PR0xFX0RDSEVDS19HRShsZW4sIDApOworICByZXR1cm4gc3RyaW5nKGRlc3QuZ2V0KCksIGxlbik7Cit9CisKK25hbWVzcGFjZSBzdHJpbmdzIHsKKworc3RyaW5nIFV0ZjhTYWZlQ0VzY2FwZShjb25zdCBzdHJpbmcmIHNyYykgeworICBjb25zdCBpbnQgZGVzdF9sZW5ndGggPSBzcmMuc2l6ZSgpICogNCArIDE7IC8vIE1heGltdW0gcG9zc2libGUgZXhwYW5zaW9uCisgIHNjb3BlZF9hcnJheTxjaGFyPiBkZXN0KG5ldyBjaGFyW2Rlc3RfbGVuZ3RoXSk7CisgIGNvbnN0IGludCBsZW4gPSBDRXNjYXBlSW50ZXJuYWwoc3JjLmRhdGEoKSwgc3JjLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LmdldCgpLCBkZXN0X2xlbmd0aCwgZmFsc2UsIHRydWUpOworICBHT09HTEVfRENIRUNLX0dFKGxlbiwgMCk7CisgIHJldHVybiBzdHJpbmcoZGVzdC5nZXQoKSwgbGVuKTsKK30KKworc3RyaW5nIENIZXhFc2NhcGUoY29uc3Qgc3RyaW5nJiBzcmMpIHsKKyAgY29uc3QgaW50IGRlc3RfbGVuZ3RoID0gc3JjLnNpemUoKSAqIDQgKyAxOyAvLyBNYXhpbXVtIHBvc3NpYmxlIGV4cGFuc2lvbgorICBzY29wZWRfYXJyYXk8Y2hhcj4gZGVzdChuZXcgY2hhcltkZXN0X2xlbmd0aF0pOworICBjb25zdCBpbnQgbGVuID0gQ0VzY2FwZUludGVybmFsKHNyYy5kYXRhKCksIHNyYy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdC5nZXQoKSwgZGVzdF9sZW5ndGgsIHRydWUsIGZhbHNlKTsKKyAgR09PR0xFX0RDSEVDS19HRShsZW4sIDApOworICByZXR1cm4gc3RyaW5nKGRlc3QuZ2V0KCksIGxlbik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdHJpbmdzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cnRvMzJfYWRhcHRvcigpCisvLyBzdHJ0b3UzMl9hZGFwdG9yKCkKKy8vICAgIEltcGxlbWVudGF0aW9uIG9mIHN0cnRvW3VdbCByZXBsYWNlbWVudHMgdGhhdCBoYXZlIGlkZW50aWNhbAorLy8gICAgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyBjaGFyYWN0ZXJpc3RpY3MgZm9yIGJvdGggSUxQLTMyIGFuZCBMUC02NAorLy8gICAgcGxhdGZvcm1zLCBpbmNsdWRpbmcgZXJybm8gcHJlc2VydmF0aW9uIGluIGVycm9yLWZyZWUgY2FsbHMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludDMyIHN0cnRvMzJfYWRhcHRvcihjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkgeworICBjb25zdCBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKyAgZXJybm8gPSAwOworICBjb25zdCBsb25nIHJlc3VsdCA9IHN0cnRvbChucHRyLCBlbmRwdHIsIGJhc2UpOworICBpZiAoZXJybm8gPT0gRVJBTkdFICYmIHJlc3VsdCA9PSBMT05HX01JTikgeworICAgIHJldHVybiBraW50MzJtaW47CisgIH0gZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFICYmIHJlc3VsdCA9PSBMT05HX01BWCkgeworICAgIHJldHVybiBraW50MzJtYXg7CisgIH0gZWxzZSBpZiAoZXJybm8gPT0gMCAmJiByZXN1bHQgPCBraW50MzJtaW4pIHsKKyAgICBlcnJubyA9IEVSQU5HRTsKKyAgICByZXR1cm4ga2ludDMybWluOworICB9IGVsc2UgaWYgKGVycm5vID09IDAgJiYgcmVzdWx0ID4ga2ludDMybWF4KSB7CisgICAgZXJybm8gPSBFUkFOR0U7CisgICAgcmV0dXJuIGtpbnQzMm1heDsKKyAgfQorICBpZiAoZXJybm8gPT0gMCkKKyAgICBlcnJubyA9IHNhdmVkX2Vycm5vOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzI+KHJlc3VsdCk7Cit9CisKK3VpbnQzMiBzdHJ0b3UzMl9hZGFwdG9yKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CisgIGNvbnN0IGludCBzYXZlZF9lcnJubyA9IGVycm5vOworICBlcnJubyA9IDA7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gc3RydG91bChucHRyLCBlbmRwdHIsIGJhc2UpOworICBpZiAoZXJybm8gPT0gRVJBTkdFICYmIHJlc3VsdCA9PSBVTE9OR19NQVgpIHsKKyAgICByZXR1cm4ga3VpbnQzMm1heDsKKyAgfSBlbHNlIGlmIChlcnJubyA9PSAwICYmIHJlc3VsdCA+IGt1aW50MzJtYXgpIHsKKyAgICBlcnJubyA9IEVSQU5HRTsKKyAgICByZXR1cm4ga3VpbnQzMm1heDsKKyAgfQorICBpZiAoZXJybm8gPT0gMCkKKyAgICBlcnJubyA9IHNhdmVkX2Vycm5vOworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyPihyZXN1bHQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGYXN0SW50VG9CdWZmZXIoKQorLy8gRmFzdEludDY0VG9CdWZmZXIoKQorLy8gRmFzdEhleFRvQnVmZmVyKCkKKy8vIEZhc3RIZXg2NFRvQnVmZmVyKCkKKy8vIEZhc3RIZXgzMlRvQnVmZmVyKCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gT2Zmc2V0IGludG8gYnVmZmVyIHdoZXJlIEZhc3RJbnQ2NFRvQnVmZmVyIHBsYWNlcyB0aGUgZW5kIG9mIHN0cmluZworLy8gbnVsbCBjaGFyYWN0ZXIuICBBbHNvIHVzZWQgYnkgRmFzdEludDY0VG9CdWZmZXJMZWZ0Lgorc3RhdGljIGNvbnN0IGludCBrRmFzdEludDY0VG9CdWZmZXJPZmZzZXQgPSAyMTsKKworY2hhciAqRmFzdEludDY0VG9CdWZmZXIoaW50NjQgaSwgY2hhciogYnVmZmVyKSB7CisgIC8vIFdlIGNvdWxkIGNvbGxhcHNlIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgc2VjdGlvbnMsIGJ1dCB0aGF0CisgIC8vIHdvdWxkIGJlIHNsaWdodGx5IHNsb3dlciBmb3IgcG9zaXRpdmUgbnVtYmVycy4uLgorICAvLyAyMiBieXRlcyBpcyBlbm91Z2ggdG8gc3RvcmUgLTIqKjY0LCAtMTg0NDY3NDQwNzM3MDk1NTE2MTYuCisgIGNoYXIqIHAgPSBidWZmZXIgKyBrRmFzdEludDY0VG9CdWZmZXJPZmZzZXQ7CisgICpwLS0gPSAnXDAnOworICBpZiAoaSA+PSAwKSB7CisgICAgZG8geworICAgICAgKnAtLSA9ICcwJyArIGkgJSAxMDsKKyAgICAgIGkgLz0gMTA7CisgICAgfSB3aGlsZSAoaSA+IDApOworICAgIHJldHVybiBwICsgMTsKKyAgfSBlbHNlIHsKKyAgICAvLyBPbiBkaWZmZXJlbnQgcGxhdGZvcm1zLCAlIGFuZCAvIGhhdmUgZGlmZmVyZW50IGJlaGF2aW9ycyBmb3IKKyAgICAvLyBuZWdhdGl2ZSBudW1iZXJzLCBzbyB3ZSBuZWVkIHRvIGp1bXAgdGhyb3VnaCBob29wcyB0byBtYWtlIHN1cmUKKyAgICAvLyB3ZSBkb24ndCBkaXZpZGUgbmVnYXRpdmUgbnVtYmVycy4KKyAgICBpZiAoaSA+IC0xMCkgeworICAgICAgaSA9IC1pOworICAgICAgKnAtLSA9ICcwJyArIGk7CisgICAgICAqcCA9ICctJzsKKyAgICAgIHJldHVybiBwOworICAgIH0gZWxzZSB7CisgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlbid0IGF0IE1JTl9JTlQsIGluIHdoaWNoIGNhc2Ugd2UgY2FuJ3Qgc2F5IGkgPSAtaQorICAgICAgaSA9IGkgKyAxMDsKKyAgICAgIGkgPSAtaTsKKyAgICAgICpwLS0gPSAnMCcgKyBpICUgMTA7CisgICAgICAvLyBVbmRvIHdoYXQgd2UgZGlkIGEgbW9tZW50IGFnbworICAgICAgaSA9IGkgLyAxMCArIDE7CisgICAgICBkbyB7CisgICAgICAgICpwLS0gPSAnMCcgKyBpICUgMTA7CisgICAgICAgIGkgLz0gMTA7CisgICAgICB9IHdoaWxlIChpID4gMCk7CisgICAgICAqcCA9ICctJzsKKyAgICAgIHJldHVybiBwOworICAgIH0KKyAgfQorfQorCisvLyBPZmZzZXQgaW50byBidWZmZXIgd2hlcmUgRmFzdEludDMyVG9CdWZmZXIgcGxhY2VzIHRoZSBlbmQgb2Ygc3RyaW5nCisvLyBudWxsIGNoYXJhY3Rlci4gIEFsc28gdXNlZCBieSBGYXN0SW50MzJUb0J1ZmZlckxlZnQKK3N0YXRpYyBjb25zdCBpbnQga0Zhc3RJbnQzMlRvQnVmZmVyT2Zmc2V0ID0gMTE7CisKKy8vIFllcywgdGhpcyBpcyBhIGR1cGxpY2F0ZSBvZiBGYXN0SW50NjRUb0J1ZmZlci4gIEJ1dCwgd2UgbmVlZCB0aGlzIGZvciB0aGUKKy8vIGNvbXBpbGVyIHRvIGdlbmVyYXRlIDMyIGJpdCBhcml0aG1ldGljIGluc3RydWN0aW9ucy4gIEl0J3MgbXVjaCBmYXN0ZXIsIGF0CisvLyBsZWFzdCB3aXRoIDMyIGJpdCBiaW5hcmllcy4KK2NoYXIgKkZhc3RJbnQzMlRvQnVmZmVyKGludDMyIGksIGNoYXIqIGJ1ZmZlcikgeworICAvLyBXZSBjb3VsZCBjb2xsYXBzZSB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHNlY3Rpb25zLCBidXQgdGhhdAorICAvLyB3b3VsZCBiZSBzbGlnaHRseSBzbG93ZXIgZm9yIHBvc2l0aXZlIG51bWJlcnMuLi4KKyAgLy8gMTIgYnl0ZXMgaXMgZW5vdWdoIHRvIHN0b3JlIC0yKiozMiwgLTQyOTQ5NjcyOTYuCisgIGNoYXIqIHAgPSBidWZmZXIgKyBrRmFzdEludDMyVG9CdWZmZXJPZmZzZXQ7CisgICpwLS0gPSAnXDAnOworICBpZiAoaSA+PSAwKSB7CisgICAgZG8geworICAgICAgKnAtLSA9ICcwJyArIGkgJSAxMDsKKyAgICAgIGkgLz0gMTA7CisgICAgfSB3aGlsZSAoaSA+IDApOworICAgIHJldHVybiBwICsgMTsKKyAgfSBlbHNlIHsKKyAgICAvLyBPbiBkaWZmZXJlbnQgcGxhdGZvcm1zLCAlIGFuZCAvIGhhdmUgZGlmZmVyZW50IGJlaGF2aW9ycyBmb3IKKyAgICAvLyBuZWdhdGl2ZSBudW1iZXJzLCBzbyB3ZSBuZWVkIHRvIGp1bXAgdGhyb3VnaCBob29wcyB0byBtYWtlIHN1cmUKKyAgICAvLyB3ZSBkb24ndCBkaXZpZGUgbmVnYXRpdmUgbnVtYmVycy4KKyAgICBpZiAoaSA+IC0xMCkgeworICAgICAgaSA9IC1pOworICAgICAgKnAtLSA9ICcwJyArIGk7CisgICAgICAqcCA9ICctJzsKKyAgICAgIHJldHVybiBwOworICAgIH0gZWxzZSB7CisgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlbid0IGF0IE1JTl9JTlQsIGluIHdoaWNoIGNhc2Ugd2UgY2FuJ3Qgc2F5IGkgPSAtaQorICAgICAgaSA9IGkgKyAxMDsKKyAgICAgIGkgPSAtaTsKKyAgICAgICpwLS0gPSAnMCcgKyBpICUgMTA7CisgICAgICAvLyBVbmRvIHdoYXQgd2UgZGlkIGEgbW9tZW50IGFnbworICAgICAgaSA9IGkgLyAxMCArIDE7CisgICAgICBkbyB7CisgICAgICAgICpwLS0gPSAnMCcgKyBpICUgMTA7CisgICAgICAgIGkgLz0gMTA7CisgICAgICB9IHdoaWxlIChpID4gMCk7CisgICAgICAqcCA9ICctJzsKKyAgICAgIHJldHVybiBwOworICAgIH0KKyAgfQorfQorCitjaGFyICpGYXN0SGV4VG9CdWZmZXIoaW50IGksIGNoYXIqIGJ1ZmZlcikgeworICBHT09HTEVfQ0hFQ0soaSA+PSAwKSA8PCAiRmFzdEhleFRvQnVmZmVyKCkgd2FudHMgbm9uLW5lZ2F0aXZlIGludGVnZXJzLCBub3QgIiA8PCBpOworCisgIHN0YXRpYyBjb25zdCBjaGFyICpoZXhkaWdpdHMgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgIGNoYXIgKnAgPSBidWZmZXIgKyAyMTsKKyAgKnAtLSA9ICdcMCc7CisgIGRvIHsKKyAgICAqcC0tID0gaGV4ZGlnaXRzW2kgJiAxNV07ICAgLy8gbW9kIGJ5IDE2CisgICAgaSA+Pj0gNDsgICAgICAgICAgICAgICAgICAgIC8vIGRpdmlkZSBieSAxNgorICB9IHdoaWxlIChpID4gMCk7CisgIHJldHVybiBwICsgMTsKK30KKworY2hhciAqSW50ZXJuYWxGYXN0SGV4VG9CdWZmZXIodWludDY0IHZhbHVlLCBjaGFyKiBidWZmZXIsIGludCBudW1fYnl0ZSkgeworICBzdGF0aWMgY29uc3QgY2hhciAqaGV4ZGlnaXRzID0gIjAxMjM0NTY3ODlhYmNkZWYiOworICBidWZmZXJbbnVtX2J5dGVdID0gJ1wwJzsKKyAgZm9yIChpbnQgaSA9IG51bV9ieXRlIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyNpZmRlZiBfTV9YNjQKKyAgICAvLyBNU1ZDIHg2NCBwbGF0Zm9ybSBoYXMgYSBidWcgb3B0aW1pemluZyB0aGUgdWludDMyKHZhbHVlKSBpbiB0aGUgI2Vsc2UKKyAgICAvLyBibG9jay4gR2l2ZW4gdGhhdCB0aGUgdWludDMyIGNhc3Qgd2FzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb24gMzItYml0CisgICAgLy8gcGxhdGZvcm1zLCB3ZSB1c2UgNjQtYml0ICcmJyBkaXJlY3RseS4KKyAgICBidWZmZXJbaV0gPSBoZXhkaWdpdHNbdmFsdWUgJiAweGZdOworI2Vsc2UKKyAgICBidWZmZXJbaV0gPSBoZXhkaWdpdHNbdWludDMyKHZhbHVlKSAmIDB4Zl07CisjZW5kaWYKKyAgICB2YWx1ZSA+Pj0gNDsKKyAgfQorICByZXR1cm4gYnVmZmVyOworfQorCitjaGFyICpGYXN0SGV4NjRUb0J1ZmZlcih1aW50NjQgdmFsdWUsIGNoYXIqIGJ1ZmZlcikgeworICByZXR1cm4gSW50ZXJuYWxGYXN0SGV4VG9CdWZmZXIodmFsdWUsIGJ1ZmZlciwgMTYpOworfQorCitjaGFyICpGYXN0SGV4MzJUb0J1ZmZlcih1aW50MzIgdmFsdWUsIGNoYXIqIGJ1ZmZlcikgeworICByZXR1cm4gSW50ZXJuYWxGYXN0SGV4VG9CdWZmZXIodmFsdWUsIGJ1ZmZlciwgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciogUGxhY2VOdW0oY2hhciogcCwgaW50IG51bSwgY2hhciBwcmV2X3NlcCkgeworICAgKnAtLSA9ICcwJyArIG51bSAlIDEwOworICAgKnAtLSA9ICcwJyArIG51bSAvIDEwOworICAgKnAtLSA9IHByZXZfc2VwOworICAgcmV0dXJuIHA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZhc3RJbnQzMlRvQnVmZmVyTGVmdCgpCisvLyBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KCkKKy8vIEZhc3RJbnQ2NFRvQnVmZmVyTGVmdCgpCisvLyBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KCkKKy8vCisvLyBMaWtlIHRoZSBGYXN0KlRvQnVmZmVyKCkgZnVuY3Rpb25zIGFib3ZlLCB0aGVzZSBhcmUgaW50ZW5kZWQgZm9yIHNwZWVkLgorLy8gVW5saWtlIHRoZSBGYXN0KlRvQnVmZmVyKCkgZnVuY3Rpb25zLCBob3dldmVyLCB0aGVzZSBmdW5jdGlvbnMgd3JpdGUKKy8vIHRoZWlyIG91dHB1dCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgKGhlbmNlIHRoZSBuYW1lLCBhcyB0aGUKKy8vIG91dHB1dCBpcyBsZWZ0LWFsaWduZWQpLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdAorLy8gdGhlIGJ1ZmZlciBoYXMgZW5vdWdoIHNwYWNlIHRvIGhvbGQgdGhlIG91dHB1dC4KKy8vCisvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKGkuZS4gdGhlIG51bGwgY2hhcmFjdGVyCisvLyB0ZXJtaW5hdGluZyB0aGUgc3RyaW5nKS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IGNoYXIgdHdvX0FTQ0lJX2RpZ2l0c1sxMDBdWzJdID0geworICB7JzAnLCcwJ30sIHsnMCcsJzEnfSwgeycwJywnMid9LCB7JzAnLCczJ30sIHsnMCcsJzQnfSwKKyAgeycwJywnNSd9LCB7JzAnLCc2J30sIHsnMCcsJzcnfSwgeycwJywnOCd9LCB7JzAnLCc5J30sCisgIHsnMScsJzAnfSwgeycxJywnMSd9LCB7JzEnLCcyJ30sIHsnMScsJzMnfSwgeycxJywnNCd9LAorICB7JzEnLCc1J30sIHsnMScsJzYnfSwgeycxJywnNyd9LCB7JzEnLCc4J30sIHsnMScsJzknfSwKKyAgeycyJywnMCd9LCB7JzInLCcxJ30sIHsnMicsJzInfSwgeycyJywnMyd9LCB7JzInLCc0J30sCisgIHsnMicsJzUnfSwgeycyJywnNid9LCB7JzInLCc3J30sIHsnMicsJzgnfSwgeycyJywnOSd9LAorICB7JzMnLCcwJ30sIHsnMycsJzEnfSwgeyczJywnMid9LCB7JzMnLCczJ30sIHsnMycsJzQnfSwKKyAgeyczJywnNSd9LCB7JzMnLCc2J30sIHsnMycsJzcnfSwgeyczJywnOCd9LCB7JzMnLCc5J30sCisgIHsnNCcsJzAnfSwgeyc0JywnMSd9LCB7JzQnLCcyJ30sIHsnNCcsJzMnfSwgeyc0JywnNCd9LAorICB7JzQnLCc1J30sIHsnNCcsJzYnfSwgeyc0JywnNyd9LCB7JzQnLCc4J30sIHsnNCcsJzknfSwKKyAgeyc1JywnMCd9LCB7JzUnLCcxJ30sIHsnNScsJzInfSwgeyc1JywnMyd9LCB7JzUnLCc0J30sCisgIHsnNScsJzUnfSwgeyc1JywnNid9LCB7JzUnLCc3J30sIHsnNScsJzgnfSwgeyc1JywnOSd9LAorICB7JzYnLCcwJ30sIHsnNicsJzEnfSwgeyc2JywnMid9LCB7JzYnLCczJ30sIHsnNicsJzQnfSwKKyAgeyc2JywnNSd9LCB7JzYnLCc2J30sIHsnNicsJzcnfSwgeyc2JywnOCd9LCB7JzYnLCc5J30sCisgIHsnNycsJzAnfSwgeyc3JywnMSd9LCB7JzcnLCcyJ30sIHsnNycsJzMnfSwgeyc3JywnNCd9LAorICB7JzcnLCc1J30sIHsnNycsJzYnfSwgeyc3JywnNyd9LCB7JzcnLCc4J30sIHsnNycsJzknfSwKKyAgeyc4JywnMCd9LCB7JzgnLCcxJ30sIHsnOCcsJzInfSwgeyc4JywnMyd9LCB7JzgnLCc0J30sCisgIHsnOCcsJzUnfSwgeyc4JywnNid9LCB7JzgnLCc3J30sIHsnOCcsJzgnfSwgeyc4JywnOSd9LAorICB7JzknLCcwJ30sIHsnOScsJzEnfSwgeyc5JywnMid9LCB7JzknLCczJ30sIHsnOScsJzQnfSwKKyAgeyc5JywnNSd9LCB7JzknLCc2J30sIHsnOScsJzcnfSwgeyc5JywnOCd9LCB7JzknLCc5J30KK307CisKK2NoYXIqIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQodWludDMyIHUsIGNoYXIqIGJ1ZmZlcikgeworICBpbnQgZGlnaXRzOworICBjb25zdCBjaGFyICpBU0NJSV9kaWdpdHMgPSBOVUxMOworICAvLyBUaGUgaWRlYSBvZiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHRvIHRyaW0gdGhlIG51bWJlciBvZiBkaXZpZGVzIHRvIGFzIGZldworICAvLyBhcyBwb3NzaWJsZSBieSB1c2luZyBtdWx0aXBsaWNhdGlvbiBhbmQgc3VidHJhY3Rpb24gcmF0aGVyIHRoYW4gbW9kICglKSwKKyAgLy8gYW5kIGJ5IG91dHB1dHRpbmcgdHdvIGRpZ2l0cyBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gb25lLgorICAvLyBUaGUgaHVnZS1udW1iZXIgY2FzZSBpcyBmaXJzdCwgaW4gdGhlIGhvcGVzIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgb3V0cHV0CisgIC8vIHRoYXQgY2FzZSBpbiBvbmUgYnJhbmNoLWZyZWUgYmxvY2sgb2YgY29kZSwgYW5kIG9ubHkgb3V0cHV0IGNvbmRpdGlvbmFsCisgIC8vIGJyYW5jaGVzIGludG8gaXQgZnJvbSBiZWxvdy4KKyAgaWYgKHUgPj0gMTAwMDAwMDAwMCkgeyAgLy8gPj0gMSwwMDAsMDAwLDAwMAorICAgIGRpZ2l0cyA9IHUgLyAxMDAwMDAwMDA7ICAvLyAxMDAsMDAwLDAwMAorICAgIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKKyAgICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07CisgICAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOworICAgIGJ1ZmZlciArPSAyOworc3VibHQxMDBfMDAwXzAwMDoKKyAgICB1IC09IGRpZ2l0cyAqIDEwMDAwMDAwMDsgIC8vIDEwMCwwMDAsMDAwCitsdDEwMF8wMDBfMDAwOgorICAgIGRpZ2l0cyA9IHUgLyAxMDAwMDAwOyAgLy8gMSwwMDAsMDAwCisgICAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOworICAgIGJ1ZmZlclswXSA9IEFTQ0lJX2RpZ2l0c1swXTsKKyAgICBidWZmZXJbMV0gPSBBU0NJSV9kaWdpdHNbMV07CisgICAgYnVmZmVyICs9IDI7CitzdWJsdDFfMDAwXzAwMDoKKyAgICB1IC09IGRpZ2l0cyAqIDEwMDAwMDA7ICAvLyAxLDAwMCwwMDAKK2x0MV8wMDBfMDAwOgorICAgIGRpZ2l0cyA9IHUgLyAxMDAwMDsgIC8vIDEwLDAwMAorICAgIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKKyAgICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07CisgICAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOworICAgIGJ1ZmZlciArPSAyOworc3VibHQxMF8wMDA6CisgICAgdSAtPSBkaWdpdHMgKiAxMDAwMDsgIC8vIDEwLDAwMAorbHQxMF8wMDA6CisgICAgZGlnaXRzID0gdSAvIDEwMDsKKyAgICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107CisgICAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOworICAgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKKyAgICBidWZmZXIgKz0gMjsKK3N1Ymx0MTAwOgorICAgIHUgLT0gZGlnaXRzICogMTAwOworbHQxMDA6CisgICAgZGlnaXRzID0gdTsKKyAgICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107CisgICAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOworICAgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKKyAgICBidWZmZXIgKz0gMjsKK2RvbmU6CisgICAgKmJ1ZmZlciA9IDA7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfQorCisgIGlmICh1IDwgMTAwKSB7CisgICAgZGlnaXRzID0gdTsKKyAgICBpZiAodSA+PSAxMCkgZ290byBsdDEwMDsKKyAgICAqYnVmZmVyKysgPSAnMCcgKyBkaWdpdHM7CisgICAgZ290byBkb25lOworICB9CisgIGlmICh1ICA8ICAxMDAwMCkgeyAgIC8vIDEwLDAwMAorICAgIGlmICh1ID49IDEwMDApIGdvdG8gbHQxMF8wMDA7CisgICAgZGlnaXRzID0gdSAvIDEwMDsKKyAgICAqYnVmZmVyKysgPSAnMCcgKyBkaWdpdHM7CisgICAgZ290byBzdWJsdDEwMDsKKyAgfQorICBpZiAodSAgPCAgMTAwMDAwMCkgeyAgIC8vIDEsMDAwLDAwMAorICAgIGlmICh1ID49IDEwMDAwMCkgZ290byBsdDFfMDAwXzAwMDsKKyAgICBkaWdpdHMgPSB1IC8gMTAwMDA7ICAvLyAgICAxMCwwMDAKKyAgICAqYnVmZmVyKysgPSAnMCcgKyBkaWdpdHM7CisgICAgZ290byBzdWJsdDEwXzAwMDsKKyAgfQorICBpZiAodSAgPCAgMTAwMDAwMDAwKSB7ICAgLy8gMTAwLDAwMCwwMDAKKyAgICBpZiAodSA+PSAxMDAwMDAwMCkgZ290byBsdDEwMF8wMDBfMDAwOworICAgIGRpZ2l0cyA9IHUgLyAxMDAwMDAwOyAgLy8gICAxLDAwMCwwMDAKKyAgICAqYnVmZmVyKysgPSAnMCcgKyBkaWdpdHM7CisgICAgZ290byBzdWJsdDFfMDAwXzAwMDsKKyAgfQorICAvLyB3ZSBhbHJlYWR5IGtub3cgdGhhdCB1IDwgMSwwMDAsMDAwLDAwMAorICBkaWdpdHMgPSB1IC8gMTAwMDAwMDAwOyAgIC8vIDEwMCwwMDAsMDAwCisgICpidWZmZXIrKyA9ICcwJyArIGRpZ2l0czsKKyAgZ290byBzdWJsdDEwMF8wMDBfMDAwOworfQorCitjaGFyKiBGYXN0SW50MzJUb0J1ZmZlckxlZnQoaW50MzIgaSwgY2hhciogYnVmZmVyKSB7CisgIHVpbnQzMiB1ID0gaTsKKyAgaWYgKGkgPCAwKSB7CisgICAgKmJ1ZmZlcisrID0gJy0nOworICAgIHUgPSAtaTsKKyAgfQorICByZXR1cm4gRmFzdFVJbnQzMlRvQnVmZmVyTGVmdCh1LCBidWZmZXIpOworfQorCitjaGFyKiBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KHVpbnQ2NCB1NjQsIGNoYXIqIGJ1ZmZlcikgeworICBpbnQgZGlnaXRzOworICBjb25zdCBjaGFyICpBU0NJSV9kaWdpdHMgPSBOVUxMOworCisgIHVpbnQzMiB1ID0gc3RhdGljX2Nhc3Q8dWludDMyPih1NjQpOworICBpZiAodSA9PSB1NjQpIHJldHVybiBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KHUsIGJ1ZmZlcik7CisKKyAgdWludDY0IHRvcF8xMV9kaWdpdHMgPSB1NjQgLyAxMDAwMDAwMDAwOworICBidWZmZXIgPSBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KHRvcF8xMV9kaWdpdHMsIGJ1ZmZlcik7CisgIHUgPSB1NjQgLSAodG9wXzExX2RpZ2l0cyAqIDEwMDAwMDAwMDApOworCisgIGRpZ2l0cyA9IHUgLyAxMDAwMDAwMDsgIC8vIDEwLDAwMCwwMDAKKyAgR09PR0xFX0RDSEVDS19MVChkaWdpdHMsIDEwMCk7CisgIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKKyAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOworICBidWZmZXJbMV0gPSBBU0NJSV9kaWdpdHNbMV07CisgIGJ1ZmZlciArPSAyOworICB1IC09IGRpZ2l0cyAqIDEwMDAwMDAwOyAgLy8gMTAsMDAwLDAwMAorICBkaWdpdHMgPSB1IC8gMTAwMDAwOyAgLy8gMTAwLDAwMAorICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107CisgIGJ1ZmZlclswXSA9IEFTQ0lJX2RpZ2l0c1swXTsKKyAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOworICBidWZmZXIgKz0gMjsKKyAgdSAtPSBkaWdpdHMgKiAxMDAwMDA7ICAvLyAxMDAsMDAwCisgIGRpZ2l0cyA9IHUgLyAxMDAwOyAgLy8gMSwwMDAKKyAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOworICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07CisgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKKyAgYnVmZmVyICs9IDI7CisgIHUgLT0gZGlnaXRzICogMTAwMDsgIC8vIDEsMDAwCisgIGRpZ2l0cyA9IHUgLyAxMDsKKyAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOworICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07CisgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKKyAgYnVmZmVyICs9IDI7CisgIHUgLT0gZGlnaXRzICogMTA7CisgIGRpZ2l0cyA9IHU7CisgICpidWZmZXIrKyA9ICcwJyArIGRpZ2l0czsKKyAgKmJ1ZmZlciA9IDA7CisgIHJldHVybiBidWZmZXI7Cit9CisKK2NoYXIqIEZhc3RJbnQ2NFRvQnVmZmVyTGVmdChpbnQ2NCBpLCBjaGFyKiBidWZmZXIpIHsKKyAgdWludDY0IHUgPSBpOworICBpZiAoaSA8IDApIHsKKyAgICAqYnVmZmVyKysgPSAnLSc7CisgICAgdSA9IC1pOworICB9CisgIHJldHVybiBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KHUsIGJ1ZmZlcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZUl0b2EoKQorLy8gICAgRGVzY3JpcHRpb246IGNvbnZlcnRzIGFuIGludGVnZXIgdG8gYSBzdHJpbmcuCisvLworLy8gICAgUmV0dXJuIHZhbHVlOiBzdHJpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RyaW5nIFNpbXBsZUl0b2EoaW50IGkpIHsKKyAgY2hhciBidWZmZXJba0Zhc3RUb0J1ZmZlclNpemVdOworICByZXR1cm4gKHNpemVvZihpKSA9PSA0KSA/CisgICAgRmFzdEludDMyVG9CdWZmZXIoaSwgYnVmZmVyKSA6CisgICAgRmFzdEludDY0VG9CdWZmZXIoaSwgYnVmZmVyKTsKK30KKworc3RyaW5nIFNpbXBsZUl0b2EodW5zaWduZWQgaW50IGkpIHsKKyAgY2hhciBidWZmZXJba0Zhc3RUb0J1ZmZlclNpemVdOworICByZXR1cm4gc3RyaW5nKGJ1ZmZlciwgKHNpemVvZihpKSA9PSA0KSA/CisgICAgRmFzdFVJbnQzMlRvQnVmZmVyTGVmdChpLCBidWZmZXIpIDoKKyAgICBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KGksIGJ1ZmZlcikpOworfQorCitzdHJpbmcgU2ltcGxlSXRvYShsb25nIGkpIHsKKyAgY2hhciBidWZmZXJba0Zhc3RUb0J1ZmZlclNpemVdOworICByZXR1cm4gKHNpemVvZihpKSA9PSA0KSA/CisgICAgRmFzdEludDMyVG9CdWZmZXIoaSwgYnVmZmVyKSA6CisgICAgRmFzdEludDY0VG9CdWZmZXIoaSwgYnVmZmVyKTsKK30KKworc3RyaW5nIFNpbXBsZUl0b2EodW5zaWduZWQgbG9uZyBpKSB7CisgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIHN0cmluZyhidWZmZXIsIChzaXplb2YoaSkgPT0gNCkgPworICAgIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQoaSwgYnVmZmVyKSA6CisgICAgRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdChpLCBidWZmZXIpKTsKK30KKworc3RyaW5nIFNpbXBsZUl0b2EobG9uZyBsb25nIGkpIHsKKyAgY2hhciBidWZmZXJba0Zhc3RUb0J1ZmZlclNpemVdOworICByZXR1cm4gKHNpemVvZihpKSA9PSA0KSA/CisgICAgRmFzdEludDMyVG9CdWZmZXIoaSwgYnVmZmVyKSA6CisgICAgRmFzdEludDY0VG9CdWZmZXIoaSwgYnVmZmVyKTsKK30KKworc3RyaW5nIFNpbXBsZUl0b2EodW5zaWduZWQgbG9uZyBsb25nIGkpIHsKKyAgY2hhciBidWZmZXJba0Zhc3RUb0J1ZmZlclNpemVdOworICByZXR1cm4gc3RyaW5nKGJ1ZmZlciwgKHNpemVvZihpKSA9PSA0KSA/CisgICAgRmFzdFVJbnQzMlRvQnVmZmVyTGVmdChpLCBidWZmZXIpIDoKKyAgICBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KGksIGJ1ZmZlcikpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGVEdG9hKCkKKy8vIFNpbXBsZUZ0b2EoKQorLy8gRG91YmxlVG9CdWZmZXIoKQorLy8gRmxvYXRUb0J1ZmZlcigpCisvLyAgICBXZSB3YW50IHRvIHByaW50IHRoZSB2YWx1ZSB3aXRob3V0IGxvc2luZyBwcmVjaXNpb24sIGJ1dCB3ZSBhbHNvIGRvCisvLyAgICBub3Qgd2FudCB0byBwcmludCBtb3JlIGRpZ2l0cyB0aGFuIG5lY2Vzc2FyeS4gIFRoaXMgdHVybnMgb3V0IHRvIGJlCisvLyAgICB0cmlja2llciB0aGFuIGl0IHNvdW5kcy4gIE51bWJlcnMgbGlrZSAwLjIgY2Fubm90IGJlIHJlcHJlc2VudGVkCisvLyAgICBleGFjdGx5IGluIGJpbmFyeS4gIElmIHdlIHByaW50IDAuMiB3aXRoIGEgdmVyeSBsYXJnZSBwcmVjaXNpb24sCisvLyAgICBlLmcuICIlLjUwZyIsIHdlIGdldCAiMC4yMDAwMDAwMDAwMDAwMDAwMTExMDIyMzAyNDYyNTE1NjU0MDQyMzYzMTY3Ii4KKy8vICAgIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBzZXQgdGhlIHByZWNpc2lvbiB0b28gbG93LCB3ZSBsb3NlCisvLyAgICBzaWduaWZpY2FudCBkaWdpdHMgd2hlbiBwcmludGluZyBudW1iZXJzIHRoYXQgYWN0dWFsbHkgbmVlZCB0aGVtLgorLy8gICAgSXQgdHVybnMgb3V0IHRoZXJlIGlzIG5vIHByZWNpc2lvbiB2YWx1ZSB0aGF0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nCisvLyAgICBmb3IgYWxsIG51bWJlcnMuCisvLworLy8gICAgT3VyIHN0cmF0ZWd5IGlzIHRvIGZpcnN0IHRyeSBwcmludGluZyB3aXRoIGEgcHJlY2lzaW9uIHRoYXQgaXMgbmV2ZXIKKy8vICAgIG92ZXItcHJlY2lzZSwgdGhlbiBwYXJzZSB0aGUgcmVzdWx0IHdpdGggc3RydG9kKCkgdG8gc2VlIGlmIGl0CisvLyAgICBtYXRjaGVzLiAgSWYgbm90LCB3ZSBwcmludCBhZ2FpbiB3aXRoIGEgcHJlY2lzaW9uIHRoYXQgd2lsbCBhbHdheXMKKy8vICAgIGdpdmUgYSBwcmVjaXNlIHJlc3VsdCwgYnV0IG1heSB1c2UgbW9yZSBkaWdpdHMgdGhhbiBuZWNlc3NhcnkuCisvLworLy8gICAgQW4gYXJndWFibHkgYmV0dGVyIHN0cmF0ZWd5IHdvdWxkIGJlIHRvIHVzZSB0aGUgYWxnb3JpdGhtIGRlc2NyaWJlZAorLy8gICAgaW4gIkhvdyB0byBQcmludCBGbG9hdGluZy1Qb2ludCBOdW1iZXJzIEFjY3VyYXRlbHkiIGJ5IFN0ZWVsZSAmCisvLyAgICBXaGl0ZSwgZS5nLiBhcyBpbXBsZW1lbnRlZCBieSBEYXZpZCBNLiBHYXkncyBkdG9hKCkuICBJdCB0dXJucyBvdXQsCisvLyAgICBob3dldmVyLCB0aGF0IHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gaXMgYWJvdXQgYXMgZmFzdCBhcworLy8gICAgRE1HJ3MgY29kZS4gIEZ1cnRoZXJtb3JlLCBETUcncyBjb2RlIGxvY2tzIG11dGV4ZXMsIHdoaWNoIG1lYW5zIGl0CisvLyAgICB3aWxsIG5vdCBzY2FsZSB3ZWxsIG9uIG11bHRpLWNvcmUgbWFjaGluZXMuICBETUcncyBjb2RlIGlzIHNsaWdodGx5CisvLyAgICBtb3JlIGFjY3VyYXRlIChpbiB0aGF0IGl0IHdpbGwgbmV2ZXIgdXNlIG1vcmUgZGlnaXRzIHRoYW4KKy8vICAgIG5lY2Vzc2FyeSksIGJ1dCB0aGlzIGlzIHByb2JhYmx5IGlycmVsZXZhbnQgZm9yIG1vc3QgdXNlcnMuCisvLworLy8gICAgUm9iIFBpa2UgYW5kIEtlbiBUaG9tcHNvbiBhbHNvIGhhdmUgYW4gaW1wbGVtZW50YXRpb24gb2YgZHRvYSgpIGluCisvLyAgICB0aGlyZF9wYXJ0eS9mbXQvZmx0Zm10LmNjLiAgVGhlaXIgaW1wbGVtZW50YXRpb24gaXMgc2ltaWxhciB0byB0aGlzCisvLyAgICBvbmUgaW4gdGhhdCBpdCBtYWtlcyBndWVzc2VzIGFuZCB0aGVuIHVzZXMgc3RydG9kKCkgdG8gY2hlY2sgdGhlbS4KKy8vICAgIFRoZWlyIGltcGxlbWVudGF0aW9uIGlzIGZhc3RlciBiZWNhdXNlIHRoZXkgdXNlIHRoZWlyIG93biBjb2RlIHRvCisvLyAgICBnZW5lcmF0ZSB0aGUgZGlnaXRzIGluIHRoZSBmaXJzdCBwbGFjZSByYXRoZXIgdGhhbiB1c2Ugc25wcmludGYoKSwKKy8vICAgIHRodXMgYXZvaWRpbmcgZm9ybWF0IHN0cmluZyBwYXJzaW5nIG92ZXJoZWFkLiAgSG93ZXZlciwgdGhpcyBtYWtlcworLy8gICAgaXQgY29uc2lkZXJhYmx5IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB0aGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uLAorLy8gICAgYW5kIGl0IGlzIGVtYmVkZGVkIGluIGEgbGFyZ2VyIGxpYnJhcnkuICBJZiBzcGVlZCB0dXJucyBvdXQgdG8gYmUKKy8vICAgIGFuIGlzc3VlLCB3ZSBjb3VsZCByZS1pbXBsZW1lbnQgdGhpcyBpbiB0ZXJtcyBvZiB0aGVpcgorLy8gICAgaW1wbGVtZW50YXRpb24uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cmluZyBTaW1wbGVEdG9hKGRvdWJsZSB2YWx1ZSkgeworICBjaGFyIGJ1ZmZlcltrRG91YmxlVG9CdWZmZXJTaXplXTsKKyAgcmV0dXJuIERvdWJsZVRvQnVmZmVyKHZhbHVlLCBidWZmZXIpOworfQorCitzdHJpbmcgU2ltcGxlRnRvYShmbG9hdCB2YWx1ZSkgeworICBjaGFyIGJ1ZmZlcltrRmxvYXRUb0J1ZmZlclNpemVdOworICByZXR1cm4gRmxvYXRUb0J1ZmZlcih2YWx1ZSwgYnVmZmVyKTsKK30KKworc3RhdGljIGlubGluZSBib29sIElzVmFsaWRGbG9hdENoYXIoY2hhciBjKSB7CisgIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8CisgICAgICAgICBjID09ICdlJyB8fCBjID09ICdFJyB8fAorICAgICAgICAgYyA9PSAnKycgfHwgYyA9PSAnLSc7Cit9CisKK3ZvaWQgRGVsb2NhbGl6ZVJhZGl4KGNoYXIqIGJ1ZmZlcikgeworICAvLyBGYXN0IGNoZWNrOiAgaWYgdGhlIGJ1ZmZlciBoYXMgYSBub3JtYWwgZGVjaW1hbCBwb2ludCwgYXNzdW1lIG5vCisgIC8vIHRyYW5zbGF0aW9uIGlzIG5lZWRlZC4KKyAgaWYgKHN0cmNocihidWZmZXIsICcuJykgIT0gTlVMTCkgcmV0dXJuOworCisgIC8vIEZpbmQgdGhlIGZpcnN0IHVua25vd24gY2hhcmFjdGVyLgorICB3aGlsZSAoSXNWYWxpZEZsb2F0Q2hhcigqYnVmZmVyKSkgKytidWZmZXI7CisKKyAgaWYgKCpidWZmZXIgPT0gJ1wwJykgeworICAgIC8vIE5vIHJhZGl4IGNoYXJhY3RlciBmb3VuZC4KKyAgICByZXR1cm47CisgIH0KKworICAvLyBXZSBhcmUgbm93IHBvaW50aW5nIGF0IHRoZSBsb2NhbGUtc3BlY2lmaWMgcmFkaXggY2hhcmFjdGVyLiAgUmVwbGFjZSBpdAorICAvLyB3aXRoICcuJy4KKyAgKmJ1ZmZlciA9ICcuJzsKKyAgKytidWZmZXI7CisKKyAgaWYgKCFJc1ZhbGlkRmxvYXRDaGFyKCpidWZmZXIpICYmICpidWZmZXIgIT0gJ1wwJykgeworICAgIC8vIEl0IGFwcGVhcnMgdGhlIHJhZGl4IHdhcyBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyLiAgV2UgbmVlZCB0byByZW1vdmUgdGhlCisgICAgLy8gZXh0cmEgYnl0ZXMuCisgICAgY2hhciogdGFyZ2V0ID0gYnVmZmVyOworICAgIGRvIHsgKytidWZmZXI7IH0gd2hpbGUgKCFJc1ZhbGlkRmxvYXRDaGFyKCpidWZmZXIpICYmICpidWZmZXIgIT0gJ1wwJyk7CisgICAgbWVtbW92ZSh0YXJnZXQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikgKyAxKTsKKyAgfQorfQorCitjaGFyKiBEb3VibGVUb0J1ZmZlcihkb3VibGUgdmFsdWUsIGNoYXIqIGJ1ZmZlcikgeworICAvLyBEQkxfRElHIGlzIDE1IGZvciBJRUVFLTc1NCBkb3VibGVzLCB3aGljaCBhcmUgdXNlZCBvbiBhbG1vc3QgYWxsCisgIC8vIHBsYXRmb3JtcyB0aGVzZSBkYXlzLiAgSnVzdCBpbiBjYXNlIHNvbWUgc3lzdGVtIGV4aXN0cyB3aGVyZSBEQkxfRElHCisgIC8vIGlzIHNpZ25pZmljYW50bHkgbGFyZ2VyIC0tIGFuZCByaXNrcyBvdmVyZmxvd2luZyBvdXIgYnVmZmVyIC0tIHdlIGhhdmUKKyAgLy8gdGhpcyBhc3NlcnQuCisgIEdPT0dMRV9DT01QSUxFX0FTU0VSVChEQkxfRElHIDwgMjAsIERCTF9ESUdfaXNfdG9vX2JpZyk7CisKKyAgaWYgKHZhbHVlID09IG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKKyAgICBzdHJjcHkoYnVmZmVyLCAiaW5mIik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgeworICAgIHN0cmNweShidWZmZXIsICItaW5mIik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfSBlbHNlIGlmIChJc05hTih2YWx1ZSkpIHsKKyAgICBzdHJjcHkoYnVmZmVyLCAibmFuIik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfQorCisgIGludCBzbnByaW50Zl9yZXN1bHQgPQorICAgIHNucHJpbnRmKGJ1ZmZlciwga0RvdWJsZVRvQnVmZmVyU2l6ZSwgIiUuKmciLCBEQkxfRElHLCB2YWx1ZSk7CisKKyAgLy8gVGhlIHNucHJpbnRmIHNob3VsZCBuZXZlciBvdmVyZmxvdyBiZWNhdXNlIHRoZSBidWZmZXIgaXMgc2lnbmlmaWNhbnRseQorICAvLyBsYXJnZXIgdGhhbiB0aGUgcHJlY2lzaW9uIHdlIGFza2VkIGZvci4KKyAgR09PR0xFX0RDSEVDSyhzbnByaW50Zl9yZXN1bHQgPiAwICYmIHNucHJpbnRmX3Jlc3VsdCA8IGtEb3VibGVUb0J1ZmZlclNpemUpOworCisgIC8vIFdlIG5lZWQgdG8gbWFrZSBwYXJzZWRfdmFsdWUgdm9sYXRpbGUgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvCisgIC8vIHdyaXRlIGl0IG91dCB0byB0aGUgc3RhY2suICBPdGhlcndpc2UsIGl0IG1heSBrZWVwIHRoZSB2YWx1ZSBpbiBhCisgIC8vIHJlZ2lzdGVyLCBhbmQgaWYgaXQgZG9lcyB0aGF0LCBpdCBtYXkga2VlcCBpdCBhcyBhIGxvbmcgZG91YmxlIGluc3RlYWQKKyAgLy8gb2YgYSBkb3VibGUuICBUaGlzIGxvbmcgZG91YmxlIG1heSBoYXZlIGV4dHJhIGJpdHMgdGhhdCBtYWtlIGl0IGNvbXBhcmUKKyAgLy8gdW5lcXVhbCB0byAidmFsdWUiIGV2ZW4gdGhvdWdoIGl0IHdvdWxkIGJlIGV4YWN0bHkgZXF1YWwgaWYgaXQgd2VyZQorICAvLyB0cnVuY2F0ZWQgdG8gYSBkb3VibGUuCisgIHZvbGF0aWxlIGRvdWJsZSBwYXJzZWRfdmFsdWUgPSBzdHJ0b2QoYnVmZmVyLCBOVUxMKTsKKyAgaWYgKHBhcnNlZF92YWx1ZSAhPSB2YWx1ZSkgeworICAgIGludCBzbnByaW50Zl9yZXN1bHQgPQorICAgICAgc25wcmludGYoYnVmZmVyLCBrRG91YmxlVG9CdWZmZXJTaXplLCAiJS4qZyIsIERCTF9ESUcrMiwgdmFsdWUpOworCisgICAgLy8gU2hvdWxkIG5ldmVyIG92ZXJmbG93OyBzZWUgYWJvdmUuCisgICAgR09PR0xFX0RDSEVDSyhzbnByaW50Zl9yZXN1bHQgPiAwICYmIHNucHJpbnRmX3Jlc3VsdCA8IGtEb3VibGVUb0J1ZmZlclNpemUpOworICB9CisKKyAgRGVsb2NhbGl6ZVJhZGl4KGJ1ZmZlcik7CisgIHJldHVybiBidWZmZXI7Cit9CisKK2Jvb2wgc2FmZV9zdHJ0b2YoY29uc3QgY2hhciogc3RyLCBmbG9hdCogdmFsdWUpIHsKKyAgY2hhciogZW5kcHRyOworICBlcnJubyA9IDA7ICAvLyBlcnJubyBvbmx5IGdldHMgc2V0IG9uIGVycm9ycworI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkIChfX2hwdXgpICAvLyBoYXMgbm8gc3RydG9mKCkKKyAgKnZhbHVlID0gc3RydG9kKHN0ciwgJmVuZHB0cik7CisjZWxzZQorICAqdmFsdWUgPSBzdHJ0b2Yoc3RyLCAmZW5kcHRyKTsKKyNlbmRpZgorICByZXR1cm4gKnN0ciAhPSAwICYmICplbmRwdHIgPT0gMCAmJiBlcnJubyA9PSAwOworfQorCitjaGFyKiBGbG9hdFRvQnVmZmVyKGZsb2F0IHZhbHVlLCBjaGFyKiBidWZmZXIpIHsKKyAgLy8gRkxUX0RJRyBpcyA2IGZvciBJRUVFLTc1NCBmbG9hdHMsIHdoaWNoIGFyZSB1c2VkIG9uIGFsbW9zdCBhbGwKKyAgLy8gcGxhdGZvcm1zIHRoZXNlIGRheXMuICBKdXN0IGluIGNhc2Ugc29tZSBzeXN0ZW0gZXhpc3RzIHdoZXJlIEZMVF9ESUcKKyAgLy8gaXMgc2lnbmlmaWNhbnRseSBsYXJnZXIgLS0gYW5kIHJpc2tzIG92ZXJmbG93aW5nIG91ciBidWZmZXIgLS0gd2UgaGF2ZQorICAvLyB0aGlzIGFzc2VydC4KKyAgR09PR0xFX0NPTVBJTEVfQVNTRVJUKEZMVF9ESUcgPCAxMCwgRkxUX0RJR19pc190b29fYmlnKTsKKworICBpZiAodmFsdWUgPT0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgeworICAgIHN0cmNweShidWZmZXIsICJpbmYiKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9IGVsc2UgaWYgKHZhbHVlID09IC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgc3RyY3B5KGJ1ZmZlciwgIi1pbmYiKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9IGVsc2UgaWYgKElzTmFOKHZhbHVlKSkgeworICAgIHN0cmNweShidWZmZXIsICJuYW4iKTsKKyAgICByZXR1cm4gYnVmZmVyOworICB9CisKKyAgaW50IHNucHJpbnRmX3Jlc3VsdCA9CisgICAgc25wcmludGYoYnVmZmVyLCBrRmxvYXRUb0J1ZmZlclNpemUsICIlLipnIiwgRkxUX0RJRywgdmFsdWUpOworCisgIC8vIFRoZSBzbnByaW50ZiBzaG91bGQgbmV2ZXIgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgYnVmZmVyIGlzIHNpZ25pZmljYW50bHkKKyAgLy8gbGFyZ2VyIHRoYW4gdGhlIHByZWNpc2lvbiB3ZSBhc2tlZCBmb3IuCisgIEdPT0dMRV9EQ0hFQ0soc25wcmludGZfcmVzdWx0ID4gMCAmJiBzbnByaW50Zl9yZXN1bHQgPCBrRmxvYXRUb0J1ZmZlclNpemUpOworCisgIGZsb2F0IHBhcnNlZF92YWx1ZTsKKyAgaWYgKCFzYWZlX3N0cnRvZihidWZmZXIsICZwYXJzZWRfdmFsdWUpIHx8IHBhcnNlZF92YWx1ZSAhPSB2YWx1ZSkgeworICAgIGludCBzbnByaW50Zl9yZXN1bHQgPQorICAgICAgc25wcmludGYoYnVmZmVyLCBrRmxvYXRUb0J1ZmZlclNpemUsICIlLipnIiwgRkxUX0RJRysyLCB2YWx1ZSk7CisKKyAgICAvLyBTaG91bGQgbmV2ZXIgb3ZlcmZsb3c7IHNlZSBhYm92ZS4KKyAgICBHT09HTEVfRENIRUNLKHNucHJpbnRmX3Jlc3VsdCA+IDAgJiYgc25wcmludGZfcmVzdWx0IDwga0Zsb2F0VG9CdWZmZXJTaXplKTsKKyAgfQorCisgIERlbG9jYWxpemVSYWRpeChidWZmZXIpOworICByZXR1cm4gYnVmZmVyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb0xvY2FsZVN0cnRvZCgpCisvLyAgIFRoaXMgY29kZSB3aWxsIG1ha2UgeW91IGNyeS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmV0dXJucyBhIHN0cmluZyBpZGVudGljYWwgdG8gKmlucHV0IGV4Y2VwdCB0aGF0IHRoZSBjaGFyYWN0ZXIgcG9pbnRlZCB0bworLy8gYnkgcmFkaXhfcG9zICh3aGljaCBzaG91bGQgYmUgJy4nKSBpcyByZXBsYWNlZCB3aXRoIHRoZSBsb2NhbGUtc3BlY2lmaWMKKy8vIHJhZGl4IGNoYXJhY3Rlci4KK3N0cmluZyBMb2NhbGl6ZVJhZGl4KGNvbnN0IGNoYXIqIGlucHV0LCBjb25zdCBjaGFyKiByYWRpeF9wb3MpIHsKKyAgLy8gRGV0ZXJtaW5lIHRoZSBsb2NhbGUtc3BlY2lmaWMgcmFkaXggY2hhcmFjdGVyIGJ5IGNhbGxpbmcgc3ByaW50ZigpIHRvCisgIC8vIHByaW50IHRoZSBudW1iZXIgMS41LCB0aGVuIHN0cmlwcGluZyBvZmYgdGhlIGRpZ2l0cy4gIEFzIGZhciBhcyBJIGNhbgorICAvLyB0ZWxsLCB0aGlzIGlzIHRoZSBvbmx5IHBvcnRhYmxlLCB0aHJlYWQtc2FmZSB3YXkgdG8gZ2V0IHRoZSBDIGxpYnJhcnkKKyAgLy8gdG8gZGl2dWxkZ2UgdGhlIGxvY2FsZSdzIHJhZGl4IGNoYXJhY3Rlci4gIE5vLCBsb2NhbGVjb252KCkgaXMgTk9UCisgIC8vIHRocmVhZC1zYWZlLgorICBjaGFyIHRlbXBbMTZdOworICBpbnQgc2l6ZSA9IHNwcmludGYodGVtcCwgIiUuMWYiLCAxLjUpOworICBHT09HTEVfQ0hFQ0tfRVEodGVtcFswXSwgJzEnKTsKKyAgR09PR0xFX0NIRUNLX0VRKHRlbXBbc2l6ZS0xXSwgJzUnKTsKKyAgR09PR0xFX0NIRUNLX0xFKHNpemUsIDYpOworCisgIC8vIE5vdyByZXBsYWNlIHRoZSAnLicgaW4gdGhlIGlucHV0IHdpdGggaXQuCisgIHN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5yZXNlcnZlKHN0cmxlbihpbnB1dCkgKyBzaXplIC0gMyk7CisgIHJlc3VsdC5hcHBlbmQoaW5wdXQsIHJhZGl4X3Bvcyk7CisgIHJlc3VsdC5hcHBlbmQodGVtcCArIDEsIHNpemUgLSAyKTsKKyAgcmVzdWx0LmFwcGVuZChyYWRpeF9wb3MgKyAxKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworZG91YmxlIE5vTG9jYWxlU3RydG9kKGNvbnN0IGNoYXIqIHRleHQsIGNoYXIqKiBvcmlnaW5hbF9lbmRwdHIpIHsKKyAgLy8gV2UgY2Fubm90IHNpbXBseSBzZXQgdGhlIGxvY2FsZSB0byAiQyIgdGVtcG9yYXJpbHkgd2l0aCBzZXRsb2NhbGUoKQorICAvLyBhcyB0aGlzIGlzIG5vdCB0aHJlYWQtc2FmZS4gIEluc3RlYWQsIHdlIHRyeSB0byBwYXJzZSBpbiB0aGUgY3VycmVudAorICAvLyBsb2NhbGUgZmlyc3QuICBJZiBwYXJzaW5nIHN0b3BzIGF0IGEgJy4nIGNoYXJhY3RlciwgdGhlbiB0aGlzIGlzIGEKKyAgLy8gcHJldHR5IGdvb2QgaGludCB0aGF0IHdlJ3JlIGFjdHVhbGx5IGluIHNvbWUgb3RoZXIgbG9jYWxlIGluIHdoaWNoCisgIC8vICcuJyBpcyBub3QgdGhlIHJhZGl4IGNoYXJhY3Rlci4KKworICBjaGFyKiB0ZW1wX2VuZHB0cjsKKyAgZG91YmxlIHJlc3VsdCA9IHN0cnRvZCh0ZXh0LCAmdGVtcF9lbmRwdHIpOworICBpZiAob3JpZ2luYWxfZW5kcHRyICE9IE5VTEwpICpvcmlnaW5hbF9lbmRwdHIgPSB0ZW1wX2VuZHB0cjsKKyAgaWYgKCp0ZW1wX2VuZHB0ciAhPSAnLicpIHJldHVybiByZXN1bHQ7CisKKyAgLy8gUGFyc2luZyBoYWx0ZWQgb24gYSAnLicuICBQZXJoYXBzIHdlJ3JlIGluIGEgZGlmZmVyZW50IGxvY2FsZT8gIExldCdzCisgIC8vIHRyeSB0byByZXBsYWNlIHRoZSAnLicgd2l0aCBhIGxvY2FsZS1zcGVjaWZpYyByYWRpeCBjaGFyYWN0ZXIgYW5kCisgIC8vIHRyeSBhZ2Fpbi4KKyAgc3RyaW5nIGxvY2FsaXplZCA9IExvY2FsaXplUmFkaXgodGV4dCwgdGVtcF9lbmRwdHIpOworICBjb25zdCBjaGFyKiBsb2NhbGl6ZWRfY3N0ciA9IGxvY2FsaXplZC5jX3N0cigpOworICBjaGFyKiBsb2NhbGl6ZWRfZW5kcHRyOworICByZXN1bHQgPSBzdHJ0b2QobG9jYWxpemVkX2NzdHIsICZsb2NhbGl6ZWRfZW5kcHRyKTsKKyAgaWYgKChsb2NhbGl6ZWRfZW5kcHRyIC0gbG9jYWxpemVkX2NzdHIpID4KKyAgICAgICh0ZW1wX2VuZHB0ciAtIHRleHQpKSB7CisgICAgLy8gVGhpcyBhdHRlbXB0IGdvdCBmdXJ0aGVyLCBzbyByZXBsYWNpbmcgdGhlIGRlY2ltYWwgbXVzdCBoYXZlIGhlbHBlZC4KKyAgICAvLyBVcGRhdGUgb3JpZ2luYWxfZW5kcHRyIHRvIHBvaW50IGF0IHRoZSByaWdodCBsb2NhdGlvbi4KKyAgICBpZiAob3JpZ2luYWxfZW5kcHRyICE9IE5VTEwpIHsKKyAgICAgIC8vIHNpemVfZGlmZiBpcyBub24temVybyBpZiB0aGUgbG9jYWxpemVkIHJhZGl4IGhhcyBtdWx0aXBsZSBieXRlcy4KKyAgICAgIGludCBzaXplX2RpZmYgPSBsb2NhbGl6ZWQuc2l6ZSgpIC0gc3RybGVuKHRleHQpOworICAgICAgLy8gY29uc3RfY2FzdCBpcyBuZWNlc3NhcnkgdG8gbWF0Y2ggdGhlIHN0cnRvZCgpIGludGVyZmFjZS4KKyAgICAgICpvcmlnaW5hbF9lbmRwdHIgPSBjb25zdF9jYXN0PGNoYXIqPigKKyAgICAgICAgdGV4dCArIChsb2NhbGl6ZWRfZW5kcHRyIC0gbG9jYWxpemVkX2NzdHIgLSBzaXplX2RpZmYpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc5YzIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oCkBAIC0wLDAgKzEsNDU3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBmcm9tIGdvb2dsZTMvc3RyaW5ncy9zdHJ1dGlsLmgKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RSVVRJTF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUUlVUSUxfSF9fCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBzdHJ0b2xsICBfc3RydG9pNjQKKyNkZWZpbmUgc3RydG91bGwgX3N0cnRvdWk2NAorI2VsaWYgZGVmaW5lZChfX0RFQ0NYWCkgJiYgZGVmaW5lZChfX29zZl9fKQorLy8gSFAgQysrIG9uIFRydTY0IGRvZXMgbm90IGhhdmUgc3RydG9sbCwgYnV0IHN0cnRvbCBpcyBhbHJlYWR5IDY0LWJpdC4KKyNkZWZpbmUgc3RydG9sbCBzdHJ0b2wKKyNkZWZpbmUgc3RydG91bGwgc3RydG91bAorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGFzY2lpX2lzYWxudW0oKQorLy8gICAgQ2hlY2sgaWYgYW4gQVNDSUkgY2hhcmFjdGVyIGlzIGFscGhhbnVtZXJpYy4gIFdlIGNhbid0IHVzZSBjdHlwZSdzCisvLyAgICBpc2FsbnVtKCkgYmVjYXVzZSBpdCBpcyBhZmZlY3RlZCBieSBsb2NhbGUuICBUaGlzIGZ1bmN0aW9uIGlzIGFwcGxpZWQKKy8vICAgIHRvIGlkZW50aWZpZXJzIGluIHRoZSBwcm90b2NvbCBidWZmZXIgbGFuZ3VhZ2UsIG5vdCB0byBuYXR1cmFsLWxhbmd1YWdlCisvLyAgICBzdHJpbmdzLCBzbyBsb2NhbGUgc2hvdWxkIG5vdCBiZSB0YWtlbiBpbnRvIGFjY291bnQuCisvLyBhc2NpaV9pc2RpZ2l0KCkKKy8vICAgIExpa2UgYWJvdmUsIGJ1dCBvbmx5IGFjY2VwdHMgZGlnaXRzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbmxpbmUgYm9vbCBhc2NpaV9pc2FsbnVtKGNoYXIgYykgeworICByZXR1cm4gKCdhJyA8PSBjICYmIGMgPD0gJ3onKSB8fAorICAgICAgICAgKCdBJyA8PSBjICYmIGMgPD0gJ1onKSB8fAorICAgICAgICAgKCcwJyA8PSBjICYmIGMgPD0gJzknKTsKK30KKworaW5saW5lIGJvb2wgYXNjaWlfaXNkaWdpdChjaGFyIGMpIHsKKyAgcmV0dXJuICgnMCcgPD0gYyAmJiBjIDw9ICc5Jyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhhc1ByZWZpeFN0cmluZygpCisvLyAgICBDaGVjayBpZiBhIHN0cmluZyBiZWdpbnMgd2l0aCBhIGdpdmVuIHByZWZpeC4KKy8vIFN0cmlwUHJlZml4U3RyaW5nKCkKKy8vICAgIEdpdmVuIGEgc3RyaW5nIGFuZCBhIHB1dGF0aXZlIHByZWZpeCwgcmV0dXJucyB0aGUgc3RyaW5nIG1pbnVzIHRoZQorLy8gICAgcHJlZml4IHN0cmluZyBpZiB0aGUgcHJlZml4IG1hdGNoZXMsIG90aGVyd2lzZSB0aGUgb3JpZ2luYWwKKy8vICAgIHN0cmluZy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lubGluZSBib29sIEhhc1ByZWZpeFN0cmluZyhjb25zdCBzdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByZWZpeCkgeworICByZXR1cm4gc3RyLnNpemUoKSA+PSBwcmVmaXguc2l6ZSgpICYmCisgICAgICAgICBzdHIuY29tcGFyZSgwLCBwcmVmaXguc2l6ZSgpLCBwcmVmaXgpID09IDA7Cit9CisKK2lubGluZSBzdHJpbmcgU3RyaXBQcmVmaXhTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIsIGNvbnN0IHN0cmluZyYgcHJlZml4KSB7CisgIGlmIChIYXNQcmVmaXhTdHJpbmcoc3RyLCBwcmVmaXgpKSB7CisgICAgcmV0dXJuIHN0ci5zdWJzdHIocHJlZml4LnNpemUoKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIYXNTdWZmaXhTdHJpbmcoKQorLy8gICAgUmV0dXJuIHRydWUgaWYgc3RyIGVuZHMgaW4gc3VmZml4LgorLy8gU3RyaXBTdWZmaXhTdHJpbmcoKQorLy8gICAgR2l2ZW4gYSBzdHJpbmcgYW5kIGEgcHV0YXRpdmUgc3VmZml4LCByZXR1cm5zIHRoZSBzdHJpbmcgbWludXMgdGhlCisvLyAgICBzdWZmaXggc3RyaW5nIGlmIHRoZSBzdWZmaXggbWF0Y2hlcywgb3RoZXJ3aXNlIHRoZSBvcmlnaW5hbAorLy8gICAgc3RyaW5nLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW5saW5lIGJvb2wgSGFzU3VmZml4U3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3VmZml4KSB7CisgIHJldHVybiBzdHIuc2l6ZSgpID49IHN1ZmZpeC5zaXplKCkgJiYKKyAgICAgICAgIHN0ci5jb21wYXJlKHN0ci5zaXplKCkgLSBzdWZmaXguc2l6ZSgpLCBzdWZmaXguc2l6ZSgpLCBzdWZmaXgpID09IDA7Cit9CisKK2lubGluZSBzdHJpbmcgU3RyaXBTdWZmaXhTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIsIGNvbnN0IHN0cmluZyYgc3VmZml4KSB7CisgIGlmIChIYXNTdWZmaXhTdHJpbmcoc3RyLCBzdWZmaXgpKSB7CisgICAgcmV0dXJuIHN0ci5zdWJzdHIoMCwgc3RyLnNpemUoKSAtIHN1ZmZpeC5zaXplKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBzdHI7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RyaXBTdHJpbmcKKy8vICAgIFJlcGxhY2VzIGFueSBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgJ3JlbW92ZScgKG9yIHRoZSBjaGFyYWN0ZXJzCisvLyAgICBpbiAncmVtb3ZlJykgd2l0aCB0aGUgY2hhcmFjdGVyICdyZXBsYWNld2l0aCcuCisvLyAgICBHb29kIGZvciBrZWVwaW5nIGh0bWwgY2hhcmFjdGVycyBvciBwcm90b2NvbCBjaGFyYWN0ZXJzIChcdCkgb3V0CisvLyAgICBvZiBwbGFjZXMgd2hlcmUgdGhleSBtaWdodCBjYXVzZSBhIHByb2JsZW0uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdHJpcFN0cmluZyhzdHJpbmcqIHMsIGNvbnN0IGNoYXIqIHJlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcmVwbGFjZXdpdGgpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMb3dlclN0cmluZygpCisvLyBVcHBlclN0cmluZygpCisvLyAgICBDb252ZXJ0IHRoZSBjaGFyYWN0ZXJzIGluICJzIiB0byBsb3dlcmNhc2Ugb3IgdXBwZXJjYXNlLiAgQVNDSUktb25seToKKy8vICAgIHRoZXNlIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGlnbm9yZSBsb2NhbGUgYmVjYXVzZSB0aGV5IGFyZSBhcHBsaWVkIHRvCisvLyAgICBpZGVudGlmaWVycyB1c2VkIGluIHRoZSBQcm90b2NvbCBCdWZmZXIgbGFuZ3VhZ2UsIG5vdCB0byBuYXR1cmFsLWxhbmd1YWdlCisvLyAgICBzdHJpbmdzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbmxpbmUgdm9pZCBMb3dlclN0cmluZyhzdHJpbmcgKiBzKSB7CisgIHN0cmluZzo6aXRlcmF0b3IgZW5kID0gcy0+ZW5kKCk7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpID0gcy0+YmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkgeworICAgIC8vIHRvbG93ZXIoKSBjaGFuZ2VzIGJhc2VkIG9uIGxvY2FsZS4gIFdlIGRvbid0IHdhbnQgdGhpcyEKKyAgICBpZiAoJ0EnIDw9ICppICYmICppIDw9ICdaJykgKmkgKz0gJ2EnIC0gJ0EnOworICB9Cit9CisKK2lubGluZSB2b2lkIFVwcGVyU3RyaW5nKHN0cmluZyAqIHMpIHsKKyAgc3RyaW5nOjppdGVyYXRvciBlbmQgPSBzLT5lbmQoKTsKKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGkgPSBzLT5iZWdpbigpOyBpICE9IGVuZDsgKytpKSB7CisgICAgLy8gdG91cHBlcigpIGNoYW5nZXMgYmFzZWQgb24gbG9jYWxlLiAgV2UgZG9uJ3Qgd2FudCB0aGlzIQorICAgIGlmICgnYScgPD0gKmkgJiYgKmkgPD0gJ3onKSAqaSArPSAnQScgLSAnYSc7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RyaW5nUmVwbGFjZSgpCisvLyAgICBHaXZlIG1lIGEgc3RyaW5nIGFuZCB0d28gcGF0dGVybnMgIm9sZCIgYW5kICJuZXciLCBhbmQgSSByZXBsYWNlCisvLyAgICB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgIm9sZCIgaW4gdGhlIHN0cmluZyB3aXRoICJuZXciLCBpZiBpdAorLy8gICAgZXhpc3RzLiAgUkVUVVJOIGEgbmV3IHN0cmluZywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSByZXBsYWNlbWVudAorLy8gICAgaGFwcGVuZWQgb3Igbm90LgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFN0cmluZ1JlcGxhY2UoY29uc3Qgc3RyaW5nJiBzLCBjb25zdCBzdHJpbmcmIG9sZHN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5ld3N1YiwgYm9vbCByZXBsYWNlX2FsbCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNwbGl0U3RyaW5nVXNpbmcoKQorLy8gICAgU3BsaXQgYSBzdHJpbmcgdXNpbmcgYSBjaGFyYWN0ZXIgZGVsaW1pdGVyLiBBcHBlbmQgdGhlIGNvbXBvbmVudHMKKy8vICAgIHRvICdyZXN1bHQnLiAgSWYgdGhlcmUgYXJlIGNvbnNlY3V0aXZlIGRlbGltaXRlcnMsIHRoaXMgZnVuY3Rpb24gc2tpcHMKKy8vICAgIG92ZXIgYWxsIG9mIHRoZW0uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBTcGxpdFN0cmluZ1VzaW5nKGNvbnN0IHN0cmluZyYgZnVsbCwgY29uc3QgY2hhciogZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiByZXMpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBKb2luU3RyaW5ncygpCisvLyAgICBUaGVzZSBtZXRob2RzIGNvbmNhdGVuYXRlIGEgdmVjdG9yIG9mIHN0cmluZ3MgaW50byBhIEMrKyBzdHJpbmcsIHVzaW5nCisvLyAgICB0aGUgQy1zdHJpbmcgImRlbGltIiBhcyBhIHNlcGFyYXRvciBiZXR3ZWVuIGNvbXBvbmVudHMuIFRoZXJlIGFyZSB0d28KKy8vICAgIGZsYXZvcnMgb2YgdGhlIGZ1bmN0aW9uLCBvbmUgZmxhdm9yIHJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcsCisvLyAgICBhbm90aGVyIHRha2VzIGEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IHN0cmluZy4gSW4gdGhlIGxhdHRlciBjYXNlIHRoZQorLy8gICAgdGFyZ2V0IHN0cmluZyBpcyBjbGVhcmVkIGFuZCBvdmVyd3JpdHRlbi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJQlBST1RPQlVGX0VYUE9SVCB2b2lkIEpvaW5TdHJpbmdzKGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVsaW0sIHN0cmluZyogcmVzdWx0KTsKKworaW5saW5lIHN0cmluZyBKb2luU3RyaW5ncyhjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVsaW0pIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgSm9pblN0cmluZ3MoY29tcG9uZW50cywgZGVsaW0sICZyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoKQorLy8gICAgQ29waWVzICJzb3VyY2UiIHRvICJkZXN0IiwgcmV3cml0aW5nIEMtc3R5bGUgZXNjYXBlIHNlcXVlbmNlcworLy8gICAgLS0gJ1xuJywgJ1xyJywgJ1xcJywgJ1xvb28nLCBldGMgLS0gdG8gdGhlaXIgQVNDSUkKKy8vICAgIGVxdWl2YWxlbnRzLiAgImRlc3QiIG11c3QgYmUgc3VmZmljaWVudGx5IGxhcmdlIHRvIGhvbGQgYWxsCisvLyAgICB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmV3cml0dGVuIHN0cmluZyAoaS5lLiBhdCBsZWFzdCBhcyBsYXJnZQorLy8gICAgYXMgc3RybGVuKHNvdXJjZSkgKyAxIHNob3VsZCBiZSBzYWZlLCBzaW5jZSB0aGUgcmVwbGFjZW1lbnRzCisvLyAgICBhcmUgYWx3YXlzIHNob3J0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgZXNjYXBlZCBzZXF1ZW5jZXMpLiAgSXQncworLy8gICAgc2FmZSBmb3Igc291cmNlIGFuZCBkZXN0IHRvIGJlIHRoZSBzYW1lLiAgUkVUVVJOUyB0aGUgbGVuZ3RoCisvLyAgICBvZiBkZXN0LgorLy8KKy8vICAgIEl0IGFsbG93cyBoZXggc2VxdWVuY2VzIFx4aGgsIG9yIGdlbmVyYWxseSBceGhoaGhoIHdpdGggYW4KKy8vICAgIGFyYml0cmFyeSBudW1iZXIgb2YgaGV4IGRpZ2l0cywgYnV0IGFsbCBvZiB0aGVtIHRvZ2V0aGVyIG11c3QKKy8vICAgIHNwZWNpZnkgYSB2YWx1ZSBvZiBhIHNpbmdsZSBieXRlIChlLmcuIFx4MDA0NSBpcyBlcXVpdmFsZW50CisvLyAgICB0byBceDQ1LCBhbmQgXHgxMjM0IGlzIGVycm9uZW91cykuCisvLworLy8gICAgSXQgYWxzbyBhbGxvd3MgZXNjYXBlIHNlcXVlbmNlcyBvZiB0aGUgZm9ybSBcdWhoaGggKGV4YWN0bHkgZm91cgorLy8gICAgaGV4IGRpZ2l0cywgdXBwZXIgb3IgbG93ZXIgY2FzZSkgb3IgXFVoaGhoaGhoaCAoZXhhY3RseSBlaWdodAorLy8gICAgaGV4IGRpZ2l0cywgdXBwZXIgb3IgbG93ZXIgY2FzZSkgdG8gc3BlY2lmeSBhIFVuaWNvZGUgY29kZQorLy8gICAgcG9pbnQuIFRoZSBkZXN0IGFycmF5IHdpbGwgY29udGFpbiB0aGUgVVRGOC1lbmNvZGVkIHZlcnNpb24gb2YKKy8vICAgIHRoYXQgY29kZS1wb2ludCAoZS5nLiwgaWYgc291cmNlIGNvbnRhaW5zIFx1MjAxOSwgdGhlbiBkZXN0IHdpbGwKKy8vICAgIGNvbnRhaW4gdGhlIHRocmVlIGJ5dGVzIDB4RTIsIDB4ODAsIGFuZCAweDk5KS4KKy8vCisvLyAgICBFcnJvcnM6IEluIHRoZSBmaXJzdCBmb3JtIG9mIHRoZSBjYWxsLCBlcnJvcnMgYXJlIHJlcG9ydGVkIHdpdGgKKy8vICAgIExPRyhFUlJPUikuIFRoZSBzYW1lIGlzIHRydWUgZm9yIHRoZSBzZWNvbmQgZm9ybSBvZiB0aGUgY2FsbCBpZgorLy8gICAgdGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB2ZWN0b3IgaXMgTlVMTDsgb3RoZXJ3aXNlLCBlcnJvcgorLy8gICAgbWVzc2FnZXMgYXJlIHN0b3JlZCBpbiB0aGUgdmVjdG9yLiBJbiBlaXRoZXIgY2FzZSwgdGhlIGVmZmVjdCBvbgorLy8gICAgdGhlIGRlc3QgYXJyYXkgaXMgbm90IGRlZmluZWQsIGJ1dCByZXN0IG9mIHRoZSBzb3VyY2Ugd2lsbCBiZQorLy8gICAgcHJvY2Vzc2VkLgorLy8gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSUJQUk9UT0JVRl9FWFBPUlQgaW50IFVuZXNjYXBlQ0VzY2FwZVNlcXVlbmNlcyhjb25zdCBjaGFyKiBzb3VyY2UsIGNoYXIqIGRlc3QpOworTElCUFJPVE9CVUZfRVhQT1JUIGludCBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoY29uc3QgY2hhciogc291cmNlLCBjaGFyKiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4gKmVycm9ycyk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVuZXNjYXBlQ0VzY2FwZVN0cmluZygpCisvLyAgICBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzLCBidXQgY3JlYXRlcworLy8gICAgYSBuZXcgc3RyaW5nLiBUaGUgY2FsbGVyIGRvZXMgbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgYWxsb2NhdGluZworLy8gICAgYSBkZXN0IGJ1ZmZlci4gVGhpcyBzaG91bGQgYmUgdXNlZCBmb3Igbm9uIHBlcmZvcm1hbmNlIGNyaXRpY2FsCisvLyAgICB0YXNrcyBzdWNoIGFzIHByaW50aW5nIGRlYnVnIG1lc3NhZ2VzLiBJdCBpcyBzYWZlIGZvciBzcmMgYW5kIGRlc3QKKy8vICAgIHRvIGJlIHRoZSBzYW1lLgorLy8KKy8vICAgIFRoZSBzZWNvbmQgY2FsbCBzdG9yZXMgaXRzIGVycm9ycyBpbiBhIHN1cHBsaWVkIHN0cmluZyB2ZWN0b3IuCisvLyAgICBJZiB0aGUgc3RyaW5nIHZlY3RvciBwb2ludGVyIGlzIE5VTEwsIGl0IHJlcG9ydHMgdGhlIGVycm9ycyB3aXRoIExPRygpLgorLy8KKy8vICAgIEluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGNhbGxzLCB0aGUgbGVuZ3RoIG9mIGRlc3QgaXMgcmV0dXJuZWQuIEluIHRoZQorLy8gICAgdGhlIHRoaXJkIGNhbGwsIHRoZSBuZXcgc3RyaW5nIGlzIHJldHVybmVkLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSUJQUk9UT0JVRl9FWFBPUlQgaW50IFVuZXNjYXBlQ0VzY2FwZVN0cmluZyhjb25zdCBzdHJpbmcmIHNyYywgc3RyaW5nKiBkZXN0KTsKK0xJQlBST1RPQlVGX0VYUE9SVCBpbnQgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3JjLCBzdHJpbmcqIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiAqZXJyb3JzKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3JjKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ0VzY2FwZVN0cmluZygpCisvLyAgICBDb3BpZXMgJ3NyYycgdG8gJ2Rlc3QnLCBlc2NhcGluZyBkYW5nZXJvdXMgY2hhcmFjdGVycyB1c2luZworLy8gICAgQy1zdHlsZSBlc2NhcGUgc2VxdWVuY2VzLiBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvciBwcmVwYXJpbmcgcXVlcnkKKy8vICAgIGZsYWdzLiAnc3JjJyBhbmQgJ2Rlc3QnIHNob3VsZCBub3Qgb3ZlcmxhcC4KKy8vICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvICdkZXN0JyAobm90IGluY2x1ZGluZyB0aGUgXDApCisvLyAgICBvciAtMSBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IHNwYWNlLgorLy8KKy8vICAgIEN1cnJlbnRseSBvbmx5IFxuLCBcciwgXHQsICIsICcsIFwgYW5kICFpc3ByaW50KCkgY2hhcnMgYXJlIGVzY2FwZWQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMSUJQUk9UT0JVRl9FWFBPUlQgaW50IENFc2NhcGVTdHJpbmcoY29uc3QgY2hhciogc3JjLCBpbnQgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBkZXN0LCBpbnQgZGVzdF9sZW4pOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDRXNjYXBlKCkKKy8vICAgIE1vcmUgY29udmVuaWVudCBmb3JtIG9mIENFc2NhcGVTdHJpbmc6IHJldHVybnMgcmVzdWx0IGFzIGEgInN0cmluZyIuCisvLyAgICBUaGlzIHZlcnNpb24gaXMgc2xvd2VyIHRoYW4gQ0VzY2FwZVN0cmluZygpIGJlY2F1c2UgaXQgZG9lcyBtb3JlCisvLyAgICBhbGxvY2F0aW9uLiAgSG93ZXZlciwgaXQgaXMgbXVjaCBtb3JlIGNvbnZlbmllbnQgdG8gdXNlIGluCisvLyAgICBub24tc3BlZWQtY3JpdGljYWwgY29kZSBsaWtlIGxvZ2dpbmcgbWVzc2FnZXMgZXRjLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBDRXNjYXBlKGNvbnN0IHN0cmluZyYgc3JjKTsKKworbmFtZXNwYWNlIHN0cmluZ3MgeworLy8gTGlrZSBDRXNjYXBlKCkgYnV0IGRvZXMgbm90IGVzY2FwZSBieXRlcyB3aXRoIHRoZSB1cHBlciBiaXQgc2V0LgorTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBVdGY4U2FmZUNFc2NhcGUoY29uc3Qgc3RyaW5nJiBzcmMpOworCisvLyBMaWtlIENFc2NhcGUoKSBidXQgdXNlcyBoZXggKFx4KSBlc2NhcGVzIGluc3RlYWQgb2Ygb2N0YWxzLgorTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBDSGV4RXNjYXBlKGNvbnN0IHN0cmluZyYgc3JjKTsKK30gIC8vIG5hbWVzcGFjZSBzdHJpbmdzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cnRvMzIoKQorLy8gc3RydG91MzIoKQorLy8gc3RydG82NCgpCisvLyBzdHJ0b3U2NCgpCisvLyAgICBBcmNoaXRlY3R1cmUtbmV1dHJhbCBwbHVnIGNvbXBhdGlibGUgcmVwbGFjZW1lbnRzIGZvciBzdHJ0b2woKSBhbmQKKy8vICAgIHN0cnRvdWwoKS4gIExvbmcncyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzIG9uIElMUC0zMiBhbmQgTFAtNjQKKy8vICAgIHBsYXRmb3Jtcywgc28gdXNpbmcgdGhlc2UgaXMgc2FmZXIsIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YKKy8vICAgIG92ZXJmbG93IGJlaGF2aW9yLCB0aGFuIHVzaW5nIHRoZSBzdGFuZGFyZCBsaWJjIGZ1bmN0aW9ucy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJQlBST1RPQlVGX0VYUE9SVCBpbnQzMiBzdHJ0bzMyX2FkYXB0b3IoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2UpOworTElCUFJPVE9CVUZfRVhQT1JUIHVpbnQzMiBzdHJ0b3UzMl9hZGFwdG9yKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2UpOworCitpbmxpbmUgaW50MzIgc3RydG8zMihjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkgeworICBpZiAoc2l6ZW9mKGludDMyKSA9PSBzaXplb2YobG9uZykpCisgICAgcmV0dXJuIHN0cnRvbChucHRyLCBlbmRwdHIsIGJhc2UpOworICBlbHNlCisgICAgcmV0dXJuIHN0cnRvMzJfYWRhcHRvcihucHRyLCBlbmRwdHIsIGJhc2UpOworfQorCitpbmxpbmUgdWludDMyIHN0cnRvdTMyKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CisgIGlmIChzaXplb2YodWludDMyKSA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCisgICAgcmV0dXJuIHN0cnRvdWwobnB0ciwgZW5kcHRyLCBiYXNlKTsKKyAgZWxzZQorICAgIHJldHVybiBzdHJ0b3UzMl9hZGFwdG9yKG5wdHIsIGVuZHB0ciwgYmFzZSk7Cit9CisKKy8vIEZvciBub3csIGxvbmcgbG9uZyBpcyA2NC1iaXQgb24gYWxsIHRoZSBwbGF0Zm9ybXMgd2UgY2FyZSBhYm91dCwgc28gdGhlc2UKKy8vIGZ1bmN0aW9ucyBjYW4gc2ltcGx5IHBhc3MgdGhlIGNhbGwgdG8gc3RydG9bdV1sbC4KK2lubGluZSBpbnQ2NCBzdHJ0bzY0KGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CisgIEdPT0dMRV9DT01QSUxFX0FTU0VSVChzaXplb2YoaW50NjQpID09IHNpemVvZihsb25nIGxvbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mX2ludDY0X2lzX25vdF9zaXplb2ZfbG9uZ19sb25nKTsKKyAgcmV0dXJuIHN0cnRvbGwobnB0ciwgZW5kcHRyLCBiYXNlKTsKK30KKworaW5saW5lIHVpbnQ2NCBzdHJ0b3U2NChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkgeworICBHT09HTEVfQ09NUElMRV9BU1NFUlQoc2l6ZW9mKHVpbnQ2NCkgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZyksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2ZfdWludDY0X2lzX25vdF9zaXplb2ZfbG9uZ19sb25nKTsKKyAgcmV0dXJuIHN0cnRvdWxsKG5wdHIsIGVuZHB0ciwgYmFzZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZhc3RJbnRUb0J1ZmZlcigpCisvLyBGYXN0SGV4VG9CdWZmZXIoKQorLy8gRmFzdEhleDY0VG9CdWZmZXIoKQorLy8gRmFzdEhleDMyVG9CdWZmZXIoKQorLy8gRmFzdFRpbWVUb0J1ZmZlcigpCisvLyAgICBUaGVzZSBhcmUgaW50ZW5kZWQgZm9yIHNwZWVkLiAgRmFzdEludFRvQnVmZmVyKCkgYXNzdW1lcyB0aGUKKy8vICAgIGludGVnZXIgaXMgbm9uLW5lZ2F0aXZlLiAgRmFzdEhleFRvQnVmZmVyKCkgcHV0cyBvdXRwdXQgaW4KKy8vICAgIGhleCByYXRoZXIgdGhhbiBkZWNpbWFsLiAgRmFzdFRpbWVUb0J1ZmZlcigpIHB1dHMgdGhlIG91dHB1dAorLy8gICAgaW50byBSRkM4MjIgZm9ybWF0LgorLy8KKy8vICAgIEZhc3RIZXg2NFRvQnVmZmVyKCkgcHV0cyBhIDY0LWJpdCB1bnNpZ25lZCB2YWx1ZSBpbiBoZXgtZm9ybWF0LAorLy8gICAgcGFkZGVkIHRvIGV4YWN0bHkgMTYgYnl0ZXMgKHBsdXMgb25lIGJ5dGUgZm9yICdcMCcpCisvLworLy8gICAgRmFzdEhleDMyVG9CdWZmZXIoKSBwdXRzIGEgMzItYml0IHVuc2lnbmVkIHZhbHVlIGluIGhleC1mb3JtYXQsCisvLyAgICBwYWRkZWQgdG8gZXhhY3RseSA4IGJ5dGVzIChwbHVzIG9uZSBieXRlIGZvciAnXDAnKQorLy8KKy8vICAgICAgIEFsbCBmdW5jdGlvbnMgdGFrZSB0aGUgb3V0cHV0IGJ1ZmZlciBhcyBhbiBhcmcuCisvLyAgICBUaGV5IGFsbCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCwKKy8vICAgIHdoaWNoIG1heSBub3QgYmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgYnVmZmVyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTdWdnZXN0ZWQgYnVmZmVyIHNpemUgZm9yIEZhc3RUb0J1ZmZlciBmdW5jdGlvbnMuICBBbHNvIHdvcmtzIHdpdGgKKy8vIERvdWJsZVRvQnVmZmVyKCkgYW5kIEZsb2F0VG9CdWZmZXIoKS4KK3N0YXRpYyBjb25zdCBpbnQga0Zhc3RUb0J1ZmZlclNpemUgPSAzMjsKKworTElCUFJPVE9CVUZfRVhQT1JUIGNoYXIqIEZhc3RJbnQzMlRvQnVmZmVyKGludDMyIGksIGNoYXIqIGJ1ZmZlcik7CitMSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdEludDY0VG9CdWZmZXIoaW50NjQgaSwgY2hhciogYnVmZmVyKTsKK2NoYXIqIEZhc3RVSW50MzJUb0J1ZmZlcih1aW50MzIgaSwgY2hhciogYnVmZmVyKTsgIC8vIGlubGluZSBiZWxvdworY2hhciogRmFzdFVJbnQ2NFRvQnVmZmVyKHVpbnQ2NCBpLCBjaGFyKiBidWZmZXIpOyAgLy8gaW5saW5lIGJlbG93CitMSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdEhleFRvQnVmZmVyKGludCBpLCBjaGFyKiBidWZmZXIpOworTElCUFJPVE9CVUZfRVhQT1JUIGNoYXIqIEZhc3RIZXg2NFRvQnVmZmVyKHVpbnQ2NCBpLCBjaGFyKiBidWZmZXIpOworTElCUFJPVE9CVUZfRVhQT1JUIGNoYXIqIEZhc3RIZXgzMlRvQnVmZmVyKHVpbnQzMiBpLCBjaGFyKiBidWZmZXIpOworCisvLyBhdCBsZWFzdCAyMiBieXRlcyBsb25nCitpbmxpbmUgY2hhciogRmFzdEludFRvQnVmZmVyKGludCBpLCBjaGFyKiBidWZmZXIpIHsKKyAgcmV0dXJuIChzaXplb2YoaSkgPT0gNCA/CisgICAgICAgICAgRmFzdEludDMyVG9CdWZmZXIoaSwgYnVmZmVyKSA6IEZhc3RJbnQ2NFRvQnVmZmVyKGksIGJ1ZmZlcikpOworfQoraW5saW5lIGNoYXIqIEZhc3RVSW50VG9CdWZmZXIodW5zaWduZWQgaW50IGksIGNoYXIqIGJ1ZmZlcikgeworICByZXR1cm4gKHNpemVvZihpKSA9PSA0ID8KKyAgICAgICAgICBGYXN0VUludDMyVG9CdWZmZXIoaSwgYnVmZmVyKSA6IEZhc3RVSW50NjRUb0J1ZmZlcihpLCBidWZmZXIpKTsKK30KK2lubGluZSBjaGFyKiBGYXN0TG9uZ1RvQnVmZmVyKGxvbmcgaSwgY2hhciogYnVmZmVyKSB7CisgIHJldHVybiAoc2l6ZW9mKGkpID09IDQgPworICAgICAgICAgIEZhc3RJbnQzMlRvQnVmZmVyKGksIGJ1ZmZlcikgOiBGYXN0SW50NjRUb0J1ZmZlcihpLCBidWZmZXIpKTsKK30KK2lubGluZSBjaGFyKiBGYXN0VUxvbmdUb0J1ZmZlcih1bnNpZ25lZCBsb25nIGksIGNoYXIqIGJ1ZmZlcikgeworICByZXR1cm4gKHNpemVvZihpKSA9PSA0ID8KKyAgICAgICAgICBGYXN0VUludDMyVG9CdWZmZXIoaSwgYnVmZmVyKSA6IEZhc3RVSW50NjRUb0J1ZmZlcihpLCBidWZmZXIpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmFzdEludDMyVG9CdWZmZXJMZWZ0KCkKKy8vIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQoKQorLy8gRmFzdEludDY0VG9CdWZmZXJMZWZ0KCkKKy8vIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQoKQorLy8KKy8vIExpa2UgdGhlIEZhc3QqVG9CdWZmZXIoKSBmdW5jdGlvbnMgYWJvdmUsIHRoZXNlIGFyZSBpbnRlbmRlZCBmb3Igc3BlZWQuCisvLyBVbmxpa2UgdGhlIEZhc3QqVG9CdWZmZXIoKSBmdW5jdGlvbnMsIGhvd2V2ZXIsIHRoZXNlIGZ1bmN0aW9ucyB3cml0ZQorLy8gdGhlaXIgb3V0cHV0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAoaGVuY2UgdGhlIG5hbWUsIGFzIHRoZQorLy8gb3V0cHV0IGlzIGxlZnQtYWxpZ25lZCkuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0CisvLyB0aGUgYnVmZmVyIGhhcyBlbm91Z2ggc3BhY2UgdG8gaG9sZCB0aGUgb3V0cHV0LgorLy8KKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAoaS5lLiB0aGUgbnVsbCBjaGFyYWN0ZXIKKy8vIHRlcm1pbmF0aW5nIHRoZSBzdHJpbmcpLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdEludDMyVG9CdWZmZXJMZWZ0KGludDMyIGksIGNoYXIqIGJ1ZmZlcik7CitMSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdFVJbnQzMlRvQnVmZmVyTGVmdCh1aW50MzIgaSwgY2hhciogYnVmZmVyKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0SW50NjRUb0J1ZmZlckxlZnQoaW50NjQgaSwgY2hhciogYnVmZmVyKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KHVpbnQ2NCBpLCBjaGFyKiBidWZmZXIpOworCisvLyBKdXN0IGRlZmluZSB0aGVzZSBpbiB0ZXJtcyBvZiB0aGUgYWJvdmUuCitpbmxpbmUgY2hhciogRmFzdFVJbnQzMlRvQnVmZmVyKHVpbnQzMiBpLCBjaGFyKiBidWZmZXIpIHsKKyAgRmFzdFVJbnQzMlRvQnVmZmVyTGVmdChpLCBidWZmZXIpOworICByZXR1cm4gYnVmZmVyOworfQoraW5saW5lIGNoYXIqIEZhc3RVSW50NjRUb0J1ZmZlcih1aW50NjQgaSwgY2hhciogYnVmZmVyKSB7CisgIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQoaSwgYnVmZmVyKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlSXRvYSgpCisvLyAgICBEZXNjcmlwdGlvbjogY29udmVydHMgYW4gaW50ZWdlciB0byBhIHN0cmluZy4KKy8vCisvLyAgICBSZXR1cm4gdmFsdWU6IHN0cmluZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTaW1wbGVJdG9hKGludCBpKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU2ltcGxlSXRvYSh1bnNpZ25lZCBpbnQgaSk7CitMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFNpbXBsZUl0b2EobG9uZyBpKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU2ltcGxlSXRvYSh1bnNpZ25lZCBsb25nIGkpOworTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTaW1wbGVJdG9hKGxvbmcgbG9uZyBpKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU2ltcGxlSXRvYSh1bnNpZ25lZCBsb25nIGxvbmcgaSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZUR0b2EoKQorLy8gU2ltcGxlRnRvYSgpCisvLyBEb3VibGVUb0J1ZmZlcigpCisvLyBGbG9hdFRvQnVmZmVyKCkKKy8vICAgIERlc2NyaXB0aW9uOiBjb252ZXJ0cyBhIGRvdWJsZSBvciBmbG9hdCB0byBhIHN0cmluZyB3aGljaCwgaWYKKy8vICAgIHBhc3NlZCB0byBOb0xvY2FsZVN0cnRvZCgpLCB3aWxsIHByb2R1Y2UgdGhlIGV4YWN0IHNhbWUgb3JpZ2luYWwgZG91YmxlCisvLyAgICAoZXhjZXB0IGluIGNhc2Ugb2YgTmFOOyBhbGwgTmFOcyBhcmUgY29uc2lkZXJlZCB0aGUgc2FtZSB2YWx1ZSkuCisvLyAgICBXZSB0cnkgdG8ga2VlcCB0aGUgc3RyaW5nIHNob3J0IGJ1dCBpdCdzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGFzCisvLyAgICBzaG9ydCBhcyBwb3NzaWJsZS4KKy8vCisvLyAgICBEb3VibGVUb0J1ZmZlcigpIGFuZCBGbG9hdFRvQnVmZmVyKCkgd3JpdGUgdGhlIHRleHQgdG8gdGhlIGdpdmVuCisvLyAgICBidWZmZXIgYW5kIHJldHVybiBpdC4gIFRoZSBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdAorLy8gICAga0RvdWJsZVRvQnVmZmVyU2l6ZSBieXRlcyBmb3IgZG91YmxlcyBhbmQga0Zsb2F0VG9CdWZmZXJTaXplCisvLyAgICBieXRlcyBmb3IgZmxvYXRzLiAga0Zhc3RUb0J1ZmZlclNpemUgaXMgYWxzbyBndWFyYW50ZWVkIHRvIGJlIGxhcmdlCisvLyAgICBlbm91Z2ggdG8gaG9sZCBlaXRoZXIuCisvLworLy8gICAgUmV0dXJuIHZhbHVlOiBzdHJpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU2ltcGxlRHRvYShkb3VibGUgdmFsdWUpOworTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTaW1wbGVGdG9hKGZsb2F0IHZhbHVlKTsKKworTElCUFJPVE9CVUZfRVhQT1JUIGNoYXIqIERvdWJsZVRvQnVmZmVyKGRvdWJsZSBpLCBjaGFyKiBidWZmZXIpOworTElCUFJPVE9CVUZfRVhQT1JUIGNoYXIqIEZsb2F0VG9CdWZmZXIoZmxvYXQgaSwgY2hhciogYnVmZmVyKTsKKworLy8gSW4gcHJhY3RpY2UsIGRvdWJsZXMgc2hvdWxkIG5ldmVyIG5lZWQgbW9yZSB0aGFuIDI0IGJ5dGVzIGFuZCBmbG9hdHMKKy8vIHNob3VsZCBuZXZlciBuZWVkIG1vcmUgdGhhbiAxNCAoaW5jbHVkaW5nIG51bGwgdGVybWluYXRvcnMpLCBidXQgd2UKKy8vIG92ZXJlc3RpbWF0ZSB0byBiZSBzYWZlLgorc3RhdGljIGNvbnN0IGludCBrRG91YmxlVG9CdWZmZXJTaXplID0gMzI7CitzdGF0aWMgY29uc3QgaW50IGtGbG9hdFRvQnVmZmVyU2l6ZSA9IDI0OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb0xvY2FsZVN0cnRvZCgpCisvLyAgIEV4YWN0bHkgbGlrZSBzdHJ0b2QoKSwgZXhjZXB0IGl0IGFsd2F5cyBiZWhhdmVzIGFzIGlmIGluIHRoZSAiQyIKKy8vICAgbG9jYWxlIChpLmUuIGRlY2ltYWwgcG9pbnRzIG11c3QgYmUgJy4ncykuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJQlBST1RPQlVGX0VYUE9SVCBkb3VibGUgTm9Mb2NhbGVTdHJ0b2QoY29uc3QgY2hhciogdGV4dCwgY2hhcioqIGVuZHB0cik7CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVFJVVElMX0hfXworCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YzkyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsODMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHsKKworLy8gVE9ETyhrZW50b24pOiAgQ29weSBzdHJ1dGlsIHRlc3RzIGZyb20gZ29vZ2xlMz8KKworVEVTVChTdHJpbmdVdGlsaXR5VGVzdCwgSW1tdW5lVG9Mb2NhbGVzKSB7CisgIC8vIFJlbWVtYmVyIHRoZSBvbGQgbG9jYWxlLgorICBjaGFyKiBvbGRfbG9jYWxlX2NzdHIgPSBzZXRsb2NhbGUoTENfTlVNRVJJQywgTlVMTCk7CisgIEFTU0VSVF9UUlVFKG9sZF9sb2NhbGVfY3N0ciAhPSBOVUxMKTsKKyAgc3RyaW5nIG9sZF9sb2NhbGUgPSBvbGRfbG9jYWxlX2NzdHI7CisKKyAgLy8gU2V0IHRoZSBsb2NhbGUgdG8gIkMiLgorICBBU1NFUlRfVFJVRShzZXRsb2NhbGUoTENfTlVNRVJJQywgIkMiKSAhPSBOVUxMKTsKKworICBFWFBFQ1RfRVEoMS41LCBOb0xvY2FsZVN0cnRvZCgiMS41IiwgTlVMTCkpOworICBFWFBFQ1RfRVEoIjEuNSIsIFNpbXBsZUR0b2EoMS41KSk7CisgIEVYUEVDVF9FUSgiMS41IiwgU2ltcGxlRnRvYSgxLjUpKTsKKworICAvLyBWZXJpZnkgdGhhdCB0aGUgZW5kcHRyIGlzIHNldCBjb3JyZWN0bHkgZXZlbiBpZiBub3QgYWxsIHRleHQgd2FzIHBhcnNlZC4KKyAgY29uc3QgY2hhciogdGV4dCA9ICIxLjVmIjsKKyAgY2hhciogZW5kcHRyOworICBFWFBFQ1RfRVEoMS41LCBOb0xvY2FsZVN0cnRvZCh0ZXh0LCAmZW5kcHRyKSk7CisgIEVYUEVDVF9FUSgzLCBlbmRwdHIgLSB0ZXh0KTsKKworICBpZiAoc2V0bG9jYWxlKExDX05VTUVSSUMsICJlc19FUyIpID09IE5VTEwgJiYKKyAgICAgIHNldGxvY2FsZShMQ19OVU1FUklDLCAiZXNfRVMudXRmOCIpID09IE5VTEwpIHsKKyAgICAvLyBTb21lIHN5c3RlbXMgbWF5IG5vdCBoYXZlIHRoZSBkZXNpcmVkIGxvY2FsZSBhdmFpbGFibGUuCisgICAgR09PR0xFX0xPRyhXQVJOSU5HKQorICAgICAgPDwgIkNvdWxkbid0IHNldCBsb2NhbGUgdG8gZXNfRVMuICBTa2lwcGluZyB0aGlzIHRlc3QuIjsKKyAgfSBlbHNlIHsKKyAgICBFWFBFQ1RfRVEoMS41LCBOb0xvY2FsZVN0cnRvZCgiMS41IiwgTlVMTCkpOworICAgIEVYUEVDVF9FUSgiMS41IiwgU2ltcGxlRHRvYSgxLjUpKTsKKyAgICBFWFBFQ1RfRVEoIjEuNSIsIFNpbXBsZUZ0b2EoMS41KSk7CisgICAgRVhQRUNUX0VRKDEuNSwgTm9Mb2NhbGVTdHJ0b2QodGV4dCwgJmVuZHB0cikpOworICAgIEVYUEVDVF9FUSgzLCBlbmRwdHIgLSB0ZXh0KTsKKyAgfQorCisgIC8vIFJldHVybiB0byBvcmlnaW5hbCBsb2NhbGUuCisgIHNldGxvY2FsZShMQ19OVU1FUklDLCBvbGRfbG9jYWxlLmNfc3RyKCkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NDJhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjCkBAIC0wLDAgKzEsMTM0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLWlubC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2Ugc3RyaW5ncyB7CisKK3VzaW5nIGludGVybmFsOjpTdWJzdGl0dXRlQXJnOworCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJncyBpbiBhcmdfYXJyYXkgd2hpY2ggd2VyZSBwYXNzZWQgZXhwbGljaXRseQorLy8gdG8gU3Vic3RpdHV0ZSgpLgorc3RhdGljIGludCBDb3VudFN1YnN0aXR1dGVBcmdzKGNvbnN0IFN1YnN0aXR1dGVBcmcqIGNvbnN0KiBhcmdzX2FycmF5KSB7CisgIGludCBjb3VudCA9IDA7CisgIHdoaWxlIChhcmdzX2FycmF5W2NvdW50XSAhPSBOVUxMICYmIGFyZ3NfYXJyYXlbY291bnRdLT5zaXplKCkgIT0gLTEpIHsKKyAgICArK2NvdW50OworICB9CisgIHJldHVybiBjb3VudDsKK30KKworc3RyaW5nIFN1YnN0aXR1dGUoCisgICAgY29uc3QgY2hhciogZm9ybWF0LAorICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzAsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzEsCisgICAgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnMiwgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnMywKKyAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc0LCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc1LAorICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzYsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzcsCisgICAgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnOCwgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnOSkgeworICBzdHJpbmcgcmVzdWx0OworICBTdWJzdGl0dXRlQW5kQXBwZW5kKCZyZXN1bHQsIGZvcm1hdCwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzUsIGFyZzYsIGFyZzcsIGFyZzgsIGFyZzkpOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFN1YnN0aXR1dGVBbmRBcHBlbmQoCisgICAgc3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmcwLCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmcxLAorICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzIsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzMsCisgICAgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnNCwgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnNSwKKyAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc2LCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc3LAorICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzgsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzkpIHsKKyAgY29uc3QgU3Vic3RpdHV0ZUFyZyogY29uc3QgYXJnc19hcnJheVtdID0geworICAgICZhcmcwLCAmYXJnMSwgJmFyZzIsICZhcmczLCAmYXJnNCwgJmFyZzUsICZhcmc2LCAmYXJnNywgJmFyZzgsICZhcmc5LCBOVUxMCisgIH07CisKKyAgLy8gRGV0ZXJtaW5lIHRvdGFsIHNpemUgbmVlZGVkLgorICBpbnQgc2l6ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBmb3JtYXRbaV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgaWYgKGZvcm1hdFtpXSA9PSAnJCcpIHsKKyAgICAgIGlmIChhc2NpaV9pc2RpZ2l0KGZvcm1hdFtpKzFdKSkgeworICAgICAgICBpbnQgaW5kZXggPSBmb3JtYXRbaSsxXSAtICcwJzsKKyAgICAgICAgaWYgKGFyZ3NfYXJyYXlbaW5kZXhdLT5zaXplKCkgPT0gLTEpIHsKKyAgICAgICAgICBHT09HTEVfTE9HKERGQVRBTCkKKyAgICAgICAgICAgIDw8ICJzdHJpbmdzOjpTdWJzdGl0dXRlIGZvcm1hdCBzdHJpbmcgaW52YWxpZDogYXNrZWQgZm9yIFwiJCIKKyAgICAgICAgICAgIDw8IGluZGV4IDw8ICJcIiwgYnV0IG9ubHkgIiA8PCBDb3VudFN1YnN0aXR1dGVBcmdzKGFyZ3NfYXJyYXkpCisgICAgICAgICAgICA8PCAiIGFyZ3Mgd2VyZSBnaXZlbi4gIEZ1bGwgZm9ybWF0IHN0cmluZyB3YXM6IFwiIgorICAgICAgICAgICAgPDwgQ0VzY2FwZShmb3JtYXQpIDw8ICJcIi4iOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplICs9IGFyZ3NfYXJyYXlbaW5kZXhdLT5zaXplKCk7CisgICAgICAgICsraTsgIC8vIFNraXAgbmV4dCBjaGFyLgorICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaSsxXSA9PSAnJCcpIHsKKyAgICAgICAgKytzaXplOworICAgICAgICArK2k7ICAvLyBTa2lwIG5leHQgY2hhci4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKQorICAgICAgICAgIDw8ICJJbnZhbGlkIHN0cmluZ3M6OlN1YnN0aXR1dGUoKSBmb3JtYXQgc3RyaW5nOiBcIiIKKyAgICAgICAgICA8PCBDRXNjYXBlKGZvcm1hdCkgPDwgIlwiLiI7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgKytzaXplOworICAgIH0KKyAgfQorCisgIGlmIChzaXplID09IDApIHJldHVybjsKKworICAvLyBCdWlsZCB0aGUgc3RyaW5nLgorICBpbnQgb3JpZ2luYWxfc2l6ZSA9IG91dHB1dC0+c2l6ZSgpOworICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKG91dHB1dCwgb3JpZ2luYWxfc2l6ZSArIHNpemUpOworICBjaGFyKiB0YXJnZXQgPSBzdHJpbmdfYXNfYXJyYXkob3V0cHV0KSArIG9yaWdpbmFsX3NpemU7CisgIGZvciAoaW50IGkgPSAwOyBmb3JtYXRbaV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgaWYgKGZvcm1hdFtpXSA9PSAnJCcpIHsKKyAgICAgIGlmIChhc2NpaV9pc2RpZ2l0KGZvcm1hdFtpKzFdKSkgeworICAgICAgICBjb25zdCBTdWJzdGl0dXRlQXJnKiBzcmMgPSBhcmdzX2FycmF5W2Zvcm1hdFtpKzFdIC0gJzAnXTsKKyAgICAgICAgbWVtY3B5KHRhcmdldCwgc3JjLT5kYXRhKCksIHNyYy0+c2l6ZSgpKTsKKyAgICAgICAgdGFyZ2V0ICs9IHNyYy0+c2l6ZSgpOworICAgICAgICArK2k7ICAvLyBTa2lwIG5leHQgY2hhci4KKyAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2krMV0gPT0gJyQnKSB7CisgICAgICAgICp0YXJnZXQrKyA9ICckJzsKKyAgICAgICAgKytpOyAgLy8gU2tpcCBuZXh0IGNoYXIuCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICp0YXJnZXQrKyA9IGZvcm1hdFtpXTsKKyAgICB9CisgIH0KKworICBHT09HTEVfRENIRUNLX0VRKHRhcmdldCAtIG91dHB1dC0+ZGF0YSgpLCBvdXRwdXQtPnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdHJpbmdzCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTgxNzkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oCkBAIC0wLDAgKzEsMTcwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyBmcm9tIGdvb2dsZTMvc3RyaW5ncy9zdWJzdGl0dXRlLmgKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1VCU1RJVFVURV9IXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1VCU1RJVFVURV9IXworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2Ugc3RyaW5ncyB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0cmluZ3M6OlN1YnN0aXR1dGUoKQorLy8gc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgpCisvLyAgIEtpbmQgb2YgbGlrZSBTdHJpbmdQcmludGYsIGJ1dCBkaWZmZXJlbnQuCisvLworLy8gICBFeGFtcGxlOgorLy8gICAgIHN0cmluZyBHZXRNZXNzYWdlKHN0cmluZyBmaXJzdF9uYW1lLCBzdHJpbmcgbGFzdF9uYW1lLCBpbnQgYWdlKSB7CisvLyAgICAgICByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgiTXkgbmFtZSBpcyAkMCAkMSBhbmQgSSBhbSAkMiB5ZWFycyBvbGQuIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X25hbWUsIGxhc3RfbmFtZSwgYWdlKTsKKy8vICAgICB9CisvLworLy8gICBEaWZmZXJlbmNlcyBmcm9tIFN0cmluZ1ByaW50ZjoKKy8vICAgKiBUaGUgZm9ybWF0IHN0cmluZyBkb2VzIG5vdCBpZGVudGlmeSB0aGUgdHlwZXMgb2YgYXJndW1lbnRzLgorLy8gICAgIEluc3RlYWQsIHRoZSBtYWdpYyBvZiBDKysgZGVhbHMgd2l0aCB0aGlzIGZvciB1cy4gIFNlZSBiZWxvdworLy8gICAgIGZvciBhIGxpc3Qgb2YgYWNjZXB0ZWQgdHlwZXMuCisvLyAgICogU3Vic3RpdHV0aW9ucyBpbiB0aGUgZm9ybWF0IHN0cmluZyBhcmUgaWRlbnRpZmllZCBieSBhICckJworLy8gICAgIGZvbGxvd2VkIGJ5IGEgZGlnaXQuICBTbywgeW91IGNhbiB1c2UgYXJndW1lbnRzIG91dC1vZi1vcmRlciBhbmQKKy8vICAgICB1c2UgdGhlIHNhbWUgYXJndW1lbnQgbXVsdGlwbGUgdGltZXMuCisvLyAgICogSXQncyBtdWNoIGZhc3RlciB0aGFuIFN0cmluZ1ByaW50Zi4KKy8vCisvLyAgIFN1cHBvcnRlZCB0eXBlczoKKy8vICAgKiBTdHJpbmdzIChjb25zdCBjaGFyKiwgY29uc3Qgc3RyaW5nJikKKy8vICAgICAqIE5vdGUgdGhhdCB0aGlzIG1lYW5zIHlvdSBkbyBub3QgaGF2ZSB0byBhZGQgLmNfc3RyKCkgdG8gYWxsIG9mCisvLyAgICAgICB5b3VyIHN0cmluZ3MuICBJbiBmYWN0LCB5b3Ugc2hvdWxkbid0OyBpdCB3aWxsIGJlIHNsb3dlci4KKy8vICAgKiBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0OiAgRm9ybWF0dGVkIHVzaW5nIFNpbXBsZUl0b2EoKS4KKy8vICAgKiBmbG9hdCwgZG91YmxlOiAgRm9ybWF0dGVkIHVzaW5nIFNpbXBsZUZ0b2EoKSBhbmQgU2ltcGxlRHRvYSgpLgorLy8gICAqIGJvb2w6ICBQcmludGVkIGFzICJ0cnVlIiBvciAiZmFsc2UiLgorLy8KKy8vICAgU3Vic3RpdHV0ZUFuZEFwcGVuZCgpIGlzIGxpa2UgU3Vic3RpdHV0ZSgpIGJ1dCBhcHBlbmRzIHRoZSByZXN1bHQgdG8KKy8vICAgKm91dHB1dC4gIEV4YW1wbGU6CisvLworLy8gICAgIHN0cmluZyBzdHI7CisvLyAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmc3RyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk15IG5hbWUgaXMgJDAgJDEgYW5kIEkgYW0gJDIgeWVhcnMgb2xkLiIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9uYW1lLCBsYXN0X25hbWUsIGFnZSk7CisvLworLy8gICBTdWJzdGl0dXRlKCkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBTdHJpbmdQcmludGYoKS4gIEZvciB2ZXJ5CisvLyAgIGxhcmdlIHN0cmluZ3MsIGl0IG1heSBiZSBvcmRlcnMgb2YgbWFnbml0dWRlIGZhc3Rlci4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIGludGVybmFsIHsgIC8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMuCisKK2NsYXNzIFN1YnN0aXR1dGVBcmcgeworIHB1YmxpYzoKKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcoY29uc3QgY2hhciogdmFsdWUpCisgICAgOiB0ZXh0Xyh2YWx1ZSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGNvbnN0IHN0cmluZyYgdmFsdWUpCisgICAgOiB0ZXh0Xyh2YWx1ZS5kYXRhKCkpLCBzaXplXyh2YWx1ZS5zaXplKCkpIHt9CisKKyAgLy8gSW5kaWNhdGVzIHRoYXQgbm8gYXJndW1lbnQgd2FzIGdpdmVuLgorICBpbmxpbmUgZXhwbGljaXQgU3Vic3RpdHV0ZUFyZygpCisgICAgOiB0ZXh0XyhOVUxMKSwgc2l6ZV8oLTEpIHt9CisKKyAgLy8gUHJpbWl0aXZlcworICAvLyBXZSBkb24ndCBvdmVybG9hZCBmb3Igc2lnbmVkIGFuZCB1bnNpZ25lZCBjaGFyIGJlY2F1c2UgaWYgcGVvcGxlIGFyZQorICAvLyBleHBsaWNpdGx5IGRlY2xhcmluZyB0aGVpciBjaGFycyBhcyBzaWduZWQgb3IgdW5zaWduZWQgdGhlbiB0aGV5IGFyZQorICAvLyBwcm9iYWJseSBhY3R1YWxseSB1c2luZyB0aGVtIGFzIDgtYml0IGludGVnZXJzIGFuZCB3b3VsZCBwcm9iYWJseQorICAvLyBwcmVmZXIgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbi4gIEJ1dCwgd2UgZG9uJ3QgcmVhbGx5IGtub3cuICBTbywgd2UKKyAgLy8gbWFrZSB0aGUgY2FsbGVyIGRlY2lkZSB3aGF0IHRvIGRvLgorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyhjaGFyIHZhbHVlKQorICAgIDogdGV4dF8oc2NyYXRjaF8pLCBzaXplXygxKSB7IHNjcmF0Y2hfWzBdID0gdmFsdWU7IH0KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcoc2hvcnQgdmFsdWUpCisgICAgOiB0ZXh0XyhGYXN0SW50MzJUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcodW5zaWduZWQgc2hvcnQgdmFsdWUpCisgICAgOiB0ZXh0XyhGYXN0VUludDMyVG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGludCB2YWx1ZSkKKyAgICA6IHRleHRfKEZhc3RJbnQzMlRvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyh1bnNpZ25lZCBpbnQgdmFsdWUpCisgICAgOiB0ZXh0XyhGYXN0VUludDMyVG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGxvbmcgdmFsdWUpCisgICAgOiB0ZXh0XyhGYXN0TG9uZ1RvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyh1bnNpZ25lZCBsb25nIHZhbHVlKQorICAgIDogdGV4dF8oRmFzdFVMb25nVG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGxvbmcgbG9uZyB2YWx1ZSkKKyAgICA6IHRleHRfKEZhc3RJbnQ2NFRvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQorICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyh1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpCisgICAgOiB0ZXh0XyhGYXN0VUludDY0VG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGZsb2F0IHZhbHVlKQorICAgIDogdGV4dF8oRmxvYXRUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KKyAgaW5saW5lIFN1YnN0aXR1dGVBcmcoZG91YmxlIHZhbHVlKQorICAgIDogdGV4dF8oRG91YmxlVG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9CisgIGlubGluZSBTdWJzdGl0dXRlQXJnKGJvb2wgdmFsdWUpCisgICAgOiB0ZXh0Xyh2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQorCisgIGlubGluZSBjb25zdCBjaGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gdGV4dF87IH0KKyAgaW5saW5lIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKworIHByaXZhdGU6CisgIGNvbnN0IGNoYXIqIHRleHRfOworICBpbnQgc2l6ZV87CisgIGNoYXIgc2NyYXRjaF9ba0Zhc3RUb0J1ZmZlclNpemVdOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK0xJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU3Vic3RpdHV0ZSgKKyAgY29uc3QgY2hhciogZm9ybWF0LAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMCA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmcxID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzIgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMyA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc0ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzUgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnNiA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc3ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzggPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnOSA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCkpOworCitMSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdWJzdGl0dXRlQW5kQXBwZW5kKAorICBzdHJpbmcqIG91dHB1dCwgY29uc3QgY2hhciogZm9ybWF0LAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMCA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmcxID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzIgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMyA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc0ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzUgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnNiA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCisgIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc3ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKKyAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzggPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAorICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnOSA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCkpOworCit9ICAvLyBuYW1lc3BhY2Ugc3RyaW5ncworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAvLyBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1VCU1RJVFVURV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGIzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKQEAgLTAsMCArMSwyODU0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmZGVmIF9XSU4zMgorLy8gVmVyaWZ5IHRoYXQgI2luY2x1ZGluZyB3aW5kb3dzLmggZG9lcyBub3QgYnJlYWsgYW55dGhpbmcgKGUuZy4gYmVjYXVzZQorLy8gd2luZG93cy5oICNkZWZpbmVzIEdldE1lc3NhZ2UoKSBhcyBhIG1hY3JvKS4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKwordm9pZCBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ludDMyICAgKDEwMSk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9pbnQ2NCAgICgxMDIpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfdWludDMyICAoMTAzKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3VpbnQ2NCAgKDEwNCk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zaW50MzIgICgxMDUpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc2ludDY0ICAoMTA2KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ZpeGVkMzIgKDEwNyk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9maXhlZDY0ICgxMDgpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc2ZpeGVkMzIoMTA5KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3NmaXhlZDY0KDExMCk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9mbG9hdCAgICgxMTEpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZG91YmxlICAoMTEyKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2Jvb2wgICAgKHRydWUpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc3RyaW5nICAoIjExNSIpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfYnl0ZXMgICAoIjExNiIpOworCisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxncm91cCAgICAgICAgICAgKCktPnNldF9hKDExNyk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgKCktPnNldF9iYigxMTgpOworICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYygxMTkpOworICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpLT5zZXRfZCgxMjApOworCisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICApOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfaW1wb3J0X2VudW0gKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWik7CisKKyAgLy8gU3RyaW5nUGllY2UgYW5kIENvcmQgZmllbGRzIGFyZSBvbmx5IGFjY2Vzc2libGUgdmlhIHJlZmxlY3Rpb24gaW4gdGhlCisgIC8vIG9wZW4gc291cmNlIHJlbGVhc2U7IHNlZSBjb21tZW50cyBpbiBjb21waWxlci9jcHAvc3RyaW5nX2ZpZWxkLmNjLgorI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0U3RyaW5nKAorICAgIG1lc3NhZ2UsCisgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpLAorICAgICIxMjQiKTsKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRTdHJpbmcoCisgICAgbWVzc2FnZSwKKyAgICBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfY29yZCIpLAorICAgICIxMjUiKTsKKyNlbmRpZiAgLy8gIVBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQzMiAgICgyMDEpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50NjQgICAoMjAyKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQzMiAgKDIwMyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50NjQgICgyMDQpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDMyICAoMjA1KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQ2NCAgKDIwNik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDMyICgyMDcpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQ2NCAoMjA4KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDMyKDIwOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQ2NCgyMTApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZmxvYXQgICAoMjExKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2RvdWJsZSAgKDIxMik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ib29sICAgICh0cnVlKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3N0cmluZyAgKCIyMTUiKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2J5dGVzICAgKCIyMTYiKTsKKworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRncm91cCAgICAgICAgICAgKCktPnNldF9hKDIxNyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoKS0+c2V0X2JiKDIxOCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoMjE5KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgpLT5zZXRfZCgyMjApOworCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X2VudW0gKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUik7CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkFkZFN0cmluZygKKyAgICBtZXNzYWdlLAorICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwKKyAgICAiMjI0Iik7CisgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+QWRkU3RyaW5nKAorICAgIG1lc3NhZ2UsCisgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2NvcmQiKSwKKyAgICAiMjI1Iik7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisKKyAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgorICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50MzIgICAoMzAxKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ludDY0ICAgKDMwMik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50MzIgICgzMDMpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfdWludDY0ICAoMzA0KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQzMiAgKDMwNSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zaW50NjQgICgzMDYpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQzMiAoMzA3KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZpeGVkNjQgKDMwOCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQzMigzMDkpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ZpeGVkNjQoMzEwKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2Zsb2F0ICAgKDMxMSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9kb3VibGUgICgzMTIpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfYm9vbCAgICAoZmFsc2UpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc3RyaW5nICAoIjMxNSIpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfYnl0ZXMgICAoIjMxNiIpOworCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZGdyb3VwICAgICAgICAgICAoKS0+c2V0X2EoMzE3KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgpLT5zZXRfYmIoMzE4KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYygzMTkpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKCktPnNldF9kKDMyMCk7CisKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtICh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVopOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfZW51bSAodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaKTsKKworI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+QWRkU3RyaW5nKAorICAgIG1lc3NhZ2UsCisgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLAorICAgICIzMjQiKTsKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5BZGRTdHJpbmcoCisgICAgbWVzc2FnZSwKKyAgICBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfY29yZCIpLAorICAgICIzMjUiKTsKKyNlbmRpZiAgLy8gIVBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ludDMyICAgKDQwMSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ludDY0ICAgKDQwMik7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3VpbnQzMiAgKDQwMyk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3VpbnQ2NCAgKDQwNCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NpbnQzMiAgKDQwNSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NpbnQ2NCAgKDQwNik7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZpeGVkMzIgKDQwNyk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZpeGVkNjQgKDQwOCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NmaXhlZDMyKDQwOSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NmaXhlZDY0KDQxMCk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2Zsb2F0ICAgKDQxMSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2RvdWJsZSAgKDQxMik7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2Jvb2wgICAgKGZhbHNlKTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfc3RyaW5nICAoIjQxNSIpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9ieXRlcyAgICgiNDE2Iik7CisKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfbmVzdGVkX2VudW0gKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICApOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbXBvcnRfZW51bSAodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfRk9PKTsKKworI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0U3RyaW5nKAorICAgIG1lc3NhZ2UsCisgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoImRlZmF1bHRfc3RyaW5nX3BpZWNlIiksCisgICAgIjQyNCIpOworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFN0cmluZygKKyAgICBtZXNzYWdlLAorICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJkZWZhdWx0X2NvcmQiKSwKKyAgICAiNDI1Iik7CisjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6TW9kaWZ5UmVwZWF0ZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgeworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfaW50MzIgICAoMSwgNTAxKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ludDY0ICAgKDEsIDUwMik7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF91aW50MzIgICgxLCA1MDMpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfdWludDY0ICAoMSwgNTA0KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3NpbnQzMiAgKDEsIDUwNSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zaW50NjQgICgxLCA1MDYpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZml4ZWQzMiAoMSwgNTA3KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ZpeGVkNjQgKDEsIDUwOCk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zZml4ZWQzMigxLCA1MDkpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ZpeGVkNjQoMSwgNTEwKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2Zsb2F0ICAgKDEsIDUxMSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9kb3VibGUgICgxLCA1MTIpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfYm9vbCAgICAoMSwgdHJ1ZSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zdHJpbmcgICgxLCAiNTE1Iik7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9ieXRlcyAgICgxLCAiNTE2Iik7CisKKyAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMSktPnNldF9hKDUxNyk7CisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDEpLT5zZXRfYmIoNTE4KTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSktPnNldF9jKDUxOSk7CisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLT5zZXRfZCg1MjApOworCisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ZvcmVpZ25fZW51bSgxLCB1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICApOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfaW1wb3J0X2VudW0gKDEsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0ZPTyk7CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFJlcGVhdGVkU3RyaW5nKAorICAgIG1lc3NhZ2UsCisgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLAorICAgIDEsICI1MjQiKTsKKyAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRSZXBlYXRlZFN0cmluZygKKyAgICBtZXNzYWdlLAorICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9jb3JkIiksCisgICAgMSwgIjUyNSIpOworI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKSB7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDMyICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDMyICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQ2NCAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZpeGVkMzIgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDY0KCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZG91YmxlICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2Jvb2wgICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxncm91cCAgICAgICAgICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgKCkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxncm91cCAgICAgICAgICAgKCkuaGFzX2EoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgKCkuaGFzX2JiKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLmhhc19jKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpLmhhc19kKCkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9lbnVtICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbXBvcnRfZW51bSAoKSk7CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmdfcGllY2UoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2NvcmQoKSk7CisjZW5kaWYKKworICBFWFBFQ1RfRVEoMTAxICAsIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIgICAoKSk7CisgIEVYUEVDVF9FUSgxMDIgICwgbWVzc2FnZS5vcHRpb25hbF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX0VRKDEwMyAgLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMiAgKCkpOworICBFWFBFQ1RfRVEoMTA0ICAsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDY0ICAoKSk7CisgIEVYUEVDVF9FUSgxMDUgICwgbWVzc2FnZS5vcHRpb25hbF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX0VRKDEwNiAgLCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoMTA3ICAsIG1lc3NhZ2Uub3B0aW9uYWxfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9FUSgxMDggICwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX0VRKDEwOSAgLCBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRVEoMTEwICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9FUSgxMTEgICwgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX0VRKDExMiAgLCBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSAgKCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2Uub3B0aW9uYWxfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9FUSgiMTE1IiwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX0VRKCIxMTYiLCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzICAgKCkpOworCisgIEVYUEVDVF9FUSgxMTcsIG1lc3NhZ2Uub3B0aW9uYWxncm91cCAgICAgICAgICAgKCkuYSgpKTsKKyAgRVhQRUNUX0VRKDExOCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKS5iYigpKTsKKyAgRVhQRUNUX0VRKDExOSwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS5jKCkpOworICBFWFBFQ1RfRVEoMTIwLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpLmQoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKKworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMl9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NF9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbF9zaXplICAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNfc2l6ZSAgICgpKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZGdyb3VwX3NpemUgICAgICAgICAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplICAgICgpKTsKKworI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19waWVjZV9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9jb3JkX3NpemUoKSk7CisjZW5kaWYKKworICBFWFBFQ1RfRVEoMjAxICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIgICAoMCkpOworICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQgICAoMCkpOworICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyICAoMCkpOworICBFWFBFQ1RfRVEoMjA0ICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyICAoMCkpOworICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoMjA3ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMiAoMCkpOworICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCAoMCkpOworICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMCkpOworICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMCkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMCkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMCkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDApLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOworCisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0gKDApKTsKKworICBFWFBFQ1RfRVEoMzAxICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIgICAoMSkpOworICBFWFBFQ1RfRVEoMzAyICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQgICAoMSkpOworICBFWFBFQ1RfRVEoMzAzICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyICAoMSkpOworICBFWFBFQ1RfRVEoMzA0ICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoMzA1ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyICAoMSkpOworICBFWFBFQ1RfRVEoMzA2ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoMzA3ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMiAoMSkpOworICBFWFBFQ1RfRVEoMzA4ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCAoMSkpOworICBFWFBFQ1RfRVEoMzA5ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMSkpOworICBFWFBFQ1RfRVEoMzEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoMzExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMSkpOworICBFWFBFQ1RfRVEoMzEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMSkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMSkpOworICBFWFBFQ1RfRVEoIjMxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMSkpOworICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMSkpOworCisgIEVYUEVDVF9FUSgzMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDEpLmEoKSk7CisgIEVYUEVDVF9FUSgzMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDEpLmJiKCkpOworICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgxKS5jKCkpOworICBFWFBFQ1RfRVEoMzIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS5kKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgxKSk7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50MzIgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50NjQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDMyICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDY0ICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDMyICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQ2NCAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZmxvYXQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZG91YmxlICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKKworCisgIEVYUEVDVF9FUSg0MDEgICwgbWVzc2FnZS5kZWZhdWx0X2ludDMyICAgKCkpOworICBFWFBFQ1RfRVEoNDAyICAsIG1lc3NhZ2UuZGVmYXVsdF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX0VRKDQwMyAgLCBtZXNzYWdlLmRlZmF1bHRfdWludDMyICAoKSk7CisgIEVYUEVDVF9FUSg0MDQgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoNDA1ICAsIG1lc3NhZ2UuZGVmYXVsdF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX0VRKDQwNiAgLCBtZXNzYWdlLmRlZmF1bHRfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9FUSg0MDcgICwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIgKCkpOworICBFWFBFQ1RfRVEoNDA4ICAsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX0VRKDQwOSAgLCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSg0MTAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoNDExICAsIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX0VRKDQxMiAgLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlICAoKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5kZWZhdWx0X2Jvb2wgICAgKCkpOworICBFWFBFQ1RfRVEoIjQxNSIsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX0VRKCI0MTYiLCBtZXNzYWdlLmRlZmF1bHRfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5kZWZhdWx0X25lc3RlZF9lbnVtICgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyAgICAgICwgbWVzc2FnZS5kZWZhdWx0X2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0ZPTywgbWVzc2FnZS5kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpIHsKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50MzIgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQzMiAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDY0ICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NpbnQ2NCAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2RvdWJsZSAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2J5dGVzICAgKCkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbGdyb3VwICAgICAgICAgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAoKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9lbnVtICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nX3BpZWNlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfY29yZCgpKTsKKworICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMiAgICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0ICAgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyICAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQgICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQzMiAgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ICAgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlICAoKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5vcHRpb25hbF9ib29sICAgICgpKTsKKyAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyAgKCkpOworICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMgICAoKSk7CisKKyAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICgpLmhhc19hKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLmhhc19jKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAoKS5oYXNfZCgpKTsKKworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAoKS5hKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKS5iYigpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkuYygpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgKCkuZCgpKTsKKworICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgorICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtICgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyAgICAgICwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08sIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X2VudW0gKCkpOworCisKKyAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRfc2l6ZSAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyX3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyX3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0X3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMl9zaXplICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NF9zaXplICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRfc2l6ZSAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbF9zaXplICAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNfc2l6ZSAgICgpKTsKKworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZGdyb3VwX3NpemUgICAgICAgICAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSAgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplICAgICgpKTsKKworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfY29yZF9zaXplKCkpOworCisgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGFsc28gYmUgZmFsc2UgZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50MzIgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2ludDY0ICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF91aW50MzIgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDY0ICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NpbnQzMiAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zaW50NjQgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2ZpeGVkNjQgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zZml4ZWQzMigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2Zsb2F0ICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9kb3VibGUgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3N0cmluZyAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9ieXRlcyAgICgpKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW1wb3J0X2VudW0gKCkpOworCisKKyAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KKyAgRVhQRUNUX0VRKCA0MSAgICAsIG1lc3NhZ2UuZGVmYXVsdF9pbnQzMiAgICgpKTsKKyAgRVhQRUNUX0VRKCA0MiAgICAsIG1lc3NhZ2UuZGVmYXVsdF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX0VRKCA0MyAgICAsIG1lc3NhZ2UuZGVmYXVsdF91aW50MzIgICgpKTsKKyAgRVhQRUNUX0VRKCA0NCAgICAsIG1lc3NhZ2UuZGVmYXVsdF91aW50NjQgICgpKTsKKyAgRVhQRUNUX0VRKC00NSAgICAsIG1lc3NhZ2UuZGVmYXVsdF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX0VRKCA0NiAgICAsIG1lc3NhZ2UuZGVmYXVsdF9zaW50NjQgICgpKTsKKyAgRVhQRUNUX0VRKCA0NyAgICAsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDMyICgpKTsKKyAgRVhQRUNUX0VRKCA0OCAgICAsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX0VRKCA0OSAgICAsIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKC01MCAgICAsIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0VRKCA1MS41ICAsIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX0VRKCA1MmUzICAsIG1lc3NhZ2UuZGVmYXVsdF9kb3VibGUgICgpKTsKKyAgRVhQRUNUX0VRKHRydWUgICAsIG1lc3NhZ2UuZGVmYXVsdF9ib29sICAgICgpKTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX0VRKCJ3b3JsZCIsIG1lc3NhZ2UuZGVmYXVsdF9ieXRlcyAgICgpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLmRlZmF1bHRfbmVzdGVkX2VudW0gKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLmRlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFSLCBtZXNzYWdlLmRlZmF1bHRfaW1wb3J0X2VudW0gKCkpOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKSB7CisgIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAorICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAorICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfY29yZF9zaXplKCkpOworI2VuZGlmCisKKyAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDApKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDApKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDApKTsKKyAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSAoMCkpOworCisKKyAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCisgIEVYUEVDVF9FUSg1MDEgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMiAgICgxKSk7CisgIEVYUEVDVF9FUSg1MDIgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCAgICgxKSk7CisgIEVYUEVDVF9FUSg1MDMgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSg1MDQgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSg1MDUgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSg1MDYgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSg1MDcgICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyICgxKSk7CisgIEVYUEVDVF9FUSg1MDggICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0ICgxKSk7CisgIEVYUEVDVF9FUSg1MDkgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSg1MTAgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSg1MTEgICwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCAgICgxKSk7CisgIEVYUEVDVF9FUSg1MTIgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUgICgxKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5yZXBlYXRlZF9ib29sICAgICgxKSk7CisgIEVYUEVDVF9FUSgiNTE1IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcgICgxKSk7CisgIEVYUEVDVF9FUSgiNTE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcyAgICgxKSk7CisKKyAgRVhQRUNUX0VRKDUxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMSkuYSgpKTsKKyAgRVhQRUNUX0VRKDUxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMSkuYmIoKSk7CisgIEVYUEVDVF9FUSg1MTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLmMoKSk7CisgIEVYUEVDVF9FUSg1MjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLmQoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fRk9PICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08sIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0gKDEpKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcyh1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfaW50MzIgICAoNjAxKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQ2NCAgICg2MDIpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3VpbnQzMiAgKDYwMyk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDY0ICAoNjA0KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zaW50MzIgICg2MDUpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NpbnQ2NCAgKDYwNik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQzMiAoNjA3KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9maXhlZDY0ICg2MDgpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDMyKDYwOSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ZpeGVkNjQoNjEwKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9mbG9hdCAgICg2MTEpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2RvdWJsZSAgKDYxMik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfYm9vbCAgICAodHJ1ZSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZW51bSAgICAodW5pdHRlc3Q6OkZPUkVJR05fQkFSKTsKKyAgLy8gYWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkCisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfaW50MzIgICAoNzAxKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQ2NCAgICg3MDIpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3VpbnQzMiAgKDcwMyk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDY0ICAoNzA0KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zaW50MzIgICg3MDUpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NpbnQ2NCAgKDcwNik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQzMiAoNzA3KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9maXhlZDY0ICg3MDgpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDMyKDcwOSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ZpeGVkNjQoNzEwKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9mbG9hdCAgICg3MTEpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2RvdWJsZSAgKDcxMik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfYm9vbCAgICAoZmFsc2UpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2VudW0gICAgKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWik7Cit9CisKK3ZvaWQgVGVzdFV0aWw6OlNldFVucGFja2VkRmllbGRzKHVuaXR0ZXN0OjpUZXN0VW5wYWNrZWRUeXBlcyogbWVzc2FnZSkgeworICAvLyBUaGUgdmFsdWVzIGFwcGxpZWQgaGVyZSBtdXN0IG1hdGNoIHRob3NlIG9mIFNldFBhY2tlZEZpZWxkcy4KKworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfaW50MzIgICAoNjAxKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ludDY0ICAgKDYwMik7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF91aW50MzIgICg2MDMpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfdWludDY0ICAoNjA0KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3NpbnQzMiAgKDYwNSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zaW50NjQgICg2MDYpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfZml4ZWQzMiAoNjA3KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ZpeGVkNjQgKDYwOCk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zZml4ZWQzMig2MDkpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfc2ZpeGVkNjQoNjEwKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2Zsb2F0ICAgKDYxMSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9kb3VibGUgICg2MTIpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfYm9vbCAgICAodHJ1ZSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9lbnVtICAgICh1bml0dGVzdDo6Rk9SRUlHTl9CQVIpOworICAvLyBhZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ludDMyICAgKDcwMSk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9pbnQ2NCAgICg3MDIpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfdWludDMyICAoNzAzKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3VpbnQ2NCAgKDcwNCk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zaW50MzIgICg3MDUpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfc2ludDY0ICAoNzA2KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ZpeGVkMzIgKDcwNyk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9maXhlZDY0ICg3MDgpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfc2ZpeGVkMzIoNzA5KTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3NmaXhlZDY0KDcxMCk7CisgIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9mbG9hdCAgICg3MTEpOworICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfZG91YmxlICAoNzEyKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2Jvb2wgICAgKGZhbHNlKTsKKyAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2VudW0gICAgKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6TW9kaWZ5UGFja2VkRmllbGRzKHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9pbnQzMiAgICgxLCA4MDEpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2ludDY0ICAgKDEsIDgwMik7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfdWludDMyICAoMSwgODAzKTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF91aW50NjQgICgxLCA4MDQpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3NpbnQzMiAgKDEsIDgwNSk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfc2ludDY0ICAoMSwgODA2KTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9maXhlZDMyICgxLCA4MDcpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2ZpeGVkNjQgKDEsIDgwOCk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfc2ZpeGVkMzIoMSwgODA5KTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9zZml4ZWQ2NCgxLCA4MTApOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2Zsb2F0ICAgKDEsIDgxMSk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfZG91YmxlICAoMSwgODEyKTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9ib29sICAgICgxLCB0cnVlKTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9lbnVtICAgICgxLCB1bml0dGVzdDo6Rk9SRUlHTl9GT08pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzJiBtZXNzYWdlKSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKKworICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UucGFja2VkX2ludDMyICAgKDApKTsKKyAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCAgICgwKSk7CisgIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5wYWNrZWRfdWludDMyICAoMCkpOworICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLnBhY2tlZF9zaW50MzIgICgwKSk7CisgIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5wYWNrZWRfc2ludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIgKDApKTsKKyAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0ICgwKSk7CisgIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCAgICgwKSk7CisgIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5wYWNrZWRfZG91YmxlICAoMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiwgbWVzc2FnZS5wYWNrZWRfZW51bSgwKSk7CisKKyAgRVhQRUNUX0VRKDcwMSAgLCBtZXNzYWdlLnBhY2tlZF9pbnQzMiAgICgxKSk7CisgIEVYUEVDVF9FUSg3MDIgICwgbWVzc2FnZS5wYWNrZWRfaW50NjQgICAoMSkpOworICBFWFBFQ1RfRVEoNzAzICAsIG1lc3NhZ2UucGFja2VkX3VpbnQzMiAgKDEpKTsKKyAgRVhQRUNUX0VRKDcwNCAgLCBtZXNzYWdlLnBhY2tlZF91aW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSg3MDUgICwgbWVzc2FnZS5wYWNrZWRfc2ludDMyICAoMSkpOworICBFWFBFQ1RfRVEoNzA2ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDcwNyAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyICgxKSk7CisgIEVYUEVDVF9FUSg3MDggICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NCAoMSkpOworICBFWFBFQ1RfRVEoNzA5ICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDcxMCAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSg3MTEgICwgbWVzc2FnZS5wYWNrZWRfZmxvYXQgICAoMSkpOworICBFWFBFQ1RfRVEoNzEyICAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZSAgKDEpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLnBhY2tlZF9ib29sICAgICgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVosIG1lc3NhZ2UucGFja2VkX2VudW0oMSkpOworfQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RVbnBhY2tlZEZpZWxkc1NldCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMmIG1lc3NhZ2UpIHsKKyAgLy8gVGhlIHZhbHVlcyBleHBlY3RlZCBoZXJlIG11c3QgbWF0Y2ggdGhvc2Ugb2YgRXhwZWN0UGFja2VkRmllbGRzU2V0LgorCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2ludDMyX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2ludDY0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3VpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3VpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3NpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2ZpeGVkNjRfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2Zsb2F0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2RvdWJsZV9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2VudW1fc2l6ZSAgICAoKSk7CisKKyAgRVhQRUNUX0VRKDYwMSAgLCBtZXNzYWdlLnVucGFja2VkX2ludDMyICAgKDApKTsKKyAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLnVucGFja2VkX2ludDY0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDYwMyAgLCBtZXNzYWdlLnVucGFja2VkX3VpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNCAgLCBtZXNzYWdlLnVucGFja2VkX3VpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLnVucGFja2VkX3NpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNiAgLCBtZXNzYWdlLnVucGFja2VkX3NpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNyAgLCBtZXNzYWdlLnVucGFja2VkX2ZpeGVkMzIgKDApKTsKKyAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLnVucGFja2VkX2ZpeGVkNjQgKDApKTsKKyAgRVhQRUNUX0VRKDYwOSAgLCBtZXNzYWdlLnVucGFja2VkX3NmaXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDYxMCAgLCBtZXNzYWdlLnVucGFja2VkX3NmaXhlZDY0KDApKTsKKyAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLnVucGFja2VkX2Zsb2F0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDYxMiAgLCBtZXNzYWdlLnVucGFja2VkX2RvdWJsZSAgKDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnVucGFja2VkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiwgbWVzc2FnZS51bnBhY2tlZF9lbnVtKDApKTsKKworICBFWFBFQ1RfRVEoNzAxICAsIG1lc3NhZ2UudW5wYWNrZWRfaW50MzIgICAoMSkpOworICBFWFBFQ1RfRVEoNzAyICAsIG1lc3NhZ2UudW5wYWNrZWRfaW50NjQgICAoMSkpOworICBFWFBFQ1RfRVEoNzAzICAsIG1lc3NhZ2UudW5wYWNrZWRfdWludDMyICAoMSkpOworICBFWFBFQ1RfRVEoNzA0ICAsIG1lc3NhZ2UudW5wYWNrZWRfdWludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoNzA1ICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ludDMyICAoMSkpOworICBFWFBFQ1RfRVEoNzA2ICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoNzA3ICAsIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQzMiAoMSkpOworICBFWFBFQ1RfRVEoNzA4ICAsIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQ2NCAoMSkpOworICBFWFBFQ1RfRVEoNzA5ICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkMzIoMSkpOworICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoNzExICAsIG1lc3NhZ2UudW5wYWNrZWRfZmxvYXQgICAoMSkpOworICBFWFBFQ1RfRVEoNzEyICAsIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlICAoMSkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UudW5wYWNrZWRfYm9vbCAgICAoMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaLCBtZXNzYWdlLnVucGFja2VkX2VudW0oMSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZENsZWFyKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpIHsKKyAgLy8gUGFja2VkIHJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUgICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRGaWVsZHNNb2RpZmllZCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzJiBtZXNzYWdlKSB7CisgIC8vIERvIHRoZSBzYW1lIGZvciBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzLgorICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfaW50MzJfc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2ludDY0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF91aW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfdWludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zaW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMl9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjRfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2Zsb2F0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9kb3VibGVfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfYm9vbF9zaXplICAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2VudW1fc2l6ZSAgICAoKSk7CisKKyAgRVhQRUNUX0VRKDYwMSAgLCBtZXNzYWdlLnBhY2tlZF9pbnQzMiAgICgwKSk7CisgIEVYUEVDVF9FUSg2MDIgICwgbWVzc2FnZS5wYWNrZWRfaW50NjQgICAoMCkpOworICBFWFBFQ1RfRVEoNjAzICAsIG1lc3NhZ2UucGFja2VkX3VpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNCAgLCBtZXNzYWdlLnBhY2tlZF91aW50NjQgICgwKSk7CisgIEVYUEVDVF9FUSg2MDUgICwgbWVzc2FnZS5wYWNrZWRfc2ludDMyICAoMCkpOworICBFWFBFQ1RfRVEoNjA2ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NCAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNyAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyICgwKSk7CisgIEVYUEVDVF9FUSg2MDggICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NCAoMCkpOworICBFWFBFQ1RfRVEoNjA5ICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyKDApKTsKKyAgRVhQRUNUX0VRKDYxMCAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NCgwKSk7CisgIEVYUEVDVF9FUSg2MTEgICwgbWVzc2FnZS5wYWNrZWRfZmxvYXQgICAoMCkpOworICBFWFBFQ1RfRVEoNjEyICAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZSAgKDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnBhY2tlZF9ib29sICAgICgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIsIG1lc3NhZ2UucGFja2VkX2VudW0oMCkpOworICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KKyAgRVhQRUNUX0VRKDgwMSAgLCBtZXNzYWdlLnBhY2tlZF9pbnQzMiAgICgxKSk7CisgIEVYUEVDVF9FUSg4MDIgICwgbWVzc2FnZS5wYWNrZWRfaW50NjQgICAoMSkpOworICBFWFBFQ1RfRVEoODAzICAsIG1lc3NhZ2UucGFja2VkX3VpbnQzMiAgKDEpKTsKKyAgRVhQRUNUX0VRKDgwNCAgLCBtZXNzYWdlLnBhY2tlZF91aW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSg4MDUgICwgbWVzc2FnZS5wYWNrZWRfc2ludDMyICAoMSkpOworICBFWFBFQ1RfRVEoODA2ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDgwNyAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyICgxKSk7CisgIEVYUEVDVF9FUSg4MDggICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NCAoMSkpOworICBFWFBFQ1RfRVEoODA5ICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDgxMCAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSg4MTEgICwgbWVzc2FnZS5wYWNrZWRfZmxvYXQgICAoMSkpOworICBFWFBFQ1RfRVEoODEyICAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZSAgKDEpKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnBhY2tlZF9ib29sICAgICgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08sIG1lc3NhZ2UucGFja2VkX2VudW0oMSkpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBFeHRlbnNpb25zCisvLworLy8gQWxsIHRoaXMgY29kZSBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gdGhlIGFib3ZlIGNvZGUgZXhjZXB0IHRoYXQgaXQncworLy8gbWFuaXB1bGF0aW5nIGV4dGVuc2lvbiBmaWVsZHMgaW5zdGVhZCBvZiBub3JtYWwgb25lcy4KKy8vCisvLyBJIGdhdmUgdXAgb24gdGhlIDgwLWNoYXIgbGltaXQgaGVyZS4gIFNvcnJ5LgorCit2b2lkIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZSkgeworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgICwgMTAxKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24gICAsIDEwMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbiAgLCAxMDMpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24gICwgMTA0KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uICAsIDEwNSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbiAgLCAxMDYpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMTA3KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbiAsIDEwOCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxMDkpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbiwgMTEwKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb24gICAsIDExMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbiAgLCAxMTIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uICAgICwgdHJ1ZSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiAgLCAiMTE1Iik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uICAgLCAiMTE2Iik7CisKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24gICAgICAgICAgICktPnNldF9hKDExNyk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApLT5zZXRfYmIoMTE4KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiktPnNldF9jKDExOSk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLT5zZXRfZCgxMjApOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCB1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWik7CisKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAiMTI0Iik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfY29yZF9leHRlbnNpb24sICIxMjUiKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAyMDEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMjAyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDIwMyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAyMDQpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMjA1KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDIwNik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAyMDcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMjA4KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDIwOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAyMTApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMjExKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDIxMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCB0cnVlKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAsICIyMTUiKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsICIyMTYiKTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICApLT5zZXRfYSgyMTcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApLT5zZXRfYmIoMjE4KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKS0+c2V0X2MoMjE5KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKS0+c2V0X2QoMjIwKTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgdW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIpOworCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgIjIyNCIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAiMjI1Iik7CisKKyAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgorICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICwgMzAxKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICAsIDMwMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgLCAzMDMpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICwgMzA0KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDMwNSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAzMDYpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMzA3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDMwOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAzMDkpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMzEwKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAsIDMxMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAzMTIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgZmFsc2UpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgIjMxNSIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICwgIjMxNiIpOworCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICktPnNldF9hKDMxNyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICktPnNldF9iYigzMTgpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLT5zZXRfYygzMTkpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLT5zZXRfZCgzMjApOworCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCB1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWik7CisKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAiMzI0Iik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sICIzMjUiKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb24gICAsIDQwMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb24gICAsIDQwMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uICAsIDQwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uICAsIDQwNCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uICAsIDQwNSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uICAsIDQwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbiAsIDQwNyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbiAsIDQwOCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb24sIDQwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24sIDQxMCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb24gICAsIDQxMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uICAsIDQxMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICAsIGZhbHNlKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19leHRlbnNpb24gICwgIjQxNSIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uICAgLCAiNDE2Iik7CisKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCB1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICwgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfRk9PKTsKKworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgIjQyNCIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfY29yZF9leHRlbnNpb24sICI0MjUiKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKAorICAgIHVuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3MqIG1lc3NhZ2UpIHsKKyAgR09PR0xFX0NIRUNLKG1lc3NhZ2UpOworICBtZXNzYWdlLT5zZXRfbXlfaW50KDEpOworICBtZXNzYWdlLT5zZXRfbXlfc3RyaW5nKCJmb28iKTsKKyAgbWVzc2FnZS0+c2V0X215X2Zsb2F0KDEuMCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6bXlfZXh0ZW5zaW9uX2ludCwgMjMpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om15X2V4dGVuc2lvbl9zdHJpbmcsICJiYXIiKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsOjpNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxLCA1MDEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMSwgNTAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEsIDUwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxLCA1MDQpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMSwgNTA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEsIDUwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxLCA1MDcpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSwgNTA4KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEsIDUwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxLCA1MTApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSwgNTExKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEsIDUxMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAxLCB0cnVlKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAsIDEsICI1MTUiKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDEsICI1MTYiKTsKKworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgLCAxKS0+c2V0X2EoNTE3KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMSktPnNldF9iYig1MTgpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAxKS0+c2V0X2MoNTE5KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMSktPnNldF9kKDUyMCk7CisKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCAxLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08pOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDEsIHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyAgICAgICk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICwgMSwgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfRk9PKTsKKworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sIDEsICI1MjQiKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiwgMSwgIjUyNSIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKSB7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb24gICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24gICAgICAgICAgICkuaGFzX2EoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKS5oYXNfYygpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLmhhc19kKCkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb24gKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKDEwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9FUSgxMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoMTAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDEwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgxMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMTA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDEwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSgxMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEoMTA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDExMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgxMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoMTEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb24gICAgKSk7CisgIEVYUEVDVF9FUSgiMTE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoIjExNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ieXRlc19leHRlbnNpb24gICApKTsKKworICBFWFBFQ1RfRVEoMTE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24gICAgICAgICAgICkuYSgpKTsKKyAgRVhQRUNUX0VRKDExOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApLmJiKCkpOworICBFWFBFQ1RfRVEoMTE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikuYygpKTsKKyAgRVhQRUNUX0VRKDEyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLmQoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiApKTsKKworICBFWFBFQ1RfRVEoIjEyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgiMTI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAgICApKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSgyMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMCkpOworICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmQoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKKworICBFWFBFQ1RfRVEoIjIyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgiMjI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAwKSk7CisKKyAgRVhQRUNUX0VRKDMwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoMzAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSgzMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoMzA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxKSk7CisgIEVYUEVDVF9FUSgzMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSkpOworICBFWFBFQ1RfRVEoMzA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDMxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgzMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoMzEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7CisgIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDEpKTsKKworICBFWFBFQ1RfRVEoMzE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMSkuYSgpKTsKKyAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmJiKCkpOworICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMSkuYygpKTsKKyAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmQoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIDEpKTsKKworICBFWFBFQ1RfRVEoIjMyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgiMzI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAxKSk7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb24gICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb24gICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbiAgICkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb24gKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9jb3JkX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9FUSg0MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9FUSg0MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9FUSg0MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSg0MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSg0MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSg0MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSg0MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSg0MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSg0MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSg0MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSg0MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9FUSg0MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYm9vbF9leHRlbnNpb24gICAgKSk7CisgIEVYUEVDVF9FUSgiNDE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgiNDE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fRk9PICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08sIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbiApKTsKKworICBFWFBFQ1RfRVEoIjQyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKCI0MjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9jb3JkX2V4dGVuc2lvbikpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcigKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKKyAgc3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKyAgRVhQRUNUX0VRKCIiLCBzZXJpYWxpemVkKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuQnl0ZVNpemUoKSk7CisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbiAgICkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24gICAgICAgICAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb24gKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfY29yZF9leHRlbnNpb24pKTsKKworICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24gICAgICAgICAgICkuaGFzX2EoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICkuaGFzX2JiKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLmhhc19jKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLmhhc19kKCkpOworCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24gICAgICAgICAgICkuYSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKS5iYigpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKS5jKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLmQoKSk7CisKKyAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0ZPTywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiApKTsKKworICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgiIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICApKTsKKworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gICAgKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbikpOworCisgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGFsc28gYmUgZmFsc2UgZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb24gICApKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9jb3JkX2V4dGVuc2lvbikpOworCisgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCisgIEVYUEVDVF9FUSggNDEgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKCA0MiAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDY0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoIDQzICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSggNDQgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKC00NSAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQzMl9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoIDQ2ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSggNDcgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKCA0OCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEoIDQ5ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgtNTAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKCA1MS41ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbiAgICkpOworICBFWFBFQ1RfRVEoIDUyZTMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSh0cnVlICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoIndvcmxkIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbiApKTsKKworICBFWFBFQ1RfRVEoImFiYyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKCIxMjMiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9jb3JkX2V4dGVuc2lvbikpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSkgeworICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gKKyAgLy8gZmllbGQuICBJbiBhZGRpdGlvbiB0byB2ZXJpZnlpbmcgdGhpcywgd2UgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QKKyAgLy8gZWxlbWVudCBhbmQgc2l6ZSB3ZXJlICpub3QqIG1vZGlmaWVkLgorICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAgICApKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSgyMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMCkpOworICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgyMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmQoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKKworICBFWFBFQ1RfRVEoIjIyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgiMjI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAwKSk7CisKKyAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCisgIEVYUEVDVF9FUSg1MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoNTAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoNTA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSg1MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMSkpOworICBFWFBFQ1RfRVEoNTA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg1MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNTExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMSkpOworICBFWFBFQ1RfRVEoIjUxNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKCI1MTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgLCAxKSk7CisKKyAgRVhQRUNUX0VRKDUxNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICAsIDEpLmEoKSk7CisgIEVYUEVDVF9FUSg1MTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gLCAxKS5iYigpKTsKKyAgRVhQRUNUX0VRKDUxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDEpLmMoKSk7CisgIEVYUEVDVF9FUSg1MjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gLCAxKS5kKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCAxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08sIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gLCAxKSk7CisKKyAgRVhQRUNUX0VRKCI1MjQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoIjUyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiwgMSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OlNldFBhY2tlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICwgNjAxKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgLCA2MDIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAsIDYwMyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICwgNjA0KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgLCA2MDUpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDYwNik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgNjA3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gLCA2MDgpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24sIDYwOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgNjEwKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCA2MTEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDYxMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgdHJ1ZSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uLCB1bml0dGVzdDo6Rk9SRUlHTl9CQVIpOworICAvLyBhZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgLCA3MDEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAsIDcwMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24gICwgNzAzKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgLCA3MDQpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDcwNSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICwgNzA2KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gLCA3MDcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDcwOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgNzA5KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCA3MTApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAsIDcxMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24gICwgNzEyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgLCBmYWxzZSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uLCB1bml0dGVzdDo6Rk9SRUlHTl9CQVopOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6Ok1vZGlmeVBhY2tlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICwgMSwgODAxKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAxLCA4MDIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEsIDgwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICwgMSwgODA0KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAxLCA4MDUpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEsIDgwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMSwgODA3KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAxLCA4MDgpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEsIDgwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMSwgODEwKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAxLCA4MTEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEsIDgxMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMSwgdHJ1ZSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uICAgICwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb24gICAgKSk7CisKKyAgRVhQRUNUX0VRKDYwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoNjAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoNjA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMCkpOworICBFWFBFQ1RfRVEoNjA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNzAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxKSk7CisgIEVYUEVDVF9FUSg3MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoNzA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSg3MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoNzA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxKSk7CisgIEVYUEVDVF9FUSg3MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMSkpOworICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg3MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVosCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uLCAxKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc0NsZWFyKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyYgbWVzc2FnZSkgeworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24gICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zJiBtZXNzYWdlKSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uICAgICkpOworICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSg2MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDApKTsKKyAgRVhQRUNUX0VRKDYwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSg2MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAsIDApKTsKKyAgRVhQRUNUX0VRKDYxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgLCAwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uLCAwKSk7CisKKyAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCisgIEVYUEVDVF9FUSg4MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICAsIDEpKTsKKyAgRVhQRUNUX0VRKDgwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoODAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSg4MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDgwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoODA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSg4MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDEpKTsKKyAgRVhQRUNUX0VRKDgwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSkpOworICBFWFBFQ1RfRVEoODA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg4MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDgxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoODEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAsIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTywKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb24sIDEpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNBbmRFeHRlbnNpb25zSW5PcmRlcihjb25zdCBzdHJpbmcmIHNlcmlhbGl6ZWQpIHsKKyAgLy8gV2Ugc2V0IGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5LCBzZXJpYWxpemUgc2VwYXJhdGVseSwgYW5kIGNvbmNhdGVuYXRlIGFsbAorICAvLyB0aGUgc3RyaW5ncyBpbiBjYW5vbmljYWwgb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBzZXJpYWxpemF0aW9uLgorICBzdHJpbmcgZXhwZWN0ZWQ7CisgIHVuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3MgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfbXlfaW50KDEpOyAgLy8gRmllbGQgMS4KKyAgbWVzc2FnZS5BcHBlbmRUb1N0cmluZygmZXhwZWN0ZWQpOworICBtZXNzYWdlLkNsZWFyKCk7CisgIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpteV9leHRlbnNpb25faW50LCAyMyk7ICAvLyBGaWVsZCA1LgorICBtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZleHBlY3RlZCk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgbWVzc2FnZS5zZXRfbXlfc3RyaW5nKCJmb28iKTsgIC8vIEZpZWxkIDExLgorICBtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZleHBlY3RlZCk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om15X2V4dGVuc2lvbl9zdHJpbmcsICJiYXIiKTsgIC8vIEZpZWxkIDUwLgorICBtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZleHBlY3RlZCk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgbWVzc2FnZS5zZXRfbXlfZmxvYXQoMS4wKTsgIC8vIEZpZWxkIDEwMS4KKyAgbWVzc2FnZS5BcHBlbmRUb1N0cmluZygmZXhwZWN0ZWQpOworICBtZXNzYWdlLkNsZWFyKCk7CisKKyAgLy8gV2UgZG9uJ3QgRVhQRUNUX0VRKCkgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBwcmludCByYXcgYnl0ZXMgdG8gc3Rkb3V0LgorICBFWFBFQ1RfVFJVRShzZXJpYWxpemVkID09IGV4cGVjdGVkKTsKK30KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0TGFzdFJlcGVhdGVkc1JlbW92ZWQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyX3NpemUgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0X3NpemUgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMl9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NF9zaXplKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc19zaXplICAgKCkpOworCisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSAgICAgICAgICAgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOworCisjaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX3NpemUoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2NvcmRfc2l6ZSgpKTsKKyNlbmRpZgorCisgIC8vIFRlc3QgdGhhdCB0aGUgcmVtYWluaW5nIGVsZW1lbnQgaXMgdGhlIGNvcnJlY3Qgb25lLgorICBFWFBFQ1RfRVEoMjAxICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIgICAoMCkpOworICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQgICAoMCkpOworICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyICAoMCkpOworICBFWFBFQ1RfRVEoMjA0ICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyICAoMCkpOworICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoMjA3ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMiAoMCkpOworICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCAoMCkpOworICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMCkpOworICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMCkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMCkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMCkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDApLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgwKSk7Cit9CisKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZEV4dGVuc2lvbnNSZW1vdmVkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSkgeworCisgIC8vIFRlc3QgdGhhdCBvbmUgZWxlbWVudCB3YXMgcmVtb3ZlZC4KKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICApKTsKKworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiAgICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gICAgKSk7CisKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbikpOworCisgIC8vIFRlc3QgdGhhdCB0aGUgcmVtYWluaW5nIGVsZW1lbnQgaXMgdGhlIGNvcnJlY3Qgb25lLgorICBFWFBFQ1RfRVEoMjAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoMjA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoMjA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDApKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSgyMDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSgyMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICwgMCkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgLCAwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuZCgpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFSLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICwgMCkpOworCisgIEVYUEVDVF9FUSgiMjI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKCIyMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sIDApKTsKK30KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRzU3dhcHBlZCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKSB7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7CisKKyNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfY29yZF9zaXplKCkpOworI2VuZGlmCisKKyAgLy8gVGVzdCB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGFuZCBzZWNvbmQgZWxlbWVudCBhcmUgZmxpcHBlZC4KKyAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDEpKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDEpKTsKKyAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDEpKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDEpKTsKKyAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDEpKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDEpKTsKKyAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDEpKTsKKyAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDEpKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDEpKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDEpKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDEpKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgxKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgxKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMSkuZCgpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSAoMSkpOworCisgIEVYUEVDVF9FUSgzMDEgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMiAgICgwKSk7CisgIEVYUEVDVF9FUSgzMDIgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCAgICgwKSk7CisgIEVYUEVDVF9FUSgzMDMgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIgICgwKSk7CisgIEVYUEVDVF9FUSgzMDQgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQgICgwKSk7CisgIEVYUEVDVF9FUSgzMDUgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIgICgwKSk7CisgIEVYUEVDVF9FUSgzMDYgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQgICgwKSk7CisgIEVYUEVDVF9FUSgzMDcgICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyICgwKSk7CisgIEVYUEVDVF9FUSgzMDggICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0ICgwKSk7CisgIEVYUEVDVF9FUSgzMDkgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSgzMTAgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgwKSk7CisgIEVYUEVDVF9FUSgzMTEgICwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCAgICgwKSk7CisgIEVYUEVDVF9FUSgzMTIgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUgICgwKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5yZXBlYXRlZF9ib29sICAgICgwKSk7CisgIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcgICgwKSk7CisgIEVYUEVDVF9FUSgiMzE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcyAgICgwKSk7CisKKyAgRVhQRUNUX0VRKDMxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgzMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApLmMoKSk7CisgIEVYUEVDVF9FUSgzMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDApLmQoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVosIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0gKDApKTsKK30KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zU3dhcHBlZCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAgICApKTsKKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxKSk7CisgIEVYUEVDVF9FUSgyMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSgyMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxKSk7CisgIEVYUEVDVF9FUSgyMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSkpOworICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgyMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7CisgIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDEpKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMSkuYSgpKTsKKyAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMSkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmQoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIDEpKTsKKworICBFWFBFQ1RfRVEoIjIyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSgiMjI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAxKSk7CisKKyAgRVhQRUNUX0VRKDMwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSgzMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoMzAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDMwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSgzMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoMzA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDMwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSgzMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMCkpOworICBFWFBFQ1RfRVEoMzA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDMxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgzMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoMzEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAwKSk7CisgIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDApKTsKKworICBFWFBFQ1RfRVEoMzE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMCkuYSgpKTsKKyAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmJiKCkpOworICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMCkuYygpKTsKKyAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmQoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKKworICBFWFBFQ1RfRVEoIjMyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSgiMzI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAwKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlJlZmxlY3Rpb25UZXN0ZXIoCisgICAgY29uc3QgRGVzY3JpcHRvciogYmFzZV9kZXNjcmlwdG9yKQorICA6IGJhc2VfZGVzY3JpcHRvcl8oYmFzZV9kZXNjcmlwdG9yKSB7CisKKyAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wgPSBiYXNlX2Rlc2NyaXB0b3ItPmZpbGUoKS0+cG9vbCgpOworCisgIG5lc3RlZF9iXyA9CisgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5iYiIpOworICBmb3JlaWduX2NfID0KKyAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25NZXNzYWdlLmMiKTsKKyAgaW1wb3J0X2RfID0KKyAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlLmQiKTsKKyAgbmVzdGVkX2Zvb18gPQorICAgIHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5GT08iKTsKKyAgbmVzdGVkX2Jhcl8gPQorICAgIHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5CQVIiKTsKKyAgbmVzdGVkX2Jhel8gPQorICAgIHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5CQVoiKTsKKyAgZm9yZWlnbl9mb29fID0KKyAgICBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5GT1JFSUdOX0ZPTyIpOworICBmb3JlaWduX2Jhcl8gPQorICAgIHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LkZPUkVJR05fQkFSIik7CisgIGZvcmVpZ25fYmF6XyA9CisgICAgcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuRk9SRUlHTl9CQVoiKTsKKyAgaW1wb3J0X2Zvb18gPQorICAgIHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JTVBPUlRfRk9PIik7CisgIGltcG9ydF9iYXJfID0KKyAgICBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSU1QT1JUX0JBUiIpOworICBpbXBvcnRfYmF6XyA9CisgICAgcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LklNUE9SVF9CQVoiKTsKKworICBpZiAoYmFzZV9kZXNjcmlwdG9yXy0+bmFtZSgpID09ICJUZXN0QWxsRXh0ZW5zaW9ucyIpIHsKKyAgICBncm91cF9hXyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0Lk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLmEiKTsKKyAgICByZXBlYXRlZF9ncm91cF9hXyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uLmEiKTsKKyAgfSBlbHNlIHsKKyAgICBncm91cF9hXyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwLmEiKTsKKyAgICByZXBlYXRlZF9ncm91cF9hXyA9CisgICAgICBwb29sLT5GaW5kRmllbGRCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLmEiKTsKKyAgfQorCisgIEVYUEVDVF9UUlVFKGdyb3VwX2FfICAgICAgICAgICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShyZXBlYXRlZF9ncm91cF9hXyAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobmVzdGVkX2JfICAgICAgICAgIT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZvcmVpZ25fY18gICAgICAgICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShpbXBvcnRfZF8gICAgICAgICAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUobmVzdGVkX2Zvb18gICAgICAgIT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG5lc3RlZF9iYXJfICAgICAgICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShuZXN0ZWRfYmF6XyAgICAgICAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoZm9yZWlnbl9mb29fICAgICAgIT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGZvcmVpZ25fYmFyXyAgICAgICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShmb3JlaWduX2Jhel8gICAgICAhPSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUoaW1wb3J0X2Zvb18gICAgICAgIT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKGltcG9ydF9iYXJfICAgICAgICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShpbXBvcnRfYmF6XyAgICAgICAhPSBOVUxMKTsKK30KKworLy8gU2hvcnRoYW5kIHRvIGdldCBhIEZpZWxkRGVzY3JpcHRvciBmb3IgYSBmaWVsZCBvZiB1bml0dGVzdDo6VGVzdEFsbFR5cGVzLgorY29uc3QgRmllbGREZXNjcmlwdG9yKiBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Rihjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPSBOVUxMOworICBpZiAoYmFzZV9kZXNjcmlwdG9yXy0+bmFtZSgpID09ICJUZXN0QWxsRXh0ZW5zaW9ucyIgfHwKKyAgICAgIGJhc2VfZGVzY3JpcHRvcl8tPm5hbWUoKSA9PSAiVGVzdFBhY2tlZEV4dGVuc2lvbnMiKSB7CisgICAgcmVzdWx0ID0gYmFzZV9kZXNjcmlwdG9yXy0+ZmlsZSgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKG5hbWUgKyAiX2V4dGVuc2lvbiIpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IGJhc2VfZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKKyAgfQorICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IE5VTEwpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICBNZXNzYWdlKiBzdWJfbWVzc2FnZTsKKworICByZWZsZWN0aW9uLT5TZXRJbnQzMiAobWVzc2FnZSwgRigib3B0aW9uYWxfaW50MzIiICAgKSwgMTAxKTsKKyAgcmVmbGVjdGlvbi0+U2V0SW50NjQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDY0IiAgICksIDEwMik7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50MzIiICApLCAxMDMpOworICByZWZsZWN0aW9uLT5TZXRVSW50NjQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDY0IiAgKSwgMTA0KTsKKyAgcmVmbGVjdGlvbi0+U2V0SW50MzIgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQzMiIgICksIDEwNSk7CisgIHJlZmxlY3Rpb24tPlNldEludDY0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50NjQiICApLCAxMDYpOworICByZWZsZWN0aW9uLT5TZXRVSW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQzMiIgKSwgMTA3KTsKKyAgcmVmbGVjdGlvbi0+U2V0VUludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZpeGVkNjQiICksIDEwOCk7CisgIHJlZmxlY3Rpb24tPlNldEludDMyIChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQzMiIpLCAxMDkpOworICByZWZsZWN0aW9uLT5TZXRJbnQ2NCAobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkNjQiKSwgMTEwKTsKKyAgcmVmbGVjdGlvbi0+U2V0RmxvYXQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Zsb2F0IiAgICksIDExMSk7CisgIHJlZmxlY3Rpb24tPlNldERvdWJsZShtZXNzYWdlLCBGKCJvcHRpb25hbF9kb3VibGUiICApLCAxMTIpOworICByZWZsZWN0aW9uLT5TZXRCb29sICAobWVzc2FnZSwgRigib3B0aW9uYWxfYm9vbCIgICAgKSwgdHJ1ZSk7CisgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciICApLCAiMTE1Iik7CisgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9ieXRlcyIgICApLCAiMTE2Iik7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgZ3JvdXBfYV8sIDExNyk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDExOCk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXywgMTE5KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIGltcG9ydF9kXywgMTIwKTsKKworICByZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApLCAgbmVzdGVkX2Jhel8pOworICByZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpLCBmb3JlaWduX2Jhel8pOworICByZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiApLCAgaW1wb3J0X2Jhel8pOworCisgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSwgIjEyNCIpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfY29yZCIpLCAiMTI1Iik7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50MzIiICAgKSwgMjAxKTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDY0IiAgICksIDIwMik7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50MzIiICApLCAyMDMpOworICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDY0IiAgKSwgMjA0KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQzMiIgICksIDIwNSk7CisgIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50NjQiICApLCAyMDYpOworICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQzMiIgKSwgMjA3KTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDIwOCk7CisgIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAyMDkpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMjEwKTsKKyAgcmVmbGVjdGlvbi0+QWRkRmxvYXQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDIxMSk7CisgIHJlZmxlY3Rpb24tPkFkZERvdWJsZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9kb3VibGUiICApLCAyMTIpOworICByZWZsZWN0aW9uLT5BZGRCb29sICAobWVzc2FnZSwgRigicmVwZWF0ZWRfYm9vbCIgICAgKSwgdHJ1ZSk7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApLCAiMjE1Iik7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9ieXRlcyIgICApLCAiMjE2Iik7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCByZXBlYXRlZF9ncm91cF9hXywgMjE3KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbmVzdGVkX2JfLCAyMTgpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXywgMjE5KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgaW1wb3J0X2RfLCAyMjApOworCisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRfYmFyXyk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25fYmFyXyk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksICBpbXBvcnRfYmFyXyk7CisKKyAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAiMjI0Iik7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIiksICIyMjUiKTsKKworICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQzMiIgICApLCAzMDEpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50NjQiICAgKSwgMzAyKTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIgICksIDMwMyk7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50NjQiICApLCAzMDQpOworICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMzA1KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDMwNik7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDMyIiApLCAzMDcpOworICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMzA4KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDMwOSk7CisgIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAzMTApOworICByZWZsZWN0aW9uLT5BZGRGbG9hdCAobWVzc2FnZSwgRigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMzExKTsKKyAgcmVmbGVjdGlvbi0+QWRkRG91YmxlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2RvdWJsZSIgICksIDMxMik7CisgIHJlZmxlY3Rpb24tPkFkZEJvb2wgIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9ib29sIiAgICApLCBmYWxzZSk7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApLCAiMzE1Iik7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9ieXRlcyIgICApLCAiMzE2Iik7CisKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCByZXBlYXRlZF9ncm91cF9hXywgMzE3KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbmVzdGVkX2JfLCAzMTgpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXywgMzE5KTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgaW1wb3J0X2RfLCAzMjApOworCisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRfYmF6Xyk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25fYmF6Xyk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksICBpbXBvcnRfYmF6Xyk7CisKKyAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAiMzI0Iik7CisgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIiksICIzMjUiKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHJlZmxlY3Rpb24tPlNldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDMyIiAgICksIDQwMSk7CisgIHJlZmxlY3Rpb24tPlNldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IiAgICksIDQwMik7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQzMiIgICksIDQwMyk7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQ2NCIgICksIDQwNCk7CisgIHJlZmxlY3Rpb24tPlNldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIgICksIDQwNSk7CisgIHJlZmxlY3Rpb24tPlNldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQ2NCIgICksIDQwNik7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkMzIiICksIDQwNyk7CisgIHJlZmxlY3Rpb24tPlNldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiICksIDQwOCk7CisgIHJlZmxlY3Rpb24tPlNldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDMyIiksIDQwOSk7CisgIHJlZmxlY3Rpb24tPlNldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IiksIDQxMCk7CisgIHJlZmxlY3Rpb24tPlNldEZsb2F0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICksIDQxMSk7CisgIHJlZmxlY3Rpb24tPlNldERvdWJsZShtZXNzYWdlLCBGKCJkZWZhdWx0X2RvdWJsZSIgICksIDQxMik7CisgIHJlZmxlY3Rpb24tPlNldEJvb2wgIChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiICAgICksIGZhbHNlKTsKKyAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIiAgKSwgIjQxNSIpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9ieXRlcyIgICApLCAiNDE2Iik7CisKKyAgcmVmbGVjdGlvbi0+U2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApLCAgbmVzdGVkX2Zvb18pOworICByZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIEYoImRlZmF1bHRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25fZm9vXyk7CisgIHJlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSwgIGltcG9ydF9mb29fKTsKKworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSwgIjQyNCIpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9jb3JkIiksICI0MjUiKTsKK30KKwordm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfaW50MzIiICAgKSwgNjAxKTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQ2NCIgICApLCA2MDIpOworICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX3VpbnQzMiIgICksIDYwMyk7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfdWludDY0IiAgKSwgNjA0KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50MzIiICApLCA2MDUpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NpbnQ2NCIgICksIDYwNik7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQzMiIgKSwgNjA3KTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDY0IiApLCA2MDgpOworICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDMyIiksIDYwOSk7CisgIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkNjQiKSwgNjEwKTsKKyAgcmVmbGVjdGlvbi0+QWRkRmxvYXQgKG1lc3NhZ2UsIEYoInBhY2tlZF9mbG9hdCIgICApLCA2MTEpOworICByZWZsZWN0aW9uLT5BZGREb3VibGUobWVzc2FnZSwgRigicGFja2VkX2RvdWJsZSIgICksIDYxMik7CisgIHJlZmxlY3Rpb24tPkFkZEJvb2wgIChtZXNzYWdlLCBGKCJwYWNrZWRfYm9vbCIgICAgKSwgdHJ1ZSk7CisgIHJlZmxlY3Rpb24tPkFkZEVudW0gIChtZXNzYWdlLCBGKCJwYWNrZWRfZW51bSIgICAgKSwgZm9yZWlnbl9iYXJfKTsKKworICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX2ludDMyIiAgICksIDcwMSk7CisgIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiICAgKSwgNzAyKTsKKyAgcmVmbGVjdGlvbi0+QWRkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50MzIiICApLCA3MDMpOworICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgRigicGFja2VkX3VpbnQ2NCIgICksIDcwNCk7CisgIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDMyIiAgKSwgNzA1KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50NjQiICApLCA3MDYpOworICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiICksIDcwNyk7CisgIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIgKSwgNzA4KTsKKyAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQzMiIpLCA3MDkpOworICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDY0IiksIDcxMCk7CisgIHJlZmxlY3Rpb24tPkFkZEZsb2F0IChtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSwgNzExKTsKKyAgcmVmbGVjdGlvbi0+QWRkRG91YmxlKG1lc3NhZ2UsIEYoInBhY2tlZF9kb3VibGUiICApLCA3MTIpOworICByZWZsZWN0aW9uLT5BZGRCb29sICAobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiICAgICksIGZhbHNlKTsKKyAgcmVmbGVjdGlvbi0+QWRkRW51bSAgKG1lc3NhZ2UsIEYoInBhY2tlZF9lbnVtIiAgICApLCBmb3JlaWduX2Jhel8pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICAvLyBXZSBoYXZlIHRvIHNwbGl0IHRoaXMgaW50byB0aHJlZSBmdW5jdGlvbiBvdGhlcndpc2UgaXQgY3JlYXRlcyBhIHN0YWNrCisgIC8vIGZyYW1lIHNvIGxhcmdlIHRoYXQgaXQgdHJpZ2dlcnMgYSB3YXJuaW5nLgorICBFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMShtZXNzYWdlKTsKKyAgRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjIobWVzc2FnZSk7CisgIEV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24zKG1lc3NhZ2UpOworfQorCit2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgc3RyaW5nIHNjcmF0Y2g7CisgIGNvbnN0IE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworCisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDMyIiAgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW50NjQiICAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50MzIiICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDMyIiAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50NjQiICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZpeGVkMzIiICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQ2NCIgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZmxvYXQiICAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9kb3VibGUiICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nIiAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9ieXRlcyIgICApKSk7CisKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxncm91cCIgICAgICAgICAgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiICkpKTsKKworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsZ3JvdXAiKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgZ3JvdXBfYV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpOworICBFWFBFQ1RfVFJVRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworCisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiApKSk7CisKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfY29yZCIpKSk7CisKKyAgRVhQRUNUX0VRKDEwMSAgLCByZWZsZWN0aW9uLT5HZXRJbnQzMiAobWVzc2FnZSwgRigib3B0aW9uYWxfaW50MzIiICAgKSkpOworICBFWFBFQ1RfRVEoMTAyICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbnQ2NCIgICApKSk7CisgIEVYUEVDVF9FUSgxMDMgICwgcmVmbGVjdGlvbi0+R2V0VUludDMyKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0VRKDEwNCAgLCByZWZsZWN0aW9uLT5HZXRVSW50NjQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDY0IiAgKSkpOworICBFWFBFQ1RfRVEoMTA1ICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50MzIiICApKSk7CisgIEVYUEVDVF9FUSgxMDYgICwgcmVmbGVjdGlvbi0+R2V0SW50NjQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0VRKDEwNyAgLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQzMiIgKSkpOworICBFWFBFQ1RfRVEoMTA4ICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDY0IiApKSk7CisgIEVYUEVDVF9FUSgxMDkgICwgcmVmbGVjdGlvbi0+R2V0SW50MzIgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDMyIikpKTsKKyAgRVhQRUNUX0VRKDExMCAgLCByZWZsZWN0aW9uLT5HZXRJbnQ2NCAobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOworICBFWFBFQ1RfRVEoMTExICAsIHJlZmxlY3Rpb24tPkdldEZsb2F0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9mbG9hdCIgICApKSk7CisgIEVYUEVDVF9FUSgxMTIgICwgcmVmbGVjdGlvbi0+R2V0RG91YmxlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2RvdWJsZSIgICkpKTsKKyAgRVhQRUNUX0VRKHRydWUgLCByZWZsZWN0aW9uLT5HZXRCb29sICAobWVzc2FnZSwgRigib3B0aW9uYWxfYm9vbCIgICAgKSkpOworICBFWFBFQ1RfRVEoIjExNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciICApKSk7CisgIEVYUEVDVF9FUSgiMTE2IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2J5dGVzIiAgICkpKTsKKworICBFWFBFQ1RfRVEoIjExNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciKSwgJnNjcmF0Y2gpKTsKKyAgRVhQRUNUX0VRKCIxMTYiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiICksICZzY3JhdGNoKSk7CisKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIikpOworICBFWFBFQ1RfRVEoMTE3LCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGdyb3VwX2FfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUSgxMTgsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpOworICBFWFBFQ1RfRVEoMTE5LCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX0VRKDEyMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8pKTsKKworICBFWFBFQ1RfRVEoIG5lc3RlZF9iYXpfLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7CisgIEVYUEVDVF9FUShmb3JlaWduX2Jhel8sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKKyAgRVhQRUNUX0VRKCBpbXBvcnRfYmF6XywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfZW51bSIgKSkpOworCisgIEVYUEVDVF9FUSgiMTI0IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpKSk7CisgIEVYUEVDVF9FUSgiMTI0IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpLCAmc2NyYXRjaCkpOworCisgIEVYUEVDVF9FUSgiMTI1IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIjEyNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9jb3JkIiksICZzY3JhdGNoKSk7Cit9CisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24yKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBzdHJpbmcgc2NyYXRjaDsKKyAgY29uc3QgTWVzc2FnZSogc3ViX21lc3NhZ2U7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQ2NCIgICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDMyIiAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50MzIiICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDY0IiAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDY0IiApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIgICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIiAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfYnl0ZXMiICAgKSkpOworCisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIgICAgICAgICAgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgICAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIgICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICAgICkpKTsKKworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpKSk7CisKKyAgRVhQRUNUX0VRKDIwMSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQzMiIgICApLCAwKSk7CisgIEVYUEVDVF9FUSgyMDIgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50NjQiICAgKSwgMCkpOworICBFWFBFQ1RfRVEoMjAzICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIgICksIDApKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50NjQiICApLCAwKSk7CisgIEVYUEVDVF9FUSgyMDUgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMCkpOworICBFWFBFQ1RfRVEoMjA2ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDApKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDMyIiApLCAwKSk7CisgIEVYUEVDVF9FUSgyMDggICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMCkpOworICBFWFBFQ1RfRVEoMjA5ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDApKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAwKSk7CisgIEVYUEVDVF9FUSgyMTEgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRGbG9hdCAobWVzc2FnZSwgRigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMCkpOworICBFWFBFQ1RfRVEoMjEyICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRG91YmxlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2RvdWJsZSIgICksIDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEJvb2wgIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9ib29sIiAgICApLCAwKSk7CisgIEVYUEVDVF9FUSgiMjE1IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgMCkpOworICBFWFBFQ1RfRVEoIjIxNiIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiAgICksIDApKTsKKworICBFWFBFQ1RfRVEoIjIxNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIpLCAwLCAmc2NyYXRjaCkpOworICBFWFBFQ1RfRVEoIjIxNiIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiksIDAsICZzY3JhdGNoKSk7CisKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiKSwgMCk7CisgIEVYUEVDVF9FUSgyMTcsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgcmVwZWF0ZWRfZ3JvdXBfYV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDApOworICBFWFBFQ1RfRVEoMjE4LCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiksIDApOworICBFWFBFQ1RfRVEoMjE5LCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDApOworICBFWFBFQ1RfRVEoMjIwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworCisgIEVYUEVDVF9FUSggbmVzdGVkX2Jhcl8sIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgKSwwKSk7CisgIEVYUEVDVF9FUShmb3JlaWduX2Jhcl8sIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwwKSk7CisgIEVYUEVDVF9FUSggaW1wb3J0X2Jhcl8sIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwwKSk7CisKKyAgRVhQRUNUX0VRKCIyMjQiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMCkpOworICBFWFBFQ1RfRVEoIjIyNCIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksIDAsICZzY3JhdGNoKSk7CisKKyAgRVhQRUNUX0VRKCIyMjUiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIiksIDApKTsKKyAgRVhQRUNUX0VRKCIyMjUiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoInJlcGVhdGVkX2NvcmQiKSwgMCwgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoMzAxICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICksIDEpKTsKKyAgRVhQRUNUX0VRKDMwMiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAxKSk7CisgIEVYUEVDVF9FUSgzMDMgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDMyIiAgKSwgMSkpOworICBFWFBFQ1RfRVEoMzA0ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDEpKTsKKyAgRVhQRUNUX0VRKDMwNSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50MzIiICApLCAxKSk7CisgIEVYUEVDVF9FUSgzMDYgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMSkpOworICBFWFBFQ1RfRVEoMzA3ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDEpKTsKKyAgRVhQRUNUX0VRKDMwOCAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDY0IiApLCAxKSk7CisgIEVYUEVDVF9FUSgzMDkgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMSkpOworICBFWFBFQ1RfRVEoMzEwICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDEpKTsKKyAgRVhQRUNUX0VRKDMxMSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZsb2F0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIgICApLCAxKSk7CisgIEVYUEVDVF9FUSgzMTIgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWREb3VibGUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMSkpOworICBFWFBFQ1RfRVEoZmFsc2UsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICksIDEpKTsKKyAgRVhQRUNUX0VRKCIzMTUiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApLCAxKSk7CisgIEVYUEVDVF9FUSgiMzE2IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfYnl0ZXMiICAgKSwgMSkpOworCisgIEVYUEVDVF9FUSgiMzE1IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJnNjcmF0Y2gpKTsKKyAgRVhQRUNUX0VRKCIzMTYiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9ieXRlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICZzY3JhdGNoKSk7CisKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiKSwgMSk7CisgIEVYUEVDVF9FUSgzMTcsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgcmVwZWF0ZWRfZ3JvdXBfYV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDEpOworICBFWFBFQ1RfRVEoMzE4LCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiksIDEpOworICBFWFBFQ1RfRVEoMzE5LCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDEpOworICBFWFBFQ1RfRVEoMzIwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworCisgIEVYUEVDVF9FUSggbmVzdGVkX2Jhel8sIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgKSwxKSk7CisgIEVYUEVDVF9FUShmb3JlaWduX2Jhel8sIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwxKSk7CisgIEVYUEVDVF9FUSggaW1wb3J0X2Jhel8sIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwxKSk7CisKKyAgRVhQRUNUX0VRKCIzMjQiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMSkpOworICBFWFBFQ1RfRVEoIjMyNCIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksIDEsICZzY3JhdGNoKSk7CisKKyAgRVhQRUNUX0VRKCIzMjUiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIiksIDEpKTsKKyAgRVhQRUNUX0VRKCIzMjUiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIEYoInJlcGVhdGVkX2NvcmQiKSwgMSwgJnNjcmF0Y2gpKTsKK30KKwordm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjMoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIHN0cmluZyBzY3JhdGNoOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9pbnQzMiIgICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfaW50NjQiICAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQzMiIgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF91aW50NjQiICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDMyIiAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9maXhlZDMyIiApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZml4ZWQ2NCIgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDMyIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZmxvYXQiICAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2RvdWJsZSIgICkpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9ib29sIiAgICApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIiAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2J5dGVzIiAgICkpKTsKKworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZm9yZWlnbl9lbnVtIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSkpOworCisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9jb3JkIikpKTsKKworICBFWFBFQ1RfRVEoNDAxICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDMyIiAgICkpKTsKKyAgRVhQRUNUX0VRKDQwMiAgLCByZWZsZWN0aW9uLT5HZXRJbnQ2NCAobWVzc2FnZSwgRigiZGVmYXVsdF9pbnQ2NCIgICApKSk7CisgIEVYUEVDVF9FUSg0MDMgICwgcmVmbGVjdGlvbi0+R2V0VUludDMyKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDMyIiAgKSkpOworICBFWFBFQ1RfRVEoNDA0ICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0VRKDQwNSAgLCByZWZsZWN0aW9uLT5HZXRJbnQzMiAobWVzc2FnZSwgRigiZGVmYXVsdF9zaW50MzIiICApKSk7CisgIEVYUEVDVF9FUSg0MDYgICwgcmVmbGVjdGlvbi0+R2V0SW50NjQgKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDY0IiAgKSkpOworICBFWFBFQ1RfRVEoNDA3ICAsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkMzIiICkpKTsKKyAgRVhQRUNUX0VRKDQwOCAgLCByZWZsZWN0aW9uLT5HZXRVSW50NjQobWVzc2FnZSwgRigiZGVmYXVsdF9maXhlZDY0IiApKSk7CisgIEVYUEVDVF9FUSg0MDkgICwgcmVmbGVjdGlvbi0+R2V0SW50MzIgKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRVEoNDEwICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKDQxMSAgLCByZWZsZWN0aW9uLT5HZXRGbG9hdCAobWVzc2FnZSwgRigiZGVmYXVsdF9mbG9hdCIgICApKSk7CisgIEVYUEVDVF9FUSg0MTIgICwgcmVmbGVjdGlvbi0+R2V0RG91YmxlKG1lc3NhZ2UsIEYoImRlZmF1bHRfZG91YmxlIiAgKSkpOworICBFWFBFQ1RfRVEoZmFsc2UsIHJlZmxlY3Rpb24tPkdldEJvb2wgIChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX0VRKCI0MTUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmciICApKSk7CisgIEVYUEVDVF9FUSgiNDE2IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfYnl0ZXMiICAgKSkpOworCisgIEVYUEVDVF9FUSgiNDE1IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIiksICZzY3JhdGNoKSk7CisgIEVYUEVDVF9FUSgiNDE2IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoImRlZmF1bHRfYnl0ZXMiICksICZzY3JhdGNoKSk7CisKKyAgRVhQRUNUX0VRKCBuZXN0ZWRfZm9vXywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApKSk7CisgIEVYUEVDVF9FUShmb3JlaWduX2Zvb18sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOworICBFWFBFQ1RfRVEoIGltcG9ydF9mb29fLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoImRlZmF1bHRfaW1wb3J0X2VudW0iICkpKTsKKworICBFWFBFQ1RfRVEoIjQyNCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpKSk7CisgIEVYUEVDVF9FUSgiNDI0IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JhdGNoKSk7CisKKyAgRVhQRUNUX0VRKCI0MjUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9jb3JkIikpKTsKKyAgRVhQRUNUX0VRKCI0MjUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9jb3JkIiksICZzY3JhdGNoKSk7Cit9CisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdFBhY2tlZEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfaW50MzIiICAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQ2NCIgICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3VpbnQzMiIgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfdWludDY0IiAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50MzIiICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3NpbnQ2NCIgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQzMiIgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDY0IiApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDMyIikpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkNjQiKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9mbG9hdCIgICApKSk7CisgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2RvdWJsZSIgICkpKTsKKyAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfYm9vbCIgICAgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9lbnVtIiAgICApKSk7CisKKyAgRVhQRUNUX0VRKDYwMSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfaW50MzIiICAgKSwgMCkpOworICBFWFBFQ1RfRVEoNjAyICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQ2NCIgICApLCAwKSk7CisgIEVYUEVDVF9FUSg2MDMgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX3VpbnQzMiIgICksIDApKTsKKyAgRVhQRUNUX0VRKDYwNCAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfdWludDY0IiAgKSwgMCkpOworICBFWFBFQ1RfRVEoNjA1ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50MzIiICApLCAwKSk7CisgIEVYUEVDVF9FUSg2MDYgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NpbnQ2NCIgICksIDApKTsKKyAgRVhQRUNUX0VRKDYwNyAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQzMiIgKSwgMCkpOworICBFWFBFQ1RfRVEoNjA4ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDY0IiApLCAwKSk7CisgIEVYUEVDVF9FUSg2MDkgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDMyIiksIDApKTsKKyAgRVhQRUNUX0VRKDYxMCAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkNjQiKSwgMCkpOworICBFWFBFQ1RfRVEoNjExICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRmxvYXQgKG1lc3NhZ2UsIEYoInBhY2tlZF9mbG9hdCIgICApLCAwKSk7CisgIEVYUEVDVF9FUSg2MTIgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWREb3VibGUobWVzc2FnZSwgRigicGFja2VkX2RvdWJsZSIgICksIDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEJvb2wgIChtZXNzYWdlLCBGKCJwYWNrZWRfYm9vbCIgICAgKSwgMCkpOworICBFWFBFQ1RfRVEoZm9yZWlnbl9iYXJfLAorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInBhY2tlZF9lbnVtIiksIDApKTsKKworICBFWFBFQ1RfRVEoNzAxICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQzMiIgICApLCAxKSk7CisgIEVYUEVDVF9FUSg3MDIgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX2ludDY0IiAgICksIDEpKTsKKyAgRVhQRUNUX0VRKDcwMyAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfdWludDMyIiAgKSwgMSkpOworICBFWFBFQ1RfRVEoNzA0ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiICApLCAxKSk7CisgIEVYUEVDVF9FUSg3MDUgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX3NpbnQzMiIgICksIDEpKTsKKyAgRVhQRUNUX0VRKDcwNiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDY0IiAgKSwgMSkpOworICBFWFBFQ1RfRVEoNzA3ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDMyIiApLCAxKSk7CisgIEVYUEVDVF9FUSg3MDggICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkNjQiICksIDEpKTsKKyAgRVhQRUNUX0VRKDcwOSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkMzIiKSwgMSkpOworICBFWFBFQ1RfRVEoNzEwICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQ2NCIpLCAxKSk7CisgIEVYUEVDVF9FUSg3MTEgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRGbG9hdCAobWVzc2FnZSwgRigicGFja2VkX2Zsb2F0IiAgICksIDEpKTsKKyAgRVhQRUNUX0VRKDcxMiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZERvdWJsZShtZXNzYWdlLCBGKCJwYWNrZWRfZG91YmxlIiAgKSwgMSkpOworICBFWFBFQ1RfRVEoZmFsc2UsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInBhY2tlZF9ib29sIiAgICApLCAxKSk7CisgIEVYUEVDVF9FUShmb3JlaWduX2Jhel8sCisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgRigicGFja2VkX2VudW0iKSwgMSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdENsZWFyVmlhUmVmbGVjdGlvbigKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgc3RyaW5nIHNjcmF0Y2g7CisgIGNvbnN0IE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworCisgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGluaXRpYWxseSBiZSBmYWxzZSBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcy4KKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDMyIiAgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDY0IiAgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZpeGVkMzIiICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZpeGVkNjQiICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDMyIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Zsb2F0IiAgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2RvdWJsZSIgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZyIgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2J5dGVzIiAgICkpKTsKKworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxncm91cCIgICAgICAgICAgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiICkpKTsKKworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX2VudW0iICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfZW51bSIgKSkpOworCisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfY29yZCIpKSk7CisKKyAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgorICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbnQzMiIgICApKSk7CisgIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0SW50NjQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDY0IiAgICkpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDMyIiAgKSkpOworICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50NjQiICApKSk7CisgIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0SW50MzIgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXRJbnQ2NCAobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDY0IiAgKSkpOworICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDMyIiApKSk7CisgIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0VUludDY0KG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZpeGVkNjQiICkpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXRJbnQzMiAobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0RmxvYXQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Zsb2F0IiAgICkpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXREb3VibGUobWVzc2FnZSwgRigib3B0aW9uYWxfZG91YmxlIiAgKSkpOworICBFWFBFQ1RfRVEoZmFsc2UsIHJlZmxlY3Rpb24tPkdldEJvb2wgIChtZXNzYWdlLCBGKCJvcHRpb25hbF9ib29sIiAgICApKSk7CisgIEVYUEVDVF9FUSgiIiAgICwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZyIgICkpKTsKKyAgRVhQRUNUX0VRKCIiICAgLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiICAgKSkpOworCisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZyIpLCAmc2NyYXRjaCkpOworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9ieXRlcyIgKSwgJnNjcmF0Y2gpKTsKKworICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIikpOworICBFWFBFQ1RfRkFMU0Uoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBncm91cF9hXykpOworICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBncm91cF9hXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpOworICBFWFBFQ1RfRkFMU0Uoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKyAgRVhQRUNUX0VRKDAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpOworICBFWFBFQ1RfRkFMU0Uoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfKSk7CisgIEVYUEVDVF9FUSgwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX0ZBTFNFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2RfKSk7CisgIEVYUEVDVF9FUSgwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworCisgIC8vIEVudW1zIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGVudW0uCisgIEVYUEVDVF9FUSggbmVzdGVkX2Zvb18sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX2VudW0iICkpKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fZm9vXywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX2VudW0iKSkpOworICBFWFBFQ1RfRVEoIGltcG9ydF9mb29fLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiApKSk7CisKKyAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIiksICZzY3JhdGNoKSk7CisKKyAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfY29yZCIpKSk7CisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSwgJnNjcmF0Y2gpKTsKKworICAvLyBSZXBlYXRlZCBmaWVsZHMgYXJlIGVtcHR5LgorICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQ2NCIgICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDMyIiAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50MzIiICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDY0IiAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDY0IiApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIgICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIiAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfYnl0ZXMiICAgKSkpOworCisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIgICAgICAgICAgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgICAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIgICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICAgICkpKTsKKworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpKSk7CisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9pbnQzMiIgICApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDMyIiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF91aW50NjQiICApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDY0IiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9maXhlZDMyIiApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZG91YmxlIiAgKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9ib29sIiAgICApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfYnl0ZXMiICAgKSkpOworCisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApKSk7CisKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfY29yZCIpKSk7CisKKyAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KKyAgRVhQRUNUX0VRKCA0MSAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDMyIiAgICkpKTsKKyAgRVhQRUNUX0VRKCA0MiAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKKyAgRVhQRUNUX0VRKCA0MyAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0VRKCA0NCAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0VRKC00NSAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKKyAgRVhQRUNUX0VRKCA0NiAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0VRKCA0NyAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkMzIiICkpKTsKKyAgRVhQRUNUX0VRKCA0OCAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKKyAgRVhQRUNUX0VRKCA0OSAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDMyIikpKTsKKyAgRVhQRUNUX0VRKC01MCAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKCA1MS41ICAsIHJlZmxlY3Rpb24tPkdldEZsb2F0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKKyAgRVhQRUNUX0VRKCA1MmUzICAsIHJlZmxlY3Rpb24tPkdldERvdWJsZShtZXNzYWdlLCBGKCJkZWZhdWx0X2RvdWJsZSIgICkpKTsKKyAgRVhQRUNUX0VRKHRydWUgICAsIHJlZmxlY3Rpb24tPkdldEJvb2wgIChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKKyAgRVhQRUNUX0VRKCJ3b3JsZCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2J5dGVzIiAgICkpKTsKKworICBFWFBFQ1RfRVEoImhlbGxvIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIiksICZzY3JhdGNoKSk7CisgIEVYUEVDVF9FUSgid29ybGQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9ieXRlcyIgKSwgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoIG5lc3RlZF9iYXJfLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fYmFyXywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7CisgIEVYUEVDVF9FUSggaW1wb3J0X2Jhcl8sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSkpOworCisgIEVYUEVDVF9FUSgiYWJjIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCJhYmMiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSwgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoIjEyMyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIjEyMyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSwgJnNjcmF0Y2gpKTsKK30KKwordm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0UGFja2VkQ2xlYXJWaWFSZWZsZWN0aW9uKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2ludDMyIiAgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiICAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50MzIiICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3VpbnQ2NCIgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDMyIiAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50NjQiICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQzMiIpKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDY0IikpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSkpOworICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9kb3VibGUiICApKSk7CisgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZW51bSIgICAgKSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok1vZGlmeVJlcGVhdGVkRmllbGRzVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworCisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICksIDEsIDUwMSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDY0IiAgICksIDEsIDUwMik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIgICksIDEsIDUwMyk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDEsIDUwNCk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQzMiIgICksIDEsIDUwNSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDEsIDUwNik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDEsIDUwNyk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDEsIDUwOCk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDEsIDUwOSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDEsIDUxMCk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRmxvYXQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDEsIDUxMSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRG91YmxlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2RvdWJsZSIgICksIDEsIDUxMik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICksIDEsIHRydWUpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApLCAxLCAiNTE1Iik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiAgICksIDEsICI1MTYiKTsKKworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIpLCAxKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIHJlcGVhdGVkX2dyb3VwX2FfLCA1MTcpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDUxOCk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfLCA1MTkpOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8sIDUyMCk7CisKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLCAxLCAgbmVzdGVkX2Zvb18pOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIDEsIGZvcmVpZ25fZm9vXyk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwgMSwgIGltcG9ydF9mb29fKTsKKworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMSwgIjUyNCIpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIiksIDEsICI1MjUiKTsKK30KKwordm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6TW9kaWZ5UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQzMiIgICApLCAxLCA4MDEpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiICAgKSwgMSwgODAyKTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX3VpbnQzMiIgICksIDEsIDgwMyk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiICApLCAxLCA4MDQpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDMyIiAgKSwgMSwgODA1KTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NpbnQ2NCIgICksIDEsIDgwNik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDMyIiApLCAxLCA4MDcpOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIgKSwgMSwgODA4KTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDMyIiksIDEsIDgwOSk7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQ2NCIpLCAxLCA4MTApOworICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEZsb2F0IChtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSwgMSwgODExKTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWREb3VibGUobWVzc2FnZSwgRigicGFja2VkX2RvdWJsZSIgICksIDEsIDgxMik7CisgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInBhY2tlZF9ib29sIiAgICApLCAxLCB0cnVlKTsKKyAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRFbnVtICAobWVzc2FnZSwgRigicGFja2VkX2VudW0iICAgICksIDEsIGZvcmVpZ25fZm9vXyk7Cit9CisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlJlbW92ZUxhc3RSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3V0cHV0OworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlLCAmb3V0cHV0KTsKKyAgZm9yIChpbnQgaT0wOyBpPG91dHB1dC5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvdXRwdXRbaV07CisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgY29udGludWU7CisKKyAgICByZWZsZWN0aW9uLT5SZW1vdmVMYXN0KG1lc3NhZ2UsIGZpZWxkKTsKKyAgfQorfQorCit2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpTd2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG91dHB1dDsKKyAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJm91dHB1dCk7CisgIGZvciAoaW50IGk9MDsgaTxvdXRwdXQuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gb3V0cHV0W2ldOworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIGNvbnRpbnVlOworCisgICAgcmVmbGVjdGlvbi0+U3dhcEVsZW1lbnRzKG1lc3NhZ2UsIGZpZWxkLCAwLCAxKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxNjVmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oCkBAIC0wLDAgKzEsMTc0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVEVTVF9VVElMX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVEVTVF9VVElMX0hfXworCisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworbmFtZXNwYWNlIHVuaXR0ZXN0ID0gcHJvdG9idWZfdW5pdHRlc3Q7CituYW1lc3BhY2UgdW5pdHRlc3RfaW1wb3J0ID0gcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OworCitjbGFzcyBUZXN0VXRpbCB7CisgcHVibGljOgorICAvLyBTZXQgZXZlcnkgZmllbGQgaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCisgIHN0YXRpYyB2b2lkIFNldEFsbEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgU2V0QWxsRXh0ZW5zaW9ucyh1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3MqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIFNldFBhY2tlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgU2V0VW5wYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RVbnBhY2tlZFR5cGVzKiBtZXNzYWdlKTsKKworICAvLyBVc2UgdGhlIHJlcGVhdGVkIHZlcnNpb25zIG9mIHRoZSBzZXRfKigpIGFjY2Vzc29ycyB0byBtb2RpZnkgYWxsIHRoZQorICAvLyByZXBlYXRlZCBmaWVsZHMgb2YgdGhlIG1lc3NzYWdlICh3aGljaCBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4KKyAgLy8gaW5pdGlhbGl6ZWQgd2l0aCBTZXQqRmllbGRzKCkpLiAgU2V0KkZpZWxkcygpIGl0c2VsZiBvbmx5IHRlc3RzCisgIC8vIHRoZSBhZGRfKigpIGFjY2Vzc29ycy4KKyAgc3RhdGljIHZvaWQgTW9kaWZ5UmVwZWF0ZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIE1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9ucyh1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBNb2RpZnlQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIE1vZGlmeVBhY2tlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgaGF2ZSB0aGUgdmFsdWVzIHRoYXQgdGhleSBzaG91bGQgaGF2ZSBhZnRlcgorICAvLyBTZXQqRmllbGRzKCkgaXMgY2FsbGVkLgorICBzdGF0aWMgdm9pZCBFeHBlY3RBbGxGaWVsZHNTZXQoY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdEFsbEV4dGVuc2lvbnNTZXQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRGaWVsZHNTZXQoY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RVbnBhY2tlZEZpZWxkc1NldCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0VW5wYWNrZWRUeXBlcyYgbWVzc2FnZSk7CisKKyAgLy8gRXhwZWN0IHRoYXQgdGhlIG1lc3NhZ2UgaXMgbW9kaWZpZWQgYXMgd291bGQgYmUgZXhwZWN0ZWQgZnJvbQorICAvLyBNb2RpZnkqRmllbGRzKCkuCisgIHN0YXRpYyB2b2lkIEV4cGVjdFJlcGVhdGVkRmllbGRzTW9kaWZpZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRGaWVsZHNNb2RpZmllZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICBzdGF0aWMgdm9pZCBFeHBlY3RDbGVhcihjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0RXh0ZW5zaW9uc0NsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHBhc3NlZC1pbiBzZXJpYWxpemF0aW9uIGlzIHRoZSBjYW5vbmljYWwgc2VyaWFsaXphdGlvbiB3ZQorICAvLyBleHBlY3QgZm9yIGEgVGVzdEZpZWxkT3JkZXJpbmdzIG1lc3NhZ2UgZmlsbGVkIGluIGJ5CisgIC8vIFNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMoKS4KKyAgc3RhdGljIHZvaWQgRXhwZWN0QWxsRmllbGRzQW5kRXh0ZW5zaW9uc0luT3JkZXIoY29uc3Qgc3RyaW5nJiBzZXJpYWxpemVkKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCByZXBlYXRlZCBmaWVsZHMgaGF2ZSBoYWQgdGhlaXIgbGFzdCBlbGVtZW50cyByZW1vdmVkLgorICBzdGF0aWMgdm9pZCBFeHBlY3RMYXN0UmVwZWF0ZWRzUmVtb3ZlZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RMYXN0UmVwZWF0ZWRFeHRlbnNpb25zUmVtb3ZlZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVwZWF0ZWQgZmllbGRzIGhhdmUgaGFkIHRoZWlyIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnRzCisgIC8vIHN3YXBwZWQuCisgIHN0YXRpYyB2b2lkIEV4cGVjdFJlcGVhdGVkc1N3YXBwZWQoY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc1N3YXBwZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworCisgIC8vIExpa2UgYWJvdmUsIGJ1dCB1c2UgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLgorICBjbGFzcyBSZWZsZWN0aW9uVGVzdGVyIHsKKyAgIHB1YmxpYzoKKyAgICAvLyBiYXNlX2Rlc2NyaXB0b3IgbXVzdCBiZSBhIGRlc2NyaXB0b3IgZm9yIFRlc3RBbGxUeXBlcyBvcgorICAgIC8vIFRlc3RBbGxFeHRlbnNpb25zLiAgSW4gdGhlIGZvcm1lciBjYXNlLCBSZWZsZWN0aW9uVGVzdGVyIGZldGNoZXMgZnJvbQorICAgIC8vIGl0IHRoZSBGaWVsZERlc2NyaXB0b3JzIG5lZWRlZCB0byB1c2UgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLiAgSW4KKyAgICAvLyB0aGUgbGF0dGVyIGNhc2UsIFJlZmxlY3Rpb25UZXN0ZXIgc2VhcmNoZXMgZm9yIGV4dGVuc2lvbiBmaWVsZHMgaW4KKyAgICAvLyBpdHMgZmlsZS4KKyAgICBleHBsaWNpdCBSZWZsZWN0aW9uVGVzdGVyKGNvbnN0IERlc2NyaXB0b3IqIGJhc2VfZGVzY3JpcHRvcik7CisKKyAgICB2b2lkIFNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgICAgdm9pZCBNb2RpZnlSZXBlYXRlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgICAgdm9pZCBFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworICAgIHZvaWQgRXhwZWN0Q2xlYXJWaWFSZWZsZWN0aW9uKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgICAgdm9pZCBTZXRQYWNrZWRGaWVsZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpOworICAgIHZvaWQgTW9kaWZ5UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKTsKKyAgICB2b2lkIEV4cGVjdFBhY2tlZEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisgICAgdm9pZCBFeHBlY3RQYWNrZWRDbGVhclZpYVJlZmxlY3Rpb24oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgICB2b2lkIFJlbW92ZUxhc3RSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpOworICAgIHZvaWQgU3dhcFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBiYXNlX2Rlc2NyaXB0b3JfOworCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBncm91cF9hXzsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlcGVhdGVkX2dyb3VwX2FfOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbmVzdGVkX2JfOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZm9yZWlnbl9jXzsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGltcG9ydF9kXzsKKworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIG5lc3RlZF9mb29fOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIG5lc3RlZF9iYXJfOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIG5lc3RlZF9iYXpfOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGZvcmVpZ25fZm9vXzsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBmb3JlaWduX2Jhcl87CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZm9yZWlnbl9iYXpfOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGltcG9ydF9mb29fOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGltcG9ydF9iYXJfOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGltcG9ydF9iYXpfOworCisgICAgLy8gV2UgaGF2ZSB0byBzcGxpdCB0aGlzIGludG8gdGhyZWUgZnVuY3Rpb24gb3RoZXJ3aXNlIGl0IGNyZWF0ZXMgYSBzdGFjaworICAgIC8vIGZyYW1lIHNvIGxhcmdlIHRoYXQgaXQgdHJpZ2dlcnMgYSB3YXJuaW5nLgorICAgIHZvaWQgRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjEoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisgICAgdm9pZCBFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMihjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKyAgICB2b2lkIEV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24zKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlZmxlY3Rpb25UZXN0ZXIpOworICB9OworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RVdGlsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9URVNUX1VUSUxfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTQwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYwpAQCAtMCwwICsxLDE1MDIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisKKyNkZWZpbmUgRVhQRUNUX1RSVUUgR09PR0xFX0NIRUNLCisjZGVmaW5lIEFTU0VSVF9UUlVFIEdPT0dMRV9DSEVDSworI2RlZmluZSBFWFBFQ1RfRkFMU0UoQ09ORCkgR09PR0xFX0NIRUNLKCEoQ09ORCkpCisjZGVmaW5lIEVYUEVDVF9FUSBHT09HTEVfQ0hFQ0tfRVEKKyNkZWZpbmUgQVNTRVJUX0VRIEdPT0dMRV9DSEVDS19FUQorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpTZXRBbGxGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ludDMyICAgKDEwMSk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9pbnQ2NCAgICgxMDIpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfdWludDMyICAoMTAzKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3VpbnQ2NCAgKDEwNCk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zaW50MzIgICgxMDUpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc2ludDY0ICAoMTA2KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ZpeGVkMzIgKDEwNyk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9maXhlZDY0ICgxMDgpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc2ZpeGVkMzIoMTA5KTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3NmaXhlZDY0KDExMCk7CisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9mbG9hdCAgICgxMTEpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZG91YmxlICAoMTEyKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2Jvb2wgICAgKHRydWUpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc3RyaW5nICAoIjExNSIpOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfYnl0ZXMgICAoIjExNiIpOworCisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxncm91cCAgICAgICAgICAgKCktPnNldF9hKDExNyk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgKCktPnNldF9iYigxMTgpOworICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYygxMTkpOworICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpLT5zZXRfZCgxMjApOworCisgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiApOworICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaICAgICAgKTsKKyAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ltcG9ydF9lbnVtICh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBWik7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQzMiAgICgyMDEpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50NjQgICAoMjAyKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQzMiAgKDIwMyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50NjQgICgyMDQpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDMyICAoMjA1KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQ2NCAgKDIwNik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDMyICgyMDcpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQ2NCAoMjA4KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDMyKDIwOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQ2NCgyMTApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZmxvYXQgICAoMjExKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2RvdWJsZSAgKDIxMik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ib29sICAgICh0cnVlKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3N0cmluZyAgKCIyMTUiKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2J5dGVzICAgKCIyMTYiKTsKKworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRncm91cCAgICAgICAgICAgKCktPnNldF9hKDIxNyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoKS0+c2V0X2JiKDIxOCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoMjE5KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgpLT5zZXRfZCgyMjApOworCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBUiApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ltcG9ydF9lbnVtICh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUik7CisKKworICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQzMiAgICgzMDEpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50NjQgICAoMzAyKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQzMiAgKDMwMyk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50NjQgICgzMDQpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDMyICAoMzA1KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQ2NCAgKDMwNik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDMyICgzMDcpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQ2NCAoMzA4KTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDMyKDMwOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQ2NCgzMTApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZmxvYXQgICAoMzExKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2RvdWJsZSAgKDMxMik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ib29sICAgIChmYWxzZSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zdHJpbmcgICgiMzE1Iik7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ieXRlcyAgICgiMzE2Iik7CisKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkZ3JvdXAgICAgICAgICAgICgpLT5zZXRfYSgzMTcpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKCktPnNldF9iYigzMTgpOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKDMxOSk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoKS0+c2V0X2QoMzIwKTsKKworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0gKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVogKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiAgICAgICk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfZW51bSAodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVopOworCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbnQzMiAgICg0MDEpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbnQ2NCAgICg0MDIpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF91aW50MzIgICg0MDMpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF91aW50NjQgICg0MDQpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9zaW50MzIgICg0MDUpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9zaW50NjQgICg0MDYpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9maXhlZDMyICg0MDcpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9maXhlZDY0ICg0MDgpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9zZml4ZWQzMig0MDkpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9zZml4ZWQ2NCg0MTApOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9mbG9hdCAgICg0MTEpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9kb3VibGUgICg0MTIpOworICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9ib29sICAgIChmYWxzZSk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3N0cmluZyAgKCI0MTUiKTsKKyAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfYnl0ZXMgICAoIjQxNiIpOworCisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X25lc3RlZF9lbnVtICh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PICk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICk7CisgIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ltcG9ydF9lbnVtICh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTyk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6TW9kaWZ5UmVwZWF0ZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ludDMyICAgKDEsIDUwMSk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9pbnQ2NCAgICgxLCA1MDIpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfdWludDMyICAoMSwgNTAzKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3VpbnQ2NCAgKDEsIDUwNCk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zaW50MzIgICgxLCA1MDUpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ludDY0ICAoMSwgNTA2KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ZpeGVkMzIgKDEsIDUwNyk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9maXhlZDY0ICgxLCA1MDgpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ZpeGVkMzIoMSwgNTA5KTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3NmaXhlZDY0KDEsIDUxMCk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9mbG9hdCAgICgxLCA1MTEpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZG91YmxlICAoMSwgNTEyKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2Jvb2wgICAgKDEsIHRydWUpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc3RyaW5nICAoMSwgIjUxNSIpOworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfYnl0ZXMgICAoMSwgIjUxNiIpOworCisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRncm91cCAgICAgICAgICAgKDEpLT5zZXRfYSg1MTcpOworICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgxKS0+c2V0X2JiKDUxOCk7CisgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLT5zZXRfYyg1MTkpOworICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS0+c2V0X2QoNTIwKTsKKworICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfbmVzdGVkX2VudW0gKDEsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gKTsKKyAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ZvcmVpZ25fZW51bSgxLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICk7CisgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9pbXBvcnRfZW51bSAoMSwgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9GT08pOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEZpZWxkc1NldCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSYgbWVzc2FnZSkgeworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQzMiAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50NjQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQzMiAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF91aW50NjQgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ludDMyICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NpbnQ2NCAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9maXhlZDMyICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZml4ZWQ2NCAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDMyKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZmxvYXQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2RvdWJsZSAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9ib29sICAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2J5dGVzICAgKCkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsZ3JvdXAgICAgICAgICAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICgpLmhhc19hKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICgpLmhhc19iYigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS5oYXNfYygpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAoKS5oYXNfZCgpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X2VudW0gKCkpOworCisKKyAgRVhQRUNUX0VRKDEwMSAgLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyICAgKCkpOworICBFWFBFQ1RfRVEoMTAyICAsIG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQgICAoKSk7CisgIEVYUEVDVF9FUSgxMDMgICwgbWVzc2FnZS5vcHRpb25hbF91aW50MzIgICgpKTsKKyAgRVhQRUNUX0VRKDEwNCAgLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoMTA1ICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDMyICAoKSk7CisgIEVYUEVDVF9FUSgxMDYgICwgbWVzc2FnZS5vcHRpb25hbF9zaW50NjQgICgpKTsKKyAgRVhQRUNUX0VRKDEwNyAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkMzIgKCkpOworICBFWFBFQ1RfRVEoMTA4ICAsIG1lc3NhZ2Uub3B0aW9uYWxfZml4ZWQ2NCAoKSk7CisgIEVYUEVDVF9FUSgxMDkgICwgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQzMigpKTsKKyAgRVhQRUNUX0VRKDExMCAgLCBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoMTExICAsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgICAoKSk7CisgIEVYUEVDVF9FUSgxMTIgICwgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgICgpKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLm9wdGlvbmFsX2Jvb2wgICAgKCkpOworICBFWFBFQ1RfRVEoIjExNSIsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nICAoKSk7CisgIEVYUEVDVF9FUSgiMTE2IiwgbWVzc2FnZS5vcHRpb25hbF9ieXRlcyAgICgpKTsKKworICBFWFBFQ1RfRVEoMTE3LCBtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICgpLmEoKSk7CisgIEVYUEVDVF9FUSgxMTgsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgKCkuYmIoKSk7CisgIEVYUEVDVF9FUSgxMTksIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkuYygpKTsKKyAgRVhQRUNUX0VRKDEyMCwgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAoKS5kKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiAgICAgICwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBWiwgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfZW51bSAoKSk7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7CisKKworICBFWFBFQ1RfRVEoMjAxICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIgICAoMCkpOworICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQgICAoMCkpOworICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyICAoMCkpOworICBFWFBFQ1RfRVEoMjA0ICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyICAoMCkpOworICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoMjA3ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMiAoMCkpOworICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCAoMCkpOworICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMCkpOworICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMCkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMCkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMCkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDApLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOworCisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0gKDApKTsKKworICBFWFBFQ1RfRVEoMzAxICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIgICAoMSkpOworICBFWFBFQ1RfRVEoMzAyICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQgICAoMSkpOworICBFWFBFQ1RfRVEoMzAzICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyICAoMSkpOworICBFWFBFQ1RfRVEoMzA0ICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoMzA1ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyICAoMSkpOworICBFWFBFQ1RfRVEoMzA2ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoMzA3ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMiAoMSkpOworICBFWFBFQ1RfRVEoMzA4ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCAoMSkpOworICBFWFBFQ1RfRVEoMzA5ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMSkpOworICBFWFBFQ1RfRVEoMzEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoMzExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMSkpOworICBFWFBFQ1RfRVEoMzEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMSkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMSkpOworICBFWFBFQ1RfRVEoIjMxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMSkpOworICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMSkpOworCisgIEVYUEVDVF9FUSgzMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDEpLmEoKSk7CisgIEVYUEVDVF9FUSgzMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDEpLmJiKCkpOworICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgxKS5jKCkpOworICBFWFBFQ1RfRVEoMzIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS5kKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVogICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgxKSk7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50MzIgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50NjQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDMyICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDY0ICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDMyICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQ2NCAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZmxvYXQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZG91YmxlICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9uZXN0ZWRfZW51bSAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKKworCisgIEVYUEVDVF9FUSg0MDEgICwgbWVzc2FnZS5kZWZhdWx0X2ludDMyICAgKCkpOworICBFWFBFQ1RfRVEoNDAyICAsIG1lc3NhZ2UuZGVmYXVsdF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX0VRKDQwMyAgLCBtZXNzYWdlLmRlZmF1bHRfdWludDMyICAoKSk7CisgIEVYUEVDVF9FUSg0MDQgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoNDA1ICAsIG1lc3NhZ2UuZGVmYXVsdF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX0VRKDQwNiAgLCBtZXNzYWdlLmRlZmF1bHRfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9FUSg0MDcgICwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIgKCkpOworICBFWFBFQ1RfRVEoNDA4ICAsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX0VRKDQwOSAgLCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSg0MTAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRVEoNDExICAsIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX0VRKDQxMiAgLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlICAoKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5kZWZhdWx0X2Jvb2wgICAgKCkpOworICBFWFBFQ1RfRVEoIjQxNSIsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX0VRKCI0MTYiLCBtZXNzYWdlLmRlZmF1bHRfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gLCBtZXNzYWdlLmRlZmF1bHRfbmVzdGVkX2VudW0gKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08gICAgICAsIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTywgbWVzc2FnZS5kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcihjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSYgbWVzc2FnZSkgeworICAvLyBoYXNfYmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQzMiAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDY0ICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDMyICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF91aW50NjQgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NpbnQzMiAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9maXhlZDMyICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZpeGVkNjQgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zZml4ZWQ2NCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2Zsb2F0ICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZG91YmxlICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9ib29sICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZyAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsZ3JvdXAgICAgICAgICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX2VudW0gKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X2VudW0gKCkpOworCisKKyAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgorICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIgICAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMiAgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDY0ICAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQ2NCAgKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDMyKCkpOworICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSAgKCkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2Uub3B0aW9uYWxfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9FUSgiIiAgICwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzICAgKCkpOworCisgIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAoKS5oYXNfYSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgKCkuaGFzX2JiKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS5oYXNfYygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgKCkuaGFzX2QoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxncm91cCAgICAgICAgICAgKCkuYSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgKCkuYmIoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLmMoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpLmQoKSk7CisKKyAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtICgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKKworCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7CisKKworICAvLyBoYXNfYmxhaCgpIHNob3VsZCBhbHNvIGJlIGZhbHNlIGZvciBhbGwgZGVmYXVsdCBmaWVsZHMuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2ludDMyICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9pbnQ2NCAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDMyICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3VpbnQ2NCAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zaW50MzIgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2ZpeGVkMzIgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9maXhlZDY0ICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NmaXhlZDY0KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9mbG9hdCAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZG91YmxlICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2Jvb2wgICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfbmVzdGVkX2VudW0gKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKKworCisgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCisgIEVYUEVDVF9FUSggNDEgICAgLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIgICAoKSk7CisgIEVYUEVDVF9FUSggNDIgICAgLCBtZXNzYWdlLmRlZmF1bHRfaW50NjQgICAoKSk7CisgIEVYUEVDVF9FUSggNDMgICAgLCBtZXNzYWdlLmRlZmF1bHRfdWludDMyICAoKSk7CisgIEVYUEVDVF9FUSggNDQgICAgLCBtZXNzYWdlLmRlZmF1bHRfdWludDY0ICAoKSk7CisgIEVYUEVDVF9FUSgtNDUgICAgLCBtZXNzYWdlLmRlZmF1bHRfc2ludDMyICAoKSk7CisgIEVYUEVDVF9FUSggNDYgICAgLCBtZXNzYWdlLmRlZmF1bHRfc2ludDY0ICAoKSk7CisgIEVYUEVDVF9FUSggNDcgICAgLCBtZXNzYWdlLmRlZmF1bHRfZml4ZWQzMiAoKSk7CisgIEVYUEVDVF9FUSggNDggICAgLCBtZXNzYWdlLmRlZmF1bHRfZml4ZWQ2NCAoKSk7CisgIEVYUEVDVF9FUSggNDkgICAgLCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIoKSk7CisgIEVYUEVDVF9FUSgtNTAgICAgLCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkNjQoKSk7CisgIEVYUEVDVF9FUSggNTEuNSAgLCBtZXNzYWdlLmRlZmF1bHRfZmxvYXQgICAoKSk7CisgIEVYUEVDVF9FUSggNTJlMyAgLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlICAoKSk7CisgIEVYUEVDVF9FUSh0cnVlICAgLCBtZXNzYWdlLmRlZmF1bHRfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9FUSgiaGVsbG8iLCBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nICAoKSk7CisgIEVYUEVDVF9FUSgid29ybGQiLCBtZXNzYWdlLmRlZmF1bHRfYnl0ZXMgICAoKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgLCBtZXNzYWdlLmRlZmF1bHRfbmVzdGVkX2VudW0gKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIgICAgICAsIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUiwgbWVzc2FnZS5kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlJiBtZXNzYWdlKSB7CisgIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAorICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAorICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7CisKKworICBFWFBFQ1RfRVEoMjAxICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIgICAoMCkpOworICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQgICAoMCkpOworICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyICAoMCkpOworICBFWFBFQ1RfRVEoMjA0ICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyICAoMCkpOworICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoMjA3ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMiAoMCkpOworICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCAoMCkpOworICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMCkpOworICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMCkpOworICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMCkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMCkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMCkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDApLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSICwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIgICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgwKSk7CisKKworICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KKyAgRVhQRUNUX0VRKDUwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDUwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDEpKTsKKyAgRVhQRUNUX0VRKDUwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDEpKTsKKyAgRVhQRUNUX0VRKDUwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDUxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDEpKTsKKyAgRVhQRUNUX0VRKDUxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDEpKTsKKyAgRVhQRUNUX0VRKDUxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDEpKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDEpKTsKKyAgRVhQRUNUX0VRKCI1MTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDEpKTsKKyAgRVhQRUNUX0VRKCI1MTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDEpKTsKKworICBFWFBFQ1RfRVEoNTE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgxKS5hKCkpOworICBFWFBFQ1RfRVEoNTE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgxKS5iYigpKTsKKyAgRVhQRUNUX0VRKDUxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSkuYygpKTsKKyAgRVhQRUNUX0VRKDUyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMSkuZCgpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTywgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSAoMSkpOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OlNldFBhY2tlZEZpZWxkcyh1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSogbWVzc2FnZSkgeworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ludDMyICAgKDYwMSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfaW50NjQgICAoNjAyKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF91aW50MzIgICg2MDMpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3VpbnQ2NCAgKDYwNCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDMyICAoNjA1KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zaW50NjQgICg2MDYpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2ZpeGVkMzIgKDYwNyk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQ2NCAoNjA4KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zZml4ZWQzMig2MDkpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDY0KDYxMCk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZmxvYXQgICAoNjExKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9kb3VibGUgICg2MTIpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2Jvb2wgICAgKHRydWUpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2VudW0gICAgKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSKTsKKyAgLy8gYWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkCisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfaW50MzIgICAoNzAxKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQ2NCAgICg3MDIpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3VpbnQzMiAgKDcwMyk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDY0ICAoNzA0KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zaW50MzIgICg3MDUpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NpbnQ2NCAgKDcwNik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQzMiAoNzA3KTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9maXhlZDY0ICg3MDgpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDMyKDcwOSk7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ZpeGVkNjQoNzEwKTsKKyAgbWVzc2FnZS0+YWRkX3BhY2tlZF9mbG9hdCAgICg3MTEpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2RvdWJsZSAgKDcxMik7CisgIG1lc3NhZ2UtPmFkZF9wYWNrZWRfYm9vbCAgICAoZmFsc2UpOworICBtZXNzYWdlLT5hZGRfcGFja2VkX2VudW0gICAgKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6TW9kaWZ5UGFja2VkRmllbGRzKHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfaW50MzIgICAoMSwgODAxKTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9pbnQ2NCAgICgxLCA4MDIpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3VpbnQzMiAgKDEsIDgwMyk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfdWludDY0ICAoMSwgODA0KTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9zaW50MzIgICgxLCA4MDUpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3NpbnQ2NCAgKDEsIDgwNik7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfZml4ZWQzMiAoMSwgODA3KTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9maXhlZDY0ICgxLCA4MDgpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX3NmaXhlZDMyKDEsIDgwOSk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfc2ZpeGVkNjQoMSwgODEwKTsKKyAgbWVzc2FnZS0+c2V0X3BhY2tlZF9mbG9hdCAgICgxLCA4MTEpOworICBtZXNzYWdlLT5zZXRfcGFja2VkX2RvdWJsZSAgKDEsIDgxMik7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfYm9vbCAgICAoMSwgdHJ1ZSk7CisgIG1lc3NhZ2UtPnNldF9wYWNrZWRfZW51bSAgICAoMSwgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUmIG1lc3NhZ2UpIHsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2ludDMyX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfdWludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zaW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0X3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9mbG9hdF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZG91YmxlX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9lbnVtX3NpemUgICAgKCkpOworCisgIEVYUEVDVF9FUSg2MDEgICwgbWVzc2FnZS5wYWNrZWRfaW50MzIgICAoMCkpOworICBFWFBFQ1RfRVEoNjAyICAsIG1lc3NhZ2UucGFja2VkX2ludDY0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDYwMyAgLCBtZXNzYWdlLnBhY2tlZF91aW50MzIgICgwKSk7CisgIEVYUEVDVF9FUSg2MDQgICwgbWVzc2FnZS5wYWNrZWRfdWludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoNjA1ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNiAgLCBtZXNzYWdlLnBhY2tlZF9zaW50NjQgICgwKSk7CisgIEVYUEVDVF9FUSg2MDcgICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMiAoMCkpOworICBFWFBFQ1RfRVEoNjA4ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQgKDApKTsKKyAgRVhQRUNUX0VRKDYwOSAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSg2MTAgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoNjExICAsIG1lc3NhZ2UucGFja2VkX2Zsb2F0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDYxMiAgLCBtZXNzYWdlLnBhY2tlZF9kb3VibGUgICgwKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5wYWNrZWRfYm9vbCAgICAoMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIsIG1lc3NhZ2UucGFja2VkX2VudW0oMCkpOworCisgIEVYUEVDVF9FUSg3MDEgICwgbWVzc2FnZS5wYWNrZWRfaW50MzIgICAoMSkpOworICBFWFBFQ1RfRVEoNzAyICAsIG1lc3NhZ2UucGFja2VkX2ludDY0ICAgKDEpKTsKKyAgRVhQRUNUX0VRKDcwMyAgLCBtZXNzYWdlLnBhY2tlZF91aW50MzIgICgxKSk7CisgIEVYUEVDVF9FUSg3MDQgICwgbWVzc2FnZS5wYWNrZWRfdWludDY0ICAoMSkpOworICBFWFBFQ1RfRVEoNzA1ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQzMiAgKDEpKTsKKyAgRVhQRUNUX0VRKDcwNiAgLCBtZXNzYWdlLnBhY2tlZF9zaW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSg3MDcgICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMiAoMSkpOworICBFWFBFQ1RfRVEoNzA4ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQgKDEpKTsKKyAgRVhQRUNUX0VRKDcwOSAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQzMigxKSk7CisgIEVYUEVDVF9FUSg3MTAgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjQoMSkpOworICBFWFBFQ1RfRVEoNzExICAsIG1lc3NhZ2UucGFja2VkX2Zsb2F0ICAgKDEpKTsKKyAgRVhQRUNUX0VRKDcxMiAgLCBtZXNzYWdlLnBhY2tlZF9kb3VibGUgICgxKSk7CisgIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5wYWNrZWRfYm9vbCAgICAoMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVosIG1lc3NhZ2UucGFja2VkX2VudW0oMSkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRDbGVhcigKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSYgbWVzc2FnZSkgeworICAvLyBQYWNrZWQgcmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2ludDMyX3NpemUgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NF9zaXplICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfdWludDMyX3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NF9zaXplICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9zaW50MzJfc2l6ZSAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfc2ludDY0X3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0X3NpemUgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9mbG9hdF9zaXplICAgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZG91YmxlX3NpemUgICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9lbnVtX3NpemUgICAgKCkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRGaWVsZHNNb2RpZmllZCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSYgbWVzc2FnZSkgeworICAvLyBEbyB0aGUgc2FtZSBmb3IgcGFja2VkIHJlcGVhdGVkIGZpZWxkcy4KKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2ludDMyX3NpemUgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfdWludDMyX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NF9zaXplICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zaW50MzJfc2l6ZSAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ludDY0X3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzJfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0X3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0X3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9mbG9hdF9zaXplICAgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZG91YmxlX3NpemUgICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2Jvb2xfc2l6ZSAgICAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9lbnVtX3NpemUgICAgKCkpOworCisgIEVYUEVDVF9FUSg2MDEgICwgbWVzc2FnZS5wYWNrZWRfaW50MzIgICAoMCkpOworICBFWFBFQ1RfRVEoNjAyICAsIG1lc3NhZ2UucGFja2VkX2ludDY0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDYwMyAgLCBtZXNzYWdlLnBhY2tlZF91aW50MzIgICgwKSk7CisgIEVYUEVDVF9FUSg2MDQgICwgbWVzc2FnZS5wYWNrZWRfdWludDY0ICAoMCkpOworICBFWFBFQ1RfRVEoNjA1ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQzMiAgKDApKTsKKyAgRVhQRUNUX0VRKDYwNiAgLCBtZXNzYWdlLnBhY2tlZF9zaW50NjQgICgwKSk7CisgIEVYUEVDVF9FUSg2MDcgICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMiAoMCkpOworICBFWFBFQ1RfRVEoNjA4ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQgKDApKTsKKyAgRVhQRUNUX0VRKDYwOSAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQzMigwKSk7CisgIEVYUEVDVF9FUSg2MTAgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjQoMCkpOworICBFWFBFQ1RfRVEoNjExICAsIG1lc3NhZ2UucGFja2VkX2Zsb2F0ICAgKDApKTsKKyAgRVhQRUNUX0VRKDYxMiAgLCBtZXNzYWdlLnBhY2tlZF9kb3VibGUgICgwKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5wYWNrZWRfYm9vbCAgICAoMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIsIG1lc3NhZ2UucGFja2VkX2VudW0oMCkpOworICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KKyAgRVhQRUNUX0VRKDgwMSAgLCBtZXNzYWdlLnBhY2tlZF9pbnQzMiAgICgxKSk7CisgIEVYUEVDVF9FUSg4MDIgICwgbWVzc2FnZS5wYWNrZWRfaW50NjQgICAoMSkpOworICBFWFBFQ1RfRVEoODAzICAsIG1lc3NhZ2UucGFja2VkX3VpbnQzMiAgKDEpKTsKKyAgRVhQRUNUX0VRKDgwNCAgLCBtZXNzYWdlLnBhY2tlZF91aW50NjQgICgxKSk7CisgIEVYUEVDVF9FUSg4MDUgICwgbWVzc2FnZS5wYWNrZWRfc2ludDMyICAoMSkpOworICBFWFBFQ1RfRVEoODA2ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NCAgKDEpKTsKKyAgRVhQRUNUX0VRKDgwNyAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyICgxKSk7CisgIEVYUEVDVF9FUSg4MDggICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NCAoMSkpOworICBFWFBFQ1RfRVEoODA5ICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyKDEpKTsKKyAgRVhQRUNUX0VRKDgxMCAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NCgxKSk7CisgIEVYUEVDVF9FUSg4MTEgICwgbWVzc2FnZS5wYWNrZWRfZmxvYXQgICAoMSkpOworICBFWFBFQ1RfRVEoODEyICAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZSAgKDEpKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnBhY2tlZF9ib29sICAgICgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTywgbWVzc2FnZS5wYWNrZWRfZW51bSgxKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEV4dGVuc2lvbnMKKy8vCisvLyBBbGwgdGhpcyBjb2RlIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0byB0aGUgYWJvdmUgY29kZSBleGNlcHQgdGhhdCBpdCdzCisvLyBtYW5pcHVsYXRpbmcgZXh0ZW5zaW9uIGZpZWxkcyBpbnN0ZWFkIG9mIG5vcm1hbCBvbmVzLgorLy8KKy8vIEkgZ2F2ZSB1cCBvbiB0aGUgODAtY2hhciBsaW1pdCBoZXJlLiAgU29ycnkuCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpTZXRBbGxFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMTAxKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMTAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMTAzKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMTA0KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMTA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMTA2KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMTA3KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMTA4KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMTA5KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMTEwKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMTExKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMTEyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgdHJ1ZSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsICIxMTUiKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICwgIjExNiIpOworCisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICktPnNldF9hKDExNyk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICktPnNldF9iYigxMTgpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLT5zZXRfYygxMTkpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLT5zZXRfZCgxMjApOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiAgICAgICk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBWik7CisKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDIwMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDIwMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDIwMyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDIwNCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDIwNSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDIwNik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDIwNyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDIwOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDIwOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDIxMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDIxMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDIxMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIHRydWUpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgLCAiMjE1Iik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsICIyMTYiKTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICktPnNldF9hKDIxNyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS0+c2V0X2JiKDIxOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS0+c2V0X2MoMjE5KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLT5zZXRfZCgyMjApOworCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSICk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiAgICAgICk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUik7CisKKworICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDMwMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDMwMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDMwMyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDMwNCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDMwNSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDMwNik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDMwNyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDMwOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDMwOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDMxMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDMxMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDMxMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIGZhbHNlKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICwgIjMxNSIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgLCAiMzE2Iik7CisKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICApLT5zZXRfYSgzMTcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICktPnNldF9iYigzMTgpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSktPnNldF9jKDMxOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS0+c2V0X2QoMzIwKTsKKworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSwgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVogICAgICApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICwgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVopOworCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDQwMSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgNDAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCA0MDMpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDQwNCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgNDA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCA0MDYpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDQwNyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgNDA4KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCA0MDkpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDQxMCk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgNDExKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCA0MTIpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIGZhbHNlKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19leHRlbnNpb25fbGl0ZSAgLCAiNDE1Iik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICwgIjQxNiIpOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSwgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08gICAgICApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTyk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6TW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMSwgNTAxKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMSwgNTAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMSwgNTAzKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMSwgNTA0KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMSwgNTA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMSwgNTA2KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMSwgNTA3KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMSwgNTA4KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMSwgNTA5KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMSwgNTEwKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMSwgNTExKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMSwgNTEyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgMSwgdHJ1ZSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsIDEsICI1MTUiKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICwgMSwgIjUxNiIpOworCisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICwgMSktPnNldF9hKDUxNyk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMSktPnNldF9iYig1MTgpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDEpLT5zZXRfYyg1MTkpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAsIDEpLT5zZXRfZCg1MjApOworCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAxLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PICk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCAxLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAxLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTyk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKSB7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICApLmhhc19hKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmhhc19jKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS5oYXNfZCgpKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworCisKKyAgRVhQRUNUX0VRKDEwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDEwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDEwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDEwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDEwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDEwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDEwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKDEwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKDEwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDExMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDExMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDExMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb25fbGl0ZSAgICApKTsKKyAgRVhQRUNUX0VRKCIxMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKCIxMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICApKTsKKworICBFWFBFQ1RfRVEoMTE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgKS5hKCkpOworICBFWFBFQ1RfRVEoMTE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS5iYigpKTsKKyAgRVhQRUNUX0VRKDExOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkuYygpKTsKKyAgRVhQRUNUX0VRKDEyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkuZCgpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBWiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOworCisKKyAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDApKTsKKyAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDApKTsKKyAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKyAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDApKTsKKyAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKworICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgLCAwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAwKS5iYigpKTsKKyAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMCkuYygpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMCkuZCgpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBUiAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICwgMCkpOworCisKKyAgRVhQRUNUX0VRKDMwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDEpKTsKKyAgRVhQRUNUX0VRKDMwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDMxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDMxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKyAgRVhQRUNUX0VRKDMxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDEpKTsKKyAgRVhQRUNUX0VRKCIzMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKCIzMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKworICBFWFBFQ1RfRVEoMzE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgLCAxKS5hKCkpOworICBFWFBFQ1RfRVEoMzE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAxKS5iYigpKTsKKyAgRVhQRUNUX0VRKDMxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMSkuYygpKTsKKyAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMSkuZCgpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBWiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICwgMSkpOworCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7CisKKworICBFWFBFQ1RfRVEoNDAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9FUSg0MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDQwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoNDA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSg0MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDQwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoNDA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9FUSg0MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKDQwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoNDEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSg0MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDQxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEVYUEVDVF9FUSgiNDE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKCI0MTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7CisKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpIHsKKyAgc3RyaW5nIHNlcmlhbGl6ZWQ7CisgIEFTU0VSVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKKyAgRVhQRUNUX0VRKCIiLCBzZXJpYWxpemVkKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuQnl0ZVNpemUoKSk7CisKKyAgLy8gaGFzX2JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKKworCisgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb25fbGl0ZSAgICApKTsKKyAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICApKTsKKworICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICApLmhhc19hKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkuaGFzX2JiKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkuaGFzX2MoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS5oYXNfZCgpKTsKKworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICkuYSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLmJiKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkuYygpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLmQoKSk7CisKKyAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9GT08sIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKKworCisgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisKKworICAvLyBoYXNfYmxhaCgpIHNob3VsZCBhbHNvIGJlIGZhbHNlIGZvciBhbGwgZGVmYXVsdCBmaWVsZHMuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKKworCisgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCisgIEVYUEVDVF9FUSggNDEgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoIDQyICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKCA0MyAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSggNDQgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoLTQ1ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKCA0NiAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSggNDcgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEoIDQ4ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKCA0OSAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgtNTAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoIDUxLjUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKCA1MmUzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSh0cnVlICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOworICBFWFBFQ1RfRVEoImhlbGxvIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKCJ3b3JsZCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CisKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKSB7CisgIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAorICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAorICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisKKworICBFWFBFQ1RfRVEoMjAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMCkpOworICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMCkpOworICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoMjA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoMjA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMCkpOworICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMCkpOworICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMCkpOworICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgMCkpOworICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICwgMCkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICAsIDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAsIDApLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAwKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAwKS5kKCkpOworCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICwgMCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIgICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAwKSk7CisKKworICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KKyAgRVhQRUNUX0VRKDUwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDEpKTsKKyAgRVhQRUNUX0VRKDUwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDUxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDUxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKyAgRVhQRUNUX0VRKDUxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDEpKTsKKyAgRVhQRUNUX0VRKCI1MTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKCI1MTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKworICBFWFBFQ1RfRVEoNTE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgLCAxKS5hKCkpOworICBFWFBFQ1RfRVEoNTE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAxKS5iYigpKTsKKyAgRVhQRUNUX0VRKDUxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMSkuYygpKTsKKyAgRVhQRUNUX0VRKDUyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMSkuZCgpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICwgMSkpOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OlNldFBhY2tlZEV4dGVuc2lvbnMoCisgICAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSogbWVzc2FnZSkgeworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgNjAxKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDYwMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCA2MDMpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgNjA0KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDYwNSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCA2MDYpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgNjA3KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDYwOCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCA2MDkpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgNjEwKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDYxMSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCA2MTIpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgdHJ1ZSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSKTsKKyAgLy8gYWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkCisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCA3MDEpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgNzAyKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDcwMyk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCA3MDQpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgNzA1KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDcwNik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCA3MDcpOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgNzA4KTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDcwOSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCA3MTApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgNzExKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDcxMik7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCBmYWxzZSk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6TW9kaWZ5UGFja2VkRXh0ZW5zaW9ucygKKyAgICB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlKiBtZXNzYWdlKSB7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCAxLCA4MDEpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMSwgODAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDEsIDgwMyk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxLCA4MDQpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMSwgODA1KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDEsIDgwNik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCAxLCA4MDcpOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMSwgODA4KTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDEsIDgwOSk7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxLCA4MTApOworICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMSwgODExKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDEsIDgxMik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCAxLCB0cnVlKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSAgICAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisKKyAgRVhQRUNUX0VRKDYwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMCkpOworICBFWFBFQ1RfRVEoNjAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoNjA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMCkpOworICBFWFBFQ1RfRVEoNjA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDYxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAwKSk7CisgIEVYUEVDVF9FUSg2MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMCkpOworICBFWFBFQ1RfRVEoNjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCAwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiwKKyAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNzAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCAxKSk7CisgIEVYUEVDVF9FUSg3MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOworICBFWFBFQ1RfRVEoNzA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSg3MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOworICBFWFBFQ1RfRVEoNzA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCAxKSk7CisgIEVYUEVDVF9FUSg3MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKKyAgRVhQRUNUX0VRKDcxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCAxKSk7CisgIEVYUEVDVF9FUSg3MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOworICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDEpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlLCAxKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNDbGVhcigKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKSB7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSAgICApKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc01vZGlmaWVkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpIHsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOworICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDApKTsKKyAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOworICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKKyAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOworICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDApKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlLCAwKSk7CisKKyAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCisgIEVYUEVDVF9FUSg4MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMSkpOworICBFWFBFQ1RfRVEoODAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKyAgRVhQRUNUX0VRKDgwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSg4MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOworICBFWFBFQ1RfRVEoODA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKKyAgRVhQRUNUX0VRKDgwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSg4MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMSkpOworICBFWFBFQ1RfRVEoODA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDEpKTsKKyAgRVhQRUNUX0VRKDgwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7CisgIEVYUEVDVF9FUSg4MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMSkpOworICBFWFBFQ1RfRVEoODExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKKyAgRVhQRUNUX0VRKDgxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCAxKSk7CisgIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgMSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08sCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTM1YWFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuaApAQCAtMCwwICsxLDEwMSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1RFU1RfVVRJTF9MSVRFX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVEVTVF9VVElMX0xJVEVfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK25hbWVzcGFjZSB1bml0dGVzdCA9IHByb3RvYnVmX3VuaXR0ZXN0OworbmFtZXNwYWNlIHVuaXR0ZXN0X2ltcG9ydCA9IHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydDsKKworY2xhc3MgVGVzdFV0aWxMaXRlIHsKKyBwdWJsaWM6CisgIC8vIFNldCBldmVyeSBmaWVsZCBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KKyAgc3RhdGljIHZvaWQgU2V0QWxsRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgU2V0QWxsRXh0ZW5zaW9ucyh1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgU2V0UGFja2VkRmllbGRzKHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgU2V0UGFja2VkRXh0ZW5zaW9ucyh1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlKiBtZXNzYWdlKTsKKworICAvLyBVc2UgdGhlIHJlcGVhdGVkIHZlcnNpb25zIG9mIHRoZSBzZXRfKigpIGFjY2Vzc29ycyB0byBtb2RpZnkgYWxsIHRoZQorICAvLyByZXBlYXRlZCBmaWVsZHMgb2YgdGhlIG1lc3NzYWdlICh3aGljaCBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4KKyAgLy8gaW5pdGlhbGl6ZWQgd2l0aCBTZXQqRmllbGRzKCkpLiAgU2V0KkZpZWxkcygpIGl0c2VsZiBvbmx5IHRlc3RzCisgIC8vIHRoZSBhZGRfKigpIGFjY2Vzc29ycy4KKyAgc3RhdGljIHZvaWQgTW9kaWZ5UmVwZWF0ZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoCisgICAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgTW9kaWZ5UGFja2VkRmllbGRzKHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgTW9kaWZ5UGFja2VkRXh0ZW5zaW9ucygKKyAgICAgIHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBoYXZlIHRoZSB2YWx1ZXMgdGhhdCB0aGV5IHNob3VsZCBoYXZlIGFmdGVyCisgIC8vIFNldCpGaWVsZHMoKSBpcyBjYWxsZWQuCisgIHN0YXRpYyB2b2lkIEV4cGVjdEFsbEZpZWxkc1NldChjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdEFsbEV4dGVuc2lvbnNTZXQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0UGFja2VkRmllbGRzU2V0KAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSk7CisKKyAgLy8gRXhwZWN0IHRoYXQgdGhlIG1lc3NhZ2UgaXMgbW9kaWZpZWQgYXMgd291bGQgYmUgZXhwZWN0ZWQgZnJvbQorICAvLyBNb2RpZnkqRmllbGRzKCkuCisgIHN0YXRpYyB2b2lkIEV4cGVjdFJlcGVhdGVkRmllbGRzTW9kaWZpZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZEZpZWxkc01vZGlmaWVkKAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zTW9kaWZpZWQoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKTsKKworICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgc3RhdGljIHZvaWQgRXhwZWN0Q2xlYXIoY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RFeHRlbnNpb25zQ2xlYXIoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0UGFja2VkQ2xlYXIoY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIoCisgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKTsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXN0VXRpbExpdGUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1RFU1RfVVRJTF9MSVRFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDg5OGU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyOGQzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWVhOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQKQEAgLTAsMCArMSwxMTYgQEAKK29wdGlvbmFsX2ludDMyOiAxMDEKK29wdGlvbmFsX2ludDY0OiAxMDIKK29wdGlvbmFsX3VpbnQzMjogMTAzCitvcHRpb25hbF91aW50NjQ6IDEwNAorb3B0aW9uYWxfc2ludDMyOiAxMDUKK29wdGlvbmFsX3NpbnQ2NDogMTA2CitvcHRpb25hbF9maXhlZDMyOiAxMDcKK29wdGlvbmFsX2ZpeGVkNjQ6IDEwOAorb3B0aW9uYWxfc2ZpeGVkMzI6IDEwOQorb3B0aW9uYWxfc2ZpeGVkNjQ6IDExMAorb3B0aW9uYWxfZmxvYXQ6IDExMQorb3B0aW9uYWxfZG91YmxlOiAxMTIKK29wdGlvbmFsX2Jvb2w6IHRydWUKK29wdGlvbmFsX3N0cmluZzogIjExNSIKK29wdGlvbmFsX2J5dGVzOiAiMTE2IgorT3B0aW9uYWxHcm91cCB7CisgIGE6IDExNworfQorb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeworICBiYjogMTE4Cit9CitvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgeworICBjOiAxMTkKK30KK29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIHsKKyAgZDogMTIwCit9CitvcHRpb25hbF9uZXN0ZWRfZW51bTogQkFaCitvcHRpb25hbF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFaCitvcHRpb25hbF9pbXBvcnRfZW51bTogSU1QT1JUX0JBWgorb3B0aW9uYWxfc3RyaW5nX3BpZWNlOiAiMTI0Igorb3B0aW9uYWxfY29yZDogIjEyNSIKK3JlcGVhdGVkX2ludDMyOiAyMDEKK3JlcGVhdGVkX2ludDMyOiAzMDEKK3JlcGVhdGVkX2ludDY0OiAyMDIKK3JlcGVhdGVkX2ludDY0OiAzMDIKK3JlcGVhdGVkX3VpbnQzMjogMjAzCityZXBlYXRlZF91aW50MzI6IDMwMworcmVwZWF0ZWRfdWludDY0OiAyMDQKK3JlcGVhdGVkX3VpbnQ2NDogMzA0CityZXBlYXRlZF9zaW50MzI6IDIwNQorcmVwZWF0ZWRfc2ludDMyOiAzMDUKK3JlcGVhdGVkX3NpbnQ2NDogMjA2CityZXBlYXRlZF9zaW50NjQ6IDMwNgorcmVwZWF0ZWRfZml4ZWQzMjogMjA3CityZXBlYXRlZF9maXhlZDMyOiAzMDcKK3JlcGVhdGVkX2ZpeGVkNjQ6IDIwOAorcmVwZWF0ZWRfZml4ZWQ2NDogMzA4CityZXBlYXRlZF9zZml4ZWQzMjogMjA5CityZXBlYXRlZF9zZml4ZWQzMjogMzA5CityZXBlYXRlZF9zZml4ZWQ2NDogMjEwCityZXBlYXRlZF9zZml4ZWQ2NDogMzEwCityZXBlYXRlZF9mbG9hdDogMjExCityZXBlYXRlZF9mbG9hdDogMzExCityZXBlYXRlZF9kb3VibGU6IDIxMgorcmVwZWF0ZWRfZG91YmxlOiAzMTIKK3JlcGVhdGVkX2Jvb2w6IHRydWUKK3JlcGVhdGVkX2Jvb2w6IGZhbHNlCityZXBlYXRlZF9zdHJpbmc6ICIyMTUiCityZXBlYXRlZF9zdHJpbmc6ICIzMTUiCityZXBlYXRlZF9ieXRlczogIjIxNiIKK3JlcGVhdGVkX2J5dGVzOiAiMzE2IgorUmVwZWF0ZWRHcm91cCB7CisgIGE6IDIxNworfQorUmVwZWF0ZWRHcm91cCB7CisgIGE6IDMxNworfQorcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeworICBiYjogMjE4Cit9CityZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7CisgIGJiOiAzMTgKK30KK3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSB7CisgIGM6IDIxOQorfQorcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIHsKKyAgYzogMzE5Cit9CityZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSB7CisgIGQ6IDIyMAorfQorcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgeworICBkOiAzMjAKK30KK3JlcGVhdGVkX25lc3RlZF9lbnVtOiBCQVIKK3JlcGVhdGVkX25lc3RlZF9lbnVtOiBCQVoKK3JlcGVhdGVkX2ZvcmVpZ25fZW51bTogRk9SRUlHTl9CQVIKK3JlcGVhdGVkX2ZvcmVpZ25fZW51bTogRk9SRUlHTl9CQVoKK3JlcGVhdGVkX2ltcG9ydF9lbnVtOiBJTVBPUlRfQkFSCityZXBlYXRlZF9pbXBvcnRfZW51bTogSU1QT1JUX0JBWgorcmVwZWF0ZWRfc3RyaW5nX3BpZWNlOiAiMjI0IgorcmVwZWF0ZWRfc3RyaW5nX3BpZWNlOiAiMzI0IgorcmVwZWF0ZWRfY29yZDogIjIyNSIKK3JlcGVhdGVkX2NvcmQ6ICIzMjUiCitkZWZhdWx0X2ludDMyOiA0MDEKK2RlZmF1bHRfaW50NjQ6IDQwMgorZGVmYXVsdF91aW50MzI6IDQwMworZGVmYXVsdF91aW50NjQ6IDQwNAorZGVmYXVsdF9zaW50MzI6IDQwNQorZGVmYXVsdF9zaW50NjQ6IDQwNgorZGVmYXVsdF9maXhlZDMyOiA0MDcKK2RlZmF1bHRfZml4ZWQ2NDogNDA4CitkZWZhdWx0X3NmaXhlZDMyOiA0MDkKK2RlZmF1bHRfc2ZpeGVkNjQ6IDQxMAorZGVmYXVsdF9mbG9hdDogNDExCitkZWZhdWx0X2RvdWJsZTogNDEyCitkZWZhdWx0X2Jvb2w6IGZhbHNlCitkZWZhdWx0X3N0cmluZzogIjQxNSIKK2RlZmF1bHRfYnl0ZXM6ICI0MTYiCitkZWZhdWx0X25lc3RlZF9lbnVtOiBGT08KK2RlZmF1bHRfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0ZPTworZGVmYXVsdF9pbXBvcnRfZW51bTogSU1QT1JUX0ZPTworZGVmYXVsdF9zdHJpbmdfcGllY2U6ICI0MjQiCitkZWZhdWx0X2NvcmQ6ICI0MjUiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTdiZWFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dApAQCAtMCwwICsxLDExNiBAQAorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl06IDEwMQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl06IDEwMgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25dOiAxMDMKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uXTogMTA0CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl06IDEwNQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25dOiAxMDYKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl06IDEwNworW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uXTogMTA4CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uXTogMTA5CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uXTogMTEwCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uXTogMTExCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl06IDExMgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uXTogdHJ1ZQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25dOiAiMTE1IgorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl06ICIxMTYiCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxncm91cF9leHRlbnNpb25dIHsKKyAgYTogMTE3Cit9CitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGJiOiAxMTgKK30KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGM6IDExOQorfQorW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0geworICBkOiAxMjAKK30KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25dOiBCQVoKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXTogRk9SRUlHTl9CQVoKK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25dOiBJTVBPUlRfQkFaCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl06ICIxMjQiCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfY29yZF9leHRlbnNpb25dOiAiMTI1IgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl06IDIwMQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl06IDMwMQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl06IDIwMgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl06IDMwMgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dOiAyMDMKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uXTogMzAzCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl06IDIwNAorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dOiAzMDQKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uXTogMjA1CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl06IDMwNQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dOiAyMDYKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uXTogMzA2CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25dOiAyMDcKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl06IDMwNworW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uXTogMjA4CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25dOiAzMDgKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25dOiAyMDkKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25dOiAzMDkKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dOiAyMTAKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dOiAzMTAKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mbG9hdF9leHRlbnNpb25dOiAyMTEKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mbG9hdF9leHRlbnNpb25dOiAzMTEKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uXTogMjEyCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl06IDMxMgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uXTogdHJ1ZQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uXTogZmFsc2UKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uXTogIjIxNSIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uXTogIjMxNSIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9ieXRlc19leHRlbnNpb25dOiAiMjE2IgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl06ICIzMTYiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRncm91cF9leHRlbnNpb25dIHsKKyAgYTogMjE3Cit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRncm91cF9leHRlbnNpb25dIHsKKyAgYTogMzE3Cit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGJiOiAyMTgKK30KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgYmI6IDMxOAorfQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgYzogMjE5Cit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl0geworICBjOiAzMTkKK30KK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dIHsKKyAgZDogMjIwCit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGQ6IDMyMAorfQorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl06IEJBUgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl06IEJBWgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dOiBGT1JFSUdOX0JBUgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dOiBGT1JFSUdOX0JBWgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl06IElNUE9SVF9CQVIKK1twcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25dOiBJTVBPUlRfQkFaCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl06ICIyMjQiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl06ICIzMjQiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfY29yZF9leHRlbnNpb25dOiAiMjI1IgorW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uXTogIjMyNSIKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ludDMyX2V4dGVuc2lvbl06IDQwMQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uXTogNDAyCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uXTogNDAzCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uXTogNDA0CitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uXTogNDA1CitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uXTogNDA2CitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl06IDQwNworW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25dOiA0MDgKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl06IDQwOQorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uXTogNDEwCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9mbG9hdF9leHRlbnNpb25dOiA0MTEKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2RvdWJsZV9leHRlbnNpb25dOiA0MTIKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uXTogZmFsc2UKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3N0cmluZ19leHRlbnNpb25dOiAiNDE1IgorW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uXTogIjQxNiIKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl06IEZPTworW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fRk9PCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25dOiBJTVBPUlRfRk9PCitbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIjQyNCIKK1twcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2NvcmRfZXh0ZW5zaW9uXTogIjQyNSIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjI0NzgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCkBAIC0wLDAgKzEsMTc2IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyBlbXVsYXRlcyBnb29nbGUzL2ZpbGUvYmFzZS9maWxlLmNjCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gIC8vIHllYWgsIHJpZ2h0CisjaW5jbHVkZSA8d2luZG93cy5oPiAgICAgICAgIC8vIEZpbmQqRmlsZSgpLiAgOigKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGRpcmVjdC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBta2RpcihuYW1lLCBtb2RlKSBta2RpcihuYW1lKQorLy8gV2luZG93cyBkb2Vzbid0IGhhdmUgc3ltYm9saWMgbGlua3MuCisjZGVmaW5lIGxzdGF0IHN0YXQKKyNpZm5kZWYgRl9PSworI2RlZmluZSBGX09LIDAwICAvLyBub3QgZGVmaW5lZCBieSBNU1ZDIGZvciB3aGF0ZXZlciByZWFzb24KKyNlbmRpZgorI2VuZGlmCisKK2Jvb2wgRmlsZTo6RXhpc3RzKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICByZXR1cm4gYWNjZXNzKG5hbWUuY19zdHIoKSwgRl9PSykgPT0gMDsKK30KKworYm9vbCBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nKGNvbnN0IHN0cmluZyYgbmFtZSwgc3RyaW5nKiBvdXRwdXQpIHsKKyAgY2hhciBidWZmZXJbMTAyNF07CisgIEZJTEUqIGZpbGUgPSBmb3BlbihuYW1lLmNfc3RyKCksICJyYiIpOworICBpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzaXplX3QgbiA9IGZyZWFkKGJ1ZmZlciwgMSwgc2l6ZW9mKGJ1ZmZlciksIGZpbGUpOworICAgIGlmIChuIDw9IDApIGJyZWFrOworICAgIG91dHB1dC0+YXBwZW5kKGJ1ZmZlciwgbik7CisgIH0KKworICBpbnQgZXJyb3IgPSBmZXJyb3IoZmlsZSk7CisgIGlmIChmY2xvc2UoZmlsZSkgIT0gMCkgcmV0dXJuIGZhbHNlOworICByZXR1cm4gZXJyb3IgPT0gMDsKK30KKwordm9pZCBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nT3JEaWUoY29uc3Qgc3RyaW5nJiBuYW1lLCBzdHJpbmcqIG91dHB1dCkgeworICBHT09HTEVfQ0hFQ0soUmVhZEZpbGVUb1N0cmluZyhuYW1lLCBvdXRwdXQpKSA8PCAiQ291bGQgbm90IHJlYWQ6ICIgPDwgbmFtZTsKK30KKwordm9pZCBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKGNvbnN0IHN0cmluZyYgY29udGVudHMsIGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBGSUxFKiBmaWxlID0gZm9wZW4obmFtZS5jX3N0cigpLCAid2IiKTsKKyAgR09PR0xFX0NIRUNLKGZpbGUgIT0gTlVMTCkKKyAgICAgIDw8ICJmb3BlbigiIDw8IG5hbWUgPDwgIiwgXCJ3YlwiKTogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgIEdPT0dMRV9DSEVDS19FUShmd3JpdGUoY29udGVudHMuZGF0YSgpLCAxLCBjb250ZW50cy5zaXplKCksIGZpbGUpLAorICAgICAgICAgICAgICAgICAgY29udGVudHMuc2l6ZSgpKQorICAgICAgPDwgImZ3cml0ZSgiIDw8IG5hbWUgPDwgIik6ICIgPDwgc3RyZXJyb3IoZXJybm8pOworICBHT09HTEVfQ0hFQ0soZmNsb3NlKGZpbGUpID09IDApCisgICAgICA8PCAiZmNsb3NlKCIgPDwgbmFtZSA8PCAiKTogIiA8PCBzdHJlcnJvcihlcnJubyk7Cit9CisKK2Jvb2wgRmlsZTo6Q3JlYXRlRGlyKGNvbnN0IHN0cmluZyYgbmFtZSwgaW50IG1vZGUpIHsKKyAgcmV0dXJuIG1rZGlyKG5hbWUuY19zdHIoKSwgbW9kZSkgPT0gMDsKK30KKworYm9vbCBGaWxlOjpSZWN1cnNpdmVseUNyZWF0ZURpcihjb25zdCBzdHJpbmcmIHBhdGgsIGludCBtb2RlKSB7CisgIGlmIChDcmVhdGVEaXIocGF0aCwgbW9kZSkpIHJldHVybiB0cnVlOworCisgIGlmIChFeGlzdHMocGF0aCkpIHJldHVybiBmYWxzZTsKKworICAvLyBUcnkgY3JlYXRpbmcgdGhlIHBhcmVudC4KKyAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2hwb3MgPSBwYXRoLmZpbmRfbGFzdF9vZignLycpOworICBpZiAoc2xhc2hwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgLy8gTm8gcGFyZW50IGdpdmVuLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiBSZWN1cnNpdmVseUNyZWF0ZURpcihwYXRoLnN1YnN0cigwLCBzbGFzaHBvcyksIG1vZGUpICYmCisgICAgICAgICBDcmVhdGVEaXIocGF0aCwgbW9kZSk7Cit9CisKK3ZvaWQgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkoY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkdW1teTEsIHZvaWQqIGR1bW15MikgeworICAvLyBXZSBkb24ndCBjYXJlIHRvbyBtdWNoIGFib3V0IGVycm9yIGNoZWNraW5nIGhlcmUgc2luY2UgdGhpcyBpcyBvbmx5IHVzZWQKKyAgLy8gaW4gdGVzdHMgdG8gZGVsZXRlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyB0aGF0IGFyZSB1bmRlciAvdG1wIGFueXdheS4KKworI2lmZGVmIF9NU0NfVkVSCisgIC8vIFRoaXMgaW50ZXJmYWNlIGlzIHNvIHdlaXJkLgorICBXSU4zMl9GSU5EX0RBVEEgZmluZF9kYXRhOworICBIQU5ETEUgZmluZF9oYW5kbGUgPSBGaW5kRmlyc3RGaWxlKChuYW1lICsgIi8qIikuY19zdHIoKSwgJmZpbmRfZGF0YSk7CisgIGlmIChmaW5kX2hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIC8vIEp1c3QgZGVsZXRlIGl0LCB3aGF0ZXZlciBpdCBpcy4KKyAgICBEZWxldGVGaWxlKG5hbWUuY19zdHIoKSk7CisgICAgUmVtb3ZlRGlyZWN0b3J5KG5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG8geworICAgIHN0cmluZyBlbnRyeV9uYW1lID0gZmluZF9kYXRhLmNGaWxlTmFtZTsKKyAgICBpZiAoZW50cnlfbmFtZSAhPSAiLiIgJiYgZW50cnlfbmFtZSAhPSAiLi4iKSB7CisgICAgICBzdHJpbmcgcGF0aCA9IG5hbWUgKyAiLyIgKyBlbnRyeV9uYW1lOworICAgICAgaWYgKGZpbmRfZGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7CisgICAgICAgIERlbGV0ZVJlY3Vyc2l2ZWx5KHBhdGgsIE5VTEwsIE5VTEwpOworICAgICAgICBSZW1vdmVEaXJlY3RvcnkocGF0aC5jX3N0cigpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERlbGV0ZUZpbGUocGF0aC5jX3N0cigpKTsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUoRmluZE5leHRGaWxlKGZpbmRfaGFuZGxlLCAmZmluZF9kYXRhKSk7CisgIEZpbmRDbG9zZShmaW5kX2hhbmRsZSk7CisKKyAgUmVtb3ZlRGlyZWN0b3J5KG5hbWUuY19zdHIoKSk7CisjZWxzZQorICAvLyBVc2Ugb3BlbmRpcigpISAgWWF5IQorICAvLyBsc3RhdCA9IERvbid0IGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4KKyAgc3RydWN0IHN0YXQgc3RhdHM7CisgIGlmIChsc3RhdChuYW1lLmNfc3RyKCksICZzdGF0cykgIT0gMCkgcmV0dXJuOworCisgIGlmIChTX0lTRElSKHN0YXRzLnN0X21vZGUpKSB7CisgICAgRElSKiBkaXIgPSBvcGVuZGlyKG5hbWUuY19zdHIoKSk7CisgICAgaWYgKGRpciAhPSBOVUxMKSB7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdHJ1Y3QgZGlyZW50KiBlbnRyeSA9IHJlYWRkaXIoZGlyKTsKKyAgICAgICAgaWYgKGVudHJ5ID09IE5VTEwpIGJyZWFrOworICAgICAgICBzdHJpbmcgZW50cnlfbmFtZSA9IGVudHJ5LT5kX25hbWU7CisgICAgICAgIGlmIChlbnRyeV9uYW1lICE9ICIuIiAmJiBlbnRyeV9uYW1lICE9ICIuLiIpIHsKKyAgICAgICAgICBEZWxldGVSZWN1cnNpdmVseShuYW1lICsgIi8iICsgZW50cnlfbmFtZSwgTlVMTCwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBjbG9zZWRpcihkaXIpOworICAgIHJtZGlyKG5hbWUuY19zdHIoKSk7CisKKyAgfSBlbHNlIGlmIChTX0lTUkVHKHN0YXRzLnN0X21vZGUpKSB7CisgICAgcmVtb3ZlKG5hbWUuY19zdHIoKSk7CisgIH0KKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiMWM3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oCkBAIC0wLDAgKzEsODMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIGVtdWxhdGVzIGdvb2dsZTMvZmlsZS9iYXNlL2ZpbGUuaAorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9URVNUSU5HX0ZJTEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9URVNUSU5HX0ZJTEVfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworY29uc3QgaW50IERFRkFVTFRfRklMRV9NT0RFID0gMDc3NzsKKworLy8gUHJvdG9jb2wgYnVmZmVyIGNvZGUgb25seSB1c2VzIGEgY291cGxlIHN0YXRpYyBtZXRob2RzIG9mIEZpbGUsIGFuZCBvbmx5CisvLyBpbiB0ZXN0cy4KK2NsYXNzIEZpbGUgeworIHB1YmxpYzoKKyAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzLgorICBzdGF0aWMgYm9vbCBFeGlzdHMoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBSZWFkIGFuIGVudGlyZSBmaWxlIHRvIGEgc3RyaW5nLiAgUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UKKyAgLy8gb3RoZXJ3aXNlLgorICBzdGF0aWMgYm9vbCBSZWFkRmlsZVRvU3RyaW5nKGNvbnN0IHN0cmluZyYgbmFtZSwgc3RyaW5nKiBvdXRwdXQpOworCisgIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCBjcmFzaCBvbiBmYWlsdXJlLgorICBzdGF0aWMgdm9pZCBSZWFkRmlsZVRvU3RyaW5nT3JEaWUoY29uc3Qgc3RyaW5nJiBuYW1lLCBzdHJpbmcqIG91dHB1dCk7CisKKyAgLy8gQ3JlYXRlIGEgZmlsZSBhbmQgd3JpdGUgYSBzdHJpbmcgdG8gaXQuCisgIHN0YXRpYyB2b2lkIFdyaXRlU3RyaW5nVG9GaWxlT3JEaWUoY29uc3Qgc3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeS4KKyAgc3RhdGljIGJvb2wgQ3JlYXRlRGlyKGNvbnN0IHN0cmluZyYgbmFtZSwgaW50IG1vZGUpOworCisgIC8vIENyZWF0ZSBhIGRpcmVjdG9yeSBhbmQgYWxsIHBhcmVudCBkaXJlY3RvcmllcyBpZiBuZWNlc3NhcnkuCisgIHN0YXRpYyBib29sIFJlY3Vyc2l2ZWx5Q3JlYXRlRGlyKGNvbnN0IHN0cmluZyYgcGF0aCwgaW50IG1vZGUpOworCisgIC8vIElmICJuYW1lIiBpcyBhIGZpbGUsIHdlIGRlbGV0ZSBpdC4gIElmIGl0IGlzIGEgZGlyZWN0b3J5LCB3ZQorICAvLyBjYWxsIERlbGV0ZVJlY3Vyc2l2ZWx5KCkgZm9yIGVhY2ggZmlsZSBvciBkaXJlY3RvcnkgKG90aGVyIHRoYW4KKyAgLy8gZG90IGFuZCBkb3VibGUtZG90KSB3aXRoaW4gaXQsIGFuZCB0aGVuIGRlbGV0ZSB0aGUgZGlyZWN0b3J5IGl0c2VsZi4KKyAgLy8gVGhlICJkdW1teSIgcGFyYW1ldGVycyBoYXZlIGEgbWVhbmluZyBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgIC8vIG1ldGhvZCBidXQgdGhleSBhcmUgbm90IHVzZWQgYW55d2hlcmUgaW4gcHJvdG9jb2wgYnVmZmVycy4KKyAgc3RhdGljIHZvaWQgRGVsZXRlUmVjdXJzaXZlbHkoY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkdW1teTEsIHZvaWQqIGR1bW15Mik7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmlsZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVEVTVElOR19GSUxFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMDk0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MKQEAgLTAsMCArMSwyNTQgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIGVtdWxhdGVzIGdvb2dsZTMvdGVzdGluZy9iYXNlL3B1YmxpYy9nb29nbGV0ZXN0LmNjCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIG1rZGlyKG5hbWUsIG1vZGUpIG1rZGlyKG5hbWUpCisjZW5kaWYKKworI2lmbmRlZiBPX0JJTkFSWQorI2lmZGVmIF9PX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSBfT19CSU5BUlkKKyNlbHNlCisjZGVmaW5lIE9fQklOQVJZIDAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIHBsYXRmb3JtIGRvZXNuJ3QgbmVlZCBpdC4KKyNlbmRpZgorI2VuZGlmCisKK3N0cmluZyBUZXN0U291cmNlRGlyKCkgeworI2lmZGVmIF9NU0NfVkVSCisgIC8vIExvb2sgZm9yIHRoZSAic3JjIiBkaXJlY3RvcnkuCisgIHN0cmluZyBwcmVmaXggPSAiLiI7CisKKyAgd2hpbGUgKCFGaWxlOjpFeGlzdHMocHJlZml4ICsgIi9zcmMvZ29vZ2xlL3Byb3RvYnVmIikpIHsKKyAgICBpZiAoIUZpbGU6OkV4aXN0cyhwcmVmaXgpKSB7CisgICAgICBHT09HTEVfTE9HKEZBVEFMKQorICAgICAgICA8PCAiQ291bGQgbm90IGZpbmQgcHJvdG9idWYgc291cmNlIGNvZGUuICBQbGVhc2UgcnVuIHRlc3RzIGZyb20gIgorICAgICAgICAgICAic29tZXdoZXJlIHdpdGhpbiB0aGUgcHJvdG9idWYgc291cmNlIHBhY2thZ2UuIjsKKyAgICB9CisgICAgcHJlZml4ICs9ICIvLi4iOworICB9CisgIHJldHVybiBwcmVmaXggKyAiL3NyYyI7CisjZWxzZQorICAvLyBhdXRvbWFrZSBzZXRzIHRoZSAic3JjZGlyIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgY2hhciogcmVzdWx0ID0gZ2V0ZW52KCJzcmNkaXIiKTsKKyAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdGVzdCBtdXN0IGJlIHJ1biBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorICAgIHJldHVybiAiLiI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorI2VuZGlmCit9CisKK25hbWVzcGFjZSB7CisKK3N0cmluZyBHZXRUZW1wb3JhcnlEaXJlY3RvcnlOYW1lKCkgeworICAvLyB0bXBuYW0oKSBpcyBnZW5lcmFsbHkgbm90IGNvbnNpZGVyZWQgc2FmZSBidXQgd2UncmUgb25seSB1c2luZyBpdCBmb3IKKyAgLy8gdGVzdGluZy4gIFdlIGNhbm5vdCB1c2UgdG1wZmlsZSgpIG9yIG1rc3RlbXAoKSBzaW5jZSB3ZSdyZSBjcmVhdGluZyBhCisgIC8vIGRpcmVjdG9yeS4KKyAgY2hhciBiW0xfdG1wbmFtICsgMV07ICAgICAvLyBIUFVYIG11bHRpdGhyZWFkIHJldHVybiAwIGlmIHMgaXMgMAorICBzdHJpbmcgcmVzdWx0ID0gdG1wbmFtKGIpOworI2lmZGVmIF9XSU4zMgorICAvLyBPbiBXaW4zMiwgdG1wbmFtKCkgcmV0dXJucyBhIGZpbGUgcHJlZml4ZWQgd2l0aCAnXCcsIGJ1dCB3aGljaCBpcyBzdXBwb3NlZAorICAvLyB0byBiZSB1c2VkIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgV1RGPworICBpZiAoSGFzUHJlZml4U3RyaW5nKHJlc3VsdCwgIlxcIikpIHsKKyAgICByZXN1bHQuZXJhc2UoMCwgMSk7CisgIH0KKyNlbmRpZiAgLy8gX1dJTjMyCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIENyZWF0ZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IG9uIGRlbWFuZCBhbmQgZGVsZXRlcyBpdCB3aGVuIHRoZSBwcm9jZXNzCisvLyBxdWl0cy4KK2NsYXNzIFRlbXBEaXJEZWxldGVyIHsKKyBwdWJsaWM6CisgIFRlbXBEaXJEZWxldGVyKCkge30KKyAgflRlbXBEaXJEZWxldGVyKCkgeworICAgIGlmICghbmFtZV8uZW1wdHkoKSkgeworICAgICAgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkobmFtZV8sIE5VTEwsIE5VTEwpOworICAgIH0KKyAgfQorCisgIHN0cmluZyBHZXRUZW1wRGlyKCkgeworICAgIGlmIChuYW1lXy5lbXB0eSgpKSB7CisgICAgICBuYW1lXyA9IEdldFRlbXBvcmFyeURpcmVjdG9yeU5hbWUoKTsKKyAgICAgIEdPT0dMRV9DSEVDSyhta2RpcihuYW1lXy5jX3N0cigpLCAwNzc3KSA9PSAwKSA8PCBzdHJlcnJvcihlcnJubyk7CisKKyAgICAgIC8vIFN0aWNrIGEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgdGVsbHMgcGVvcGxlIHdoYXQgdGhpcyBpcywgaW4gY2FzZQorICAgICAgLy8gd2UgYWJvcnQgYW5kIGRvbid0IGdldCBhIGNoYW5jZSB0byBkZWxldGUgaXQuCisgICAgICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKCIiLCBuYW1lXyArICIvVEVNUF9ESVJfRk9SX1BST1RPQlVGX1RFU1RTIik7CisgICAgfQorICAgIHJldHVybiBuYW1lXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RyaW5nIG5hbWVfOworfTsKKworVGVtcERpckRlbGV0ZXIgdGVtcF9kaXJfZGVsZXRlcl87CisKK30gIC8vIG5hbWVzcGFjZQorCitzdHJpbmcgVGVzdFRlbXBEaXIoKSB7CisgIHJldHVybiB0ZW1wX2Rpcl9kZWxldGVyXy5HZXRUZW1wRGlyKCk7Cit9CisKKy8vIFRPRE8oa2VudG9uKTogIFNoYXJlIGR1cGxpY2F0ZWQgY29kZSBiZWxvdy4gIFRvbyBidXN5L2xhenkgZm9yIG5vdy4KKworc3RhdGljIHN0cmluZyBzdGRvdXRfY2FwdHVyZV9maWxlbmFtZV87CitzdGF0aWMgc3RyaW5nIHN0ZGVycl9jYXB0dXJlX2ZpbGVuYW1lXzsKK3N0YXRpYyBpbnQgb3JpZ2luYWxfc3Rkb3V0XyA9IC0xOworc3RhdGljIGludCBvcmlnaW5hbF9zdGRlcnJfID0gLTE7CisKK3ZvaWQgQ2FwdHVyZVRlc3RTdGRvdXQoKSB7CisgIEdPT0dMRV9DSEVDS19FUShvcmlnaW5hbF9zdGRvdXRfLCAtMSkgPDwgIkFscmVhZHkgY2FwdHVyaW5nLiI7CisKKyAgc3Rkb3V0X2NhcHR1cmVfZmlsZW5hbWVfID0gVGVzdFRlbXBEaXIoKSArICIvY2FwdHVyZWRfc3Rkb3V0IjsKKworICBpbnQgZmQgPSBvcGVuKHN0ZG91dF9jYXB0dXJlX2ZpbGVuYW1lXy5jX3N0cigpLAorICAgICAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fQklOQVJZLCAwNzc3KTsKKyAgR09PR0xFX0NIRUNLKGZkID49IDApIDw8ICJvcGVuOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKKworICBvcmlnaW5hbF9zdGRvdXRfID0gZHVwKDEpOworICBjbG9zZSgxKTsKKyAgZHVwMihmZCwgMSk7CisgIGNsb3NlKGZkKTsKK30KKwordm9pZCBDYXB0dXJlVGVzdFN0ZGVycigpIHsKKyAgR09PR0xFX0NIRUNLX0VRKG9yaWdpbmFsX3N0ZGVycl8sIC0xKSA8PCAiQWxyZWFkeSBjYXB0dXJpbmcuIjsKKworICBzdGRlcnJfY2FwdHVyZV9maWxlbmFtZV8gPSBUZXN0VGVtcERpcigpICsgIi9jYXB0dXJlZF9zdGRlcnIiOworCisgIGludCBmZCA9IG9wZW4oc3RkZXJyX2NhcHR1cmVfZmlsZW5hbWVfLmNfc3RyKCksCisgICAgICAgICAgICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19CSU5BUlksIDA3NzcpOworICBHT09HTEVfQ0hFQ0soZmQgPj0gMCkgPDwgIm9wZW46ICIgPDwgc3RyZXJyb3IoZXJybm8pOworCisgIG9yaWdpbmFsX3N0ZGVycl8gPSBkdXAoMik7CisgIGNsb3NlKDIpOworICBkdXAyKGZkLCAyKTsKKyAgY2xvc2UoZmQpOworfQorCitzdHJpbmcgR2V0Q2FwdHVyZWRUZXN0U3Rkb3V0KCkgeworICBHT09HTEVfQ0hFQ0tfTkUob3JpZ2luYWxfc3Rkb3V0XywgLTEpIDw8ICJOb3QgY2FwdHVyaW5nLiI7CisKKyAgY2xvc2UoMSk7CisgIGR1cDIob3JpZ2luYWxfc3Rkb3V0XywgMSk7CisgIG9yaWdpbmFsX3N0ZG91dF8gPSAtMTsKKworICBzdHJpbmcgcmVzdWx0OworICBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nT3JEaWUoc3Rkb3V0X2NhcHR1cmVfZmlsZW5hbWVfLCAmcmVzdWx0KTsKKworICByZW1vdmUoc3Rkb3V0X2NhcHR1cmVfZmlsZW5hbWVfLmNfc3RyKCkpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyBHZXRDYXB0dXJlZFRlc3RTdGRlcnIoKSB7CisgIEdPT0dMRV9DSEVDS19ORShvcmlnaW5hbF9zdGRlcnJfLCAtMSkgPDwgIk5vdCBjYXB0dXJpbmcuIjsKKworICBjbG9zZSgyKTsKKyAgZHVwMihvcmlnaW5hbF9zdGRlcnJfLCAyKTsKKyAgb3JpZ2luYWxfc3RkZXJyXyA9IC0xOworCisgIHN0cmluZyByZXN1bHQ7CisgIEZpbGU6OlJlYWRGaWxlVG9TdHJpbmdPckRpZShzdGRlcnJfY2FwdHVyZV9maWxlbmFtZV8sICZyZXN1bHQpOworCisgIHJlbW92ZShzdGRlcnJfY2FwdHVyZV9maWxlbmFtZV8uY19zdHIoKSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworU2NvcGVkTWVtb3J5TG9nKiBTY29wZWRNZW1vcnlMb2c6OmFjdGl2ZV9sb2dfID0gTlVMTDsKKworU2NvcGVkTWVtb3J5TG9nOjpTY29wZWRNZW1vcnlMb2coKSB7CisgIEdPT0dMRV9DSEVDSyhhY3RpdmVfbG9nXyA9PSBOVUxMKTsKKyAgYWN0aXZlX2xvZ18gPSB0aGlzOworICBvbGRfaGFuZGxlcl8gPSBTZXRMb2dIYW5kbGVyKCZIYW5kbGVMb2cpOworfQorCitTY29wZWRNZW1vcnlMb2c6On5TY29wZWRNZW1vcnlMb2coKSB7CisgIFNldExvZ0hhbmRsZXIob2xkX2hhbmRsZXJfKTsKKyAgYWN0aXZlX2xvZ18gPSBOVUxMOworfQorCitjb25zdCB2ZWN0b3I8c3RyaW5nPiYgU2NvcGVkTWVtb3J5TG9nOjpHZXRNZXNzYWdlcyhMb2dMZXZlbCBkdW1teSkgY29uc3QgeworICBHT09HTEVfQ0hFQ0tfRVEoZHVtbXksIEVSUk9SKTsKKyAgcmV0dXJuIG1lc3NhZ2VzXzsKK30KKwordm9pZCBTY29wZWRNZW1vcnlMb2c6OkhhbmRsZUxvZyhMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKKyAgR09PR0xFX0NIRUNLKGFjdGl2ZV9sb2dfICE9IE5VTEwpOworICBpZiAobGV2ZWwgPT0gRVJST1IpIHsKKyAgICBhY3RpdmVfbG9nXy0+bWVzc2FnZXNfLnB1c2hfYmFjayhtZXNzYWdlKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworCisvLyBGb3JjZSBzaHV0ZG93biBhdCBwcm9jZXNzIGV4aXQgc28gdGhhdCB3ZSBjYW4gdGVzdCBmb3IgbWVtb3J5IGxlYWtzLiAgVG8KKy8vIGFjdHVhbGx5IGNoZWNrIGZvciBsZWFrcywgSSBzdWdnZXN0IHVzaW5nIHRoZSBoZWFwIGNoZWNrZXIgaW5jbHVkZWQgd2l0aAorLy8gZ29vZ2xlLXBlcmZ0b29scy4gIFNldCBpdCB0byAiZHJhY29uaWFuIiBtb2RlIHRvIGVuc3VyZSB0aGF0IGV2ZXJ5IGxhc3QKKy8vIGNhbGwgdG8gbWFsbG9jKCkgaGFzIGEgY29ycmVzcG9uZGluZyBmcmVlKCkuCitzdHJ1Y3QgRm9yY2VTaHV0ZG93biB7CisgIH5Gb3JjZVNodXRkb3duKCkgeworICAgIFNodXRkb3duUHJvdG9idWZMaWJyYXJ5KCk7CisgIH0KK30gZm9yY2Vfc2h1dGRvd247CisKK30gIC8vIG5hbWVzcGFjZQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0NDRjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oCkBAIC0wLDAgKzEsOTggQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vIGVtdWxhdGVzIGdvb2dsZTMvdGVzdGluZy9iYXNlL3B1YmxpYy9nb29nbGV0ZXN0LmgKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfR09PR0xFVEVTVF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dPT0dMRVRFU1RfSF9fCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIFdoZW4gcnVubmluZyB1bml0dGVzdHMsIGdldCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlLgorc3RyaW5nIFRlc3RTb3VyY2VEaXIoKTsKKworLy8gV2hlbiBydW5uaW5nIHVuaXR0ZXN0cywgZ2V0IGEgZGlyZWN0b3J5IHdoZXJlIHRlbXBvcmFyeSBmaWxlcyBtYXkgYmUKKy8vIHBsYWNlZC4KK3N0cmluZyBUZXN0VGVtcERpcigpOworCisvLyBDYXB0dXJlIGFsbCB0ZXh0IHdyaXR0ZW4gdG8gc3Rkb3V0IG9yIHN0ZGVyci4KK3ZvaWQgQ2FwdHVyZVRlc3RTdGRvdXQoKTsKK3ZvaWQgQ2FwdHVyZVRlc3RTdGRlcnIoKTsKKworLy8gU3RvcCBjYXB0dXJpbmcgc3Rkb3V0IG9yIHN0ZGVyciBhbmQgcmV0dXJuIHRoZSB0ZXh0IGNhcHR1cmVkLgorc3RyaW5nIEdldENhcHR1cmVkVGVzdFN0ZG91dCgpOworc3RyaW5nIEdldENhcHR1cmVkVGVzdFN0ZGVycigpOworCisvLyBGb3IgdXNlIHdpdGggU2NvcGVkTWVtb3J5TG9nOjpHZXRNZXNzYWdlcygpLiAgSW5zaWRlIEdvb2dsZSB0aGUgTG9nTGV2ZWwKKy8vIGNvbnN0YW50cyBkb24ndCBoYXZlIHRoZSBMT0dMRVZFTF8gcHJlZml4LCBzbyB0aGUgY29kZSB0aGF0IHVzZWQKKy8vIFNjb3BlZE1lbW9yeUxvZyByZWZlcnMgdG8gTE9HTEVWRUxfRVJST1IgYXMganVzdCBFUlJPUi4KKyN1bmRlZiBFUlJPUiAgLy8gZGVmZW5kIGFnYWluc3QgcHJvbWlzY3VvdXMgd2luZG93cy5oCitzdGF0aWMgY29uc3QgTG9nTGV2ZWwgRVJST1IgPSBMT0dMRVZFTF9FUlJPUjsKKworLy8gUmVjZWl2ZXMgY29waWVzIG9mIGFsbCBMT0coRVJST1IpIG1lc3NhZ2VzIHdoaWxlIGluIHNjb3BlLiAgU2FtcGxlIHVzYWdlOgorLy8gICB7CisvLyAgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsgIC8vIGNvbnN0cnVjdG9yIHJlZ2lzdGVycyBvYmplY3QgYXMgYSBsb2cgc2luaworLy8gICAgIFNvbWVSb3V0aW5lVGhhdE1heUxvZ01lc3NhZ2VzKCk7CisvLyAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIHdhcm5pbmdzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKy8vICAgfSAgLy8gZGVzdHJ1Y3RvciB1bnJlZ2lzdGVycyBvYmplY3QgYXMgYSBsb2cgc2luaworLy8gVGhpcyBpcyBhIGR1bW15IGltcGxlbWVudGF0aW9uIHdoaWNoIGNvdmVycyBvbmx5IHdoYXQgaXMgdXNlZCBieSBwcm90b2NvbAorLy8gYnVmZmVyIHVuaXQgdGVzdHMuCitjbGFzcyBTY29wZWRNZW1vcnlMb2cgeworIHB1YmxpYzoKKyAgU2NvcGVkTWVtb3J5TG9nKCk7CisgIHZpcnR1YWwgflNjb3BlZE1lbW9yeUxvZygpOworCisgIC8vIEZldGNoZXMgYWxsIG1lc3NhZ2VzIGxvZ2dlZC4gIFRoZSBpbnRlcm5hbCB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MKKyAgLy8gd291bGQgb25seSBmZXRjaCBtZXNzYWdlcyBhdCB0aGUgZ2l2ZW4gc2VjdXJpdHkgbGV2ZWwsIGJ1dCB0aGUgcHJvdG9idWYKKyAgLy8gb3BlbiBzb3VyY2UgdmVyc2lvbiBpZ25vcmVzIHRoZSBhcmd1bWVudCBzaW5jZSB3ZSBhbHdheXMgcGFzcyBFUlJPUgorICAvLyBhbnl3YXkuCisgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBHZXRNZXNzYWdlcyhMb2dMZXZlbCBkdW1teSkgY29uc3Q7CisKKyBwcml2YXRlOgorICB2ZWN0b3I8c3RyaW5nPiBtZXNzYWdlc187CisgIExvZ0hhbmRsZXIqIG9sZF9oYW5kbGVyXzsKKworICBzdGF0aWMgdm9pZCBIYW5kbGVMb2coTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSk7CisKKyAgc3RhdGljIFNjb3BlZE1lbW9yeUxvZyogYWN0aXZlX2xvZ187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNjb3BlZE1lbW9yeUxvZyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfR09PR0xFVEVTVF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3VuemlwLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MTk3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3VuemlwLmNjCkBAIC0wLDAgKzEsNzMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogYnJpYW5vbHNvbkBnb29nbGUuY29tIChCcmlhbiBPbHNvbikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRlc3QgcHJvZ3JhbSB0byB2ZXJpZnkgdGhhdCBHemlwSW5wdXRTdHJlYW0gaXMgY29tcGF0aWJsZSB3aXRoIGNvbW1hbmQgbGluZQorLy8gZ3VuemlwIG9yIGphdmEudXRpbC56aXAuR3ppcElucHV0U3RyZWFtCisvLworLy8gUmVhZHMgZ3ppcCBzdHJlYW0gb24gc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlcyBkZWNvbXByZXNzZWQgZGF0YSB0byBzdGFuZGFyZAorLy8gb3V0cHV0LgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpGaWxlSW5wdXRTdHJlYW07Cit1c2luZyBnb29nbGU6OnByb3RvYnVmOjppbzo6R3ppcElucHV0U3RyZWFtOworCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhcioqIGFyZ3YpIHsKKyAgRmlsZUlucHV0U3RyZWFtIGZpbihTVERJTl9GSUxFTk8pOworICBHemlwSW5wdXRTdHJlYW0gaW4oJmZpbik7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjb25zdCB2b2lkKiBpbnB0cjsKKyAgICBpbnQgaW5sZW47CisgICAgYm9vbCBvazsKKyAgICBvayA9IGluLk5leHQoJmlucHRyLCAmaW5sZW4pOworICAgIGlmICghb2spIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaW5sZW4gPiAwKSB7CisgICAgICBpbnQgZXJyID0gd3JpdGUoU1RET1VUX0ZJTEVOTywgaW5wdHIsIGlubGVuKTsKKyAgICAgIGFzc2VydChlcnIgPT0gaW5sZW4pOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTMzMjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MKQEAgLTAsMCArMSw3OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBicmlhbm9sc29uQGdvb2dsZS5jb20gKEJyaWFuIE9sc29uKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGVzdCBwcm9ncmFtIHRvIHZlcmlmeSB0aGF0IEd6aXBPdXRwdXRTdHJlYW0gaXMgY29tcGF0aWJsZSB3aXRoIGNvbW1hbmQgbGluZQorLy8gZ3ppcCBvciBqYXZhLnV0aWwuemlwLkd6aXBPdXRwdXRTdHJlYW0KKy8vCisvLyBSZWFkcyBkYXRhIG9uIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZXMgY29tcHJlc3NlZCBnemlwIHN0cmVhbSB0byBzdGFuZGFyZAorLy8gb3V0cHV0LgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpGaWxlT3V0cHV0U3RyZWFtOwordXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86Okd6aXBPdXRwdXRTdHJlYW07CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiogYXJndikgeworICBGaWxlT3V0cHV0U3RyZWFtIGZvdXQoU1RET1VUX0ZJTEVOTyk7CisgIEd6aXBPdXRwdXRTdHJlYW0gb3V0KCZmb3V0KTsKKyAgaW50IHJlYWRsZW47CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB2b2lkKiBvdXRwdHI7CisgICAgaW50IG91dGxlbjsKKyAgICBib29sIG9rOworICAgIGRvIHsKKyAgICAgIG9rID0gb3V0Lk5leHQoJm91dHB0ciwgJm91dGxlbik7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gd2hpbGUgKG91dGxlbiA8PSAwKTsKKyAgICByZWFkbGVuID0gcmVhZChTVERJTl9GSUxFTk8sIG91dHB0ciwgb3V0bGVuKTsKKyAgICBpZiAocmVhZGxlbiA8PSAwKSB7CisgICAgICBvdXQuQmFja1VwKG91dGxlbik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHJlYWRsZW4gPCBvdXRsZW4pIHsKKyAgICAgIG91dC5CYWNrVXAob3V0bGVuIC0gcmVhZGxlbik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTRlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYwpAQCAtMCwwICsxLDEyODUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoganNjaG9yckBnb29nbGUuY29tIChKb3NlcGggU2Nob3JyKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKKworc3RyaW5nIE1lc3NhZ2U6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBzdHJpbmcgZGVidWdfc3RyaW5nOworCisgIFRleHRGb3JtYXQ6OlByaW50VG9TdHJpbmcoKnRoaXMsICZkZWJ1Z19zdHJpbmcpOworCisgIHJldHVybiBkZWJ1Z19zdHJpbmc7Cit9CisKK3N0cmluZyBNZXNzYWdlOjpTaG9ydERlYnVnU3RyaW5nKCkgY29uc3QgeworICBzdHJpbmcgZGVidWdfc3RyaW5nOworCisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgcHJpbnRlci5TZXRTaW5nbGVMaW5lTW9kZSh0cnVlKTsKKworICBwcmludGVyLlByaW50VG9TdHJpbmcoKnRoaXMsICZkZWJ1Z19zdHJpbmcpOworICAvLyBTaW5nbGUgbGluZSBtb2RlIGN1cnJlbnRseSBtaWdodCBoYXZlIGFuIGV4dHJhIHNwYWNlIGF0IHRoZSBlbmQuCisgIGlmIChkZWJ1Z19zdHJpbmcuc2l6ZSgpID4gMCAmJgorICAgICAgZGVidWdfc3RyaW5nW2RlYnVnX3N0cmluZy5zaXplKCkgLSAxXSA9PSAnICcpIHsKKyAgICBkZWJ1Z19zdHJpbmcucmVzaXplKGRlYnVnX3N0cmluZy5zaXplKCkgLSAxKTsKKyAgfQorCisgIHJldHVybiBkZWJ1Z19zdHJpbmc7Cit9CisKK3N0cmluZyBNZXNzYWdlOjpVdGY4RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIHN0cmluZyBkZWJ1Z19zdHJpbmc7CisKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBwcmludGVyLlNldFVzZVV0ZjhTdHJpbmdFc2NhcGluZyh0cnVlKTsKKworICBwcmludGVyLlByaW50VG9TdHJpbmcoKnRoaXMsICZkZWJ1Z19zdHJpbmcpOworCisgIHJldHVybiBkZWJ1Z19zdHJpbmc7Cit9CisKK3ZvaWQgTWVzc2FnZTo6UHJpbnREZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgcHJpbnRmKCIlcyIsIERlYnVnU3RyaW5nKCkuY19zdHIoKSk7Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbnRlcm5hbCBjbGFzcyBmb3IgcGFyc2luZyBhbiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBhIFByb3RvY29sIE1lc3NhZ2UuCisvLyBUaGlzIGNsYXNzIG1ha2VzIHVzZSBvZiB0aGUgUHJvdG9jb2wgTWVzc2FnZSBjb21waWxlcidzIHRva2VuaXplciBmb3VuZAorLy8gaW4gLy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmguIE5vdGUgdGhhdCBjbGFzcydzIFBhcnNlCisvLyBtZXRob2QgaXMgKm5vdCogdGhyZWFkLXNhZmUgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gYSBzaW5nbGUgdGhyZWFkIGF0CisvLyBhIHRpbWUuCisKKy8vIE1ha2VzIGNvZGUgc2xpZ2h0bHkgbW9yZSByZWFkYWJsZS4gIFRoZSBtZWFuaW5nIG9mICJETyhmb28pIiBpcworLy8gIkV4ZWN1dGUgZm9vIGFuZCBmYWlsIGlmIGl0IGZhaWxzLiIsIHdoZXJlIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5CisvLyByZXR1cm5pbmcgZmFsc2UuIEJvcnJvd2VkIGZyb20gcGFyc2VyLmNjIChUaGFua3MgS2VudG9uISkuCisjZGVmaW5lIERPKFNUQVRFTUVOVCkgaWYgKFNUQVRFTUVOVCkge30gZWxzZSByZXR1cm4gZmFsc2UKKworY2xhc3MgVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZXJJbXBsIHsKKyBwdWJsaWM6CisKKyAgLy8gRGV0ZXJtaW5lcyBpZiByZXBlYXRlZCB2YWx1ZXMgZm9yIGEgbm9uLXJlcGVhdGVkIGZpZWxkIGFyZQorICAvLyBwZXJtaXR0ZWQsIGUuZy4sIHRoZSBzdHJpbmcgImZvbzogMSBmb286IDIiIGZvciBhCisgIC8vIHJlcXVpcmVkL29wdGlvbmFsIGZpZWxkIG5hbWVkICJmb28iLgorICBlbnVtIFNpbmd1bGFyT3ZlcndyaXRlUG9saWN5IHsKKyAgICBBTExPV19TSU5HVUxBUl9PVkVSV1JJVEVTID0gMCwgICAvLyB0aGUgbGFzdCB2YWx1ZSBpcyByZXRhaW5lZAorICAgIEZPUkJJRF9TSU5HVUxBUl9PVkVSV1JJVEVTID0gMSwgIC8vIGFuIGVycm9yIGlzIGlzc3VlZAorICB9OworCisgIFBhcnNlckltcGwoY29uc3QgRGVzY3JpcHRvciogcm9vdF9tZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0X3N0cmVhbSwKKyAgICAgICAgICAgICBpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvciwKKyAgICAgICAgICAgICBUZXh0Rm9ybWF0OjpGaW5kZXIqIGZpbmRlciwKKyAgICAgICAgICAgICBTaW5ndWxhck92ZXJ3cml0ZVBvbGljeSBzaW5ndWxhcl9vdmVyd3JpdGVfcG9saWN5KQorICAgIDogZXJyb3JfY29sbGVjdG9yXyhlcnJvcl9jb2xsZWN0b3IpLAorICAgICAgZmluZGVyXyhmaW5kZXIpLAorICAgICAgdG9rZW5pemVyX2Vycm9yX2NvbGxlY3Rvcl8odGhpcyksCisgICAgICB0b2tlbml6ZXJfKGlucHV0X3N0cmVhbSwgJnRva2VuaXplcl9lcnJvcl9jb2xsZWN0b3JfKSwKKyAgICAgIHJvb3RfbWVzc2FnZV90eXBlXyhyb290X21lc3NhZ2VfdHlwZSksCisgICAgICBzaW5ndWxhcl9vdmVyd3JpdGVfcG9saWN5XyhzaW5ndWxhcl9vdmVyd3JpdGVfcG9saWN5KSwKKyAgICAgIGhhZF9lcnJvcnNfKGZhbHNlKSB7CisgICAgLy8gRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggcHJvdG8xLCB3ZSBuZWVkIHRvIGFsbG93IHRoZSAnZicgc3VmZml4CisgICAgLy8gZm9yIGZsb2F0cy4KKyAgICB0b2tlbml6ZXJfLnNldF9hbGxvd19mX2FmdGVyX2Zsb2F0KHRydWUpOworCisgICAgLy8gJyMnIHN0YXJ0cyBhIGNvbW1lbnQuCisgICAgdG9rZW5pemVyXy5zZXRfY29tbWVudF9zdHlsZShpbzo6VG9rZW5pemVyOjpTSF9DT01NRU5UX1NUWUxFKTsKKworICAgIC8vIENvbnN1bWUgdGhlIHN0YXJ0aW5nIHRva2VuLgorICAgIHRva2VuaXplcl8uTmV4dCgpOworICB9CisgIH5QYXJzZXJJbXBsKCkgeyB9CisKKyAgLy8gUGFyc2VzIHRoZSBBU0NJSSByZXByZXNlbnRhdGlvbiBzcGVjaWZpZWQgaW4gaW5wdXQgYW5kIHNhdmVzIHRoZQorICAvLyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBvdXRwdXQgcG9pbnRlciAoYSBNZXNzYWdlKS4gUmV0dXJucworICAvLyBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnMgKGFuIGVycm9yIHdpbGwgYWxzbyBiZSBsb2dnZWQgdG8KKyAgLy8gR09PR0xFX0xPRyhFUlJPUikpLgorICBib29sIFBhcnNlKE1lc3NhZ2UqIG91dHB1dCkgeworICAgIC8vIENvbnN1bWUgZmllbGRzIHVudGlsIHdlIGNhbm5vdCBkbyBzbyBhbnltb3JlLgorICAgIHdoaWxlKHRydWUpIHsKKyAgICAgIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5EKSkgeworICAgICAgICByZXR1cm4gIWhhZF9lcnJvcnNfOworICAgICAgfQorCisgICAgICBETyhDb25zdW1lRmllbGQob3V0cHV0KSk7CisgICAgfQorICB9CisKKyAgYm9vbCBQYXJzZUZpZWxkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIE1lc3NhZ2UqIG91dHB1dCkgeworICAgIGJvb2wgc3VjOworICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgc3VjID0gQ29uc3VtZUZpZWxkTWVzc2FnZShvdXRwdXQsIG91dHB1dC0+R2V0UmVmbGVjdGlvbigpLCBmaWVsZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN1YyA9IENvbnN1bWVGaWVsZFZhbHVlKG91dHB1dCwgb3V0cHV0LT5HZXRSZWZsZWN0aW9uKCksIGZpZWxkKTsKKyAgICB9CisgICAgcmV0dXJuIHN1YyAmJiBMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5EKTsKKyAgfQorCisgIHZvaWQgUmVwb3J0RXJyb3IoaW50IGxpbmUsIGludCBjb2wsIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIGhhZF9lcnJvcnNfID0gdHJ1ZTsKKyAgICBpZiAoZXJyb3JfY29sbGVjdG9yXyA9PSBOVUxMKSB7CisgICAgICBpZiAobGluZSA+PSAwKSB7CisgICAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJFcnJvciBwYXJzaW5nIHRleHQtZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICA8PCByb290X21lc3NhZ2VfdHlwZV8tPmZ1bGxfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIjogIiA8PCAobGluZSArIDEpIDw8ICI6IgorICAgICAgICAgICAgICAgICAgIDw8IChjb2wgKyAxKSA8PCAiOiAiIDw8IG1lc3NhZ2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRXJyb3IgcGFyc2luZyB0ZXh0LWZvcm1hdCAiCisgICAgICAgICAgICAgICAgICAgPDwgcm9vdF9tZXNzYWdlX3R5cGVfLT5mdWxsX25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgbWVzc2FnZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IobGluZSwgY29sLCBtZXNzYWdlKTsKKyAgICB9CisgIH0KKworICB2b2lkIFJlcG9ydFdhcm5pbmcoaW50IGxpbmUsIGludCBjb2wsIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIGlmIChlcnJvcl9jb2xsZWN0b3JfID09IE5VTEwpIHsKKyAgICAgIGlmIChsaW5lID49IDApIHsKKyAgICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiV2FybmluZyBwYXJzaW5nIHRleHQtZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJvb3RfbWVzc2FnZV90eXBlXy0+ZnVsbF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgKGxpbmUgKyAxKSA8PCAiOiIKKyAgICAgICAgICAgICAgICAgICAgIDw8IChjb2wgKyAxKSA8PCAiOiAiIDw8IG1lc3NhZ2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJXYXJuaW5nIHBhcnNpbmcgdGV4dC1mb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgPDwgcm9vdF9tZXNzYWdlX3R5cGVfLT5mdWxsX25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIjogIiA8PCBtZXNzYWdlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRXYXJuaW5nKGxpbmUsIGNvbCwgbWVzc2FnZSk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyc2VySW1wbCk7CisKKyAgLy8gUmVwb3J0cyBhbiBlcnJvciB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIHdpdGggaW5mb3JtYXRpb24gaW5kaWNhdGluZworICAvLyB0aGUgcG9zaXRpb24gKGFzIGRlcml2ZWQgZnJvbSB0aGUgY3VycmVudCB0b2tlbikuCisgIHZvaWQgUmVwb3J0RXJyb3IoY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgUmVwb3J0RXJyb3IodG9rZW5pemVyXy5jdXJyZW50KCkubGluZSwgdG9rZW5pemVyXy5jdXJyZW50KCkuY29sdW1uLAorICAgICAgICAgICAgICAgIG1lc3NhZ2UpOworICB9CisKKyAgLy8gUmVwb3J0cyBhIHdhcm5pbmcgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSB3aXRoIGluZm9ybWF0aW9uIGluZGljYXRpbmcKKyAgLy8gdGhlIHBvc2l0aW9uIChhcyBkZXJpdmVkIGZyb20gdGhlIGN1cnJlbnQgdG9rZW4pLgorICB2b2lkIFJlcG9ydFdhcm5pbmcoY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgUmVwb3J0V2FybmluZyh0b2tlbml6ZXJfLmN1cnJlbnQoKS5saW5lLCB0b2tlbml6ZXJfLmN1cnJlbnQoKS5jb2x1bW4sCisgICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgfQorCisgIC8vIENvbnN1bWVzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzdGFydGluZyBkZWxpbWV0ZXIuCisgIC8vIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUgdGhhdCB0aGUgZW5kIGRlbGltZXRlciBhdCB0aGUgY29uY2x1c2lvbiBvZgorICAvLyB0aGUgY29uc3VtcHRpb24gbWF0Y2hlcyB0aGUgc3RhcnRpbmcgZGVsaW1ldGVyIHBhc3NlZCBpbiBoZXJlLgorICBib29sIENvbnN1bWVNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IHN0cmluZyBkZWxpbWV0ZXIpIHsKKyAgICB3aGlsZSAoIUxvb2tpbmdBdCgiPiIpICYmICAhTG9va2luZ0F0KCJ9IikpIHsKKyAgICAgIERPKENvbnN1bWVGaWVsZChtZXNzYWdlKSk7CisgICAgfQorCisgICAgLy8gQ29uZmlybSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBlbmRpbmcgZGVsaW1ldGVyLgorICAgIERPKENvbnN1bWUoZGVsaW1ldGVyKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENvbnN1bWVzIHRoZSBjdXJyZW50IGZpZWxkIChhcyByZXR1cm5lZCBieSB0aGUgdG9rZW5pemVyKSBvbiB0aGUKKyAgLy8gcGFzc2VkIGluIG1lc3NhZ2UuCisgIGJvb2wgQ29uc3VtZUZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CisKKyAgICBzdHJpbmcgZmllbGRfbmFtZTsKKworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBOVUxMOworCisgICAgaWYgKFRyeUNvbnN1bWUoIlsiKSkgeworICAgICAgLy8gRXh0ZW5zaW9uLgorICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJmZpZWxkX25hbWUpKTsKKyAgICAgIHdoaWxlIChUcnlDb25zdW1lKCIuIikpIHsKKyAgICAgICAgc3RyaW5nIHBhcnQ7CisgICAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZwYXJ0KSk7CisgICAgICAgIGZpZWxkX25hbWUgKz0gIi4iOworICAgICAgICBmaWVsZF9uYW1lICs9IHBhcnQ7CisgICAgICB9CisgICAgICBETyhDb25zdW1lKCJdIikpOworCisgICAgICBmaWVsZCA9IChmaW5kZXJfICE9IE5VTEwKKyAgICAgICAgICAgICAgID8gZmluZGVyXy0+RmluZEV4dGVuc2lvbihtZXNzYWdlLCBmaWVsZF9uYW1lKQorICAgICAgICAgICAgICAgOiByZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU5hbWUoZmllbGRfbmFtZSkpOworCisgICAgICBpZiAoZmllbGQgPT0gTlVMTCkgeworICAgICAgICBSZXBvcnRFcnJvcigiRXh0ZW5zaW9uIFwiIiArIGZpZWxkX25hbWUgKyAiXCIgaXMgbm90IGRlZmluZWQgb3IgIgorICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGFuIGV4dGVuc2lvbiBvZiBcIiIgKworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArICJcIi4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmZmllbGRfbmFtZSkpOworCisgICAgICBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZShmaWVsZF9uYW1lKTsKKyAgICAgIC8vIEdyb3VwIG5hbWVzIGFyZSBleHBlY3RlZCB0byBiZSBjYXBpdGFsaXplZCBhcyB0aGV5IGFwcGVhciBpbiB0aGUKKyAgICAgIC8vIC5wcm90byBmaWxlLCB3aGljaCBhY3R1YWxseSBtYXRjaGVzIHRoZWlyIHR5cGUgbmFtZXMsIG5vdCB0aGVpciBmaWVsZAorICAgICAgLy8gbmFtZXMuCisgICAgICBpZiAoZmllbGQgPT0gTlVMTCkgeworICAgICAgICBzdHJpbmcgbG93ZXJfZmllbGRfbmFtZSA9IGZpZWxkX25hbWU7CisgICAgICAgIExvd2VyU3RyaW5nKCZsb3dlcl9maWVsZF9uYW1lKTsKKyAgICAgICAgZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUobG93ZXJfZmllbGRfbmFtZSk7CisgICAgICAgIC8vIElmIHRoZSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIHdvcmtlZCBidXQgdGhlIGZpZWxkIGlzIE5PVCBhIGdyb3VwLAorICAgICAgICBpZiAoZmllbGQgIT0gTlVMTCAmJiBmaWVsZC0+dHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgeworICAgICAgICAgIGZpZWxkID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gQWdhaW4sIHNwZWNpYWwtY2FzZSBncm91cCBuYW1lcyBhcyBkZXNjcmliZWQgYWJvdmUuCisgICAgICBpZiAoZmllbGQgIT0gTlVMTCAmJiBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUAorICAgICAgICAgICYmIGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+bmFtZSgpICE9IGZpZWxkX25hbWUpIHsKKyAgICAgICAgZmllbGQgPSBOVUxMOworICAgICAgfQorCisgICAgICBpZiAoZmllbGQgPT0gTlVMTCkgeworICAgICAgICBSZXBvcnRFcnJvcigiTWVzc2FnZSB0eXBlIFwiIiArIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBubyBmaWVsZCBuYW1lZCBcIiIgKyBmaWVsZF9uYW1lICsgIlwiLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRmFpbCBpZiB0aGUgZmllbGQgaXMgbm90IHJlcGVhdGVkIGFuZCBpdCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZC4KKyAgICBpZiAoKHNpbmd1bGFyX292ZXJ3cml0ZV9wb2xpY3lfID09IEZPUkJJRF9TSU5HVUxBUl9PVkVSV1JJVEVTKSAmJgorICAgICAgICAhZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgcmVmbGVjdGlvbi0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkKSkgeworICAgICAgUmVwb3J0RXJyb3IoIk5vbi1yZXBlYXRlZCBmaWVsZCBcIiIgKyBmaWVsZF9uYW1lICsKKyAgICAgICAgICAgICAgICAgICJcIiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUGVyZm9ybSBzcGVjaWFsIGhhbmRsaW5nIGZvciBlbWJlZGRlZCBtZXNzYWdlIHR5cGVzLgorICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgLy8gJzonIGlzIG9wdGlvbmFsIGhlcmUuCisgICAgICBUcnlDb25zdW1lKCI6Iik7CisgICAgICBETyhDb25zdW1lRmllbGRNZXNzYWdlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIERPKENvbnN1bWUoIjoiKSk7CisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgVHJ5Q29uc3VtZSgiWyIpKSB7CisgICAgICAgIC8vIFNob3J0IHJlcGVhdGVkIGZvcm1hdCwgZS5nLiAgImZvbzogWzEsIDIsIDNdIgorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgIERPKENvbnN1bWVGaWVsZFZhbHVlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkKSk7CisgICAgICAgICAgaWYgKFRyeUNvbnN1bWUoIl0iKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIERPKENvbnN1bWUoIiwiKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERPKENvbnN1bWVGaWVsZFZhbHVlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkKSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29ucywgZmllbGRzIG1heSBvcHRpb25hbGx5IGJlIHNlcGFyYXRlZCBieSBjb21tYXMgb3IKKyAgICAvLyBzZW1pY29sb25zLgorICAgIFRyeUNvbnN1bWUoIjsiKSB8fCBUcnlDb25zdW1lKCIsIik7CisKKyAgICBpZiAoZmllbGQtPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkpIHsKKyAgICAgIFJlcG9ydFdhcm5pbmcoInRleHQgZm9ybWF0IGNvbnRhaW5zIGRlcHJlY2F0ZWQgZmllbGQgXCIiCisgICAgICAgICAgICAgICAgICAgICsgZmllbGRfbmFtZSArICJcIiIpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBDb25zdW1lRmllbGRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICAgIHN0cmluZyBkZWxpbWV0ZXI7CisgICAgaWYgKFRyeUNvbnN1bWUoIjwiKSkgeworICAgICAgZGVsaW1ldGVyID0gIj4iOworICAgIH0gZWxzZSB7CisgICAgICBETyhDb25zdW1lKCJ7IikpOworICAgICAgZGVsaW1ldGVyID0gIn0iOworICAgIH0KKworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgICAgRE8oQ29uc3VtZU1lc3NhZ2UocmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCksIGRlbGltZXRlcikpOworICAgIH0gZWxzZSB7CisgICAgICBETyhDb25zdW1lTWVzc2FnZShyZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWV0ZXIpKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIENvbnN1bWVGaWVsZFZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisKKy8vIERlZmluZSBhbiBlYXN5IHRvIHVzZSBtYWNybyBmb3Igc2V0dGluZyBmaWVsZHMuIFRoaXMgbWFjcm8gY2hlY2tzCisvLyB0byBzZWUgaWYgdGhlIGZpZWxkIGlzIHJlcGVhdGVkIChpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gdXNlIHRoZSBBZGQKKy8vIG1ldGhvZHMgb3Igbm90IChpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gdXNlIHRoZSBTZXQgbWV0aG9kcykuCisjZGVmaW5lIFNFVF9GSUVMRChDUFBUWVBFLCBWQUxVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZWZsZWN0aW9uLT5BZGQjI0NQUFRZUEUobWVzc2FnZSwgZmllbGQsIFZBTFVFKTsgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHJlZmxlY3Rpb24tPlNldCMjQ1BQVFlQRShtZXNzYWdlLCBmaWVsZCwgVkFMVUUpOyAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyAgICBzd2l0Y2goZmllbGQtPmNwcF90eXBlKCkpIHsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7CisgICAgICAgIGludDY0IHZhbHVlOworICAgICAgICBETyhDb25zdW1lU2lnbmVkSW50ZWdlcigmdmFsdWUsIGtpbnQzMm1heCkpOworICAgICAgICBTRVRfRklFTEQoSW50MzIsIHN0YXRpY19jYXN0PGludDMyPih2YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7CisgICAgICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZVVuc2lnbmVkSW50ZWdlcigmdmFsdWUsIGt1aW50MzJtYXgpKTsKKyAgICAgICAgU0VUX0ZJRUxEKFVJbnQzMiwgc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgICAgaW50NjQgdmFsdWU7CisgICAgICAgIERPKENvbnN1bWVTaWduZWRJbnRlZ2VyKCZ2YWx1ZSwga2ludDY0bWF4KSk7CisgICAgICAgIFNFVF9GSUVMRChJbnQ2NCwgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7CisgICAgICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZVVuc2lnbmVkSW50ZWdlcigmdmFsdWUsIGt1aW50NjRtYXgpKTsKKyAgICAgICAgU0VUX0ZJRUxEKFVJbnQ2NCwgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKKyAgICAgICAgZG91YmxlIHZhbHVlOworICAgICAgICBETyhDb25zdW1lRG91YmxlKCZ2YWx1ZSkpOworICAgICAgICBTRVRfRklFTEQoRmxvYXQsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7CisgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZURvdWJsZSgmdmFsdWUpKTsKKyAgICAgICAgU0VUX0ZJRUxEKERvdWJsZSwgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CisgICAgICAgIHN0cmluZyB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZVN0cmluZygmdmFsdWUpKTsKKyAgICAgICAgU0VUX0ZJRUxEKFN0cmluZywgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7CisgICAgICAgICAgdWludDY0IHZhbHVlOworICAgICAgICAgIERPKENvbnN1bWVVbnNpZ25lZEludGVnZXIoJnZhbHVlLCAxKSk7CisgICAgICAgICAgU0VUX0ZJRUxEKEJvb2wsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdHJpbmcgdmFsdWU7CisgICAgICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJnZhbHVlKSk7CisgICAgICAgICAgaWYgKHZhbHVlID09ICJ0cnVlIiB8fCB2YWx1ZSA9PSAidCIpIHsKKyAgICAgICAgICAgIFNFVF9GSUVMRChCb29sLCB0cnVlKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJmYWxzZSIgfHwgdmFsdWUgPT0gImYiKSB7CisgICAgICAgICAgICBTRVRfRklFTEQoQm9vbCwgZmFsc2UpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBSZXBvcnRFcnJvcigiSW52YWxpZCB2YWx1ZSBmb3IgYm9vbGVhbiBmaWVsZCBcIiIgKyBmaWVsZC0+bmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIi4gVmFsdWU6IFwiIiArIHZhbHVlICArICJcIi4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06IHsKKyAgICAgICAgc3RyaW5nIHZhbHVlOworICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlID0gZmllbGQtPmVudW1fdHlwZSgpOworICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0gTlVMTDsKKworICAgICAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7CisgICAgICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJnZhbHVlKSk7CisgICAgICAgICAgLy8gRmluZCB0aGUgZW51bWVyYXRpb24gdmFsdWUuCisgICAgICAgICAgZW51bV92YWx1ZSA9IGVudW1fdHlwZS0+RmluZFZhbHVlQnlOYW1lKHZhbHVlKTsKKworICAgICAgICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiLSIpIHx8CisgICAgICAgICAgICAgICAgICAgTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7CisgICAgICAgICAgaW50NjQgaW50X3ZhbHVlOworICAgICAgICAgIERPKENvbnN1bWVTaWduZWRJbnRlZ2VyKCZpbnRfdmFsdWUsIGtpbnQzMm1heCkpOworICAgICAgICAgIHZhbHVlID0gU2ltcGxlSXRvYShpbnRfdmFsdWUpOyAgICAgICAgLy8gZm9yIGVycm9yIHJlcG9ydGluZworICAgICAgICAgIGVudW1fdmFsdWUgPSBlbnVtX3R5cGUtPkZpbmRWYWx1ZUJ5TnVtYmVyKGludF92YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIGludGVnZXIgb3IgaWRlbnRpZmllci4iKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW51bV92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgUmVwb3J0RXJyb3IoIlVua25vd24gZW51bWVyYXRpb24gdmFsdWUgb2YgXCIiICsgdmFsdWUgICsgIlwiIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgImZpZWxkIFwiIiArIGZpZWxkLT5uYW1lKCkgKyAiXCIuIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU0VUX0ZJRUxEKEVudW0sIGVudW1fdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuIFB1dCBoZXJlIGluc3RlYWQgb2YgYSBkZWZhdWx0CisgICAgICAgIC8vIHNvIHRoYXQgaWYgbmV3IHR5cGVzIGFyZSBhZGRlZCwgd2UgZ2V0IGEgbmljZSBjb21waWxlciB3YXJuaW5nLgorICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiUmVhY2hlZCBhbiB1bmludGVuZGVkIHN0YXRlOiBDUFBUWVBFX01FU1NBR0UiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisjdW5kZWYgU0VUX0ZJRUxECisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgdG9rZW4ncyB0ZXh0IGlzIGVxdWFsIHRvIHRoYXQgc3BlY2lmaWVkLgorICBib29sIExvb2tpbmdBdChjb25zdCBzdHJpbmcmIHRleHQpIHsKKyAgICByZXR1cm4gdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dCA9PSB0ZXh0OworICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHRva2VuJ3MgdHlwZSBpcyBlcXVhbCB0byB0aGF0IHNwZWNpZmllZC4KKyAgYm9vbCBMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRva2VuVHlwZSB0b2tlbl90eXBlKSB7CisgICAgcmV0dXJuIHRva2VuaXplcl8uY3VycmVudCgpLnR5cGUgPT0gdG9rZW5fdHlwZTsKKyAgfQorCisgIC8vIENvbnN1bWVzIGFuIGlkZW50aWZpZXIgYW5kIHNhdmVzIGl0cyB2YWx1ZSBpbiB0aGUgaWRlbnRpZmllciBwYXJhbWV0ZXIuCisgIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIHRva2VuIGlzIG5vdCBvZiB0eXBlIElERU5URklFUi4KKyAgYm9vbCBDb25zdW1lSWRlbnRpZmllcihzdHJpbmcqIGlkZW50aWZpZXIpIHsKKyAgICBpZiAoIUxvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgeworICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIGlkZW50aWZpZXIuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmlkZW50aWZpZXIgPSB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0OworCisgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDb25zdW1lcyBhIHN0cmluZyBhbmQgc2F2ZXMgaXRzIHZhbHVlIGluIHRoZSB0ZXh0IHBhcmFtZXRlci4KKyAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgdG9rZW4gaXMgbm90IG9mIHR5cGUgU1RSSU5HLgorICBib29sIENvbnN1bWVTdHJpbmcoc3RyaW5nKiB0ZXh0KSB7CisgICAgaWYgKCFMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1RSSU5HKSkgeworICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIHN0cmluZy4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0ZXh0LT5jbGVhcigpOworICAgIHdoaWxlIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1RSSU5HKSkgeworICAgICAgaW86OlRva2VuaXplcjo6UGFyc2VTdHJpbmdBcHBlbmQodG9rZW5pemVyXy5jdXJyZW50KCkudGV4dCwgdGV4dCk7CisKKyAgICAgIHRva2VuaXplcl8uTmV4dCgpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQ29uc3VtZXMgYSB1aW50NjQgYW5kIHNhdmVzIGl0cyB2YWx1ZSBpbiB0aGUgdmFsdWUgcGFyYW1ldGVyLgorICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSB0b2tlbiBpcyBub3Qgb2YgdHlwZSBJTlRFR0VSLgorICBib29sIENvbnN1bWVVbnNpZ25lZEludGVnZXIodWludDY0KiB2YWx1ZSwgdWludDY0IG1heF92YWx1ZSkgeworICAgIGlmICghTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7CisgICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgaW50ZWdlci4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWlvOjpUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcih0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWx1ZSwgdmFsdWUpKSB7CisgICAgICBSZXBvcnRFcnJvcigiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDb25zdW1lcyBhbiBpbnQ2NCBhbmQgc2F2ZXMgaXRzIHZhbHVlIGluIHRoZSB2YWx1ZSBwYXJhbWV0ZXIuCisgIC8vIE5vdGUgdGhhdCBzaW5jZSB0aGUgdG9rZW5pemVyIGRvZXMgbm90IHN1cHBvcnQgbmVnYXRpdmUgbnVtYmVycywKKyAgLy8gd2UgYWN0dWFsbHkgbWF5IGNvbnN1bWUgYW4gYWRkaXRpb25hbCB0b2tlbiAoZm9yIHRoZSBtaW51cyBzaWduKSBpbiB0aGlzCisgIC8vIG1ldGhvZC4gUmV0dXJucyBmYWxzZSBpZiB0aGUgdG9rZW4gaXMgbm90IGFuIGludGVnZXIKKyAgLy8gKHNpZ25lZCBvciBvdGhlcndpc2UpLgorICBib29sIENvbnN1bWVTaWduZWRJbnRlZ2VyKGludDY0KiB2YWx1ZSwgdWludDY0IG1heF92YWx1ZSkgeworICAgIGJvb2wgbmVnYXRpdmUgPSBmYWxzZTsKKworICAgIGlmIChUcnlDb25zdW1lKCItIikpIHsKKyAgICAgIG5lZ2F0aXZlID0gdHJ1ZTsKKyAgICAgIC8vIFR3bydzIGNvbXBsZW1lbnQgYWx3YXlzIGFsbG93cyBvbmUgbW9yZSBuZWdhdGl2ZSBpbnRlZ2VyIHRoYW4KKyAgICAgIC8vIHBvc2l0aXZlLgorICAgICAgKyttYXhfdmFsdWU7CisgICAgfQorCisgICAgdWludDY0IHVuc2lnbmVkX3ZhbHVlOworCisgICAgRE8oQ29uc3VtZVVuc2lnbmVkSW50ZWdlcigmdW5zaWduZWRfdmFsdWUsIG1heF92YWx1ZSkpOworCisgICAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50NjQ+KHVuc2lnbmVkX3ZhbHVlKTsKKworICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgKnZhbHVlID0gLSp2YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENvbnN1bWVzIGEgZG91YmxlIGFuZCBzYXZlcyBpdHMgdmFsdWUgaW4gdGhlIHZhbHVlIHBhcmFtZXRlci4KKyAgLy8gTm90ZSB0aGF0IHNpbmNlIHRoZSB0b2tlbml6ZXIgZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSBudW1iZXJzLAorICAvLyB3ZSBhY3R1YWxseSBtYXkgY29uc3VtZSBhbiBhZGRpdGlvbmFsIHRva2VuIChmb3IgdGhlIG1pbnVzIHNpZ24pIGluIHRoaXMKKyAgLy8gbWV0aG9kLiBSZXR1cm5zIGZhbHNlIGlmIHRoZSB0b2tlbiBpcyBub3QgYSBkb3VibGUKKyAgLy8gKHNpZ25lZCBvciBvdGhlcndpc2UpLgorICBib29sIENvbnN1bWVEb3VibGUoZG91YmxlKiB2YWx1ZSkgeworICAgIGJvb2wgbmVnYXRpdmUgPSBmYWxzZTsKKworICAgIGlmIChUcnlDb25zdW1lKCItIikpIHsKKyAgICAgIG5lZ2F0aXZlID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBBIGRvdWJsZSBjYW4gYWN0dWFsbHkgYmUgYW4gaW50ZWdlciwgYWNjb3JkaW5nIHRvIHRoZSB0b2tlbml6ZXIuCisgICAgLy8gVGhlcmVmb3JlLCB3ZSBtdXN0IGNoZWNrIGJvdGggY2FzZXMgaGVyZS4KKyAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7CisgICAgICAvLyBXZSBoYXZlIGZvdW5kIGFuIGludGVnZXIgdmFsdWUgZm9yIHRoZSBkb3VibGUuCisgICAgICB1aW50NjQgaW50ZWdlcl92YWx1ZTsKKyAgICAgIERPKENvbnN1bWVVbnNpZ25lZEludGVnZXIoJmludGVnZXJfdmFsdWUsIGt1aW50NjRtYXgpKTsKKworICAgICAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpbnRlZ2VyX3ZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9GTE9BVCkpIHsKKyAgICAgIC8vIFdlIGhhdmUgZm91bmQgYSBmbG9hdCB2YWx1ZSBmb3IgdGhlIGRvdWJsZS4KKyAgICAgICp2YWx1ZSA9IGlvOjpUb2tlbml6ZXI6OlBhcnNlRmxvYXQodG9rZW5pemVyXy5jdXJyZW50KCkudGV4dCk7CisKKyAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgdG9rZW4gYXMgY29uc3VtZWQuCisgICAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgICB9IGVsc2UgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgeworICAgICAgc3RyaW5nIHRleHQgPSB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0OworICAgICAgTG93ZXJTdHJpbmcoJnRleHQpOworICAgICAgaWYgKHRleHQgPT0gImluZiIgfHwgdGV4dCA9PSAiaW5maW5pdHkiKSB7CisgICAgICAgICp2YWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKKyAgICAgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gIm5hbiIpIHsKKyAgICAgICAgKnZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKTsKKyAgICAgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgZG91YmxlLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFJlcG9ydEVycm9yKCJFeHBlY3RlZCBkb3VibGUuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG5lZ2F0aXZlKSB7CisgICAgICAqdmFsdWUgPSAtKnZhbHVlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQ29uc3VtZXMgYSB0b2tlbiBhbmQgY29uZmlybXMgdGhhdCBpdCBtYXRjaGVzIHRoYXQgc3BlY2lmaWVkIGluIHRoZQorICAvLyB2YWx1ZSBwYXJhbWV0ZXIuIFJldHVybnMgZmFsc2UgaWYgdGhlIHRva2VuIGZvdW5kIGRvZXMgbm90IG1hdGNoIHRoYXQKKyAgLy8gd2hpY2ggd2FzIHNwZWNpZmllZC4KKyAgYm9vbCBDb25zdW1lKGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgICBjb25zdCBzdHJpbmcmIGN1cnJlbnRfdmFsdWUgPSB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0OworCisgICAgaWYgKGN1cnJlbnRfdmFsdWUgIT0gdmFsdWUpIHsKKyAgICAgIFJlcG9ydEVycm9yKCJFeHBlY3RlZCBcIiIgKyB2YWx1ZSArICJcIiwgZm91bmQgXCIiICsgY3VycmVudF92YWx1ZQorICAgICAgICAgICAgICAgICAgKyAiXCIuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdG9rZW5pemVyXy5OZXh0KCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEF0dGVtcHRzIHRvIGNvbnN1bWUgdGhlIHN1cHBsaWVkIHZhbHVlLiBSZXR1cm5zIGZhbHNlIGlmIGEgdGhlCisgIC8vIHRva2VuIGZvdW5kIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBzcGVjaWZpZWQuCisgIGJvb2wgVHJ5Q29uc3VtZShjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgICAgaWYgKHRva2VuaXplcl8uY3VycmVudCgpLnRleHQgPT0gdmFsdWUpIHsKKyAgICAgIHRva2VuaXplcl8uTmV4dCgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBBbiBpbnRlcm5hbCBpbnN0YW5jZSBvZiB0aGUgVG9rZW5pemVyJ3MgZXJyb3IgY29sbGVjdG9yLCB1c2VkIHRvCisgIC8vIGNvbGxlY3QgYW55IGJhc2UtbGV2ZWwgcGFyc2UgZXJyb3JzIGFuZCBmZWVkIHRoZW0gdG8gdGhlIFBhcnNlckltcGwuCisgIGNsYXNzIFBhcnNlckVycm9yQ29sbGVjdG9yIDogcHVibGljIGlvOjpFcnJvckNvbGxlY3RvciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgUGFyc2VyRXJyb3JDb2xsZWN0b3IoVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZXJJbXBsKiBwYXJzZXIpIDoKKyAgICAgICAgcGFyc2VyXyhwYXJzZXIpIHsgfQorCisgICAgdmlydHVhbCB+UGFyc2VyRXJyb3JDb2xsZWN0b3IoKSB7IH07CisKKyAgICB2aXJ0dWFsIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgICAgcGFyc2VyXy0+UmVwb3J0RXJyb3IobGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZyhpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgICBwYXJzZXJfLT5SZXBvcnRXYXJuaW5nKGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYXJzZXJFcnJvckNvbGxlY3Rvcik7CisgICAgVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZXJJbXBsKiBwYXJzZXJfOworICB9OworCisgIGlvOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yXzsKKyAgVGV4dEZvcm1hdDo6RmluZGVyKiBmaW5kZXJfOworICBQYXJzZXJFcnJvckNvbGxlY3RvciB0b2tlbml6ZXJfZXJyb3JfY29sbGVjdG9yXzsKKyAgaW86OlRva2VuaXplciB0b2tlbml6ZXJfOworICBjb25zdCBEZXNjcmlwdG9yKiByb290X21lc3NhZ2VfdHlwZV87CisgIFNpbmd1bGFyT3ZlcndyaXRlUG9saWN5IHNpbmd1bGFyX292ZXJ3cml0ZV9wb2xpY3lfOworICBib29sIGhhZF9lcnJvcnNfOworfTsKKworI3VuZGVmIERPCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJuYWwgY2xhc3MgZm9yIHdyaXRpbmcgdGV4dCB0byB0aGUgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtLiBBZGFwdGVkCisvLyBmcm9tIHRoZSBQcmludGVyIGZvdW5kIGluIC8vZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaAorY2xhc3MgVGV4dEZvcm1hdDo6UHJpbnRlcjo6VGV4dEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBUZXh0R2VuZXJhdG9yKGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsX2luZGVudF9sZXZlbCkKKyAgICA6IG91dHB1dF8ob3V0cHV0KSwKKyAgICAgIGJ1ZmZlcl8oTlVMTCksCisgICAgICBidWZmZXJfc2l6ZV8oMCksCisgICAgICBhdF9zdGFydF9vZl9saW5lXyh0cnVlKSwKKyAgICAgIGZhaWxlZF8oZmFsc2UpLAorICAgICAgaW5kZW50XygiIiksCisgICAgICBpbml0aWFsX2luZGVudF9sZXZlbF8oaW5pdGlhbF9pbmRlbnRfbGV2ZWwpIHsKKyAgICBpbmRlbnRfLnJlc2l6ZShpbml0aWFsX2luZGVudF9sZXZlbF8gKiAyLCAnICcpOworICB9CisKKyAgflRleHRHZW5lcmF0b3IoKSB7CisgICAgLy8gT25seSBCYWNrVXAoKSBpZiB3ZSdyZSBzdXJlIHdlJ3ZlIHN1Y2Nlc3NmdWxseSBjYWxsZWQgTmV4dCgpIGF0IGxlYXN0CisgICAgLy8gb25jZS4KKyAgICBpZiAoYnVmZmVyX3NpemVfID4gMCkgeworICAgICAgb3V0cHV0Xy0+QmFja1VwKGJ1ZmZlcl9zaXplXyk7CisgICAgfQorICB9CisKKyAgLy8gSW5kZW50IHRleHQgYnkgdHdvIHNwYWNlcy4gIEFmdGVyIGNhbGxpbmcgSW5kZW50KCksIHR3byBzcGFjZXMgd2lsbCBiZQorICAvLyBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvZiB0ZXh0LiAgSW5kZW50KCkgbWF5IGJlIGNhbGxlZAorICAvLyBtdWx0aXBsZSB0aW1lcyB0byBwcm9kdWNlIGRlZXBlciBpbmRlbnRzLgorICB2b2lkIEluZGVudCgpIHsKKyAgICBpbmRlbnRfICs9ICIgICI7CisgIH0KKworICAvLyBSZWR1Y2VzIHRoZSBjdXJyZW50IGluZGVudCBsZXZlbCBieSB0d28gc3BhY2VzLCBvciBjcmFzaGVzIGlmIHRoZSBpbmRlbnQKKyAgLy8gbGV2ZWwgaXMgemVyby4KKyAgdm9pZCBPdXRkZW50KCkgeworICAgIGlmIChpbmRlbnRfLmVtcHR5KCkgfHwKKyAgICAgICAgaW5kZW50Xy5zaXplKCkgPCBpbml0aWFsX2luZGVudF9sZXZlbF8gKiAyKSB7CisgICAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIiBPdXRkZW50KCkgd2l0aG91dCBtYXRjaGluZyBJbmRlbnQoKS4iOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGluZGVudF8ucmVzaXplKGluZGVudF8uc2l6ZSgpIC0gMik7CisgIH0KKworICAvLyBQcmludCB0ZXh0IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICB2b2lkIFByaW50KGNvbnN0IHN0cmluZyYgc3RyKSB7CisgICAgUHJpbnQoc3RyLmRhdGEoKSwgc3RyLnNpemUoKSk7CisgIH0KKworICAvLyBQcmludCB0ZXh0IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICB2b2lkIFByaW50KGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgICBQcmludCh0ZXh0LCBzdHJsZW4odGV4dCkpOworICB9CisKKyAgLy8gUHJpbnQgdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBpbnQgc2l6ZSkgeworICAgIGludCBwb3MgPSAwOyAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB3ZSd2ZSB3cml0dGVuIHNvIGZhci4KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICBpZiAodGV4dFtpXSA9PSAnXG4nKSB7CisgICAgICAgIC8vIFNhdyBuZXdsaW5lLiAgSWYgdGhlcmUgaXMgbW9yZSB0ZXh0LCB3ZSBtYXkgbmVlZCB0byBpbnNlcnQgYW4gaW5kZW50CisgICAgICAgIC8vIGhlcmUuICBTbywgd3JpdGUgd2hhdCB3ZSBoYXZlIHNvIGZhciwgaW5jbHVkaW5nIHRoZSAnXG4nLgorICAgICAgICBXcml0ZSh0ZXh0ICsgcG9zLCBpIC0gcG9zICsgMSk7CisgICAgICAgIHBvcyA9IGkgKyAxOworCisgICAgICAgIC8vIFNldHRpbmcgdGhpcyB0cnVlIHdpbGwgY2F1c2UgdGhlIG5leHQgV3JpdGUoKSB0byBpbnNlcnQgYW4gaW5kZW50CisgICAgICAgIC8vIGZpcnN0LgorICAgICAgICBhdF9zdGFydF9vZl9saW5lXyA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gV3JpdGUgdGhlIHJlc3QuCisgICAgV3JpdGUodGV4dCArIHBvcywgc2l6ZSAtIHBvcyk7CisgIH0KKworICAvLyBUcnVlIGlmIGFueSB3cml0ZSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0gZmFpbGVkLiAgKFdlIGRvbid0IGp1c3QKKyAgLy8gY3Jhc2ggaW4gdGhpcyBjYXNlIGJlY2F1c2UgdGhpcyBpcyBhbiBJL08gZmFpbHVyZSwgbm90IGEgcHJvZ3JhbW1pbmcKKyAgLy8gZXJyb3IuKQorICBib29sIGZhaWxlZCgpIGNvbnN0IHsgcmV0dXJuIGZhaWxlZF87IH0KKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXh0R2VuZXJhdG9yKTsKKworICB2b2lkIFdyaXRlKGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKSB7CisgICAgaWYgKGZhaWxlZF8pIHJldHVybjsKKyAgICBpZiAoc2l6ZSA9PSAwKSByZXR1cm47CisKKyAgICBpZiAoYXRfc3RhcnRfb2ZfbGluZV8pIHsKKyAgICAgIC8vIEluc2VydCBhbiBpbmRlbnQuCisgICAgICBhdF9zdGFydF9vZl9saW5lXyA9IGZhbHNlOworICAgICAgV3JpdGUoaW5kZW50Xy5kYXRhKCksIGluZGVudF8uc2l6ZSgpKTsKKyAgICAgIGlmIChmYWlsZWRfKSByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHNpemUgPiBidWZmZXJfc2l6ZV8pIHsKKyAgICAgIC8vIERhdGEgZXhjZWVkcyBzcGFjZSBpbiB0aGUgYnVmZmVyLiAgQ29weSB3aGF0IHdlIGNhbiBhbmQgcmVxdWVzdCBhCisgICAgICAvLyBuZXcgYnVmZmVyLgorICAgICAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIGJ1ZmZlcl9zaXplXyk7CisgICAgICBkYXRhICs9IGJ1ZmZlcl9zaXplXzsKKyAgICAgIHNpemUgLT0gYnVmZmVyX3NpemVfOworICAgICAgdm9pZCogdm9pZF9idWZmZXI7CisgICAgICBmYWlsZWRfID0gIW91dHB1dF8tPk5leHQoJnZvaWRfYnVmZmVyLCAmYnVmZmVyX3NpemVfKTsKKyAgICAgIGlmIChmYWlsZWRfKSByZXR1cm47CisgICAgICBidWZmZXJfID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4odm9pZF9idWZmZXIpOworICAgIH0KKworICAgIC8vIEJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIHJlY2VpdmUgdGhlIGRhdGE7IGNvcHkgaXQuCisgICAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIHNpemUpOworICAgIGJ1ZmZlcl8gKz0gc2l6ZTsKKyAgICBidWZmZXJfc2l6ZV8gLT0gc2l6ZTsKKyAgfQorCisgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogY29uc3Qgb3V0cHV0XzsKKyAgY2hhciogYnVmZmVyXzsKKyAgaW50IGJ1ZmZlcl9zaXplXzsKKyAgYm9vbCBhdF9zdGFydF9vZl9saW5lXzsKKyAgYm9vbCBmYWlsZWRfOworCisgIHN0cmluZyBpbmRlbnRfOworICBpbnQgaW5pdGlhbF9pbmRlbnRfbGV2ZWxfOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RleHRGb3JtYXQ6OkZpbmRlcjo6fkZpbmRlcigpIHsKK30KKworVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZXIoKQorICA6IGVycm9yX2NvbGxlY3Rvcl8oTlVMTCksCisgICAgZmluZGVyXyhOVUxMKSwKKyAgICBhbGxvd19wYXJ0aWFsXyhmYWxzZSkgeworfQorCitUZXh0Rm9ybWF0OjpQYXJzZXI6On5QYXJzZXIoKSB7fQorCitib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCkgeworICBvdXRwdXQtPkNsZWFyKCk7CisgIFBhcnNlckltcGwgcGFyc2VyKG91dHB1dC0+R2V0RGVzY3JpcHRvcigpLCBpbnB1dCwgZXJyb3JfY29sbGVjdG9yXywKKyAgICAgICAgICAgICAgICAgICAgZmluZGVyXywgUGFyc2VySW1wbDo6Rk9SQklEX1NJTkdVTEFSX09WRVJXUklURVMpOworICByZXR1cm4gTWVyZ2VVc2luZ0ltcGwoaW5wdXQsIG91dHB1dCwgJnBhcnNlcik7Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShpbnB1dC5kYXRhKCksIGlucHV0LnNpemUoKSk7CisgIHJldHVybiBQYXJzZSgmaW5wdXRfc3RyZWFtLCBvdXRwdXQpOworfQorCitib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6TWVyZ2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCkgeworICBQYXJzZXJJbXBsIHBhcnNlcihvdXRwdXQtPkdldERlc2NyaXB0b3IoKSwgaW5wdXQsIGVycm9yX2NvbGxlY3Rvcl8sCisgICAgICAgICAgICAgICAgICAgIGZpbmRlcl8sIFBhcnNlckltcGw6OkFMTE9XX1NJTkdVTEFSX09WRVJXUklURVMpOworICByZXR1cm4gTWVyZ2VVc2luZ0ltcGwoaW5wdXQsIG91dHB1dCwgJnBhcnNlcik7Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UGFyc2VyOjpNZXJnZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShpbnB1dC5kYXRhKCksIGlucHV0LnNpemUoKSk7CisgIHJldHVybiBNZXJnZSgmaW5wdXRfc3RyZWFtLCBvdXRwdXQpOworfQorCitib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6TWVyZ2VVc2luZ0ltcGwoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXJJbXBsKiBwYXJzZXJfaW1wbCkgeworICBpZiAoIXBhcnNlcl9pbXBsLT5QYXJzZShvdXRwdXQpKSByZXR1cm4gZmFsc2U7CisgIGlmICghYWxsb3dfcGFydGlhbF8gJiYgIW91dHB1dC0+SXNJbml0aWFsaXplZCgpKSB7CisgICAgdmVjdG9yPHN0cmluZz4gbWlzc2luZ19maWVsZHM7CisgICAgb3V0cHV0LT5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoJm1pc3NpbmdfZmllbGRzKTsKKyAgICBwYXJzZXJfaW1wbC0+UmVwb3J0RXJyb3IoLTEsIDAsICJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5TdHJpbmdzKG1pc3NpbmdfZmllbGRzLCAiLCAiKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZygKKyAgICBjb25zdCBzdHJpbmcmIGlucHV0LAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShpbnB1dC5kYXRhKCksIGlucHV0LnNpemUoKSk7CisgIFBhcnNlckltcGwgcGFyc2VyKG91dHB1dC0+R2V0RGVzY3JpcHRvcigpLCAmaW5wdXRfc3RyZWFtLCBlcnJvcl9jb2xsZWN0b3JfLAorICAgICAgICAgICAgICAgICAgICBmaW5kZXJfLCBQYXJzZXJJbXBsOjpBTExPV19TSU5HVUxBUl9PVkVSV1JJVEVTKTsKKyAgcmV0dXJuIHBhcnNlci5QYXJzZUZpZWxkKGZpZWxkLCBvdXRwdXQpOworfQorCisvKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpQYXJzZShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBvdXRwdXQpIHsKKyAgcmV0dXJuIFBhcnNlcigpLlBhcnNlKGlucHV0LCBvdXRwdXQpOworfQorCisvKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpNZXJnZShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBvdXRwdXQpIHsKKyAgcmV0dXJuIFBhcnNlcigpLk1lcmdlKGlucHV0LCBvdXRwdXQpOworfQorCisvKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBvdXRwdXQpIHsKKyAgcmV0dXJuIFBhcnNlcigpLlBhcnNlRnJvbVN0cmluZyhpbnB1dCwgb3V0cHV0KTsKK30KKworLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7CisgIHJldHVybiBQYXJzZXIoKS5NZXJnZUZyb21TdHJpbmcoaW5wdXQsIG91dHB1dCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludGVyKCkKKyAgOiBpbml0aWFsX2luZGVudF9sZXZlbF8oMCksCisgICAgc2luZ2xlX2xpbmVfbW9kZV8oZmFsc2UpLAorICAgIHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzXyhmYWxzZSksCisgICAgdXRmOF9zdHJpbmdfZXNjYXBpbmdfKGZhbHNlKSB7fQorCitUZXh0Rm9ybWF0OjpQcmludGVyOjp+UHJpbnRlcigpIHt9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRUb1N0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogb3V0cHV0KSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0sob3V0cHV0KSA8PCAib3V0cHV0IHNwZWNpZmllZCBpcyBOVUxMIjsKKworICBvdXRwdXQtPmNsZWFyKCk7CisgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbShvdXRwdXQpOworCisgIGJvb2wgcmVzdWx0ID0gUHJpbnQobWVzc2FnZSwgJm91dHB1dF9zdHJlYW0pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRVbmtub3duRmllbGRzVG9TdHJpbmcoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICBzdHJpbmcqIG91dHB1dCkgY29uc3QgeworICBHT09HTEVfRENIRUNLKG91dHB1dCkgPDwgIm91dHB1dCBzcGVjaWZpZWQgaXMgTlVMTCI7CisKKyAgb3V0cHV0LT5jbGVhcigpOworICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0ob3V0cHV0KTsKKyAgcmV0dXJuIFByaW50VW5rbm93bkZpZWxkcyh1bmtub3duX2ZpZWxkcywgJm91dHB1dF9zdHJlYW0pOworfQorCitib29sIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKG91dHB1dCwgaW5pdGlhbF9pbmRlbnRfbGV2ZWxfKTsKKworICBQcmludChtZXNzYWdlLCBnZW5lcmF0b3IpOworCisgIC8vIE91dHB1dCBmYWxzZSBpZiB0aGUgZ2VuZXJhdG9yIGZhaWxlZCBpbnRlcm5hbGx5LgorICByZXR1cm4gIWdlbmVyYXRvci5mYWlsZWQoKTsKK30KKworYm9vbCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludFVua25vd25GaWVsZHMoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcihvdXRwdXQsIGluaXRpYWxfaW5kZW50X2xldmVsXyk7CisKKyAgUHJpbnRVbmtub3duRmllbGRzKHVua25vd25fZmllbGRzLCBnZW5lcmF0b3IpOworCisgIC8vIE91dHB1dCBmYWxzZSBpZiB0aGUgZ2VuZXJhdG9yIGZhaWxlZCBpbnRlcm5hbGx5LgorICByZXR1cm4gIWdlbmVyYXRvci5mYWlsZWQoKTsKK30KKwordm9pZCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UsICZmaWVsZHMpOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgeworICAgIFByaW50RmllbGQobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGRzW2ldLCBnZW5lcmF0b3IpOworICB9CisgIFByaW50VW5rbm93bkZpZWxkcyhyZWZsZWN0aW9uLT5HZXRVbmtub3duRmllbGRzKG1lc3NhZ2UpLCBnZW5lcmF0b3IpOworfQorCit2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50RmllbGRWYWx1ZVRvU3RyaW5nKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBpbnQgaW5kZXgsCisgICAgc3RyaW5nKiBvdXRwdXQpIGNvbnN0IHsKKworICBHT09HTEVfRENIRUNLKG91dHB1dCkgPDwgIm91dHB1dCBzcGVjaWZpZWQgaXMgTlVMTCI7CisKKyAgb3V0cHV0LT5jbGVhcigpOworICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0ob3V0cHV0KTsKKyAgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IoJm91dHB1dF9zdHJlYW0sIGluaXRpYWxfaW5kZW50X2xldmVsXyk7CisKKyAgUHJpbnRGaWVsZFZhbHVlKG1lc3NhZ2UsIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLCBmaWVsZCwgaW5kZXgsIGdlbmVyYXRvcik7Cit9CisKK3ZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgaWYgKHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzXyAmJgorICAgICAgZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgIGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcgJiYKKyAgICAgIGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgUHJpbnRTaG9ydFJlcGVhdGVkRmllbGQobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQsIGdlbmVyYXRvcik7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IGNvdW50ID0gMDsKKworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBjb3VudCA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7CisgIH0gZWxzZSBpZiAocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgZmllbGQpKSB7CisgICAgY291bnQgPSAxOworICB9CisKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgKytqKSB7CisgICAgUHJpbnRGaWVsZE5hbWUobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQsIGdlbmVyYXRvcik7CisKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiB7ICIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIge1xuIik7CisgICAgICAgIGdlbmVyYXRvci5JbmRlbnQoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdG9yLlByaW50KCI6ICIpOworICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSBmaWVsZCB2YWx1ZS4KKyAgICBpbnQgZmllbGRfaW5kZXggPSBqOworICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIGZpZWxkX2luZGV4ID0gLTE7CisgICAgfQorCisgICAgUHJpbnRGaWVsZFZhbHVlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkLCBmaWVsZF9pbmRleCwgZ2VuZXJhdG9yKTsKKworICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgICAgIGdlbmVyYXRvci5QcmludCgifSAiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyYXRvci5PdXRkZW50KCk7CisgICAgICAgIGdlbmVyYXRvci5QcmludCgifVxuIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiAiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyYXRvci5QcmludCgiXG4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludFNob3J0UmVwZWF0ZWRGaWVsZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgLy8gUHJpbnQgcHJpbWl0aXZlIHJlcGVhdGVkIGZpZWxkIGluIHNob3J0IGZvcm0uCisgIFByaW50RmllbGROYW1lKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkLCBnZW5lcmF0b3IpOworCisgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKTsKKyAgZ2VuZXJhdG9yLlByaW50KCI6IFsiKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpZiAoaSA+IDApIGdlbmVyYXRvci5QcmludCgiLCAiKTsKKyAgICBQcmludEZpZWxkVmFsdWUobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQsIGksIGdlbmVyYXRvcik7CisgIH0KKyAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgZ2VuZXJhdG9yLlByaW50KCJdICIpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRvci5QcmludCgiXVxuIik7CisgIH0KK30KKwordm9pZCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludEZpZWxkTmFtZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIGdlbmVyYXRvci5QcmludCgiWyIpOworICAgIC8vIFdlIHNwZWNpYWwtY2FzZSBNZXNzYWdlU2V0IGVsZW1lbnRzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJvdG8xLgorICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpCisgICAgICAgICYmIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UKKyAgICAgICAgJiYgZmllbGQtPmlzX29wdGlvbmFsKCkKKyAgICAgICAgJiYgZmllbGQtPmV4dGVuc2lvbl9zY29wZSgpID09IGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkgeworICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZnVsbF9uYW1lKCkpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGQtPmZ1bGxfbmFtZSgpKTsKKyAgICB9CisgICAgZ2VuZXJhdG9yLlByaW50KCJdIik7CisgIH0gZWxzZSB7CisgICAgaWYgKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgICAvLyBHcm91cHMgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggdGhlaXIgb3JpZ2luYWwgY2FwaXRhbGl6YXRpb24uCisgICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5uYW1lKCkpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGQtPm5hbWUoKSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRGaWVsZFZhbHVlKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGludCBpbmRleCwKKyAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDSyhmaWVsZC0+aXNfcmVwZWF0ZWQoKSB8fCAoaW5kZXggPT0gLTEpKQorICAgICAgPDwgIkluZGV4IG11c3QgYmUgLTEgZm9yIG5vbi1yZXBlYXRlZCBmaWVsZHMiOworCisgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgT1VUUFVUX0ZJRUxEKENQUFRZUEUsIE1FVEhPRCwgVE9fU1RSSU5HKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdlbmVyYXRvci5QcmludChUT19TVFJJTkcoZmllbGQtPmlzX3JlcGVhdGVkKCkgPyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZCMjTUVUSE9EKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCkgOiAgICAgICAgICAgXAorICAgICAgICAgIHJlZmxlY3Rpb24tPkdldCMjTUVUSE9EKG1lc3NhZ2UsIGZpZWxkKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworICAgICAgT1VUUFVUX0ZJRUxEKCBJTlQzMiwgIEludDMyLCBTaW1wbGVJdG9hKTsKKyAgICAgIE9VVFBVVF9GSUVMRCggSU5UNjQsICBJbnQ2NCwgU2ltcGxlSXRvYSk7CisgICAgICBPVVRQVVRfRklFTEQoVUlOVDMyLCBVSW50MzIsIFNpbXBsZUl0b2EpOworICAgICAgT1VUUFVUX0ZJRUxEKFVJTlQ2NCwgVUludDY0LCBTaW1wbGVJdG9hKTsKKyAgICAgIE9VVFBVVF9GSUVMRCggRkxPQVQsICBGbG9hdCwgU2ltcGxlRnRvYSk7CisgICAgICBPVVRQVVRfRklFTEQoRE9VQkxFLCBEb3VibGUsIFNpbXBsZUR0b2EpOworI3VuZGVmIE9VVFBVVF9GSUVMRAorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgICAgc3RyaW5nIHNjcmF0Y2g7CisgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUgPSBmaWVsZC0+aXNfcmVwZWF0ZWQoKSA/CisgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGluZGV4LCAmc2NyYXRjaCkgOgorICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIGZpZWxkLCAmc2NyYXRjaCk7CisKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJcIiIpOworICAgICAgICBpZiAodXRmOF9zdHJpbmdfZXNjYXBpbmdfKSB7CisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KHN0cmluZ3M6OlV0ZjhTYWZlQ0VzY2FwZSh2YWx1ZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdlbmVyYXRvci5QcmludChDRXNjYXBlKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJcIiIpOworCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQocmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQocmVmbGVjdGlvbi0+R2V0Qm9vbChtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkLT5pc19yZXBlYXRlZCgpID8KKyAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgZmllbGQsIGluZGV4KS0+bmFtZSgpIDoKKyAgICAgICAgICByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIGZpZWxkKS0+bmFtZSgpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIFByaW50KGZpZWxkLT5pc19yZXBlYXRlZCgpID8KKyAgICAgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGluZGV4KSA6CisgICAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBmaWVsZCksCisgICAgICAgICAgICAgIGdlbmVyYXRvcik7CisgICAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHN0YXRpYyAqLyBib29sIFRleHRGb3JtYXQ6OlByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICByZXR1cm4gUHJpbnRlcigpLlByaW50KG1lc3NhZ2UsIG91dHB1dCk7Cit9CisKKy8qIHN0YXRpYyAqLyBib29sIFRleHRGb3JtYXQ6OlByaW50VW5rbm93bkZpZWxkcygKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIHJldHVybiBQcmludGVyKCkuUHJpbnRVbmtub3duRmllbGRzKHVua25vd25fZmllbGRzLCBvdXRwdXQpOworfQorCisvKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpQcmludFRvU3RyaW5nKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIHN0cmluZyogb3V0cHV0KSB7CisgIHJldHVybiBQcmludGVyKCkuUHJpbnRUb1N0cmluZyhtZXNzYWdlLCBvdXRwdXQpOworfQorCisvKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpQcmludFVua25vd25GaWVsZHNUb1N0cmluZygKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLCBzdHJpbmcqIG91dHB1dCkgeworICByZXR1cm4gUHJpbnRlcigpLlByaW50VW5rbm93bkZpZWxkc1RvU3RyaW5nKHVua25vd25fZmllbGRzLCBvdXRwdXQpOworfQorCisvKiBzdGF0aWMgKi8gdm9pZCBUZXh0Rm9ybWF0OjpQcmludEZpZWxkVmFsdWVUb1N0cmluZygKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgaW50IGluZGV4LAorICAgIHN0cmluZyogb3V0cHV0KSB7CisgIHJldHVybiBQcmludGVyKCkuUHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcobWVzc2FnZSwgZmllbGQsIGluZGV4LCBvdXRwdXQpOworfQorCisvKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKAorICAgIGNvbnN0IHN0cmluZyYgaW5wdXQsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CisgIHJldHVybiBQYXJzZXIoKS5QYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKGlucHV0LCBmaWVsZCwgbWVzc2FnZSk7Cit9CisKKy8vIFByaW50cyBhbiBpbnRlZ2VyIGFzIGhleCB3aXRoIGEgZml4ZWQgbnVtYmVyIG9mIGRpZ2l0cyBkZXBlbmRlbnQgb24gdGhlCisvLyBpbnRlZ2VyIHR5cGUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBJbnRUeXBlPgorc3RhdGljIHN0cmluZyBQYWRkZWRIZXgoSW50VHlwZSB2YWx1ZSkgeworICBzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzZXJ2ZShzaXplb2YodmFsdWUpICogMik7CisgIGZvciAoaW50IGkgPSBzaXplb2YodmFsdWUpICogMiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgcmVzdWx0LnB1c2hfYmFjayhpbnRfdG9faGV4X2RpZ2l0KHZhbHVlID4+IChpKjQpICYgMHgwRikpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRVbmtub3duRmllbGRzKAorICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKyAgICBzdHJpbmcgZmllbGRfbnVtYmVyID0gU2ltcGxlSXRvYShmaWVsZC5udW1iZXIoKSk7CisKKyAgICBzd2l0Y2ggKGZpZWxkLnR5cGUoKSkgeworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UOgorICAgICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGRfbnVtYmVyKTsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KCI6ICIpOworICAgICAgICBnZW5lcmF0b3IuUHJpbnQoU2ltcGxlSXRvYShmaWVsZC52YXJpbnQoKSkpOworICAgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKKyAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOiB7CisgICAgICAgIGdlbmVyYXRvci5QcmludChmaWVsZF9udW1iZXIpOworICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIjogMHgiKTsKKyAgICAgICAgY2hhciBidWZmZXJba0Zhc3RUb0J1ZmZlclNpemVdOworICAgICAgICBnZW5lcmF0b3IuUHJpbnQoRmFzdEhleDMyVG9CdWZmZXIoZmllbGQuZml4ZWQzMigpLCBidWZmZXIpKTsKKyAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIgIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJcbiIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDogeworICAgICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGRfbnVtYmVyKTsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KCI6IDB4Iik7CisgICAgICAgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KEZhc3RIZXg2NFRvQnVmZmVyKGZpZWxkLmZpeGVkNjQoKSwgYnVmZmVyKSk7CisgICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6IHsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkX251bWJlcik7CisgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUgPSBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCk7CisgICAgICAgIFVua25vd25GaWVsZFNldCBlbWJlZGRlZF91bmtub3duX2ZpZWxkczsKKyAgICAgICAgaWYgKCF2YWx1ZS5lbXB0eSgpICYmIGVtYmVkZGVkX3Vua25vd25fZmllbGRzLlBhcnNlRnJvbVN0cmluZyh2YWx1ZSkpIHsKKyAgICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIHBhcnNlYWJsZSBhcyBhIE1lc3NhZ2UuCisgICAgICAgICAgLy8gU28gaXQgaXMgcHJvYmFibHkgYW4gZW1iZWRkZWQgbWVzc2FnZS4KKyAgICAgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKKyAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiIHsgIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiIHtcbiIpOworICAgICAgICAgICAgZ2VuZXJhdG9yLkluZGVudCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBQcmludFVua25vd25GaWVsZHMoZW1iZWRkZWRfdW5rbm93bl9maWVsZHMsIGdlbmVyYXRvcik7CisgICAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIn0gIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbmVyYXRvci5PdXRkZW50KCk7CisgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIn1cbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIG5vdCBwYXJzZWFibGUgYXMgYSBNZXNzYWdlLgorICAgICAgICAgIC8vIFNvIGl0IGlzIHByb2JhYmx5IGp1c3QgYSBwbGFpbiBzdHJpbmcuCisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCI6IFwiIik7CisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KENFc2NhcGUodmFsdWUpKTsKKyAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIlwiIik7CisgICAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiAiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgorICAgICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGRfbnVtYmVyKTsKKyAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7CisgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIgeyAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiB7XG4iKTsKKyAgICAgICAgICBnZW5lcmF0b3IuSW5kZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgUHJpbnRVbmtub3duRmllbGRzKGZpZWxkLmdyb3VwKCksIGdlbmVyYXRvcik7CisgICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgeworICAgICAgICAgIGdlbmVyYXRvci5QcmludCgifSAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnZW5lcmF0b3IuT3V0ZGVudCgpOworICAgICAgICAgIGdlbmVyYXRvci5QcmludCgifVxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjMDQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmgKQEAgLTAsMCArMSwyODUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoganNjaG9yckBnb29nbGUuY29tIChKb3NlcGggU2Nob3JyKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVXRpbGl0aWVzIGZvciBwcmludGluZyBhbmQgcGFyc2luZyBwcm90b2NvbCBtZXNzYWdlcyBpbiBhIGh1bWFuLXJlYWRhYmxlLAorLy8gdGV4dC1iYXNlZCBmb3JtYXQuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1RFWFRfRk9STUFUX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVEVYVF9GT1JNQVRfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK25hbWVzcGFjZSBpbyB7CisgIGNsYXNzIEVycm9yQ29sbGVjdG9yOyAgICAgIC8vIHRva2VuaXplci5oCit9CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBwcm90b2NvbCBidWZmZXIgdGV4dCBmb3JtYXQuICBQcmludGluZyBhbmQgcGFyc2luZworLy8gcHJvdG9jb2wgbWVzc2FnZXMgaW4gdGV4dCBmb3JtYXQgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGh1bWFuIGVkaXRpbmcKKy8vIG9mIG1lc3NhZ2VzLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgcmVhbGx5IGEgbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgb25seSBzdGF0aWMgbWV0aG9kcy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBUZXh0Rm9ybWF0IHsKKyBwdWJsaWM6CisgIC8vIE91dHB1dHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBtZXNzYWdlIHRvIHRoZSBnaXZlbgorICAvLyBvdXRwdXQgc3RyZWFtLgorICBzdGF0aWMgYm9vbCBQcmludChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKKyAgLy8gUHJpbnQgdGhlIGZpZWxkcyBpbiBhbiBVbmtub3duRmllbGRTZXQuICBUaGV5IGFyZSBwcmludGVkIGJ5IHRhZyBudW1iZXIKKyAgLy8gb25seS4gIEVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBoZXVyaXN0aWNhbGx5IGlkZW50aWZpZWQgYnkgYXR0ZW1wdGluZyB0bworICAvLyBwYXJzZSB0aGVtLgorICBzdGF0aWMgYm9vbCBQcmludFVua25vd25GaWVsZHMoY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KTsKKworICAvLyBMaWtlIFByaW50KCksIGJ1dCBvdXRwdXRzIGRpcmVjdGx5IHRvIGEgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBQcmludFRvU3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIHN0cmluZyogb3V0cHV0KTsKKworICAvLyBMaWtlIFByaW50VW5rbm93bkZpZWxkcygpLCBidXQgb3V0cHV0cyBkaXJlY3RseSB0byBhIHN0cmluZy4KKyAgc3RhdGljIGJvb2wgUHJpbnRVbmtub3duRmllbGRzVG9TdHJpbmcoY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBvdXRwdXQpOworCisgIC8vIE91dHB1dHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgc3VwcGxpZWQgb24KKyAgLy8gdGhlIG1lc3NhZ2Ugc3VwcGxpZWQuIEZvciBub24tcmVwZWF0ZWQgZmllbGRzLCBhbiBpbmRleCBvZiAtMSBtdXN0CisgIC8vIGJlIHN1cHBsaWVkLiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgd2lsbCBwcmludCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYQorICAvLyBmaWVsZCBpZiBpdCBpcyBub3Qgc2V0LgorICBzdGF0aWMgdm9pZCBQcmludEZpZWxkVmFsdWVUb1N0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogb3V0cHV0KTsKKworICAvLyBDbGFzcyBmb3IgdGhvc2UgdXNlcnMgd2hpY2ggcmVxdWlyZSBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgaG93CisgIC8vIGEgcHJvdG9idWZmZXIgbWVzc2FnZSBpcyBwcmludGVkIG91dC4KKyAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFByaW50ZXIgeworICAgcHVibGljOgorICAgIFByaW50ZXIoKTsKKyAgICB+UHJpbnRlcigpOworCisgICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpQcmludAorICAgIGJvb2wgUHJpbnQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UHJpbnRVbmtub3duRmllbGRzCisgICAgYm9vbCBQcmludFVua25vd25GaWVsZHMoY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpQcmludFRvU3RyaW5nCisgICAgYm9vbCBQcmludFRvU3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIHN0cmluZyogb3V0cHV0KSBjb25zdDsKKyAgICAvLyBMaWtlIFRleHRGb3JtYXQ6OlByaW50VW5rbm93bkZpZWxkc1RvU3RyaW5nCisgICAgYm9vbCBQcmludFVua25vd25GaWVsZHNUb1N0cmluZyhjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBvdXRwdXQpIGNvbnN0OworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcKKyAgICB2b2lkIFByaW50RmllbGRWYWx1ZVRvU3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBvdXRwdXQpIGNvbnN0OworCisgICAgLy8gQWRqdXN0IHRoZSBpbml0aWFsIGluZGVudCBsZXZlbCBvZiBhbGwgb3V0cHV0LiAgRWFjaCBpbmRlbnQgbGV2ZWwgaXMKKyAgICAvLyBlcXVhbCB0byB0d28gc3BhY2VzLgorICAgIHZvaWQgU2V0SW5pdGlhbEluZGVudExldmVsKGludCBpbmRlbnRfbGV2ZWwpIHsKKyAgICAgIGluaXRpYWxfaW5kZW50X2xldmVsXyA9IGluZGVudF9sZXZlbDsKKyAgICB9CisKKyAgICAvLyBJZiBwcmludGluZyBpbiBzaW5nbGUgbGluZSBtb2RlLCB0aGVuIHRoZSBlbnRpcmUgbWVzc2FnZSB3aWxsIGJlIG91dHB1dAorICAgIC8vIG9uIGEgc2luZ2xlIGxpbmUgd2l0aCBubyBsaW5lIGJyZWFrcy4KKyAgICB2b2lkIFNldFNpbmdsZUxpbmVNb2RlKGJvb2wgc2luZ2xlX2xpbmVfbW9kZSkgeworICAgICAgc2luZ2xlX2xpbmVfbW9kZV8gPSBzaW5nbGVfbGluZV9tb2RlOworICAgIH0KKworICAgIC8vIFNldCB0cnVlIHRvIHByaW50IHJlcGVhdGVkIHByaW1pdGl2ZXMgaW4gYSBmb3JtYXQgbGlrZToKKyAgICAvLyAgIGZpZWxkX25hbWU6IFsxLCAyLCAzLCA0XQorICAgIC8vIGluc3RlYWQgb2YgcHJpbnRpbmcgZWFjaCB2YWx1ZSBvbiBpdHMgb3duIGxpbmUuICBTaG9ydCBmb3JtYXQgYXBwbGllcworICAgIC8vIG9ubHkgdG8gcHJpbWl0aXZlIHZhbHVlcyAtLSBpLmUuIGV2ZXJ5dGhpbmcgZXhjZXB0IHN0cmluZ3MgYW5kCisgICAgLy8gc3ViLW1lc3NhZ2VzL2dyb3Vwcy4KKyAgICB2b2lkIFNldFVzZVNob3J0UmVwZWF0ZWRQcmltaXRpdmVzKGJvb2wgdXNlX3Nob3J0X3JlcGVhdGVkX3ByaW1pdGl2ZXMpIHsKKyAgICAgIHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzXyA9IHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzOworICAgIH0KKworICAgIC8vIFNldCB0cnVlIHRvIG91dHB1dCBVVEYtOCBpbnN0ZWFkIG9mIEFTQ0lJLiAgVGhlIG9ubHkgZGlmZmVyZW5jZQorICAgIC8vIGlzIHRoYXQgYnl0ZXMgPj0gMHg4MCBpbiBzdHJpbmcgZmllbGRzIHdpbGwgbm90IGJlIGVzY2FwZWQsCisgICAgLy8gYmVjYXVzZSB0aGV5IGFyZSBhc3N1bWVkIHRvIGJlIHBhcnQgb2YgVVRGLTggbXVsdGktYnl0ZQorICAgIC8vIHNlcXVlbmNlcy4KKyAgICB2b2lkIFNldFVzZVV0ZjhTdHJpbmdFc2NhcGluZyhib29sIGFzX3V0ZjgpIHsKKyAgICAgIHV0Zjhfc3RyaW5nX2VzY2FwaW5nXyA9IGFzX3V0Zjg7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBwcmludCB0aGUgdGV4dAorICAgIC8vIG91dHB1dCB0byB0aGUgT3V0cHV0U3RyZWFtIChzZWUgdGV4dF9mb3JtYXQuY2MgZm9yIGltcGxlbWVudGF0aW9uKS4KKyAgICBjbGFzcyBUZXh0R2VuZXJhdG9yOworCisgICAgLy8gSW50ZXJuYWwgUHJpbnQgbWV0aG9kLCB1c2VkIGZvciB3cml0aW5nIHRvIHRoZSBPdXRwdXRTdHJlYW0gdmlhCisgICAgLy8gdGhlIFRleHRHZW5lcmF0b3IgY2xhc3MuCisgICAgdm9pZCBQcmludChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdDsKKworICAgIC8vIFByaW50IGEgc2luZ2xlIGZpZWxkLgorICAgIHZvaWQgUHJpbnRGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0OworCisgICAgLy8gUHJpbnQgYSByZXBlYXRlZCBwcmltaXRpdmUgZmllbGQgaW4gc2hvcnQgZm9ybS4KKyAgICB2b2lkIFByaW50U2hvcnRSZXBlYXRlZEZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3Q7CisKKyAgICAvLyBQcmludCB0aGUgbmFtZSBvZiBhIGZpZWxkIC0tIGkuZS4gZXZlcnl0aGluZyB0aGF0IGNvbWVzIGJlZm9yZSB0aGUKKyAgICAvLyAnOicgZm9yIGEgc2luZ2xlIG5hbWUvdmFsdWUgcGFpci4KKyAgICB2b2lkIFByaW50RmllbGROYW1lKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3Q7CisKKyAgICAvLyBPdXRwdXRzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHN1cHBsaWVkIG9uCisgICAgLy8gdGhlIG1lc3NhZ2Ugc3VwcGxpZWQgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgbm90IHNldC4KKyAgICB2b2lkIFByaW50RmllbGRWYWx1ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdDsKKworICAgIC8vIFByaW50IHRoZSBmaWVsZHMgaW4gYW4gVW5rbm93bkZpZWxkU2V0LiAgVGhleSBhcmUgcHJpbnRlZCBieSB0YWcgbnVtYmVyCisgICAgLy8gb25seS4gIEVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBoZXVyaXN0aWNhbGx5IGlkZW50aWZpZWQgYnkgYXR0ZW1wdGluZyB0bworICAgIC8vIHBhcnNlIHRoZW0uCisgICAgdm9pZCBQcmludFVua25vd25GaWVsZHMoY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0OworCisgICAgaW50IGluaXRpYWxfaW5kZW50X2xldmVsXzsKKworICAgIGJvb2wgc2luZ2xlX2xpbmVfbW9kZV87CisKKyAgICBib29sIHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzXzsKKworICAgIGJvb2wgdXRmOF9zdHJpbmdfZXNjYXBpbmdfOworICB9OworCisgIC8vIFBhcnNlcyBhIHRleHQtZm9ybWF0IHByb3RvY29sIG1lc3NhZ2UgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvCisgIC8vIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC4gIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBmb3JtYXQgd3JpdHRlbgorICAvLyBieSBQcmludCgpLgorICBzdGF0aWMgYm9vbCBQYXJzZShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIE1lc3NhZ2UqIG91dHB1dCk7CisgIC8vIExpa2UgUGFyc2UoKSwgYnV0IHJlYWRzIGRpcmVjdGx5IGZyb20gYSBzdHJpbmcuCisgIHN0YXRpYyBib29sIFBhcnNlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOworCisgIC8vIExpa2UgUGFyc2UoKSwgYnV0IHRoZSBkYXRhIGlzIG1lcmdlZCBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlLCBhcyBpZgorICAvLyB1c2luZyBNZXNzYWdlOjpNZXJnZUZyb20oKS4KKyAgc3RhdGljIGJvb2wgTWVyZ2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOworICAvLyBMaWtlIE1lcmdlKCksIGJ1dCByZWFkcyBkaXJlY3RseSBmcm9tIGEgc3RyaW5nLgorICBzdGF0aWMgYm9vbCBNZXJnZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKKworICAvLyBQYXJzZSB0aGUgZ2l2ZW4gdGV4dCBhcyBhIHNpbmdsZSBmaWVsZCB2YWx1ZSBhbmQgc3RvcmUgaXQgaW50byB0aGUKKyAgLy8gZ2l2ZW4gZmllbGQgb2YgdGhlIGdpdmVuIG1lc3NhZ2UuIElmIHRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIGZpZWxkLAorICAvLyB0aGUgbmV3IHZhbHVlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZAorICBzdGF0aWMgYm9vbCBQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtZXNzYWdlKTsKKworICAvLyBJbnRlcmZhY2UgdGhhdCBUZXh0Rm9ybWF0OjpQYXJzZXIgY2FuIHVzZSB0byBmaW5kIGV4dGVuc2lvbnMuCisgIC8vIFRoaXMgY2xhc3MgbWF5IGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUgdG8gZmluZCBtb3JlIGluZm9ybWF0aW9uCisgIC8vIGxpa2UgZmllbGRzLCBldGMuCisgIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaW5kZXIgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgfkZpbmRlcigpOworCisgICAgLy8gVHJ5IHRvIGZpbmQgYW4gZXh0ZW5zaW9uIG9mICptZXNzYWdlIGJ5IGZ1bGx5LXF1YWxpZmllZCBmaWVsZAorICAgIC8vIG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm8gZXh0ZW5zaW9uIGlzIGtub3duIGZvciB0aGlzIG5hbWUgb3IgbnVtYmVyLgorICAgIHZpcnR1YWwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uKAorICAgICAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0ID0gMDsKKyAgfTsKKworICAvLyBGb3IgbW9yZSBjb250cm9sIG92ZXIgcGFyc2luZywgdXNlIHRoaXMgY2xhc3MuCisgIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBQYXJzZXIgeworICAgcHVibGljOgorICAgIFBhcnNlcigpOworICAgIH5QYXJzZXIoKTsKKworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UGFyc2UoKS4KKyAgICBib29sIFBhcnNlKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKKyAgICAvLyBMaWtlIFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygpLgorICAgIGJvb2wgUGFyc2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQsIE1lc3NhZ2UqIG91dHB1dCk7CisgICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpNZXJnZSgpLgorICAgIGJvb2wgTWVyZ2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKCkuCisgICAgYm9vbCBNZXJnZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKKworICAgIC8vIFNldCB3aGVyZSB0byByZXBvcnQgcGFyc2UgZXJyb3JzLiAgSWYgTlVMTCAodGhlIGRlZmF1bHQpLCBlcnJvcnMgd2lsbAorICAgIC8vIGJlIHByaW50ZWQgdG8gc3RkZXJyLgorICAgIHZvaWQgUmVjb3JkRXJyb3JzVG8oaW86OkVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpIHsKKyAgICAgIGVycm9yX2NvbGxlY3Rvcl8gPSBlcnJvcl9jb2xsZWN0b3I7CisgICAgfQorCisgICAgLy8gU2V0IGhvdyBwYXJzZXIgZmluZHMgZXh0ZW5zaW9ucy4gIElmIE5VTEwgKHRoZSBkZWZhdWx0KSwgdGhlCisgICAgLy8gcGFyc2VyIHdpbGwgdXNlIHRoZSBzdGFuZGFyZCBSZWZsZWN0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGgKKyAgICAvLyB0aGUgbWVzc2FnZSBiZWluZyBwYXJzZWQuCisgICAgdm9pZCBTZXRGaW5kZXIoRmluZGVyKiBmaW5kZXIpIHsKKyAgICAgIGZpbmRlcl8gPSBmaW5kZXI7CisgICAgfQorCisgICAgLy8gTm9ybWFsbHkgcGFyc2luZyBmYWlscyBpZiwgYWZ0ZXIgcGFyc2luZywgb3V0cHV0LT5Jc0luaXRpYWxpemVkKCkKKyAgICAvLyByZXR1cm5zIGZhbHNlLiAgQ2FsbCBBbGxvd1BhcnRpYWxNZXNzYWdlKHRydWUpIHRvIHNraXAgdGhpcyBjaGVjay4KKyAgICB2b2lkIEFsbG93UGFydGlhbE1lc3NhZ2UoYm9vbCBhbGxvdykgeworICAgICAgYWxsb3dfcGFydGlhbF8gPSBhbGxvdzsKKyAgICB9CisKKyAgICAvLyBMaWtlIFRleHRGb3JtYXQ6OlBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcKKyAgICBib29sIFBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KTsKKworICAgcHJpdmF0ZToKKyAgICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGFuIGludGVybmFsIGNsYXNzIHVzZWQgdG8gcGFyc2UgdGV4dAorICAgIC8vIHJlcHJlc2VudGF0aW9ucyAoc2VlIHRleHRfZm9ybWF0LmNjIGZvciBpbXBsZW1lbnRhdGlvbikuCisgICAgY2xhc3MgUGFyc2VySW1wbDsKKworICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6TWVyZ2UoKS4gIFRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkCisgICAgLy8gdG8gZG8gdGhlIHBhcnNpbmcuCisgICAgYm9vbCBNZXJnZVVzaW5nSW1wbChpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXJJbXBsKiBwYXJzZXJfaW1wbCk7CisKKyAgICBpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcl87CisgICAgRmluZGVyKiBmaW5kZXJfOworICAgIGJvb2wgYWxsb3dfcGFydGlhbF87CisgIH07CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGV4dEZvcm1hdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVEVYVF9GT1JNQVRfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWE4YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDExNDEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoganNjaG9yckBnb29nbGUuY29tIChKb3NlcGggU2Nob3JyKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vIENhbid0IHVzZSBhbiBhbm9ueW1vdXMgbmFtZXNwYWNlIGhlcmUgZHVlIHRvIGJyb2tlbm5lc3Mgb2YgVHJ1NjQgY29tcGlsZXIuCituYW1lc3BhY2UgdGV4dF9mb3JtYXRfdW5pdHRlc3QgeworCitpbmxpbmUgYm9vbCBJc05hTihkb3VibGUgdmFsdWUpIHsKKyAgLy8gTmFOIGlzIG5ldmVyIGVxdWFsIHRvIGFueXRoaW5nLCBldmVuIGl0c2VsZi4KKyAgcmV0dXJuIHZhbHVlICE9IHZhbHVlOworfQorCisvLyBBIGJhc2ljIHN0cmluZyB3aXRoIGRpZmZlcmVudCBlc2NhcGFibGUgY2hhcmFjdGVycyBmb3IgdGVzdGluZy4KK2NvbnN0IHN0cmluZyBrRXNjYXBlVGVzdFN0cmluZyA9CisgICJcIkEgc3RyaW5nIHdpdGggJyBjaGFyYWN0ZXJzIFxuIGFuZCBcciBuZXdsaW5lcyBhbmQgXHQgdGFicyBhbmQgXDAwMSAiCisgICJzbGFzaGVzIFxcIGFuZCAgbXVsdGlwbGUgICBzcGFjZXMiOworCisvLyBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhYm92ZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNoYXJhY3RlcnMgZXNjYXBlZC4KK2NvbnN0IHN0cmluZyBrRXNjYXBlVGVzdFN0cmluZ0VzY2FwZWQgPQorICAiXCJcXFwiQSBzdHJpbmcgd2l0aCBcXCcgY2hhcmFjdGVycyBcXG4gYW5kIFxcciBuZXdsaW5lcyAiCisgICJhbmQgXFx0IHRhYnMgYW5kIFxcMDAxIHNsYXNoZXMgXFxcXCBhbmQgIG11bHRpcGxlICAgc3BhY2VzXCIiOworCitjbGFzcyBUZXh0Rm9ybWF0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIFNldFVwVGVzdENhc2UoKSB7CisgICAgRmlsZTo6UmVhZEZpbGVUb1N0cmluZ09yRGllKAorICAgICAgICBUZXN0U291cmNlRGlyKCkKKyAgICAgICAgKyAiL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dCIsCisgICAgICAgICZzdGF0aWNfcHJvdG9fZGVidWdfc3RyaW5nXyk7CisgIH0KKworICBUZXh0Rm9ybWF0VGVzdCgpIDogcHJvdG9fZGVidWdfc3RyaW5nXyhzdGF0aWNfcHJvdG9fZGVidWdfc3RyaW5nXykge30KKworIHByb3RlY3RlZDoKKyAgLy8gRGVidWcgc3RyaW5nIHJlYWQgZnJvbSB0ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dC4KKyAgY29uc3Qgc3RyaW5nIHByb3RvX2RlYnVnX3N0cmluZ187CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgcHJvdG9fOworCisgcHJpdmF0ZToKKyAgc3RhdGljIHN0cmluZyBzdGF0aWNfcHJvdG9fZGVidWdfc3RyaW5nXzsKK307CitzdHJpbmcgVGV4dEZvcm1hdFRlc3Q6OnN0YXRpY19wcm90b19kZWJ1Z19zdHJpbmdfOworCitjbGFzcyBUZXh0Rm9ybWF0RXh0ZW5zaW9uc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgeworICAgIEZpbGU6OlJlYWRGaWxlVG9TdHJpbmdPckRpZSgKKyAgICAgICAgVGVzdFNvdXJjZURpcigpCisgICAgICAgICsgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvIgorICAgICAgICAgICJ0ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0IiwKKyAgICAgICAgJnN0YXRpY19wcm90b19kZWJ1Z19zdHJpbmdfKTsKKyAgfQorCisgIFRleHRGb3JtYXRFeHRlbnNpb25zVGVzdCgpCisgICAgICA6IHByb3RvX2RlYnVnX3N0cmluZ18oc3RhdGljX3Byb3RvX2RlYnVnX3N0cmluZ18pIHt9CisKKyBwcm90ZWN0ZWQ6CisgIC8vIERlYnVnIHN0cmluZyByZWFkIGZyb20gdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQuCisgIGNvbnN0IHN0cmluZyBwcm90b19kZWJ1Z19zdHJpbmdfOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgcHJvdG9fOworCisgcHJpdmF0ZToKKyAgc3RhdGljIHN0cmluZyBzdGF0aWNfcHJvdG9fZGVidWdfc3RyaW5nXzsKK307CitzdHJpbmcgVGV4dEZvcm1hdEV4dGVuc2lvbnNUZXN0OjpzdGF0aWNfcHJvdG9fZGVidWdfc3RyaW5nXzsKKworCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIEJhc2ljKSB7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJnByb3RvXyk7CisgIEVYUEVDVF9FUShwcm90b19kZWJ1Z19zdHJpbmdfLCBwcm90b18uRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0RXh0ZW5zaW9uc1Rlc3QsIEV4dGVuc2lvbnMpIHsKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJnByb3RvXyk7CisgIEVYUEVDVF9FUShwcm90b19kZWJ1Z19zdHJpbmdfLCBwcm90b18uRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgU2hvcnREZWJ1Z1N0cmluZykgeworICBwcm90b18uc2V0X29wdGlvbmFsX2ludDMyKDEpOworICBwcm90b18uc2V0X29wdGlvbmFsX3N0cmluZygiaGVsbG8iKTsKKyAgcHJvdG9fLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDIpOworICBwcm90b18ubXV0YWJsZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKTsKKworICBFWFBFQ1RfRVEoIm9wdGlvbmFsX2ludDMyOiAxIG9wdGlvbmFsX3N0cmluZzogXCJoZWxsb1wiICIKKyAgICAgICAgICAgICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiAyIH0gIgorICAgICAgICAgICAgIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSB7IH0iLAorICAgICAgICAgICAgcHJvdG9fLlNob3J0RGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgU2hvcnRQcmltaXRpdmVSZXBlYXRlZHMpIHsKKyAgcHJvdG9fLnNldF9vcHRpb25hbF9pbnQzMigxMjMpOworICBwcm90b18uYWRkX3JlcGVhdGVkX2ludDMyKDQ1Nik7CisgIHByb3RvXy5hZGRfcmVwZWF0ZWRfaW50MzIoNzg5KTsKKyAgcHJvdG9fLmFkZF9yZXBlYXRlZF9zdHJpbmcoImZvbyIpOworICBwcm90b18uYWRkX3JlcGVhdGVkX3N0cmluZygiYmFyIik7CisgIHByb3RvXy5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDIpOworICBwcm90b18uYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigzKTsKKyAgcHJvdG9fLmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08pOworICBwcm90b18uYWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUik7CisKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBwcmludGVyLlNldFVzZVNob3J0UmVwZWF0ZWRQcmltaXRpdmVzKHRydWUpOworICBzdHJpbmcgdGV4dDsKKyAgcHJpbnRlci5QcmludFRvU3RyaW5nKHByb3RvXywgJnRleHQpOworCisgIEVYUEVDVF9FUSgib3B0aW9uYWxfaW50MzI6IDEyM1xuIgorICAgICAgICAgICAgInJlcGVhdGVkX2ludDMyOiBbNDU2LCA3ODldXG4iCisgICAgICAgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcImZvb1wiXG4iCisgICAgICAgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcImJhclwiXG4iCisgICAgICAgICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uge1xuICBiYjogMlxufVxuIgorICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbiAgYmI6IDNcbn1cbiIKKyAgICAgICAgICAgICJyZXBlYXRlZF9uZXN0ZWRfZW51bTogW0ZPTywgQkFSXVxuIiwKKyAgICAgICAgICAgIHRleHQpOworCisgIC8vIFRyeSBpbiBzaW5nbGUtbGluZSBtb2RlLgorICBwcmludGVyLlNldFNpbmdsZUxpbmVNb2RlKHRydWUpOworICBwcmludGVyLlByaW50VG9TdHJpbmcocHJvdG9fLCAmdGV4dCk7CisKKyAgRVhQRUNUX0VRKCJvcHRpb25hbF9pbnQzMjogMTIzICIKKyAgICAgICAgICAgICJyZXBlYXRlZF9pbnQzMjogWzQ1NiwgNzg5XSAiCisgICAgICAgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcImZvb1wiICIKKyAgICAgICAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFwiYmFyXCIgIgorICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsgYmI6IDIgfSAiCisgICAgICAgICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeyBiYjogMyB9ICIKKyAgICAgICAgICAgICJyZXBlYXRlZF9uZXN0ZWRfZW51bTogW0ZPTywgQkFSXSAiLAorICAgICAgICAgICAgdGV4dCk7Cit9CisKKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBTdHJpbmdFc2NhcGUpIHsKKyAgLy8gU2V0IHRoZSBzdHJpbmcgdmFsdWUgdG8gdGVzdC4KKyAgcHJvdG9fLnNldF9vcHRpb25hbF9zdHJpbmcoa0VzY2FwZVRlc3RTdHJpbmcpOworCisgIC8vIEdldCB0aGUgRGVidWdTdHJpbmcgZnJvbSB0aGUgcHJvdG8uCisgIHN0cmluZyBkZWJ1Z19zdHJpbmcgPSBwcm90b18uRGVidWdTdHJpbmcoKTsKKyAgc3RyaW5nIHV0ZjhfZGVidWdfc3RyaW5nID0gcHJvdG9fLlV0ZjhEZWJ1Z1N0cmluZygpOworCisgIC8vIEhhcmRjb2RlIGEgY29ycmVjdCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuCisgIHN0cmluZyBjb3JyZWN0X3N0cmluZyA9ICJvcHRpb25hbF9zdHJpbmc6ICIKKyAgICAgICsga0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkCisgICAgICAgKyAiXG4iOworCisgIC8vIENvbXBhcmUuCisgIEVYUEVDVF9FUShjb3JyZWN0X3N0cmluZywgZGVidWdfc3RyaW5nKTsKKyAgLy8gVVRGLTggc3RyaW5nIGlzIHRoZSBzYW1lIGFzIG5vbi1VVEYtOCBiZWNhdXNlCisgIC8vIHRoZSBwcm90b2NvbCBidWZmZXIgY29udGFpbnMgbm8gVVRGLTggdGV4dC4KKyAgRVhQRUNUX0VRKGNvcnJlY3Rfc3RyaW5nLCB1dGY4X2RlYnVnX3N0cmluZyk7CisKKyAgc3RyaW5nIGV4cGVjdGVkX3Nob3J0X2RlYnVnX3N0cmluZyA9ICJvcHRpb25hbF9zdHJpbmc6ICIKKyAgICAgICsga0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkOworICBFWFBFQ1RfRVEoZXhwZWN0ZWRfc2hvcnRfZGVidWdfc3RyaW5nLCBwcm90b18uU2hvcnREZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBVdGY4RGVidWdTdHJpbmcpIHsKKyAgLy8gU2V0IHRoZSBzdHJpbmcgdmFsdWUgdG8gdGVzdC4KKyAgcHJvdG9fLnNldF9vcHRpb25hbF9zdHJpbmcoIlwzNTBcMjYwXDI2N1wzNDZcMjU1XDIxNCIpOworCisgIC8vIEdldCB0aGUgRGVidWdTdHJpbmcgZnJvbSB0aGUgcHJvdG8uCisgIHN0cmluZyBkZWJ1Z19zdHJpbmcgPSBwcm90b18uRGVidWdTdHJpbmcoKTsKKyAgc3RyaW5nIHV0ZjhfZGVidWdfc3RyaW5nID0gcHJvdG9fLlV0ZjhEZWJ1Z1N0cmluZygpOworCisgIC8vIEhhcmRjb2RlIGEgY29ycmVjdCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuCisgIHN0cmluZyBjb3JyZWN0X3V0Zjhfc3RyaW5nID0gIm9wdGlvbmFsX3N0cmluZzogIgorICAgICAgIlwiXDM1MFwyNjBcMjY3XDM0NlwyNTVcMjE0XCIiCisgICAgICAiXG4iOworICBzdHJpbmcgY29ycmVjdF9zdHJpbmcgPSAib3B0aW9uYWxfc3RyaW5nOiAiCisgICAgICAiXCJcXDM1MFxcMjYwXFwyNjdcXDM0NlxcMjU1XFwyMTRcIiIKKyAgICAgICJcbiI7CisKKyAgLy8gQ29tcGFyZS4KKyAgRVhQRUNUX0VRKGNvcnJlY3RfdXRmOF9zdHJpbmcsIHV0ZjhfZGVidWdfc3RyaW5nKTsKKyAgRVhQRUNUX0VRKGNvcnJlY3Rfc3RyaW5nLCBkZWJ1Z19zdHJpbmcpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50VW5rbm93bkZpZWxkcykgeworICAvLyBUZXN0IHByaW50aW5nIG9mIHVua25vd24gZmllbGRzIGluIGEgbWVzc2FnZS4KKworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlOworICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzID0gbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CisKKyAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCg1LCAxKTsKKyAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIoNSwgMik7CisgIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDY0KDUsIDMpOworICB1bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKDUsICI0Iik7CisgIHVua25vd25fZmllbGRzLT5BZGRHcm91cCg1KS0+QWRkVmFyaW50KDEwLCA1KTsKKworICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDEpOworICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDIpOworICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDMpOworCisgIEVYUEVDVF9FUSgKKyAgICAiNTogMVxuIgorICAgICI1OiAweDAwMDAwMDAyXG4iCisgICAgIjU6IDB4MDAwMDAwMDAwMDAwMDAwM1xuIgorICAgICI1OiBcIjRcIlxuIgorICAgICI1IHtcbiIKKyAgICAiICAxMDogNVxuIgorICAgICJ9XG4iCisgICAgIjg6IDFcbiIKKyAgICAiODogMlxuIgorICAgICI4OiAzXG4iLAorICAgIG1lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUHJpbnRVbmtub3duTWVzc2FnZSkgeworICAvLyBUZXN0IGhldXJpc3RpYyBwcmludGluZyBvZiBtZXNzYWdlcyBpbiBhbiBVbmtub3duRmllbGRTZXQuCisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIC8vIENhc2VzIHdoaWNoIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgc3ViLW1lc3NhZ2VzLgorCisgIC8vICdhJyBpcyBhIHZhbGlkIEZJWEVENjQgdGFnLCBzbyBmb3IgdGhlIHN0cmluZyB0byBiZSBwYXJzZWFibGUgYXMgYSBtZXNzYWdlCisgIC8vIGl0IHNob3VsZCBiZSBmb2xsb3dlZCBieSA4IGJ5dGVzLiAgU2luY2UgdGhpcyBzdHJpbmcgb25seSBoYXMgdHdvCisgIC8vIHN1YnNlcXVlbnQgYnl0ZXMsIGl0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc3RyaW5nLgorICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoImFiYyIpOworCisgIC8vICdkJyBoYXBwZW5zIHRvIGJlIGEgdmFsaWQgRU5ER1JPVVAgdGFnLiAgU28sCisgIC8vIFVua25vd25GaWVsZFNldDo6TWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSB3aWxsIHN1Y2Nlc3NmdWxseSBwYXJzZSAiZGVmIiwgYnV0CisgIC8vIHRoZSBDb25zdW1lZEVudGlyZU1lc3NhZ2UoKSBjaGVjayBzaG91bGQgZmFpbC4KKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJkZWYiKTsKKworICAvLyBBIHplcm8tbGVuZ3RoIHN0cmluZyBzaG91bGQgbmV2ZXIgYmUgaW50ZXJwcmV0ZWQgYXMgYSBtZXNzYWdlIGV2ZW4gdGhvdWdoCisgIC8vIGl0IGlzIHRlY2huaWNhbGx5IHZhbGlkIGFzIG9uZS4KKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCIiKTsKKworICAvLyBDYXNlIHdoaWNoIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIHN1Yi1tZXNzYWdlLgorCisgIC8vIEFuIGFjdHVhbCBuZXN0ZWQgbWVzc2FnZSB3aXRoIGNvbnRlbnQgc2hvdWxkIGFsd2F5cyBiZSBpbnRlcnByZXRlZCBhcyBhCisgIC8vIG5lc3RlZCBtZXNzYWdlLgorICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMTIzKTsKKworICBzdHJpbmcgZGF0YTsKKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgc3RyaW5nIHRleHQ7CisgIFVua25vd25GaWVsZFNldCB1bmtub3duX2ZpZWxkczsKKyAgRVhQRUNUX1RSVUUodW5rbm93bl9maWVsZHMuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UHJpbnRVbmtub3duRmllbGRzVG9TdHJpbmcodW5rbm93bl9maWVsZHMsICZ0ZXh0KSk7CisgIEVYUEVDVF9FUSgKKyAgICAiNDQ6IFwiYWJjXCJcbiIKKyAgICAiNDQ6IFwiZGVmXCJcbiIKKyAgICAiNDQ6IFwiXCJcbiIKKyAgICAiNDgge1xuIgorICAgICIgIDE6IDEyM1xuIgorICAgICJ9XG4iLAorICAgIHRleHQpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50TWVzc2FnZVdpdGhJbmRlbnQpIHsKKyAgLy8gVGVzdCBhZGRpbmcgYW4gaW5pdGlhbCBpbmRlbnQgdG8gcHJpbnRpbmcuCisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiYWJjIik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiZGVmIik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxMjMpOworCisgIHN0cmluZyB0ZXh0OworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIHByaW50ZXIuU2V0SW5pdGlhbEluZGVudExldmVsKDEpOworICBFWFBFQ1RfVFJVRShwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpKTsKKyAgRVhQRUNUX0VRKAorICAgICIgIHJlcGVhdGVkX3N0cmluZzogXCJhYmNcIlxuIgorICAgICIgIHJlcGVhdGVkX3N0cmluZzogXCJkZWZcIlxuIgorICAgICIgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbiIKKyAgICAiICAgIGJiOiAxMjNcbiIKKyAgICAiICB9XG4iLAorICAgIHRleHQpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50TWVzc2FnZVNpbmdsZUxpbmUpIHsKKyAgLy8gVGVzdCBwcmludGluZyBhIG1lc3NhZ2Ugb24gYSBzaW5nbGUgbGluZS4KKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJhYmMiKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJkZWYiKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEyMyk7CisKKyAgc3RyaW5nIHRleHQ7CisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgcHJpbnRlci5TZXRJbml0aWFsSW5kZW50TGV2ZWwoMSk7CisgIHByaW50ZXIuU2V0U2luZ2xlTGluZU1vZGUodHJ1ZSk7CisgIEVYUEVDVF9UUlVFKHByaW50ZXIuUHJpbnRUb1N0cmluZyhtZXNzYWdlLCAmdGV4dCkpOworICBFWFBFQ1RfRVEoCisgICAgIiAgcmVwZWF0ZWRfc3RyaW5nOiBcImFiY1wiIHJlcGVhdGVkX3N0cmluZzogXCJkZWZcIiAiCisgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsgYmI6IDEyMyB9ICIsCisgICAgdGV4dCk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUGFyc2VCYXNpYykgeworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0ocHJvdG9fZGVidWdfc3RyaW5nXy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b19kZWJ1Z19zdHJpbmdfLnNpemUoKSk7CisgIFRleHRGb3JtYXQ6OlBhcnNlKCZpbnB1dF9zdHJlYW0sICZwcm90b18pOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KHByb3RvXyk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0RXh0ZW5zaW9uc1Rlc3QsIFBhcnNlRXh0ZW5zaW9ucykgeworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0ocHJvdG9fZGVidWdfc3RyaW5nXy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b19kZWJ1Z19zdHJpbmdfLnNpemUoKSk7CisgIFRleHRGb3JtYXQ6OlBhcnNlKCZpbnB1dF9zdHJlYW0sICZwcm90b18pOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChwcm90b18pOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlRW51bUZpZWxkRnJvbU51bWJlcikgeworICAvLyBDcmVhdGUgYSBwYXJzZSBzdHJpbmcgd2l0aCBhIG51bWVyaWNhbCB2YWx1ZSBmb3IgYW4gZW51bSBmaWVsZC4KKyAgc3RyaW5nIHBhcnNlX3N0cmluZyA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoIm9wdGlvbmFsX25lc3RlZF9lbnVtOiAkMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWik7CisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhwYXJzZV9zdHJpbmcsICZwcm90b18pKTsKKyAgRVhQRUNUX1RSVUUocHJvdG9fLmhhc19vcHRpb25hbF9uZXN0ZWRfZW51bSgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgcHJvdG9fLm9wdGlvbmFsX25lc3RlZF9lbnVtKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlRW51bUZpZWxkRnJvbU5lZ2F0aXZlTnVtYmVyKSB7CisgIEFTU0VSVF9MVCh1bml0dGVzdDo6U1BBUlNFX0UsIDApOworICBzdHJpbmcgcGFyc2Vfc3RyaW5nID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgic3BhcnNlX2VudW06ICQwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlNQQVJTRV9FKTsKKyAgdW5pdHRlc3Q6OlNwYXJzZUVudW1NZXNzYWdlIHByb3RvOworICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocGFyc2Vfc3RyaW5nLCAmcHJvdG8pKTsKKyAgRVhQRUNUX1RSVUUocHJvdG8uaGFzX3NwYXJzZV9lbnVtKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlNQQVJTRV9FLCBwcm90by5zcGFyc2VfZW51bSgpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQYXJzZVN0cmluZ0VzY2FwZSkgeworICAvLyBDcmVhdGUgYSBwYXJzZSBzdHJpbmcgd2l0aCBlc2NwYWVkIGNoYXJhY3RlcnMgaW4gaXQuCisgIHN0cmluZyBwYXJzZV9zdHJpbmcgPSAib3B0aW9uYWxfc3RyaW5nOiAiCisgICAgICArIGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZAorICAgICAgKyAiXG4iOworCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShwYXJzZV9zdHJpbmcuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vfc3RyaW5nLnNpemUoKSk7CisgIFRleHRGb3JtYXQ6OlBhcnNlKCZpbnB1dF9zdHJlYW0sICZwcm90b18pOworCisgIC8vIENvbXBhcmUuCisgIEVYUEVDVF9FUShrRXNjYXBlVGVzdFN0cmluZywgcHJvdG9fLm9wdGlvbmFsX3N0cmluZygpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQYXJzZUNvbmNhdGVuYXRlZFN0cmluZykgeworICAvLyBDcmVhdGUgYSBwYXJzZSBzdHJpbmcgd2l0aCBtdWx0aXBsZSBwYXJ0cyBvbiBvbmUgbGluZS4KKyAgc3RyaW5nIHBhcnNlX3N0cmluZyA9ICJvcHRpb25hbF9zdHJpbmc6IFwiZm9vXCIgXCJiYXJcIlxuIjsKKworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0xKHBhcnNlX3N0cmluZy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9zdHJpbmcuc2l6ZSgpKTsKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbTEsICZwcm90b18pOworCisgIC8vIENvbXBhcmUuCisgIEVYUEVDVF9FUSgiZm9vYmFyIiwgcHJvdG9fLm9wdGlvbmFsX3N0cmluZygpKTsKKworICAvLyBDcmVhdGUgYSBwYXJzZSBzdHJpbmcgd2l0aCBtdWx0aXBsZSBwYXJ0cyBvbiBzZXBlcmF0ZSBsaW5lcy4KKyAgcGFyc2Vfc3RyaW5nID0gIm9wdGlvbmFsX3N0cmluZzogXCJmb29cIlxuIgorICAgICAgICAgICAgICAgICAiXCJiYXJcIlxuIjsKKworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0yKHBhcnNlX3N0cmluZy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9zdHJpbmcuc2l6ZSgpKTsKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbTIsICZwcm90b18pOworCisgIC8vIENvbXBhcmUuCisgIEVYUEVDVF9FUSgiZm9vYmFyIiwgcHJvdG9fLm9wdGlvbmFsX3N0cmluZygpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQYXJzZUZsb2F0V2l0aFN1ZmZpeCkgeworICAvLyBUZXN0IHRoYXQgd2UgY2FuIHBhcnNlIGEgZmxvYXRpbmctcG9pbnQgdmFsdWUgd2l0aCAnZicgYXBwZW5kZWQgdG8gdGhlCisgIC8vIGVuZC4gIFRoaXMgaXMgbmVlZGVkIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIHByb3RvMS4KKworICAvLyBIYXZlIGl0IHBhcnNlIGEgZmxvYXQgd2l0aCB0aGUgJ2YnIHN1ZmZpeC4KKyAgc3RyaW5nIHBhcnNlX3N0cmluZyA9ICJvcHRpb25hbF9mbG9hdDogMS4wZlxuIjsKKworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0ocGFyc2Vfc3RyaW5nLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3N0cmluZy5zaXplKCkpOworCisgIFRleHRGb3JtYXQ6OlBhcnNlKCZpbnB1dF9zdHJlYW0sICZwcm90b18pOworCisgIC8vIENvbXBhcmUuCisgIEVYUEVDVF9FUSgxLjAsIHByb3RvXy5vcHRpb25hbF9mbG9hdCgpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQYXJzZVNob3J0UmVwZWF0ZWRGb3JtKSB7CisgIHN0cmluZyBwYXJzZV9zdHJpbmcgPQorICAgICAgLy8gTWl4ZWQgc2hvcnQtZm9ybSBhbmQgbG9uZy1mb3JtIGFyZSBzaW1wbHkgY29uY2F0ZW5hdGVkLgorICAgICAgInJlcGVhdGVkX2ludDMyOiAxXG4iCisgICAgICAicmVwZWF0ZWRfaW50MzI6IFs0NTYsIDc4OV1cbiIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfZW51bTogWyAgRk9PICxCQVIsICMgY29tbWVudFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAzXVxuIgorICAgICAgLy8gTm90ZSB0aGF0IHdoaWxlIHRoZSBwcmludGVyIHdvbid0IHByaW50IHJlcGVhdGVkIHN0cmluZ3MgaW4gc2hvcnQtZm9ybSwKKyAgICAgIC8vIHRoZSBwYXJzZXIgd2lsbCBhY2NlcHQgdGhlbS4KKyAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFsgXCJmb29cIiwgJ2JhcicgXVxuIjsKKworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocGFyc2Vfc3RyaW5nLCAmcHJvdG9fKSk7CisKKyAgQVNTRVJUX0VRKDMsIHByb3RvXy5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgcHJvdG9fLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDQ1NiwgcHJvdG9fLnJlcGVhdGVkX2ludDMyKDEpKTsKKyAgRVhQRUNUX0VRKDc4OSwgcHJvdG9fLnJlcGVhdGVkX2ludDMyKDIpKTsKKworICBBU1NFUlRfRVEoMywgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUoKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfZW51bSgwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfZW51bSgxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfZW51bSgyKSk7CisKKyAgQVNTRVJUX0VRKDIsIHByb3RvXy5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBwcm90b18ucmVwZWF0ZWRfc3RyaW5nKDApKTsKKyAgRVhQRUNUX0VRKCJiYXIiLCBwcm90b18ucmVwZWF0ZWRfc3RyaW5nKDEpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBDb21tZW50cykgeworICAvLyBUZXN0IHRoYXQgY29tbWVudHMgYXJlIGlnbm9yZWQuCisKKyAgc3RyaW5nIHBhcnNlX3N0cmluZyA9ICJvcHRpb25hbF9pbnQzMjogMSAgIyBhIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9pbnQ2NDogMiAgIyBhbm90aGVyIGNvbW1lbnQiOworCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShwYXJzZV9zdHJpbmcuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vfc3RyaW5nLnNpemUoKSk7CisKKyAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7CisKKyAgLy8gQ29tcGFyZS4KKyAgRVhQRUNUX0VRKDEsIHByb3RvXy5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDIsIHByb3RvXy5vcHRpb25hbF9pbnQ2NCgpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBPcHRpb25hbENvbG9uKSB7CisgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gcGxhY2UgYSAnOicgYWZ0ZXIgdGhlIGZpZWxkIG5hbWUgb2YgYSBuZXN0ZWQgbWVzc2FnZSwKKyAgLy8gZXZlbiB0aG91Z2ggd2UgZG9uJ3QgaGF2ZSB0by4KKworICBzdHJpbmcgcGFyc2Vfc3RyaW5nID0gIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlOiB7IGJiOiAxfVxuIjsKKworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0ocGFyc2Vfc3RyaW5nLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3N0cmluZy5zaXplKCkpOworCisgIFRleHRGb3JtYXQ6OlBhcnNlKCZpbnB1dF9zdHJlYW0sICZwcm90b18pOworCisgIC8vIENvbXBhcmUuCisgIEVYUEVDVF9UUlVFKHByb3RvXy5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgxLCBwcm90b18ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsKK30KKworLy8gU29tZSBwbGF0Zm9ybXMgKGUuZy4gV2luZG93cykgaW5zaXN0IG9uIHBhZGRpbmcgdGhlIGV4cG9uZW50IHRvIHRocmVlCisvLyBkaWdpdHMgd2hlbiBvbmUgb3IgdHdvIHdvdWxkIGJlIGp1c3QgZmluZS4KK3N0YXRpYyBzdHJpbmcgUmVtb3ZlUmVkdW5kYW50WmVyb3Moc3RyaW5nIHRleHQpIHsKKyAgdGV4dCA9IFN0cmluZ1JlcGxhY2UodGV4dCwgImUrMCIsICJlKyIsIHRydWUpOworICB0ZXh0ID0gU3RyaW5nUmVwbGFjZSh0ZXh0LCAiZS0wIiwgImUtIiwgdHJ1ZSk7CisgIHJldHVybiB0ZXh0OworfQorCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50RXhvdGljKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICAvLyBOb3RlOiAgSW4gQywgYSBuZWdhdGl2ZSBpbnRlZ2VyIGxpdGVyYWwgaXMgYWN0dWFsbHkgdGhlIHVuYXJ5IG5lZ2F0aW9uCisgIC8vICAgb3BlcmF0b3IgYmVpbmcgYXBwbGllZCB0byBhIHBvc2l0aXZlIGludGVnZXIgbGl0ZXJhbCwgYW5kCisgIC8vICAgOTIyMzM3MjAzNjg1NDc3NTgwOCBpcyBvdXRzaWRlIHRoZSByYW5nZSBvZiBpbnQ2NC4gIEhvd2V2ZXIsIGl0IGlzIG5vdAorICAvLyAgIG91dHNpZGUgdGhlIHJhbmdlIG9mIHVpbnQ2NC4gIENvbmZ1c2luZ2x5LCB0aGlzIG1lYW5zIHRoYXQgZXZlcnl0aGluZworICAvLyAgIHdvcmtzIGlmIHdlIG1ha2UgdGhlIGxpdGVyYWwgdW5zaWduZWQsIGV2ZW4gdGhvdWdoIHdlIGFyZSBuZWdhdGluZyBpdC4KKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfaW50NjQoLUdPT0dMRV9VTE9OR0xPTkcoOTIyMzM3MjAzNjg1NDc3NTgwOCkpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF91aW50NjQoR09PR0xFX1VMT05HTE9ORygxODQ0Njc0NDA3MzcwOTU1MTYxNSkpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMTIzLjQ1Nik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzZTIxKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjNlLTE4KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCkpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoc3RyaW5nKCJcMDAwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJ1wiIiwgMTIpKTsKKworICAvLyBGdW4gc3Rvcnk6ICBXZSB1c2VkIHRvIHVzZSAxLjIzZTIyIGluc3RlYWQgb2YgMS4yM2UyMSBhYm92ZSwgYnV0IHRoaXMKKyAgLy8gICBzZWVtZWQgdG8gdHJpZ2dlciBhbiBvZGQgY2FzZSBvbiBNaW5HVy9HQ0MgMy40LjUgd2hlcmUgR0NDJ3MgcGFyc2luZyBvZgorICAvLyAgIHRoZSB2YWx1ZSBkaWZmZXJlZCBmcm9tIHN0cnRvZCgpJ3MgcGFyc2luZy4gIFRoYXQgaXMgdG8gc2F5LCB0aGUKKyAgLy8gICBmb2xsb3dpbmcgYXNzZXJ0aW9uIGZhaWxzIG9uIE1pbkdXOgorICAvLyAgICAgYXNzZXJ0KDEuMjNlMjIgPT0gc3RydG9kKCIxLjIzZTIyIiwgTlVMTCkpOworICAvLyAgIEFzIGEgcmVzdWx0LCBTaW1wbGVEdG9hKCkgd291bGQgcHJpbnQgdGhlIHZhbHVlIGFzCisgIC8vICAgIjEuMjMwMDAwMDAwMDAwMDAwMWUrMjIiIHRvIG1ha2Ugc3VyZSBzdHJ0b2QoKSBwcm9kdWNlIHRoZSBleGFjdCBzYW1lCisgIC8vICAgcmVzdWx0LiAgT3VyIGdvYWwgaXMgdG8gdGVzdCBydW50aW1lIHBhcnNpbmcsIG5vdCBjb21waWxlLXRpbWUgcGFyc2luZywKKyAgLy8gICBzbyB0aGlzIHdhc24ndCBvdXIgcHJvYmxlbS4gIEl0IHdhcyBmb3VuZCB0aGF0IHVzaW5nIDEuMjNlMjEgZGlkIG5vdAorICAvLyAgIGhhdmUgdGhpcyBwcm9ibGVtLCBzbyB3ZSBzd2l0Y2hlZCB0byB0aGF0IGluc3RlYWQuCisKKyAgRVhQRUNUX0VRKAorICAgICJyZXBlYXRlZF9pbnQ2NDogLTkyMjMzNzIwMzY4NTQ3NzU4MDhcbiIKKyAgICAicmVwZWF0ZWRfdWludDY0OiAxODQ0Njc0NDA3MzcwOTU1MTYxNVxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEyMy40NTZcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzZSsyMVxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjNlLTE4XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogaW5mXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogLWluZlxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IG5hblxuIgorICAgICJyZXBlYXRlZF9zdHJpbmc6IFwiXFwwMDBcXDAwMVxcMDA3XFwwMTBcXDAxNFxcblxcclxcdFxcMDEzXFxcXFxcJ1xcXCJcIlxuIiwKKyAgICBSZW1vdmVSZWR1bmRhbnRaZXJvcyhtZXNzYWdlLkRlYnVnU3RyaW5nKCkpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludEZsb2F0UHJlY2lzaW9uKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yMzQpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzNDUpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzNDU2KTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yZTEwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yM2UxMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2Zsb2F0KDEuMjM0ZTEwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yMzQ1ZTEwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yMzQ1NmUxMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMyk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDUpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Nik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nyk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2NzgpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5OCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODcpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OTg3Nik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODc2NSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODc2NTQpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OTg3NjU0Myk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjJlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjNlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0ZTEwMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDVlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTZlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ZTEwMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2NzhlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODllMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4ZTEwMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODdlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzZlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzY1ZTEwMCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODc2NTRlMTAwKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzY1NDNlMTAwKTsKKworICBFWFBFQ1RfRVEoCisgICAgInJlcGVhdGVkX2Zsb2F0OiAxLjJcbiIKKyAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjNcbiIKKyAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0XG4iCisgICAgInJlcGVhdGVkX2Zsb2F0OiAxLjIzNDVcbiIKKyAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NTZcbiIKKyAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMmUrMTBcbiIKKyAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjNlKzEwXG4iCisgICAgInJlcGVhdGVkX2Zsb2F0OiAxLjIzNGUrMTBcbiIKKyAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NWUrMTBcbiIKKyAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NTZlKzEwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM1xuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1NlxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OVxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NlxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4NzY1XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjU0XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjU0M1xuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMmUrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM2UrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzRlKzEwMFxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NWUrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1NmUrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1NjdlKzEwMFxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3OGUrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OWUrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OThlKzEwMFxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4N2UrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NmUrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjVlKzEwMFxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4NzY1NGUrMTAwXG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjU0M2UrMTAwXG4iLAorICAgIFJlbW92ZVJlZHVuZGFudFplcm9zKG1lc3NhZ2UuRGVidWdTdHJpbmcoKSkpOworfQorCisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgQWxsb3dQYXJ0aWFsKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKKyAgcGFyc2VyLkFsbG93UGFydGlhbE1lc3NhZ2UodHJ1ZSk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoImE6IDEiLCAmbWVzc2FnZSkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5hKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2MoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUGFyc2VFeG90aWMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCisgICAgInJlcGVhdGVkX2ludDMyOiAtMVxuIgorICAgICJyZXBlYXRlZF9pbnQzMjogLTIxNDc0ODM2NDhcbiIKKyAgICAicmVwZWF0ZWRfaW50NjQ6IC0xXG4iCisgICAgInJlcGVhdGVkX2ludDY0OiAtOTIyMzM3MjAzNjg1NDc3NTgwOFxuIgorICAgICJyZXBlYXRlZF91aW50MzI6IDQyOTQ5NjcyOTVcbiIKKyAgICAicmVwZWF0ZWRfdWludDMyOiAyMTQ3NDgzNjQ4XG4iCisgICAgInJlcGVhdGVkX3VpbnQ2NDogMTg0NDY3NDQwNzM3MDk1NTE2MTVcbiIKKyAgICAicmVwZWF0ZWRfdWludDY0OiA5MjIzMzcyMDM2ODU0Nzc1ODA4XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMTIzLjBcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAxMjMuNVxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDAuMTI1XG4iCisgICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM0UxN1xuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM1RSsyMlxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM1ZS0xOFxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IDEyMy40NTY3ODlcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiBpbmZcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiBJbmZpbml0eVxuIgorICAgICJyZXBlYXRlZF9kb3VibGU6IC1pbmZcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiAtSW5maW5pdHlcbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiBuYW5cbiIKKyAgICAicmVwZWF0ZWRfZG91YmxlOiBOYU5cbiIKKyAgICAicmVwZWF0ZWRfc3RyaW5nOiBcIlxcMDAwXFwwMDFcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXFxcXFwnXFxcIlwiXG4iLAorICAgICZtZXNzYWdlKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKC0xLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgLy8gTm90ZTogIEluIEMsIGEgbmVnYXRpdmUgaW50ZWdlciBsaXRlcmFsIGlzIGFjdHVhbGx5IHRoZSB1bmFyeSBuZWdhdGlvbgorICAvLyAgIG9wZXJhdG9yIGJlaW5nIGFwcGxpZWQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyIGxpdGVyYWwsIGFuZCAyMTQ3NDgzNjQ4IGlzCisgIC8vICAgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgaW50MzIuICBIb3dldmVyLCBpdCBpcyBub3Qgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YKKyAgLy8gICB1aW50MzIuICBDb25mdXNpbmdseSwgdGhpcyBtZWFucyB0aGF0IGV2ZXJ5dGhpbmcgd29ya3MgaWYgd2UgbWFrZSB0aGUKKyAgLy8gICBsaXRlcmFsIHVuc2lnbmVkLCBldmVuIHRob3VnaCB3ZSBhcmUgbmVnYXRpbmcgaXQuCisgIEVYUEVDVF9FUSgtMjE0NzQ4MzY0OHUsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMSkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUSgtMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCgwKSk7CisgIC8vIE5vdGU6ICBJbiBDLCBhIG5lZ2F0aXZlIGludGVnZXIgbGl0ZXJhbCBpcyBhY3R1YWxseSB0aGUgdW5hcnkgbmVnYXRpb24KKyAgLy8gICBvcGVyYXRvciBiZWluZyBhcHBsaWVkIHRvIGEgcG9zaXRpdmUgaW50ZWdlciBsaXRlcmFsLCBhbmQKKyAgLy8gICA5MjIzMzcyMDM2ODU0Nzc1ODA4IGlzIG91dHNpZGUgdGhlIHJhbmdlIG9mIGludDY0LiAgSG93ZXZlciwgaXQgaXMgbm90CisgIC8vICAgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdWludDY0LiAgQ29uZnVzaW5nbHksIHRoaXMgbWVhbnMgdGhhdCBldmVyeXRoaW5nCisgIC8vICAgd29ya3MgaWYgd2UgbWFrZSB0aGUgbGl0ZXJhbCB1bnNpZ25lZCwgZXZlbiB0aG91Z2ggd2UgYXJlIG5lZ2F0aW5nIGl0LgorICBFWFBFQ1RfRVEoLUdPT0dMRV9VTE9OR0xPTkcoOTIyMzM3MjAzNjg1NDc3NTgwOCksIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQoMSkpOworCisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoNDI5NDk2NzI5NXUsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIxNDc0ODM2NDh1LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMigxKSk7CisKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUoKSk7CisgIEVYUEVDVF9FUShHT09HTEVfVUxPTkdMT05HKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQoMCkpOworICBFWFBFQ1RfRVEoR09PR0xFX1VMT05HTE9ORyg5MjIzMzcyMDM2ODU0Nzc1ODA4KSwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQoMSkpOworCisgIEFTU0VSVF9FUSgxMywgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEyMy4wICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDApKTsKKyAgRVhQRUNUX0VRKDEyMy41ICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDEpKTsKKyAgRVhQRUNUX0VRKDAuMTI1ICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDIpKTsKKyAgRVhQRUNUX0VRKDEuMjNFMTcgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDMpKTsKKyAgRVhQRUNUX0VRKDEuMjM1RTIyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDQpKTsKKyAgRVhQRUNUX0VRKDEuMjM1RS0xOCAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDUpKTsKKyAgRVhQRUNUX0VRKDEyMy40NTY3ODksIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDYpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDcpLCBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDgpLCBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDkpLCAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgxMCksIC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKKyAgRVhQRUNUX1RSVUUoSXNOYU4obWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMTEpKSk7CisgIEVYUEVDVF9UUlVFKElzTmFOKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDEyKSkpOworCisgIC8vIE5vdGU6ICBTaW5jZSB0aGVzZSBzdHJpbmcgbGl0ZXJhbHMgaGF2ZSBcMCdzIGluIHRoZW0sIHdlIG11c3QgZXhwbGljaXRseQorICAvLyAgIHBhc3MgdGhlaXIgc2l6ZXMgdG8gc3RyaW5nJ3MgY29uc3RydWN0b3IuCisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBFWFBFQ1RfRVEoc3RyaW5nKCJcMDAwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJ1wiIiwgMTIpLAorICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcoMCkpOworfQorCitjbGFzcyBUZXh0Rm9ybWF0UGFyc2VyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgRXhwZWN0RmFpbHVyZShjb25zdCBzdHJpbmcmIGlucHV0LCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgaW50IGNvbCkgeworICAgIHNjb3BlZF9wdHI8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlcz4gcHJvdG8obmV3IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMpOworICAgIEV4cGVjdEZhaWx1cmUoaW5wdXQsIG1lc3NhZ2UsIGxpbmUsIGNvbCwgcHJvdG8uZ2V0KCkpOworICB9CisKKyAgdm9pZCBFeHBlY3RGYWlsdXJlKGNvbnN0IHN0cmluZyYgaW5wdXQsIGNvbnN0IHN0cmluZyYgbWVzc2FnZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY29sLCBNZXNzYWdlKiBwcm90bykgeworICAgIEV4cGVjdE1lc3NhZ2UoaW5wdXQsIG1lc3NhZ2UsIGxpbmUsIGNvbCwgcHJvdG8sIGZhbHNlKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0TWVzc2FnZShjb25zdCBzdHJpbmcmIGlucHV0LCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgaW50IGNvbCwgTWVzc2FnZSogcHJvdG8sIGJvb2wgZXhwZWN0ZWRfcmVzdWx0KSB7CisgICAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKKyAgICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICAgIHBhcnNlci5SZWNvcmRFcnJvcnNUbygmZXJyb3JfY29sbGVjdG9yKTsKKyAgICBFWFBFQ1RfRVEocGFyc2VyLlBhcnNlRnJvbVN0cmluZyhpbnB1dCwgcHJvdG8pLCBleHBlY3RlZF9yZXN1bHQpOworICAgIEVYUEVDVF9FUShTaW1wbGVJdG9hKGxpbmUpICsgIjoiICsgU2ltcGxlSXRvYShjb2wpICsgIjogIiArIG1lc3NhZ2UgKyAiXG4iLAorICAgICAgICAgICAgICBlcnJvcl9jb2xsZWN0b3IudGV4dF8pOworICB9CisKKyAgLy8gQW4gZXJyb3IgY29sbGVjdG9yIHdoaWNoIHNpbXBseSBjb25jYXRlbmF0ZXMgYWxsIGl0cyBlcnJvcnMgaW50byBhIGJpZworICAvLyBibG9jayBvZiB0ZXh0IHdoaWNoIGNhbiBiZSBjaGVja2VkLgorICBjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgaW86OkVycm9yQ29sbGVjdG9yIHsKKyAgIHB1YmxpYzoKKyAgICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorICAgIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorCisgICAgc3RyaW5nIHRleHRfOworCisgICAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgdm9pZCBBZGRFcnJvcihpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiAkMlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSArIDEsIGNvbHVtbiArIDEsIG1lc3NhZ2UpOworICAgIH0KKworICAgIHZvaWQgQWRkV2FybmluZyhpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgICBBZGRFcnJvcihsaW5lLCBjb2x1bW4sICJXQVJOSU5HOiIgKyBtZXNzYWdlKTsKKyAgICB9CisgIH07Cit9OworCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcpIHsKKyAgc2NvcGVkX3B0cjx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPiBtZXNzYWdlKG5ldyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZCA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKworI2RlZmluZSBFWFBFQ1RfRklFTEQobmFtZSwgdmFsdWUsIHZhbHVlc3RyaW5nKSBcCisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcoIFwKKyAgICB2YWx1ZXN0cmluZywgZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF8iICNuYW1lKSwgbWVzc2FnZS5nZXQoKSkpOyBcCisgIEVYUEVDVF9FUSh2YWx1ZSwgbWVzc2FnZS0+b3B0aW9uYWxfIyNuYW1lKCkpOyBcCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPmhhc19vcHRpb25hbF8jI25hbWUoKSk7CisKKyNkZWZpbmUgRVhQRUNUX0ZMT0FUX0ZJRUxEKG5hbWUsIHZhbHVlLCB2YWx1ZXN0cmluZykgXAorICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKCBcCisgICAgdmFsdWVzdHJpbmcsIGQtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfIiAjbmFtZSksIG1lc3NhZ2UuZ2V0KCkpKTsgXAorICBFWFBFQ1RfRkxPQVRfRVEodmFsdWUsIG1lc3NhZ2UtPm9wdGlvbmFsXyMjbmFtZSgpKTsgXAorICBFWFBFQ1RfVFJVRShtZXNzYWdlLT5oYXNfb3B0aW9uYWxfIyNuYW1lKCkpOworCisjZGVmaW5lIEVYUEVDVF9ET1VCTEVfRklFTEQobmFtZSwgdmFsdWUsIHZhbHVlc3RyaW5nKSBcCisgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcoIFwKKyAgICB2YWx1ZXN0cmluZywgZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF8iICNuYW1lKSwgbWVzc2FnZS5nZXQoKSkpOyBcCisgIEVYUEVDVF9ET1VCTEVfRVEodmFsdWUsIG1lc3NhZ2UtPm9wdGlvbmFsXyMjbmFtZSgpKTsgXAorICBFWFBFQ1RfVFJVRShtZXNzYWdlLT5oYXNfb3B0aW9uYWxfIyNuYW1lKCkpOworCisjZGVmaW5lIEVYUEVDVF9JTlZBTElEKG5hbWUsIHZhbHVlc3RyaW5nKSBcCisgIEVYUEVDVF9GQUxTRShUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKCBcCisgICAgdmFsdWVzdHJpbmcsIGQtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfIiAjbmFtZSksIG1lc3NhZ2UuZ2V0KCkpKTsKKworICAvLyBpbnQzMgorICBFWFBFQ1RfRklFTEQoaW50MzIsIDEsICIxIik7CisgIEVYUEVDVF9GSUVMRChpbnQzMiwgLTEsICItMSIpOworICBFWFBFQ1RfRklFTEQoaW50MzIsIDB4MTIzNCwgIjB4MTIzNCIpOworICBFWFBFQ1RfSU5WQUxJRChpbnQzMiwgImEiKTsKKyAgRVhQRUNUX0lOVkFMSUQoaW50MzIsICI5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiKTsKKyAgRVhQRUNUX0lOVkFMSUQoaW50MzIsICIxLDIiKTsKKworICAvLyBpbnQ2NAorICBFWFBFQ1RfRklFTEQoaW50NjQsIDEsICIxIik7CisgIEVYUEVDVF9GSUVMRChpbnQ2NCwgLTEsICItMSIpOworICBFWFBFQ1RfRklFTEQoaW50NjQsIDB4MTIzNDU2NzgxMjM0NTY3OExMLCAiMHgxMjM0NTY3ODEyMzQ1Njc4Iik7CisgIEVYUEVDVF9JTlZBTElEKGludDY0LCAiYSIpOworICBFWFBFQ1RfSU5WQUxJRChpbnQ2NCwgIjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpOworICBFWFBFQ1RfSU5WQUxJRChpbnQ2NCwgIjEsMiIpOworCisgIC8vIHVpbnQ2NAorICBFWFBFQ1RfRklFTEQodWludDY0LCAxLCAiMSIpOworICBFWFBFQ1RfRklFTEQodWludDY0LCAweGYyMzQ1Njc4MTIzNDU2NzhVTEwsICIweGYyMzQ1Njc4MTIzNDU2NzgiKTsKKyAgRVhQRUNUX0lOVkFMSUQodWludDY0LCAiLTEiKTsKKyAgRVhQRUNUX0lOVkFMSUQodWludDY0LCAiYSIpOworICBFWFBFQ1RfSU5WQUxJRCh1aW50NjQsICI5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiKTsKKyAgRVhQRUNUX0lOVkFMSUQodWludDY0LCAiMSwyIik7CisKKyAgLy8gZml4ZWQzMgorICBFWFBFQ1RfRklFTEQoZml4ZWQzMiwgMSwgIjEiKTsKKyAgRVhQRUNUX0ZJRUxEKGZpeGVkMzIsIDB4MTIzNDU2NzgsICIweDEyMzQ1Njc4Iik7CisgIEVYUEVDVF9JTlZBTElEKGZpeGVkMzIsICItMSIpOworICBFWFBFQ1RfSU5WQUxJRChmaXhlZDMyLCAiYSIpOworICBFWFBFQ1RfSU5WQUxJRChmaXhlZDMyLCAiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5Iik7CisgIEVYUEVDVF9JTlZBTElEKGZpeGVkMzIsICIxLDIiKTsKKworICAvLyBmaXhlZDY0CisgIEVYUEVDVF9GSUVMRChmaXhlZDY0LCAxLCAiMSIpOworICBFWFBFQ1RfRklFTEQoZml4ZWQ2NCwgMHgxMjM0NTY3ODEyMzQ1Njc4VUxMLCAiMHgxMjM0NTY3ODEyMzQ1Njc4Iik7CisgIEVYUEVDVF9JTlZBTElEKGZpeGVkNjQsICItMSIpOworICBFWFBFQ1RfSU5WQUxJRChmaXhlZDY0LCAiYSIpOworICBFWFBFQ1RfSU5WQUxJRChmaXhlZDY0LCAiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5Iik7CisgIEVYUEVDVF9JTlZBTElEKGZpeGVkNjQsICIxLDIiKTsKKworICAvLyBib29sCisgIEVYUEVDVF9GSUVMRChib29sLCB0cnVlLCAidHJ1ZSIpOworICBFWFBFQ1RfRklFTEQoYm9vbCwgZmFsc2UsICJmYWxzZSIpOworICBFWFBFQ1RfRklFTEQoYm9vbCwgdHJ1ZSwgIjEiKTsKKyAgRVhQRUNUX0ZJRUxEKGJvb2wsIHRydWUsICJ0Iik7CisgIEVYUEVDVF9GSUVMRChib29sLCBmYWxzZSwgIjAiKTsKKyAgRVhQRUNUX0ZJRUxEKGJvb2wsIGZhbHNlLCAiZiIpOworICBFWFBFQ1RfSU5WQUxJRChib29sLCAiMiIpOworICBFWFBFQ1RfSU5WQUxJRChib29sLCAiLTAiKTsKKyAgRVhQRUNUX0lOVkFMSUQoYm9vbCwgIm9uIik7CisgIEVYUEVDVF9JTlZBTElEKGJvb2wsICJhIik7CisgIEVYUEVDVF9JTlZBTElEKGJvb2wsICJUcnVlIik7CisKKyAgLy8gZmxvYXQKKyAgRVhQRUNUX0ZJRUxEKGZsb2F0LCAxLCAiMSIpOworICBFWFBFQ1RfRkxPQVRfRklFTEQoZmxvYXQsIDEuNSwgIjEuNSIpOworICBFWFBFQ1RfRkxPQVRfRklFTEQoZmxvYXQsIDEuNWUzLCAiMS41ZTMiKTsKKyAgRVhQRUNUX0ZMT0FUX0ZJRUxEKGZsb2F0LCAtNC41NSwgIi00LjU1Iik7CisgIEVYUEVDVF9JTlZBTElEKGZsb2F0LCAiYSIpOworICBFWFBFQ1RfSU5WQUxJRChmbG9hdCwgIjEsMiIpOworCisgIC8vIGRvdWJsZQorICBFWFBFQ1RfRklFTEQoZG91YmxlLCAxLCAiMSIpOworICBFWFBFQ1RfRklFTEQoZG91YmxlLCAtMSwgIi0xIik7CisgIEVYUEVDVF9ET1VCTEVfRklFTEQoZG91YmxlLCAyLjMsICIyLjMiKTsKKyAgRVhQRUNUX0RPVUJMRV9GSUVMRChkb3VibGUsIDNlNSwgIjNlNSIpOworICBFWFBFQ1RfSU5WQUxJRChkb3VibGUsICJhIik7CisgIEVYUEVDVF9JTlZBTElEKGRvdWJsZSwgIjEsMiIpOworCisgIC8vIHN0cmluZworICBFWFBFQ1RfRklFTEQoc3RyaW5nLCAiaGVsbG8iLCAiXCJoZWxsb1wiIik7CisgIEVYUEVDVF9GSUVMRChzdHJpbmcsICItMS44NyIsICInLTEuODcnIik7CisgIEVYUEVDVF9JTlZBTElEKHN0cmluZywgImhlbGxvIik7ICAvLyB3aXRob3V0IHF1b3RlIGZvciB2YWx1ZQorCisgIC8vIGVudW0KKyAgRVhQRUNUX0ZJRUxEKG5lc3RlZF9lbnVtLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsICJCQVIiKTsKKyAgRVhQRUNUX0ZJRUxEKG5lc3RlZF9lbnVtLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosCisgICAgICAgICAgICAgICBTaW1wbGVJdG9hKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWikpOworICBFWFBFQ1RfSU5WQUxJRChuZXN0ZWRfZW51bSwgIkZPT0JBUiIpOworCisgIC8vIG1lc3NhZ2UKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZygKKyAgICAiPGJiOjEyPiIsIGQtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSwgbWVzc2FnZS5nZXQoKSkpOworICBFWFBFQ1RfRVEoMTIsIG1lc3NhZ2UtPm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuYmIoKSk7IFwKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS0+aGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfSU5WQUxJRChuZXN0ZWRfbWVzc2FnZSwgImFueSIpOworCisjdW5kZWYgRVhQRUNUX0ZJRUxECisjdW5kZWYgRVhQRUNUX0ZMT0FUX0ZJRUxECisjdW5kZWYgRVhQRUNUX0RPVUJMRV9GSUVMRAorI3VuZGVmIEVYUEVDVF9JTlZBTElECit9CisKKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBJbnZhbGlkVG9rZW4pIHsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfYm9vbDogdHJ1ZVxuLTVcbiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIsCisgICAgICAgICAgICAgICAgMiwgMSk7CisKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfYm9vbDogdHJ1ZSFcbiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIsIDEsIDIwKTsKKyAgRXhwZWN0RmFpbHVyZSgiXCJzb21lIHN0cmluZ1wiIiwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIiwgMSwgMSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgSW52YWxpZEZpZWxkTmFtZSkgeworICBFeHBlY3RGYWlsdXJlKAorICAgICAgImludmFsaWRfZmllbGQ6IHNvbWV2YWx1ZVxuIiwKKyAgICAgICJNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgbmFtZWQgIgorICAgICAgIlwiaW52YWxpZF9maWVsZFwiLiIsCisgICAgICAxLCAxNCk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgSW52YWxpZENhcGl0YWxpemF0aW9uKSB7CisgIC8vIFdlIHJlcXVpcmUgdGhhdCBncm91cCBuYW1lcyBiZSBleGFjdGx5IGFzIHRoZXkgYXBwZWFyIGluIHRoZSAucHJvdG8uCisgIEV4cGVjdEZhaWx1cmUoCisgICAgICAib3B0aW9uYWxncm91cCB7XG5hOiAxNVxufVxuIiwKKyAgICAgICJNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgbmFtZWQgIgorICAgICAgIlwib3B0aW9uYWxncm91cFwiLiIsCisgICAgICAxLCAxNSk7CisgIEV4cGVjdEZhaWx1cmUoCisgICAgICAiT1BUSU9OQUxncm91cCB7XG5hOiAxNVxufVxuIiwKKyAgICAgICJNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgbmFtZWQgIgorICAgICAgIlwiT1BUSU9OQUxncm91cFwiLiIsCisgICAgICAxLCAxNSk7CisgIEV4cGVjdEZhaWx1cmUoCisgICAgICAiT3B0aW9uYWxfRG91YmxlOiAxMC4wXG4iLAorICAgICAgIk1lc3NhZ2UgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1wiIGhhcyBubyBmaWVsZCBuYW1lZCAiCisgICAgICAiXCJPcHRpb25hbF9Eb3VibGVcIi4iLAorICAgICAgMSwgMTYpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIEludmFsaWRGaWVsZFZhbHVlcykgeworICAvLyBJbnZhbGlkIHZhbHVlcyBmb3IgYSBkb3VibGUvZmxvYXQgZmllbGQuCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2RvdWJsZTogXCJoZWxsb1wiXG4iLCAiRXhwZWN0ZWQgZG91YmxlLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfZG91YmxlOiB0cnVlXG4iLCAiRXhwZWN0ZWQgZG91YmxlLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfZG91YmxlOiAhXG4iLCAiRXhwZWN0ZWQgZG91YmxlLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfZG91YmxlIHtcbiAgXG59XG4iLCAiRXhwZWN0ZWQgXCI6XCIsIGZvdW5kIFwie1wiLiIsCisgICAgICAgICAgICAgICAgMSwgMTcpOworCisgIC8vIEludmFsaWQgdmFsdWVzIGZvciBhIHNpZ25lZCBpbnRlZ2VyIGZpZWxkLgorICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9pbnQzMjogXCJoZWxsb1wiXG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAxNyk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2ludDMyOiB0cnVlXG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAxNyk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2ludDMyOiA0LjVcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE3KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6ICFcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE3KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzIge1xuIFxufVxuIiwgIkV4cGVjdGVkIFwiOlwiLCBmb3VuZCBcIntcIi4iLAorICAgICAgICAgICAgICAgIDEsIDE2KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6IDB4ODAwMDAwMDBcbiIsCisgICAgICAgICAgICAgICAgIkludGVnZXIgb3V0IG9mIHJhbmdlLiIsIDEsIDE3KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6IC0weDgwMDAwMDAxXG4iLAorICAgICAgICAgICAgICAgICJJbnRlZ2VyIG91dCBvZiByYW5nZS4iLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2ludDY0OiAweDgwMDAwMDAwMDAwMDAwMDBcbiIsCisgICAgICAgICAgICAgICAgIkludGVnZXIgb3V0IG9mIHJhbmdlLiIsIDEsIDE3KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50NjQ6IC0weDgwMDAwMDAwMDAwMDAwMDFcbiIsCisgICAgICAgICAgICAgICAgIkludGVnZXIgb3V0IG9mIHJhbmdlLiIsIDEsIDE4KTsKKworICAvLyBJbnZhbGlkIHZhbHVlcyBmb3IgYW4gdW5zaWduZWQgaW50ZWdlciBmaWVsZC4KKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0OiBcImhlbGxvXCJcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0OiB0cnVlXG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NDogNC41XG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NDogLTVcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0OiAhXG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NCB7XG4gXG59XG4iLCAiRXhwZWN0ZWQgXCI6XCIsIGZvdW5kIFwie1wiLiIsCisgICAgICAgICAgICAgICAgMSwgMTcpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF91aW50MzI6IDB4MTAwMDAwMDAwXG4iLAorICAgICAgICAgICAgICAgICJJbnRlZ2VyIG91dCBvZiByYW5nZS4iLCAxLCAxOCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQ2NDogMHgxMDAwMDAwMDAwMDAwMDAwMFxuIiwKKyAgICAgICAgICAgICAgICAiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIiwgMSwgMTgpOworCisgIC8vIEludmFsaWQgdmFsdWVzIGZvciBhIGJvb2xlYW4gZmllbGQuCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6IFwiaGVsbG9cIlxuIiwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIiwgMSwgMTYpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9ib29sOiA1XG4iLCAiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIiwgMSwgMTYpOworICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9ib29sOiAtNy41XG4iLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iLCAxLCAxNik7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6ICFcbiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIsIDEsIDE2KTsKKworICBFeHBlY3RGYWlsdXJlKAorICAgICAgIm9wdGlvbmFsX2Jvb2w6IG1laFxuIiwKKyAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBib29sZWFuIGZpZWxkIFwib3B0aW9uYWxfYm9vbFwiLiBWYWx1ZTogXCJtZWhcIi4iLAorICAgICAgMiwgMSk7CisKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfYm9vbCB7XG4gXG59XG4iLCAiRXhwZWN0ZWQgXCI6XCIsIGZvdW5kIFwie1wiLiIsCisgICAgICAgICAgICAgICAgMSwgMTUpOworCisgIC8vIEludmFsaWQgdmFsdWVzIGZvciBhIHN0cmluZyBmaWVsZC4KKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfc3RyaW5nOiB0cnVlXG4iLCAiRXhwZWN0ZWQgc3RyaW5nLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfc3RyaW5nOiA1XG4iLCAiRXhwZWN0ZWQgc3RyaW5nLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfc3RyaW5nOiAtNy41XG4iLCAiRXhwZWN0ZWQgc3RyaW5nLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfc3RyaW5nOiAhXG4iLCAiRXhwZWN0ZWQgc3RyaW5nLiIsIDEsIDE4KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfc3RyaW5nIHtcbiBcbn1cbiIsICJFeHBlY3RlZCBcIjpcIiwgZm91bmQgXCJ7XCIuIiwKKyAgICAgICAgICAgICAgICAxLCAxNyk7CisKKyAgLy8gSW52YWxpZCB2YWx1ZXMgZm9yIGFuIGVudW1lcmF0aW9uIGZpZWxkLgorICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9uZXN0ZWRfZW51bTogXCJoZWxsb1wiXG4iLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBpbnRlZ2VyIG9yIGlkZW50aWZpZXIuIiwgMSwgMjMpOworCisgIC8vIFZhbGlkIHRva2VuLCBidXQgZW51bSB2YWx1ZSBpcyBub3QgZGVmaW5lZC4KKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfbmVzdGVkX2VudW06IDVcbiIsCisgICAgICAgICAgICAgICAgIlVua25vd24gZW51bWVyYXRpb24gdmFsdWUgb2YgXCI1XCIgZm9yIGZpZWxkICIKKyAgICAgICAgICAgICAgICAiXCJvcHRpb25hbF9uZXN0ZWRfZW51bVwiLiIsIDIsIDEpOworICAvLyBXZSBjb25zdW1lIHRoZSBuZWdhdGl2ZSBzaWduLCBzbyB0aGUgZXJyb3IgcG9zaXRpb24gc3RhcnRzIG9uZSBjaGFyYWN0ZXIKKyAgLy8gbGF0ZXIuCisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX25lc3RlZF9lbnVtOiAtNy41XG4iLCAiRXhwZWN0ZWQgaW50ZWdlci4iLCAxLCAyNCk7CisgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX25lc3RlZF9lbnVtOiAhXG4iLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBpbnRlZ2VyIG9yIGlkZW50aWZpZXIuIiwgMSwgMjMpOworCisgIEV4cGVjdEZhaWx1cmUoCisgICAgICAib3B0aW9uYWxfbmVzdGVkX2VudW06IGdyYWhcbiIsCisgICAgICAiVW5rbm93biBlbnVtZXJhdGlvbiB2YWx1ZSBvZiBcImdyYWhcIiBmb3IgZmllbGQgIgorICAgICAgIlwib3B0aW9uYWxfbmVzdGVkX2VudW1cIi4iLCAyLCAxKTsKKworICBFeHBlY3RGYWlsdXJlKAorICAgICAgIm9wdGlvbmFsX25lc3RlZF9lbnVtIHtcbiBcbn1cbiIsCisgICAgICAiRXhwZWN0ZWQgXCI6XCIsIGZvdW5kIFwie1wiLiIsIDEsIDIyKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBNZXNzYWdlRGVsaW1ldGVycykgeworICAvLyBOb24tbWF0Y2hpbmcgZGVsaW1ldGVycy4KKyAgRXhwZWN0RmFpbHVyZSgiT3B0aW9uYWxHcm91cCA8XG4gXG59XG4iLCAiRXhwZWN0ZWQgXCI+XCIsIGZvdW5kIFwifVwiLiIsCisgICAgICAgICAgICAgICAgMywgMSk7CisKKyAgLy8gSW52YWxpZCBkZWxpbWV0ZXJzLgorICBFeHBlY3RGYWlsdXJlKCJPcHRpb25hbEdyb3VwIFtcbiBcbl1cbiIsICJFeHBlY3RlZCBcIntcIiwgZm91bmQgXCJbXCIuIiwKKyAgICAgICAgICAgICAgICAxLCAxNSk7CisKKyAgLy8gVW5lbmRpbmcgbWVzc2FnZS4KKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Uge1xuIFxuYmI6IDExOFxuIiwKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaWRlbnRpZmllci4iLAorICAgICAgICAgICAgICAgIDQsIDEpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFVua25vd25FeHRlbnNpb24pIHsKKyAgLy8gTm9uLW1hdGNoaW5nIGRlbGltZXRlcnMuCisgIEV4cGVjdEZhaWx1cmUoIltibGFoYmxhaF06IDEyMyIsCisgICAgICAgICAgICAgICAgIkV4dGVuc2lvbiBcImJsYWhibGFoXCIgaXMgbm90IGRlZmluZWQgb3IgaXMgbm90IGFuICIKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIG9mIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIuIiwKKyAgICAgICAgICAgICAgICAxLCAxMSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgTWlzc2luZ1JlcXVpcmVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgRXhwZWN0RmFpbHVyZSgiYTogMSIsCisgICAgICAgICAgICAgICAgIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGIsIGMiLAorICAgICAgICAgICAgICAgIDAsIDEsICZtZXNzYWdlKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBQYXJzZUR1cGxpY2F0ZVJlcXVpcmVkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgRXhwZWN0RmFpbHVyZSgiYTogMSBiOiAyIGM6IDMgYTogMSIsCisgICAgICAgICAgICAgICAgIk5vbi1yZXBlYXRlZCBmaWVsZCBcImFcIiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuIiwKKyAgICAgICAgICAgICAgICAxLCAxNywgJm1lc3NhZ2UpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlRHVwbGljYXRlT3B0aW9uYWwpIHsKKyAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlIG1lc3NhZ2U7CisgIEV4cGVjdEZhaWx1cmUoImM6IDEgYzogMiIsCisgICAgICAgICAgICAgICAgIk5vbi1yZXBlYXRlZCBmaWVsZCBcImNcIiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuIiwKKyAgICAgICAgICAgICAgICAxLCA3LCAmbWVzc2FnZSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgTWVyZ2VEdXBsaWNhdGVSZXF1aXJlZCkgeworICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7CisgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7CisgIEVYUEVDVF9UUlVFKHBhcnNlci5NZXJnZUZyb21TdHJpbmcoImE6IDEgYjogMiBjOiAzIGE6IDQiLCAmbWVzc2FnZSkpOworICBFWFBFQ1RfRVEoNCwgbWVzc2FnZS5hKCkpOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIE1lcmdlRHVwbGljYXRlT3B0aW9uYWwpIHsKKyAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlIG1lc3NhZ2U7CisgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7CisgIEVYUEVDVF9UUlVFKHBhcnNlci5NZXJnZUZyb21TdHJpbmcoImM6IDEgYzogMiIsICZtZXNzYWdlKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLmMoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgRXhwbGljaXREZWxpbWl0ZXJzKSB7CisgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKCJhOjEsYjoyO2M6MyIsICZtZXNzYWdlKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLmEoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLmIoKSk7CisgIEVYUEVDVF9FUSgzLCBtZXNzYWdlLmMoKSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgUHJpbnRFcnJvcnNUb1N0ZGVycikgeworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBwcm90bzsKKyAgICBFWFBFQ1RfRkFMU0UoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKCJub19zdWNoX2ZpZWxkOiAxIiwgJnByb3RvKSk7CisgICAgZXJyb3JzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKyAgfQorCisgIEFTU0VSVF9FUSgxLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJFcnJvciBwYXJzaW5nIHRleHQtZm9ybWF0IHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlczogIgorICAgICAgICAgICAgIjE6MTQ6IE1lc3NhZ2UgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1wiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgICAibmFtZWQgXCJub19zdWNoX2ZpZWxkXCIuIiwKKyAgICAgICAgICAgIGVycm9yc1swXSk7Cit9CisKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgRmFpbHNPblRva2VuaXphdGlvbkVycm9yKSB7CisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHByb3RvOworICAgIEVYUEVDVF9GQUxTRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoIlwwMjAiLCAmcHJvdG8pKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisKKyAgQVNTRVJUX0VRKDEsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoIkVycm9yIHBhcnNpbmcgdGV4dC1mb3JtYXQgcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzOiAiCisgICAgICAgICAgICAiMToxOiBJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiB0ZXh0LiIsCisgICAgICAgICAgICBlcnJvcnNbMF0pOworfQorCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlRGVwcmVjYXRlZEZpZWxkKSB7CisgIHVuaXR0ZXN0OjpUZXN0RGVwcmVjYXRlZEZpZWxkcyBtZXNzYWdlOworICBFeHBlY3RNZXNzYWdlKCJkZXByZWNhdGVkX2ludDMyOiA0MiIsCisgICAgICAgICAgICAgICAgIldBUk5JTkc6dGV4dCBmb3JtYXQgY29udGFpbnMgZGVwcmVjYXRlZCBmaWVsZCAiCisgICAgICAgICAgICAgICAgIlwiZGVwcmVjYXRlZF9pbnQzMlwiIiwgMSwgMjEsICZtZXNzYWdlLCB0cnVlKTsKK30KKworY2xhc3MgVGV4dEZvcm1hdE1lc3NhZ2VTZXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGNoYXIgcHJvdG9fZGVidWdfc3RyaW5nX1tdOworfTsKK2NvbnN0IGNoYXIgVGV4dEZvcm1hdE1lc3NhZ2VTZXRUZXN0Ojpwcm90b19kZWJ1Z19zdHJpbmdfW10gPQorIm1lc3NhZ2Vfc2V0IHtcbiIKKyIgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFdIHtcbiIKKyIgICAgaTogMjNcbiIKKyIgIH1cbiIKKyIgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJdIHtcbiIKKyIgICAgc3RyOiBcImZvb1wiXG4iCisiICB9XG4iCisifVxuIjsKKworCitURVNUX0YoVGV4dEZvcm1hdE1lc3NhZ2VTZXRUZXN0LCBTZXJpYWxpemUpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIHByb3RvOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xKiBpdGVtX2EgPQorICAgIHByb3RvLm11dGFibGVfbWVzc2FnZV9zZXQoKS0+TXV0YWJsZUV4dGVuc2lvbigKKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbik7CisgIGl0ZW1fYS0+c2V0X2koMjMpOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKiBpdGVtX2IgPQorICAgIHByb3RvLm11dGFibGVfbWVzc2FnZV9zZXQoKS0+TXV0YWJsZUV4dGVuc2lvbigKKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbik7CisgIGl0ZW1fYi0+c2V0X3N0cigiZm9vIik7CisgIEVYUEVDVF9FUShwcm90b19kZWJ1Z19zdHJpbmdfLCBwcm90by5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRNZXNzYWdlU2V0VGVzdCwgRGVzZXJpYWxpemUpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIHByb3RvOworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocHJvdG9fZGVidWdfc3RyaW5nXywgJnByb3RvKSk7CisgIEVYUEVDVF9FUSgyMywgcHJvdG8ubWVzc2FnZV9zZXQoKS5HZXRFeHRlbnNpb24oCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKS5pKCkpOworICBFWFBFQ1RfRVEoImZvbyIsIHByb3RvLm1lc3NhZ2Vfc2V0KCkuR2V0RXh0ZW5zaW9uKAorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikuc3RyKCkpOworCisgIC8vIEVuc3VyZSB0aGF0IHRoZXNlIGFyZSB0aGUgb25seSBlbnRyaWVzIHByZXNlbnQuCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBkZXNjcmlwdG9yczsKKyAgcHJvdG8ubWVzc2FnZV9zZXQoKS5HZXRSZWZsZWN0aW9uKCktPkxpc3RGaWVsZHMoCisgICAgcHJvdG8ubWVzc2FnZV9zZXQoKSwgJmRlc2NyaXB0b3JzKTsKKyAgRVhQRUNUX0VRKDIsIGRlc2NyaXB0b3JzLnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZXh0X2Zvcm1hdF91bml0dGVzdAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWM2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bwpAQCAtMCwwICsxLDYzMCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gQSBwcm90byBmaWxlIHdlIHdpbGwgdXNlIGZvciB1bml0IHRlc3RpbmcuCisKKworLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgorLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKK29wdGlvbiBjY19nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAgIC8vIGF1dG8tYWRkZWQKK29wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgIC8vIGF1dG8tYWRkZWQKK29wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAgIC8vIGF1dG8tYWRkZWQKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvIjsKKworLy8gV2UgZG9uJ3QgcHV0IHRoaXMgaW4gYSBwYWNrYWdlIHdpdGhpbiBwcm90bzIgYmVjYXVzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQorLy8gdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgZG9lc24ndCBkZXBlbmQgb24gYmVpbmcgaW4gdGhlIHByb3RvMiBuYW1lc3BhY2UuCisvLyBJbiB0ZXN0X3V0aWwuaCB3ZSBkbyAidXNpbmcgbmFtZXNwYWNlIHVuaXR0ZXN0ID0gcHJvdG9idWZfdW5pdHRlc3QiLgorcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworLy8gUHJvdG9zIG9wdGltaXplZCBmb3IgU1BFRUQgdXNlIGEgc3RyaWN0IHN1cGVyc2V0IG9mIHRoZSBnZW5lcmF0ZWQgY29kZQorLy8gb2YgZXF1aXZhbGVudCBvbmVzIG9wdGltaXplZCBmb3IgQ09ERV9TSVpFLCBzbyB3ZSBzaG91bGQgb3B0aW1pemUgYWxsIG91cgorLy8gdGVzdHMgZm9yIHNwZWVkIHVubGVzcyBleHBsaWNpdGx5IHRlc3RpbmcgY29kZSBzaXplIG9wdGltaXphdGlvbi4KK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKKworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlVuaXR0ZXN0UHJvdG8iOworCisvLyBUaGlzIHByb3RvIGluY2x1ZGVzIGV2ZXJ5IHR5cGUgb2YgZmllbGQgaW4gYm90aCBzaW5ndWxhciBhbmQgcmVwZWF0ZWQKKy8vIGZvcm1zLgorbWVzc2FnZSBUZXN0QWxsVHlwZXMgeworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIC8vIFRoZSBmaWVsZCBuYW1lICJiIiBmYWlscyB0byBjb21waWxlIGluIHByb3RvMSBiZWNhdXNlIGl0IGNvbmZsaWN0cyB3aXRoCisgICAgLy8gYSBsb2NhbCB2YXJpYWJsZSBuYW1lZCAiYiIgaW4gb25lIG9mIHRoZSBnZW5lcmF0ZWQgbWV0aG9kcy4gIERvaC4KKyAgICAvLyBUaGlzIGZpbGUgbmVlZHMgdG8gY29tcGlsZSBpbiBwcm90bzEgdG8gdGVzdCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4KKyAgICBvcHRpb25hbCBpbnQzMiBiYiA9IDE7CisgIH0KKworICBlbnVtIE5lc3RlZEVudW0geworICAgIEZPTyA9IDE7CisgICAgQkFSID0gMjsKKyAgICBCQVogPSAzOworICB9CisKKyAgLy8gU2luZ3VsYXIKKyAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzIgICAgPSAgMTsKKyAgb3B0aW9uYWwgICAgaW50NjQgb3B0aW9uYWxfaW50NjQgICAgPSAgMjsKKyAgb3B0aW9uYWwgICB1aW50MzIgb3B0aW9uYWxfdWludDMyICAgPSAgMzsKKyAgb3B0aW9uYWwgICB1aW50NjQgb3B0aW9uYWxfdWludDY0ICAgPSAgNDsKKyAgb3B0aW9uYWwgICBzaW50MzIgb3B0aW9uYWxfc2ludDMyICAgPSAgNTsKKyAgb3B0aW9uYWwgICBzaW50NjQgb3B0aW9uYWxfc2ludDY0ICAgPSAgNjsKKyAgb3B0aW9uYWwgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMiAgPSAgNzsKKyAgb3B0aW9uYWwgIGZpeGVkNjQgb3B0aW9uYWxfZml4ZWQ2NCAgPSAgODsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSAgOTsKKyAgb3B0aW9uYWwgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjQgPSAxMDsKKyAgb3B0aW9uYWwgICAgZmxvYXQgb3B0aW9uYWxfZmxvYXQgICAgPSAxMTsKKyAgb3B0aW9uYWwgICBkb3VibGUgb3B0aW9uYWxfZG91YmxlICAgPSAxMjsKKyAgb3B0aW9uYWwgICAgIGJvb2wgb3B0aW9uYWxfYm9vbCAgICAgPSAxMzsKKyAgb3B0aW9uYWwgICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nICAgPSAxNDsKKyAgb3B0aW9uYWwgICAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgICAgPSAxNTsKKworICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTYgeworICAgIG9wdGlvbmFsIGludDMyIGEgPSAxNzsKKyAgfQorCisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgPSAxODsKKyAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSA9IDE5OworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZSBvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgPSAyMDsKKworICBvcHRpb25hbCBOZXN0ZWRFbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfbmVzdGVkX2VudW0gICAgID0gMjE7CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9mb3JlaWduX2VudW0gICAgPSAyMjsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0gICAgb3B0aW9uYWxfaW1wb3J0X2VudW0gICAgID0gMjM7CisKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZSA9IDI0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfY29yZCA9IDI1IFtjdHlwZT1DT1JEXTsKKworICAvLyBSZXBlYXRlZAorICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9IDMxOworICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NCAgICA9IDMyOworICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9IDMzOworICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9IDM0OworICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgICA9IDM1OworICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9IDM2OworICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9IDM3OworICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ICA9IDM4OworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOworICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdCAgICA9IDQxOworICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDQyOworICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDQzOworICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmcgICA9IDQ0OworICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlcyAgICA9IDQ1OworCisgIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXAgPSA0NiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OworICB9CisKKyAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICA9IDQ4OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlID0gNDk7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICA9IDUwOworCisgIHJlcGVhdGVkIE5lc3RlZEVudW0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF9uZXN0ZWRfZW51bSAgICAgPSA1MTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX2ZvcmVpZ25fZW51bSAgICA9IDUyOworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bSAgICByZXBlYXRlZF9pbXBvcnRfZW51bSAgICAgPSA1MzsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlID0gNTQgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkID0gNTUgW2N0eXBlPUNPUkRdOworCisgIC8vIFNpbmd1bGFyIHdpdGggZGVmYXVsdHMKKyAgb3B0aW9uYWwgICAgaW50MzIgZGVmYXVsdF9pbnQzMiAgICA9IDYxIFtkZWZhdWx0ID0gIDQxICAgIF07CisgIG9wdGlvbmFsICAgIGludDY0IGRlZmF1bHRfaW50NjQgICAgPSA2MiBbZGVmYXVsdCA9ICA0MiAgICBdOworICBvcHRpb25hbCAgIHVpbnQzMiBkZWZhdWx0X3VpbnQzMiAgID0gNjMgW2RlZmF1bHQgPSAgNDMgICAgXTsKKyAgb3B0aW9uYWwgICB1aW50NjQgZGVmYXVsdF91aW50NjQgICA9IDY0IFtkZWZhdWx0ID0gIDQ0ICAgIF07CisgIG9wdGlvbmFsICAgc2ludDMyIGRlZmF1bHRfc2ludDMyICAgPSA2NSBbZGVmYXVsdCA9IC00NSAgICBdOworICBvcHRpb25hbCAgIHNpbnQ2NCBkZWZhdWx0X3NpbnQ2NCAgID0gNjYgW2RlZmF1bHQgPSAgNDYgICAgXTsKKyAgb3B0aW9uYWwgIGZpeGVkMzIgZGVmYXVsdF9maXhlZDMyICA9IDY3IFtkZWZhdWx0ID0gIDQ3ICAgIF07CisgIG9wdGlvbmFsICBmaXhlZDY0IGRlZmF1bHRfZml4ZWQ2NCAgPSA2OCBbZGVmYXVsdCA9ICA0OCAgICBdOworICBvcHRpb25hbCBzZml4ZWQzMiBkZWZhdWx0X3NmaXhlZDMyID0gNjkgW2RlZmF1bHQgPSAgNDkgICAgXTsKKyAgb3B0aW9uYWwgc2ZpeGVkNjQgZGVmYXVsdF9zZml4ZWQ2NCA9IDcwIFtkZWZhdWx0ID0gLTUwICAgIF07CisgIG9wdGlvbmFsICAgIGZsb2F0IGRlZmF1bHRfZmxvYXQgICAgPSA3MSBbZGVmYXVsdCA9ICA1MS41ICBdOworICBvcHRpb25hbCAgIGRvdWJsZSBkZWZhdWx0X2RvdWJsZSAgID0gNzIgW2RlZmF1bHQgPSAgNTJlMyAgXTsKKyAgb3B0aW9uYWwgICAgIGJvb2wgZGVmYXVsdF9ib29sICAgICA9IDczIFtkZWZhdWx0ID0gdHJ1ZSAgIF07CisgIG9wdGlvbmFsICAgc3RyaW5nIGRlZmF1bHRfc3RyaW5nICAgPSA3NCBbZGVmYXVsdCA9ICJoZWxsbyJdOworICBvcHRpb25hbCAgICBieXRlcyBkZWZhdWx0X2J5dGVzICAgID0gNzUgW2RlZmF1bHQgPSAid29ybGQiXTsKKworICBvcHRpb25hbCBOZXN0ZWRFbnVtICBkZWZhdWx0X25lc3RlZF9lbnVtICA9IDgxIFtkZWZhdWx0ID0gQkFSICAgICAgICBdOworICBvcHRpb25hbCBGb3JlaWduRW51bSBkZWZhdWx0X2ZvcmVpZ25fZW51bSA9IDgyIFtkZWZhdWx0ID0gRk9SRUlHTl9CQVJdOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bQorICAgICAgZGVmYXVsdF9pbXBvcnRfZW51bSA9IDgzIFtkZWZhdWx0ID0gSU1QT1JUX0JBUl07CisKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX3BpZWNlID0gODQgW2N0eXBlPVNUUklOR19QSUVDRSxkZWZhdWx0PSJhYmMiXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfY29yZCA9IDg1IFtjdHlwZT1DT1JELGRlZmF1bHQ9IjEyMyJdOworfQorCittZXNzYWdlIFRlc3REZXByZWNhdGVkRmllbGRzIHsKKyAgb3B0aW9uYWwgaW50MzIgZGVwcmVjYXRlZF9pbnQzMiA9IDEgW2RlcHJlY2F0ZWQ9dHJ1ZV07Cit9CisKKy8vIERlZmluZSB0aGVzZSBhZnRlciBUZXN0QWxsVHlwZXMgdG8gbWFrZSBzdXJlIHRoZSBjb21waWxlciBjYW4gaGFuZGxlCisvLyB0aGF0LgorbWVzc2FnZSBGb3JlaWduTWVzc2FnZSB7CisgIG9wdGlvbmFsIGludDMyIGMgPSAxOworfQorCitlbnVtIEZvcmVpZ25FbnVtIHsKKyAgRk9SRUlHTl9GT08gPSA0OworICBGT1JFSUdOX0JBUiA9IDU7CisgIEZPUkVJR05fQkFaID0gNjsKK30KKworbWVzc2FnZSBUZXN0QWxsRXh0ZW5zaW9ucyB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK2V4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7CisgIC8vIFNpbmd1bGFyCisgIG9wdGlvbmFsICAgIGludDMyIG9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgICA9ICAxOworICBvcHRpb25hbCAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24gICAgPSAgMjsKKyAgb3B0aW9uYWwgICB1aW50MzIgb3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbiAgID0gIDM7CisgIG9wdGlvbmFsICAgdWludDY0IG9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24gICA9ICA0OworICBvcHRpb25hbCAgIHNpbnQzMiBvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uICAgPSAgNTsKKyAgb3B0aW9uYWwgICBzaW50NjQgb3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbiAgID0gIDY7CisgIG9wdGlvbmFsICBmaXhlZDMyIG9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uICA9ICA3OworICBvcHRpb25hbCAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbiAgPSAgODsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uID0gIDk7CisgIG9wdGlvbmFsIHNmaXhlZDY0IG9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbiA9IDEwOworICBvcHRpb25hbCAgICBmbG9hdCBvcHRpb25hbF9mbG9hdF9leHRlbnNpb24gICAgPSAxMTsKKyAgb3B0aW9uYWwgICBkb3VibGUgb3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbiAgID0gMTI7CisgIG9wdGlvbmFsICAgICBib29sIG9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uICAgICA9IDEzOworICBvcHRpb25hbCAgIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uICAgPSAxNDsKKyAgb3B0aW9uYWwgICAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uICAgID0gMTU7CisKKyAgb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cF9leHRlbnNpb24gPSAxNiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDE3OworICB9CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uID0gMTg7CisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24gPSAxOTsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2UKKyAgICBvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gPSAyMDsKKworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bSBvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24gPSAyMTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW0gb3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiA9IDIyOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bQorICAgIG9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiA9IDIzOworCisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uID0gMjQgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9jb3JkX2V4dGVuc2lvbiA9IDI1IFtjdHlwZT1DT1JEXTsKKworICAvLyBSZXBlYXRlZAorICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICAgPSAzMTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgID0gMzI7CisgIHJlcGVhdGVkICAgdWludDMyIHJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICA9IDMzOworICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICAgPSAzNDsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgID0gMzU7CisgIHJlcGVhdGVkICAgc2ludDY0IHJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICA9IDM2OworICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiAgPSAzNzsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gID0gMzg7CisgIHJlcGVhdGVkIHNmaXhlZDMyIHJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbiA9IDM5OworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24gPSA0MDsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgID0gNDE7CisgIHJlcGVhdGVkICAgZG91YmxlIHJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICA9IDQyOworICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAgPSA0MzsKKyAgcmVwZWF0ZWQgICBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgID0gNDQ7CisgIHJlcGVhdGVkICAgIGJ5dGVzIHJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICA9IDQ1OworCisgIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uID0gNDYgeworICAgIG9wdGlvbmFsIGludDMyIGEgPSA0NzsKKyAgfQorCisgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiA9IDQ4OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uID0gNDk7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlCisgICAgcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uID0gNTA7CisKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0gcmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uID0gNTE7CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtIHJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24gPSA1MjsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0KKyAgICByZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gPSA1MzsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiA9IDU0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfY29yZF9leHRlbnNpb24gPSA1NSBbY3R5cGU9Q09SRF07CisKKyAgLy8gU2luZ3VsYXIgd2l0aCBkZWZhdWx0cworICBvcHRpb25hbCAgICBpbnQzMiBkZWZhdWx0X2ludDMyX2V4dGVuc2lvbiAgICA9IDYxIFtkZWZhdWx0ID0gIDQxICAgIF07CisgIG9wdGlvbmFsICAgIGludDY0IGRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uICAgID0gNjIgW2RlZmF1bHQgPSAgNDIgICAgXTsKKyAgb3B0aW9uYWwgICB1aW50MzIgZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uICAgPSA2MyBbZGVmYXVsdCA9ICA0MyAgICBdOworICBvcHRpb25hbCAgIHVpbnQ2NCBkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb24gICA9IDY0IFtkZWZhdWx0ID0gIDQ0ICAgIF07CisgIG9wdGlvbmFsICAgc2ludDMyIGRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbiAgID0gNjUgW2RlZmF1bHQgPSAtNDUgICAgXTsKKyAgb3B0aW9uYWwgICBzaW50NjQgZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uICAgPSA2NiBbZGVmYXVsdCA9ICA0NiAgICBdOworICBvcHRpb25hbCAgZml4ZWQzMiBkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uICA9IDY3IFtkZWZhdWx0ID0gIDQ3ICAgIF07CisgIG9wdGlvbmFsICBmaXhlZDY0IGRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb24gID0gNjggW2RlZmF1bHQgPSAgNDggICAgXTsKKyAgb3B0aW9uYWwgc2ZpeGVkMzIgZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb24gPSA2OSBbZGVmYXVsdCA9ICA0OSAgICBdOworICBvcHRpb25hbCBzZml4ZWQ2NCBkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbiA9IDcwIFtkZWZhdWx0ID0gLTUwICAgIF07CisgIG9wdGlvbmFsICAgIGZsb2F0IGRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uICAgID0gNzEgW2RlZmF1bHQgPSAgNTEuNSAgXTsKKyAgb3B0aW9uYWwgICBkb3VibGUgZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uICAgPSA3MiBbZGVmYXVsdCA9ICA1MmUzICBdOworICBvcHRpb25hbCAgICAgYm9vbCBkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uICAgICA9IDczIFtkZWZhdWx0ID0gdHJ1ZSAgIF07CisgIG9wdGlvbmFsICAgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbiAgID0gNzQgW2RlZmF1bHQgPSAiaGVsbG8iXTsKKyAgb3B0aW9uYWwgICAgYnl0ZXMgZGVmYXVsdF9ieXRlc19leHRlbnNpb24gICAgPSA3NSBbZGVmYXVsdCA9ICJ3b3JsZCJdOworCisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtCisgICAgZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb24gPSA4MSBbZGVmYXVsdCA9IEJBUl07CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtCisgICAgZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uID0gODIgW2RlZmF1bHQgPSBGT1JFSUdOX0JBUl07CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtCisgICAgZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb24gPSA4MyBbZGVmYXVsdCA9IElNUE9SVF9CQVJdOworCisgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb24gPSA4NCBbY3R5cGU9U1RSSU5HX1BJRUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImFiYyJdOworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9jb3JkX2V4dGVuc2lvbiA9IDg1IFtjdHlwZT1DT1JELCBkZWZhdWx0PSIxMjMiXTsKK30KKworbWVzc2FnZSBUZXN0TmVzdGVkRXh0ZW5zaW9uIHsKKyAgZXh0ZW5kIFRlc3RBbGxFeHRlbnNpb25zIHsKKyAgICAvLyBDaGVjayBmb3IgYnVnIHdoZXJlIHN0cmluZyBleHRlbnNpb25zIGRlY2xhcmVkIGluIHRlc3RlZCBzY29wZSBkaWQgbm90CisgICAgLy8gY29tcGlsZS4KKyAgICBvcHRpb25hbCBzdHJpbmcgdGVzdCA9IDEwMDIgW2RlZmF1bHQ9InRlc3QiXTsKKyAgfQorfQorCisvLyBXZSBoYXZlIHNlcGFyYXRlIG1lc3NhZ2VzIGZvciB0ZXN0aW5nIHJlcXVpcmVkIGZpZWxkcyBiZWNhdXNlIGl0J3MKKy8vIGFubm95aW5nIHRvIGhhdmUgdG8gZmlsbCBpbiByZXF1aXJlZCBmaWVsZHMgaW4gVGVzdFByb3RvIGluIG9yZGVyIHRvCisvLyBkbyBhbnl0aGluZyB3aXRoIGl0LiAgTm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gdGVzdCBldmVyeSB0eXBlIG9mCisvLyByZXF1aXJlZCBmaWxlZCBiZWNhdXNlIHRoZSBjb2RlIG91dHB1dCBpcyBiYXNpY2FsbHkgaWRlbnRpY2FsIHRvCisvLyBvcHRpb25hbCBmaWVsZHMgZm9yIGFsbCB0eXBlcy4KK21lc3NhZ2UgVGVzdFJlcXVpcmVkIHsKKyAgcmVxdWlyZWQgaW50MzIgYSA9IDE7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MiA9IDI7CisgIHJlcXVpcmVkIGludDMyIGIgPSAzOworCisgIGV4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7CisgICAgb3B0aW9uYWwgVGVzdFJlcXVpcmVkIHNpbmdsZSA9IDEwMDA7CisgICAgcmVwZWF0ZWQgVGVzdFJlcXVpcmVkIG11bHRpICA9IDEwMDE7CisgIH0KKworICAvLyBQYWQgdGhlIGZpZWxkIGNvdW50IHRvIDMyIHNvIHRoYXQgd2UgY2FuIHRlc3QgdGhhdCBJc0luaXRpYWxpemVkKCkKKyAgLy8gcHJvcGVybHkgY2hlY2tzIG11bHRpcGxlIGVsZW1lbnRzIG9mIGhhc19iaXRzXy4KKyAgb3B0aW9uYWwgaW50MzIgZHVtbXk0ICA9ICA0OworICBvcHRpb25hbCBpbnQzMiBkdW1teTUgID0gIDU7CisgIG9wdGlvbmFsIGludDMyIGR1bW15NiAgPSAgNjsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXk3ICA9ICA3OworICBvcHRpb25hbCBpbnQzMiBkdW1teTggID0gIDg7CisgIG9wdGlvbmFsIGludDMyIGR1bW15OSAgPSAgOTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxMCA9IDEwOworICBvcHRpb25hbCBpbnQzMiBkdW1teTExID0gMTE7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTIgPSAxMjsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxMyA9IDEzOworICBvcHRpb25hbCBpbnQzMiBkdW1teTE0ID0gMTQ7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTUgPSAxNTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxNiA9IDE2OworICBvcHRpb25hbCBpbnQzMiBkdW1teTE3ID0gMTc7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MTggPSAxODsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkxOSA9IDE5OworICBvcHRpb25hbCBpbnQzMiBkdW1teTIwID0gMjA7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjEgPSAyMTsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyMiA9IDIyOworICBvcHRpb25hbCBpbnQzMiBkdW1teTIzID0gMjM7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjQgPSAyNDsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyNSA9IDI1OworICBvcHRpb25hbCBpbnQzMiBkdW1teTI2ID0gMjY7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MjcgPSAyNzsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkyOCA9IDI4OworICBvcHRpb25hbCBpbnQzMiBkdW1teTI5ID0gMjk7CisgIG9wdGlvbmFsIGludDMyIGR1bW15MzAgPSAzMDsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkzMSA9IDMxOworICBvcHRpb25hbCBpbnQzMiBkdW1teTMyID0gMzI7CisKKyAgcmVxdWlyZWQgaW50MzIgYyA9IDMzOworfQorCittZXNzYWdlIFRlc3RSZXF1aXJlZEZvcmVpZ24geworICBvcHRpb25hbCBUZXN0UmVxdWlyZWQgb3B0aW9uYWxfbWVzc2FnZSA9IDE7CisgIHJlcGVhdGVkIFRlc3RSZXF1aXJlZCByZXBlYXRlZF9tZXNzYWdlID0gMjsKKyAgb3B0aW9uYWwgaW50MzIgZHVtbXkgPSAzOworfQorCisvLyBUZXN0IHRoYXQgd2UgY2FuIHVzZSBOZXN0ZWRNZXNzYWdlIGZyb20gb3V0c2lkZSBUZXN0QWxsVHlwZXMuCittZXNzYWdlIFRlc3RGb3JlaWduTmVzdGVkIHsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UgZm9yZWlnbl9uZXN0ZWQgPSAxOworfQorCisvLyBUZXN0RW1wdHlNZXNzYWdlIGlzIHVzZWQgdG8gdGVzdCB1bmtub3duIGZpZWxkIHN1cHBvcnQuCittZXNzYWdlIFRlc3RFbXB0eU1lc3NhZ2UgeworfQorCisvLyBMaWtlIGFib3ZlLCBidXQgZGVjbGFyZSBhbGwgZmllbGQgbnVtYmVycyBhcyBwb3RlbnRpYWwgZXh0ZW5zaW9ucy4gIE5vCisvLyBhY3R1YWwgZXh0ZW5zaW9ucyBzaG91bGQgZXZlciBiZSBkZWZpbmVkIGZvciB0aGlzIHR5cGUuCittZXNzYWdlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK21lc3NhZ2UgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIHsKKyAgZXh0ZW5zaW9ucyA0MjsKKyAgZXh0ZW5zaW9ucyA0MTQzIHRvIDQyNDM7CisgIGV4dGVuc2lvbnMgNjU1MzYgdG8gbWF4OworfQorCisvLyBUZXN0IHRoYXQgcmVhbGx5IGxhcmdlIHRhZyBudW1iZXJzIGRvbid0IGJyZWFrIGFueXRoaW5nLgorbWVzc2FnZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgeworICAvLyBUaGUgbGFyZ2VzdCBwb3NzaWJsZSB0YWcgbnVtYmVyIGlzIDJeMjggLSAxLCBzaW5jZSB0aGUgd2lyZSBmb3JtYXQgdXNlcworICAvLyB0aHJlZSBiaXRzIHRvIGNvbW11bmljYXRlIHdpcmUgdHlwZS4KKyAgb3B0aW9uYWwgaW50MzIgYSA9IDE7CisgIG9wdGlvbmFsIGludDMyIGJiID0gMjY4NDM1NDU1OworfQorCittZXNzYWdlIFRlc3RSZWN1cnNpdmVNZXNzYWdlIHsKKyAgb3B0aW9uYWwgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgYSA9IDE7CisgIG9wdGlvbmFsIGludDMyIGkgPSAyOworfQorCisvLyBUZXN0IHRoYXQgbXV0dWFsIHJlY3Vyc2lvbiB3b3Jrcy4KK21lc3NhZ2UgVGVzdE11dHVhbFJlY3Vyc2lvbkEgeworICBvcHRpb25hbCBUZXN0TXV0dWFsUmVjdXJzaW9uQiBiYiA9IDE7Cit9CisKK21lc3NhZ2UgVGVzdE11dHVhbFJlY3Vyc2lvbkIgeworICBvcHRpb25hbCBUZXN0TXV0dWFsUmVjdXJzaW9uQSBhID0gMTsKKyAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzIgPSAyOworfQorCisvLyBUZXN0IHRoYXQgZ3JvdXBzIGhhdmUgZGlzam9pbnQgZmllbGQgbnVtYmVycyBmcm9tIHRoZWlyIHNpYmxpbmdzIGFuZAorLy8gcGFyZW50cy4gIFRoaXMgaXMgTk9UIHBvc3NpYmxlIGluIHByb3RvMTsgb25seSBwcm90bzIuICBXaGVuIGF0dGVtcHRpbmcKKy8vIHRvIGNvbXBpbGUgd2l0aCBwcm90bzEsIHRoaXMgd2lsbCBlbWl0IGFuIGVycm9yOyBzbyB3ZSBvbmx5IGluY2x1ZGUgaXQKKy8vIGluIHByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvLgorbWVzc2FnZSBUZXN0RHVwRmllbGROdW1iZXIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQorICBvcHRpb25hbCBpbnQzMiBhID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQorICBvcHRpb25hbCBncm91cCBGb28gPSAyIHsgb3B0aW9uYWwgaW50MzIgYSA9IDE7IH0gIC8vIE5PX1BST1RPMQorICBvcHRpb25hbCBncm91cCBCYXIgPSAzIHsgb3B0aW9uYWwgaW50MzIgYSA9IDE7IH0gIC8vIE5PX1BST1RPMQorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQorCisKKy8vIE5lZWRlZCBmb3IgYSBQeXRob24gdGVzdC4KK21lc3NhZ2UgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIHsKKyAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKKyAgICByZXBlYXRlZCBpbnQzMiBuZXN0ZWRtZXNzYWdlX3JlcGVhdGVkX2ludDMyID0gMTsKKyAgICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSBuZXN0ZWRtZXNzYWdlX3JlcGVhdGVkX2ZvcmVpZ25tZXNzYWdlID0gMjsKKyAgfQorICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlID0gMTsKK30KKworCisvLyBUZXN0IGFuIGVudW0gdGhhdCBoYXMgbXVsdGlwbGUgdmFsdWVzIHdpdGggdGhlIHNhbWUgbnVtYmVyLgorZW51bSBUZXN0RW51bVdpdGhEdXBWYWx1ZSB7CisgIEZPTzEgPSAxOworICBCQVIxID0gMjsKKyAgQkFaID0gMzsKKyAgRk9PMiA9IDE7CisgIEJBUjIgPSAyOworfQorCisvLyBUZXN0IGFuIGVudW0gd2l0aCBsYXJnZSwgdW5vcmRlcmVkIHZhbHVlcy4KK2VudW0gVGVzdFNwYXJzZUVudW0geworICBTUEFSU0VfQSA9IDEyMzsKKyAgU1BBUlNFX0IgPSA2MjM3NDsKKyAgU1BBUlNFX0MgPSAxMjU4OTIzNDsKKyAgU1BBUlNFX0QgPSAtMTU7CisgIFNQQVJTRV9FID0gLTUzNDUyOworICBTUEFSU0VfRiA9IDA7CisgIFNQQVJTRV9HID0gMjsKK30KKworLy8gVGVzdCBtZXNzYWdlIHdpdGggQ2FtZWxDYXNlIGZpZWxkIG5hbWVzLiAgVGhpcyB2aW9sYXRlcyBQcm90b2NvbCBCdWZmZXIKKy8vIHN0YW5kYXJkIHN0eWxlLgorbWVzc2FnZSBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyB7CisgIG9wdGlvbmFsIGludDMyIFByaW1pdGl2ZUZpZWxkID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIFN0cmluZ0ZpZWxkID0gMjsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW0gRW51bUZpZWxkID0gMzsKKyAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2UgTWVzc2FnZUZpZWxkID0gNDsKKyAgb3B0aW9uYWwgc3RyaW5nIFN0cmluZ1BpZWNlRmllbGQgPSA1IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICBvcHRpb25hbCBzdHJpbmcgQ29yZEZpZWxkID0gNiBbY3R5cGU9Q09SRF07CisKKyAgcmVwZWF0ZWQgaW50MzIgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZCA9IDc7CisgIHJlcGVhdGVkIHN0cmluZyBSZXBlYXRlZFN0cmluZ0ZpZWxkID0gODsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gUmVwZWF0ZWRFbnVtRmllbGQgPSA5OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSBSZXBlYXRlZE1lc3NhZ2VGaWVsZCA9IDEwOworICByZXBlYXRlZCBzdHJpbmcgUmVwZWF0ZWRTdHJpbmdQaWVjZUZpZWxkID0gMTEgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIHJlcGVhdGVkIHN0cmluZyBSZXBlYXRlZENvcmRGaWVsZCA9IDEyIFtjdHlwZT1DT1JEXTsKK30KKworCisvLyBXZSBsaXN0IGZpZWxkcyBvdXQgb2Ygb3JkZXIsIHRvIGVuc3VyZSB0aGF0IHdlJ3JlIHVzaW5nIGZpZWxkIG51bWJlciBhbmQgbm90CisvLyBmaWVsZCBpbmRleCB0byBkZXRlcm1pbmUgc2VyaWFsaXphdGlvbiBvcmRlci4KK21lc3NhZ2UgVGVzdEZpZWxkT3JkZXJpbmdzIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG15X3N0cmluZyA9IDExOworICBleHRlbnNpb25zIDIgdG8gMTA7CisgIG9wdGlvbmFsIGludDY0IG15X2ludCA9IDE7CisgIGV4dGVuc2lvbnMgMTIgdG8gMTAwOworICBvcHRpb25hbCBmbG9hdCBteV9mbG9hdCA9IDEwMTsKK30KKworCitleHRlbmQgVGVzdEZpZWxkT3JkZXJpbmdzIHsKKyAgb3B0aW9uYWwgc3RyaW5nIG15X2V4dGVuc2lvbl9zdHJpbmcgPSA1MDsKKyAgb3B0aW9uYWwgaW50MzIgbXlfZXh0ZW5zaW9uX2ludCA9IDU7Cit9CisKKworbWVzc2FnZSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgeworICBvcHRpb25hbCBieXRlcyBlc2NhcGVkX2J5dGVzID0gMSBbZGVmYXVsdCA9ICJcMFwwMDFcYVxiXGZcblxyXHRcdlxcXCdcIlx4ZmUiXTsKKyAgb3B0aW9uYWwgdWludDMyIGxhcmdlX3VpbnQzMiA9IDIgW2RlZmF1bHQgPSAweEZGRkZGRkZGXTsKKyAgb3B0aW9uYWwgdWludDY0IGxhcmdlX3VpbnQ2NCA9IDMgW2RlZmF1bHQgPSAweEZGRkZGRkZGRkZGRkZGRkZdOworICBvcHRpb25hbCAgaW50MzIgc21hbGxfaW50MzIgID0gNCBbZGVmYXVsdCA9IC0weDdGRkZGRkZGXTsKKyAgb3B0aW9uYWwgIGludDY0IHNtYWxsX2ludDY0ICA9IDUgW2RlZmF1bHQgPSAtMHg3RkZGRkZGRkZGRkZGRkZGXTsKKworICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBoZXJlIGlzIFVURi04IGZvciAiXHUxMjM0Ii4gIChXZSBjb3VsZCBhbHNvIGp1c3QgdHlwZQorICAvLyB0aGUgVVRGLTggdGV4dCBkaXJlY3RseSBpbnRvIHRoaXMgdGV4dCBmaWxlIHJhdGhlciB0aGFuIGVzY2FwZSBpdCwgYnV0CisgIC8vIGxvdHMgb2YgcGVvcGxlIHVzZSBlZGl0b3JzIHRoYXQgd291bGQgYmUgY29uZnVzZWQgYnkgdGhpcy4pCisgIG9wdGlvbmFsIHN0cmluZyB1dGY4X3N0cmluZyA9IDYgW2RlZmF1bHQgPSAiXDM0MVwyMTBcMjY0Il07CisKKyAgLy8gVGVzdHMgZm9yIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzLgorICBvcHRpb25hbCBmbG9hdCB6ZXJvX2Zsb2F0ID0gNyBbZGVmYXVsdCA9IDBdOworICBvcHRpb25hbCBmbG9hdCBvbmVfZmxvYXQgPSA4IFtkZWZhdWx0ID0gMV07CisgIG9wdGlvbmFsIGZsb2F0IHNtYWxsX2Zsb2F0ID0gOSBbZGVmYXVsdCA9IDEuNV07CisgIG9wdGlvbmFsIGZsb2F0IG5lZ2F0aXZlX29uZV9mbG9hdCA9IDEwIFtkZWZhdWx0ID0gLTFdOworICBvcHRpb25hbCBmbG9hdCBuZWdhdGl2ZV9mbG9hdCA9IDExIFtkZWZhdWx0ID0gLTEuNV07CisgIC8vIFVzaW5nIGV4cG9uZW50cworICBvcHRpb25hbCBmbG9hdCBsYXJnZV9mbG9hdCA9IDEyIFtkZWZhdWx0ID0gMkU4XTsKKyAgb3B0aW9uYWwgZmxvYXQgc21hbGxfbmVnYXRpdmVfZmxvYXQgPSAxMyBbZGVmYXVsdCA9IC04ZS0yOF07CisKKyAgLy8gVGV4dCBmb3Igbm9uZmluaXRlIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KKyAgb3B0aW9uYWwgZG91YmxlIGluZl9kb3VibGUgPSAxNCBbZGVmYXVsdCA9IGluZl07CisgIG9wdGlvbmFsIGRvdWJsZSBuZWdfaW5mX2RvdWJsZSA9IDE1IFtkZWZhdWx0ID0gLWluZl07CisgIG9wdGlvbmFsIGRvdWJsZSBuYW5fZG91YmxlID0gMTYgW2RlZmF1bHQgPSBuYW5dOworICBvcHRpb25hbCBmbG9hdCBpbmZfZmxvYXQgPSAxNyBbZGVmYXVsdCA9IGluZl07CisgIG9wdGlvbmFsIGZsb2F0IG5lZ19pbmZfZmxvYXQgPSAxOCBbZGVmYXVsdCA9IC1pbmZdOworICBvcHRpb25hbCBmbG9hdCBuYW5fZmxvYXQgPSAxOSBbZGVmYXVsdCA9IG5hbl07CisKKyAgLy8gVGVzdHMgZm9yIEMrKyB0cmlncmFwaHMuCisgIC8vIFRyaWdyYXBocyBzaG91bGQgYmUgZXNjYXBlZCBpbiBDKysgZ2VuZXJhdGVkIGZpbGVzLCBidXQgdGhleSBzaG91bGQgbm90IGJlCisgIC8vIGVzY2FwZWQgZm9yIG90aGVyIGxhbmd1YWdlcy4KKyAgLy8gTm90ZSB0aGF0IGluIC5wcm90byBmaWxlLCAiXD8iIGlzIGEgdmFsaWQgd2F5IHRvIGVzY2FwZSA/IGluIHN0cmluZworICAvLyBsaXRlcmFscy4KKyAgb3B0aW9uYWwgc3RyaW5nIGNwcF90cmlncmFwaCA9IDIwIFtkZWZhdWx0ID0gIj8gXD8gPz8gXD8/IFw/Pz8gPz8vID9cPy0iXTsKK30KKworbWVzc2FnZSBTcGFyc2VFbnVtTWVzc2FnZSB7CisgIG9wdGlvbmFsIFRlc3RTcGFyc2VFbnVtIHNwYXJzZV9lbnVtID0gMTsKK30KKworLy8gVGVzdCBTdHJpbmcgYW5kIEJ5dGVzOiBzdHJpbmcgaXMgZm9yIHZhbGlkIFVURi04IHN0cmluZ3MKK21lc3NhZ2UgT25lU3RyaW5nIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGRhdGEgPSAxOworfQorCittZXNzYWdlIE9uZUJ5dGVzIHsKKyAgb3B0aW9uYWwgYnl0ZXMgZGF0YSA9IDE7Cit9CisKKy8vIFRlc3QgbWVzc2FnZXMgZm9yIHBhY2tlZCBmaWVsZHMKKworbWVzc2FnZSBUZXN0UGFja2VkVHlwZXMgeworICByZXBlYXRlZCAgICBpbnQzMiBwYWNrZWRfaW50MzIgICAgPSAgOTAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICBpbnQ2NCBwYWNrZWRfaW50NjQgICAgPSAgOTEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHVpbnQzMiBwYWNrZWRfdWludDMyICAgPSAgOTIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHVpbnQ2NCBwYWNrZWRfdWludDY0ICAgPSAgOTMgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHNpbnQzMiBwYWNrZWRfc2ludDMyICAgPSAgOTQgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHNpbnQ2NCBwYWNrZWRfc2ludDY0ICAgPSAgOTUgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgZml4ZWQzMiBwYWNrZWRfZml4ZWQzMiAgPSAgOTYgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgZml4ZWQ2NCBwYWNrZWRfZml4ZWQ2NCAgPSAgOTcgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQzMiBwYWNrZWRfc2ZpeGVkMzIgPSAgOTggW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQ2NCBwYWNrZWRfc2ZpeGVkNjQgPSAgOTkgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICBmbG9hdCBwYWNrZWRfZmxvYXQgICAgPSAxMDAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIGRvdWJsZSBwYWNrZWRfZG91YmxlICAgPSAxMDEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICAgYm9vbCBwYWNrZWRfYm9vbCAgICAgPSAxMDIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBGb3JlaWduRW51bSBwYWNrZWRfZW51bSAgPSAxMDMgW3BhY2tlZCA9IHRydWVdOworfQorCisvLyBBIG1lc3NhZ2Ugd2l0aCB0aGUgc2FtZSBmaWVsZHMgYXMgVGVzdFBhY2tlZFR5cGVzLCBidXQgd2l0aG91dCBwYWNraW5nLiBVc2VkCisvLyB0byB0ZXN0IHBhY2tlZCA8LT4gdW5wYWNrZWQgd2lyZSBjb21wYXRpYmlsaXR5LgorbWVzc2FnZSBUZXN0VW5wYWNrZWRUeXBlcyB7CisgIHJlcGVhdGVkICAgIGludDMyIHVucGFja2VkX2ludDMyICAgID0gIDkwIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgIGludDY0IHVucGFja2VkX2ludDY0ICAgID0gIDkxIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgdWludDMyIHVucGFja2VkX3VpbnQzMiAgID0gIDkyIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgdWludDY0IHVucGFja2VkX3VpbnQ2NCAgID0gIDkzIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgc2ludDMyIHVucGFja2VkX3NpbnQzMiAgID0gIDk0IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgc2ludDY0IHVucGFja2VkX3NpbnQ2NCAgID0gIDk1IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICBmaXhlZDMyIHVucGFja2VkX2ZpeGVkMzIgID0gIDk2IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICBmaXhlZDY0IHVucGFja2VkX2ZpeGVkNjQgID0gIDk3IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNmaXhlZDMyIHVucGFja2VkX3NmaXhlZDMyID0gIDk4IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHVucGFja2VkX3NmaXhlZDY0ID0gIDk5IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgIGZsb2F0IHVucGFja2VkX2Zsb2F0ICAgID0gMTAwIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgZG91YmxlIHVucGFja2VkX2RvdWJsZSAgID0gMTAxIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgICBib29sIHVucGFja2VkX2Jvb2wgICAgID0gMTAyIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIEZvcmVpZ25FbnVtIHVucGFja2VkX2VudW0gID0gMTAzIFtwYWNrZWQgPSBmYWxzZV07Cit9CisKK21lc3NhZ2UgVGVzdFBhY2tlZEV4dGVuc2lvbnMgeworICBleHRlbnNpb25zIDEgdG8gbWF4OworfQorCitleHRlbmQgVGVzdFBhY2tlZEV4dGVuc2lvbnMgeworICByZXBlYXRlZCAgICBpbnQzMiBwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgID0gIDkwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICA9ICA5MSBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgdWludDMyIHBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAgPSAgOTIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHVpbnQ2NCBwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgID0gIDkzIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcGFja2VkX3NpbnQzMl9leHRlbnNpb24gICA9ICA5NCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgc2ludDY0IHBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAgPSAgOTUgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgZml4ZWQzMiBwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gID0gIDk2IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICA9ICA5NyBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkIHNmaXhlZDMyIHBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24gPSAgOTggW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQ2NCBwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uID0gIDk5IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICA9IDEwMCBbcGFja2VkID0gdHJ1ZV07CisgIHJlcGVhdGVkICAgZG91YmxlIHBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAgPSAxMDEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICAgYm9vbCBwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgID0gMTAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gcGFja2VkX2VudW1fZXh0ZW5zaW9uICA9IDEwMyBbcGFja2VkID0gdHJ1ZV07Cit9CisKKy8vIFVzZWQgYnkgRXh0ZW5zaW9uU2V0VGVzdC9EeW5hbWljRXh0ZW5zaW9ucy4gIFRoZSB0ZXN0IGFjdHVhbGx5IGJ1aWxkcworLy8gYSBzZXQgb2YgZXh0ZW5zaW9ucyB0byBUZXN0QWxsRXh0ZW5zaW9ucyBkeW5hbWljYWxseSwgYmFzZWQgb24gdGhlIGZpZWxkcworLy8gb2YgdGhpcyBtZXNzYWdlIHR5cGUuCittZXNzYWdlIFRlc3REeW5hbWljRXh0ZW5zaW9ucyB7CisgIGVudW0gRHluYW1pY0VudW1UeXBlIHsKKyAgICBEWU5BTUlDX0ZPTyA9IDIyMDA7CisgICAgRFlOQU1JQ19CQVIgPSAyMjAxOworICAgIERZTkFNSUNfQkFaID0gMjIwMjsKKyAgfQorICBtZXNzYWdlIER5bmFtaWNNZXNzYWdlVHlwZSB7CisgICAgb3B0aW9uYWwgaW50MzIgZHluYW1pY19maWVsZCA9IDIxMDA7CisgIH0KKworICBvcHRpb25hbCBmaXhlZDMyIHNjYWxhcl9leHRlbnNpb24gPSAyMDAwOworICBvcHRpb25hbCBGb3JlaWduRW51bSBlbnVtX2V4dGVuc2lvbiA9IDIwMDE7CisgIG9wdGlvbmFsIER5bmFtaWNFbnVtVHlwZSBkeW5hbWljX2VudW1fZXh0ZW5zaW9uID0gMjAwMjsKKworICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBtZXNzYWdlX2V4dGVuc2lvbiA9IDIwMDM7CisgIG9wdGlvbmFsIER5bmFtaWNNZXNzYWdlVHlwZSBkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uID0gMjAwNDsKKworICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfZXh0ZW5zaW9uID0gMjAwNTsKKyAgcmVwZWF0ZWQgc2ludDMyIHBhY2tlZF9leHRlbnNpb24gPSAyMDA2IFtwYWNrZWQgPSB0cnVlXTsKK30KKworbWVzc2FnZSBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyB7CisgIC8vIFBhcnNpbmcgcmVwZWF0ZWQgZml4ZWQgc2l6ZSB2YWx1ZXMgdXNlZCB0byBmYWlsLiBUaGlzIG1lc3NhZ2UgbmVlZHMgdG8gYmUKKyAgLy8gdXNlZCBpbiBvcmRlciB0byBnZXQgYSB0YWcgb2YgdGhlIHJpZ2h0IHNpemU7IGFsbCBvZiB0aGUgcmVwZWF0ZWQgZmllbGRzCisgIC8vIGluIFRlc3RBbGxUeXBlcyBkaWRuJ3QgdHJpZ2dlciB0aGUgY2hlY2suCisgIHJlcGVhdGVkIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMiA9IDEyOworICAvLyBDaGVjayBmb3IgYSB2YXJpbnQgdHlwZSwganVzdCBmb3IgZ29vZCBtZWFzdXJlLgorICByZXBlYXRlZCBpbnQzMiAgIHJlcGVhdGVkX2ludDMyICAgPSAxMzsKKworICAvLyBUaGVzZSBoYXZlIHR3by1ieXRlIHRhZ3MuCisgIHJlcGVhdGVkIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCA9IDIwNDY7CisgIHJlcGVhdGVkIGludDY0ICAgcmVwZWF0ZWRfaW50NjQgICA9IDIwNDc7CisKKyAgLy8gVGhyZWUgYnl0ZSB0YWdzLgorICByZXBlYXRlZCBmbG9hdCAgIHJlcGVhdGVkX2Zsb2F0ICAgPSAyNjIxNDI7CisgIHJlcGVhdGVkIHVpbnQ2NCAgcmVwZWF0ZWRfdWludDY0ICA9IDI2MjE0MzsKK30KKworCisvLyBUZXN0IHRoYXQgUlBDIHNlcnZpY2VzIHdvcmsuCittZXNzYWdlIEZvb1JlcXVlc3QgIHt9CittZXNzYWdlIEZvb1Jlc3BvbnNlIHt9CisKK3NlcnZpY2UgVGVzdFNlcnZpY2UgeworICBycGMgRm9vKEZvb1JlcXVlc3QpIHJldHVybnMgKEZvb1Jlc3BvbnNlKTsKKyAgcnBjIEJhcihCYXJSZXF1ZXN0KSByZXR1cm5zIChCYXJSZXNwb25zZSk7Cit9CisKKworbWVzc2FnZSBCYXJSZXF1ZXN0ICB7fQorbWVzc2FnZSBCYXJSZXNwb25zZSB7fQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjEwNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8KQEAgLTAsMCArMSwzNjYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjogYmVuanlAZ29vZ2xlLmNvbSAoQmVuankgV2VpbmJlcmdlcikKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEEgcHJvdG8gZmlsZSB1c2VkIHRvIHRlc3QgdGhlICJjdXN0b20gb3B0aW9ucyIgZmVhdHVyZSBvZiBwcm90bzIuCisKKworLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgorLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKK29wdGlvbiBjY19nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAgIC8vIGF1dG8tYWRkZWQKK29wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgIC8vIGF1dG8tYWRkZWQKK29wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsKKworLy8gQSBjdXN0b20gZmlsZSBvcHRpb24gKGRlZmluZWQgYmVsb3cpLgorb3B0aW9uIChmaWxlX29wdDEpID0gOTg3NjU0MzIxMDsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7CisKKy8vIFdlIGRvbid0IHB1dCB0aGlzIGluIGEgcGFja2FnZSB3aXRoaW4gcHJvdG8yIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUKKy8vIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGRvZXNuJ3QgZGVwZW5kIG9uIGJlaW5nIGluIHRoZSBwcm90bzIgbmFtZXNwYWNlLgorcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworCisvLyBTb21lIHNpbXBsZSB0ZXN0IGN1c3RvbSBvcHRpb25zIG9mIHZhcmlvdXMgdHlwZXMuCisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgeworICBvcHRpb25hbCB1aW50NjQgZmlsZV9vcHQxID0gNzczNjk3NDsKK30KKworZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyB7CisgIG9wdGlvbmFsIGludDMyIG1lc3NhZ2Vfb3B0MSA9IDc3MzkwMzY7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIHsKKyAgb3B0aW9uYWwgZml4ZWQ2NCBmaWVsZF9vcHQxID0gNzc0MDkzNjsKKyAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgdGhhdCB3ZSBjb3JyZWN0bHkgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZXMgZm9yCisgIC8vIGV4dGVuc2lvbiBvcHRpb25zLgorICBvcHRpb25hbCBpbnQzMiBmaWVsZF9vcHQyID0gNzc1MzkxMyBbZGVmYXVsdD00Ml07Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgeworICBvcHRpb25hbCBzZml4ZWQzMiBlbnVtX29wdDEgPSA3NzUzNTc2OworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgeworICBvcHRpb25hbCBpbnQzMiBlbnVtX3ZhbHVlX29wdDEgPSAxNTYwNjc4OworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIHsKKyAgb3B0aW9uYWwgc2ludDY0IHNlcnZpY2Vfb3B0MSA9IDc4ODc2NTA7Cit9CisKK2VudW0gTWV0aG9kT3B0MSB7CisgIE1FVEhPRE9QVDFfVkFMMSA9IDE7CisgIE1FVEhPRE9QVDFfVkFMMiA9IDI7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyB7CisgIG9wdGlvbmFsIE1ldGhvZE9wdDEgbWV0aG9kX29wdDEgPSA3ODkwODYwOworfQorCisvLyBBIHRlc3QgbWVzc2FnZSB3aXRoIGN1c3RvbSBvcHRpb25zIGF0IGFsbCBwb3NzaWJsZSBsb2NhdGlvbnMgKGFuZCBhbHNvIHNvbWUKKy8vIHJlZ3VsYXIgb3B0aW9ucywgdG8gbWFrZSBzdXJlIHRoZXkgaW50ZXJhY3QgbmljZWx5KS4KK21lc3NhZ2UgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyB7CisgIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IGZhbHNlOworCisgIG9wdGlvbiAobWVzc2FnZV9vcHQxKSA9IC01NjsKKworICBvcHRpb25hbCBzdHJpbmcgZmllbGQxID0gMSBbY3R5cGU9Q09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZF9vcHQxKT04NzY1NDMyMTA5XTsKKworICBlbnVtIEFuRW51bSB7CisgICAgb3B0aW9uIChlbnVtX29wdDEpID0gLTc4OTsKKworICAgIEFORU5VTV9WQUwxID0gMTsKKyAgICBBTkVOVU1fVkFMMiA9IDIgWyhlbnVtX3ZhbHVlX29wdDEpID0gMTIzXTsKKyAgfQorfQorCisKKy8vIEEgdGVzdCBSUEMgc2VydmljZSB3aXRoIGN1c3RvbSBvcHRpb25zIGF0IGFsbCBwb3NzaWJsZSBsb2NhdGlvbnMgKGFuZCBhbHNvCisvLyBzb21lIHJlZ3VsYXIgb3B0aW9ucywgdG8gbWFrZSBzdXJlIHRoZXkgaW50ZXJhY3QgbmljZWx5KS4KK21lc3NhZ2UgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCB7Cit9CisKK21lc3NhZ2UgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgeworfQorCitzZXJ2aWNlIFRlc3RTZXJ2aWNlV2l0aEN1c3RvbU9wdGlvbnMgeworICBvcHRpb24gKHNlcnZpY2Vfb3B0MSkgPSAtOTg3NjU0MzIxMDsKKworICBycGMgRm9vKEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QpIHJldHVybnMgKEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlKSB7CisgICAgb3B0aW9uIChtZXRob2Rfb3B0MSkgPSBNRVRIT0RPUFQxX1ZBTDI7CisgIH0KK30KKworCisKKy8vIE9wdGlvbnMgb2YgZXZlcnkgcG9zc2libGUgZmllbGQgdHlwZSwgc28gd2UgY2FuIHRlc3QgdGhlbSBhbGwgZXhoYXVzdGl2ZWx5LgorCittZXNzYWdlIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIHsKKyAgZW51bSBUZXN0RW51bVR5cGUgeworICAgIFRFU1RfT1BUSU9OX0VOVU1fVFlQRTEgPSAyMjsKKyAgICBURVNUX09QVElPTl9FTlVNX1RZUEUyID0gLTIzOworICB9Cit9CisKK21lc3NhZ2UgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSB7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgeworICBvcHRpb25hbCAgICAgICAgIGJvb2wgICAgIGJvb2xfb3B0ID0gNzcwNjA5MDsKKyAgb3B0aW9uYWwgICAgICAgIGludDMyICAgIGludDMyX29wdCA9IDc3MDU3MDk7CisgIG9wdGlvbmFsICAgICAgICBpbnQ2NCAgICBpbnQ2NF9vcHQgPSA3NzA1NTQyOworICBvcHRpb25hbCAgICAgICB1aW50MzIgICB1aW50MzJfb3B0ID0gNzcwNDg4MDsKKyAgb3B0aW9uYWwgICAgICAgdWludDY0ICAgdWludDY0X29wdCA9IDc3MDIzNjc7CisgIG9wdGlvbmFsICAgICAgIHNpbnQzMiAgIHNpbnQzMl9vcHQgPSA3NzAxNTY4OworICBvcHRpb25hbCAgICAgICBzaW50NjQgICBzaW50NjRfb3B0ID0gNzcwMDg2MzsKKyAgb3B0aW9uYWwgICAgICBmaXhlZDMyICBmaXhlZDMyX29wdCA9IDc3MDAzMDc7CisgIG9wdGlvbmFsICAgICAgZml4ZWQ2NCAgZml4ZWQ2NF9vcHQgPSA3NzAwMTk0OworICBvcHRpb25hbCAgICAgc2ZpeGVkMzIgc2ZpeGVkMzJfb3B0ID0gNzY5ODY0NTsKKyAgb3B0aW9uYWwgICAgIHNmaXhlZDY0IHNmaXhlZDY0X29wdCA9IDc2ODU0NzU7CisgIG9wdGlvbmFsICAgICAgICBmbG9hdCAgICBmbG9hdF9vcHQgPSA3Njc1MzkwOworICBvcHRpb25hbCAgICAgICBkb3VibGUgICBkb3VibGVfb3B0ID0gNzY3MzI5MzsKKyAgb3B0aW9uYWwgICAgICAgc3RyaW5nICAgc3RyaW5nX29wdCA9IDc2NzMyODU7CisgIG9wdGlvbmFsICAgICAgICBieXRlcyAgICBieXRlc19vcHQgPSA3NjczMjM4OworICBvcHRpb25hbCBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bS5UZXN0RW51bVR5cGUgZW51bV9vcHQgPSA3NjczMjMzOworICBvcHRpb25hbCBEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlIG1lc3NhZ2VfdHlwZV9vcHQgPSA3NjY1OTY3OworfQorCittZXNzYWdlIEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMgeworICBvcHRpb24gICAgIChib29sX29wdCkgPSBmYWxzZTsKKyAgb3B0aW9uICAgIChpbnQzMl9vcHQpID0gLTB4ODAwMDAwMDA7CisgIG9wdGlvbiAgICAoaW50NjRfb3B0KSA9IC0weDgwMDAwMDAwMDAwMDAwMDA7CisgIG9wdGlvbiAgICh1aW50MzJfb3B0KSA9IDA7CisgIG9wdGlvbiAgICh1aW50NjRfb3B0KSA9IDA7CisgIG9wdGlvbiAgIChzaW50MzJfb3B0KSA9IC0weDgwMDAwMDAwOworICBvcHRpb24gICAoc2ludDY0X29wdCkgPSAtMHg4MDAwMDAwMDAwMDAwMDAwOworICBvcHRpb24gIChmaXhlZDMyX29wdCkgPSAwOworICBvcHRpb24gIChmaXhlZDY0X29wdCkgPSAwOworICBvcHRpb24gKHNmaXhlZDMyX29wdCkgPSAtMHg4MDAwMDAwMDsKKyAgb3B0aW9uIChzZml4ZWQ2NF9vcHQpID0gLTB4ODAwMDAwMDAwMDAwMDAwMDsKK30KKworbWVzc2FnZSBDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzIHsKKyAgb3B0aW9uICAgICAoYm9vbF9vcHQpID0gdHJ1ZTsKKyAgb3B0aW9uICAgIChpbnQzMl9vcHQpID0gMHg3RkZGRkZGRjsKKyAgb3B0aW9uICAgIChpbnQ2NF9vcHQpID0gMHg3RkZGRkZGRkZGRkZGRkZGOworICBvcHRpb24gICAodWludDMyX29wdCkgPSAweEZGRkZGRkZGOworICBvcHRpb24gICAodWludDY0X29wdCkgPSAweEZGRkZGRkZGRkZGRkZGRkY7CisgIG9wdGlvbiAgIChzaW50MzJfb3B0KSA9IDB4N0ZGRkZGRkY7CisgIG9wdGlvbiAgIChzaW50NjRfb3B0KSA9IDB4N0ZGRkZGRkZGRkZGRkZGRjsKKyAgb3B0aW9uICAoZml4ZWQzMl9vcHQpID0gMHhGRkZGRkZGRjsKKyAgb3B0aW9uICAoZml4ZWQ2NF9vcHQpID0gMHhGRkZGRkZGRkZGRkZGRkZGOworICBvcHRpb24gKHNmaXhlZDMyX29wdCkgPSAweDdGRkZGRkZGOworICBvcHRpb24gKHNmaXhlZDY0X29wdCkgPSAweDdGRkZGRkZGRkZGRkZGRkY7Cit9CisKK21lc3NhZ2UgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMgeworICBvcHRpb24gIChpbnQzMl9vcHQpID0gLTEwMDsgIC8vIFRvIHRlc3Qgc2lnbi1leHRlbnNpb24uCisgIG9wdGlvbiAgKGZsb2F0X29wdCkgPSAxMi4zNDU2Nzg5OworICBvcHRpb24gKGRvdWJsZV9vcHQpID0gMS4yMzQ1Njc4OTAxMjM0NTY3ODk7CisgIG9wdGlvbiAoc3RyaW5nX29wdCkgPSAiSGVsbG8sIFwiV29ybGRcIiI7CisgIG9wdGlvbiAgKGJ5dGVzX29wdCkgPSAiSGVsbG9cMFdvcmxkIjsKKyAgb3B0aW9uICAgKGVudW1fb3B0KSA9IFRFU1RfT1BUSU9OX0VOVU1fVFlQRTI7Cit9CisKK21lc3NhZ2UgU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cyB7CisgIG9wdGlvbiAgKGZsb2F0X29wdCkgPSAxMjsKKyAgb3B0aW9uIChkb3VibGVfb3B0KSA9IDE1NDsKK30KKworbWVzc2FnZSBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzIHsKKyAgb3B0aW9uICAoZmxvYXRfb3B0KSA9IC0xMjsKKyAgb3B0aW9uICAoZG91YmxlX29wdCkgPSAtMTU0OworfQorCisvLyBPcHRpb25zIG9mIGNvbXBsZXggbWVzc2FnZSB0eXBlcywgdGhlbXNlbHZlcyBjb21iaW5lZCBhbmQgZXh0ZW5kZWQgaW4KKy8vIHZhcmlvdXMgd2F5cy4KKworbWVzc2FnZSBDb21wbGV4T3B0aW9uVHlwZTEgeworICBvcHRpb25hbCBpbnQzMiBmb28gPSAxOworICBvcHRpb25hbCBpbnQzMiBmb28yID0gMjsKKyAgb3B0aW9uYWwgaW50MzIgZm9vMyA9IDM7CisKKyAgZXh0ZW5zaW9ucyAxMDAgdG8gbWF4OworfQorCittZXNzYWdlIENvbXBsZXhPcHRpb25UeXBlMiB7CisgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlMSBiYXIgPSAxOworICBvcHRpb25hbCBpbnQzMiBiYXogPSAyOworCisgIG1lc3NhZ2UgQ29tcGxleE9wdGlvblR5cGU0IHsKKyAgICBvcHRpb25hbCBpbnQzMiB3YWxkbyA9IDE7CisKKyAgICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIHsKKyAgICAgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlNCBjb21wbGV4X29wdDQgPSA3NjMzNTQ2OworICAgIH0KKyAgfQorCisgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlNCBmcmVkID0gMzsKKworICBleHRlbnNpb25zIDEwMCB0byBtYXg7Cit9CisKK21lc3NhZ2UgQ29tcGxleE9wdGlvblR5cGUzIHsKKyAgb3B0aW9uYWwgaW50MzIgcXV4ID0gMTsKKworICBvcHRpb25hbCBncm91cCBDb21wbGV4T3B0aW9uVHlwZTUgPSAyIHsKKyAgICBvcHRpb25hbCBpbnQzMiBwbHVnaCA9IDM7CisgIH0KK30KKworZXh0ZW5kIENvbXBsZXhPcHRpb25UeXBlMSB7CisgIG9wdGlvbmFsIGludDMyIHF1dXggPSA3NjYzNzA3OworICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTMgY29yZ2UgPSA3NjYzNDQyOworfQorCitleHRlbmQgQ29tcGxleE9wdGlvblR5cGUyIHsKKyAgb3B0aW9uYWwgaW50MzIgZ3JhdWx0ID0gNzY1MDkyNzsKKyAgb3B0aW9uYWwgQ29tcGxleE9wdGlvblR5cGUxIGdhcnBseSA9IDc2NDk5OTI7Cit9CisKK2V4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgeworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdC5Db21wbGV4T3B0aW9uVHlwZTEgY29tcGxleF9vcHQxID0gNzY0Njc1NjsKKyAgb3B0aW9uYWwgQ29tcGxleE9wdGlvblR5cGUyIGNvbXBsZXhfb3B0MiA9IDc2MzY5NDk7CisgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlMyBjb21wbGV4X29wdDMgPSA3NjM2NDYzOworICBvcHRpb25hbCBncm91cCBDb21wbGV4T3B0NiA9IDc1OTU0NjggeworICAgIG9wdGlvbmFsIGludDMyIHh5enp5ID0gNzU5Mzk1MTsKKyAgfQorfQorCisvLyBOb3RlIHRoYXQgd2UgdHJ5IHZhcmlvdXMgZGlmZmVyZW50IHdheXMgb2YgbmFtaW5nIHRoZSBzYW1lIGV4dGVuc2lvbi4KK21lc3NhZ2UgVmFyaW91c0NvbXBsZXhPcHRpb25zIHsKKyAgb3B0aW9uICgucHJvdG9idWZfdW5pdHRlc3QuY29tcGxleF9vcHQxKS5mb28gPSA0MjsKKyAgb3B0aW9uIChwcm90b2J1Zl91bml0dGVzdC5jb21wbGV4X29wdDEpLigucHJvdG9idWZfdW5pdHRlc3QucXV1eCkgPSAzMjQ7CisgIG9wdGlvbiAoLnByb3RvYnVmX3VuaXR0ZXN0LmNvbXBsZXhfb3B0MSkuKHByb3RvYnVmX3VuaXR0ZXN0LmNvcmdlKS5xdXggPSA4NzY7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXogPSA5ODc7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS4oZ3JhdWx0KSA9IDY1NDsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhci5mb28gPSA3NDM7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXIuKHF1dXgpID0gMTk5OTsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhci4ocHJvdG9idWZfdW5pdHRlc3QuY29yZ2UpLnF1eCA9IDIwMDg7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS4oZ2FycGx5KS5mb28gPSA3NDE7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS4oZ2FycGx5KS4oLnByb3RvYnVmX3VuaXR0ZXN0LnF1dXgpID0gMTk5ODsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLihwcm90b2J1Zl91bml0dGVzdC5nYXJwbHkpLihjb3JnZSkucXV4ID0gMjEyMTsKKyAgb3B0aW9uIChDb21wbGV4T3B0aW9uVHlwZTIuQ29tcGxleE9wdGlvblR5cGU0LmNvbXBsZXhfb3B0NCkud2FsZG8gPSAxOTcxOworICBvcHRpb24gKGNvbXBsZXhfb3B0MikuZnJlZC53YWxkbyA9IDMyMTsKKyAgb3B0aW9uIChwcm90b2J1Zl91bml0dGVzdC5jb21wbGV4X29wdDMpLnF1eCA9IDk7CisgIG9wdGlvbiAoY29tcGxleF9vcHQzKS5jb21wbGV4b3B0aW9udHlwZTUucGx1Z2ggPSAyMjsKKyAgb3B0aW9uIChjb21wbGV4b3B0NikueHl6enkgPSAyNDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbml0aW9ucyBmb3IgdGVzdGluZyBhZ2dyZWdhdGUgb3B0aW9uIHBhcnNpbmcuCisvLyBTZWUgZGVzY3JpcHRvcl91bml0dGVzdC5jYy4KKworbWVzc2FnZSBBZ2dyZWdhdGVNZXNzYWdlU2V0IHsKKyAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTsKKyAgZXh0ZW5zaW9ucyA0IHRvIG1heDsKK30KKworbWVzc2FnZSBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCB7CisgIGV4dGVuZCBBZ2dyZWdhdGVNZXNzYWdlU2V0IHsKKyAgICBvcHRpb25hbCBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBtZXNzYWdlX3NldF9leHRlbnNpb24gPSAxNTQ0NzU0MjsKKyAgfQorICBvcHRpb25hbCBzdHJpbmcgcyA9IDE7Cit9CisKKy8vIEEgaGVscGVyIHR5cGUgdXNlZCB0byB0ZXN0IGFnZ3JlZ2F0ZSBvcHRpb24gcGFyc2luZworbWVzc2FnZSBBZ2dyZWdhdGUgeworICBvcHRpb25hbCBpbnQzMiBpID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIHMgPSAyOworCisgIC8vIEEgbmVzdGVkIG9iamVjdAorICBvcHRpb25hbCBBZ2dyZWdhdGUgc3ViID0gMzsKKworICAvLyBUbyB0ZXN0IHRoZSBwYXJzaW5nIG9mIGV4dGVuc2lvbnMgaW5zaWRlIGFnZ3JlZ2F0ZSB2YWx1ZXMKKyAgb3B0aW9uYWwgZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIGZpbGUgPSA0OworICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIHsKKyAgICBvcHRpb25hbCBBZ2dyZWdhdGUgbmVzdGVkID0gMTU0NzY5MDM7CisgIH0KKworICAvLyBBbiBlbWJlZGRlZCBtZXNzYWdlIHNldAorICBvcHRpb25hbCBBZ2dyZWdhdGVNZXNzYWdlU2V0IG1zZXQgPSA1OworfQorCisvLyBBbGxvdyBBZ2dyZWdhdGUgdG8gYmUgdXNlZCBhcyBhbiBvcHRpb24gYXQgYWxsIHBvc3NpYmxlIGxvY2F0aW9ucworLy8gaW4gdGhlIC5wcm90byBncmFtbWVyLgorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyAgICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIGZpbGVvcHQgICAgPSAxNTQ3ODQ3OTsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIG1zZ29wdCAgICAgPSAxNTQ4MDA4ODsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIGZpZWxkb3B0ICAgPSAxNTQ4MTM3NDsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyAgICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIGVudW1vcHQgICAgPSAxNTQ4MzIxODsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIHsgb3B0aW9uYWwgQWdncmVnYXRlIGVudW12YWxvcHQgPSAxNTQ4NjkyMTsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIHNlcnZpY2VvcHQgPSAxNTQ5NzE0NTsgfQorZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIG1ldGhvZG9wdCAgPSAxNTUxMjcxMzsgfQorCisvLyBUcnkgdXNpbmcgQWdncmVnYXRlT3B0aW9uIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGhlIHByb3RvIGdyYW1tYXIKK29wdGlvbiAoZmlsZW9wdCkgPSB7CisgIHM6ICdGaWxlQW5ub3RhdGlvbicKKyAgLy8gQWxzbyB0ZXN0IHRoZSBoYW5kbGluZyBvZiBjb21tZW50cworICAvKiBvZiBib3RoIHR5cGVzICovIGk6IDEwMAorCisgIHN1YiB7IHM6ICdOZXN0ZWRGaWxlQW5ub3RhdGlvbicgfQorCisgIC8vIEluY2x1ZGUgYSBnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgYW5kIHJlY3Vyc2l2ZWx5IGV4dGVuZCBpdCB3aXRoCisgIC8vIGFub3RoZXIgZmlsZW9wdC4KKyAgZmlsZSB7CisgICAgW3Byb3RvYnVmX3VuaXR0ZXN0LmZpbGVvcHRdIHsKKyAgICAgIHM6J0ZpbGVFeHRlbnNpb25Bbm5vdGF0aW9uJworICAgIH0KKyAgfQorCisgIC8vIEEgbWVzc2FnZSBzZXQgaW5zaWRlIGFuIG9wdGlvbiB2YWx1ZQorICBtc2V0IHsKKyAgICBbcHJvdG9idWZfdW5pdHRlc3QuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQubWVzc2FnZV9zZXRfZXh0ZW5zaW9uXSB7CisgICAgICBzOiAnRW1iZWRkZWRNZXNzYWdlU2V0RWxlbWVudCcKKyAgICB9CisgIH0KK307CisKK21lc3NhZ2UgQWdncmVnYXRlTWVzc2FnZSB7CisgIG9wdGlvbiAobXNnb3B0KSA9IHsgaToxMDEgczonTWVzc2FnZUFubm90YXRpb24nIH07CisgIG9wdGlvbmFsIGludDMyIGZpZWxkbmFtZSA9IDEgWyhmaWVsZG9wdCkgPSB7IHM6J0ZpZWxkQW5ub3RhdGlvbicgfV07Cit9CisKK3NlcnZpY2UgQWdncmVnYXRlU2VydmljZSB7CisgIG9wdGlvbiAoc2VydmljZW9wdCkgPSB7IHM6J1NlcnZpY2VBbm5vdGF0aW9uJyB9OworICBycGMgTWV0aG9kIChBZ2dyZWdhdGVNZXNzYWdlKSByZXR1cm5zIChBZ2dyZWdhdGVNZXNzYWdlKSB7CisgICAgb3B0aW9uIChtZXRob2RvcHQpID0geyBzOidNZXRob2RBbm5vdGF0aW9uJyB9OworICB9Cit9CisKK2VudW0gQWdncmVnYXRlRW51bSB7CisgIG9wdGlvbiAoZW51bW9wdCkgPSB7IHM6J0VudW1Bbm5vdGF0aW9uJyB9OworICBWQUxVRSA9IDEgWyhlbnVtdmFsb3B0KSA9IHsgczonRW51bVZhbHVlQW5ub3RhdGlvbicgfV07Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExNzYyNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90bwpAQCAtMCwwICsxLDUwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBBIHByb3RvIGZpbGUgd2hpY2ggaW1wb3J0cyBhIHByb3RvIGZpbGUgdGhhdCB1c2VzIG9wdGltaXplX2ZvciA9IENPREVfU0laRS4KKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvIjsKKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworLy8gV2Ugb3B0aW1pemUgZm9yIHNwZWVkIGhlcmUsIGJ1dCB3ZSBhcmUgaW1wb3J0aW5nIGEgcHJvdG8gdGhhdCBpcyBvcHRpbWl6ZWQKKy8vIGZvciBjb2RlIHNpemUuCitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CisKK21lc3NhZ2UgVGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSB7CisgIC8vIFRlc3QgdGhhdCBlbWJlZGRpbmcgYSBtZXNzYWdlIHdoaWNoIGhhcyBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkUgaW50bworICAvLyBvbmUgb3B0aW1pemVkIGZvciBzcGVlZCB3b3Jrcy4KKyAgb3B0aW9uYWwgVGVzdE9wdGltaXplZEZvclNpemUgb3B0aW9uYWxfbWVzc2FnZSA9IDE7CisgIHJlcGVhdGVkIFRlc3RPcHRpbWl6ZWRGb3JTaXplIHJlcGVhdGVkX21lc3NhZ2UgPSAyOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjEyZDFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucHJvdG8KQEAgLTAsMCArMSwzNyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBmaWxlIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4gIChBdCBvbmUgcG9pbnQgdGhpcyB3b3VsZG4ndCBjb21waWxlCisvLyBjb3JyZWN0bHkuKQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBiN2MxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wcm90bwpAQCAtMCwwICsxLDEwNDYgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEEgcHJvdG8gZmlsZSB0aGF0IGhhcyBhbiBleHRyZW1lbHkgbGFyZ2UgZGVzY3JpcHRvci4gIFVzZWQgdG8gdGVzdCB0aGF0CisvLyBkZXNjcmlwdG9ycyBvdmVyIDY0ayBkb24ndCBicmVhayB0aGUgc3RyaW5nIGxpdGVyYWwgbGVuZ3RoIGxpbWl0IGluIEphdmEuCisKKworcGFja2FnZSBnb29nbGUucHJvdG9idWY7CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOworCisvLyBBdm9pZCBnZW5lcmF0aW5nIGluc2FuZWx5IGxvbmcgbWV0aG9kcy4KK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkU7CisKK21lc3NhZ2UgVGVzdEVub3Jtb3VzRGVzY3JpcHRvciB7CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xID0gMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMiA9IDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMgPSAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ID0gNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNSA9IDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYgPSA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ID0gNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOCA9IDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkgPSA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMCA9IDEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMSA9IDExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMiA9IDEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMyA9IDEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNCA9IDE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNSA9IDE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNiA9IDE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNyA9IDE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOCA9IDE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOSA9IDE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMCA9IDIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMSA9IDIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMiA9IDIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMyA9IDIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNCA9IDI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNSA9IDI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNiA9IDI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNyA9IDI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOCA9IDI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOSA9IDI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMCA9IDMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMSA9IDMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMiA9IDMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMyA9IDMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNCA9IDM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNSA9IDM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNiA9IDM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNyA9IDM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOCA9IDM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOSA9IDM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MCA9IDQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MSA9IDQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MiA9IDQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MyA9IDQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NCA9IDQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NSA9IDQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NiA9IDQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NyA9IDQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OCA9IDQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OSA9IDQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MCA9IDUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MSA9IDUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MiA9IDUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MyA9IDUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NCA9IDU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NSA9IDU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NiA9IDU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NyA9IDU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OCA9IDU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OSA9IDU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MCA9IDYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MSA9IDYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MiA9IDYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MyA9IDYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NCA9IDY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NSA9IDY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NiA9IDY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NyA9IDY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OCA9IDY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OSA9IDY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MCA9IDcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MSA9IDcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MiA9IDcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MyA9IDczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NCA9IDc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NSA9IDc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NiA9IDc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NyA9IDc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OCA9IDc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OSA9IDc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MCA9IDgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MSA9IDgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MiA9IDgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MyA9IDgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NCA9IDg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NSA9IDg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NiA9IDg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NyA9IDg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OCA9IDg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OSA9IDg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MCA9IDkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MSA9IDkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MiA9IDkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MyA9IDkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NCA9IDk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NSA9IDk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NiA9IDk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NyA9IDk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OCA9IDk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OSA9IDk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDAgPSAxMDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwMSA9IDEwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTAyID0gMTAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDMgPSAxMDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwNCA9IDEwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTA1ID0gMTA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDYgPSAxMDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwNyA9IDEwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTA4ID0gMTA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDkgPSAxMDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExMCA9IDExMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTExID0gMTExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTIgPSAxMTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExMyA9IDExMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTE0ID0gMTE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTUgPSAxMTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExNiA9IDExNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTE3ID0gMTE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTggPSAxMTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExOSA9IDExOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTIwID0gMTIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjEgPSAxMjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyMiA9IDEyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTIzID0gMTIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjQgPSAxMjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyNSA9IDEyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTI2ID0gMTI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjcgPSAxMjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyOCA9IDEyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTI5ID0gMTI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzAgPSAxMzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzMSA9IDEzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTMyID0gMTMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzMgPSAxMzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzNCA9IDEzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTM1ID0gMTM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzYgPSAxMzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzNyA9IDEzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTM4ID0gMTM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzkgPSAxMzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0MCA9IDE0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQxID0gMTQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDIgPSAxNDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0MyA9IDE0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQ0ID0gMTQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDUgPSAxNDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0NiA9IDE0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQ3ID0gMTQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDggPSAxNDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0OSA9IDE0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTUwID0gMTUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTEgPSAxNTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1MiA9IDE1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTUzID0gMTUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTQgPSAxNTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1NSA9IDE1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTU2ID0gMTU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTcgPSAxNTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1OCA9IDE1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTU5ID0gMTU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjAgPSAxNjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2MSA9IDE2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTYyID0gMTYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjMgPSAxNjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2NCA9IDE2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTY1ID0gMTY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjYgPSAxNjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2NyA9IDE2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTY4ID0gMTY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjkgPSAxNjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3MCA9IDE3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTcxID0gMTcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzIgPSAxNzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3MyA9IDE3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTc0ID0gMTc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzUgPSAxNzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3NiA9IDE3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTc3ID0gMTc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzggPSAxNzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3OSA9IDE3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTgwID0gMTgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODEgPSAxODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4MiA9IDE4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTgzID0gMTgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODQgPSAxODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4NSA9IDE4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTg2ID0gMTg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODcgPSAxODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4OCA9IDE4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTg5ID0gMTg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTAgPSAxOTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5MSA9IDE5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTkyID0gMTkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTMgPSAxOTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5NCA9IDE5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTk1ID0gMTk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTYgPSAxOTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5NyA9IDE5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTk4ID0gMTk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTkgPSAxOTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwMCA9IDIwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjAxID0gMjAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDIgPSAyMDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwMyA9IDIwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjA0ID0gMjA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDUgPSAyMDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwNiA9IDIwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjA3ID0gMjA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDggPSAyMDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwOSA9IDIwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjEwID0gMjEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTEgPSAyMTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxMiA9IDIxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjEzID0gMjEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTQgPSAyMTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxNSA9IDIxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjE2ID0gMjE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTcgPSAyMTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxOCA9IDIxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjE5ID0gMjE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjAgPSAyMjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyMSA9IDIyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjIyID0gMjIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjMgPSAyMjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyNCA9IDIyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjI1ID0gMjI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjYgPSAyMjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyNyA9IDIyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjI4ID0gMjI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjkgPSAyMjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzMCA9IDIzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjMxID0gMjMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzIgPSAyMzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzMyA9IDIzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjM0ID0gMjM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzUgPSAyMzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzNiA9IDIzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjM3ID0gMjM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzggPSAyMzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzOSA9IDIzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQwID0gMjQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDEgPSAyNDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0MiA9IDI0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQzID0gMjQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDQgPSAyNDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0NSA9IDI0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQ2ID0gMjQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDcgPSAyNDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0OCA9IDI0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQ5ID0gMjQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTAgPSAyNTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1MSA9IDI1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjUyID0gMjUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTMgPSAyNTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1NCA9IDI1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjU1ID0gMjU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTYgPSAyNTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1NyA9IDI1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjU4ID0gMjU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTkgPSAyNTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2MCA9IDI2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjYxID0gMjYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjIgPSAyNjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2MyA9IDI2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjY0ID0gMjY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjUgPSAyNjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2NiA9IDI2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjY3ID0gMjY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjggPSAyNjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2OSA9IDI2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjcwID0gMjcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzEgPSAyNzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3MiA9IDI3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjczID0gMjczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzQgPSAyNzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3NSA9IDI3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjc2ID0gMjc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzcgPSAyNzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3OCA9IDI3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjc5ID0gMjc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODAgPSAyODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4MSA9IDI4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjgyID0gMjgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODMgPSAyODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4NCA9IDI4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjg1ID0gMjg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODYgPSAyODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4NyA9IDI4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjg4ID0gMjg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODkgPSAyODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5MCA9IDI5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjkxID0gMjkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTIgPSAyOTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5MyA9IDI5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjk0ID0gMjk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTUgPSAyOTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5NiA9IDI5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjk3ID0gMjk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTggPSAyOTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5OSA9IDI5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzAwID0gMzAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDEgPSAzMDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwMiA9IDMwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzAzID0gMzAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDQgPSAzMDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwNSA9IDMwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzA2ID0gMzA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDcgPSAzMDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwOCA9IDMwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzA5ID0gMzA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTAgPSAzMTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxMSA9IDMxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzEyID0gMzEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTMgPSAzMTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxNCA9IDMxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzE1ID0gMzE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTYgPSAzMTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxNyA9IDMxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzE4ID0gMzE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTkgPSAzMTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyMCA9IDMyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzIxID0gMzIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjIgPSAzMjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyMyA9IDMyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzI0ID0gMzI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjUgPSAzMjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyNiA9IDMyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzI3ID0gMzI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjggPSAzMjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyOSA9IDMyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzMwID0gMzMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzEgPSAzMzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzMiA9IDMzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzMzID0gMzMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzQgPSAzMzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzNSA9IDMzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzM2ID0gMzM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzcgPSAzMzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzOCA9IDMzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzM5ID0gMzM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDAgPSAzNDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0MSA9IDM0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQyID0gMzQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDMgPSAzNDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0NCA9IDM0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQ1ID0gMzQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDYgPSAzNDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0NyA9IDM0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQ4ID0gMzQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDkgPSAzNDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1MCA9IDM1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzUxID0gMzUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTIgPSAzNTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1MyA9IDM1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzU0ID0gMzU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTUgPSAzNTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1NiA9IDM1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzU3ID0gMzU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTggPSAzNTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1OSA9IDM1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzYwID0gMzYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjEgPSAzNjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2MiA9IDM2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzYzID0gMzYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjQgPSAzNjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2NSA9IDM2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzY2ID0gMzY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjcgPSAzNjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2OCA9IDM2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzY5ID0gMzY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzAgPSAzNzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3MSA9IDM3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzcyID0gMzcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzMgPSAzNzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3NCA9IDM3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzc1ID0gMzc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzYgPSAzNzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3NyA9IDM3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzc4ID0gMzc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzkgPSAzNzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4MCA9IDM4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzgxID0gMzgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODIgPSAzODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4MyA9IDM4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzg0ID0gMzg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODUgPSAzODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4NiA9IDM4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzg3ID0gMzg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODggPSAzODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4OSA9IDM4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzkwID0gMzkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTEgPSAzOTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5MiA9IDM5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzkzID0gMzkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTQgPSAzOTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5NSA9IDM5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzk2ID0gMzk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTcgPSAzOTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5OCA9IDM5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzk5ID0gMzk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDAgPSA0MDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwMSA9IDQwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDAyID0gNDAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDMgPSA0MDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwNCA9IDQwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDA1ID0gNDA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDYgPSA0MDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwNyA9IDQwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDA4ID0gNDA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDkgPSA0MDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxMCA9IDQxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDExID0gNDExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTIgPSA0MTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxMyA9IDQxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDE0ID0gNDE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTUgPSA0MTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxNiA9IDQxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDE3ID0gNDE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTggPSA0MTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxOSA9IDQxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDIwID0gNDIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjEgPSA0MjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyMiA9IDQyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDIzID0gNDIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjQgPSA0MjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyNSA9IDQyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDI2ID0gNDI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjcgPSA0MjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyOCA9IDQyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDI5ID0gNDI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzAgPSA0MzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzMSA9IDQzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDMyID0gNDMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzMgPSA0MzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzNCA9IDQzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDM1ID0gNDM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzYgPSA0MzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzNyA9IDQzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDM4ID0gNDM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzkgPSA0MzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0MCA9IDQ0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQxID0gNDQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDIgPSA0NDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0MyA9IDQ0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQ0ID0gNDQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDUgPSA0NDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0NiA9IDQ0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQ3ID0gNDQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDggPSA0NDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0OSA9IDQ0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDUwID0gNDUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTEgPSA0NTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1MiA9IDQ1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDUzID0gNDUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTQgPSA0NTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1NSA9IDQ1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDU2ID0gNDU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTcgPSA0NTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1OCA9IDQ1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDU5ID0gNDU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjAgPSA0NjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2MSA9IDQ2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDYyID0gNDYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjMgPSA0NjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2NCA9IDQ2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDY1ID0gNDY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjYgPSA0NjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2NyA9IDQ2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDY4ID0gNDY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjkgPSA0NjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3MCA9IDQ3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDcxID0gNDcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzIgPSA0NzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3MyA9IDQ3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDc0ID0gNDc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzUgPSA0NzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3NiA9IDQ3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDc3ID0gNDc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzggPSA0NzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3OSA9IDQ3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDgwID0gNDgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODEgPSA0ODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4MiA9IDQ4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDgzID0gNDgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODQgPSA0ODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4NSA9IDQ4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDg2ID0gNDg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODcgPSA0ODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4OCA9IDQ4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDg5ID0gNDg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTAgPSA0OTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5MSA9IDQ5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDkyID0gNDkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTMgPSA0OTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5NCA9IDQ5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDk1ID0gNDk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTYgPSA0OTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5NyA9IDQ5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDk4ID0gNDk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTkgPSA0OTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwMCA9IDUwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTAxID0gNTAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDIgPSA1MDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwMyA9IDUwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTA0ID0gNTA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDUgPSA1MDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwNiA9IDUwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTA3ID0gNTA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDggPSA1MDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwOSA9IDUwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTEwID0gNTEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTEgPSA1MTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxMiA9IDUxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTEzID0gNTEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTQgPSA1MTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxNSA9IDUxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTE2ID0gNTE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTcgPSA1MTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxOCA9IDUxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTE5ID0gNTE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjAgPSA1MjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyMSA9IDUyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTIyID0gNTIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjMgPSA1MjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyNCA9IDUyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTI1ID0gNTI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjYgPSA1MjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyNyA9IDUyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTI4ID0gNTI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjkgPSA1MjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzMCA9IDUzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTMxID0gNTMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzIgPSA1MzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzMyA9IDUzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTM0ID0gNTM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzUgPSA1MzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzNiA9IDUzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTM3ID0gNTM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzggPSA1MzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzOSA9IDUzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQwID0gNTQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDEgPSA1NDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0MiA9IDU0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQzID0gNTQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDQgPSA1NDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0NSA9IDU0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQ2ID0gNTQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDcgPSA1NDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0OCA9IDU0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQ5ID0gNTQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTAgPSA1NTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1MSA9IDU1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTUyID0gNTUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTMgPSA1NTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1NCA9IDU1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTU1ID0gNTU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTYgPSA1NTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1NyA9IDU1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTU4ID0gNTU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTkgPSA1NTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2MCA9IDU2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTYxID0gNTYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjIgPSA1NjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2MyA9IDU2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTY0ID0gNTY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjUgPSA1NjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2NiA9IDU2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTY3ID0gNTY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjggPSA1NjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2OSA9IDU2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTcwID0gNTcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzEgPSA1NzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3MiA9IDU3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTczID0gNTczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzQgPSA1NzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3NSA9IDU3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTc2ID0gNTc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzcgPSA1NzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3OCA9IDU3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTc5ID0gNTc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODAgPSA1ODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4MSA9IDU4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTgyID0gNTgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODMgPSA1ODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4NCA9IDU4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTg1ID0gNTg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODYgPSA1ODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4NyA9IDU4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTg4ID0gNTg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODkgPSA1ODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5MCA9IDU5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTkxID0gNTkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTIgPSA1OTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5MyA9IDU5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTk0ID0gNTk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTUgPSA1OTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5NiA9IDU5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTk3ID0gNTk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTggPSA1OTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5OSA9IDU5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjAwID0gNjAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDEgPSA2MDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwMiA9IDYwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjAzID0gNjAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDQgPSA2MDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwNSA9IDYwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjA2ID0gNjA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDcgPSA2MDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwOCA9IDYwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjA5ID0gNjA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTAgPSA2MTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxMSA9IDYxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjEyID0gNjEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTMgPSA2MTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxNCA9IDYxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjE1ID0gNjE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTYgPSA2MTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxNyA9IDYxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjE4ID0gNjE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTkgPSA2MTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyMCA9IDYyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjIxID0gNjIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjIgPSA2MjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyMyA9IDYyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjI0ID0gNjI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjUgPSA2MjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyNiA9IDYyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjI3ID0gNjI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjggPSA2MjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyOSA9IDYyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjMwID0gNjMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzEgPSA2MzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzMiA9IDYzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjMzID0gNjMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzQgPSA2MzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzNSA9IDYzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjM2ID0gNjM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzcgPSA2MzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzOCA9IDYzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjM5ID0gNjM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDAgPSA2NDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0MSA9IDY0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQyID0gNjQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDMgPSA2NDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0NCA9IDY0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQ1ID0gNjQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDYgPSA2NDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0NyA9IDY0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQ4ID0gNjQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDkgPSA2NDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1MCA9IDY1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjUxID0gNjUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTIgPSA2NTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1MyA9IDY1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjU0ID0gNjU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTUgPSA2NTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1NiA9IDY1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjU3ID0gNjU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTggPSA2NTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1OSA9IDY1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjYwID0gNjYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjEgPSA2NjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2MiA9IDY2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjYzID0gNjYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjQgPSA2NjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2NSA9IDY2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjY2ID0gNjY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjcgPSA2NjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2OCA9IDY2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjY5ID0gNjY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzAgPSA2NzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3MSA9IDY3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjcyID0gNjcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzMgPSA2NzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3NCA9IDY3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjc1ID0gNjc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzYgPSA2NzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3NyA9IDY3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjc4ID0gNjc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzkgPSA2NzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4MCA9IDY4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjgxID0gNjgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODIgPSA2ODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4MyA9IDY4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjg0ID0gNjg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODUgPSA2ODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4NiA9IDY4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjg3ID0gNjg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODggPSA2ODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4OSA9IDY4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjkwID0gNjkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTEgPSA2OTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5MiA9IDY5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjkzID0gNjkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTQgPSA2OTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5NSA9IDY5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjk2ID0gNjk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTcgPSA2OTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5OCA9IDY5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjk5ID0gNjk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDAgPSA3MDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwMSA9IDcwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzAyID0gNzAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDMgPSA3MDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwNCA9IDcwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzA1ID0gNzA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDYgPSA3MDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwNyA9IDcwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzA4ID0gNzA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDkgPSA3MDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxMCA9IDcxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzExID0gNzExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTIgPSA3MTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxMyA9IDcxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzE0ID0gNzE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTUgPSA3MTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxNiA9IDcxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzE3ID0gNzE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTggPSA3MTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxOSA9IDcxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzIwID0gNzIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjEgPSA3MjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyMiA9IDcyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzIzID0gNzIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjQgPSA3MjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyNSA9IDcyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzI2ID0gNzI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjcgPSA3MjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyOCA9IDcyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzI5ID0gNzI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzAgPSA3MzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczMSA9IDczMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzMyID0gNzMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzMgPSA3MzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczNCA9IDczNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzM1ID0gNzM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzYgPSA3MzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczNyA9IDczNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzM4ID0gNzM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzkgPSA3MzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0MCA9IDc0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQxID0gNzQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDIgPSA3NDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0MyA9IDc0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQ0ID0gNzQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDUgPSA3NDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0NiA9IDc0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQ3ID0gNzQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDggPSA3NDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0OSA9IDc0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzUwID0gNzUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTEgPSA3NTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1MiA9IDc1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzUzID0gNzUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTQgPSA3NTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1NSA9IDc1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzU2ID0gNzU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTcgPSA3NTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1OCA9IDc1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzU5ID0gNzU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjAgPSA3NjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2MSA9IDc2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzYyID0gNzYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjMgPSA3NjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2NCA9IDc2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzY1ID0gNzY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjYgPSA3NjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2NyA9IDc2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzY4ID0gNzY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjkgPSA3NjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3MCA9IDc3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzcxID0gNzcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzIgPSA3NzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3MyA9IDc3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzc0ID0gNzc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzUgPSA3NzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3NiA9IDc3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzc3ID0gNzc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzggPSA3NzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3OSA9IDc3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzgwID0gNzgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODEgPSA3ODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4MiA9IDc4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzgzID0gNzgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODQgPSA3ODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4NSA9IDc4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzg2ID0gNzg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODcgPSA3ODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4OCA9IDc4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzg5ID0gNzg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTAgPSA3OTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5MSA9IDc5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzkyID0gNzkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTMgPSA3OTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5NCA9IDc5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzk1ID0gNzk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTYgPSA3OTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5NyA9IDc5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzk4ID0gNzk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTkgPSA3OTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwMCA9IDgwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODAxID0gODAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDIgPSA4MDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwMyA9IDgwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODA0ID0gODA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDUgPSA4MDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwNiA9IDgwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODA3ID0gODA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDggPSA4MDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwOSA9IDgwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODEwID0gODEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTEgPSA4MTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxMiA9IDgxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODEzID0gODEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTQgPSA4MTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxNSA9IDgxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODE2ID0gODE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTcgPSA4MTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxOCA9IDgxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODE5ID0gODE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjAgPSA4MjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyMSA9IDgyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODIyID0gODIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjMgPSA4MjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyNCA9IDgyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODI1ID0gODI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjYgPSA4MjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyNyA9IDgyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODI4ID0gODI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjkgPSA4MjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzMCA9IDgzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODMxID0gODMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzIgPSA4MzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzMyA9IDgzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODM0ID0gODM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzUgPSA4MzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzNiA9IDgzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODM3ID0gODM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzggPSA4MzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzOSA9IDgzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQwID0gODQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDEgPSA4NDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0MiA9IDg0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQzID0gODQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDQgPSA4NDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0NSA9IDg0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQ2ID0gODQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDcgPSA4NDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0OCA9IDg0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQ5ID0gODQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTAgPSA4NTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1MSA9IDg1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODUyID0gODUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTMgPSA4NTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1NCA9IDg1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODU1ID0gODU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTYgPSA4NTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1NyA9IDg1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODU4ID0gODU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTkgPSA4NTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2MCA9IDg2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODYxID0gODYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjIgPSA4NjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2MyA9IDg2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODY0ID0gODY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjUgPSA4NjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2NiA9IDg2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODY3ID0gODY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjggPSA4NjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2OSA9IDg2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODcwID0gODcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzEgPSA4NzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3MiA9IDg3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODczID0gODczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzQgPSA4NzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3NSA9IDg3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODc2ID0gODc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzcgPSA4NzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3OCA9IDg3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODc5ID0gODc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODAgPSA4ODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4MSA9IDg4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODgyID0gODgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODMgPSA4ODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4NCA9IDg4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODg1ID0gODg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODYgPSA4ODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4NyA9IDg4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODg4ID0gODg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODkgPSA4ODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5MCA9IDg5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODkxID0gODkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTIgPSA4OTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5MyA9IDg5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODk0ID0gODk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTUgPSA4OTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5NiA9IDg5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODk3ID0gODk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTggPSA4OTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5OSA9IDg5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTAwID0gOTAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDEgPSA5MDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwMiA9IDkwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTAzID0gOTAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDQgPSA5MDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwNSA9IDkwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTA2ID0gOTA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDcgPSA5MDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwOCA9IDkwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTA5ID0gOTA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTAgPSA5MTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxMSA9IDkxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTEyID0gOTEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTMgPSA5MTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxNCA9IDkxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTE1ID0gOTE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTYgPSA5MTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxNyA9IDkxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTE4ID0gOTE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTkgPSA5MTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyMCA9IDkyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTIxID0gOTIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjIgPSA5MjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyMyA9IDkyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTI0ID0gOTI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjUgPSA5MjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyNiA9IDkyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTI3ID0gOTI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjggPSA5MjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyOSA9IDkyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTMwID0gOTMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzEgPSA5MzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzMiA9IDkzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTMzID0gOTMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzQgPSA5MzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzNSA9IDkzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTM2ID0gOTM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzcgPSA5MzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzOCA9IDkzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTM5ID0gOTM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDAgPSA5NDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0MSA9IDk0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQyID0gOTQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDMgPSA5NDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0NCA9IDk0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQ1ID0gOTQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDYgPSA5NDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0NyA9IDk0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQ4ID0gOTQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDkgPSA5NDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1MCA9IDk1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTUxID0gOTUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTIgPSA5NTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1MyA9IDk1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTU0ID0gOTU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTUgPSA5NTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1NiA9IDk1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTU3ID0gOTU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTggPSA5NTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1OSA9IDk1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTYwID0gOTYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjEgPSA5NjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2MiA9IDk2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTYzID0gOTYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjQgPSA5NjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2NSA9IDk2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTY2ID0gOTY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjcgPSA5NjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2OCA9IDk2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTY5ID0gOTY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzAgPSA5NzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3MSA9IDk3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTcyID0gOTcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzMgPSA5NzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3NCA9IDk3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTc1ID0gOTc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzYgPSA5NzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3NyA9IDk3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTc4ID0gOTc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzkgPSA5NzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4MCA9IDk4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTgxID0gOTgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODIgPSA5ODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4MyA9IDk4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTg0ID0gOTg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODUgPSA5ODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4NiA9IDk4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTg3ID0gOTg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODggPSA5ODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4OSA9IDk4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTkwID0gOTkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTEgPSA5OTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5MiA9IDk5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTkzID0gOTkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTQgPSA5OTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5NSA9IDk5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTk2ID0gOTk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTcgPSA5OTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKKyAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5OCA9IDk5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTk5ID0gOTk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07CisgIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDAwID0gMTAwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTMzZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8KQEAgLTAsMCArMSw2MSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gQSBwcm90byBmaWxlIHdoaWNoIGlzIGltcG9ydGVkIGJ5IHVuaXR0ZXN0LnByb3RvIHRvIHRlc3QgaW1wb3J0aW5nLgorCisKKy8vIFdlIGRvbid0IHB1dCB0aGlzIGluIGEgcGFja2FnZSB3aXRoaW4gcHJvdG8yIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUKKy8vIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGRvZXNuJ3QgZGVwZW5kIG9uIGJlaW5nIGluIHRoZSBwcm90bzIgbmFtZXNwYWNlLgorLy8gSW4gdGVzdF91dGlsLmggd2UgZG8KKy8vICJ1c2luZyBuYW1lc3BhY2UgdW5pdHRlc3RfaW1wb3J0ID0gcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0Ii4KK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OworCitvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CisKKy8vIEV4Y2VyY2lzZSB0aGUgamF2YV9wYWNrYWdlIG9wdGlvbi4KK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0IjsKKworLy8gRG8gbm90IHNldCBhIGphdmFfb3V0ZXJfY2xhc3NuYW1lIGhlcmUgdG8gdmVyaWZ5IHRoYXQgUHJvdG8yIHdvcmtzIHdpdGhvdXQKKy8vIG9uZS4KKworbWVzc2FnZSBJbXBvcnRNZXNzYWdlIHsKKyAgb3B0aW9uYWwgaW50MzIgZCA9IDE7Cit9CisKK2VudW0gSW1wb3J0RW51bSB7CisgIElNUE9SVF9GT08gPSA3OworICBJTVBPUlRfQkFSID0gODsKKyAgSU1QT1JUX0JBWiA9IDk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhYWI1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvCkBAIC0wLDAgKzEsNDkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vCisvLyBUaGlzIGlzIGxpa2UgdW5pdHRlc3RfaW1wb3J0LnByb3RvIGJ1dCB3aXRoIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRS4KKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7CisKK21lc3NhZ2UgSW1wb3J0TWVzc2FnZUxpdGUgeworICBvcHRpb25hbCBpbnQzMiBkID0gMTsKK30KKworZW51bSBJbXBvcnRFbnVtTGl0ZSB7CisgIElNUE9SVF9MSVRFX0ZPTyA9IDc7CisgIElNUE9SVF9MSVRFX0JBUiA9IDg7CisgIElNUE9SVF9MSVRFX0JBWiA9IDk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E2YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90bwpAQCAtMCwwICsxLDMxMiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFRoaXMgaXMgbGlrZSB1bml0dGVzdC5wcm90byBidXQgd2l0aCBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUUuCisKK3BhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CisKK2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvIjsKKworb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKKworLy8gU2FtZSBhcyBUZXN0QWxsVHlwZXMgYnV0IHdpdGggdGhlIGxpdGUgcnVudGltZS4KK21lc3NhZ2UgVGVzdEFsbFR5cGVzTGl0ZSB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgb3B0aW9uYWwgaW50MzIgYmIgPSAxOworICB9CisKKyAgZW51bSBOZXN0ZWRFbnVtIHsKKyAgICBGT08gPSAxOworICAgIEJBUiA9IDI7CisgICAgQkFaID0gMzsKKyAgfQorCisgIC8vIFNpbmd1bGFyCisgIG9wdGlvbmFsICAgIGludDMyIG9wdGlvbmFsX2ludDMyICAgID0gIDE7CisgIG9wdGlvbmFsICAgIGludDY0IG9wdGlvbmFsX2ludDY0ICAgID0gIDI7CisgIG9wdGlvbmFsICAgdWludDMyIG9wdGlvbmFsX3VpbnQzMiAgID0gIDM7CisgIG9wdGlvbmFsICAgdWludDY0IG9wdGlvbmFsX3VpbnQ2NCAgID0gIDQ7CisgIG9wdGlvbmFsICAgc2ludDMyIG9wdGlvbmFsX3NpbnQzMiAgID0gIDU7CisgIG9wdGlvbmFsICAgc2ludDY0IG9wdGlvbmFsX3NpbnQ2NCAgID0gIDY7CisgIG9wdGlvbmFsICBmaXhlZDMyIG9wdGlvbmFsX2ZpeGVkMzIgID0gIDc7CisgIG9wdGlvbmFsICBmaXhlZDY0IG9wdGlvbmFsX2ZpeGVkNjQgID0gIDg7CisgIG9wdGlvbmFsIHNmaXhlZDMyIG9wdGlvbmFsX3NmaXhlZDMyID0gIDk7CisgIG9wdGlvbmFsIHNmaXhlZDY0IG9wdGlvbmFsX3NmaXhlZDY0ID0gMTA7CisgIG9wdGlvbmFsICAgIGZsb2F0IG9wdGlvbmFsX2Zsb2F0ICAgID0gMTE7CisgIG9wdGlvbmFsICAgZG91YmxlIG9wdGlvbmFsX2RvdWJsZSAgID0gMTI7CisgIG9wdGlvbmFsICAgICBib29sIG9wdGlvbmFsX2Jvb2wgICAgID0gMTM7CisgIG9wdGlvbmFsICAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZyAgID0gMTQ7CisgIG9wdGlvbmFsICAgIGJ5dGVzIG9wdGlvbmFsX2J5dGVzICAgID0gMTU7CisKKyAgb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cCA9IDE2IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gMTc7CisgIH0KKworICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlICAgICAgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgID0gMTg7CisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlTGl0ZSBvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgPSAxOTsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2VMaXRlCisgICAgb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgPSAyMDsKKworICBvcHRpb25hbCBOZXN0ZWRFbnVtICAgICAgb3B0aW9uYWxfbmVzdGVkX2VudW0gICAgID0gMjE7CisgIG9wdGlvbmFsIEZvcmVpZ25FbnVtTGl0ZSBvcHRpb25hbF9mb3JlaWduX2VudW0gICAgPSAyMjsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1MaXRlIG9wdGlvbmFsX2ltcG9ydF9lbnVtID0gMjM7CisKKyAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZSA9IDI0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOworICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfY29yZCA9IDI1IFtjdHlwZT1DT1JEXTsKKworICAvLyBSZXBlYXRlZAorICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9IDMxOworICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NCAgICA9IDMyOworICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9IDMzOworICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9IDM0OworICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgICA9IDM1OworICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9IDM2OworICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9IDM3OworICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ICA9IDM4OworICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OworICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOworICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdCAgICA9IDQxOworICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDQyOworICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDQzOworICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmcgICA9IDQ0OworICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlcyAgICA9IDQ1OworCisgIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXAgPSA0NiB7CisgICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OworICB9CisKKyAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSAgICAgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICA9IDQ4OworICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZUxpdGUgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlID0gNDk7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlTGl0ZQorICAgIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlID0gNTA7CisKKyAgcmVwZWF0ZWQgTmVzdGVkRW51bSAgICAgIHJlcGVhdGVkX25lc3RlZF9lbnVtICA9IDUxOworICByZXBlYXRlZCBGb3JlaWduRW51bUxpdGUgcmVwZWF0ZWRfZm9yZWlnbl9lbnVtID0gNTI7CisgIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTGl0ZSByZXBlYXRlZF9pbXBvcnRfZW51bSA9IDUzOworCisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfcGllY2UgPSA1NCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKKyAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX2NvcmQgPSA1NSBbY3R5cGU9Q09SRF07CisKKyAgLy8gU2luZ3VsYXIgd2l0aCBkZWZhdWx0cworICBvcHRpb25hbCAgICBpbnQzMiBkZWZhdWx0X2ludDMyICAgID0gNjEgW2RlZmF1bHQgPSAgNDEgICAgXTsKKyAgb3B0aW9uYWwgICAgaW50NjQgZGVmYXVsdF9pbnQ2NCAgICA9IDYyIFtkZWZhdWx0ID0gIDQyICAgIF07CisgIG9wdGlvbmFsICAgdWludDMyIGRlZmF1bHRfdWludDMyICAgPSA2MyBbZGVmYXVsdCA9ICA0MyAgICBdOworICBvcHRpb25hbCAgIHVpbnQ2NCBkZWZhdWx0X3VpbnQ2NCAgID0gNjQgW2RlZmF1bHQgPSAgNDQgICAgXTsKKyAgb3B0aW9uYWwgICBzaW50MzIgZGVmYXVsdF9zaW50MzIgICA9IDY1IFtkZWZhdWx0ID0gLTQ1ICAgIF07CisgIG9wdGlvbmFsICAgc2ludDY0IGRlZmF1bHRfc2ludDY0ICAgPSA2NiBbZGVmYXVsdCA9ICA0NiAgICBdOworICBvcHRpb25hbCAgZml4ZWQzMiBkZWZhdWx0X2ZpeGVkMzIgID0gNjcgW2RlZmF1bHQgPSAgNDcgICAgXTsKKyAgb3B0aW9uYWwgIGZpeGVkNjQgZGVmYXVsdF9maXhlZDY0ICA9IDY4IFtkZWZhdWx0ID0gIDQ4ICAgIF07CisgIG9wdGlvbmFsIHNmaXhlZDMyIGRlZmF1bHRfc2ZpeGVkMzIgPSA2OSBbZGVmYXVsdCA9ICA0OSAgICBdOworICBvcHRpb25hbCBzZml4ZWQ2NCBkZWZhdWx0X3NmaXhlZDY0ID0gNzAgW2RlZmF1bHQgPSAtNTAgICAgXTsKKyAgb3B0aW9uYWwgICAgZmxvYXQgZGVmYXVsdF9mbG9hdCAgICA9IDcxIFtkZWZhdWx0ID0gIDUxLjUgIF07CisgIG9wdGlvbmFsICAgZG91YmxlIGRlZmF1bHRfZG91YmxlICAgPSA3MiBbZGVmYXVsdCA9ICA1MmUzICBdOworICBvcHRpb25hbCAgICAgYm9vbCBkZWZhdWx0X2Jvb2wgICAgID0gNzMgW2RlZmF1bHQgPSB0cnVlICAgXTsKKyAgb3B0aW9uYWwgICBzdHJpbmcgZGVmYXVsdF9zdHJpbmcgICA9IDc0IFtkZWZhdWx0ID0gImhlbGxvIl07CisgIG9wdGlvbmFsICAgIGJ5dGVzIGRlZmF1bHRfYnl0ZXMgICAgPSA3NSBbZGVmYXVsdCA9ICJ3b3JsZCJdOworCisgIG9wdGlvbmFsIE5lc3RlZEVudW0gZGVmYXVsdF9uZXN0ZWRfZW51bSA9IDgxIFtkZWZhdWx0ID0gQkFSXTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW1MaXRlIGRlZmF1bHRfZm9yZWlnbl9lbnVtID0gODIKKyAgICAgIFtkZWZhdWx0ID0gRk9SRUlHTl9MSVRFX0JBUl07CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTGl0ZQorICAgICAgZGVmYXVsdF9pbXBvcnRfZW51bSA9IDgzIFtkZWZhdWx0ID0gSU1QT1JUX0xJVEVfQkFSXTsKKworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9zdHJpbmdfcGllY2UgPSA4NCBbY3R5cGU9U1RSSU5HX1BJRUNFLGRlZmF1bHQ9ImFiYyJdOworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9jb3JkID0gODUgW2N0eXBlPUNPUkQsZGVmYXVsdD0iMTIzIl07Cit9CisKK21lc3NhZ2UgRm9yZWlnbk1lc3NhZ2VMaXRlIHsKKyAgb3B0aW9uYWwgaW50MzIgYyA9IDE7Cit9CisKK2VudW0gRm9yZWlnbkVudW1MaXRlIHsKKyAgRk9SRUlHTl9MSVRFX0ZPTyA9IDQ7CisgIEZPUkVJR05fTElURV9CQVIgPSA1OworICBGT1JFSUdOX0xJVEVfQkFaID0gNjsKK30KKworbWVzc2FnZSBUZXN0UGFja2VkVHlwZXNMaXRlIHsKKyAgcmVwZWF0ZWQgICAgaW50MzIgcGFja2VkX2ludDMyICAgID0gIDkwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgaW50NjQgcGFja2VkX2ludDY0ICAgID0gIDkxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICB1aW50MzIgcGFja2VkX3VpbnQzMiAgID0gIDkyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICB1aW50NjQgcGFja2VkX3VpbnQ2NCAgID0gIDkzIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBzaW50MzIgcGFja2VkX3NpbnQzMiAgID0gIDk0IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgcGFja2VkX3NpbnQ2NCAgID0gIDk1IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkMzIgcGFja2VkX2ZpeGVkMzIgID0gIDk2IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgIGZpeGVkNjQgcGFja2VkX2ZpeGVkNjQgID0gIDk3IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgcGFja2VkX3NmaXhlZDMyID0gIDk4IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkNjQgcGFja2VkX3NmaXhlZDY0ID0gIDk5IFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgZmxvYXQgcGFja2VkX2Zsb2F0ICAgID0gMTAwIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgcGFja2VkX2RvdWJsZSAgID0gMTAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgICAgIGJvb2wgcGFja2VkX2Jvb2wgICAgID0gMTAyIFtwYWNrZWQgPSB0cnVlXTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW1MaXRlIHBhY2tlZF9lbnVtICA9IDEwMyBbcGFja2VkID0gdHJ1ZV07Cit9CisKK21lc3NhZ2UgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIHsKKyAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKK30KKworZXh0ZW5kIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSB7CisgIC8vIFNpbmd1bGFyCisgIG9wdGlvbmFsICAgIGludDMyIG9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl9saXRlICAgID0gIDE7CisgIG9wdGlvbmFsICAgIGludDY0IG9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl9saXRlICAgID0gIDI7CisgIG9wdGlvbmFsICAgdWludDMyIG9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gIDM7CisgIG9wdGlvbmFsICAgdWludDY0IG9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gIDQ7CisgIG9wdGlvbmFsICAgc2ludDMyIG9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gIDU7CisgIG9wdGlvbmFsICAgc2ludDY0IG9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gIDY7CisgIG9wdGlvbmFsICBmaXhlZDMyIG9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgID0gIDc7CisgIG9wdGlvbmFsICBmaXhlZDY0IG9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgID0gIDg7CisgIG9wdGlvbmFsIHNmaXhlZDMyIG9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlID0gIDk7CisgIG9wdGlvbmFsIHNmaXhlZDY0IG9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlID0gMTA7CisgIG9wdGlvbmFsICAgIGZsb2F0IG9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgID0gMTE7CisgIG9wdGlvbmFsICAgZG91YmxlIG9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgID0gMTI7CisgIG9wdGlvbmFsICAgICBib29sIG9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgID0gMTM7CisgIG9wdGlvbmFsICAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgID0gMTQ7CisgIG9wdGlvbmFsICAgIGJ5dGVzIG9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgID0gMTU7CisKKyAgb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cF9leHRlbnNpb25fbGl0ZSA9IDE2IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gMTc7CisgIH0KKworICBvcHRpb25hbCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUKKyAgICAgID0gMTg7CisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlTGl0ZSBvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgPSAxOTsKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2VMaXRlCisgICAgb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgPSAyMDsKKworICBvcHRpb25hbCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0gb3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSAyMTsKKyAgb3B0aW9uYWwgRm9yZWlnbkVudW1MaXRlIG9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSA9IDIyOworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bUxpdGUKKyAgICBvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDIzOworCisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uX2xpdGUgPSAyNAorICAgICAgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9jb3JkX2V4dGVuc2lvbl9saXRlID0gMjUgW2N0eXBlPUNPUkRdOworCisgIC8vIFJlcGVhdGVkCisgIHJlcGVhdGVkICAgIGludDMyIHJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgID0gMzE7CisgIHJlcGVhdGVkICAgIGludDY0IHJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgID0gMzI7CisgIHJlcGVhdGVkICAgdWludDMyIHJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gMzM7CisgIHJlcGVhdGVkICAgdWludDY0IHJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gMzQ7CisgIHJlcGVhdGVkICAgc2ludDMyIHJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gMzU7CisgIHJlcGVhdGVkICAgc2ludDY0IHJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gMzY7CisgIHJlcGVhdGVkICBmaXhlZDMyIHJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgID0gMzc7CisgIHJlcGVhdGVkICBmaXhlZDY0IHJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgID0gMzg7CisgIHJlcGVhdGVkIHNmaXhlZDMyIHJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlID0gMzk7CisgIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlID0gNDA7CisgIHJlcGVhdGVkICAgIGZsb2F0IHJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgID0gNDE7CisgIHJlcGVhdGVkICAgZG91YmxlIHJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgID0gNDI7CisgIHJlcGVhdGVkICAgICBib29sIHJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgID0gNDM7CisgIHJlcGVhdGVkICAgc3RyaW5nIHJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgID0gNDQ7CisgIHJlcGVhdGVkICAgIGJ5dGVzIHJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgID0gNDU7CisKKyAgcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZSA9IDQ2IHsKKyAgICBvcHRpb25hbCBpbnQzMiBhID0gNDc7CisgIH0KKworICByZXBlYXRlZCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUKKyAgICAgID0gNDg7CisgIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlTGl0ZSByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgPSA0OTsKKyAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2VMaXRlCisgICAgcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgPSA1MDsKKworICByZXBlYXRlZCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0gcmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSA1MTsKKyAgcmVwZWF0ZWQgRm9yZWlnbkVudW1MaXRlIHJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSA9IDUyOworICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bUxpdGUKKyAgICByZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDUzOworCisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uX2xpdGUgPSA1NAorICAgICAgW2N0eXBlPVNUUklOR19QSUVDRV07CisgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkX2V4dGVuc2lvbl9saXRlID0gNTUgW2N0eXBlPUNPUkRdOworCisgIC8vIFNpbmd1bGFyIHdpdGggZGVmYXVsdHMKKyAgb3B0aW9uYWwgICAgaW50MzIgZGVmYXVsdF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICA9IDYxIFtkZWZhdWx0ID0gIDQxICAgIF07CisgIG9wdGlvbmFsICAgIGludDY0IGRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAgPSA2MiBbZGVmYXVsdCA9ICA0MiAgICBdOworICBvcHRpb25hbCAgIHVpbnQzMiBkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gNjMgW2RlZmF1bHQgPSAgNDMgICAgXTsKKyAgb3B0aW9uYWwgICB1aW50NjQgZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICA9IDY0IFtkZWZhdWx0ID0gIDQ0ICAgIF07CisgIG9wdGlvbmFsICAgc2ludDMyIGRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAgPSA2NSBbZGVmYXVsdCA9IC00NSAgICBdOworICBvcHRpb25hbCAgIHNpbnQ2NCBkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gNjYgW2RlZmF1bHQgPSAgNDYgICAgXTsKKyAgb3B0aW9uYWwgIGZpeGVkMzIgZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICA9IDY3IFtkZWZhdWx0ID0gIDQ3ICAgIF07CisgIG9wdGlvbmFsICBmaXhlZDY0IGRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAgPSA2OCBbZGVmYXVsdCA9ICA0OCAgICBdOworICBvcHRpb25hbCBzZml4ZWQzMiBkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlID0gNjkgW2RlZmF1bHQgPSAgNDkgICAgXTsKKyAgb3B0aW9uYWwgc2ZpeGVkNjQgZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSA9IDcwIFtkZWZhdWx0ID0gLTUwICAgIF07CisgIG9wdGlvbmFsICAgIGZsb2F0IGRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAgPSA3MSBbZGVmYXVsdCA9ICA1MS41ICBdOworICBvcHRpb25hbCAgIGRvdWJsZSBkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgID0gNzIgW2RlZmF1bHQgPSAgNTJlMyAgXTsKKyAgb3B0aW9uYWwgICAgIGJvb2wgZGVmYXVsdF9ib29sX2V4dGVuc2lvbl9saXRlICAgICA9IDczIFtkZWZhdWx0ID0gdHJ1ZSAgIF07CisgIG9wdGlvbmFsICAgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAgPSA3NCBbZGVmYXVsdCA9ICJoZWxsbyJdOworICBvcHRpb25hbCAgICBieXRlcyBkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlICAgID0gNzUgW2RlZmF1bHQgPSAid29ybGQiXTsKKworICBvcHRpb25hbCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0KKyAgICBkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlID0gODEgW2RlZmF1bHQgPSBCQVJdOworICBvcHRpb25hbCBGb3JlaWduRW51bUxpdGUKKyAgICBkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSA9IDgyIFtkZWZhdWx0ID0gRk9SRUlHTl9MSVRFX0JBUl07CisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTGl0ZQorICAgIGRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgPSA4MyBbZGVmYXVsdCA9IElNUE9SVF9MSVRFX0JBUl07CisKKyAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl9saXRlID0gODQgW2N0eXBlPVNUUklOR19QSUVDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImFiYyJdOworICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9jb3JkX2V4dGVuc2lvbl9saXRlID0gODUgW2N0eXBlPUNPUkQsIGRlZmF1bHQ9IjEyMyJdOworfQorCittZXNzYWdlIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK2V4dGVuZCBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgeworICByZXBlYXRlZCAgICBpbnQzMiBwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAgPSAgOTAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICBpbnQ2NCBwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAgPSAgOTEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHVpbnQzMiBwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAgPSAgOTIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHVpbnQ2NCBwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAgPSAgOTMgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHNpbnQzMiBwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAgPSAgOTQgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIHNpbnQ2NCBwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAgPSAgOTUgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgZml4ZWQzMiBwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAgPSAgOTYgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgZml4ZWQ2NCBwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAgPSAgOTcgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQzMiBwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgPSAgOTggW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBzZml4ZWQ2NCBwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgPSAgOTkgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICBmbG9hdCBwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAgPSAxMDAgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgIGRvdWJsZSBwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAgPSAxMDEgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCAgICAgYm9vbCBwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAgPSAxMDIgW3BhY2tlZCA9IHRydWVdOworICByZXBlYXRlZCBGb3JlaWduRW51bUxpdGUgcGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSAxMDMgW3BhY2tlZCA9IHRydWVdOworfQorCittZXNzYWdlIFRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlIHsKKyAgZXh0ZW5kIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSB7CisgICAgb3B0aW9uYWwgaW50MzIgbmVzdGVkX2V4dGVuc2lvbiA9IDEyMzQ1OworICB9Cit9CisKKy8vIFRlc3QgdGhhdCBkZXByZWNhdGVkIGZpZWxkcyB3b3JrLiAgV2Ugb25seSB2ZXJpZnkgdGhhdCB0aGV5IGNvbXBpbGUgKGF0IG9uZQorLy8gcG9pbnQgdGhpcyBmYWlsZWQpLgorbWVzc2FnZSBUZXN0RGVwcmVjYXRlZExpdGUgeworICBvcHRpb25hbCBpbnQzMiBkZXByZWNhdGVkX2ZpZWxkID0gMSBbZGVwcmVjYXRlZCA9IHRydWVdOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTJjYjhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8KQEAgLTAsMCArMSw0MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQorLy8KKy8vIFRlc3RzIHRoYXQgYSAibGl0ZSIgbWVzc2FnZSBjYW4gaW1wb3J0IGEgcmVndWxhciBtZXNzYWdlLgorCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCitpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byI7CisKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK21lc3NhZ2UgVGVzdExpdGVJbXBvcnRzTm9ubGl0ZSB7CisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTdmMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvCkBAIC0wLDAgKzEsNzIgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBtZXNzYWdlcyBmb3IgdGVzdGluZyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdC4KKworcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKworb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOworCisvLyBBIG1lc3NhZ2Ugd2l0aCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdC4KK21lc3NhZ2UgVGVzdE1lc3NhZ2VTZXQgeworICBvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlOworICBleHRlbnNpb25zIDQgdG8gbWF4OworfQorCittZXNzYWdlIFRlc3RNZXNzYWdlU2V0Q29udGFpbmVyIHsKKyAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQgPSAxOworfQorCittZXNzYWdlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSB7CisgIGV4dGVuZCBUZXN0TWVzc2FnZVNldCB7CisgICAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiA9IDE1NDUwMDg7CisgIH0KKyAgb3B0aW9uYWwgaW50MzIgaSA9IDE1OworfQorCittZXNzYWdlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiB7CisgIGV4dGVuZCBUZXN0TWVzc2FnZVNldCB7CisgICAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiA9IDE1NDc3Njk7CisgIH0KKyAgb3B0aW9uYWwgc3RyaW5nIHN0ciA9IDI1OworfQorCisvLyBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0IGlzIGVxdWl2YWxlbnQgdG8gdGhpcy4KK21lc3NhZ2UgUmF3TWVzc2FnZVNldCB7CisgIHJlcGVhdGVkIGdyb3VwIEl0ZW0gPSAxIHsKKyAgICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKKyAgICByZXF1aXJlZCBieXRlcyBtZXNzYWdlID0gMzsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmZiNDEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90bwpAQCAtMCwwICsxLDUyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisKK3BhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLm5vX2dlbmVyaWNfc2VydmljZXNfdGVzdDsKKworLy8gKl9nZW5lcmljX3NlcnZpY2VzIGFyZSBmYWxzZSBieSBkZWZhdWx0LgorCittZXNzYWdlIFRlc3RNZXNzYWdlIHsKKyAgb3B0aW9uYWwgaW50MzIgYSA9IDE7CisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Cit9CisKK2VudW0gVGVzdEVudW0geworICBGT08gPSAxOworfQorCitleHRlbmQgVGVzdE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQzMiB0ZXN0X2V4dGVuc2lvbiA9IDEwMDA7Cit9CisKK3NlcnZpY2UgVGVzdFNlcnZpY2UgeworICBycGMgRm9vKFRlc3RNZXNzYWdlKSByZXR1cm5zKFRlc3RNZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWVjYmVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvCkBAIC0wLDAgKzEsNjEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorLy8KKy8vIEEgcHJvdG8gZmlsZSB3aGljaCB1c2VzIG9wdGltaXplX2ZvciA9IENPREVfU0laRS4KKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iOworCitwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworCitvcHRpb24gb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFOworCittZXNzYWdlIFRlc3RPcHRpbWl6ZWRGb3JTaXplIHsKKyAgb3B0aW9uYWwgaW50MzIgaSA9IDE7CisgIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlIG1zZyA9IDE5OworCisgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisKKyAgZXh0ZW5kIFRlc3RPcHRpbWl6ZWRGb3JTaXplIHsKKyAgICBvcHRpb25hbCBpbnQzMiB0ZXN0X2V4dGVuc2lvbiA9IDEyMzQ7CisgICAgb3B0aW9uYWwgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSB0ZXN0X2V4dGVuc2lvbjIgPSAxMjM1OworICB9Cit9CisKK21lc3NhZ2UgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSB7CisgIHJlcXVpcmVkIGludDMyIHggPSAxOworfQorIAorbWVzc2FnZSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplIHsKKyAgb3B0aW9uYWwgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSBvID0gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhMzZkNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjCkBAIC0wLDAgKzEsMjIwIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCitpbnQgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZihjb25zdCBzdHJpbmcmIHN0cikgeworICBjb25zdCB2b2lkKiBzdGFydCA9ICZzdHI7CisgIGNvbnN0IHZvaWQqIGVuZCA9ICZzdHIgKyAxOworCisgIGlmIChzdGFydCA8PSBzdHIuZGF0YSgpICYmIHN0ci5kYXRhKCkgPD0gZW5kKSB7CisgICAgLy8gVGhlIHN0cmluZydzIGRhdGEgaXMgc3RvcmVkIGluc2lkZSB0aGUgc3RyaW5nIG9iamVjdCBpdHNlbGYuCisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHN0ci5jYXBhY2l0eSgpOworICB9Cit9CisKK30KKworVW5rbm93bkZpZWxkU2V0OjpVbmtub3duRmllbGRTZXQoKQorICA6IGZpZWxkc18oTlVMTCkge30KKworVW5rbm93bkZpZWxkU2V0Ojp+VW5rbm93bkZpZWxkU2V0KCkgeworICBDbGVhcigpOworICBkZWxldGUgZmllbGRzXzsKK30KKwordm9pZCBVbmtub3duRmllbGRTZXQ6OkNsZWFyRmFsbGJhY2soKSB7CisgIEdPT0dMRV9EQ0hFQ0soZmllbGRzXyAhPSBOVUxMKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHNfLT5zaXplKCk7IGkrKykgeworICAgICgqZmllbGRzXylbaV0uRGVsZXRlKCk7CisgIH0KKyAgZmllbGRzXy0+Y2xlYXIoKTsKK30KKwordm9pZCBVbmtub3duRmllbGRTZXQ6Ok1lcmdlRnJvbShjb25zdCBVbmtub3duRmllbGRTZXQmIG90aGVyKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXIuZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgQWRkRmllbGQob3RoZXIuZmllbGQoaSkpOworICB9Cit9CisKK2ludCBVbmtub3duRmllbGRTZXQ6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdCB7CisgIGlmIChmaWVsZHNfID09IE5VTEwpIHJldHVybiAwOworCisgIGludCB0b3RhbF9zaXplID0gc2l6ZW9mKCpmaWVsZHNfKSArIHNpemVvZihVbmtub3duRmllbGQpICogZmllbGRzXy0+c2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkc18tPnNpemUoKTsgaSsrKSB7CisgICAgY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCA9ICgqZmllbGRzXylbaV07CisgICAgc3dpdGNoIChmaWVsZC50eXBlKCkpIHsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6CisgICAgICAgIHRvdGFsX3NpemUgKz0gc2l6ZW9mKCpmaWVsZC5sZW5ndGhfZGVsaW1pdGVkXykgKworICAgICAgICAgIGludGVybmFsOjpTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCpmaWVsZC5sZW5ndGhfZGVsaW1pdGVkXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6CisgICAgICAgIHRvdGFsX3NpemUgKz0gZmllbGQuZ3JvdXBfLT5TcGFjZVVzZWQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK2ludCBVbmtub3duRmllbGRTZXQ6OlNwYWNlVXNlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHNpemVvZigqdGhpcykgKyBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCk7Cit9CisKK3ZvaWQgVW5rbm93bkZpZWxkU2V0OjpBZGRWYXJpbnQoaW50IG51bWJlciwgdWludDY0IHZhbHVlKSB7CisgIGlmIChmaWVsZHNfID09IE5VTEwpIGZpZWxkc18gPSBuZXcgdmVjdG9yPFVua25vd25GaWVsZD47CisgIFVua25vd25GaWVsZCBmaWVsZDsKKyAgZmllbGQubnVtYmVyXyA9IG51bWJlcjsKKyAgZmllbGQudHlwZV8gPSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UOworICBmaWVsZC52YXJpbnRfID0gdmFsdWU7CisgIGZpZWxkc18tPnB1c2hfYmFjayhmaWVsZCk7Cit9CisKK3ZvaWQgVW5rbm93bkZpZWxkU2V0OjpBZGRGaXhlZDMyKGludCBudW1iZXIsIHVpbnQzMiB2YWx1ZSkgeworICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+OworICBVbmtub3duRmllbGQgZmllbGQ7CisgIGZpZWxkLm51bWJlcl8gPSBudW1iZXI7CisgIGZpZWxkLnR5cGVfID0gVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI7CisgIGZpZWxkLmZpeGVkMzJfID0gdmFsdWU7CisgIGZpZWxkc18tPnB1c2hfYmFjayhmaWVsZCk7Cit9CisKK3ZvaWQgVW5rbm93bkZpZWxkU2V0OjpBZGRGaXhlZDY0KGludCBudW1iZXIsIHVpbnQ2NCB2YWx1ZSkgeworICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+OworICBVbmtub3duRmllbGQgZmllbGQ7CisgIGZpZWxkLm51bWJlcl8gPSBudW1iZXI7CisgIGZpZWxkLnR5cGVfID0gVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVENjQ7CisgIGZpZWxkLmZpeGVkNjRfID0gdmFsdWU7CisgIGZpZWxkc18tPnB1c2hfYmFjayhmaWVsZCk7Cit9CisKK3N0cmluZyogVW5rbm93bkZpZWxkU2V0OjpBZGRMZW5ndGhEZWxpbWl0ZWQoaW50IG51bWJlcikgeworICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+OworICBVbmtub3duRmllbGQgZmllbGQ7CisgIGZpZWxkLm51bWJlcl8gPSBudW1iZXI7CisgIGZpZWxkLnR5cGVfID0gVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ7CisgIGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfID0gbmV3IHN0cmluZzsKKyAgZmllbGRzXy0+cHVzaF9iYWNrKGZpZWxkKTsKKyAgcmV0dXJuIGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfOworfQorCitVbmtub3duRmllbGRTZXQqIFVua25vd25GaWVsZFNldDo6QWRkR3JvdXAoaW50IG51bWJlcikgeworICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+OworICBVbmtub3duRmllbGQgZmllbGQ7CisgIGZpZWxkLm51bWJlcl8gPSBudW1iZXI7CisgIGZpZWxkLnR5cGVfID0gVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOworICBmaWVsZC5ncm91cF8gPSBuZXcgVW5rbm93bkZpZWxkU2V0OworICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOworICByZXR1cm4gZmllbGQuZ3JvdXBfOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6QWRkRmllbGQoY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCkgeworICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+OworICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOworICBmaWVsZHNfLT5iYWNrKCkuRGVlcENvcHkoKTsKK30KKworYm9vbCBVbmtub3duRmllbGRTZXQ6Ok1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworCisgIFVua25vd25GaWVsZFNldCBvdGhlcjsKKyAgaWYgKGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcE1lc3NhZ2UoaW5wdXQsICZvdGhlcikgJiYKKyAgICAgIGlucHV0LT5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSkgeworICAgIE1lcmdlRnJvbShvdGhlcik7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgVW5rbm93bkZpZWxkU2V0OjpQYXJzZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgQ2xlYXIoKTsKKyAgcmV0dXJuIE1lcmdlRnJvbUNvZGVkU3RyZWFtKGlucHV0KTsKK30KKworYm9vbCBVbmtub3duRmllbGRTZXQ6OlBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCkgeworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dChpbnB1dCk7CisgIHJldHVybiBQYXJzZUZyb21Db2RlZFN0cmVhbSgmY29kZWRfaW5wdXQpICYmCisgICAgY29kZWRfaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCk7Cit9CisKK2Jvb2wgVW5rbm93bkZpZWxkU2V0OjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgeworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dChkYXRhLCBzaXplKTsKKyAgcmV0dXJuIFBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKCZpbnB1dCk7Cit9CisKK3ZvaWQgVW5rbm93bkZpZWxkOjpEZWxldGUoKSB7CisgIHN3aXRjaCAodHlwZSgpKSB7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgIGRlbGV0ZSBsZW5ndGhfZGVsaW1pdGVkXzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgorICAgICAgZGVsZXRlIGdyb3VwXzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIFVua25vd25GaWVsZDo6RGVlcENvcHkoKSB7CisgIHN3aXRjaCAodHlwZSgpKSB7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgIGxlbmd0aF9kZWxpbWl0ZWRfID0gbmV3IHN0cmluZygqbGVuZ3RoX2RlbGltaXRlZF8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6IHsKKyAgICAgIFVua25vd25GaWVsZFNldCogZ3JvdXAgPSBuZXcgVW5rbm93bkZpZWxkU2V0OworICAgICAgZ3JvdXAtPk1lcmdlRnJvbSgqZ3JvdXBfKTsKKyAgICAgIGdyb3VwXyA9IGdyb3VwOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YzJlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oCkBAIC0wLDAgKzEsMjY4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBDb250YWlucyBjbGFzc2VzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB1bnJlY29nbml6ZWQgZmllbGRzIHNlZW4gd2hpbGUKKy8vIHBhcnNpbmcgYSBwcm90b2NvbCBtZXNzYWdlLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9VTktOT1dOX0ZJRUxEX1NFVF9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1VOS05PV05fRklFTERfU0VUX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitjbGFzcyBNZXNzYWdlOyAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlLmgKK2NsYXNzIFVua25vd25GaWVsZDsgICAgICAgICAgICAgICAgIC8vIGJlbG93CisKKy8vIEFuIFVua25vd25GaWVsZFNldCBjb250YWlucyBmaWVsZHMgdGhhdCB3ZXJlIGVuY291bnRlcmVkIHdoaWxlIHBhcnNpbmcgYQorLy8gbWVzc2FnZSBidXQgd2VyZSBub3QgZGVmaW5lZCBieSBpdHMgdHlwZS4gIEtlZXBpbmcgdHJhY2sgb2YgdGhlc2UgY2FuIGJlCisvLyB1c2VmdWwsIGVzcGVjaWFsbHkgaW4gdGhhdCB0aGV5IG1heSBiZSB3cml0dGVuIGlmIHRoZSBtZXNzYWdlIGlzIHNlcmlhbGl6ZWQKKy8vIGFnYWluIHdpdGhvdXQgYmVpbmcgY2xlYXJlZCBpbiBiZXR3ZWVuLiAgVGhpcyBtZWFucyB0aGF0IHNvZnR3YXJlIHdoaWNoCisvLyBzaW1wbHkgcmVjZWl2ZXMgbWVzc2FnZXMgYW5kIGZvcndhcmRzIHRoZW0gdG8gb3RoZXIgc2VydmVycyBkb2VzIG5vdCBuZWVkCisvLyB0byBiZSB1cGRhdGVkIGV2ZXJ5IHRpbWUgYSBuZXcgZmllbGQgaXMgYWRkZWQgdG8gdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbi4KKy8vCisvLyBUbyBnZXQgdGhlIFVua25vd25GaWVsZFNldCBhdHRhY2hlZCB0byBhbnkgbWVzc2FnZSwgY2FsbAorLy8gUmVmbGVjdGlvbjo6R2V0VW5rbm93bkZpZWxkcygpLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgbmVjZXNzYXJpbHkgdGllZCB0byB0aGUgcHJvdG9jb2wgYnVmZmVyIHdpcmUgZm9ybWF0LCB1bmxpa2UKKy8vIHRoZSBSZWZsZWN0aW9uIGludGVyZmFjZSB3aGljaCBpcyBpbmRlcGVuZGVudCBvZiBhbnkgc2VyaWFsaXphdGlvbiBzY2hlbWUuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgVW5rbm93bkZpZWxkU2V0IHsKKyBwdWJsaWM6CisgIFVua25vd25GaWVsZFNldCgpOworICB+VW5rbm93bkZpZWxkU2V0KCk7CisKKyAgLy8gUmVtb3ZlIGFsbCBmaWVsZHMuCisgIGlubGluZSB2b2lkIENsZWFyKCk7CisKKyAgLy8gSXMgdGhpcyBzZXQgZW1wdHk/CisgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3Q7CisKKyAgLy8gTWVyZ2UgdGhlIGNvbnRlbnRzIG9mIHNvbWUgb3RoZXIgVW5rbm93bkZpZWxkU2V0IHdpdGggdGhpcyBvbmUuCisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFVua25vd25GaWVsZFNldCYgb3RoZXIpOworCisgIC8vIFN3YXBzIHRoZSBjb250ZW50cyBvZiBzb21lIG90aGVyIFVua25vd25GaWVsZFNldCB3aXRoIHRoaXMgb25lLgorICBpbmxpbmUgdm9pZCBTd2FwKFVua25vd25GaWVsZFNldCogeCk7CisKKyAgLy8gQ29tcHV0ZXMgKGFuIGVzdGltYXRlIG9mKSB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSB1c2VkIGZvcgorICAvLyBzdG9yaW5nIHRoZSB1bmtub3duIGZpZWxkcyBpbiBtZW1vcnkuIERvZXMgTk9UIGluY2x1ZGUKKyAgLy8gc2l6ZW9mKCp0aGlzKSBpbiB0aGUgY2FsY3VsYXRpb24uCisgIGludCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3Q7CisKKyAgLy8gVmVyc2lvbiBvZiBTcGFjZVVzZWQoKSBpbmNsdWRpbmcgc2l6ZW9mKCp0aGlzKS4KKyAgaW50IFNwYWNlVXNlZCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWVsZHMgcHJlc2VudCBpbiB0aGUgVW5rbm93bkZpZWxkU2V0LgorICBpbmxpbmUgaW50IGZpZWxkX2NvdW50KCkgY29uc3Q7CisgIC8vIEdldCBhIGZpZWxkIGluIHRoZSBzZXQsIHdoZXJlIDAgPD0gaW5kZXggPCBmaWVsZF9jb3VudCgpLiAgVGhlIGZpZWxkcworICAvLyBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZC4KKyAgaW5saW5lIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQoaW50IGluZGV4KSBjb25zdDsKKyAgLy8gR2V0IGEgbXV0YWJsZSBwb2ludGVyIHRvIGEgZmllbGQgaW4gdGhlIHNldCwgd2hlcmUKKyAgLy8gMCA8PSBpbmRleCA8IGZpZWxkX2NvdW50KCkuICBUaGUgZmllbGRzIGFwcGVhciBpbiB0aGUgb3JkZXIgaW4gd2hpY2gKKyAgLy8gdGhleSB3ZXJlIGFkZGVkLgorICBpbmxpbmUgVW5rbm93bkZpZWxkKiBtdXRhYmxlX2ZpZWxkKGludCBpbmRleCk7CisKKyAgLy8gQWRkaW5nIGZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICB2b2lkIEFkZFZhcmludChpbnQgbnVtYmVyLCB1aW50NjQgdmFsdWUpOworICB2b2lkIEFkZEZpeGVkMzIoaW50IG51bWJlciwgdWludDMyIHZhbHVlKTsKKyAgdm9pZCBBZGRGaXhlZDY0KGludCBudW1iZXIsIHVpbnQ2NCB2YWx1ZSk7CisgIHZvaWQgQWRkTGVuZ3RoRGVsaW1pdGVkKGludCBudW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUpOworICBzdHJpbmcqIEFkZExlbmd0aERlbGltaXRlZChpbnQgbnVtYmVyKTsKKyAgVW5rbm93bkZpZWxkU2V0KiBBZGRHcm91cChpbnQgbnVtYmVyKTsKKworICAvLyBBZGRzIGFuIHVua25vd24gZmllbGQgZnJvbSBhbm90aGVyIHNldC4KKyAgdm9pZCBBZGRGaWVsZChjb25zdCBVbmtub3duRmllbGQmIGZpZWxkKTsKKworICAvLyBQYXJzaW5nIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUaGVzZSB3b3JrIGV4YWN0bHkgbGlrZSB0aGUgc2ltaWxhcmx5LW5hbWVkIG1ldGhvZHMgb2YgTWVzc2FnZS4KKworICBib29sIE1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIGJvb2wgUGFyc2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgYm9vbCBQYXJzZUZyb21aZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOworICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKTsKKyAgaW5saW5lIGJvb2wgUGFyc2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgZGF0YSkgeworICAgIHJldHVybiBQYXJzZUZyb21BcnJheShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICB9CisKKyBwcml2YXRlOgorICB2b2lkIENsZWFyRmFsbGJhY2soKTsKKworICB2ZWN0b3I8VW5rbm93bkZpZWxkPiogZmllbGRzXzsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVW5rbm93bkZpZWxkU2V0KTsKK307CisKKy8vIFJlcHJlc2VudHMgb25lIGZpZWxkIGluIGFuIFVua25vd25GaWVsZFNldC4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBVbmtub3duRmllbGQgeworIHB1YmxpYzoKKyAgZW51bSBUeXBlIHsKKyAgICBUWVBFX1ZBUklOVCwKKyAgICBUWVBFX0ZJWEVEMzIsCisgICAgVFlQRV9GSVhFRDY0LAorICAgIFRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICBUWVBFX0dST1VQCisgIH07CisKKyAgLy8gVGhlIGZpZWxkJ3MgdGFnIG51bWJlciwgYXMgc2VlbiBvbiB0aGUgd2lyZS4KKyAgaW5saW5lIGludCBudW1iZXIoKSBjb25zdDsKKworICAvLyBUaGUgZmllbGQgdHlwZS4KKyAgaW5saW5lIFR5cGUgdHlwZSgpIGNvbnN0OworCisgIC8vIEFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEVhY2ggbWV0aG9kIHdvcmtzIG9ubHkgZm9yIFVua25vd25GaWVsZHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZS4KKworICBpbmxpbmUgdWludDY0IHZhcmludCgpIGNvbnN0OworICBpbmxpbmUgdWludDMyIGZpeGVkMzIoKSBjb25zdDsKKyAgaW5saW5lIHVpbnQ2NCBmaXhlZDY0KCkgY29uc3Q7CisgIGlubGluZSBjb25zdCBzdHJpbmcmIGxlbmd0aF9kZWxpbWl0ZWQoKSBjb25zdDsKKyAgaW5saW5lIGNvbnN0IFVua25vd25GaWVsZFNldCYgZ3JvdXAoKSBjb25zdDsKKworICBpbmxpbmUgdm9pZCBzZXRfdmFyaW50KHVpbnQ2NCB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9maXhlZDMyKHVpbnQzMiB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9maXhlZDY0KHVpbnQ2NCB2YWx1ZSk7CisgIGlubGluZSB2b2lkIHNldF9sZW5ndGhfZGVsaW1pdGVkKGNvbnN0IHN0cmluZyYgdmFsdWUpOworICBpbmxpbmUgc3RyaW5nKiBtdXRhYmxlX2xlbmd0aF9kZWxpbWl0ZWQoKTsKKyAgaW5saW5lIFVua25vd25GaWVsZFNldCogbXV0YWJsZV9ncm91cCgpOworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFVua25vd25GaWVsZFNldDsKKworICAvLyBJZiB0aGlzIFVua25vd25GaWVsZCBjb250YWlucyBhIHBvaW50ZXIsIGRlbGV0ZSBpdC4KKyAgdm9pZCBEZWxldGUoKTsKKworICAvLyBNYWtlIGEgZGVlcCBjb3B5IG9mIGFueSBwb2ludGVycyBpbiB0aGlzIFVua25vd25GaWVsZC4KKyAgdm9pZCBEZWVwQ29weSgpOworCisgIHVuc2lnbmVkIGludCBudW1iZXJfIDogMjk7CisgIHVuc2lnbmVkIGludCB0eXBlXyAgIDogMzsKKyAgdW5pb24geworICAgIHVpbnQ2NCB2YXJpbnRfOworICAgIHVpbnQzMiBmaXhlZDMyXzsKKyAgICB1aW50NjQgZml4ZWQ2NF87CisgICAgc3RyaW5nKiBsZW5ndGhfZGVsaW1pdGVkXzsKKyAgICBVbmtub3duRmllbGRTZXQqIGdyb3VwXzsKKyAgfTsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGlubGluZSBpbXBsZW1lbnRhdGlvbnMKKworaW5saW5lIHZvaWQgVW5rbm93bkZpZWxkU2V0OjpDbGVhcigpIHsKKyAgaWYgKGZpZWxkc18gIT0gTlVMTCkgeworICAgIENsZWFyRmFsbGJhY2soKTsKKyAgfQorfQorCitpbmxpbmUgYm9vbCBVbmtub3duRmllbGRTZXQ6OmVtcHR5KCkgY29uc3QgeworICByZXR1cm4gZmllbGRzXyA9PSBOVUxMIHx8IGZpZWxkc18tPmVtcHR5KCk7Cit9CisKK2lubGluZSB2b2lkIFVua25vd25GaWVsZFNldDo6U3dhcChVbmtub3duRmllbGRTZXQqIHgpIHsKKyAgc3RkOjpzd2FwKGZpZWxkc18sIHgtPmZpZWxkc18pOworfQorCitpbmxpbmUgaW50IFVua25vd25GaWVsZFNldDo6ZmllbGRfY291bnQoKSBjb25zdCB7CisgIHJldHVybiAoZmllbGRzXyA9PSBOVUxMKSA/IDAgOiBmaWVsZHNfLT5zaXplKCk7Cit9CitpbmxpbmUgY29uc3QgVW5rbm93bkZpZWxkJiBVbmtub3duRmllbGRTZXQ6OmZpZWxkKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gKCpmaWVsZHNfKVtpbmRleF07Cit9CitpbmxpbmUgVW5rbm93bkZpZWxkKiBVbmtub3duRmllbGRTZXQ6Om11dGFibGVfZmllbGQoaW50IGluZGV4KSB7CisgIHJldHVybiAmKCpmaWVsZHNfKVtpbmRleF07Cit9CisKK2lubGluZSB2b2lkIFVua25vd25GaWVsZFNldDo6QWRkTGVuZ3RoRGVsaW1pdGVkKAorICAgIGludCBudW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgQWRkTGVuZ3RoRGVsaW1pdGVkKG51bWJlciktPmFzc2lnbih2YWx1ZSk7Cit9CisKK2lubGluZSBpbnQgVW5rbm93bkZpZWxkOjpudW1iZXIoKSBjb25zdCB7IHJldHVybiBudW1iZXJfOyB9CitpbmxpbmUgVW5rbm93bkZpZWxkOjpUeXBlIFVua25vd25GaWVsZDo6dHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KHR5cGVfKTsKK30KKworaW5saW5lIHVpbnQ2NCBVbmtub3duRmllbGQ6OnZhcmludCAoKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEodHlwZV8sIFRZUEVfVkFSSU5UKTsKKyAgcmV0dXJuIHZhcmludF87Cit9CitpbmxpbmUgdWludDMyIFVua25vd25GaWVsZDo6Zml4ZWQzMigpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDS19FUSh0eXBlXywgVFlQRV9GSVhFRDMyKTsKKyAgcmV0dXJuIGZpeGVkMzJfOworfQoraW5saW5lIHVpbnQ2NCBVbmtub3duRmllbGQ6OmZpeGVkNjQoKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEodHlwZV8sIFRZUEVfRklYRUQ2NCk7CisgIHJldHVybiBmaXhlZDY0XzsKK30KK2lubGluZSBjb25zdCBzdHJpbmcmIFVua25vd25GaWVsZDo6bGVuZ3RoX2RlbGltaXRlZCgpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDS19FUSh0eXBlXywgVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKyAgcmV0dXJuICpsZW5ndGhfZGVsaW1pdGVkXzsKK30KK2lubGluZSBjb25zdCBVbmtub3duRmllbGRTZXQmIFVua25vd25GaWVsZDo6Z3JvdXAoKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEodHlwZV8sIFRZUEVfR1JPVVApOworICByZXR1cm4gKmdyb3VwXzsKK30KKworaW5saW5lIHZvaWQgVW5rbm93bkZpZWxkOjpzZXRfdmFyaW50KHVpbnQ2NCB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLX0VRKHR5cGVfLCBUWVBFX1ZBUklOVCk7CisgIHZhcmludF8gPSB2YWx1ZTsKK30KK2lubGluZSB2b2lkIFVua25vd25GaWVsZDo6c2V0X2ZpeGVkMzIodWludDMyIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEodHlwZV8sIFRZUEVfRklYRUQzMik7CisgIGZpeGVkMzJfID0gdmFsdWU7Cit9CitpbmxpbmUgdm9pZCBVbmtub3duRmllbGQ6OnNldF9maXhlZDY0KHVpbnQ2NCB2YWx1ZSkgeworICBHT09HTEVfRENIRUNLX0VRKHR5cGVfLCBUWVBFX0ZJWEVENjQpOworICBmaXhlZDY0XyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgVW5rbm93bkZpZWxkOjpzZXRfbGVuZ3RoX2RlbGltaXRlZChjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEodHlwZV8sIFRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisgIGxlbmd0aF9kZWxpbWl0ZWRfLT5hc3NpZ24odmFsdWUpOworfQoraW5saW5lIHN0cmluZyogVW5rbm93bkZpZWxkOjptdXRhYmxlX2xlbmd0aF9kZWxpbWl0ZWQoKSB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEodHlwZV8sIFRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisgIHJldHVybiBsZW5ndGhfZGVsaW1pdGVkXzsKK30KK2lubGluZSBVbmtub3duRmllbGRTZXQqIFVua25vd25GaWVsZDo6bXV0YWJsZV9ncm91cCgpIHsKKyAgR09PR0xFX0RDSEVDS19FUSh0eXBlXywgVFlQRV9HUk9VUCk7CisgIHJldHVybiBncm91cF87Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VTktOT1dOX0ZJRUxEX1NFVF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzNWM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjCkBAIC0wLDAgKzEsNTEyIEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKy8vCisvLyBUaGlzIHRlc3QgaXMgdGVzdGluZyBhIGxvdCBtb3JlIHRoYW4ganVzdCB0aGUgVW5rbm93bkZpZWxkU2V0IGNsYXNzLiAgSXQKKy8vIHRlc3RzIGhhbmRsaW5nIG9mIHVua25vd24gZmllbGRzIHRocm91Z2hvdXQgdGhlIHN5c3RlbS4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLWlubC5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3VzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OworCituYW1lc3BhY2UgeworCitjbGFzcyBVbmtub3duRmllbGRTZXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgIGRlc2NyaXB0b3JfID0gdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpOworICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJmFsbF9maWVsZHNfKTsKKyAgICBhbGxfZmllbGRzXy5TZXJpYWxpemVUb1N0cmluZygmYWxsX2ZpZWxkc19kYXRhXyk7CisgICAgQVNTRVJUX1RSVUUoZW1wdHlfbWVzc2FnZV8uUGFyc2VGcm9tU3RyaW5nKGFsbF9maWVsZHNfZGF0YV8pKTsKKyAgICB1bmtub3duX2ZpZWxkc18gPSBlbXB0eV9tZXNzYWdlXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CisgIH0KKworICBjb25zdCBVbmtub3duRmllbGQqIEdldEZpZWxkKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOYW1lKG5hbWUpOworICAgIGlmIChmaWVsZCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBpZiAodW5rbm93bl9maWVsZHNfLT5maWVsZChpKS5udW1iZXIoKSA9PSBmaWVsZC0+bnVtYmVyKCkpIHsKKyAgICAgICAgcmV0dXJuICZ1bmtub3duX2ZpZWxkc18tPmZpZWxkKGkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIENvbnN0cnVjdHMgYSBwcm90b2NvbCBidWZmZXIgd2hpY2ggY29udGFpbnMgZmllbGRzIHdpdGggYWxsIHRoZSBzYW1lCisgIC8vIG51bWJlcnMgYXMgYWxsX2ZpZWxkc19kYXRhXyBleGNlcHQgdGhhdCBlYWNoIGZpZWxkIGlzIHNvbWUgb3RoZXIgd2lyZQorICAvLyB0eXBlLgorICBzdHJpbmcgR2V0Qml6YXJyb0RhdGEoKSB7CisgICAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgYml6YXJyb19tZXNzYWdlOworICAgIFVua25vd25GaWVsZFNldCogYml6YXJyb191bmtub3duX2ZpZWxkcyA9CisgICAgICBiaXphcnJvX21lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGNvbnN0IFVua25vd25GaWVsZCYgdW5rbm93bl9maWVsZCA9IHVua25vd25fZmllbGRzXy0+ZmllbGQoaSk7CisgICAgICBpZiAodW5rbm93bl9maWVsZC50eXBlKCkgPT0gVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCkgeworICAgICAgICBiaXphcnJvX3Vua25vd25fZmllbGRzLT5BZGRGaXhlZDMyKHVua25vd25fZmllbGQubnVtYmVyKCksIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYml6YXJyb191bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KHVua25vd25fZmllbGQubnVtYmVyKCksIDEpOworICAgICAgfQorICAgIH0KKworICAgIHN0cmluZyBkYXRhOworICAgIEVYUEVDVF9UUlVFKGJpemFycm9fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSkpOworICAgIHJldHVybiBkYXRhOworICB9CisKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgYWxsX2ZpZWxkc187CisgIHN0cmluZyBhbGxfZmllbGRzX2RhdGFfOworCisgIC8vIEFuIGVtcHR5IG1lc3NhZ2UgdGhhdCBoYXMgYmVlbiBwYXJzZWQgZnJvbSBhbGxfZmllbGRzX2RhdGFfLiAgU28sIGl0IGhhcworICAvLyB1bmtub3duIGZpZWxkcyBvZiBldmVyeSB0eXBlLgorICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBlbXB0eV9tZXNzYWdlXzsKKyAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkc187Cit9OworCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgQWxsRmllbGRzUHJlc2VudCkgeworICAvLyBBbGwgZmllbGRzIG9mIFRlc3RBbGxUeXBlcyBzaG91bGQgYmUgcHJlc2VudCwgaW4gbnVtZXJpYyBvcmRlciAoYmVjYXVzZQorICAvLyB0aGF0J3MgdGhlIG9yZGVyIHdlIHBhcnNlZCB0aGVtIGluKS4gIEZpZWxkcyB0aGF0IGFyZSBub3QgdmFsaWQgZmllbGQKKyAgLy8gbnVtYmVycyBvZiBUZXN0QWxsVHlwZXMgc2hvdWxkIE5PVCBiZSBwcmVzZW50LgorCisgIGludCBwb3MgPSAwOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU51bWJlcihpKTsKKyAgICBpZiAoZmllbGQgIT0gTlVMTCkgeworICAgICAgQVNTRVJUX0xUKHBvcywgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpKTsKKyAgICAgIEVYUEVDVF9FUShpLCB1bmtub3duX2ZpZWxkc18tPmZpZWxkKHBvcysrKS5udW1iZXIoKSk7CisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgLy8gU2hvdWxkIGhhdmUgYSBzZWNvbmQgaW5zdGFuY2UuCisgICAgICAgIEFTU0VSVF9MVChwb3MsIHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShpLCB1bmtub3duX2ZpZWxkc18tPmZpZWxkKHBvcysrKS5udW1iZXIoKSk7CisgICAgICB9CisgICAgfQorICB9CisgIEVYUEVDVF9FUSh1bmtub3duX2ZpZWxkc18tPmZpZWxkX2NvdW50KCksIHBvcyk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBWYXJpbnQpIHsKKyAgY29uc3QgVW5rbm93bkZpZWxkKiBmaWVsZCA9IEdldEZpZWxkKCJvcHRpb25hbF9pbnQzMiIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKKworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgZmllbGQtPnR5cGUoKSk7CisgIEVYUEVDVF9FUShhbGxfZmllbGRzXy5vcHRpb25hbF9pbnQzMigpLCBmaWVsZC0+dmFyaW50KCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgRml4ZWQzMikgeworICBjb25zdCBVbmtub3duRmllbGQqIGZpZWxkID0gR2V0RmllbGQoIm9wdGlvbmFsX2ZpeGVkMzIiKTsKKyAgQVNTRVJUX1RSVUUoZmllbGQgIT0gTlVMTCk7CisKKyAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyLCBmaWVsZC0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKGFsbF9maWVsZHNfLm9wdGlvbmFsX2ZpeGVkMzIoKSwgZmllbGQtPmZpeGVkMzIoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBGaXhlZDY0KSB7CisgIGNvbnN0IFVua25vd25GaWVsZCogZmllbGQgPSBHZXRGaWVsZCgib3B0aW9uYWxfZml4ZWQ2NCIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKKworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVENjQsIGZpZWxkLT50eXBlKCkpOworICBFWFBFQ1RfRVEoYWxsX2ZpZWxkc18ub3B0aW9uYWxfZml4ZWQ2NCgpLCBmaWVsZC0+Zml4ZWQ2NCgpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIExlbmd0aERlbGltaXRlZCkgeworICBjb25zdCBVbmtub3duRmllbGQqIGZpZWxkID0gR2V0RmllbGQoIm9wdGlvbmFsX3N0cmluZyIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKKworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQsIGZpZWxkLT50eXBlKCkpOworICBFWFBFQ1RfRVEoYWxsX2ZpZWxkc18ub3B0aW9uYWxfc3RyaW5nKCksIGZpZWxkLT5sZW5ndGhfZGVsaW1pdGVkKCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgR3JvdXApIHsKKyAgY29uc3QgVW5rbm93bkZpZWxkKiBmaWVsZCA9IEdldEZpZWxkKCJvcHRpb25hbGdyb3VwIik7CisgIEFTU0VSVF9UUlVFKGZpZWxkICE9IE5VTEwpOworCisgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfR1JPVVAsIGZpZWxkLT50eXBlKCkpOworICBBU1NFUlRfRVEoMSwgZmllbGQtPmdyb3VwKCkuZmllbGRfY291bnQoKSk7CisKKyAgY29uc3QgVW5rbm93bkZpZWxkJiBuZXN0ZWRfZmllbGQgPSBmaWVsZC0+Z3JvdXAoKS5maWVsZCgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXN0ZWRfZmllbGRfZGVzY3JpcHRvciA9CisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6T3B0aW9uYWxHcm91cDo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoImEiKTsKKyAgQVNTRVJUX1RSVUUobmVzdGVkX2ZpZWxkX2Rlc2NyaXB0b3IgIT0gTlVMTCk7CisKKyAgRVhQRUNUX0VRKG5lc3RlZF9maWVsZF9kZXNjcmlwdG9yLT5udW1iZXIoKSwgbmVzdGVkX2ZpZWxkLm51bWJlcigpKTsKKyAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsIG5lc3RlZF9maWVsZC50eXBlKCkpOworICBFWFBFQ1RfRVEoYWxsX2ZpZWxkc18ub3B0aW9uYWxncm91cCgpLmEoKSwgbmVzdGVkX2ZpZWxkLnZhcmludCgpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFNlcmlhbGl6ZUZhc3RBbmRTbG93QXJlRXF1aXZhbGVudCkgeworICBpbnQgc2l6ZSA9IFdpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgIGVtcHR5X21lc3NhZ2VfLnVua25vd25fZmllbGRzKCkpOworICBzdHJpbmcgc2xvd19idWZmZXI7CisgIHN0cmluZyBmYXN0X2J1ZmZlcjsKKyAgc2xvd19idWZmZXIucmVzaXplKHNpemUpOworICBmYXN0X2J1ZmZlci5yZXNpemUoc2l6ZSk7CisKKyAgdWludDgqIHRhcmdldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzdHJpbmdfYXNfYXJyYXkoJmZhc3RfYnVmZmVyKSk7CisgIHVpbnQ4KiByZXN1bHQgPSBXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgICAgICBlbXB0eV9tZXNzYWdlXy51bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICBFWFBFQ1RfRVEoc2l6ZSwgcmVzdWx0IC0gdGFyZ2V0KTsKKworICB7CisgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIHJhd19zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZzbG93X2J1ZmZlciksIHNpemUsIDEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZyYXdfc3RyZWFtKTsKKyAgICBXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKGVtcHR5X21lc3NhZ2VfLnVua25vd25fZmllbGRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0X3N0cmVhbSk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7CisgIH0KKyAgRVhQRUNUX1RSVUUoZmFzdF9idWZmZXIgPT0gc2xvd19idWZmZXIpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgU2VyaWFsaXplKSB7CisgIC8vIENoZWNrIHRoYXQgc2VyaWFsaXppbmcgdGhlIFVua25vd25GaWVsZFNldCBwcm9kdWNlcyB0aGUgb3JpZ2luYWwgZGF0YQorICAvLyBhZ2Fpbi4KKworICBzdHJpbmcgZGF0YTsKKyAgZW1wdHlfbWVzc2FnZV8uU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGR1bXAgcmF3IGJpbmFyeSBkYXRhIHRvCisgIC8vIHN0ZG91dC4KKyAgRVhQRUNUX1RSVUUoZGF0YSA9PSBhbGxfZmllbGRzX2RhdGFfKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFBhcnNlVmlhUmVmbGVjdGlvbikgeworICAvLyBNYWtlIHN1cmUgZmllbGRzIGFyZSBwcm9wZXJseSBwYXJzZWQgdG8gdGhlIFVua25vd25GaWVsZFNldCB3aGVuIHBhcnNpbmcKKyAgLy8gdmlhIHJlZmxlY3Rpb24uCisKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZTsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGFsbF9maWVsZHNfZGF0YV8uZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2ZpZWxkc19kYXRhXy5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgQVNTRVJUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmbWVzc2FnZSkpOworCisgIEVYUEVDVF9FUShtZXNzYWdlLkRlYnVnU3RyaW5nKCksIGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgU2VyaWFsaXplVmlhUmVmbGVjdGlvbikgeworICAvLyBNYWtlIHN1cmUgZmllbGRzIGFyZSBwcm9wZXJseSB3cml0dGVuIGZyb20gdGhlIFVua25vd25GaWVsZFNldCB3aGVuCisgIC8vIHNlcmlhbGl6aW5nIHZpYSByZWZsZWN0aW9uLgorCisgIHN0cmluZyBkYXRhOworCisgIHsKKyAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmRhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworICAgIGludCBzaXplID0gV2lyZUZvcm1hdDo6Qnl0ZVNpemUoZW1wdHlfbWVzc2FnZV8pOworICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhlbXB0eV9tZXNzYWdlXywgc2l6ZSwgJm91dHB1dCk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKKyAgfQorCisgIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGR1bXAgcmF3IGJpbmFyeSBkYXRhIHRvCisgIC8vIHN0ZG91dC4KKyAgRVhQRUNUX1RSVUUoZGF0YSA9PSBhbGxfZmllbGRzX2RhdGFfKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIENvcHlGcm9tKSB7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2U7CisKKyAgbWVzc2FnZS5Db3B5RnJvbShlbXB0eV9tZXNzYWdlXyk7CisKKyAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCksIG1lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBTd2FwKSB7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG90aGVyX21lc3NhZ2U7CisgIEFTU0VSVF9UUlVFKG90aGVyX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKEdldEJpemFycm9EYXRhKCkpKTsKKworICBFWFBFQ1RfR1QoZW1wdHlfbWVzc2FnZV8udW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpLCAwKTsKKyAgRVhQRUNUX0dUKG90aGVyX21lc3NhZ2UudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpLCAwKTsKKyAgY29uc3Qgc3RyaW5nIGRlYnVnX3N0cmluZyA9IGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCk7CisgIGNvbnN0IHN0cmluZyBvdGhlcl9kZWJ1Z19zdHJpbmcgPSBvdGhlcl9tZXNzYWdlLkRlYnVnU3RyaW5nKCk7CisgIEVYUEVDVF9ORShkZWJ1Z19zdHJpbmcsIG90aGVyX2RlYnVnX3N0cmluZyk7CisKKyAgZW1wdHlfbWVzc2FnZV8uU3dhcCgmb3RoZXJfbWVzc2FnZSk7CisgIEVYUEVDVF9FUShkZWJ1Z19zdHJpbmcsIG90aGVyX21lc3NhZ2UuRGVidWdTdHJpbmcoKSk7CisgIEVYUEVDVF9FUShvdGhlcl9kZWJ1Z19zdHJpbmcsIGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgU3dhcFdpdGhTZWxmKSB7CisgIGNvbnN0IHN0cmluZyBkZWJ1Z19zdHJpbmcgPSBlbXB0eV9tZXNzYWdlXy5EZWJ1Z1N0cmluZygpOworICBFWFBFQ1RfR1QoZW1wdHlfbWVzc2FnZV8udW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpLCAwKTsKKworICBlbXB0eV9tZXNzYWdlXy5Td2FwKCZlbXB0eV9tZXNzYWdlXyk7CisgIEVYUEVDVF9HVChlbXB0eV9tZXNzYWdlXy51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCksIDApOworICBFWFBFQ1RfRVEoZGVidWdfc3RyaW5nLCBlbXB0eV9tZXNzYWdlXy5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIE1lcmdlRnJvbSkgeworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBzb3VyY2UsIGRlc3RpbmF0aW9uOworCisgIGRlc3RpbmF0aW9uLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEsIDEpOworICBkZXN0aW5hdGlvbi5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgzLCAyKTsKKyAgc291cmNlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDIsIDMpOworICBzb3VyY2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMywgNCk7CisKKyAgZGVzdGluYXRpb24uTWVyZ2VGcm9tKHNvdXJjZSk7CisKKyAgRVhQRUNUX0VRKAorICAgIC8vIE5vdGU6ICBUaGUgb3JkZXJpbmcgb2YgZmllbGRzIGhlcmUgZGVwZW5kcyBvbiB0aGUgb3JkZXJpbmcgb2YgYWRkcworICAgIC8vICAgYW5kIG1lcmdpbmcsIGFib3ZlLgorICAgICIxOiAxXG4iCisgICAgIjM6IDJcbiIKKyAgICAiMjogM1xuIgorICAgICIzOiA0XG4iLAorICAgIGRlc3RpbmF0aW9uLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgQ2xlYXIpIHsKKyAgLy8gQ2xlYXIgdGhlIHNldC4KKyAgZW1wdHlfbWVzc2FnZV8uQ2xlYXIoKTsKKyAgRVhQRUNUX0VRKDAsIHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBQYXJzZUtub3duQW5kVW5rbm93bikgeworICAvLyBUZXN0IG1peGluZyBrbm93biBhbmQgdW5rbm93biBmaWVsZHMgd2hlbiBwYXJzaW5nLgorCisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIHNvdXJjZTsKKyAgc291cmNlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKKyAgc3RyaW5nIGRhdGE7CisgIEFTU0VSVF9UUlVFKHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSkpOworCisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgZGVzdGluYXRpb247CisgIEFTU0VSVF9UUlVFKGRlc3RpbmF0aW9uLlBhcnNlRnJvbVN0cmluZyhhbGxfZmllbGRzX2RhdGFfICsgZGF0YSkpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoZGVzdGluYXRpb24pOworICBBU1NFUlRfRVEoMSwgZGVzdGluYXRpb24udW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKyAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsCisgICAgICAgICAgICBkZXN0aW5hdGlvbi51bmtub3duX2ZpZWxkcygpLmZpZWxkKDApLnR5cGUoKSk7CisgIEVYUEVDVF9FUSg2NTQzMjEsIGRlc3RpbmF0aW9uLnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudmFyaW50KCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgV3JvbmdUeXBlVHJlYXRlZEFzVW5rbm93bikgeworICAvLyBUZXN0IHRoYXQgZmllbGRzIG9mIHRoZSB3cm9uZyB3aXJlIHR5cGUgYXJlIHRyZWF0ZWQgbGlrZSB1bmtub3duIGZpZWxkcworICAvLyB3aGVuIHBhcnNpbmcuCisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBhbGxfdHlwZXNfbWVzc2FnZTsKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlfbWVzc2FnZTsKKyAgc3RyaW5nIGJpemFycm9fZGF0YSA9IEdldEJpemFycm9EYXRhKCk7CisgIEFTU0VSVF9UUlVFKGFsbF90eXBlc19tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhiaXphcnJvX2RhdGEpKTsKKyAgQVNTRVJUX1RSVUUoZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYml6YXJyb19kYXRhKSk7CisKKyAgLy8gQWxsIGZpZWxkcyBzaG91bGQgaGF2ZSBiZWVuIGludGVycHJldGVkIGFzIHVua25vd24sIHNvIHRoZSBkZWJ1ZyBzdHJpbmdzCisgIC8vIHNob3VsZCBiZSB0aGUgc2FtZS4KKyAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2UuRGVidWdTdHJpbmcoKSwgYWxsX3R5cGVzX21lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBXcm9uZ1R5cGVUcmVhdGVkQXNVbmtub3duVmlhUmVmbGVjdGlvbikgeworICAvLyBTYW1lIGFzIFdyb25nVHlwZVRyZWF0ZWRBc1Vua25vd24gYnV0IHZpYSB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UuCisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBhbGxfdHlwZXNfbWVzc2FnZTsKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlfbWVzc2FnZTsKKyAgc3RyaW5nIGJpemFycm9fZGF0YSA9IEdldEJpemFycm9EYXRhKCk7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChiaXphcnJvX2RhdGEuZGF0YSgpLCBiaXphcnJvX2RhdGEuc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgIEFTU0VSVF9UUlVFKFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJmFsbF90eXBlc19tZXNzYWdlKSk7CisgIEFTU0VSVF9UUlVFKGVtcHR5X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGJpemFycm9fZGF0YSkpOworCisgIEVYUEVDVF9FUShlbXB0eV9tZXNzYWdlLkRlYnVnU3RyaW5nKCksIGFsbF90eXBlc19tZXNzYWdlLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgVW5rbm93bkV4dGVuc2lvbnMpIHsKKyAgLy8gTWFrZSBzdXJlIGZpZWxkcyBhcmUgcHJvcGVybHkgcGFyc2VkIHRvIHRoZSBVbmtub3duRmllbGRTZXQgZXZlbiB3aGVuCisgIC8vIHRoZXkgYXJlIGRlY2xhcmVkIGFzIGV4dGVuc2lvbiBudW1iZXJzLgorCisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgQVNTRVJUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYWxsX2ZpZWxkc19kYXRhXykpOworCisgIEVYUEVDVF9FUShtZXNzYWdlLkRlYnVnU3RyaW5nKCksIGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgVW5rbm93bkV4dGVuc2lvbnNSZWZsZWN0aW9uKSB7CisgIC8vIFNhbWUgYXMgVW5rbm93bkV4dGVuc2lvbnMgZXhjZXB0IHBhcnNpbmcgdmlhIHJlZmxlY3Rpb24uCisKKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBtZXNzYWdlOworICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoYWxsX2ZpZWxkc19kYXRhXy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfZmllbGRzX2RhdGFfLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBBU1NFUlRfVFJVRShXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZtZXNzYWdlKSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuRGVidWdTdHJpbmcoKSwgZW1wdHlfbWVzc2FnZV8uRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBXcm9uZ0V4dGVuc2lvblR5cGVUcmVhdGVkQXNVbmtub3duKSB7CisgIC8vIFRlc3QgdGhhdCBmaWVsZHMgb2YgdGhlIHdyb25nIHdpcmUgdHlwZSBhcmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzCisgIC8vIHdoZW4gcGFyc2luZyBleHRlbnNpb25zLgorCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBhbGxfZXh0ZW5zaW9uc19tZXNzYWdlOworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBlbXB0eV9tZXNzYWdlOworICBzdHJpbmcgYml6YXJyb19kYXRhID0gR2V0Qml6YXJyb0RhdGEoKTsKKyAgQVNTRVJUX1RSVUUoYWxsX2V4dGVuc2lvbnNfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYml6YXJyb19kYXRhKSk7CisgIEFTU0VSVF9UUlVFKGVtcHR5X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGJpemFycm9fZGF0YSkpOworCisgIC8vIEFsbCBmaWVsZHMgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcnByZXRlZCBhcyB1bmtub3duLCBzbyB0aGUgZGVidWcgc3RyaW5ncworICAvLyBzaG91bGQgYmUgdGhlIHNhbWUuCisgIEVYUEVDVF9FUShlbXB0eV9tZXNzYWdlLkRlYnVnU3RyaW5nKCksIGFsbF9leHRlbnNpb25zX21lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBVbmtub3duRW51bVZhbHVlKSB7CisgIHVzaW5nIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM7CisgIHVzaW5nIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczsKKyAgdXNpbmcgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2U7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBzaW5ndWxhcl9maWVsZCA9CisgICAgVGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX2VudW0iKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXBlYXRlZF9maWVsZCA9CisgICAgVGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfbmVzdGVkX2VudW0iKTsKKyAgQVNTRVJUX1RSVUUoc2luZ3VsYXJfZmllbGQgIT0gTlVMTCk7CisgIEFTU0VSVF9UUlVFKHJlcGVhdGVkX2ZpZWxkICE9IE5VTEwpOworCisgIHN0cmluZyBkYXRhOworCisgIHsKKyAgICBUZXN0RW1wdHlNZXNzYWdlIGVtcHR5X21lc3NhZ2U7CisgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyA9IGVtcHR5X21lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOworICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoc2luZ3VsYXJfZmllbGQtPm51bWJlcigpLCBUZXN0QWxsVHlwZXM6OkJBUik7CisgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChzaW5ndWxhcl9maWVsZC0+bnVtYmVyKCksIDUpOyAgLy8gbm90IHZhbGlkCisgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChyZXBlYXRlZF9maWVsZC0+bnVtYmVyKCksIFRlc3RBbGxUeXBlczo6Rk9PKTsKKyAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgNCk7ICAvLyBub3QgdmFsaWQKKyAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgVGVzdEFsbFR5cGVzOjpCQVopOworICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQocmVwZWF0ZWRfZmllbGQtPm51bWJlcigpLCA2KTsgIC8vIG5vdCB2YWxpZAorICAgIGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICB9CisKKyAgeworICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlOworICAgIEFTU0VSVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7CisgICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0oMCkpOworICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSgxKSk7CisKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzID0gbWVzc2FnZS51bmtub3duX2ZpZWxkcygpOworICAgIEFTU0VSVF9FUSgzLCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpKTsKKworICAgIEVYUEVDVF9FUShzaW5ndWxhcl9maWVsZC0+bnVtYmVyKCksIHVua25vd25fZmllbGRzLmZpZWxkKDApLm51bWJlcigpKTsKKyAgICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgdW5rbm93bl9maWVsZHMuZmllbGQoMCkudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoNSwgdW5rbm93bl9maWVsZHMuZmllbGQoMCkudmFyaW50KCkpOworCisgICAgRVhQRUNUX0VRKHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgdW5rbm93bl9maWVsZHMuZmllbGQoMSkubnVtYmVyKCkpOworICAgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5ULCB1bmtub3duX2ZpZWxkcy5maWVsZCgxKS50eXBlKCkpOworICAgIEVYUEVDVF9FUSg0LCB1bmtub3duX2ZpZWxkcy5maWVsZCgxKS52YXJpbnQoKSk7CisKKyAgICBFWFBFQ1RfRVEocmVwZWF0ZWRfZmllbGQtPm51bWJlcigpLCB1bmtub3duX2ZpZWxkcy5maWVsZCgyKS5udW1iZXIoKSk7CisgICAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsIHVua25vd25fZmllbGRzLmZpZWxkKDIpLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKDYsIHVua25vd25fZmllbGRzLmZpZWxkKDIpLnZhcmludCgpKTsKKyAgfQorCisgIHsKKyAgICB1c2luZyB1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uOworICAgIHVzaW5nIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb247CisKKyAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICAgIEFTU0VSVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVIsCisgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKG9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbikpOworICAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUocmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKSk7CisgICAgRVhQRUNUX0VRKFRlc3RBbGxUeXBlczo6Rk9PLAorICAgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24sIDApKTsKKyAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVosCisgICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwgMSkpOworCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcyA9IG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKTsKKyAgICBBU1NFUlRfRVEoMywgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKSk7CisKKyAgICBFWFBFQ1RfRVEoc2luZ3VsYXJfZmllbGQtPm51bWJlcigpLCB1bmtub3duX2ZpZWxkcy5maWVsZCgwKS5udW1iZXIoKSk7CisgICAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsIHVua25vd25fZmllbGRzLmZpZWxkKDApLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKDUsIHVua25vd25fZmllbGRzLmZpZWxkKDApLnZhcmludCgpKTsKKworICAgIEVYUEVDVF9FUShyZXBlYXRlZF9maWVsZC0+bnVtYmVyKCksIHVua25vd25fZmllbGRzLmZpZWxkKDEpLm51bWJlcigpKTsKKyAgICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgdW5rbm93bl9maWVsZHMuZmllbGQoMSkudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoNCwgdW5rbm93bl9maWVsZHMuZmllbGQoMSkudmFyaW50KCkpOworCisgICAgRVhQRUNUX0VRKHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgdW5rbm93bl9maWVsZHMuZmllbGQoMikubnVtYmVyKCkpOworICAgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5ULCB1bmtub3duX2ZpZWxkcy5maWVsZCgyKS50eXBlKCkpOworICAgIEVYUEVDVF9FUSg2LCB1bmtub3duX2ZpZWxkcy5maWVsZCgyKS52YXJpbnQoKSk7CisgIH0KK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFNwYWNlVXNlZCkgeworICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBlbXB0eV9tZXNzYWdlOworCisgIC8vIE1ha2Ugc3VyZSBhbiB1bmtub3duIGZpZWxkIHNldCBoYXMgemVybyBzcGFjZSB1c2VkIHVudGlsIGEgZmllbGQgaXMKKyAgLy8gYWN0dWFsbHkgYWRkZWQuCisgIGludCBiYXNlX3NpemUgPSBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpOworICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzID0gZW1wdHlfbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CisgIEVYUEVDVF9FUShiYXNlX3NpemUsIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCkpOworCisgIC8vIE1ha2Ugc3VyZSBlYWNoIHRoaW5nIHdlIGFkZCB0byB0aGUgc2V0IGluY3JlYXNlcyB0aGUgU3BhY2VVc2VkKCkuCisgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoMSwgMCk7CisgIEVYUEVDVF9MVChiYXNlX3NpemUsIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCkpOworICBiYXNlX3NpemUgPSBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpOworCisgIHN0cmluZyogc3RyID0gdW5rbm93bl9maWVsZHMtPkFkZExlbmd0aERlbGltaXRlZCgxKTsKKyAgRVhQRUNUX0xUKGJhc2Vfc2l6ZSwgZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWQoKSk7CisgIGJhc2Vfc2l6ZSA9IGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCk7CisKKyAgc3RyLT5hc3NpZ24oc2l6ZW9mKHN0cmluZykgKyAxLCAneCcpOworICBFWFBFQ1RfTFQoYmFzZV9zaXplLCBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpKTsKKyAgYmFzZV9zaXplID0gZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWQoKTsKKworICBVbmtub3duRmllbGRTZXQqIGdyb3VwID0gdW5rbm93bl9maWVsZHMtPkFkZEdyb3VwKDEpOworICBFWFBFQ1RfTFQoYmFzZV9zaXplLCBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpKTsKKyAgYmFzZV9zaXplID0gZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWQoKTsKKworICBncm91cC0+QWRkVmFyaW50KDEsIDApOworICBFWFBFQ1RfTFQoYmFzZV9zaXplLCBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpKTsKK30KKworVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIEVtcHR5KSB7CisgIFVua25vd25GaWVsZFNldCB1bmtub3duX2ZpZWxkczsKKyAgRVhQRUNUX1RSVUUodW5rbm93bl9maWVsZHMuZW1wdHkoKSk7CisgIHVua25vd25fZmllbGRzLkFkZFZhcmludCg2LCAxMjMpOworICBFWFBFQ1RfRkFMU0UodW5rbm93bl9maWVsZHMuZW1wdHkoKSk7CisgIHVua25vd25fZmllbGRzLkNsZWFyKCk7CisgIEVYUEVDVF9UUlVFKHVua25vd25fZmllbGRzLmVtcHR5KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDdmNjMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuY2MKQEAgLTAsMCArMSw3NjcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOworCituYW1lc3BhY2UgeworCisvLyBUaGlzIGZ1bmN0aW9uIHR1cm5zIG91dCB0byBiZSBjb252ZW5pZW50IHdoZW4gdXNpbmcgc29tZSBtYWNyb3MgbGF0ZXIuCitpbmxpbmUgaW50IEdldEVudW1OdW1iZXIoY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvci0+bnVtYmVyKCk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworYm9vbCBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIHdoaWxlKHRydWUpIHsKKyAgICB1aW50MzIgdGFnID0gaW5wdXQtPlJlYWRUYWcoKTsKKyAgICBpZiAodGFnID09IDApIHsKKyAgICAgIC8vIEVuZCBvZiBpbnB1dC4gIFRoaXMgaXMgYSB2YWxpZCBwbGFjZSB0byBlbmQsIHNvIHJldHVybiB0cnVlLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgIC8vIE11c3QgYmUgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBOVUxMOworCisgICAgaWYgKGRlc2NyaXB0b3IgIT0gTlVMTCkgeworICAgICAgaW50IGZpZWxkX251bWJlciA9IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpOworICAgICAgZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU51bWJlcihmaWVsZF9udW1iZXIpOworCisgICAgICAvLyBJZiB0aGF0IGZhaWxlZCwgY2hlY2sgaWYgdGhlIGZpZWxkIGlzIGFuIGV4dGVuc2lvbi4KKyAgICAgIGlmIChmaWVsZCA9PSBOVUxMICYmIGRlc2NyaXB0b3ItPklzRXh0ZW5zaW9uTnVtYmVyKGZpZWxkX251bWJlcikpIHsKKyAgICAgICAgaWYgKGlucHV0LT5HZXRFeHRlbnNpb25Qb29sKCkgPT0gTlVMTCkgeworICAgICAgICAgIGZpZWxkID0gbWVzc2FnZV9yZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU51bWJlcihmaWVsZF9udW1iZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZpZWxkID0gaW5wdXQtPkdldEV4dGVuc2lvblBvb2woKQorICAgICAgICAgICAgICAgICAgICAgICAtPkZpbmRFeHRlbnNpb25CeU51bWJlcihkZXNjcmlwdG9yLCBmaWVsZF9udW1iZXIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoYXQgZmFpbGVkLCBidXQgd2UncmUgYSBNZXNzYWdlU2V0LCBhbmQgdGhpcyBpcyB0aGUgdGFnIGZvciBhCisgICAgICAvLyBNZXNzYWdlU2V0IGl0ZW0sIHRoZW4gcGFyc2UgdGhhdC4KKyAgICAgIGlmIChmaWVsZCA9PSBOVUxMICYmCisgICAgICAgICAgZGVzY3JpcHRvci0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgJiYKKyAgICAgICAgICB0YWcgPT0gV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnKSB7CisgICAgICAgIGlmICghUGFyc2VBbmRNZXJnZU1lc3NhZ2VTZXRJdGVtKGlucHV0LCBtZXNzYWdlKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsgIC8vIFNraXAgUGFyc2VBbmRNZXJnZUZpZWxkKCk7IGFscmVhZHkgdGFrZW4gY2FyZSBvZi4KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIVBhcnNlQW5kTWVyZ2VGaWVsZCh0YWcsIGZpZWxkLCBtZXNzYWdlLCBpbnB1dCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KKworYm9vbCBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlRmllbGQoCisgICAgdWludDMyIHRhZywKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgLy8gTWF5IGJlIE5VTEwgZm9yIHVua25vd24KKyAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisKKyAgZW51bSB7IFVOS05PV04sIE5PUk1BTF9GT1JNQVQsIFBBQ0tFRF9GT1JNQVQgfSB2YWx1ZV9mb3JtYXQ7CisKKyAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICB2YWx1ZV9mb3JtYXQgPSBVTktOT1dOOworICB9IGVsc2UgaWYgKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICAgV2lyZVR5cGVGb3JGaWVsZFR5cGUoZmllbGQtPnR5cGUoKSkpIHsKKyAgICB2YWx1ZV9mb3JtYXQgPSBOT1JNQUxfRk9STUFUOworICB9IGVsc2UgaWYgKGZpZWxkLT5pc19wYWNrYWJsZSgpICYmCisgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgIHZhbHVlX2Zvcm1hdCA9IFBBQ0tFRF9GT1JNQVQ7CisgIH0gZWxzZSB7CisgICAgLy8gV2UgZG9uJ3QgcmVjb2duaXplIHRoaXMgZmllbGQuIEVpdGhlciB0aGUgZmllbGQgbnVtYmVyIGlzIHVua25vd24KKyAgICAvLyBvciB0aGUgd2lyZSB0eXBlIGRvZXNuJ3QgbWF0Y2guIFB1dCBpdCBpbiBvdXIgdW5rbm93biBmaWVsZCBzZXQuCisgICAgdmFsdWVfZm9ybWF0ID0gVU5LTk9XTjsKKyAgfQorCisgIGlmICh2YWx1ZV9mb3JtYXQgPT0gVU5LTk9XTikgeworICAgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKAorICAgICAgICBpbnB1dCwgdGFnLCBtZXNzYWdlX3JlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpKTsKKyAgfSBlbHNlIGlmICh2YWx1ZV9mb3JtYXQgPT0gUEFDS0VEX0ZPUk1BVCkgeworICAgIHVpbnQzMiBsZW5ndGg7CisgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gaW5wdXQtPlB1c2hMaW1pdChsZW5ndGgpOworCisgICAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9QQUNLRURfVFlQRShUWVBFLCBDUFBUWVBFLCBDUFBUWVBFX01FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKGlucHV0LT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgQ1BQVFlQRSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDUFBUWVBFLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1RZUEU+KGlucHV0LCAmdmFsdWUpKSAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkIyNDUFBUWVBFX01FVEhPRChtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOyAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfQorCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoIElOVDMyLCAgaW50MzIsICBJbnQzMikKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRSggSU5UNjQsICBpbnQ2NCwgIEludDY0KQorICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKFNJTlQzMiwgIGludDMyLCAgSW50MzIpCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoU0lOVDY0LCAgaW50NjQsICBJbnQ2NCkKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShVSU5UMzIsIHVpbnQzMiwgVUludDMyKQorICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKFVJTlQ2NCwgdWludDY0LCBVSW50NjQpCisKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRSggRklYRUQzMiwgdWludDMyLCBVSW50MzIpCisgICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoIEZJWEVENjQsIHVpbnQ2NCwgVUludDY0KQorICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKFNGSVhFRDMyLCAgaW50MzIsICBJbnQzMikKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShTRklYRUQ2NCwgIGludDY0LCAgSW50NjQpCisKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShGTE9BVCAsIGZsb2F0ICwgRmxvYXQgKQorICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUpCisKKyAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShCT09MLCBib29sLCBCb29sKQorI3VuZGVmIEhBTkRMRV9QQUNLRURfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOiB7CisgICAgICAgIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7CisgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9CisgICAgICAgICAgICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOworICAgICAgICAgIGlmIChlbnVtX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBmaWVsZCwgZW51bV92YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOgorICAgICAgICAvLyBDYW4ndCBoYXZlIHBhY2tlZCBmaWVsZHMgb2YgdGhlc2UgdHlwZXM6IHRoZXNlIHNob3VsZCBiZSBjYXVnaHQgYnkKKyAgICAgICAgLy8gdGhlIHByb3RvY29sIGNvbXBpbGVyLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlucHV0LT5Qb3BMaW1pdChsaW1pdCk7CisgIH0gZWxzZSB7CisgICAgLy8gTm9uLXBhY2tlZCB2YWx1ZSAodmFsdWVfZm9ybWF0ID09IE5PUk1BTF9GT1JNQVQpCisgICAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFRZUEUsIENQUFRZUEUsIENQUFRZUEVfTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8jI1RZUEU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENQUFRZUEUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQ1BQVFlQRSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNUWVBFPihpbnB1dCwgJnZhbHVlKSkgICAgICAgICBcCisgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5BZGQjI0NQUFRZUEVfTUVUSE9EKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7ICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5TZXQjI0NQUFRZUEVfTUVUSE9EKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7ICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9CisKKyAgICAgIEhBTkRMRV9UWVBFKCBJTlQzMiwgIGludDMyLCAgSW50MzIpCisgICAgICBIQU5ETEVfVFlQRSggSU5UNjQsICBpbnQ2NCwgIEludDY0KQorICAgICAgSEFORExFX1RZUEUoU0lOVDMyLCAgaW50MzIsICBJbnQzMikKKyAgICAgIEhBTkRMRV9UWVBFKFNJTlQ2NCwgIGludDY0LCAgSW50NjQpCisgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMiwgVUludDMyKQorICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjQsIFVJbnQ2NCkKKworICAgICAgSEFORExFX1RZUEUoIEZJWEVEMzIsIHVpbnQzMiwgVUludDMyKQorICAgICAgSEFORExFX1RZUEUoIEZJWEVENjQsIHVpbnQ2NCwgVUludDY0KQorICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsICBpbnQzMiwgIEludDMyKQorICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsICBpbnQ2NCwgIEludDY0KQorCisgICAgICBIQU5ETEVfVFlQRShGTE9BVCAsIGZsb2F0ICwgRmxvYXQgKQorICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUsIERvdWJsZSkKKworICAgICAgSEFORExFX1RZUEUoQk9PTCwgYm9vbCwgQm9vbCkKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOiB7CisgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTxpbnQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAorICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPQorICAgICAgICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOworICAgICAgICBpZiAoZW51bV92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgZmllbGQsIGVudW1fdmFsdWUpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgZmllbGQsIGVudW1fdmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBUaGUgZW51bSB2YWx1ZSBpcyBub3Qgb25lIG9mIHRoZSBrbm93biB2YWx1ZXMuICBBZGQgaXQgdG8gdGhlCisgICAgICAgICAgLy8gVW5rbm93bkZpZWxkU2V0LgorICAgICAgICAgIGludDY0IHNpZ25fZXh0ZW5kZWRfdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2ND4odmFsdWUpOworICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkFkZFZhcmludChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduX2V4dGVuZGVkX3ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gSGFuZGxlIHN0cmluZ3Mgc2VwYXJhdGVseSBzbyB0aGF0IHdlIGNhbiBvcHRpbWl6ZSB0aGUgY3R5cGU9Q09SRCBjYXNlLgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOiB7CisgICAgICAgIHN0cmluZyB2YWx1ZTsKKyAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZyhpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBWZXJpZnlVVEY4U3RyaW5nKHZhbHVlLmRhdGEoKSwgdmFsdWUubGVuZ3RoKCksIFBBUlNFKTsKKyAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5BZGRTdHJpbmcobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzogeworICAgICAgICBzdHJpbmcgdmFsdWU7CisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRCeXRlcyhpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOiB7CisgICAgICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkTWVzc2FnZSgKKyAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGlucHV0LT5HZXRFeHRlbnNpb25GYWN0b3J5KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN1Yl9tZXNzYWdlID0gbWVzc2FnZV9yZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGlucHV0LT5HZXRFeHRlbnNpb25GYWN0b3J5KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIHN1Yl9tZXNzYWdlKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOiB7CisgICAgICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOworICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkTWVzc2FnZSgKKyAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGlucHV0LT5HZXRFeHRlbnNpb25GYWN0b3J5KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN1Yl9tZXNzYWdlID0gbWVzc2FnZV9yZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGlucHV0LT5HZXRFeHRlbnNpb25GYWN0b3J5KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2UoaW5wdXQsIHN1Yl9tZXNzYWdlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEl0ZW0oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOworCisgIC8vIFRoaXMgbWV0aG9kIHBhcnNlcyBhIGdyb3VwIHdoaWNoIHNob3VsZCBjb250YWluIHR3byBmaWVsZHM6CisgIC8vICAgcmVxdWlyZWQgaW50MzIgdHlwZV9pZCA9IDI7CisgIC8vICAgcmVxdWlyZWQgZGF0YSBtZXNzYWdlID0gMzsKKworICAvLyBPbmNlIHdlIHNlZSBhIHR5cGVfaWQsIHdlJ2xsIGNvbnN0cnVjdCBhIGZha2UgdGFnIGZvciB0aGlzIGV4dGVuc2lvbgorICAvLyB3aGljaCBpcyB0aGUgdGFnIGl0IHdvdWxkIGhhdmUgaGFkIHVuZGVyIHRoZSBwcm90bzIgZXh0ZW5zaW9ucyB3aXJlCisgIC8vIGZvcm1hdC4KKyAgdWludDMyIGZha2VfdGFnID0gMDsKKworICAvLyBPbmNlIHdlIHNlZSBhIHR5cGVfaWQsIHdlJ2xsIGxvb2sgdXAgdGhlIEZpZWxkRGVzY3JpcHRvciBmb3IgdGhlCisgIC8vIGV4dGVuc2lvbi4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IE5VTEw7CisKKyAgLy8gSWYgd2Ugc2VlIG1lc3NhZ2UgZGF0YSBiZWZvcmUgdGhlIHR5cGVfaWQsIHdlJ2xsIGFwcGVuZCBpdCB0byB0aGlzIHNvCisgIC8vIHdlIGNhbiBwYXJzZSBpdCBsYXRlci4gIFRoaXMgd2lsbCBwcm9iYWJseSBuZXZlciBoYXBwZW4gaW4gcHJhY3RpY2UsCisgIC8vIGFzIG5vIE1lc3NhZ2VTZXQgZW5jb2RlciBJIGtub3cgb2Ygd3JpdGVzIHRoZSBtZXNzYWdlIGJlZm9yZSB0aGUgdHlwZSBJRC4KKyAgLy8gQnV0LCBpdCdzIHRlY2huaWNhbGx5IHZhbGlkIHNvIHdlIHNob3VsZCBhbGxvdyBpdC4KKyAgLy8gVE9ETyhrZW50b24pOiAgVXNlIGEgQ29yZCBpbnN0ZWFkPyAgRG8gSSBjYXJlPworICBzdHJpbmcgbWVzc2FnZV9kYXRhOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgdWludDMyIHRhZyA9IGlucHV0LT5SZWFkVGFnKCk7CisgICAgaWYgKHRhZyA9PSAwKSByZXR1cm4gZmFsc2U7CisKKyAgICBzd2l0Y2ggKHRhZykgeworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWRUYWc6IHsKKyAgICAgICAgdWludDMyIHR5cGVfaWQ7CisgICAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmdHlwZV9pZCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgZmFrZV90YWcgPSBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKKyAgICAgICAgICAgIHR5cGVfaWQsIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKKyAgICAgICAgZmllbGQgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKHR5cGVfaWQpOworCisgICAgICAgIGlmICghbWVzc2FnZV9kYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgICAvLyBXZSBzYXcgc29tZSBtZXNzYWdlIGRhdGEgYmVmb3JlIHRoZSB0eXBlX2lkLiAgSGF2ZSB0byBwYXJzZSBpdAorICAgICAgICAgIC8vIG5vdy4KKyAgICAgICAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQobWVzc2FnZV9kYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9kYXRhLnNpemUoKSk7CisgICAgICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gc3ViX2lucHV0KCZyYXdfaW5wdXQpOworICAgICAgICAgIGlmICghUGFyc2VBbmRNZXJnZUZpZWxkKGZha2VfdGFnLCBmaWVsZCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViX2lucHV0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgICBtZXNzYWdlX2RhdGEuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VUYWc6IHsKKyAgICAgICAgaWYgKGZha2VfdGFnID09IDApIHsKKyAgICAgICAgICAvLyBXZSBoYXZlbid0IHNlZW4gYSB0eXBlX2lkIHlldC4gIEFwcGVuZCB0aGlzIGRhdGEgdG8gbWVzc2FnZV9kYXRhLgorICAgICAgICAgIHN0cmluZyB0ZW1wOworICAgICAgICAgIHVpbnQzMiBsZW5ndGg7CisgICAgICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgaWYgKCFpbnB1dC0+UmVhZFN0cmluZygmdGVtcCwgbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgIG1lc3NhZ2VfZGF0YS5hcHBlbmQodGVtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQWxyZWFkeSBzYXcgdHlwZV9pZCwgc28gd2UgY2FuIHBhcnNlIHRoaXMgZGlyZWN0bHkuCisgICAgICAgICAgaWYgKCFQYXJzZUFuZE1lcmdlRmllbGQoZmFrZV90YWcsIGZpZWxkLCBtZXNzYWdlLCBpbnB1dCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnOiB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBOVUxMKSkgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3ZvaWQgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgaW50IHNpemUsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGludCBleHBlY3RlZF9lbmRwb2ludCA9IG91dHB1dC0+Qnl0ZUNvdW50KCkgKyBzaXplOworCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlLCAmZmllbGRzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKKyAgICBTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplcyhmaWVsZHNbaV0sIG1lc3NhZ2UsIG91dHB1dCk7CisgIH0KKworICBpZiAoZGVzY3JpcHRvci0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bk1lc3NhZ2VTZXRJdGVtcygKKyAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRVbmtub3duRmllbGRzKG1lc3NhZ2UpLCBvdXRwdXQpOworICB9IGVsc2UgeworICAgIFdpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMobWVzc2FnZSksIG91dHB1dCk7CisgIH0KKworICBHT09HTEVfQ0hFQ0tfRVEob3V0cHV0LT5CeXRlQ291bnQoKSwgZXhwZWN0ZWRfZW5kcG9pbnQpCisgICAgPDwgIjogUHJvdG9jb2wgbWVzc2FnZSBzZXJpYWxpemVkIHRvIGEgc2l6ZSBkaWZmZXJlbnQgZnJvbSB3aGF0IHdhcyAiCisgICAgICAgIm9yaWdpbmFsbHkgZXhwZWN0ZWQuICBQZXJoYXBzIGl0IHdhcyBtb2RpZmllZCBieSBhbm90aGVyIHRocmVhZCAiCisgICAgICAgImR1cmluZyBzZXJpYWxpemF0aW9uPyI7Cit9CisKK3ZvaWQgV2lyZUZvcm1hdDo6U2VyaWFsaXplRmllbGRXaXRoQ2FjaGVkU2l6ZXMoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIGNvbnN0IFJlZmxlY3Rpb24qIG1lc3NhZ2VfcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkgJiYKKyAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgJiYKKyAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCisgICAgICAhZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBTZXJpYWxpemVNZXNzYWdlU2V0SXRlbVdpdGhDYWNoZWRTaXplcyhmaWVsZCwgbWVzc2FnZSwgb3V0cHV0KTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQgY291bnQgPSAwOworCisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIGNvdW50ID0gbWVzc2FnZV9yZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgZmllbGQpOworICB9IGVsc2UgaWYgKG1lc3NhZ2VfcmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgZmllbGQpKSB7CisgICAgY291bnQgPSAxOworICB9CisKKyAgY29uc3QgYm9vbCBpc19wYWNrZWQgPSBmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpOworICBpZiAoaXNfcGFja2VkICYmIGNvdW50ID4gMCkgeworICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZyhmaWVsZC0+bnVtYmVyKCksCisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOworICAgIGNvbnN0IGludCBkYXRhX3NpemUgPSBGaWVsZERhdGFPbmx5Qnl0ZVNpemUoZmllbGQsIG1lc3NhZ2UpOworICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihkYXRhX3NpemUpOworICB9CisKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisgICAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9QUklNSVRJVkVfVFlQRShUWVBFLCBDUFBUWVBFLCBUWVBFX01FVEhPRCwgQ1BQVFlQRV9NRVRIT0QpICAgICAgXAorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgQ1BQVFlQRSB2YWx1ZSA9IGZpZWxkLT5pc19yZXBlYXRlZCgpID8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkIyNDUFBUWVBFX01FVEhPRCggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBmaWVsZCwgaikgOiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0IyNDUFBUWVBFX01FVEhPRCggICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaXNfcGFja2VkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGUjI1RZUEVfTUVUSE9EIyNOb1RhZyh2YWx1ZSwgb3V0cHV0KTsgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjVFlQRV9NRVRIT0QoZmllbGQtPm51bWJlcigpLCB2YWx1ZSwgb3V0cHV0KTsgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfQorCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoIElOVDMyLCAgaW50MzIsICBJbnQzMiwgIEludDMyKQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKCBJTlQ2NCwgIGludDY0LCAgSW50NjQsICBJbnQ2NCkKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShTSU5UMzIsICBpbnQzMiwgU0ludDMyLCAgSW50MzIpCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoU0lOVDY0LCAgaW50NjQsIFNJbnQ2NCwgIEludDY0KQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKFVJTlQzMiwgdWludDMyLCBVSW50MzIsIFVJbnQzMikKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShVSU5UNjQsIHVpbnQ2NCwgVUludDY0LCBVSW50NjQpCisKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRSggRklYRUQzMiwgdWludDMyLCAgRml4ZWQzMiwgVUludDMyKQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKCBGSVhFRDY0LCB1aW50NjQsICBGaXhlZDY0LCBVSW50NjQpCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoU0ZJWEVEMzIsICBpbnQzMiwgU0ZpeGVkMzIsICBJbnQzMikKKyAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShTRklYRUQ2NCwgIGludDY0LCBTRml4ZWQ2NCwgIEludDY0KQorCisgICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoRkxPQVQgLCBmbG9hdCAsIEZsb2F0ICwgRmxvYXQgKQorICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUsIERvdWJsZSkKKworICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEJPT0wsIGJvb2wsIEJvb2wsIEJvb2wpCisjdW5kZWYgSEFORExFX1BSSU1JVElWRV9UWVBFCisKKyNkZWZpbmUgSEFORExFX1RZUEUoVFlQRSwgVFlQRV9NRVRIT0QsIENQUFRZUEVfTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjVFlQRV9NRVRIT0QoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgZmllbGQtPm51bWJlcigpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZCMjQ1BQVFlQRV9NRVRIT0QoICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBqKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0IyNDUFBUWVBFX01FVEhPRChtZXNzYWdlLCBmaWVsZCksICAgICBcCisgICAgICAgICAgICAgIG91dHB1dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIEhBTkRMRV9UWVBFKEdST1VQICAsIEdyb3VwICAsIE1lc3NhZ2UpCisgICAgICBIQU5ETEVfVFlQRShNRVNTQUdFLCBNZXNzYWdlLCBNZXNzYWdlKQorI3VuZGVmIEhBTkRMRV9UWVBFCisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06IHsKKyAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUgPSBmaWVsZC0+aXNfcmVwZWF0ZWQoKSA/CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgZmllbGQsIGopIDoKKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgZmllbGQpOworICAgICAgICBpZiAoaXNfcGFja2VkKSB7CisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlRW51bU5vVGFnKHZhbHVlLT5udW1iZXIoKSwgb3V0cHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKGZpZWxkLT5udW1iZXIoKSwgdmFsdWUtPm51bWJlcigpLCBvdXRwdXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBIYW5kbGUgc3RyaW5ncyBzZXBhcmF0ZWx5IHNvIHRoYXQgd2UgY2FuIGdldCBzdHJpbmcgcmVmZXJlbmNlcworICAgICAgLy8gaW5zdGVhZCBvZiBjb3B5aW5nLgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOiB7CisgICAgICAgIHN0cmluZyBzY3JhdGNoOworICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlID0gZmllbGQtPmlzX3JlcGVhdGVkKCkgPworICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICBtZXNzYWdlLCBmaWVsZCwgaiwgJnNjcmF0Y2gpIDoKKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwgJnNjcmF0Y2gpOworICAgICAgICBWZXJpZnlVVEY4U3RyaW5nKHZhbHVlLmRhdGEoKSwgdmFsdWUubGVuZ3RoKCksIFNFUklBTElaRSk7CisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZyhmaWVsZC0+bnVtYmVyKCksIHZhbHVlLCBvdXRwdXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6IHsKKyAgICAgICAgc3RyaW5nIHNjcmF0Y2g7CisgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUgPSBmaWVsZC0+aXNfcmVwZWF0ZWQoKSA/CisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBqLCAmc2NyYXRjaCkgOgorICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIGZpZWxkLCAmc2NyYXRjaCk7CisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzKGZpZWxkLT5udW1iZXIoKSwgdmFsdWUsIG91dHB1dCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZU1lc3NhZ2VTZXRJdGVtV2l0aENhY2hlZFNpemVzKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICAvLyBTdGFydCBncm91cC4KKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZyk7CisKKyAgLy8gV3JpdGUgdHlwZSBJRC4KKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZyk7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihmaWVsZC0+bnVtYmVyKCkpOworCisgIC8vIFdyaXRlIG1lc3NhZ2UuCisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnKTsKKworICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBmaWVsZCk7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihzdWJfbWVzc2FnZS5HZXRDYWNoZWRTaXplKCkpOworICBzdWJfbWVzc2FnZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMob3V0cHV0KTsKKworICAvLyBFbmQgZ3JvdXAuCisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbnQgV2lyZUZvcm1hdDo6Qnl0ZVNpemUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIG1lc3NhZ2VfcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIGludCBvdXJfc2l6ZSA9IDA7CisKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgbWVzc2FnZV9yZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UsICZmaWVsZHMpOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgeworICAgIG91cl9zaXplICs9IEZpZWxkQnl0ZVNpemUoZmllbGRzW2ldLCBtZXNzYWdlKTsKKyAgfQorCisgIGlmIChkZXNjcmlwdG9yLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgeworICAgIG91cl9zaXplICs9IFdpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUoCisgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMobWVzc2FnZSkpOworICB9IGVsc2UgeworICAgIG91cl9zaXplICs9IFdpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMobWVzc2FnZSkpOworICB9CisKKyAgcmV0dXJuIG91cl9zaXplOworfQorCitpbnQgV2lyZUZvcm1hdDo6RmllbGRCeXRlU2l6ZSgKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSAmJgorICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSAmJgorICAgICAgZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgJiYKKyAgICAgICFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIHJldHVybiBNZXNzYWdlU2V0SXRlbUJ5dGVTaXplKGZpZWxkLCBtZXNzYWdlKTsKKyAgfQorCisgIGludCBjb3VudCA9IDA7CisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIGNvdW50ID0gbWVzc2FnZV9yZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgZmllbGQpOworICB9IGVsc2UgaWYgKG1lc3NhZ2VfcmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgZmllbGQpKSB7CisgICAgY291bnQgPSAxOworICB9CisKKyAgY29uc3QgaW50IGRhdGFfc2l6ZSA9IEZpZWxkRGF0YU9ubHlCeXRlU2l6ZShmaWVsZCwgbWVzc2FnZSk7CisgIGludCBvdXJfc2l6ZSA9IGRhdGFfc2l6ZTsKKyAgaWYgKGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICBpZiAoZGF0YV9zaXplID4gMCkgeworICAgICAgLy8gUGFja2VkIGZpZWxkcyBnZXQgc2VyaWFsaXplZCBsaWtlIGEgc3RyaW5nLCBub3QgdGhlaXIgbmF0aXZlIHR5cGUuCisgICAgICAvLyBUZWNobmljYWxseSB0aGlzIGRvZXNuJ3QgcmVhbGx5IG1hdHRlcjsgdGhlIHNpemUgb25seSBjaGFuZ2VzIGlmIGl0J3MKKyAgICAgIC8vIGEgR1JPVVAKKyAgICAgIG91cl9zaXplICs9IFRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKTsKKyAgICAgIG91cl9zaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKGRhdGFfc2l6ZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIG91cl9zaXplICs9IGNvdW50ICogVGFnU2l6ZShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCkpOworICB9CisgIHJldHVybiBvdXJfc2l6ZTsKK30KKworaW50IFdpcmVGb3JtYXQ6OkZpZWxkRGF0YU9ubHlCeXRlU2l6ZSgKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgaW50IGNvdW50ID0gMDsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgY291bnQgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7CisgIH0gZWxzZSBpZiAobWVzc2FnZV9yZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBmaWVsZCkpIHsKKyAgICBjb3VudCA9IDE7CisgIH0KKworICBpbnQgZGF0YV9zaXplID0gMDsKKyAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9UWVBFKFRZUEUsIFRZUEVfTUVUSE9ELCBDUFBUWVBFX01FVEhPRCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZGF0YV9zaXplICs9IFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FVEhPRCMjU2l6ZSggICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkIyNDUFBUWVBFX01FVEhPRCggICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBqKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRhdGFfc2l6ZSArPSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVRIT0QjI1NpemUoICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXQjI0NQUFRZUEVfTUVUSE9EKG1lc3NhZ2UsIGZpZWxkKSk7ICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBicmVhazsKKworI2RlZmluZSBIQU5ETEVfRklYRURfVFlQRShUWVBFLCBUWVBFX01FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGF0YV9zaXplICs9IGNvdW50ICogV2lyZUZvcm1hdExpdGU6OmsjI1RZUEVfTUVUSE9EIyNTaXplOyAgICAgICAgICAgXAorICAgICAgYnJlYWs7CisKKyAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBJbnQzMiwgIEludDMyKQorICAgIEhBTkRMRV9UWVBFKCBJTlQ2NCwgIEludDY0LCAgSW50NjQpCisgICAgSEFORExFX1RZUEUoU0lOVDMyLCBTSW50MzIsICBJbnQzMikKKyAgICBIQU5ETEVfVFlQRShTSU5UNjQsIFNJbnQ2NCwgIEludDY0KQorICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgVUludDMyLCBVSW50MzIpCisgICAgSEFORExFX1RZUEUoVUlOVDY0LCBVSW50NjQsIFVJbnQ2NCkKKworICAgIEhBTkRMRV9GSVhFRF9UWVBFKCBGSVhFRDMyLCAgRml4ZWQzMikKKyAgICBIQU5ETEVfRklYRURfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQpCisgICAgSEFORExFX0ZJWEVEX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyKQorICAgIEhBTkRMRV9GSVhFRF9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCkKKworICAgIEhBTkRMRV9GSVhFRF9UWVBFKEZMT0FUICwgRmxvYXQgKQorICAgIEhBTkRMRV9GSVhFRF9UWVBFKERPVUJMRSwgRG91YmxlKQorCisgICAgSEFORExFX0ZJWEVEX1RZUEUoQk9PTCwgQm9vbCkKKworICAgIEhBTkRMRV9UWVBFKEdST1VQICAsIEdyb3VwICAsIE1lc3NhZ2UpCisgICAgSEFORExFX1RZUEUoTUVTU0FHRSwgTWVzc2FnZSwgTWVzc2FnZSkKKyN1bmRlZiBIQU5ETEVfVFlQRQorI3VuZGVmIEhBTkRMRV9GSVhFRF9UWVBFCisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOiB7CisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisgICAgICAgICAgZGF0YV9zaXplICs9IFdpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSgKKyAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIGZpZWxkLCBqKS0+bnVtYmVyKCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBkYXRhX3NpemUgKz0gV2lyZUZvcm1hdExpdGU6OkVudW1TaXplKAorICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBmaWVsZCktPm51bWJlcigpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEhhbmRsZSBzdHJpbmdzIHNlcGFyYXRlbHkgc28gdGhhdCB3ZSBjYW4gZ2V0IHN0cmluZyByZWZlcmVuY2VzCisgICAgLy8gaW5zdGVhZCBvZiBjb3B5aW5nLgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzogeworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisgICAgICAgIHN0cmluZyBzY3JhdGNoOworICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlID0gZmllbGQtPmlzX3JlcGVhdGVkKCkgPworICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCisgICAgICAgICAgICBtZXNzYWdlLCBmaWVsZCwgaiwgJnNjcmF0Y2gpIDoKKyAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwgJnNjcmF0Y2gpOworICAgICAgICBkYXRhX3NpemUgKz0gV2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUodmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBkYXRhX3NpemU7Cit9CisKK2ludCBXaXJlRm9ybWF0OjpNZXNzYWdlU2V0SXRlbUJ5dGVTaXplKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICBpbnQgb3VyX3NpemUgPSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtVGFnc1NpemU7CisKKyAgLy8gdHlwZV9pZAorICBvdXJfc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihmaWVsZC0+bnVtYmVyKCkpOworCisgIC8vIG1lc3NhZ2UKKyAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpOworICBpbnQgbWVzc2FnZV9zaXplID0gc3ViX21lc3NhZ2UuQnl0ZVNpemUoKTsKKworICBvdXJfc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihtZXNzYWdlX3NpemUpOworICBvdXJfc2l6ZSArPSBtZXNzYWdlX3NpemU7CisKKyAgcmV0dXJuIG91cl9zaXplOworfQorCit2b2lkIFdpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdGYWxsYmFjayhjb25zdCBjaGFyKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3ApIHsKKyAgaWYgKCFJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChkYXRhLCBzaXplKSkgeworICAgIGNvbnN0IGNoYXIqIG9wZXJhdGlvbl9zdHIgPSBOVUxMOworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgIGNhc2UgUEFSU0U6CisgICAgICAgIG9wZXJhdGlvbl9zdHIgPSAicGFyc2luZyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTRVJJQUxJWkU6CisgICAgICAgIG9wZXJhdGlvbl9zdHIgPSAic2VyaWFsaXppbmciOworICAgICAgICBicmVhazsKKyAgICAgIC8vIG5vIGRlZmF1bHQgY2FzZTogaGF2ZSB0aGUgY29tcGlsZXIgd2FybiBpZiBhIGNhc2UgaXMgbm90IGNvdmVyZWQuCisgICAgfQorICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJFbmNvdW50ZXJlZCBzdHJpbmcgY29udGFpbmluZyBpbnZhbGlkIFVURi04IGRhdGEgd2hpbGUgIgorICAgICAgICAgICAgICAgPDwgb3BlcmF0aW9uX3N0cgorICAgICAgICAgICAgICAgPDwgIiBwcm90b2NvbCBidWZmZXIuIFN0cmluZ3MgbXVzdCBjb250YWluIG9ubHkgVVRGLTg7ICIKKyAgICAgICAgICAgICAgICAgICJ1c2UgdGhlICdieXRlcycgdHlwZSBmb3IgcmF3IGJ5dGVzLiI7CisgIH0KK30KKworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyYmM0YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmgKQEAgLTAsMCArMSwyNDAgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICAgICAgICAgYXRlbmFzaW9AZ29vZ2xlLmNvbSAoQ2hyaXMgQXRlbmFzaW8pIChaaWdaYWcgdHJhbnNmb3JtKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBoZWFkZXIgaXMgbG9naWNhbGx5IGludGVybmFsLCBidXQgaXMgbWFkZSBwdWJsaWMgYmVjYXVzZSBpdCBpcyB1c2VkCisvLyBmcm9tIHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlLCB3aGljaCBtYXkgcmVzaWRlIGluIG90aGVyIGNvbXBvbmVudHMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX0hfXworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKworLy8gRG8gVVRGLTggdmFsaWRhdGlvbiBvbiBzdHJpbmcgdHlwZSBpbiBEZWJ1ZyBidWlsZCBvbmx5CisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKKyNlbmRpZgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBpbyB7CisgICAgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbTsgICAgICAvLyBjb2RlZF9zdHJlYW0uaAorICAgIGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtOyAgICAgLy8gY29kZWRfc3RyZWFtLmgKKyAgfQorICBjbGFzcyBVbmtub3duRmllbGRTZXQ7ICAgICAgICAgLy8gdW5rbm93bl9maWVsZF9zZXQuaAorfQorCituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGhpcyBjbGFzcyBpcyBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBhbmQgYnkKKy8vIHByb3RvY29sLWNvbXBsaWVyLWdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMuICBJdCBtdXN0IG5vdCBiZSBjYWxsZWQKKy8vIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisvLworLy8gVGhpcyBjbGFzcyBjb250YWlucyBjb2RlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGJpbmFyeSBwcm90b2NvbCBidWZmZXIKKy8vIHdpcmUgZm9ybWF0IHZpYSByZWZsZWN0aW9uLiAgVGhlIFdpcmVGb3JtYXRMaXRlIGNsYXNzIGltcGxlbWVudHMgdGhlCisvLyBub24tcmVmbGVjdGlvbiBiYXNlZCByb3V0aW5lcy4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIHJlYWxseSBhIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIG9ubHkgc3RhdGljIG1ldGhvZHMKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBXaXJlRm9ybWF0IHsKKyBwdWJsaWM6CisKKyAgLy8gR2l2ZW4gYSBmaWVsZCByZXR1cm4gaXRzIFdpcmVUeXBlCisgIHN0YXRpYyBpbmxpbmUgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIFdpcmVUeXBlRm9yRmllbGQoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworICAvLyBHaXZlbiBhIEZpZWxkU2VzY3JpcHRvcjo6VHlwZSByZXR1cm4gaXRzIFdpcmVUeXBlCisgIHN0YXRpYyBpbmxpbmUgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIFdpcmVUeXBlRm9yRmllbGRUeXBlKAorICAgICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpOworCisgIC8vIENvbXB1dGUgdGhlIGJ5dGUgc2l6ZSBvZiBhIHRhZy4gIEZvciBncm91cHMsIHRoaXMgaW5jbHVkZXMgYm90aCB0aGUgc3RhcnQKKyAgLy8gYW5kIGVuZCB0YWdzLgorICBzdGF0aWMgaW5saW5lIGludCBUYWdTaXplKGludCBmaWVsZF9udW1iZXIsIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKTsKKworICAvLyBUaGVzZSBwcm9jZWR1cmVzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgbWV0aG9kcyBvZiBNZXNzYWdlIHdoaWNoCisgIC8vIGhhbmRsZSBwYXJzaW5nIGFuZCBzZXJpYWxpemF0aW9uIG9mIHRoZSBwcm90b2NvbCBidWZmZXIgd2lyZSBmb3JtYXQKKyAgLy8gdXNpbmcgb25seSB0aGUgUmVmbGVjdGlvbiBpbnRlcmZhY2UuICBXaGVuIHlvdSBhc2sgdGhlIHByb3RvY29sCisgIC8vIGNvbXBpbGVyIHRvIG9wdGltaXplIGZvciBjb2RlIHNpemUgcmF0aGVyIHRoYW4gc3BlZWQsIGl0IHdpbGwgaW1wbGVtZW50CisgIC8vIHRob3NlIG1ldGhvZHMgaW4gdGVybXMgb2YgdGhlc2UgcHJvY2VkdXJlcy4gIE9mIGNvdXJzZSwgdGhlc2UgYXJlIG11Y2gKKyAgLy8gc2xvd2VyIHRoYW4gdGhlIHNwZWNpYWxpemVkIGltcGxlbWVudGF0aW9ucyB3aGljaCB0aGUgcHJvdG9jb2wgY29tcGlsZXIKKyAgLy8gZ2VuZXJhdGVzIHdoZW4gdG9sZCB0byBvcHRpbWl6ZSBmb3Igc3BlZWQuCisKKyAgLy8gUmVhZCBhIG1lc3NhZ2UgaW4gcHJvdG9jb2wgYnVmZmVyIHdpcmUgZm9ybWF0LgorICAvLworICAvLyBUaGlzIHByb2NlZHVyZSByZWFkcyBlaXRoZXIgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyZWFtIG9yIHRocm91Z2gKKyAgLy8gYSBXSVJFVFlQRV9FTkRfR1JPVVAgdGFnIGVuZGluZyB0aGUgbWVzc2FnZSwgd2hpY2hldmVyIGNvbWVzIGZpcnN0LgorICAvLyBJdCByZXR1cm5zIGZhbHNlIGlmIHRoZSBpbnB1dCBpcyBpbnZhbGlkLgorICAvLworICAvLyBSZXF1aXJlZCBmaWVsZHMgYXJlIE5PVCBjaGVja2VkIGJ5IHRoaXMgbWV0aG9kLiAgWW91IG11c3QgY2FsbAorICAvLyBJc0luaXRpYWxpemVkKCkgb24gdGhlIHJlc3VsdGluZyBtZXNzYWdlIHlvdXJzZWxmLgorICBzdGF0aWMgYm9vbCBQYXJzZUFuZE1lcmdlUGFydGlhbChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UpOworCisgIC8vIFNlcmlhbGl6ZSBhIG1lc3NhZ2UgaW4gcHJvdG9jb2wgYnVmZmVyIHdpcmUgZm9ybWF0LgorICAvLworICAvLyBBbnkgZW1iZWRkZWQgbWVzc2FnZXMgd2l0aGluIHRoZSBtZXNzYWdlIG11c3QgaGF2ZSB0aGVpciBjb3JyZWN0IHNpemVzCisgIC8vIGNhY2hlZC4gIEhvd2V2ZXIsIHRoZSB0b3AtbGV2ZWwgbWVzc2FnZSBuZWVkIG5vdDsgaXRzIHNpemUgaXMgcGFzc2VkIGFzCisgIC8vIGEgcGFyYW1ldGVyIHRvIHRoaXMgcHJvY2VkdXJlLgorICAvLworICAvLyBUaGVzZSByZXR1cm4gZmFsc2UgaWZmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSByZXR1cm5zIGEgd3JpdGUgZXJyb3IuCisgIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICBpbnQgc2l6ZSwgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworCisgIC8vIEltcGxlbWVudHMgTWVzc2FnZTo6Qnl0ZVNpemUoKSB2aWEgcmVmbGVjdGlvbi4gIFdBUk5JTkc6ICBUaGUgcmVzdWx0CisgIC8vIG9mIHRoaXMgbWV0aG9kIGlzICpub3QqIGNhY2hlZCBhbnl3aGVyZS4gIEhvd2V2ZXIsIGFsbCBlbWJlZGRlZCBtZXNzYWdlcworICAvLyB3aWxsIGhhdmUgdGhlaXIgQnl0ZVNpemUoKSBtZXRob2RzIGNhbGxlZCwgc28gdGhlaXIgc2l6ZXMgd2lsbCBiZSBjYWNoZWQuCisgIC8vIFRoZXJlZm9yZSwgY2FsbGluZyB0aGlzIG1ldGhvZCBpcyBzdWZmaWNpZW50IHRvIGFsbG93IHlvdSB0byBjYWxsCisgIC8vIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpIG9uIHRoZSBzYW1lIG9iamVjdC4KKyAgc3RhdGljIGludCBCeXRlU2l6ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKKworCisgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyB0YWdzLiAgKElubGluZWQgYmVsb3cgYW5kIGluCisgIC8vIF9pbmwuaCkKKyAgLy8KKyAgLy8gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBNYWtlVGFnKGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSkgaW4gdGhlIGNhc2UKKyAgLy8gb2YgcGFja2VkIHJlcGVhdGVkIGZpZWxkcy4KKyAgc3RhdGljIHVpbnQzMiBNYWtlVGFnKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgIC8vIFBhcnNlIGEgc2luZ2xlIGZpZWxkLiAgVGhlIGlucHV0IHNob3VsZCBzdGFydCBvdXQgcG9zaXRpb25lZCBpbW1pZGF0ZWx5CisgIC8vIGFmdGVyIHRoZSB0YWcuCisgIHN0YXRpYyBib29sIFBhcnNlQW5kTWVyZ2VGaWVsZCgKKyAgICAgIHVpbnQzMiB0YWcsCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgLy8gTWF5IGJlIE5VTEwgZm9yIHVua25vd24KKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworCisgIC8vIFNlcmlhbGl6ZSBhIHNpbmdsZSBmaWVsZC4KKyAgc3RhdGljIHZvaWQgU2VyaWFsaXplRmllbGRXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgLy8gQ2Fubm90IGJlIE5VTEwKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKKyAgLy8gQ29tcHV0ZSBzaXplIG9mIGEgc2luZ2xlIGZpZWxkLiAgSWYgdGhlIGZpZWxkIGlzIGEgbWVzc2FnZSB0eXBlLCB0aGlzCisgIC8vIHdpbGwgY2FsbCBCeXRlU2l6ZSgpIGZvciB0aGUgZW1iZWRkZWQgbWVzc2FnZSwgaW5zdXJpbmcgdGhhdCBpdCBjYWNoZXMKKyAgLy8gaXRzIHNpemUuCisgIHN0YXRpYyBpbnQgRmllbGRCeXRlU2l6ZSgKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsICAgICAgICAvLyBDYW5ub3QgYmUgTlVMTAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgLy8gUGFyc2Uvc2VyaWFsaXplIGEgTWVzc2FnZVNldDo6SXRlbSBncm91cC4gIFVzZWQgd2l0aCBtZXNzYWdlcyB0aGF0IHVzZQorICAvLyBvcGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWUuCisgIHN0YXRpYyBib29sIFBhcnNlQW5kTWVyZ2VNZXNzYWdlU2V0SXRlbSgKKyAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXJpYWxpemVNZXNzYWdlU2V0SXRlbVdpdGhDYWNoZWRTaXplcygKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICBzdGF0aWMgaW50IE1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CisKKyAgLy8gQ29tcHV0ZXMgdGhlIGJ5dGUgc2l6ZSBvZiBhIGZpZWxkLCBleGNsdWRpbmcgdGFncy4gRm9yIHBhY2tlZCBmaWVsZHMsIGl0CisgIC8vIG9ubHkgaW5jbHVkZXMgdGhlIHNpemUgb2YgdGhlIHJhdyBkYXRhLCBhbmQgbm90IHRoZSBzaXplIG9mIHRoZSB0b3RhbAorICAvLyBsZW5ndGgsIGJ1dCBmb3Igb3RoZXIgbGVuZ3RoLWRlbGltaXRlZCB0eXBlcywgdGhlIHNpemUgb2YgdGhlIGxlbmd0aCBpcworICAvLyBpbmNsdWRlZC4KKyAgc3RhdGljIGludCBGaWVsZERhdGFPbmx5Qnl0ZVNpemUoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgLy8gQ2Fubm90IGJlIE5VTEwKKyAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOworCisgIGVudW0gT3BlcmF0aW9uIHsKKyAgICBQQVJTRSwKKyAgICBTRVJJQUxJWkUsCisgIH07CisKKyAgLy8gVmVyaWZpZXMgdGhhdCBhIHN0cmluZyBmaWVsZCBpcyB2YWxpZCBVVEY4LCBsb2dnaW5nIGFuIGVycm9yIGlmIG5vdC4KKyAgc3RhdGljIHZvaWQgVmVyaWZ5VVRGOFN0cmluZyhjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSwgT3BlcmF0aW9uIG9wKTsKKworIHByaXZhdGU6CisgIC8vIFZlcmlmaWVzIHRoYXQgYSBzdHJpbmcgZmllbGQgaXMgdmFsaWQgVVRGOCwgbG9nZ2luZyBhbiBlcnJvciBpZiBub3QuCisgIHN0YXRpYyB2b2lkIFZlcmlmeVVURjhTdHJpbmdGYWxsYmFjaygKKyAgICAgIGNvbnN0IGNoYXIqIGRhdGEsCisgICAgICBpbnQgc2l6ZSwKKyAgICAgIE9wZXJhdGlvbiBvcCk7CisKKworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXaXJlRm9ybWF0KTsKK307CisKKy8vIGlubGluZSBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBXaXJlRm9ybWF0OjpXaXJlVHlwZUZvckZpZWxkKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgaWYgKGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFdpcmVUeXBlRm9yRmllbGRUeXBlKGZpZWxkLT50eXBlKCkpOworICB9Cit9CisKK2lubGluZSBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgV2lyZUZvcm1hdDo6V2lyZVR5cGVGb3JGaWVsZFR5cGUoCisgICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgLy8gU29tZSBjb21waWxlcnMgZG9uJ3QgbGlrZSBlbnVtIC0+IGVudW0gY2FzdHMsIHNvIHdlIGltcGxpY2l0X2Nhc3QgdG8KKyAgLy8gaW50IGZpcnN0LgorICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlRm9yRmllbGRUeXBlKAorICAgICAgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZT4oCisgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50Pih0eXBlKSkpOworfQorCitpbmxpbmUgdWludDMyIFdpcmVGb3JtYXQ6Ok1ha2VUYWcoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQtPm51bWJlcigpLCBXaXJlVHlwZUZvckZpZWxkKGZpZWxkKSk7Cit9CisKK2lubGluZSBpbnQgV2lyZUZvcm1hdDo6VGFnU2l6ZShpbnQgZmllbGRfbnVtYmVyLCBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICAvLyBTb21lIGNvbXBpbGVycyBkb24ndCBsaWtlIGVudW0gLT4gZW51bSBjYXN0cywgc28gd2UgaW1wbGljaXRfY2FzdCB0bworICAvLyBpbnQgZmlyc3QuCisgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6VGFnU2l6ZShmaWVsZF9udW1iZXIsCisgICAgICBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlPigKKyAgICAgICAgaW1wbGljaXRfY2FzdDxpbnQ+KHR5cGUpKSk7Cit9CisKK2lubGluZSB2b2lkIFdpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUsCisgICAgV2lyZUZvcm1hdDo6T3BlcmF0aW9uIG9wKSB7CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECisgIFdpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdGYWxsYmFjayhkYXRhLCBzaXplLCBvcCk7CisjZW5kaWYKK30KKworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjkyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmNjCkBAIC0wLDAgKzEsNTg0IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgorCisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV9pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworI2lmbmRlZiBfTVNDX1ZFUiAgICAvLyBNU1ZDIGRvZXNuJ3QgbGlrZSBkZWZpbml0aW9ucyBvZiBpbmxpbmUgY29uc3RhbnRzLCBHQ0MKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZXMgdGhlbS4KK2NvbnN0IGludCBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWc7Citjb25zdCBpbnQgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZzsKK2NvbnN0IGludCBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWRUYWc7Citjb25zdCBpbnQgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZVRhZzsKKworI2VuZGlmCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYm9vbCBGaWVsZFNraXBwZXI6OlNraXBGaWVsZCgKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMiB0YWcpIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgdW5rbm93bl9maWVsZHNfKTsKK30KKworYm9vbCBGaWVsZFNraXBwZXI6OlNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OlNraXBNZXNzYWdlKGlucHV0LCB1bmtub3duX2ZpZWxkc18pOworfQorCit2b2lkIEZpZWxkU2tpcHBlcjo6U2tpcFVua25vd25FbnVtKAorICAgIGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSkgeworICB1bmtub3duX2ZpZWxkc18tPkFkZFZhcmludChmaWVsZF9udW1iZXIsIHZhbHVlKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjb25zdCBpbnQgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVRhZ3NTaXplID0KKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpTdGF0aWNWYXJpbnRTaXplMzI8a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWc+Ojp2YWx1ZSArCisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6U3RhdGljVmFyaW50U2l6ZTMyPGtNZXNzYWdlU2V0SXRlbUVuZFRhZz46OnZhbHVlICsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpTdGF0aWNWYXJpbnRTaXplMzI8a01lc3NhZ2VTZXRUeXBlSWRUYWc+Ojp2YWx1ZSArCisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6U3RhdGljVmFyaW50U2l6ZTMyPGtNZXNzYWdlU2V0TWVzc2FnZVRhZz46OnZhbHVlOworCitjb25zdCBXaXJlRm9ybWF0TGl0ZTo6Q3BwVHlwZQorV2lyZUZvcm1hdExpdGU6OmtGaWVsZFR5cGVUb0NwcFR5cGVNYXBbTUFYX0ZJRUxEX1RZUEUgKyAxXSA9IHsKKyAgc3RhdGljX2Nhc3Q8Q3BwVHlwZT4oMCksICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMKKworICBDUFBUWVBFX0RPVUJMRSwgICAvLyBUWVBFX0RPVUJMRQorICBDUFBUWVBFX0ZMT0FULCAgICAvLyBUWVBFX0ZMT0FUCisgIENQUFRZUEVfSU5UNjQsICAgIC8vIFRZUEVfSU5UNjQKKyAgQ1BQVFlQRV9VSU5UNjQsICAgLy8gVFlQRV9VSU5UNjQKKyAgQ1BQVFlQRV9JTlQzMiwgICAgLy8gVFlQRV9JTlQzMgorICBDUFBUWVBFX1VJTlQ2NCwgICAvLyBUWVBFX0ZJWEVENjQKKyAgQ1BQVFlQRV9VSU5UMzIsICAgLy8gVFlQRV9GSVhFRDMyCisgIENQUFRZUEVfQk9PTCwgICAgIC8vIFRZUEVfQk9PTAorICBDUFBUWVBFX1NUUklORywgICAvLyBUWVBFX1NUUklORworICBDUFBUWVBFX01FU1NBR0UsICAvLyBUWVBFX0dST1VQCisgIENQUFRZUEVfTUVTU0FHRSwgIC8vIFRZUEVfTUVTU0FHRQorICBDUFBUWVBFX1NUUklORywgICAvLyBUWVBFX0JZVEVTCisgIENQUFRZUEVfVUlOVDMyLCAgIC8vIFRZUEVfVUlOVDMyCisgIENQUFRZUEVfRU5VTSwgICAgIC8vIFRZUEVfRU5VTQorICBDUFBUWVBFX0lOVDMyLCAgICAvLyBUWVBFX1NGSVhFRDMyCisgIENQUFRZUEVfSU5UNjQsICAgIC8vIFRZUEVfU0ZJWEVENjQKKyAgQ1BQVFlQRV9JTlQzMiwgICAgLy8gVFlQRV9TSU5UMzIKKyAgQ1BQVFlQRV9JTlQ2NCwgICAgLy8gVFlQRV9TSU5UNjQKK307CisKK2NvbnN0IFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZQorV2lyZUZvcm1hdExpdGU6OmtXaXJlVHlwZUZvckZpZWxkVHlwZVtNQVhfRklFTERfVFlQRSArIDFdID0geworICBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGU+KC0xKSwgIC8vIGludmFsaWQKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQsICAgICAgICAgICAvLyBUWVBFX0RPVUJMRQorICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMiwgICAgICAgICAgIC8vIFRZUEVfRkxPQVQKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgICAgICAgICAgICAvLyBUWVBFX0lOVDY0CisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICAgICAgICAgICAgLy8gVFlQRV9VSU5UNjQKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgICAgICAgICAgICAvLyBUWVBFX0lOVDMyCisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDY0LCAgICAgICAgICAgLy8gVFlQRV9GSVhFRDY0CisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyLCAgICAgICAgICAgLy8gVFlQRV9GSVhFRDMyCisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICAgICAgICAgICAgLy8gVFlQRV9CT09MCisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCAgLy8gVFlQRV9TVFJJTkcKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQLCAgICAgICAvLyBUWVBFX0dST1VQCisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCAgLy8gVFlQRV9NRVNTQUdFCisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCAgLy8gVFlQRV9CWVRFUworICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAgICAgICAgICAgIC8vIFRZUEVfVUlOVDMyCisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICAgICAgICAgICAgLy8gVFlQRV9FTlVNCisgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyLCAgICAgICAgICAgLy8gVFlQRV9TRklYRUQzMgorICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCwgICAgICAgICAgIC8vIFRZUEVfU0ZJWEVENjQKKyAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgICAgICAgICAgICAvLyBUWVBFX1NJTlQzMgorICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAgICAgICAgICAgIC8vIFRZUEVfU0lOVDY0Cit9OworCitib29sIFdpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgaW50IG51bWJlciA9IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpOworCisgIHN3aXRjaCAoV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykpIHsKKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQ6IHsKKyAgICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQ2NCgmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodW5rbm93bl9maWVsZHMgIT0gTlVMTCkgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChudW1iZXIsIHZhbHVlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDY0OiB7CisgICAgICB1aW50NjQgdmFsdWU7CisgICAgICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuNjQoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHVua25vd25fZmllbGRzICE9IE5VTEwpIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDY0KG51bWJlciwgdmFsdWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6IHsKKyAgICAgIHVpbnQzMiBsZW5ndGg7CisgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh1bmtub3duX2ZpZWxkcyA9PSBOVUxMKSB7CisgICAgICAgIGlmICghaW5wdXQtPlNraXAobGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFpbnB1dC0+UmVhZFN0cmluZyh1bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKG51bWJlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQOiB7CisgICAgICBpZiAoIWlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIVNraXBNZXNzYWdlKGlucHV0LCAodW5rbm93bl9maWVsZHMgPT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA6IHVua25vd25fZmllbGRzLT5BZGRHcm91cChudW1iZXIpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpbnB1dC0+RGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGVuZGluZyB0YWcgbWF0Y2hlZCB0aGUgc3RhcnRpbmcgdGFnLgorICAgICAgaWYgKCFpbnB1dC0+TGFzdFRhZ1dhcyhXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSwKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUDogeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyOiB7CisgICAgICB1aW50MzIgdmFsdWU7CisgICAgICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHVua25vd25fZmllbGRzICE9IE5VTEwpIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDMyKG51bWJlciwgdmFsdWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KKworYm9vbCBXaXJlRm9ybWF0TGl0ZTo6U2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICB3aGlsZSh0cnVlKSB7CisgICAgdWludDMyIHRhZyA9IGlucHV0LT5SZWFkVGFnKCk7CisgICAgaWYgKHRhZyA9PSAwKSB7CisgICAgICAvLyBFbmQgb2YgaW5wdXQuICBUaGlzIGlzIGEgdmFsaWQgcGxhY2UgdG8gZW5kLCBzbyByZXR1cm4gdHJ1ZS4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSB3aXJlX3R5cGUgPSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKTsKKworICAgIGlmICh3aXJlX3R5cGUgPT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgLy8gTXVzdCBiZSB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFTa2lwRmllbGQoaW5wdXQsIHRhZywgdW5rbm93bl9maWVsZHMpKSByZXR1cm4gZmFsc2U7CisgIH0KK30KKwordm9pZCBXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcyhjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKyAgICBzd2l0Y2ggKGZpZWxkLnR5cGUoKSkgeworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UOgorICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSk7CisgICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQ2NChmaWVsZC52YXJpbnQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQzMjoKKyAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzIpKTsKKyAgICAgICAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjMyKGZpZWxkLmZpeGVkMzIoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKKyAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQpKTsKKyAgICAgICAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjY0KGZpZWxkLmZpeGVkNjQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpKTsKKyAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKS5zaXplKCkpOworICAgICAgICBvdXRwdXQtPldyaXRlU3RyaW5nKGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6CisgICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUCkpOworICAgICAgICBTZXJpYWxpemVVbmtub3duRmllbGRzKGZpZWxkLmdyb3VwKCksIG91dHB1dCk7CisgICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3VpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICB1aW50OCogdGFyZ2V0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCA9IHVua25vd25fZmllbGRzLmZpZWxkKGkpOworCisgICAgc3dpdGNoIChmaWVsZC50eXBlKCkpIHsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVDoKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjRUb0FycmF5KAorICAgICAgICAgICAgZmllbGQubnVtYmVyKCksIGZpZWxkLnZhcmludCgpLCB0YXJnZXQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6CisgICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkMzJUb0FycmF5KAorICAgICAgICAgICAgZmllbGQubnVtYmVyKCksIGZpZWxkLmZpeGVkMzIoKSwgdGFyZ2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OgorICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDY0VG9BcnJheSgKKyAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBmaWVsZC5maXhlZDY0KCksIHRhcmdldCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXNUb0FycmF5KAorICAgICAgICAgICAgZmllbGQubnVtYmVyKCksIGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKSwgdGFyZ2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDoKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnVG9BcnJheSgKKyAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVAsIHRhcmdldCk7CisgICAgICAgIHRhcmdldCA9IFNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KGZpZWxkLmdyb3VwKCksIHRhcmdldCk7CisgICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoCisgICAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCwgdGFyZ2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiB0YXJnZXQ7Cit9CisKK3ZvaWQgV2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKyAgICAvLyBUaGUgb25seSB1bmtub3duIGZpZWxkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4aXN0IGluIGEgTWVzc2FnZVNldCBhcmUKKyAgICAvLyBtZXNzYWdlcywgd2hpY2ggYXJlIGxlbmd0aC1kZWxpbWl0ZWQuCisgICAgaWYgKGZpZWxkLnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgY29uc3Qgc3RyaW5nJiBkYXRhID0gZmllbGQubGVuZ3RoX2RlbGltaXRlZCgpOworCisgICAgICAvLyBTdGFydCBncm91cC4KKyAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWcpOworCisgICAgICAvLyBXcml0ZSB0eXBlIElELgorICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZyk7CisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoZmllbGQubnVtYmVyKCkpOworCisgICAgICAvLyBXcml0ZSBtZXNzYWdlLgorICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VUYWcpOworICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKGRhdGEuc2l6ZSgpKTsKKyAgICAgIG91dHB1dC0+V3JpdGVTdHJpbmcoZGF0YSk7CisKKyAgICAgIC8vIEVuZCBncm91cC4KKyAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnKTsKKyAgICB9CisgIH0KK30KKwordWludDgqIFdpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheSgKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7CisKKyAgICAvLyBUaGUgb25seSB1bmtub3duIGZpZWxkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4aXN0IGluIGEgTWVzc2FnZVNldCBhcmUKKyAgICAvLyBtZXNzYWdlcywgd2hpY2ggYXJlIGxlbmd0aC1kZWxpbWl0ZWQuCisgICAgaWYgKGZpZWxkLnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgY29uc3Qgc3RyaW5nJiBkYXRhID0gZmllbGQubGVuZ3RoX2RlbGltaXRlZCgpOworCisgICAgICAvLyBTdGFydCBncm91cC4KKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZywgdGFyZ2V0KTsKKworICAgICAgLy8gV3JpdGUgdHlwZSBJRC4KKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZywgdGFyZ2V0KTsKKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoCisgICAgICAgICAgZmllbGQubnVtYmVyKCksIHRhcmdldCk7CisKKyAgICAgIC8vIFdyaXRlIG1lc3NhZ2UuCisgICAgICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnLCB0YXJnZXQpOworICAgICAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheShkYXRhLnNpemUoKSwgdGFyZ2V0KTsKKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmdUb0FycmF5KGRhdGEsIHRhcmdldCk7CisKKyAgICAgIC8vIEVuZCBncm91cC4KKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1FbmRUYWcsIHRhcmdldCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IFdpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcykgeworICBpbnQgc2l6ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCA9IHVua25vd25fZmllbGRzLmZpZWxkKGkpOworCisgICAgc3dpdGNoIChmaWVsZC50eXBlKCkpIHsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVDoKKyAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkpOworICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTY0KGZpZWxkLnZhcmludCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOgorICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMikpOworICAgICAgICBzaXplICs9IHNpemVvZihpbnQzMik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKKyAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQpKTsKKyAgICAgICAgc2l6ZSArPSBzaXplb2YoaW50NjQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSk7CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICAgICAgICBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCkuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZSArPSBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCkuc2l6ZSgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgorICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVApKTsKKyAgICAgICAgc2l6ZSArPSBDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoZmllbGQuZ3JvdXAoKSk7CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKK2ludCBXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25NZXNzYWdlU2V0SXRlbXNTaXplKAorICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMpIHsKKyAgaW50IHNpemUgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKworICAgIC8vIFRoZSBvbmx5IHVua25vd24gZmllbGRzIHRoYXQgYXJlIGFsbG93ZWQgdG8gZXhpc3QgaW4gYSBNZXNzYWdlU2V0IGFyZQorICAgIC8vIG1lc3NhZ2VzLCB3aGljaCBhcmUgbGVuZ3RoLWRlbGltaXRlZC4KKyAgICBpZiAoZmllbGQudHlwZSgpID09IFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICBzaXplICs9IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1UYWdzU2l6ZTsKKyAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoZmllbGQubnVtYmVyKCkpOworICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKKyAgICAgICAgZmllbGQubGVuZ3RoX2RlbGltaXRlZCgpLnNpemUoKSk7CisgICAgICBzaXplICs9IGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKS5zaXplKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRFbnVtTm9JbmxpbmUoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqaXNfdmFsaWQpKGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50PiogdmFsdWVzKSB7CisgIHVpbnQzMiBsZW5ndGg7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBpbnB1dC0+UHVzaExpbWl0KGxlbmd0aCk7CisgIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7CisgICAgaW50IHZhbHVlOworICAgIGlmICghZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICBpbnQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KGlucHV0LCAmdmFsdWUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChpc192YWxpZCh2YWx1ZSkpIHsKKyAgICAgIHZhbHVlcy0+QWRkKHZhbHVlKTsKKyAgICB9CisgIH0KKyAgaW5wdXQtPlBvcExpbWl0KGxpbWl0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoaW50IGZpZWxkX251bWJlciwgaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCBvdXRwdXQpOworICBXcml0ZUludDMyTm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0KGludCBmaWVsZF9udW1iZXIsIGludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKKyAgV3JpdGVJbnQ2NE5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzIoaW50IGZpZWxkX251bWJlciwgdWludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIG91dHB1dCk7CisgIFdyaXRlVUludDMyTm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQ2NChpbnQgZmllbGRfbnVtYmVyLCB1aW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKKyAgV3JpdGVVSW50NjROb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDMyKGludCBmaWVsZF9udW1iZXIsIGludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIG91dHB1dCk7CisgIFdyaXRlU0ludDMyTm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQ2NChpbnQgZmllbGRfbnVtYmVyLCBpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCBvdXRwdXQpOworICBXcml0ZVNJbnQ2NE5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyKGludCBmaWVsZF9udW1iZXIsIHVpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVEMzIsIG91dHB1dCk7CisgIFdyaXRlRml4ZWQzMk5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDY0KGludCBmaWVsZF9udW1iZXIsIHVpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVENjQsIG91dHB1dCk7CisgIFdyaXRlRml4ZWQ2NE5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQzMihpbnQgZmllbGRfbnVtYmVyLCBpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDMyLCBvdXRwdXQpOworICBXcml0ZVNGaXhlZDMyTm9UYWcodmFsdWUsIG91dHB1dCk7Cit9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDY0KGludCBmaWVsZF9udW1iZXIsIGludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVENjQsIG91dHB1dCk7CisgIFdyaXRlU0ZpeGVkNjROb1RhZyh2YWx1ZSwgb3V0cHV0KTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRmxvYXQoaW50IGZpZWxkX251bWJlciwgZmxvYXQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQzMiwgb3V0cHV0KTsKKyAgV3JpdGVGbG9hdE5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVEb3VibGUoaW50IGZpZWxkX251bWJlciwgZG91YmxlIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDY0LCBvdXRwdXQpOworICBXcml0ZURvdWJsZU5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKGludCBmaWVsZF9udW1iZXIsIGJvb2wgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIG91dHB1dCk7CisgIFdyaXRlQm9vbE5vVGFnKHZhbHVlLCBvdXRwdXQpOworfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKKyAgV3JpdGVFbnVtTm9UYWcodmFsdWUsIG91dHB1dCk7Cit9CisKK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKGludCBmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICAvLyBTdHJpbmcgaXMgZm9yIFVURi04IHRleHQgb25seQorICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMih2YWx1ZS5zaXplKCkpOworICBvdXRwdXQtPldyaXRlU3RyaW5nKHZhbHVlKTsKK30KK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXMoaW50IGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIodmFsdWUuc2l6ZSgpKTsKKyAgb3V0cHV0LT5Xcml0ZVN0cmluZyh2YWx1ZSk7Cit9CisKKwordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVHcm91cChpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfU1RBUlRfR1JPVVAsIG91dHB1dCk7CisgIHZhbHVlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhvdXRwdXQpOworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0VORF9HUk9VUCwgb3V0cHV0KTsKK30KKwordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlKGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKKyAgY29uc3QgaW50IHNpemUgPSB2YWx1ZS5HZXRDYWNoZWRTaXplKCk7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihzaXplKTsKKyAgdmFsdWUuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7Cit9CisKK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlR3JvdXBNYXliZVRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1NUQVJUX0dST1VQLCBvdXRwdXQpOworICBjb25zdCBpbnQgc2l6ZSA9IHZhbHVlLkdldENhY2hlZFNpemUoKTsKKyAgdWludDgqIHRhcmdldCA9IG91dHB1dC0+R2V0RGlyZWN0QnVmZmVyRm9yTkJ5dGVzQW5kQWR2YW5jZShzaXplKTsKKyAgaWYgKHRhcmdldCAhPSBOVUxMKSB7CisgICAgdWludDgqIGVuZCA9IHZhbHVlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKKyAgICBHT09HTEVfRENIRUNLX0VRKGVuZCAtIHRhcmdldCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgdmFsdWUuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7CisgIH0KKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9FTkRfR1JPVVAsIG91dHB1dCk7Cit9CisKK3ZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7CisgIGNvbnN0IGludCBzaXplID0gdmFsdWUuR2V0Q2FjaGVkU2l6ZSgpOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIoc2l6ZSk7CisgIHVpbnQ4KiB0YXJnZXQgPSBvdXRwdXQtPkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2Uoc2l6ZSk7CisgIGlmICh0YXJnZXQgIT0gTlVMTCkgeworICAgIHVpbnQ4KiBlbmQgPSB2YWx1ZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHRhcmdldCk7CisgICAgR09PR0xFX0RDSEVDS19FUShlbmQgLSB0YXJnZXQsIHNpemUpOworICB9IGVsc2UgeworICAgIHZhbHVlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhvdXRwdXQpOworICB9Cit9CisKK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHZhbHVlKSB7CisgIC8vIFN0cmluZyBpcyBmb3IgVVRGLTggdGV4dCBvbmx5CisgIHVpbnQzMiBsZW5ndGg7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICBpZiAoIWlucHV0LT5JbnRlcm5hbFJlYWRTdHJpbmdJbmxpbmUodmFsdWUsIGxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9Citib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogdmFsdWUpIHsKKyAgdWludDMyIGxlbmd0aDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiBpbnB1dC0+SW50ZXJuYWxSZWFkU3RyaW5nSW5saW5lKHZhbHVlLCBsZW5ndGgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTIzZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmgKQEAgLTAsMCArMSw2NjkgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICAgICAgICAgYXRlbmFzaW9AZ29vZ2xlLmNvbSAoQ2hyaXMgQXRlbmFzaW8pIChaaWdaYWcgdHJhbnNmb3JtKQorLy8gICAgICAgICB3aW5rQGdvb2dsZS5jb20gKFdpbmsgU2F2aWxsZSkgKHJlZmFjdG9yZWQgZnJvbSB3aXJlX2Zvcm1hdC5oKQorLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CisvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCisvLworLy8gVGhpcyBoZWFkZXIgaXMgbG9naWNhbGx5IGludGVybmFsLCBidXQgaXMgbWFkZSBwdWJsaWMgYmVjYXVzZSBpdCBpcyB1c2VkCisvLyBmcm9tIHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlLCB3aGljaCBtYXkgcmVzaWRlIGluIG90aGVyIGNvbXBvbmVudHMuCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX0xJVEVfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9MSVRFX0hfXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBSZXBlYXRlZEZpZWxkOyAgLy8gcmVwZWF0ZWRfZmllbGQuaAorICBuYW1lc3BhY2UgaW8geworICAgIGNsYXNzIENvZGVkSW5wdXRTdHJlYW07ICAgICAgICAgICAgIC8vIGNvZGVkX3N0cmVhbS5oCisgICAgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07ICAgICAgICAgICAgLy8gY29kZWRfc3RyZWFtLmgKKyAgfQorICBjbGFzcyBVbmtub3duRmllbGRTZXQ7Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBTdHJpbmdQaWVjZUZpZWxkOworCisvLyBUaGlzIGNsYXNzIGlzIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBsaWJyYXJ5IGFuZCBieQorLy8gcHJvdG9jb2wtY29tcGxpZXItZ2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3Nlcy4gIEl0IG11c3Qgbm90IGJlIGNhbGxlZAorLy8gZGlyZWN0bHkgYnkgY2xpZW50cy4KKy8vCisvLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgZm9yIGltcGxlbWVudGluZyB0aGUgYmluYXJ5IHByb3RvY29sIGJ1ZmZlcgorLy8gd2lyZSBmb3JtYXQgd2l0aG91dCB0aGUgbmVlZCBmb3IgcmVmbGVjdGlvbi4gVXNlIFdpcmVGb3JtYXQgd2hlbiB1c2luZworLy8gcmVmbGVjdGlvbi4KKy8vCisvLyBUaGlzIGNsYXNzIGlzIHJlYWxseSBhIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIG9ubHkgc3RhdGljIG1ldGhvZHMuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgV2lyZUZvcm1hdExpdGUgeworIHB1YmxpYzoKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBIZWxwZXIgY29uc3RhbnRzIGFuZCBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgZm9ybWF0LiAgVGhlc2UgYXJlCisgIC8vIG1vc3RseSBtZWFudCBmb3IgaW50ZXJuYWwgYW5kIGdlbmVyYXRlZCBjb2RlIHRvIHVzZS4KKworICAvLyBUaGUgd2lyZSBmb3JtYXQgaXMgY29tcG9zZWQgb2YgYSBzZXF1ZW5jZSBvZiB0YWcvdmFsdWUgcGFpcnMsIGVhY2gKKyAgLy8gb2Ygd2hpY2ggY29udGFpbnMgdGhlIHZhbHVlIG9mIG9uZSBmaWVsZCAob3Igb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZAorICAvLyBmaWVsZCkuICBFYWNoIHRhZyBpcyBlbmNvZGVkIGFzIGEgdmFyaW50LiAgVGhlIGxvd2VyIGJpdHMgb2YgdGhlIHRhZworICAvLyBpZGVudGlmeSBpdHMgd2lyZSB0eXBlLCB3aGljaCBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSB0byBmb2xsb3cuCisgIC8vIFRoZSByZXN0IG9mIHRoZSBiaXRzIGNvbnRhaW4gdGhlIGZpZWxkIG51bWJlci4gIEVhY2ggdHlwZSBvZiBmaWVsZCAoYXMKKyAgLy8gZGVjbGFyZWQgYnkgRmllbGREZXNjcmlwdG9yOjpUeXBlLCBpbiBkZXNjcmlwdG9yLmgpIG1hcHMgdG8gb25lIG9mCisgIC8vIHRoZXNlIHdpcmUgdHlwZXMuICBJbW1lZGlhdGVseSBmb2xsb3dpbmcgZWFjaCB0YWcgaXMgdGhlIGZpZWxkJ3MgdmFsdWUsCisgIC8vIGVuY29kZWQgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgdGhlIHdpcmUgdHlwZS4gIEJlY2F1c2UgdGhlIHRhZworICAvLyBpZGVudGlmaWVzIHRoZSBlbmNvZGluZyBvZiB0aGlzIGRhdGEsIGl0IGlzIHBvc3NpYmxlIHRvIHNraXAKKyAgLy8gdW5yZWNvZ25pemVkIGZpZWxkcyBmb3IgZm9yd2FyZHMgY29tcGF0aWJpbGl0eS4KKworICBlbnVtIFdpcmVUeXBlIHsKKyAgICBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgID0gMCwKKyAgICBXSVJFVFlQRV9GSVhFRDY0ICAgICAgICAgID0gMSwKKyAgICBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEID0gMiwKKyAgICBXSVJFVFlQRV9TVEFSVF9HUk9VUCAgICAgID0gMywKKyAgICBXSVJFVFlQRV9FTkRfR1JPVVAgICAgICAgID0gNCwKKyAgICBXSVJFVFlQRV9GSVhFRDMyICAgICAgICAgID0gNSwKKyAgfTsKKworICAvLyBMaXRlIGFsdGVybmF0aXZlIHRvIEZpZWxkRGVzY3JpcHRvcjo6VHlwZS4gIE11c3QgYmUga2VwdCBpbiBzeW5jLgorICBlbnVtIEZpZWxkVHlwZSB7CisgICAgVFlQRV9ET1VCTEUgICAgICAgICA9IDEsCisgICAgVFlQRV9GTE9BVCAgICAgICAgICA9IDIsCisgICAgVFlQRV9JTlQ2NCAgICAgICAgICA9IDMsCisgICAgVFlQRV9VSU5UNjQgICAgICAgICA9IDQsCisgICAgVFlQRV9JTlQzMiAgICAgICAgICA9IDUsCisgICAgVFlQRV9GSVhFRDY0ICAgICAgICA9IDYsCisgICAgVFlQRV9GSVhFRDMyICAgICAgICA9IDcsCisgICAgVFlQRV9CT09MICAgICAgICAgICA9IDgsCisgICAgVFlQRV9TVFJJTkcgICAgICAgICA9IDksCisgICAgVFlQRV9HUk9VUCAgICAgICAgICA9IDEwLAorICAgIFRZUEVfTUVTU0FHRSAgICAgICAgPSAxMSwKKyAgICBUWVBFX0JZVEVTICAgICAgICAgID0gMTIsCisgICAgVFlQRV9VSU5UMzIgICAgICAgICA9IDEzLAorICAgIFRZUEVfRU5VTSAgICAgICAgICAgPSAxNCwKKyAgICBUWVBFX1NGSVhFRDMyICAgICAgID0gMTUsCisgICAgVFlQRV9TRklYRUQ2NCAgICAgICA9IDE2LAorICAgIFRZUEVfU0lOVDMyICAgICAgICAgPSAxNywKKyAgICBUWVBFX1NJTlQ2NCAgICAgICAgID0gMTgsCisgICAgTUFYX0ZJRUxEX1RZUEUgICAgICA9IDE4LAorICB9OworCisgIC8vIExpdGUgYWx0ZXJuYXRpdmUgdG8gRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlLiAgTXVzdCBiZSBrZXB0IGluIHN5bmMuCisgIGVudW0gQ3BwVHlwZSB7CisgICAgQ1BQVFlQRV9JTlQzMiAgICAgICA9IDEsCisgICAgQ1BQVFlQRV9JTlQ2NCAgICAgICA9IDIsCisgICAgQ1BQVFlQRV9VSU5UMzIgICAgICA9IDMsCisgICAgQ1BQVFlQRV9VSU5UNjQgICAgICA9IDQsCisgICAgQ1BQVFlQRV9ET1VCTEUgICAgICA9IDUsCisgICAgQ1BQVFlQRV9GTE9BVCAgICAgICA9IDYsCisgICAgQ1BQVFlQRV9CT09MICAgICAgICA9IDcsCisgICAgQ1BQVFlQRV9FTlVNICAgICAgICA9IDgsCisgICAgQ1BQVFlQRV9TVFJJTkcgICAgICA9IDksCisgICAgQ1BQVFlQRV9NRVNTQUdFICAgICA9IDEwLAorICAgIE1BWF9DUFBUWVBFICAgICAgICAgPSAxMCwKKyAgfTsKKworICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgQ3BwVHlwZSBmb3IgYSBwYXJ0aWN1bGFyIFR5cGUuCisgIHN0YXRpYyBDcHBUeXBlIEZpZWxkVHlwZVRvQ3BwVHlwZShGaWVsZFR5cGUgdHlwZSk7CisKKyAgLy8gR2l2ZW4gYSBGaWVsZFNlc2NyaXB0b3I6OlR5cGUgcmV0dXJuIGl0cyBXaXJlVHlwZQorICBzdGF0aWMgaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBXaXJlVHlwZUZvckZpZWxkVHlwZSgKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgdHlwZSkgeworICAgIHJldHVybiBrV2lyZVR5cGVGb3JGaWVsZFR5cGVbdHlwZV07CisgIH0KKworICAvLyBOdW1iZXIgb2YgYml0cyBpbiBhIHRhZyB3aGljaCBpZGVudGlmeSB0aGUgd2lyZSB0eXBlLgorICBzdGF0aWMgY29uc3QgaW50IGtUYWdUeXBlQml0cyA9IDM7CisgIC8vIE1hc2sgZm9yIHRob3NlIGJpdHMuCisgIHN0YXRpYyBjb25zdCB1aW50MzIga1RhZ1R5cGVNYXNrID0gKDEgPDwga1RhZ1R5cGVCaXRzKSAtIDE7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHRhZ3MuICAoSW5saW5lZCBiZWxvdyBhbmQgaW4KKyAgLy8gX2lubC5oKQorICAvLworICAvLyBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIE1ha2VUYWcoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSBpbiB0aGUgY2FzZQorICAvLyBvZiBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzLgorICBzdGF0aWMgdWludDMyIE1ha2VUYWcoaW50IGZpZWxkX251bWJlciwgV2lyZVR5cGUgdHlwZSk7CisgIHN0YXRpYyBXaXJlVHlwZSBHZXRUYWdXaXJlVHlwZSh1aW50MzIgdGFnKTsKKyAgc3RhdGljIGludCBHZXRUYWdGaWVsZE51bWJlcih1aW50MzIgdGFnKTsKKworICAvLyBDb21wdXRlIHRoZSBieXRlIHNpemUgb2YgYSB0YWcuICBGb3IgZ3JvdXBzLCB0aGlzIGluY2x1ZGVzIGJvdGggdGhlIHN0YXJ0CisgIC8vIGFuZCBlbmQgdGFncy4KKyAgc3RhdGljIGlubGluZSBpbnQgVGFnU2l6ZShpbnQgZmllbGRfbnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIHR5cGUpOworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEhlbHBlcnMgZm9yIGRlYWxpbmcgd2l0aCB1bmtub3duIGZpZWxkcworCisgIC8vIFNraXBzIGEgZmllbGQgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gdGFnLiAgVGhlIGlucHV0IHNob3VsZCBzdGFydAorICAvLyBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0YWcuICBTa2lwcGVkIHZhbHVlcyBhcmUgc2ltcGx5IGRpc2NhcmRlZCwKKyAgLy8gbm90IHJlY29yZGVkIGFueXdoZXJlLiAgU2VlIFdpcmVGb3JtYXQ6OlNraXBGaWVsZCgpIGZvciBhIHZlcnNpb24gdGhhdAorICAvLyByZWNvcmRzIHRvIGFuIFVua25vd25GaWVsZFNldC4KKyAgLy8gVE9ETyh4aWFvbWluZ3MsIGIvMjE0MDU5NTEpOiBUaGUgb3B0aW9uYWwgdmFsdWUgTlVMTCBmb3IgdW5rbm93bl9maWVsZCB3YXMKKyAgLy8gYWRkZWQgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggcHJvdG9jLTIuNC4wLiAgVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlCisgIC8vIHdlIGNhbiBjb21waWxlIHByb3RvYyBmcm9tIHNvdXJjZSBjb2RlLgorICBzdGF0aWMgYm9vbCBTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMgPSBOVUxMKTsKKworICAvLyBSZWFkcyBhbmQgaWdub3JlcyBhIG1lc3NhZ2UgZnJvbSB0aGUgaW5wdXQuICBJZiB1bmtub3duX2ZpZWxkcyBpcyBub24tTlVMTCwKKyAgLy8gdGhlIGNvbnRlbnRzIHdpbGwgYmUgYWRkZWQgdG8gaXQuCisgIHN0YXRpYyBib29sIFNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisKKworICAvLyBSZWFkcyBhbmQgaWdub3JlcyBhIG1lc3NhZ2UgZnJvbSB0aGUgaW5wdXQuICBTa2lwcGVkIHZhbHVlcyBtYXkgYmUgc3RvcmVkCisgIC8vIGluIHRoZSBVbmtub3duRmllbGRTZXQgaWYgaXQgZXhpc3RzLgorICBzdGF0aWMgYm9vbCBTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworCisvLyBUaGlzIG1hY3JvIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoKSwgYnV0IHRoZQorLy8gcmVzdWx0IGlzIHVzYWJsZSBhcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudCwgd2hpY2ggbWFrZXMgaXQgdXNhYmxlCisvLyBhcyBhIHN3aXRjaCBjYXNlIG9yIGEgdGVtcGxhdGUgaW5wdXQuICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygpIGlzIG1vcmUKKy8vIHR5cGUtc2FmZSwgdGhvdWdoLCBzbyBwcmVmZXIgaXQgaWYgcG9zc2libGUuCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9NQUtFX1RBRyhGSUVMRF9OVU1CRVIsIFRZUEUpICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWNfY2FzdDx1aW50MzI+KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKEZJRUxEX05VTUJFUikgPDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OmtUYWdUeXBlQml0cykgXAorICAgICAgfCAoVFlQRSkpCisKKyAgLy8gVGhlc2UgYXJlIHRoZSB0YWdzIGZvciB0aGUgb2xkIE1lc3NhZ2VTZXQgZm9ybWF0LCB3aGljaCB3YXMgZGVmaW5lZCBhczoKKyAgLy8gICBtZXNzYWdlIE1lc3NhZ2VTZXQgeworICAvLyAgICAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgeworICAvLyAgICAgICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKKyAgLy8gICAgICAgcmVxdWlyZWQgc3RyaW5nIG1lc3NhZ2UgPSAzOworICAvLyAgICAgfQorICAvLyAgIH0KKyAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVNldEl0ZW1OdW1iZXIgPSAxOworICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0VHlwZUlkTnVtYmVyID0gMjsKKyAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIgPSAzOworICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnID0KKyAgICBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTUFLRV9UQUcoa01lc3NhZ2VTZXRJdGVtTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVApOworICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0SXRlbUVuZFRhZyA9CisgICAgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX01BS0VfVEFHKGtNZXNzYWdlU2V0SXRlbU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCk7CisgIHN0YXRpYyBjb25zdCBpbnQga01lc3NhZ2VTZXRUeXBlSWRUYWcgPQorICAgIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9NQUtFX1RBRyhrTWVzc2FnZVNldFR5cGVJZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCk7CisgIHN0YXRpYyBjb25zdCBpbnQga01lc3NhZ2VTZXRNZXNzYWdlVGFnID0KKyAgICBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTUFLRV9UQUcoa01lc3NhZ2VTZXRNZXNzYWdlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisKKyAgLy8gQnl0ZSBzaXplIG9mIGFsbCB0YWdzIG9mIGEgTWVzc2FnZVNldDo6SXRlbSBjb21iaW5lZC4KKyAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVNldEl0ZW1UYWdzU2l6ZTsKKworICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gZmxvYXRzL2RvdWJsZXMgYW5kIElFRUUtNzU0CisgIC8vIHVpbnQzMnMvdWludDY0cyBzbyB0aGF0IHRoZXkgY2FuIGJlIHdyaXR0ZW4uICAoQXNzdW1lcyB5b3VyIHBsYXRmb3JtCisgIC8vIHVzZXMgSUVFRS03NTQgZmxvYXRzLikKKyAgc3RhdGljIHVpbnQzMiBFbmNvZGVGbG9hdChmbG9hdCB2YWx1ZSk7CisgIHN0YXRpYyBmbG9hdCBEZWNvZGVGbG9hdCh1aW50MzIgdmFsdWUpOworICBzdGF0aWMgdWludDY0IEVuY29kZURvdWJsZShkb3VibGUgdmFsdWUpOworICBzdGF0aWMgZG91YmxlIERlY29kZURvdWJsZSh1aW50NjQgdmFsdWUpOworCisgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hcHBpbmcgc2lnbmVkIGludGVnZXJzIHRvIHVuc2lnbmVkIGludGVnZXJzIGluCisgIC8vIHN1Y2ggYSB3YXkgdGhhdCBudW1iZXJzIHdpdGggc21hbGwgbWFnbml0dWRlcyB3aWxsIGVuY29kZSB0byBzbWFsbGVyCisgIC8vIHZhcmludHMuICBJZiB5b3Ugc2ltcGx5IHN0YXRpY19jYXN0IGEgbmVnYXRpdmUgbnVtYmVyIHRvIGFuIHVuc2lnbmVkCisgIC8vIG51bWJlciBhbmQgdmFyaW50LWVuY29kZSBpdCwgaXQgd2lsbCBhbHdheXMgdGFrZSAxMCBieXRlcywgZGVmZWF0aW5nCisgIC8vIHRoZSBwdXJwb3NlIG9mIHZhcmludC4gIFNvLCBmb3IgdGhlICJzaW50MzIiIGFuZCAic2ludDY0IiBmaWVsZCB0eXBlcywKKyAgLy8gd2UgWmlnWmFnLWVuY29kZSB0aGUgdmFsdWVzLgorICBzdGF0aWMgdWludDMyIFppZ1phZ0VuY29kZTMyKGludDMyIG4pOworICBzdGF0aWMgaW50MzIgIFppZ1phZ0RlY29kZTMyKHVpbnQzMiBuKTsKKyAgc3RhdGljIHVpbnQ2NCBaaWdaYWdFbmNvZGU2NChpbnQ2NCBuKTsKKyAgc3RhdGljIGludDY0ICBaaWdaYWdEZWNvZGU2NCh1aW50NjQgbik7CisKKyAgLy8gV3JpdGUgdGhlIGNvbnRlbnRzIG9mIGFuIFVua25vd25GaWVsZFNldCB0byB0aGUgb3V0cHV0LgorICBzdGF0aWMgdm9pZCBTZXJpYWxpemVVbmtub3duRmllbGRzKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICAvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLgorICAvLyBSZXF1aXJlcyB0aGF0IHRoZSBidWZmZXIgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5IGZvcgorICAvLyBDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodW5rbm93bl9maWVsZHMpLgorICAvLworICAvLyBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KKyAgc3RhdGljIHVpbnQ4KiBTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICB1aW50OCogdGFyZ2V0KTsKKworICAvLyBTYW1lIHRoaW5nIGV4Y2VwdCBmb3IgbWVzc2FnZXMgdGhhdCBoYXZlIHRoZSBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdAorICAvLyBvcHRpb24uCisgIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoCisgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICAvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLgorICAvLyBSZXF1aXJlcyB0aGF0IHRoZSBidWZmZXIgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5IGZvcgorICAvLyBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUodW5rbm93bl9maWVsZHMpLgorICAvLworICAvLyBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KKyAgc3RhdGljIHVpbnQ4KiBTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheSgKKyAgICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICB1aW50OCogdGFyZ2V0KTsKKworICAvLyBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBVbmtub3duRmllbGRTZXQgb24gdGhlIHdpcmUuCisgIHN0YXRpYyBpbnQgQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMpOworCisgIC8vIFNhbWUgdGhpbmcgZXhjZXB0IGZvciBtZXNzYWdlcyB0aGF0IGhhdmUgdGhlIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0CisgIC8vIG9wdGlvbi4KKyAgc3RhdGljIGludCBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUoCisgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKTsKKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBNZXRob2RzIGZvciByZWFkaW5nL3dyaXRpbmcgaW5kaXZpZHVhbCBmaWVsZC4gIFRoZSBpbXBsZW1lbnRhdGlvbnMKKyAgLy8gb2YgdGhlc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBpbiB3aXJlX2Zvcm1hdF9saXRlX2lubC5oOyB5b3UgbXVzdCAjaW5jbHVkZQorICAvLyB0aGF0IGZpbGUgdG8gdXNlIHRoZXNlLgorCisvLyBBdm9pZCB1Z2x5IGxpbmUgd3JhcHBpbmcKKyNkZWZpbmUgaW5wdXQgIGlvOjpDb2RlZElucHV0U3RyZWFtKiAgaW5wdXQKKyNkZWZpbmUgb3V0cHV0IGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0CisjZGVmaW5lIGZpZWxkX251bWJlciBpbnQgZmllbGRfbnVtYmVyCisjZGVmaW5lIElOTCBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKworICAvLyBSZWFkIGZpZWxkcywgbm90IGluY2x1ZGluZyB0YWdzLiAgVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB5b3UgYWxyZWFkeQorICAvLyByZWFkIHRoZSB0YWcgdG8gZGV0ZXJtaW5lIHdoYXQgZmllbGQgdG8gcmVhZC4KKworICAvLyBGb3IgcHJpbWl0aXZlIGZpZWxkcywgd2UganVzdCB1c2UgYSB0ZW1wbGF0aXplZCByb3V0aW5lIHBhcmFtZXRlcml6ZWQgYnkKKyAgLy8gdGhlIHJlcHJlc2VudGVkIHR5cGUgYW5kIHRoZSBGaWVsZFR5cGUuIFRoZXNlIGFyZSBzcGVjaWFsaXplZCB3aXRoIHRoZQorICAvLyBhcHByb3ByaWF0ZSBkZWZpbml0aW9uIGZvciBlYWNoIGRlY2xhcmVkIHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgorICBzdGF0aWMgaW5saW5lIGJvb2wgUmVhZFByaW1pdGl2ZShpbnB1dCwgQ1R5cGUqIHZhbHVlKSBJTkw7CisKKyAgLy8gUmVhZHMgcmVwZWF0ZWQgcHJpbWl0aXZlIHZhbHVlcywgd2l0aCBvcHRpbWl6YXRpb25zIGZvciByZXBlYXRzLgorICAvLyB0YWdfc2l6ZSBhbmQgdGFnIHNob3VsZCBib3RoIGJlIGNvbXBpbGUtdGltZSBjb25zdGFudHMgcHJvdmlkZWQgYnkgdGhlCisgIC8vIHByb3RvY29sIGNvbXBpbGVyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gRmllbGRUeXBlIERlY2xhcmVkVHlwZT4KKyAgc3RhdGljIGlubGluZSBib29sIFJlYWRSZXBlYXRlZFByaW1pdGl2ZShpbnQgdGFnX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWUpIElOTDsKKworICAvLyBJZGVudGljYWwgdG8gUmVhZFJlcGVhdGVkUHJpbWl0aXZlLCBleGNlcHQgd2lsbCBub3QgaW5saW5lIHRoZQorICAvLyBpbXBsZW1lbnRhdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+CisgIHN0YXRpYyBib29sIFJlYWRSZXBlYXRlZFByaW1pdGl2ZU5vSW5saW5lKGludCB0YWdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSk7CisKKyAgLy8gUmVhZHMgYSBwcmltaXRpdmUgdmFsdWUgZGlyZWN0bHkgZnJvbSB0aGUgcHJvdmlkZWQgYnVmZmVyLiBJdCByZXR1cm5zIGEKKyAgLy8gcG9pbnRlciBwYXN0IHRoZSBzZWdtZW50IG9mIGRhdGEgdGhhdCB3YXMgcmVhZC4KKyAgLy8KKyAgLy8gVGhpcyBpcyBvbmx5IGltcGxlbWVudGVkIGZvciB0aGUgdHlwZXMgd2l0aCBmaXhlZCB3aXJlIHNpemUsIGUuZy4KKyAgLy8gZmxvYXQsIGRvdWJsZSwgYW5kIHRoZSAocylmaXhlZCogdHlwZXMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgorICBzdGF0aWMgaW5saW5lIGNvbnN0IHVpbnQ4KiBSZWFkUHJpbWl0aXZlRnJvbUFycmF5KGNvbnN0IHVpbnQ4KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1R5cGUqIHZhbHVlKSBJTkw7CisKKyAgLy8gUmVhZHMgYSBwcmltaXRpdmUgcGFja2VkIGZpZWxkLgorICAvLworICAvLyBUaGlzIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIHBhY2thYmxlIHR5cGVzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gRmllbGRUeXBlIERlY2xhcmVkVHlwZT4KKyAgc3RhdGljIGlubGluZSBib29sIFJlYWRQYWNrZWRQcmltaXRpdmUoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSkgSU5MOworCisgIC8vIElkZW50aWNhbCB0byBSZWFkUGFja2VkUHJpbWl0aXZlLCBleGNlcHQgd2lsbCBub3QgaW5saW5lIHRoZQorICAvLyBpbXBsZW1lbnRhdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+CisgIHN0YXRpYyBib29sIFJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZShpbnB1dCwgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKTsKKworICAvLyBSZWFkIGEgcGFja2VkIGVudW0gZmllbGQuIFZhbHVlcyBmb3Igd2hpY2ggaXNfdmFsaWQoKSByZXR1cm5zIGZhbHNlIGFyZQorICAvLyBkcm9wcGVkLgorICBzdGF0aWMgYm9vbCBSZWFkUGFja2VkRW51bU5vSW5saW5lKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludD4qIHZhbHVlKTsKKworICBzdGF0aWMgYm9vbCBSZWFkU3RyaW5nKGlucHV0LCBzdHJpbmcqIHZhbHVlKTsKKyAgc3RhdGljIGJvb2wgUmVhZEJ5dGVzIChpbnB1dCwgc3RyaW5nKiB2YWx1ZSk7CisKKyAgc3RhdGljIGlubGluZSBib29sIFJlYWRHcm91cCAgKGZpZWxkX251bWJlciwgaW5wdXQsIE1lc3NhZ2VMaXRlKiB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkTWVzc2FnZShpbnB1dCwgTWVzc2FnZUxpdGUqIHZhbHVlKTsKKworICAvLyBMaWtlIGFib3ZlLCBidXQgZGUtdmlydHVhbGl6ZSB0aGUgY2FsbCB0byBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oKS4KKyAgLy8gVGhlIHBvaW50ZXIgbXVzdCBwb2ludCBhdCBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlVHlwZSwgKm5vdCogYSBzdWJjbGFzcyAob3IKKyAgLy8gdGhlIHN1YmNsYXNzIG11c3Qgbm90IG92ZXJyaWRlIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkR3JvdXBOb1ZpcnR1YWwoZmllbGRfbnVtYmVyLCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVHlwZSogdmFsdWUpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KKyAgc3RhdGljIGlubGluZSBib29sIFJlYWRNZXNzYWdlTm9WaXJ0dWFsKGlucHV0LCBNZXNzYWdlVHlwZSogdmFsdWUpOworCisgIC8vIFdyaXRlIGEgdGFnLiAgVGhlIFdyaXRlKigpIGZ1bmN0aW9ucyB0eXBpY2FsbHkgaW5jbHVkZSB0aGUgdGFnLCBzbworICAvLyBub3JtYWxseSB0aGVyZSdzIG5vIG5lZWQgdG8gY2FsbCB0aGlzIHVubGVzcyB1c2luZyB0aGUgV3JpdGUqTm9UYWcoKQorICAvLyB2YXJpYW50cy4KKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV2lyZVR5cGUgdHlwZSwgb3V0cHV0KSBJTkw7CisKKyAgLy8gV3JpdGUgZmllbGRzLCB3aXRob3V0IHRhZ3MuCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZUludDMyTm9UYWcgICAoaW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVJbnQ2NE5vVGFnICAgKGludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlVUludDMyTm9UYWcgICh1aW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVVSW50NjROb1RhZyAgKHVpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZVNJbnQzMk5vVGFnICAoaW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVTSW50NjROb1RhZyAgKGludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlRml4ZWQzMk5vVGFnICh1aW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVGaXhlZDY0Tm9UYWcgKHVpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZVNGaXhlZDMyTm9UYWcoaW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVTRml4ZWQ2NE5vVGFnKGludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlRmxvYXROb1RhZyAgIChmbG9hdCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZURvdWJsZU5vVGFnICAoZG91YmxlIHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlQm9vbE5vVGFnICAgIChib29sIHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlRW51bU5vVGFnICAgIChpbnQgdmFsdWUsIG91dHB1dCkgSU5MOworCisgIC8vIFdyaXRlIGZpZWxkcywgaW5jbHVkaW5nIHRhZ3MuCisgIHN0YXRpYyB2b2lkIFdyaXRlSW50MzIgICAoZmllbGRfbnVtYmVyLCAgaW50MzIgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlSW50NjQgICAoZmllbGRfbnVtYmVyLCAgaW50NjQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlVUludDMyICAoZmllbGRfbnVtYmVyLCB1aW50MzIgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlVUludDY0ICAoZmllbGRfbnVtYmVyLCB1aW50NjQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlU0ludDMyICAoZmllbGRfbnVtYmVyLCAgaW50MzIgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlU0ludDY0ICAoZmllbGRfbnVtYmVyLCAgaW50NjQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRml4ZWQzMiAoZmllbGRfbnVtYmVyLCB1aW50MzIgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRml4ZWQ2NCAoZmllbGRfbnVtYmVyLCB1aW50NjQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlU0ZpeGVkMzIoZmllbGRfbnVtYmVyLCAgaW50MzIgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlU0ZpeGVkNjQoZmllbGRfbnVtYmVyLCAgaW50NjQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRmxvYXQgICAoZmllbGRfbnVtYmVyLCAgZmxvYXQgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRG91YmxlICAoZmllbGRfbnVtYmVyLCBkb3VibGUgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlQm9vbCAgICAoZmllbGRfbnVtYmVyLCAgIGJvb2wgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlRW51bSAgICAoZmllbGRfbnVtYmVyLCAgICBpbnQgdmFsdWUsIG91dHB1dCk7CisKKyAgc3RhdGljIHZvaWQgV3JpdGVTdHJpbmcoZmllbGRfbnVtYmVyLCBjb25zdCBzdHJpbmcmIHZhbHVlLCBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZUJ5dGVzIChmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsIG91dHB1dCk7CisKKyAgc3RhdGljIHZvaWQgV3JpdGVHcm91cCgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwgb3V0cHV0KTsKKyAgc3RhdGljIHZvaWQgV3JpdGVNZXNzYWdlKAorICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLCBvdXRwdXQpOworICAvLyBMaWtlIGFib3ZlLCBidXQgdGhlc2Ugd2lsbCBjaGVjayBpZiB0aGUgb3V0cHV0IHN0cmVhbSBoYXMgZW5vdWdoCisgIC8vIHNwYWNlIHRvIHdyaXRlIGRpcmVjdGx5IHRvIGEgZmxhdCBhcnJheS4KKyAgc3RhdGljIHZvaWQgV3JpdGVHcm91cE1heWJlVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwgb3V0cHV0KTsKKyAgc3RhdGljIHZvaWQgV3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLCBvdXRwdXQpOworCisgIC8vIExpa2UgYWJvdmUsIGJ1dCBkZS12aXJ0dWFsaXplIHRoZSBjYWxsIHRvIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpLiAgVGhlCisgIC8vIHBvaW50ZXIgbXVzdCBwb2ludCBhdCBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlVHlwZSwgKm5vdCogYSBzdWJjbGFzcyAob3IKKyAgLy8gdGhlIHN1YmNsYXNzIG11c3Qgbm90IG92ZXJyaWRlIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZUdyb3VwTm9WaXJ0dWFsKAorICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlLCBvdXRwdXQpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KKyAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlTWVzc2FnZU5vVmlydHVhbCgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VUeXBlJiB2YWx1ZSwgb3V0cHV0KTsKKworI3VuZGVmIG91dHB1dAorI2RlZmluZSBvdXRwdXQgdWludDgqIHRhcmdldAorCisgIC8vIExpa2UgYWJvdmUsIGJ1dCB1c2Ugb25seSAqVG9BcnJheSBtZXRob2RzIG9mIENvZGVkT3V0cHV0U3RyZWFtLgorICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXaXJlVHlwZSB0eXBlLCBvdXRwdXQpIElOTDsKKworICAvLyBXcml0ZSBmaWVsZHMsIHdpdGhvdXQgdGFncy4KKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVJbnQzMk5vVGFnVG9BcnJheSAgIChpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlSW50NjROb1RhZ1RvQXJyYXkgICAoaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVVJbnQzMk5vVGFnVG9BcnJheSAgKHVpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlVUludDY0Tm9UYWdUb0FycmF5ICAodWludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVTSW50MzJOb1RhZ1RvQXJyYXkgIChpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU0ludDY0Tm9UYWdUb0FycmF5ICAoaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUZpeGVkMzJOb1RhZ1RvQXJyYXkgKHVpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlRml4ZWQ2NE5vVGFnVG9BcnJheSAodWludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVTRml4ZWQzMk5vVGFnVG9BcnJheShpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU0ZpeGVkNjROb1RhZ1RvQXJyYXkoaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUZsb2F0Tm9UYWdUb0FycmF5ICAgKGZsb2F0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVEb3VibGVOb1RhZ1RvQXJyYXkgIChkb3VibGUgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUJvb2xOb1RhZ1RvQXJyYXkgICAgKGJvb2wgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUVudW1Ob1RhZ1RvQXJyYXkgICAgKGludCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisKKyAgLy8gV3JpdGUgZmllbGRzLCBpbmNsdWRpbmcgdGFncy4KKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVJbnQzMlRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlSW50NjRUb0FycmF5KAorICAgIGZpZWxkX251bWJlciwgaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVVJbnQzMlRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCB1aW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVVJbnQ2NFRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCB1aW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVNJbnQzMlRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU0ludDY0VG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVGaXhlZDMyVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIHVpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlRml4ZWQ2NFRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCB1aW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVNGaXhlZDMyVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGludDMyIHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVTRml4ZWQ2NFRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlRmxvYXRUb0FycmF5KAorICAgIGZpZWxkX251bWJlciwgZmxvYXQgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZURvdWJsZVRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBkb3VibGUgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUJvb2xUb0FycmF5KAorICAgIGZpZWxkX251bWJlciwgYm9vbCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlRW51bVRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBpbnQgdmFsdWUsIG91dHB1dCkgSU5MOworCisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU3RyaW5nVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUJ5dGVzVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsIG91dHB1dCkgSU5MOworCisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlR3JvdXBUb0FycmF5KAorICAgICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsIG91dHB1dCkgSU5MOworICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZU1lc3NhZ2VUb0FycmF5KAorICAgICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsIG91dHB1dCkgSU5MOworCisgIC8vIExpa2UgYWJvdmUsIGJ1dCBkZS12aXJ0dWFsaXplIHRoZSBjYWxsIHRvIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpLiAgVGhlCisgIC8vIHBvaW50ZXIgbXVzdCBwb2ludCBhdCBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlVHlwZSwgKm5vdCogYSBzdWJjbGFzcyAob3IKKyAgLy8gdGhlIHN1YmNsYXNzIG11c3Qgbm90IG92ZXJyaWRlIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlR3JvdXBOb1ZpcnR1YWxUb0FycmF5KAorICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlVHlwZSYgdmFsdWUsIG91dHB1dCkgSU5MOworCisjdW5kZWYgb3V0cHV0CisjdW5kZWYgaW5wdXQKKyN1bmRlZiBJTkwKKworI3VuZGVmIGZpZWxkX251bWJlcgorCisgIC8vIENvbXB1dGUgdGhlIGJ5dGUgc2l6ZSBvZiBhIGZpZWxkLiAgVGhlIFh4U2l6ZSgpIGZ1bmN0aW9ucyBkbyBOT1QgaW5jbHVkZQorICAvLyB0aGUgdGFnLCBzbyB5b3UgbXVzdCBhbHNvIGNhbGwgVGFnU2l6ZSgpLiAgKFRoaXMgaXMgYmVjYXVzZSwgZm9yIHJlcGVhdGVkCisgIC8vIGZpZWxkcywgeW91IHNob3VsZCBvbmx5IGNhbGwgVGFnU2l6ZSgpIG9uY2UgYW5kIG11bHRpcGx5IGl0IGJ5IHRoZSBlbGVtZW50CisgIC8vIGNvdW50LCBidXQgeW91IG1heSBoYXZlIHRvIGNhbGwgWHhTaXplKCkgZm9yIGVhY2ggaW5kaXZpZHVhbCBlbGVtZW50LikKKyAgc3RhdGljIGlubGluZSBpbnQgSW50MzJTaXplICAgKCBpbnQzMiB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgaW50IEludDY0U2l6ZSAgICggaW50NjQgdmFsdWUpOworICBzdGF0aWMgaW5saW5lIGludCBVSW50MzJTaXplICAodWludDMyIHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBpbnQgVUludDY0U2l6ZSAgKHVpbnQ2NCB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgaW50IFNJbnQzMlNpemUgICggaW50MzIgdmFsdWUpOworICBzdGF0aWMgaW5saW5lIGludCBTSW50NjRTaXplICAoIGludDY0IHZhbHVlKTsKKyAgc3RhdGljIGlubGluZSBpbnQgRW51bVNpemUgICAgKCAgIGludCB2YWx1ZSk7CisKKyAgLy8gVGhlc2UgdHlwZXMgYWx3YXlzIGhhdmUgdGhlIHNhbWUgc2l6ZS4KKyAgc3RhdGljIGNvbnN0IGludCBrRml4ZWQzMlNpemUgID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBrRml4ZWQ2NFNpemUgID0gODsKKyAgc3RhdGljIGNvbnN0IGludCBrU0ZpeGVkMzJTaXplID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBrU0ZpeGVkNjRTaXplID0gODsKKyAgc3RhdGljIGNvbnN0IGludCBrRmxvYXRTaXplICAgID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBrRG91YmxlU2l6ZSAgID0gODsKKyAgc3RhdGljIGNvbnN0IGludCBrQm9vbFNpemUgICAgID0gMTsKKworICBzdGF0aWMgaW5saW5lIGludCBTdHJpbmdTaXplKGNvbnN0IHN0cmluZyYgdmFsdWUpOworICBzdGF0aWMgaW5saW5lIGludCBCeXRlc1NpemUgKGNvbnN0IHN0cmluZyYgdmFsdWUpOworCisgIHN0YXRpYyBpbmxpbmUgaW50IEdyb3VwU2l6ZSAgKGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSk7CisgIHN0YXRpYyBpbmxpbmUgaW50IE1lc3NhZ2VTaXplKGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSk7CisKKyAgLy8gTGlrZSBhYm92ZSwgYnV0IGRlLXZpcnR1YWxpemUgdGhlIGNhbGwgdG8gQnl0ZVNpemUoKS4gIFRoZQorICAvLyBwb2ludGVyIG11c3QgcG9pbnQgYXQgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZVR5cGUsICpub3QqIGEgc3ViY2xhc3MgKG9yCisgIC8vIHRoZSBzdWJjbGFzcyBtdXN0IG5vdCBvdmVycmlkZSBCeXRlU2l6ZSgpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgaW50IEdyb3VwU2l6ZU5vVmlydHVhbCAgKGNvbnN0IE1lc3NhZ2VUeXBlJiB2YWx1ZSk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgorICBzdGF0aWMgaW5saW5lIGludCBNZXNzYWdlU2l6ZU5vVmlydHVhbChjb25zdCBNZXNzYWdlVHlwZSYgdmFsdWUpOworCisgcHJpdmF0ZToKKyAgLy8gQSBoZWxwZXIgbWV0aG9kIGZvciB0aGUgcmVwZWF0ZWQgcHJpbWl0aXZlIHJlYWRlci4gVGhpcyBtZXRob2QgaGFzCisgIC8vIG9wdGltaXphdGlvbnMgZm9yIHByaW1pdGl2ZSB0eXBlcyB0aGF0IGhhdmUgZml4ZWQgc2l6ZSBvbiB0aGUgd2lyZSwgYW5kCisgIC8vIGNhbiBiZSByZWFkIHVzaW5nIHBvdGVudGlhbGx5IGZhc3RlciBwYXRocy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkUmVwZWF0ZWRGaXhlZFNpemVQcmltaXRpdmUoCisgICAgICBpbnQgdGFnX3NpemUsCisgICAgICB1aW50MzIgdGFnLAorICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKSBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkU7CisKKyAgc3RhdGljIGNvbnN0IENwcFR5cGUga0ZpZWxkVHlwZVRvQ3BwVHlwZU1hcFtdOworICBzdGF0aWMgY29uc3QgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIGtXaXJlVHlwZUZvckZpZWxkVHlwZVtdOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXaXJlRm9ybWF0TGl0ZSk7Cit9OworCisvLyBBIGNsYXNzIHdoaWNoIGRlYWxzIHdpdGggdW5rbm93biB2YWx1ZXMgYnkgc2F2aW5nIHRoZW0gdG8gYW4gVW5rbm93bkZpZWxkU2V0LgorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEZpZWxkU2tpcHBlciB7CisgcHVibGljOgorICBGaWVsZFNraXBwZXIoVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykKKyAgICAgIDogdW5rbm93bl9maWVsZHNfKHVua25vd25fZmllbGRzKSB7fQorCisgIC8vIFNraXAgYSBmaWVsZCB3aG9zZSB0YWcgaGFzIGFscmVhZHkgYmVlbiBjb25zdW1lZC4KKyAgYm9vbCBTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnKTsKKworICAvLyBTa2lwIGFuIGVudGlyZSBtZXNzYWdlIG9yIGdyb3VwLCB1cCB0byBhbiBlbmQtZ3JvdXAgdGFnICh3aGljaCBpcyBjb25zdW1lZCkKKyAgLy8gb3IgZW5kLW9mLXN0cmVhbS4KKyAgYm9vbCBTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworCisgIC8vIERlYWwgd2l0aCBhbiBhbHJlYWR5LXBhcnNlZCB1bnJlY29nbml6ZWQgZW51bSB2YWx1ZS4gIFRoZSBkZWZhdWx0CisgIC8vIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZywgYnV0IHRoZSBVbmtub3duRmllbGRTZXQtYmFzZWQgaW1wbGVtZW50YXRpb24KKyAgLy8gc2F2ZXMgaXQgYXMgYW4gdW5rbm93biB2YXJpbnQuCisgIHZvaWQgU2tpcFVua25vd25FbnVtKGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSk7CisKKyBwcml2YXRlOgorICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzXzsKK307CisKKy8vIGlubGluZSBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpDcHBUeXBlCitXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlVG9DcHBUeXBlKEZpZWxkVHlwZSB0eXBlKSB7CisgIHJldHVybiBrRmllbGRUeXBlVG9DcHBUeXBlTWFwW3R5cGVdOworfQorCitpbmxpbmUgdWludDMyIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGludCBmaWVsZF9udW1iZXIsIFdpcmVUeXBlIHR5cGUpIHsKKyAgcmV0dXJuIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9NQUtFX1RBRyhmaWVsZF9udW1iZXIsIHR5cGUpOworfQorCitpbmxpbmUgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh1aW50MzIgdGFnKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxXaXJlVHlwZT4odGFnICYga1RhZ1R5cGVNYXNrKTsKK30KKworaW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodWludDMyIHRhZykgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0YWcgPj4ga1RhZ1R5cGVCaXRzKTsKK30KKworaW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6VGFnU2l6ZShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIHR5cGUpIHsKKyAgaW50IHJlc3VsdCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAorICAgICAgc3RhdGljX2Nhc3Q8dWludDMyPihmaWVsZF9udW1iZXIgPDwga1RhZ1R5cGVCaXRzKSk7CisKKyAgaWYgKHR5cGUgPT0gVFlQRV9HUk9VUCkgeworICAgIC8vIEdyb3VwcyBoYXZlIGJvdGggYSBzdGFydCBhbmQgYW4gZW5kIHRhZy4KKyAgICByZXR1cm4gcmVzdWx0ICogMjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVzdWx0OworICB9Cit9CisKK2lubGluZSB1aW50MzIgV2lyZUZvcm1hdExpdGU6OkVuY29kZUZsb2F0KGZsb2F0IHZhbHVlKSB7CisgIHVuaW9uIHtmbG9hdCBmOyB1aW50MzIgaTt9OworICBmID0gdmFsdWU7CisgIHJldHVybiBpOworfQorCitpbmxpbmUgZmxvYXQgV2lyZUZvcm1hdExpdGU6OkRlY29kZUZsb2F0KHVpbnQzMiB2YWx1ZSkgeworICB1bmlvbiB7ZmxvYXQgZjsgdWludDMyIGk7fTsKKyAgaSA9IHZhbHVlOworICByZXR1cm4gZjsKK30KKworaW5saW5lIHVpbnQ2NCBXaXJlRm9ybWF0TGl0ZTo6RW5jb2RlRG91YmxlKGRvdWJsZSB2YWx1ZSkgeworICB1bmlvbiB7ZG91YmxlIGY7IHVpbnQ2NCBpO307CisgIGYgPSB2YWx1ZTsKKyAgcmV0dXJuIGk7Cit9CisKK2lubGluZSBkb3VibGUgV2lyZUZvcm1hdExpdGU6OkRlY29kZURvdWJsZSh1aW50NjQgdmFsdWUpIHsKKyAgdW5pb24ge2RvdWJsZSBmOyB1aW50NjQgaTt9OworICBpID0gdmFsdWU7CisgIHJldHVybiBmOworfQorCisvLyBaaWdaYWcgVHJhbnNmb3JtOiAgRW5jb2RlcyBzaWduZWQgaW50ZWdlcnMgc28gdGhhdCB0aGV5IGNhbiBiZQorLy8gZWZmZWN0aXZlbHkgdXNlZCB3aXRoIHZhcmludCBlbmNvZGluZy4KKy8vCisvLyB2YXJpbnQgb3BlcmF0ZXMgb24gdW5zaWduZWQgaW50ZWdlcnMsIGVuY29kaW5nIHNtYWxsZXIgbnVtYmVycyBpbnRvCisvLyBmZXdlciBieXRlcy4gIElmIHlvdSB0cnkgdG8gdXNlIGl0IG9uIGEgc2lnbmVkIGludGVnZXIsIGl0IHdpbGwgdHJlYXQKKy8vIHRoaXMgbnVtYmVyIGFzIGEgdmVyeSBsYXJnZSB1bnNpZ25lZCBpbnRlZ2VyLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4KKy8vIHNtYWxsIHNpZ25lZCBudW1iZXJzIGxpa2UgLTEgd2lsbCB0YWtlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcworLy8gKDEwKSB0byBlbmNvZGUuICBaaWdaYWdFbmNvZGUoKSBtYXBzIHNpZ25lZCBpbnRlZ2VycyB0byB1bnNpZ25lZAorLy8gaW4gc3VjaCBhIHdheSB0aGF0IHRob3NlIHdpdGggYSBzbWFsbCBhYnNvbHV0ZSB2YWx1ZSB3aWxsIGhhdmUgc21hbGxlcgorLy8gZW5jb2RlZCB2YWx1ZXMsIG1ha2luZyB0aGVtIGFwcHJvcHJpYXRlIGZvciBlbmNvZGluZyB1c2luZyB2YXJpbnQuCisvLworLy8gICAgICAgaW50MzIgLT4gICAgIHVpbnQzMgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgIDAgLT4gICAgICAgICAgMAorLy8gICAgICAgICAgLTEgLT4gICAgICAgICAgMQorLy8gICAgICAgICAgIDEgLT4gICAgICAgICAgMgorLy8gICAgICAgICAgLTIgLT4gICAgICAgICAgMworLy8gICAgICAgICAuLi4gLT4gICAgICAgIC4uLgorLy8gIDIxNDc0ODM2NDcgLT4gNDI5NDk2NzI5NAorLy8gLTIxNDc0ODM2NDggLT4gNDI5NDk2NzI5NQorLy8KKy8vICAgICAgICA+PiBlbmNvZGUgPj4KKy8vICAgICAgICA8PCBkZWNvZGUgPDwKKworaW5saW5lIHVpbnQzMiBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlMzIoaW50MzIgbikgeworICAvLyBOb3RlOiAgdGhlIHJpZ2h0LXNoaWZ0IG11c3QgYmUgYXJpdGhtZXRpYworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyPigobiA8PCAxKSBeIChuID4+IDMxKSk7Cit9CisKK2lubGluZSBpbnQzMiBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRGVjb2RlMzIodWludDMyIG4pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyPigobiA+PiAxKSBeIC1zdGF0aWNfY2FzdDxpbnQzMj4obiAmIDEpKTsKK30KKworaW5saW5lIHVpbnQ2NCBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlNjQoaW50NjQgbikgeworICAvLyBOb3RlOiAgdGhlIHJpZ2h0LXNoaWZ0IG11c3QgYmUgYXJpdGhtZXRpYworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0PigobiA8PCAxKSBeIChuID4+IDYzKSk7Cit9CisKK2lubGluZSBpbnQ2NCBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRGVjb2RlNjQodWludDY0IG4pIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0PigobiA+PiAxKSBeIC1zdGF0aWNfY2FzdDxpbnQ2ND4obiAmIDEpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTElURV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNjFhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oCkBAIC0wLDAgKzEsNzc4IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCisvLyAgICAgICAgIHdpbmtAZ29vZ2xlLmNvbSAoV2luayBTYXZpbGxlKSAocmVmYWN0b3JlZCBmcm9tIHdpcmVfZm9ybWF0LmgpCisvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKKy8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTElURV9JTkxfSF9fCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9MSVRFX0lOTF9IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisKKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBSZWFkUHJpbWl0aXZlLgorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50MzIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgaW50MzIqIHZhbHVlKSB7CisgIHVpbnQzMiB0ZW1wOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnRlbXApKSByZXR1cm4gZmFsc2U7CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyPih0ZW1wKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50NjQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDY0PigKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgaW50NjQqIHZhbHVlKSB7CisgIHVpbnQ2NCB0ZW1wOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50NjQoJnRlbXApKSByZXR1cm4gZmFsc2U7CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGludDY0Pih0ZW1wKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8dWludDMyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9VSU5UMzI+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICB1aW50MzIqIHZhbHVlKSB7CisgIHJldHVybiBpbnB1dC0+UmVhZFZhcmludDMyKHZhbHVlKTsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTx1aW50NjQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1VJTlQ2ND4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIHVpbnQ2NCogdmFsdWUpIHsKKyAgcmV0dXJuIGlucHV0LT5SZWFkVmFyaW50NjQodmFsdWUpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDMyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TSU5UMzI+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBpbnQzMiogdmFsdWUpIHsKKyAgdWludDMyIHRlbXA7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmdGVtcCkpIHJldHVybiBmYWxzZTsKKyAgKnZhbHVlID0gWmlnWmFnRGVjb2RlMzIodGVtcCk7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDY0LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TSU5UNjQ+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBpbnQ2NCogdmFsdWUpIHsKKyAgdWludDY0IHRlbXA7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQ2NCgmdGVtcCkpIHJldHVybiBmYWxzZTsKKyAgKnZhbHVlID0gWmlnWmFnRGVjb2RlNjQodGVtcCk7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPHVpbnQzMiwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRklYRUQzMj4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIHVpbnQzMiogdmFsdWUpIHsKKyAgcmV0dXJuIGlucHV0LT5SZWFkTGl0dGxlRW5kaWFuMzIodmFsdWUpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPHVpbnQ2NCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRklYRUQ2ND4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIHVpbnQ2NCogdmFsdWUpIHsKKyAgcmV0dXJuIGlucHV0LT5SZWFkTGl0dGxlRW5kaWFuNjQodmFsdWUpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDMyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TRklYRUQzMj4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIGludDMyKiB2YWx1ZSkgeworICB1aW50MzIgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjMyKCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMj4odGVtcCk7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDY0LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TRklYRUQ2ND4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIGludDY0KiB2YWx1ZSkgeworICB1aW50NjQgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjY0KCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2ND4odGVtcCk7CisgIHJldHVybiB0cnVlOworfQordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGZsb2F0LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GTE9BVD4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIGZsb2F0KiB2YWx1ZSkgeworICB1aW50MzIgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjMyKCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBEZWNvZGVGbG9hdCh0ZW1wKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8ZG91YmxlLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9ET1VCTEU+KAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBkb3VibGUqIHZhbHVlKSB7CisgIHVpbnQ2NCB0ZW1wOworICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuNjQoJnRlbXApKSByZXR1cm4gZmFsc2U7CisgICp2YWx1ZSA9IERlY29kZURvdWJsZSh0ZW1wKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ym9vbCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIGJvb2wqIHZhbHVlKSB7CisgIHVpbnQzMiB0ZW1wOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnRlbXApKSByZXR1cm4gZmFsc2U7CisgICp2YWx1ZSA9IHRlbXAgIT0gMDsKKyAgcmV0dXJuIHRydWU7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgaW50KiB2YWx1ZSkgeworICB1aW50MzIgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ+KHRlbXApOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCB1aW50OCogV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmVGcm9tQXJyYXk8CisgIHVpbnQzMiwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRklYRUQzMj4oCisgICAgY29uc3QgdWludDgqIGJ1ZmZlciwKKyAgICB1aW50MzIqIHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjMyRnJvbUFycmF5KGJ1ZmZlciwgdmFsdWUpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCB1aW50OCogV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmVGcm9tQXJyYXk8CisgIHVpbnQ2NCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRklYRUQ2ND4oCisgICAgY29uc3QgdWludDgqIGJ1ZmZlciwKKyAgICB1aW50NjQqIHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjY0RnJvbUFycmF5KGJ1ZmZlciwgdmFsdWUpOworfQordGVtcGxhdGUgPD4KK2lubGluZSBjb25zdCB1aW50OCogV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmVGcm9tQXJyYXk8CisgIGludDMyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TRklYRUQzMj4oCisgICAgY29uc3QgdWludDgqIGJ1ZmZlciwKKyAgICBpbnQzMiogdmFsdWUpIHsKKyAgdWludDMyIHRlbXA7CisgIGJ1ZmZlciA9IGlvOjpDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkoYnVmZmVyLCAmdGVtcCk7CisgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyPih0ZW1wKTsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlRnJvbUFycmF5PAorICBpbnQ2NCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfU0ZJWEVENjQ+KAorICAgIGNvbnN0IHVpbnQ4KiBidWZmZXIsCisgICAgaW50NjQqIHZhbHVlKSB7CisgIHVpbnQ2NCB0ZW1wOworICBidWZmZXIgPSBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjY0RnJvbUFycmF5KGJ1ZmZlciwgJnRlbXApOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2ND4odGVtcCk7CisgIHJldHVybiBidWZmZXI7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGNvbnN0IHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZUZyb21BcnJheTwKKyAgZmxvYXQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0ZMT0FUPigKKyAgICBjb25zdCB1aW50OCogYnVmZmVyLAorICAgIGZsb2F0KiB2YWx1ZSkgeworICB1aW50MzIgdGVtcDsKKyAgYnVmZmVyID0gaW86OkNvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW4zMkZyb21BcnJheShidWZmZXIsICZ0ZW1wKTsKKyAgKnZhbHVlID0gRGVjb2RlRmxvYXQodGVtcCk7CisgIHJldHVybiBidWZmZXI7Cit9Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGNvbnN0IHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZUZyb21BcnJheTwKKyAgZG91YmxlLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9ET1VCTEU+KAorICAgIGNvbnN0IHVpbnQ4KiBidWZmZXIsCisgICAgZG91YmxlKiB2YWx1ZSkgeworICB1aW50NjQgdGVtcDsKKyAgYnVmZmVyID0gaW86OkNvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheShidWZmZXIsICZ0ZW1wKTsKKyAgKnZhbHVlID0gRGVjb2RlRG91YmxlKHRlbXApOworICByZXR1cm4gYnVmZmVyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFJlcGVhdGVkUHJpbWl0aXZlKGludCwgLy8gdGFnX3NpemUsIHVudXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWVzKSB7CisgIENUeXBlIHZhbHVlOworICBpZiAoIVJlYWRQcmltaXRpdmU8Q1R5cGUsIERlY2xhcmVkVHlwZT4oaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgdmFsdWVzLT5BZGQodmFsdWUpOworICBpbnQgZWxlbWVudHNfYWxyZWFkeV9yZXNlcnZlZCA9IHZhbHVlcy0+Q2FwYWNpdHkoKSAtIHZhbHVlcy0+c2l6ZSgpOworICB3aGlsZSAoZWxlbWVudHNfYWxyZWFkeV9yZXNlcnZlZCA+IDAgJiYgaW5wdXQtPkV4cGVjdFRhZyh0YWcpKSB7CisgICAgaWYgKCFSZWFkUHJpbWl0aXZlPENUeXBlLCBEZWNsYXJlZFR5cGU+KGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgdmFsdWVzLT5BZGRBbHJlYWR5UmVzZXJ2ZWQodmFsdWUpOworICAgIGVsZW1lbnRzX2FscmVhZHlfcmVzZXJ2ZWQtLTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZEZpeGVkU2l6ZVByaW1pdGl2ZSgKKyAgICBpbnQgdGFnX3NpemUsCisgICAgdWludDMyIHRhZywKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlcykgeworICBHT09HTEVfRENIRUNLX0VRKFVJbnQzMlNpemUodGFnKSwgdGFnX3NpemUpOworICBDVHlwZSB2YWx1ZTsKKyAgaWYgKCFSZWFkUHJpbWl0aXZlPENUeXBlLCBEZWNsYXJlZFR5cGU+KGlucHV0LCAmdmFsdWUpKQorICAgIHJldHVybiBmYWxzZTsKKyAgdmFsdWVzLT5BZGQodmFsdWUpOworCisgIC8vIEZvciBmaXhlZCBzaXplIHZhbHVlcywgcmVwZWF0ZWQgdmFsdWVzIGNhbiBiZSByZWFkIG1vcmUgcXVpY2tseSBieQorICAvLyByZWFkaW5nIGRpcmVjdGx5IGZyb20gYSByYXcgYXJyYXkuCisgIC8vCisgIC8vIFdlIGNhbiBnZXQgYSB0aWdodCBsb29wIGJ5IG9ubHkgcmVhZGluZyBhcyBtYW55IGVsZW1lbnRzIGFzIGNhbiBiZQorICAvLyBhZGRlZCB0byB0aGUgUmVwZWF0ZWRGaWVsZCB3aXRob3V0IGhhdmluZyB0byBkbyBhbnkgcmVzaXppbmcuIEFkZGl0aW9uYWxseSwKKyAgLy8gd2Ugb25seSB0cnkgdG8gcmVhZCBhcyBtYW55IGVsZW1lbnRzIGFzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgY3VycmVudAorICAvLyBidWZmZXIgc3BhY2UuIERvaW5nIHNvIGF2b2lkcyBoYXZpbmcgdG8gcGVyZm9ybSBib3VuZGFyeSBjaGVja3Mgd2hlbgorICAvLyByZWFkaW5nIHRoZSB2YWx1ZTogdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgY2FuIGJlIHJlYWQgaXMKKyAgLy8ga25vd24gb3V0c2lkZSBvZiB0aGUgbG9vcC4KKyAgY29uc3Qgdm9pZCogdm9pZF9wb2ludGVyOworICBpbnQgc2l6ZTsKKyAgaW5wdXQtPkdldERpcmVjdEJ1ZmZlclBvaW50ZXJJbmxpbmUoJnZvaWRfcG9pbnRlciwgJnNpemUpOworICBpZiAoc2l6ZSA+IDApIHsKKyAgICBjb25zdCB1aW50OCogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KHZvaWRfcG9pbnRlcik7CisgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyBlYWNoIHR5cGUgb2NjdXBpZXMgb24gdGhlIHdpcmUuCisgICAgY29uc3QgaW50IHBlcl92YWx1ZV9zaXplID0gc3RhdGljX2Nhc3Q8aW50Pih0YWdfc2l6ZSArIHNpemVvZih2YWx1ZSkpOworCisgICAgaW50IGVsZW1lbnRzX2F2YWlsYWJsZSA9IG1pbih2YWx1ZXMtPkNhcGFjaXR5KCkgLSB2YWx1ZXMtPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLyBwZXJfdmFsdWVfc2l6ZSk7CisgICAgaW50IG51bV9yZWFkID0gMDsKKyAgICB3aGlsZSAobnVtX3JlYWQgPCBlbGVtZW50c19hdmFpbGFibGUgJiYKKyAgICAgICAgICAgKGJ1ZmZlciA9IGlvOjpDb2RlZElucHV0U3RyZWFtOjpFeHBlY3RUYWdGcm9tQXJyYXkoCisgICAgICAgICAgICAgICBidWZmZXIsIHRhZykpICE9IE5VTEwpIHsKKyAgICAgIGJ1ZmZlciA9IFJlYWRQcmltaXRpdmVGcm9tQXJyYXk8Q1R5cGUsIERlY2xhcmVkVHlwZT4oYnVmZmVyLCAmdmFsdWUpOworICAgICAgdmFsdWVzLT5BZGRBbHJlYWR5UmVzZXJ2ZWQodmFsdWUpOworICAgICAgKytudW1fcmVhZDsKKyAgICB9CisgICAgY29uc3QgaW50IHJlYWRfYnl0ZXMgPSBudW1fcmVhZCAqIHBlcl92YWx1ZV9zaXplOworICAgIGlmIChyZWFkX2J5dGVzID4gMCkgeworICAgICAgaW5wdXQtPlNraXAocmVhZF9ieXRlcyk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBTcGVjaWFsaXphdGlvbnMgb2YgUmVhZFJlcGVhdGVkUHJpbWl0aXZlIGZvciB0aGUgZml4ZWQgc2l6ZSB0eXBlcywgd2hpY2ggdXNlIAorLy8gdGhlIG9wdGltaXplZCBjb2RlIHBhdGguCisjZGVmaW5lIFJFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUoQ1BQVFlQRSwgREVDTEFSRURfVFlQRSkgICAgICAgICAgICAgXAordGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENQUFRZUEUsIFdpcmVGb3JtYXRMaXRlOjpERUNMQVJFRF9UWVBFPiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB0YWdfc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzIgdGFnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJlcGVhdGVkRmllbGQ8Q1BQVFlQRT4qIHZhbHVlcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIFJlYWRSZXBlYXRlZEZpeGVkU2l6ZVByaW1pdGl2ZTwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1BQVFlQRSwgV2lyZUZvcm1hdExpdGU6OkRFQ0xBUkVEX1RZUEU+KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGFnX3NpemUsIHRhZywgaW5wdXQsIHZhbHVlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRSh1aW50MzIsIFRZUEVfRklYRUQzMik7CitSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKHVpbnQ2NCwgVFlQRV9GSVhFRDY0KTsKK1JFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUoaW50MzIsIFRZUEVfU0ZJWEVEMzIpOworUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShpbnQ2NCwgVFlQRV9TRklYRUQ2NCk7CitSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKGZsb2F0LCBUWVBFX0ZMT0FUKTsKK1JFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUoZG91YmxlLCBUWVBFX0RPVUJMRSk7CisKKyN1bmRlZiBSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIERlY2xhcmVkVHlwZT4KK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZU5vSW5saW5lKAorICAgIGludCB0YWdfc2l6ZSwKKyAgICB1aW50MzIgdGFnLAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWUpIHsKKyAgcmV0dXJuIFJlYWRSZXBlYXRlZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPigKKyAgICAgIHRhZ19zaXplLCB0YWcsIGlucHV0LCB2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIERlY2xhcmVkVHlwZT4KK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkUHJpbWl0aXZlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZXMpIHsKKyAgdWludDMyIGxlbmd0aDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGlucHV0LT5QdXNoTGltaXQobGVuZ3RoKTsKKyAgd2hpbGUgKGlucHV0LT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHsKKyAgICBDVHlwZSB2YWx1ZTsKKyAgICBpZiAoIVJlYWRQcmltaXRpdmU8Q1R5cGUsIERlY2xhcmVkVHlwZT4oaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICB2YWx1ZXMtPkFkZCh2YWx1ZSk7CisgIH0KKyAgaW5wdXQtPlBvcExpbWl0KGxpbWl0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIERlY2xhcmVkVHlwZT4KK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlcykgeworICByZXR1cm4gUmVhZFBhY2tlZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPihpbnB1dCwgdmFsdWVzKTsKK30KKworCitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwKGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIHZhbHVlKSB7CisgIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKKyAgaWYgKCF2YWx1ZS0+TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KSkgcmV0dXJuIGZhbHNlOworICBpbnB1dC0+RGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgLy8gTWFrZSBzdXJlIHRoZSBsYXN0IHRoaW5nIHJlYWQgd2FzIGFuIGVuZCB0YWcgZm9yIHRoaXMgZ3JvdXAuCisgIGlmICghaW5wdXQtPkxhc3RUYWdXYXMoTWFrZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0VORF9HUk9VUCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogdmFsdWUpIHsKKyAgdWludDMyIGxlbmd0aDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0KKyAgICAgIGlucHV0LT5QdXNoTGltaXQoc3RhdGljX2Nhc3Q8aW50PihsZW5ndGgpKTsKKyAgaWYgKCF2YWx1ZS0+TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KSkgcmV0dXJuIGZhbHNlOworICAvLyBNYWtlIHN1cmUgdGhhdCBwYXJzaW5nIHN0b3BwZWQgd2hlbiB0aGUgbGltaXQgd2FzIGhpdCwgbm90IGF0IGFuIGVuZGdyb3VwCisgIC8vIHRhZy4KKyAgaWYgKCFpbnB1dC0+Q29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpIHJldHVybiBmYWxzZTsKKyAgaW5wdXQtPlBvcExpbWl0KGxpbWl0KTsKKyAgaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgIHJldHVybiB0cnVlOworfQorCisvLyBXZSBuYW1lIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgc29tZXRoaW5nIGxvbmcgYW5kIGV4dHJlbWVseSB1bmxpa2VseSB0byBvY2N1cgorLy8gZWxzZXdoZXJlIGJlY2F1c2UgYSAqcXVhbGlmaWVkKiBtZW1iZXIgYWNjZXNzIGV4cHJlc3Npb24gZGVzaWduZWQgdG8gYXZvaWQKKy8vIHZpcnR1YWwgZGlzcGF0Y2gsIEMrKzAzIFtiYXNpYy5sb29rdXAuY2xhc3NyZWZdIDMuNC41LzQgcmVxdWlyZXMgdGhhdCB0aGUKKy8vIG5hbWUgb2YgdGhlIHF1YWxpZnlpbmcgY2xhc3MgdG8gYmUgbG9va2VkIHVwIGJvdGggaW4gdGhlIGNvbnRleHQgb2YgdGhlIGZ1bGwKKy8vIGV4cHJlc3Npb24gKGZpbmRpbmcgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcikgYW5kIGluIHRoZSBjb250ZXh0IG9mIHRoZSBvYmplY3QKKy8vIHdob3NlIG1lbWJlciB3ZSBhcmUgYWNjZXNzaW5nLiBUaGlzIGNvdWxkIHBvdGVudGlhbGx5IGZpbmQgYSBuZXN0ZWQgdHlwZQorLy8gd2l0aGluIHRoYXQgb2JqZWN0LiBUaGUgc3RhbmRhcmQgZ29lcyBvbiB0byByZXF1aXJlIHRoZXNlIG5hbWVzIHRvIHJlZmVyIHRvCisvLyB0aGUgc2FtZSBlbnRpdHksIHdoaWNoIHRoaXMgY29sbGlzaW9uIHdvdWxkIHZpb2xhdGUuIFRoZSBsYWNrIG9mIGEgc2FmZSB3YXkKKy8vIHRvIGF2b2lkIHRoaXMgY29sbGlzaW9uIGFwcGVhcnMgdG8gYmUgYSBkZWZlY3QgaW4gdGhlIHN0YW5kYXJkLCBidXQgdW50aWwgaXQKKy8vIGlzIGNvcnJlY3RlZCwgd2UgY2hvb3NlIHRoZSBuYW1lIHRvIGF2b2lkIGFjY2lkZW50YWwgY29sbGlzaW9ucy4KK3RlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwTm9WaXJ0dWFsKAorICAgIGludCBmaWVsZF9udW1iZXIsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0KiB2YWx1ZSkgeworICBpZiAoIWlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKSByZXR1cm4gZmFsc2U7CisgIGlmICghdmFsdWUtPgorICAgICAgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlucHV0LT5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAvLyBNYWtlIHN1cmUgdGhlIGxhc3QgdGhpbmcgcmVhZCB3YXMgYW4gZW5kIHRhZyBmb3IgdGhpcyBncm91cC4KKyAgaWYgKCFpbnB1dC0+TGFzdFRhZ1dhcyhNYWtlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0PgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCogdmFsdWUpIHsKKyAgdWludDMyIGxlbmd0aDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0KKyAgICAgIGlucHV0LT5QdXNoTGltaXQoc3RhdGljX2Nhc3Q8aW50PihsZW5ndGgpKTsKKyAgaWYgKCF2YWx1ZS0+CisgICAgICBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgLy8gTWFrZSBzdXJlIHRoYXQgcGFyc2luZyBzdG9wcGVkIHdoZW4gdGhlIGxpbWl0IHdhcyBoaXQsIG5vdCBhdCBhbiBlbmRncm91cAorICAvLyB0YWcuCisgIGlmICghaW5wdXQtPkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKSByZXR1cm4gZmFsc2U7CisgIGlucHV0LT5Qb3BMaW1pdChsaW1pdCk7CisgIGlucHV0LT5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoaW50IGZpZWxkX251bWJlciwgV2lyZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlVGFnKE1ha2VUYWcoZmllbGRfbnVtYmVyLCB0eXBlKSk7Cit9CisKK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyTm9UYWcoaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMlNpZ25FeHRlbmRlZCh2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQ2NE5vVGFnKGludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlVmFyaW50NjQoc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSkpOworfQoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyTm9UYWcodWludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQ2NE5vVGFnKHVpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQ2NCh2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTSW50MzJOb1RhZyhpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihaaWdaYWdFbmNvZGUzMih2YWx1ZSkpOworfQoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDY0Tm9UYWcoaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlVmFyaW50NjQoWmlnWmFnRW5jb2RlNjQodmFsdWUpKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkMzJOb1RhZyh1aW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjMyKHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkNjROb1RhZyh1aW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjY0KHZhbHVlKTsKK30KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDMyTm9UYWcoaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW4zMihzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlKSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQ2NE5vVGFnKGludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuNjQoc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSkpOworfQoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRmxvYXROb1RhZyhmbG9hdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjMyKEVuY29kZUZsb2F0KHZhbHVlKSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVEb3VibGVOb1RhZyhkb3VibGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuNjQoRW5jb2RlRG91YmxlKHZhbHVlKSk7Cit9CitpbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sTm9UYWcoYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlVmFyaW50MzIodmFsdWUgPyAxIDogMHUpOworfQoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRW51bU5vVGFnKGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBvdXRwdXQtPldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQodmFsdWUpOworfQorCisvLyBTZWUgY29tbWVudCBvbiBSZWFkR3JvdXBOb1ZpcnR1YWwgdG8gdW5kZXJzdGFuZCB0aGUgbmVlZCBmb3IgdGhpcyB0ZW1wbGF0ZQorLy8gcGFyYW1ldGVyIG5hbWUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0PgoraW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlR3JvdXBOb1ZpcnR1YWwoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCYgdmFsdWUsCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCwgb3V0cHV0KTsKKyAgdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7CisgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQLCBvdXRwdXQpOworfQordGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdD4KK2lubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCYgdmFsdWUsCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIoCisgICAgICB2YWx1ZS5NZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjpHZXRDYWNoZWRTaXplKCkpOworICB2YWx1ZS5NZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMob3V0cHV0KTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KE1ha2VUYWcoZmllbGRfbnVtYmVyLCB0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Cit9CisKK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJOb1RhZ1RvQXJyYXkoaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlNpZ25FeHRlbmRlZFRvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0Tm9UYWdUb0FycmF5KGludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50NjRUb0FycmF5KAorICAgICAgc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSksIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMk5vVGFnVG9BcnJheSh1aW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjROb1RhZ1RvQXJyYXkodWludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0VG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDMyTm9UYWdUb0FycmF5KGludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheShaaWdaYWdFbmNvZGUzMih2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQ2NE5vVGFnVG9BcnJheShpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQ2NFRvQXJyYXkoWmlnWmFnRW5jb2RlNjQodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyTm9UYWdUb0FycmF5KHVpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuMzJUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDY0Tm9UYWdUb0FycmF5KHVpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuNjRUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQzMk5vVGFnVG9BcnJheShpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheSgKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUpLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQ2NE5vVGFnVG9BcnJheShpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheSgKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQ2ND4odmFsdWUpLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdE5vVGFnVG9BcnJheShmbG9hdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheShFbmNvZGVGbG9hdCh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZU5vVGFnVG9BcnJheShkb3VibGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuNjRUb0FycmF5KEVuY29kZURvdWJsZSh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xOb1RhZ1RvQXJyYXkoYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KHZhbHVlID8gMSA6IDB1LCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtTm9UYWdUb0FycmF5KGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWRUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQorCitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlSW50MzJOb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlSW50NjROb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMlRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZVVJbnQzMk5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlVUludDY0Tm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTSW50MzJUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZVNJbnQzMk5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVTSW50NjROb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkMzJUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDMyLCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVGaXhlZDMyTm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQ2NCwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlRml4ZWQ2NE5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkMzJUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQzMiwgdGFyZ2V0KTsKKyAgcmV0dXJuIFdyaXRlU0ZpeGVkMzJOb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDY0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVENjQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZVNGaXhlZDY0Tm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdFRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDMyLCB0YXJnZXQpOworICByZXR1cm4gV3JpdGVGbG9hdE5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlRG91YmxlVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVENjQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZURvdWJsZU5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZUJvb2xOb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KGludCBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIHRhcmdldCk7CisgIHJldHVybiBXcml0ZUVudW1Ob1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Cit9CisKK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICAvLyBTdHJpbmcgaXMgZm9yIFVURi04IHRleHQgb25seQorICAvLyBXQVJOSU5HOiAgSW4gd2lyZV9mb3JtYXQuY2MsIGJvdGggc3RyaW5ncyBhbmQgYnl0ZXMgYXJlIGhhbmRsZWQgYnkKKyAgLy8gICBXcml0ZVN0cmluZygpIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uICBJZiB0aGUgaW1wbGVtZW50YXRpb25zIGJlY29tZQorICAvLyAgIGRpZmZlcmVudCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhhdCB1c2FnZS4KKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdGFyZ2V0KTsKKyAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSgKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUuc2l6ZSgpKSwgdGFyZ2V0KTsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCeXRlc1RvQXJyYXkoaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIHRhcmdldCk7CisgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoCisgICAgICBzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlLnNpemUoKSksIHRhcmdldCk7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKK30KKworCitpbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUdyb3VwVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCwgdGFyZ2V0KTsKKyAgdGFyZ2V0ID0gdmFsdWUuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh0YXJnZXQpOworICByZXR1cm4gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQLCB0YXJnZXQpOworfQoraW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdGFyZ2V0KTsKKyAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSgKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUuR2V0Q2FjaGVkU2l6ZSgpKSwgdGFyZ2V0KTsKKyAgcmV0dXJuIHZhbHVlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKK30KKworLy8gU2VlIGNvbW1lbnQgb24gUmVhZEdyb3VwTm9WaXJ0dWFsIHRvIHVuZGVyc3RhbmQgdGhlIG5lZWQgZm9yIHRoaXMgdGVtcGxhdGUKKy8vIHBhcmFtZXRlciBuYW1lLgordGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdD4KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlR3JvdXBOb1ZpcnR1YWxUb0FycmF5KAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QmIHZhbHVlLAorICAgIHVpbnQ4KiB0YXJnZXQpIHsKKyAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfU1RBUlRfR1JPVVAsIHRhcmdldCk7CisgIHRhcmdldCA9IHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QKKyAgICAgIDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh0YXJnZXQpOworICByZXR1cm4gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQLCB0YXJnZXQpOworfQordGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdD4KK2lubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCYgdmFsdWUsCisgICAgdWludDgqIHRhcmdldCkgeworICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0YXJnZXQpOworICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KAorICAgIHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q6OkdldENhY2hlZFNpemUoKSwgdGFyZ2V0KTsKKyAgcmV0dXJuIHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QKKyAgICAgIDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh0YXJnZXQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2lubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZShpbnQzMiB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzJTaWduRXh0ZW5kZWQodmFsdWUpOworfQoraW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6SW50NjRTaXplKGludDY0IHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NChzdGF0aWNfY2FzdDx1aW50NjQ+KHZhbHVlKSk7Cit9CitpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpVSW50MzJTaXplKHVpbnQzMiB2YWx1ZSkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIodmFsdWUpOworfQoraW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6VUludDY0U2l6ZSh1aW50NjQgdmFsdWUpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTY0KHZhbHVlKTsKK30KK2lubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6OlNJbnQzMlNpemUoaW50MzIgdmFsdWUpIHsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKFppZ1phZ0VuY29kZTMyKHZhbHVlKSk7Cit9CitpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpTSW50NjRTaXplKGludDY0IHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NChaaWdaYWdFbmNvZGU2NCh2YWx1ZSkpOworfQoraW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUoaW50IHZhbHVlKSB7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMlNpZ25FeHRlbmRlZCh2YWx1ZSk7Cit9CisKK2lubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUuc2l6ZSgpKSkgKyB2YWx1ZS5zaXplKCkpOworfQoraW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6Qnl0ZXNTaXplKGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICBzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlLnNpemUoKSkpICsgdmFsdWUuc2l6ZSgpKTsKK30KKworCitpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpHcm91cFNpemUoY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlKSB7CisgIHJldHVybiB2YWx1ZS5CeXRlU2l6ZSgpOworfQoraW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUoY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlKSB7CisgIGludCBzaXplID0gdmFsdWUuQnl0ZVNpemUoKTsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHN0YXRpY19jYXN0PHVpbnQzMj4oc2l6ZSkpICsgc2l6ZTsKK30KKworLy8gU2VlIGNvbW1lbnQgb24gUmVhZEdyb3VwTm9WaXJ0dWFsIHRvIHVuZGVyc3RhbmQgdGhlIG5lZWQgZm9yIHRoaXMgdGVtcGxhdGUKKy8vIHBhcmFtZXRlciBuYW1lLgordGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdD4KK2lubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6Okdyb3VwU2l6ZU5vVmlydHVhbCgKKyAgICBjb25zdCBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0JiB2YWx1ZSkgeworICByZXR1cm4gdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6Qnl0ZVNpemUoKTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CitpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICBjb25zdCBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0JiB2YWx1ZSkgeworICBpbnQgc2l6ZSA9IHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q6OkJ5dGVTaXplKCk7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihzdGF0aWNfY2FzdDx1aW50MzI+KHNpemUpKSArIHNpemU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCisKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX0xJVEVfSU5MX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njc5NzBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw5MDUgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKKy8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQorLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSB7CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIEVudW1zSW5TeW5jKSB7CisgIC8vIFZlcmlmeSB0aGF0IFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgYW5kIFdpcmVGb3JtYXRMaXRlOjpDcHBUeXBlIG1hdGNoCisgIC8vIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSBhbmQgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlLgorCisgIEVYUEVDVF9FUShpbXBsaWNpdF9jYXN0PGludD4oRmllbGREZXNjcmlwdG9yOjpNQVhfVFlQRSksCisgICAgICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4oV2lyZUZvcm1hdExpdGU6Ok1BWF9GSUVMRF9UWVBFKSk7CisgIEVYUEVDVF9FUShpbXBsaWNpdF9jYXN0PGludD4oRmllbGREZXNjcmlwdG9yOjpNQVhfQ1BQVFlQRSksCisgICAgICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4oV2lyZUZvcm1hdExpdGU6Ok1BWF9DUFBUWVBFKSk7CisKKyAgZm9yIChpbnQgaSA9IDE7IGkgPD0gV2lyZUZvcm1hdExpdGU6Ok1BWF9GSUVMRF9UWVBFOyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoCisgICAgICBpbXBsaWNpdF9jYXN0PGludD4oRmllbGREZXNjcmlwdG9yOjpUeXBlVG9DcHBUeXBlKAorICAgICAgICBzdGF0aWNfY2FzdDxGaWVsZERlc2NyaXB0b3I6OlR5cGU+KGkpKSksCisgICAgICBpbXBsaWNpdF9jYXN0PGludD4oV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZVRvQ3BwVHlwZSgKKyAgICAgICAgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZT4oaSkpKSk7CisgIH0KK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgTWF4RmllbGROdW1iZXIpIHsKKyAgLy8gTWFrZSBzdXJlIHRoZSBtYXggZmllbGQgbnVtYmVyIGNvbnN0YW50IGlzIGFjY3VyYXRlLgorICBFWFBFQ1RfRVEoKDEgPDwgKDMyIC0gV2lyZUZvcm1hdExpdGU6OmtUYWdUeXBlQml0cykpIC0gMSwKKyAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcik7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgc291cmNlLCBkZXN0OworICBzdHJpbmcgZGF0YTsKKworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIC8vIFBhcnNlIHVzaW5nIFdpcmVGb3JtYXQuCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZGVzdCk7CisKKyAgLy8gQ2hlY2suCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoZGVzdCk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlRXh0ZW5zaW9ucykgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgc291cmNlLCBkZXN0OworICBzdHJpbmcgZGF0YTsKKworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmc291cmNlKTsKKyAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKworICAvLyBQYXJzZSB1c2luZyBXaXJlRm9ybWF0LgorICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7CisgIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJmRlc3QpOworCisgIC8vIENoZWNrLgorICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChkZXN0KTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VQYWNrZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBzb3VyY2UsIGRlc3Q7CisgIHN0cmluZyBkYXRhOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIFRlc3RVdGlsOjpTZXRQYWNrZWRGaWVsZHMoJnNvdXJjZSk7CisgIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKKworICAvLyBDaGVjay4KKyAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChkZXN0KTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VQYWNrZWRGcm9tVW5wYWNrZWQpIHsKKyAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KKyAgdW5pdHRlc3Q6OlRlc3RVbnBhY2tlZFR5cGVzIHNvdXJjZTsKKyAgVGVzdFV0aWw6OlNldFVucGFja2VkRmllbGRzKCZzb3VyY2UpOworICBzdHJpbmcgZGF0YSA9IHNvdXJjZS5TZXJpYWxpemVBc1N0cmluZygpOworCisgIC8vIFBhcnNlIHVzaW5nIFdpcmVGb3JtYXQuCisgIHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMgZGVzdDsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKKworICAvLyBDaGVjay4KKyAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChkZXN0KTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VVbnBhY2tlZEZyb21QYWNrZWQpIHsKKyAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBzb3VyY2U7CisgIFRlc3RVdGlsOjpTZXRQYWNrZWRGaWVsZHMoJnNvdXJjZSk7CisgIHN0cmluZyBkYXRhID0gc291cmNlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisKKyAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KKyAgdW5pdHRlc3Q6OlRlc3RVbnBhY2tlZFR5cGVzIGRlc3Q7CisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZGVzdCk7CisKKyAgLy8gQ2hlY2suCisgIFRlc3RVdGlsOjpFeHBlY3RVbnBhY2tlZEZpZWxkc1NldChkZXN0KTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VQYWNrZWRFeHRlbnNpb25zKSB7CisgIHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyBzb3VyY2UsIGRlc3Q7CisgIHN0cmluZyBkYXRhOworCisgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCisgIFRlc3RVdGlsOjpTZXRQYWNrZWRFeHRlbnNpb25zKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIC8vIFBhcnNlIHVzaW5nIFdpcmVGb3JtYXQuCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZGVzdCk7CisKKyAgLy8gQ2hlY2suCisgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KGRlc3QpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBCeXRlU2l6ZSkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworCisgIEVYUEVDVF9FUShtZXNzYWdlLkJ5dGVTaXplKCksIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgQnl0ZVNpemVFeHRlbnNpb25zKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuQnl0ZVNpemUoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDAsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgQnl0ZVNpemVQYWNrZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlOworICBUZXN0VXRpbDo6U2V0UGFja2VkRmllbGRzKCZtZXNzYWdlKTsKKworICBFWFBFQ1RfRVEobWVzc2FnZS5CeXRlU2l6ZSgpLCBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlKSk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuQnl0ZVNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlKSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIEJ5dGVTaXplUGFja2VkRXh0ZW5zaW9ucykgeworICB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldFBhY2tlZEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworCisgIEVYUEVDVF9FUShtZXNzYWdlLkJ5dGVTaXplKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlKSk7CisgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuQnl0ZVNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlKSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFNlcmlhbGl6ZSkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIHN0cmluZyBnZW5lcmF0ZWRfZGF0YTsKKyAgc3RyaW5nIGR5bmFtaWNfZGF0YTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKyAgaW50IHNpemUgPSBtZXNzYWdlLkJ5dGVTaXplKCk7CisKKyAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KKyAgeworICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmZ2VuZXJhdGVkX2RhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworICAgIG1lc3NhZ2UuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXQpOworICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7CisgIH0KKworICAvLyBTZXJpYWxpemUgdXNpbmcgV2lyZUZvcm1hdC4KKyAgeworICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmZHluYW1pY19kYXRhKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKKyAgICBXaXJlRm9ybWF0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMobWVzc2FnZSwgc2l6ZSwgJm91dHB1dCk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKKyAgfQorCisgIC8vIFNob3VsZCBiZSB0aGUgc2FtZS4KKyAgLy8gRG9uJ3QgdXNlIEVYUEVDVF9FUSBoZXJlIGJlY2F1c2Ugd2UncmUgY29tcGFyaW5nIHJhdyBiaW5hcnkgZGF0YSBhbmQKKyAgLy8gd2UgcmVhbGx5IGRvbid0IHdhbnQgaXQgZHVtcGVkIHRvIHN0ZG91dCBvbiBmYWlsdXJlLgorICBFWFBFQ1RfVFJVRShkeW5hbWljX2RhdGEgPT0gZ2VuZXJhdGVkX2RhdGEpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBTZXJpYWxpemVFeHRlbnNpb25zKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOworICBzdHJpbmcgZ2VuZXJhdGVkX2RhdGE7CisgIHN0cmluZyBkeW5hbWljX2RhdGE7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICBpbnQgc2l6ZSA9IG1lc3NhZ2UuQnl0ZVNpemUoKTsKKworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZnZW5lcmF0ZWRfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgbWVzc2FnZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dCk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB1c2luZyBXaXJlRm9ybWF0LgorICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZkeW5hbWljX2RhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhtZXNzYWdlLCBzaXplLCAmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2hvdWxkIGJlIHRoZSBzYW1lLgorICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGhlcmUgYmVjYXVzZSB3ZSdyZSBjb21wYXJpbmcgcmF3IGJpbmFyeSBkYXRhIGFuZAorICAvLyB3ZSByZWFsbHkgZG9uJ3Qgd2FudCBpdCBkdW1wZWQgdG8gc3Rkb3V0IG9uIGZhaWx1cmUuCisgIEVYUEVDVF9UUlVFKGR5bmFtaWNfZGF0YSA9PSBnZW5lcmF0ZWRfZGF0YSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFNlcmlhbGl6ZUZpZWxkc0FuZEV4dGVuc2lvbnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyBtZXNzYWdlOworICBzdHJpbmcgZ2VuZXJhdGVkX2RhdGE7CisgIHN0cmluZyBkeW5hbWljX2RhdGE7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICBpbnQgc2l6ZSA9IG1lc3NhZ2UuQnl0ZVNpemUoKTsKKworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZnZW5lcmF0ZWRfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgbWVzc2FnZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dCk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB1c2luZyBXaXJlRm9ybWF0LgorICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZkeW5hbWljX2RhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhtZXNzYWdlLCBzaXplLCAmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2hvdWxkIGJlIHRoZSBzYW1lLgorICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGhlcmUgYmVjYXVzZSB3ZSdyZSBjb21wYXJpbmcgcmF3IGJpbmFyeSBkYXRhIGFuZAorICAvLyB3ZSByZWFsbHkgZG9uJ3Qgd2FudCBpdCBkdW1wZWQgdG8gc3Rkb3V0IG9uIGZhaWx1cmUuCisgIEVYUEVDVF9UUlVFKGR5bmFtaWNfZGF0YSA9PSBnZW5lcmF0ZWRfZGF0YSk7CisKKyAgLy8gU2hvdWxkIG91dHB1dCBpbiBjYW5vbmljYWwgb3JkZXIuCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNBbmRFeHRlbnNpb25zSW5PcmRlcihkeW5hbWljX2RhdGEpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzQW5kRXh0ZW5zaW9uc0luT3JkZXIoZ2VuZXJhdGVkX2RhdGEpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZU11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzKSB7CisgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gcGFyc2UgYSBtZXNzYWdlIHRoYXQgY29udGFpbnMgbXVsdGlwbGUgZXh0ZW5zaW9ucyByYW5nZXMuCisgIHVuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3Mgc291cmNlOworICBzdHJpbmcgZGF0YTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucygmc291cmNlKTsKKyAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKworICB7CisgICAgdW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyBkZXN0OworICAgIEVYUEVDVF9UUlVFKGRlc3QuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEoc291cmNlLkRlYnVnU3RyaW5nKCksIGRlc3QuRGVidWdTdHJpbmcoKSk7CisgIH0KKworICAvLyBBbHNvIHRlc3QgdXNpbmcgcmVmbGVjdGlvbi1iYXNlZCBwYXJzaW5nLgorICB7CisgICAgdW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyBkZXN0OworICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZyYXdfaW5wdXQpOworICAgIEVYUEVDVF9UUlVFKFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZjb2RlZF9pbnB1dCwgJmRlc3QpKTsKKyAgICBFWFBFQ1RfRVEoc291cmNlLkRlYnVnU3RyaW5nKCksIGRlc3QuRGVidWdTdHJpbmcoKSk7CisgIH0KK30KKworY29uc3QgaW50IGtVbmtub3duVHlwZUlkID0gMTU1MDA1NTsKKworVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplTWVzc2FnZVNldCkgeworICAvLyBTZXQgdXAgYSBUZXN0TWVzc2FnZVNldCB3aXRoIHR3byBrbm93biBtZXNzYWdlcyBhbmQgYW4gdW5rbm93biBvbmUuCisgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldCBtZXNzYWdlX3NldDsKKyAgbWVzc2FnZV9zZXQuTXV0YWJsZUV4dGVuc2lvbigKKyAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pLT5zZXRfaSgxMjMpOworICBtZXNzYWdlX3NldC5NdXRhYmxlRXh0ZW5zaW9uKAorICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiktPnNldF9zdHIoImZvbyIpOworICBtZXNzYWdlX3NldC5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZExlbmd0aERlbGltaXRlZCgKKyAgICBrVW5rbm93blR5cGVJZCwgImJhciIpOworCisgIHN0cmluZyBkYXRhOworICBBU1NFUlRfVFJVRShtZXNzYWdlX3NldC5TZXJpYWxpemVUb1N0cmluZygmZGF0YSkpOworCisgIC8vIFBhcnNlIGJhY2sgdXNpbmcgUmF3TWVzc2FnZVNldCBhbmQgY2hlY2sgdGhlIGNvbnRlbnRzLgorICB1bml0dGVzdDo6UmF3TWVzc2FnZVNldCByYXc7CisgIEFTU0VSVF9UUlVFKHJhdy5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworCisgIEVYUEVDVF9FUSgwLCByYXcudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKKworICBBU1NFUlRfRVEoMywgcmF3Lml0ZW1fc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKAorICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6OmRlc2NyaXB0b3IoKS0+ZXh0ZW5zaW9uKDApLT5udW1iZXIoKSwKKyAgICByYXcuaXRlbSgwKS50eXBlX2lkKCkpOworICBFWFBFQ1RfRVEoCisgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6ZGVzY3JpcHRvcigpLT5leHRlbnNpb24oMCktPm51bWJlcigpLAorICAgIHJhdy5pdGVtKDEpLnR5cGVfaWQoKSk7CisgIEVYUEVDVF9FUShrVW5rbm93blR5cGVJZCwgcmF3Lml0ZW0oMikudHlwZV9pZCgpKTsKKworICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2UxOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMS5QYXJzZUZyb21TdHJpbmcocmF3Lml0ZW0oMCkubWVzc2FnZSgpKSk7CisgIEVYUEVDVF9FUSgxMjMsIG1lc3NhZ2UxLmkoKSk7CisKKyAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlMjsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKHJhdy5pdGVtKDEpLm1lc3NhZ2UoKSkpOworICBFWFBFQ1RfRVEoImZvbyIsIG1lc3NhZ2UyLnN0cigpKTsKKworICBFWFBFQ1RfRVEoImJhciIsIHJhdy5pdGVtKDIpLm1lc3NhZ2UoKSk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFNlcmlhbGl6ZU1lc3NhZ2VTZXRWYXJpb3VzV2F5c0FyZUVxdWFsKSB7CisgIC8vIFNlcmlhbGl6ZSBhIE1lc3NhZ2VTZXQgdG8gYSBzdHJlYW0gYW5kIHRvIGEgZmxhdCBhcnJheSB1c2luZyBnZW5lcmF0ZWQKKyAgLy8gY29kZSwgYW5kIGFsc28gdXNpbmcgV2lyZUZvcm1hdCwgYW5kIGNoZWNrIHRoYXQgdGhlIHJlc3VsdHMgYXJlIGVxdWFsLgorICAvLyBTZXQgdXAgYSBUZXN0TWVzc2FnZVNldCB3aXRoIHR3byBrbm93biBtZXNzYWdlcyBhbmQgYW4gdW5rbm93biBvbmUsIGFzCisgIC8vIGFib3ZlLgorCisgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldCBtZXNzYWdlX3NldDsKKyAgbWVzc2FnZV9zZXQuTXV0YWJsZUV4dGVuc2lvbigKKyAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pLT5zZXRfaSgxMjMpOworICBtZXNzYWdlX3NldC5NdXRhYmxlRXh0ZW5zaW9uKAorICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiktPnNldF9zdHIoImZvbyIpOworICBtZXNzYWdlX3NldC5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZExlbmd0aERlbGltaXRlZCgKKyAgICBrVW5rbm93blR5cGVJZCwgImJhciIpOworCisgIGludCBzaXplID0gbWVzc2FnZV9zZXQuQnl0ZVNpemUoKTsKKyAgRVhQRUNUX0VRKHNpemUsIG1lc3NhZ2Vfc2V0LkdldENhY2hlZFNpemUoKSk7CisgIEFTU0VSVF9FUShzaXplLCBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlX3NldCkpOworCisgIHN0cmluZyBmbGF0X2RhdGE7CisgIHN0cmluZyBzdHJlYW1fZGF0YTsKKyAgc3RyaW5nIGR5bmFtaWNfZGF0YTsKKyAgZmxhdF9kYXRhLnJlc2l6ZShzaXplKTsKKyAgc3RyZWFtX2RhdGEucmVzaXplKHNpemUpOworCisgIC8vIFNlcmlhbGl6ZSB0byBmbGF0IGFycmF5CisgIHsKKyAgICB1aW50OCogdGFyZ2V0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmZmxhdF9kYXRhKSk7CisgICAgdWludDgqIGVuZCA9IG1lc3NhZ2Vfc2V0LlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKKyAgICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gdGFyZ2V0KTsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB0byBidWZmZXIKKyAgeworICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZzdHJlYW1fZGF0YSksIHNpemUsIDEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOworICAgIG1lc3NhZ2Vfc2V0LlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0X3N0cmVhbSk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7CisgIH0KKworICAvLyBTZXJpYWxpemUgdG8gYnVmZmVyIHdpdGggV2lyZUZvcm1hdC4KKyAgeworICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gc3RyaW5nX3N0cmVhbSgmZHluYW1pY19kYXRhKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmc3RyaW5nX3N0cmVhbSk7CisgICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG1lc3NhZ2Vfc2V0LCBzaXplLCAmb3V0cHV0X3N0cmVhbSk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7CisgIH0KKworICBFWFBFQ1RfVFJVRShmbGF0X2RhdGEgPT0gc3RyZWFtX2RhdGEpOworICBFWFBFQ1RfVFJVRShmbGF0X2RhdGEgPT0gZHluYW1pY19kYXRhKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VNZXNzYWdlU2V0KSB7CisgIC8vIFNldCB1cCBhIFJhd01lc3NhZ2VTZXQgd2l0aCB0d28ga25vd24gbWVzc2FnZXMgYW5kIGFuIHVua25vd24gb25lLgorICB1bml0dGVzdDo6UmF3TWVzc2FnZVNldCByYXc7CisKKyAgeworICAgIHVuaXR0ZXN0OjpSYXdNZXNzYWdlU2V0OjpJdGVtKiBpdGVtID0gcmF3LmFkZF9pdGVtKCk7CisgICAgaXRlbS0+c2V0X3R5cGVfaWQoCisgICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjpkZXNjcmlwdG9yKCktPmV4dGVuc2lvbigwKS0+bnVtYmVyKCkpOworICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgbWVzc2FnZTsKKyAgICBtZXNzYWdlLnNldF9pKDEyMyk7CisgICAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZyhpdGVtLT5tdXRhYmxlX21lc3NhZ2UoKSk7CisgIH0KKworICB7CisgICAgdW5pdHRlc3Q6OlJhd01lc3NhZ2VTZXQ6Okl0ZW0qIGl0ZW0gPSByYXcuYWRkX2l0ZW0oKTsKKyAgICBpdGVtLT5zZXRfdHlwZV9pZCgKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6OmRlc2NyaXB0b3IoKS0+ZXh0ZW5zaW9uKDApLT5udW1iZXIoKSk7CisgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlOworICAgIG1lc3NhZ2Uuc2V0X3N0cigiZm9vIik7CisgICAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZyhpdGVtLT5tdXRhYmxlX21lc3NhZ2UoKSk7CisgIH0KKworICB7CisgICAgdW5pdHRlc3Q6OlJhd01lc3NhZ2VTZXQ6Okl0ZW0qIGl0ZW0gPSByYXcuYWRkX2l0ZW0oKTsKKyAgICBpdGVtLT5zZXRfdHlwZV9pZChrVW5rbm93blR5cGVJZCk7CisgICAgaXRlbS0+c2V0X21lc3NhZ2UoImJhciIpOworICB9CisKKyAgc3RyaW5nIGRhdGE7CisgIEFTU0VSVF9UUlVFKHJhdy5TZXJpYWxpemVUb1N0cmluZygmZGF0YSkpOworCisgIC8vIFBhcnNlIGFzIGEgVGVzdE1lc3NhZ2VTZXQgYW5kIGNoZWNrIHRoZSBjb250ZW50cy4KKyAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICBBU1NFUlRfVFJVRShtZXNzYWdlX3NldC5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworCisgIEVYUEVDVF9FUSgxMjMsIG1lc3NhZ2Vfc2V0LkdldEV4dGVuc2lvbigKKyAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pLmkoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgbWVzc2FnZV9zZXQuR2V0RXh0ZW5zaW9uKAorICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikuc3RyKCkpOworCisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlX3NldC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOworICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQsCisgICAgICAgICAgICBtZXNzYWdlX3NldC51bmtub3duX2ZpZWxkcygpLmZpZWxkKDApLnR5cGUoKSk7CisgIEVYUEVDVF9FUSgiYmFyIiwgbWVzc2FnZV9zZXQudW5rbm93bl9maWVsZHMoKS5maWVsZCgwKS5sZW5ndGhfZGVsaW1pdGVkKCkpOworCisgIC8vIEFsc28gcGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KKyAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IGR5bmFtaWNfbWVzc2FnZV9zZXQ7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2l6ZSgpKTsKKyAgQVNTRVJUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZHluYW1pY19tZXNzYWdlX3NldCkpOworICBFWFBFQ1RfRVEobWVzc2FnZV9zZXQuRGVidWdTdHJpbmcoKSwgZHluYW1pY19tZXNzYWdlX3NldC5EZWJ1Z1N0cmluZygpKTsKK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgUmVjdXJzaW9uTGltaXQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZWN1cnNpdmVNZXNzYWdlIG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV9hKCktPm11dGFibGVfYSgpLT5tdXRhYmxlX2EoKS0+bXV0YWJsZV9hKCktPnNldF9pKDEpOworICBzdHJpbmcgZGF0YTsKKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgeworICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICAgIGlucHV0LlNldFJlY3Vyc2lvbkxpbWl0KDQpOworICAgIHVuaXR0ZXN0OjpUZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlMjsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKKyAgfQorCisgIHsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgICBpbnB1dC5TZXRSZWN1cnNpb25MaW1pdCgzKTsKKyAgICB1bml0dGVzdDo6VGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgbWVzc2FnZTI7CisgICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UyLlBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCkpOworICB9Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFVua25vd25GaWVsZFJlY3Vyc2lvbkxpbWl0KSB7CisgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpCisgICAgICAgIC0+QWRkR3JvdXAoMTIzNCkKKyAgICAgICAgLT5BZGRHcm91cCgxMjM0KQorICAgICAgICAtPkFkZEdyb3VwKDEyMzQpCisgICAgICAgIC0+QWRkR3JvdXAoMTIzNCkKKyAgICAgICAgLT5BZGRWYXJpbnQoMTIzNCwgMTIzKTsKKyAgc3RyaW5nIGRhdGE7CisgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIHsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgICBpbnB1dC5TZXRSZWN1cnNpb25MaW1pdCg0KTsKKyAgICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlMjsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKKyAgfQorCisgIHsKKyAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgICBpbnB1dC5TZXRSZWN1cnNpb25MaW1pdCgzKTsKKyAgICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlMjsKKyAgICBFWFBFQ1RfRkFMU0UobWVzc2FnZTIuUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmlucHV0KSk7CisgIH0KK30KKworVEVTVChXaXJlRm9ybWF0VGVzdCwgWmlnWmFnKSB7CisvLyBhdm9pZCBsaW5lLXdyYXBwaW5nCisjZGVmaW5lIExMKHgpIEdPT0dMRV9MT05HTE9ORyh4KQorI2RlZmluZSBVTEwoeCkgR09PR0xFX1VMT05HTE9ORyh4KQorI2RlZmluZSBaaWdaYWdFbmNvZGUzMih4KSBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlMzIoeCkKKyNkZWZpbmUgWmlnWmFnRGVjb2RlMzIoeCkgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTMyKHgpCisjZGVmaW5lIFppZ1phZ0VuY29kZTY0KHgpIFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdFbmNvZGU2NCh4KQorI2RlZmluZSBaaWdaYWdEZWNvZGU2NCh4KSBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRGVjb2RlNjQoeCkKKworICBFWFBFQ1RfRVEoMHUsIFppZ1phZ0VuY29kZTMyKCAwKSk7CisgIEVYUEVDVF9FUSgxdSwgWmlnWmFnRW5jb2RlMzIoLTEpKTsKKyAgRVhQRUNUX0VRKDJ1LCBaaWdaYWdFbmNvZGUzMiggMSkpOworICBFWFBFQ1RfRVEoM3UsIFppZ1phZ0VuY29kZTMyKC0yKSk7CisgIEVYUEVDVF9FUSgweDdGRkZGRkZFdSwgWmlnWmFnRW5jb2RlMzIoMHgzRkZGRkZGRikpOworICBFWFBFQ1RfRVEoMHg3RkZGRkZGRnUsIFppZ1phZ0VuY29kZTMyKDB4QzAwMDAwMDApKTsKKyAgRVhQRUNUX0VRKDB4RkZGRkZGRkV1LCBaaWdaYWdFbmNvZGUzMigweDdGRkZGRkZGKSk7CisgIEVYUEVDVF9FUSgweEZGRkZGRkZGdSwgWmlnWmFnRW5jb2RlMzIoMHg4MDAwMDAwMCkpOworCisgIEVYUEVDVF9FUSggMCwgWmlnWmFnRGVjb2RlMzIoMHUpKTsKKyAgRVhQRUNUX0VRKC0xLCBaaWdaYWdEZWNvZGUzMigxdSkpOworICBFWFBFQ1RfRVEoIDEsIFppZ1phZ0RlY29kZTMyKDJ1KSk7CisgIEVYUEVDVF9FUSgtMiwgWmlnWmFnRGVjb2RlMzIoM3UpKTsKKyAgRVhQRUNUX0VRKDB4M0ZGRkZGRkYsIFppZ1phZ0RlY29kZTMyKDB4N0ZGRkZGRkV1KSk7CisgIEVYUEVDVF9FUSgweEMwMDAwMDAwLCBaaWdaYWdEZWNvZGUzMigweDdGRkZGRkZGdSkpOworICBFWFBFQ1RfRVEoMHg3RkZGRkZGRiwgWmlnWmFnRGVjb2RlMzIoMHhGRkZGRkZGRXUpKTsKKyAgRVhQRUNUX0VRKDB4ODAwMDAwMDAsIFppZ1phZ0RlY29kZTMyKDB4RkZGRkZGRkZ1KSk7CisKKyAgRVhQRUNUX0VRKDB1LCBaaWdaYWdFbmNvZGU2NCggMCkpOworICBFWFBFQ1RfRVEoMXUsIFppZ1phZ0VuY29kZTY0KC0xKSk7CisgIEVYUEVDVF9FUSgydSwgWmlnWmFnRW5jb2RlNjQoIDEpKTsKKyAgRVhQRUNUX0VRKDN1LCBaaWdaYWdFbmNvZGU2NCgtMikpOworICBFWFBFQ1RfRVEoVUxMKDB4MDAwMDAwMDA3RkZGRkZGRSksIFppZ1phZ0VuY29kZTY0KExMKDB4MDAwMDAwMDAzRkZGRkZGRikpKTsKKyAgRVhQRUNUX0VRKFVMTCgweDAwMDAwMDAwN0ZGRkZGRkYpLCBaaWdaYWdFbmNvZGU2NChMTCgweEZGRkZGRkZGQzAwMDAwMDApKSk7CisgIEVYUEVDVF9FUShVTEwoMHgwMDAwMDAwMEZGRkZGRkZFKSwgWmlnWmFnRW5jb2RlNjQoTEwoMHgwMDAwMDAwMDdGRkZGRkZGKSkpOworICBFWFBFQ1RfRVEoVUxMKDB4MDAwMDAwMDBGRkZGRkZGRiksIFppZ1phZ0VuY29kZTY0KExMKDB4RkZGRkZGRkY4MDAwMDAwMCkpKTsKKyAgRVhQRUNUX0VRKFVMTCgweEZGRkZGRkZGRkZGRkZGRkUpLCBaaWdaYWdFbmNvZGU2NChMTCgweDdGRkZGRkZGRkZGRkZGRkYpKSk7CisgIEVYUEVDVF9FUShVTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSwgWmlnWmFnRW5jb2RlNjQoTEwoMHg4MDAwMDAwMDAwMDAwMDAwKSkpOworCisgIEVYUEVDVF9FUSggMCwgWmlnWmFnRGVjb2RlNjQoMHUpKTsKKyAgRVhQRUNUX0VRKC0xLCBaaWdaYWdEZWNvZGU2NCgxdSkpOworICBFWFBFQ1RfRVEoIDEsIFppZ1phZ0RlY29kZTY0KDJ1KSk7CisgIEVYUEVDVF9FUSgtMiwgWmlnWmFnRGVjb2RlNjQoM3UpKTsKKyAgRVhQRUNUX0VRKExMKDB4MDAwMDAwMDAzRkZGRkZGRiksIFppZ1phZ0RlY29kZTY0KFVMTCgweDAwMDAwMDAwN0ZGRkZGRkUpKSk7CisgIEVYUEVDVF9FUShMTCgweEZGRkZGRkZGQzAwMDAwMDApLCBaaWdaYWdEZWNvZGU2NChVTEwoMHgwMDAwMDAwMDdGRkZGRkZGKSkpOworICBFWFBFQ1RfRVEoTEwoMHgwMDAwMDAwMDdGRkZGRkZGKSwgWmlnWmFnRGVjb2RlNjQoVUxMKDB4MDAwMDAwMDBGRkZGRkZGRSkpKTsKKyAgRVhQRUNUX0VRKExMKDB4RkZGRkZGRkY4MDAwMDAwMCksIFppZ1phZ0RlY29kZTY0KFVMTCgweDAwMDAwMDAwRkZGRkZGRkYpKSk7CisgIEVYUEVDVF9FUShMTCgweDdGRkZGRkZGRkZGRkZGRkYpLCBaaWdaYWdEZWNvZGU2NChVTEwoMHhGRkZGRkZGRkZGRkZGRkZFKSkpOworICBFWFBFQ1RfRVEoTEwoMHg4MDAwMDAwMDAwMDAwMDAwKSwgWmlnWmFnRGVjb2RlNjQoVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpKTsKKworICAvLyBTb21lIGVhc2llci10by12ZXJpZnkgcm91bmQtdHJpcCB0ZXN0cy4gIFRoZSBpbnB1dHMgKG90aGVyIHRoYW4gMCwgMSwgLTEpCisgIC8vIHdlcmUgY2hvc2VuIHNlbWktcmFuZG9tbHkgdmlhIGtleWJvYXJkIGJhc2hpbmcuCisgIEVYUEVDVF9FUSggICAgMCwgWmlnWmFnRGVjb2RlMzIoWmlnWmFnRW5jb2RlMzIoICAgIDApKSk7CisgIEVYUEVDVF9FUSggICAgMSwgWmlnWmFnRGVjb2RlMzIoWmlnWmFnRW5jb2RlMzIoICAgIDEpKSk7CisgIEVYUEVDVF9FUSggICAtMSwgWmlnWmFnRGVjb2RlMzIoWmlnWmFnRW5jb2RlMzIoICAgLTEpKSk7CisgIEVYUEVDVF9FUSgxNDkyNywgWmlnWmFnRGVjb2RlMzIoWmlnWmFnRW5jb2RlMzIoMTQ5MjcpKSk7CisgIEVYUEVDVF9FUSgtMzYxMiwgWmlnWmFnRGVjb2RlMzIoWmlnWmFnRW5jb2RlMzIoLTM2MTIpKSk7CisKKyAgRVhQRUNUX0VRKCAgICAwLCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCggICAgMCkpKTsKKyAgRVhQRUNUX0VRKCAgICAxLCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCggICAgMSkpKTsKKyAgRVhQRUNUX0VRKCAgIC0xLCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCggICAtMSkpKTsKKyAgRVhQRUNUX0VRKDE0OTI3LCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCgxNDkyNykpKTsKKyAgRVhQRUNUX0VRKC0zNjEyLCBaaWdaYWdEZWNvZGU2NChaaWdaYWdFbmNvZGU2NCgtMzYxMikpKTsKKworICBFWFBFQ1RfRVEoTEwoODU2OTEyMzA0ODAxNDE2KSwgWmlnWmFnRGVjb2RlNjQoWmlnWmFnRW5jb2RlNjQoCisgICAgICAgICAgICBMTCg4NTY5MTIzMDQ4MDE0MTYpKSkpOworICBFWFBFQ1RfRVEoTEwoLTc1MTIzOTA1NDM5NTcxMjU2KSwgWmlnWmFnRGVjb2RlNjQoWmlnWmFnRW5jb2RlNjQoCisgICAgICAgICAgICBMTCgtNzUxMjM5MDU0Mzk1NzEyNTYpKSkpOworfQorCitURVNUKFdpcmVGb3JtYXRUZXN0LCBSZXBlYXRlZFNjYWxhcnNEaWZmZXJlbnRUYWdTaXplcykgeworICAvLyBBdCBvbmUgcG9pbnQgY2hlY2tzIHdvdWxkIHRyaWdnZXIgd2hlbiBwYXJzaW5nIHJlcGVhdGVkIGZpeGVkIHNjYWxhcgorICAvLyBmaWVsZHMuCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBtc2cxLCBtc2cyOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgbXNnMS5hZGRfcmVwZWF0ZWRfZml4ZWQzMihpKTsKKyAgICBtc2cxLmFkZF9yZXBlYXRlZF9pbnQzMihpKTsKKyAgICBtc2cxLmFkZF9yZXBlYXRlZF9maXhlZDY0KGkpOworICAgIG1zZzEuYWRkX3JlcGVhdGVkX2ludDY0KGkpOworICAgIG1zZzEuYWRkX3JlcGVhdGVkX2Zsb2F0KGkpOworICAgIG1zZzEuYWRkX3JlcGVhdGVkX3VpbnQ2NChpKTsKKyAgfQorCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSB2YXJpZXR5IG9mIHRhZyBzaXplcy4KKyAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzYyA9IG1zZzEuR2V0RGVzY3JpcHRvcigpOworICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkOworICBmaWVsZCA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZml4ZWQzMiIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKKyAgQVNTRVJUX0VRKDEsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7CisgIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKKyAgQVNTRVJUX0VRKDEsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7CisgIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9maXhlZDY0Iik7CisgIEFTU0VSVF9UUlVFKGZpZWxkICE9IE5VTEwpOworICBBU1NFUlRfRVEoMiwgV2lyZUZvcm1hdDo6VGFnU2l6ZShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCkpKTsKKyAgZmllbGQgPSBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ludDY0Iik7CisgIEFTU0VSVF9UUlVFKGZpZWxkICE9IE5VTEwpOworICBBU1NFUlRfRVEoMiwgV2lyZUZvcm1hdDo6VGFnU2l6ZShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCkpKTsKKyAgZmllbGQgPSBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2Zsb2F0Iik7CisgIEFTU0VSVF9UUlVFKGZpZWxkICE9IE5VTEwpOworICBBU1NFUlRfRVEoMywgV2lyZUZvcm1hdDo6VGFnU2l6ZShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCkpKTsKKyAgZmllbGQgPSBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX3VpbnQ2NCIpOworICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKKyAgQVNTRVJUX0VRKDMsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7CisKKyAgRVhQRUNUX1RSVUUobXNnMi5QYXJzZUZyb21TdHJpbmcobXNnMS5TZXJpYWxpemVBc1N0cmluZygpKSk7CisgIEVYUEVDVF9FUShtc2cxLkRlYnVnU3RyaW5nKCksIG1zZzIuRGVidWdTdHJpbmcoKSk7Cit9CisKK2NsYXNzIFdpcmVGb3JtYXRJbnZhbGlkSW5wdXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgLy8gTWFrZSBhIHNlcmlhbGl6ZWQgVGVzdEFsbFR5cGVzIGluIHdoaWNoIHRoZSBmaWVsZCBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQorICAvLyBjb250YWlucyBleGFjdGx5IHRoZSBnaXZlbiBieXRlcywgd2hpY2ggbWF5IGJlIGludmFsaWQuCisgIHN0cmluZyBNYWtlSW52YWxpZEVtYmVkZGVkTWVzc2FnZShjb25zdCBjaGFyKiBieXRlcywgaW50IHNpemUpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKAorICAgICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKKyAgICBHT09HTEVfQ0hFQ0soZmllbGQgIT0gTlVMTCk7CisKKyAgICBzdHJpbmcgcmVzdWx0OworCisgICAgeworICAgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZyZXN1bHQpOworICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisKKyAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzKGZpZWxkLT5udW1iZXIoKSwgc3RyaW5nKGJ5dGVzLCBzaXplKSwgJm91dHB1dCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vIE1ha2UgYSBzZXJpYWxpemVkIFRlc3RBbGxUeXBlcyBpbiB3aGljaCB0aGUgZmllbGQgb3B0aW9uYWxncm91cAorICAvLyBjb250YWlucyBleGFjdGx5IHRoZSBnaXZlbiBieXRlcyAtLSB3aGljaCBtYXkgYmUgaW52YWxpZCAtLSBhbmQKKyAgLy8gcG9zc2libHkgbm8gZW5kIHRhZy4KKyAgc3RyaW5nIE1ha2VJbnZhbGlkR3JvdXAoY29uc3QgY2hhciogYnl0ZXMsIGludCBzaXplLCBib29sIGluY2x1ZGVfZW5kX3RhZykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPQorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoCisgICAgICAgICJvcHRpb25hbGdyb3VwIik7CisgICAgR09PR0xFX0NIRUNLKGZpZWxkICE9IE5VTEwpOworCisgICAgc3RyaW5nIHJlc3VsdDsKKworICAgIHsKKyAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmcmVzdWx0KTsKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworCisgICAgICBvdXRwdXQuV3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0OjpNYWtlVGFnKGZpZWxkKSk7CisgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoc3RyaW5nKGJ5dGVzLCBzaXplKSk7CisgICAgICBpZiAoaW5jbHVkZV9lbmRfdGFnKSB7CisgICAgICAgIG91dHB1dC5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK307CisKK1RFU1RfRihXaXJlRm9ybWF0SW52YWxpZElucHV0VGVzdCwgSW52YWxpZFN1Yk1lc3NhZ2UpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIC8vIENvbnRyb2wgY2FzZS4KKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRFbWJlZGRlZE1lc3NhZ2UoIiIsIDApKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQsIGJ1dCBub3QgYSB2YWxpZCB0YWcgKHplcm8pLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRFbWJlZGRlZE1lc3NhZ2UoIlwwIiwgMSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIG1hbGZvcm1lZCB2YXJpbnQuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEVtYmVkZGVkTWVzc2FnZSgiXDIwMCIsIDEpKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYW4gZW5kZ3JvdXAgdGFnLCBidXQgd2UgYXJlbid0IHBhcnNpbmcgYSBncm91cC4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkRW1iZWRkZWRNZXNzYWdlKCJcMDE0IiwgMSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIHZhbGlkIHZhcmludCBidXQgbm90IGEgdmFsaWQgdGFnIChiYWQgd2lyZSB0eXBlKS4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkRW1iZWRkZWRNZXNzYWdlKCJcMDE3IiwgMSkpKTsKK30KKworVEVTVF9GKFdpcmVGb3JtYXRJbnZhbGlkSW5wdXRUZXN0LCBJbnZhbGlkR3JvdXApIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIC8vIENvbnRyb2wgY2FzZS4KKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiIiwgMCwgdHJ1ZSkpKTsKKworICAvLyBNaXNzaW5nIGVuZCB0YWcuICBHcm91cHMgY2Fubm90IGVuZCBhdCBFT0YuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCIiLCAwLCBmYWxzZSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIHZhbGlkIHZhcmludCwgYnV0IG5vdCBhIHZhbGlkIHRhZyAoemVybykuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMCIsIDEsIGZhbHNlKSkpOworCisgIC8vIFRoZSBieXRlIGlzIGEgbWFsZm9ybWVkIHZhcmludC4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIlwyMDAiLCAxLCBmYWxzZSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhbiBlbmRncm91cCB0YWcsIGJ1dCBub3QgdGhlIHJpZ2h0IG9uZSBmb3IgdGhpcyBncm91cC4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIlwwMTQiLCAxLCBmYWxzZSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIHZhbGlkIHZhcmludCBidXQgbm90IGEgdmFsaWQgdGFnIChiYWQgd2lyZSB0eXBlKS4KKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIlwwMTciLCAxLCB0cnVlKSkpOworfQorCitURVNUX0YoV2lyZUZvcm1hdEludmFsaWRJbnB1dFRlc3QsIEludmFsaWRVbmtub3duR3JvdXApIHsKKyAgLy8gVXNlIFRlc3RFbXB0eU1lc3NhZ2Ugc28gdGhhdCB0aGUgZ3JvdXAgbWFkZSBieSBNYWtlSW52YWxpZEdyb3VwIHdpbGwgbm90CisgIC8vIGJlIGEga25vd24gdGFnIG51bWJlci4KKyAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZTsKKworICAvLyBDb250cm9sIGNhc2UuCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIiIsIDAsIHRydWUpKSk7CisKKyAgLy8gTWlzc2luZyBlbmQgdGFnLiAgR3JvdXBzIGNhbm5vdCBlbmQgYXQgRU9GLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiIiwgMCwgZmFsc2UpKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQsIGJ1dCBub3QgYSB2YWxpZCB0YWcgKHplcm8pLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiXDAiLCAxLCBmYWxzZSkpKTsKKworICAvLyBUaGUgYnl0ZSBpcyBhIG1hbGZvcm1lZCB2YXJpbnQuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMjAwIiwgMSwgZmFsc2UpKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYW4gZW5kZ3JvdXAgdGFnLCBidXQgbm90IHRoZSByaWdodCBvbmUgZm9yIHRoaXMgZ3JvdXAuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMDE0IiwgMSwgZmFsc2UpKSk7CisKKyAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQgYnV0IG5vdCBhIHZhbGlkIHRhZyAoYmFkIHdpcmUgdHlwZSkuCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMDE3IiwgMSwgdHJ1ZSkpKTsKK30KKworVEVTVF9GKFdpcmVGb3JtYXRJbnZhbGlkSW5wdXRUZXN0LCBJbnZhbGlkU3RyaW5nSW5Vbmtub3duR3JvdXApIHsKKyAgLy8gVGVzdCBhIGJ1ZyBmaXg6ICBTa2lwTWVzc2FnZSBzaG91bGQgZmFpbCBpZiB0aGUgbWVzc2FnZSBjb250YWlucyBhIHN0cmluZworICAvLyB3aG9zZSBsZW5ndGggd291bGQgZXh0ZW5kIGJleW9uZCB0aGUgbWVzc2FnZSBlbmQuCisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBtZXNzYWdlLnNldF9vcHRpb25hbF9zdHJpbmcoImZvbyBmb28gZm9vIGZvbyIpOworICBzdHJpbmcgZGF0YTsKKyAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgLy8gQ2hvcCBzb21lIGJ5dGVzIG9mZiB0aGUgZW5kLgorICBkYXRhLnJlc2l6ZShkYXRhLnNpemUoKSAtIDQpOworCisgIC8vIFRyeSB0byBza2lwIGl0LiAgTm90ZSB0aGF0IHRoZSBidWcgd2FzIG9ubHkgcHJlc2VudCB3aGVuIHBhcnNpbmcgdG8gYW4KKyAgLy8gVW5rbm93bkZpZWxkU2V0LgorICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJnJhd19pbnB1dCk7CisgIFVua25vd25GaWVsZFNldCB1bmtub3duX2ZpZWxkczsKKyAgRVhQRUNUX0ZBTFNFKFdpcmVGb3JtYXQ6OlNraXBNZXNzYWdlKCZjb2RlZF9pbnB1dCwgJnVua25vd25fZmllbGRzKSk7Cit9CisKKy8vIFRlc3QgZGlmZmVyZW5jZXMgYmV0d2VlbiBzdHJpbmcgYW5kIGJ5dGVzLgorLy8gVmFsdWUgb2YgYSBzdHJpbmcgdHlwZSBtdXN0IGJlIHZhbGlkIFVURi04IHN0cmluZy4gIFdoZW4gVVRGLTgKKy8vIHZhbGlkYXRpb24gaXMgZW5hYmxlZCAoR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVEKToKKy8vIFdyaXRlSW52YWxpZFVURjhTdHJpbmc6ICBzZWUgZXJyb3IgbWVzc2FnZS4KKy8vIFJlYWRJbnZhbGlkVVRGOFN0cmluZzogIHNlZSBlcnJvciBtZXNzYWdlLgorLy8gV3JpdGVWYWxpZFVURjhTdHJpbmc6IGZpbmUuCisvLyBSZWFkVmFsaWRVVEY4U3RyaW5nOiAgZmluZS4KKy8vIFdyaXRlQW55Qnl0ZXM6IGZpbmUuCisvLyBSZWFkQW55Qnl0ZXM6IGZpbmUuCitjb25zdCBjaGFyICoga0ludmFsaWRVVEY4U3RyaW5nID0gIkludmFsaWQgVVRGLTg6IFx4QTBceEIwXHhDMFx4RDAiOworLy8gVGhpcyB1c2VkIHRvIGJlICJWYWxpZCBVVEYtODogXHgwMVx4MDJcdThDMzdcdTZCNEMiLCBidXQgTVNWQyBzZWVtcyB0bworLy8gaW50ZXJwcmV0IFx1IGRpZmZlcmVudGx5IGZyb20gR0NDLgorY29uc3QgY2hhciAqIGtWYWxpZFVURjhTdHJpbmcgPSAiVmFsaWQgVVRGLTg6IFx4MDFceDAyXDM1MFwyNjBcMjY3XDM0NlwyNTVcMjE0IjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgV3JpdGVNZXNzYWdlKGNvbnN0IGNoYXIgKnZhbHVlLCBUICptZXNzYWdlLCBzdHJpbmcgKndpcmVfYnVmZmVyKSB7CisgIG1lc3NhZ2UtPnNldF9kYXRhKHZhbHVlKTsKKyAgd2lyZV9idWZmZXItPmNsZWFyKCk7CisgIG1lc3NhZ2UtPkFwcGVuZFRvU3RyaW5nKHdpcmVfYnVmZmVyKTsKKyAgcmV0dXJuICh3aXJlX2J1ZmZlci0+c2l6ZSgpID4gMCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIFJlYWRNZXNzYWdlKGNvbnN0IHN0cmluZyAmd2lyZV9idWZmZXIsIFQgKm1lc3NhZ2UpIHsKKyAgcmV0dXJuIG1lc3NhZ2UtPlBhcnNlRnJvbUFycmF5KHdpcmVfYnVmZmVyLmRhdGEoKSwgd2lyZV9idWZmZXIuc2l6ZSgpKTsKK30KKworVEVTVChVdGY4VmFsaWRhdGlvblRlc3QsIFdyaXRlSW52YWxpZFVURjhTdHJpbmcpIHsKKyAgc3RyaW5nIHdpcmVfYnVmZmVyOworICBwcm90b2J1Zl91bml0dGVzdDo6T25lU3RyaW5nIGlucHV0OworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFdyaXRlTWVzc2FnZShrSW52YWxpZFVURjhTdHJpbmcsICZpbnB1dCwgJndpcmVfYnVmZmVyKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECisgIEFTU0VSVF9FUSgxLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJFbmNvdW50ZXJlZCBzdHJpbmcgY29udGFpbmluZyBpbnZhbGlkIFVURi04IGRhdGEgd2hpbGUgIgorICAgICAgICAgICAgInNlcmlhbGl6aW5nIHByb3RvY29sIGJ1ZmZlci4gU3RyaW5ncyBtdXN0IGNvbnRhaW4gb25seSBVVEYtODsgIgorICAgICAgICAgICAgInVzZSB0aGUgJ2J5dGVzJyB0eXBlIGZvciByYXcgYnl0ZXMuIiwKKyAgICAgICAgICAgIGVycm9yc1swXSk7CisKKyNlbHNlCisgIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECit9CisKK1RFU1QoVXRmOFZhbGlkYXRpb25UZXN0LCBSZWFkSW52YWxpZFVURjhTdHJpbmcpIHsKKyAgc3RyaW5nIHdpcmVfYnVmZmVyOworICBwcm90b2J1Zl91bml0dGVzdDo6T25lU3RyaW5nIGlucHV0OworICBXcml0ZU1lc3NhZ2Uoa0ludmFsaWRVVEY4U3RyaW5nLCAmaW5wdXQsICZ3aXJlX2J1ZmZlcik7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVTdHJpbmcgb3V0cHV0OworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFJlYWRNZXNzYWdlKHdpcmVfYnVmZmVyLCAmb3V0cHV0KTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECisgIEFTU0VSVF9FUSgxLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJFbmNvdW50ZXJlZCBzdHJpbmcgY29udGFpbmluZyBpbnZhbGlkIFVURi04IGRhdGEgd2hpbGUgIgorICAgICAgICAgICAgInBhcnNpbmcgcHJvdG9jb2wgYnVmZmVyLiBTdHJpbmdzIG11c3QgY29udGFpbiBvbmx5IFVURi04OyAiCisgICAgICAgICAgICAidXNlIHRoZSAnYnl0ZXMnIHR5cGUgZm9yIHJhdyBieXRlcy4iLAorICAgICAgICAgICAgZXJyb3JzWzBdKTsKKworI2Vsc2UKKyAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKK30KKworVEVTVChVdGY4VmFsaWRhdGlvblRlc3QsIFdyaXRlVmFsaWRVVEY4U3RyaW5nKSB7CisgIHN0cmluZyB3aXJlX2J1ZmZlcjsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZVN0cmluZyBpbnB1dDsKKyAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOworICB7CisgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKKyAgICBXcml0ZU1lc3NhZ2Uoa1ZhbGlkVVRGOFN0cmluZywgJmlucHV0LCAmd2lyZV9idWZmZXIpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKyAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOworfQorCitURVNUKFV0ZjhWYWxpZGF0aW9uVGVzdCwgUmVhZFZhbGlkVVRGOFN0cmluZykgeworICBzdHJpbmcgd2lyZV9idWZmZXI7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVTdHJpbmcgaW5wdXQ7CisgIFdyaXRlTWVzc2FnZShrVmFsaWRVVEY4U3RyaW5nLCAmaW5wdXQsICZ3aXJlX2J1ZmZlcik7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVTdHJpbmcgb3V0cHV0OworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFJlYWRNZXNzYWdlKHdpcmVfYnVmZmVyLCAmb3V0cHV0KTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisgIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKGlucHV0LmRhdGEoKSwgb3V0cHV0LmRhdGEoKSk7Cit9CisKKy8vIEJ5dGVzOiBhbnl0aGluZyBjYW4gcGFzcyBhcyBieXRlcywgdXNlIGludmFsaWQgVVRGLTggc3RyaW5nIHRvIHRlc3QKK1RFU1QoVXRmOFZhbGlkYXRpb25UZXN0LCBXcml0ZUFyYml0cmFyeUJ5dGVzKSB7CisgIHN0cmluZyB3aXJlX2J1ZmZlcjsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZUJ5dGVzIGlucHV0OworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFdyaXRlTWVzc2FnZShrSW52YWxpZFVURjhTdHJpbmcsICZpbnB1dCwgJndpcmVfYnVmZmVyKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisgIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKK30KKworVEVTVChVdGY4VmFsaWRhdGlvblRlc3QsIFJlYWRBcmJpdHJhcnlCeXRlcykgeworICBzdHJpbmcgd2lyZV9idWZmZXI7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVCeXRlcyBpbnB1dDsKKyAgV3JpdGVNZXNzYWdlKGtJbnZhbGlkVVRGOFN0cmluZywgJmlucHV0LCAmd2lyZV9idWZmZXIpOworICBwcm90b2J1Zl91bml0dGVzdDo6T25lQnl0ZXMgb3V0cHV0OworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFJlYWRNZXNzYWdlKHdpcmVfYnVmZmVyLCAmb3V0cHV0KTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisgIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKGlucHV0LmRhdGEoKSwgb3V0cHV0LmRhdGEoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi92c3Byb2plY3RzL2NvbmZpZy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3ZzcHJvamVjdHMvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2NDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi92c3Byb2plY3RzL2NvbmZpZy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIHByb3RvYnVmIGNvbmZpZy5oIGZvciBNU1ZDLiAgT24gb3RoZXIgcGxhdGZvcm1zLCB0aGlzIGlzIGdlbmVyYXRlZAorICogYXV0b21hdGljYWxseSBieSBhdXRvaGVhZGVyIC8gYXV0b2NvbmYgLyBjb25maWd1cmUuICovCisKKy8qIHRoZSBsb2NhdGlvbiBvZiA8aGFzaF9tYXA+ICovCisjZGVmaW5lIEhBU0hfTUFQX0ggPGhhc2hfbWFwPgorCisvKiB0aGUgbmFtZXNwYWNlIG9mIGhhc2hfbWFwL2hhc2hfc2V0ICovCisvLyBBcHBhcmVudGx5IE1pY3Jvc29mdCBkZWNpZGVkIHRvIG1vdmUgaGFzaF9tYXAgKmJhY2sqIHRvIHRoZSBzdGQgbmFtZXNwYWNlCisvLyBpbiBNU1ZDIDIwMTA6CisvLyAgIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS92Y2Jsb2cvYXJjaGl2ZS8yMDA5LzA1LzI1L3N0bC1icmVha2luZy1jaGFuZ2VzLWluLXZpc3VhbC1zdHVkaW8tMjAxMC1iZXRhLTEuYXNweAorLy8gVE9ETyhrZW50b24pOiAgVXNlIHVub3JkZXJlZF9tYXAgaW5zdGVhZCwgd2hpY2ggaXMgYXZhaWxhYmxlIGluIE1TVkMgMjAxMC4KKyNpZiBfTVNDX1ZFUiA8IDEzMTAgfHwgX01TQ19WRVIgPj0gMTYwMAorI2RlZmluZSBIQVNIX05BTUVTUEFDRSBzdGQKKyNlbHNlCisjZGVmaW5lIEhBU0hfTkFNRVNQQUNFIHN0ZGV4dAorI2VuZGlmCisKKy8qIHRoZSBsb2NhdGlvbiBvZiA8aGFzaF9zZXQ+ICovCisjZGVmaW5lIEhBU0hfU0VUX0ggPGhhc2hfc2V0PgorCisvKiBkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGhhcyBoYXNoX21hcCAqLworI2RlZmluZSBIQVZFX0hBU0hfTUFQIDEKKworLyogZGVmaW5lIGlmIHRoZSBjb21waWxlciBoYXMgaGFzaF9zZXQgKi8KKyNkZWZpbmUgSEFWRV9IQVNIX1NFVCAxCisKKy8qIGRlZmluZSBpZiB5b3Ugd2FudCB0byB1c2UgemxpYi4gIFNlZSByZWFkbWUudHh0IGZvciBhZGRpdGlvbmFsCisgKiByZXF1aXJlbWVudHMuICovCisvLyAjZGVmaW5lIEhBVkVfWkxJQiAxCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvdnNwcm9qZWN0cy9jb252ZXJ0MjAwOHRvMjAwNS5zaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi92c3Byb2plY3RzL2NvbnZlcnQyMDA4dG8yMDA1LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYwZWNjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvdnNwcm9qZWN0cy9jb252ZXJ0MjAwOHRvMjAwNS5zaApAQCAtMCwwICsxLDIwIEBACisjISAvYmluL3NoIC1lCisKKyMgVGhpcyBzY3JpcHQgZG93bmdyYWRlcyBNU1ZDIDIwMDggcHJvamVjdHMgdG8gTVNWQyAyMDA1IHByb2plY3RzLCBhbGxvd2luZworIyBwZW9wbGUgd2l0aCBNU1ZDIDIwMDUgdG8gb3BlbiB0aGVtLiAgT3RoZXJ3aXNlLCBNU1ZDIDIwMDUgc2ltcGx5IHJlZnVzZXMgdG8KKyMgb3BlbiBwcm9qZWN0cyBjcmVhdGVkIHdpdGggMjAwOC4gIFdlIHJ1biB0aGlzIGFzIHBhcnQgb2Ygb3VyIHJlbGVhc2UgcHJvY2Vzcy4KKyMgSWYgeW91IG9idGFpbmVkIHRoZSBjb2RlIGRpcmVjdCBmcm9tIHZlcnNpb24gY29udHJvbCBhbmQgeW91IHdhbnQgdG8gdXNlCisjIE1TVkMgMjAwNSwgeW91IG1heSBoYXZlIHRvIHJ1biB0aGlzIG1hbnVhbGx5LiAgKEhpbnQ6ICBVc2UgQ3lnd2luIG9yIE1TWVMuKQorCitmb3IgZmlsZSBpbiAqLnNsbjsgZG8KKyAgZWNobyAiZG93bmdyYWRpbmcgJGZpbGUuLi4iCisgIHNlZCAtaSAtcmUgJ3MvRm9ybWF0IFZlcnNpb24gMTAuMDAvRm9ybWF0IFZlcnNpb24gOS4wMC9nOworICAgICAgICAgICAgICBzL1Zpc3VhbCBTdHVkaW8gMjAwOC9WaXN1YWwgU3R1ZGlvIDIwMDUvZzsnICRmaWxlCitkb25lCisKK2ZvciBmaWxlIGluICoudmNwcm9qOyBkbworICBlY2hvICJkb3duZ3JhZGluZyAkZmlsZS4uLiIKKyAgc2VkIC1pIC1yZSAncy9WZXJzaW9uPSI5LjAwIi9WZXJzaW9uPSI4LjAwIi9nOycgJGZpbGUKK2RvbmUKKworIyBZZXMsIHJlYWxseSwgdGhhdCdzIGl0LgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3ZzcHJvamVjdHMvZXh0cmFjdF9pbmNsdWRlcy5iYXQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvdnNwcm9qZWN0cy9leHRyYWN0X2luY2x1ZGVzLmJhdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MGZkZjczCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3ZzcHJvamVjdHMvZXh0cmFjdF9pbmNsdWRlcy5iYXQKQEAgLTAsMCArMSw0NiBAQAorbWQgaW5jbHVkZQ0KK21kIGluY2x1ZGVcZ29vZ2xlDQorbWQgaW5jbHVkZVxnb29nbGVccHJvdG9idWYNCittZCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxzdHVicw0KK21kIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGlvDQorbWQgaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXINCittZCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHANCittZCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxqYXZhDQorbWQgaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXJccHl0aG9uDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGF0b21pY29wcy5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGF0b21pY29wcy5oDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGF0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xhdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmgNCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcY29tbW9uLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcc3R1YnNcY29tbW9uLmgNCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNcb25jZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXG9uY2UuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xwbGF0Zm9ybV9tYWNyb3MuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xwbGF0Zm9ybV9tYWNyb3MuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcZGVzY3JpcHRvci5oDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3IucGIuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yLnBiLmgNCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcZGVzY3JpcHRvcl9kYXRhYmFzZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3JfZGF0YWJhc2UuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxkeW5hbWljX21lc3NhZ2UuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxkeW5hbWljX21lc3NhZ2UuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxleHRlbnNpb25fc2V0LmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcZXh0ZW5zaW9uX3NldC5oDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGdlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxnZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmgNCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxtZXNzYWdlLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcbWVzc2FnZS5oDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXG1lc3NhZ2VfbGl0ZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXG1lc3NhZ2VfbGl0ZS5oDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHJlZmxlY3Rpb25fb3BzLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZccmVmbGVjdGlvbl9vcHMuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxyZXBlYXRlZF9maWVsZC5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHJlcGVhdGVkX2ZpZWxkLmgNCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcc2VydmljZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHNlcnZpY2UuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx0ZXh0X2Zvcm1hdC5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHRleHRfZm9ybWF0LmgNCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcdW5rbm93bl9maWVsZF9zZXQuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlx1bmtub3duX2ZpZWxkX3NldC5oDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHdpcmVfZm9ybWF0LmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXQuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx3aXJlX2Zvcm1hdF9saXRlLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXRfbGl0ZS5oDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHdpcmVfZm9ybWF0X2xpdGVfaW5sLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1xjb2RlZF9zdHJlYW0uaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxpb1xjb2RlZF9zdHJlYW0uaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1xnemlwX3N0cmVhbS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGlvXGd6aXBfc3RyZWFtLmgNCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9ccHJpbnRlci5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGlvXHByaW50ZXIuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x0b2tlbml6ZXIuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxpb1x0b2tlbml6ZXIuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x6ZXJvX2NvcHlfc3RyZWFtLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcaW9cemVyb19jb3B5X3N0cmVhbS5oDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGlvXHplcm9fY29weV9zdHJlYW1faW1wbC5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGlvXHplcm9fY29weV9zdHJlYW1faW1wbC5oDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGlvXHplcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcaW9cemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjb2RlX2dlbmVyYXRvci5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNvZGVfZ2VuZXJhdG9yLmgNCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY29tbWFuZF9saW5lX2ludGVyZmFjZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNvbW1hbmRfbGluZV9pbnRlcmZhY2UuaA0KK2NvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxpbXBvcnRlci5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGltcG9ydGVyLmgNCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJccGFyc2VyLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXJccGFyc2VyLmgNCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9nZW5lcmF0b3IuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjcHBcY3BwX2dlbmVyYXRvci5oDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGphdmFcamF2YV9nZW5lcmF0b3IuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxqYXZhXGphdmFfZ2VuZXJhdG9yLmgNCitjb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJccHl0aG9uXHB5dGhvbl9nZW5lcmF0b3IuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxweXRob25ccHl0aG9uX2dlbmVyYXRvci5oDQorY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHBsdWdpbi5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHBsdWdpbi5oDQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3ZzcHJvamVjdHMvcmVhZG1lLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi92c3Byb2plY3RzL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4MzQ1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi92c3Byb2plY3RzL3JlYWRtZS50eHQKQEAgLTAsMCArMSwxMTQgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHByb2plY3QgZmlsZXMgZm9yIGNvbXBpbGluZyBQcm90b2NvbCBCdWZmZXJzIHVzaW5nCitNU1ZDLiAgVGhpcyBpcyBub3QgdGhlIHJlY29tbWVuZGVkIHdheSB0byBkbyBQcm90b2NvbCBCdWZmZXIgZGV2ZWxvcG1lbnQgLS0KK3dlIHByZWZlciB0byBkZXZlbG9wIHVuZGVyIGEgVW5peC1saWtlIGVudmlyb25tZW50IC0tIGJ1dCBpdCBtYXkgYmUgbW9yZQorYWNjZXNzaWJsZSB0byB0aG9zZSB3aG8gcHJpbWFyaWx5IHdvcmsgd2l0aCBNU1ZDLgorCitDb21waWxpbmcgYW5kIEluc3RhbGxpbmcKKz09PT09PT09PT09PT09PT09PT09PT09PQorCisxKSBPcGVuIHByb3RvYnVmLnNsbiBpbiBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpby4KKzIpIENob29zZSAiRGVidWciIG9yICJSZWxlYXNlIiBjb25maWd1cmF0aW9uIGFzIGRlc2lyZWQuKgorMykgRnJvbSB0aGUgQnVpbGQgbWVudSwgY2hvb3NlICJCdWlsZCBTb2x1dGlvbiIuICBXYWl0IGZvciBjb21waWxpbmcgdG8gZmluaXNoLgorNCkgRnJvbSBhIGNvbW1hbmQgc2hlbGwsIHJ1biB0ZXN0cy5leGUgYW5kIGxpdGUtdGVzdC5leGUgYW5kIGNoZWNrIHRoYXQgYWxsCisgICB0ZXN0cyBwYXNzLgorNSkgUnVuIGV4dHJhY3RfaW5jbHVkZXMuYmF0IHRvIGNvcHkgYWxsIHRoZSBwdWJsaWMgaGVhZGVycyBpbnRvIGEgc2VwYXJhdGUKKyAgICJpbmNsdWRlIiBkaXJlY3RvcnkgKHVuZGVyIHRoZSB0b3AtbGV2ZWwgcGFja2FnZSBkaXJlY3RvcnkpLgorNikgQ29weSB0aGUgY29udGVudHMgb2YgdGhlIGluY2x1ZGUgZGlyZWN0b3J5IHRvIHdoZXJldmVyIHlvdSB3YW50IHRvIHB1dAorICAgaGVhZGVycy4KKzcpIENvcHkgcHJvdG9jLmV4ZSB3aGVyZXZlciB5b3UgcHV0IGJ1aWxkIHRvb2xzIChwcm9iYWJseSBzb21ld2hlcmUgaW4geW91cgorICAgUEFUSCkuCis4KSBDb3B5IGxpYnByb3RvYnVmLmxpYiwgbGlicHJvdG9idWYtbGl0ZS5saWIsIGFuZCBsaWJwcm90b2MubGliIHdoZXJldmVyIHlvdQorICAgcHV0IGxpYnJhcmllcy4KKworKiBUbyBhdm9pZCBjb25mbGljdHMgYmV0d2VlbiB0aGUgTVNWQyBkZWJ1ZyBhbmQgcmVsZWFzZSBydW50aW1lIGxpYnJhcmllcywgd2hlbgorICBjb21waWxpbmcgYSBkZWJ1ZyBidWlsZCBvZiB5b3VyIGFwcGxpY2F0aW9uLCB5b3UgbWF5IG5lZWQgdG8gbGluayBhZ2FpbnN0IGEKKyAgZGVidWcgYnVpbGQgb2YgbGlicHJvdG9idWYubGliLiAgU2ltaWxhcmx5LCByZWxlYXNlIGJ1aWxkcyBzaG91bGQgbGluayBhZ2FpbnN0CisgIHJlbGVhc2UgbGlicy4KKworRExMcyB2cy4gc3RhdGljIGxpbmtpbmcKKz09PT09PT09PT09PT09PT09PT09PT09CisKK1N0YXRpYyBsaW5raW5nIGlzIG5vdyB0aGUgZGVmYXVsdCBmb3IgdGhlIFByb3RvY29sIEJ1ZmZlciBsaWJyYXJpZXMuICBEdWUgdG8KK2lzc3VlcyB3aXRoIFdpbjMyJ3MgdXNlIG9mIGEgc2VwYXJhdGUgaGVhcCBmb3IgZWFjaCBETEwsIGFzIHdlbGwgYXMgYmluYXJ5Citjb21wYXRpYmlsaXR5IGlzc3VlcyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBNU1ZDJ3MgU1RMIGxpYnJhcnksIGl0IGlzCityZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2Ugc3RhdGljIGxpbmthZ2Ugb25seS4gIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRvCitidWlsZCBsaWJwcm90b2J1ZiBhbmQgbGlicHJvdG9jIGFzIERMTHMgaWYgeW91IHJlYWxseSB3YW50LiAgVG8gZG8gdGhpcywKK2RvIHRoZSBmb2xsb3dpbmc6CisKKyAgMSkgT3BlbiBwcm90b2J1Zi5zbG4gaW4gTVNWQy4KKyAgMikgRm9yIGVhY2ggb2YgdGhlIHByb2plY3RzIGxpYnByb3RvYnVmLCBsaWJwcm90b2J1Zi1saXRlLCBhbmQgbGlicHJvdG9jLCBkbworICAgICB0aGUgZm9sbG93aW5nOgorICAgIDJhKSBSaWdodC1jbGljayB0aGUgcHJvamVjdCBhbmQgY2hvb3NlICJwcm9wZXJ0aWVzIi4KKyAgICAyYikgRnJvbSB0aGUgc2lkZSBiYXIsIGNob29zZSAiR2VuZXJhbCIsIHVuZGVyICJDb25maWd1cmF0aW9uIFByb3BlcnRpZXMiLgorICAgIDJjKSBDaGFuZ2UgdGhlICJDb25maWd1cmF0aW9uIFR5cGUiIHRvICJEeW5hbWljIExpYnJhcnkgKC5kbGwpIi4KKyAgICAyZCkgRnJvbSB0aGUgc2lkZSBiYXIsIGNob29zZSAiUHJlcHJvY2Vzc29yIiwgdW5kZXIgIkMvQysrIi4KKyAgICAyZSkgQWRkIFBST1RPQlVGX1VTRV9ETExTIHRvIHRoZSBsaXN0IG9mIHByZXByb2Nlc3NvciBkZWZpbmVzLgorICAzKSBXaGVuIGNvbXBpbGluZyB5b3VyIHByb2plY3QsIG1ha2Ugc3VyZSB0byAjZGVmaW5lIFBST1RPQlVGX1VTRV9ETExTLgorCitXaGVuIGRpc3RyaWJ1dGluZyB5b3VyIHNvZnR3YXJlIHRvIGVuZCB1c2Vycywgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRoYXQgeW91CitkbyBOT1QgaW5zdGFsbCBsaWJwcm90b2J1Zi5kbGwgb3IgbGlicHJvdG9jLmRsbCB0byBhbnkgc2hhcmVkIGxvY2F0aW9uLgorSW5zdGVhZCwga2VlcCB0aGVzZSBsaWJyYXJpZXMgbmV4dCB0byB5b3VyIGJpbmFyaWVzLCBpbiB5b3VyIGFwcGxpY2F0aW9uJ3MKK293biBpbnN0YWxsIGRpcmVjdG9yeS4gIEMrKyBtYWtlcyBpdCB2ZXJ5IGRpZmZpY3VsdCB0byBtYWludGFpbiBiaW5hcnkKK2NvbXBhdGliaWxpdHkgYmV0d2VlbiByZWxlYXNlcywgc28gaXQgaXMgbGlrZWx5IHRoYXQgZnV0dXJlIHZlcnNpb25zIG9mIHRoZXNlCitsaWJyYXJpZXMgd2lsbCAqbm90KiBiZSB1c2FibGUgYXMgZHJvcC1pbiByZXBsYWNlbWVudHMuCisKK0lmIHlvdXIgcHJvamVjdCBpcyBpdHNlbGYgYSBETEwgaW50ZW5kZWQgZm9yIHVzZSBieSB0aGlyZC1wYXJ0eSBzb2Z0d2FyZSwgd2UKK3JlY29tbWVuZCB0aGF0IHlvdSBkbyBOT1QgZXhwb3NlIHByb3RvY29sIGJ1ZmZlciBvYmplY3RzIGluIHlvdXIgbGlicmFyeSdzCitwdWJsaWMgaW50ZXJmYWNlLCBhbmQgdGhhdCB5b3Ugc3RhdGljYWxseSBsaW5rIHByb3RvY29sIGJ1ZmZlcnMgaW50byB5b3VyCitsaWJyYXJ5LgorCitaTGliIHN1cHBvcnQKKz09PT09PT09PT09PQorCitJZiB5b3Ugd2FudCB0byBpbmNsdWRlIEd6aXBJbnB1dFN0cmVhbSBhbmQgR3ppcE91dHB1dFN0cmVhbQorKGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oKSBpbiBsaWJwcm90b2MsIHlvdSB3aWxsIG5lZWQgdG8gZG8gYSBmZXcKK2FkZGl0aW9uYWwgc3RlcHM6CisKKzEpIE9idGFpbiBhIGNvcHkgb2YgdGhlIHpsaWIgbGlicmFyeS4gIFRoZSBwcmUtY29tcGlsZWQgRExMIGF0IHpsaWIubmV0IHdvcmtzLgorMikgTWFrZSBzdXJlIHpsaWIncyB0d28gaGVhZGVycyBhcmUgaW4geW91ciBpbmNsdWRlIHBhdGggYW5kIHRoYXQgdGhlIC5saWIgZmlsZQorICAgaXMgaW4geW91ciBsaWJyYXJ5IHBhdGguICBZb3UgY291bGQgcGxhY2UgYWxsIHRocmVlIGZpbGVzIGRpcmVjdGx5IGludG8gdGhlCisgICB2c3Byb2plY3QgZGlyZWN0b3J5IHRvIGNvbXBpbGUgbGlicHJvdG9idWYsIGJ1dCB0aGV5IG5lZWQgdG8gYmUgdmlzaWJsZSB0bworICAgeW91ciBvd24gcHJvamVjdCBhcyB3ZWxsLCBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgcHV0IHRoZW0gaW50byB0aGUKKyAgIFZDIHNoYXJlZCBpY25sdWRlIGFuZCBsaWJyYXJ5IGRpcmVjdG9yaWVzLgorMykgUmlnaHQtY2xpY2sgb24gdGhlICJ0ZXN0cyIgcHJvamVjdCBhbmQgY2hvb3NlICJwcm9wZXJ0aWVzIi4gIE5hdmlnYXRlIHRoZQorICAgc2lkZWJhciB0byAiQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIiAtPiAiTGlua2VyIiAtPiAiSW5wdXQiLgorNCkgVW5kZXIgIkFkZGl0aW9uYWwgRGVwZW5kZW5jaWVzIiwgYWRkIHRoZSBuYW1lIG9mIHRoZSB6bGliIC5saWIgZmlsZSAoZS5nLgorICAgemRsbC5saWIpLiAgTWFrZSBzdXJlIHRvIHVwZGF0ZSBib3RoIHRoZSBEZWJ1ZyBhbmQgUmVsZWFzZSBjb25maWd1cmF0aW9ucy4KKzUpIElmIHlvdSBhcmUgY29tcGlsaW5nIGxpYnByb3RvYnVmIGFuZCBsaWJwcm90b2MgYXMgRExMcyAoc2VlIHByZXZpb3VzCisgICBzZWN0aW9uKSwgcmVwZWF0IHN0ZXBzIDIgYW5kIDMgZm9yIHRoZSBsaWJwcm90b2J1ZiBhbmQgbGlicHJvdG9jIHByb2plY3RzLgorICAgSWYgeW91IGFyZSBjb21waWxpbmcgdGhlbSBhcyBzdGF0aWMgbGlicmFyaWVzLCB0aGVuIHlvdSB3aWxsIG5lZWQgdG8gbGluaworICAgYWdhaW5zdCB0aGUgemxpYiBsaWJyYXJ5IGRpcmVjdGx5IGZyb20geW91ciBvd24gYXBwLgorNikgRWRpdCBjb25maWcuaCAoaW4gdGhlIHZzcHJvamVjdHMgZGlyZWN0b3J5KSBhbmQgdW4tY29tbWVudCB0aGUgbGluZSB0aGF0CisgICAjZGVmaW5lcyBIQVZFX1pMSUIuICAoT3IsIGFsdGVybmF0aXZlbHksIGRlZmluZSB0aGlzIG1hY3JvIHZpYSB0aGUgcHJvamVjdAorICAgc2V0dGluZ3MuKQorCitOb3RlcyBvbiBDb21waWxlciBXYXJuaW5ncworPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGZvbGxvd2luZyB3YXJuaW5ncyBoYXZlIGJlZW4gZGlzYWJsZWQgd2hpbGUgYnVpbGRpbmcgdGhlIHByb3RvYnVmIGxpYnJhcmllcworYW5kIGNvbXBpbGVyLiAgWW91IG1heSBoYXZlIHRvIGRpc2FibGUgc29tZSBvZiB0aGVtIGluIHlvdXIgb3duIHByb2plY3QgYXMKK3dlbGwsIG9yIGxpdmUgd2l0aCB0aGVtLgorCitDNDAxOCAtICdleHByZXNzaW9uJyA6IHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaAorQzQxNDYgLSB1bmFyeSBtaW51cyBvcGVyYXRvciBhcHBsaWVkIHRvIHVuc2lnbmVkIHR5cGUsIHJlc3VsdCBzdGlsbCB1bnNpZ25lZAorQzQyNDQgLSBDb252ZXJzaW9uIGZyb20gJ3R5cGUxJyB0byAndHlwZTInLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEuCitDNDI1MSAtICdpZGVudGlmaWVyJyA6IGNsYXNzICd0eXBlJyBuZWVkcyB0byBoYXZlIGRsbC1pbnRlcmZhY2UgdG8gYmUgdXNlZCBieQorICAgICAgICBjbGllbnRzIG9mIGNsYXNzICd0eXBlMicKK0M0MjY3IC0gQ29udmVyc2lvbiBmcm9tICdzaXplX3QnIHRvICd0eXBlJywgcG9zc2libGUgbG9zcyBvZiBkYXRhLgorQzQzMDUgLSAnaWRlbnRpZmllcicgOiB0cnVuY2F0aW9uIGZyb20gJ3R5cGUxJyB0byAndHlwZTInCitDNDM1NSAtICd0aGlzJyA6IHVzZWQgaW4gYmFzZSBtZW1iZXIgaW5pdGlhbGl6ZXIgbGlzdAorQzQ4MDAgLSAndHlwZScgOiBmb3JjaW5nIHZhbHVlIHRvIGJvb2wgJ3RydWUnIG9yICdmYWxzZScgKHBlcmZvcm1hbmNlIHdhcm5pbmcpCitDNDk5NiAtICdmdW5jdGlvbic6IHdhcyBkZWNsYXJlZCBkZXByZWNhdGVkCisKK0M0MjUxIGlzIG9mIHBhcnRpY3VsYXIgbm90ZSwgaWYgeW91IGFyZSBjb21waWxpbmcgdGhlIFByb3RvY29sIEJ1ZmZlciBsaWJyYXJ5CithcyBhIERMTCAoc2VlIHByZXZpb3VzIHNlY3Rpb24pLiAgVGhlIHByb3RvY29sIGJ1ZmZlciBsaWJyYXJ5IHVzZXMgdGVtcGxhdGVzIGluCitpdHMgcHVibGljIGludGVyZmFjZXMuICBNU1ZDIGRvZXMgbm90IHByb3ZpZGUgYW55IHJlYXNvbmFibGUgd2F5IHRvIGV4cG9ydAordGVtcGxhdGUgY2xhc3NlcyBmcm9tIGEgRExMLiAgSG93ZXZlciwgaW4gcHJhY3RpY2UsIGl0IGFwcGVhcnMgdGhhdCBleHBvcnRpbmcKK3RlbXBsYXRlcyBpcyBub3QgbmVjZXNzYXJ5IGFueXdheS4gIFNpbmNlIHRoZSBjb21wbGV0ZSBkZWZpbml0aW9uIG9mIGFueQordGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBoZWFkZXIgZmlsZXMsIGFueW9uZSBpbXBvcnRpbmcgdGhlIERMTCB3aWxsIGp1c3QKK2VuZCB1cCBjb21waWxpbmcgaW5zdGFuY2VzIG9mIHRoZSB0ZW1wbGF0ZXMgaW50byB0aGVpciBvd24gYmluYXJ5LiAgVGhlCitQcm90b2NvbCBCdWZmZXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVseSBvbiBzdGF0aWMgdGVtcGxhdGUgbWVtYmVycyBiZWluZwordW5pcXVlLCBzbyB0aGVyZSBzaG91bGQgYmUgbm8gcHJvYmxlbSB3aXRoIHRoaXMsIGJ1dCBNU1ZDIHByaW50cyB3YXJuaW5nCituZXZlcnRoZWxlc3MuICBTbywgd2UgZGlzYWJsZSBpdC4gIFVuZm9ydHVuYXRlbHksIHRoaXMgd2FybmluZyB3aWxsIGFsc28gYmUKK3Byb2R1Y2VkIHdoZW4gY29tcGlsaW5nIGNvZGUgd2hpY2ggbWVyZWx5IHVzZXMgcHJvdG9jb2wgYnVmZmVycywgbWVhbmluZyB5b3UKK21heSBoYXZlIHRvIGRpc2FibGUgaXQgaW4geW91ciBjb2RlIHRvby4K