Li4gQWxnb3JpdGhtcy9SdW50aW1lIEFsZ29yaXRobXMvL2Zvcl9lYWNoIHwxMAoKZm9yX2VhY2gKPT09PT09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBTZXF1ZW5jZQogICAgICAgICwgdHlwZW5hbWUgRgogICAgICAgID4KICAgIHZvaWQgZm9yX2VhY2goIEYgZiApOwoKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgU2VxdWVuY2UKICAgICAgICAsIHR5cGVuYW1lIFRyYW5zZm9ybU9wCiAgICAgICAgLCB0eXBlbmFtZSBGCiAgICAgICAgPgogICAgdm9pZCBmb3JfZWFjaCggRiBmICk7CgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KCmBgZm9yX2VhY2hgYCBpcyBhIGZhbWlseSBvZiBvdmVybG9hZGVkIGZ1bmN0aW9uIHRlbXBsYXRlczoKCiogYGBmb3JfZWFjaDxTZXF1ZW5jZT4oIGYgKWBgIGFwcGxpZXMgdGhlIHJ1bnRpbWUgZnVuY3Rpb24gb2JqZWN0CiAgYGBmYGAgdG8gZXZlcnkgZWxlbWVudCBpbiB0aGUgfGJlZ2luL2VuZDxTZXF1ZW5jZT58IHJhbmdlLgoKKiBgYGZvcl9lYWNoPFNlcXVlbmNlLFRyYW5zZm9ybU9wPiggZiApYGAgYXBwbGllcyB0aGUgcnVudGltZSBmdW5jdGlvbgogIG9iamVjdCBgYGZgYCB0byB0aGUgcmVzdWx0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBgYFRyYW5zZm9ybU9wYGAgb2YKICBldmVyeSBlbGVtZW50IGluIHRoZSB8YmVnaW4vZW5kPFNlcXVlbmNlPnwgcmFuZ2UuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2Zvcl9lYWNoLmhwcD4KCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBTZXF1ZW5jZWBgICAgICAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICAgICAgfCBBIHNlcXVlbmNlIHRvIGl0ZXJhdGUuICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYFRyYW5zZm9ybU9wYGAgICB8IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgICAgICAgICAgICB8IEEgdHJhbnNmb3JtYXRpb24uICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgZmBgICAgICAgICAgICAgIHwgQW4gfHVuYXJ5IGZ1bmN0aW9uIG9iamVjdHwgICAgICAgIHwgQSBydW50aW1lIG9wZXJhdGlvbiB0byBhcHBseS4gICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgfEZvcndhcmQgU2VxdWVuY2V8IGBgc2BgLCB8TGFtYmRhIEV4cHJlc3Npb258IGBgb3BgYCAsIGFuZCBhbgp8dW5hcnkgZnVuY3Rpb24gb2JqZWN0fCBgYGZgYDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICBmb3JfZWFjaDxzPiggZiApOwoKOlJldHVybiB0eXBlOgogICAgYGB2b2lkYGAKCjpQb3N0Y29uZGl0aW9uOgogICAgRXF1aXZhbGVudCB0byAKICAgICAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgdHlwZWRlZiBiZWdpbjxTZXF1ZW5jZT46OnR5cGUgaVwgOnN1YjpgMWA7CiAgICAgICAgfHZhbHVlX2luaXRpYWxpemVkfFwgPCBkZXJlZjxpXCA6c3ViOmAxYD46OnR5cGUgPiB4XCA6c3ViOmAxYDsKICAgICAgICBmKGJvb3N0OjpnZXQoeFwgOnN1YjpgMWApKTsKCiAgICAgICAgdHlwZWRlZiBuZXh0PGlcIDpzdWI6YDFgPjo6dHlwZSBpXCA6c3ViOmAyYDsKICAgICAgICB8dmFsdWVfaW5pdGlhbGl6ZWR8XCA8IGRlcmVmPGlcIDpzdWI6YDJgPjo6dHlwZSA+IHhcIDpzdWI6YDJgOwogICAgICAgIGYoYm9vc3Q6OmdldCh4XCA6c3ViOmAyYCkpOwogICAgICAgIHwuLi58CiAgICAgICAgfHZhbHVlX2luaXRpYWxpemVkfFwgPCBkZXJlZjxpXCA6c3ViOmBuYD46OnR5cGUgPiB4XCA6c3ViOmBuYDsKICAgICAgICBmKGJvb3N0OjpnZXQoeFwgOnN1YjpgbmApKTsKICAgICAgICB0eXBlZGVmIG5leHQ8aVwgOnN1YjpgbmA+Ojp0eXBlIGxhc3Q7IAogICAgICAgIAogICAgd2hlcmUgYGBuID09IHNpemU8cz46OnZhbHVlYGAgYW5kIGBgbGFzdGBgIGlzIGlkZW50aWNhbCB0bwogICAgYGBlbmQ8cz46OnR5cGVgYDsgbm8gZWZmZWN0IGlmIGBgZW1wdHk8cz46OnZhbHVlID09IHRydWVgYC4KCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgZm9yX2VhY2g8cyxvcD4oIGYgKTsKCjpSZXR1cm4gdHlwZToKICAgIGBgdm9pZGBgCgo6UG9zdGNvbmRpdGlvbjoKICAgIEVxdWl2YWxlbnQgdG8gCiAgICAgICAgCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIGZvcl9lYWNoPCB0cmFuc2Zvcm1fdmlldzxzLG9wPiA+KCBmICk7CgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpMaW5lYXIuIEV4YWN0bHkgYGBzaXplPHM+Ojp2YWx1ZWBgIGFwcGxpY2F0aW9ucyBvZiBgYG9wYGAgYW5kIGBgZmBgLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICBzdHJ1Y3QgdmFsdWVfcHJpbnRlcgogICAgewogICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBVID4gdm9pZCBvcGVyYXRvcigpKFUgeCkKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCB4IDw8ICdcXG4nOwogICAgICAgIH0KICAgIH07CgogICAgaW50IG1haW4oKQogICAgewogICAgICAgIGZvcl9lYWNoPCByYW5nZV9jPGludCwwLDEwPiA+KCB2YWx1ZV9wcmludGVyKCkgKTsKICAgIH0KCgpTZWUgYWxzbwotLS0tLS0tLQoKfFJ1bnRpbWUgQWxnb3JpdGhtc3wsIHxWaWV3c3wsIHx0cmFuc2Zvcm1fdmlld3wKCi4uIHx1bmFyeSBmdW5jdGlvbiBvYmplY3R8IHJlcGxhY2U6OiBgdW5hcnkgZnVuY3Rpb24gb2JqZWN0IDxodHRwOi8vd3d3LnNnaS5jb20vdGVjaC9zdGwvVW5hcnlGdW5jdGlvbi5odG1sPmBfXwouLiB8dmFsdWVfaW5pdGlhbGl6ZWR8IHJlcGxhY2U6OiBgdmFsdWVfaW5pdGlhbGl6ZWQgPGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvdXRpbGl0eS92YWx1ZV9pbml0Lmh0bT5gX18KCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==