PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KPGh0bWw+Cgk8aGVhZD4KCQk8dGl0bGU+Qm9vc3Q6IGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLmhwcCBkb2N1bWVudGF0aW9uPC90aXRsZT4KCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KCTwvaGVhZD4KCTxib2R5IGJnY29sb3I9IndoaXRlIiBzdHlsZT0iTUFSR0lOLUxFRlQ6IDUlOyBNQVJHSU4tUklHSFQ6IDUlIj4KCQk8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CgkJCTx0cj4KCQkJCTx0ZCB3aWR0aD0iMjc3Ij48QSBocmVmPSIuLi8uLi9pbmRleC5odG0iPiA8aW1nIHNyYz0iLi4vLi4vYm9vc3QucG5nIiBhbHQ9ImJvb3N0LnBuZyAoNjg5NyBieXRlcykiIHdpZHRoPSIyNzciIGhlaWdodD0iODYiIGJvcmRlcj0iMCI+PC9BPgoJCQkJPC90ZD4KCQkJCTx0ZCBhbGlnbj0iY2VudGVyIj4KCQkJCQk8aDE+ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuaHBwPC9oMT4KCQkJCTwvdGQ+CgkJCTwvdHI+CgkJCTx0cj4KCQkJCTx0ZCBjb2xzcGFuPSIyIiBoZWlnaHQ9IjY0Ij4mbmJzcDs8L3RkPgoJCQk8L3RyPgoJCTwvdGFibGU+CgkJPGgzPjxhIG5hbWU9IlB1cnBvc2UiPlB1cnBvc2U8L2E+PC9oMz4KCQk8cD4KCQkJVGhlIGhlYWRlciA8U1RST05HPiZsdDtib29zdC9lbmFibGVfc2hhcmVkX2Zyb21fdGhpcy5ocHAmZ3Q7PC9TVFJPTkc+IGRlZmluZXMgCgkJCXRoZSBjbGFzcyB0ZW1wbGF0ZSA8U1RST05HPmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPC9TVFJPTkc+LiBJdCBpcyB1c2VkIGFzIGEgCgkJCWJhc2UgY2xhc3MgdGhhdCBhbGxvd3MgYSA8QSBocmVmPSJzaGFyZWRfcHRyLmh0bSI+c2hhcmVkX3B0cjwvQT4gdG8gdGhlIGN1cnJlbnQgCgkJCW9iamVjdCB0byBiZSBvYnRhaW5lZCBmcm9tIHdpdGhpbiBhIG1lbWJlciBmdW5jdGlvbi4KCQk8L3A+CgkJPFA+PFNUUk9ORz5lbmFibGVfc2hhcmVkX2Zyb21fdGhpcyZsdDtUJmd0OzwvU1RST05HPiBkZWZpbmVzIHR3byBtZW1iZXIgZnVuY3Rpb25zIAoJCQljYWxsZWQgPFNUUk9ORz5zaGFyZWRfZnJvbV90aGlzPC9TVFJPTkc+IHRoYXQgcmV0dXJuIGEgPFNUUk9ORz5zaGFyZWRfcHRyJmx0O1QmZ3Q7PC9TVFJPTkc+CgkJCWFuZCA8U1RST05HPnNoYXJlZF9wdHImbHQ7VCBjb25zdCZndDs8L1NUUk9ORz4sIGRlcGVuZGluZyBvbiBjb25zdG5lc3MsIHRvIDxTVFJPTkc+dGhpczwvU1RST05HPi48L1A+CgkJPGgzPjxhIG5hbWU9IkV4YW1wbGUiPkV4YW1wbGU8L2E+PC9oMz4KCQk8cHJlPgojaW5jbHVkZSAmbHQ7Ym9vc3QvZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuaHBwJmd0OwojaW5jbHVkZSAmbHQ7Ym9vc3Qvc2hhcmVkX3B0ci5ocHAmZ3Q7CiNpbmNsdWRlICZsdDtjYXNzZXJ0Jmd0OwoKY2xhc3MgWTogcHVibGljIGJvb3N0OjplbmFibGVfc2hhcmVkX2Zyb21fdGhpcyZsdDtZJmd0Owp7CnB1YmxpYzoKCiAgICBib29zdDo6c2hhcmVkX3B0ciZsdDtZJmd0OyBmKCkKICAgIHsKICAgICAgICByZXR1cm4gc2hhcmVkX2Zyb21fdGhpcygpOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBib29zdDo6c2hhcmVkX3B0ciZsdDtZJmd0OyBwKG5ldyBZKTsKICAgIGJvb3N0OjpzaGFyZWRfcHRyJmx0O1kmZ3Q7IHEgPSBwLSZndDtmKCk7CiAgICBhc3NlcnQocCA9PSBxKTsKICAgIGFzc2VydCghKHAgJmx0OyBxIHx8IHEgJmx0OyBwKSk7IC8vIHAgYW5kIHEgbXVzdCBzaGFyZSBvd25lcnNoaXAKfQo8L3ByZT4KCQk8aDM+PGEgbmFtZT0iU3lub3BzaXMiPlN5bm9wc2lzPC9hPjwvaDM+CgkJPHByZT4KbmFtZXNwYWNlIGJvb3N0CnsKCnRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7IGNsYXNzIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzCnsKcHVibGljOgoKICAgIHNoYXJlZF9wdHImbHQ7VCZndDsgc2hhcmVkX2Zyb21fdGhpcygpOwogICAgc2hhcmVkX3B0ciZsdDtUIGNvbnN0Jmd0OyBzaGFyZWRfZnJvbV90aGlzKCkgY29uc3Q7Cn0KCn0KPC9wcmU+CgkJPGg0PnRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7IHNoYXJlZF9wdHImbHQ7VCZndDsgCgkJCWVuYWJsZV9zaGFyZWRfZnJvbV90aGlzJmx0O1QmZ3Q7OjpzaGFyZWRfZnJvbV90aGlzKCk7PC9oND4KCQk8aDQ+dGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsgc2hhcmVkX3B0ciZsdDtUIGNvbnN0Jmd0OyAKCQkJZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmbHQ7VCZndDs6OnNoYXJlZF9mcm9tX3RoaXMoKSBjb25zdDs8L2g0PgoJCTxibG9ja3F1b3RlPgoJCQk8cD4KCQkJCTxiPlJlcXVpcmVzOjwvYj4gPFNUUk9ORz5lbmFibGVfc2hhcmVkX2Zyb21fdGhpcyZsdDtUJmd0OzwvU1RST05HPiBtdXN0IGJlIGFuIAoJCQkJYWNjZXNzaWJsZSBiYXNlIGNsYXNzIG9mIDxiPlQ8L2I+LiA8U1RST05HPip0aGlzPC9TVFJPTkc+IG11c3QgYmUgYSBzdWJvYmplY3QgCgkJCQlvZiBhbiBpbnN0YW5jZSA8U1RST05HPnQ8L1NUUk9ORz4gb2YgdHlwZSA8U1RST05HPlQ8L1NUUk9ORz4gLiBUaGVyZSBtdXN0IGV4aXN0IAoJCQkJYXQgbGVhc3Qgb25lIDxTVFJPTkc+c2hhcmVkX3B0cjwvU1RST05HPiBpbnN0YW5jZSA8U1RST05HPnA8L1NUUk9ORz4gdGhhdCA8RU0+b3duczwvRU0+CgkJCQk8U1RST05HPnQ8L1NUUk9ORz4uCgkJCTwvcD4KCQkJPHA+CgkJCQk8Yj5SZXR1cm5zOjwvYj4gQSA8Yj5zaGFyZWRfcHRyJmx0O1QmZ3Q7PC9iPiBpbnN0YW5jZSA8Yj5yPC9iPiB0aGF0IHNoYXJlcyAKCQkJCW93bmVyc2hpcCB3aXRoIDxiPnA8L2I+LgoJCQk8L3A+CgkJCTxwPgoJCQkJPGI+UG9zdGNvbmRpdGlvbnM6PC9iPiA8dHQ+ci5nZXQoKSA9PSB0aGlzPC90dD4uCgkJCTwvcD4KCQk8L2Jsb2NrcXVvdGU+CgkJPHA+CgkJCTxicj4KCQkJPHNtYWxsPkNvcHlyaWdodCCpIDIwMDIsIDIwMDMgYnkgUGV0ZXIgRGltb3YuIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIAoJCQkJMS4wLiBTZWUgYWNjb21wYW55aW5nIGZpbGUgPEEgaHJlZj0iLi4vLi4vTElDRU5TRV8xXzAudHh0Ij5MSUNFTlNFXzFfMC50eHQ8L0E+IG9yIAoJCQkJY29weSBhdCA8QSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPmh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvQT4uPC9zbWFsbD48L3A+Cgk8L2JvZHk+CjwvaHRtbD4K