ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDA0NTdiZDIuLmE0MmM5NDMgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMjIsMjEgKzIyLDExIEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAotTE9DQUxfTU9EVUxFIDo9IGNyCitMT0NBTF9NT0RVTEUgOj0gQ1IKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9TREtfVkVSU0lPTiA6PSA4CiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQogCi0jIGJ1aWxkIHRoZSB0ZXN0IGFwawotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQoraW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQogCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gQ1JUZXN0Ci1MT0NBTF9TREtfVkVSU0lPTiA6PSA4Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgdGVzdHMpCi1MT0NBTF9NQU5JRkVTVF9GSUxFIDo9IHRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKLUxPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBjcgotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL0NPUFlSSUdIVC50eHQgYi9DT1BZUklHSFQudHh0CmluZGV4IDhmZjZkMmUuLmFjNjQwNDkgMTAwNjQ0Ci0tLSBhL0NPUFlSSUdIVC50eHQKKysrIGIvQ09QWVJJR0hULnR4dApAQCAtMSw0ICsxLDUgQEAKLVRoZSBmb2xsb3dpbmcgbGljZW5zZSBjb3ZlcnMgYWxsIG1hdGVyaWFsIHJlbWFpbmluZyBpbiB0aGlzIGRpcmVjdG9yeS4KK1RoZSBmb2xsb3dpbmcgbGljZW5zZSBjb3ZlcnMgYWxsIG1hdGVyaWFsIHJlbWFpbmluZyBpbiB0aGlzIGRpcmVjdG9yeSwKK2V4Y2VwdCBTbG93Q1JUZXN0LmphdmEsIHdoaWNoIGlzIGNvdmVyZWQgYnkgYW4gQXBhY2hlIDIuMCBsaWNlbnNlLgogCiBDb3B5cmlnaHQgqSAxOTk5LCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIC0tIEFMTCBSSUdIVFMgUkVTRVJWRUQKIApkaWZmIC0tZ2l0IGEvc3JjL2NvbS9ocC9jcmVhbHMvQ1IuamF2YSBiL3NyYy9jb20vaHAvY3JlYWxzL0NSLmphdmEKaW5kZXggM2I3NmRmNy4uNzZkZjI2MyAxMDA2NDQKLS0tIGEvc3JjL2NvbS9ocC9jcmVhbHMvQ1IuamF2YQorKysgYi9zcmMvY29tL2hwL2NyZWFscy9DUi5qYXZhCkBAIC04MjUsMTIgKzgyNSwxMyBAQAogKiBUaGUgdHJpZ29ub21ldHJpYyBjb3NpbmUgZnVuY3Rpb24uCiAqLwogICAgIHB1YmxpYyBDUiBjb3MoKSB7Ci0gICAgICAgIEJpZ0ludGVnZXIgcGlfbXVsdGlwbGVzID0gZGl2aWRlKFBJKS5nZXRfYXBwcigwKTsKLSAgICAgICAgQmlnSW50ZWdlciBhYnNfcGlfbXVsdGlwbGVzID0gcGlfbXVsdGlwbGVzLmFicygpOwotICAgICAgICBpZiAoYWJzX3BpX211bHRpcGxlcy5jb21wYXJlVG8oYmlnMikgPj0gMCkgeworICAgICAgICBCaWdJbnRlZ2VyIGhhbGZwaV9tdWx0aXBsZXMgPSBkaXZpZGUoUEkpLmdldF9hcHByKC0xKTsKKyAgICAgICAgQmlnSW50ZWdlciBhYnNfaGFsZnBpX211bHRpcGxlcyA9IGhhbGZwaV9tdWx0aXBsZXMuYWJzKCk7CisgICAgICAgIGlmIChhYnNfaGFsZnBpX211bHRpcGxlcy5jb21wYXJlVG8oYmlnMikgPj0gMCkgewogICAgICAgICAgICAgLy8gU3VidHJhY3QgbXVsdGlwbGVzIG9mIFBJCisgICAgICAgICAgICBCaWdJbnRlZ2VyIHBpX211bHRpcGxlcyA9IHNjYWxlKGhhbGZwaV9tdWx0aXBsZXMsIC0xKTsKICAgICAgICAgICAgIENSIGFkanVzdG1lbnQgPSBQSS5tdWx0aXBseShDUi52YWx1ZU9mKHBpX211bHRpcGxlcykpOwotICAgICAgICAgICAgaWYgKGFic19waV9tdWx0aXBsZXMuYW5kKGJpZzEpLnNpZ251bSgpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChwaV9tdWx0aXBsZXMuYW5kKGJpZzEpLnNpZ251bSgpICE9IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gc3VidHJhY3QoYWRqdXN0bWVudCkuY29zKCkubmVnYXRlKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBzdWJ0cmFjdChhZGp1c3RtZW50KS5jb3MoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb20vaHAvY3JlYWxzL1VuYXJ5Q1JGdW5jdGlvbi5qYXZhIGIvc3JjL2NvbS9ocC9jcmVhbHMvVW5hcnlDUkZ1bmN0aW9uLmphdmEKaW5kZXggNDdjNjI2Yy4uNTk0ZTgxMSAxMDA2NDQKLS0tIGEvc3JjL2NvbS9ocC9jcmVhbHMvVW5hcnlDUkZ1bmN0aW9uLmphdmEKKysrIGIvc3JjL2NvbS9ocC9jcmVhbHMvVW5hcnlDUkZ1bmN0aW9uLmphdmEKQEAgLTM5LDYgKzM5LDcgQEAKIC8vIDUvMjAxNCBBZGRlZCBTdHJpbmdzIHRvIEFyaXRobWV0aWNFeGNlcHRpb25zCiAKIHBhY2thZ2UgY29tLmhwLmNyZWFsczsKKy8vIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKQEAgLTI4Myw2ICsyODQsMTQgQEAKICAgICBmaW5hbCBpbnQgZGVyaXZfbXNkW10gPSBuZXcgaW50WzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSb3VnaCBhcHByb3guIG9mIG1zZCBvZiBmaXJzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmF0aXZlLgorICAgIGZpbmFsIHN0YXRpYyBCaWdJbnRlZ2VyIEJJRzEwMjMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTAyMyk7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gRU5BQkxFX1RSQUNFID0gZmFsc2U7ICAvLyBDaGFuZ2UgdG8gZ2VuZXJhdGUgdHJhY2UKKyAgICBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgcykgeworICAgICAgICBpZiAoRU5BQkxFX1RSQUNFKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocyk7CisgICAgICAgICAgICAvLyBDaGFuZ2UgdG8gTG9nLnYoIlVuYXJ5Q1JGdW5jdGlvbiIsIHMpOyBmb3IgQW5kcm9pZCB1c2UuCisgICAgICAgIH0KKyAgICB9CiAgICAgaW52ZXJzZU1vbm90b25lX1VuYXJ5Q1JGdW5jdGlvbihVbmFyeUNSRnVuY3Rpb24gZnVuYywgQ1IgbCwgQ1IgaCkgewogICAgICAgICBsb3dbMF0gPSBsOyBoaWdoWzBdID0gaDsKICAgICAgICAgQ1IgdG1wX2ZfbG93ID0gZnVuYy5leGVjdXRlKGwpOwpAQCAtMzIyLDEzICszMzEsMTEgQEAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIHByb3RlY3RlZCBCaWdJbnRlZ2VyIGFwcHJveGltYXRlKGludCBwKSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHRyYWNlID0gZmFsc2U7ICAgICAgICAvLyBDaGFuZ2UgdG8gZ2VuZXJhdGUgdHJhY2UKICAgICAgICAgICAgIGZpbmFsIGludCBleHRyYV9hcmdfcHJlYyA9IDQ7CiAgICAgICAgICAgICBmaW5hbCBVbmFyeUNSRnVuY3Rpb24gZm4gPSBmWzBdOwotICAgICAgICAgICAgaW50IHNtYWxsX3N0ZXBzID0gMDsgICAgICAgIC8vIE51bWJlciBvZiBwcmVjZWRpbmcgaW5lZmZlY3RpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwcy4gIElmIHRoaXMgbnVtYmVyIGdldHMgPj0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBwZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCBzdGVwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZW5zdXJlIGZvcndhcmQgcHJvZ3Jlc3MuCisgICAgICAgICAgICBpbnQgc21hbGxfc3RlcF9kZWZpY2l0ID0gMDsgLy8gTnVtYmVyIG9mIGluZWZmZWN0aXZlIHN0ZXBzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHlldCBjb21wZW5zYXRlZCBmb3IgYnkgYSBiaW5hcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWFyY2ggc3RlcC4KICAgICAgICAgICAgIGludCBkaWdpdHNfbmVlZGVkID0gbWF4X21zZFswXSAtIHA7CiAgICAgICAgICAgICBpZiAoZGlnaXRzX25lZWRlZCA8IDApIHJldHVybiBiaWcwOwogICAgICAgICAgICAgaW50IHdvcmtpbmdfYXJnX3ByZWMgPSBwIC0gZXh0cmFfYXJnX3ByZWM7CkBAIC0zMzksOCArMzQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXRpYWwgZ3Vlc3MKICAgICAgICAgICAgIC8vIFdlIHVzZSBhIGNvbWJpbmF0aW9uIG9mIGJpbmFyeSBzZWFyY2ggYW5kIHNvbWV0aGluZyBsaWtlCiAgICAgICAgICAgICAvLyB0aGUgc2VjYW50IG1ldGhvZC4gIFRoaXMgYWx3YXlzIGNvbnZlcmdlcyBsaW5lYXJseSwKLSAgICAgICAgICAgIC8vIGFuZCBzaG91bGQgY29udmVyZ2UgcXVhZHJhdGljYWxseSBmb3Igd2VsbC1iZWhhdmVkCi0gICAgICAgICAgICAvLyBmdW5jdGlvbnMuCisgICAgICAgICAgICAvLyBhbmQgc2hvdWxkIGNvbnZlcmdlIHF1YWRyYXRpY2FsbHkgdW5kZXIgZmF2b3JhYmxlIGFzc3VtcHRpb25zLgogICAgICAgICAgICAgLy8gRl9sIGFuZCBmX2ggYXJlIGFsd2F5cyB0aGUgYXBwcm94aW1hdGUgaW1hZ2VzIG9mIGwgYW5kIGguCiAgICAgICAgICAgICAvLyBBdCBhbnkgcG9pbnQsIGFyZyBpcyBiZXR3ZWVuIGZfbCBhbmQgZl9oLCBvciBubyBtb3JlIHRoYW4KICAgICAgICAgICAgIC8vIG9uZSBvdXRzaWRlIFtmX2wsIGZfaF0uCkBAIC0zNjYsOSArMzcyLDcgQEAKICAgICAgICAgICAgIEJpZ0ludGVnZXIgYXJnX2FwcHIgPSBhcmcuZ2V0X2FwcHIod29ya2luZ19ldmFsX3ByZWMpOwogICAgICAgICAgICAgYm9vbGVhbiBoYXZlX2dvb2RfYXBwciA9IChhcHByX3ZhbGlkICYmIG1pbl9wcmVjIDwgbWF4X21zZFswXSk7CiAgICAgICAgICAgICBpZiAoZGlnaXRzX25lZWRlZCA8IDMwICYmICFoYXZlX2dvb2RfYXBwcikgewotICAgICAgICAgICAgICAgIGlmICh0cmFjZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgaW50ZXJ2YWwgdG8gZW50aXJlIGRvbWFpbiIpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjZSgiU2V0dGluZyBpbnRlcnZhbCB0byBlbnRpcmUgZG9tYWluIik7CiAgICAgICAgICAgICAgICAgaCA9IGhpZ2hfYXBwcjsKICAgICAgICAgICAgICAgICBmX2ggPSBmX2hpZ2hbMF0uZ2V0X2FwcHIod29ya2luZ19ldmFsX3ByZWMpOwogICAgICAgICAgICAgICAgIGwgPSBsb3dfYXBwcjsKQEAgLTM4MSw3ICszODUsNyBAQAogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGF0X2xlZnQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGF0X3JpZ2h0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzbWFsbF9zdGVwcyA9IDI7ICAgICAgICAvLyBTdGFydCB3aXRoIGJpbiBzZWFyY2ggc3RlcC4KKyAgICAgICAgICAgICAgICBzbWFsbF9zdGVwX2RlZmljaXQgPSAyOyAgICAgICAgLy8gU3RhcnQgd2l0aCBiaW4gc2VhcmNoIHN0ZXBzLgogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpbnQgcm91Z2hfcHJlYyA9IHAgKyBkaWdpdHNfbmVlZGVkLzI7CiAKQEAgLTM5MCwxMSArMzk0LDggQEAKICAgICAgICAgICAgICAgICAgICAgcm91Z2hfcHJlYyA9IG1pbl9wcmVjOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHJvdWdoX2FwcHIgPSBnZXRfYXBwcihyb3VnaF9wcmVjKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXR0aW5nIGludGVydmFsIGJhc2VkIG9uIHByZXYuIGFwcHIiKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwcmV2LiBwcmVjID0gIiArIHJvdWdoX3ByZWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhcHByID0gIiArIHJvdWdoX2FwcHIpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjZSgiU2V0dGluZyBpbnRlcnZhbCBiYXNlZCBvbiBwcmV2LiBhcHByIik7CisgICAgICAgICAgICAgICAgdHJhY2UoInByZXYuIHByZWMgPSAiICsgcm91Z2hfcHJlYyArICIgYXBwciA9ICIgKyByb3VnaF9hcHByKTsKICAgICAgICAgICAgICAgICBoID0gcm91Z2hfYXBwci5hZGQoYmlnMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaGlmdExlZnQocm91Z2hfcHJlYyAtIHdvcmtpbmdfYXJnX3ByZWMpOwogICAgICAgICAgICAgICAgIGwgPSByb3VnaF9hcHByLnN1YnRyYWN0KGJpZzEpCkBAIC00MjIsMTQgKzQyMywxMiBAQAogICAgICAgICAgICAgZm9yKGludCBpID0gMDs7ICsraSkgewogICAgICAgICAgICAgICAgIGlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSB8fCBwbGVhc2Vfc3RvcCkKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0ZWRFcnJvcigpOwotICAgICAgICAgICAgICAgIGlmICh0cmFjZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKkl0ZXJhdGlvbjogIiArIGkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFyZyBwcmVjID0gIiArIHdvcmtpbmdfYXJnX3ByZWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGV2YWwgcHJlYyA9ICIgKyB3b3JraW5nX2V2YWxfcHJlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJnIGFwcHIuID0gIiArIGFyZ19hcHByKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJsID0gIiArIGwgKyAiOyBoID0gIiArIGgpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImYobCkgPSAiICsgZl9sICsgIjsgZihoKSA9ICIgKyBmX2gpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjZSgiKioqSXRlcmF0aW9uOiAiICsgaSk7CisgICAgICAgICAgICAgICAgdHJhY2UoIkFyZyBwcmVjID0gIiArIHdvcmtpbmdfYXJnX3ByZWMKKyAgICAgICAgICAgICAgICAgICAgICArICIgZXZhbCBwcmVjID0gIiArIHdvcmtpbmdfZXZhbF9wcmVjCisgICAgICAgICAgICAgICAgICAgICAgKyAiIGFyZyBhcHByLiA9ICIgKyBhcmdfYXBwcik7CisgICAgICAgICAgICAgICAgdHJhY2UoImwgPSAiICsgbCk7IHRyYWNlKCJoID0gIiArIGgpOworICAgICAgICAgICAgICAgIHRyYWNlKCJmKGwpID0gIiArIGZfbCk7IHRyYWNlKCJmKGgpID0gIiArIGZfaCk7CiAgICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2UuY29tcGFyZVRvKGJpZzYpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAvLyBBbnN3ZXIgaXMgbGVzcyB0aGFuIDEvMiB1bHAgYXdheSBmcm9tIGguCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzY2FsZShoLCAtZXh0cmFfYXJnX3ByZWMpOwpAQCAtNDM5LDI5ICs0MzgsMzUgQEAKICAgICAgICAgICAgICAgICAvLyBjaG9zZW4gcG9pbnQgKGd1ZXNzKSBpbiB0aGUgbWlkZGxlLgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBndWVzczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNtYWxsX3N0ZXBzID49IDIgfHwgZl9kaWZmZXJlbmNlLnNpZ251bSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBiaW5hcnlfc3RlcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoc21hbGxfc3RlcF9kZWZpY2l0ID4gMCB8fCBmX2RpZmZlcmVuY2Uuc2lnbnVtKCkgPT0gMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaW5hcnlfc3RlcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gYSBiaW5hcnkgc2VhcmNoIHN0ZXAgdG8gZ3VhcmFudGVlIGxpbmVhcgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVyZ2VuY2UuCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZSgiYmluYXJ5IHN0ZXAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGd1ZXNzID0gbC5hZGQoaCkuc2hpZnRSaWdodCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tc21hbGxfc3RlcF9kZWZpY2l0OwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVycG9sYXRlLgogICAgICAgICAgICAgICAgICAgICAgIC8vIGZfZGlmZmVyZW5jZSBpcyBub256ZXJvIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgdHJhY2UoImludGVycG9sYXRpbmciKTsKICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGFyZ19kaWZmZXJlbmNlID0gYXJnX2FwcHIuc3VidHJhY3QoZl9sKTsKICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHQgPSBhcmdfZGlmZmVyZW5jZS5tdWx0aXBseShkaWZmZXJlbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGFkaiA9IHQuZGl2aWRlKGZfZGlmZmVyZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKGFkai5jb21wYXJlVG8oZGlmZmVyZW5jZS5zaGlmdFJpZ2h0KDIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnkgY2xvc2UgdG8gbGVmdCBzaWRlIG9mIGludGVydmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBjbG9zZXIgdG8gY2VudGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb25lIG9mIHRoZSBlbmRwb2ludHMgaXMgdmVyeSBjbG9zZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFuc3dlciwgdGhpcyBzbG93cyBjb252ZXJzaW9uIGEgYml0LgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnV0IGl0IGdyZWF0bHkgaW5jcmVhc2VzIHRoZSBwcm9iYWJpbGl0eQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgYW5zd2VyIHdpbGwgYmUgaW4gdGhlIHNtYWxsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YmludGVydmFsLgotICAgICAgICAgICAgICAgICAgICAgICAgYWRqID0gYWRqLnNoaWZ0TGVmdCgxKTsKLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFkai5jb21wYXJlVG8oZGlmZmVyZW5jZS5tdWx0aXBseShDUi5iaWczKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaGlmdFJpZ2h0KDIpKSA+IDApeworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW50YXRpdmUgYWRqdXN0bWVudCB0byBsIHRvIGNvbXB1dGUgZ3Vlc3MKKyAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgd2l0aGluIDEvMTAyNCBvZiBlaXRoZXIgZW5kLCBiYWNrIG9mZi4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGdyZWF0bHkgaW1wcm92ZXMgdGhlIG9kZHMgb2YgYm91bmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYW5zd2VyIHdpdGhpbiB0aGUgc21hbGxlciBpbnRlcnZhbC4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaW50ZXJwb2xhdGlvbiB3aWxsIG9mdGVuIGdldCB1cworICAgICAgICAgICAgICAgICAgICAgIC8vIE1VQ0ggY2xvc2VyIHRoYW4gdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRqLmNvbXBhcmVUbyhkaWZmZXJlbmNlLnNoaWZ0UmlnaHQoMTApKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkaiA9IGFkai5zaGlmdExlZnQoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZSgiYWRqdXN0aW5nIGxlZnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFkai5jb21wYXJlVG8oZGlmZmVyZW5jZS5tdWx0aXBseShCSUcxMDIzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaGlmdFJpZ2h0KDEwKSkgPiAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkaiA9IGRpZmZlcmVuY2Uuc3VidHJhY3QoZGlmZmVyZW5jZS5zdWJ0cmFjdChhZGopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaGlmdExlZnQoMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2hpZnRMZWZ0KDgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlKCJhZGp1c3RpbmcgcmlnaHQiKTsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkai5zaWdudW0oKSA8PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICBhZGogPSBiaWcyOwpAQCAtNDc1LDE1ICs0ODAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgZm9yKGJvb2xlYW4gYWRqX3ByZWMgPSBmYWxzZTs7IGFkal9wcmVjID0gIWFkal9wcmVjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDUiBndWVzc19jciA9IENSLnZhbHVlT2YoZ3Vlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNoaWZ0TGVmdCh3b3JraW5nX2FyZ19wcmVjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXZhbHVhdGluZyBhdCAiICsgZ3Vlc3NfY3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCBwcmVjaXNpb24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd29ya2luZ19ldmFsX3ByZWMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2UoIkV2YWx1YXRpbmcgYXQgIiArIGd1ZXNzX2NyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCBwcmVjaXNpb24gIiArIHdvcmtpbmdfZXZhbF9wcmVjKTsKICAgICAgICAgICAgICAgICAgICAgICAgIENSIGZfZ3Vlc3NfY3IgPSBmbi5leGVjdXRlKGd1ZXNzX2NyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZm4gdmFsdWUgPSAiICsgZl9ndWVzc19jcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZSgiZm4gdmFsdWUgPSAiICsgZl9ndWVzc19jcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBmX2d1ZXNzID0gZl9ndWVzc19jci5nZXRfYXBwcih3b3JraW5nX2V2YWxfcHJlYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lID0gc2xvcHB5X2NvbXBhcmUoZl9ndWVzcywgYXJnX2FwcHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dGNvbWUgIT0gMCkgYnJlYWs7CkBAIC00OTMsMTkgKzQ5MywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkal9wcmVjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRqdXN0IHdvcmtpbmdfZXZhbF9wcmVjIHRvIGdldCBlbm91Z2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHV0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGp1c3RtZW50ID0gZGVyaXZfbXNkWzBdID4gMCA/IC0yMCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2X21zZFswXSAtIDIwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGp1c3RtZW50ID0gLWZfZ3Vlc3MuYml0TGVuZ3RoKCkvNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRqdXN0bWVudCA+IC0yMCkgYWRqdXN0bWVudCA9IC0gMjA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1IgbF9jciA9IENSLnZhbHVlT2YobCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2hpZnRMZWZ0KHdvcmtpbmdfYXJnX3ByZWMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSIGhfY3IgPSBDUi52YWx1ZU9mKGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNoaWZ0TGVmdCh3b3JraW5nX2FyZ19wcmVjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nX2V2YWxfcHJlYyArPSBhZGp1c3RtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5ldyBldmFsIHByZWMgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3b3JraW5nX2V2YWxfcHJlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGF0X2xlZnQ/ICIoYXQgbGVmdCkiIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoYXRfcmlnaHQ/ICIoYXQgcmlnaHQpIiA6ICIiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlKCJOZXcgZXZhbCBwcmVjID0gIiArIHdvcmtpbmdfZXZhbF9wcmVjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoYXRfbGVmdD8gIihhdCBsZWZ0KSIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChhdF9yaWdodD8gIihhdCByaWdodCkiIDogIiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXRfbGVmdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX2wgPSBmX2xvd1swXS5nZXRfYXBwcih3b3JraW5nX2V2YWxfcHJlYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTUyMiw3ICs1MTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBndWVzcyBtaWdodCBiZSBleGFjdGx5IHJpZ2h0OyB0d2VhayBpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNsaWdodGx5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0d2Vha2luZyBndWVzcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlKCJ0d2Vha2luZyBndWVzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgbmV3X2d1ZXNzID0gZ3Vlc3MuYWRkKHR3ZWFrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3X2d1ZXNzLmNvbXBhcmVUbyhoKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1ZXNzID0gZ3Vlc3Muc3VidHJhY3QodHdlYWspOwpAQCAtNTQ1LDExICs1NDIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGF0X2xlZnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIG5ld19kaWZmZXJlbmNlID0gaC5zdWJ0cmFjdChsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld19kaWZmZXJlbmNlLmNvbXBhcmVUbyhkaWZmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNoaWZ0UmlnaHQoMSkpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrc21hbGxfc3RlcHM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbWFsbF9zdGVwcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmluYXJ5X3N0ZXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdfZGlmZmVyZW5jZS5jb21wYXJlVG8oZGlmZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2hpZnRSaWdodCgxKSkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrc21hbGxfc3RlcF9kZWZpY2l0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXNtYWxsX3N0ZXBfZGVmaWNpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlID0gbmV3X2RpZmZlcmVuY2U7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQW5kcm9pZC5tayBiL3Rlc3RzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhNTY0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgT3RoZXIgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgY2FycnkgYSBkaWZmZXJlbnQgbGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIGJ1aWxkIHRoZSB0ZXN0IGFwaworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ1JUZXN0cworTE9DQUxfU0RLX1ZFUlNJT04gOj0gOAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCAuLi9zcmMpCisjIEVtcGlyaWNhbGx5LCBMT0NBTF9JTlNUUlVNRU5UQVRJT05fRk9SIGRvZXNuJ3Qgd29yaywgcGVyaGFwcyBiZWNhdXNlIGl0CisjIGV4cGVjdHMgYW4gYXBrLCBub3QgYSBsaWJyYXJ5LgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGE0MTE3OTguLjQ4ZTFjOTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMSw1ICsxLDUgQEAKIDwhLS0KLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCw2ICsxNCw5IEBACiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICBPdGhlciBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBjYXJyeSBhIGRpZmZlcmVudCBsaWNlbnNlLgorCisgTm90ZSB0aGF0IHRoZSB0YXJnZXRQYWNrYWdlIGlzIHRoZSB0ZXN0IGl0c2VsZjsgdGhhdCBhdm9pZHMgYnVpbGRpbmcKKyBhIHNlY29uZCBhcGsgc29sZWx5IHRvIHRlc3QgdGhlIGxpYnJhcnkuCiAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKQEAgLTI2LDcgKzI5LDggQEAKIAogICAgIDxpbnN0cnVtZW50YXRpb24KICAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uaHAuY3JlYWxzIiAvPgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5ocC5jcmVhbHMudGVzdHMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkNvbnN0cnVjdGl2ZSBSZWFscyB0ZXN0cyIgLz4KIAogICAgIDxhcHBsaWNhdGlvbj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CmRpZmYgLS1naXQgYS90ZXN0cy9SRUFETUUudHh0IGIvdGVzdHMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQwYjJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUkVBRE1FLnR4dApAQCAtMCwwICsxLDE2IEBACitSdW4gb24gQW5kcm9pZCB3aXRoCisKKzEpIEJ1aWxkIHRoZSB0ZXN0cy4KKzIpIGFkYiBpbnN0YWxsIDx0cmVlIHJvb3Q+L291dC90YXJnZXQvcHJvZHVjdC9nZW5lcmljL2RhdGEvYXBwL0NSVGVzdHMvQ1JUZXN0cy5hcGsKKzMpIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IGNvbS5ocC5jcmVhbHMudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIKKworVGhlIGxhc3Qgc3RlcCB0YWtlcyBhcm91bmQgMTAgbWludXRlcyBvbiBhIE5leHVzIDUuCisoQ1JUZXN0IGlzIHF1aWNrLCBTbG93Q1JUZXN0IGlzIG5vdCwgZXNwZWNpYWxseSBub3QgdGhlIGZpbmFsIHRyaWcgZnVuY3Rpb24KK3Rlc3QuKQorCitOb3RlIHRoYXQgUmFuZG9tIHNlZWRzIGFyZSBub3Qgc2V0LiAgSGVuY2UgcmVwcmVhdGVkIHJ1bnMgc2hvdWxkIGltcHJvdmUKK2NvdmVyYWdlIGF0IHRoZSBjb3N0IG9mIHJlcHJvZHVjaWJpbGl0eS4gIEZhaWxpbmcgYXJndW1lbnRzIHNob3VsZCBob3dldmVyCitiZSBwcmludGVkLgorCitXZSBleHBlY3QgdGhhdCB0aGlzIHRlc3QgaXMgbXVjaCB0b28gbm9uZGV0ZXJtaW5pc3RpYyB0byBiZSB1c2FibGUgZm9yIGFueSBraW5kCitvZiBwZXJmb3JtYW5jZSBldmFsdWF0aW9uLiAgUGxlYXNlIGRvbid0IHRyeS4KZGlmZiAtLWdpdCBhL3Rlc3RzL2NvbS9ocC9jcmVhbHMvQ1JUZXN0LmphdmEgYi90ZXN0cy9zcmMvY29tL2hwL2NyZWFscy9DUlRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvY29tL2hwL2NyZWFscy9DUlRlc3QuamF2YQpyZW5hbWUgdG8gdGVzdHMvc3JjL2NvbS9ocC9jcmVhbHMvQ1JUZXN0LmphdmEKZGlmZiAtLWdpdCBhL3Rlc3RzL3NyYy9jb20vaHAvY3JlYWxzL1Nsb3dDUlRlc3QuamF2YSBiL3Rlc3RzL3NyYy9jb20vaHAvY3JlYWxzL1Nsb3dDUlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGRmZTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3JjL2NvbS9ocC9jcmVhbHMvU2xvd0NSVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogVEhJUyBUWVBJQ0FMTFkgVEFLRVMgPiAxMCBNSU5VVEVTIFRPIFJVTiEgIEl0IHNob2xkIGdlbmVyYXRlIG5vIG91dHB1dCBkdXJpbmcgdGhhdCB0aW1lLiAqLworCitwYWNrYWdlIGNvbS5ocC5jcmVhbHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworcHVibGljIGNsYXNzIFNsb3dDUlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVjayhib29sZWFuIHgsIFN0cmluZyBzKSB7CisgICAgICAgIGlmICgheCkgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKHMpOworICAgIH0KKyAgICBmaW5hbCBzdGF0aWMgaW50IFRFU1RfUFJFQyA9IC0yMDA7IC8vIDIwMCBiaXRzIHRvIHRoZSByaWdodCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluYXJ5IHBvaW50LgorICAgIGZpbmFsIHN0YXRpYyBpbnQgTlJBTkRPTSA9IDEwMDsgICAgLy8gTnVtYmVyIG9mIHJhbmRvbSB2YWx1ZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlc3QuICBCaWdnZXIgPT0+IHNsb3dlcgorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tFcShDUiB4LCBDUiB5LCBTdHJpbmcgcykgeworICAgICAgICBpZiAoeC5jb21wYXJlVG8oeSwgVEVTVF9QUkVDKSAhPSAwKSB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3Iocyk7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tBcHByRXEoQ1IgeCwgQ1IgeSwgU3RyaW5nIHMpIHsKKyAgICAgICAgQmlnSW50ZWdlciBhYnNfZGlmZmVyZW5jZSA9IHguc3VidHJhY3QoeSkuZ2V0X2FwcHIoVEVTVF9QUkVDKS5hYnMoKTsKKyAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPiAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcihzKTsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0FwcHJFcShkb3VibGUgeCwgZG91YmxlIHksIFN0cmluZyBzKSB7CisgICAgICAgIGlmIChNYXRoLmFicyh4IC0geSkgPiAwLjAwMDAwMSkgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKHMpOworICAgIH0KKyAgICBmaW5hbCBzdGF0aWMgQmlnSW50ZWdlciBNQVNLID0KKyAgICAgICAgICAgIEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdCgtVEVTVF9QUkVDKS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FwcHJJbnQoQ1IgeCkgeworICAgICAgICBCaWdJbnRlZ2VyIGFwcHIgPSB4LmdldF9hcHByKFRFU1RfUFJFQyk7CisgICAgICAgIHJldHVybiBhcHByLmFuZChNQVNLKS5zaWdudW0oKSA9PSAwOworICAgIH0KKworICAgIGZpbmFsIHN0YXRpYyBDUiBaRVJPID0gQ1IudmFsdWVPZigwKTsKKyAgICBmaW5hbCBzdGF0aWMgQ1IgT05FID0gQ1IudmFsdWVPZigxKTsKKyAgICBmaW5hbCBzdGF0aWMgQ1IgVFdPID0gQ1IudmFsdWVPZigyKTsKKyAgICBmaW5hbCBzdGF0aWMgQ1IgQklHID0gQ1IudmFsdWVPZigyMDApLmV4cCgpOworICAgIGZpbmFsIHN0YXRpYyBDUiBTTUFMTCA9IEJJRy5pbnZlcnNlKCk7CisKKyAgICBmaW5hbCBzdGF0aWMgVW5hcnlDUkZ1bmN0aW9uIEFTSU4gPSBVbmFyeUNSRnVuY3Rpb24uYXNpbkZ1bmN0aW9uOworICAgIGZpbmFsIHN0YXRpYyBVbmFyeUNSRnVuY3Rpb24gQUNPUyA9IFVuYXJ5Q1JGdW5jdGlvbi5hY29zRnVuY3Rpb247CisgICAgZmluYWwgc3RhdGljIFVuYXJ5Q1JGdW5jdGlvbiBBVEFOID0gVW5hcnlDUkZ1bmN0aW9uLmF0YW5GdW5jdGlvbjsKKyAgICBmaW5hbCBzdGF0aWMgVW5hcnlDUkZ1bmN0aW9uIFRBTiA9IFVuYXJ5Q1JGdW5jdGlvbi50YW5GdW5jdGlvbjsKKyAgICBmaW5hbCBzdGF0aWMgVW5hcnlDUkZ1bmN0aW9uIENPU0lORSA9IFVuYXJ5Q1JGdW5jdGlvbi5zaW5GdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1vbm90b25lRGVyaXZhdGl2ZShaRVJPLCBDUi5QSSk7CisKKyAgICAvLyBQZXJmb3JtIHNvbWUgY29uc2lzdGVuY3kgY2hlY2tzIG9uIHRyaWcgZnVuY3Rpb25zIGF0IHgKKyAgICAvLyBXZSBhc3N1bWUgdGhhdCB4IGlzIHdpdGhpbiBmbG9hdGluZyBwb2ludCByYW5nZS4KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrVHJpZyhDUiB4KSB7CisgICAgICAgIGRvdWJsZSB4QXNEb3VibGUgPSB4LmRvdWJsZVZhbHVlKCk7CisgICAgICAgIGlmIChNYXRoLmFicyh4QXNEb3VibGUpIDwgMTAwMDAwMC4wKSB7CisgICAgICAgICAgICBjaGVja0FwcHJFcSh4LnNpbigpLmRvdWJsZVZhbHVlKCksIE1hdGguc2luKHhBc0RvdWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzaW4gZmxvYXQgY29tcGFyZToiICsgeEFzRG91YmxlKTsKKyAgICAgICAgICAgIGNoZWNrQXBwckVxKHguY29zKCkuZG91YmxlVmFsdWUoKSwgTWF0aC5jb3MoeEFzRG91YmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcyBmbG9hdCBjb21wYXJlOiIgKyB4QXNEb3VibGUpOworICAgICAgICAgICAgY2hlY2tBcHByRXEoVEFOLmV4ZWN1dGUoeCkuZG91YmxlVmFsdWUoKSwgTWF0aC50YW4oeEFzRG91YmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRhbiBmbG9hdCBjb21wYXJlOiIgKyB4QXNEb3VibGUpOworICAgICAgICAgICAgY2hlY2tBcHByRXEoQVRBTi5leGVjdXRlKHgpLmRvdWJsZVZhbHVlKCksIE1hdGguYXRhbih4QXNEb3VibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXRhbiBmbG9hdCBjb21wYXJlOiIgKyB4QXNEb3VibGUpOworICAgICAgICB9CisgICAgICAgIGlmIChNYXRoLmFicyh4QXNEb3VibGUpIDwgMS4wKSB7CisgICAgICAgICAgICBjaGVja0FwcHJFcShBU0lOLmV4ZWN1dGUoeCkuZG91YmxlVmFsdWUoKSwgTWF0aC5hc2luKHhBc0RvdWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhc2luIGZsb2F0IGNvbXBhcmU6IiArIHhBc0RvdWJsZSk7CisgICAgICAgICAgICBjaGVja0FwcHJFcShBQ09TLmV4ZWN1dGUoeCkuZG91YmxlVmFsdWUoKSwgTWF0aC5hY29zKHhBc0RvdWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhY29zIGZsb2F0IGNvbXBhcmU6IiArIHhBc0RvdWJsZSApOworICAgICAgICB9CisgICAgICAgIGlmICh4QXNEb3VibGUgPCAzLjE0MTU5MjY1MzUgJiYgeEFzRG91YmxlID4gMC4wKSB7CisgICAgICAgICAgICBjaGVja0FwcHJFcShDT1NJTkUuZXhlY3V0ZSh4KS5kb3VibGVWYWx1ZSgpLCBNYXRoLmNvcyh4QXNEb3VibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVyaXYoc2luKSBmbG9hdCBjb21wYXJlOiIgICsgeEFzRG91YmxlKTsKKyAgICAgICAgICAgIGNoZWNrQXBwckVxKENPU0lORS5leGVjdXRlKHgpLCB4LmNvcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVyaXYoc2luKSBmbG9hdCBjb21wYXJlOiIgICsgeEFzRG91YmxlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBDaGVjayB0aGF0IHNpbih4K3YpID0gc2luKHgpY29zKHYpICsgY29zKHgpc2luKHYpCisgICAgICAgIC8vIGZvciBhIGNvdXBsZSBvZiBkaWZmZXJlbnQgdmFsdWVzIG9mIHYuCisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDU7ICsraSkgeworICAgICAgICAgICAgQ1IgdiA9IENSLnZhbHVlT2YoaSk7CisgICAgICAgICAgICBjaGVja0FwcHJFcSgKKyAgICAgICAgICAgICAgICB4LmFkZCh2KS5zaW4oKSwKKyAgICAgICAgICAgICAgICB4LnNpbigpLm11bHRpcGx5KHYuY29zKCkpLmFkZCh4LmNvcygpLm11bHRpcGx5KHYuc2luKCkpKSwKKyAgICAgICAgICAgICAgICAiQW5nbGUgc3VtIGZvcm11bGEgZmFpbGVkIGZvciAiICsgeEFzRG91YmxlICsgIiArICIgKyBpKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0FwcHJFcSh4LmNvcygpLm11bHRpcGx5KHguY29zKCkpLmFkZCh4LnNpbigpLm11bHRpcGx5KHguc2luKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgQ1IudmFsdWVPZigxKSwKKyAgICAgICAgICAgICAgICAgICAgInNpbih4KV4yICsgY29zKHgpXjIgIT0gMToiICsgeEFzRG91YmxlKTsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBpbnZlcnNlcyBhcmUgY29uc2lzdGVudAorICAgICAgICBjaGVja0FwcHJFcSh4LCBUQU4uZXhlY3V0ZShBVEFOLmV4ZWN1dGUoeCkpLAorICAgICAgICAgICAgICAgICAgICAgICJ0YW4oYXRhbigiICsgeEFzRG91YmxlICsgIikiICk7CisgICAgICAgIENSIHRtcCA9IEFDT1MuZXhlY3V0ZSh4LmNvcygpKTsKKyAgICAgICAgLy8gUmVzdWx0IG9yIGl0cyBpbnZlcnNlIHNob3VsZCBkaWZmZXIgZnJvbSB4IGJ5IGFuCisgICAgICAgIC8vIGV4YWN0IG11bHRpcGxlIG9mIHBpLgorICAgICAgICBjaGVjayhpc0FwcHJJbnQodG1wLnN1YnRyYWN0KHgpLmRpdmlkZShDUi5QSSkpCisgICAgICAgICAgICAgIHx8IGlzQXBwckludCh0bXAuYWRkKHgpLmRpdmlkZShDUi5QSSkpLAorICAgICAgICAgICAgICAiYWNvcyhjb3MpOiIgKyB4QXNEb3VibGUpOworICAgICAgICB0bXAgPSBBU0lOLmV4ZWN1dGUoeC5zaW4oKSk7CisgICAgICAgIC8vIFJlc3VsdCBvciBpdHMgaW52ZXJzZSBzaG91bGQgZGlmZmVyIGZyb20geCBieSBhbgorICAgICAgICAvLyBleGFjdCBtdWx0aXBsZSBvZiBwaS4KKyAgICAgICAgY2hlY2soaXNBcHBySW50KHRtcC5zdWJ0cmFjdCh4KS5kaXZpZGUoQ1IuUEkpKQorICAgICAgICAgICAgICB8fCBpc0FwcHJJbnQodG1wLmFkZCh4KS5kaXZpZGUoQ1IuUEkpKSwKKyAgICAgICAgICAgICAgImFjb3MoY29zKToiICsgeEFzRG91YmxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRXhwTG4oQ1IgeCkgeworICAgICAgICBkb3VibGUgeEFzRG91YmxlID0geC5kb3VibGVWYWx1ZSgpOworICAgICAgICBpZiAoTWF0aC5hYnMoeEFzRG91YmxlKSA8IDEwLjApIHsKKyAgICAgICAgICAgIGNoZWNrQXBwckVxKHguZXhwKCkuZG91YmxlVmFsdWUoKSwgTWF0aC5leHAoeEFzRG91YmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cCBmbG9hdCBjb21wYXJlOiIgKyB4QXNEb3VibGUpOworICAgICAgICB9CisgICAgICAgIGlmIChNYXRoLmFicyh4QXNEb3VibGUpIDw9IDEwMDAuMCkgeworICAgICAgICAgICAgY2hlY2tBcHByRXEoeCwgeC5leHAoKS5sbigpLCAibG4oZXhwKSBmYWlsZWQ6IiArIHhBc0RvdWJsZSk7CisgICAgICAgICAgICBjaGVja0FwcHJFcSh4Lm11bHRpcGx5KENSLnZhbHVlT2YoMikpLmV4cCgpLAorCisgICAgICAgICAgICAgICAgICAgICAgICB4LmV4cCgpLm11bHRpcGx5KHguZXhwKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cF4yIGZhaWxlZDoiICsgeEFzRG91YmxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeEFzRG91YmxlID4gMC4wMDAwMDAwMDEpIHsKKyAgICAgICAgICAgIGNoZWNrQXBwckVxKHgubG4oKS5kb3VibGVWYWx1ZSgpLCBNYXRoLmxvZyh4QXNEb3VibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwIGZsb2F0IGNvbXBhcmU6IiArIHhBc0RvdWJsZSk7CisgICAgICAgICAgICBjaGVja0FwcHJFcSh4LCB4LmxuKCkuZXhwKCksICJleHAobG4pIGZhaWxlZDoiICsgeEFzRG91YmxlKTsKKyAgICAgICAgICAgIGNoZWNrQXBwckVxKHgubG4oKS5kaXZpZGUoQ1IudmFsdWVPZigyKSksIHguc3FydCgpLmxuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAibG4oc3FydCkgZmFpbGVkOiIgKyB4QXNEb3VibGUpOworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBsbih4dikgPSBsbih4KSArIGxuKHYpIGZvciB2YXJpb3VzIHYKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDU7ICsraSkgeworICAgICAgICAgICAgICAgIENSIHYgPSBDUi52YWx1ZU9mKGkpOworICAgICAgICAgICAgICAgIGNoZWNrQXBwckVxKAorICAgICAgICAgICAgICAgICAgICB4LmxuKCkuYWRkKHYubG4oKSksCisgICAgICAgICAgICAgICAgICAgIHgubXVsdGlwbHkodikubG4oKSwKKyAgICAgICAgICAgICAgICAgICAgImxuKHByb2R1Y3QpIGZvcm11bGEgZmFpbGVkIGZvcjoiICsgeEFzRG91YmxlICsgIiwiICsgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQmFzaWMoQ1IgeCkgeworICAgICAgICBjaGVja0FwcHJFcSh4LmFicygpLnNxcnQoKS5tdWx0aXBseSh4LmFicygpLnNxcnQoKSksIHguYWJzKCksCisgICAgICAgICAgICAgICAgICAgICJzcXJ0KnNxcnQ6IiArIHguZG91YmxlVmFsdWUoKSk7CisgICAgICAgIGlmICgheC5nZXRfYXBwcihURVNUX1BSRUMpLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKSB7CisgICAgICAgICAgICBjaGVja0FwcHJFcSh4LmludmVyc2UoKS5pbnZlcnNlKCksIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW52ZXJzZShpbnZlcnNlKToiICsgeC5kb3VibGVWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTbG93VHJpZygpIHsKKyAgICAgICAgY2hlY2tBcHByRXEoQUNPUy5leGVjdXRlKFpFUk8pLCBDUi5QSS5kaXZpZGUoVFdPKSwgImFjb3MoMCkiKTsKKyAgICAgICAgY2hlY2tBcHByRXEoQUNPUy5leGVjdXRlKE9ORSksIFpFUk8sICJhY29zKDEpIik7CisgICAgICAgIGNoZWNrQXBwckVxKEFDT1MuZXhlY3V0ZShPTkUubmVnYXRlKCkpLCBDUi5QSSwgImFjb3MoLTEpIik7CisgICAgICAgIGNoZWNrQXBwckVxKEFTSU4uZXhlY3V0ZShaRVJPKSwgWkVSTywgImFzaW4oMCkiKTsKKyAgICAgICAgY2hlY2tBcHByRXEoQVNJTi5leGVjdXRlKE9ORSksIENSLlBJLmRpdmlkZShUV08pLCAiYXNpbigxKSIpOworICAgICAgICBjaGVja0FwcHJFcShBU0lOLmV4ZWN1dGUoT05FLm5lZ2F0ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSLlBJLmRpdmlkZShUV08pLm5lZ2F0ZSgpLCAiYXNpbigtMSkiKTsKKyAgICAgICAgY2hlY2tUcmlnKFpFUk8pOworICAgICAgICBDUiBCSUcgPSBDUi52YWx1ZU9mKDIwMCkuZXhwKCk7CisgICAgICAgIGNoZWNrVHJpZyhCSUcpOworICAgICAgICBjaGVja1RyaWcoQklHLm5lZ2F0ZSgpKTsKKyAgICAgICAgY2hlY2tUcmlnKFNNQUxMKTsKKyAgICAgICAgY2hlY2tUcmlnKFNNQUxMLm5lZ2F0ZSgpKTsKKyAgICAgICAgY2hlY2tUcmlnKENSLlBJKTsKKyAgICAgICAgY2hlY2tUcmlnKENSLlBJLnN1YnRyYWN0KFNNQUxMKSk7CisgICAgICAgIGNoZWNrVHJpZyhDUi5QSS5hZGQoU01BTEwpKTsKKyAgICAgICAgY2hlY2tUcmlnKENSLlBJLm5lZ2F0ZSgpKTsKKyAgICAgICAgY2hlY2tUcmlnKENSLlBJLm5lZ2F0ZSgpLnN1YnRyYWN0KFNNQUxMKSk7CisgICAgICAgIGNoZWNrVHJpZyhDUi5QSS5uZWdhdGUoKS5hZGQoU01BTEwpKTsKKyAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7ICAvLyBSYW5kb20gc2VlZCEKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOUkFORE9NOyArK2kpIHsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gTWF0aC5leHAoMi4wICogci5uZXh0RG91YmxlKCkgLSAxLjApOworICAgICAgICAgICAgaWYgKHIubmV4dEJvb2xlYW4oKSkgZCA9IC1kOworICAgICAgICAgICAgZmluYWwgQ1IgeCA9IENSLnZhbHVlT2YoZCk7CisgICAgICAgICAgICBjaGVja1RyaWcoeCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQW5kIGEgZmV3IGJpZyBvbmVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgICAgICAgICAgZG91YmxlIGQgPSBNYXRoLmV4cCgyMDAuMCAqIHIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgICAgIGlmIChyLm5leHRCb29sZWFuKCkpIGQgPSAtZDsKKyAgICAgICAgICAgIGZpbmFsIENSIHggPSBDUi52YWx1ZU9mKGQpOworICAgICAgICAgICAgY2hlY2tUcmlnKHgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNsb3dFeHBMbigpIHsKKyAgICAgICAgY2hlY2tBcHByRXEoQ1IudmFsdWVPZigxKS5sbigpLCBDUi52YWx1ZU9mKDApLCAibG4oMSkgIT0gMCIpOworICAgICAgICBjaGVja0V4cExuKENSLnZhbHVlT2YoMCkpOworICAgICAgICBDUiBCSUcgPSBDUi52YWx1ZU9mKDIwMCkuZXhwKCk7CisgICAgICAgIGNoZWNrRXhwTG4oQklHKTsKKyAgICAgICAgY2hlY2tFeHBMbihCSUcubmVnYXRlKCkpOworICAgICAgICBjaGVja0V4cExuKFNNQUxMKTsKKyAgICAgICAgY2hlY2tFeHBMbihTTUFMTC5uZWdhdGUoKSk7CisgICAgICAgIGNoZWNrRXhwTG4oQ1IuUEkpOworICAgICAgICBjaGVja0V4cExuKE9ORSk7CisgICAgICAgIGNoZWNrRXhwTG4oT05FLnN1YnRyYWN0KFNNQUxMKSk7CisgICAgICAgIGNoZWNrRXhwTG4oT05FLm5lZ2F0ZSgpLnN1YnRyYWN0KFNNQUxMKSk7CisgICAgICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOyAgLy8gUmFuZG9tIHNlZWQhCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlJBTkRPTTsgKytpKSB7CisgICAgICAgICAgICBkb3VibGUgZCA9IE1hdGguZXhwKDEwLjAgKiByLm5leHREb3VibGUoKSAtIDEuMCk7CisgICAgICAgICAgICBpZiAoci5uZXh0Qm9vbGVhbigpKSBkID0gLWQ7CisgICAgICAgICAgICBmaW5hbCBDUiB4ID0gQ1IudmFsdWVPZihkKTsKKyAgICAgICAgICAgIGNoZWNrRXhwTG4oeCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQW5kIGEgZmV3IGJpZyBvbmVzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgICAgICAgICAgZG91YmxlIGQgPSBNYXRoLmV4cCgyMDAuMCAqIHIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgICAgIGlmIChyLm5leHRCb29sZWFuKCkpIGQgPSAtZDsKKyAgICAgICAgICAgIGZpbmFsIENSIHggPSBDUi52YWx1ZU9mKGQpOworICAgICAgICAgICAgY2hlY2tFeHBMbih4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTbG93QmFzaWMoKSB7CisgICAgICAgIGNoZWNrQXBwckVxKFpFUk8uc3FydCgpLCBaRVJPLCAic3FydCgwKSIpOworICAgICAgICBjaGVja0FwcHJFcShaRVJPLmFicygpLCBaRVJPLCAiYWJzKDApIik7CisgICAgICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOyAgLy8gUmFuZG9tIHNlZWQhCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlJBTkRPTTsgKytpKSB7CisgICAgICAgICAgICBkb3VibGUgZCA9IE1hdGguZXhwKDEwLjAgKiByLm5leHREb3VibGUoKSAtIDEuMCk7CisgICAgICAgICAgICBpZiAoci5uZXh0Qm9vbGVhbigpKSBkID0gLWQ7CisgICAgICAgICAgICBmaW5hbCBDUiB4ID0gQ1IudmFsdWVPZihkKTsKKyAgICAgICAgICAgIGNoZWNrQmFzaWMoeCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQW5kIGEgZmV3IHZlcnkgYmlnIG9uZXMsIGJ1dCB3aXRoaW4gSUVFRSBkb3VibGUgcmFuZ2UKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgICAgICAgICBkb3VibGUgZCA9IE1hdGguZXhwKDYwMC4wICogci5uZXh0RG91YmxlKCkpOworICAgICAgICAgICAgaWYgKHIubmV4dEJvb2xlYW4oKSkgZCA9IC1kOworICAgICAgICAgICAgZmluYWwgQ1IgeCA9IENSLnZhbHVlT2YoZCk7CisgICAgICAgICAgICBjaGVja0Jhc2ljKHgpOworICAgICAgICB9CisgICAgfQorfQo=