IyBqbmRuLW1vY2sKClRoaXMgcHJvamVjdCBjb25zaXN0cyBvZiB0b29scyBmb3IgdGVzdGluZyBORE4gYXBwbGljYXRpb25zIHdpdGhvdXQgbmV0d29yayBJTy4gSXQgcmVsaWVzIG9uIHRoZSBbTkROIFByb3RvY29sXShodHRwczovL25hbWVkLWRhdGEubmV0KSBhbmQgaXRzIGFzc29jaWF0ZWQgW2NsaWVudCBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9qbmRuKS4KCiMjIEluc3RhbGwKV2l0aCBNYXZlbiwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBQT006CmBgYAo8ZGVwZW5kZW5jeT4KICA8Z3JvdXBJZD5jb20uaW50ZWwuam5kbi5tb2NrPC9ncm91cElkPgogIDxhcnRpZmFjdElkPmpuZG4tbW9jazwvYXJ0aWZhY3RJZD4KICA8dmVyc2lvbj5SRUxFQVNFPC92ZXJzaW9uPiA8IS0tIG9yIGEgc3BlY2lmaWMgdmVyc2lvbiAtLT4KPC9kZXBlbmRlbmN5PgpgYGAKCiMjIFVzZQpgTW9ja0ZhY2VgIGFuZCBgTW9ja1RyYW5zcG9ydGAgYXJlIHRlc3QgdG9vbHMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGFwcGxpY2F0aW9ucyBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIGBGYWNlYCBhbmQgYFRyYW5zcG9ydGAuIEZvciBleGFtcGxlOgpgYGAKTW9ja1RyYW5zcG9ydCB0cmFuc3BvcnQgPSBuZXcgTW9ja1RyYW5zcG9ydCgpOwpNb2NrRmFjZSBmYWNlID0gbmV3IE1vY2tGYWNlKHRyYW5zcG9ydCwgbnVsbCk7CgphcHBsaWNhdGlvbi5kb1NvbWV0aGluZ09uKGZhY2UpOwphc3NlcnRFcXVhbHMoMCwgdHJhbnNwb3J0LmdldFNlbnREYXRhUGFja2V0cygpLnNpemUoKSk7CmFzc2VydEVxdWFscygxLCB0cmFuc3BvcnQuZ2V0U2VudEludGVyZXN0UGFja2V0cygpLnNpemUoKSk7CmBgYAoKIyMgTGljZW5zZQpDb3B5cmlnaHQgqSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbi4KClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDMsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgoKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIFtHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VdKGh0dHBzOi8vZ2l0aHViLmNvbS8wMW9yZy9qbmRuLW1vY2svYmxvYi9tYXN0ZXIvTElDRU5TRSkgZm9yIG1vcmUgZGV0YWlscy4K